summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorsSsA01 <[email protected]>2025-06-27 18:30:04 +0900
committerGitHub <[email protected]>2025-06-27 11:30:04 +0200
commit4c61ca3af512b9401b9f81179f861d6e7d80543b (patch)
tree976fe23330cf72648fe5474ce73d60c6f8b42a81
parent4b6cc8c28a8bc0824b4fb6e1e99718cf74210edd (diff)
Refix export fbx PolygonVertexIndex (#6240)HEADupstream/master
Co-authored-by: Kim Kulling <[email protected]>
-rw-r--r--code/AssetLib/FBX/FBXExporter.cpp15
1 files 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<std::vector<int32_t>> vVertexIndice(mScene->mNumMeshes);
+ std::vector<uint32_t> 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<aiVector3D,size_t> 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<int32_t>(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<int32_t>(-1 ^ (uniq_v_before + vertex_indices[v_offset+f.mIndices[pvi]]))
+ );
}
+ uniq_v_before_mi.push_back(static_cast<uint32_t>(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