From 37f619dc9400a892712cd2efbead2670ec96c105 Mon Sep 17 00:00:00 2001 From: Nico de Poel Date: Tue, 17 Jan 2023 14:17:47 +0100 Subject: [PATCH] Load plane, node and leaf data, and iterate through leaves to draw faces. --- ps1bsp.h | 8 ++++--- test.ps1bsp | Bin 80064 -> 115982 bytes world.c | 64 ++++++++++++++++++++++++++++++++++++++-------------- world.h | 12 ++++++++++ 4 files changed, 64 insertions(+), 20 deletions(-) diff --git a/ps1bsp.h b/ps1bsp.h index 5d40b3f..eead86a 100755 --- a/ps1bsp.h +++ b/ps1bsp.h @@ -33,7 +33,7 @@ typedef struct ps1bsp_dentry_t faceVertices; ps1bsp_dentry_t planes; ps1bsp_dentry_t nodes; - ps1bsp_dentry_t leafs; + ps1bsp_dentry_t leaves; ps1bsp_dentry_t leafFaces; } ps1bsp_header_t; @@ -72,17 +72,19 @@ typedef struct { unsigned short firstFaceVertex; unsigned char numFaceVertices; + + 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 { SVECTOR normal; - u_short dist; + short dist; } ps1bsp_plane_t; typedef struct { - u_int planeId; + int planeId; u_short front; u_short back; // TODO: add bounding box for frustum culling diff --git a/test.ps1bsp b/test.ps1bsp index 59a3a9e707991ddf30f8eb3bc927bccac45b3861..3673abfd76224eb7ea06bf154d80966ee01f9c9c 100755 GIT binary patch delta 44507 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 delta 8306 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 H;{5*w?Y-WL diff --git a/world.c b/world.c index 080c179..bc93d52 100644 --- a/world.c +++ b/world.c @@ -1,6 +1,7 @@ #include "common.h" #include "world.h" #include "display.h" +#include "time.h" #include @@ -35,6 +36,18 @@ void world_load(const u_long *data, world_t *world) world->faceVertices = (ps1bsp_facevertex_t*)(bytes + header->faceVertices.offset); world->numFaceVertices = header->faceVertices.size / sizeof(ps1bsp_facevertex_t); + + world->planes = (ps1bsp_plane_t*)(bytes + header->planes.offset); + world->numPlanes = header->planes.size / sizeof(ps1bsp_plane_t); + + world->nodes = (ps1bsp_node_t*)(bytes + header->nodes.offset); + world->numNodes = header->nodes.size / sizeof(ps1bsp_node_t); + + world->leaves = (ps1bsp_leaf_t*)(bytes + header->leaves.offset); + world->numLeaves = header->leaves.size / sizeof(ps1bsp_leaf_t); + + world->leafFaces = (u_short*)(bytes + header->leafFaces.offset); + world->numLeafFaces = header->leafFaces.size / sizeof(u_short); } static INLINE void drawface_triangle_fan(const ps1bsp_face_t *face, SVECTOR *vecs) @@ -209,6 +222,27 @@ static INLINE void drawface_quad_strip(const ps1bsp_face_t *face, SVECTOR *vecs) } } +static void world_drawface(const world_t *world, const ps1bsp_face_t *face, char *scratchptr) +{ + const CVECTOR *col = &colors[(u_long)face % numColors]; + + SVECTOR *vecs = (SVECTOR*)mem_scratch(&scratchptr, sizeof(SVECTOR) * face->numFaceVertices); + + // Copy this face's vertices into scratch RAM for fast reuse + ps1bsp_facevertex_t *faceVertex = &world->faceVertices[face->firstFaceVertex]; + for (int vertIdx = 0; vertIdx < face->numFaceVertices; ++vertIdx, ++faceVertex) + { + const ps1bsp_vertex_t *vert = &world->vertices[faceVertex->index]; + vecs[vertIdx] = *((SVECTOR*)vert); + vecs[vertIdx].pad = vert->baseLight; + } + + if (face->numFaceVertices == 3) + drawface_triangle_fan(face, vecs); + else + drawface_quad_strip(face, vecs); +} + void world_draw(const world_t *world) { int p; @@ -217,26 +251,22 @@ void world_draw(const world_t *world) gte_SetRotMatrix(&vp_matrix); gte_SetTransMatrix(&vp_matrix); - for (int faceIdx = 0; faceIdx < world->numFaces; ++faceIdx) + u_long frameNum = time_getFrameNumber(); + + const ps1bsp_leaf_t *leaf = &world->leaves[0]; + for (u_short leafIdx = 0; leafIdx < world->numLeaves; ++leafIdx, ++leaf) { - const ps1bsp_face_t *face = &world->faces[faceIdx]; - const CVECTOR *col = &colors[faceIdx % numColors]; + u_short *leafFace = &world->leafFaces[leaf->firstLeafFace]; + for (u_short leafFaceIdx = 0; leafFaceIdx < leaf->numLeafFaces; ++leafFaceIdx, ++leafFace) + { + ps1bsp_face_t *face = &world->faces[*leafFace]; - char *scratch = scratchpad; - SVECTOR *vecs = (SVECTOR*)mem_scratch(&scratch, sizeof(SVECTOR) * face->numFaceVertices); + // Check if we've already drawn this face + if (face->drawFrame == frameNum) + continue; - // Copy this face's vertices into scratch RAM for fast reuse - ps1bsp_facevertex_t *faceVertex = &world->faceVertices[face->firstFaceVertex]; - for (int vertIdx = 0; vertIdx < face->numFaceVertices; ++vertIdx, ++faceVertex) - { - const ps1bsp_vertex_t *vert = &world->vertices[faceVertex->index]; - vecs[vertIdx] = *((SVECTOR*)vert); - vecs[vertIdx].pad = vert->baseLight; + world_drawface(world, face, scratchpad); + face->drawFrame = frameNum; } - - if (face->numFaceVertices == 3) - drawface_triangle_strip(face, vecs); - else - drawface_quad_strip(face, vecs); } } diff --git a/world.h b/world.h index 08b1e45..d9bbabd 100644 --- a/world.h +++ b/world.h @@ -13,6 +13,18 @@ typedef struct u_short numFaceVertices; ps1bsp_facevertex_t *faceVertices; + + u_short numPlanes; + ps1bsp_plane_t *planes; + + u_short numNodes; + ps1bsp_node_t *nodes; + + u_short numLeaves; + ps1bsp_leaf_t *leaves; + + u_short numLeafFaces; + u_short *leafFaces; } world_t; void world_load(const u_long *data, world_t *world);