From a2c8129a138f39b86ac432344af89475acfba4de Mon Sep 17 00:00:00 2001 From: Jan Date: Thu, 3 Apr 2025 21:46:52 +0200 Subject: [PATCH] fix: messed up reordering of vertices for bone count --- .../XModel/LoaderXModel.cpp.template | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/src/ObjLoading/XModel/LoaderXModel.cpp.template b/src/ObjLoading/XModel/LoaderXModel.cpp.template index 6e208ee7..ac2f00de 100644 --- a/src/ObjLoading/XModel/LoaderXModel.cpp.template +++ b/src/ObjLoading/XModel/LoaderXModel.cpp.template @@ -539,13 +539,21 @@ namespace return false; }); + std::vector preSortTris(surface.triCount); + std::memcpy(preSortTris.data(), surface.triIndices, sizeof(XSurfaceTri) * surface.triCount); + + std::vector reverseLookup(reorderLookup.size()); + for (auto i = 0u; i < reverseLookup.size(); i++) + reverseLookup[reorderLookup[i]] = i; + for (auto triIndex = 0u; triIndex < surface.triCount; triIndex++) { + const auto& preSortTriIndices = preSortTris[triIndex]; auto& triIndices = surface.triIndices[triIndex]; - triIndices.i[0] = static_cast(reorderLookup[triIndices.i[0]]); - triIndices.i[1] = static_cast(reorderLookup[triIndices.i[1]]); - triIndices.i[2] = static_cast(reorderLookup[triIndices.i[2]]); + triIndices.i[0] = static_cast(reverseLookup[preSortTriIndices.i[0]]); + triIndices.i[1] = static_cast(reverseLookup[preSortTriIndices.i[1]]); + triIndices.i[2] = static_cast(reverseLookup[preSortTriIndices.i[2]]); } for (auto& entry : reorderLookup) @@ -570,6 +578,7 @@ namespace surface.triCount = static_cast(commonObject.m_faces.size()); surface.triIndices = m_memory.Alloc(surface.triCount); + xmodelToCommonVertexIndexLookup.reserve(static_cast(surface.triCount) * std::extent_v); for (auto faceIndex = 0u; faceIndex < surface.triCount; faceIndex++) { const auto& face = commonObject.m_faces[faceIndex]; @@ -592,8 +601,6 @@ namespace } } - ReorderVerticesByWeightCount(xmodelToCommonVertexIndexLookup, surface, common); - constexpr auto maxVertices = std::numeric_limits::max(); if (vertexOffset + xmodelToCommonVertexIndexLookup.size() > maxVertices) { @@ -601,6 +608,8 @@ namespace return false; } + ReorderVerticesByWeightCount(xmodelToCommonVertexIndexLookup, surface, common); + surface.baseVertIndex = static_cast(vertexOffset); surface.vertCount = static_cast(xmodelToCommonVertexIndexLookup.size()); surface.verts0 = m_memory.Alloc(surface.vertCount);