From 3bb8a63ee12a8c28f9e37b3c55a98e32539ca268 Mon Sep 17 00:00:00 2001 From: Mid <> Date: Sun, 27 Jul 2025 16:16:45 +0300 Subject: [PATCH] Frustum culling --- src/k3.c | 34 +++++++++++++++++++++++++++++++--- 1 file changed, 31 insertions(+), 3 deletions(-) diff --git a/src/k3.c b/src/k3.c index ac58d0e..9164acf 100644 --- a/src/k3.c +++ b/src/k3.c @@ -12,6 +12,7 @@ #include #include #include +#include #include"ssort.h" @@ -1309,9 +1310,22 @@ static void apply_cpu_skinning(struct k3Mdl *mdl, struct k3AnimationBone *bones) glBufferSubDataARB(GL_ARRAY_BUFFER_ARB, mdl->offV, mdl->verts * sizeof(*boned), boned); } -static void forward_subpass(mat4 view, int transparent, int lightsStart, int lightsCount, size_t rbleStart, size_t rbleEnd) { +static bool outside_frustum(vec3 *aabb, float *modelmat, vec4 *frustum) { + vec3 transformedAABB[2]; + glm_aabb_transform(aabb, modelmat, transformedAABB); + + return !glm_aabb_frustum(transformedAABB, frustum); +} + +static void forward_subpass(mat4 projection, mat4 view, int transparent, int lightsStart, int lightsCount, size_t rbleStart, size_t rbleEnd) { setup_ff_lights(view, lightsStart, lightsCount); + mat4 viewProj; + glm_mat4_mul(projection, view, viewProj); + + vec4 cameraFrustum[6]; + glm_frustum_planes(viewProj, cameraFrustum); + GLhandleARB lastGLSL = -1; GLuint lastVP = 0, lastFP = 0; struct k3Mat *lastMaterial = NULL; @@ -1327,6 +1341,10 @@ static void forward_subpass(mat4 view, int transparent, int lightsStart, int lig GLuint arbvp = renderQueue[rble].arbvp; GLuint arbfp = renderQueue[rble].arbfp; + if(outside_frustum(mdl->aabb, modelmat, cameraFrustum)) { + continue; + } + struct k3Mat *mat = &mesh->mat; if(mat->passes[0].additive && lightsStart != 0) { @@ -1535,7 +1553,7 @@ void k3PassForward(mat4 projection, mat4 cam) { int l = 0, k = LightCount; while(1) { - forward_subpass(view, 0, l, k > 4 ? 4 : k, 0, renderQueueSize); + forward_subpass(projection, view, 0, l, k > 4 ? 4 : k, 0, renderQueueSize); l += 4; k -= 4; @@ -1549,7 +1567,7 @@ void k3PassForward(mat4 projection, mat4 cam) { for(size_t rble = 0; rble < renderQueueSize; rble++) { l = 0, k = LightCount; while(1) { - forward_subpass(view, 1, l, k > 4 ? 4 : k, rble, rble + 1); + forward_subpass(projection, view, 1, l, k > 4 ? 4 : k, rble, rble + 1); l += 4; k -= 4; @@ -1573,6 +1591,12 @@ void k3PassDepthOnly(mat4 projection, mat4 cam, int clear, int cull) { setup_arbprog_globals(); + mat4 viewProj; + glm_mat4_mul(projection, view, viewProj); + + vec4 cameraFrustum[6]; + glm_frustum_planes(viewProj, cameraFrustum); + glEnable(GL_DEPTH_TEST); glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); glDepthMask(GL_TRUE); @@ -1608,6 +1632,10 @@ void k3PassDepthOnly(mat4 projection, mat4 cam, int clear, int cull) { continue; } + if(outside_frustum(mdl->aabb, modelmat, cameraFrustum)) { + continue; + } + GLhandleARB glsl = renderQueue[rble].glsl; GLuint arbvp = renderQueue[rble].arbvp;