From b0d36ab11b7c0486abb6f4135aac6784e26d241a Mon Sep 17 00:00:00 2001 From: Nico de Poel Date: Thu, 19 Jan 2023 12:25:34 +0100 Subject: [PATCH] Sped up plane calculations by making use of axis-aligned properties --- ps1bsp.h | 3 ++- test.ps1bsp | Bin 162995 -> 162995 bytes world.c | 16 ++++++++++++++-- 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/ps1bsp.h b/ps1bsp.h index 574f551..0ce50fe 100755 --- a/ps1bsp.h +++ b/ps1bsp.h @@ -85,7 +85,8 @@ typedef struct typedef struct { SVECTOR normal; - int dist; + short dist; + short type; } ps1bsp_plane_t; typedef struct diff --git a/test.ps1bsp b/test.ps1bsp index 4d79a12dd325ec1df79ec5495ce4ab86f5404bad..bca53a575b7726a107df0187f40d4308deb08381 100755 GIT binary patch delta 8101 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 diff --git a/world.c b/world.c index d5bf477..dacd3f8 100644 --- a/world.c +++ b/world.c @@ -205,10 +205,22 @@ static INLINE void drawface_quad_strip(const ps1bsp_face_t *face, SVECTOR *vecs) static INLINE short world_pointPlaneDist(const VECTOR *point, const ps1bsp_plane_t *plane) { - // TODO: can be optimized for axis-aligned planes, no need for a dot product there + // Make use of axis-aligned planes to skip the need for a dot product + if (plane->type < 3) + return (short)(((int*)point)[plane->type] - plane->dist); + return m_pointPlaneDist2(*point, plane->normal, plane->dist); } +static INLINE short world_planeDot(const SVECTOR *dir, const ps1bsp_plane_t *plane) +{ + // Make use of axis-aligned planes to skip the need for a dot product + if (plane->type < 3) + return ((short*)dir)[plane->type]; + + return m_dot12s(*dir, plane->normal); +} + static void world_drawface(const world_t *world, const ps1bsp_face_t *face) { // Backface culling using the face's plane and center point @@ -219,7 +231,7 @@ static void world_drawface(const world_t *world, const ps1bsp_face_t *face) cam_vec.vz = center.vz - cam_pos.vz; const ps1bsp_plane_t *plane = &world->planes[face->planeId]; - short dot = m_dot12s(cam_vec, plane->normal); + short dot = world_planeDot(&cam_vec, plane); if ((dot >= 0) ^ face->side) return;