BVB Source Codes

CRYENGINE Show MannequinDebug.cpp Source code

Return Download CRYENGINE: download MannequinDebug.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 "MannequinDebug.h"
  5. #include "ActionController.h"
  6.  
  7. #include <CryAISystem/IAIObject.h>
  8.  
  9. //////////////////////////////////////////////////////////////////////////
  10. static void MN_ReloadAll(IConsoleCmdArgs* pArgs)
  11. {
  12.         CCryAction::GetCryAction()->GetMannequinInterface().ReloadAll();
  13. }
  14.  
  15. struct SAnimAssetContext
  16. {
  17.         XmlNodeRef                xmlRoot;
  18.         const IAnimationDatabase* pDatabase;
  19. };
  20.  
  21. void AssetCallback(const SAnimAssetReport& assetReport, void* _context)
  22. {
  23.         SAnimAssetContext* pContext = (SAnimAssetContext*)_context;
  24.         XmlNodeRef xmlAnim = GetISystem()->CreateXmlNode("Anim");
  25.         if (assetReport.pAnimName != NULL)
  26.         {
  27.                 xmlAnim->setAttr("AnimID", assetReport.pAnimName);
  28.         }
  29.         if (assetReport.pAnimPath != NULL)
  30.         {
  31.                 xmlAnim->setAttr("AnimPath", assetReport.pAnimPath);
  32.         }
  33.         pContext->xmlRoot->addChild(xmlAnim);
  34. }
  35.  
  36. //////////////////////////////////////////////////////////////////////////
  37. static void MN_ListAssets(IConsoleCmdArgs* pArgs)
  38. {
  39.         const char* filename = "mannequinAnimationAssetUsage.xml";
  40.  
  41.         if (pArgs->GetArgCount() >= 2)
  42.         {
  43.                 filename = pArgs->GetArg(1);
  44.         }
  45.  
  46.         SAnimAssetContext context;
  47.         context.xmlRoot = GetISystem()->CreateXmlNode("UsedAnims");
  48.         IAnimationDatabaseManager& dbManager = CCryAction::GetCryAction()->GetMannequinInterface().GetAnimationDatabaseManager();
  49.         const int numDBAs = dbManager.GetTotalDatabases();
  50.         for (int i = 0; i < numDBAs; i++)
  51.         {
  52.                 const IAnimationDatabase* pDatabase = dbManager.GetDatabase(i);
  53.                 context.pDatabase = pDatabase;
  54.                 pDatabase->EnumerateAnimAssets(NULL, AssetCallback, &context);
  55.         }
  56.         context.xmlRoot->saveToFile(filename);
  57. }
  58.  
  59. //////////////////////////////////////////////////////////////////////////
  60. static void MN_DebugAI(IConsoleCmdArgs* pArgs)
  61. {
  62.         const IEntity* pDebugEntity = NULL;
  63.  
  64.         if (2 <= pArgs->GetArgCount())
  65.         {
  66.                 const char* const entityName = pArgs->GetArg(1);
  67.                 pDebugEntity = gEnv->pEntitySystem->FindEntityByName(entityName);
  68.         }
  69.         else
  70.         {
  71.                 const CCamera& viewCamera = gEnv->pSystem->GetViewCamera();
  72.                 const Matrix34& viewCameraMatrix = viewCamera.GetMatrix();
  73.                 const Vec3 cameraWorldPosition = viewCameraMatrix.GetTranslation();
  74.                 const Vec3 cameraWorldDirectionForward = viewCameraMatrix.GetColumn1().GetNormalized();
  75.  
  76.                 float highestDotProduct = -2.0f;
  77.  
  78.                 const CActionController::TActionControllerList& actionControllersList = CActionController::GetGlobalActionControllers();
  79.                 for (size_t i = 0; i < actionControllersList.size(); ++i)
  80.                 {
  81.                         const CActionController* pActionController = actionControllersList[i];
  82.                         CRY_ASSERT(pActionController);
  83.  
  84.                         const EntityId entityId = pActionController->GetEntityId();
  85.                         if (entityId == 0)
  86.                         {
  87.                                 continue;
  88.                         }
  89.  
  90.                         IEntity& entity = pActionController->GetEntity();
  91.                         const IAIObject* pAiObject = entity.GetAI();
  92.  
  93.                         const Vec3 entityWorldPosition = pAiObject ? pAiObject->GetPos() : entity.GetWorldPos();
  94.                         const Vec3 cameraToEntityWorldDirection = (entityWorldPosition - cameraWorldPosition).GetNormalized();
  95.                         const float dotProduct = cameraWorldDirectionForward.Dot(cameraToEntityWorldDirection);
  96.  
  97.                         if ((highestDotProduct < dotProduct) && pAiObject)
  98.                         {
  99.                                 pDebugEntity = &entity;
  100.                                 highestDotProduct = dotProduct;
  101.                         }
  102.                 }
  103.         }
  104.  
  105.         stack_string oldDebugEntityName = "";
  106.         {
  107.                 const ICVar* const pMNDebugCVar = gEnv->pConsole->GetCVar("mn_debug");
  108.                 const char* const mnDebugEntityName = (pMNDebugCVar ? pMNDebugCVar->GetString() : NULL);
  109.                 oldDebugEntityName = (mnDebugEntityName) ? mnDebugEntityName : "";
  110.         }
  111.  
  112.         const bool wasEnabled = !(oldDebugEntityName.empty());
  113.         if (wasEnabled)
  114.         {
  115.                 // Turn Off
  116.  
  117.                 gEnv->pConsole->ExecuteString("i_forcefeedback 1");
  118.                 gEnv->pConsole->ExecuteString("c_shakeMult 1");
  119.                 gEnv->pConsole->ExecuteString("pl_health.minimalHudEffect 0");
  120.                 //gEnv->pConsole->ExecuteString( "r_PostProcessEffects 1"); <-- this crashes in certain levels
  121.  
  122.                 gEnv->pConsole->ExecuteString("ai_debugdraw 0");
  123.                 gEnv->pConsole->ExecuteString("ac_debugLocations 0");
  124.                 gEnv->pConsole->ExecuteString("ai_drawpathfollower 0");
  125.                 gEnv->pConsole->ExecuteString("ca_drawlocator 0");
  126.  
  127.                 gEnv->pConsole->ExecuteString("ac_debugfilter 0");
  128.  
  129.                 gEnv->pConsole->ExecuteString("ai_filteragentname \"\"");
  130.  
  131.                 {
  132.                         stack_string cmd;
  133.                         cmd.Format("es_debugAnim %s 0", oldDebugEntityName.c_str());
  134.                         gEnv->pConsole->ExecuteString(cmd.c_str());
  135.                 }
  136.  
  137.                 gEnv->pConsole->ExecuteString("mn_debug 0");
  138.         }
  139.  
  140.         if (!pDebugEntity)
  141.                 return;
  142.  
  143.         const bool sameDebugEntity = wasEnabled && !strcmp(oldDebugEntityName.c_str(), pDebugEntity->GetName());
  144.         if (!sameDebugEntity)
  145.         {
  146.                 // Turn On
  147.  
  148.                 gEnv->pConsole->ExecuteString("i_forcefeedback 0");
  149.                 gEnv->pConsole->ExecuteString("c_shakeMult 0");
  150.                 gEnv->pConsole->ExecuteString("pl_health.minimalHudEffect 1");
  151.                 //gEnv->pConsole->ExecuteString( "r_PostProcessEffects 0"); <-- disabled this as re-enabling it crashes in certain levels
  152.  
  153.                 gEnv->pConsole->ExecuteString("ai_debugdraw 1");
  154.                 gEnv->pConsole->ExecuteString("ac_debugLocations 2");
  155.                 gEnv->pConsole->ExecuteString("ai_drawpathfollower 1");
  156.                 gEnv->pConsole->ExecuteString("ca_drawlocator 1");
  157.  
  158.                 {
  159.                         stack_string cmd;
  160.                         cmd.Format("ac_debugFilter %s", pDebugEntity->GetName());
  161.                         gEnv->pConsole->ExecuteString(cmd.c_str());
  162.                 }
  163.                 {
  164.                         stack_string cmd;
  165.                         cmd.Format("ai_filteragentname %s", pDebugEntity->GetName());
  166.                         gEnv->pConsole->ExecuteString(cmd.c_str());
  167.                 }
  168.                 {
  169.                         stack_string cmd;
  170.                         cmd.Format("es_debugAnim %s 1", pDebugEntity->GetName());
  171.                         gEnv->pConsole->ExecuteString(cmd.c_str());
  172.                 }
  173.                 {
  174.                         stack_string cmd;
  175.                         cmd.Format("mn_debug %s", pDebugEntity->GetName());
  176.                         gEnv->pConsole->ExecuteString(cmd.c_str());
  177.                 }
  178.         }
  179. }
  180.  
  181. namespace mannequin
  182. {
  183. namespace debug
  184. {
  185. static int mn_logToFile = 1;
  186.  
  187. //////////////////////////////////////////////////////////////////////////
  188. void RegisterCommands()
  189. {
  190.         REGISTER_COMMAND("mn_reload", MN_ReloadAll, VF_CHEAT, "Reloads animation databases");
  191.         REGISTER_COMMAND("mn_listAssets", MN_ListAssets, VF_CHEAT, "Lists all the currently referenced animation assets");
  192.         REGISTER_COMMAND("mn_DebugAI", MN_DebugAI, VF_CHEAT, "");
  193.         REGISTER_CVAR3("mn_LogToFile", mn_logToFile, 0, VF_CHEAT, "Dumps all mann event logging to the file");
  194. }
  195.  
  196. #if MANNEQUIN_DEBUGGING_ENABLED
  197.  
  198. static const int maxSavedMsgs = 10;
  199. enum ESavedMsgType {SMT_WARNING, SMT_ERROR};
  200. struct SSavedMsg
  201. {
  202.         ESavedMsgType savedMsgType;
  203.         char          savedMsg[MAX_WARNING_LENGTH];
  204.         uint32        renderFrame;
  205.         bool          isNew;
  206.         bool          isUsed;
  207. };
  208. static SSavedMsg savedMsgs[maxSavedMsgs];
  209. static int savedMsgIndex = 0;
  210. static int lastRenderFrame = 0;
  211.  
  212. //====================================================================
  213. // MannLog
  214. //====================================================================
  215. void Log(const IActionController& actionControllerI, const char* format, ...)
  216. {
  217.         const CActionController& actionController = (const CActionController&)actionControllerI;
  218.         char outputBufferLog[MAX_WARNING_LENGTH];
  219.  
  220.         va_list args;
  221.         va_start(args, format);
  222.         cry_vsprintf(outputBufferLog, format, args);
  223.         va_end(args);
  224.  
  225.         if (mn_logToFile)
  226.         {
  227.                 gEnv->pSystem->Warning(VALIDATOR_MODULE_ANIMATION, VALIDATOR_WARNING, 0, 0, "Mann: %s", outputBufferLog);
  228.         }
  229.  
  230.         if (actionController.GetFlag(AC_DebugDraw))
  231.         {
  232.                 savedMsgs[savedMsgIndex].savedMsgType = SMT_WARNING;
  233.                 cry_strcpy(savedMsgs[savedMsgIndex].savedMsg, outputBufferLog);
  234.                 savedMsgs[savedMsgIndex].renderFrame = gEnv->pRenderer->GetFrameID();
  235.                 savedMsgs[savedMsgIndex].isNew = true;
  236.                 savedMsgs[savedMsgIndex].isUsed = true;
  237.                 savedMsgIndex = (savedMsgIndex + 1) % maxSavedMsgs;
  238.         }
  239. }
  240.  
  241. void DrawDebug()
  242. {
  243.         const ColorF fNew(1.0f, 1.0f, 1.0f, 1.0f);
  244.         const ColorF fOld(0.6f, 0.6f, 0.6f, 1.0f);
  245.         const float xPosOrigin = 900.0f;
  246.         const float yPosOrigin = 300.0f;
  247.         static float fontSize = 1.2f;
  248.         const uint32 renderFrame = gEnv->pRenderer->GetFrameID();
  249.  
  250.         float xPos = xPosOrigin;
  251.         float yPos = yPosOrigin;
  252.  
  253.         for (uint32 i = savedMsgIndex; i < maxSavedMsgs; i++)
  254.         {
  255.                 if (savedMsgs[i].isUsed)
  256.                 {
  257.                         const ColorF& drawCol = (savedMsgs[i].isNew) ? fNew : fOld;
  258.                         IRenderAuxText::Draw2dLabel(xPos, yPos, fontSize, drawCol, false, "%s", savedMsgs[i].savedMsg);
  259.                         savedMsgs[i].isNew = false;
  260.                         yPos += 20.0f;
  261.                 }
  262.         }
  263.         for (uint32 i = 0; i < savedMsgIndex; i++)
  264.         {
  265.                 if (savedMsgs[i].isUsed)
  266.                 {
  267.                         const ColorF& drawCol = (savedMsgs[i].isNew) ? fNew : fOld;
  268.                         IRenderAuxText::Draw2dLabel(xPos, yPos, fontSize, drawCol, false, "%s", savedMsgs[i].savedMsg);
  269.                         savedMsgs[i].isNew = false;
  270.                         yPos += 20.0f;
  271.                 }
  272.         }
  273.         lastRenderFrame = renderFrame;
  274. }
  275. #endif //!MANNEQUIN_DEBUGGING_ENABLED
  276.  
  277. }
  278. }
  279.  
downloadMannequinDebug.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