// rendercommand.h #ifndef _3DRENDERER_RENDERCOMMAND_H_ #define _3DRENDERER_RENDERCOMMAND_H_ #include "typedef.h" #include #include #define RCF_NONE (0x00000000) #define RCF_SINGLEPASS_PHONG (0x00000001) // Single pass Phong Áß ( Shader ¿¡ ÀÇÇÔ ) #define RCF_ENABLE_SPECULAR (0x00000002) // Specular »ç¿ë À¯¹«(default:FALSE) #define RCF_ALPHATEXTURE_FILTER (0x00000004) // ¾ËÆÄ¸¸ »ç¿ëÇÏ´Â texture filter #define RCF_WITH_IRRADIANCEMAP (0x00000008) // Irradiance¸¦ ÀÌ¿ëÇÑ Normap MapÀ» »ç¿ëÇÒ °æ¿ì. #define RCF_MODULATE2X (0x00000010) // Modulate2X(default:FALSE) #define RCF_SHADOW_CAST (0x00000020) // Shadow Rendering Áß #define RCF_SHADOW_RECEIVE (0x00000040) // Shadow Rendering Áß #define RCF_BRIGHTNESS_FUNC_MATTER (0x00000080) // Brightness func °ªÀÌ ¼¼ÆÃµÇ¾îÀִ°¡ #define RCF_ENABLE_GLOW (0x00000100) // GlowMap »ç¿ë #define RCF_ENABLE_HAZE (0x00000200) // Haze »ç¿ë #define RCF_ENABLE_REFRACTION_MASK (0x00000400) // Refraction Mask »ç¿ë #define RCF_ENABLE_CUSTOM_LIGHT (0x00000800) // Custom Light »ç¿ë #define RCF_DEFAULT RCF_WITH_IRRADIANCEMAP // RenderCommand·ÎºÎÅÍ ¼ÒÆ® ¿ì¼± ¼øÀ§ enum ENUM_SORT_PRIORITY { ESP_NONE = 0, ESP_DEPTH, // Ä«¸Þ¶ó¿ÍÀÇ ±íÀ̰ª¿¡ µû¶ó ¾ËÆÄ°¡ ¾Æ´Ñ Mesh¸¦ ¾Õ¿¡¼­ºÎÅÍ ±×¸®µµ·Ï ESP_BUFFER, // °°Àº ¹öÆÛ¸¦ »ç¿ëÇÏ´Â Mesh³¢¸® ¸ð¾Æ¼­ ±×¸®µµ·Ï ESP_TEXTURE, // °°Àº ÅØ½ºÃ³¸¦ »ç¿ëÇÏ´Â Mesh³¢¸® ¸ð¾Æ¼­ ±×¸®µµ·Ï ESP_RENDERSTATE, // °°Àº ·»´õ½ºÅ×ÀÌÆ®¸¦ »ç¿ëÇÏ´Â Mesh³¢¸® ¸ð¾Æ¼­ ±×¸®µµ·Ï NUM_ESP }; //------------------------------------------------------------------------------ /** @struct St_AlterRender */ struct St_AlterRender { ENUM_ALTERNATIVE_RENDER eRenderType; union { // eRenderTypeÀÌ ±¼ÀýÀÏ °æ¿ì¿¡¸¸ À¯È¿ struct { float fRefractionRate; float fRefractionAlpha; }; }; }; //------------------------------------------------------------------------------ /** @struct St_BaseRenderCommand */ struct St_BaseRenderCommand { enum ENUM_RENDERCOMMAND_TYPE { ERCT_UNIT = 0, ERCT_TRIANGLEBASED, ERCT_SPRITE, ERCT_NEW_SPRITE, ERCT_EFFECT, ERCT_UNIT_INSTANCING, }; ENUM_RENDERCOMMAND_TYPE m_eRCType; // UnitÀÎÁö Triangle-basedÀÎÁö ENUM_ALTERNATIVE_RENDER m_eRenderType; // UnitÀÏ °æ¿ì, m_pUnitDraw ³»ºÎ°ªÀ¸·ÎºÎÅÍ ¾ò¾î¿Â´Ù. union { // ºñ±³ ´ë»ó°ª float m_fSortResult; // depth ºñ±³½Ã »ç¿ë DWORD m_dwSortResult; // buffer, texture, renderstate ºñ±³½Ã »ç¿ë int m_iCurSortIndex; // ÇöÀç ¼ÒÆ® À妽º( CManagerRenderCommand::GetFirstRender,GetNextRender¿¡¼­ »ç¿ë) }; int m_iSortIndex; }; //------------------------------------------------------------------------------ /** @class struct St_TriRenderCommand */ struct St_TriRenderCommand : public St_BaseRenderCommand { enum ENUM_TRI_RENDERCOMMAND_TYPE { ETRCT_TRIINDEXED = 0, ETRCT_TRI, ETRCT_TRICOLORINDEXED, ETRCT_TRIPACKED, ETRCT_VERTEXBUFFER, ETRCT_SIMPLEMESH, ETRCT_NEW_TRI, }; // ŸÀÔ ENUM_TRI_RENDERCOMMAND_TYPE m_eTriType; // ·»´õ¸µ »óÅÂÁ¤º¸ St_RenderState m_RenderState; // À§Ä¡ Á¤º¸ WzVector m_wvPos; // ±¼Àý Á¤º¸ float m_fRefractionRate; // ¿Ü°î À² 0~1»çÀÌ °ª float m_fRefractionAlpha; // ¿Ü°î ¾ËÆÄµµ ( 0 - Diffuse 100%, 1 - ¿Ü°î 100% ) // Shader int m_iVertexShader; int m_iPixelShader; // Diffuse Texture HANDLE m_hTexture; struct St_TriParam { // HANDLE hTexture; int iNumFace; WzVector* pwvVertex; WzVector* pwvNormal; WzUVVert* pwUVs; int iDataSize; }; struct St_TriIndexedParam { // HANDLE hTexture; int iNumFace; WzVector* pwvVertex; int* piVertexMap; WzVector* pwvNormal; int* piNormalMap; WzUVVert* pwUVs; int* piUVMap; int iDataSize; }; struct St_ColorTriIndexedParam { // HANDLE hTexture; int iNumFace; WzVector* pwvVertex; int* piVertexMap; WzColor* pwcColor; int* piColorMap; WzUVVert* pwUVs; int* piUVMap; int iVertDataSize; int iColorDataSize; }; struct St_TriPackedParam { // HANDLE hTexture; int iNumFace; int* piVertexMap; WzVector* pwvPosVert; int* piPosVertIndex; WzColor* pwcColor; WzUVVert* pwUVs; WzVector* pwvNormal; int iVertexDataSize; int iPosVertMapDataSize; int iColorDataSize; int iUVDataSize; int iNormalDataSize; }; struct St_VertexBufferParam { // HANDLE hTexture; HANDLE hVertexBuffer; int iNumFace; int* piIndex; WzUVVert* pwuvStream; // int iVertexShader; // int iPixelShader; }; struct St_SimpleMeshParam { // WzSimpleMesh *pwsmSimpleMesh; int iNumMesh; WzVector* pVertices; WzUVVert* pUVVerts; }; struct St_NewTriParam { // HANDLE hTexture; int iNumFace; WzVector* pwvVertex; WzColor* pwcColor; WzUVVert* pwUVs; int* piVertexIndex; int* piColorIndex; int* piUVIndex; int iVertexSize; int iColorSize; int iUVSize; DWORD dwFlags; }; union { St_TriParam m_Tri; St_TriIndexedParam m_TriIndexed; St_ColorTriIndexedParam m_ColorTriIndexed; St_TriPackedParam m_TriPacked; St_VertexBufferParam m_VertBuffer; St_SimpleMeshParam m_SimpMesh; St_NewTriParam m_NewTri; }; }; //------------------------------------------------------------------------------ /** @struct St_SpriteRenderCommand - ÇϳªÀÇ Sprite Á¤º¸¸¦ render ÇÏ·Á´Â ¸í·ÉÀ» ÀúÀå */ struct St_SpriteRenderCommand : public St_BaseRenderCommand { WzColor m_wcDraw; ///< ·»´õ¸µ »óÅÂÁ¤º¸ St_RenderState m_RenderState; union { ///< RenderSprite's ÀÎÀÚ°ª(St_AlphaRender ÂüÁ¶) struct { HANDLE m_hTexture; WzVector m_wvPos; // ENUM_ALPHABLEND m_eabMode; float m_fSize[2]; float m_fRotate; float m_fDepthOffset; BOOL m_bUVRegion; WzUVVert m_wuvRegion[2]; }; }; float m_fRefractionRate; // ¿Ü°î À² 0~1»çÀÌ °ª float m_fRefractionAlpha; // ¿Ü°î ¾ËÆÄµµ ( 0 - Diffuse 100%, 1 - ¿Ü°î 100% ) // Shader int m_iVertexShader; int m_iPixelShader; // ºôº¸µå ŸÀÔ ENUM_BILLBOARD_TYPE m_eBillboardType; // °á°ú À§Ä¡ ¸®ÅÏ WzVector* m_pResultPos; }; //------------------------------------------------------------------------------ /** @struct St_NewSpriteRenderCommand */ struct St_NewSpriteRenderCommand : public St_BaseRenderCommand { WzColor m_wcDraw; // ·»´õ¸µ »óÅÂÁ¤º¸ St_RenderState m_RenderState; union { // RenderSprite's ÀÎÀÚ°ª(St_AlphaRender ÂüÁ¶) struct { HANDLE m_hTexture; SpriteVerts m_wvPos[6]; // ENUM_ALPHABLEND m_eabMode; float m_fRotate; float m_fDepthOffset; BOOL m_bUVRegion; WzUVVert m_wuvRegion[2]; WzVector m_vCenterPos; }; }; float m_fRefractionRate; // ¿Ü°î À² 0~1»çÀÌ °ª float m_fRefractionAlpha; // ¿Ü°î ¾ËÆÄµµ ( 0 - Diffuse 100%, 1 - ¿Ü°î 100% ) // Shader int m_iVertexShader; int m_iPixelShader; // ºôº¸µå ŸÀÔ ENUM_BILLBOARD_TYPE m_eBillboardType; // °á°ú À§Ä¡ ¸®ÅÏ WzVector* m_pResultPos; }; //------------------------------------------------------------------------------ /** @class struct St_RenderCommand */ struct St_RenderCommand : public St_BaseRenderCommand { // Render Flags DWORD m_dwFlags; // render ÇÒ ´ë»ó CWzUnitDraw* m_pUnitDraw; // render ÇÒ CWzUnitDraw CWzdBase* m_pWzdMesh; // render ÇÒ mesh int m_iMeshGroup; // render ÇÒ mesh group ¹øÈ£ WzMatrix* m_pwmTransform; // vertex, normal º¯È¯¿ë matrix - InverseAndTransformBuffer HANDLE m_hVertexTB; // Transform ÇÑ °á°ú¸¦ ´ã´Â ¹öÆÛ (Vertex ¿ë) HANDLE m_hNormalTB; // Transform ÇÑ °á°ú¸¦ ´ã´Â ¹öÆÛ (Normal ¿ë) HANDLE m_hShadingBuffer; // Shading °á°ú¸¦ ´ã´Â ¹öÆÛ ( Gouraud, Phong Shading ) HANDLE m_hCustomUVBuffer; // Custom UV ¸¦ »ç¿ëÇÏ´Â °æ¿ì ( UVNormal, UVLight ¿¡ »ç¿ë) // texture °ü·Ã HANDLE m_ahTexture[NUM_TXC]; // »ç¿ëÇÏ´Â texture µé ( diffuse, specular, normalmap ) HANDLE m_hTextureFilter; // »ç¿ëÇÏ´Â texture filter BOOL m_bUVShift; // UV shift ¸¦ ¾²´Â°¡ WzUVVert m_wuvShift; // uv shift °ª St_RenderState m_RenderState; // render ½Ã »óÅ·Πint m_iWithAlpha; // Alpha ¸¦ °¡Áö°í render ÇÏ´Â °ÍÀΰ¡ // Á¶Àý°ª float m_fBrightnessFunc[3]; // Brightness func // on/off int m_iUVNormal; // Normal À» ±âÁØÀ¸·Î uv °è»ê(0:false, 1:UVNormal, 2:UV1DNormal) WzVector m_wvFactorForUVNormal[2]; // m_bUVNormal °¡ TRUE ÀÎ °æ¿ìÀÇ factor BOOL m_bPhong; // Phong shading Áß BOOL m_bUVLight; // Normal °ú Light ¸¦ ±âÁØÀ¸·Î uv °è»ê int m_iApplySunLight; // Sun Light ÀÇ Àû¿ë ¿©ºÎ ( 0 : Àû¿ë¾ÈÇÔ, 1 : ÇöÀç »óÅ Àû¿ë, 2 : ¹«Á¶°Ç Àû¿ë) float m_fSpecularIntensity; // Specular °­µµ°ª St_OcclusionInfo* m_pOcclusion; float m_fGlowMapFactor; // GlowMap °­µµ float m_fHazeDist; // Haze °Å¸® float m_fHazeScale; // Haze ½ºÄÉÀÏ }; //------------------------------------------------------------------------------ /** @struct St_InstancingRenderCommand */ struct St_InstancingRenderCommand : public St_RenderCommand { int m_iAllocInstancing; CWzArray m_arInstancing; }; //------------------------------------------------------------------------------ /** */ inline void InitRenderCommand( St_RenderCommand* prc ) { ZeroMemory( prc, sizeof ( St_RenderCommand ) ); prc->m_hVertexTB = INVALID_HANDLE_VALUE; prc->m_hNormalTB = INVALID_HANDLE_VALUE; prc->m_hShadingBuffer = INVALID_HANDLE_VALUE; prc->m_hCustomUVBuffer = INVALID_HANDLE_VALUE; memset( prc->m_ahTexture, (int)INVALID_HANDLE_VALUE, sizeof( prc->m_ahTexture ) ); prc->m_hTextureFilter = INVALID_HANDLE_VALUE; prc->m_iApplySunLight = 1; WzInitFlag( prc->m_dwFlags, RCF_DEFAULT ); } //------------------------------------------------------------------------------ /** */ inline void InitInstancingRenderCommand( St_InstancingRenderCommand* pirc ) { InitRenderCommand( (St_RenderCommand*)pirc ); pirc->m_iAllocInstancing = 0; } #endif // _3DRENDERER_RENDERCOMMAND_H_