// managerlight.h #ifndef _3DRENDERER_MANAGERLIGHT_H_ #define _3DRENDERER_MANAGERLIGHT_H_ #include "managerbase.h" #define DEFAULT_LIGHT_RANGE 5.0f #define DEFAULT_LIGHT_INTENSITY 3.0f // Ä¿½ºÅÒ ¶óÀÌÆ® ½ºÅ¸ÀÏ #define CLS_NONE (0x00000000) #define CLS_LIGHT_COLOR (0x00000001) // ¶óÀÌÆ® »ö #define CLS_LIGHT_RANGE (0x00000002) // ¹üÀ§ #define CLS_LIGHT_INTENSITY (0x00000004) // °­µµ #define CLS_LIGHT_DIRECTION (0x00000008) // Directional LightÀÇ ¹æÇâ #define CLS_LIGHT_POSITION (0x00000008) // Point LightÀÇ À§Ä¡ #define CLS_LIGHT_ALL (0xffffffff) // ÀüºÎ »ç¿ë #define CLS_DEFAULT CLS_LIGHT_ALL class CWorldBase; //------------------------------------------------------------------------------ /** @class CManagerLight */ class CManagerLight : public CManagerBase { public: // »ý¼ºÀÚ/¼Ò¸êÀÚ CManagerLight(); virtual ~CManagerLight(); // »ý¼º/ÆÄ±« virtual BOOL Create( CDrawBase* pParentDraw, void* pParam ); virtual void Destroy(); // ÃʱâÈ­ virtual void Clear(); // ¹æÇâ ¶óÀÌÆ® ¼³Á¤ virtual BOOL SetDirectionalLight( int iIndex, WzColor wcColor, const WzVector& wvDirection, ENUM_LIGHT_IRRA_TYPE eliType = 0, float fRange = DEFAULT_LIGHT_RANGE, float fIntensity = DEFAULT_LIGHT_INTENSITY ); // Æ÷ÀÎÆ® ¶óÀÌÆ® ¼³Á¤ virtual BOOL SetPointLight( int iIndex, WzColor wcColor, const WzVector& wvPosition, ENUM_LIGHT_IRRA_TYPE eliType = 0, float fRange = DEFAULT_LIGHT_RANGE, float fIntensity = DEFAULT_LIGHT_INTENSITY ); // ¶óÀÌÆ® Á¤º¸ ¾ò±â virtual const St_LightInformation* GetLightInfo( int iIndex ) const; // ¶óÀÌÆ® °­µµ ¼³Á¤/¾ò±â BOOL SetLightIntensity( int iIndex, float fIntensity ); float GetLightIntensity( int iIndex ) const; // ¶óÀÌÆ® Äѱâ/²ô±â virtual BOOL TurnOnLight( int iIndex, BOOL bOn ); // Ȱ¼º ¶óÀÌÆ® À妽º/Á¤º¸ ¾ò±â (iActive ¹øÂ°) int GetIndexOfActiveLight( int iActive ) const; virtual const St_LightInformation* GetActiveLightInfo( int iActive ); // iActive ¹øÂ° ¶óÀÌÆ® Ȱ¼º ¿©ºÎ BOOL IsActiveLight( int iActive ) const; // Ȱ¼º ¶óÀÌÆ® ¼ö ¾ò±â int GetNumberOfActiveLight() const; // Ä¿½ºÅÒ ¹æÇâ ¶óÀÌÆ® ¼³Á¤ virtual BOOL SetCustomDirectionalLight( WzColor wcColor, const WzVector& wvDirection, ENUM_LIGHT_IRRA_TYPE eliType = 0, float fRange = DEFAULT_LIGHT_RANGE, float fIntensity = DEFAULT_LIGHT_INTENSITY ); // Ä¿½ºÅÒ Æ÷ÀÎÆ® ¶óÀÌÆ® ¼³Á¤ virtual BOOL SetCustomPointLight( WzColor wcColor, const WzVector& wvPosition, ENUM_LIGHT_IRRA_TYPE eliType = 0, float fRange = DEFAULT_LIGHT_RANGE, float fIntensity = DEFAULT_LIGHT_INTENSITY ); // Ä¿½ºÅÒ ¶óÀÌÆ® Á¤º¸ ¾ò±â virtual const St_LightInformation* GetCustomLightInfo( int iIndex ); // Ä¿½ºÅÒ ¶óÀÌÆ® ½ºÅ¸ÀÏ ¼³Á¤/¾ò±â void SetCustomLightStyle( DWORD dwStyle ); DWORD GetCustomLightStyle() const; // Ä¿½ºÅÒ ¶óÀÌÆ® Äѱâ/²ô±â void TurnOnCustomLight( BOOL bOn ); // irradiance ¾ò±â virtual HANDLE GetIrradiance( ENUM_LIGHT_IRRA_TYPE iLit, ENUM_GROUP_MATERIAL_TYPE iGmt ) const; virtual HANDLE GetActiveIrradiance( int iActive, ENUM_GROUP_MATERIAL_TYPE iGmt ); // irradiance Àç·Îµå virtual BOOL ReloadIrradiance(); // Áö¿ª ¶óÀÌÆ® »ç¿ë ¿©ºÎ ¼³Á¤/¾ò±â void EnableAreaLight( BOOL bEnable ); BOOL IsAreaLight() const; // °¡±î¿î Áö¿ª ¶óÀÌÆ® ¾ò±â virtual void FindAreaLight( WzBoundingVolume* bvLight, int* iIndex ); // ¶óÀÌÆ® Àû¿ë virtual void ApplyAreaLight( const int* iIndex ); // ¿ùµå ¼³Á¤ void SetWorld( CWorldBase* pWorld ); // ÆÄÀÏ ·Îµå °æ·Î ¼³Á¤ static void SetFilePath( const char* lpszPath ); protected: // ±âº» ¶óÀÌÆ® ¼³Á¤ virtual void SetDefaultLight(); // software shading À» À§ÇÑ ºû Á¤º¸ ¼¼ÆÃ virtual void UpdateWzdLightInfo(); // Ȱ¼º ¶óÀÌÆ® ÃʱâÈ­ void InitActiveLight(); protected: static char m_szFilePath[MAX_PATH]; St_LightInformation m_LightInfo[MAX_NUM_LIGHT]; int m_iIndexOfActiveLight[MAX_NUM_ACTIVE_LIGHT]; St_LightInformation m_CustomLightInfo; DWORD m_dwCustomLightStyle; BOOL m_bUseCustomLight; CWorldBase* x_pWorld; BOOL m_bEnableAreaLight; }; //------------------------------------------------------------------------------ /** */ inline BOOL CManagerLight::SetLightIntensity( int iIndex, float fIntensity ) { WzAssert( iIndex >= 0 && iIndex < MAX_NUM_LIGHT ); if( iIndex >= 0 && iIndex < MAX_NUM_LIGHT ) { m_LightInfo[iIndex].m_fIntensity = fIntensity; return TRUE; } return FALSE; } //------------------------------------------------------------------------------ /** */ inline float CManagerLight::GetLightIntensity( int iIndex ) const { WzAssert( iIndex >= 0 && iIndex < MAX_NUM_LIGHT ); if( iIndex >= 0 && iIndex < MAX_NUM_LIGHT ) { return m_LightInfo[iIndex].m_fIntensity; } return 0.0f; } //------------------------------------------------------------------------------ /** */ inline void CManagerLight::InitActiveLight() { memset( m_iIndexOfActiveLight, -1, sizeof( m_iIndexOfActiveLight ) ); } //------------------------------------------------------------------------------ /** */ inline int CManagerLight::GetIndexOfActiveLight( int iActive ) const { WzAssert( iActive >= 0 && iActive < MAX_NUM_ACTIVE_LIGHT ); if( iActive >= 0 && iActive < MAX_NUM_ACTIVE_LIGHT ) { return m_iIndexOfActiveLight[iActive]; } return -1; } //------------------------------------------------------------------------------ /** */ inline BOOL CManagerLight::IsActiveLight( int iActive ) const { return ( GetIndexOfActiveLight( iActive ) >= 0 ); } //------------------------------------------------------------------------------ /** */ inline int CManagerLight::GetNumberOfActiveLight() const { // xxx: ±âÁ¸ ȣȯ int iNum = 0; for( int i = 0; i < MAX_NUM_ACTIVE_LIGHT; ++i ) { if( m_iIndexOfActiveLight[i] < 0 ) { break; } ++iNum; } return iNum; } //------------------------------------------------------------------------------ /** */ inline void CManagerLight::SetCustomLightStyle( DWORD dwStyle ) { m_dwCustomLightStyle = dwStyle; } //------------------------------------------------------------------------------ /** */ inline DWORD CManagerLight::GetCustomLightStyle() const { return m_dwCustomLightStyle; } //------------------------------------------------------------------------------ /** */ inline void CManagerLight::TurnOnCustomLight( BOOL bOn ) { m_bUseCustomLight = bOn; } //------------------------------------------------------------------------------ /** */ inline void CManagerLight::EnableAreaLight( BOOL bEnable ) { m_bEnableAreaLight = bEnable; } //------------------------------------------------------------------------------ /** */ inline BOOL CManagerLight::IsAreaLight() const { return m_bEnableAreaLight; } //------------------------------------------------------------------------------ /** */ inline void CManagerLight::SetWorld( CWorldBase* pWorld ) { x_pWorld = pWorld; } #endif // _3DRENDERER_MANAGERLIGHT_H_