ecere/gfx/fontRendering: Improved rendering of some fonts e.g. MS Sans Serif having...
[sdk] / ecere / src / gfx / drivers / OpenGLDisplayDriver.ec
index 74e82c1..289d981 100644 (file)
@@ -379,6 +379,7 @@ class OGLDisplay : struct
    bool depthWrite;
    int x, y;
    uint vao;
+   int maxTMU;
 
 #if defined(__WIN32__)
    HDC hdc;
@@ -525,26 +526,6 @@ static HGLRC winCreateContext(HDC hdc, int * contextVersion, bool * isCompatible
 }
 #endif
 
-#if ENABLE_GL_FFP
-static int maxTMU = 0;
-
-static void disableRemainingTMUs(int lastTMU)
-{
-   int t;
-   for(t = lastTMU; t < maxTMU; t++)
-   {
-      glActiveTexture(GL_TEXTURE0 + t);
-      glClientActiveTexture(GL_TEXTURE0 + t);
-      glDisable(GL_TEXTURE_2D);
-      glDisable(GL_TEXTURE_CUBE_MAP);
-      GLDisableClientState(TEXCOORDS);
-   }
-   glActiveTexture(GL_TEXTURE0);
-   glClientActiveTexture(GL_TEXTURE0);
-   maxTMU = lastTMU;
-}
-#endif
-
 class OpenGLDisplayDriver : DisplayDriver
 {
    class_property(name) = "OpenGL";
@@ -724,7 +705,7 @@ class OpenGLDisplayDriver : DisplayDriver
          vao = glBindVertexArray != null && !oglDisplay.compat;
 #endif
 #if ENABLE_GL_FBO
-         shaders = glBindFramebuffer != null;
+         frameBuffer = glBindFramebuffer != null;
 #endif
          vertexBuffer = glBindBuffer != null;
          // mapBuffer = glMapBuffer != null;
@@ -1145,7 +1126,9 @@ class OpenGLDisplayDriver : DisplayDriver
          glDisableVertexAttribArray(GLBufferContents::vertex);
          glDisableVertexAttribArray(GLBufferContents::tangent1);
          glDisableVertexAttribArray(GLBufferContents::tangent2);
+#if ENABLE_GL_VAO
          glBindVertexArray(0);
+#endif
          glUseProgram(0);
       }
 #endif
@@ -2705,7 +2688,7 @@ class OpenGLDisplayDriver : DisplayDriver
 
    void WriteText(Display display, Surface surface, int x, int y, const char * text, int len, int prevGlyph, int * rPrevGlyph)
    {
-      if(len && text[0])
+      if(len && text[0] && surface.font)
       {
          OGLSurface oglSurface = surface.driverData;
          OGLSystem oglSystem = display.displaySystem.driverData;
@@ -2813,6 +2796,24 @@ class OpenGLDisplayDriver : DisplayDriver
          }
       }
    }
+#if ENABLE_GL_FFP
+   void ::disableRemainingTMUs(Display display, int lastTMU)
+   {
+      OGLDisplay oglDisplay = display.driverData;
+      int t;
+      for(t = lastTMU; t < oglDisplay.maxTMU; t++)
+      {
+         glActiveTexture(GL_TEXTURE0 + t);
+         glClientActiveTexture(GL_TEXTURE0 + t);
+         glDisable(GL_TEXTURE_2D);
+         glDisable(GL_TEXTURE_CUBE_MAP);
+         GLDisableClientState(TEXCOORDS);
+      }
+      glActiveTexture(GL_TEXTURE0);
+      glClientActiveTexture(GL_TEXTURE0);
+      oglDisplay.maxTMU = lastTMU;
+   }
+#endif
 
 #if !defined(ECERE_NO3D) && !defined(ECERE_VANILLA)
    void SetRenderState(Display display, RenderState state, uint value)
@@ -3181,15 +3182,18 @@ class OpenGLDisplayDriver : DisplayDriver
 #endif
 
          // *** Restore 2D MODELVIEW Matrix ***
+         GLMatrixMode(MatrixMode::modelView);
+         GLPopMatrix();
+
+         // *** Restore 2D TEXTURE Matrix ***
+         GLMatrixMode(MatrixMode::texture);
          GLPopMatrix();
 
          // *** Restore 2D PROJECTION Matrix ***
          GLMatrixMode(MatrixMode::projection);
          GLPopMatrix();
 
-         // *** Restore 2D TEXTURE Matrix ***
-         GLMatrixMode(MatrixMode::texture);
-         GLPopMatrix();
+         // NOTE: We expect the 2D projection matrix to be the active one for GetSurface to call glOrtho()
 
 #if ENABLE_GL_SHADERS
          if(glCaps_shaders)
@@ -3199,8 +3203,9 @@ class OpenGLDisplayDriver : DisplayDriver
 #if ENABLE_GL_FFP
          if(!glCaps_shaders)
          {
-            disableRemainingTMUs(1);
+            disableRemainingTMUs(display, 0);
             glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+
             glDisable(GL_TEXTURE_CUBE_MAP);
          #if _GLES
             glDisable(GL_TEXTURE_GEN_STR);
@@ -3432,11 +3437,8 @@ class OpenGLDisplayDriver : DisplayDriver
 #if ENABLE_GL_FFP
          if(!glCaps_shaders)
          {
-            if(tmu > 1)
-            {
-               oglMesh.texCoords.use(texCoord, 2, GL_FLOAT, 0, oglMesh.texCoords.buffer ? null : mesh.texCoords);
-               GLEnableClientState(TEXCOORDS);
-            }
+            glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+            /* // This did not have the desired effect with a GL_ALPHA texture
             glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
             glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_MODULATE);
             glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_MODULATE);
@@ -3448,6 +3450,7 @@ class OpenGLDisplayDriver : DisplayDriver
             glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR);
             glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA);
             glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, GL_SRC_ALPHA);
+            */
 
             if(flags.cubeMap)
             {
@@ -3470,6 +3473,8 @@ class OpenGLDisplayDriver : DisplayDriver
                glEnable(GL_TEXTURE_GEN_S);
                glEnable(GL_TEXTURE_GEN_T);
             #endif
+
+               GLDisableClientState(TEXCOORDS);
             }
             else
             {
@@ -3480,6 +3485,10 @@ class OpenGLDisplayDriver : DisplayDriver
                glDisable(GL_TEXTURE_GEN_S);
                glDisable(GL_TEXTURE_GEN_T);
             #endif
+
+               if(tmu > 1)
+                  oglMesh.texCoords.use(texCoord, 2, GL_FLOAT, 0, oglMesh.texCoords.buffer ? null : mesh.texCoords);
+               GLEnableClientState(TEXCOORDS);
             }
             glClientActiveTexture(GL_TEXTURE0);
          }
@@ -3590,21 +3599,13 @@ class OpenGLDisplayDriver : DisplayDriver
 
             GLMatrixMode(MatrixMode::texture);
             {
-               double * s = display.display3D.camera.inverseTranspose.array;
-               Quaternion q = display.display3D.camera.cOrientation;
-               Matrix mat;
-               Euler e = q;
-               //e.yaw *= -1;
-               q = e;
-               mat.RotationQuaternion(q);
-               mat.Scale(2,-2,-2);
-               s = mat.array;
-
+               double * s = display.display3D.camera.viewMatrix.array;
+               double k = 2.0;
                Matrix m
                { {
-                  s[0],s[1],s[2],0,
-                  s[4],s[5],s[6],0,
-                  s[8],s[9],s[10],0,
+                  k*s[0],-k*s[4],-k*s[8], 0,
+                  k*s[1],-k*s[5],-k*s[9], 0,
+                  k*s[2],-k*s[6],-k*s[10],0,
                   0,0,0,1
                } };
                GLLoadMatrixd(m.array);
@@ -3679,7 +3680,7 @@ class OpenGLDisplayDriver : DisplayDriver
 #if ENABLE_GL_FFP
       if(!glCaps_shaders)
       {
-         disableRemainingTMUs(tmu);
+         disableRemainingTMUs(display, tmu);
 
          if(mesh.flags.colors)
          {
@@ -3723,40 +3724,42 @@ class OpenGLDisplayDriver : DisplayDriver
       if(oglMesh)
       {
          OGLSystem oglSystem = displaySystem.driverData;
+         GLCapabilities caps = glCaps;
          SETCAPS(oglSystem.capabilities);
+
          if(!mesh.flags.vertices)
          {
-            oglMesh.vertices.free(glCaps_vertexBuffer);
+            oglMesh.vertices.free();
             delete mesh.vertices;
          }
          if(!mesh.flags.normals)
          {
-            oglMesh.normals.free(glCaps_vertexBuffer);
+            oglMesh.normals.free();
             delete mesh.normals;
          }
          if(!mesh.flags.tangents)
          {
-            oglMesh.tangents.free(glCaps_vertexBuffer);
+            oglMesh.tangents.free();
             delete mesh.tangents;
          }
          if(!mesh.flags.lightVectors)
          {
-            oglMesh.lightVectors.free(glCaps_vertexBuffer);
+            oglMesh.lightVectors.free();
             delete mesh.lightVectors;
          }
          if(!mesh.flags.texCoords1)
          {
-            oglMesh.texCoords.free(glCaps_vertexBuffer);
+            oglMesh.texCoords.free();
             delete mesh.texCoords;
          }
          if(!mesh.flags.texCoords2)
          {
-            oglMesh.texCoords2.free(glCaps_vertexBuffer);
+            oglMesh.texCoords2.free();
             // delete mesh.texCoords2;
          }
          if(!mesh.flags.colors)
          {
-            oglMesh.colors.free(glCaps_vertexBuffer);
+            oglMesh.colors.free();
             delete mesh.colors;
          }
          if(!mesh.flags)
@@ -3764,6 +3767,7 @@ class OpenGLDisplayDriver : DisplayDriver
             delete oglMesh;
             mesh.data = null;
          }
+         SETCAPS(caps);
       }
    }
 
@@ -3863,7 +3867,9 @@ class OpenGLDisplayDriver : DisplayDriver
    void UnlockMesh(DisplaySystem displaySystem, Mesh mesh, MeshFeatures flags)
    {
       OGLSystem oglSystem = displaySystem.driverData;
+      GLCapabilities caps = glCaps;
       SETCAPS(oglSystem.capabilities);
+
       if(glCaps_vertexBuffer)
       {
          OGLMesh oglMesh = mesh.data;
@@ -3890,6 +3896,7 @@ class OpenGLDisplayDriver : DisplayDriver
          if(flags.lightVectors)
             oglMesh.lightVectors.allocate(mesh.nVertices * sizeof(ColorRGB), mesh.lightVectors, staticDraw);
       }
+      SETCAPS(caps);
    }
 
    bool LockMesh(DisplaySystem displaySystem, Mesh mesh, MeshFeatures flags)
@@ -3902,13 +3909,16 @@ class OpenGLDisplayDriver : DisplayDriver
    void FreeIndices(DisplaySystem displaySystem, OGLIndices oglIndices)
    {
       OGLSystem oglSystem = displaySystem.driverData;
+      GLCapabilities caps = glCaps;
       SETCAPS(oglSystem.capabilities);
+
       if(oglIndices)
       {
-         oglIndices.buffer.free(glCaps_vertexBuffer);
+         oglIndices.buffer.free();
          delete oglIndices.indices;
          delete oglIndices;
       }
+      SETCAPS(caps);
    }
 
    void * AllocateIndices(DisplaySystem displaySystem, int nIndices, bool indices32bit)
@@ -3925,7 +3935,9 @@ class OpenGLDisplayDriver : DisplayDriver
    void UnlockIndices(DisplaySystem displaySystem, OGLIndices oglIndices, bool indices32bit, int nIndices)
    {
       OGLSystem oglSystem = displaySystem.driverData;
+      GLCapabilities caps = glCaps;
       SETCAPS(oglSystem.capabilities);
+
       if(glCaps_vertexBuffer)
       {
          if(!glCaps_intAndDouble && indices32bit)
@@ -3956,6 +3968,7 @@ class OpenGLDisplayDriver : DisplayDriver
                nIndices * (indices32bit ? sizeof(uint32) : sizeof(uint16)),
                oglIndices.indices, staticDraw);
       }
+      SETCAPS(caps);
    }
 
    uint16 * LockIndices(DisplaySystem displaySystem, OGLIndices oglIndices)