X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=gl_rmain.c;h=b2c5683df8c1dd7e8418690658d8a99e4020c5b4;hb=9e279d8ea4a631713d98132cd1b01338e81f5c0b;hp=d8970209ef4725c999e12ea3e2ba284eeca5faf2;hpb=e537c2269e790f67f68556ded6b7cf62c55874dd;p=xonotic%2Fdarkplaces.git diff --git a/gl_rmain.c b/gl_rmain.c index d8970209..b2c5683d 100644 --- a/gl_rmain.c +++ b/gl_rmain.c @@ -69,44 +69,50 @@ matrix4x4_t r_view_matrix; // refdef_t r_refdef; -cvar_t r_showtris = {0, "r_showtris", "0"}; -cvar_t r_shownormals = {0, "r_shownormals", "0"}; -cvar_t r_drawentities = {0, "r_drawentities","1"}; -cvar_t r_drawviewmodel = {0, "r_drawviewmodel","1"}; -cvar_t r_speeds = {0, "r_speeds","0"}; -cvar_t r_fullbright = {0, "r_fullbright","0"}; -cvar_t r_wateralpha = {CVAR_SAVE, "r_wateralpha","1"}; -cvar_t r_dynamic = {CVAR_SAVE, "r_dynamic","1"}; -cvar_t r_fullbrights = {CVAR_SAVE, "r_fullbrights", "1"}; -cvar_t r_drawcollisionbrushes = {0, "r_drawcollisionbrushes", "0"}; - -cvar_t gl_fogenable = {0, "gl_fogenable", "0"}; -cvar_t gl_fogdensity = {0, "gl_fogdensity", "0.25"}; -cvar_t gl_fogred = {0, "gl_fogred","0.3"}; -cvar_t gl_foggreen = {0, "gl_foggreen","0.3"}; -cvar_t gl_fogblue = {0, "gl_fogblue","0.3"}; -cvar_t gl_fogstart = {0, "gl_fogstart", "0"}; -cvar_t gl_fogend = {0, "gl_fogend","0"}; - -cvar_t r_textureunits = {0, "r_textureunits", "32"}; - -cvar_t r_lerpsprites = {CVAR_SAVE, "r_lerpsprites", "1"}; -cvar_t r_lerpmodels = {CVAR_SAVE, "r_lerpmodels", "1"}; -cvar_t r_waterscroll = {CVAR_SAVE, "r_waterscroll", "1"}; - -cvar_t r_bloom = {CVAR_SAVE, "r_bloom", "0"}; -cvar_t r_bloom_intensity = {CVAR_SAVE, "r_bloom_intensity", "1.5"}; -cvar_t r_bloom_blur = {CVAR_SAVE, "r_bloom_blur", "4"}; -cvar_t r_bloom_resolution = {CVAR_SAVE, "r_bloom_resolution", "320"}; -cvar_t r_bloom_power = {CVAR_SAVE, "r_bloom_power", "2"}; - -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"}; - -cvar_t r_test = {0, "r_test", "0"}; // used for testing renderer code changes, otherwise does nothing +cvar_t r_showtris = {0, "r_showtris", "0", "shows triangle outlines, value controls brightness (can be above 1)"}; +cvar_t r_showtris_polygonoffset = {0, "r_showtris_polygonoffset", "-10", "nudges triangle outlines in hardware depth units, used to make outlines appear infront of walls"}; +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"}; +cvar_t r_showshadowvolumes = {0, "r_showshadowvolumes", "0", "shows areas shadowed by lights, useful for finding out why some areas of a map render slowly (bright blue = lots of passes = slow), a value of 2 disables depth testing which can be interesting but not very useful"}; +cvar_t r_showcollisionbrushes = {0, "r_showcollisionbrushes", "0", "draws collision brushes in quake3 maps (mode 1), mode 2 disables rendering of world (trippy!)"}; +cvar_t r_showcollisionbrushes_polygonfactor = {0, "r_showcollisionbrushes_polygonfactor", "-1", "expands outward the brush polygons a little bit, used to make collision brushes appear infront of walls"}; +cvar_t r_showcollisionbrushes_polygonoffset = {0, "r_showcollisionbrushes_polygonoffset", "0", "nudges brush polygon depth in hardware depth units, used to make collision brushes appear infront of walls"}; +cvar_t r_showdisabledepthtest = {0, "r_showdisabledepthtest", "0", "disables depth testing on r_show* cvars, allowing you to see what hidden geometry the graphics card is processing\n"}; +cvar_t r_drawentities = {0, "r_drawentities","1", "draw entities (doors, players, projectiles, etc)"}; +cvar_t r_drawviewmodel = {0, "r_drawviewmodel","1", "draw your weapon model"}; +cvar_t r_speeds = {0, "r_speeds","0", "displays rendering statistics and per-subsystem timings"}; +cvar_t r_fullbright = {0, "r_fullbright","0", "make everything bright cheat (not allowed in multiplayer)"}; +cvar_t r_wateralpha = {CVAR_SAVE, "r_wateralpha","1", "opacity of water polygons"}; +cvar_t r_dynamic = {CVAR_SAVE, "r_dynamic","1", "enables dynamic lights (rocket glow and such)"}; +cvar_t r_fullbrights = {CVAR_SAVE, "r_fullbrights", "1", "enables glowing pixels in quake textures (changes need r_restart to take effect)"}; + +cvar_t gl_fogenable = {0, "gl_fogenable", "0", "nehahra fog enable (for Nehahra compatibility only)"}; +cvar_t gl_fogdensity = {0, "gl_fogdensity", "0.25", "nehahra fog density (recommend values below 0.1) (for Nehahra compatibility only)"}; +cvar_t gl_fogred = {0, "gl_fogred","0.3", "nehahra fog color red value (for Nehahra compatibility only)"}; +cvar_t gl_foggreen = {0, "gl_foggreen","0.3", "nehahra fog color green value (for Nehahra compatibility only)"}; +cvar_t gl_fogblue = {0, "gl_fogblue","0.3", "nehahra fog color blue value (for Nehahra compatibility only)"}; +cvar_t gl_fogstart = {0, "gl_fogstart", "0", "nehahra fog start distance (for Nehahra compatibility only)"}; +cvar_t gl_fogend = {0, "gl_fogend","0", "nehahra fog end distance (for Nehahra compatibility only)"}; + +cvar_t r_textureunits = {0, "r_textureunits", "32", "number of hardware texture units reported by driver (note: setting this to 1 turns off gl_combine)"}; + +cvar_t r_lerpsprites = {CVAR_SAVE, "r_lerpsprites", "1", "enables animation smoothing on sprites (requires r_lerpmodels 1)"}; +cvar_t r_lerpmodels = {CVAR_SAVE, "r_lerpmodels", "1", "enables animation smoothing on models"}; +cvar_t r_waterscroll = {CVAR_SAVE, "r_waterscroll", "1", "makes water scroll around, value controls how much"}; + +cvar_t r_bloom = {CVAR_SAVE, "r_bloom", "0", "enables bloom effect (makes bright pixels affect neighboring pixels)"}; +cvar_t r_bloom_intensity = {CVAR_SAVE, "r_bloom_intensity", "1.5", "how bright the glow is"}; +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_power = {CVAR_SAVE, "r_bloom_power", "2", "how much to darken the image before blurring to make the bloom effect"}; + +cvar_t r_smoothnormals_areaweighting = {0, "r_smoothnormals_areaweighting", "1", "uses significantly faster (and supposedly higher quality) area-weighted vertex normals and tangent vectors rather than summing normalized triangle normals and tangents"}; + +cvar_t developer_texturelogging = {0, "developer_texturelogging", "0", "produces a textures.log file containing names of skins and map textures the engine tried to load"}; + +cvar_t gl_lightmaps = {0, "gl_lightmaps", "0", "draws only lightmaps, no texture (for level designers)"}; + +cvar_t r_test = {0, "r_test", "0", "internal development use only, leave it alone (usually does nothing anyway)"}; // used for testing renderer code changes, otherwise does nothing rtexturepool_t *r_main_texturepool; rtexture_t *r_bloom_texture_screen; @@ -448,7 +454,14 @@ void GL_Main_Init(void) // FIXME: move this to client? FOG_registercvars(); Cvar_RegisterVariable(&r_showtris); + Cvar_RegisterVariable(&r_showtris_polygonoffset); Cvar_RegisterVariable(&r_shownormals); + Cvar_RegisterVariable(&r_showlighting); + Cvar_RegisterVariable(&r_showshadowvolumes); + Cvar_RegisterVariable(&r_showcollisionbrushes); + Cvar_RegisterVariable(&r_showcollisionbrushes_polygonfactor); + Cvar_RegisterVariable(&r_showcollisionbrushes_polygonoffset); + Cvar_RegisterVariable(&r_showdisabledepthtest); Cvar_RegisterVariable(&r_drawentities); Cvar_RegisterVariable(&r_drawviewmodel); Cvar_RegisterVariable(&r_speeds); @@ -460,7 +473,6 @@ void GL_Main_Init(void) Cvar_RegisterVariable(&r_lerpsprites); Cvar_RegisterVariable(&r_lerpmodels); Cvar_RegisterVariable(&r_waterscroll); - Cvar_RegisterVariable(&r_drawcollisionbrushes); Cvar_RegisterVariable(&r_bloom); Cvar_RegisterVariable(&r_bloom_intensity); Cvar_RegisterVariable(&r_bloom_blur); @@ -1097,7 +1109,58 @@ void R_RenderView(void) GL_ScissorTest(false); } +//[515]: csqc +void CSQC_R_ClearScreen (void) +{ + if (!r_refdef.entities/* || !r_refdef.worldmodel*/) + return; //Host_Error ("R_RenderView: NULL worldmodel"); + + r_view_width = bound(0, r_refdef.width, vid.width); + r_view_height = bound(0, r_refdef.height, vid.height); + r_view_depth = 1; + r_view_x = bound(0, r_refdef.x, vid.width - r_refdef.width); + r_view_y = bound(0, r_refdef.y, vid.height - r_refdef.height); + r_view_z = 0; + r_view_matrix = r_refdef.viewentitymatrix; + GL_ColorMask(r_refdef.colormask[0], r_refdef.colormask[1], r_refdef.colormask[2], 1); + r_rtworld = r_shadow_realtime_world.integer; + r_rtworldshadows = r_shadow_realtime_world_shadows.integer && gl_stencil; + r_rtdlight = (r_shadow_realtime_world.integer || r_shadow_realtime_dlight.integer) && !gl_flashblend.integer; + r_rtdlightshadows = r_rtdlight && (r_rtworld ? r_shadow_realtime_world_dlightshadows.integer : r_shadow_realtime_dlight_shadows.integer) && gl_stencil; + r_lightmapintensity = r_rtworld ? r_shadow_realtime_world_lightmaps.value : 1; + + // GL is weird because it's bottom to top, r_view_y is top to bottom + qglViewport(r_view_x, vid.height - (r_view_y + r_view_height), r_view_width, r_view_height); + GL_Scissor(r_view_x, r_view_y, r_view_width, r_view_height); + GL_ScissorTest(true); + GL_DepthMask(true); + R_ClearScreen(); + R_Textures_Frame(); + R_UpdateFog(); + R_TimeReport("setup"); +} + +//[515]: csqc +void CSQC_R_RenderScene (void) +{ + qglDepthFunc(GL_LEQUAL); + qglPolygonOffset(0, 0); + qglEnable(GL_POLYGON_OFFSET_FILL); + + R_RenderScene(); + + qglPolygonOffset(0, 0); + qglDisable(GL_POLYGON_OFFSET_FILL); + + R_BlendView(); + R_TimeReport("blendview"); + + GL_Scissor(0, 0, vid.width, vid.height); + GL_ScissorTest(false); +} + extern void R_DrawLightningBeams (void); +extern void VM_AddPolygonsToMeshQueue (void); void R_RenderScene(void) { // don't let sound skip if going slow @@ -1108,8 +1171,6 @@ void R_RenderScene(void) R_MeshQueue_BeginScene(); - GL_ShowTrisColor(0.05, 0.05, 0.05, 1); - R_SetFrustum(); r_farclip = R_FarClip(r_vieworigin, r_viewforward, 768.0f) + 256.0f; @@ -1132,78 +1193,110 @@ void R_RenderScene(void) R_Shadow_UpdateWorldLightSelection(); - // don't let sound skip if going slow - if (r_refdef.extraupdate) - S_ExtraUpdate (); - - GL_ShowTrisColor(0.025, 0.025, 0, 1); - if (r_refdef.worldmodel && r_refdef.worldmodel->DrawSky) + for (r_showtrispass = 0;r_showtrispass <= (r_showtris.value > 0);r_showtrispass++) { - r_refdef.worldmodel->DrawSky(r_refdef.worldentity); - R_TimeReport("worldsky"); - } + if (r_showtrispass) + { + rmeshstate_t m; + r_showtrispass = 0; + GL_BlendFunc(GL_ONE, GL_ONE); + GL_DepthTest(!r_showdisabledepthtest.integer); + GL_DepthMask(GL_FALSE); + memset(&m, 0, sizeof(m)); + R_Mesh_State(&m); + //qglEnable(GL_LINE_SMOOTH); + qglEnable(GL_POLYGON_OFFSET_LINE); + qglPolygonOffset(0, r_showtris_polygonoffset.value); + r_showtrispass = 1; + } - if (R_DrawBrushModelsSky()) - R_TimeReport("bmodelsky"); + if (cl.csqc_vidvars.drawworld) + { + // don't let sound skip if going slow + if (r_refdef.extraupdate) + S_ExtraUpdate (); - GL_ShowTrisColor(0.05, 0.05, 0.05, 1); - if (r_refdef.worldmodel && r_refdef.worldmodel->Draw) - { - r_refdef.worldmodel->Draw(r_refdef.worldentity); - R_TimeReport("world"); - } + GL_ShowTrisColor(0.025, 0.025, 0, 1); + if (r_refdef.worldmodel && r_refdef.worldmodel->DrawSky) + { + r_refdef.worldmodel->DrawSky(r_refdef.worldentity); + R_TimeReport("worldsky"); + } - // don't let sound skip if going slow - if (r_refdef.extraupdate) - S_ExtraUpdate (); + if (R_DrawBrushModelsSky()) + R_TimeReport("bmodelsky"); - GL_ShowTrisColor(0, 0.015, 0, 1); + GL_ShowTrisColor(0.05, 0.05, 0.05, 1); + if (r_refdef.worldmodel && r_refdef.worldmodel->Draw) + { + r_refdef.worldmodel->Draw(r_refdef.worldentity); + R_TimeReport("world"); + } + } - R_DrawModels(); - R_TimeReport("models"); + // don't let sound skip if going slow + if (r_refdef.extraupdate) + S_ExtraUpdate (); - // don't let sound skip if going slow - if (r_refdef.extraupdate) - S_ExtraUpdate (); + GL_ShowTrisColor(0, 0.015, 0, 1); - GL_ShowTrisColor(0, 0, 0.033, 1); - R_ShadowVolumeLighting(false); - R_TimeReport("rtlights"); + R_DrawModels(); + R_TimeReport("models"); - // don't let sound skip if going slow - if (r_refdef.extraupdate) - S_ExtraUpdate (); + // don't let sound skip if going slow + if (r_refdef.extraupdate) + S_ExtraUpdate (); + + GL_ShowTrisColor(0, 0, 0.033, 1); + R_ShadowVolumeLighting(false); + R_TimeReport("rtlights"); + + // don't let sound skip if going slow + if (r_refdef.extraupdate) + S_ExtraUpdate (); - GL_ShowTrisColor(0.1, 0, 0, 1); + GL_ShowTrisColor(0.1, 0, 0, 1); - R_DrawLightningBeams(); - R_TimeReport("lightning"); + if (cl.csqc_vidvars.drawworld) + { + R_DrawLightningBeams(); + R_TimeReport("lightning"); - R_DrawParticles(); - R_TimeReport("particles"); + R_DrawParticles(); + R_TimeReport("particles"); - R_DrawExplosions(); - R_TimeReport("explosions"); + R_DrawExplosions(); + R_TimeReport("explosions"); + } - R_MeshQueue_RenderTransparent(); - R_TimeReport("drawtrans"); + R_MeshQueue_RenderTransparent(); + R_TimeReport("drawtrans"); - R_DrawCoronas(); - R_TimeReport("coronas"); + if (cl.csqc_vidvars.drawworld) + { + R_DrawCoronas(); + R_TimeReport("coronas"); + } + if(cl.csqc_vidvars.drawcrosshair) + { + R_DrawWorldCrosshair(); + R_TimeReport("crosshair"); + } - R_DrawWorldCrosshair(); - R_TimeReport("crosshair"); + VM_AddPolygonsToMeshQueue(); - R_MeshQueue_Render(); - R_MeshQueue_EndScene(); + R_MeshQueue_Render(); - if ((r_shadow_visiblelighting.integer || r_shadow_visiblevolumes.integer) && !r_showtrispass) - { - R_ShadowVolumeLighting(true); - R_TimeReport("visiblevolume"); + if (r_showtrispass) + { + //qglDisable(GL_LINE_SMOOTH); + qglDisable(GL_POLYGON_OFFSET_LINE); + } } - GL_ShowTrisColor(0.05, 0.05, 0.05, 1); + r_showtrispass = 0; + + R_MeshQueue_EndScene(); // don't let sound skip if going slow if (r_refdef.extraupdate) @@ -1476,7 +1569,7 @@ void R_Mesh_AddBrushMeshFromPlanes(rmesh_t *mesh, int numplanes, mplane_t *plane { if (planenum2 == planenum) continue; - PolygonF_Divide(tempnumpoints, temppoints[w], plane2->normal[0], plane2->normal[1], plane2->normal[2], plane2->dist, 1.0/32.0, 0, NULL, NULL, 256, temppoints[!w], &tempnumpoints); + PolygonF_Divide(tempnumpoints, temppoints[w], plane2->normal[0], plane2->normal[1], plane2->normal[2], plane2->dist, 1.0/32.0, 0, NULL, NULL, 256, temppoints[!w], &tempnumpoints, NULL); w = !w; } if (tempnumpoints < 3) @@ -1581,15 +1674,15 @@ void R_UpdateTextureInfo(const entity_render_t *ent, texture_t *t) int layerflags = 0; if (fogenabled && (t->currentmaterialflags & MATERIALFLAG_TRANSPARENT)) layerflags |= TEXTURELAYERFLAG_FOGDARKEN; - currentbasetexture = (ent->colormap < 0 && t->skin.merged) ? t->skin.merged : t->skin.base; + currentbasetexture = (VectorLength2(ent->colormap_pantscolor) + VectorLength2(ent->colormap_shirtcolor) < (1.0f / 1048576.0f) && t->skin.merged) ? t->skin.merged : t->skin.base; if (t->currentmaterialflags & MATERIALFLAG_FULLBRIGHT) { // fullbright is not affected by r_lightmapintensity R_Texture_AddLayer(t, depthmask, blendfunc1, blendfunc2, TEXTURELAYERTYPE_TEXTURE, currentbasetexture, &t->currenttexmatrix, ent->colormod[0], ent->colormod[1], ent->colormod[2], t->currentalpha); - if (ent->colormap >= 0 && t->skin.pants) - R_Texture_AddLayer(t, false, GL_SRC_ALPHA, GL_ONE, TEXTURELAYERTYPE_TEXTURE, t->skin.pants, &t->currenttexmatrix, ent->colormap_pantscolor[0], ent->colormap_pantscolor[1], ent->colormap_pantscolor[2], t->currentalpha); - if (ent->colormap >= 0 && t->skin.shirt) - R_Texture_AddLayer(t, false, GL_SRC_ALPHA, GL_ONE, TEXTURELAYERTYPE_TEXTURE, t->skin.shirt, &t->currenttexmatrix, ent->colormap_shirtcolor[0], ent->colormap_shirtcolor[1], ent->colormap_shirtcolor[2], t->currentalpha); + if (VectorLength2(ent->colormap_pantscolor) >= (1.0f / 1048576.0f) && t->skin.pants) + R_Texture_AddLayer(t, false, GL_SRC_ALPHA, GL_ONE, TEXTURELAYERTYPE_TEXTURE, t->skin.pants, &t->currenttexmatrix, ent->colormap_pantscolor[0] * ent->colormod[0], ent->colormap_pantscolor[1] * ent->colormod[1], ent->colormap_pantscolor[2] * ent->colormod[2], t->currentalpha); + if (VectorLength2(ent->colormap_shirtcolor) >= (1.0f / 1048576.0f) && t->skin.shirt) + R_Texture_AddLayer(t, false, GL_SRC_ALPHA, GL_ONE, TEXTURELAYERTYPE_TEXTURE, t->skin.shirt, &t->currenttexmatrix, ent->colormap_shirtcolor[0] * ent->colormod[0], ent->colormap_shirtcolor[1] * ent->colormod[1], ent->colormap_shirtcolor[2] * ent->colormod[2], t->currentalpha); } else { @@ -1609,17 +1702,17 @@ void R_UpdateTextureInfo(const entity_render_t *ent, texture_t *t) R_Texture_AddLayer(t, depthmask, blendfunc1, blendfunc2, TEXTURELAYERTYPE_LITTEXTURE_VERTEX, currentbasetexture, &t->currenttexmatrix, ent->colormod[0] * colorscale, ent->colormod[1] * colorscale, ent->colormod[2] * colorscale, t->currentalpha); if (r_ambient.value >= (1.0f/64.0f)) R_Texture_AddLayer(t, false, GL_SRC_ALPHA, GL_ONE, TEXTURELAYERTYPE_TEXTURE, currentbasetexture, &t->currenttexmatrix, ent->colormod[0] * r_ambient.value * (1.0f / 64.0f), ent->colormod[1] * r_ambient.value * (1.0f / 64.0f), ent->colormod[2] * r_ambient.value * (1.0f / 64.0f), t->currentalpha); - if (ent->colormap >= 0 && t->skin.pants) + if (VectorLength2(ent->colormap_pantscolor) >= (1.0f / 1048576.0f) && t->skin.pants) { - R_Texture_AddLayer(t, false, GL_SRC_ALPHA, GL_ONE, TEXTURELAYERTYPE_LITTEXTURE_VERTEX, t->skin.pants, &t->currenttexmatrix, ent->colormap_pantscolor[0] * colorscale, ent->colormap_pantscolor[1] * colorscale, ent->colormap_pantscolor[2] * colorscale, t->currentalpha); + R_Texture_AddLayer(t, false, GL_SRC_ALPHA, GL_ONE, TEXTURELAYERTYPE_LITTEXTURE_VERTEX, t->skin.pants, &t->currenttexmatrix, ent->colormap_pantscolor[0] * ent->colormod[0] * colorscale, ent->colormap_pantscolor[1] * ent->colormod[1] * colorscale, ent->colormap_pantscolor[2] * ent->colormod[2] * colorscale, t->currentalpha); if (r_ambient.value >= (1.0f/64.0f)) - R_Texture_AddLayer(t, false, GL_SRC_ALPHA, GL_ONE, TEXTURELAYERTYPE_TEXTURE, t->skin.pants, &t->currenttexmatrix, ent->colormap_pantscolor[0] * r_ambient.value * (1.0f / 64.0f), ent->colormap_pantscolor[1] * r_ambient.value * (1.0f / 64.0f), ent->colormap_pantscolor[2] * r_ambient.value * (1.0f / 64.0f), t->currentalpha); + R_Texture_AddLayer(t, false, GL_SRC_ALPHA, GL_ONE, TEXTURELAYERTYPE_TEXTURE, t->skin.pants, &t->currenttexmatrix, ent->colormap_pantscolor[0] * ent->colormod[0] * r_ambient.value * (1.0f / 64.0f), ent->colormap_pantscolor[1] * ent->colormod[1] * r_ambient.value * (1.0f / 64.0f), ent->colormap_pantscolor[2] * ent->colormod[2] * r_ambient.value * (1.0f / 64.0f), t->currentalpha); } - if (ent->colormap >= 0 && t->skin.shirt) + if (VectorLength2(ent->colormap_shirtcolor) >= (1.0f / 1048576.0f) && t->skin.shirt) { - R_Texture_AddLayer(t, false, GL_SRC_ALPHA, GL_ONE, TEXTURELAYERTYPE_LITTEXTURE_VERTEX, t->skin.shirt, &t->currenttexmatrix, ent->colormap_shirtcolor[0] * colorscale, ent->colormap_shirtcolor[1] * colorscale, ent->colormap_shirtcolor[2] * colorscale, t->currentalpha); + R_Texture_AddLayer(t, false, GL_SRC_ALPHA, GL_ONE, TEXTURELAYERTYPE_LITTEXTURE_VERTEX, t->skin.shirt, &t->currenttexmatrix, ent->colormap_shirtcolor[0] * ent->colormod[0] * colorscale, ent->colormap_shirtcolor[1] * ent->colormod[1] * colorscale, ent->colormap_shirtcolor[2] * ent->colormod[2] * colorscale, t->currentalpha); if (r_ambient.value >= (1.0f/64.0f)) - R_Texture_AddLayer(t, false, GL_SRC_ALPHA, GL_ONE, TEXTURELAYERTYPE_TEXTURE, t->skin.shirt, &t->currenttexmatrix, ent->colormap_shirtcolor[0] * r_ambient.value * (1.0f / 64.0f), ent->colormap_shirtcolor[1] * r_ambient.value * (1.0f / 64.0f), ent->colormap_shirtcolor[2] * r_ambient.value * (1.0f / 64.0f), t->currentalpha); + R_Texture_AddLayer(t, false, GL_SRC_ALPHA, GL_ONE, TEXTURELAYERTYPE_TEXTURE, t->skin.shirt, &t->currenttexmatrix, ent->colormap_shirtcolor[0] * ent->colormod[0] * r_ambient.value * (1.0f / 64.0f), ent->colormap_shirtcolor[1] * ent->colormod[1] * r_ambient.value * (1.0f / 64.0f), ent->colormap_shirtcolor[2] * ent->colormod[2] * r_ambient.value * (1.0f / 64.0f), t->currentalpha); } } if (t->skin.glow != NULL) @@ -2129,7 +2222,7 @@ static void R_DrawTextureSurfaceList(const entity_render_t *ent, texture_t *text { int j, k; float v[3]; - GL_DepthTest(true); + GL_DepthTest(!r_showdisabledepthtest.integer); GL_DepthMask(texture->currentlayers->depthmask); GL_BlendFunc(texture->currentlayers->blendfunc1, texture->currentlayers->blendfunc2); memset(&m, 0, sizeof(m));