store node mesh vs. meshes
authorDaniel Hritzkiv <daniel.hritzkiv@gmail.com>
Fri, 1 Sep 2017 21:56:13 +0000 (17:56 -0400)
committerDaniel Hritzkiv <daniel.hritzkiv@gmail.com>
Mon, 11 Sep 2017 14:55:50 +0000 (10:55 -0400)
glTF nodes can only hold one mesh. this simply assigns to and check’s a Node’s Mesh

code/glTF2Asset.h
code/glTF2Asset.inl
code/glTF2AssetWriter.inl
code/glTF2Exporter.cpp
code/glTF2Importer.cpp

index 8e3a6dd..9facef6 100644 (file)
@@ -767,7 +767,7 @@ namespace glTF2
     struct Node : public Object
     {
         std::vector< Ref<Node> > children;
-        std::vector< Ref<Mesh> > meshes;
+        Ref<Mesh> mesh;
 
         Nullable<mat4> matrix;
         Nullable<vec3> translation;
index 5316b5e..bebaeba 100644 (file)
@@ -954,16 +954,9 @@ inline void Node::Read(Value& obj, Asset& r)
     }
 
     if (Value* mesh = FindUInt(obj, "mesh")) {
-        //unsigned numMeshes = (unsigned)meshes->Size();
-        unsigned numMeshes = 1;
-
-        //std::vector<unsigned int> meshList;
-
-        this->meshes.reserve(numMeshes);
-
         Ref<Mesh> meshRef = r.meshes.Retrieve((*mesh).GetUint());
 
-        if (meshRef) this->meshes.push_back(meshRef);
+        if (meshRef) this->mesh = meshRef;
     }
 
     if (Value* camera = FindUInt(obj, "camera")) {
index 9aa0072..4a2aa9f 100644 (file)
@@ -441,7 +441,9 @@ namespace glTF2 {
 
         AddRefsVector(obj, "children", n.children, w.mAl);
 
-        AddRefsVector(obj, "meshes", n.meshes, w.mAl);
+        if (n.mesh) {
+            obj.AddMember("mesh", n.mesh->index, w.mAl);
+        }
 
         AddRefsVector(obj, "skeletons", n.skeletons, w.mAl);
 
index 164b559..7daedd4 100644 (file)
@@ -442,16 +442,15 @@ void glTF2Exporter::ExportMaterials()
  */
 bool FindMeshNode(Ref<Node>& nodeIn, Ref<Node>& meshNode, std::string meshID)
 {
-    for (unsigned int i = 0; i < nodeIn->meshes.size(); ++i) {
-        if (meshID.compare(nodeIn->meshes[i]->id) == 0) {
-          meshNode = nodeIn;
-          return true;
-        }
+
+    if (nodeIn->mesh && meshID.compare(nodeIn->mesh->id) == 0) {
+        meshNode = nodeIn;
+        return true;
     }
 
     for (unsigned int i = 0; i < nodeIn->children.size(); ++i) {
         if(FindMeshNode(nodeIn->children[i], meshNode, meshID)) {
-          return true;
+            return true;
         }
     }
 
@@ -722,8 +721,8 @@ unsigned int glTF2Exporter::ExportNodeHierarchy(const aiNode* n)
         CopyValue(n->mTransformation, node->matrix.value);
     }
 
-    for (unsigned int i = 0; i < n->mNumMeshes; ++i) {
-        node->meshes.push_back(mAsset->meshes.Get(n->mMeshes[i]));
+    if (n->mNumMeshes > 0) {
+        node->mesh = mAsset->meshes.Get(n->mMeshes[0]);
     }
 
     for (unsigned int i = 0; i < n->mNumChildren; ++i) {
@@ -751,8 +750,8 @@ unsigned int glTF2Exporter::ExportNode(const aiNode* n, Ref<Node>& parent)
         CopyValue(n->mTransformation, node->matrix.value);
     }
 
-    for (unsigned int i = 0; i < n->mNumMeshes; ++i) {
-        node->meshes.push_back(mAsset->meshes.Get(n->mMeshes[i]));
+    if (n->mNumMeshes > 0) {
+        node->mesh = mAsset->meshes.Get(n->mMeshes[0]);
     }
 
     for (unsigned int i = 0; i < n->mNumChildren; ++i) {
index a2c0911..90ae849 100644 (file)
@@ -502,22 +502,15 @@ aiNode* ImportNode(aiScene* pScene, glTF2::Asset& r, std::vector<unsigned int>&
         }
     }
 
-    if (!node.meshes.empty()) {
-        int count = 0;
-        for (size_t i = 0; i < node.meshes.size(); ++i) {
-            int idx = node.meshes[i].GetIndex();
-            count += meshOffsets[idx + 1] - meshOffsets[idx];
-        }
-
-        ainode->mNumMeshes = count;
-        ainode->mMeshes = new unsigned int[count];
+    if (node.mesh) {
+        ainode->mNumMeshes = 1;
+        ainode->mMeshes = new unsigned int[1];
 
         int k = 0;
-        for (size_t i = 0; i < node.meshes.size(); ++i) {
-            int idx = node.meshes[i].GetIndex();
-            for (unsigned int j = meshOffsets[idx]; j < meshOffsets[idx + 1]; ++j, ++k) {
-                ainode->mMeshes[k] = j;
-            }
+        int idx = node.mesh.GetIndex();
+
+        for (unsigned int j = meshOffsets[idx]; j < meshOffsets[idx + 1]; ++j, ++k) {
+            ainode->mMeshes[k] = j;
         }
     }