Procházet zdrojové kódy

Merge multiple meshes in a node into one mesh with many primtives; write out only one mesh per node

To do:
- clean up MergeMeshes
- see if there’s a way to do this earlier in the flow
Daniel Hritzkiv před 8 roky
rodič
revize
28523232cf
3 změnil soubory, kde provedl 26 přidání a 1 odebrání
  1. 3 1
      code/glTF2AssetWriter.inl
  2. 22 0
      code/glTF2Exporter.cpp
  3. 1 0
      code/glTF2Exporter.h

+ 3 - 1
code/glTF2AssetWriter.inl

@@ -417,7 +417,9 @@ namespace glTF2 {
 
 
         AddRefsVector(obj, "children", n.children, w.mAl);
         AddRefsVector(obj, "children", n.children, w.mAl);
 
 
-        AddRefsVector(obj, "meshes", n.meshes, w.mAl);
+        if (!n.meshes.empty()) {
+            obj.AddMember("mesh", n.meshes[0]->index, w.mAl);
+        }
 
 
         AddRefsVector(obj, "skeletons", n.skeletons, w.mAl);
         AddRefsVector(obj, "skeletons", n.skeletons, w.mAl);
 
 

+ 22 - 0
code/glTF2Exporter.cpp

@@ -110,6 +110,7 @@ glTF2Exporter::glTF2Exporter(const char* filename, IOSystem* pIOSystem, const ai
     }
     }
 
 
     ExportMeshes();
     ExportMeshes();
+    MergeMeshes();
 
 
     ExportScene();
     ExportScene();
 
 
@@ -743,6 +744,27 @@ void glTF2Exporter::ExportMeshes()
     }
     }
 }
 }
 
 
+void glTF2Exporter::MergeMeshes()
+{
+    for (unsigned int n = 0; n < mAsset->nodes.Size(); ++n) {
+        Ref<Node> node = mAsset->nodes.Get(n);
+
+        unsigned int nMeshes = node->meshes.size();
+
+        if (nMeshes) {
+            Ref<Mesh> firstMesh = node->meshes.at(0);
+
+            for (unsigned int m = 1; m < nMeshes; ++m) {
+                Ref<Mesh> mesh = node->meshes.at(m);
+                Mesh::Primitive primitive = mesh->primitives.at(0);
+                firstMesh->primitives.push_back(primitive);
+            }
+
+            node->meshes.erase(node->meshes.begin() + 1, node->meshes.end());
+        }
+    }
+}
+
 /*
 /*
  * Export the root node of the node hierarchy.
  * Export the root node of the node hierarchy.
  * Calls ExportNode for all children.
  * Calls ExportNode for all children.

+ 1 - 0
code/glTF2Exporter.h

@@ -120,6 +120,7 @@ namespace Assimp
         void ExportMetadata();
         void ExportMetadata();
         void ExportMaterials();
         void ExportMaterials();
         void ExportMeshes();
         void ExportMeshes();
+        void MergeMeshes();
         unsigned int ExportNodeHierarchy(const aiNode* n);
         unsigned int ExportNodeHierarchy(const aiNode* n);
         unsigned int ExportNode(const aiNode* node, glTF2::Ref<glTF2::Node>& parent);
         unsigned int ExportNode(const aiNode* node, glTF2::Ref<glTF2::Node>& parent);
         void ExportScene();
         void ExportScene();