From 5147acfe65978fd9d5400c4d39f521c85f9a660c Mon Sep 17 00:00:00 2001 From: Daniel Hritzkiv Date: Sun, 17 Sep 2017 15:11:01 -0400 Subject: [PATCH] Revert "store node mesh vs. meshes" This reverts commit a0d97505e5a53a9aa3a734d6bd3ad790234e6e09. --- code/glTF2Asset.h | 2 +- code/glTF2Asset.inl | 9 ++++++++- code/glTF2AssetWriter.inl | 4 +--- code/glTF2Exporter.cpp | 19 ++++++++++--------- code/glTF2Importer.cpp | 28 +++++++++++++--------------- 5 files changed, 33 insertions(+), 29 deletions(-) diff --git a/code/glTF2Asset.h b/code/glTF2Asset.h index 8604cd2a1..e2b61c646 100644 --- a/code/glTF2Asset.h +++ b/code/glTF2Asset.h @@ -781,7 +781,7 @@ namespace glTF2 struct Node : public Object { std::vector< Ref > children; - Ref mesh; + std::vector< Ref > meshes; Nullable matrix; Nullable translation; diff --git a/code/glTF2Asset.inl b/code/glTF2Asset.inl index cbdac5d80..0a3e2b051 100644 --- a/code/glTF2Asset.inl +++ b/code/glTF2Asset.inl @@ -934,9 +934,16 @@ inline void Node::Read(Value& obj, Asset& r) } if (Value* mesh = FindUInt(obj, "mesh")) { + //unsigned numMeshes = (unsigned)meshes->Size(); + unsigned numMeshes = 1; + + //std::vector meshList; + + this->meshes.reserve(numMeshes); + Ref meshRef = r.meshes.Retrieve((*mesh).GetUint()); - if (meshRef) this->mesh = meshRef; + if (meshRef) this->meshes.push_back(meshRef); } if (Value* camera = FindUInt(obj, "camera")) { diff --git a/code/glTF2AssetWriter.inl b/code/glTF2AssetWriter.inl index 7c0b435f2..dd90ec576 100644 --- a/code/glTF2AssetWriter.inl +++ b/code/glTF2AssetWriter.inl @@ -417,9 +417,7 @@ namespace glTF2 { AddRefsVector(obj, "children", n.children, w.mAl); - if (n.mesh) { - obj.AddMember("mesh", n.mesh->index, w.mAl); - } + AddRefsVector(obj, "meshes", n.meshes, w.mAl); AddRefsVector(obj, "skeletons", n.skeletons, w.mAl); diff --git a/code/glTF2Exporter.cpp b/code/glTF2Exporter.cpp index a3940e9ea..56932dba7 100644 --- a/code/glTF2Exporter.cpp +++ b/code/glTF2Exporter.cpp @@ -476,15 +476,16 @@ void glTF2Exporter::ExportMaterials() */ bool FindMeshNode(Ref& nodeIn, Ref& meshNode, std::string meshID) { - - if (nodeIn->mesh && meshID.compare(nodeIn->mesh->id) == 0) { - meshNode = nodeIn; - return true; + for (unsigned int i = 0; i < nodeIn->meshes.size(); ++i) { + if (meshID.compare(nodeIn->meshes[i]->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; } } @@ -755,8 +756,8 @@ unsigned int glTF2Exporter::ExportNodeHierarchy(const aiNode* n) CopyValue(n->mTransformation, node->matrix.value); } - if (n->mNumMeshes > 0) { - node->mesh = mAsset->meshes.Get(n->mMeshes[0]); + for (unsigned int i = 0; i < n->mNumMeshes; ++i) { + node->meshes.push_back(mAsset->meshes.Get(n->mMeshes[i])); } for (unsigned int i = 0; i < n->mNumChildren; ++i) { @@ -784,8 +785,8 @@ unsigned int glTF2Exporter::ExportNode(const aiNode* n, Ref& parent) CopyValue(n->mTransformation, node->matrix.value); } - if (n->mNumMeshes > 0) { - node->mesh = mAsset->meshes.Get(n->mMeshes[0]); + for (unsigned int i = 0; i < n->mNumMeshes; ++i) { + node->meshes.push_back(mAsset->meshes.Get(n->mMeshes[i])); } for (unsigned int i = 0; i < n->mNumChildren; ++i) { diff --git a/code/glTF2Importer.cpp b/code/glTF2Importer.cpp index 6de482981..d9dade3b2 100644 --- a/code/glTF2Importer.cpp +++ b/code/glTF2Importer.cpp @@ -517,24 +517,22 @@ aiNode* ImportNode(aiScene* pScene, glTF2::Asset& r, std::vector& } } - if (node.mesh) { + 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; - int idx = node.mesh.GetIndex(); + ainode->mMeshes = new unsigned int[count]; - ai_assert(idx >= 0 && idx < meshOffsets.size()); - - unsigned int offBegin = meshOffsets[idx]; - unsigned int offEnd = meshOffsets[idx + 1]; int k = 0; - - ai_assert(offEnd >= offBegin); - - ainode->mNumMeshes = offEnd - offBegin; - ainode->mMeshes = new unsigned int[ainode->mNumMeshes]; - - for (unsigned int j = offBegin; j < offEnd; ++j, ++k) { - ai_assert(k < ainode->mNumMeshes); - ainode->mMeshes[k] = j; + 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; + } } }