mirror of
https://github.com/Laupetin/OpenAssetTools.git
synced 2025-09-01 06:27:26 +00:00
chore: dump xmodel type as part of json
This commit is contained in:
@@ -38,9 +38,23 @@ namespace GAME
|
||||
|
||||
NLOHMANN_DEFINE_TYPE_EXTENSION(JsonXModelLod, file, distance);
|
||||
|
||||
enum class JsonXModelType
|
||||
{
|
||||
RIGID,
|
||||
ANIMATED,
|
||||
VIEWHANDS
|
||||
};
|
||||
|
||||
NLOHMANN_JSON_SERIALIZE_ENUM(JsonXModelType, {
|
||||
{JsonXModelType::RIGID, "rigid" },
|
||||
{JsonXModelType::ANIMATED, "animated" },
|
||||
{JsonXModelType::VIEWHANDS, "viewhands" }
|
||||
});
|
||||
|
||||
class JsonXModel
|
||||
{
|
||||
public:
|
||||
std::optional<JsonXModelType> type;
|
||||
std::vector<JsonXModelLod> lods;
|
||||
std::optional<int> collLod;
|
||||
std::optional<std::string> physPreset;
|
||||
@@ -58,6 +72,7 @@ namespace GAME
|
||||
|
||||
NLOHMANN_DEFINE_TYPE_EXTENSION(
|
||||
JsonXModel,
|
||||
type,
|
||||
lods,
|
||||
collLod,
|
||||
physPreset,
|
||||
|
@@ -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;
|
||||
|
Reference in New Issue
Block a user