From babae456d28b96376e4c3472c4ad7e1b0a73b8e1 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Wed, 24 May 2017 19:28:46 -0700 Subject: [PATCH] Fix infinite loop in fbx reader --- libraries/fbx/src/FBXReader.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/libraries/fbx/src/FBXReader.cpp b/libraries/fbx/src/FBXReader.cpp index 64ee0bc869..bde8e83fc5 100644 --- a/libraries/fbx/src/FBXReader.cpp +++ b/libraries/fbx/src/FBXReader.cpp @@ -212,7 +212,10 @@ public: glm::mat4 getGlobalTransform(const QMultiMap& _connectionParentMap, const QHash& models, QString nodeID, bool mixamoHack) { glm::mat4 globalTransform; + QVector visitedNodes; // Used to prevent following a cycle while (!nodeID.isNull()) { + visitedNodes.append(nodeID); // Append each node we visit + const FBXModel& model = models.value(nodeID); globalTransform = glm::translate(model.translation) * model.preTransform * glm::mat4_cast(model.preRotation * model.rotation * model.postRotation) * model.postTransform * globalTransform; @@ -223,7 +226,7 @@ glm::mat4 getGlobalTransform(const QMultiMap& _connectionParen QList parentIDs = _connectionParentMap.values(nodeID); nodeID = QString(); foreach (const QString& parentID, parentIDs) { - if (models.contains(parentID)) { + if (models.contains(parentID) && !visitedNodes.contains(parentID)) { nodeID = parentID; break; } @@ -349,9 +352,12 @@ void addBlendshapes(const ExtractedBlendshape& extracted, const QList& connectionParentMap, const QHash& models, const QString& modelID) { QString topID = modelID; + QVector visitedNodes; // Used to prevent following a cycle forever { + visitedNodes.append(topID); // Append each node we visit + foreach (const QString& parentID, connectionParentMap.values(topID)) { - if (models.contains(parentID)) { + if (models.contains(parentID) && !visitedNodes.contains(parentID)) { topID = parentID; goto outerContinue; }