From 58b2e8dc20d25f0e8d0456fc6c5e008b7e86cf41 Mon Sep 17 00:00:00 2001 From: Nico de Poel Date: Thu, 9 Feb 2023 13:08:04 +0100 Subject: [PATCH] Wrapped vertex copying code into a macro to make the quad drawing code more readable. Added some generic n-bit blitting macros and started using them. --- draw.h | 100 ++++++++++++++++----------------------------------------- 1 file changed, 28 insertions(+), 72 deletions(-) diff --git a/draw.h b/draw.h index e67a031..559afe1 100644 --- a/draw.h +++ b/draw.h @@ -10,6 +10,10 @@ #define setColorFast(pr, r) *((u_int*)(pr)) = *((u_int*)(r)) #define setUVFast(pu, u) *((u_short*)(pu)) = *((u_short*)(u)) +#define blit16(dst, src) *((uint16_t*)(dst)) = *((uint16_t*)(src)) +#define blit32(dst, src) *((uint32_t*)(dst)) = *((uint32_t*)(src)) +#define blit64(dst, src) *((uint64_t*)(dst)) = *((uint64_t*)(src)) + static u_int color_white = ((255 << 16) | (255 << 8) | 255); static INLINE void draw_triangle_lit(SVECTOR *verts, u_long *ot) @@ -340,10 +344,10 @@ typedef struct _TMPVERT } 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); + blit32(&(dst)->r, &(pv)->r); \ + blit32(&(dst)->vx, &(v)->vx); \ + blit32(&(dst)->vz, &(v)->vz); \ + blit16(&(dst)->u, &(pv)->u); #define lerpVert(dst, src0, src1) \ (dst)->vx = (int16_t)(((int32_t)(src0)->vx + (int32_t)(src1)->vx) >> 1); \ @@ -355,10 +359,10 @@ typedef struct _TMPVERT (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); +#define blitVert(dst, i, src) \ + blit32(&(dst)->x ## i, &(src).vx); \ + blit32(&(dst)->r ## i, &(src).r); \ + blit16(&(dst)->u ## i, &(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) { @@ -426,93 +430,45 @@ static INLINE void draw_quadstrip_tess2(const ps1bsp_vertex_t *vertices, const p // 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); + blitVert(poly, 0, tmp[0]); poly->clut = quake_clut; - - setColorFast(&poly->x1, &tmp[3].vx); - setColorFast(&poly->r1, &tmp[3].r); - setUVFast(&poly->u1, &tmp[3].u); + blitVert(poly, 1, tmp[3]); 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); - + blitVert(poly, 2, tmp[1]); + blitVert(poly, 3, tmp[4]); 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); + blitVert(poly, 0, tmp[1]); poly->clut = quake_clut; - - setColorFast(&poly->x1, &tmp[4].vx); - setColorFast(&poly->r1, &tmp[4].r); - setUVFast(&poly->u1, &tmp[4].u); + blitVert(poly, 1, tmp[4]); 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); - + blitVert(poly, 2, tmp[2]); + blitVert(poly, 3, tmp[5]); 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); + blitVert(poly, 0, tmp[3]); poly->clut = quake_clut; - - setColorFast(&poly->x1, &tmp[6].vx); - setColorFast(&poly->r1, &tmp[6].r); - setUVFast(&poly->u1, &tmp[6].u); + blitVert(poly, 1, tmp[6]); 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); - + blitVert(poly, 2, tmp[4]); + blitVert(poly, 3, tmp[7]); 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); + blitVert(poly, 0, tmp[4]); poly->clut = quake_clut; - - setColorFast(&poly->x1, &tmp[7].vx); - setColorFast(&poly->r1, &tmp[7].r); - setUVFast(&poly->u1, &tmp[7].u); + blitVert(poly, 1, tmp[7]); 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); - + blitVert(poly, 2, tmp[5]); + blitVert(poly, 3, tmp[8]); setPolyGT4(poly); addPrim(ot, poly);