Fixed terrain light priorities (fix for #139)

* lights illuminating the terrain specified in scene file are now
   always moved to front of light ordering
dev-ui
Piotr Dziwinski 2013-06-20 23:14:37 +02:00
parent 4c33172e17
commit 28b4e9a634
4 changed files with 21 additions and 3 deletions

View File

@ -236,6 +236,15 @@ bool CLightManager::SetLightEnabled(int lightRank, bool enabled)
return true;
}
bool CLightManager::SetLightPriority(int lightRank, LightPriority priority)
{
if ( (lightRank < 0) || (lightRank >= static_cast<int>( m_dynLights.size() )) )
return false;
m_dynLights[lightRank].priority = priority;
return true;
}
bool CLightManager::SetLightIncludeType(int lightRank, EngineObjectType type)
{
if ( (lightRank < 0) || (lightRank >= static_cast<int>( m_dynLights.size() )) )
@ -503,6 +512,9 @@ CLightManager::LightsComparator::LightsComparator(Math::Vector eyePos, EngineObj
float CLightManager::LightsComparator::GetLightWeight(const DynamicLight& dynLight)
{
if (dynLight.priority == LIGHT_PRI_HIGHEST)
return -1.0f;
bool enabled = true;
if (!dynLight.used || !dynLight.enabled || dynLight.intensity.current == 0.0f)
enabled = false;

View File

@ -71,8 +71,9 @@ struct LightProgression
*/
enum LightPriority
{
LIGHT_PRI_HIGH = 1,
LIGHT_PRI_LOW = 2
LIGHT_PRI_HIGHEST = 1, //!< always highest weight (always picked)
LIGHT_PRI_HIGH = 2, //!< high weight
LIGHT_PRI_LOW = 3 //!< low weight
};
/**
@ -154,6 +155,8 @@ public:
bool GetLight(int lightRank, Light &light);
//! Enables/disables the given dynamic light
bool SetLightEnabled(int lightRank, bool enable);
//! Changes the light priority
bool SetLightPriority(int lightRank, LightPriority priority);
//! Sets what objects are included in given dynamic light
bool SetLightIncludeType(int lightRank, EngineObjectType type);

View File

@ -92,7 +92,7 @@ void CGLDevice::DebugLights()
m_worldMat.LoadIdentity();
UpdateModelviewMatrix();
for (int i = 0; i < m_lights.size(); ++i)
for (int i = 0; i < static_cast<int>( m_lights.size() ); ++i)
{
color.h = static_cast<float>(i) / static_cast<float>(m_lights.size());
if (m_lightsEnabled[i])

View File

@ -4784,7 +4784,10 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject)
type = OpTypeTerrain(line, "type", Gfx::ENG_OBJTYPE_NULL);
if (type == Gfx::ENG_OBJTYPE_TERRAIN)
{
m_lightMan->SetLightPriority(lightRank, Gfx::LIGHT_PRI_HIGHEST);
m_lightMan->SetLightIncludeType(lightRank, Gfx::ENG_OBJTYPE_TERRAIN);
}
if (type == Gfx::ENG_OBJTYPE_QUARTZ)
m_lightMan->SetLightIncludeType(lightRank, Gfx::ENG_OBJTYPE_QUARTZ);