From ea2b96365324e0e095ed35788f834247d0329599 Mon Sep 17 00:00:00 2001 From: Nico de Poel Date: Sun, 29 Jan 2023 12:28:46 +0100 Subject: [PATCH] Implemented per-node frustum culling based on bounding spheres. --- frustum.c | 8 ++++---- frustum.h | 4 ++-- ps1bsp.h | 12 +++++++----- test.ps1bsp | Bin 452095 -> 430439 bytes world.c | 5 +++++ 5 files changed, 18 insertions(+), 11 deletions(-) diff --git a/frustum.c b/frustum.c index 26b2e25..f50865f 100644 --- a/frustum.c +++ b/frustum.c @@ -20,9 +20,9 @@ void frustum_update(int width, int height) int near; gte_ReadGeomScreen(&near); - //FntPrint(-1, "N = %d, W = %d, H = %d\n", near, width, height); + // FntPrint(-1, "N = %d, W = %d, H = %d\n", near, width, height); - // 2 * near, shifted left for division + // 2 * ONE * near near <<= 13; l.vx = near / width; @@ -53,7 +53,7 @@ void frustum_update(int width, int height) // left.vx, left.pad, right.vx, right.pad, top.vz, top.pad, bottom.vz, bottom.pad); } -u_char frustum_pointInside(SVECTOR *point) +u_char frustum_pointInside(const SVECTOR *point) { if (m_dot12(left, *point) + left.pad < 0) return 0; if (m_dot12(right, *point) + right.pad < 0) return 0; @@ -62,7 +62,7 @@ u_char frustum_pointInside(SVECTOR *point) return 1; } -u_char frustum_sphereInside(SVECTOR *sphere) +u_char frustum_sphereInside(const SVECTOR *sphere) { short radius = -sphere->pad; if (m_dot12(left, *sphere) + left.pad < radius) return 0; diff --git a/frustum.h b/frustum.h index adcd50c..244502d 100644 --- a/frustum.h +++ b/frustum.h @@ -2,7 +2,7 @@ #define __FRUSTUM_H__ void frustum_update(int width, int height); -u_char frustum_pointInside(SVECTOR *point); -u_char frustum_sphereInside(SVECTOR *sphere); +u_char frustum_pointInside(const SVECTOR *point); +u_char frustum_sphereInside(const SVECTOR *sphere); #endif // __FRUSTUM_H__ diff --git a/ps1bsp.h b/ps1bsp.h index 9570fda..7b79a99 100755 --- a/ps1bsp.h +++ b/ps1bsp.h @@ -119,8 +119,8 @@ typedef struct // Used for backface culling SVECTOR center; - // Which frame was this face last drawn on? Used to check if this face should be drawn. - u_long drawFrame; + // Run-time data + u_long drawFrame; // Which frame was this face last drawn on? Used to check if this face should be drawn. } ps1bsp_face_t; typedef struct @@ -136,9 +136,7 @@ typedef struct short children[2]; // TODO: add bounding box for frustum culling (or bounding sphere, might be cheaper) - - u_short firstFace; - u_short numFaces; + SVECTOR boundingSphere; } ps1bsp_node_t; typedef struct @@ -151,6 +149,10 @@ typedef struct u_short firstLeafFace; u_short numLeafFaces; + + // Run-time data + u_short nextLeaf; // For chaining leafs in drawing order + u_short leafDepth; // At what depth the leaf's faces should be placed in the ordering table } ps1bsp_leaf_t; // Pre-parsed and encoded entity data (this runs the risk of becoming too bloated) diff --git a/test.ps1bsp b/test.ps1bsp index 0ff67a184d348d1428cce2dc2e1eed5a2759df4b..a78b035a90fa37e881cd6e58ca7b5e3a3cb95c35 100755 GIT binary patch delta 28632 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 delta 50486 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[nodeIdx]; + if (!frustum_sphereInside(&node->boundingSphere)) + return; + const ps1bsp_plane_t *plane = &world->planes[node->planeId]; short dist = world_pointPlaneDist(&cam_pos, plane);