]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - gl_rmain.c
made reconnect command reconnect to the last server you were on, even if it was an...
[xonotic/darkplaces.git] / gl_rmain.c
index c7e950aae37be67796668004d93f1f69abfc0f72..f6475aa4b72fe6a2b9df52e67dc445e925a02b9e 100644 (file)
@@ -34,7 +34,7 @@ r_view_t r_view;
 r_viewcache_t r_viewcache;
 
 cvar_t r_nearclip = {0, "r_nearclip", "1", "distance from camera of nearclip plane" };
-cvar_t r_showsurfaces = {0, "r_showsurfaces", "0", "shows surfaces as different colors"};
+cvar_t r_showsurfaces = {0, "r_showsurfaces", "0", "1 shows surfaces as different colors, or a value of 2 shows triangle draw order (for analyzing whether meshes are optimized for vertex cache)"};
 cvar_t r_showtris = {0, "r_showtris", "0", "shows triangle outlines, value controls brightness (can be above 1)"};
 cvar_t r_shownormals = {0, "r_shownormals", "0", "shows per-vertex surface normals and tangent vectors for bumpmapped lighting"};
 cvar_t r_showlighting = {0, "r_showlighting", "0", "shows areas lit by lights, useful for finding out why some areas of a map render slowly (bright orange = lots of passes = slow), a value of 2 disables depth testing which can be interesting but not very useful"};
@@ -77,11 +77,11 @@ cvar_t r_waterscroll = {CVAR_SAVE, "r_waterscroll", "1", "makes water scroll aro
 
 cvar_t r_bloom = {CVAR_SAVE, "r_bloom", "0", "enables bloom effect (makes bright pixels affect neighboring pixels)"};
 cvar_t r_bloom_colorscale = {CVAR_SAVE, "r_bloom_colorscale", "1", "how bright the glow is"};
-cvar_t r_bloom_brighten = {CVAR_SAVE, "r_bloom_brighten", "1", "how bright the glow is, after subtract/power"};
+cvar_t r_bloom_brighten = {CVAR_SAVE, "r_bloom_brighten", "2", "how bright the glow is, after subtract/power"};
 cvar_t r_bloom_blur = {CVAR_SAVE, "r_bloom_blur", "4", "how large the glow is"};
 cvar_t r_bloom_resolution = {CVAR_SAVE, "r_bloom_resolution", "320", "what resolution to perform the bloom effect at (independent of screen resolution)"};
 cvar_t r_bloom_colorexponent = {CVAR_SAVE, "r_bloom_colorexponent", "1", "how exagerated the glow is"};
-cvar_t r_bloom_colorsubtract = {CVAR_SAVE, "r_bloom_colorsubtract", "0", "reduces bloom colors by a certain amount"};
+cvar_t r_bloom_colorsubtract = {CVAR_SAVE, "r_bloom_colorsubtract", "0.125", "reduces bloom colors by a certain amount"};
 
 cvar_t r_hdr = {CVAR_SAVE, "r_hdr", "0", "enables High Dynamic Range bloom effect (higher quality version of r_bloom)"};
 cvar_t r_hdr_scenebrightness = {CVAR_SAVE, "r_hdr_scenebrightness", "1", "global rendering brightness"};
@@ -1212,7 +1212,7 @@ void GL_Init (void)
        VID_CheckExtensions();
 
        // LordHavoc: report supported extensions
-       Con_DPrintf("\nengine extensions: %s\n", vm_sv_extensions );
+       Con_DPrintf("\nQuakeC extensions for server and client: %s\nQuakeC extensions for menu: %s\n", vm_sv_extensions, vm_m_extensions );
 
        // clear to black (loading plaque will be seen over this)
        CHECKGLERROR
@@ -2010,7 +2010,7 @@ void R_UpdateVariables(void)
 
        r_refdef.rtworld = r_shadow_realtime_world.integer;
        r_refdef.rtworldshadows = r_shadow_realtime_world_shadows.integer && gl_stencil;
-       r_refdef.rtdlight = (r_shadow_realtime_world.integer || r_shadow_realtime_dlight.integer) && !gl_flashblend.integer;
+       r_refdef.rtdlight = (r_shadow_realtime_world.integer || r_shadow_realtime_dlight.integer) && !gl_flashblend.integer && r_dynamic.integer;
        r_refdef.rtdlightshadows = r_refdef.rtdlight && (r_refdef.rtworld ? r_shadow_realtime_world_dlightshadows.integer : r_shadow_realtime_dlight_shadows.integer) && gl_stencil;
        r_refdef.lightmapintensity = r_refdef.rtworld ? r_shadow_realtime_world_lightmaps.value : 1;
        if (r_showsurfaces.integer)
@@ -2107,7 +2107,7 @@ void R_RenderView(void)
 }
 
 extern void R_DrawLightningBeams (void);
-extern void VM_AddPolygonsToMeshQueue (void);
+extern void VM_CL_AddPolygonsToMeshQueue (void);
 extern void R_DrawPortals (void);
 void R_RenderScene(void)
 {
@@ -2197,7 +2197,7 @@ void R_RenderScene(void)
        {
                qglUseProgramObjectARB(0);CHECKGLERROR
        }
-       VM_AddPolygonsToMeshQueue();
+       VM_CL_AddPolygonsToMeshQueue();
 
        if (r_drawportals.integer)
        {
@@ -2620,6 +2620,8 @@ void R_UpdateTextureInfo(const entity_render_t *ent, texture_t *t)
        // pick a new currentskinframe if the material is animated
        if (t->numskinframes >= 2)
                t->currentskinframe = t->skinframes + ((int)(t->skinframerate * (cl.time - ent->frame2time)) % t->numskinframes);
+       if (t->backgroundnumskinframes >= 2)
+               t->backgroundcurrentskinframe = t->backgroundskinframes + ((int)(t->backgroundskinframerate * (cl.time - ent->frame2time)) % t->backgroundnumskinframes);
 
        t->currentmaterialflags = t->basematerialflags;
        t->currentalpha = ent->alpha;
@@ -2639,19 +2641,24 @@ void R_UpdateTextureInfo(const entity_render_t *ent, texture_t *t)
                t->currenttexmatrix = r_waterscrollmatrix;
        else
                t->currenttexmatrix = identitymatrix;
+       if (t->backgroundnumskinframes && !(t->currentmaterialflags & MATERIALFLAG_TRANSPARENT))
+               t->currentmaterialflags |= MATERIALFLAG_VERTEXTEXTUREBLEND;
 
        t->colormapping = VectorLength2(ent->colormap_pantscolor) + VectorLength2(ent->colormap_shirtcolor) >= (1.0f / 1048576.0f);
        t->basetexture = (!t->colormapping && t->currentskinframe->merged) ? t->currentskinframe->merged : t->currentskinframe->base;
        t->glosstexture = r_texture_white;
+       t->backgroundbasetexture = t->backgroundnumskinframes ? ((!t->colormapping && t->backgroundcurrentskinframe->merged) ? t->backgroundcurrentskinframe->merged : t->backgroundcurrentskinframe->base) : r_texture_white;
+       t->backgroundglosstexture = r_texture_white;
        t->specularpower = r_shadow_glossexponent.value;
        t->specularscale = 0;
        if (r_shadow_gloss.integer > 0)
        {
-               if (t->currentskinframe->gloss)
+               if (t->currentskinframe->gloss || (t->backgroundcurrentskinframe && t->backgroundcurrentskinframe->gloss))
                {
                        if (r_shadow_glossintensity.value > 0)
                        {
-                               t->glosstexture = t->currentskinframe->gloss;
+                               t->glosstexture = t->currentskinframe->gloss ? t->currentskinframe->gloss : r_texture_black;
+                               t->backgroundglosstexture = (t->backgroundcurrentskinframe && t->backgroundcurrentskinframe->gloss) ? t->backgroundcurrentskinframe->gloss : r_texture_black;
                                t->specularscale = r_shadow_glossintensity.value;
                        }
                }
@@ -3044,14 +3051,31 @@ void RSurf_DrawBatch_Simple(int texturenumsurfaces, msurface_t **texturesurfacel
 
 static void RSurf_DrawBatch_ShowSurfaces(int texturenumsurfaces, msurface_t **texturesurfacelist)
 {
+       int j;
        int texturesurfaceindex;
-       for (texturesurfaceindex = 0;texturesurfaceindex < texturenumsurfaces;texturesurfaceindex++)
+       if (r_showsurfaces.integer == 2)
        {
-               const msurface_t *surface = texturesurfacelist[texturesurfaceindex];
-               int k = (int)(((size_t)surface) / sizeof(msurface_t));
-               GL_Color((k & 15) * (1.0f / 16.0f) * r_view.colorscale, ((k >> 4) & 15) * (1.0f / 16.0f) * r_view.colorscale, ((k >> 8) & 15) * (1.0f / 16.0f) * r_view.colorscale, 0.2f);
-               GL_LockArrays(surface->num_firstvertex, surface->num_vertices);
-               R_Mesh_Draw(surface->num_firstvertex, surface->num_vertices, surface->num_triangles, (rsurface_model->surfmesh.data_element3i + 3 * surface->num_firsttriangle));
+               for (texturesurfaceindex = 0;texturesurfaceindex < texturenumsurfaces;texturesurfaceindex++)
+               {
+                       const msurface_t *surface = texturesurfacelist[texturesurfaceindex];
+                       for (j = 0;j < surface->num_triangles;j++)
+                       {
+                               float f = ((j + surface->num_firsttriangle) & 31) * (1.0f / 31.0f) * r_view.colorscale;
+                               GL_Color(f, f, f, 1);
+                               R_Mesh_Draw(surface->num_firstvertex, surface->num_vertices, 1, (rsurface_model->surfmesh.data_element3i + 3 * (j + surface->num_firsttriangle)));
+                       }
+               }
+       }
+       else
+       {
+               for (texturesurfaceindex = 0;texturesurfaceindex < texturenumsurfaces;texturesurfaceindex++)
+               {
+                       const msurface_t *surface = texturesurfacelist[texturesurfaceindex];
+                       int k = (int)(((size_t)surface) / sizeof(msurface_t));
+                       GL_Color((k & 15) * (1.0f / 16.0f) * r_view.colorscale, ((k >> 4) & 15) * (1.0f / 16.0f) * r_view.colorscale, ((k >> 8) & 15) * (1.0f / 16.0f) * r_view.colorscale, 1);
+                       GL_LockArrays(surface->num_firstvertex, surface->num_vertices);
+                       R_Mesh_Draw(surface->num_firstvertex, surface->num_vertices, surface->num_triangles, (rsurface_model->surfmesh.data_element3i + 3 * surface->num_firsttriangle));
+               }
        }
 }
 
@@ -3217,6 +3241,8 @@ static void RSurf_DrawBatch_Lightmap(int texturenumsurfaces, msurface_t **textur
 
 static void R_DrawTextureSurfaceList_ShowSurfaces(int texturenumsurfaces, msurface_t **texturesurfacelist)
 {
+       GL_DepthTest(!(rsurface_texture->currentmaterialflags & MATERIALFLAG_NODEPTHTEST));
+       GL_CullFace(((rsurface_texture->textureflags & Q3TEXTUREFLAG_TWOSIDED) || (rsurface_entity->flags & RENDER_NOCULLFACE)) ? GL_NONE : GL_FRONT); // quake is backwards, this culls back faces
        if (rsurface_mode != RSURFMODE_SHOWSURFACES)
        {
                rsurface_mode = RSURFMODE_SHOWSURFACES;
@@ -3249,6 +3275,8 @@ static void R_DrawTextureSurfaceList_Sky(int texturenumsurfaces, msurface_t **te
                // restore entity matrix
                R_Mesh_Matrix(&rsurface_entity->matrix);
        }
+       GL_DepthTest(!(rsurface_texture->currentmaterialflags & MATERIALFLAG_NODEPTHTEST));
+       GL_CullFace(((rsurface_texture->textureflags & Q3TEXTUREFLAG_TWOSIDED) || (rsurface_entity->flags & RENDER_NOCULLFACE)) ? GL_NONE : GL_FRONT); // quake is backwards, this culls back faces
        GL_DepthMask(true);
        // LordHavoc: HalfLife maps have freaky skypolys so don't use
        // skymasking on them, and Quake3 never did sky masking (unlike
@@ -3283,9 +3311,6 @@ static void R_DrawTextureSurfaceList_Sky(int texturenumsurfaces, msurface_t **te
 
 static void R_DrawTextureSurfaceList_GL20(int texturenumsurfaces, msurface_t **texturesurfacelist)
 {
-       int lightmode;
-       // FIXME: identify models using a better check than rsurface_model->brush.shadowmesh
-       lightmode = ((rsurface_entity->effects & EF_FULLBRIGHT) || rsurface_model->brush.shadowmesh) ? 0 : 2;
        if (rsurface_mode != RSURFMODE_GLSL)
        {
                rsurface_mode = RSURFMODE_GLSL;
@@ -3295,11 +3320,16 @@ static void R_DrawTextureSurfaceList_GL20(int texturenumsurfaces, msurface_t **t
        }
        if (rsurface_glsl_texture != rsurface_texture || rsurface_glsl_uselightmap != (rsurface_lightmaptexture != NULL))
        {
+               int lightmode;
                rsurface_glsl_texture = rsurface_texture;
-               rsurface_glsl_uselightmap = rsurface_lightmaptexture != NULL;
+               rsurface_glsl_uselightmap = rsurface_lightmaptexture != NULL && !(rsurface_texture->currentmaterialflags & MATERIALFLAG_FULLBRIGHT);
+               GL_DepthTest(!(rsurface_texture->currentmaterialflags & MATERIALFLAG_NODEPTHTEST));
+               GL_CullFace(((rsurface_texture->textureflags & Q3TEXTUREFLAG_TWOSIDED) || (rsurface_entity->flags & RENDER_NOCULLFACE)) ? GL_NONE : GL_FRONT); // quake is backwards, this culls back faces
                GL_BlendFunc(rsurface_texture->currentlayers[0].blendfunc1, rsurface_texture->currentlayers[0].blendfunc2);
                GL_DepthMask(!(rsurface_texture->currentmaterialflags & MATERIALFLAG_BLENDED));
                GL_Color(rsurface_entity->colormod[0], rsurface_entity->colormod[1], rsurface_entity->colormod[2], rsurface_texture->currentalpha);
+               // FIXME: identify models using a better check than rsurface_model->brush.shadowmesh
+               lightmode = ((rsurface_entity->effects & EF_FULLBRIGHT) || rsurface_model->brush.shadowmesh) ? 0 : 2;
                R_SetupSurfaceShader(vec3_origin, lightmode == 2);
                //permutation_deluxemapping = permutation_lightmapping = R_SetupSurfaceShader(vec3_origin, lightmode == 2, false);
                //if (r_glsl_deluxemapping.integer)
@@ -3307,35 +3337,46 @@ static void R_DrawTextureSurfaceList_GL20(int texturenumsurfaces, msurface_t **t
                R_Mesh_TexCoordPointer(0, 2, rsurface_model->surfmesh.data_texcoordtexture2f);
                R_Mesh_TexCoordPointer(4, 2, rsurface_model->surfmesh.data_texcoordlightmap2f);
                GL_AlphaTest((rsurface_texture->currentmaterialflags & MATERIALFLAG_ALPHATEST) != 0);
+               RSurf_PrepareVerticesForBatch(true, true, texturenumsurfaces, texturesurfacelist);
+               R_Mesh_TexCoordPointer(1, 3, rsurface_svector3f);
+               R_Mesh_TexCoordPointer(2, 3, rsurface_tvector3f);
+               R_Mesh_TexCoordPointer(3, 3, rsurface_normal3f);
+               if (rsurface_texture->currentmaterialflags & MATERIALFLAG_FULLBRIGHT)
+               {
+                       R_Mesh_TexBind(7, R_GetTexture(r_texture_white));
+                       if (r_glsl_permutation->loc_Texture_Deluxemap >= 0)
+                               R_Mesh_TexBind(8, R_GetTexture(r_texture_blanknormalmap));
+                       R_Mesh_ColorPointer(NULL);
+               }
+               else if (rsurface_lightmaptexture)
+               {
+                       R_Mesh_TexBind(7, R_GetTexture(rsurface_lightmaptexture));
+                       if (r_glsl_permutation->loc_Texture_Deluxemap >= 0)
+                               R_Mesh_TexBind(8, R_GetTexture(texturesurfacelist[0]->deluxemaptexture));
+                       R_Mesh_ColorPointer(NULL);
+               }
+               else
+               {
+                       R_Mesh_TexBind(7, R_GetTexture(r_texture_white));
+                       if (r_glsl_permutation->loc_Texture_Deluxemap >= 0)
+                               R_Mesh_TexBind(8, R_GetTexture(r_texture_blanknormalmap));
+                       R_Mesh_ColorPointer(rsurface_model->surfmesh.data_lightmapcolor4f);
+               }
        }
+       else
+               RSurf_PrepareVerticesForBatch(true, true, texturenumsurfaces, texturesurfacelist);
        if (!r_glsl_permutation)
                return;
-       RSurf_PrepareVerticesForBatch(true, true, texturenumsurfaces, texturesurfacelist);
-       R_Mesh_TexCoordPointer(1, 3, rsurface_svector3f);
-       R_Mesh_TexCoordPointer(2, 3, rsurface_tvector3f);
-       R_Mesh_TexCoordPointer(3, 3, rsurface_normal3f);
-       if (rsurface_texture->currentmaterialflags & MATERIALFLAG_FULLBRIGHT)
-       {
-               R_Mesh_TexBind(7, R_GetTexture(r_texture_white));
-               if (r_glsl_permutation->loc_Texture_Deluxemap >= 0)
-                       R_Mesh_TexBind(8, R_GetTexture(r_texture_blanknormalmap));
-               R_Mesh_ColorPointer(NULL);
-       }
-       else if (rsurface_lightmaptexture)
+       if (rsurface_glsl_uselightmap)
        {
                R_Mesh_TexBind(7, R_GetTexture(rsurface_lightmaptexture));
                if (r_glsl_permutation->loc_Texture_Deluxemap >= 0)
                        R_Mesh_TexBind(8, R_GetTexture(texturesurfacelist[0]->deluxemaptexture));
-               R_Mesh_ColorPointer(NULL);
        }
-       else
+       RSurf_DrawBatch_Simple(texturenumsurfaces, texturesurfacelist);
+       if (rsurface_texture->backgroundnumskinframes && !(rsurface_texture->currentmaterialflags & MATERIALFLAG_TRANSPARENT))
        {
-               R_Mesh_TexBind(7, R_GetTexture(r_texture_white));
-               if (r_glsl_permutation->loc_Texture_Deluxemap >= 0)
-                       R_Mesh_TexBind(8, R_GetTexture(r_texture_blanknormalmap));
-               R_Mesh_ColorPointer(rsurface_model->surfmesh.data_lightmapcolor4f);
        }
-       RSurf_DrawBatch_Simple(texturenumsurfaces, texturesurfacelist);
 }
 
 static void R_DrawTextureSurfaceList_GL13(int texturenumsurfaces, msurface_t **texturesurfacelist)
@@ -3349,6 +3390,8 @@ static void R_DrawTextureSurfaceList_GL13(int texturenumsurfaces, msurface_t **t
        int layerindex;
        const texturelayer_t *layer;
        CHECKGLERROR
+       GL_DepthTest(!(rsurface_texture->currentmaterialflags & MATERIALFLAG_NODEPTHTEST));
+       GL_CullFace(((rsurface_texture->textureflags & Q3TEXTUREFLAG_TWOSIDED) || (rsurface_entity->flags & RENDER_NOCULLFACE)) ? GL_NONE : GL_FRONT); // quake is backwards, this culls back faces
        // FIXME: identify models using a better check than rsurface_model->brush.shadowmesh
        lightmode = ((rsurface_entity->effects & EF_FULLBRIGHT) || rsurface_model->brush.shadowmesh) ? 0 : 2;
        if (rsurface_mode != RSURFMODE_MULTIPASS)
@@ -3465,6 +3508,8 @@ static void R_DrawTextureSurfaceList_GL11(int texturenumsurfaces, msurface_t **t
        int layerindex;
        const texturelayer_t *layer;
        CHECKGLERROR
+       GL_DepthTest(!(rsurface_texture->currentmaterialflags & MATERIALFLAG_NODEPTHTEST));
+       GL_CullFace(((rsurface_texture->textureflags & Q3TEXTUREFLAG_TWOSIDED) || (rsurface_entity->flags & RENDER_NOCULLFACE)) ? GL_NONE : GL_FRONT); // quake is backwards, this culls back faces
        // FIXME: identify models using a better check than rsurface_model->brush.shadowmesh
        lightmode = ((rsurface_entity->effects & EF_FULLBRIGHT) || rsurface_model->brush.shadowmesh) ? 0 : 2;
        if (rsurface_mode != RSURFMODE_MULTIPASS)
@@ -3581,8 +3626,6 @@ static void R_DrawTextureSurfaceList(int texturenumsurfaces, msurface_t **textur
        r_shadow_rtlight = NULL;
        r_refdef.stats.entities_surfaces += texturenumsurfaces;
        CHECKGLERROR
-       GL_DepthTest(!(rsurface_texture->currentmaterialflags & MATERIALFLAG_NODEPTHTEST));
-       GL_CullFace(((rsurface_texture->textureflags & Q3TEXTUREFLAG_TWOSIDED) || (rsurface_entity->flags & RENDER_NOCULLFACE)) ? GL_NONE : GL_FRONT); // quake is backwards, this culls back faces
        if (r_showsurfaces.integer)
                R_DrawTextureSurfaceList_ShowSurfaces(texturenumsurfaces, texturesurfacelist);
        else if (rsurface_texture->currentmaterialflags & MATERIALFLAG_SKY)
@@ -3667,13 +3710,17 @@ void R_QueueTextureSurfaceList(int texturenumsurfaces, msurface_t **texturesurfa
 extern void R_BuildLightMap(const entity_render_t *ent, msurface_t *surface);
 void R_DrawSurfaces(entity_render_t *ent, qboolean skysurfaces)
 {
-       int i, j, f, flagsmask;
+       int i, j, k, l, endj, f, flagsmask;
        int counttriangles = 0;
+       msurface_t *surface, *endsurface, **surfacechain;
        texture_t *t;
+       q3mbrush_t *brush;
        model_t *model = ent->model;
+       const int *elements;
        const int maxsurfacelist = 1024;
        int numsurfacelist = 0;
        msurface_t *surfacelist[1024];
+       vec3_t v;
        if (model == NULL)
                return;
 
@@ -3688,7 +3735,6 @@ void R_DrawSurfaces(entity_render_t *ent, qboolean skysurfaces)
        // update light styles
        if (!skysurfaces && model->brushq1.light_styleupdatechains)
        {
-               msurface_t *surface, **surfacechain;
                for (i = 0;i < model->brushq1.light_styles;i++)
                {
                        if (model->brushq1.light_stylevalue[i] != r_refdef.lightstylevalue[model->brushq1.light_style[i]])
@@ -3710,44 +3756,56 @@ void R_DrawSurfaces(entity_render_t *ent, qboolean skysurfaces)
        numsurfacelist = 0;
        if (ent == r_refdef.worldentity)
        {
-               msurface_t *surface;
-               for (i = 0, j = model->firstmodelsurface, surface = model->data_surfaces + j;i < model->nummodelsurfaces;i++, j++, surface++)
+               j = model->firstmodelsurface;
+               endj = j + model->nummodelsurfaces;
+               while (j < endj)
                {
-                       if (!r_viewcache.world_surfacevisible[j])
-                               continue;
-                       if (t != surface->texture || rsurface_lightmaptexture != surface->lightmaptexture)
+                       // quickly skip over non-visible surfaces
+                       for (;j < endj && !r_viewcache.world_surfacevisible[j];j++)
+                               ;
+                       // quickly iterate over visible surfaces
+                       for (;j < endj && r_viewcache.world_surfacevisible[j];j++)
                        {
-                               if (numsurfacelist)
+                               // process this surface
+                               surface = model->data_surfaces + j;
+                               // if texture or lightmap has changed, start a new batch
+                               if (t != surface->texture || rsurface_lightmaptexture != surface->lightmaptexture)
                                {
-                                       R_QueueTextureSurfaceList(numsurfacelist, surfacelist);
-                                       numsurfacelist = 0;
+                                       if (numsurfacelist)
+                                       {
+                                               R_QueueTextureSurfaceList(numsurfacelist, surfacelist);
+                                               numsurfacelist = 0;
+                                       }
+                                       t = surface->texture;
+                                       rsurface_lightmaptexture = surface->lightmaptexture;
+                                       rsurface_texture = t->currentframe;
+                                       f = rsurface_texture->currentmaterialflags & flagsmask;
                                }
-                               t = surface->texture;
-                               rsurface_lightmaptexture = surface->lightmaptexture;
-                               rsurface_texture = t->currentframe;
-                               f = rsurface_texture->currentmaterialflags & flagsmask;
-                       }
-                       if (f && surface->num_triangles)
-                       {
-                               // if lightmap parameters changed, rebuild lightmap texture
-                               if (surface->cached_dlight)
-                                       R_BuildLightMap(ent, surface);
-                               // add face to draw list
-                               surfacelist[numsurfacelist++] = surface;
-                               counttriangles += surface->num_triangles;
-                               if (numsurfacelist >= maxsurfacelist)
+                               // if this surface fits the criteria, add it to the list
+                               if (f && surface->num_triangles)
                                {
-                                       R_QueueTextureSurfaceList(numsurfacelist, surfacelist);
-                                       numsurfacelist = 0;
+                                       // if lightmap parameters changed, rebuild lightmap texture
+                                       if (surface->cached_dlight)
+                                               R_BuildLightMap(ent, surface);
+                                       // add face to draw list
+                                       surfacelist[numsurfacelist++] = surface;
+                                       counttriangles += surface->num_triangles;
+                                       if (numsurfacelist >= maxsurfacelist)
+                                       {
+                                               R_QueueTextureSurfaceList(numsurfacelist, surfacelist);
+                                               numsurfacelist = 0;
+                                       }
                                }
                        }
                }
        }
        else
        {
-               msurface_t *surface;
-               for (i = 0, j = model->firstmodelsurface, surface = model->data_surfaces + j;i < model->nummodelsurfaces;i++, j++, surface++)
+               surface = model->data_surfaces + model->firstmodelsurface;
+               endsurface = surface + model->nummodelsurfaces;
+               for (;surface < endsurface;surface++)
                {
+                       // if texture or lightmap has changed, start a new batch
                        if (t != surface->texture || rsurface_lightmaptexture != surface->lightmaptexture)
                        {
                                if (numsurfacelist)
@@ -3760,6 +3818,7 @@ void R_DrawSurfaces(entity_render_t *ent, qboolean skysurfaces)
                                rsurface_texture = t->currentframe;
                                f = rsurface_texture->currentmaterialflags & flagsmask;
                        }
+                       // if this surface fits the criteria, add it to the list
                        if (f && surface->num_triangles)
                        {
                                // if lightmap parameters changed, rebuild lightmap texture
@@ -3783,9 +3842,6 @@ void R_DrawSurfaces(entity_render_t *ent, qboolean skysurfaces)
 
        if (r_showcollisionbrushes.integer && model->brush.num_brushes && !skysurfaces)
        {
-               int i;
-               const msurface_t *surface;
-               q3mbrush_t *brush;
                CHECKGLERROR
                R_Mesh_Matrix(&ent->matrix);
                R_Mesh_ColorPointer(NULL);
@@ -3805,10 +3861,6 @@ void R_DrawSurfaces(entity_render_t *ent, qboolean skysurfaces)
 
        if (r_showtris.integer || r_shownormals.integer)
        {
-               int k, l;
-               msurface_t *surface;
-               const int *elements;
-               vec3_t v;
                CHECKGLERROR
                GL_DepthTest(!r_showdisabledepthtest.integer);
                GL_DepthMask(true);