2
0
Эх сурвалжийг харах

- fbx: ensure node names are converted consistently and with no ambiguity.

Alexander Gessler 13 жил өмнө
parent
commit
8747614e89

+ 29 - 8
code/FBXConverter.cpp

@@ -149,13 +149,7 @@ private:
 				aiNode* nd = new aiNode();
 				aiNode* nd = new aiNode();
 				nodes.push_back(nd);
 				nodes.push_back(nd);
 
 
-				// strip Model:: prefix
-				std::string name = model->Name();
-				if(name.substr(0,7) == "Model::") {
-					name = name.substr(7);
-				}
-
-				nd->mName.Set(name);
+				nd->mName.Set(FixNodeName(model->Name()));
 				nd->mParent = &parent;
 				nd->mParent = &parent;
 
 
 				ConvertTransformation(*model,*nd);
 				ConvertTransformation(*model,*nd);
@@ -880,10 +874,37 @@ private:
 	}
 	}
 
 
 
 
+	// name -> prefix_stripped?
+	typedef std::map<std::string, bool> NodeNameMap;
+	NodeNameMap node_names;
+
 	// ------------------------------------------------------------------------------------------------
 	// ------------------------------------------------------------------------------------------------
 	std::string FixNodeName(const std::string& name)
 	std::string FixNodeName(const std::string& name)
 	{
 	{
-		// XXX handle prefix
+		// strip Model:: prefix, avoiding ambiguities (i.e. don't strip if 
+		// this causes ambiguities, well possible between empty identifiers,
+		// such as "Model::" and ""). Make sure the behaviour is consistent
+		// across multiple calls to FixNodeName().
+		if(name.substr(0,7) == "Model::") {
+			std::string temp = name.substr(7);
+
+			const NodeNameMap::const_iterator it = node_names.find(temp);
+			if (it != node_names.end()) {
+				if (!(*it).second) {
+					return FixNodeName(name + "_");
+				}
+			}
+			node_names[temp] = true;
+			return temp;
+		}
+
+		const NodeNameMap::const_iterator it = node_names.find(name);
+		if (it != node_names.end()) {
+			if ((*it).second) {
+				return FixNodeName(name + "_");
+			}
+		}
+		node_names[name] = false;
 		return name;
 		return name;
 	}
 	}