summaryrefslogtreecommitdiffstats
path: root/src/graphics/engine/lightman.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/graphics/engine/lightman.cpp')
-rw-r--r--src/graphics/engine/lightman.cpp77
1 files changed, 74 insertions, 3 deletions
diff --git a/src/graphics/engine/lightman.cpp b/src/graphics/engine/lightman.cpp
index 16c84ea..8694c7a 100644
--- a/src/graphics/engine/lightman.cpp
+++ b/src/graphics/engine/lightman.cpp
@@ -71,6 +71,7 @@ void LightProgression::SetTarget(float value)
DynamicLight::DynamicLight()
{
+ rank = 0;
used = enabled = false;
priority = LIGHT_PRI_LOW;
includeType = excludeType = ENG_OBJTYPE_NULL;
@@ -98,6 +99,61 @@ void CLightManager::SetDevice(CDevice* device)
m_lightMap = std::vector<int>(m_device->GetMaxLightCount(), -1);
}
+void CLightManager::DebugDumpLights()
+{
+ CLogger* l = GetLogger();
+
+ l->Debug("Dynamic lights:\n");
+
+ for (int i = 0; i < static_cast<int>( m_dynLights.size() ); ++i)
+ {
+ const DynamicLight& dynLight = m_dynLights[i];
+ if (!dynLight.used)
+ continue;
+
+ int deviceLight = -1;
+ for (int j = 0; j < static_cast<int>( m_lightMap.size() ); ++j)
+ {
+ if (m_lightMap[j] == i)
+ {
+ deviceLight = j;
+ break;
+ }
+ }
+
+ l->Debug(" light %d\n", i);
+ l->Debug(" enabled = %s\n", dynLight.enabled ? "true" : "false");
+ l->Debug(" priority = %d\n", dynLight.priority);
+ l->Debug(" device light = %d\n", deviceLight);
+ l->Debug(" light:\n");
+
+ const Light& light = dynLight.light;
+ std::string str;
+
+ l->Debug(" type = %d\n", light.type);
+ str = light.ambient.ToString();
+ l->Debug(" ambient = %s\n", str.c_str());
+ str = light.diffuse.ToString();
+ l->Debug(" diffuse = %s\n", str.c_str());
+ str = light.specular.ToString();
+ l->Debug(" specular = %s\n", str.c_str());
+ str = light.position.ToString();
+ l->Debug(" position = %s\n", str.c_str());
+ str = light.direction.ToString();
+ l->Debug(" direction = %s\n", str.c_str());
+ l->Debug(" attenuation0 = %f\n", light.attenuation0);
+ l->Debug(" attenuation1 = %f\n", light.attenuation1);
+ l->Debug(" attenuation2 = %f\n", light.attenuation2);
+ l->Debug(" spotAngle = %f\n", light.spotAngle);
+ l->Debug(" spotIntensity = %f\n", light.spotIntensity);
+
+ l->Debug(" intensity: %f\n", dynLight.intensity.current);
+ l->Debug(" color: %f %f %f\n", dynLight.colorRed.current, dynLight.colorGreen.current, dynLight.colorBlue.current);
+ l->Debug(" includeType: %d\n", dynLight.includeType);
+ l->Debug(" excludeType: %d\n", dynLight.excludeType);
+ }
+}
+
void CLightManager::FlushLights()
{
m_dynLights.clear();
@@ -117,6 +173,7 @@ int CLightManager::CreateLight(LightPriority priority)
m_dynLights.push_back(DynamicLight());
m_dynLights[index] = DynamicLight();
+ m_dynLights[index].rank = index;
m_dynLights[index].used = true;
m_dynLights[index].enabled = true;
m_dynLights[index].priority = priority;
@@ -179,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() )) )
@@ -411,7 +477,7 @@ void CLightManager::UpdateDeviceLights(EngineObjectType type)
if (enabled)
{
- m_lightMap[lightMapIndex] = i;
+ m_lightMap[lightMapIndex] = sortedLights[i].rank;
++lightMapIndex;
}
@@ -424,8 +490,9 @@ void CLightManager::UpdateDeviceLights(EngineObjectType type)
int rank = m_lightMap[i];
if (rank != -1)
{
- sortedLights[rank].light.ambient = Gfx::Color(0.2f, 0.2f, 0.2f);
- m_device->SetLight(i, sortedLights[rank].light);
+ Light light = m_dynLights[rank].light;
+ light.ambient = Gfx::Color(0.2f, 0.2f, 0.2f);
+ m_device->SetLight(i, light);
m_device->SetLightEnabled(i, true);
}
else
@@ -445,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;
@@ -465,3 +535,4 @@ bool CLightManager::LightsComparator::operator()(const DynamicLight& left, const
}
} // namespace Gfx
+