// managershadowmap.h #ifndef _3DRENDERER_MANAGERSHADOWMAP_H_ #define _3DRENDERER_MANAGERSHADOWMAP_H_ #include "managerbase.h" #include "managerspeedtree.h" #include struct St_RenderCommand; // from nvidia sdk #define FLT_AS_DW(F) (*(DWORD*)&(F)) #define ALMOST_ZERO(F) ((FLT_AS_DW(F) & 0x7f800000L)==0) #define IS_SPECIAL(F) ((FLT_AS_DW(F) & 0x7f800000L)==0x7f800000L) #define UNIT_SUB_BB 1.0f #define MAX_BV 500 enum ENUM_SHADOWMAP_MODE { ESM_NONE = 0, // ShadowMap ¹ÌÁö¿ø ESM_DEPTHSTENCIL, // NVidia ¿ë ( Çϵå¿þ¾î Áö¿ø ) ESM_R32F, // ATI ¿ë ( ½¦ÀÌ´õ¸¦ ¾²Áö¸¸ ¼ÒÇÁÆ®¿þ¾î ShadowMap ) ESM_PROTECTED_TEXTURE, // ±×¸²ÀÚ ¸ÊÀÌ Áö¿ø ¾ÈµÇ´Â ±×·¡ÇÈÄ«µå¿ë. °Á ÁöÇü¿¡ ¸ÎÈ÷´Â ±×¸²ÀÚ. ESM_DEPTHSTENCIL_NO_SELFSHADOW, // ÀÚ±â±×¸²ÀÚ ¾øÀÌ ±íÀ̹öÆÛ ¾²´Â ±×¸²ÀÚ ESM_R32F_NO_SELFSHADOW, NUM_SHADOWTEXTURE, }; // WzFrustum¿¡ Frustum ÀÇ °¢ ²ÀÁöÁ¡ 8°³ Ãß°¡ struct WzFrustumShadow : public WzFrustum { WzVector m_wvPoints[8]; int m_nVertexLUT[6]; }; #define NUM_SHADOW_BLUR 9 class CManagerShadowMap : public CManagerBase { public: CManagerShadowMap(); virtual ~CManagerShadowMap(); virtual void Clear(); virtual BOOL Create( CDrawBase *pParentDraw, void *pParam); virtual void Destroy(); virtual void OnLostDevice(); virtual void OnResetDevice(); virtual void Apply(); virtual ENUM_SHADOWMAP_MODE ConfirmDevice() = 0; virtual void ResetShadowMode(); protected: virtual BOOL CreateDeviceObjects(); virtual void DestroyDeviceObjects(); // ManagerRenderCommand¿¡ µî·ÏµÈ unitµé Áß¿¡¼­ Caster¿Í Receiver¸¦ Ãß·Á³¿ virtual BOOL ChooseShadowCastersAndReceivers( St_RenderCommand** ppRenderCommand, int iNumRCShadow ); virtual void SetTexBiasMatrix( DWORD dwTexWidth, DWORD dwTexHeight ) = 0; protected: // º¯È¯Çà·Ä °è»ê virtual void CalculateTransformMatrix() = 0; virtual void CalculateProjectionMatrix() = 0; // Åõ¿µÇà·Ä ¶Ç´Â ºä*Åõ¿µÇà·Ä·Î ºÎÅÍ ÇÁ·¯½ºÅÒ °è»ê virtual void GenerateFrustumFromMatrix( WzFrustumShadow* pResult, WzMatrix* pwmInput ) = 0; protected: ENUM_SHADOWMAP_MODE m_eShadowMode; // Çϵå¿þ¾î Áö¿ø ¸ðµå HANDLE m_hShadowMap; // ±×¸²ÀÚ ¸Ê ÅØ½ºÃÄ HANDLE m_hDepth; // ±×¸²ÀÚ ¸Ê ±×¸±¶§ ±íÀÌ ¹öÆÛ DWORD m_dwTexWidth, m_dwTexHeight; // ±×¸²ÀÚ ¸Ê Å©±â WzMatrix m_wmShadowTransform; // º¯È¯ Çà·Ä( ±×¸²ÀÚ ¸Ê¿¡ ±×¸± ¶§ ) WzMatrix m_wmProjForShadow; // ±×¸²ÀÚ¿ë Åõ¿µ Çà·Ä WzMatrix m_wmShadowTransformBias; // º¯È¯ Çà·Ä( ±×¸²ÀÚ ¸ÊÀ» Unit¿¡ ±×¸± ¶§ ) WzMatrix m_wmShadowTransformBiasBlur[4]; // ºí·¯ º¯È¯ Çà·Ä( ±×¸²ÀÚ ¸ÊÀ» Unit¿¡ ±×¸± ¶§ ) WzMatrix m_wmTexBias; // ºí·¯ ¾ÈÇÒ ¶§( ATI ) WzMatrix m_wmTexBiasBlur[4]; // ±×¸²ÀÚ¸ÊÀÇ ÅØ½ºÃÄ ÁÂÇ¥¸¦ °è»êÇÒ ¶§ ¾²´Â Çà·Ä »ç°¢Çü ÇÊÅÍ float m_fShadowRange; // ±×¸²ÀÚ°¡ Àû¿ë µÉ °Å¸® float m_fRangeChangingColor; // ±×¸²ÀÚ »öÀÌ ¿¬ÇØÁö´Â °Å¸® float m_fShadowFOV; // ±×¸²ÀÚ ¸Ê¿ë FOV float m_fZNear;//, m_fZFar; // m_wmProjForShadow¿ë ZMin, ZFar float m_fTSMDelta; // Delta °ª float m_fDepthBias; // DepthBias °ª CWzArray< St_RenderCommand* > m_arShadowCasterUnits; // Shadow Casters CWzArray< St_RenderCommand* > m_arShadowReceiverUnits; // Shadow Receivers int m_iNumRCShadow; // St_RenderCommand** m_ppRenderCommand; // BOOL m_bCastersAndReceivers; CWzArray< CSpeedTreeDrawInfo* > m_arShadowCasterUnitsST; // Shadow Casters For SpeedTree CWzArray< CSpeedTreeDrawInfo* > m_arShadowReceiverUnitsST; // Shadow Receivers For SpeedTree int m_iNumSTShadow; BOOL m_bActiveSpeedTree; // ShadowMap¿¡ ½ºÇÇµå Æ®¸® Àû¿ë¿©ºÎ std::vector< BvAABB > m_vecShadowReceiversAABB; float m_fPixelOffset[NUM_SHADOW_BLUR*4]; // Get, Set public: CWzArray< St_RenderCommand* >* GetShadowCasters(){ return &m_arShadowCasterUnits; } CWzArray< CSpeedTreeDrawInfo* >* GetShadowCastersForSpeedTree(){ return &m_arShadowCasterUnitsST; } BOOL GetActiveSpeedTree(){ return m_bActiveSpeedTree; } void SetActiveSpeedTree( BOOL bActive ){ m_bActiveSpeedTree = bActive; } WzMatrix* GetShadowTransform(){ return &m_wmShadowTransform; } WzMatrix* GetShadowTransformBias(){ return &m_wmShadowTransformBias; } WzMatrix* GetShadowTransformBiasBlur( int nIndex ){ return &m_wmShadowTransformBiasBlur[nIndex]; } virtual HANDLE GetRenderTarget(){ return m_hShadowMap; } virtual HANDLE GetDepthStencil(){ return m_hDepth; } virtual float GetDepthBias(){ return m_fDepthBias; } virtual void SetDepthBias( float fDepthBias ){ m_fDepthBias = fDepthBias; } virtual ENUM_SHADOWMAP_MODE GetShadowMode(){ return m_eShadowMode; } virtual HANDLE GetShadowTexture(); virtual void ChangeTextureSize( DWORD dwWidth, DWORD dwHeight ); virtual BOOL IsCastersAndReceivers() const { return m_bCastersAndReceivers; } virtual float GetShadowRange(){ return m_fShadowRange; } virtual void SetShadowRange( float fRange ){ m_fShadowRange = fRange; } virtual float GetRangeChangingColor(){ return m_fRangeChangingColor; } virtual void SetRangeChangingColor( float fRange ){ m_fRangeChangingColor = fRange; } virtual void SetTSMDelta( float fDelta ){ m_fTSMDelta = fDelta; } virtual float GetTSMDelta(){ return m_fTSMDelta; } virtual float* GetPixelOffset(){ return m_fPixelOffset; } virtual DWORD GetTexWidth(){ return m_dwTexWidth; } virtual DWORD GetTexHeight(){ return m_dwTexHeight; } protected: virtual void SetShadowMode( ENUM_SHADOWMAP_MODE eMode ); }; #endif // _3DRENDERER_MANAGERSHADOWMAP_H_