]> git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - gl_rmain.c
beginning of vid_netwmfullscreen; does not work yet (apparently, the fullscreen windo...
[xonotic/darkplaces.git] / gl_rmain.c
index 32817b392b73125ad35f7ad99d727db5326cd006..b229b4b46501ed611d41ec646ad65a7e0b7bd065 100644 (file)
@@ -478,12 +478,12 @@ static const char *builtinshaderstring =
 "uniform vec3 Gamma;\n"
 "#endif\n"
 "//uncomment these if you want to use them:\n"
-"// uniform vec4 UserVec1;\n"
+"uniform vec4 UserVec1;\n"
 "// uniform vec4 UserVec2;\n"
 "// uniform vec4 UserVec3;\n"
 "// uniform vec4 UserVec4;\n"
 "// uniform float ClientTime;\n"
-"// uniform vec2 PixelSize;\n"
+"uniform vec2 PixelSize;\n"
 "void main(void)\n"
 "{\n"
 "      gl_FragColor = texture2D(Texture_First, gl_TexCoord[0].xy);\n"
@@ -495,7 +495,14 @@ static const char *builtinshaderstring =
 "#endif\n"
 "\n"
 "#ifdef USEPOSTPROCESSING\n"
-"// add your own postprocessing here or make your own ifdef for it\n"
+"// do r_glsl_dumpshader, edit glsl/default.glsl, and replace this by your own postprocessing if you want\n"
+"// this code does a blur with the radius specified in the first component of r_glsl_postprocess_uservec1 and blends it using the second component\n"
+"      gl_FragColor += texture2D(Texture_First, gl_TexCoord[0].xy + PixelSize*UserVec1.x*vec2(-0.987688, -0.156434)) * UserVec1.y;\n"
+"      gl_FragColor += texture2D(Texture_First, gl_TexCoord[0].xy + PixelSize*UserVec1.x*vec2(-0.156434, -0.891007)) * UserVec1.y;\n"
+"      gl_FragColor += texture2D(Texture_First, gl_TexCoord[0].xy + PixelSize*UserVec1.x*vec2( 0.891007, -0.453990)) * UserVec1.y;\n"
+"      gl_FragColor += texture2D(Texture_First, gl_TexCoord[0].xy + PixelSize*UserVec1.x*vec2( 0.707107,  0.707107)) * UserVec1.y;\n"
+"      gl_FragColor += texture2D(Texture_First, gl_TexCoord[0].xy + PixelSize*UserVec1.x*vec2(-0.453990,  0.891007)) * UserVec1.y;\n"
+"      gl_FragColor /= (1 + 5 * UserVec1.y);\n"
 "#endif\n"
 "\n"
 "#ifdef USEGAMMARAMPS\n"
@@ -1905,6 +1912,41 @@ skinframe_t *R_SkinFrame_Find(const char *name, int textureflags, int comparewid
        return item;
 }
 
+#define R_SKINFRAME_LOAD_AVERAGE_COLORS(cnt, getpixel) \
+       { \
+               unsigned long long avgcolor[5], wsum; \
+               int pix, comp, w; \
+               avgcolor[0] = 0; \
+               avgcolor[1] = 0; \
+               avgcolor[2] = 0; \
+               avgcolor[3] = 0; \
+               avgcolor[4] = 0; \
+               wsum = 0; \
+               for(pix = 0; pix < cnt; ++pix) \
+               { \
+                       w = 0; \
+                       for(comp = 0; comp < 3; ++comp) \
+                               w += getpixel; \
+                       if(w) /* ignore perfectly black pixels because that is better for model skins */ \
+                       { \
+                               ++wsum; \
+                               /* comp = 3; -- not needed, comp is always 3 when we get here */ \
+                               w = getpixel; \
+                               for(comp = 0; comp < 3; ++comp) \
+                                       avgcolor[comp] += getpixel * w; \
+                               avgcolor[3] += w; \
+                       } \
+                       /* comp = 3; -- not needed, comp is always 3 when we get here */ \
+                       avgcolor[4] += getpixel; \
+               } \
+               if(avgcolor[3] == 0) /* no pixels seen? even worse */ \
+                       avgcolor[3] = 1; \
+               skinframe->avgcolor[0] = avgcolor[2] / (255.0 * avgcolor[3]); \
+               skinframe->avgcolor[1] = avgcolor[1] / (255.0 * avgcolor[3]); \
+               skinframe->avgcolor[2] = avgcolor[0] / (255.0 * avgcolor[3]); \
+               skinframe->avgcolor[3] = avgcolor[4] / (255.0 * cnt); \
+       }
+
 skinframe_t *R_SkinFrame_LoadExternal_CheckAlpha(const char *name, int textureflags, qboolean complain, qboolean *has_alpha)
 {
        // FIXME: it should be possible to disable loading various layers using
@@ -1921,7 +1963,6 @@ skinframe_t *R_SkinFrame_LoadExternal_CheckAlpha(const char *name, int texturefl
        int basepixels_width;
        int basepixels_height;
        skinframe_t *skinframe;
-       double avgcolor[5], w, wsum;
 
        *has_alpha = false;
 
@@ -1981,34 +2022,8 @@ skinframe_t *R_SkinFrame_LoadExternal_CheckAlpha(const char *name, int texturefl
                }
        }
 
-       avgcolor[0] = 0;
-       avgcolor[1] = 0;
-       avgcolor[2] = 0;
-       avgcolor[3] = 0;
-       avgcolor[4] = 0;
-       wsum = 0;
-       for(j = 0; j < basepixels_width * basepixels_height * 4; j += 4)
-       {
-               w = (int)basepixels[j + 0] + (int)basepixels[j + 1] + (int)basepixels[j + 2]; // use this weight, so black pixels don't contribute (needed for model skins)
-               avgcolor[2] += basepixels[j + 0] * w;
-               avgcolor[1] += basepixels[j + 1] * w;
-               avgcolor[0] += basepixels[j + 2] * w;
-               avgcolor[3] += basepixels[j + 3] * w;
-               avgcolor[4] += basepixels[j + 3];
-               wsum += w;
-       }
-       if(avgcolor[3] == 0) // just fully transparent pixels seen? bad luck...
-               avgcolor[3] = 255.0 * wsum;
-       if(avgcolor[3] == 0) // no pixels seen? even worse
-               avgcolor[3] = 1;
-       avgcolor[0] /= avgcolor[3];
-       avgcolor[1] /= avgcolor[3];
-       avgcolor[2] /= avgcolor[3];
-       avgcolor[3] /= 255.0 * wsum; // to 0..1 range
-       skinframe->avgcolor[0] = avgcolor[0];
-       skinframe->avgcolor[1] = avgcolor[1];
-       skinframe->avgcolor[2] = avgcolor[2];
-       skinframe->avgcolor[3] = avgcolor[4] / (basepixels_width * 255.0 * basepixels_height);
+       R_SKINFRAME_LOAD_AVERAGE_COLORS(basepixels_width * basepixels_height, basepixels[4 * pix + comp]);
+       //Con_Printf("Texture %s has average colors %f %f %f alpha %f\n", name, skinframe->avgcolor[0], skinframe->avgcolor[1], skinframe->avgcolor[2], skinframe->avgcolor[3]);
 
        // _norm is the name used by tenebrae and has been adopted as standard
        if (loadnormalmap)
@@ -2075,8 +2090,6 @@ skinframe_t *R_SkinFrame_LoadInternalBGRA(const char *name, int textureflags, co
        int i;
        unsigned char *temp1, *temp2;
        skinframe_t *skinframe;
-       double avgcolor[5], w, wsum;
-       int j;
 
        if (cls.state == ca_dedicated)
                return NULL;
@@ -2128,34 +2141,8 @@ skinframe_t *R_SkinFrame_LoadInternalBGRA(const char *name, int textureflags, co
                }
        }
 
-       avgcolor[0] = 0;
-       avgcolor[1] = 0;
-       avgcolor[2] = 0;
-       avgcolor[3] = 0;
-       avgcolor[4] = 0;
-       wsum = 0;
-       for(j = 0; j < width * height * 4; j += 4)
-       {
-               w = (int)skindata[j + 0] + (int)skindata[j + 1] + (int)skindata[j + 2];
-               avgcolor[2] += skindata[j + 0] * w;
-               avgcolor[1] += skindata[j + 1] * w;
-               avgcolor[0] += skindata[j + 2] * w;
-               avgcolor[3] += skindata[j + 3] * w;
-               avgcolor[4] += skindata[j + 3];
-               wsum += w;
-       }
-       if(avgcolor[3] == 0) // just fully transparent pixels seen? bad luck...
-               avgcolor[3] = 255.0 * wsum;
-       if(avgcolor[3] == 0) // no pixels seen? even worse
-               avgcolor[3] = 1;
-       avgcolor[0] /= avgcolor[3];
-       avgcolor[1] /= avgcolor[3];
-       avgcolor[2] /= avgcolor[3];
-       avgcolor[3] /= 255.0 * wsum; // to 0..1 range
-       skinframe->avgcolor[0] = avgcolor[0];
-       skinframe->avgcolor[1] = avgcolor[1];
-       skinframe->avgcolor[2] = avgcolor[2];
-       skinframe->avgcolor[3] = avgcolor[4] / (width * 255.0 * height);
+       R_SKINFRAME_LOAD_AVERAGE_COLORS(width * height, skindata[4 * pix + comp]);
+       //Con_Printf("Texture %s has average colors %f %f %f alpha %f\n", name, skinframe->avgcolor[0], skinframe->avgcolor[1], skinframe->avgcolor[2], skinframe->avgcolor[3]);
 
        return skinframe;
 }
@@ -2164,9 +2151,8 @@ skinframe_t *R_SkinFrame_LoadInternalQuake(const char *name, int textureflags, i
 {
        int i;
        unsigned char *temp1, *temp2;
+       unsigned int *palette;
        skinframe_t *skinframe;
-       double avgcolor[5], w, wsum;
-       int j;
 
        if (cls.state == ca_dedicated)
                return NULL;
@@ -2176,6 +2162,8 @@ skinframe_t *R_SkinFrame_LoadInternalQuake(const char *name, int textureflags, i
        if (skinframe && skinframe->base)
                return skinframe;
 
+       palette = (loadglowtexture ? palette_bgra_nofullbrights : ((skinframe->textureflags & TEXF_ALPHA) ? palette_bgra_transparent : palette_bgra_complete));
+
        skinframe->stain = NULL;
        skinframe->merged = NULL;
        skinframe->base = r_texture_notexture;
@@ -2204,7 +2192,7 @@ skinframe_t *R_SkinFrame_LoadInternalQuake(const char *name, int textureflags, i
                Mem_Free(temp1);
        }
        // use either a custom palette, or the quake palette
-       skinframe->base = skinframe->merged = R_SkinFrame_TextureForSkinLayer(skindata, width, height, va("%s_merged", skinframe->basename), (loadglowtexture ? palette_bgra_nofullbrights : ((skinframe->textureflags & TEXF_ALPHA) ? palette_bgra_transparent : palette_bgra_complete)), skinframe->textureflags, true); // all
+       skinframe->base = skinframe->merged = R_SkinFrame_TextureForSkinLayer(skindata, width, height, va("%s_merged", skinframe->basename), palette, skinframe->textureflags, true); // all
        if (loadglowtexture)
                skinframe->glow = R_SkinFrame_TextureForSkinLayer(skindata, width, height, va("%s_glow", skinframe->basename), palette_bgra_onlyfullbrights, skinframe->textureflags, false); // glow
        if (loadpantsandshirt)
@@ -2223,35 +2211,8 @@ skinframe_t *R_SkinFrame_LoadInternalQuake(const char *name, int textureflags, i
                        skinframe->fog = R_SkinFrame_TextureForSkinLayer(skindata, width, height, va("%s_fog", skinframe->basename), palette_bgra_alpha, skinframe->textureflags, true); // fog mask
        }
 
-       avgcolor[0] = 0;
-       avgcolor[1] = 0;
-       avgcolor[2] = 0;
-       avgcolor[3] = 0;
-       avgcolor[4] = 0;
-       wsum = 0;
-       for(j = 0; j < width * height; ++j)
-       {
-               temp1 = ((unsigned char *)palette_bgra_alpha) + (skindata[j]*4);
-               w = (int)temp1[0] + (int)temp1[1] + (int)temp1[2];
-               avgcolor[2] += temp1[0] * w;
-               avgcolor[1] += temp1[1] * w;
-               avgcolor[0] += temp1[2] * w;
-               avgcolor[3] += temp1[3] * w;
-               avgcolor[4] += temp1[3];
-               wsum += w;
-       }
-       if(avgcolor[3] == 0) // just fully transparent pixels seen? bad luck...
-               avgcolor[3] = 255.0 * wsum;
-       if(avgcolor[3] == 0) // no pixels seen? even worse
-               avgcolor[3] = 1;
-       avgcolor[0] /= avgcolor[3];
-       avgcolor[1] /= avgcolor[3];
-       avgcolor[2] /= avgcolor[3];
-       avgcolor[3] /= 255.0 * wsum; // to 0..1 range
-       skinframe->avgcolor[0] = avgcolor[0];
-       skinframe->avgcolor[1] = avgcolor[1];
-       skinframe->avgcolor[2] = avgcolor[2];
-       skinframe->avgcolor[3] = avgcolor[4] / (width * 255.0 * height);
+       R_SKINFRAME_LOAD_AVERAGE_COLORS(width * height, ((unsigned char *)palette)[skindata[pix]*4 + comp]);
+       //Con_Printf("Texture %s has average colors %f %f %f alpha %f\n", name, skinframe->avgcolor[0], skinframe->avgcolor[1], skinframe->avgcolor[2], skinframe->avgcolor[3]);
 
        return skinframe;
 }
@@ -5779,6 +5740,27 @@ static void RSurf_DrawBatch_ShowSurfaces(int texturenumsurfaces, msurface_t **te
        }
 }
 
+static void RSurf_DrawBatch_GL11_MakeFullbrightLightmapColorArray(int texturenumsurfaces, msurface_t **texturesurfacelist)
+{
+       int texturesurfaceindex;
+       int i;
+       float *v, *c2;
+       for (texturesurfaceindex = 0;texturesurfaceindex < texturenumsurfaces;texturesurfaceindex++)
+       {
+               const msurface_t *surface = texturesurfacelist[texturesurfaceindex];
+               for (i = 0, v = (rsurface.vertex3f + 3 * surface->num_firstvertex), c2 = (rsurface.array_color4f + 4 * surface->num_firstvertex);i < surface->num_vertices;i++, v += 3, c2 += 4)
+               {
+                       c2[0] = 0.5;
+                       c2[1] = 0.5;
+                       c2[2] = 0.5;
+                       c2[3] = 1;
+               }
+       }
+       rsurface.lightmapcolor4f = rsurface.array_color4f;
+       rsurface.lightmapcolor4f_bufferobject = 0;
+       rsurface.lightmapcolor4f_bufferoffset = 0;
+}
+
 static void RSurf_DrawBatch_GL11_ApplyFog(int texturenumsurfaces, msurface_t **texturesurfacelist)
 {
        int texturesurfaceindex;
@@ -5821,6 +5803,32 @@ static void RSurf_DrawBatch_GL11_ApplyFog(int texturenumsurfaces, msurface_t **t
        rsurface.lightmapcolor4f_bufferoffset = 0;
 }
 
+static void RSurf_DrawBatch_GL11_ApplyFogToFinishedVertexColors(int texturenumsurfaces, msurface_t **texturesurfacelist)
+{
+       int texturesurfaceindex;
+       int i;
+       float f;
+       float *v, *c, *c2;
+       if (!rsurface.lightmapcolor4f)
+               return;
+       // generate color arrays for the surfaces in this list
+       for (texturesurfaceindex = 0;texturesurfaceindex < texturenumsurfaces;texturesurfaceindex++)
+       {
+               const msurface_t *surface = texturesurfacelist[texturesurfaceindex];
+               for (i = 0, v = (rsurface.vertex3f + 3 * surface->num_firstvertex), c = (rsurface.lightmapcolor4f + 4 * surface->num_firstvertex), c2 = (rsurface.array_color4f + 4 * surface->num_firstvertex);i < surface->num_vertices;i++, v += 3, c += 4, c2 += 4)
+               {
+                       f = FogPoint_Model(v);
+                       c2[0] = c[0] * f + r_refdef.fogcolor[0] * (1 - f);
+                       c2[1] = c[1] * f + r_refdef.fogcolor[1] * (1 - f);
+                       c2[2] = c[2] * f + r_refdef.fogcolor[2] * (1 - f);
+                       c2[3] = c[3];
+               }
+       }
+       rsurface.lightmapcolor4f = rsurface.array_color4f;
+       rsurface.lightmapcolor4f_bufferobject = 0;
+       rsurface.lightmapcolor4f_bufferoffset = 0;
+}
+
 static void RSurf_DrawBatch_GL11_ApplyColor(int texturenumsurfaces, msurface_t **texturesurfacelist, float r, float g, float b, float a)
 {
        int texturesurfaceindex;
@@ -5856,9 +5864,9 @@ static void RSurf_DrawBatch_GL11_ApplyAmbient(int texturenumsurfaces, msurface_t
                const msurface_t *surface = texturesurfacelist[texturesurfaceindex];
                for (i = 0, c = (rsurface.lightmapcolor4f + 4 * surface->num_firstvertex), c2 = (rsurface.array_color4f + 4 * surface->num_firstvertex);i < surface->num_vertices;i++, c += 4, c2 += 4)
                {
-                       c2[0] = c[0] + r_refdef.scene.ambient / 64.0;
-                       c2[1] = c[1] + r_refdef.scene.ambient / 64.0;
-                       c2[2] = c[2] + r_refdef.scene.ambient / 64.0;
+                       c2[0] = c[0] + r_refdef.scene.ambient / 128.0;
+                       c2[1] = c[1] + r_refdef.scene.ambient / 128.0;
+                       c2[2] = c[2] + r_refdef.scene.ambient / 128.0;
                        c2[3] = c[3];
                }
        }
@@ -5955,12 +5963,12 @@ static void RSurf_DrawBatch_GL11_VertexColor(int texturenumsurfaces, msurface_t
        RSurf_DrawBatch_Simple(texturenumsurfaces, texturesurfacelist);
 }
 
-static void RSurf_DrawBatch_GL11_VertexShade(int texturenumsurfaces, msurface_t **texturesurfacelist, float r, float g, float b, float a, qboolean applycolor, qboolean applyfog)
+static void RSurf_DrawBatch_GL11_ApplyVertexShade(int texturenumsurfaces, msurface_t **texturesurfacelist, float *r, float *g, float *b, float *a, qboolean *applycolor)
 {
        int texturesurfaceindex;
        int i;
        float f;
-       float *v, *c, *c2;
+       float *v, *c, *c2, alpha;
        vec3_t ambientcolor;
        vec3_t diffusecolor;
        vec3_t lightdir;
@@ -5968,12 +5976,13 @@ static void RSurf_DrawBatch_GL11_VertexShade(int texturenumsurfaces, msurface_t
        // model lighting
        VectorCopy(rsurface.modellight_lightdir, lightdir);
        f = 0.5f * r_refdef.lightmapintensity;
-       ambientcolor[0] = rsurface.modellight_ambient[0] * r * f;
-       ambientcolor[1] = rsurface.modellight_ambient[1] * g * f;
-       ambientcolor[2] = rsurface.modellight_ambient[2] * b * f;
-       diffusecolor[0] = rsurface.modellight_diffuse[0] * r * f;
-       diffusecolor[1] = rsurface.modellight_diffuse[1] * g * f;
-       diffusecolor[2] = rsurface.modellight_diffuse[2] * b * f;
+       ambientcolor[0] = rsurface.modellight_ambient[0] * *r * f;
+       ambientcolor[1] = rsurface.modellight_ambient[1] * *g * f;
+       ambientcolor[2] = rsurface.modellight_ambient[2] * *b * f;
+       diffusecolor[0] = rsurface.modellight_diffuse[0] * *r * f;
+       diffusecolor[1] = rsurface.modellight_diffuse[1] * *g * f;
+       diffusecolor[2] = rsurface.modellight_diffuse[2] * *b * f;
+       alpha = *a;
        if (VectorLength2(diffusecolor) > 0 && rsurface.normal3f)
        {
                // generate color arrays for the surfaces in this list
@@ -5991,27 +6000,32 @@ static void RSurf_DrawBatch_GL11_VertexShade(int texturenumsurfaces, msurface_t
                                        VectorMA(ambientcolor, f, diffusecolor, c);
                                else
                                        VectorCopy(ambientcolor, c);
-                               c[3] = a;
+                               c[3] = alpha;
                        }
                }
-               r = 1;
-               g = 1;
-               b = 1;
-               a = 1;
-               applycolor = false;
+               *r = 1;
+               *g = 1;
+               *b = 1;
+               *a = 1;
                rsurface.lightmapcolor4f = rsurface.array_color4f;
                rsurface.lightmapcolor4f_bufferobject = 0;
                rsurface.lightmapcolor4f_bufferoffset = 0;
+               *applycolor = false;
        }
        else
        {
-               r = ambientcolor[0];
-               g = ambientcolor[1];
-               b = ambientcolor[2];
+               *r = ambientcolor[0];
+               *g = ambientcolor[1];
+               *b = ambientcolor[2];
                rsurface.lightmapcolor4f = NULL;
                rsurface.lightmapcolor4f_bufferobject = 0;
                rsurface.lightmapcolor4f_bufferoffset = 0;
        }
+}
+
+static void RSurf_DrawBatch_GL11_VertexShade(int texturenumsurfaces, msurface_t **texturesurfacelist, float r, float g, float b, float a, qboolean applycolor, qboolean applyfog)
+{
+       RSurf_DrawBatch_GL11_ApplyVertexShade(texturenumsurfaces, texturesurfacelist, &r, &g, &b, &a, &applycolor);
        if (applyfog)   RSurf_DrawBatch_GL11_ApplyFog(texturenumsurfaces, texturesurfacelist);
        if (applycolor) RSurf_DrawBatch_GL11_ApplyColor(texturenumsurfaces, texturesurfacelist, r, g, b, a);
        R_Mesh_ColorPointer(rsurface.lightmapcolor4f, rsurface.lightmapcolor4f_bufferobject, rsurface.lightmapcolor4f_bufferoffset);
@@ -6455,18 +6469,18 @@ static void R_DrawTextureSurfaceList_ShowSurfaces3(int texturenumsurfaces, msurf
                c[3] = 1;
        }
 
-       // brighten it up (as texture value 127 means "unlit")
-       c[0] *= 2;
-       c[1] *= 2;
-       c[2] *= 2;
-
        if (rsurface.texture->currentskinframe->pants || rsurface.texture->currentskinframe->shirt)
        {
-               c[0] = rsurface.colormap_pantscolor[0] * 0.3 + rsurface.colormap_shirtcolor[0] * 0.7;
-               c[1] = rsurface.colormap_pantscolor[1] * 0.3 + rsurface.colormap_shirtcolor[1] * 0.7;
-               c[2] = rsurface.colormap_pantscolor[2] * 0.3 + rsurface.colormap_shirtcolor[2] * 0.7;
+               c[0] = 0.5 * (rsurface.colormap_pantscolor[0] * 0.3 + rsurface.colormap_shirtcolor[0] * 0.7);
+               c[1] = 0.5 * (rsurface.colormap_pantscolor[1] * 0.3 + rsurface.colormap_shirtcolor[1] * 0.7);
+               c[2] = 0.5 * (rsurface.colormap_pantscolor[2] * 0.3 + rsurface.colormap_shirtcolor[2] * 0.7);
        }
 
+       // brighten it up (as texture value 127 means "unlit")
+       c[0] *= 2 * r_refdef.view.colorscale;
+       c[1] *= 2 * r_refdef.view.colorscale;
+       c[2] *= 2 * r_refdef.view.colorscale;
+
        if(rsurface.texture->currentmaterialflags & MATERIALFLAG_WATERALPHA)
                c[3] *= r_wateralpha.value;
 
@@ -6496,25 +6510,46 @@ static void R_DrawTextureSurfaceList_ShowSurfaces3(int texturenumsurfaces, msurf
                GL_DepthMask(writedepth);
        }
 
-       rsurface.lightmapcolor4f = rsurface.modellightmapcolor4f;
-       rsurface.lightmapcolor4f_bufferobject = rsurface.modellightmapcolor4f_bufferobject;
-       rsurface.lightmapcolor4f_bufferoffset = rsurface.modellightmapcolor4f_bufferoffset;
-       RSurf_DrawBatch_GL11_ApplyAmbient(texturenumsurfaces, texturesurfacelist);
-       RSurf_DrawBatch_GL11_ApplyColor(texturenumsurfaces, texturesurfacelist, c[0], c[1], c[2], c[3]);
+       rsurface.lightmapcolor4f = NULL;
 
-       if (rsurface.texture->currentmaterialflags & MATERIALFLAG_MODELLIGHT)
+       if (rsurface.texture->currentmaterialflags & MATERIALFLAG_FULLBRIGHT)
+       {
+               RSurf_PrepareVerticesForBatch(false, false, texturenumsurfaces, texturesurfacelist);
+
+               rsurface.lightmapcolor4f = NULL;
+               rsurface.lightmapcolor4f_bufferobject = 0;
+               rsurface.lightmapcolor4f_bufferoffset = 0;
+       }
+       else if (rsurface.texture->currentmaterialflags & MATERIALFLAG_MODELLIGHT)
        {
+               qboolean applycolor = true;
+               float one = 1.0;
+
                RSurf_PrepareVerticesForBatch(true, false, texturenumsurfaces, texturesurfacelist);
+
                r_refdef.lightmapintensity = 1;
-               RSurf_DrawBatch_GL11_VertexShade(texturenumsurfaces, texturesurfacelist, c[0], c[1], c[2], c[3], false, false);
+               RSurf_DrawBatch_GL11_ApplyVertexShade(texturenumsurfaces, texturesurfacelist, &one, &one, &one, &one, &applycolor);
                r_refdef.lightmapintensity = 0; // we're in showsurfaces, after all
        }
        else
        {
                RSurf_PrepareVerticesForBatch(false, false, texturenumsurfaces, texturesurfacelist);
-               R_Mesh_ColorPointer(rsurface.lightmapcolor4f, rsurface.lightmapcolor4f_bufferobject, rsurface.lightmapcolor4f_bufferoffset);
-               RSurf_DrawBatch_Simple(texturenumsurfaces, texturesurfacelist);
+
+               rsurface.lightmapcolor4f = rsurface.modellightmapcolor4f;
+               rsurface.lightmapcolor4f_bufferobject = rsurface.modellightmapcolor4f_bufferobject;
+               rsurface.lightmapcolor4f_bufferoffset = rsurface.modellightmapcolor4f_bufferoffset;
        }
+
+       if(!rsurface.lightmapcolor4f)
+               RSurf_DrawBatch_GL11_MakeFullbrightLightmapColorArray(texturenumsurfaces, texturesurfacelist);
+
+       RSurf_DrawBatch_GL11_ApplyAmbient(texturenumsurfaces, texturesurfacelist);
+       RSurf_DrawBatch_GL11_ApplyColor(texturenumsurfaces, texturesurfacelist, c[0], c[1], c[2], c[3]);
+       if(r_refdef.fogenabled)
+               RSurf_DrawBatch_GL11_ApplyFogToFinishedVertexColors(texturenumsurfaces, texturesurfacelist);
+
+       R_Mesh_ColorPointer(rsurface.lightmapcolor4f, rsurface.lightmapcolor4f_bufferobject, rsurface.lightmapcolor4f_bufferoffset);
+       RSurf_DrawBatch_Simple(texturenumsurfaces, texturesurfacelist);
 }
 
 static void R_DrawTextureSurfaceList(int texturenumsurfaces, msurface_t **texturesurfacelist, qboolean writedepth)