mirror of
https://github.com/Laupetin/OpenAssetTools.git
synced 2025-09-01 14:37:25 +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);
|
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
|
class JsonXModel
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
std::optional<JsonXModelType> type;
|
||||||
std::vector<JsonXModelLod> lods;
|
std::vector<JsonXModelLod> lods;
|
||||||
std::optional<int> collLod;
|
std::optional<int> collLod;
|
||||||
std::optional<std::string> physPreset;
|
std::optional<std::string> physPreset;
|
||||||
@@ -58,6 +72,7 @@ namespace GAME
|
|||||||
|
|
||||||
NLOHMANN_DEFINE_TYPE_EXTENSION(
|
NLOHMANN_DEFINE_TYPE_EXTENSION(
|
||||||
JsonXModel,
|
JsonXModel,
|
||||||
|
type,
|
||||||
lods,
|
lods,
|
||||||
collLod,
|
collLod,
|
||||||
physPreset,
|
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)
|
static void CreateJsonXModel(JsonXModel& jXModel, const XModel& xmodel)
|
||||||
{
|
{
|
||||||
if (xmodel.collLod >= 0)
|
if (xmodel.collLod >= 0)
|
||||||
jXModel.collLod = xmodel.collLod;
|
jXModel.collLod = xmodel.collLod;
|
||||||
|
|
||||||
|
jXModel.type = GetType(xmodel);
|
||||||
|
|
||||||
for (auto lodNumber = 0u; lodNumber < xmodel.numLods; lodNumber++)
|
for (auto lodNumber = 0u; lodNumber < xmodel.numLods; lodNumber++)
|
||||||
{
|
{
|
||||||
JsonXModelLod lod;
|
JsonXModelLod lod;
|
||||||
|
Reference in New Issue
Block a user