From 8439019c4eef997a05fe768aad22da3b83b65c6b Mon Sep 17 00:00:00 2001 From: raveenajain Date: Tue, 2 Apr 2019 19:56:17 +0100 Subject: [PATCH] update use of vectors --- libraries/fbx/src/GLTFSerializer.cpp | 43 ++++++++++++---------------- libraries/fbx/src/GLTFSerializer.h | 4 +-- 2 files changed, 21 insertions(+), 26 deletions(-) diff --git a/libraries/fbx/src/GLTFSerializer.cpp b/libraries/fbx/src/GLTFSerializer.cpp index 1192952b9e..84609be250 100755 --- a/libraries/fbx/src/GLTFSerializer.cpp +++ b/libraries/fbx/src/GLTFSerializer.cpp @@ -734,8 +734,7 @@ glm::mat4 GLTFSerializer::getModelTransform(const GLTFNode& node) { return tmat; } -std::vector> GLTFSerializer::getSkinInverseBindMatrices() { - std::vector> inverseBindMatrixValues; +void GLTFSerializer::getSkinInverseBindMatrices(std::vector>& inverseBindMatrixValues) { for (auto &skin : _file.skins) { GLTFAccessor& indicesAccessor = _file.accessors[skin.inverseBindMatrices]; GLTFBufferView& indicesBufferview = _file.bufferviews[indicesAccessor.bufferView]; @@ -750,31 +749,28 @@ std::vector> GLTFSerializer::getSkinInverseBindMatrices() { indicesAccessor.componentType); inverseBindMatrixValues.push_back(matrices.toStdVector()); } - return inverseBindMatrixValues; } -std::vector GLTFSerializer::nodeDFS(int n, std::vector& children, int stride) { - std::vector result; - result.push_back(n); - int rootDFS = 0; - int finalDFS = (int)children.size(); +void GLTFSerializer::getNodeQueueByDepthFirstChildren(std::vector& children, int stride, std::vector& result) { + int startingIndex = 0; + int finalIndex = (int)children.size(); if (stride == -1) { - rootDFS = (int)children.size() - 1; - finalDFS = -1; + startingIndex = (int)children.size() - 1; + finalIndex = -1; } - for (int index = rootDFS; index != finalDFS; index += stride) { + for (int index = startingIndex; index != finalIndex; index += stride) { int c = children[index]; + result.push_back(c); std::vector nested = _file.nodes[c].children.toStdVector(); if (nested.size() != 0) { std::sort(nested.begin(), nested.end()); - for (int n : nodeDFS(c, nested, stride)) { - result.push_back(n); + for (int r : nested) { + if (result.end() == std::find(result.begin(), result.end(), r)) { + getNodeQueueByDepthFirstChildren(nested, stride, result); + } } - } else { - result.push_back(c); - } + } } - return result; } @@ -810,7 +806,7 @@ bool GLTFSerializer::buildGeometry(HFMModel& hfmModel, const hifi::URL& url) { // initialize order in which nodes will be parsed - QVector nodeQueue; + std::vector nodeQueue; nodeQueue.reserve(numNodes); int rootNode = 0; int finalNode = numNodes; @@ -832,14 +828,12 @@ bool GLTFSerializer::buildGeometry(HFMModel& hfmModel, const hifi::URL& url) { } for (int index = sceneRootNode; index != sceneFinalNode; index += nodeListStride) { int i = initialSceneNodes[index]; + nodeQueue.push_back(i); std::vector children = _file.nodes[i].children.toStdVector(); std::sort(children.begin(), children.end()); - for (int n : nodeDFS(i, children, nodeListStride)) { - nodeQueue.append(n); - } + getNodeQueueByDepthFirstChildren(children, nodeListStride, nodeQueue); } - // Build joints HFMJoint joint; joint.distanceToParent = 0; @@ -851,7 +845,7 @@ bool GLTFSerializer::buildGeometry(HFMModel& hfmModel, const hifi::URL& url) { joint.parentIndex = -1; if (!_file.scenes[_file.scene].nodes.contains(nodeIndex)) { - joint.parentIndex = nodeQueue.indexOf(nodeDependencies[nodeIndex][0]); + joint.parentIndex = std::distance(nodeQueue.begin(), std::find(nodeQueue.begin(), nodeQueue.end(), nodeDependencies[nodeIndex][0])); } joint.transform = node.transforms.first(); joint.translation = extractTranslation(joint.transform); @@ -869,7 +863,8 @@ bool GLTFSerializer::buildGeometry(HFMModel& hfmModel, const hifi::URL& url) { std::vector jointInverseBindTransforms; if (!_file.skins.isEmpty()) { int matrixIndex = 0; - std::vector> inverseBindValues = getSkinInverseBindMatrices(); + std::vector> inverseBindValues; + getSkinInverseBindMatrices(inverseBindValues); jointInverseBindTransforms.resize(numNodes); int jointIndex = finalNode; diff --git a/libraries/fbx/src/GLTFSerializer.h b/libraries/fbx/src/GLTFSerializer.h index af91a1753d..d9c477bd99 100755 --- a/libraries/fbx/src/GLTFSerializer.h +++ b/libraries/fbx/src/GLTFSerializer.h @@ -712,8 +712,8 @@ private: hifi::ByteArray _glbBinary; glm::mat4 getModelTransform(const GLTFNode& node); - std::vector> getSkinInverseBindMatrices(); - std::vector nodeDFS(int n, std::vector& children, int stride); + void getSkinInverseBindMatrices(std::vector>& inverseBindMatrixValues); + void getNodeQueueByDepthFirstChildren(std::vector& children, int stride, std::vector& result); bool buildGeometry(HFMModel& hfmModel, const hifi::URL& url); bool parseGLTF(const hifi::ByteArray& data);