From 8747614e89c817479d2cee42a73f061343914802 Mon Sep 17 00:00:00 2001 From: Alexander Gessler Date: Sun, 22 Jul 2012 02:12:38 +0200 Subject: [PATCH] - fbx: ensure node names are converted consistently and with no ambiguity. --- code/FBXConverter.cpp | 37 +++++++++++++++++++++++++++++-------- 1 file changed, 29 insertions(+), 8 deletions(-) diff --git a/code/FBXConverter.cpp b/code/FBXConverter.cpp index 5b4da48ab..54f806f6c 100644 --- a/code/FBXConverter.cpp +++ b/code/FBXConverter.cpp @@ -149,13 +149,7 @@ private: aiNode* nd = new aiNode(); 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; ConvertTransformation(*model,*nd); @@ -880,10 +874,37 @@ private: } + // name -> prefix_stripped? + typedef std::map NodeNameMap; + NodeNameMap node_names; + // ------------------------------------------------------------------------------------------------ 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; }