pxl8/src/pxl8_world.c

75 lines
1.6 KiB
C
Raw Normal View History

2025-10-17 17:54:33 -05:00
#include <stdlib.h>
2025-10-07 10:32:48 -05:00
#include <string.h>
#include "pxl8_bsp.h"
#include "pxl8_macros.h"
#include "pxl8_world.h"
struct pxl8_world {
pxl8_bsp bsp;
bool loaded;
u32 wireframe_color;
};
pxl8_world* pxl8_world_create(void) {
2025-10-17 17:54:33 -05:00
pxl8_world* world = (pxl8_world*)calloc(1, sizeof(pxl8_world));
2025-10-07 10:32:48 -05:00
if (!world) {
pxl8_error("Failed to allocate world");
return NULL;
}
world->loaded = false;
world->wireframe_color = 15;
return world;
}
void pxl8_world_destroy(pxl8_world* world) {
if (!world) return;
if (world->loaded) {
pxl8_bsp_destroy(&world->bsp);
}
2025-10-17 17:54:33 -05:00
free(world);
2025-10-07 10:32:48 -05:00
}
pxl8_result pxl8_world_load(pxl8_world* world, const char* path) {
if (!world || !path) return PXL8_ERROR_INVALID_ARGUMENT;
if (world->loaded) {
pxl8_bsp_destroy(&world->bsp);
world->loaded = false;
}
memset(&world->bsp, 0, sizeof(pxl8_bsp));
pxl8_result result = pxl8_bsp_load(path, &world->bsp);
if (result != PXL8_OK) {
pxl8_error("Failed to load world: %s", path);
return result;
}
world->loaded = true;
pxl8_info("Loaded world: %s", path);
return PXL8_OK;
}
void pxl8_world_render(pxl8_world* world, pxl8_gfx* gfx, pxl8_vec3 camera_pos) {
if (!world || !gfx || !world->loaded) return;
pxl8_bsp_render_wireframe(gfx, &world->bsp, camera_pos, world->wireframe_color);
}
void pxl8_world_unload(pxl8_world* world) {
if (!world || !world->loaded) return;
pxl8_bsp_destroy(&world->bsp);
world->loaded = false;
}
bool pxl8_world_is_loaded(const pxl8_world* world) {
return world && world->loaded;
}