From f8a4d171a33ceaa2049caf712ba4b4d485433708 Mon Sep 17 00:00:00 2001 From: Nico de Poel Date: Sun, 15 Jan 2023 17:16:48 +0100 Subject: [PATCH] Faces now have a vertex index list, which is more space-efficient and allows easy rewrites of polygon topology. Also works quite well with the scratchpad RAM setup. --- ps1bsp.h | 9 +++------ test.ps1bsp | Bin 83502 -> 60174 bytes world.c | 39 +++++++++++++++------------------------ world.h | 2 +- 4 files changed, 19 insertions(+), 31 deletions(-) diff --git a/ps1bsp.h b/ps1bsp.h index e795033..3ebaa19 100755 --- a/ps1bsp.h +++ b/ps1bsp.h @@ -22,7 +22,7 @@ Probable rendering process: typedef struct { unsigned short numVertices; - unsigned short numTriangles; + unsigned short numFaceVertIndices; unsigned short numFaces; } ps1bsp_header_t; @@ -62,11 +62,8 @@ typedef struct typedef struct { - unsigned short firstTriangleId; // TODO: could also just do first-index, num-indices here. No real need for a triangle_t struct. - unsigned short numTriangles; - - unsigned short firstQuadId; // For if/when we decide to add quads to the mix - unsigned short numQuads; + unsigned short firstVertexIndex; + unsigned short numVertices; } ps1bsp_face_t; // Pre-parsed and encoded entity data (this runs the risk of becoming too bloated) diff --git a/test.ps1bsp b/test.ps1bsp index 9497db638dbee5d4cab6dbacaa0c2c2030d3d324..809f689ac9d7823efdee304cb6db9a2fae0a8fb2 100755 GIT binary patch literal 60174 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 literal 83502 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 diff --git a/world.c b/world.c index 2d1c3cb..f33bb3a 100644 --- a/world.c +++ b/world.c @@ -31,8 +31,8 @@ void world_load(const u_long *data, world_t *world) world->vertices = (ps1bsp_vertex_t*)bytes; bytes += sizeof(ps1bsp_vertex_t) * world->header->numVertices; - world->triangles = (ps1bsp_triangle_t*)bytes; - bytes += sizeof(ps1bsp_triangle_t) * world->header->numTriangles; + world->faceVertIndices = (unsigned short*)bytes; + bytes += sizeof(unsigned short) * world->header->numFaceVertIndices; world->faces = (ps1bsp_face_t*)bytes; bytes += sizeof(ps1bsp_face_t) * world->header->numFaces; @@ -46,35 +46,26 @@ void world_draw(const world_t *world) gte_SetRotMatrix(&vp_matrix); gte_SetTransMatrix(&vp_matrix); - char *scratch = scratchpad; - SVECTOR *vecs = (SVECTOR*)mem_scratch(&scratch, sizeof(SVECTOR) * 3); - for (int faceIdx = 0; faceIdx < world->header->numFaces; ++faceIdx) { const ps1bsp_face_t *face = &world->faces[faceIdx]; const CVECTOR *col = &colors[faceIdx % numColors]; - const ps1bsp_triangle_t *tri = &world->triangles[face->firstTriangleId]; - for (int triangleIdx = 0; triangleIdx < face->numTriangles; ++triangleIdx, ++tri) + char *scratch = scratchpad; + SVECTOR *vecs = (SVECTOR*)mem_scratch(&scratch, sizeof(SVECTOR) * face->numVertices); + + // Copy this face's vertices into scratch RAM for fast reuse + unsigned short *faceVertIndex = &world->faceVertIndices[face->firstVertexIndex]; + for (int vertIdx = 0; vertIdx < face->numVertices; ++vertIdx, ++faceVertIndex) { - // Naively draw the triangle with GTE, nothing special or optimized about this - const ps1bsp_vertex_t *v0 = &world->vertices[tri->vertex0]; - const ps1bsp_vertex_t *v1 = &world->vertices[tri->vertex1]; - const ps1bsp_vertex_t *v2 = &world->vertices[tri->vertex2]; - - vecs[0].vx = v0->x; vecs[0].vy = v0->y; vecs[0].vz = v0->z; - vecs[1].vx = v1->x; vecs[1].vy = v1->y; vecs[1].vz = v1->z; - vecs[2].vx = v2->x; vecs[2].vy = v2->y; vecs[2].vz = v2->z; - gte_ldv3c(vecs); - - // This method *should* work but it doesn't on real hardware, for some reason. - // Perhaps the PS1 doesn't like loading data from random far-off memory locations directly into GTE registers? - // We probably want to use the scratchpad memory to prepare the vertex data for the GTE anyway. - // SVECTOR *v0 = (SVECTOR*)&world->vertices[tri->vertex0]; - // SVECTOR *v1 = (SVECTOR*)&world->vertices[tri->vertex1]; - // SVECTOR *v2 = (SVECTOR*)&world->vertices[tri->vertex2]; - // gte_ldv3(v0, v1, v2); + vecs[vertIdx] = *((SVECTOR*)&world->vertices[*faceVertIndex]); + } + // Draw the face as a triangle fan + for (int vertIdx = 1; vertIdx < face->numVertices - 1; ++vertIdx) + { + // Naively draw the triangle with GTE, nothing special or optimized about this + gte_ldv3(&vecs[0], &vecs[vertIdx], &vecs[vertIdx + 1]); gte_rtpt(); // Rotation, translation, perspective projection // Normal clipping for backface culling diff --git a/world.h b/world.h index af210cd..354df56 100644 --- a/world.h +++ b/world.h @@ -7,7 +7,7 @@ typedef struct { ps1bsp_header_t *header; ps1bsp_vertex_t *vertices; - ps1bsp_triangle_t *triangles; + unsigned short *faceVertIndices; ps1bsp_face_t *faces; } world_t;