diff --git a/src/ObjCommon/XModel/XModelCommon.h b/src/ObjCommon/XModel/XModelCommon.h index bccba75b..2caf68b3 100644 --- a/src/ObjCommon/XModel/XModelCommon.h +++ b/src/ObjCommon/XModel/XModelCommon.h @@ -38,7 +38,7 @@ struct XModelVertexBoneWeightCollection struct XModelVertexBoneWeights { - const XModelBoneWeight* weights; + unsigned weightOffset; unsigned weightCount; }; diff --git a/src/ObjWriting/Game/IW3/AssetDumpers/AssetDumperXModel.cpp b/src/ObjWriting/Game/IW3/AssetDumpers/AssetDumperXModel.cpp index bb414b49..c69a0f9e 100644 --- a/src/ObjWriting/Game/IW3/AssetDumpers/AssetDumperXModel.cpp +++ b/src/ObjWriting/Game/IW3/AssetDumpers/AssetDumperXModel.cpp @@ -295,7 +295,7 @@ namespace for (auto vertListIndex = 0u; vertListIndex < surface.vertListCount; vertListIndex++) { const auto& vertList = surface.vertList[vertListIndex]; - const auto* boneWeightOffset = &weightCollection.weights[weightOffset]; + const auto boneWeightOffset = weightOffset; weightCollection.weights[weightOffset++] = XModelBoneWeight{vertList.boneOffset / sizeof(DObjSkelMat), 1.0f}; @@ -313,7 +313,7 @@ namespace // 1 bone weight for (auto vertIndex = 0; vertIndex < surface.vertInfo.vertCount[0]; vertIndex++) { - const auto* boneWeightOffset = &weightCollection.weights[weightOffset]; + const auto boneWeightOffset = weightOffset; const auto boneIndex0 = surface.vertInfo.vertsBlend[vertsBlendOffset + 0] / sizeof(DObjSkelMat); weightCollection.weights[weightOffset++] = XModelBoneWeight{boneIndex0, 1.0f}; @@ -325,7 +325,7 @@ namespace // 2 bone weights for (auto vertIndex = 0; vertIndex < surface.vertInfo.vertCount[1]; vertIndex++) { - const auto* boneWeightOffset = &weightCollection.weights[weightOffset]; + const auto boneWeightOffset = weightOffset; const auto boneIndex0 = surface.vertInfo.vertsBlend[vertsBlendOffset + 0] / sizeof(DObjSkelMat); const auto boneIndex1 = surface.vertInfo.vertsBlend[vertsBlendOffset + 1] / sizeof(DObjSkelMat); const auto boneWeight1 = BoneWeight16(surface.vertInfo.vertsBlend[vertsBlendOffset + 2]); @@ -342,7 +342,7 @@ namespace // 3 bone weights for (auto vertIndex = 0; vertIndex < surface.vertInfo.vertCount[2]; vertIndex++) { - const auto* boneWeightOffset = &weightCollection.weights[weightOffset]; + const auto boneWeightOffset = weightOffset; const auto boneIndex0 = surface.vertInfo.vertsBlend[vertsBlendOffset + 0] / sizeof(DObjSkelMat); const auto boneIndex1 = surface.vertInfo.vertsBlend[vertsBlendOffset + 1] / sizeof(DObjSkelMat); const auto boneWeight1 = BoneWeight16(surface.vertInfo.vertsBlend[vertsBlendOffset + 2]); @@ -362,7 +362,7 @@ namespace // 4 bone weights for (auto vertIndex = 0; vertIndex < surface.vertInfo.vertCount[3]; vertIndex++) { - const auto* boneWeightOffset = &weightCollection.weights[weightOffset]; + const auto boneWeightOffset = weightOffset; const auto boneIndex0 = surface.vertInfo.vertsBlend[vertsBlendOffset + 0] / sizeof(DObjSkelMat); const auto boneIndex1 = surface.vertInfo.vertsBlend[vertsBlendOffset + 1] / sizeof(DObjSkelMat); const auto boneWeight1 = BoneWeight16(surface.vertInfo.vertsBlend[vertsBlendOffset + 2]); @@ -388,7 +388,7 @@ namespace for (; handledVertices < surface.vertCount; handledVertices++) { - out.m_vertex_bone_weights.emplace_back(nullptr, 0); + out.m_vertex_bone_weights.emplace_back(0, 0); } } } diff --git a/src/ObjWriting/Game/IW4/AssetDumpers/AssetDumperXModel.cpp b/src/ObjWriting/Game/IW4/AssetDumpers/AssetDumperXModel.cpp index 75ccbe5b..5a36bd6f 100644 --- a/src/ObjWriting/Game/IW4/AssetDumpers/AssetDumperXModel.cpp +++ b/src/ObjWriting/Game/IW4/AssetDumpers/AssetDumperXModel.cpp @@ -278,7 +278,7 @@ namespace for (auto vertListIndex = 0u; vertListIndex < surface.vertListCount; vertListIndex++) { const auto& vertList = surface.vertList[vertListIndex]; - const auto* boneWeightOffset = &weightCollection.weights[weightOffset]; + const auto boneWeightOffset = weightOffset; weightCollection.weights[weightOffset++] = XModelBoneWeight{vertList.boneOffset / sizeof(DObjSkelMat), 1.0f}; @@ -296,7 +296,7 @@ namespace // 1 bone weight for (auto vertIndex = 0; vertIndex < surface.vertInfo.vertCount[0]; vertIndex++) { - const auto* boneWeightOffset = &weightCollection.weights[weightOffset]; + const auto boneWeightOffset = weightOffset; const auto boneIndex0 = surface.vertInfo.vertsBlend[vertsBlendOffset + 0] / sizeof(DObjSkelMat); weightCollection.weights[weightOffset++] = XModelBoneWeight{boneIndex0, 1.0f}; @@ -308,7 +308,7 @@ namespace // 2 bone weights for (auto vertIndex = 0; vertIndex < surface.vertInfo.vertCount[1]; vertIndex++) { - const auto* boneWeightOffset = &weightCollection.weights[weightOffset]; + const auto boneWeightOffset = weightOffset; const auto boneIndex0 = surface.vertInfo.vertsBlend[vertsBlendOffset + 0] / sizeof(DObjSkelMat); const auto boneIndex1 = surface.vertInfo.vertsBlend[vertsBlendOffset + 1] / sizeof(DObjSkelMat); const auto boneWeight1 = BoneWeight16(surface.vertInfo.vertsBlend[vertsBlendOffset + 2]); @@ -325,7 +325,7 @@ namespace // 3 bone weights for (auto vertIndex = 0; vertIndex < surface.vertInfo.vertCount[2]; vertIndex++) { - const auto* boneWeightOffset = &weightCollection.weights[weightOffset]; + const auto boneWeightOffset = weightOffset; const auto boneIndex0 = surface.vertInfo.vertsBlend[vertsBlendOffset + 0] / sizeof(DObjSkelMat); const auto boneIndex1 = surface.vertInfo.vertsBlend[vertsBlendOffset + 1] / sizeof(DObjSkelMat); const auto boneWeight1 = BoneWeight16(surface.vertInfo.vertsBlend[vertsBlendOffset + 2]); @@ -345,7 +345,7 @@ namespace // 4 bone weights for (auto vertIndex = 0; vertIndex < surface.vertInfo.vertCount[3]; vertIndex++) { - const auto* boneWeightOffset = &weightCollection.weights[weightOffset]; + const auto boneWeightOffset = weightOffset; const auto boneIndex0 = surface.vertInfo.vertsBlend[vertsBlendOffset + 0] / sizeof(DObjSkelMat); const auto boneIndex1 = surface.vertInfo.vertsBlend[vertsBlendOffset + 1] / sizeof(DObjSkelMat); const auto boneWeight1 = BoneWeight16(surface.vertInfo.vertsBlend[vertsBlendOffset + 2]); @@ -371,7 +371,7 @@ namespace for (; handledVertices < surface.vertCount; handledVertices++) { - out.m_vertex_bone_weights.emplace_back(nullptr, 0); + out.m_vertex_bone_weights.emplace_back(0, 0); } } } diff --git a/src/ObjWriting/Game/IW5/AssetDumpers/AssetDumperXModel.cpp b/src/ObjWriting/Game/IW5/AssetDumpers/AssetDumperXModel.cpp index 3ff626e5..53b4bf5e 100644 --- a/src/ObjWriting/Game/IW5/AssetDumpers/AssetDumperXModel.cpp +++ b/src/ObjWriting/Game/IW5/AssetDumpers/AssetDumperXModel.cpp @@ -278,7 +278,7 @@ namespace for (auto vertListIndex = 0u; vertListIndex < surface.vertListCount; vertListIndex++) { const auto& vertList = surface.vertList[vertListIndex]; - const auto* boneWeightOffset = &weightCollection.weights[weightOffset]; + const auto boneWeightOffset = weightOffset; weightCollection.weights[weightOffset++] = XModelBoneWeight{vertList.boneOffset / sizeof(DObjSkelMat), 1.0f}; @@ -296,7 +296,7 @@ namespace // 1 bone weight for (auto vertIndex = 0; vertIndex < surface.vertInfo.vertCount[0]; vertIndex++) { - const auto* boneWeightOffset = &weightCollection.weights[weightOffset]; + const auto boneWeightOffset = weightOffset; const auto boneIndex0 = surface.vertInfo.vertsBlend[vertsBlendOffset + 0] / sizeof(DObjSkelMat); weightCollection.weights[weightOffset++] = XModelBoneWeight{boneIndex0, 1.0f}; @@ -308,7 +308,7 @@ namespace // 2 bone weights for (auto vertIndex = 0; vertIndex < surface.vertInfo.vertCount[1]; vertIndex++) { - const auto* boneWeightOffset = &weightCollection.weights[weightOffset]; + const auto boneWeightOffset = weightOffset; const auto boneIndex0 = surface.vertInfo.vertsBlend[vertsBlendOffset + 0] / sizeof(DObjSkelMat); const auto boneIndex1 = surface.vertInfo.vertsBlend[vertsBlendOffset + 1] / sizeof(DObjSkelMat); const auto boneWeight1 = BoneWeight16(surface.vertInfo.vertsBlend[vertsBlendOffset + 2]); @@ -325,7 +325,7 @@ namespace // 3 bone weights for (auto vertIndex = 0; vertIndex < surface.vertInfo.vertCount[2]; vertIndex++) { - const auto* boneWeightOffset = &weightCollection.weights[weightOffset]; + const auto boneWeightOffset = weightOffset; const auto boneIndex0 = surface.vertInfo.vertsBlend[vertsBlendOffset + 0] / sizeof(DObjSkelMat); const auto boneIndex1 = surface.vertInfo.vertsBlend[vertsBlendOffset + 1] / sizeof(DObjSkelMat); const auto boneWeight1 = BoneWeight16(surface.vertInfo.vertsBlend[vertsBlendOffset + 2]); @@ -345,7 +345,7 @@ namespace // 4 bone weights for (auto vertIndex = 0; vertIndex < surface.vertInfo.vertCount[3]; vertIndex++) { - const auto* boneWeightOffset = &weightCollection.weights[weightOffset]; + const auto boneWeightOffset = weightOffset; const auto boneIndex0 = surface.vertInfo.vertsBlend[vertsBlendOffset + 0] / sizeof(DObjSkelMat); const auto boneIndex1 = surface.vertInfo.vertsBlend[vertsBlendOffset + 1] / sizeof(DObjSkelMat); const auto boneWeight1 = BoneWeight16(surface.vertInfo.vertsBlend[vertsBlendOffset + 2]); @@ -371,7 +371,7 @@ namespace for (; handledVertices < surface.vertCount; handledVertices++) { - out.m_vertex_bone_weights.emplace_back(nullptr, 0); + out.m_vertex_bone_weights.emplace_back(0, 0); } } } diff --git a/src/ObjWriting/Game/T5/AssetDumpers/AssetDumperXModel.cpp b/src/ObjWriting/Game/T5/AssetDumpers/AssetDumperXModel.cpp index 379a964b..48d67550 100644 --- a/src/ObjWriting/Game/T5/AssetDumpers/AssetDumperXModel.cpp +++ b/src/ObjWriting/Game/T5/AssetDumpers/AssetDumperXModel.cpp @@ -294,7 +294,7 @@ namespace for (auto vertListIndex = 0u; vertListIndex < surface.vertListCount; vertListIndex++) { const auto& vertList = surface.vertList[vertListIndex]; - const auto* boneWeightOffset = &weightCollection.weights[weightOffset]; + const auto boneWeightOffset = weightOffset; weightCollection.weights[weightOffset++] = XModelBoneWeight{vertList.boneOffset / sizeof(DObjSkelMat), 1.0f}; @@ -312,7 +312,7 @@ namespace // 1 bone weight for (auto vertIndex = 0; vertIndex < surface.vertInfo.vertCount[0]; vertIndex++) { - const auto* boneWeightOffset = &weightCollection.weights[weightOffset]; + const auto boneWeightOffset = weightOffset; const auto boneIndex0 = surface.vertInfo.vertsBlend[vertsBlendOffset + 0] / sizeof(DObjSkelMat); weightCollection.weights[weightOffset++] = XModelBoneWeight{boneIndex0, 1.0f}; @@ -324,7 +324,7 @@ namespace // 2 bone weights for (auto vertIndex = 0; vertIndex < surface.vertInfo.vertCount[1]; vertIndex++) { - const auto* boneWeightOffset = &weightCollection.weights[weightOffset]; + const auto boneWeightOffset = weightOffset; const auto boneIndex0 = surface.vertInfo.vertsBlend[vertsBlendOffset + 0] / sizeof(DObjSkelMat); const auto boneIndex1 = surface.vertInfo.vertsBlend[vertsBlendOffset + 1] / sizeof(DObjSkelMat); const auto boneWeight1 = BoneWeight16(surface.vertInfo.vertsBlend[vertsBlendOffset + 2]); @@ -341,7 +341,7 @@ namespace // 3 bone weights for (auto vertIndex = 0; vertIndex < surface.vertInfo.vertCount[2]; vertIndex++) { - const auto* boneWeightOffset = &weightCollection.weights[weightOffset]; + const auto boneWeightOffset = weightOffset; const auto boneIndex0 = surface.vertInfo.vertsBlend[vertsBlendOffset + 0] / sizeof(DObjSkelMat); const auto boneIndex1 = surface.vertInfo.vertsBlend[vertsBlendOffset + 1] / sizeof(DObjSkelMat); const auto boneWeight1 = BoneWeight16(surface.vertInfo.vertsBlend[vertsBlendOffset + 2]); @@ -361,7 +361,7 @@ namespace // 4 bone weights for (auto vertIndex = 0; vertIndex < surface.vertInfo.vertCount[3]; vertIndex++) { - const auto* boneWeightOffset = &weightCollection.weights[weightOffset]; + const auto boneWeightOffset = weightOffset; const auto boneIndex0 = surface.vertInfo.vertsBlend[vertsBlendOffset + 0] / sizeof(DObjSkelMat); const auto boneIndex1 = surface.vertInfo.vertsBlend[vertsBlendOffset + 1] / sizeof(DObjSkelMat); const auto boneWeight1 = BoneWeight16(surface.vertInfo.vertsBlend[vertsBlendOffset + 2]); @@ -387,7 +387,7 @@ namespace for (; handledVertices < surface.vertCount; handledVertices++) { - out.m_vertex_bone_weights.emplace_back(nullptr, 0); + out.m_vertex_bone_weights.emplace_back(0, 0); } } } diff --git a/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperXModel.cpp b/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperXModel.cpp index 10da34dd..e5b501b3 100644 --- a/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperXModel.cpp +++ b/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperXModel.cpp @@ -315,7 +315,7 @@ namespace for (auto vertListIndex = 0u; vertListIndex < surface.vertListCount; vertListIndex++) { const auto& vertList = surface.vertList[vertListIndex]; - const auto* boneWeightOffset = &weightCollection.weights[weightOffset]; + const auto boneWeightOffset = weightOffset; weightCollection.weights[weightOffset++] = XModelBoneWeight{vertList.boneOffset / sizeof(DObjSkelMat), 1.0f}; @@ -333,7 +333,7 @@ namespace // 1 bone weight for (auto vertIndex = 0; vertIndex < surface.vertInfo.vertCount[0]; vertIndex++) { - const auto* boneWeightOffset = &weightCollection.weights[weightOffset]; + const auto boneWeightOffset = weightOffset; const auto boneIndex0 = surface.vertInfo.vertsBlend[vertsBlendOffset + 0] / sizeof(DObjSkelMat); weightCollection.weights[weightOffset++] = XModelBoneWeight{boneIndex0, 1.0f}; @@ -345,7 +345,7 @@ namespace // 2 bone weights for (auto vertIndex = 0; vertIndex < surface.vertInfo.vertCount[1]; vertIndex++) { - const auto* boneWeightOffset = &weightCollection.weights[weightOffset]; + const auto boneWeightOffset = weightOffset; const auto boneIndex0 = surface.vertInfo.vertsBlend[vertsBlendOffset + 0] / sizeof(DObjSkelMat); const auto boneIndex1 = surface.vertInfo.vertsBlend[vertsBlendOffset + 1] / sizeof(DObjSkelMat); const auto boneWeight1 = BoneWeight16(surface.vertInfo.vertsBlend[vertsBlendOffset + 2]); @@ -362,7 +362,7 @@ namespace // 3 bone weights for (auto vertIndex = 0; vertIndex < surface.vertInfo.vertCount[2]; vertIndex++) { - const auto* boneWeightOffset = &weightCollection.weights[weightOffset]; + const auto boneWeightOffset = weightOffset; const auto boneIndex0 = surface.vertInfo.vertsBlend[vertsBlendOffset + 0] / sizeof(DObjSkelMat); const auto boneIndex1 = surface.vertInfo.vertsBlend[vertsBlendOffset + 1] / sizeof(DObjSkelMat); const auto boneWeight1 = BoneWeight16(surface.vertInfo.vertsBlend[vertsBlendOffset + 2]); @@ -382,7 +382,7 @@ namespace // 4 bone weights for (auto vertIndex = 0; vertIndex < surface.vertInfo.vertCount[3]; vertIndex++) { - const auto* boneWeightOffset = &weightCollection.weights[weightOffset]; + const auto boneWeightOffset = weightOffset; const auto boneIndex0 = surface.vertInfo.vertsBlend[vertsBlendOffset + 0] / sizeof(DObjSkelMat); const auto boneIndex1 = surface.vertInfo.vertsBlend[vertsBlendOffset + 1] / sizeof(DObjSkelMat); const auto boneWeight1 = BoneWeight16(surface.vertInfo.vertsBlend[vertsBlendOffset + 2]); @@ -408,7 +408,7 @@ namespace for (; handledVertices < surface.vertCount; handledVertices++) { - out.m_vertex_bone_weights.emplace_back(nullptr, 0); + out.m_vertex_bone_weights.emplace_back(0, 0); } } } diff --git a/src/ObjWriting/XModel/Export/XModelExportWriter.cpp b/src/ObjWriting/XModel/Export/XModelExportWriter.cpp index ace0c29e..8cb6419d 100644 --- a/src/ObjWriting/XModel/Export/XModelExportWriter.cpp +++ b/src/ObjWriting/XModel/Export/XModelExportWriter.cpp @@ -18,12 +18,16 @@ protected: auto vertexOffset = 0u; for (const auto& vertex : xmodel.m_vertices) { - XModelVertexBoneWeights weights{nullptr, 0}; + XModelVertexBoneWeights weights{0, 0}; if (vertexOffset < xmodel.m_vertex_bone_weights.size()) weights = xmodel.m_vertex_bone_weights[vertexOffset]; - m_vertex_merger.Add(VertexMergerPos{vertex.coordinates[0], vertex.coordinates[1], vertex.coordinates[2], weights.weights, weights.weightCount}); + m_vertex_merger.Add(VertexMergerPos{vertex.coordinates[0], + vertex.coordinates[1], + vertex.coordinates[2], + &xmodel.m_bone_weight_data.weights[weights.weightOffset], + weights.weightCount}); vertexOffset++; } diff --git a/src/ObjWriting/XModel/Gltf/GltfWriter.cpp b/src/ObjWriting/XModel/Gltf/GltfWriter.cpp index 94a1786f..39e9f0ff 100644 --- a/src/ObjWriting/XModel/Gltf/GltfWriter.cpp +++ b/src/ObjWriting/XModel/Gltf/GltfWriter.cpp @@ -496,14 +496,15 @@ namespace auto* weights = reinterpret_cast(&bufferData[currentBufferOffset + sizeof(uint8_t) * 4u * xmodel.m_vertex_bone_weights.size()]); for (const auto& commonVertexWeights : xmodel.m_vertex_bone_weights) { - assert(commonVertexWeights.weights != nullptr); + assert(commonVertexWeights.weightOffset < xmodel.m_bone_weight_data.weights.size()); assert(commonVertexWeights.weightCount <= 4u); const auto commonVertexWeightCount = std::min(commonVertexWeights.weightCount, 4u); + const auto* commonVertexWeightData = &xmodel.m_bone_weight_data.weights[commonVertexWeights.weightOffset]; for (auto i = 0u; i < commonVertexWeightCount; i++) { - joints[i] = static_cast(commonVertexWeights.weights[i].boneIndex); - weights[i] = commonVertexWeights.weights[i].weight; + joints[i] = static_cast(commonVertexWeightData[i].boneIndex); + weights[i] = commonVertexWeightData[i].weight; } for (auto i = commonVertexWeightCount; i < 4u; i++)