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

feat: surface type and flags can now be set through the GLTF file

This commit is contained in:
LJW-Dev
2026-03-21 17:26:20 +08:00
committed by Jan Laupetin
parent b744c8d7cb
commit 3a2d332d0c
6 changed files with 371 additions and 161 deletions
@@ -184,9 +184,11 @@ namespace BSP
currModel->origin.y = bspModel.origin.y;
currModel->origin.z = bspModel.origin.z;
// tracing only checks if this is equal to 0 or not
currModel->contents = 1;
if (!xModelAsset->IsReference())
{
currModel->contents = currModel->xmodel->contents;
BSPUtil::calculateXmodelBounds(currModel->xmodel, xmodelAxis, currModel->absmin, currModel->absmax);
currModel->absmin.x = (currModel->absmin.x * bspModel.scale) + bspModel.origin.x;
currModel->absmin.y = (currModel->absmin.y * bspModel.scale) + bspModel.origin.y;
@@ -200,7 +202,6 @@ namespace BSP
}
else
{
currModel->contents = 1;
if (bspModel.areBoundsValid)
{
currModel->absmin = bspModel.mins;
@@ -260,7 +261,7 @@ namespace BSP
std::vector<size_t> objectIndexes;
};
void ClipMapLinker::addAABBTreeFromLeaf(clipMap_t* clipMap, BSPTree* tree, size_t* out_parentCount, size_t* out_parentStartIndex)
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();
@@ -376,6 +377,9 @@ namespace BSP
parentAABBArrayIndex += parentCount;
}
for (auto& matData : uniqueMaterials)
*out_treeContents |= clipMap->info.materials[matData.materialIndex].contentFlags;
}
constexpr vec3_t normalX = {1.0f, 0.0f, 0.0f};
@@ -404,19 +408,21 @@ namespace BSP
leaf.maxs.z = 0.0f;
leaf.leafBrushNode = 0;
leaf.terrainContents = 1; // todo: use correct contents
if (tree->leaf->getObjectCount() > 0)
{
size_t parentCount = 0;
size_t parentStartIndex = 0;
addAABBTreeFromLeaf(clipMap, tree, &parentCount, &parentStartIndex);
int treeContents;
addAABBTreeFromLeaf(clipMap, tree, &parentCount, &parentStartIndex, &treeContents);
leaf.collAabbCount = static_cast<uint16_t>(parentCount);
leaf.firstCollAabbIndex = static_cast<uint16_t>(parentStartIndex);
leaf.terrainContents = treeContents;
}
else
{
leaf.firstCollAabbIndex = 0;
leaf.collAabbCount = 0;
leaf.terrainContents = 0;
}
uint16_t leafIndex = static_cast<uint16_t>(leafVec.size());
@@ -693,8 +699,8 @@ namespace BSP
BSPMaterial bspMat = bsp->colWorld.materials.at(matIdx);
clipMat->name = m_memory.Dup(bspMat.materialName.c_str());
clipMat->contentFlags = BSPEditableConstants::MATERIAL_CONTENT_FLAGS;
clipMat->surfaceFlags = BSPEditableConstants::MATERIAL_SURFACE_FLAGS;
clipMat->contentFlags = bspMat.contentFlags;
clipMat->surfaceFlags = bspMat.surfaceFlags;
}
return true;
@@ -728,7 +734,7 @@ namespace BSP
if (!loadMaterials(clipMap, bsp))
return nullptr;
if (!loadWorldCollision(clipMap, bsp))
if (!loadWorldCollision(clipMap, bsp)) // requires materials
return nullptr;
loadSubModelCollision(clipMap, bsp); // requires tri verts
@@ -32,7 +32,7 @@ namespace BSP
std::vector<CollisionAabbTree> AABBTreeVec;
size_t highestLeafObjectCount = 0;
std::vector<size_t> partitionToMaterialMap;
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, int* out_treeContents);
int16_t loadBSPNode(clipMap_t* clipMap, BSPTree* tree);
bool loadBSPTree(clipMap_t* clipMap, BSPData* bsp);
bool loadPartitions(clipMap_t* clipMap, BSPData* bsp);