diff --git a/code/AssetLib/FBX/FBXExporter.cpp b/code/AssetLib/FBX/FBXExporter.cpp index 7fb839c4e..30ad523c6 100644 --- a/code/AssetLib/FBX/FBXExporter.cpp +++ b/code/AssetLib/FBX/FBXExporter.cpp @@ -1108,9 +1108,6 @@ void FBXExporter::WriteObjects () { std::vector> uv_data; std::vector> uv_indices; - std::map index_by_uv; - - std::vector offsets = { 0 }; indent = 2; @@ -1123,7 +1120,7 @@ void FBXExporter::WriteObjects () { // map of vertex value to its index in the data vector std::map index_by_vertex_value; - if(bJoinIdenticalVertices){ + if (bJoinIdenticalVertices) { int32_t index = 0; for (size_t vi = 0; vi < m->mNumVertices; ++vi) { aiVector3D vtx = m->mVertices[vi]; @@ -1139,7 +1136,7 @@ void FBXExporter::WriteObjects () { } } else { // do not join vertex, respect the export flag vertex_indices.resize(v_offset + m->mNumVertices); - std::iota(vertex_indices.begin() + v_offset, vertex_indices.end(), (int)v_offset); + std::iota(vertex_indices.begin() + v_offset, vertex_indices.end(), 0); for(unsigned int v = 0; v < m->mNumVertices; ++ v) { aiVector3D vtx = m->mVertices[v]; flattened_vertices.insert(flattened_vertices.end(), {vtx.x, vtx.y, vtx.z}); @@ -1147,8 +1144,8 @@ void FBXExporter::WriteObjects () { } vVertexIndice[mi].insert( // TODO test whether this can be end or not - vVertexIndice[mi].begin(), - vertex_indices.begin(), + vVertexIndice[mi].end(), + vertex_indices.begin() + v_offset, vertex_indices.end() ); @@ -1159,6 +1156,7 @@ void FBXExporter::WriteObjects () { // the last vertex index of each polygon is negated and - 1 for (size_t fi = 0; fi < m->mNumFaces; fi++) { const aiFace &f = m->mFaces[fi]; + if (f.mNumIndices == 0) continue; size_t pvi = 0; for (; pvi < f.mNumIndices - 1; pvi++) { polygon_data.push_back( @@ -1166,7 +1164,7 @@ void FBXExporter::WriteObjects () { ); } polygon_data.push_back( - static_cast(-1 - (uniq_v_before + vertex_indices[v_offset+f.mIndices[pvi]])) + static_cast(-1 ^ (uniq_v_before + vertex_indices[v_offset+f.mIndices[pvi]])) ); } @@ -1198,10 +1196,12 @@ void FBXExporter::WriteObjects () { const auto num_uv = static_cast(m->GetNumUVChannels()); uv_indices.resize(std::max(num_uv, uv_indices.size())); uv_data.resize(std::max(num_uv, uv_data.size())); + std::map index_by_uv; // uvs, if any for (size_t uvi = 0; uvi < m->GetNumUVChannels(); uvi++) { - if (m->mNumUVComponents[uvi] > 2) { + const auto nc = m->mNumUVComponents[uvi]; + if (nc > 2) { // FBX only supports 2-channel UV maps... // or at least i'm not sure how to indicate a different number std::stringstream err; @@ -1217,7 +1217,7 @@ void FBXExporter::WriteObjects () { ASSIMP_LOG_WARN(err.str()); } - int32_t index = 0; + int32_t index = static_cast(uv_data[uvi].size()) / nc; for (size_t fi = 0; fi < m->mNumFaces; fi++) { const aiFace &f = m->mFaces[fi]; for (size_t pvi = 0; pvi < f.mNumIndices; pvi++) { @@ -1226,7 +1226,7 @@ void FBXExporter::WriteObjects () { if (elem == index_by_uv.end()) { index_by_uv[curUv] = index; uv_indices[uvi].push_back(index); - for (uint32_t x = 0; x < m->mNumUVComponents[uvi]; ++x) { + for (uint32_t x = 0; x < nc; ++x) { uv_data[uvi].push_back(curUv[x]); } ++index; @@ -1236,8 +1236,6 @@ void FBXExporter::WriteObjects () { } } } - - offsets.push_back((int32_t)polygon_data.size()); } @@ -1291,7 +1289,7 @@ void FBXExporter::WriteObjects () { indent = 3; FBX::Node::WritePropertyNode("Version", int32_t(101), outstream, binary, indent); FBX::Node::WritePropertyNode("Name", "", outstream, binary, indent); - FBX::Node::WritePropertyNode("MappingInformationType", "ByPolgonVertex", outstream, binary, indent); + FBX::Node::WritePropertyNode("MappingInformationType", "ByPolygonVertex", outstream, binary, indent); FBX::Node::WritePropertyNode("ReferenceInformationType", "IndexToDirect", outstream, binary, indent); FBX::Node::WritePropertyNode("UV", uv_data[uvi], outstream, binary, indent); FBX::Node::WritePropertyNode("UVIndex", uv_indices[uvi], outstream, binary, indent);