State machine bug fixed

This commit is contained in:
Mid 2026-01-14 11:37:59 +02:00
parent 63d641cc82
commit c44e58c4ac
2 changed files with 36 additions and 18 deletions

View File

@ -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);
glFrontFace(GL_CCW);
if(cull) {
glEnable(GL_CULL_FACE);
} else {
glDisable(GL_CULL_FACE);
}
glFrontFace(GL_CCW);
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++;
}
}

View File

@ -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);