From 4c61ca3af512b9401b9f81179f861d6e7d80543b Mon Sep 17 00:00:00 2001 From: sSsA01 <59872472+Riv1s-sSsA01@users.noreply.github.com> Date: Fri, 27 Jun 2025 18:30:04 +0900 Subject: [PATCH] Refix export fbx PolygonVertexIndex (#6240) Co-authored-by: Kim Kulling --- code/AssetLib/FBX/FBXExporter.cpp | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/code/AssetLib/FBX/FBXExporter.cpp b/code/AssetLib/FBX/FBXExporter.cpp index 1214d04c4..d4bcaafa2 100644 --- a/code/AssetLib/FBX/FBXExporter.cpp +++ b/code/AssetLib/FBX/FBXExporter.cpp @@ -1098,6 +1098,7 @@ void FBXExporter::WriteObjects () { bool bJoinIdenticalVertices = mProperties->GetPropertyBool("bJoinIdenticalVertices", true); // save vertex_indices as it is needed later std::vector> vVertexIndice(mScene->mNumMeshes); + std::vector uniq_v_before_mi; const auto bTransparencyFactorReferencedToOpacity = mProperties->GetPropertyBool(AI_CONFIG_EXPORT_FBX_TRANSPARENCY_FACTOR_REFER_TO_OPACITY, false); @@ -1144,6 +1145,7 @@ void FBXExporter::WriteObjects () { const aiMesh *m = mScene->mMeshes[mi]; size_t v_offset = vertex_indices.size(); + size_t uniq_v_before = flattened_vertices.size() / 3; // map of vertex value to its index in the data vector std::map index_by_vertex_value; @@ -1186,11 +1188,17 @@ void FBXExporter::WriteObjects () { if (f.mNumIndices == 0) continue; size_t pvi = 0; for (; pvi < f.mNumIndices - 1; pvi++) { - polygon_data.push_back(vertex_indices[v_offset + f.mIndices[pvi]]); + polygon_data.push_back( + static_cast(uniq_v_before + vertex_indices[v_offset + f.mIndices[pvi]]) + ); } - polygon_data.push_back(-1 - vertex_indices[v_offset+f.mIndices[pvi]]); + polygon_data.push_back( + static_cast(-1 ^ (uniq_v_before + vertex_indices[v_offset+f.mIndices[pvi]])) + ); } + uniq_v_before_mi.push_back(static_cast(uniq_v_before)); + if (m->HasNormals()) { normal_data.reserve(3 * polygon_data.size()); for (size_t fi = 0; fi < m->mNumFaces; fi++) { @@ -2062,7 +2070,8 @@ void FBXExporter::WriteObjects () { ASSIMP_LOG_ERROR("UNREAL: Skipping vertex index to prevent buffer overflow."); continue; } - int32_t vi = vVertexIndice[mi][b->mWeights[wi].mVertexId]; + int32_t vi = vVertexIndice[mi][b->mWeights[wi].mVertexId] + + uniq_v_before_mi[mi]; bool bIsWeightedAlready = (setWeightedVertex.find(vi) != setWeightedVertex.end()); if (vi == last_index || bIsWeightedAlready) { // only for vertices we exported to fbx