2
0
mirror of https://github.com/Laupetin/OpenAssetTools.git synced 2025-09-05 16:27:27 +00:00

chore: dump xmodel type as part of json

This commit is contained in:
Jan Laupetin
2025-07-20 13:21:12 +02:00
parent 4cdf568f5b
commit 89b7482a0a
2 changed files with 91 additions and 0 deletions

View File

@@ -712,11 +712,87 @@ namespace
}
}
static bool IsAnimated(const XModel& xmodel)
{
#if defined(FEATURE_IW4) || defined(FEATURE_IW5)
for (auto i = 0u; i < xmodel.numLods; i++)
{
const auto& lod = xmodel.lodInfo[i];
if (lod.modelSurfs == nullptr || lod.modelSurfs->surfs == nullptr)
continue;
for (auto j = 0u; j < lod.modelSurfs->numsurfs; j++)
{
const auto& surf = xmodel.lodInfo[i].modelSurfs->surfs[j];
if (surf.vertInfo.vertsBlend)
return true;
}
}
#else
for (auto i = 0u; i < xmodel.numsurfs; i++)
{
const auto& surf = xmodel.surfs[i];
if (surf.vertInfo.vertsBlend)
return true;
}
#endif
return false;
}
static bool HasNulledTrans(const XModel& xmodel)
{
if (xmodel.trans == nullptr)
return true;
const auto transCount = (xmodel.numBones - xmodel.numRootBones) * 3u;
for (auto i = 0u; i < transCount; i++)
{
if (xmodel.trans[i] != 0)
return false;
}
return true;
}
static bool HasNonNullBoneInfoTrans(const XModel& xmodel)
{
if (xmodel.boneInfo == nullptr)
return false;
for (auto i = 0u; i < xmodel.numBones; i++)
{
const auto& boneInfo = xmodel.boneInfo[i];
#if defined(FEATURE_IW4) || defined(FEATURE_IW5)
if (boneInfo.bounds.midPoint.x != 0 || boneInfo.bounds.midPoint.y != 0 || boneInfo.bounds.midPoint.z != 0)
return true;
#else
if (boneInfo.offset.x != 0 || boneInfo.offset.y != 0 || boneInfo.offset.z != 0)
return true;
#endif
}
return false;
}
static JsonXModelType GetType(const XModel& xmodel)
{
if (!IsAnimated(xmodel))
return JsonXModelType::RIGID;
if (HasNulledTrans(xmodel) && HasNonNullBoneInfoTrans(xmodel))
return JsonXModelType::VIEWHANDS;
return JsonXModelType::ANIMATED;
}
static void CreateJsonXModel(JsonXModel& jXModel, const XModel& xmodel)
{
if (xmodel.collLod >= 0)
jXModel.collLod = xmodel.collLod;
jXModel.type = GetType(xmodel);
for (auto lodNumber = 0u; lodNumber < xmodel.numLods; lodNumber++)
{
JsonXModelLod lod;