tweaks to primitive merging logic; comments + formatting

pull/1446/head
Daniel Hritzkiv 2017-09-18 10:43:05 -04:00
parent 814e8b3f8e
commit 2efd2cdef8
No known key found for this signature in database
GPG Key ID: D1D19875679D5CBF
1 changed files with 24 additions and 5 deletions

View File

@ -744,6 +744,7 @@ void glTF2Exporter::ExportMeshes()
} }
} }
//merges a node's multiple meshes (with one primitive each) into one mesh with multiple primitives
void glTF2Exporter::MergeMeshes() void glTF2Exporter::MergeMeshes()
{ {
for (unsigned int n = 0; n < mAsset->nodes.Size(); ++n) { for (unsigned int n = 0; n < mAsset->nodes.Size(); ++n) {
@ -751,16 +752,34 @@ void glTF2Exporter::MergeMeshes()
unsigned int nMeshes = node->meshes.size(); unsigned int nMeshes = node->meshes.size();
if (nMeshes) { //skip if it's 1 or less meshes per node
if (nMeshes > 1) {
Ref<Mesh> firstMesh = node->meshes.at(0); Ref<Mesh> firstMesh = node->meshes.at(0);
Mesh::Primitive firstPrimitive = firstMesh->primitives.at(0);
for (unsigned int m = 1; m < nMeshes; ++m) { //loop backwards to allow easy removal of a mesh from a node once it's merged
for (unsigned int m = nMeshes - 1; m >= 1; --m) {
Ref<Mesh> mesh = node->meshes.at(m); Ref<Mesh> mesh = node->meshes.at(m);
Mesh::Primitive primitive = mesh->primitives.at(0); bool primitivesPushed = false;
firstMesh->primitives.push_back(primitive);
for (unsigned int p = 0; p < mesh->primitives.size(); ++p) {
Mesh::Primitive primitive = mesh->primitives.at(p);
if (firstPrimitive.mode == primitive.mode) {
firstMesh->primitives.push_back(primitive);
primitivesPushed = true;
}
}
if (primitivesPushed) {
//remove the merged meshes from the node
node->meshes.erase(node->meshes.begin() + m);
}
} }
node->meshes.erase(node->meshes.begin() + 1, node->meshes.end()); //since we were looping backwards, reverse the order of merged primitives to their original order
std::reverse(firstMesh->primitives.begin() + 1, firstMesh->primitives.end());
} }
} }
} }