This is an automated email from the git hooks/post-receive script.

odyx pushed a commit to branch upstream/latest
in repository colobot.

commit d210dcf70edca4907fc5e957f95ea7c6df26f5e2
Author: Tomasz Kapuściński <tomaszka...@gmail.com>
Date:   Fri May 15 10:12:35 2015 +0200

    Implemented graceful degradation of shadow quality when not enough texture 
units are available
---
 src/graphics/engine/engine.cpp   | 177 ++++++++++++++++++++++-----------------
 src/graphics/opengl/gldevice.cpp |   1 +
 2 files changed, 100 insertions(+), 78 deletions(-)

diff --git a/src/graphics/engine/engine.cpp b/src/graphics/engine/engine.cpp
index 4b571aa..38196b1 100644
--- a/src/graphics/engine/engine.cpp
+++ b/src/graphics/engine/engine.cpp
@@ -3192,11 +3192,13 @@ void CEngine::Render()
     // Begin the scene
     m_device->BeginScene();
 
-    if (m_shadowMapping)
-        RenderShadowMap();
-
     if (m_drawWorld)
+    {
+        if (m_shadowMapping)
+            RenderShadowMap();
+
         Draw3DScene();
+    }
 
     m_app->StartPerformanceCounter(PCNT_RENDER_INTERFACE);
     DrawInterface();
@@ -3242,85 +3244,94 @@ void CEngine::Draw3DScene()
     {
         if (m_qualityShadows)
         {
-            // Texture Unit 2
-            m_device->SetTextureEnabled(2, true);
-            m_device->SetTexture(2, m_shadowMap);
-            m_device->SetTextureMatrix(2, m_shadowTextureMat);
-
-            Math::Matrix identity;
-            identity.LoadIdentity();
-            m_device->SetTransform(TRANSFORM_WORLD, identity);
-
-            float shadowBias = 0.6f;
-            float shadowUnbias = 1.0f - shadowBias;
-
-            TextureStageParams params;
-            params.colorOperation = TEX_MIX_OPER_MODULATE;
-            params.colorArg1 = TEX_MIX_ARG_TEXTURE;
-            params.colorArg2 = TEX_MIX_ARG_FACTOR;
-            params.colorOperation = TEX_MIX_OPER_DEFAULT;
-            params.factor = Color(shadowBias, shadowBias, shadowBias, 1.0f);
-            params.wrapS = TEX_WRAP_CLAMP_TO_BORDER;
-            params.wrapT = TEX_WRAP_CLAMP_TO_BORDER;
-
-            m_device->SetTextureStageParams(2, params);
-
-            TextureGenerationParams genParams;
-
-            for (int i = 0; i < 4; i++)
+            if (m_device->GetMaxTextureStageCount() < 6)
             {
-                genParams.coords[i].mode = TEX_GEN_EYE_LINEAR;
-
-                for (int j = 0; j < 4; j++)
-                {
-                    genParams.coords[i].plane[j] = (i == j ? 1.0f : 0.0f);
-                }
+                m_qualityShadows = false;
+                GetLogger()->Error("Cannot use quality shadow maps, not enough 
texture units\n");
+                GetLogger()->Error("Attempting to use lower quality shadow 
maps\n");
             }
+            else
+            {
+                // Texture Unit 2
+                m_device->SetTextureEnabled(2, true);
+                m_device->SetTexture(2, m_shadowMap);
+                m_device->SetTextureMatrix(2, m_shadowTextureMat);
 
-            m_device->SetTextureCoordGeneration(2, genParams);
-
-            // Texture Unit 3
-            m_device->SetTextureEnabled(3, true);
-            m_device->SetTexture(3, m_shadowMap);
-
-            params.LoadDefault();
-            params.colorOperation = TEX_MIX_OPER_ADD;
-            params.colorArg1 = TEX_MIX_ARG_COMPUTED_COLOR;
-            params.colorArg2 = TEX_MIX_ARG_FACTOR;
-            params.alphaOperation = TEX_MIX_OPER_DEFAULT;
-            params.factor = Color(shadowUnbias, shadowUnbias, shadowUnbias, 
0.0f);
-            params.wrapS = TEX_WRAP_CLAMP_TO_BORDER;
-            params.wrapT = TEX_WRAP_CLAMP_TO_BORDER;
+                Math::Matrix identity;
+                identity.LoadIdentity();
+                m_device->SetTransform(TRANSFORM_WORLD, identity);
 
-            m_device->SetTextureStageParams(3, params);
+                float shadowBias = 0.6f;
+                float shadowUnbias = 1.0f - shadowBias;
 
-            // Texture Unit 4
-            m_device->SetTextureEnabled(4, true);
-            m_device->SetTexture(4, m_shadowMap);
+                TextureStageParams params;
+                params.colorOperation = TEX_MIX_OPER_MODULATE;
+                params.colorArg1 = TEX_MIX_ARG_TEXTURE;
+                params.colorArg2 = TEX_MIX_ARG_FACTOR;
+                params.colorOperation = TEX_MIX_OPER_DEFAULT;
+                params.factor = Color(shadowBias, shadowBias, shadowBias, 
1.0f);
+                params.wrapS = TEX_WRAP_CLAMP_TO_BORDER;
+                params.wrapT = TEX_WRAP_CLAMP_TO_BORDER;
 
-            params.LoadDefault();
-            params.colorOperation = TEX_MIX_OPER_MODULATE;
-            params.colorArg1 = TEX_MIX_ARG_COMPUTED_COLOR;
-            params.colorArg2 = TEX_MIX_ARG_SRC_COLOR;
-            params.alphaOperation = TEX_MIX_OPER_DEFAULT;
-            params.wrapS = TEX_WRAP_CLAMP_TO_BORDER;
-            params.wrapT = TEX_WRAP_CLAMP_TO_BORDER;
+                m_device->SetTextureStageParams(2, params);
 
-            m_device->SetTextureStageParams(4, params);
+                TextureGenerationParams genParams;
 
-            // Texture Unit 5
-            m_device->SetTextureEnabled(5, true);
-            m_device->SetTexture(5, m_shadowMap);
+                for (int i = 0; i < 4; i++)
+                {
+                    genParams.coords[i].mode = TEX_GEN_EYE_LINEAR;
 
-            params.LoadDefault();
-            params.colorOperation = TEX_MIX_OPER_MODULATE;
-            params.colorArg1 = TEX_MIX_ARG_COMPUTED_COLOR;
-            params.colorArg2 = TEX_MIX_ARG_TEXTURE_0;
-            params.alphaOperation = TEX_MIX_OPER_DEFAULT;
-            params.wrapS = TEX_WRAP_CLAMP_TO_BORDER;
-            params.wrapT = TEX_WRAP_CLAMP_TO_BORDER;
+                    for (int j = 0; j < 4; j++)
+                    {
+                        genParams.coords[i].plane[j] = (i == j ? 1.0f : 0.0f);
+                    }
+                }
 
-            m_device->SetTextureStageParams(5, params);
+                m_device->SetTextureCoordGeneration(2, genParams);
+
+                // Texture Unit 3
+                m_device->SetTextureEnabled(3, true);
+                m_device->SetTexture(3, m_shadowMap);
+
+                params.LoadDefault();
+                params.colorOperation = TEX_MIX_OPER_ADD;
+                params.colorArg1 = TEX_MIX_ARG_COMPUTED_COLOR;
+                params.colorArg2 = TEX_MIX_ARG_FACTOR;
+                params.alphaOperation = TEX_MIX_OPER_DEFAULT;
+                params.factor = Color(shadowUnbias, shadowUnbias, 
shadowUnbias, 0.0f);
+                params.wrapS = TEX_WRAP_CLAMP_TO_BORDER;
+                params.wrapT = TEX_WRAP_CLAMP_TO_BORDER;
+
+                m_device->SetTextureStageParams(3, params);
+
+                // Texture Unit 4
+                m_device->SetTextureEnabled(4, true);
+                m_device->SetTexture(4, m_shadowMap);
+
+                params.LoadDefault();
+                params.colorOperation = TEX_MIX_OPER_MODULATE;
+                params.colorArg1 = TEX_MIX_ARG_COMPUTED_COLOR;
+                params.colorArg2 = TEX_MIX_ARG_SRC_COLOR;
+                params.alphaOperation = TEX_MIX_OPER_DEFAULT;
+                params.wrapS = TEX_WRAP_CLAMP_TO_BORDER;
+                params.wrapT = TEX_WRAP_CLAMP_TO_BORDER;
+
+                m_device->SetTextureStageParams(4, params);
+
+                // Texture Unit 5
+                m_device->SetTextureEnabled(5, true);
+                m_device->SetTexture(5, m_shadowMap);
+
+                params.LoadDefault();
+                params.colorOperation = TEX_MIX_OPER_MODULATE;
+                params.colorArg1 = TEX_MIX_ARG_COMPUTED_COLOR;
+                params.colorArg2 = TEX_MIX_ARG_TEXTURE_0;
+                params.alphaOperation = TEX_MIX_OPER_DEFAULT;
+                params.wrapS = TEX_WRAP_CLAMP_TO_BORDER;
+                params.wrapT = TEX_WRAP_CLAMP_TO_BORDER;
+
+                m_device->SetTextureStageParams(5, params);
+            }
         }
         else        // Simpler shadows
         {
@@ -3425,14 +3436,17 @@ void CEngine::Draw3DScene()
 
         m_device->SetTextureCoordGeneration(2, params);
 
-        m_device->SetTexture(3, 0);
-        m_device->SetTextureEnabled(3, false);
+        if (m_qualityShadows)
+        {
+            m_device->SetTexture(3, 0);
+            m_device->SetTextureEnabled(3, false);
 
-        m_device->SetTexture(4, 0);
-        m_device->SetTextureEnabled(4, false);
+            m_device->SetTexture(4, 0);
+            m_device->SetTextureEnabled(4, false);
 
-        m_device->SetTexture(5, 0);
-        m_device->SetTextureEnabled(5, false);
+            m_device->SetTexture(5, 0);
+            m_device->SetTextureEnabled(5, false);
+        }
     }
 
         // Draws the shadows , if shadows enabled
@@ -3610,6 +3624,13 @@ void CEngine::RenderShadowMap()
 {
     if (!m_shadowMapping) return;
 
+    if (m_device->GetMaxTextureStageCount() < 3)
+    {
+        m_shadowMapping = false;
+        GetLogger()->Error("Cannot use shadow maps, not enough texture 
units\n");
+        GetLogger()->Error("Disabling shadow mapping\n");
+    }
+
     m_app->StartPerformanceCounter(PCNT_RENDER_SHADOW_MAP);
 
     // If no shadow map texture exists, create it
diff --git a/src/graphics/opengl/gldevice.cpp b/src/graphics/opengl/gldevice.cpp
index 99dafa1..7ba9142 100644
--- a/src/graphics/opengl/gldevice.cpp
+++ b/src/graphics/opengl/gldevice.cpp
@@ -331,6 +331,7 @@ bool CGLDevice::Create()
 
     int maxTextures = 0;
     glGetIntegerv(GL_MAX_TEXTURE_UNITS, &maxTextures);
+    GetLogger()->Info("Maximum texture units: %d\n", maxTextures);
 
     m_currentTextures    = std::vector<Texture>           (maxTextures, 
Texture());
     m_texturesEnabled    = std::vector<bool>              (maxTextures, false);

-- 
Alioth's /usr/local/bin/git-commit-notice on 
/srv/git.debian.org/git/pkg-games/colobot.git

_______________________________________________
Pkg-games-commits mailing list
Pkg-games-commits@lists.alioth.debian.org
http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-games-commits

Reply via email to