diff --git a/ps1bsp.h b/ps1bsp.h index 922ffc9..73c0597 100755 --- a/ps1bsp.h +++ b/ps1bsp.h @@ -39,6 +39,7 @@ typedef struct ps1bsp_dentry_t leaves; ps1bsp_dentry_t leafFaces; ps1bsp_dentry_t visData; + ps1bsp_dentry_t models; } ps1bsp_header_t; typedef struct @@ -142,6 +143,15 @@ typedef struct ps1bsp_leaf_s const struct ps1bsp_leaf_s* nextLeaf; // For chaining leafs in drawing order } ps1bsp_leaf_t; +typedef struct +{ + SVECTOR boundingSphere; + SVECTOR origin; + + u_short nodeId; + u_short clipNodeId; +} ps1bsp_model_t; + // Pre-parsed and encoded entity data (this runs the risk of becoming too bloated) typedef struct { diff --git a/test.ps1bsp b/test.ps1bsp index 976566e..328295e 100755 Binary files a/test.ps1bsp and b/test.ps1bsp differ diff --git a/world.c b/world.c index 5634e8e..b5cefe2 100644 --- a/world.c +++ b/world.c @@ -50,6 +50,7 @@ void world_load(const u_long *data, world_t *world) LOAD_CHUNK(ps1bsp_leaf_t, world->leaves, world->numLeaves, bytes, header->leaves); LOAD_CHUNK(u_short, world->leafFaces, world->numLeafFaces, bytes, header->leafFaces); LOAD_CHUNK(u_char, world->visData, world->numVisData, bytes, header->visData); + LOAD_CHUNK(ps1bsp_model_t, world->models, world->numModels, bytes, header->models); } static INLINE short world_pointPlaneDist(const VECTOR *point, const ps1bsp_plane_t *plane) @@ -315,7 +316,7 @@ void world_draw(const world_t *world) world_drawface = &world_drawface_lit; ps1bsp_leaf_t *firstLeaf = NULL; - world_sortLeafs(world, 0, pvs, &firstLeaf); + world_sortLeafs(world, world->models[0].nodeId, pvs, &firstLeaf); ps1bsp_face_t *firstFace = world_sortFaces(world, firstLeaf); world_drawFaces(world, firstFace); } diff --git a/world.h b/world.h index 36811a2..cd796bc 100644 --- a/world.h +++ b/world.h @@ -37,6 +37,9 @@ typedef struct u_short numVisData; u_char *visData; + + u_short numModels; + ps1bsp_model_t *models; } world_t; #define CONTENTS_EMPTY -1