From f34e0bf061cd92b552f993dbd16d10bf9e186421 Mon Sep 17 00:00:00 2001 From: LJW-Dev <48092720+LJW-Dev@users.noreply.github.com> Date: Sun, 8 Feb 2026 17:03:57 +0800 Subject: [PATCH] Bux fixes for the clipmap linker --- .../Game/T6/BSP/Linker/ClipMapLinker.cpp | 40 ++++++++----------- 1 file changed, 17 insertions(+), 23 deletions(-) diff --git a/src/ObjLoading/Game/T6/BSP/Linker/ClipMapLinker.cpp b/src/ObjLoading/Game/T6/BSP/Linker/ClipMapLinker.cpp index 7d162429..afd11869 100644 --- a/src/ObjLoading/Game/T6/BSP/Linker/ClipMapLinker.cpp +++ b/src/ObjLoading/Game/T6/BSP/Linker/ClipMapLinker.cpp @@ -123,23 +123,18 @@ namespace BSP void ClipMapLinker::loadSubModelCollision(clipMap_t* clipMap, BSPData* bsp) { // Submodels are used for the world and map ent collision (triggers, bomb zones, etc) - auto gfxWorldAsset = m_context.LoadDependency(bsp->bspName); - assert(gfxWorldAsset != nullptr); - GfxWorld* gfxWorld = gfxWorldAsset->Asset(); - - // Right now there is only one submodel, the world sub model - assert(gfxWorld->modelCount == 1); - clipMap->numSubModels = 1; clipMap->cmodels = m_memory.Alloc(clipMap->numSubModels); - - GfxBrushModel* gfxModel = &gfxWorld->models[0]; - clipMap->cmodels[0].mins.x = gfxModel->bounds[0].x; - clipMap->cmodels[0].mins.y = gfxModel->bounds[0].y; - clipMap->cmodels[0].mins.z = gfxModel->bounds[0].z; - clipMap->cmodels[0].maxs.x = gfxModel->bounds[1].x; - clipMap->cmodels[0].maxs.y = gfxModel->bounds[1].y; - clipMap->cmodels[0].maxs.z = gfxModel->bounds[1].z; + for (unsigned int vertIdx = 0; vertIdx < clipMap->vertCount; vertIdx++) + { + vec3_t vertex = clipMap->verts[vertIdx]; + if (vertIdx == 0) + { + clipMap->cmodels[0].mins = vertex; + clipMap->cmodels[0].maxs = vertex; + } + BSPUtil::updateAABBWithPoint(vertex, clipMap->cmodels[0].mins, clipMap->cmodels[0].maxs); + } clipMap->cmodels[0].radius = BSPUtil::distBetweenPoints(clipMap->cmodels[0].mins, clipMap->cmodels[0].maxs) / 2; // The world sub model has no leafs associated with it @@ -155,8 +150,7 @@ namespace BSP clipMap->cmodels[0].leaf.maxs.z = 0.0f; clipMap->cmodels[0].leaf.leafBrushNode = 0; clipMap->cmodels[0].leaf.cluster = 0; - - clipMap->cmodels[0].info = nullptr; // always set to 0 + clipMap->cmodels[0].info = nullptr; } void ClipMapLinker::loadXModelCollision(clipMap_t* clipMap) @@ -632,8 +626,6 @@ namespace BSP loadRopesAndConstraints(clipMap); - loadSubModelCollision(clipMap, bsp); - loadDynEnts(clipMap); loadXModelCollision(clipMap); @@ -646,15 +638,17 @@ namespace BSP clipMap->info.materials[0].contentFlags = BSPEditableConstants::MATERIAL_CONTENT_FLAGS; clipMap->info.materials[0].surfaceFlags = BSPEditableConstants::MATERIAL_SURFACE_FLAGS; + if (!loadWorldCollision(clipMap, bsp)) + return nullptr; + + loadSubModelCollision(clipMap, bsp); // requires tri verts + // set all edges to walkable // might do weird stuff on walls, but from testing doesnt seem to do anything int walkableEdgeSize = (3 * clipMap->triCount + 31) / 32 * 4; - clipMap->triEdgeIsWalkable = new char[walkableEdgeSize]; + clipMap->triEdgeIsWalkable = m_memory.Alloc(walkableEdgeSize); memset(clipMap->triEdgeIsWalkable, 1, walkableEdgeSize * sizeof(char)); - if (!loadWorldCollision(clipMap, bsp)) - return nullptr; - return clipMap; } } // namespace BSP