From 28b4e9a63450110978d60de80a9af2e901d49a97 Mon Sep 17 00:00:00 2001 From: Piotr Dziwinski Date: Thu, 20 Jun 2013 23:14:37 +0200 Subject: Fixed terrain light priorities (fix for #139) * lights illuminating the terrain specified in scene file are now always moved to front of light ordering --- src/graphics/engine/lightman.cpp | 12 ++++++++++++ src/graphics/engine/lightman.h | 7 +++++-- src/graphics/opengl/gldevice.cpp | 2 +- src/object/robotmain.cpp | 3 +++ 4 files changed, 21 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/graphics/engine/lightman.cpp b/src/graphics/engine/lightman.cpp index cd743a5..295b3da 100644 --- a/src/graphics/engine/lightman.cpp +++ b/src/graphics/engine/lightman.cpp @@ -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( 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( 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; diff --git a/src/graphics/engine/lightman.h b/src/graphics/engine/lightman.h index d0ac338..9677555 100644 --- a/src/graphics/engine/lightman.h +++ b/src/graphics/engine/lightman.h @@ -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); diff --git a/src/graphics/opengl/gldevice.cpp b/src/graphics/opengl/gldevice.cpp index 534a13f..bbabdd6 100644 --- a/src/graphics/opengl/gldevice.cpp +++ b/src/graphics/opengl/gldevice.cpp @@ -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( m_lights.size() ); ++i) { color.h = static_cast(i) / static_cast(m_lights.size()); if (m_lightsEnabled[i]) diff --git a/src/object/robotmain.cpp b/src/object/robotmain.cpp index 23f5a28..7eaa3f6 100644 --- a/src/object/robotmain.cpp +++ b/src/object/robotmain.cpp @@ -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); -- cgit v1.2.3-1-g7c22