summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPiotr Dziwinski <piotrdz@gmail.com>2013-06-20 23:14:37 +0200
committerPiotr Dziwinski <piotrdz@gmail.com>2013-06-20 23:14:37 +0200
commit28b4e9a63450110978d60de80a9af2e901d49a97 (patch)
tree8a935f0350f695453353155d5efc561b13db9632
parent4c33172e173b8f815a367f1e1c0fae06d9051df5 (diff)
downloadcolobot-28b4e9a63450110978d60de80a9af2e901d49a97.tar.gz
colobot-28b4e9a63450110978d60de80a9af2e901d49a97.tar.bz2
colobot-28b4e9a63450110978d60de80a9af2e901d49a97.zip
Fixed terrain light priorities (fix for #139)
* lights illuminating the terrain specified in scene file are now always moved to front of light ordering
-rw-r--r--src/graphics/engine/lightman.cpp12
-rw-r--r--src/graphics/engine/lightman.h7
-rw-r--r--src/graphics/opengl/gldevice.cpp2
-rw-r--r--src/object/robotmain.cpp3
4 files changed, 21 insertions, 3 deletions
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<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;
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<int>( m_lights.size() ); ++i)
{
color.h = static_cast<float>(i) / static_cast<float>(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);