]> 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 e598d0fd8c1ad0c9329d083308ff9dd717039364..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)
@@ -597,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;
@@ -679,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);
@@ -686,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)
                {
@@ -799,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
        }
 }
 
@@ -857,24 +859,13 @@ 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(const rmeshstate_t *m)
 {
        int i, combinergb, combinealpha, scale, arrayis3d;
        gltextureunit_t *unit;
+       const matrix4x4_t *texmatrix;
+       matrix4x4_t tempmatrix;
+       const float *texcoords;
 
        BACKENDACTIVECHECK
 
@@ -1019,10 +1010,13 @@ void R_Mesh_State(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)
                                {
@@ -1038,7 +1032,7 @@ void R_Mesh_State(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);
@@ -1046,6 +1040,20 @@ void R_Mesh_State(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);
+               }
        }
 }