From e8d56b920adc770e635570cb8030f402c262a9d9 Mon Sep 17 00:00:00 2001 From: havoc Date: Sun, 6 May 2007 10:38:31 +0000 Subject: [PATCH] added r_depthfirst option which defaults to 1 (render depth of world into scene before rendering color), and also offers 2 (render depth of world and models), this saves shader fillrate on intensive shaders or texturing techniques (deluxemapping, anisotropic filtering, etc) git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@7234 d7cf8633-e32d-0410-b094-e92efae38249 --- gl_rmain.c | 140 ++++++++++++++++++++++++++++++++++++++++--------- gl_rsurf.c | 19 +++++-- model_alias.c | 6 +++ model_brush.c | 2 + model_shared.h | 3 ++ model_sprite.c | 2 + render.h | 4 +- 7 files changed, 144 insertions(+), 32 deletions(-) diff --git a/gl_rmain.c b/gl_rmain.c index 11dc45a8..c01130cf 100644 --- a/gl_rmain.c +++ b/gl_rmain.c @@ -34,6 +34,7 @@ r_refdef_t r_refdef; r_view_t r_view; r_viewcache_t r_viewcache; +cvar_t r_depthfirst = {0, "r_depthfirst", "1", "renders a depth-only version of the scene before normal rendering begins to eliminate overdraw, values: 0 = off, 1 = world depth, 2 = world and model depth"}; cvar_t r_nearclip = {0, "r_nearclip", "1", "distance from camera of nearclip plane" }; cvar_t r_showbboxes = {0, "r_showbboxes", "0", "shows bounding boxes of server entities, value controls opacity scaling (1 = 10%, 10 = 100%)"}; 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)"}; @@ -1463,6 +1464,7 @@ void GL_Main_Init(void) Cvar_RegisterVariable (&gl_fogstart); Cvar_RegisterVariable (&gl_fogend); } + Cvar_RegisterVariable(&r_depthfirst); Cvar_RegisterVariable(&r_nearclip); Cvar_RegisterVariable(&r_showbboxes); Cvar_RegisterVariable(&r_showsurfaces); @@ -1787,6 +1789,25 @@ void R_DrawModels(void) } } +void R_DrawModelsDepth(void) +{ + int i; + entity_render_t *ent; + + if (!r_drawentities.integer) + return; + + for (i = 0;i < r_refdef.numentities;i++) + { + if (!r_viewcache.entityvisible[i]) + continue; + ent = r_refdef.entities[i]; + r_refdef.stats.entities++; + if (ent->model && ent->model->DrawDepth != NULL) + ent->model->DrawDepth(ent); + } +} + static void R_View_SetFrustum(void) { double slopex, slopey; @@ -2563,13 +2584,26 @@ void R_RenderScene(void) if (R_DrawBrushModelsSky() && r_timereport_active) R_TimeReport("bmodelsky"); + } - if (r_refdef.worldmodel && r_refdef.worldmodel->Draw) - { - r_refdef.worldmodel->Draw(r_refdef.worldentity); - if (r_timereport_active) - R_TimeReport("world"); - } + if (r_depthfirst.integer >= 1 && cl.csqc_vidvars.drawworld && r_refdef.worldmodel && r_refdef.worldmodel->DrawDepth) + { + r_refdef.worldmodel->DrawDepth(r_refdef.worldentity); + if (r_timereport_active) + R_TimeReport("worlddepth"); + } + if (r_depthfirst.integer >= 2) + { + R_DrawModelsDepth(); + if (r_timereport_active) + R_TimeReport("modeldepth"); + } + + if (cl.csqc_vidvars.drawworld && r_refdef.worldmodel && r_refdef.worldmodel->Draw) + { + r_refdef.worldmodel->Draw(r_refdef.worldentity); + if (r_timereport_active) + R_TimeReport("world"); } // don't let sound skip if going slow @@ -4278,24 +4312,75 @@ static void R_DrawTextureSurfaceList_GL11(int texturenumsurfaces, msurface_t **t } } -static void R_DrawTextureSurfaceList(int texturenumsurfaces, msurface_t **texturesurfacelist) +static void R_DrawTextureSurfaceList(int texturenumsurfaces, msurface_t **texturesurfacelist, qboolean writedepth, qboolean depthonly) { if (rsurface_texture->currentmaterialflags & MATERIALFLAG_NODRAW) return; r_shadow_rtlight = NULL; - r_refdef.stats.entities_surfaces += texturenumsurfaces; CHECKGLERROR - if (r_showsurfaces.integer) + if (depthonly) + { + if ((rsurface_texture->currentmaterialflags & (MATERIALFLAG_NODEPTHTEST | MATERIALFLAG_BLENDED | MATERIALFLAG_ALPHATEST))) + return; + if (rsurface_mode != RSURFMODE_MULTIPASS) + rsurface_mode = RSURFMODE_MULTIPASS; + if (r_depthfirst.integer == 3) + { + int i = (int)(texturesurfacelist[0] - rsurface_model->data_surfaces); + GL_Color(((i >> 6) & 7) / 7.0f, ((i >> 3) & 7) / 7.0f, (i & 7) / 7.0f,1); + } + else + { + GL_ColorMask(0,0,0,0); + GL_Color(1,1,1,1); + } + GL_DepthRange(0, (rsurface_texture->currentmaterialflags & MATERIALFLAG_SHORTDEPTHRANGE) ? 0.0625 : 1); + GL_CullFace((rsurface_texture->currentmaterialflags & MATERIALFLAG_NOCULLFACE) ? GL_NONE : GL_FRONT); // quake is backwards, this culls back faces + GL_DepthTest(true); + GL_BlendFunc(GL_ONE, GL_ZERO); + GL_DepthMask(true); + GL_AlphaTest(false); + R_Mesh_ColorPointer(NULL, 0, 0); + R_Mesh_ResetTextureState(); + RSurf_PrepareVerticesForBatch(false, false, texturenumsurfaces, texturesurfacelist); + RSurf_DrawBatch_Simple(texturenumsurfaces, texturesurfacelist); + GL_ColorMask(r_view.colormask[0], r_view.colormask[1], r_view.colormask[2], 1); + r_refdef.stats.entities_surfaces += texturenumsurfaces; + } + else if (r_depthfirst.integer == 3) + return; + else if (r_showsurfaces.integer) + { + if (rsurface_mode != RSURFMODE_MULTIPASS) + rsurface_mode = RSURFMODE_MULTIPASS; + GL_DepthRange(0, (rsurface_texture->currentmaterialflags & MATERIALFLAG_SHORTDEPTHRANGE) ? 0.0625 : 1); + GL_DepthTest(true); + GL_CullFace((rsurface_texture->currentmaterialflags & MATERIALFLAG_NOCULLFACE) ? GL_NONE : GL_FRONT); // quake is backwards, this culls back faces + GL_BlendFunc(GL_ONE, GL_ZERO); + GL_DepthMask(writedepth); + GL_Color(1,1,1,1); + GL_AlphaTest(false); + R_Mesh_ColorPointer(NULL, 0, 0); + R_Mesh_ResetTextureState(); + RSurf_PrepareVerticesForBatch(false, false, texturenumsurfaces, texturesurfacelist); R_DrawTextureSurfaceList_ShowSurfaces(texturenumsurfaces, texturesurfacelist); + r_refdef.stats.entities_surfaces += texturenumsurfaces; + } else if (rsurface_texture->currentmaterialflags & MATERIALFLAG_SKY) + { R_DrawTextureSurfaceList_Sky(texturenumsurfaces, texturesurfacelist); + r_refdef.stats.entities_surfaces += texturenumsurfaces; + } else if (rsurface_texture->currentnumlayers) { + // write depth for anything we skipped on the depth-only pass earlier + if (!writedepth && (rsurface_texture->currentmaterialflags & (MATERIALFLAG_BLENDED | MATERIALFLAG_ALPHATEST))) + writedepth = true; GL_DepthRange(0, (rsurface_texture->currentmaterialflags & MATERIALFLAG_SHORTDEPTHRANGE) ? 0.0625 : 1); GL_DepthTest(!(rsurface_texture->currentmaterialflags & MATERIALFLAG_NODEPTHTEST)); GL_CullFace((rsurface_texture->currentmaterialflags & MATERIALFLAG_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_DepthMask(writedepth && !(rsurface_texture->currentmaterialflags & MATERIALFLAG_BLENDED)); GL_Color(rsurface_entity->colormod[0], rsurface_entity->colormod[1], rsurface_entity->colormod[2], rsurface_texture->currentalpha); GL_AlphaTest((rsurface_texture->currentmaterialflags & MATERIALFLAG_ALPHATEST) != 0); // FIXME: identify models using a better check than rsurface_model->brush.shadowmesh @@ -4306,6 +4391,7 @@ static void R_DrawTextureSurfaceList(int texturenumsurfaces, msurface_t **textur R_DrawTextureSurfaceList_GL13(texturenumsurfaces, texturesurfacelist); else R_DrawTextureSurfaceList_GL11(texturenumsurfaces, texturesurfacelist); + r_refdef.stats.entities_surfaces += texturenumsurfaces; } CHECKGLERROR GL_LockArrays(0, 0); @@ -4350,13 +4436,13 @@ static void R_DrawSurface_TransparentCallback(const entity_render_t *ent, const texturesurfacelist[texturenumsurfaces++] = surface; } // render the range of surfaces - R_DrawTextureSurfaceList(texturenumsurfaces, texturesurfacelist); + R_DrawTextureSurfaceList(texturenumsurfaces, texturesurfacelist, true, false); } RSurf_CleanUp(); } -void R_QueueSurfaceList(int numsurfaces, msurface_t **surfacelist, int flagsmask) +void R_QueueSurfaceList(int numsurfaces, msurface_t **surfacelist, int flagsmask, qboolean writedepth, qboolean depthonly) { int i, j; vec3_t tempcenter, center; @@ -4384,6 +4470,8 @@ void R_QueueSurfaceList(int numsurfaces, msurface_t **surfacelist, int flagsmask { // transparent surfaces get pushed off into the transparent queue const msurface_t *surface = surfacelist[i]; + if (depthonly) + continue; tempcenter[0] = (surface->mins[0] + surface->maxs[0]) * 0.5f; tempcenter[1] = (surface->mins[1] + surface->maxs[1]) * 0.5f; tempcenter[2] = (surface->mins[2] + surface->maxs[2]) * 0.5f; @@ -4396,7 +4484,7 @@ void R_QueueSurfaceList(int numsurfaces, msurface_t **surfacelist, int flagsmask for (;j < numsurfaces && texture == surfacelist[j]->texture && rsurface_lightmaptexture == surfacelist[j]->lightmaptexture;j++) ; // render the range of surfaces - R_DrawTextureSurfaceList(j - i, surfacelist + i); + R_DrawTextureSurfaceList(j - i, surfacelist + i, writedepth, depthonly); } } } @@ -4586,7 +4674,7 @@ void R_DrawTrianglesAndNormals(entity_render_t *ent, qboolean drawtris, qboolean } extern void R_BuildLightMap(const entity_render_t *ent, msurface_t *surface); -void R_DrawWorldSurfaces(qboolean skysurfaces) +void R_DrawWorldSurfaces(qboolean skysurfaces, qboolean writedepth, qboolean depthonly) { int i, j, endj, f, flagsmask; int counttriangles = 0; @@ -4602,7 +4690,7 @@ void R_DrawWorldSurfaces(qboolean skysurfaces) RSurf_ActiveWorldEntity(); // update light styles - if (!skysurfaces && model->brushq1.light_styleupdatechains) + if (!skysurfaces && !depthonly && model->brushq1.light_styleupdatechains) { for (i = 0;i < model->brushq1.light_styles;i++) { @@ -4647,25 +4735,25 @@ void R_DrawWorldSurfaces(qboolean skysurfaces) counttriangles += surface->num_triangles; if (numsurfacelist >= maxsurfacelist) { - R_QueueSurfaceList(numsurfacelist, surfacelist, flagsmask); + R_QueueSurfaceList(numsurfacelist, surfacelist, flagsmask, writedepth, depthonly); numsurfacelist = 0; } } } } if (numsurfacelist) - R_QueueSurfaceList(numsurfacelist, surfacelist, flagsmask); + R_QueueSurfaceList(numsurfacelist, surfacelist, flagsmask, writedepth, depthonly); r_refdef.stats.entities_triangles += counttriangles; RSurf_CleanUp(); - if (r_showcollisionbrushes.integer && !skysurfaces) + if (r_showcollisionbrushes.integer && !skysurfaces && !depthonly) R_DrawCollisionBrushes(r_refdef.worldentity); - if (r_showtris.integer || r_shownormals.integer) + if ((r_showtris.integer || r_shownormals.integer) && !depthonly) R_DrawTrianglesAndNormals(r_refdef.worldentity, r_showtris.integer, r_shownormals.integer, flagsmask); } -void R_DrawModelSurfaces(entity_render_t *ent, qboolean skysurfaces) +void R_DrawModelSurfaces(entity_render_t *ent, qboolean skysurfaces, qboolean writedepth, qboolean depthonly) { int i, f, flagsmask; int counttriangles = 0; @@ -4686,10 +4774,10 @@ void R_DrawModelSurfaces(entity_render_t *ent, qboolean skysurfaces) else if ((ent->effects & EF_FULLBRIGHT) || r_showsurfaces.integer || VectorLength2(ent->modellight_diffuse) < (1.0f / 256.0f)) RSurf_ActiveModelEntity(ent, false, false); else - RSurf_ActiveModelEntity(ent, true, r_glsl.integer && gl_support_fragment_shader); + RSurf_ActiveModelEntity(ent, true, r_glsl.integer && gl_support_fragment_shader && !depthonly); // update light styles - if (!skysurfaces && model->brushq1.light_styleupdatechains) + if (!skysurfaces && !depthonly && model->brushq1.light_styleupdatechains) { for (i = 0;i < model->brushq1.light_styles;i++) { @@ -4726,19 +4814,19 @@ void R_DrawModelSurfaces(entity_render_t *ent, qboolean skysurfaces) counttriangles += surface->num_triangles; if (numsurfacelist >= maxsurfacelist) { - R_QueueSurfaceList(numsurfacelist, surfacelist, flagsmask); + R_QueueSurfaceList(numsurfacelist, surfacelist, flagsmask, writedepth, depthonly); numsurfacelist = 0; } } } if (numsurfacelist) - R_QueueSurfaceList(numsurfacelist, surfacelist, flagsmask); + R_QueueSurfaceList(numsurfacelist, surfacelist, flagsmask, writedepth, depthonly); r_refdef.stats.entities_triangles += counttriangles; RSurf_CleanUp(); - if (r_showcollisionbrushes.integer && !skysurfaces) + if (r_showcollisionbrushes.integer && !skysurfaces && !depthonly) R_DrawCollisionBrushes(ent); - if (r_showtris.integer || r_shownormals.integer) + if ((r_showtris.integer || r_shownormals.integer) && !depthonly) R_DrawTrianglesAndNormals(ent, r_showtris.integer, r_shownormals.integer, flagsmask); } diff --git a/gl_rsurf.c b/gl_rsurf.c index 1927aa22..0cc32001 100644 --- a/gl_rsurf.c +++ b/gl_rsurf.c @@ -509,9 +509,9 @@ void R_Q1BSP_DrawSky(entity_render_t *ent) if (ent->model == NULL) return; if (ent == r_refdef.worldentity) - R_DrawWorldSurfaces(true); + R_DrawWorldSurfaces(true, true, false); else - R_DrawModelSurfaces(ent, true); + R_DrawModelSurfaces(ent, true, true, false); } void R_Q1BSP_Draw(entity_render_t *ent) @@ -520,9 +520,20 @@ void R_Q1BSP_Draw(entity_render_t *ent) if (model == NULL) return; if (ent == r_refdef.worldentity) - R_DrawWorldSurfaces(false); + R_DrawWorldSurfaces(false, true, false); else - R_DrawModelSurfaces(ent, false); + R_DrawModelSurfaces(ent, false, true, false); +} + +void R_Q1BSP_DrawDepth(entity_render_t *ent) +{ + model_t *model = ent->model; + if (model == NULL) + return; + if (ent == r_refdef.worldentity) + R_DrawWorldSurfaces(false, false, true); + else + R_DrawModelSurfaces(ent, false, false, true); } typedef struct r_q1bsp_getlightinfo_s diff --git a/model_alias.c b/model_alias.c index 4cecaaf7..e13ed98e 100644 --- a/model_alias.c +++ b/model_alias.c @@ -768,6 +768,7 @@ void Mod_IDP0_Load(model_t *mod, void *buffer, void *bufferend) loadmodel->type = mod_alias; loadmodel->DrawSky = NULL; loadmodel->Draw = R_Q1BSP_Draw; + loadmodel->DrawDepth = R_Q1BSP_DrawDepth; loadmodel->CompileShadowVolume = R_Q1BSP_CompileShadowVolume; loadmodel->DrawShadowVolume = R_Q1BSP_DrawShadowVolume; loadmodel->DrawLight = R_Q1BSP_DrawLight; @@ -1080,6 +1081,7 @@ void Mod_IDP2_Load(model_t *mod, void *buffer, void *bufferend) loadmodel->type = mod_alias; loadmodel->DrawSky = NULL; loadmodel->Draw = R_Q1BSP_Draw; + loadmodel->DrawDepth = R_Q1BSP_DrawDepth; loadmodel->CompileShadowVolume = R_Q1BSP_CompileShadowVolume; loadmodel->DrawShadowVolume = R_Q1BSP_DrawShadowVolume; loadmodel->DrawLight = R_Q1BSP_DrawLight; @@ -1309,6 +1311,7 @@ void Mod_IDP3_Load(model_t *mod, void *buffer, void *bufferend) loadmodel->type = mod_alias; loadmodel->DrawSky = NULL; loadmodel->Draw = R_Q1BSP_Draw; + loadmodel->DrawDepth = R_Q1BSP_DrawDepth; loadmodel->CompileShadowVolume = R_Q1BSP_CompileShadowVolume; loadmodel->DrawShadowVolume = R_Q1BSP_DrawShadowVolume; loadmodel->DrawLight = R_Q1BSP_DrawLight; @@ -1510,6 +1513,7 @@ void Mod_ZYMOTICMODEL_Load(model_t *mod, void *buffer, void *bufferend) loadmodel->DrawSky = NULL; loadmodel->Draw = R_Q1BSP_Draw; + loadmodel->DrawDepth = R_Q1BSP_DrawDepth; loadmodel->CompileShadowVolume = R_Q1BSP_CompileShadowVolume; loadmodel->DrawShadowVolume = R_Q1BSP_DrawShadowVolume; loadmodel->DrawLight = R_Q1BSP_DrawLight; @@ -1802,6 +1806,7 @@ void Mod_DARKPLACESMODEL_Load(model_t *mod, void *buffer, void *bufferend) loadmodel->DrawSky = NULL; loadmodel->Draw = R_Q1BSP_Draw; + loadmodel->DrawDepth = R_Q1BSP_DrawDepth; loadmodel->CompileShadowVolume = R_Q1BSP_CompileShadowVolume; loadmodel->DrawShadowVolume = R_Q1BSP_DrawShadowVolume; loadmodel->DrawLight = R_Q1BSP_DrawLight; @@ -2070,6 +2075,7 @@ void Mod_PSKMODEL_Load(model_t *mod, void *buffer, void *bufferend) loadmodel->type = mod_alias; loadmodel->DrawSky = NULL; loadmodel->Draw = R_Q1BSP_Draw; + loadmodel->DrawDepth = R_Q1BSP_DrawDepth; loadmodel->CompileShadowVolume = R_Q1BSP_CompileShadowVolume; loadmodel->DrawShadowVolume = R_Q1BSP_DrawShadowVolume; loadmodel->DrawLight = R_Q1BSP_DrawLight; diff --git a/model_brush.c b/model_brush.c index 03cfb584..966c7bc2 100644 --- a/model_brush.c +++ b/model_brush.c @@ -3538,6 +3538,7 @@ void Mod_Q1BSP_Load(model_t *mod, void *buffer, void *bufferend) // this gets altered below if sky is used mod->DrawSky = NULL; mod->Draw = R_Q1BSP_Draw; + mod->DrawDepth = R_Q1BSP_DrawDepth; mod->GetLightInfo = R_Q1BSP_GetLightInfo; mod->CompileShadowVolume = R_Q1BSP_CompileShadowVolume; mod->DrawShadowVolume = R_Q1BSP_DrawShadowVolume; @@ -5981,6 +5982,7 @@ void Mod_Q3BSP_Load(model_t *mod, void *buffer, void *bufferend) mod->brush.FindNonSolidLocation = Mod_Q1BSP_FindNonSolidLocation; mod->brush.PointInLeaf = Mod_Q1BSP_PointInLeaf; mod->Draw = R_Q1BSP_Draw; + mod->DrawDepth = R_Q1BSP_DrawDepth; mod->GetLightInfo = R_Q1BSP_GetLightInfo; mod->CompileShadowVolume = R_Q1BSP_CompileShadowVolume; mod->DrawShadowVolume = R_Q1BSP_DrawShadowVolume; diff --git a/model_shared.h b/model_shared.h index 69332b2e..a56f83af 100644 --- a/model_shared.h +++ b/model_shared.h @@ -624,6 +624,8 @@ typedef struct model_s void(*DrawSky)(struct entity_render_s *ent); // draw the model using lightmap/dlight shading void(*Draw)(struct entity_render_s *ent); + // draw the model to the depth buffer (no color rendering at all) + void(*DrawDepth)(struct entity_render_s *ent); // gathers info on which clusters and surfaces are lit by light, as well as calculating a bounding box void(*GetLightInfo)(struct entity_render_s *ent, vec3_t relativelightorigin, float lightradius, vec3_t outmins, vec3_t outmaxs, int *outleaflist, unsigned char *outleafpvs, int *outnumleafspointer, int *outsurfacelist, unsigned char *outsurfacepvs, int *outnumsurfacespointer, unsigned char *outshadowtrispvs, unsigned char *outlighttrispvs); // compile a shadow volume for the model based on light source @@ -726,6 +728,7 @@ int Mod_Q1BSP_SuperContentsFromNativeContents(struct model_s *model, int nativec struct entity_render_s; void R_Q1BSP_DrawSky(struct entity_render_s *ent); void R_Q1BSP_Draw(struct entity_render_s *ent); +void R_Q1BSP_DrawDepth(struct entity_render_s *ent); void R_Q1BSP_GetLightInfo(struct entity_render_s *ent, vec3_t relativelightorigin, float lightradius, vec3_t outmins, vec3_t outmaxs, int *outleaflist, unsigned char *outleafpvs, int *outnumleafspointer, int *outsurfacelist, unsigned char *outsurfacepvs, int *outnumsurfacespointer, unsigned char *outshadowtrispvs, unsigned char *outlighttrispvs); void R_Q1BSP_CompileShadowVolume(struct entity_render_s *ent, vec3_t relativelightorigin, vec3_t relativelightdirection, float lightradius, int numsurfaces, const int *surfacelist); void R_Q1BSP_DrawShadowVolume(struct entity_render_s *ent, vec3_t relativelightorigin, vec3_t relativelightdirection, float lightradius, int numsurfaces, const int *surfacelist, const vec3_t lightmins, const vec3_t lightmaxs); diff --git a/model_sprite.c b/model_sprite.c index 6e4bf450..506b00e3 100644 --- a/model_sprite.c +++ b/model_sprite.c @@ -221,6 +221,7 @@ void Mod_IDSP_Load(model_t *mod, void *buffer, void *bufferend) loadmodel->DrawSky = NULL; loadmodel->Draw = R_Model_Sprite_Draw; + loadmodel->DrawDepth = NULL; loadmodel->CompileShadowVolume = NULL; loadmodel->DrawShadowVolume = NULL; loadmodel->DrawLight = NULL; @@ -336,6 +337,7 @@ void Mod_IDS2_Load(model_t *mod, void *buffer, void *bufferend) loadmodel->DrawSky = NULL; loadmodel->Draw = R_Model_Sprite_Draw; + loadmodel->DrawDepth = NULL; loadmodel->CompileShadowVolume = NULL; loadmodel->DrawShadowVolume = NULL; loadmodel->DrawLight = NULL; diff --git a/render.h b/render.h index 4ae53eb7..0f0cfc31 100644 --- a/render.h +++ b/render.h @@ -262,8 +262,8 @@ struct msurface_s; void R_UpdateTextureInfo(const entity_render_t *ent, texture_t *t); void R_UpdateAllTextureInfo(entity_render_t *ent); void R_QueueTextureSurfaceList(int texturenumsurfaces, msurface_t **texturesurfacelist); -void R_DrawWorldSurfaces(qboolean skysurfaces); -void R_DrawModelSurfaces(entity_render_t *ent, qboolean skysurfaces); +void R_DrawWorldSurfaces(qboolean skysurfaces, qboolean writedepth, qboolean depthonly); +void R_DrawModelSurfaces(entity_render_t *ent, qboolean skysurfaces, qboolean writedepth, qboolean depthonly); void RSurf_PrepareVerticesForBatch(qboolean generatenormals, qboolean generatetangents, int texturenumsurfaces, msurface_t **texturesurfacelist); void RSurf_DrawBatch_Simple(int texturenumsurfaces, msurface_t **texturesurfacelist); -- 2.39.2