From c44e58c4acd30587fb1798e3aec660452fb463bc Mon Sep 17 00:00:00 2001 From: Mid <> Date: Wed, 14 Jan 2026 11:37:59 +0200 Subject: [PATCH] State machine bug fixed --- src/k3.c | 48 +++++++++++++++++++++++++++++++++--------------- src/k3.h | 6 +++--- 2 files changed, 36 insertions(+), 18 deletions(-) diff --git a/src/k3.c b/src/k3.c index 3b60e94..12206a4 100644 --- a/src/k3.c +++ b/src/k3.c @@ -1640,7 +1640,7 @@ static void forward_subpass(mat4 projection, mat4 view, int transparent, int lig if(!k3IsCore) { if(mat->passes[0].alphatest) { glEnable(GL_ALPHA_TEST); - glAlphaFunc(GL_GREATER, 0.9f); + glAlphaFunc(GL_GREATER, mat->passes[0].alphatest); } else { glDisable(GL_ALPHA_TEST); } @@ -1705,7 +1705,7 @@ void k3PassForward(mat4 projection, mat4 cam) { if(GLAD_GL_EXT_framebuffer_sRGB) { glEnable(GL_FRAMEBUFFER_SRGB_EXT); } - glEnable(GL_BLEND); + glDisable(GL_BLEND); glEnable(GL_MULTISAMPLE); glFrontFace(GL_CCW); @@ -1727,6 +1727,7 @@ void k3PassForward(mat4 projection, mat4 cam) { break; } } + glEnable(GL_BLEND); // Horribly inefficient. for(size_t rble = 0; rble < renderQueueSize; rble++) { @@ -1780,12 +1781,8 @@ void k3PassDepthOnly(mat4 projection, mat4 cam, int clear, int cull) { if(GLAD_GL_ARB_vertex_program) glDisable(GL_VERTEX_PROGRAM_ARB); + glEnable(GL_CULL_FACE); glFrontFace(GL_CCW); - if(cull) { - glEnable(GL_CULL_FACE); - } else { - glDisable(GL_CULL_FACE); - } GLuint lastVP = 0; struct k3GLSLP *lastGLSLP = NULL; @@ -1860,7 +1857,7 @@ void k3PassDepthOnly(mat4 projection, mat4 cam, int clear, int cull) { if(!k3IsCore) { if(mat->passes[0].alphatest) { glEnable(GL_ALPHA_TEST); - glAlphaFunc(GL_GREATER, 0.9f); + glAlphaFunc(GL_GREATER, mat->passes[0].alphatest); } else { glDisable(GL_ALPHA_TEST); } @@ -1948,7 +1945,11 @@ static size_t compute_light_views(struct LightView lv[]) { glm_frustum_center(corners, viewcenter); mat4 lightview; - glm_look_anyup(viewcenter, l->dir.direction, lightview); + if(glm_vec3_dot(l->dir.direction, (vec3) {0, 1, 0}) >= 0.99) { + glm_look(viewcenter, l->dir.direction, (vec3) {1, 0, 0}, lightview); + } else { + glm_look(viewcenter, l->dir.direction, (vec3) {0, 1, 0}, lightview); + } vec4 minaabb = {+HUGE_VALF, +HUGE_VALF, +HUGE_VALF}; vec4 maxaabb = {-HUGE_VALF, -HUGE_VALF, -HUGE_VALF}; @@ -1961,7 +1962,10 @@ static size_t compute_light_views(struct LightView lv[]) { glm_vec4_maxv(maxaabb, lightspaceCorner, maxaabb); } - glm_ortho(minaabb[0], maxaabb[0], minaabb[1], maxaabb[1], minaabb[2] - 50, maxaabb[2], lv[i].p[cascade]); + // TODO: automate + float minz = 50; + + glm_ortho(minaabb[0], maxaabb[0], minaabb[1], maxaabb[1], minaabb[2] - minz, maxaabb[2], lv[i].p[cascade]); glm_mat4_inv_fast(lightview, lv[i].c[cascade]); } } else if(l->type == k3_SPOT || l->type == k3_HALF_OMNI) { @@ -2262,7 +2266,7 @@ void k3PassIrregular(struct k3Offscreen *mainview, mat4 mainproj, mat4 maincam) #endif // Constructs shadowmap atlas, saves `offscr` for own use -void k3PassShadowmap(mat4 projection, mat4 cam, struct k3Offscreen *offscr, float cellSizeLimit) { +void k3PassShadowmap(mat4 projection, mat4 cam, struct k3Offscreen *offscr, int minimumSubdivision) { struct k3Timer timer = k3StartTimer("k3PassShadowmap"); glm_mat4_copy(projection, ProjMat); @@ -2305,12 +2309,17 @@ void k3PassShadowmap(mat4 projection, mat4 cam, struct k3Offscreen *offscr, floa cellsPerDimension = cellsTotalSqrt; } + if(cellsPerDimension < minimumSubdivision) { + cellsPerDimension = minimumSubdivision; + } + uint16_t sz = k3TexSzX(offscr->depth); float cellSz = (float) sz / cellsPerDimension; - - if(cellSizeLimit > 0) { - cellSz = fminf(cellSizeLimit, cellSz); - } + +#ifdef SHADOWSKIP + static size_t shadowskipI = 0; + shadowskipI++; +#endif k3BeginOffscreen(offscr); size_t i = 0; @@ -2342,9 +2351,18 @@ void k3PassShadowmap(mat4 projection, mat4 cam, struct k3Offscreen *offscr, floa glm_vec4_copy((vec4) {i, (float) cellSz / sz, 0, 0}, LightShadows[li].atlasSegment); } +#ifdef SHADOWSKIP + // Skip every second light + if((li + shadowskipI) % 2) { +#endif + glViewport(vp[0], vp[1], vp[2], vp[3]); k3PassDepthOnly(proj, lv->c[camIdx], i == 0, false); +#ifdef SHADOWSKIP + } +#endif + i++; } } diff --git a/src/k3.h b/src/k3.h index e3e5216..bfb7ca8 100644 --- a/src/k3.h +++ b/src/k3.h @@ -77,7 +77,7 @@ struct k3Mat { } arbfp; struct { struct k3GLSLP *hp; - + #ifdef k3_IRREGULAR_SHADOWS struct k3GLSLP *hpIrreg1; struct k3GLSLP *hpIrreg2; @@ -106,7 +106,7 @@ struct k3Mat { char additive; char transparent; char nocull; - char alphatest; + float alphatest; char depthwrite; } passes[1]; }; @@ -194,7 +194,7 @@ void k3BatchClear(); void k3PassForward(mat4 projection, mat4 cam); void k3PassDepthOnly(mat4 projection, mat4 cam, int clear, int cull); -void k3PassShadowmap(mat4 projection, mat4 cam, struct k3Offscreen *offscr, float cellSizeLimit); +void k3PassShadowmap(mat4 projection, mat4 cam, struct k3Offscreen *offscr, int minimumSubdivision); struct k3Offscreen; struct k3Offscreen *k3OffscreenCreateMultisampled(struct k3Tex *diffuse, struct k3Tex *depth, uint8_t samples);