From 9b64ba1623a73fdd524be8dd9b026d9fdfb00ea4 Mon Sep 17 00:00:00 2001 From: Jan Date: Sun, 8 Sep 2024 14:28:15 +0200 Subject: [PATCH 1/2] chore: omit default armature when dumping xmodels --- .../T6/AssetDumpers/AssetDumperXModel.cpp | 50 ++++++++++++++++++- 1 file changed, 48 insertions(+), 2 deletions(-) diff --git a/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperXModel.cpp b/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperXModel.cpp index 9a030b9b..d5add6b3 100644 --- a/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperXModel.cpp +++ b/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperXModel.cpp @@ -114,6 +114,44 @@ namespace return potentialTextureDefs[0]->image; } + bool HasDefaultArmature(const XModel* model, const unsigned lod) + { + if (model->numRootBones != 1 || model->numBones != 1) + return false; + + const auto* surfs = &model->surfs[model->lodInfo[lod].surfIndex]; + const auto surfCount = model->lodInfo[lod].numsurfs; + + if (!surfs) + return true; + + for (auto surfIndex = 0u; surfIndex < surfCount; surfIndex++) + { + const auto& surface = surfs[surfIndex]; + + if (surface.vertListCount != 1 || surface.vertInfo.vertsBlend) + return false; + + const auto& vertList = surface.vertList[0]; + if (vertList.boneOffset != 0 || vertList.triOffset != 0 || vertList.triCount != surface.triCount || vertList.vertCount != surface.vertCount) + return false; + } + + return true; + } + + void OmitDefaultArmature(XModelCommon& common) + { + common.m_bones.clear(); + common.m_bone_weight_data.weights.clear(); + common.m_vertex_bone_weights.resize(common.m_vertices.size()); + for (auto& vertexWeights : common.m_vertex_bone_weights) + { + vertexWeights.weightOffset = 0u; + vertexWeights.weightCount = 0u; + } + } + void AddXModelBones(XModelCommon& out, const AssetDumpingContext& context, const XModel* model) { for (auto boneNum = 0u; boneNum < model->numBones; boneNum++) @@ -438,12 +476,20 @@ namespace AllocateXModelBoneWeights(model, lod, out.m_bone_weight_data); out.m_name = std::format("{}_lod{}", model->name, lod); - AddXModelBones(out, context, model); AddXModelMaterials(out, materialMapper, model); AddXModelObjects(out, model, lod, materialMapper); AddXModelVertices(out, model, lod); - AddXModelVertexBoneWeights(out, model, lod); AddXModelFaces(out, model, lod); + + if (!HasDefaultArmature(model, lod)) + { + AddXModelBones(out, context, model); + AddXModelVertexBoneWeights(out, model, lod); + } + else + { + OmitDefaultArmature(out); + } } void DumpObjMtl(const XModelCommon& common, const AssetDumpingContext& context, const XAssetInfo* asset) From becfdbf8142bd52796d88a33c326da322e5048d8 Mon Sep 17 00:00:00 2001 From: Jan Date: Sun, 8 Sep 2024 14:40:20 +0200 Subject: [PATCH 2/2] chore: omit skel node when dumping gltf without armature --- src/ObjWriting/XModel/Gltf/GltfWriter.cpp | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/ObjWriting/XModel/Gltf/GltfWriter.cpp b/src/ObjWriting/XModel/Gltf/GltfWriter.cpp index 05512e73..8d1017f5 100644 --- a/src/ObjWriting/XModel/Gltf/GltfWriter.cpp +++ b/src/ObjWriting/XModel/Gltf/GltfWriter.cpp @@ -89,6 +89,10 @@ namespace gltf.nodes.emplace(); m_mesh_node = gltf.nodes->size(); + + if (xmodel.m_bones.empty()) + m_root_node = m_mesh_node; + gltf.nodes->emplace_back(std::move(meshNode)); } @@ -96,6 +100,9 @@ namespace { JsonNode rootNode; + if (xmodel.m_bones.empty()) + return; + if (!xmodel.m_name.empty()) rootNode.name = std::format("{}_skel", xmodel.m_name); @@ -104,9 +111,7 @@ namespace rootNode.children.emplace(); rootNode.children->push_back(m_mesh_node); - - if (!xmodel.m_bones.empty()) - rootNode.children->push_back(m_first_bone_node); + rootNode.children->push_back(m_first_bone_node); m_root_node = gltf.nodes->size(); gltf.nodes->emplace_back(std::move(rootNode));