State machine bug fixed
This commit is contained in:
parent
63d641cc82
commit
c44e58c4ac
46
src/k3.c
46
src/k3.c
@ -1640,7 +1640,7 @@ static void forward_subpass(mat4 projection, mat4 view, int transparent, int lig
|
|||||||
if(!k3IsCore) {
|
if(!k3IsCore) {
|
||||||
if(mat->passes[0].alphatest) {
|
if(mat->passes[0].alphatest) {
|
||||||
glEnable(GL_ALPHA_TEST);
|
glEnable(GL_ALPHA_TEST);
|
||||||
glAlphaFunc(GL_GREATER, 0.9f);
|
glAlphaFunc(GL_GREATER, mat->passes[0].alphatest);
|
||||||
} else {
|
} else {
|
||||||
glDisable(GL_ALPHA_TEST);
|
glDisable(GL_ALPHA_TEST);
|
||||||
}
|
}
|
||||||
@ -1705,7 +1705,7 @@ void k3PassForward(mat4 projection, mat4 cam) {
|
|||||||
if(GLAD_GL_EXT_framebuffer_sRGB) {
|
if(GLAD_GL_EXT_framebuffer_sRGB) {
|
||||||
glEnable(GL_FRAMEBUFFER_SRGB_EXT);
|
glEnable(GL_FRAMEBUFFER_SRGB_EXT);
|
||||||
}
|
}
|
||||||
glEnable(GL_BLEND);
|
glDisable(GL_BLEND);
|
||||||
glEnable(GL_MULTISAMPLE);
|
glEnable(GL_MULTISAMPLE);
|
||||||
|
|
||||||
glFrontFace(GL_CCW);
|
glFrontFace(GL_CCW);
|
||||||
@ -1727,6 +1727,7 @@ void k3PassForward(mat4 projection, mat4 cam) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
glEnable(GL_BLEND);
|
||||||
|
|
||||||
// Horribly inefficient.
|
// Horribly inefficient.
|
||||||
for(size_t rble = 0; rble < renderQueueSize; rble++) {
|
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)
|
if(GLAD_GL_ARB_vertex_program)
|
||||||
glDisable(GL_VERTEX_PROGRAM_ARB);
|
glDisable(GL_VERTEX_PROGRAM_ARB);
|
||||||
|
|
||||||
glFrontFace(GL_CCW);
|
|
||||||
if(cull) {
|
|
||||||
glEnable(GL_CULL_FACE);
|
glEnable(GL_CULL_FACE);
|
||||||
} else {
|
glFrontFace(GL_CCW);
|
||||||
glDisable(GL_CULL_FACE);
|
|
||||||
}
|
|
||||||
|
|
||||||
GLuint lastVP = 0;
|
GLuint lastVP = 0;
|
||||||
struct k3GLSLP *lastGLSLP = NULL;
|
struct k3GLSLP *lastGLSLP = NULL;
|
||||||
@ -1860,7 +1857,7 @@ void k3PassDepthOnly(mat4 projection, mat4 cam, int clear, int cull) {
|
|||||||
if(!k3IsCore) {
|
if(!k3IsCore) {
|
||||||
if(mat->passes[0].alphatest) {
|
if(mat->passes[0].alphatest) {
|
||||||
glEnable(GL_ALPHA_TEST);
|
glEnable(GL_ALPHA_TEST);
|
||||||
glAlphaFunc(GL_GREATER, 0.9f);
|
glAlphaFunc(GL_GREATER, mat->passes[0].alphatest);
|
||||||
} else {
|
} else {
|
||||||
glDisable(GL_ALPHA_TEST);
|
glDisable(GL_ALPHA_TEST);
|
||||||
}
|
}
|
||||||
@ -1948,7 +1945,11 @@ static size_t compute_light_views(struct LightView lv[]) {
|
|||||||
glm_frustum_center(corners, viewcenter);
|
glm_frustum_center(corners, viewcenter);
|
||||||
|
|
||||||
mat4 lightview;
|
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 minaabb = {+HUGE_VALF, +HUGE_VALF, +HUGE_VALF};
|
||||||
vec4 maxaabb = {-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_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]);
|
glm_mat4_inv_fast(lightview, lv[i].c[cascade]);
|
||||||
}
|
}
|
||||||
} else if(l->type == k3_SPOT || l->type == k3_HALF_OMNI) {
|
} 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
|
#endif
|
||||||
|
|
||||||
// Constructs shadowmap atlas, saves `offscr` for own use
|
// 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");
|
struct k3Timer timer = k3StartTimer("k3PassShadowmap");
|
||||||
|
|
||||||
glm_mat4_copy(projection, ProjMat);
|
glm_mat4_copy(projection, ProjMat);
|
||||||
@ -2305,12 +2309,17 @@ void k3PassShadowmap(mat4 projection, mat4 cam, struct k3Offscreen *offscr, floa
|
|||||||
cellsPerDimension = cellsTotalSqrt;
|
cellsPerDimension = cellsTotalSqrt;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(cellsPerDimension < minimumSubdivision) {
|
||||||
|
cellsPerDimension = minimumSubdivision;
|
||||||
|
}
|
||||||
|
|
||||||
uint16_t sz = k3TexSzX(offscr->depth);
|
uint16_t sz = k3TexSzX(offscr->depth);
|
||||||
float cellSz = (float) sz / cellsPerDimension;
|
float cellSz = (float) sz / cellsPerDimension;
|
||||||
|
|
||||||
if(cellSizeLimit > 0) {
|
#ifdef SHADOWSKIP
|
||||||
cellSz = fminf(cellSizeLimit, cellSz);
|
static size_t shadowskipI = 0;
|
||||||
}
|
shadowskipI++;
|
||||||
|
#endif
|
||||||
|
|
||||||
k3BeginOffscreen(offscr);
|
k3BeginOffscreen(offscr);
|
||||||
size_t i = 0;
|
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);
|
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]);
|
glViewport(vp[0], vp[1], vp[2], vp[3]);
|
||||||
k3PassDepthOnly(proj, lv->c[camIdx], i == 0, false);
|
k3PassDepthOnly(proj, lv->c[camIdx], i == 0, false);
|
||||||
|
|
||||||
|
#ifdef SHADOWSKIP
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
4
src/k3.h
4
src/k3.h
@ -106,7 +106,7 @@ struct k3Mat {
|
|||||||
char additive;
|
char additive;
|
||||||
char transparent;
|
char transparent;
|
||||||
char nocull;
|
char nocull;
|
||||||
char alphatest;
|
float alphatest;
|
||||||
char depthwrite;
|
char depthwrite;
|
||||||
} passes[1];
|
} passes[1];
|
||||||
};
|
};
|
||||||
@ -194,7 +194,7 @@ void k3BatchClear();
|
|||||||
void k3PassForward(mat4 projection, mat4 cam);
|
void k3PassForward(mat4 projection, mat4 cam);
|
||||||
void k3PassDepthOnly(mat4 projection, mat4 cam, int clear, int cull);
|
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;
|
||||||
struct k3Offscreen *k3OffscreenCreateMultisampled(struct k3Tex *diffuse, struct k3Tex *depth, uint8_t samples);
|
struct k3Offscreen *k3OffscreenCreateMultisampled(struct k3Tex *diffuse, struct k3Tex *depth, uint8_t samples);
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user