diff --git a/src/ObjLoading/Game/T6/BSP/Linker/ClipMapLinker.cpp b/src/ObjLoading/Game/T6/BSP/Linker/ClipMapLinker.cpp index ff348e19..7d2f3075 100644 --- a/src/ObjLoading/Game/T6/BSP/Linker/ClipMapLinker.cpp +++ b/src/ObjLoading/Game/T6/BSP/Linker/ClipMapLinker.cpp @@ -454,130 +454,6 @@ namespace BSP *out_treeContents |= clipMap->info.materials[matData.materialIndex].contentFlags; } - /* - void ClipMapLinker::addAABBTreeFromLeaf(clipMap_t* clipMap, BSPTree* tree, size_t* out_parentCount, size_t* out_parentStartIndex, int* out_treeContents) - { - assert(tree->isLeaf); - BSPLeaf* bspLeaf = tree->leaf.get(); - - size_t leafObjectCount = bspLeaf->getObjectCount(); - assert(leafObjectCount > 0); - if (leafObjectCount > highestPartitionCountForAABB) - highestPartitionCountForAABB = leafObjectCount; - - // the material index of the AABB tree is only checked for the parent node, so each parent has only children with the same material - std::vector uniqueMaterials; - for (size_t objIdx = 0; objIdx < leafObjectCount; objIdx++) - { - int partitionIdx = bspLeaf->getObject(objIdx)->partitionIndex; - size_t materialIndex = collisionSurfaceVec.at(partitionToColSurfaceMap.at(partitionIdx)).materialIndex; - bool foundIdx = false; - for (auto& uniqueMat : uniqueMaterials) - { - if (uniqueMat.materialIndex == materialIndex) - { - uniqueMat.objectIndexes.emplace_back(objIdx); - foundIdx = true; - break; - } - } - if (!foundIdx) - { - uniqueMatData data; - data.materialIndex = materialIndex; - data.objectIndexes.emplace_back(objIdx); - uniqueMaterials.emplace_back(data); - } - } - - // BO2 has a maximum limit of 128 children per AABB tree (essentially), - // so this is fixed by adding multiple parent AABB trees that hold 128 children each - size_t totalParentCount = 0; - for (auto& matData : uniqueMaterials) - { - size_t objCount = matData.objectIndexes.size(); - size_t result = objCount / BSPGameConstants::MAX_AABB_TREE_CHILDREN; - size_t remainder = objCount % BSPGameConstants::MAX_AABB_TREE_CHILDREN; - if (remainder > 0) - result++; - totalParentCount += result; - } - - // every parent node needs to be contiguous in memory - size_t parentAABBArrayIndex = AABBTreeVec.size(); - AABBTreeVec.resize(AABBTreeVec.size() + totalParentCount); - *out_parentCount = totalParentCount; - *out_parentStartIndex = parentAABBArrayIndex; - - for (auto& matData : uniqueMaterials) - { - size_t* objIndexes = matData.objectIndexes.data(); - size_t objCount = matData.objectIndexes.size(); - size_t parentCount = objCount / BSPGameConstants::MAX_AABB_TREE_CHILDREN; - size_t remainder = objCount % BSPGameConstants::MAX_AABB_TREE_CHILDREN; - if (remainder > 0) - parentCount++; - - size_t unaddedObjectCount = objCount; - size_t addedObjectCount = 0; - for (size_t parentIdx = 0; parentIdx < parentCount; parentIdx++) - { - size_t currChildObjectCount = BSPGameConstants::MAX_AABB_TREE_CHILDREN; - if (unaddedObjectCount <= BSPGameConstants::MAX_AABB_TREE_CHILDREN) - currChildObjectCount = unaddedObjectCount; - else - unaddedObjectCount -= BSPGameConstants::MAX_AABB_TREE_CHILDREN; - - vec3_t parentMins; - vec3_t parentMaxs; - size_t childObjectStartIndex = AABBTreeVec.size(); - for (size_t objectIdx = 0; objectIdx < currChildObjectCount; objectIdx++) - { - // create a child AABBTree with the partition and add it to AABBTreeVec - int partitionIndex = bspLeaf->getObject(objIndexes[addedObjectCount + objectIdx])->partitionIndex; - CollisionPartition* partition = &clipMap->partitions[partitionIndex]; - vec3_t childMins; - vec3_t childMaxs; - calculatePartitionAABB(clipMap, partition, childMins, childMaxs); - - CollisionAabbTree childAABBTree; - childAABBTree.materialIndex = matData.materialIndex; - childAABBTree.childCount = 0; - childAABBTree.u.partitionIndex = partitionIndex; - childAABBTree.origin = BSPUtil::calcMiddleOfAABB(childMins, childMaxs); - childAABBTree.halfSize = BSPUtil::calcHalfSizeOfAABB(childMins, childMaxs); - AABBTreeVec.emplace_back(childAABBTree); - - // update the parent AABB with the child AABB - if (objectIdx == 0) - { - parentMins = childMins; - parentMaxs = childMaxs; - } - else - BSPUtil::updateAABB(childMins, childMaxs, parentMins, parentMaxs); - } - - CollisionAabbTree parentAABB; - parentAABB.materialIndex = matData.materialIndex; - parentAABB.origin = BSPUtil::calcMiddleOfAABB(parentMins, parentMaxs); - parentAABB.halfSize = BSPUtil::calcHalfSizeOfAABB(parentMins, parentMaxs); - parentAABB.childCount = static_cast(currChildObjectCount); - parentAABB.u.firstChildIndex = static_cast(childObjectStartIndex); - AABBTreeVec.at(parentAABBArrayIndex + parentIdx) = parentAABB; - - addedObjectCount += currChildObjectCount; - } - - parentAABBArrayIndex += parentCount; - } - - *out_treeContents = 0; - for (auto& matData : uniqueMaterials) - *out_treeContents |= clipMap->info.materials[matData.materialIndex].contentFlags; - } - */ - constexpr vec3_t normalX = {1.0f, 0.0f, 0.0f}; constexpr vec3_t normalY = {0.0f, 1.0f, 0.0f}; constexpr vec3_t normalZ = {0.0f, 0.0f, 1.0f}; @@ -841,104 +717,6 @@ namespace BSP memcpy(clipMap->info.uinds, uniqueIndicesVec.data(), sizeof(uint16_t) * uniqueIndicesVec.size()); return true; - - //// The clipmap index buffer has a unique index for each vertex in the world, compared to the gfxworld's - //// index buffer having a unique index for each vertex on a surface. This code converts gfxworld indices to clipmap indices. - // std::vector triIndexVec; - // for (BSPSurface& surface : bsp->colWorld.surfaces) - //{ - // int indexOfFirstIndex = surface.indexOfFirstIndex; - // int indexOfFirstVertex = surface.indexOfFirstVertex; - // for (int indexIdx = 0; indexIdx < surface.triCount * 3; indexIdx++) - // { - // int triIndex = bsp->colWorld.indices[indexOfFirstIndex + indexIdx] + indexOfFirstVertex; - // triIndexVec.emplace_back(triIndex); - // } - // } - //// the reinterpret_cast is used as triIndices is just a pointer to an array of indicies, and static_cast can't safely do the conversion - // clipMap->triCount = static_cast(triIndexVec.size() / 3); - // clipMap->triIndices = reinterpret_cast(m_memory.Alloc(triIndexVec.size())); - // memcpy(clipMap->triIndices, &triIndexVec[0], sizeof(uint16_t) * triIndexVec.size()); - // - //// partitions are "containers" for vertices. BSP tree leafs contain a list of these partitions to determine the collision within a leaf. - // std::vector partitionVec; - // std::vector uniqueIndicesVec; - // for (size_t surfIdx = 0; surfIdx < bsp->colWorld.surfaces.size(); surfIdx++) - //{ - // BSPSurface& surface = bsp->colWorld.surfaces[surfIdx]; - // - // // partitions are made for each triangle, not one for each surface. - // // one for each surface causes physics bugs, as the entire bounding box is considered solid instead of the surface itself (for some reason). - // // so a partition is made for each triangle which removes the physics bugs but likely makes the game run slower - // int indexOfFirstTri = surface.indexOfFirstIndex / 3; - // int indexOfFirstVertex = surface.indexOfFirstVertex; - // for (int triIdx = 0; triIdx < surface.triCount; triIdx++) - // { - // CollisionPartition partition; - // partition.triCount = 1; - // partition.firstTri = indexOfFirstTri + triIdx; - // - // partition.nuinds = 3; - // partition.fuind = static_cast(uniqueIndicesVec.size()); - // - // // All tri indices are unique since there is only one tri per partition - // uint16_t* tri = clipMap->triIndices[partition.firstTri]; - // uniqueIndicesVec.emplace_back(tri[0]); - // uniqueIndicesVec.emplace_back(tri[1]); - // uniqueIndicesVec.emplace_back(tri[2]); - // - // partitionVec.emplace_back(partition); - // - // partitionToMaterialMap.emplace_back(surface.materialIndex); - // } - // } - // clipMap->partitionCount = static_cast(partitionVec.size()); - // clipMap->partitions = m_memory.Alloc(clipMap->partitionCount); - // memcpy(clipMap->partitions, partitionVec.data(), sizeof(CollisionPartition) * partitionVec.size()); - // - // clipMap->info.nuinds = static_cast(uniqueIndicesVec.size()); - // clipMap->info.uinds = m_memory.Alloc(uniqueIndicesVec.size()); - // memcpy(clipMap->info.uinds, uniqueIndicesVec.data(), sizeof(uint16_t) * uniqueIndicesVec.size()); - - /* - // Proper unique index creation code kept for future use - int totalUindCount = 0; - std::vector uindVec; - for (int i = 0; i < clipMap->partitionCount; i++) - { - CollisionPartition* currPartition = &clipMap->partitions[i]; - std::vector uniqueVertVec; - for (int k = 0; k < currPartition->triCount; k++) - { - uint16_t* tri = clipMap->triIndices[currPartition->firstTri + k]; - for (int l = 0; l < 3; l++) - { - bool isVertexIndexUnique = true; - uint16_t vertIndex = tri[l]; - - for (size_t m = 0; m < uniqueVertVec.size(); m++) - { - if (uniqueVertVec[m] == vertIndex) - { - isVertexIndexUnique = false; - break; - } - } - - if (isVertexIndexUnique) - uniqueVertVec.emplace_back(vertIndex); - } - } - - currPartition->fuind = totalUindCount; - currPartition->nuinds = (int)uniqueVertVec.size(); - uindVec.insert(uindVec.end(), uniqueVertVec.begin(), uniqueVertVec.end()); - totalUindCount += currPartition->nuinds; - } - clipMap->info.nuinds = totalUindCount; - clipMap->info.uinds = m_memory.Alloc(totalUindCount); - memcpy(clipMap->info.uinds, &uindVec[0], sizeof(uint16_t) * totalUindCount); - */ } bool ClipMapLinker::loadWorldCollision(clipMap_t* clipMap, BSPData* bsp)