Browse Source

Added some macros to make the optimized drawing code more readable, and applied the same optimization to water drawing.

unrollquadloop
Nico de Poel 3 years ago
parent
commit
4f2d70cc82
  1. 56
      draw.h

56
draw.h

@ -5,6 +5,13 @@
#include "display.h" #include "display.h"
#include <inline_c.h> #include <inline_c.h>
// Macros for quickly blitting RGB and UV values with a single copy
// This is faster than copying each value individually
#define setColorFast(pr, r) *((u_int*)(pr)) = *((u_int*)(r))
#define setUVFast(pu, u) *((u_short*)(pu)) = *((u_short*)(u))
static u_int color_white = ((255 << 24) | (255 << 16) | (255 << 8) | 255);
static INLINE void draw_triangle_lit(SVECTOR *verts, u_long *ot) static INLINE void draw_triangle_lit(SVECTOR *verts, u_long *ot)
{ {
// Draw a single triangle // Draw a single triangle
@ -234,32 +241,31 @@ static INLINE void draw_quadstrip_textured(const ps1bsp_vertex_t *vertices, cons
POLY_GT4 *poly = (POLY_GT4*)mem_prim(sizeof(POLY_GT4)); POLY_GT4 *poly = (POLY_GT4*)mem_prim(sizeof(POLY_GT4));
// Fill out the quad's data fields in struct order, to optimize data access // Fill out the quad's data fields in struct order, to optimize data access
// RGB and UV fields are blitted as a single value, which is faster than copying each value individually
// First vertex and texture CLUT // First vertex and texture CLUT
*((u_int*)&poly->r0) = *((u_int*)&v0->r);
setColorFast(&poly->r0, &v0->r);
gte_stsxy0(&poly->x0); gte_stsxy0(&poly->x0);
*((u_short*)&poly->u0) = *((u_short*)&v0->u);
setUVFast(&poly->u0, &v0->u);
poly->clut = quake_clut; poly->clut = quake_clut;
// Second vertex and texture page // Second vertex and texture page
*((u_int*)&poly->r1) = *((u_int*)&v1->r);
setColorFast(&poly->r1, &v1->r);
gte_stsxy1(&poly->x1); gte_stsxy1(&poly->x1);
*((u_short*)&poly->u1) = *((u_short*)&v1->u);
setUVFast(&poly->u1, &v1->u);
poly->tpage = tpage; poly->tpage = tpage;
// Third vertex // Third vertex
*((u_int*)&poly->r2) = *((u_int*)&v2->r);
setColorFast(&poly->r2, &v2->r);
gte_stsxy2(&poly->x2); gte_stsxy2(&poly->x2);
*((u_short*)&poly->u2) = *((u_short*)&v2->u);
setUVFast(&poly->u2, &v2->u);
// Transform the fourth vertex to complete the quad // Transform the fourth vertex to complete the quad
gte_ldv0(&vertices[v3->index]); gte_ldv0(&vertices[v3->index]);
gte_rtps(); gte_rtps();
// Fourth vertex // Fourth vertex
*((u_int*)&poly->r3) = *((u_int*)&v3->r);
setColorFast(&poly->r3, &v3->r);
gte_stsxy(&poly->x3); gte_stsxy(&poly->x3);
*((u_short*)&poly->u3) = *((u_short*)&v3->u);
setUVFast(&poly->u3, &v3->u);
setPolyGT4(poly); setPolyGT4(poly);
addPrim(ot, poly); addPrim(ot, poly);
@ -299,23 +305,33 @@ static INLINE void draw_quadstrip_water(const ps1bsp_vertex_t *vertices, const p
// Draw a flat-shaded textured quad // Draw a flat-shaded textured quad
POLY_FT4 *poly = (POLY_FT4*)mem_prim(sizeof(POLY_FT4)); POLY_FT4 *poly = (POLY_FT4*)mem_prim(sizeof(POLY_FT4));
setPolyFT4(poly);
setSemiTrans(poly, semiTrans);
gte_stsxy3_ft3(poly);
// Fill out the quad's data fields in struct order, to optimize data access
// First vertex and texture CLUT
setColorFast(&poly->r0, &color_white);
gte_stsxy0(&poly->x0);
setUVFast(&poly->u0, &v0->u);
poly->clut = quake_clut;
// Second vertex and texture page
gte_stsxy1(&poly->x1);
setUVFast(&poly->u1, &v1->u);
poly->tpage = tpage;
// Third vertex
gte_stsxy2(&poly->x2);
setUVFast(&poly->u2, &v2->u);
// Transform the fourth vertex to complete the quad // Transform the fourth vertex to complete the quad
gte_ldv0(&vertices[v3->index]); gte_ldv0(&vertices[v3->index]);
gte_rtps(); gte_rtps();
gte_stsxy(&poly->x3);
// Texture UVs
setUV4(poly, v0->u, v0->v, v1->u, v1->v, v2->u, v2->v, v3->u, v3->v);
poly->clut = water_clut;
poly->tpage = tpage;
// Unlit
poly->r0 = poly->g0 = poly->b0 = 255;
// Fourth vertex
gte_stsxy(&poly->x3);
setUVFast(&poly->u3, &v3->u);
setPolyFT4(poly);
setSemiTrans(poly, semiTrans);
addPrim(ot, poly); addPrim(ot, poly);
++polyCount; ++polyCount;
} }

Loading…
Cancel
Save