/** @file LightsManager.h
@brief
* Copyright (c) 2007,第九城市游戏研发中心
* All rights reserved.
*
* 当前版本:
* 作 者:zhaixufeng
* 完成日期:2007-12-13
*
* 取代版本:
* 作 者:
* 完成日期:
*/
#ifndef CODE_INGAME
#ifndef LIGHTS_MANAGER_H
#define LIGHTS_MANAGER_H
#define TRANSLATION "Translation"
#define ROTATION "Rotation"
#define SCALE "Scale"
#define LIGHTTYPE "Light Type"
#define DIMMER "Dimmer"
#define COLOR_AMBIENT "Color (Ambient)"
#define COLOR_DIFFUSE "Color (Diffuse)"
#define COLOR_SPECULAR "Color (Specular)"
#define ATTENUATION_CONSTANT "Attenuation (Constant)"
#define ATTENUATION_LINEAR "Attenuation (Linear)"
#define ATTENUATION_QUADRATIC "Attenuation (Quadratic)"
#define SPOTANGLE_OUTER "Spot Angle (Outer)"
#define SPOTANGLE_INNER "Sport Angle (Inner)"
#define SPOT_EXPONENT "Spot Exponent"
#define DIRECTION "Direction"
#include
#include
#include
class CTerrain;
class MAIN_ENTRY CLightsManager
{
public:
/// 构造
CLightsManager( CTerrain * );
/// 析构
virtual ~CLightsManager( void );
protected:
/// 地形
CTerrain *m_pTerrain;
/// 灯光集合
typedef map< NiEntityInterface*, NiLight* > LightsMap;
LightsMap m_LightsMap;
NiLight* m_pkSun; // 唯一影响地形的方向光
NiLight* m_pkFillLight; // 补光
std::set m_UnaffectCasterList; // 不投射阴影物件列表
std::set m_UnaffectReceiverList; // 不接受阴影物件列表
public:
NiLight* GetLight( NiEntityInterface* );
void UpdateLight( NiEntityInterface*, NiFixedString& );
// 更新所有灯光,让列表中所有灯光都影响地形
void RefreshAllLights();
// 更新 sun light
void RefreshSunLight();
bool AddLight( NiEntityInterface* );
bool RemoveLight( NiEntityInterface* );
void RemoveAllLights();
bool IsExited(NiEntityInterface*);
// [11/17/2009 shiyazheng] 重新 cache 不投射物件/不接受物件列表
void BuildUnaffectCasterList(NiDirectionalLight* pkSun);
void BuildUnaffectReceiverList(NiDirectionalLight* pkSun);
// 是否在不投射阴影列表中
bool IsUnaffectCaster(NiGeometry* pkGeom)
{
bool bInList =
(m_UnaffectCasterList.find(pkGeom) != m_UnaffectCasterList.end());
return bInList;
}
// 是否在不接受阴影列表中
bool IsUnaffectReceiver(NiGeometry* pkGeom)
{
bool bInList =
(m_UnaffectReceiverList.find(pkGeom) != m_UnaffectReceiverList.end());
return bInList;
}
};
#endif
#endif