[colobot] 262/377: Changes in detection of graphics hardware capabilities

Didier Raboud odyx at moszumanska.debian.org
Wed Mar 30 13:34:24 UTC 2016


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

odyx pushed a commit to branch debian/master
in repository colobot.

commit bf8916b9ebc1a9e71d5ede9f77d301ba50548187
Author: Tomasz Kapuściński <tomaszkax86 at gmail.com>
Date:   Fri Feb 12 16:14:29 2016 +0100

    Changes in detection of graphics hardware capabilities
---
 src/graphics/opengl/gl21device.cpp | 113 +++++++---------
 src/graphics/opengl/gl21device.h   |   2 -
 src/graphics/opengl/gl33device.cpp | 106 +++++++--------
 src/graphics/opengl/gl33device.h   |   2 -
 src/graphics/opengl/gldevice.cpp   | 265 +++++++++++++++++--------------------
 src/graphics/opengl/gldevice.h     |   2 -
 src/graphics/opengl/glutil.cpp     | 147 ++++++++++++++++++--
 src/graphics/opengl/glutil.h       |  12 +-
 8 files changed, 366 insertions(+), 283 deletions(-)

diff --git a/src/graphics/opengl/gl21device.cpp b/src/graphics/opengl/gl21device.cpp
index 7c1c9cb..0cebf82 100644
--- a/src/graphics/opengl/gl21device.cpp
+++ b/src/graphics/opengl/gl21device.cpp
@@ -166,65 +166,55 @@ bool CGL21Device::Create()
 {
     GetLogger()->Info("Creating CDevice - OpenGL 2.1\n");
 
-    static bool glewInited = false;
-
-    if (!glewInited)
+    if (!InitializeGLEW())
     {
-        glewInited = true;
-
-        glewExperimental = GL_TRUE;
-
-        if (glewInit() != GLEW_OK)
-        {
-            GetLogger()->Error("GLEW initialization failed\n");
-            m_errorMessage = "An error occured while initializing GLEW.";
-            return false;
-        }
+        m_errorMessage = "An error occured while initializing GLEW.";
+        return false;
+    }
 
-        // Extract OpenGL version
-        const char *version = reinterpret_cast<const char*>(glGetString(GL_VERSION));
-        sscanf(version, "%d.%d", &m_glMajor, &m_glMinor);
+    // Extract OpenGL version
+    int glMajor, glMinor;
+    int glVersion = GetOpenGLVersion(glMajor, glMinor);
 
-        if (m_glMajor < 2)
-        {
-            GetLogger()->Error("Unsupported OpenGL version: %d.%d\n", m_glMajor, m_glMinor);
-            GetLogger()->Error("OpenGL 2.0 or newer is required to use this engine.\n");
-            m_errorMessage = "It seems your graphics card does not support OpenGL 2.0.\n";
-            m_errorMessage += "Please make sure you have appropriate hardware and newest drivers installed.\n";
-            m_errorMessage += "(OpenGL 2.0 is roughly equivalent to Direct3D 9)\n\n";
-            m_errorMessage += GetHardwareInfo(false);
-            return false;
-        }
+    if (glVersion < 20)
+    {
+        GetLogger()->Error("Unsupported OpenGL version: %d.%d\n", glMajor, glMinor);
+        GetLogger()->Error("OpenGL 2.0 or newer is required to use this engine.\n");
+        m_errorMessage = "It seems your graphics card does not support OpenGL 2.0.\n";
+        m_errorMessage += "Please make sure you have appropriate hardware and newest drivers installed.\n";
+        m_errorMessage += "(OpenGL 2.0 is roughly equivalent to Direct3D 9)\n\n";
+        m_errorMessage += GetHardwareInfo();
+        return false;
+    }
 
-        GetLogger()->Info("OpenGL %d.%d\n", m_glMajor, m_glMinor);
+    GetLogger()->Info("OpenGL %d.%d\n", glMajor, glMinor);
 
-        // Detect support of anisotropic filtering
-        m_anisotropyAvailable = glewIsSupported("GL_EXT_texture_filter_anisotropic");
-        if(m_anisotropyAvailable)
-        {
-            // Obtain maximum anisotropy level available
-            float level;
-            glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &level);
-            m_maxAnisotropy = static_cast<int>(level);
+    // Detect support of anisotropic filtering
+    m_anisotropyAvailable = glewIsSupported("GL_EXT_texture_filter_anisotropic");
+    if(m_anisotropyAvailable)
+    {
+        // Obtain maximum anisotropy level available
+        float level;
+        glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &level);
+        m_maxAnisotropy = static_cast<int>(level);
 
-            GetLogger()->Info("Anisotropic filtering available\n");
-            GetLogger()->Info("Maximum anisotropy: %d\n", m_maxAnisotropy);
-        }
-        else
-        {
-            GetLogger()->Info("Anisotropic filtering not available\n");
-        }
+        GetLogger()->Info("Anisotropic filtering available\n");
+        GetLogger()->Info("Maximum anisotropy: %d\n", m_maxAnisotropy);
+    }
+    else
+    {
+        GetLogger()->Info("Anisotropic filtering not available\n");
+    }
 
-        // Read maximum sample count for MSAA
-        if(glewIsSupported("GL_ARB_multisample"))
-        {
-            glGetIntegerv(GL_MAX_SAMPLES_EXT, &m_maxSamples);
-            GetLogger()->Info("Multisampling supported, max samples: %d\n", m_maxSamples);
-        }
-        else
-        {
-            GetLogger()->Info("Multisampling not supported\n");
-        }
+    // Read maximum sample count for MSAA
+    if(glewIsSupported("GL_EXT_framebuffer_multisample"))
+    {
+        glGetIntegerv(GL_MAX_SAMPLES_EXT, &m_maxSamples);
+        GetLogger()->Info("Multisampling supported, max samples: %d\n", m_maxSamples);
+    }
+    else
+    {
+        GetLogger()->Info("Multisampling not supported\n");
     }
 
     // This is mostly done in all modern hardware by default
@@ -237,8 +227,8 @@ bool CGL21Device::Create()
 
     glViewport(0, 0, m_config.size.x, m_config.size.y);
 
-    int numLights = 0;
-    glGetIntegerv(GL_MAX_LIGHTS, &numLights);
+    // this is set in shader
+    int numLights = 8;
 
     m_lights        = std::vector<Light>(numLights, Light());
     m_lightsEnabled = std::vector<bool> (numLights, false);
@@ -247,20 +237,24 @@ bool CGL21Device::Create()
     glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &maxTextures);
     GetLogger()->Info("Maximum texture image units: %d\n", maxTextures);
 
+    m_framebufferSupport = DetectFramebufferSupport();
+    if (m_framebufferSupport != FBS_NONE)
+        GetLogger()->Info("Framebuffer supported\n");
+
     m_currentTextures    = std::vector<Texture>           (maxTextures, Texture());
     m_texturesEnabled    = std::vector<bool>              (maxTextures, false);
     m_textureStageParams = std::vector<TextureStageParams>(maxTextures, TextureStageParams());
 
     int value;
-    if (CConfigFile::GetInstance().GetIntProperty("Setup", "PerPixelLighting", value))
+    if (GetConfigFile().GetIntProperty("Setup", "PerPixelLighting", value))
     {
         m_perPixelLighting = value > 0;
     }
 
     if (m_perPixelLighting)
-        CLogger::GetInstance().Info("Using per-pixel lighting\n");
+        GetLogger()->Info("Using per-pixel lighting\n");
     else
-        CLogger::GetInstance().Info("Using per-vertex lighting\n");
+        GetLogger()->Info("Using per-vertex lighting\n");
 
 
     // Create normal shader program
@@ -301,7 +295,6 @@ bool CGL21Device::Create()
     glDeleteShader(shaders[0]);
     glDeleteShader(shaders[1]);
 
-
     // Obtain uniform locations
     uni_ProjectionMatrix = glGetUniformLocation(m_program, "uni_ProjectionMatrix");
     uni_ViewMatrix = glGetUniformLocation(m_program, "uni_ViewMatrix");
@@ -399,10 +392,6 @@ bool CGL21Device::Create()
 
     m_framebuffers["default"] = MakeUnique<CDefaultFramebuffer>(framebufferParams);
 
-    m_framebufferSupport = DetectFramebufferSupport();
-    if (m_framebufferSupport != FBS_NONE)
-        GetLogger()->Debug("Framebuffer supported\n");
-
     GetLogger()->Info("CDevice created successfully\n");
 
     return true;
diff --git a/src/graphics/opengl/gl21device.h b/src/graphics/opengl/gl21device.h
index f2b3bc4..a0b5f49 100644
--- a/src/graphics/opengl/gl21device.h
+++ b/src/graphics/opengl/gl21device.h
@@ -236,8 +236,6 @@ private:
     };
 
     //! Detected capabilities
-    //! OpenGL version
-    int m_glMajor = 1, m_glMinor = 1;
     //! Whether anisotropic filtering is available
     bool m_anisotropyAvailable = false;
     //! Maximum anisotropy level
diff --git a/src/graphics/opengl/gl33device.cpp b/src/graphics/opengl/gl33device.cpp
index 61023d8..5bcafd2 100644
--- a/src/graphics/opengl/gl33device.cpp
+++ b/src/graphics/opengl/gl33device.cpp
@@ -168,79 +168,63 @@ bool CGL33Device::Create()
 
     static bool glewInited = false;
 
-    if (!glewInited)
+    if (!InitializeGLEW())
     {
-        glewInited = true;
-
-        glewExperimental = GL_TRUE;
-
-        if (glewInit() != GLEW_OK)
-        {
-            GetLogger()->Error("GLEW initialization failed\n");
-            m_errorMessage = "An error occured while initializing GLEW.";
-            return false;
-        }
+        m_errorMessage = "An error occured while initializing GLEW.";
+        return false;
+    }
 
-        // Extract OpenGL version
-        const char *version = reinterpret_cast<const char*>(glGetString(GL_VERSION));
-        sscanf(version, "%d.%d", &m_glMajor, &m_glMinor);
+    // Extract OpenGL version
+    int glMajor, glMinor;
+    int glVersion = GetOpenGLVersion(glMajor, glMinor);
 
-        int glVersion = 10 * m_glMajor + m_glMinor;
-        if (glVersion < 32)
-        {
-            GetLogger()->Error("Unsupported OpenGL version: %d.%d\n", m_glMajor, m_glMinor);
-            GetLogger()->Error("OpenGL 3.2 or newer is required to use this engine.\n");
-            m_errorMessage = "It seems your graphics card does not support OpenGL 3.2.\n";
-            m_errorMessage += "Please make sure you have appropriate hardware and newest drivers installed.\n";
-            m_errorMessage += "(OpenGL 3.2 is roughly equivalent to Direct3D 10)\n\n";
-            m_errorMessage += GetHardwareInfo(false);
-            return false;
-        }
-        else if (glVersion < 33)
-        {
-            GetLogger()->Warn("Partially supported OpenGL version: %d.%d\n", m_glMajor, m_glMinor);
-            GetLogger()->Warn("You may experience problems while running the game on this engine.\n");
-            GetLogger()->Warn("OpenGL 3.3 or newer is recommended.\n");
-        }
-        else
-        {
-            GetLogger()->Info("OpenGL %d.%d\n", m_glMajor, m_glMinor);
-        }
-
-        // Detect support of anisotropic filtering
-        m_anisotropyAvailable = glewIsSupported("GL_EXT_texture_filter_anisotropic");
-        if(m_anisotropyAvailable)
-        {
-            // Obtain maximum anisotropy level available
-            float level;
-            glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &level);
-            m_maxAnisotropy = static_cast<int>(level);
+    if (glVersion < 32)
+    {
+        GetLogger()->Error("Unsupported OpenGL version: %d.%d\n", glMajor, glMinor);
+        GetLogger()->Error("OpenGL 3.2 or newer is required to use this engine.\n");
+        m_errorMessage = "It seems your graphics card does not support OpenGL 3.2.\n";
+        m_errorMessage += "Please make sure you have appropriate hardware and newest drivers installed.\n";
+        m_errorMessage += "(OpenGL 3.2 is roughly equivalent to Direct3D 10)\n\n";
+        m_errorMessage += GetHardwareInfo();
+        return false;
+    }
+    else if (glVersion < 33)
+    {
+        GetLogger()->Warn("Partially supported OpenGL version: %d.%d\n", glMajor, glMinor);
+        GetLogger()->Warn("You may experience problems while running the game on this engine.\n");
+        GetLogger()->Warn("OpenGL 3.3 or newer is recommended.\n");
+    }
+    else
+    {
+        GetLogger()->Info("OpenGL %d.%d\n", glMajor, glMinor);
+    }
 
-            GetLogger()->Info("Anisotropic filtering available\n");
-            GetLogger()->Info("Maximum anisotropy: %d\n", m_maxAnisotropy);
-        }
-        else
-        {
-            GetLogger()->Info("Anisotropic filtering not available\n");
-        }
+    // Detect support of anisotropic filtering
+    m_anisotropyAvailable = glewIsSupported("GL_EXT_texture_filter_anisotropic");
+    if(m_anisotropyAvailable)
+    {
+        // Obtain maximum anisotropy level available
+        float level;
+        glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &level);
+        m_maxAnisotropy = static_cast<int>(level);
 
-        // Read maximum sample count for MSAA
-        if(glewIsSupported("GL_ARB_multisample"))
-        {
-            glGetIntegerv(GL_MAX_SAMPLES_EXT, &m_maxSamples);
-            GetLogger()->Info("Multisampling supported, max samples: %d\n", m_maxSamples);
-        }
-        else
-        {
-            GetLogger()->Info("Multisampling not supported\n");
-        }
+        GetLogger()->Info("Anisotropic filtering available\n");
+        GetLogger()->Info("Maximum anisotropy: %d\n", m_maxAnisotropy);
     }
+    else
+    {
+        GetLogger()->Info("Anisotropic filtering not available\n");
+    }
+
+    glGetIntegerv(GL_MAX_FRAMEBUFFER_SAMPLES, &m_maxSamples);
+    GetLogger()->Info("Multisampling supported, max samples: %d\n", m_maxSamples);
 
     // Set just to be sure
     glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
 
     glViewport(0, 0, m_config.size.x, m_config.size.y);
 
+    // this is set in shader
     int numLights = 8;
 
     m_lights        = std::vector<Light>(numLights, Light());
diff --git a/src/graphics/opengl/gl33device.h b/src/graphics/opengl/gl33device.h
index b701276..44db526 100644
--- a/src/graphics/opengl/gl33device.h
+++ b/src/graphics/opengl/gl33device.h
@@ -254,8 +254,6 @@ private:
     };
 
     //! Detected capabilities
-    //! OpenGL version
-    int m_glMajor = 1, m_glMinor = 1;
     //! Whether anisotropic filtering is available
     bool m_anisotropyAvailable = false;
     //! Maximum anisotropy level
diff --git a/src/graphics/opengl/gldevice.cpp b/src/graphics/opengl/gldevice.cpp
index cf0e71e..1df95c6 100644
--- a/src/graphics/opengl/gldevice.cpp
+++ b/src/graphics/opengl/gldevice.cpp
@@ -162,118 +162,107 @@ bool CGLDevice::Create()
 {
     GetLogger()->Info("Creating CDevice - OpenGL 1.4\n");
 
-    static bool glewInited = false;
-
-    if (!glewInited)
+    if (!InitializeGLEW())
     {
-        glewInited = true;
-
-        glewExperimental = GL_TRUE;
-
-        if (glewInit() != GLEW_OK)
-        {
-            GetLogger()->Error("GLEW initialization failed\n");
-            m_errorMessage = "An error occured while initializing GLEW.";
-            return false;
-        }
+        m_errorMessage = "An error occured while initializing GLEW.";
+        return false;
+    }
 
-        // Extract OpenGL version
-        const char *version = reinterpret_cast<const char*>(glGetString(GL_VERSION));
-        sscanf(version, "%d.%d", &m_glMajor, &m_glMinor);
+    // Extract OpenGL version
+    int glMajor, glMinor;
+    int glVersion = GetOpenGLVersion(glMajor, glMinor);
 
-        int glVersion = 10 * m_glMajor + m_glMinor;
-        if (glVersion < 13)
-        {
-            GetLogger()->Error("Unsupported OpenGL version: %d.%d\n", m_glMajor, m_glMinor);
-            GetLogger()->Error("OpenGL 1.3 or newer is required to use this engine.\n");
-            m_errorMessage = "It seems your graphics card does not support OpenGL 1.3.\n";
-            m_errorMessage += "Please make sure you have appropriate hardware and newest drivers installed.\n\n";
-            m_errorMessage += GetHardwareInfo(false);
-            return false;
-        }
+    if (glVersion < 13)
+    {
+        GetLogger()->Error("Unsupported OpenGL version: %d.%d\n", glMajor, glMinor);
+        GetLogger()->Error("OpenGL 1.3 or newer is required to use this engine.\n");
+        m_errorMessage = "It seems your graphics card does not support OpenGL 1.3.\n";
+        m_errorMessage += "Please make sure you have appropriate hardware and newest drivers installed.\n\n";
+        m_errorMessage += GetHardwareInfo();
+        return false;
+    }
 
-        GetLogger()->Info("OpenGL %d.%d\n", m_glMajor, m_glMinor);
+    GetLogger()->Info("OpenGL %d.%d\n", glMajor, glMinor);
 
-        // Detect multitexture support
-        m_multitextureAvailable = glewIsSupported("GL_ARB_multitexture GL_ARB_texture_env_combine");
-        if (!m_multitextureAvailable)
-            GetLogger()->Warn("GLEW reports multitexturing not supported - graphics quality will be degraded!\n");
+    // Detect multitexture support
+    m_multitextureAvailable = glewIsSupported("GL_ARB_multitexture GL_ARB_texture_env_combine");
+    if (!m_multitextureAvailable)
+        GetLogger()->Warn("GLEW reports multitexturing not supported - graphics quality will be degraded!\n");
 
-        // Detect Shadow mapping support
-        if (m_glMajor > 1 || m_glMinor >= 4)     // Core depth texture+shadow, OpenGL 1.4+
-        {
-            m_shadowMappingSupport = SMS_CORE;
-            GetLogger()->Info("Shadow mapping available (core)\n");
-        }
-        else if (glewIsSupported("GL_ARB_depth_texture GL_ARB_shadow"))  // ARB depth texture + shadow
-        {
-            m_shadowMappingSupport = SMS_ARB;
-            GetLogger()->Info("Shadow mapping available (ARB)\n");
-        }
-        else       // No Shadow mapping
-        {
-            m_shadowMappingSupport = SMS_NONE;
-            GetLogger()->Info("Shadow mapping not available\n");
-        }
+    // Detect Shadow mapping support
+    if (glVersion >= 14)     // Core depth texture+shadow, OpenGL 1.4+
+    {
+        m_shadowMappingSupport = SMS_CORE;
+        GetLogger()->Info("Shadow mapping available (core)\n");
+    }
+    else if (glewIsSupported("GL_ARB_depth_texture GL_ARB_shadow"))  // ARB depth texture + shadow
+    {
+        m_shadowMappingSupport = SMS_ARB;
+        GetLogger()->Info("Shadow mapping available (ARB)\n");
+    }
+    else       // No Shadow mapping
+    {
+        m_shadowMappingSupport = SMS_NONE;
+        GetLogger()->Info("Shadow mapping not available\n");
+    }
 
-        m_shadowAmbientSupported = glewIsSupported("GL_ARB_shadow_ambient");
-        if (m_shadowAmbientSupported)
-            GetLogger()->Info("Shadow ambient supported\n");
+    m_shadowAmbientSupported = glewIsSupported("GL_ARB_shadow_ambient");
+    if (m_shadowAmbientSupported)
+        GetLogger()->Info("Shadow ambient supported\n");
 
-        // Detect support of anisotropic filtering
-        m_anisotropyAvailable = glewIsSupported("GL_EXT_texture_filter_anisotropic");
-        if(m_anisotropyAvailable)
-        {
-            // Obtain maximum anisotropy level available
-            float level;
-            glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &level);
-            m_maxAnisotropy = static_cast<int>(level);
+    // Detect support of anisotropic filtering
+    m_anisotropyAvailable = glewIsSupported("GL_EXT_texture_filter_anisotropic");
+    if(m_anisotropyAvailable)
+    {
+        // Obtain maximum anisotropy level available
+        float level;
+        glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &level);
+        m_maxAnisotropy = static_cast<int>(level);
 
-            GetLogger()->Info("Anisotropic filtering available\n");
-            GetLogger()->Info("Maximum anisotropy: %d\n", m_maxAnisotropy);
-        }
-        else
-        {
-            GetLogger()->Info("Anisotropic filtering not available\n");
-        }
+        GetLogger()->Info("Anisotropic filtering available\n");
+        GetLogger()->Info("Maximum anisotropy: %d\n", m_maxAnisotropy);
+    }
+    else
+    {
+        GetLogger()->Info("Anisotropic filtering not available\n");
+    }
 
-        // Read maximum sample count for MSAA
-        if(glewIsSupported("GL_ARB_multisample GL_EXT_framebuffer_multisample"))
-        {
-            glGetIntegerv(GL_MAX_SAMPLES_EXT, &m_maxSamples);
-            GetLogger()->Info("Multisampling supported, max samples: %d\n", m_maxSamples);
-        }
-        else
-        {
-            GetLogger()->Info("Multisampling not supported\n");
-        }
+    // Read maximum sample count for MSAA
+    if(glewIsSupported("GL_EXT_framebuffer_multisample"))
+    {
+        glGetIntegerv(GL_MAX_SAMPLES_EXT, &m_maxSamples);
+        GetLogger()->Info("Multisampling supported, max samples: %d\n", m_maxSamples);
+    }
+    else
+    {
+        GetLogger()->Info("Multisampling not supported\n");
+    }
 
-        // check for glMultiDrawArrays()
-        if (glVersion >= 14)
-            m_multiDrawArrays = true;
+    // check for glMultiDrawArrays()
+    if (glVersion >= 14)
+        m_multiDrawArrays = true;
 
-        GetLogger()->Info("Auto-detecting VBO support\n");
+    GetLogger()->Info("Auto-detecting VBO support\n");
 
-        // detecting VBO ARB extension
-        bool vboARB = glewIsSupported("GL_ARB_vertex_buffer_object");
+    // detecting VBO ARB extension
+    bool vboARB = glewIsSupported("GL_ARB_vertex_buffer_object");
 
-        // VBO is core OpenGL feature since 1.5
-        // everything below 1.5 means no VBO support
-        if (m_glMajor > 1 || m_glMinor > 4)
-        {
-            GetLogger()->Info("Core VBO supported\n", m_glMajor, m_glMinor);
-            m_vertexBufferType = VBT_VBO_CORE;
-        }
-        else if(vboARB)     // VBO ARB extension available
-        {
-            GetLogger()->Info("ARB VBO supported\n");
-            m_vertexBufferType = VBT_VBO_ARB;
-        }
-        else                // no VBO support
-        {
-            GetLogger()->Info("VBO not supported\n");
-            m_vertexBufferType = VBT_DISPLAY_LIST;
-        }
+    // VBO is core OpenGL feature since 1.5
+    // everything below 1.5 means no VBO support
+    if (glVersion >= 15)
+    {
+        GetLogger()->Info("Core VBO supported\n", glMajor, glMinor);
+        m_vertexBufferType = VBT_VBO_CORE;
+    }
+    else if (vboARB)     // VBO ARB extension available
+    {
+        GetLogger()->Info("ARB VBO supported\n");
+        m_vertexBufferType = VBT_VBO_ARB;
+    }
+    else                // no VBO support
+    {
+        GetLogger()->Info("VBO not supported\n");
+        m_vertexBufferType = VBT_DISPLAY_LIST;
     }
 
     // This is mostly done in all modern hardware by default
@@ -332,6 +321,7 @@ bool CGLDevice::Create()
     {
         GetLogger()->Info("Framebuffer not supported\n");
     }
+
     GetLogger()->Info("CDevice created successfully\n");
 
     return true;
@@ -502,17 +492,15 @@ void CGLDevice::UpdateLightPosition(int index)
     glMatrixMode(GL_MODELVIEW);
     glPushMatrix();
 
-    if (m_lights[index].type == LIGHT_POINT)
+    Light &light = m_lights[index];
+
+    if (light.type == LIGHT_POINT)
     {
         glLoadIdentity();
         glScalef(1.0f, 1.0f, -1.0f);
         glMultMatrixf(m_viewMat.Array());
 
-        GLfloat position[4] = { m_lights[index].position.x,
-            m_lights[index].position.y,
-            m_lights[index].position.z,
-            1.0f };
-
+        GLfloat position[4] = { light.position.x, light.position.y, light.position.z, 1.0f };
         glLightfv(GL_LIGHT0 + index, GL_POSITION, position);
     }
     else
@@ -525,22 +513,14 @@ void CGLDevice::UpdateLightPosition(int index)
         mat.Set(3, 4, 0.0f);
         glMultMatrixf(mat.Array());
 
-        if (m_lights[index].type == LIGHT_SPOT)
+        if (light.type == LIGHT_SPOT)
         {
-            GLfloat direction[4] = { -m_lights[index].direction.x,
-                -m_lights[index].direction.y,
-                -m_lights[index].direction.z,
-                1.0f };
-
+            GLfloat direction[4] = { -light.direction.x, -light.direction.y, -light.direction.z, 1.0f };
             glLightfv(GL_LIGHT0 + index, GL_SPOT_DIRECTION, direction);
         }
-        else if (m_lights[index].type == LIGHT_DIRECTIONAL)
+        else if (light.type == LIGHT_DIRECTIONAL)
         {
-            GLfloat position[4] = { -m_lights[index].direction.x,
-                -m_lights[index].direction.y,
-                -m_lights[index].direction.z,
-                0.0f };
-
+            GLfloat position[4] = { -light.direction.x, -light.direction.y, -light.direction.z, 0.0f };
             glLightfv(GL_LIGHT0 + index, GL_POSITION, position);
         }
     }
@@ -553,8 +533,6 @@ void CGLDevice::UpdateLightPositions()
     glMatrixMode(GL_MODELVIEW);
     glPushMatrix();
 
-    int lightCount = m_lights.size();
-
     // update spotlights and directional lights
     glLoadIdentity();
     glScalef(1.0f, 1.0f, -1.0f);
@@ -564,25 +542,25 @@ void CGLDevice::UpdateLightPositions()
     mat.Set(3, 4, 0.0f);
     glMultMatrixf(mat.Array());
 
-    for (int index = 0; index < lightCount; index++)
-    {
-        if (m_lights[index].type == LIGHT_SPOT)
-        {
-            GLfloat direction[4] = { -m_lights[index].direction.x,
-                -m_lights[index].direction.y,
-                -m_lights[index].direction.z,
-                1.0f };
+    int lightIndex = 0;
 
-            glLightfv(GL_LIGHT0 + index, GL_SPOT_DIRECTION, direction);
-        }
-        else if (m_lights[index].type == LIGHT_DIRECTIONAL)
+    for (const Light &light : m_lights)
+    {
+        if (m_lightsEnabled[lightIndex])
         {
-            GLfloat position[4] = { -m_lights[index].direction.x,
-                -m_lights[index].direction.y,
-                -m_lights[index].direction.z,
-                0.0f };
-            glLightfv(GL_LIGHT0 + index, GL_POSITION, position);
+            if (light.type == LIGHT_SPOT)
+            {
+                GLfloat direction[4] = { -light.direction.x, -light.direction.y, -light.direction.z, 1.0f };
+                glLightfv(GL_LIGHT0 + lightIndex, GL_SPOT_DIRECTION, direction);
+            }
+            else if (light.type == LIGHT_DIRECTIONAL)
+            {
+                GLfloat position[4] = { -light.direction.x, -light.direction.y, -light.direction.z, 0.0f };
+                glLightfv(GL_LIGHT0 + lightIndex, GL_POSITION, position);
+            }
         }
+
+        lightIndex++;
     }
 
     // update point lights
@@ -590,17 +568,20 @@ void CGLDevice::UpdateLightPositions()
     glScalef(1.0f, 1.0f, -1.0f);
     glMultMatrixf(m_viewMat.Array());
 
-    for (int index = 0; index < lightCount; index++)
+    lightIndex = 0;
+
+    for (const Light &light : m_lights)
     {
-        if (m_lights[index].type == LIGHT_POINT)
+        if (m_lightsEnabled[lightIndex])
         {
-            GLfloat position[4] = { m_lights[index].position.x,
-                m_lights[index].position.y,
-                m_lights[index].position.z,
-                1.0f };
-
-            glLightfv(GL_LIGHT0 + index, GL_POSITION, position);
+            if (light.type == LIGHT_POINT)
+            {
+                GLfloat position[4] = { light.position.x, light.position.y, light.position.z, 1.0f };
+                glLightfv(GL_LIGHT0 + lightIndex, GL_POSITION, position);
+            }
         }
+
+        lightIndex++;
     }
 
     glPopMatrix();
diff --git a/src/graphics/opengl/gldevice.h b/src/graphics/opengl/gldevice.h
index fe0635c..24df922 100644
--- a/src/graphics/opengl/gldevice.h
+++ b/src/graphics/opengl/gldevice.h
@@ -256,8 +256,6 @@ private:
     };
 
     //! Detected capabilities
-    //! OpenGL version
-    int m_glMajor = 1, m_glMinor = 1;
     //! Depth texture support
     ShadowMappingSupport m_shadowMappingSupport = SMS_NONE;
     //! Shadow ambient support
diff --git a/src/graphics/opengl/glutil.cpp b/src/graphics/opengl/glutil.cpp
index 72ea019..b28caad 100644
--- a/src/graphics/opengl/glutil.cpp
+++ b/src/graphics/opengl/glutil.cpp
@@ -28,6 +28,7 @@
 
 #include <physfs.h>
 #include <cstring>
+#include <sstream>
 
 // Graphics module namespace
 namespace Gfx
@@ -36,6 +37,26 @@ namespace Gfx
 GLuint textureCoordinates[] = { GL_S, GL_T, GL_R, GL_Q };
 GLuint textureCoordGen[] = { GL_TEXTURE_GEN_S, GL_TEXTURE_GEN_T, GL_TEXTURE_GEN_R, GL_TEXTURE_GEN_Q };
 
+bool InitializeGLEW()
+{
+    static bool glewInited = false;
+
+    if (!glewInited)
+    {
+        glewExperimental = GL_TRUE;
+
+        if (glewInit() != GLEW_OK)
+        {
+            GetLogger()->Error("GLEW initialization failed\n");
+            return false;
+        }
+
+        glewInited = true;
+    }
+
+    return true;
+}
+
 FramebufferSupport DetectFramebufferSupport()
 {
     if (GetOpenGLVersion() >= 30) return FBS_ARB;
@@ -65,8 +86,14 @@ std::unique_ptr<CDevice> CreateDevice(const DeviceConfig &config, const std::str
 
 int GetOpenGLVersion()
 {
+    int major, minor;
+
+    return GetOpenGLVersion(major, minor);
+}
+
+int GetOpenGLVersion(int &major, int &minor)
+{
     const char *version = reinterpret_cast<const char*>(glGetString(GL_VERSION));
-    int major = 0, minor = 0;
 
     sscanf(version, "%d.%d", &major, &minor);
 
@@ -77,24 +104,126 @@ std::string GetHardwareInfo(bool full)
 {
     int glversion = GetOpenGLVersion();
 
+    std::stringstream result;
+
+    // basic hardware information
     const char* version = reinterpret_cast<const char*>(glGetString(GL_VERSION));
     const char* vendor = reinterpret_cast<const char*>(glGetString(GL_VENDOR));
     const char* renderer = reinterpret_cast<const char*>(glGetString(GL_RENDERER));
 
-    std::string result;
-
-    result += std::string("Hardware information:\n\n");
-    result += "Version:\t" + std::string(version) + '\n';
-    result += "Vendor:\t" + std::string(vendor) + '\n';
-    result += "Renderer:\t" + std::string(renderer) + '\n';
+    result << "Hardware information:\n\n";
+    result << "OpenGL Version:\t\t" << version << '\n';
+    result << "Hardware Vendor:\t\t" << vendor << '\n';
+    result << "Renderer:\t\t\t" << renderer << '\n';
 
+    // GLSL version if available
     if (glversion >= 20)
     {
         const char* glslVersion = reinterpret_cast<const char*>(glGetString(GL_SHADING_LANGUAGE_VERSION));
-        result += "Shading Language:\t" + std::string(glslVersion) + '\n';
+        result << "Shading Language Version:\t" << glslVersion << '\n';
+    }
+
+    if (!full) return result.str();
+
+    // extended hardware information
+    int value = 0;
+
+    result << "\nCapabilities:\n\n";
+
+    // texture size
+    glGetIntegerv(GL_MAX_TEXTURE_SIZE, &value);
+    result << "Max Texture Size:\t\t" << value << '\n';
+
+    if (glewIsSupported("GL_EXT_texture_filter_anisotropic"))
+    {
+        result << "Anisotropic filtering:\t\tsupported\n";
+
+        float level;
+        glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &level);
+
+        result << "    Max Level:\t\t" << static_cast<int>(level) << '\n';
+    }
+    else
+    {
+        result << "Anisotropic filtering:\t\tunsupported\n";
+    }
+
+    // multitexturing
+    if (glversion >= 13)
+    {
+        result << "Multitexturing:\t\tsupported\n";
+        glGetIntegerv(GL_MAX_TEXTURE_UNITS, &value);
+        result << "    Max Texture Units:\t\t" << value << '\n';
+
+        if (glversion >= 20)
+        {
+            glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &value);
+            result << "    Max Texture Image Units:\t" << value << '\n';
+        }
+    }
+    else
+    {
+        result << "Multitexturing:\t\tunsupported\n";
+    }
+
+    // FBO support
+    FramebufferSupport framebuffer = DetectFramebufferSupport();
+
+    if (framebuffer == FBS_ARB)
+    {
+        result << "Framebuffer Object:\t\tsupported\n";
+        result << "    Type:\t\t\tCore/ARB\n";
+
+        glGetIntegerv(GL_MAX_RENDERBUFFER_SIZE, &value);
+        result << "    Max Renderbuffer Size:\t" << value << '\n';
+
+        glGetIntegerv(GL_MAX_COLOR_ATTACHMENTS, &value);
+        result << "    Max Color Attachments:\t" << value << '\n';
+
+        result << "Multisampling:\t\tsupported\n";
+
+        glGetIntegerv(GL_MAX_FRAMEBUFFER_SAMPLES, &value);
+        result << "    Max Framebuffer Samples:\t" << value << '\n';
+    }
+    else if (framebuffer == FBS_EXT)
+    {
+        result << "Framebuffer Object:\tsupported\n";
+        result << "    Type:\tEXT\n";
+
+        glGetIntegerv(GL_MAX_RENDERBUFFER_SIZE_EXT, &value);
+        result << "    Max Renderbuffer Size:\t" << value << '\n';
+
+        glGetIntegerv(GL_MAX_COLOR_ATTACHMENTS_EXT, &value);
+        result << "    Max Color Attachments:\t" << value << '\n';
+
+        if (glewIsSupported("GL_EXT_framebuffer_multisample"))
+        {
+            result << "Multisampling:\tsupported\n";
+
+            glGetIntegerv(GL_MAX_SAMPLES_EXT, &value);
+            result << "    Max Framebuffer Samples:\t" << value << '\n';
+        }
+    }
+    else
+    {
+        result << "Framebuffer Object:\tunsupported\n";
+    }
+
+    // VBO support
+    if (glversion >= 15)
+    {
+        result << "VBO:\t\t\tsupported (core)\n";
+    }
+    else if (glewIsSupported("GL_ARB_vertex_buffer_object"))
+    {
+        result << "VBO:\t\t\tsupported (ARB)\n";
+    }
+    else
+    {
+        result << "VBO:\t\t\tunsupported\n";
     }
 
-    return result;
+    return result.str();
 }
 
 GLenum TranslateGfxPrimitive(PrimitiveType type)
diff --git a/src/graphics/opengl/glutil.h b/src/graphics/opengl/glutil.h
index 5ae4ff1..97b5c2c 100644
--- a/src/graphics/opengl/glutil.h
+++ b/src/graphics/opengl/glutil.h
@@ -45,17 +45,23 @@ enum FramebufferSupport
     FBS_ARB,
 };
 
+bool InitializeGLEW();
+
 FramebufferSupport DetectFramebufferSupport();
 
 //! Creates OpenGL device
 std::unique_ptr<CDevice> CreateDevice(const DeviceConfig &config, const std::string& name);
 
-//! Returns OpenGL version as one number.
-// First digit is major part, second digit is minor part.
+//! Returns OpenGL version
+// \return First digit is major part, second digit is minor part.
 int GetOpenGLVersion();
 
+//! Returns OpenGL version
+// \return First digit is major part, second digit is minor part.
+int GetOpenGLVersion(int &major, int &minor);
+
 //! Returns information about graphics card
-std::string GetHardwareInfo(bool full);
+std::string GetHardwareInfo(bool full = false);
 
 //! Translate Gfx primitive type to OpenGL primitive type
 GLenum TranslateGfxPrimitive(PrimitiveType type);

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



More information about the Pkg-games-commits mailing list