doin' some cleanup...

This commit is contained in:
asrael 2026-04-14 13:16:47 -05:00
parent 40f5cdcaa5
commit f6d6efea95
16 changed files with 136 additions and 182 deletions

View file

@ -53,25 +53,6 @@ static bool validate_chunk(const demo3d_bsp_chunk* chunk, u32 element_size, usiz
return true;
}
static inline bool demo3d_bsp_get_edge_vertex(const demo3d_bsp* bsp, i32 surfedge_idx, u32* out_vert_idx) {
if (surfedge_idx >= (i32)bsp->num_surfedges) return false;
i32 edge_idx = bsp->surfedges[surfedge_idx];
u32 vertex_index;
if (edge_idx >= 0) {
if ((u32)edge_idx >= bsp->num_edges) return false;
vertex_index = 0;
} else {
edge_idx = -edge_idx;
if ((u32)edge_idx >= bsp->num_edges) return false;
vertex_index = 1;
}
*out_vert_idx = bsp->edges[edge_idx].vertex[vertex_index];
return *out_vert_idx < bsp->num_vertices;
}
pxl8_result demo3d_bsp_load(const char* path, demo3d_bsp* bsp) {
if (!path || !bsp) return PXL8_ERROR_INVALID_ARGUMENT;

View file

@ -138,6 +138,25 @@ typedef struct demo3d_bsp {
f32 bounds_max_z;
} demo3d_bsp;
static inline bool demo3d_bsp_get_edge_vertex(const demo3d_bsp* bsp, i32 surfedge_idx, u32* out_vert_idx) {
if (surfedge_idx >= (i32)bsp->num_surfedges) return false;
i32 edge_idx = bsp->surfedges[surfedge_idx];
u32 vertex_index;
if (edge_idx >= 0) {
if ((u32)edge_idx >= bsp->num_edges) return false;
vertex_index = 0;
} else {
edge_idx = -edge_idx;
if ((u32)edge_idx >= bsp->num_edges) return false;
vertex_index = 1;
}
*out_vert_idx = bsp->edges[edge_idx].vertex[vertex_index];
return *out_vert_idx < bsp->num_vertices;
}
#ifdef __cplusplus
extern "C" {
#endif

View file

@ -7,25 +7,6 @@
#include "pxl8_mem.h"
#include "pxl8_mesh.h"
static inline bool demo3d_bsp_get_edge_vertex(const demo3d_bsp* bsp, i32 surfedge_idx, u32* out_vert_idx) {
if (surfedge_idx >= (i32)bsp->num_surfedges) return false;
i32 edge_idx = bsp->surfedges[surfedge_idx];
u32 vertex_index;
if (edge_idx >= 0) {
if ((u32)edge_idx >= bsp->num_edges) return false;
vertex_index = 0;
} else {
edge_idx = -edge_idx;
if ((u32)edge_idx >= bsp->num_edges) return false;
vertex_index = 1;
}
*out_vert_idx = bsp->edges[edge_idx].vertex[vertex_index];
return *out_vert_idx < bsp->num_vertices;
}
static inline bool face_in_frustum(const demo3d_bsp* bsp, u32 face_id, const pxl8_frustum* frustum) {
const demo3d_bsp_face* face = &bsp->faces[face_id];
return pxl8_frustum_test_aabb(frustum, face->aabb_min, face->aabb_max);
@ -132,12 +113,20 @@ demo3d_bsp_render_state* demo3d_bsp_render_state_create(u32 num_faces) {
}
}
state->mesh = pxl8_mesh_create(8192, 16384);
if (!state->mesh) {
pxl8_free(state->render_face_flags);
pxl8_free(state);
return NULL;
}
return state;
}
void demo3d_bsp_render_state_destroy(demo3d_bsp_render_state* state) {
if (!state) return;
pxl8_free(state->materials);
pxl8_mesh_destroy(state->mesh);
pxl8_free(state->render_face_flags);
pxl8_free(state);
}
@ -152,17 +141,24 @@ void demo3d_bsp_render(pxl8_gfx* gfx, const demo3d_bsp* bsp,
const pxl8_frustum* frustum = pxl8_3d_get_frustum(gfx);
if (!frustum) return;
pxl8_mesh* mesh = pxl8_mesh_create(8192, 16384);
pxl8_mesh* mesh = state->mesh;
if (!mesh) return;
u8 ambient = pxl8_gfx_get_ambient(gfx);
pxl8_mat4 identity = pxl8_mat4_identity();
u8 mat_has_faces[256] = {0};
for (u32 face_id = 0; face_id < bsp->num_faces; face_id++) {
if (!state->render_face_flags[face_id]) continue;
u16 mid = bsp->faces[face_id].material_id;
if (mid < state->num_materials) mat_has_faces[mid] = 1;
}
for (u32 mat = 0; mat < state->num_materials; mat++) {
if (!mat_has_faces[mat]) continue;
for (u32 face_id = 0; face_id < bsp->num_faces; face_id++) {
if (!state->render_face_flags[face_id]) continue;
const demo3d_bsp_face* face = &bsp->faces[face_id];
if (face->material_id != mat) continue;
if (bsp->faces[face_id].material_id != mat) continue;
if (!face_in_frustum(bsp, face_id, frustum)) continue;
collect_face_to_mesh(bsp, state, face_id, mesh, ambient);
}
@ -173,8 +169,6 @@ void demo3d_bsp_render(pxl8_gfx* gfx, const demo3d_bsp* bsp,
pxl8_mesh_clear(mesh);
}
}
pxl8_mesh_destroy(mesh);
}
void demo3d_bsp_set_material(demo3d_bsp_render_state* state, u16 material_id, const pxl8_gfx_material* material) {

View file

@ -7,8 +7,11 @@
extern "C" {
#endif
#include "pxl8_mesh.h"
typedef struct demo3d_bsp_render_state {
pxl8_gfx_material* materials;
pxl8_mesh* mesh;
u8* render_face_flags;
u32 num_materials;
u32 num_faces;

View file

@ -11,20 +11,6 @@ typedef struct {
bool start_solid;
} trace_result;
static i32 bsp_find_leaf(const demo3d_bsp* bsp, pxl8_vec3 pos) {
if (!bsp || bsp->num_nodes == 0) return -1;
i32 node_id = 0;
while (node_id >= 0) {
const demo3d_bsp_node* node = &bsp->nodes[node_id];
const demo3d_bsp_plane* plane = &bsp->planes[node->plane_id];
f32 dist = pxl8_vec3_dot(pos, plane->normal) - plane->dist;
node_id = node->children[dist < 0 ? 1 : 0];
}
return -(node_id + 1);
}
static i32 bsp_contents_from(const demo3d_bsp* bsp, i32 node_id, pxl8_vec3 pos) {
while (node_id >= 0) {
const demo3d_bsp_node* node = &bsp->nodes[node_id];
@ -124,7 +110,7 @@ bool demo3d_bsp_point_solid(const demo3d_bsp* bsp, pxl8_vec3 pos) {
(pos.x < bsp->bounds_min_x || pos.x >= bsp->bounds_max_x ||
pos.z < bsp->bounds_min_z || pos.z >= bsp->bounds_max_z))
return false;
i32 leaf = bsp_find_leaf(bsp, pos);
i32 leaf = demo3d_bsp_find_leaf(bsp, pos);
if (leaf < 0 || (u32)leaf >= bsp->num_leafs) return true;
return bsp->leafs[leaf].contents == -1;
}