From 0c0de31b7852dfe112b68774ce82c85dc01b2767 Mon Sep 17 00:00:00 2001 From: Nico de Poel Date: Fri, 20 Jan 2023 12:59:33 +0100 Subject: [PATCH] Experimenting with tessellation subdivision formula: using dot product for backface culling as a parameter of camera-to-face distance and angle. Also includes face area as a parameter: the larger the face, the more subdivisions it'll need. Visualizing this with colors, blended with the lighting data. --- qmath.h | 7 +++++++ test.ps1bsp | Bin 162995 -> 162995 bytes world.c | 42 +++++++++++++++++++++++++++--------------- 3 files changed, 34 insertions(+), 15 deletions(-) diff --git a/qmath.h b/qmath.h index 4b2ac13..9193510 100644 --- a/qmath.h +++ b/qmath.h @@ -17,4 +17,11 @@ INLINE short m_pointPlaneDist2(const VECTOR point2, const SVECTOR normal12, int return (short)(x + y + z - dist2); } +INLINE void m_lightColor(const CVECTOR *color, short light, CVECTOR *outColor) +{ + outColor->r = (uint8_t)((light * color->r) >> 8); + outColor->g = (uint8_t)((light * color->g) >> 8); + outColor->b = (uint8_t)((light * color->b) >> 8); +} + #endif // __QMATH_H__ diff --git a/test.ps1bsp b/test.ps1bsp index 3173adb3d2fd5829fdeea41252874a56d1c3b9da..fd795964d2e43ed8e7f73b338edc5bcc990bed6c 100755 GIT binary patch delta 41132 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, world->numVisData, bytes, header->visData); } -static INLINE void drawface_triangle_fan(const ps1bsp_face_t *face, SVECTOR *vecs) +static INLINE void drawface_triangle_fan(const ps1bsp_face_t *face, SVECTOR *vecs, CVECTOR *color) { int p; @@ -80,16 +82,16 @@ static INLINE void drawface_triangle_fan(const ps1bsp_face_t *face, SVECTOR *vec setPolyG3(poly); gte_stsxy3_g3(poly); - poly->r0 = poly->g0 = poly->b0 = (uint8_t)v0->pad; - poly->r1 = poly->g1 = poly->b1 = (uint8_t)v1->pad; - poly->r2 = poly->g2 = poly->b2 = (uint8_t)v2->pad; + m_lightColor(color, v0->pad, (CVECTOR*)&poly->r0); + m_lightColor(color, v1->pad, (CVECTOR*)&poly->r1); + m_lightColor(color, v2->pad, (CVECTOR*)&poly->r2); addPrim(curOT + depth, poly); ++polyCount; } } -static INLINE void drawface_triangle_strip(const ps1bsp_face_t *face, SVECTOR *vecs) +static INLINE void drawface_triangle_strip(const ps1bsp_face_t *face, SVECTOR *vecs, CVECTOR *color) { int p; @@ -136,16 +138,16 @@ static INLINE void drawface_triangle_strip(const ps1bsp_face_t *face, SVECTOR *v setPolyG3(poly); gte_stsxy3_g3(poly); - poly->r0 = poly->g0 = poly->b0 = (uint8_t)v0->pad; - poly->r1 = poly->g1 = poly->b1 = (uint8_t)v1->pad; - poly->r2 = poly->g2 = poly->b2 = (uint8_t)v2->pad; + m_lightColor(color, v0->pad, (CVECTOR*)&poly->r0); + m_lightColor(color, v1->pad, (CVECTOR*)&poly->r1); + m_lightColor(color, v2->pad, (CVECTOR*)&poly->r2); addPrim(curOT + depth, poly); ++polyCount; } } -static INLINE void drawface_quad_strip(const ps1bsp_face_t *face, SVECTOR *vecs) +static INLINE void drawface_quad_strip(const ps1bsp_face_t *face, SVECTOR *vecs, CVECTOR *color) { int p; @@ -193,10 +195,10 @@ static INLINE void drawface_quad_strip(const ps1bsp_face_t *face, SVECTOR *vecs) gte_rtps(); gte_stsxy(&poly->x3); - poly->r0 = poly->g0 = poly->b0 = (uint8_t)v0->pad; - poly->r1 = poly->g1 = poly->b1 = (uint8_t)v1->pad; - poly->r2 = poly->g2 = poly->b2 = (uint8_t)v2->pad; - poly->r3 = poly->g3 = poly->b3 = (uint8_t)v3->pad; + m_lightColor(color, v0->pad, (CVECTOR*)&poly->r0); + m_lightColor(color, v1->pad, (CVECTOR*)&poly->r1); + m_lightColor(color, v2->pad, (CVECTOR*)&poly->r2); + m_lightColor(color, v3->pad, (CVECTOR*)&poly->r3); addPrim(curOT + depth, poly); ++polyCount; @@ -237,6 +239,16 @@ static void world_drawface(const world_t *world, const ps1bsp_face_t *face) if ((dot >= 0) ^ face->side) return; + // Experimenting with tessellation levels + dot = abs(dot) / center.pad;// for a more stable albeit less accurate result, divide by a fixed value of 160 + char tess; + if (dot < 4) + tess = 0; + else if (dot < 12) + tess = 1; + else + tess = 2; + SVECTOR *vecs = (SVECTOR*)(scratchpad + 256); // Copy this face's vertices into scratch RAM for fast reuse @@ -250,9 +262,9 @@ static void world_drawface(const world_t *world, const ps1bsp_face_t *face) } if (face->numFaceVertices == 3) // Special case: draw single triangles using the simplest method - drawface_triangle_fan(face, vecs); + drawface_triangle_fan(face, vecs, &colors[tess]); else - drawface_quad_strip(face, vecs); + drawface_quad_strip(face, vecs, &colors[tess]); } static void world_drawnode(const world_t *world, short nodeIdx, u_char *pvs)