From 637b5ef0d5fd66718e66b767eb64af6d57e90005 Mon Sep 17 00:00:00 2001 From: Aciz Date: Tue, 4 Jun 2024 05:55:32 +0300 Subject: [PATCH 1/3] Cull clips/triggers/slicks out of PVS In addition to frustum culling, don't draw brushes that are not in current PVS. --- src/client/cl_tc_vis.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/client/cl_tc_vis.c b/src/client/cl_tc_vis.c index 7d694bee..ae6c0f08 100644 --- a/src/client/cl_tc_vis.c +++ b/src/client/cl_tc_vis.c @@ -481,12 +481,22 @@ static qboolean CullFace(const visFace_t *face) { static void draw(visBrushNode_t *brush, qhandle_t shader) { frustum = re.GetFrustum(); + vec3_t clientOrigin; + VectorCopy(cl.cgameClientLerpOrigin, clientOrigin); + while (brush) { int i; for (i = 0; i < brush->numFaces; ++i) { - if (CullFace(brush->faces + i)) continue; + if (CullFace(brush->faces + i)) { + continue; + } + + if (!re.inPVS(clientOrigin, brush->faces->mins) && !re.inPVS(clientOrigin, brush->faces->maxs)) { + continue; + } + re.AddPolyToScene(shader, brush->faces[i].numVerts, brush->faces[i].verts); } brush = brush->next; } -} \ No newline at end of file +} From b7427f88e24ee21c2c8f2858224f008124adbc83 Mon Sep 17 00:00:00 2001 From: Aciz Date: Tue, 4 Jun 2024 06:05:15 +0300 Subject: [PATCH 2/3] C89 compliance --- src/client/cl_tc_vis.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/client/cl_tc_vis.c b/src/client/cl_tc_vis.c index ae6c0f08..644b8eb1 100644 --- a/src/client/cl_tc_vis.c +++ b/src/client/cl_tc_vis.c @@ -480,8 +480,9 @@ static qboolean CullFace(const visFace_t *face) { } static void draw(visBrushNode_t *brush, qhandle_t shader) { - frustum = re.GetFrustum(); vec3_t clientOrigin; + frustum = re.GetFrustum(); + VectorCopy(cl.cgameClientLerpOrigin, clientOrigin); while (brush) { From 3a873e5e143a6ab37f1c6d5e0e9a53a2a787fa90 Mon Sep 17 00:00:00 2001 From: Aciz Date: Tue, 4 Jun 2024 19:42:50 +0300 Subject: [PATCH 3/3] Add fallback in case mod does not set cg.cgameClientLerpOrigin This is normally set in etmain so most mods should probably have it, but in case it's not, fallback to client origin --- src/client/cl_tc_vis.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/client/cl_tc_vis.c b/src/client/cl_tc_vis.c index 644b8eb1..2d05ac8c 100644 --- a/src/client/cl_tc_vis.c +++ b/src/client/cl_tc_vis.c @@ -480,10 +480,17 @@ static qboolean CullFace(const visFace_t *face) { } static void draw(visBrushNode_t *brush, qhandle_t shader) { - vec3_t clientOrigin; + vec3_t clientOrigin = { 0.0f, 0.0f, 0.0f }; frustum = re.GetFrustum(); - VectorCopy(cl.cgameClientLerpOrigin, clientOrigin); + // this should be set to cg.refdef.vieworg in cgame, + // but fallback to player origin in case a mod has removed the syscall that sets it + if (!VectorCompare(cl.cgameClientLerpOrigin, vec3_origin)) { + VectorCopy(cl.cgameClientLerpOrigin, clientOrigin); + } else if (cl.snap.valid) { + VectorCopy(cl.snap.ps.origin, clientOrigin); + clientOrigin[2] += (float)cl.snap.ps.viewheight; + } while (brush) { int i;