enable camera frustum culling for bsp rendering

This commit is contained in:
asrael 2025-11-10 10:24:27 -06:00
parent 704b14b2a0
commit ac8ab8d60d
No known key found for this signature in database
GPG key ID: 2786557804DFAE24
4 changed files with 36 additions and 82 deletions

View file

@ -486,6 +486,8 @@ void pxl8_bsp_render_solid(
if (rendered_faces[face_id]) continue;
rendered_faces[face_id] = 1;
if (!face_in_frustum(bsp, face_id, frustum)) continue;
pxl8_bsp_render_face(gfx, bsp, face_id, texture_id);
}
}
@ -500,6 +502,9 @@ void pxl8_bsp_render_wireframe(
) {
if (!gfx || !bsp) return;
const pxl8_frustum* frustum = pxl8_3d_get_frustum(gfx);
if (!frustum) return;
i32 camera_leaf = pxl8_bsp_find_leaf(bsp, camera_pos);
for (u32 leaf_id = 0; leaf_id < bsp->num_leafs; leaf_id++) {
@ -514,6 +519,8 @@ void pxl8_bsp_render_wireframe(
u32 face_id = bsp->marksurfaces[surf_idx];
if (face_id >= bsp->num_faces) continue;
if (!face_in_frustum(bsp, face_id, frustum)) continue;
const pxl8_bsp_face* face = &bsp->faces[face_id];
for (u32 e = 0; e < face->num_edges; e++) {

View file

@ -255,35 +255,35 @@ pxl8_frustum pxl8_frustum_from_matrix(pxl8_mat4 vp) {
pxl8_frustum frustum;
const f32* m = vp.m;
frustum.planes[0].normal.x = m[3] - m[0];
frustum.planes[0].normal.y = m[7] - m[4];
frustum.planes[0].normal.z = m[11] - m[8];
frustum.planes[0].distance = m[15] - m[12];
frustum.planes[0].normal.x = m[12] - m[0];
frustum.planes[0].normal.y = m[13] - m[1];
frustum.planes[0].normal.z = m[14] - m[2];
frustum.planes[0].distance = m[15] - m[3];
frustum.planes[1].normal.x = m[3] + m[0];
frustum.planes[1].normal.y = m[7] + m[4];
frustum.planes[1].normal.z = m[11] + m[8];
frustum.planes[1].distance = m[15] + m[12];
frustum.planes[1].normal.x = m[12] + m[0];
frustum.planes[1].normal.y = m[13] + m[1];
frustum.planes[1].normal.z = m[14] + m[2];
frustum.planes[1].distance = m[15] + m[3];
frustum.planes[2].normal.x = m[3] + m[1];
frustum.planes[2].normal.y = m[7] + m[5];
frustum.planes[2].normal.z = m[11] + m[9];
frustum.planes[2].distance = m[15] + m[13];
frustum.planes[2].normal.x = m[12] + m[4];
frustum.planes[2].normal.y = m[13] + m[5];
frustum.planes[2].normal.z = m[14] + m[6];
frustum.planes[2].distance = m[15] + m[7];
frustum.planes[3].normal.x = m[3] - m[1];
frustum.planes[3].normal.y = m[7] - m[5];
frustum.planes[3].normal.z = m[11] - m[9];
frustum.planes[3].distance = m[15] - m[13];
frustum.planes[3].normal.x = m[12] - m[4];
frustum.planes[3].normal.y = m[13] - m[5];
frustum.planes[3].normal.z = m[14] - m[6];
frustum.planes[3].distance = m[15] - m[7];
frustum.planes[4].normal.x = m[3] - m[2];
frustum.planes[4].normal.y = m[7] - m[6];
frustum.planes[4].normal.z = m[11] - m[10];
frustum.planes[4].distance = m[15] - m[14];
frustum.planes[4].normal.x = m[12] - m[8];
frustum.planes[4].normal.y = m[13] - m[9];
frustum.planes[4].normal.z = m[14] - m[10];
frustum.planes[4].distance = m[15] - m[11];
frustum.planes[5].normal.x = m[3] + m[2];
frustum.planes[5].normal.y = m[7] + m[6];
frustum.planes[5].normal.z = m[11] + m[10];
frustum.planes[5].distance = m[15] + m[14];
frustum.planes[5].normal.x = m[12] + m[8];
frustum.planes[5].normal.y = m[13] + m[9];
frustum.planes[5].normal.z = m[14] + m[10];
frustum.planes[5].distance = m[15] + m[11];
for (i32 i = 0; i < 6; i++) {
f32 len = pxl8_vec3_length(frustum.planes[i].normal);