From b0893a902d04520cf2f2668280b8c26de72ee9c0 Mon Sep 17 00:00:00 2001 From: Nico de Poel Date: Sun, 29 Jan 2023 12:40:25 +0100 Subject: [PATCH] Added support for leaf-based frustum culling, but leaving it disabled for now. --- ps1bsp.h | 4 +--- test.ps1bsp | Bin 430439 -> 434863 bytes world.c | 5 ++++- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/ps1bsp.h b/ps1bsp.h index 7b79a99..d9bd4c6 100755 --- a/ps1bsp.h +++ b/ps1bsp.h @@ -135,7 +135,6 @@ typedef struct int planeId; short children[2]; - // TODO: add bounding box for frustum culling (or bounding sphere, might be cheaper) SVECTOR boundingSphere; } ps1bsp_node_t; @@ -144,8 +143,7 @@ typedef struct int type; int vislist; - // TODO: add bounding box for frustum culling (or do we? could save half the number of bounds checks if we only check nodes) - //SVECTOR center; + SVECTOR boundingSphere; u_short firstLeafFace; u_short numLeafFaces; diff --git a/test.ps1bsp b/test.ps1bsp index a78b035a90fa37e881cd6e58ca7b5e3a3cb95c35..60d25dbc96b89bda011f9aaeed0b6975fd4fe69d 100755 GIT binary patch delta 13404 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 delta 8945 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 diff --git a/world.c b/world.c index ab179ca..8865ba0 100644 --- a/world.c +++ b/world.c @@ -193,8 +193,11 @@ static void world_drawnode(const world_t *world, short nodeIdx, u_char *pvs) if ((pvs[test >> 3] & (1 << (test & 0x7))) == 0) return; - u_long frameNum = time_getFrameNumber(); const ps1bsp_leaf_t *leaf = &world->leaves[~nodeIdx]; + // if (!frustum_sphereInside(&leaf->boundingSphere)) // TODO: not sure if it's actually faster to do all these additional frustum checks + // return; + + u_long frameNum = time_getFrameNumber(); const u_short *leafFace = &world->leafFaces[leaf->firstLeafFace]; for (u_short leafFaceIdx = 0; leafFaceIdx < leaf->numLeafFaces; ++leafFaceIdx, ++leafFace)