]> git.xonotic.org Git - xonotic/darkplaces.git/commitdiff
eliminated R_Mesh_TextureState function and rmeshstate_t struct because
authorhavoc <havoc@d7cf8633-e32d-0410-b094-e92efae38249>
Sun, 20 Dec 2009 14:20:26 +0000 (14:20 +0000)
committerhavoc <havoc@d7cf8633-e32d-0410-b094-e92efae38249>
Sun, 20 Dec 2009 14:20:26 +0000 (14:20 +0000)
rmeshstate_t was excessively slow to memset and process (1984 bytes on
64bit systems)

git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@9608 d7cf8633-e32d-0410-b094-e92efae38249

gl_backend.c
gl_backend.h
gl_rmain.c
r_explosion.c
r_shadow.c

index a5bc0ecff3c26fd9a28bcc7274e3f1bae45dde38..a0e336acf4d1ab8126ac4092e00862ec6e92ec98 100644 (file)
@@ -1726,7 +1726,7 @@ static const float gl_identitymatrix[16] = {1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1};
 void R_Mesh_TexMatrix(unsigned int unitnum, const matrix4x4_t *matrix)
 {
        gltextureunit_t *unit = gl_state.units + unitnum;
-       if (matrix->m[3][3])
+       if (matrix && matrix->m[3][3])
        {
                // texmatrix specified, check if it is different
                if (!unit->texmatrixenabled || memcmp(&unit->matrix, matrix, sizeof(matrix4x4_t)))
@@ -1837,30 +1837,6 @@ void R_Mesh_TexCombine(unsigned int unitnum, int combinergb, int combinealpha, i
        }
 }
 
-void R_Mesh_TextureState(const rmeshstate_t *m)
-{
-       unsigned int i;
-
-       BACKENDACTIVECHECK
-
-       CHECKGLERROR
-       for (i = 0;i < vid.teximageunits;i++)
-               R_Mesh_TexBindAll(i, m->tex[i], m->tex3d[i], m->texcubemap[i], m->texrectangle[i]);
-       for (i = 0;i < vid.texarrayunits;i++)
-       {
-               if (m->pointer_texcoord3f[i])
-                       R_Mesh_TexCoordPointer(i, 3, m->pointer_texcoord3f[i], m->pointer_texcoord_bufferobject[i], m->pointer_texcoord_bufferoffset[i]);
-               else
-                       R_Mesh_TexCoordPointer(i, 2, m->pointer_texcoord[i], m->pointer_texcoord_bufferobject[i], m->pointer_texcoord_bufferoffset[i]);
-       }
-       for (i = 0;i < vid.texunits;i++)
-       {
-               R_Mesh_TexMatrix(i, &m->texmatrix[i]);
-               R_Mesh_TexCombine(i, m->texcombinergb[i], m->texcombinealpha[i], m->texrgbscale[i], m->texalphascale[i]);
-       }
-       CHECKGLERROR
-}
-
 void R_Mesh_ResetTextureState(void)
 {
        unsigned int unitnum;
index e11be01487f9585686b8f3c40f4916b4f2e53ad3..63261cd3b8ece84a3821840ece0dae0bc45d0283 100644 (file)
@@ -42,29 +42,6 @@ extern cvar_t gl_mesh_copyarrays;
 extern cvar_t gl_paranoid;
 extern cvar_t gl_printcheckerror;
 
-//input to R_Mesh_TextureState
-typedef struct rmeshstate_s
-{
-       // textures
-       int tex[MAX_TEXTUREUNITS];
-       int tex3d[MAX_TEXTUREUNITS];
-       int texcubemap[MAX_TEXTUREUNITS];
-       int texrectangle[MAX_TEXTUREUNITS];
-       // texture combine settings
-       int texrgbscale[MAX_TEXTUREUNITS]; // used only if COMBINE is present
-       int texalphascale[MAX_TEXTUREUNITS]; // used only if COMBINE is present
-       int texcombinergb[MAX_TEXTUREUNITS]; // works with or without combine for some operations
-       int texcombinealpha[MAX_TEXTUREUNITS]; // does nothing without combine
-       // matrices
-       matrix4x4_t texmatrix[MAX_TEXTUREUNITS];
-       // pointers
-       const float *pointer_texcoord[MAX_TEXTUREUNITS]; // 2D
-       const float *pointer_texcoord3f[MAX_TEXTUREUNITS]; // 3D
-       int pointer_texcoord_bufferobject[MAX_TEXTUREUNITS]; // 2D and 3D
-       size_t pointer_texcoord_bufferoffset[MAX_TEXTUREUNITS]; // 2D and 3D
-}
-rmeshstate_t;
-
 // adds console variables and registers the render module (only call from GL_Init)
 void gl_backend_init(void);
 
@@ -101,13 +78,11 @@ void R_Mesh_TexCoordPointer(unsigned int unitnum, unsigned int numcomponents, co
 void R_Mesh_TexBindAll(unsigned int unitnum, int tex2d, int tex3d, int texcubemap, int texrectangle);
 // equivalent to R_Mesh_TexBindAll(unitnum,tex2d,0,0,0)
 void R_Mesh_TexBind(unsigned int unitnum, int texnum);
-// sets the texcoord matrix for a texenv unit
+// sets the texcoord matrix for a texenv unit, can be NULL or blank (will use identity)
 void R_Mesh_TexMatrix(unsigned int unitnum, const matrix4x4_t *matrix);
 // sets the combine state for a texenv unit
 void R_Mesh_TexCombine(unsigned int unitnum, int combinergb, int combinealpha, int rgbscale, int alphascale);
-// set up the requested texture state
-void R_Mesh_TextureState(const rmeshstate_t *m);
-// set up a blank texture state (faster/easier specialized version of R_Mesh_TextureState)
+// set up a blank texture state (unbinds all textures, texcoord pointers, and resets combine settings)
 void R_Mesh_ResetTextureState(void);
 
 // renders a mesh
index 6e400bd17f742b391877bee4c834c53469e44895..21a3a256f0db9e438ef1eba62f3ac9773c2954b2 100644 (file)
@@ -7784,7 +7784,6 @@ static void R_DrawTextureSurfaceList_GL13(int texturenumsurfaces, const msurface
        int texturesurfaceindex;
        qboolean applycolor;
        qboolean applyfog;
-       rmeshstate_t m;
        int layerindex;
        const texturelayer_t *layer;
        RSurf_PrepareVerticesForBatch(true, false, texturenumsurfaces, texturesurfacelist);
@@ -7827,18 +7826,15 @@ static void R_DrawTextureSurfaceList_GL13(int texturenumsurfaces, const msurface
                switch (layer->type)
                {
                case TEXTURELAYERTYPE_LITTEXTURE:
-                       memset(&m, 0, sizeof(m));
-                       m.tex[0] = R_GetTexture(r_texture_white);
-                       m.pointer_texcoord[0] = rsurface.modeltexcoordlightmap2f;
-                       m.pointer_texcoord_bufferobject[0] = rsurface.modeltexcoordlightmap2f_bufferobject;
-                       m.pointer_texcoord_bufferoffset[0] = rsurface.modeltexcoordlightmap2f_bufferoffset;
-                       m.tex[1] = R_GetTexture(layer->texture);
-                       m.texmatrix[1] = layer->texmatrix;
-                       m.texrgbscale[1] = layertexrgbscale;
-                       m.pointer_texcoord[1] = rsurface.texcoordtexture2f;
-                       m.pointer_texcoord_bufferobject[1] = rsurface.texcoordtexture2f_bufferobject;
-                       m.pointer_texcoord_bufferoffset[1] = rsurface.texcoordtexture2f_bufferoffset;
-                       R_Mesh_TextureState(&m);
+                       // single-pass lightmapped texture with 2x rgbscale
+                       R_Mesh_TexBind(0, R_GetTexture(r_texture_white));
+                       R_Mesh_TexMatrix(0, NULL);
+                       R_Mesh_TexCombine(0, GL_MODULATE, GL_MODULATE, 1, 1);
+                       R_Mesh_TexCoordPointer(0, 2, rsurface.modeltexcoordlightmap2f, rsurface.modeltexcoordlightmap2f_bufferobject, rsurface.modeltexcoordlightmap2f_bufferoffset);
+                       R_Mesh_TexBind(1, R_GetTexture(layer->texture));
+                       R_Mesh_TexMatrix(1, &layer->texmatrix);
+                       R_Mesh_TexCombine(1, GL_MODULATE, GL_MODULATE, layertexrgbscale, 1);
+                       R_Mesh_TexCoordPointer(1, 2, rsurface.texcoordtexture2f, rsurface.texcoordtexture2f_bufferobject, rsurface.texcoordtexture2f_bufferoffset);
                        if (rsurface.texture->currentmaterialflags & MATERIALFLAG_MODELLIGHT)
                                RSurf_DrawBatch_GL11_VertexShade(texturenumsurfaces, texturesurfacelist, layercolor[0], layercolor[1], layercolor[2], layercolor[3], applycolor, applyfog);
                        else if (rsurface.uselightmaptexture)
@@ -7847,28 +7843,31 @@ static void R_DrawTextureSurfaceList_GL13(int texturenumsurfaces, const msurface
                                RSurf_DrawBatch_GL11_VertexColor(texturenumsurfaces, texturesurfacelist, layercolor[0], layercolor[1], layercolor[2], layercolor[3], applycolor, applyfog);
                        break;
                case TEXTURELAYERTYPE_TEXTURE:
-                       memset(&m, 0, sizeof(m));
-                       m.tex[0] = R_GetTexture(layer->texture);
-                       m.texmatrix[0] = layer->texmatrix;
-                       m.texrgbscale[0] = layertexrgbscale;
-                       m.pointer_texcoord[0] = rsurface.texcoordtexture2f;
-                       m.pointer_texcoord_bufferobject[0] = rsurface.texcoordtexture2f_bufferobject;
-                       m.pointer_texcoord_bufferoffset[0] = rsurface.texcoordtexture2f_bufferoffset;
-                       R_Mesh_TextureState(&m);
+                       // singletexture unlit texture with transparency support
+                       R_Mesh_TexBind(0, R_GetTexture(layer->texture));
+                       R_Mesh_TexMatrix(0, &layer->texmatrix);
+                       R_Mesh_TexCombine(0, GL_MODULATE, GL_MODULATE, layertexrgbscale, 1);
+                       R_Mesh_TexCoordPointer(0, 2, rsurface.texcoordtexture2f, rsurface.texcoordtexture2f_bufferobject, rsurface.texcoordtexture2f_bufferoffset);
+                       R_Mesh_TexBind(1, 0);
+                       R_Mesh_TexCoordPointer(1, 2, NULL, 0, 0);
                        RSurf_DrawBatch_GL11_Unlit(texturenumsurfaces, texturesurfacelist, layercolor[0], layercolor[1], layercolor[2], layercolor[3], applycolor, applyfog);
                        break;
                case TEXTURELAYERTYPE_FOG:
-                       memset(&m, 0, sizeof(m));
-                       m.texrgbscale[0] = layertexrgbscale;
+                       // singletexture fogging
                        if (layer->texture)
                        {
-                               m.tex[0] = R_GetTexture(layer->texture);
-                               m.texmatrix[0] = layer->texmatrix;
-                               m.pointer_texcoord[0] = rsurface.texcoordtexture2f;
-                               m.pointer_texcoord_bufferobject[0] = rsurface.texcoordtexture2f_bufferobject;
-                               m.pointer_texcoord_bufferoffset[0] = rsurface.texcoordtexture2f_bufferoffset;
+                               R_Mesh_TexBind(0, R_GetTexture(layer->texture));
+                               R_Mesh_TexMatrix(0, &layer->texmatrix);
+                               R_Mesh_TexCombine(0, GL_MODULATE, GL_MODULATE, layertexrgbscale, 1);
+                               R_Mesh_TexCoordPointer(0, 2, rsurface.texcoordtexture2f, rsurface.texcoordtexture2f_bufferobject, rsurface.texcoordtexture2f_bufferoffset);
+                       }
+                       else
+                       {
+                               R_Mesh_TexBind(0, 0);
+                               R_Mesh_TexCoordPointer(0, 2, NULL, 0, 0);
                        }
-                       R_Mesh_TextureState(&m);
+                       R_Mesh_TexBind(1, 0);
+                       R_Mesh_TexCoordPointer(1, 2, NULL, 0, 0);
                        // generate a color array for the fog pass
                        R_Mesh_ColorPointer(rsurface.array_color4f, 0, 0);
                        for (texturesurfaceindex = 0;texturesurfaceindex < texturenumsurfaces;texturesurfaceindex++)
@@ -7907,7 +7906,6 @@ static void R_DrawTextureSurfaceList_GL11(int texturenumsurfaces, const msurface
        // OpenGL 1.1 - crusty old voodoo path
        int texturesurfaceindex;
        qboolean applyfog;
-       rmeshstate_t m;
        int layerindex;
        const texturelayer_t *layer;
        RSurf_PrepareVerticesForBatch(true, false, texturenumsurfaces, texturesurfacelist);
@@ -7935,12 +7933,10 @@ static void R_DrawTextureSurfaceList_GL11(int texturenumsurfaces, const msurface
                        {
                                // two-pass lit texture with 2x rgbscale
                                // first the lightmap pass
-                               memset(&m, 0, sizeof(m));
-                               m.tex[0] = R_GetTexture(r_texture_white);
-                               m.pointer_texcoord[0] = rsurface.modeltexcoordlightmap2f;
-                               m.pointer_texcoord_bufferobject[0] = rsurface.modeltexcoordlightmap2f_bufferobject;
-                               m.pointer_texcoord_bufferoffset[0] = rsurface.modeltexcoordlightmap2f_bufferoffset;
-                               R_Mesh_TextureState(&m);
+                               R_Mesh_TexBind(0, R_GetTexture(r_texture_white));
+                               R_Mesh_TexMatrix(0, NULL);
+                               R_Mesh_TexCombine(0, GL_MODULATE, GL_MODULATE, 1, 1);
+                               R_Mesh_TexCoordPointer(0, 2, rsurface.modeltexcoordlightmap2f, rsurface.modeltexcoordlightmap2f_bufferobject, rsurface.modeltexcoordlightmap2f_bufferoffset);
                                if (rsurface.texture->currentmaterialflags & MATERIALFLAG_MODELLIGHT)
                                        RSurf_DrawBatch_GL11_VertexShade(texturenumsurfaces, texturesurfacelist, 1, 1, 1, 1, false, false);
                                else if (rsurface.uselightmaptexture)
@@ -7950,25 +7946,19 @@ static void R_DrawTextureSurfaceList_GL11(int texturenumsurfaces, const msurface
                                GL_LockArrays(0, 0);
                                // then apply the texture to it
                                GL_BlendFunc(GL_DST_COLOR, GL_SRC_COLOR);
-                               memset(&m, 0, sizeof(m));
-                               m.tex[0] = R_GetTexture(layer->texture);
-                               m.texmatrix[0] = layer->texmatrix;
-                               m.pointer_texcoord[0] = rsurface.texcoordtexture2f;
-                               m.pointer_texcoord_bufferobject[0] = rsurface.texcoordtexture2f_bufferobject;
-                               m.pointer_texcoord_bufferoffset[0] = rsurface.texcoordtexture2f_bufferoffset;
-                               R_Mesh_TextureState(&m);
+                               R_Mesh_TexBind(0, R_GetTexture(layer->texture));
+                               R_Mesh_TexMatrix(0, &layer->texmatrix);
+                               R_Mesh_TexCombine(0, GL_MODULATE, GL_MODULATE, 1, 1);
+                               R_Mesh_TexCoordPointer(0, 2, rsurface.texcoordtexture2f, rsurface.texcoordtexture2f_bufferobject, rsurface.texcoordtexture2f_bufferoffset);
                                RSurf_DrawBatch_GL11_Unlit(texturenumsurfaces, texturesurfacelist, layer->color[0] * 0.5f, layer->color[1] * 0.5f, layer->color[2] * 0.5f, layer->color[3], layer->color[0] != 2 || layer->color[1] != 2 || layer->color[2] != 2 || layer->color[3] != 1, false);
                        }
                        else
                        {
                                // single pass vertex-lighting-only texture with 1x rgbscale and transparency support
-                               memset(&m, 0, sizeof(m));
-                               m.tex[0] = R_GetTexture(layer->texture);
-                               m.texmatrix[0] = layer->texmatrix;
-                               m.pointer_texcoord[0] = rsurface.texcoordtexture2f;
-                               m.pointer_texcoord_bufferobject[0] = rsurface.texcoordtexture2f_bufferobject;
-                               m.pointer_texcoord_bufferoffset[0] = rsurface.texcoordtexture2f_bufferoffset;
-                               R_Mesh_TextureState(&m);
+                               R_Mesh_TexBind(0, R_GetTexture(layer->texture));
+                               R_Mesh_TexMatrix(0, &layer->texmatrix);
+                               R_Mesh_TexCombine(0, GL_MODULATE, GL_MODULATE, 1, 1);
+                               R_Mesh_TexCoordPointer(0, 2, rsurface.texcoordtexture2f, rsurface.texcoordtexture2f_bufferobject, rsurface.texcoordtexture2f_bufferoffset);
                                if (rsurface.texture->currentmaterialflags & MATERIALFLAG_MODELLIGHT)
                                        RSurf_DrawBatch_GL11_VertexShade(texturenumsurfaces, texturesurfacelist, layer->color[0], layer->color[1], layer->color[2], layer->color[3], layer->color[0] != 1 || layer->color[1] != 1 || layer->color[2] != 1 || layer->color[3] != 1, applyfog);
                                else
@@ -7977,31 +7967,28 @@ static void R_DrawTextureSurfaceList_GL11(int texturenumsurfaces, const msurface
                        break;
                case TEXTURELAYERTYPE_TEXTURE:
                        // singletexture unlit texture with transparency support
-                       memset(&m, 0, sizeof(m));
-                       m.tex[0] = R_GetTexture(layer->texture);
-                       m.texmatrix[0] = layer->texmatrix;
-                       m.pointer_texcoord[0] = rsurface.texcoordtexture2f;
-                       m.pointer_texcoord_bufferobject[0] = rsurface.texcoordtexture2f_bufferobject;
-                       m.pointer_texcoord_bufferoffset[0] = rsurface.texcoordtexture2f_bufferoffset;
-                       R_Mesh_TextureState(&m);
+                       R_Mesh_TexBind(0, R_GetTexture(layer->texture));
+                       R_Mesh_TexMatrix(0, &layer->texmatrix);
+                       R_Mesh_TexCombine(0, GL_MODULATE, GL_MODULATE, 1, 1);
+                       R_Mesh_TexCoordPointer(0, 2, rsurface.texcoordtexture2f, rsurface.texcoordtexture2f_bufferobject, rsurface.texcoordtexture2f_bufferoffset);
                        RSurf_DrawBatch_GL11_Unlit(texturenumsurfaces, texturesurfacelist, layer->color[0], layer->color[1], layer->color[2], layer->color[3], layer->color[0] != 1 || layer->color[1] != 1 || layer->color[2] != 1 || layer->color[3] != 1, applyfog);
                        break;
                case TEXTURELAYERTYPE_FOG:
                        // singletexture fogging
-                       R_Mesh_ColorPointer(rsurface.array_color4f, 0, 0);
                        if (layer->texture)
                        {
-                               memset(&m, 0, sizeof(m));
-                               m.tex[0] = R_GetTexture(layer->texture);
-                               m.texmatrix[0] = layer->texmatrix;
-                               m.pointer_texcoord[0] = rsurface.texcoordtexture2f;
-                               m.pointer_texcoord_bufferobject[0] = rsurface.texcoordtexture2f_bufferobject;
-                               m.pointer_texcoord_bufferoffset[0] = rsurface.texcoordtexture2f_bufferoffset;
-                               R_Mesh_TextureState(&m);
+                               R_Mesh_TexBind(0, R_GetTexture(layer->texture));
+                               R_Mesh_TexMatrix(0, &layer->texmatrix);
+                               R_Mesh_TexCombine(0, GL_MODULATE, GL_MODULATE, 1, 1);
+                               R_Mesh_TexCoordPointer(0, 2, rsurface.texcoordtexture2f, rsurface.texcoordtexture2f_bufferobject, rsurface.texcoordtexture2f_bufferoffset);
                        }
                        else
-                               R_Mesh_ResetTextureState();
+                       {
+                               R_Mesh_TexBind(0, 0);
+                               R_Mesh_TexCoordPointer(0, 2, NULL, 0, 0);
+                       }
                        // generate a color array for the fog pass
+                       R_Mesh_ColorPointer(rsurface.array_color4f, 0, 0);
                        for (texturesurfaceindex = 0;texturesurfaceindex < texturenumsurfaces;texturesurfaceindex++)
                        {
                                int i;
index 5e46117b3b950b93735ba4b0287c2ec553926907..4a965964741d316c1e80d11ef23f7c9ac62cd3ab 100644 (file)
@@ -204,7 +204,6 @@ static void R_DrawExplosion_TransparentCallback(const entity_render_t *ent, cons
 {
        int surfacelistindex = 0;
        const int numtriangles = EXPLOSIONTRIS, numverts = EXPLOSIONVERTS;
-       rmeshstate_t m;
        GL_BlendFunc(GL_SRC_ALPHA, GL_ONE);
        GL_DepthMask(false);
        GL_DepthRange(0, 1);
@@ -215,10 +214,9 @@ static void R_DrawExplosion_TransparentCallback(const entity_render_t *ent, cons
 
        R_SetupGenericShader(true);
        R_Mesh_ColorPointer(NULL, 0, 0);
-       memset(&m, 0, sizeof(m));
-       m.tex[0] = R_GetTexture(explosiontexture);
-       m.pointer_texcoord[0] = explosiontexcoord2f[0];
-       R_Mesh_TextureState(&m);
+       R_Mesh_ResetTextureState();
+       R_Mesh_TexBind(0, R_GetTexture(explosiontexture));
+       R_Mesh_TexCoordPointer(0, 2, explosiontexcoord2f[0], 0, 0);
        for (surfacelistindex = 0;surfacelistindex < numsurfaces;surfacelistindex++)
        {
                const explosion_t *e = explosion + surfacelist[surfacelistindex];
index 29ae6fdea72fa236409298604678d8169c7aaf3a..fc10c8c78a37d2b0e32a245de6f98c196023b7f5 100644 (file)
@@ -2853,7 +2853,6 @@ static void R_Shadow_RenderLighting_Light_Vertex(int firstvertex, int numvertice
        rtexture_t *shirttexture = rsurface.texture->currentskinframe->shirt;
        qboolean dopants = pantstexture && VectorLength2(surfacepants) >= (1.0f / 1048576.0f);
        qboolean doshirt = shirttexture && VectorLength2(surfaceshirt) >= (1.0f / 1048576.0f);
-       rmeshstate_t m;
        ambientscale *= 2 * r_refdef.view.colorscale;
        diffusescale *= 2 * r_refdef.view.colorscale;
        ambientcolorbase[0] = lightcolor[0] * ambientscale * surfacecolor[0];ambientcolorbase[1] = lightcolor[1] * ambientscale * surfacecolor[1];ambientcolorbase[2] = lightcolor[2] * ambientscale * surfacecolor[2];
@@ -2862,63 +2861,31 @@ static void R_Shadow_RenderLighting_Light_Vertex(int firstvertex, int numvertice
        diffusecolorpants[0] = diffusecolorbase[0] * surfacepants[0];diffusecolorpants[1] = diffusecolorbase[1] * surfacepants[1];diffusecolorpants[2] = diffusecolorbase[2] * surfacepants[2];
        ambientcolorshirt[0] = ambientcolorbase[0] * surfaceshirt[0];ambientcolorshirt[1] = ambientcolorbase[1] * surfaceshirt[1];ambientcolorshirt[2] = ambientcolorbase[2] * surfaceshirt[2];
        diffusecolorshirt[0] = diffusecolorbase[0] * surfaceshirt[0];diffusecolorshirt[1] = diffusecolorbase[1] * surfaceshirt[1];diffusecolorshirt[2] = diffusecolorbase[2] * surfaceshirt[2];
+       R_Mesh_TexBind(0, R_GetTexture(basetexture));
+       R_Mesh_TexMatrix(0, &rsurface.texture->currenttexmatrix);
+       R_Mesh_TexCombine(0, GL_MODULATE, GL_MODULATE, 1, 1);
+       R_Mesh_TexCoordPointer(0, 2, rsurface.texcoordtexture2f, rsurface.texcoordtexture2f_bufferobject, rsurface.texcoordtexture2f_bufferoffset);
        switch(r_shadow_rendermode)
        {
        case R_SHADOW_RENDERMODE_LIGHT_VERTEX3DATTEN:
-               memset(&m, 0, sizeof(m));
-               m.tex[0] = R_GetTexture(basetexture);
-               m.texmatrix[0] = rsurface.texture->currenttexmatrix;
-               m.pointer_texcoord[0] = rsurface.texcoordtexture2f;
-               m.pointer_texcoord_bufferobject[0] = rsurface.texcoordtexture2f_bufferobject;
-               m.pointer_texcoord_bufferoffset[0] = rsurface.texcoordtexture2f_bufferoffset;
-               m.tex3d[1] = R_GetTexture(r_shadow_attenuation3dtexture);
-               m.texmatrix[1] = rsurface.entitytoattenuationxyz;
-               m.pointer_texcoord3f[1] = rsurface.vertex3f;
-               m.pointer_texcoord_bufferobject[1] = rsurface.vertex3f_bufferobject;
-               m.pointer_texcoord_bufferoffset[1] = rsurface.vertex3f_bufferoffset;
-               R_Mesh_TextureState(&m);
+               R_Mesh_TexBindAll(1, 0, R_GetTexture(r_shadow_attenuation3dtexture), 0, 0);
+               R_Mesh_TexMatrix(1, &rsurface.entitytoattenuationxyz);
+               R_Mesh_TexCombine(1, GL_MODULATE, GL_MODULATE, 1, 1);
+               R_Mesh_TexCoordPointer(1, 3, rsurface.vertex3f, rsurface.vertex3f_bufferobject, rsurface.vertex3f_bufferoffset);
                break;
        case R_SHADOW_RENDERMODE_LIGHT_VERTEX2D1DATTEN:
-               memset(&m, 0, sizeof(m));
-               m.tex[0] = R_GetTexture(basetexture);
-               m.texmatrix[0] = rsurface.texture->currenttexmatrix;
-               m.pointer_texcoord[0] = rsurface.texcoordtexture2f;
-               m.pointer_texcoord_bufferobject[0] = rsurface.texcoordtexture2f_bufferobject;
-               m.pointer_texcoord_bufferoffset[0] = rsurface.texcoordtexture2f_bufferoffset;
-               m.tex[1] = R_GetTexture(r_shadow_attenuation2dtexture);
-               m.texmatrix[1] = rsurface.entitytoattenuationxyz;
-               m.pointer_texcoord3f[1] = rsurface.vertex3f;
-               m.pointer_texcoord_bufferobject[1] = rsurface.vertex3f_bufferobject;
-               m.pointer_texcoord_bufferoffset[1] = rsurface.vertex3f_bufferoffset;
-               m.tex[2] = R_GetTexture(r_shadow_attenuation2dtexture);
-               m.texmatrix[2] = rsurface.entitytoattenuationz;
-               m.pointer_texcoord3f[2] = rsurface.vertex3f;
-               m.pointer_texcoord_bufferobject[2] = rsurface.vertex3f_bufferobject;
-               m.pointer_texcoord_bufferoffset[2] = rsurface.vertex3f_bufferoffset;
-               R_Mesh_TextureState(&m);
-               break;
+               R_Mesh_TexBind(2, R_GetTexture(r_shadow_attenuation2dtexture));
+               R_Mesh_TexMatrix(2, &rsurface.entitytoattenuationz);
+               R_Mesh_TexCombine(2, GL_MODULATE, GL_MODULATE, 1, 1);
+               R_Mesh_TexCoordPointer(2, 3, rsurface.vertex3f, rsurface.vertex3f_bufferobject, rsurface.vertex3f_bufferoffset);
+               // fall through
        case R_SHADOW_RENDERMODE_LIGHT_VERTEX2DATTEN:
-               memset(&m, 0, sizeof(m));
-               m.tex[0] = R_GetTexture(basetexture);
-               m.texmatrix[0] = rsurface.texture->currenttexmatrix;
-               m.pointer_texcoord[0] = rsurface.texcoordtexture2f;
-               m.pointer_texcoord_bufferobject[0] = rsurface.texcoordtexture2f_bufferobject;
-               m.pointer_texcoord_bufferoffset[0] = rsurface.texcoordtexture2f_bufferoffset;
-               m.tex[1] = R_GetTexture(r_shadow_attenuation2dtexture);
-               m.texmatrix[1] = rsurface.entitytoattenuationxyz;
-               m.pointer_texcoord3f[1] = rsurface.vertex3f;
-               m.pointer_texcoord_bufferobject[1] = rsurface.vertex3f_bufferobject;
-               m.pointer_texcoord_bufferoffset[1] = rsurface.vertex3f_bufferoffset;
-               R_Mesh_TextureState(&m);
+               R_Mesh_TexBind(1, R_GetTexture(r_shadow_attenuation2dtexture));
+               R_Mesh_TexMatrix(1, &rsurface.entitytoattenuationxyz);
+               R_Mesh_TexCombine(1, GL_MODULATE, GL_MODULATE, 1, 1);
+               R_Mesh_TexCoordPointer(1, 3, rsurface.vertex3f, rsurface.vertex3f_bufferobject, rsurface.vertex3f_bufferoffset);
                break;
        case R_SHADOW_RENDERMODE_LIGHT_VERTEX:
-               memset(&m, 0, sizeof(m));
-               m.tex[0] = R_GetTexture(basetexture);
-               m.texmatrix[0] = rsurface.texture->currenttexmatrix;
-               m.pointer_texcoord[0] = rsurface.texcoordtexture2f;
-               m.pointer_texcoord_bufferobject[0] = rsurface.texcoordtexture2f_bufferobject;
-               m.pointer_texcoord_bufferoffset[0] = rsurface.texcoordtexture2f_bufferoffset;
-               R_Mesh_TextureState(&m);
                break;
        default:
                break;