]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - gl_backend.c
added texmatrix[] to rmeshstate_t and removed R_Mesh_TextureMatrix function
[xonotic/darkplaces.git] / gl_backend.c
index 003ccfe11afe11f9d1b36018713392719610e694..11b89b716c2433e576f2760d68a14928fb1a2633 100644 (file)
@@ -363,6 +363,7 @@ void GL_SetupTextureState(void)
 {
        int i;
        gltextureunit_t *unit;
+       CHECKGLERROR
        gl_state.unit = -1;
        gl_state.clientunit = -1;
        for (i = 0;i < backendunits;i++)
@@ -374,11 +375,14 @@ void GL_SetupTextureState(void)
                unit->t2d = 0;
                unit->t3d = 0;
                unit->tcubemap = 0;
+               unit->arrayenabled = false;
+               unit->arrayis3d = false;
                unit->pointer_texcoord = NULL;
                unit->rgbscale = 1;
                unit->alphascale = 1;
                unit->combinergb = GL_MODULATE;
                unit->combinealpha = GL_MODULATE;
+               unit->matrix = r_identitymatrix;
 
                qglTexCoordPointer(2, GL_FLOAT, sizeof(float[2]), NULL);CHECKGLERROR
                qglDisableClientState(GL_TEXTURE_COORD_ARRAY);CHECKGLERROR
@@ -418,6 +422,7 @@ void GL_SetupTextureState(void)
                        qglTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);CHECKGLERROR
                }
        }
+       CHECKGLERROR
 }
 
 void GL_Backend_ResetState(void)
@@ -560,53 +565,18 @@ void GL_ColorMask(int r, int g, int b, int a)
        }
 }
 
-void GL_VertexPointer(const float *p)
-{
-       if (gl_state.pointer_vertex != p)
-       {
-               gl_state.pointer_vertex = p;
-               CHECKGLERROR
-               qglVertexPointer(3, GL_FLOAT, sizeof(float[3]), gl_state.pointer_vertex);
-               CHECKGLERROR
-       }
-}
-
-void GL_ColorPointer(const float *p)
-{
-       if (gl_state.pointer_color != p)
-       {
-               if (r_showtrispass)
-                       return;
-               CHECKGLERROR
-               if (!gl_state.pointer_color)
-               {
-                       qglEnableClientState(GL_COLOR_ARRAY);
-                       CHECKGLERROR
-               }
-               else if (!p)
-               {
-                       qglDisableClientState(GL_COLOR_ARRAY);
-                       CHECKGLERROR
-               }
-               gl_state.pointer_color = p;
-               qglColorPointer(4, GL_FLOAT, sizeof(float[4]), gl_state.pointer_color);
-               CHECKGLERROR
-       }
-}
-
 void GL_Color(float cr, float cg, float cb, float ca)
 {
        if (gl_state.pointer_color || gl_state.color4f[0] != cr || gl_state.color4f[1] != cg || gl_state.color4f[2] != cb || gl_state.color4f[3] != ca)
        {
                if (r_showtrispass)
                        return;
-               GL_ColorPointer(NULL);
                gl_state.color4f[0] = cr;
                gl_state.color4f[1] = cg;
                gl_state.color4f[2] = cb;
                gl_state.color4f[3] = ca;
                CHECKGLERROR
-               qglColor4f(cr, cg, cb, ca);
+               qglColor4f(gl_state.color4f[0], gl_state.color4f[1], gl_state.color4f[2], gl_state.color4f[3]);
                CHECKGLERROR
        }
 }
@@ -632,7 +602,7 @@ void GL_LockArrays(int first, int count)
                        qglUnlockArraysEXT();
                        CHECKGLERROR
                }
-               if (count && gl_supportslockarrays && gl_lockarrays.integer)
+               if (count && gl_supportslockarrays && gl_lockarrays.integer && r_render.integer)
                {
                        gl_state.lockrange_first = first;
                        gl_state.lockrange_count = count;
@@ -714,6 +684,7 @@ void R_Mesh_Draw(int numverts, int numtriangles, const int *elements)
                Con_Printf("R_Mesh_Draw(%d, %d, %08p);\n", numverts, numtriangles, elements);
                return;
        }
+       CHECKGLERROR
        if (r_showtrispass)
        {
                R_Mesh_Draw_ShowTris(numverts, numtriangles, elements);
@@ -721,48 +692,46 @@ void R_Mesh_Draw(int numverts, int numtriangles, const int *elements)
        }
        c_meshs++;
        c_meshelements += numelements;
-       CHECKGLERROR
-       if (r_render.integer)
+       if (gl_paranoid.integer)
        {
-               if (gl_paranoid.integer)
+               int i, j, size;
+               const int *p;
+               if (!qglIsEnabled(GL_VERTEX_ARRAY))
+                       Con_Print("R_Mesh_Draw: vertex array not enabled\n");
+               for (j = 0, size = numverts * (int)sizeof(float[3]), p = gl_state.pointer_vertex;j < size;j += sizeof(int), p++)
+                       paranoidblah += *p;
+               if (gl_state.pointer_color)
                {
-                       int i, j, size;
-                       const int *p;
-                       if (!qglIsEnabled(GL_VERTEX_ARRAY))
-                               Con_Print("R_Mesh_Draw: vertex array not enabled\n");
-                       for (j = 0, size = numverts * (int)sizeof(float[3]), p = gl_state.pointer_vertex;j < size;j += sizeof(int), p++)
+                       if (!qglIsEnabled(GL_COLOR_ARRAY))
+                               Con_Print("R_Mesh_Draw: color array set but not enabled\n");
+                       for (j = 0, size = numverts * (int)sizeof(float[4]), p = gl_state.pointer_color;j < size;j += sizeof(int), p++)
                                paranoidblah += *p;
-                       if (gl_state.pointer_color)
+               }
+               for (i = 0;i < backendunits;i++)
+               {
+                       if (gl_state.units[i].t1d || gl_state.units[i].t2d || gl_state.units[i].t3d || gl_state.units[i].tcubemap || gl_state.units[i].arrayenabled)
                        {
-                               if (!qglIsEnabled(GL_COLOR_ARRAY))
-                                       Con_Print("R_Mesh_Draw: color array set but not enabled\n");
-                               for (j = 0, size = numverts * (int)sizeof(float[4]), p = gl_state.pointer_color;j < size;j += sizeof(int), p++)
+                               if (gl_state.units[i].arrayenabled && !(gl_state.units[i].t1d || gl_state.units[i].t2d || gl_state.units[i].t3d || gl_state.units[i].tcubemap))
+                                       Con_Print("R_Mesh_Draw: array enabled but no texture bound\n");
+                               GL_ClientActiveTexture(i);
+                               if (!qglIsEnabled(GL_TEXTURE_COORD_ARRAY))
+                                       Con_Print("R_Mesh_Draw: texcoord array set but not enabled\n");
+                               for (j = 0, size = numverts * ((gl_state.units[i].t3d || gl_state.units[i].tcubemap) ? (int)sizeof(float[3]) : (int)sizeof(float[2])), p = gl_state.units[i].pointer_texcoord;j < size;j += sizeof(int), p++)
                                        paranoidblah += *p;
                        }
-                       for (i = 0;i < backendunits;i++)
+               }
+               for (i = 0;i < numtriangles * 3;i++)
+               {
+                       if (elements[i] < 0 || elements[i] >= numverts)
                        {
-                               if (gl_state.units[i].t1d || gl_state.units[i].t2d || gl_state.units[i].t3d || gl_state.units[i].tcubemap || gl_state.units[i].arrayenabled)
-                               {
-                                       if (gl_state.units[i].arrayenabled && !(gl_state.units[i].t1d || gl_state.units[i].t2d || gl_state.units[i].t3d || gl_state.units[i].tcubemap))
-                                               Con_Print("R_Mesh_Draw: array enabled but no texture bound\n");
-                                       GL_ActiveTexture(i);
-                                       if (!qglIsEnabled(GL_TEXTURE_COORD_ARRAY))
-                                               Con_Print("R_Mesh_Draw: texcoord array set but not enabled\n");
-                                       for (j = 0, size = numverts * ((gl_state.units[i].t3d || gl_state.units[i].tcubemap) ? (int)sizeof(float[3]) : (int)sizeof(float[2])), p = gl_state.units[i].pointer_texcoord;j < size;j += sizeof(int), p++)
-                                               paranoidblah += *p;
-                               }
-                       }
-                       for (i = 0;i < numtriangles * 3;i++)
-                       {
-                               if (elements[i] < 0 || elements[i] >= numverts)
-                               {
-                                       Con_Printf("R_Mesh_Draw: invalid vertex index %i (outside range 0 - %i) in elements list\n", elements[i], numverts);
-                                       return;
-                               }
+                               Con_Printf("R_Mesh_Draw: invalid vertex index %i (outside range 0 - %i) in elements list\n", elements[i], numverts);
+                               return;
                        }
                }
                CHECKGLERROR
-               GL_LockArrays(0, numverts);
+       }
+       if (r_render.integer)
+       {
                CHECKGLERROR
                if (gl_mesh_testmanualfeeding.integer)
                {
@@ -834,8 +803,6 @@ void R_Mesh_Draw(int numverts, int numtriangles, const int *elements)
                        qglDrawElements(GL_TRIANGLES, numelements, GL_UNSIGNED_INT, elements);CHECKGLERROR
                }
                CHECKGLERROR
-               GL_LockArrays(0, 0);
-               CHECKGLERROR
        }
 }
 
@@ -892,35 +859,54 @@ void R_Mesh_Matrix(const matrix4x4_t *matrix)
        }
 }
 
-void R_Mesh_TextureMatrix(int unitnumber, const matrix4x4_t *matrix)
-{
-       if (memcmp(&gl_state.units[unitnumber].matrix, matrix, sizeof(matrix4x4_t)))
-       {
-               matrix4x4_t tempmatrix;
-               gl_state.units[unitnumber].matrix = *matrix;
-               Matrix4x4_Transpose(&tempmatrix, &gl_state.units[unitnumber].matrix);
-               qglMatrixMode(GL_TEXTURE);
-               GL_ActiveTexture(unitnumber);
-               qglLoadMatrixf(&tempmatrix.m[0][0]);
-               qglMatrixMode(GL_MODELVIEW);
-       }
-}
-
-void R_Mesh_State_Texture(const rmeshstate_t *m)
+void R_Mesh_State(const rmeshstate_t *m)
 {
        int i, combinergb, combinealpha, scale, arrayis3d;
        gltextureunit_t *unit;
+       const matrix4x4_t *texmatrix;
+       matrix4x4_t tempmatrix;
+       const float *texcoords;
 
        BACKENDACTIVECHECK
 
+       if (gl_state.pointer_vertex != m->pointer_vertex)
+       {
+               gl_state.pointer_vertex = m->pointer_vertex;
+               CHECKGLERROR
+               qglVertexPointer(3, GL_FLOAT, sizeof(float[3]), gl_state.pointer_vertex);
+               CHECKGLERROR
+       }
+
+       if (r_showtrispass)
+               return;
+
+       if (gl_state.pointer_color != m->pointer_color)
+       {
+               CHECKGLERROR
+               if (!gl_state.pointer_color)
+               {
+                       qglEnableClientState(GL_COLOR_ARRAY);
+                       CHECKGLERROR
+               }
+               else if (!m->pointer_color)
+               {
+                       qglDisableClientState(GL_COLOR_ARRAY);
+                       CHECKGLERROR
+                       // when color array is on the glColor gets trashed, set it again
+                       qglColor4f(gl_state.color4f[0], gl_state.color4f[1], gl_state.color4f[2], gl_state.color4f[3]);
+                       CHECKGLERROR
+               }
+               gl_state.pointer_color = m->pointer_color;
+               qglColorPointer(4, GL_FLOAT, sizeof(float[4]), gl_state.pointer_color);
+               CHECKGLERROR
+       }
+
        if (gl_backend_rebindtextures)
        {
                gl_backend_rebindtextures = false;
                GL_SetupTextureState();
        }
 
-       if (r_showtrispass)
-               return;
        for (i = 0, unit = gl_state.units;i < backendunits;i++, unit++)
        {
                if (unit->t1d != m->tex1d[i])
@@ -1024,10 +1010,13 @@ void R_Mesh_State_Texture(const rmeshstate_t *m)
                        qglTexEnvi(GL_TEXTURE_ENV, GL_ALPHA_SCALE, (unit->alphascale = scale));CHECKGLERROR
                }
                arrayis3d = unit->t3d || unit->tcubemap;
-               if (unit->pointer_texcoord != m->pointer_texcoord[i] || unit->arrayis3d != arrayis3d)
+               texcoords = m->pointer_texcoord[i];
+               if (texcoords && !unit->t1d && !unit->t2d && !unit->t3d && !unit->tcubemap)
+                       texcoords = NULL;
+               if (unit->pointer_texcoord != texcoords || unit->arrayis3d != arrayis3d)
                {
                        GL_ClientActiveTexture(i);
-                       if (m->pointer_texcoord[i])
+                       if (texcoords)
                        {
                                if (!unit->arrayenabled)
                                {
@@ -1043,7 +1032,7 @@ void R_Mesh_State_Texture(const rmeshstate_t *m)
                                        qglDisableClientState(GL_TEXTURE_COORD_ARRAY);CHECKGLERROR
                                }
                        }
-                       unit->pointer_texcoord = m->pointer_texcoord[i];
+                       unit->pointer_texcoord = texcoords;
                        unit->arrayis3d = arrayis3d;
                        if (unit->arrayis3d)
                                qglTexCoordPointer(3, GL_FLOAT, sizeof(float[3]), unit->pointer_texcoord);
@@ -1051,6 +1040,20 @@ void R_Mesh_State_Texture(const rmeshstate_t *m)
                                qglTexCoordPointer(2, GL_FLOAT, sizeof(float[2]), unit->pointer_texcoord);
                        CHECKGLERROR
                }
+               // if texmatrix is not set (3,3 should always be 1 in a texture matrix) just compare to the identity matrix
+               if (m->texmatrix[i].m[3][3])
+                       texmatrix = &m->texmatrix[i];
+               else
+                       texmatrix = &r_identitymatrix;
+               if (memcmp(&unit->matrix, texmatrix, sizeof(matrix4x4_t)))
+               {
+                       unit->matrix = *texmatrix;
+                       Matrix4x4_Transpose(&tempmatrix, &unit->matrix);
+                       qglMatrixMode(GL_TEXTURE);
+                       GL_ActiveTexture(i);
+                       qglLoadMatrixf(&tempmatrix.m[0][0]);
+                       qglMatrixMode(GL_MODELVIEW);
+               }
        }
 }
 
@@ -1256,7 +1259,7 @@ showtris:
                GL_DepthTest(GL_FALSE);
                GL_DepthMask(GL_FALSE);
                memset(&m, 0, sizeof(m));
-               R_Mesh_State_Texture(&m);
+               R_Mesh_State(&m);
                r_showtrispass = true;
                GL_ShowTrisColor(0.2,0.2,0.2,1);
                goto showtris;