Fix infinite loop in fbx reader

This commit is contained in:
Atlante45 2017-05-24 19:28:46 -07:00
parent f9c6cecb23
commit babae456d2

View file

@ -212,7 +212,10 @@ public:
glm::mat4 getGlobalTransform(const QMultiMap<QString, QString>& _connectionParentMap, glm::mat4 getGlobalTransform(const QMultiMap<QString, QString>& _connectionParentMap,
const QHash<QString, FBXModel>& models, QString nodeID, bool mixamoHack) { const QHash<QString, FBXModel>& models, QString nodeID, bool mixamoHack) {
glm::mat4 globalTransform; glm::mat4 globalTransform;
QVector<QString> visitedNodes; // Used to prevent following a cycle
while (!nodeID.isNull()) { while (!nodeID.isNull()) {
visitedNodes.append(nodeID); // Append each node we visit
const FBXModel& model = models.value(nodeID); const FBXModel& model = models.value(nodeID);
globalTransform = glm::translate(model.translation) * model.preTransform * glm::mat4_cast(model.preRotation * globalTransform = glm::translate(model.translation) * model.preTransform * glm::mat4_cast(model.preRotation *
model.rotation * model.postRotation) * model.postTransform * globalTransform; model.rotation * model.postRotation) * model.postTransform * globalTransform;
@ -223,7 +226,7 @@ glm::mat4 getGlobalTransform(const QMultiMap<QString, QString>& _connectionParen
QList<QString> parentIDs = _connectionParentMap.values(nodeID); QList<QString> parentIDs = _connectionParentMap.values(nodeID);
nodeID = QString(); nodeID = QString();
foreach (const QString& parentID, parentIDs) { foreach (const QString& parentID, parentIDs) {
if (models.contains(parentID)) { if (models.contains(parentID) && !visitedNodes.contains(parentID)) {
nodeID = parentID; nodeID = parentID;
break; break;
} }
@ -349,9 +352,12 @@ void addBlendshapes(const ExtractedBlendshape& extracted, const QList<WeightedIn
QString getTopModelID(const QMultiMap<QString, QString>& connectionParentMap, QString getTopModelID(const QMultiMap<QString, QString>& connectionParentMap,
const QHash<QString, FBXModel>& models, const QString& modelID) { const QHash<QString, FBXModel>& models, const QString& modelID) {
QString topID = modelID; QString topID = modelID;
QVector<QString> visitedNodes; // Used to prevent following a cycle
forever { forever {
visitedNodes.append(topID); // Append each node we visit
foreach (const QString& parentID, connectionParentMap.values(topID)) { foreach (const QString& parentID, connectionParentMap.values(topID)) {
if (models.contains(parentID)) { if (models.contains(parentID) && !visitedNodes.contains(parentID)) {
topID = parentID; topID = parentID;
goto outerContinue; goto outerContinue;
} }