From 7606d89998094ee5e88e921dcc01994e60a1d335 Mon Sep 17 00:00:00 2001 From: Nico de Poel Date: Mon, 16 Jan 2023 16:43:35 +0100 Subject: [PATCH] Implemented triangle strip topology for drawing faces --- main.c | 2 +- ps1bsp.h | 2 +- test.ps1bsp | Bin 80010 -> 80010 bytes world.c | 26 +++++++++++++++++++++----- 4 files changed, 23 insertions(+), 7 deletions(-) diff --git a/main.c b/main.c index a52f2a4..8d3da54 100644 --- a/main.c +++ b/main.c @@ -8,7 +8,7 @@ extern u_long tim_e1m1[]; extern u_long bsp_test[]; -VECTOR cam_pos = { 2176, 1152, 128 }; // START +VECTOR cam_pos = { 2176, 1152, 272 }; // START //VECTOR cam_pos = { 1920, -1408, 352 }; // E1M1 SVECTOR cam_rot = { 0, 0, 0 }; diff --git a/ps1bsp.h b/ps1bsp.h index 1e97abf..db02d50 100755 --- a/ps1bsp.h +++ b/ps1bsp.h @@ -60,7 +60,7 @@ typedef struct typedef struct { unsigned short firstFaceVertex; - unsigned short numFaceVertices; + unsigned char numFaceVertices; } 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 cd611321de5f47e12662dbbd2e8d8bc7bbe6b1ac..87e7184920bc4d1ac100367e462132f2dc114d2a 100755 GIT binary patch delta 24685 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 diff --git a/world.c b/world.c index 7aa8207..ccfe05c 100644 --- a/world.c +++ b/world.c @@ -63,12 +63,28 @@ void world_draw(const world_t *world) vecs[vertIdx].pad = vert->baseLight; } - // Draw the face as a triangle fan - for (int vertIdx = 1; vertIdx < face->numFaceVertices - 1; ++vertIdx) + // Draw the face as a triangle strip + const SVECTOR *v0, *v1, *v2; + const SVECTOR *head = vecs; + const SVECTOR *tail = vecs + face->numFaceVertices; + u_char reverse = 0; + + v2 = head++; // Initialize first vertex to index 0 and set head to index 1 + + for (u_char vertIdx = 0; vertIdx < face->numFaceVertices - 2; ++vertIdx) { - const SVECTOR *v0 = &vecs[0]; - const SVECTOR *v1 = &vecs[vertIdx]; - const SVECTOR *v2 = &vecs[vertIdx + 1]; + if (reverse ^= 1) + { + v0 = v2; + v1 = head; + v2 = --tail; + } + else + { + v0 = v1; + v1 = ++head; + v2 = tail; + } // Naively draw the triangle with GTE, nothing special or optimized about this gte_ldv3(v0, v1, v2);