X-Git-Url: https://git.xonotic.org/?a=blobdiff_plain;f=gl_rmain.c;h=49004019f351ed464262c848cb315b08ba950085;hb=3414b4e51b6a0dd029614fe0a56fa755e510c463;hp=2302d2abd526b223a71f91b22d7236e0a9c19267;hpb=713ad32580d779f7fd58a2d47c24558913593ddf;p=xonotic%2Fdarkplaces.git diff --git a/gl_rmain.c b/gl_rmain.c index 2302d2ab..49004019 100644 --- a/gl_rmain.c +++ b/gl_rmain.c @@ -105,6 +105,8 @@ cvar_t r_bloom_blur = {CVAR_SAVE, "r_bloom_blur", "8"}; cvar_t r_bloom_resolution = {CVAR_SAVE, "r_bloom_resolution", "320"}; cvar_t r_bloom_power = {CVAR_SAVE, "r_bloom_power", "4"}; +cvar_t r_smoothnormals_areaweighting = {0, "r_smoothnormals_areaweighting", "1"}; + cvar_t developer_texturelogging = {0, "developer_texturelogging", "0"}; cvar_t gl_lightmaps = {0, "gl_lightmaps", "0"}; @@ -473,7 +475,7 @@ void gl_main_newmap(void) if (cl.worldmodel) { strlcpy(entname, cl.worldmodel->name, sizeof(entname)); - l = strlen(entname) - 4; + l = (int)strlen(entname) - 4; if (l >= 0 && !strcmp(entname + l, ".bsp")) { strcpy(entname + l, ".ent"); @@ -513,6 +515,7 @@ void GL_Main_Init(void) Cvar_RegisterVariable(&r_bloom_blur); Cvar_RegisterVariable(&r_bloom_resolution); Cvar_RegisterVariable(&r_bloom_power); + Cvar_RegisterVariable(&r_smoothnormals_areaweighting); Cvar_RegisterVariable(&developer_texturelogging); Cvar_RegisterVariable(&gl_lightmaps); if (gamemode == GAME_NEHAHRA || gamemode == GAME_NEXUIZ || gamemode == GAME_TENEBRAE) @@ -1484,6 +1487,10 @@ void R_UpdateTextureInfo(const entity_render_t *ent, texture_t *t) t->currentmaterialflags |= MATERIALFLAG_ALPHA | MATERIALFLAG_TRANSPARENT; if (ent->effects & EF_NODEPTHTEST) t->currentmaterialflags |= MATERIALFLAG_NODEPTHTEST; + if (t->currentmaterialflags & MATERIALFLAG_WATER && r_waterscroll.value != 0) + t->currenttexmatrix = r_waterscrollmatrix; + else + t->currenttexmatrix = r_identitymatrix; } void R_UpdateAllTextureInfo(entity_render_t *ent) @@ -1527,7 +1534,7 @@ void RSurf_SetVertexPointer(const entity_render_t *ent, const texture_t *texture rsurface_svector3f = varray_svector3f; rsurface_tvector3f = varray_tvector3f; rsurface_normal3f = varray_normal3f; - Mod_BuildTextureVectorsAndNormals(surface->num_firstvertex, surface->num_vertices, surface->num_triangles, rsurface_vertex3f, surface->groupmesh->data_texcoordtexture2f, surface->groupmesh->data_element3i + surface->num_firsttriangle * 3, rsurface_svector3f, rsurface_tvector3f, rsurface_normal3f); + Mod_BuildTextureVectorsAndNormals(surface->num_firstvertex, surface->num_vertices, surface->num_triangles, rsurface_vertex3f, surface->groupmesh->data_texcoordtexture2f, surface->groupmesh->data_element3i + surface->num_firsttriangle * 3, rsurface_svector3f, rsurface_tvector3f, rsurface_normal3f, r_smoothnormals_areaweighting.integer); } // a single autosprite surface can contain multiple sprites... VectorClear(forward); @@ -1564,7 +1571,7 @@ void RSurf_SetVertexPointer(const entity_render_t *ent, const texture_t *texture rsurface_svector3f = varray_svector3f; rsurface_tvector3f = varray_tvector3f; rsurface_normal3f = varray_normal3f; - Mod_BuildTextureVectorsAndNormals(surface->num_firstvertex, surface->num_vertices, surface->num_triangles, rsurface_vertex3f, surface->groupmesh->data_texcoordtexture2f, surface->groupmesh->data_element3i + surface->num_firsttriangle * 3, rsurface_svector3f, rsurface_tvector3f, rsurface_normal3f); + Mod_BuildTextureVectorsAndNormals(surface->num_firstvertex, surface->num_vertices, surface->num_triangles, rsurface_vertex3f, surface->groupmesh->data_texcoordtexture2f, surface->groupmesh->data_element3i + surface->num_firsttriangle * 3, rsurface_svector3f, rsurface_tvector3f, rsurface_normal3f, r_smoothnormals_areaweighting.integer); } Matrix4x4_Transform(&ent->inversematrix, r_viewforward, forward); Matrix4x4_Transform(&ent->inversematrix, r_viewright, right); @@ -1592,24 +1599,24 @@ void RSurf_SetVertexPointer(const entity_render_t *ent, const texture_t *texture R_Mesh_VertexPointer(rsurface_vertex3f); } -void RSurf_SetColorPointer(const entity_render_t *ent, const msurface_t *surface, const vec3_t modelorg, float r, float g, float b, float a, qboolean lightmodel, qboolean vertexlight, qboolean applycolor, qboolean applyfog) +void RSurf_SetColorPointer(const entity_render_t *ent, const msurface_t *surface, const vec3_t modelorg, float r, float g, float b, float a, int lightmode, qboolean applycolor, qboolean applyfog) { int i; float f; float *v, *c, *c2; vec3_t diff; - if (lightmodel) + if (lightmode >= 2) { vec4_t ambientcolor4f; vec3_t diffusecolor; vec3_t diffusenormal; - if (R_LightModel(ambientcolor4f, diffusecolor, diffusenormal, ent, r, g, b, a, false)) + if (R_LightModel(ambientcolor4f, diffusecolor, diffusenormal, ent, r*0.5f, g*0.5f, b*0.5f, a, false)) { rsurface_lightmapcolor4f = varray_color4f; if (rsurface_normal3f == NULL) { rsurface_normal3f = varray_normal3f; - Mod_BuildNormals(surface->num_firstvertex, surface->num_vertices, surface->num_triangles, rsurface_vertex3f, surface->groupmesh->data_element3i + 3 * surface->num_firsttriangle, rsurface_normal3f); + Mod_BuildNormals(surface->num_firstvertex, surface->num_vertices, surface->num_triangles, rsurface_vertex3f, surface->groupmesh->data_element3i + 3 * surface->num_firsttriangle, rsurface_normal3f, r_smoothnormals_areaweighting.integer); } R_LightModel_CalcVertexColors(ambientcolor4f, diffusecolor, diffusenormal, surface->groupmesh->num_vertices, rsurface_vertex3f + 3 * surface->num_firstvertex, rsurface_normal3f + 3 * surface->num_firstvertex, rsurface_lightmapcolor4f + 4 * surface->num_firstvertex); r = 1; @@ -1627,7 +1634,7 @@ void RSurf_SetColorPointer(const entity_render_t *ent, const msurface_t *surface rsurface_lightmapcolor4f = NULL; } } - else if (vertexlight) + else if (lightmode >= 1) { if (surface->lightmapinfo) { @@ -1722,13 +1729,12 @@ static void R_DrawTextureSurfaceList(const entity_render_t *ent, texture_t *text qboolean doglow; qboolean dofogpass; qboolean fogallpasses; - qboolean waterscrolling; qboolean dopants; qboolean doshirt; qboolean dofullbrightpants; qboolean dofullbrightshirt; qboolean applycolor; - qboolean lightmodel = false; + qboolean lightmode = 0; rtexture_t *basetexture; rmeshstate_t m; if (texture->currentmaterialflags & MATERIALFLAG_NODRAW) @@ -1736,7 +1742,7 @@ static void R_DrawTextureSurfaceList(const entity_render_t *ent, texture_t *text c_faces += texturenumsurfaces; // FIXME: identify models using a better check than ent->model->shadowmesh if (!(ent->effects & EF_FULLBRIGHT) && !ent->model->brush.shadowmesh) - lightmodel = true; + lightmode = 2; // gl_lightmaps debugging mode skips normal texturing if (gl_lightmaps.integer) { @@ -1753,7 +1759,7 @@ static void R_DrawTextureSurfaceList(const entity_render_t *ent, texture_t *text R_Mesh_TexBind(0, R_GetTexture(surface->lightmaptexture)); R_Mesh_TexCoordPointer(0, 2, surface->groupmesh->data_texcoordlightmap2f); RSurf_SetVertexPointer(ent, texture, surface, modelorg); - RSurf_SetColorPointer(ent, surface, modelorg, 1, 1, 1, 1, lightmodel, !surface->lightmaptexture, false, false); + RSurf_SetColorPointer(ent, surface, modelorg, 1, 1, 1, 1, lightmode ? lightmode : !surface->lightmaptexture, false, false); GL_LockArrays(surface->num_firstvertex, surface->num_vertices); R_Mesh_Draw(surface->num_firstvertex, surface->num_vertices, surface->num_triangles, (surface->groupmesh->data_element3i + 3 * surface->num_firsttriangle)); GL_LockArrays(0, 0); @@ -1769,8 +1775,6 @@ static void R_DrawTextureSurfaceList(const entity_render_t *ent, texture_t *text GL_BlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); else GL_BlendFunc(GL_ONE, GL_ZERO); - // water waterscrolling in texture matrix - waterscrolling = (texture->currentmaterialflags & MATERIALFLAG_WATER) && r_waterscroll.value != 0; if (texture->textureflags & Q3TEXTUREFLAG_TWOSIDED) qglDisable(GL_CULL_FACE); if (texture->currentmaterialflags & MATERIALFLAG_SKY) @@ -1824,7 +1828,7 @@ static void R_DrawTextureSurfaceList(const entity_render_t *ent, texture_t *text m.texcombinergb[0] = GL_REPLACE; m.texcombinergb[1] = GL_REPLACE; Matrix4x4_CreateFromQuakeEntity(&m.texmatrix[0], 0, 0, 0, 0, 0, 0, r_watershader.value); - m.texmatrix[1] = r_waterscrollmatrix; + m.texmatrix[1] = texture->currenttexmatrix; R_Mesh_State(&m); GL_Color(1, 1, 1, texture->currentalpha); @@ -1890,8 +1894,7 @@ static void R_DrawTextureSurfaceList(const entity_render_t *ent, texture_t *text { memset(&m, 0, sizeof(m)); m.tex[1] = R_GetTexture(basetexture); - if (waterscrolling) - m.texmatrix[1] = r_waterscrollmatrix; + m.texmatrix[1] = texture->currenttexmatrix; m.texrgbscale[1] = 2; m.pointer_color = varray_color4f; R_Mesh_State(&m); @@ -1900,20 +1903,15 @@ static void R_DrawTextureSurfaceList(const entity_render_t *ent, texture_t *text colorscale = r_lightmapintensity; else colorscale = 1; + // q3bsp has no lightmap updates, so the lightstylevalue that + // would normally be baked into the lightmaptexture must be + // applied to the color + if (ent->model->type == mod_brushq3) + colorscale *= d_lightstylevalue[0] * (1.0f / 128.0f); r = ent->colormod[0] * colorscale; g = ent->colormod[1] * colorscale; b = ent->colormod[2] * colorscale; a = texture->currentalpha; - // q3bsp has no lightmap updates, so the lightstylevalue that - // would normally be baked into the lightmaptexture must be - // applied to the color - if (ent->model->brushq3.data_lightmaps) - { - float scale = d_lightstylevalue[0] * (1.0f / 128.0f); - r *= scale; - g *= scale; - b *= scale; - } applycolor = r != 1 || g != 1 || b != 1 || a != 1; for (texturesurfaceindex = 0;texturesurfaceindex < texturenumsurfaces;texturesurfaceindex++) { @@ -1925,13 +1923,13 @@ static void R_DrawTextureSurfaceList(const entity_render_t *ent, texture_t *text R_Mesh_TexBind(0, R_GetTexture(surface->lightmaptexture)); else R_Mesh_TexBind(0, R_GetTexture(r_texture_white)); - RSurf_SetColorPointer(ent, surface, modelorg, r, g, b, a, lightmodel, !surface->lightmaptexture, applycolor, fogallpasses); + RSurf_SetColorPointer(ent, surface, modelorg, r, g, b, a, lightmode ? lightmode : !surface->lightmaptexture, applycolor, fogallpasses); GL_LockArrays(surface->num_firstvertex, surface->num_vertices); R_Mesh_Draw(surface->num_firstvertex, surface->num_vertices, surface->num_triangles, (surface->groupmesh->data_element3i + 3 * surface->num_firsttriangle)); GL_LockArrays(0, 0); } } - else if (dolightmap && !(texture->currentmaterialflags & MATERIALFLAG_TRANSPARENT) && !lightmodel) + else if (dolightmap && !(texture->currentmaterialflags & MATERIALFLAG_TRANSPARENT) && !lightmode) { // single texture GL_BlendFunc(GL_ONE, GL_ZERO); @@ -1963,8 +1961,7 @@ static void R_DrawTextureSurfaceList(const entity_render_t *ent, texture_t *text GL_Color(r_lightmapintensity * ent->colormod[0], r_lightmapintensity * ent->colormod[1], r_lightmapintensity * ent->colormod[2], 1); memset(&m, 0, sizeof(m)); m.tex[0] = R_GetTexture(basetexture); - if (waterscrolling) - m.texmatrix[0] = r_waterscrollmatrix; + m.texmatrix[0] = texture->currenttexmatrix; R_Mesh_State(&m); for (texturesurfaceindex = 0;texturesurfaceindex < texturenumsurfaces;texturesurfaceindex++) { @@ -1980,8 +1977,7 @@ static void R_DrawTextureSurfaceList(const entity_render_t *ent, texture_t *text { memset(&m, 0, sizeof(m)); m.tex[0] = R_GetTexture(basetexture); - if (waterscrolling) - m.texmatrix[0] = r_waterscrollmatrix; + m.texmatrix[0] = texture->currenttexmatrix; m.pointer_color = varray_color4f; colorscale = 2; if (gl_combine.integer) @@ -1992,30 +1988,25 @@ static void R_DrawTextureSurfaceList(const entity_render_t *ent, texture_t *text // transparent is not affected by r_lightmapintensity if (!(texture->currentmaterialflags & MATERIALFLAG_TRANSPARENT)) colorscale *= r_lightmapintensity; + // q3bsp has no lightmap updates, so the lightstylevalue that + // would normally be baked into the lightmaptexture must be + // applied to the color + if (dolightmap && ent->model->type == mod_brushq3) + colorscale *= d_lightstylevalue[0] * (1.0f / 128.0f); R_Mesh_State(&m); r = ent->colormod[0] * colorscale; g = ent->colormod[1] * colorscale; b = ent->colormod[2] * colorscale; a = texture->currentalpha; + applycolor = r != 1 || g != 1 || b != 1 || a != 1; if (dolightmap) { - // q3bsp has no lightmap updates, so the lightstylevalue that - // would normally be baked into the lightmaptexture must be - // applied to the color - if (ent->model->brushq3.data_lightmaps) - { - float scale = d_lightstylevalue[0] * (1.0f / 128.0f); - r *= scale; - g *= scale; - b *= scale; - } - applycolor = r != 1 || g != 1 || b != 1 || a != 1; for (texturesurfaceindex = 0;texturesurfaceindex < texturenumsurfaces;texturesurfaceindex++) { surface = texturesurfacelist[texturesurfaceindex]; RSurf_SetVertexPointer(ent, texture, surface, modelorg); R_Mesh_TexCoordPointer(0, 2, surface->groupmesh->data_texcoordtexture2f); - RSurf_SetColorPointer(ent, surface, modelorg, r, g, b, a, lightmodel, true, applycolor, fogallpasses); + RSurf_SetColorPointer(ent, surface, modelorg, r, g, b, a, lightmode, applycolor, fogallpasses); GL_LockArrays(surface->num_firstvertex, surface->num_vertices); R_Mesh_Draw(surface->num_firstvertex, surface->num_vertices, surface->num_triangles, (surface->groupmesh->data_element3i + 3 * surface->num_firsttriangle)); GL_LockArrays(0, 0); @@ -2023,13 +2014,12 @@ static void R_DrawTextureSurfaceList(const entity_render_t *ent, texture_t *text } else { - applycolor = r != 1 || g != 1 || b != 1 || a != 1; for (texturesurfaceindex = 0;texturesurfaceindex < texturenumsurfaces;texturesurfaceindex++) { surface = texturesurfacelist[texturesurfaceindex]; RSurf_SetVertexPointer(ent, texture, surface, modelorg); R_Mesh_TexCoordPointer(0, 2, surface->groupmesh->data_texcoordtexture2f); - RSurf_SetColorPointer(ent, surface, modelorg, r, g, b, a, false, false, applycolor, fogallpasses); + RSurf_SetColorPointer(ent, surface, modelorg, r, g, b, a, 0, applycolor, fogallpasses); GL_LockArrays(surface->num_firstvertex, surface->num_vertices); R_Mesh_Draw(surface->num_firstvertex, surface->num_vertices, surface->num_triangles, (surface->groupmesh->data_element3i + 3 * surface->num_firsttriangle)); GL_LockArrays(0, 0); @@ -2041,42 +2031,36 @@ static void R_DrawTextureSurfaceList(const entity_render_t *ent, texture_t *text GL_BlendFunc(GL_SRC_ALPHA, GL_ONE); memset(&m, 0, sizeof(m)); m.tex[0] = R_GetTexture(texture->skin.pants); - if (waterscrolling) - m.texmatrix[0] = r_waterscrollmatrix; + m.texmatrix[0] = texture->currenttexmatrix; m.pointer_color = varray_color4f; - colorscale = 1; + colorscale = 2; if (gl_combine.integer) { m.texrgbscale[0] = 2; - colorscale *= 0.5f; + colorscale = 1; } // transparent is not affected by r_lightmapintensity if (!(texture->currentmaterialflags & MATERIALFLAG_TRANSPARENT)) colorscale *= r_lightmapintensity; + // q3bsp has no lightmap updates, so the lightstylevalue that + // would normally be baked into the lightmaptexture must be + // applied to the color + if (dolightmap && !dofullbrightpants && ent->model->type == mod_brushq3) + colorscale *= d_lightstylevalue[0] * (1.0f / 128.0f); R_Mesh_State(&m); r = ent->colormod[0] * colorpants[0] * colorscale; g = ent->colormod[1] * colorpants[1] * colorscale; b = ent->colormod[2] * colorpants[2] * colorscale; a = texture->currentalpha; + applycolor = r != 1 || g != 1 || b != 1 || a != 1; if (dolightmap && !dofullbrightpants) { - // q3bsp has no lightmap updates, so the lightstylevalue that - // would normally be baked into the lightmaptexture must be - // applied to the color - if (ent->model->brushq3.data_lightmaps) - { - float scale = d_lightstylevalue[0] * (1.0f / 128.0f); - r *= scale; - g *= scale; - b *= scale; - } - applycolor = r != 1 || g != 1 || b != 1 || a != 1; for (texturesurfaceindex = 0;texturesurfaceindex < texturenumsurfaces;texturesurfaceindex++) { surface = texturesurfacelist[texturesurfaceindex]; RSurf_SetVertexPointer(ent, texture, surface, modelorg); R_Mesh_TexCoordPointer(0, 2, surface->groupmesh->data_texcoordtexture2f); - RSurf_SetColorPointer(ent, surface, modelorg, r, g, b, a, lightmodel, true, applycolor, fogallpasses); + RSurf_SetColorPointer(ent, surface, modelorg, r, g, b, a, lightmode, applycolor, fogallpasses); GL_LockArrays(surface->num_firstvertex, surface->num_vertices); R_Mesh_Draw(surface->num_firstvertex, surface->num_vertices, surface->num_triangles, (surface->groupmesh->data_element3i + 3 * surface->num_firsttriangle)); GL_LockArrays(0, 0); @@ -2084,13 +2068,12 @@ static void R_DrawTextureSurfaceList(const entity_render_t *ent, texture_t *text } else { - applycolor = r != 1 || g != 1 || b != 1 || a != 1; for (texturesurfaceindex = 0;texturesurfaceindex < texturenumsurfaces;texturesurfaceindex++) { surface = texturesurfacelist[texturesurfaceindex]; RSurf_SetVertexPointer(ent, texture, surface, modelorg); R_Mesh_TexCoordPointer(0, 2, surface->groupmesh->data_texcoordtexture2f); - RSurf_SetColorPointer(ent, surface, modelorg, r, g, b, a, false, false, applycolor, fogallpasses); + RSurf_SetColorPointer(ent, surface, modelorg, r, g, b, a, 0, applycolor, fogallpasses); GL_LockArrays(surface->num_firstvertex, surface->num_vertices); R_Mesh_Draw(surface->num_firstvertex, surface->num_vertices, surface->num_triangles, (surface->groupmesh->data_element3i + 3 * surface->num_firsttriangle)); GL_LockArrays(0, 0); @@ -2102,42 +2085,36 @@ static void R_DrawTextureSurfaceList(const entity_render_t *ent, texture_t *text GL_BlendFunc(GL_SRC_ALPHA, GL_ONE); memset(&m, 0, sizeof(m)); m.tex[0] = R_GetTexture(texture->skin.shirt); - if (waterscrolling) - m.texmatrix[0] = r_waterscrollmatrix; + m.texmatrix[0] = texture->currenttexmatrix; m.pointer_color = varray_color4f; - colorscale = 1; + colorscale = 2; if (gl_combine.integer) { m.texrgbscale[0] = 2; - colorscale *= 0.5f; + colorscale *= 1; } // transparent is not affected by r_lightmapintensity if (!(texture->currentmaterialflags & MATERIALFLAG_TRANSPARENT)) colorscale *= r_lightmapintensity; + // q3bsp has no lightmap updates, so the lightstylevalue that + // would normally be baked into the lightmaptexture must be + // applied to the color + if (dolightmap && !dofullbrightshirt && ent->model->type == mod_brushq3) + colorscale *= d_lightstylevalue[0] * (1.0f / 128.0f); R_Mesh_State(&m); r = ent->colormod[0] * colorshirt[0] * colorscale; g = ent->colormod[1] * colorshirt[1] * colorscale; b = ent->colormod[2] * colorshirt[2] * colorscale; a = texture->currentalpha; + applycolor = r != 1 || g != 1 || b != 1 || a != 1; if (dolightmap && !dofullbrightshirt) { - // q3bsp has no lightmap updates, so the lightstylevalue that - // would normally be baked into the lightmaptexture must be - // applied to the color - if (ent->model->brushq3.data_lightmaps) - { - float scale = d_lightstylevalue[0] * (1.0f / 128.0f); - r *= scale; - g *= scale; - b *= scale; - } - applycolor = r != 1 || g != 1 || b != 1 || a != 1; for (texturesurfaceindex = 0;texturesurfaceindex < texturenumsurfaces;texturesurfaceindex++) { surface = texturesurfacelist[texturesurfaceindex]; RSurf_SetVertexPointer(ent, texture, surface, modelorg); R_Mesh_TexCoordPointer(0, 2, surface->groupmesh->data_texcoordtexture2f); - RSurf_SetColorPointer(ent, surface, modelorg, r, g, b, a, lightmodel, true, applycolor, fogallpasses); + RSurf_SetColorPointer(ent, surface, modelorg, r, g, b, a, lightmode, applycolor, fogallpasses); GL_LockArrays(surface->num_firstvertex, surface->num_vertices); R_Mesh_Draw(surface->num_firstvertex, surface->num_vertices, surface->num_triangles, (surface->groupmesh->data_element3i + 3 * surface->num_firsttriangle)); GL_LockArrays(0, 0); @@ -2145,13 +2122,12 @@ static void R_DrawTextureSurfaceList(const entity_render_t *ent, texture_t *text } else { - applycolor = r != 1 || g != 1 || b != 1 || a != 1; for (texturesurfaceindex = 0;texturesurfaceindex < texturenumsurfaces;texturesurfaceindex++) { surface = texturesurfacelist[texturesurfaceindex]; RSurf_SetVertexPointer(ent, texture, surface, modelorg); R_Mesh_TexCoordPointer(0, 2, surface->groupmesh->data_texcoordtexture2f); - RSurf_SetColorPointer(ent, surface, modelorg, r, g, b, a, false, false, applycolor, fogallpasses); + RSurf_SetColorPointer(ent, surface, modelorg, r, g, b, a, 0, applycolor, fogallpasses); GL_LockArrays(surface->num_firstvertex, surface->num_vertices); R_Mesh_Draw(surface->num_firstvertex, surface->num_vertices, surface->num_triangles, (surface->groupmesh->data_element3i + 3 * surface->num_firsttriangle)); GL_LockArrays(0, 0); @@ -2165,14 +2141,13 @@ static void R_DrawTextureSurfaceList(const entity_render_t *ent, texture_t *text GL_DepthMask(false); memset(&m, 0, sizeof(m)); m.tex[0] = R_GetTexture(texture->skin.base); - if (waterscrolling) - m.texmatrix[0] = r_waterscrollmatrix; + m.texmatrix[0] = texture->currenttexmatrix; m.pointer_color = varray_color4f; colorscale = 1; - if (gl_combine.integer) + if (gl_combine.integer && (ent->colormod[0] > 1 || ent->colormod[1] > 1 || ent->colormod[2] > 1)) { - m.texrgbscale[0] = 2; - colorscale *= 0.5f; + m.texrgbscale[0] = 4; + colorscale = 0.25f; } R_Mesh_State(&m); colorscale *= r_ambient.value * (1.0f / 64.0f); @@ -2186,7 +2161,7 @@ static void R_DrawTextureSurfaceList(const entity_render_t *ent, texture_t *text surface = texturesurfacelist[texturesurfaceindex]; RSurf_SetVertexPointer(ent, texture, surface, modelorg); R_Mesh_TexCoordPointer(0, 2, surface->groupmesh->data_texcoordtexture2f); - RSurf_SetColorPointer(ent, surface, modelorg, r, g, b, a, false, false, applycolor, fogallpasses); + RSurf_SetColorPointer(ent, surface, modelorg, r, g, b, a, 0, applycolor, fogallpasses); GL_LockArrays(surface->num_firstvertex, surface->num_vertices); R_Mesh_Draw(surface->num_firstvertex, surface->num_vertices, surface->num_triangles, (surface->groupmesh->data_element3i + 3 * surface->num_firsttriangle)); GL_LockArrays(0, 0); @@ -2217,14 +2192,12 @@ static void R_DrawTextureSurfaceList(const entity_render_t *ent, texture_t *text GL_DepthMask(false); memset(&m, 0, sizeof(m)); m.tex[0] = R_GetTexture(texture->skin.glow); - if (waterscrolling) - m.texmatrix[0] = r_waterscrollmatrix; + m.texmatrix[0] = texture->currenttexmatrix; m.pointer_color = varray_color4f; R_Mesh_State(&m); - colorscale = 1; - r = ent->colormod[0] * colorscale; - g = ent->colormod[1] * colorscale; - b = ent->colormod[2] * colorscale; + r = 1; + g = 1; + b = 1; a = texture->currentalpha; applycolor = r != 1 || g != 1 || b != 1 || a != 1; for (texturesurfaceindex = 0;texturesurfaceindex < texturenumsurfaces;texturesurfaceindex++) @@ -2232,7 +2205,7 @@ static void R_DrawTextureSurfaceList(const entity_render_t *ent, texture_t *text surface = texturesurfacelist[texturesurfaceindex]; RSurf_SetVertexPointer(ent, texture, surface, modelorg); R_Mesh_TexCoordPointer(0, 2, surface->groupmesh->data_texcoordtexture2f); - RSurf_SetColorPointer(ent, surface, modelorg, r, g, b, a, false, false, applycolor, fogallpasses); + RSurf_SetColorPointer(ent, surface, modelorg, r, g, b, a, 0, applycolor, fogallpasses); GL_LockArrays(surface->num_firstvertex, surface->num_vertices); R_Mesh_Draw(surface->num_firstvertex, surface->num_vertices, surface->num_triangles, (surface->groupmesh->data_element3i + 3 * surface->num_firsttriangle)); GL_LockArrays(0, 0); @@ -2258,8 +2231,7 @@ static void R_DrawTextureSurfaceList(const entity_render_t *ent, texture_t *text GL_DepthMask(false); memset(&m, 0, sizeof(m)); m.tex[0] = R_GetTexture(texture->skin.fog); - if (waterscrolling) - m.texmatrix[0] = r_waterscrollmatrix; + m.texmatrix[0] = texture->currenttexmatrix; R_Mesh_State(&m); r = fogcolor[0]; g = fogcolor[1];