From 02b19a67dc37c904416f5b7957f5819c8314ba0b Mon Sep 17 00:00:00 2001 From: Nico de Poel Date: Thu, 9 Feb 2023 12:56:19 +0100 Subject: [PATCH] First implementation of near-camera polygon tessellation, which surprisingly actually worked on the first try! Currently still rather inefficient, making no use of GTE for interpolation yet. Still only one tessellation level too. --- draw.h | 189 ++++++++++++++++++++++++++++++++++++++++++++++++ n64e1m1.ps1bsp | Bin 1093029 -> 1093029 bytes n64start.ps1bsp | Bin 631415 -> 631415 bytes ps1bsp.h | 2 +- world.c | 7 +- 5 files changed, 195 insertions(+), 3 deletions(-) diff --git a/draw.h b/draw.h index 82bac0d..e67a031 100644 --- a/draw.h +++ b/draw.h @@ -331,6 +331,195 @@ static INLINE void draw_quadstrip_textured(const ps1bsp_vertex_t *vertices, cons } } +typedef struct _TMPVERT +{ + int16_t vx, vy, vz, vpad; + uint8_t r, g, b, cpad; + uint8_t u, v; + uint16_t pad; +} TMPVERT; + +#define copyVertFast(dst, pv, v) \ + setColorFast(&(dst)->r, &(pv)->r); \ + setColorFast(&(dst)->vx, &(v)->vx); \ + setColorFast(&(dst)->vz, &(v)->vz); \ + setUVFast(&(dst)->u, &(pv)->u); + +#define lerpVert(dst, src0, src1) \ + (dst)->vx = (int16_t)(((int32_t)(src0)->vx + (int32_t)(src1)->vx) >> 1); \ + (dst)->vy = (int16_t)(((int32_t)(src0)->vy + (int32_t)(src1)->vy) >> 1); \ + (dst)->vz = (int16_t)(((int32_t)(src0)->vz + (int32_t)(src1)->vz) >> 1); \ + (dst)->r = (uint8_t)(((uint16_t)(src0)->r + (uint16_t)(src1)->r) >> 1); \ + (dst)->g = (uint8_t)(((uint16_t)(src0)->g + (uint16_t)(src1)->g) >> 1); \ + (dst)->b = (uint8_t)(((uint16_t)(src0)->b + (uint16_t)(src1)->b) >> 1); \ + (dst)->u = (uint8_t)(((uint16_t)(src0)->u + (uint16_t)(src1)->u) >> 1); \ + (dst)->v = (uint8_t)(((uint16_t)(src0)->v + (uint16_t)(src1)->v) >> 1); + +#define blitVert(dst, src) \ + setColorFast(&(dst)->x, &(src)->vx); \ + setColorFast(&(dst)->r, &(src)->r); \ + setUVFast(&(dst)->u, &(src)->u); + +static INLINE void draw_quadstrip_tess2(const ps1bsp_vertex_t *vertices, const ps1bsp_polyvertex_t *polyVerts, u_char numVerts, u_short tpage, u_long *ot) +{ + const ps1bsp_polyvertex_t *pv0, *pv1, *pv2, *pv3; + const ps1bsp_vertex_t *v0, *v1, *v2, *v3; + u_char i0, i1, i2, i3; + u_char head = 0; + u_char tail = numVerts; + + // Initialize the first two vertices + i2 = --tail; + i3 = head++; + + TMPVERT *tmp = (TMPVERT*)(scratchpad); + + // Normally a quad strip would have (N-2)/2 quads, but we might end up with a sole triangle at the end which will be drawn as a collapsed quad + // NOTE: testing has shown that the PS1 is faster just rendering quads and accepting the odd collapsed quad, rather than being clever with pointer comparisons and drawing a single triangle at the end. + u_char numQuads = (numVerts - 1) >> 1; + for (u_char quadIdx = 0; quadIdx < numQuads; ++quadIdx) + { + i0 = i2; + i1 = i3; + i2 = --tail; + i3 = head++; + + pv0 = &polyVerts[i0]; + pv1 = &polyVerts[i1]; + pv2 = &polyVerts[i2]; + pv3 = &polyVerts[i3]; + + v0 = &vertices[pv0->index]; + v1 = &vertices[pv1->index]; + v2 = &vertices[pv2->index]; + v3 = &vertices[pv3->index]; + + copyVertFast(&tmp[0], pv0, v0); + copyVertFast(&tmp[2], pv1, v1); + copyVertFast(&tmp[6], pv2, v2); + copyVertFast(&tmp[8], pv3, v3); + + lerpVert(&tmp[1], &tmp[0], &tmp[2]); + lerpVert(&tmp[3], &tmp[0], &tmp[6]); + lerpVert(&tmp[5], &tmp[2], &tmp[8]); + lerpVert(&tmp[7], &tmp[6], &tmp[8]); + lerpVert(&tmp[4], &tmp[3], &tmp[5]); + + // Transform the vertices in groups of three + gte_ldv3(&tmp[0], &tmp[1], &tmp[2]); + gte_rtpt(); + gte_stsxy0(&tmp[0].vx); + gte_stsxy1(&tmp[1].vx); + gte_stsxy2(&tmp[2].vx); + + gte_ldv3(&tmp[3], &tmp[4], &tmp[5]); + gte_rtpt(); + gte_stsxy0(&tmp[3].vx); + gte_stsxy1(&tmp[4].vx); + gte_stsxy2(&tmp[5].vx); + + gte_ldv3(&tmp[6], &tmp[7], &tmp[8]); + gte_rtpt(); + gte_stsxy0(&tmp[6].vx); + gte_stsxy1(&tmp[7].vx); + gte_stsxy2(&tmp[8].vx); + + // Draw the first quad + POLY_GT4 *poly = (POLY_GT4*)mem_prim(sizeof(POLY_GT4)); + setColorFast(&poly->x0, &tmp[0].vx); + setColorFast(&poly->r0, &tmp[0].r); + setUVFast(&poly->u0, &tmp[0].u); + poly->clut = quake_clut; + + setColorFast(&poly->x1, &tmp[3].vx); + setColorFast(&poly->r1, &tmp[3].r); + setUVFast(&poly->u1, &tmp[3].u); + poly->tpage = tpage; + + setColorFast(&poly->x2, &tmp[1].vx); + setColorFast(&poly->r2, &tmp[1].r); + setUVFast(&poly->u2, &tmp[1].u); + + setColorFast(&poly->x3, &tmp[4].vx); + setColorFast(&poly->r3, &tmp[4].r); + setUVFast(&poly->u3, &tmp[4].u); + + setPolyGT4(poly); + addPrim(ot, poly); + + // Second quad + poly = (POLY_GT4*)mem_prim(sizeof(POLY_GT4)); + setColorFast(&poly->x0, &tmp[1].vx); + setColorFast(&poly->r0, &tmp[1].r); + setUVFast(&poly->u0, &tmp[1].u); + poly->clut = quake_clut; + + setColorFast(&poly->x1, &tmp[4].vx); + setColorFast(&poly->r1, &tmp[4].r); + setUVFast(&poly->u1, &tmp[4].u); + poly->tpage = tpage; + + setColorFast(&poly->x2, &tmp[2].vx); + setColorFast(&poly->r2, &tmp[2].r); + setUVFast(&poly->u2, &tmp[2].u); + + setColorFast(&poly->x3, &tmp[5].vx); + setColorFast(&poly->r3, &tmp[5].r); + setUVFast(&poly->u3, &tmp[5].u); + + setPolyGT4(poly); + addPrim(ot, poly); + + // Third quad + poly = (POLY_GT4*)mem_prim(sizeof(POLY_GT4)); + setColorFast(&poly->x0, &tmp[3].vx); + setColorFast(&poly->r0, &tmp[3].r); + setUVFast(&poly->u0, &tmp[3].u); + poly->clut = quake_clut; + + setColorFast(&poly->x1, &tmp[6].vx); + setColorFast(&poly->r1, &tmp[6].r); + setUVFast(&poly->u1, &tmp[6].u); + poly->tpage = tpage; + + setColorFast(&poly->x2, &tmp[4].vx); + setColorFast(&poly->r2, &tmp[4].r); + setUVFast(&poly->u2, &tmp[4].u); + + setColorFast(&poly->x3, &tmp[7].vx); + setColorFast(&poly->r3, &tmp[7].r); + setUVFast(&poly->u3, &tmp[7].u); + + setPolyGT4(poly); + addPrim(ot, poly); + + // Fourth quad + poly = (POLY_GT4*)mem_prim(sizeof(POLY_GT4)); + setColorFast(&poly->x0, &tmp[4].vx); + setColorFast(&poly->r0, &tmp[4].r); + setUVFast(&poly->u0, &tmp[4].u); + poly->clut = quake_clut; + + setColorFast(&poly->x1, &tmp[7].vx); + setColorFast(&poly->r1, &tmp[7].r); + setUVFast(&poly->u1, &tmp[7].u); + poly->tpage = tpage; + + setColorFast(&poly->x2, &tmp[5].vx); + setColorFast(&poly->r2, &tmp[5].r); + setUVFast(&poly->u2, &tmp[5].u); + + setColorFast(&poly->x3, &tmp[8].vx); + setColorFast(&poly->r3, &tmp[8].r); + setUVFast(&poly->u3, &tmp[8].u); + + setPolyGT4(poly); + addPrim(ot, poly); + + polyCount += 4; + } +} + static INLINE void draw_quadstrip_water(const ps1bsp_vertex_t *vertices, const ps1bsp_polyvertex_t *polyVerts, u_char numVerts, u_short tpage, u_char semiTrans, u_long *ot) { // Draw the face as a quad strip diff --git a/n64e1m1.ps1bsp b/n64e1m1.ps1bsp index b47a0e2ca95346e2d15715d4c6bd98a39c0c4b86..1136465d76080c03222081bc5fb24cc0a32da2fb 100755 GIT binary patch delta 26371 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 P|EB(7`?hJHTJ-+_mxmzd delta 26167 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 EA7ZqN4gdfE diff --git a/n64start.ps1bsp b/n64start.ps1bsp index 98a07e5c8db3ec475d2bf171a10085f27a684e33..4691da5d09c397ff5aad56e1493588136f352aad 100755 GIT binary patch delta 15295 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 delta 14984 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 diff --git a/ps1bsp.h b/ps1bsp.h index e9adef3..5a0ebf1 100755 --- a/ps1bsp.h +++ b/ps1bsp.h @@ -63,7 +63,7 @@ typedef struct // This matches the SVECTOR data type; we can use the extra padding to store some more data. typedef struct { - short x, y, z; + short vx, vy, vz; short pad; } ps1bsp_vertex_t; diff --git a/world.c b/world.c index f329c90..0b75cf9 100644 --- a/world.c +++ b/world.c @@ -144,7 +144,7 @@ static void world_drawface_textured(const world_t *world, const ps1bsp_face_t *f const ps1bsp_texture_t *texture = &world->textures[face->textureId]; const ps1bsp_polygon_t* poly = &world->polygons[face->firstPolygon]; - // u_char tess = face->flags & 3; + u_char tess = face->flags & 3; // if (tess) // { // world_drawface_flat(world, face, &colors[tess - 1], ot); @@ -170,7 +170,10 @@ static void world_drawface_textured(const world_t *world, const ps1bsp_face_t *f draw_triangle_textured(world->vertices, polyVertices, texture->tpage, ot); break; default: - draw_quadstrip_textured(world->vertices, polyVertices, poly->numPolyVertices, texture->tpage, ot); + if (tess) + draw_quadstrip_tess2(world->vertices, polyVertices, poly->numPolyVertices, texture->tpage, ot); + else + draw_quadstrip_textured(world->vertices, polyVertices, poly->numPolyVertices, texture->tpage, ot); break; } }