BVB Source Codes

CRYENGINE Show SelectionVariables.cpp Source code

Return Download CRYENGINE: download SelectionVariables.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 "SelectionVariables.h"
  5.  
  6. #include <CryString/StringUtils.h>
  7. #include <DebugDrawContext.h>
  8.  
  9. #include "BlockyXml.h"
  10.  
  11. SelectionVariables::SelectionVariables()
  12.         : m_changed(false)
  13. {
  14. }
  15.  
  16. bool SelectionVariables::GetVariable(const SelectionVariableID& variableID, bool* value) const
  17. {
  18.         Variables::const_iterator it = m_variables.find(variableID);
  19.  
  20.         if (it != m_variables.end())
  21.         {
  22.                 const Variable& variable = it->second;
  23.                 *value = variable.value;
  24.  
  25.                 return true;
  26.         }
  27.  
  28.         return false;
  29. }
  30.  
  31. bool SelectionVariables::SetVariable(const SelectionVariableID& variableID, bool value)
  32. {
  33.         Variable& variable = stl::map_insert_or_get(m_variables, variableID, Variable());
  34.         if (variable.value != value)
  35.         {
  36.                 variable.value = value;
  37.                 m_changed = true;
  38.  
  39.                 CTimeValue now = gEnv->pTimer->GetFrameStartTime();
  40.  
  41.                 m_history.push_front(VariableChangeEvent(now, variableID, value));
  42.                 while (m_history.size() > 25)
  43.                         m_history.pop_back();
  44.         }
  45.  
  46.         return false;
  47. }
  48.  
  49. void SelectionVariables::ResetChanged(bool state)
  50. {
  51.         m_changed = state;
  52. }
  53.  
  54. bool SelectionVariables::Changed() const
  55. {
  56.         return m_changed;
  57. }
  58.  
  59. void SelectionVariables::Swap(SelectionVariables& other)
  60. {
  61.         std::swap(m_changed, other.m_changed);
  62.         m_variables.swap(other.m_variables);
  63.         m_history.swap(other.m_history);
  64. }
  65.  
  66. struct DebugVariable
  67. {
  68.         const char* name;
  69.         bool        value;
  70.  
  71.         bool operator<(const DebugVariable& other) const
  72.         {
  73.                 return strcmp(name, other.name) < 0;
  74.         }
  75. };
  76.  
  77. void SelectionVariables::Serialize(TSerialize ser)
  78. {
  79.         ser.Value("m_variables", m_variables);
  80.  
  81.         if (ser.IsReading())
  82.         {
  83.                 m_changed = true; // Force the selection tree to be re-evaluated
  84.         }
  85. }
  86.  
  87. #if defined(CRYAISYSTEM_DEBUG)
  88.  
  89. // ===========================================================================
  90. //      Debug: Track incoming signals.
  91. //
  92. //      In:             The name of the signal (NULL will ignore).
  93. void SelectionVariables::DebugTrackSignalHistory(const char* signalName)
  94. {
  95.         static const int historySize = 16;
  96.  
  97.         if (signalName == NULL)
  98.         {
  99.                 return;
  100.         }
  101.  
  102.         if (m_DebugSignalHistory.size() > historySize)
  103.         {
  104.                 m_DebugSignalHistory.pop_back();
  105.         }
  106.         m_DebugSignalHistory.push_front(DebugSignalHistoryEntry(signalName, gEnv->pTimer->GetFrameStartTime()));
  107. }
  108.  
  109. void SelectionVariables::DebugDraw(bool history, const SelectionVariableDeclarations& declarations) const
  110. {
  111.         CDebugDrawContext dc;
  112.  
  113.         float minY = 420.0f;
  114.         float maxY = -FLT_MAX;
  115.  
  116.         float x = 10.0f;
  117.         float y = minY;
  118.         const float fontSize = 1.25f;
  119.         const float lineHeight = 11.5f * fontSize;
  120.         const float columnWidth = 145.0f;
  121.  
  122.         std::vector<DebugVariable> sorted;
  123.  
  124.         for (Variables::const_iterator it = m_variables.begin(), end = m_variables.end()
  125.              ; it != end
  126.              ; ++it)
  127.         {
  128.                 const SelectionVariableID& variableID = it->first;
  129.                 bool value = it->second.value;
  130.  
  131.                 const SelectionVariableDeclarations::VariableDescription& description = declarations.GetVariableDescription(variableID);
  132.  
  133.                 sorted.resize(sorted.size() + 1);
  134.                 sorted.back().name = description.name.c_str();
  135.                 sorted.back().value = value;
  136.         }
  137.  
  138.         std::sort(sorted.begin(), sorted.end());
  139.  
  140.         ColorB trueColor(Col_SlateBlue, 1.0f);
  141.         ColorB falseColor(Col_DarkGray, 1.0f);
  142.  
  143.         stack_string text;
  144.  
  145.         if (sorted.empty())
  146.                 return;
  147.  
  148.         uint32 variableCount = sorted.size();
  149.         for (uint32 i = 0; i < variableCount; ++i)
  150.         {
  151.                 dc->Draw2dLabel(x, y, fontSize, sorted[i].value ? trueColor : falseColor, false, "%s", sorted[i].name);
  152.                 y += lineHeight;
  153.  
  154.                 if (y > maxY)
  155.                         maxY = y;
  156.  
  157.                 if (y + lineHeight > 760.0f)
  158.                 {
  159.                         y = minY;
  160.                         x += columnWidth;
  161.                 }
  162.         }
  163.  
  164.         //dc->SetAlphaBlended(false);
  165.         //dc->SetDepthTest(false);
  166.  
  167.         //dc->Init2DMode();
  168.         //dc->Draw2dImage(x + columnWidth, minY, 1, maxY - minY, -1);
  169.  
  170.         if (history)
  171.         {
  172.                 y = minY;
  173.                 CTimeValue now = gEnv->pTimer->GetFrameStartTime();
  174.  
  175.                 History::const_iterator it = m_history.begin();
  176.                 History::const_iterator end = m_history.end();
  177.  
  178.                 for (; it != end; ++it)
  179.                 {
  180.                         const VariableChangeEvent& changeEvent = *it;
  181.                         float alpha = 1.0f - (now - changeEvent.when).GetSeconds() / 10.0f;
  182.                         if (alpha > 0.01f)
  183.                         {
  184.                                 alpha = clamp_tpl(alpha, 0.33f, 1.0f);
  185.                                 const SelectionVariableDeclarations::VariableDescription& description =
  186.                                   declarations.GetVariableDescription(changeEvent.variableID);
  187.  
  188.                                 trueColor.a = (uint8)(alpha * 255.5f);
  189.                                 falseColor.a = (uint8)(alpha * 255.5f);
  190.  
  191.                                 text = description.name;
  192.                                 dc->Draw2dLabel(x + columnWidth + 2.0f, y, fontSize, changeEvent.value ? trueColor : falseColor, false,
  193.                                                 "%s", text.c_str());
  194.  
  195.                                 y += lineHeight;
  196.                         }
  197.                 }
  198.         }
  199.  
  200.         DebugDrawSignalHistory(dc, x, minY - (lineHeight * 2.0f), lineHeight, fontSize);
  201. }
  202.  
  203. // ===========================================================================
  204. //      Debug: Draw the signal history.
  205. //
  206. //      In,out:         The debug drawing context.
  207. //      In:                     The bottom-left X-position where to start drawing at.
  208. //      In:                     The bottom-left Y-position where to start drawing at.
  209. //      In:                     The line height.
  210. //      In:                     The font size.
  211. //
  212. void SelectionVariables::DebugDrawSignalHistory(CDebugDrawContext& dc, float bottomLeftX, float bottomLeftY, float lineHeight, float fontSize) const
  213. {
  214.         const CTimeValue now = gEnv->pTimer->GetFrameStartTime();
  215.  
  216.         float posY = bottomLeftY;
  217.         ColorF color = Col_Yellow;
  218.         DebugSignalHistory::const_iterator signalIter;
  219.         DebugSignalHistory::const_iterator signalEndIter = m_DebugSignalHistory.end();
  220.         for (signalIter = m_DebugSignalHistory.begin(); signalIter != signalEndIter; ++signalIter)
  221.         {
  222.                 posY -= lineHeight;
  223.  
  224.                 float alpha = 1.0f - (now - signalIter->m_TimeStamp).GetSeconds() / 10.0f;
  225.                 if (alpha > 0.01f)
  226.                 {
  227.                         alpha = clamp_tpl(1.0f - alpha, 0.33f, 1.0f);
  228.  
  229.                         color.a = (uint8)(alpha * 255.5f);
  230.  
  231.                         dc->Draw2dLabel(bottomLeftX, posY, fontSize, color, false, "%s", signalIter->m_Name.c_str());
  232.                 }
  233.         }
  234. }
  235.  
  236. SelectionVariables::DebugSignalHistoryEntry::DebugSignalHistoryEntry() :
  237.         m_Name()
  238.         , m_TimeStamp()
  239. {
  240. }
  241.  
  242. SelectionVariables::DebugSignalHistoryEntry::DebugSignalHistoryEntry(
  243.   const char* signalName,
  244.   const CTimeValue timeStamp) :
  245.         m_Name(signalName)
  246.         , m_TimeStamp(timeStamp)
  247. {
  248. }
  249.  
  250. #endif // defined(CRYAISYSTEM_DEBUG)
  251.  
  252. SelectionVariableDeclarations::SelectionVariableDeclarations()
  253. {
  254. }
  255.  
  256. bool SelectionVariableDeclarations::LoadFromXML(const _smart_ptr<BlockyXmlBlocks>& blocks, const XmlNodeRef& rootNode,
  257.                                                 const char* scopeName, const char* fileName)
  258. {
  259.         assert(scopeName);
  260.  
  261.         BlockyXmlNodeRef blockyNode(blocks, scopeName, rootNode, fileName);
  262.         while (XmlNodeRef childNode = blockyNode.next())
  263.         {
  264.                 if (!stricmp(childNode->getTag(), "Variable"))
  265.                 {
  266.                         const char* variableName = 0;
  267.                         if (childNode->haveAttr("name"))
  268.                                 childNode->getAttr("name", &variableName);
  269.                         else
  270.                         {
  271.                                 AIWarning("Missing 'name' attribute for tag '%s' in file '%s' at line %d.",
  272.                                           childNode->getTag(), fileName, childNode->getLine());
  273.  
  274.                                 return false;
  275.                         }
  276.  
  277.                         bool defaultValue = false;
  278.                         if (childNode->haveAttr("default"))
  279.                         {
  280.                                 const char* value = 0;
  281.                                 childNode->getAttr("default", &value);
  282.  
  283.                                 if (!stricmp(value, "true"))
  284.                                         defaultValue = true;
  285.                                 else if (!stricmp(value, "false"))
  286.                                         defaultValue = false;
  287.                                 else
  288.                                 {
  289.                                         AIWarning("Invalid variable value '%s' for variable '%s' in file '%s' at line %d.",
  290.                                                   value, variableName, fileName, childNode->getLine());
  291.  
  292.                                         return false;
  293.                                 }
  294.                         }
  295.  
  296.                         SelectionVariableID variableID = GetVariableID(variableName);
  297.                         std::pair<VariableDescriptions::iterator, bool> iresult = m_descriptions.insert(
  298.                           VariableDescriptions::value_type(variableID, VariableDescription(variableName)));
  299.  
  300.                         if (!iresult.second)
  301.                         {
  302.                                 if (!stricmp(iresult.first->second.name, variableName))
  303.                                 {
  304.                                         AIWarning("Duplicate variable declaration '%s' in file '%s' at line %d.",
  305.                                                   variableName, fileName, childNode->getLine());
  306.                                 }
  307.                                 else
  308.                                 {
  309.                                         AIWarning("Hash collision for variable declaration '%s' in file '%s' at line %d.",
  310.                                                   variableName, fileName, childNode->getLine());
  311.                                 }
  312.  
  313.                                 return false;
  314.                         }
  315.  
  316.                         m_defaults.SetVariable(variableID, defaultValue);
  317.                         m_defaults.ResetChanged(true);
  318.                 }
  319.                 else
  320.                 {
  321.                         AIWarning("Unexpected tag '%s' in file '%s' at line %d. 'Variable' expected.",
  322.                                   childNode->getTag(), fileName, childNode->getLine());
  323.  
  324.                         return false;
  325.                 }
  326.         }
  327.  
  328.         return true;
  329. }
  330.  
  331. bool SelectionVariableDeclarations::IsDeclared(const SelectionVariableID& variableID) const
  332. {
  333.         return m_descriptions.find(variableID) != m_descriptions.end();
  334. }
  335.  
  336. SelectionVariableID SelectionVariableDeclarations::GetVariableID(const char* name) const
  337. {
  338.         return CryStringUtils::CalculateHashLowerCase(name);
  339. }
  340.  
  341. const SelectionVariableDeclarations::VariableDescription& SelectionVariableDeclarations::GetVariableDescription(
  342.   const SelectionVariableID& variableID) const
  343. {
  344.         VariableDescriptions::const_iterator it = m_descriptions.find(variableID);
  345.         if (it != m_descriptions.end())
  346.         {
  347.                 const VariableDescription& description = it->second;
  348.                 return description;
  349.         }
  350.  
  351.         static VariableDescription empty("<invalid>");
  352.         return empty;
  353. }
  354.  
  355. void SelectionVariableDeclarations::GetVariablesNames(
  356.   const char** variableNamesBuffer, const size_t maxSize, size_t& actualSize) const
  357. {
  358.         const size_t totalVariablesAmount = m_descriptions.size();
  359.         if (maxSize < totalVariablesAmount)
  360.         {
  361.                 AIWarning("Only %" PRISIZE_T " can be inserted into the buffer while %" PRISIZE_T " are currently present.", (totalVariablesAmount - maxSize), totalVariablesAmount);
  362.         }
  363.  
  364.         VariableDescriptions::const_iterator it = m_descriptions.begin();
  365.         VariableDescriptions::const_iterator end = m_descriptions.end();
  366.         for (; it != end; ++it)
  367.         {
  368.                 if (actualSize < maxSize)
  369.                 {
  370.                         const VariableDescription& description = it->second;
  371.                         variableNamesBuffer[actualSize++] = description.name.c_str();
  372.                 }
  373.         }
  374. }
  375.  
  376. const SelectionVariables& SelectionVariableDeclarations::GetDefaults() const
  377. {
  378.         return m_defaults;
  379. }
  380.  
  381. const SelectionVariableDeclarations::VariableDescriptions& SelectionVariableDeclarations::GetDescriptions() const
  382. {
  383.         return m_descriptions;
  384. }
  385.  
downloadSelectionVariables.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