2
0
mirror of https://github.com/Laupetin/OpenAssetTools.git synced 2026-06-06 08:42:35 +00:00

WIP unique tree for each material type

This commit is contained in:
LJW-Dev
2026-02-11 17:14:37 +08:00
committed by Jan Laupetin
parent a3953e2217
commit 21dcf7b46d
2 changed files with 22 additions and 3 deletions
@@ -212,6 +212,26 @@ namespace BSP
if (leafObjectCount > highestLeafObjectCount) if (leafObjectCount > highestLeafObjectCount)
highestLeafObjectCount = leafObjectCount; highestLeafObjectCount = leafObjectCount;
std::vector<unsigned int> uniqueMaterials;
for (size_t objIdx = 0; objIdx < leafObjectCount; objIdx++)
{
int partitionIdx = tree->leaf->getObject(objIdx)->partitionIndex;
unsigned materialIndex = partitionToMaterialMap[partitionIdx];
bool foundIdx = false;
for (unsigned int uniqueMat : uniqueMaterials)
{
if (uniqueMat == materialIndex)
{
foundIdx = true;
break;
}
}
if (!foundIdx)
uniqueMaterials.emplace_back(materialIndex);
}
con::info("{} {}", uniqueMaterials.size(), uniqueMaterials[0]);
// BO2 has a maximum limit of 128 children per AABB tree (essentially), // 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 // so this is fixed by adding multiple parent AABB trees that hold 128 children each
size_t result = leafObjectCount / BSPGameConstants::MAX_AABB_TREE_CHILDREN; size_t result = leafObjectCount / BSPGameConstants::MAX_AABB_TREE_CHILDREN;
@@ -533,7 +553,7 @@ namespace BSP
partitionVec.emplace_back(partition); partitionVec.emplace_back(partition);
partitionToSurfaceMap.emplace_back(surfIdx); partitionToMaterialMap.emplace_back(surface.materialIndex);
} }
} }
clipMap->partitionCount = static_cast<int>(partitionVec.size()); clipMap->partitionCount = static_cast<int>(partitionVec.size());
@@ -31,8 +31,7 @@ namespace BSP
std::vector<cLeaf_s> leafVec; std::vector<cLeaf_s> leafVec;
std::vector<CollisionAabbTree> AABBTreeVec; std::vector<CollisionAabbTree> AABBTreeVec;
size_t highestLeafObjectCount = 0; size_t highestLeafObjectCount = 0;
std::vector<unsigned> partitionToSurfaceMap; std::vector<size_t> partitionToMaterialMap;
std::vector<unsigned> surfaceToMaterialMap;
void addAABBTreeFromLeaf(clipMap_t* clipMap, BSPTree* tree, size_t* out_parentCount, size_t* out_parentStartIndex); void addAABBTreeFromLeaf(clipMap_t* clipMap, BSPTree* tree, size_t* out_parentCount, size_t* out_parentStartIndex);
int16_t loadBSPNode(clipMap_t* clipMap, BSPTree* tree); int16_t loadBSPNode(clipMap_t* clipMap, BSPTree* tree);
bool loadBSPTree(clipMap_t* clipMap, BSPData* bsp); bool loadBSPTree(clipMap_t* clipMap, BSPData* bsp);