BVB Source Codes

CRYENGINE Show SelectionTranslator.cpp Source code

Return Download CRYENGINE: download SelectionTranslator.cpp Source code - Download CRYENGINE Source code - Type:.cpp
  1. // Copyright 2001-2016 Crytek GmbH / Crytek Group. All rights reserved.
  2.  
  3. #include "StdAfx.h"
  4. #include "SelectionTranslator.h"
  5.  
  6. bool SelectionTranslator::LoadFromXML(const BlockyXmlBlocks::Ptr& blocks, const SelectionTree& selectionTree,
  7.                                       const XmlNodeRef& rootNode, const char* scopeName, const char* fileName)
  8. {
  9.         typedef std::map<string, string> TempDirectTranslations;
  10.         TempDirectTranslations directTranslations;
  11.  
  12.         typedef std::multimap<string, QualifiedTranslation> TempQualifiedTranslations;
  13.         TempQualifiedTranslations qualifiedTranslations;
  14.  
  15.         BlockyXmlNodeRef blockyNode(blocks, scopeName, rootNode, fileName);
  16.         while (XmlNodeRef childNode = blockyNode.next())
  17.         {
  18.                 if (!stricmp(childNode->getTag(), "Map"))
  19.                 {
  20.                         const char* nodeName = 0;
  21.                         if (childNode->haveAttr("node"))
  22.                                 childNode->getAttr("node", &nodeName);
  23.                         else
  24.                         {
  25.                                 AIWarning("Missing 'node' attribute for tag '%s' in file '%s' at line %d.",
  26.                                           childNode->getTag(), fileName, childNode->getLine());
  27.  
  28.                                 return false;
  29.                         }
  30.  
  31.                         const char* targetName = 0;
  32.                         if (childNode->haveAttr("target"))
  33.                                 childNode->getAttr("target", &targetName);
  34.                         else
  35.                         {
  36.                                 AIWarning("Missing 'target' attribute for tag '%s' in file '%s' at line %d.",
  37.                                           childNode->getTag(), fileName, childNode->getLine());
  38.  
  39.                                 return false;
  40.                         }
  41.  
  42.                         // add even qualified node names, just for duplicate checking
  43.                         std::pair<TempDirectTranslations::iterator, bool> iresult = directTranslations.insert(
  44.                           TempDirectTranslations::value_type(nodeName, targetName));
  45.  
  46.                         if (!iresult.second)
  47.                         {
  48.                                 AIWarning("Duplicate translation definition '%s' in file '%s' at line %d.",
  49.                                           nodeName, fileName, childNode->getLine());
  50.  
  51.                                 return false;
  52.                         }
  53.  
  54.                         if (strchr(nodeName, ':'))
  55.                         {
  56.                                 stack_string name(nodeName);
  57.                                 size_t colon = name.rfind(':');
  58.  
  59.                                 string leafName(name.Right(name.length() - colon - 1));
  60.                                 name = name.Left(name.length() - leafName.length() - 1);
  61.  
  62.                                 TempQualifiedTranslations::iterator it = qualifiedTranslations.insert(
  63.                                   TempQualifiedTranslations::value_type(leafName, QualifiedTranslation()));
  64.  
  65.                                 QualifiedTranslation& qualified = it->second;
  66.                                 qualified.target = targetName;
  67.  
  68.                                 int start = 0;
  69.                                 stack_string parentName = name.Tokenize(":", start);
  70.  
  71.                                 while (!parentName.empty())
  72.                                 {
  73.                                         qualified.ancestors.push_back(parentName);
  74.                                         parentName = name.Tokenize(":", start);
  75.                                 }
  76.                         }
  77.                 }
  78.                 else
  79.                 {
  80.                         AIWarning("Unexpected tag '%s' in file '%s' at line %d. 'Map' expected.",
  81.                                   childNode->getTag(), fileName, childNode->getLine());
  82.  
  83.                         return false;
  84.                 }
  85.         }
  86.  
  87.         uint32 nodeCount = selectionTree.GetNodeCount();
  88.         for (uint32 i = 0; i < nodeCount; ++i)
  89.         {
  90.                 const SelectionTreeNode& node = selectionTree.GetNodeAt(i);
  91.                 if (node.GetType() != SelectionTreeNode::Leaf)
  92.                         continue;
  93.  
  94.                 TempDirectTranslations::iterator dirTranslationsIt = directTranslations.find(CONST_TEMP_STRING(node.GetName()));
  95.                 if (dirTranslationsIt != directTranslations.end())
  96.                         m_translations.insert(Translations::value_type(node.GetNodeID(), dirTranslationsIt->second));
  97.                 else
  98.                 {
  99.                         TempQualifiedTranslations::iterator it = qualifiedTranslations.find(CONST_TEMP_STRING(node.GetName()));
  100.  
  101.                         while ((it != qualifiedTranslations.end()) && (it->first == node.GetName()))
  102.                         {
  103.                                 QualifiedTranslation& qualified = it->second;
  104.                                 uint32 ancestorCount = qualified.ancestors.size();
  105.  
  106.                                 SelectionNodeID parentID = node.GetParentID();
  107.                                 while (ancestorCount && parentID)
  108.                                 {
  109.                                         const SelectionTreeNode& parentNode = selectionTree.GetNode(parentID);
  110.                                         if (qualified.ancestors[ancestorCount - 1] != parentNode.GetName())
  111.                                                 break;
  112.  
  113.                                         --ancestorCount;
  114.                                         parentID = parentNode.GetParentID();
  115.                                 }
  116.  
  117.                                 if (!ancestorCount)
  118.                                 {
  119.                                         m_translations.insert(Translations::value_type(node.GetNodeID(), qualified.target));
  120.                                         break;
  121.                                 }
  122.  
  123.                                 ++it;
  124.                         }
  125.                 }
  126.         }
  127.  
  128.         return true;
  129. }
  130.  
  131. const char* SelectionTranslator::GetTranslation(const SelectionNodeID& nodeID) const
  132. {
  133.         Translations::const_iterator it = m_translations.find(nodeID);
  134.         if (it != m_translations.end())
  135.                 return it->second.c_str();
  136.  
  137.         return 0;
  138. }
  139.  
downloadSelectionTranslator.cpp Source code - Download CRYENGINE Source code
Related Source Codes/Software:
postal - 2017-06-11
reactide - Reactide is the first dedicated IDE for React web ... 2017-06-11
rkt - rkt is a pod-native container engine for Linux. It... 2017-06-11
uWebSockets - Tiny WebSockets https://for... 2017-06-11
realworld - TodoMVC for the RealWorld - Exemplary fullstack Me... 2017-06-11
CRYENGINE - CRYENGINE is a powerful real-time game development... 2017-06-11
goreplay - GoReplay is an open-source tool for capturing and ... 2017-06-10
pyenv - Simple Python version management 2017-06-10
redux-saga - An alternative side effect model for Redux apps ... 2017-06-10
angular-starter - 2017-06-10

 Back to top