BVB Source Codes

CRYENGINE Show AnimatedCharacterPPS_Debug.cpp Source code

Return Download CRYENGINE: download AnimatedCharacterPPS_Debug.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 "AnimatedCharacter.h"
  5. #include "AnimationGraphCVars.h"
  6. #include "PersistantDebug.h"
  7. #include "DebugHistory.h"
  8.  
  9. //--------------------------------------------------------------------------------
  10.  
  11. #if DEBUG_VELOCITY()
  12. static const float k_debugVelocityDeltaYPos = 15;
  13. static const float k_debugVelocityFontSize = 1.5f;
  14. static const float k_debugVelocityYPos = 80;
  15. static const float k_debugVelocityXPos = 20;
  16. static const float k_debugVelocityInitialDeltaHeight = 0.2f;
  17. static const float k_debugVelocityDeltaHeight = 0.1f;
  18. static const float k_debugVelocityCylinderRadius = 0.01f;
  19. static const float k_debugVelocityConeRadius = 0.02f;
  20.  
  21. //--------------------------------------------------------------------------------
  22. struct CDebugVelocity
  23. {
  24.         CDebugVelocity() {}
  25.         CDebugVelocity(const QuatT& movement, const float frameTime, const char* szComment, const ColorF& colorF, const bool pastMovement = false)
  26.                 : m_movement(movement), m_frameTime(frameTime), m_sComment(szComment), m_colorF(colorF), m_pastMovement(pastMovement) {}
  27.         void Draw(const Vec3& origin, const float textXPos, const float textYPos) const;
  28.  
  29. private:
  30.         QuatT  m_movement;
  31.         float  m_frameTime;
  32.         string m_sComment;
  33.         ColorF m_colorF;
  34.         bool   m_pastMovement;
  35. };
  36.  
  37. //--------------------------------------------------------------------------------
  38. static std::vector<CDebugVelocity, stl::STLGlobalAllocator<CDebugVelocity>> s_debugVelocities;
  39.  
  40. extern float g_mannequinYPosEnd;
  41. //--------------------------------------------------------------------------------
  42. void CDebugVelocity::Draw(const Vec3& origin, const float textXPos, const float textYPosIn) const
  43. {
  44.         const float textYPos = g_mannequinYPosEnd + 20 + textYPosIn;
  45.  
  46.         const float curFrameTimeInv = m_frameTime > FLT_MIN ? 1.0f / m_frameTime : 0.0f;
  47.  
  48.         const Vec3 delta = m_movement.t;
  49.         const float deltaQz = m_movement.q.GetRotZ();
  50.         const Vec3 veloc = delta * curFrameTimeInv;
  51.         const float velocQz = deltaQz * curFrameTimeInv;
  52.         const float colorFBGRA8888[4] = { m_colorF.r, m_colorF.g, m_colorF.b, m_colorF.a };
  53.  
  54.         IRenderAuxText::Draw2dLabel(textXPos, textYPos, k_debugVelocityFontSize, colorFBGRA8888, false, "Vel: grounds=%2.3f m/s t=[%+2.3f, %+2.3f, %+2.3f] m/s, qz=%2.2f rad/s;  Offs: ground=%2.3f m t=[%+2.3f, %+2.3f, %+2.3f], qz=%2.2f rad;   dt: %2.3f s   %s", veloc.GetLength2D(), veloc.x, veloc.y, veloc.z, velocQz, delta.GetLength2D(), delta.x, delta.y, delta.z, deltaQz, (float)m_frameTime, m_sComment.c_str());
  55.  
  56.         IRenderAuxGeom* pAuxGeom = gEnv->pRenderer->GetIRenderAuxGeom();
  57.         pAuxGeom->SetRenderFlags(e_Def3DPublicRenderflags);
  58.  
  59.         const Vec3 start = m_pastMovement ? origin - delta : origin;
  60.         const Vec3 end = start + delta;
  61.         const unsigned int colorB = m_colorF.pack_abgr8888();
  62.  
  63.         const Vec3 coneStart = LERP(start, end, 0.8f);
  64.         const Vec3 cylinderVec = coneStart - start;
  65.         const Vec3 coneVec = end - coneStart;
  66.  
  67.         pAuxGeom->DrawCylinder(start + cylinderVec * 0.5f, cylinderVec.GetNormalized(), k_debugVelocityCylinderRadius, cylinderVec.GetLength(), colorB);
  68.  
  69.         if (coneVec.GetLengthSquared() < 0.001f * 0.001f)
  70.                 pAuxGeom->DrawSphere(origin, k_debugVelocityConeRadius, colorB);
  71.         else
  72.                 pAuxGeom->DrawCone(coneStart, coneVec.GetNormalized(), k_debugVelocityConeRadius, coneVec.GetLength(), colorB);
  73. }
  74.  
  75. //--------------------------------------------------------------------------------
  76. void CAnimatedCharacter::AddDebugVelocity(const QuatT& movement, const float frameTime, const char* szComment, const ColorF& colorF, const bool pastMovement) const
  77. {
  78.         static int s_debugVelocityRenderFrameId = -1;
  79.  
  80.         if (!DebugVelocitiesEnabled())
  81.                 return;
  82.  
  83.         // Empty list of velocities when frame changes
  84.         int renderFrameId = gEnv->pRenderer->GetFrameID();
  85.         if (renderFrameId != s_debugVelocityRenderFrameId)
  86.         {
  87.                 s_debugVelocities.resize(0);
  88.                 s_debugVelocityRenderFrameId = renderFrameId;
  89.         }
  90.  
  91.         // Add to list
  92.         s_debugVelocities.push_back(CDebugVelocity(movement, frameTime, szComment, colorF, pastMovement));
  93. }
  94.  
  95. //--------------------------------------------------------------------------------
  96. static void DrawDebugVelocities(const Vec3& entityPos)
  97. {
  98.         const ColorB white = 0xFFFFFFFF;
  99.  
  100.         IRenderAuxGeom* pAuxGeom = gEnv->pRenderer->GetIRenderAuxGeom();
  101.  
  102.         Vec3 lineOrigin = entityPos + Vec3(0, 0, k_debugVelocityInitialDeltaHeight);
  103.         float textYPos = k_debugVelocityYPos;
  104.         for (int i = 0; i < s_debugVelocities.size(); ++i)
  105.         {
  106.                 if (i > 0)
  107.                         lineOrigin += Vec3(0, 0, k_debugVelocityDeltaHeight);
  108.  
  109.                 s_debugVelocities[i].Draw(lineOrigin, k_debugVelocityXPos, textYPos);
  110.  
  111.                 textYPos += k_debugVelocityDeltaYPos;
  112.         }
  113.  
  114.         pAuxGeom->DrawLine(entityPos, white, lineOrigin, white);
  115. }
  116.  
  117. #endif // DEBUG_VELOCITY()
  118.  
  119. //--------------------------------------------------------------------------------
  120.  
  121. struct SDebugNodeSizeDesc
  122. {
  123.         Vec2 m_prefered;
  124.         Vec2 m_importance;
  125. };
  126.  
  127. struct IDebugNode
  128. {
  129.         virtual ~IDebugNode(){}
  130.         virtual const SDebugNodeSizeDesc& GetSizeDesc() const = 0;
  131.         virtual void                      SetActualSize(const Vec2& size) = 0;
  132. };
  133.  
  134. struct IDebugContainer : public IDebugNode
  135. {
  136.         virtual void                      AddChild(IDebugNode* child);
  137.  
  138.         virtual const SDebugNodeSizeDesc& GetSizeDesc() const;
  139.         virtual void                      SetAvailableSize(const Vec2& size);
  140. };
  141.  
  142. class LayoutManager
  143. {
  144. public:
  145.         void setRootNode(IDebugNode* root);
  146.         void setTotalSize(const Vec2& size);
  147. private:
  148.         void layout();
  149. };
  150.  
  151. /*
  152.    addRow("params");
  153.    add("param1");
  154.    add("param2");
  155.    add("param3");
  156.    add("param4");
  157.    addRow()
  158.    add(param4);
  159.  */
  160.  
  161. //--------------------------------------------------------------------------------
  162.  
  163. #ifdef DEBUGHISTORY
  164. void CAnimatedCharacter::LayoutHelper(const char* id, const char* name, bool visible, float minout, float maxout, float minin, float maxin, float x, float y, float w /*=1.0f*/, float h /*=1.0f*/)
  165. {
  166.         if (!visible)
  167.         {
  168.                 m_debugHistoryManager->RemoveHistory(id);
  169.                 return;
  170.         }
  171.  
  172.         IDebugHistory* pDH = m_debugHistoryManager->GetHistory(id);
  173.         if (pDH != NULL)
  174.                 return;
  175.  
  176.         pDH = m_debugHistoryManager->CreateHistory(id, name);
  177.         pDH->SetupScopeExtent(minout, maxout, minin, maxin);
  178.         pDH->SetVisibility(true);
  179.  
  180.         static float x0 = 0.01f;
  181.         static float y0 = 0.05f;
  182.         static float x1 = 0.99f;
  183.         static float y1 = 1.00f;
  184.         static float dx = x1 - x0;
  185.         static float dy = y1 - y0;
  186.         static float xtiles = 6.0f;
  187.         static float ytiles = 4.0f;
  188.         pDH->SetupLayoutRel(x0 + dx * x / xtiles,
  189.                             y0 + dy * y / ytiles,
  190.                             dx * w * 0.95f / xtiles,
  191.                             dy * h * 0.93f / ytiles,
  192.                             dy * 0.02f / ytiles);
  193. }
  194. #endif
  195.  
  196. //--------------------------------------------------------------------------------
  197.  
  198. #ifdef DEBUGHISTORY // Remove function from code memory when not used.
  199. void CAnimatedCharacter::SetupDebugHistories()
  200. {
  201.         static bool showAll = false;
  202.         bool any = false;
  203.         bool showMotionParams = (CAnimationGraphCVars::Get().m_debugMotionParams != 0) || showAll;
  204.         any |= showMotionParams;
  205.         bool showPredError = (CAnimationGraphCVars::Get().m_debugMotionParams != 0) || showAll;
  206.         any |= showPredError;
  207.         bool showPredVelo = (CAnimationGraphCVars::Get().m_debugMotionParams != 0) || showAll;
  208.         any |= showPredVelo;
  209.         bool showAnimMovement = (CAnimationGraphCVars::Get().m_debugLocationsGraphs != 0) || showAll;
  210.         any |= showAnimMovement;
  211.         bool showEntMovement = (CAnimationGraphCVars::Get().m_debugLocationsGraphs != 0) || showAll;
  212.         any |= showEntMovement;
  213.         bool showAsset = (CAnimationGraphCVars::Get().m_debugLocationsGraphs != 0) || showAll;
  214.         any |= showAsset;
  215.         bool showTemp1 = ((CAnimationGraphCVars::Get().m_debugTempValues & 1) != 0) || showAll;
  216.         any |= showTemp1;
  217.         bool showTemp2 = ((CAnimationGraphCVars::Get().m_debugTempValues & 2) != 0) || showAll;
  218.         any |= showTemp2;
  219.         bool showTemp3 = ((CAnimationGraphCVars::Get().m_debugTempValues & 4) != 0) || showAll;
  220.         any |= showTemp3;
  221.         bool showTemp4 = ((CAnimationGraphCVars::Get().m_debugTempValues & 8) != 0) || showAll;
  222.         any |= showTemp4;
  223.         bool showMCM = (CAnimationGraphCVars::Get().m_debugMovementControlMethods != 0) || showAll;
  224.         any |= showMCM;
  225.         bool showFrameTime = (CAnimationGraphCVars::Get().m_debugFrameTime != 0) || showAll;
  226.         any |= showFrameTime;
  227.  
  228.         bool showAnimTargetMovement = (CAnimationGraphCVars::Get().m_debugAnimTarget != 0) || showAll;
  229.         any |= showAnimTargetMovement;
  230.  
  231.         if (any)
  232.         {
  233.                 LayoutHelper("eDH_FrameTime", "FrameTime", showFrameTime, 0.0f, 1.0f, 0.0f, 0.0f, 5, 0.3f, 1, 0.7f);
  234.  
  235.                 LayoutHelper("eDH_MovementControlMethodH", "MCM H", showMCM, 0, eMCM_COUNT - 1, 0, eMCM_COUNT - 1, 4, 0.2f, 1, 0.4f);
  236.                 LayoutHelper("eDH_MovementControlMethodV", "MCM V", showMCM, 0, eMCM_COUNT - 1, 0, eMCM_COUNT - 1, 4, 0.6f, 1, 0.4f);
  237.  
  238.                 LayoutHelper("eDH_TurnSpeed", "TurnSpeed", showMotionParams, -360, +360, -1, +1, 0, 0, 1.0f, 0.5f);
  239.                 LayoutHelper("eDH_TravelSlope", "TravelSlope", showMotionParams, -25, 25, -25, 25, 0, 0.5f, 1.0f, 0.5f);
  240.                 LayoutHelper("eDH_TravelDirX", "TravelDirX", showMotionParams, -2, +2, -1, +1, 1, 0);
  241.                 LayoutHelper("eDH_TravelDirY", "TravelDirY", showMotionParams, -2, +2, -1, +1, 2, 0);
  242.                 LayoutHelper("eDH_TravelDistScale", "TravelDistScale", showMotionParams, 0, 1, 0, 1, 3, 0.0f, 1.0f, 0.2f);
  243.                 LayoutHelper("eDH_TravelDist", "TravelDist", showMotionParams, 0, 10, 0, 1, 3, 0.2f, 1.0f, 0.3f);
  244.                 LayoutHelper("eDH_TravelSpeed", "TravelSpeed", showMotionParams, 0, 10, 0, 1, 3, 0.5f, 1.0f, 0.5f);
  245.  
  246.                 LayoutHelper("eDH_DesiredLocalLocationRZ", "LocalLocaRZ", showPredError, -180, +180, -1, +1, 0, 1, 1, 0.5f);
  247.                 LayoutHelper("eDH_DesiredLocalLocationTX", "LocalLocaTX", showPredError, -5, +5, -0.01f, +0.01f, 1, 1, 1, 0.5f);
  248.                 LayoutHelper("eDH_DesiredLocalLocationTY", "LocalLocaTY", showPredError, -5, +5, -0.01f, +0.01f, 2, 1, 1, 0.5f);
  249.  
  250.                 LayoutHelper("eDH_DesiredLocalVelocityRZ", "LocalVeloRZ", showPredVelo, -180, +180, -1, +1, 0, 1.5f, 1, 0.5f);
  251.                 LayoutHelper("eDH_DesiredLocalVelocityTX", "LocalVeloTX", showPredVelo, -5, +5, -0.01f, +0.01f, 1, 1.5f, 1, 0.5f);
  252.                 LayoutHelper("eDH_DesiredLocalVelocityTY", "LocalVeloTY", showPredVelo, -5, +5, -0.01f, +0.01f, 2, 1.5f, 1, 0.5f);
  253.  
  254.                 LayoutHelper("eDH_ReqEntMovementRotZ", "ReqEntMoveRotZ", showEntMovement, -180, +180, -1, +1, 0, 2, 1, 0.5f);
  255.                 LayoutHelper("eDH_ReqEntMovementTransX", "ReqEntMoveX", showEntMovement, -10, +10, -0.0f, +0.0f, 1, 2, 1, 0.5f);
  256.                 LayoutHelper("eDH_ReqEntMovementTransY", "ReqEntMoveY", showEntMovement, -10, +10, -0.0f, +0.0f, 2, 2, 1, 0.5f);
  257.  
  258.                 LayoutHelper("eDH_EntLocationOriZ", "EntOriZ", showEntMovement, -360, +360, +360, -360, 0, 2.5f, 1, 0.5f);
  259.                 LayoutHelper("eDH_EntLocationPosX", "EntPosX", showEntMovement, -10000, +10000, +10000, -10000, 1, 2.5f, 1, 0.5f);
  260.                 LayoutHelper("eDH_EntLocationPosY", "EntPosY", showEntMovement, -10000, +10000, +10000, -10000, 2, 2.5f, 1, 0.5f);
  261.  
  262.                 LayoutHelper("eDH_AnimAssetRotZ", "AssetRotZ", showAnimMovement, -180, +180, -1, +1, 0, 3.5f, 1, 0.5f);
  263.                 LayoutHelper("eDH_AnimAssetTransX", "AssetX", showAnimMovement, -5, +5, -0.0f, +0.0f, 1, 3.5f, 1, 0.5f);
  264.                 LayoutHelper("eDH_AnimAssetTransY", "AssetY", showAnimMovement, -5, +5, -0.0f, +0.0f, 2, 3.5f, 1, 0.5f);
  265.                 LayoutHelper("eDH_AnimAssetTransZ", "AssetZ", showAnimMovement, -5, +5, -0.0f, +0.0f, 3, 3.5f, 1, 0.5f);
  266.  
  267.                 LayoutHelper("eDH_AnimTargetCorrectionRotZ", "AnimTargetRotZ", showAnimTargetMovement, -180, +180, -1, +1, 3, 1.5f, 1, 0.5f);
  268.                 LayoutHelper("eDH_AnimTargetCorrectionTransX", "AnimTargetX", showAnimTargetMovement, -5, +5, -0.0f, +0.0f, 4, 1.5f, 1, 0.5f);
  269.                 LayoutHelper("eDH_AnimTargetCorrectionTransY", "AnimTargetY", showAnimTargetMovement, -5, +5, -0.0f, +0.0f, 5, 1.5f, 1, 0.5f);
  270.  
  271.                 LayoutHelper("eDH_EntMovementErrorRotZ", "EntMoveErrorRotZ", showEntMovement, -180, +180, -1, +1, 3, 2.0f, 1, 0.5f);
  272.                 LayoutHelper("eDH_EntMovementErrorTransX", "EntMoveErrorX", showEntMovement, -5, +5, -0.0f, +0.0f, 4, 2.0f, 1, 0.5f);
  273.                 LayoutHelper("eDH_EntMovementErrorTransY", "EntMoveErrorY", showEntMovement, -5, +5, -0.0f, +0.0f, 5, 2.0f, 1, 0.5f);
  274.  
  275.                 LayoutHelper("eDH_EntTeleportMovementRotZ", "EntTeleportRotZ", showEntMovement, -180, +180, -1, +1, 3, 2.5f, 1, 0.5f);
  276.                 LayoutHelper("eDH_EntTeleportMovementTransX", "EntTeleportX", showEntMovement, -5, +5, -0.0f, +0.0f, 4, 2.5f, 1, 0.5f);
  277.                 LayoutHelper("eDH_EntTeleportMovementTransY", "EntTeleportY", showEntMovement, -5, +5, -0.0f, +0.0f, 5, 2.5f, 1, 0.5f);
  278.  
  279.                 LayoutHelper("eDH_TEMP00", "TEMP00", showTemp1, -10000.0f, +10000.0f, +10000.0f, -10000.0f, 5, 0.4f, 1, 0.4f);
  280.                 LayoutHelper("eDH_TEMP01", "TEMP01", showTemp1, -10000.0f, +10000.0f, +10000.0f, -10000.0f, 5, 0.8f, 1, 0.4f);
  281.                 LayoutHelper("eDH_TEMP02", "TEMP02", showTemp1, -10000.0f, +10000.0f, +10000.0f, -10000.0f, 5, 1.2f, 1, 0.4f);
  282.                 LayoutHelper("eDH_TEMP03", "TEMP03", showTemp1, -10000.0f, +10000.0f, +10000.0f, -10000.0f, 5, 1.6f, 1, 0.4f);
  283.                 LayoutHelper("eDH_TEMP04", "TEMP04", showTemp2, -10000.0f, +10000.0f, +10000.0f, -10000.0f, 5, 2.0f, 1, 0.4f);
  284.                 LayoutHelper("eDH_TEMP05", "TEMP05", showTemp2, -10000.0f, +10000.0f, +10000.0f, -10000.0f, 5, 2.4f, 1, 0.4f);
  285.                 LayoutHelper("eDH_TEMP06", "TEMP06", showTemp2, -10000.0f, +10000.0f, +10000.0f, -10000.0f, 5, 2.8f, 1, 0.4f);
  286.                 LayoutHelper("eDH_TEMP07", "TEMP07", showTemp2, -10000.0f, +10000.0f, +10000.0f, -10000.0f, 5, 3.2f, 1, 0.4f);
  287.  
  288.                 LayoutHelper("eDH_TEMP10", "TEMP10", showTemp3, -10000.0f, +10000.0f, +10000.0f, -10000.0f, 4, 0.4f, 1, 0.4f);
  289.                 LayoutHelper("eDH_TEMP11", "TEMP11", showTemp3, -10000.0f, +10000.0f, +10000.0f, -10000.0f, 4, 0.8f, 1, 0.4f);
  290.                 LayoutHelper("eDH_TEMP12", "TEMP12", showTemp3, -10000.0f, +10000.0f, +10000.0f, -10000.0f, 4, 1.2f, 1, 0.4f);
  291.                 LayoutHelper("eDH_TEMP13", "TEMP13", showTemp3, -10000.0f, +10000.0f, +10000.0f, -10000.0f, 4, 1.6f, 1, 0.4f);
  292.                 LayoutHelper("eDH_TEMP14", "TEMP14", showTemp4, -10000.0f, +10000.0f, +10000.0f, -10000.0f, 4, 2.0f, 1, 0.4f);
  293.                 LayoutHelper("eDH_TEMP15", "TEMP15", showTemp4, -10000.0f, +10000.0f, +10000.0f, -10000.0f, 4, 2.4f, 1, 0.4f);
  294.                 LayoutHelper("eDH_TEMP16", "TEMP16", showTemp4, -10000.0f, +10000.0f, +10000.0f, -10000.0f, 4, 2.8f, 1, 0.4f);
  295.                 LayoutHelper("eDH_TEMP17", "TEMP17", showTemp4, -10000.0f, +10000.0f, +10000.0f, -10000.0f, 4, 3.2f, 1, 0.4f);
  296.         }
  297.         else
  298.         {
  299.                 m_debugHistoryManager->Clear();
  300.         }
  301.  
  302.         /*
  303.            bool showEntityValues = (CAnimationGraphCVars::Get().m_debugEntityParams != 0);
  304.            if(m_pEntityMoveSpeed == NULL)
  305.            {
  306.            m_pEntityMoveSpeed = m_debugHistoryManager->CreateHistory("EntityMoveSpeed");
  307.            m_pEntityMoveSpeed->SetupLayoutAbs(10, 10, 200, 200, 5);
  308.            m_pEntityMoveSpeed->SetupScopeExtent(-360, +360, -1, +1);
  309.            }
  310.  
  311.            if(m_pEntityPhysSpeed == NULL)
  312.            {
  313.            m_pEntityPhysSpeed = m_debugHistoryManager->CreateHistory("EntityPhysSpeed");
  314.            m_pEntityPhysSpeed->SetupLayoutAbs(220, 10, 200, 200, 5);
  315.            m_pEntityPhysSpeed->SetupScopeExtent(-360, +360, -1, +1);
  316.            }
  317.  
  318.            if(m_pACRequestSpeed == NULL)
  319.            {
  320.            m_pACRequestSpeed = m_debugHistoryManager->CreateHistory("ACRequestSpeed");
  321.            m_pACRequestSpeed->SetupLayoutAbs(430, 10, 200, 200, 5);
  322.            m_pACRequestSpeed->SetupScopeExtent(-360, +360, -1, +1);
  323.            }
  324.          */
  325.  
  326.         /*
  327.            LayoutManager.getNode("root").addHorizontal("");
  328.            LayoutManager.getNode("last").add(DH);
  329.            LayoutManager.getNode("last").add(DH);
  330.            LayoutManager.getNode("last").add(DH);
  331.            LayoutManager.getNode("last").add(DH);
  332.            LayoutManager.getNode("root").addHorizontal("middle").addVertical("");
  333.            LayoutManager.getNode("last").add(DH);
  334.            LayoutManager.getNode("last").add(DH);
  335.            LayoutManager.getNode("last").add(DH);
  336.            LayoutManager.getNode("root").addHorizontal("");
  337.            LayoutManager.getNode("last").add(DH);
  338.            LayoutManager.getNode("last").add(DH);
  339.            LayoutManager.getNode("last").add(DH);
  340.            LayoutManager.getNode("last").add(DH);
  341.            LayoutManager.getNode("last").add(DH);
  342.            LayoutManager.getNode("last").add(DH);
  343.            LayoutManager.getNode("middle").addRows(2);
  344.            LayoutManager.getNode("middle.row1").addCols(2);
  345.            LayoutManager.getNode("middle.row1.col0").add(DH);
  346.            DH.setWidth(preferred, unit); // actual pixels, ref pixels, percent of parent
  347.            DH.setHeight(preferred, unit);
  348.            LayoutManager.relax();
  349.          */
  350. }
  351. #endif
  352.  
  353. //--------------------------------------------------------------------------------
  354.  
  355. void CAnimatedCharacter::DebugGraphQT(const QuatT& m, const char* tx, const char* ty, const char* rz, const char* tz /* = UNDEFINED */) const
  356. {
  357. #ifndef DEBUGHISTORY
  358.         return;
  359. #else
  360.  
  361.         if (!DebugFilter())
  362.                 return;
  363.  
  364.         DebugHistory_AddValue(tx, m.t.x);
  365.         DebugHistory_AddValue(ty, m.t.y);
  366.         DebugHistory_AddValue(tz, m.t.z);
  367.         DebugHistory_AddValue(rz, RAD2DEG(m.q.GetRotZ()));
  368. #endif
  369. }
  370.  
  371. //--------------------------------------------------------------------------------
  372.  
  373. void CAnimatedCharacter::DebugHistory_AddValue(const char* id, float x) const
  374. {
  375. #ifndef DEBUGHISTORY
  376.         return;
  377. #else
  378.  
  379.         if (id == NULL)
  380.                 return;
  381.  
  382.         IDebugHistory* pDH = m_debugHistoryManager->GetHistory(id);
  383.         if (pDH != NULL)
  384.                 pDH->AddValue(x);
  385.  
  386. #endif
  387. }
  388.  
  389. //--------------------------------------------------------------------------------
  390. //--------------------------------------------------------------------------------
  391. //--------------------------------------------------------------------------------
  392.  
  393. bool CAnimatedCharacter::DebugFilter() const
  394. {
  395.         /*
  396.            #ifndef DEBUGHISTORY
  397.            return false;
  398.            #else
  399.          */
  400.  
  401.         const char* entityfilter = CAnimationGraphCVars::Get().m_pDebugFilter->GetString();
  402.         const char* entityname = GetEntity()->GetName();
  403.         if (strcmp(entityfilter, "0") == 0)
  404.                 return true;
  405.  
  406.         return (strcmp(entityfilter, entityname) == 0);
  407.  
  408.         //#endif
  409. }
  410.  
  411. //--------------------------------------------------------------------------------
  412. #if DEBUG_VELOCITY()
  413. bool CAnimatedCharacter::DebugVelocitiesEnabled() const
  414. {
  415.         if (CAnimationGraphCVars::Get().m_debugLocations <= 1)
  416.                 return false;
  417.  
  418.         return DebugFilter();
  419. }
  420. #endif
  421.  
  422. //--------------------------------------------------------------------------------
  423. bool CAnimatedCharacter::DebugTextEnabled() const
  424. {
  425. #ifdef _DEBUG
  426.         if (CAnimationGraphCVars::Get().m_debugText == 0)
  427.                 return false;
  428.  
  429.         return DebugFilter();
  430. #else
  431.         return false;
  432. #endif
  433. }
  434.  
  435. //--------------------------------------------------------------------------------
  436.  
  437. // TODO: This is too important and useful to disable even in profile, yet...
  438. void CAnimatedCharacter::DebugRenderCurLocations() const
  439. {
  440.         if (CAnimationGraphCVars::Get().m_debugLocations == 0)
  441.                 return;
  442.  
  443. #if DEBUG_VELOCITY()
  444.         if (DebugVelocitiesEnabled())
  445.         {
  446.                 DrawDebugVelocities(GetEntity()->GetWorldPos());
  447.         }
  448. #endif
  449.  
  450.         CPersistantDebug* pPD = CCryAction::GetCryAction()->GetPersistantDebug();
  451.         if (pPD == NULL)
  452.                 return;
  453.  
  454.         static Vec3 abump(0, 0, 0.11f);
  455.         static Vec3 ebump(0, 0.005f, 0.1f);
  456.         static float entDuration = 0.5f;
  457.         static float animDuration = 0.5f;
  458.         static float entTrailDuration = 10.0f;
  459.         static float animTrailDuration = 10.0f;
  460.         static ColorF entColor0(0, 0, 1, 1);
  461.         static ColorF entColor1(0.2f, 0.2f, 1, 1);
  462.  
  463.         float sideLength = 0.5f;
  464.         float fwdLength = 1.0f;
  465.         float upLength = 4.0f;
  466.  
  467.         IEntity* pEntity = GetEntity();
  468.         CRY_ASSERT(pEntity != NULL);
  469.         IPhysicalEntity* pPhysEnt = pEntity->GetPhysics();
  470.         if (pPhysEnt)
  471.         {
  472.                 pe_player_dimensions dim;
  473.                 if (pPhysEnt->GetParams(&dim) != 0)
  474.                 {
  475.                         float scaleLength = dim.sizeCollider.GetLength2D();
  476.                         sideLength *= scaleLength;
  477.                         fwdLength *= scaleLength;
  478.                         upLength *= scaleLength;
  479.                 }
  480.         }
  481.  
  482.         pPD->Begin(UNIQUE("AnimatedCharacter.Locations"), true);
  483.  
  484.         pPD->AddSphere(m_entLocation.t + ebump, 0.05f, entColor0, entDuration);
  485.         pPD->AddLine(m_entLocation.t + ebump, m_entLocation.t + ebump + (m_entLocation.q * Vec3(0, 0, upLength)), entColor0, entDuration);
  486.         pPD->AddLine(m_entLocation.t + ebump, m_entLocation.t + ebump + (m_entLocation.q * Vec3(0, fwdLength, 0)), entColor1, entDuration);
  487.         pPD->AddLine(m_entLocation.t + ebump + (m_entLocation.q * Vec3(-sideLength, 0, 0)), m_entLocation.t + ebump + (m_entLocation.q * Vec3(+sideLength, 0, 0)), entColor0, entDuration);
  488.  
  489.         pPD->Begin(UNIQUE("AnimatedCharacter.Locations.Trail"), false);
  490.  
  491.         pPD->AddSphere(m_entLocation.t + ebump, 0.01f, entColor0, entTrailDuration);
  492.  
  493. #ifdef _DEBUG
  494.         if (DebugTextEnabled())
  495.         {
  496.                 Ang3 EntOri(m_entLocation.q);
  497.                 const ColorF cWhite = ColorF(1, 1, 1, 1);
  498.                 IRenderAuxText::Draw2dLabel(10, 1, 2.0f, (float*)&cWhite, false,
  499.                                              "  Ent Location[%.2f, %.2f, %.2f | %.2f, %.2f, %.2f]",
  500.                                              m_entLocation.t.x, m_entLocation.t.y, m_entLocation.t.z, RAD2DEG(EntOri.x), RAD2DEG(EntOri.y), RAD2DEG(EntOri.z));
  501.         }
  502. #endif
  503. }
  504.  
  505. //--------------------------------------------------------------------------------
  506.  
  507. void CAnimatedCharacter::DebugDisplayNewLocationsAndMovements(const QuatT& EntLocation, const QuatT& EntMovement,
  508.                                                               const QuatT& AnimMovement,
  509.                                                               float frameTime) const
  510. {
  511.         CPersistantDebug* pPD = CCryAction::GetCryAction()->GetPersistantDebug();
  512.         static float trailTime = 6000.0f;
  513.  
  514.         if ((pPD != NULL) && (CAnimationGraphCVars::Get().m_debugLocations != 0))
  515.         {
  516.                 Vec3 bump(0, 0, 0.1f);
  517.  
  518.                 pPD->Begin(UNIQUE("AnimatedCharacter.PrePhysicsStep2.new"), true);
  519.                 pPD->AddLine(Vec3(0, 0, EntLocation.t.z) + bump, EntLocation.t + bump, ColorF(0, 0, 1, 0.5f), 0.5f);
  520.  
  521.                 pPD->AddSphere(EntLocation.t + bump, 0.05f, ColorF(0, 0, 1, 1), 0.5f);
  522.                 pPD->AddDirection(EntLocation.t + bump, 0.15f, (EntLocation.q * FORWARD_DIRECTION), ColorF(0, 0, 1, 1), 0.5f);
  523.  
  524.                 pPD->AddLine(EntLocation.t + bump, EntLocation.t + EntMovement.t * 10.0f + bump, ColorF(0, 0, 1, 0.5f), 0.5f);
  525.                 pPD->AddLine(EntLocation.t + bump, EntLocation.t + EntMovement.t + bump, ColorF(0.5f, 0.5f, 1, 1.0f), 0.5f);
  526.  
  527.                 pPD->Begin(UNIQUE("AnimatedCharacter.PrePhysicsStep2.trail"), false);
  528.  
  529.                 pPD->AddSphere(EntLocation.t + bump, 0.1f, ColorF(0, 0, 1, 0.5f), trailTime);
  530.         }
  531.  
  532. #ifdef _DEBUG
  533.         if (DebugTextEnabled())
  534.         {
  535.                 Ang3 EntOri(EntLocation.q);
  536.                 Ang3 EntRot(EntMovement.q);
  537.                 const ColorF cWhite = ColorF(1, 1, 1, 1);
  538.                 IRenderAuxText::Draw2dLabel(10, 100, 2.0f, (float*)&cWhite, false,
  539.                                              "N Ent Location[%.2f, %.2f, %.2f | %.2f, %.2f, %.2f]  Movement[%.2f, %.2f, %.2f | %.2f, %.2f, %.2f]",
  540.                                              EntLocation.t.x, EntLocation.t.y, EntLocation.t.z, RAD2DEG(EntOri.x), RAD2DEG(EntOri.y), RAD2DEG(EntOri.z),
  541.                                              EntMovement.t.x / frameTime, EntMovement.t.y / frameTime, EntMovement.t.z / frameTime,
  542.                                              RAD2DEG(EntRot.x), RAD2DEG(EntRot.y), RAD2DEG(EntRot.z));
  543.  
  544.                 Ang3 AnimRot(AnimMovement.q);
  545.                 IRenderAuxText::Draw2dLabel(10, 125, 2.0f, (float*)&cWhite, false,
  546.                                              "N Anim Movement[%.2f, %.2f, %.2f | %.2f, %.2f, %.2f]",
  547.                                              AnimMovement.t.x / frameTime, AnimMovement.t.y / frameTime, AnimMovement.t.z / frameTime,
  548.                                              RAD2DEG(AnimRot.x), RAD2DEG(AnimRot.y), RAD2DEG(AnimRot.z));
  549.         }
  550. #endif
  551. }
  552.  
  553. //--------------------------------------------------------------------------------
  554.  
  555. void CAnimatedCharacter::DebugBlendWeights(const ISkeletonAnim* pSkeletonAnim)
  556. {
  557.         /*
  558.            if (pSkeleton == NULL)
  559.             return;
  560.  
  561.            float BlendWeight0 = 1.0f;
  562.            float BlendWeight1 = 0.0f;
  563.            uint32 numAnimsLayer0 = pSkeleton->GetNumAnimsInFIFO(0);
  564.            if (numAnimsLayer0 == 1)
  565.            {
  566.             CAnimation animationSteady;
  567.             animationSteady = pSkeleton->GetAnimFromFIFO(0,0);
  568.             BlendWeight0 = 1.0f;
  569.            }
  570.            else if (numAnimsLayer0 == 2)
  571.            {
  572.             CAnimation animationBlendIn;
  573.             CAnimation animationBlendOut;
  574.             animationBlendOut = pSkeleton->GetAnimFromFIFO(0,0);
  575.             BlendWeight0 = animationBlendOut.m_fTransitionBlend;
  576.             animationBlendIn = pSkeleton->GetAnimFromFIFO(0,1);
  577.             BlendWeight1 = animationBlendIn.m_fTransitionBlend;
  578.            }
  579.          */
  580. }
  581.  
  582. //--------------------------------------------------------------------------------
  583.  
  584. #ifdef _DEBUG
  585. void DebugRenderDistanceMeasure(CPersistantDebug* pPD, const Vec3& origin, const Vec3& offset, float fraction)
  586. {
  587.         float len = offset.GetLength();
  588.         if (len == 0.0f)
  589.                 return;
  590.  
  591.         Vec3 dir = offset / len;
  592.         float vertical = abs(dir | Vec3(0, 0, 1));
  593.  
  594.         Vec3 rgt = LERP((dir % Vec3(0, 0, 1)), Vec3(1, 0, 0), vertical);
  595.         Vec3 up = dir % rgt;
  596.         rgt = up % dir;
  597.  
  598.         static ColorF colorInside(0, 1, 1, 0.5f);
  599.         static ColorF colorOutside(1, 1, 0, 1);
  600.         ColorF color = (fraction < 1.0f) ? colorInside : colorOutside;
  601.  
  602.         static float crossSize = 0.05f;
  603.  
  604.         pPD->AddLine(origin, origin + offset, color, 1.0f);
  605.         pPD->AddLine(origin - rgt * crossSize, origin + rgt * crossSize, color, 1.0f);
  606.         pPD->AddLine(origin - up * crossSize, origin + up * crossSize, color, 1.0f);
  607.         pPD->AddLine(origin + offset - rgt * crossSize, origin + offset + rgt * crossSize, color, 1.0f);
  608.         pPD->AddLine(origin + offset - up * crossSize, origin + offset + up * crossSize, color, 1.0f);
  609. }
  610. #endif
  611.  
  612. //--------------------------------------------------------------------------------
  613.  
  614. #ifdef _DEBUG
  615. void DebugRenderAngleMeasure(CPersistantDebug* pPD, const Vec3& origin, const Quat& orientation, const Quat& offset, float fraction)
  616. {
  617.         Vec3 baseDir = orientation * FORWARD_DIRECTION;
  618.         Vec3 clampedDir = orientation * offset * FORWARD_DIRECTION;
  619.  
  620.         static ColorF colorInside(0, 1, 1, 0.5f);
  621.         static ColorF colorOutside(1, 1, 0, 1);
  622.         ColorF color = (fraction < 1.0f) ? colorInside : colorOutside;
  623.  
  624.         static float armSize = 1.0f;
  625.         pPD->AddLine(origin, origin + baseDir * (armSize * 0.5f), color, 1.0f);
  626.         pPD->AddLine(origin, origin + clampedDir * armSize, color, 1.0f);
  627.         pPD->AddLine(origin + baseDir * (armSize * 0.5f), origin + clampedDir * (armSize * 0.5f), color, 1.0f);
  628. }
  629. #endif
  630.  
  631. //--------------------------------------------------------------------------------
  632.  
  633. QuatT GetDebugEntityLocation(const char* name, const QuatT& _default)
  634. {
  635. #ifdef _DEBUG
  636.         IEntity* pEntity = gEnv->pEntitySystem->FindEntityByName(name);
  637.         if (pEntity != NULL)
  638.                 return QuatT(pEntity->GetWorldPos(), pEntity->GetWorldRotation());
  639. #endif
  640.  
  641.         return _default;
  642. }
  643.  
  644. //--------------------------------------------------------------------------------
  645. //--------------------------------------------------------------------------------
  646. //--------------------------------------------------------------------------------
  647.  
  648. #ifdef _DEBUG
  649. bool RunExtractCombineTest(bool flat)
  650. {
  651.         int errors = 0;
  652.  
  653.         for (int i = 0; i < 1000; i++)
  654.         {
  655.                 QuatT qt1;
  656.                 qt1.t = Vec3(0.0f);
  657.  
  658.                 Vec3 rgt0 = Vec3(1, 0, 0);
  659.                 Vec3 fwd0 = Vec3(0, 1, 0);
  660.                 Vec3 up0 = Vec3(0, 0, 1);
  661.  
  662.                 Vec3 r(
  663.                   cry_random(-100.0f, 100.0f),
  664.                   cry_random(-100.0f, 100.0f),
  665.                   0.0f);
  666.                 fwd0 = r.GetNormalizedSafe(fwd0);
  667.  
  668.                 if (!flat)
  669.                 {
  670.                         r.Set(
  671.                           cry_random(-10.0f, 10.0f),
  672.                           cry_random(-10.0f, 10.0f),
  673.                           100.0f);
  674.                         up0 = r.GetNormalizedSafe(up0);
  675.                 }
  676.  
  677.                 rgt0 = (fwd0 % up0).GetNormalizedSafe(rgt0);
  678.                 up0 = (rgt0 % fwd0).GetNormalizedSafe(up0);
  679.                 qt1.q = Quat(Matrix33::CreateFromVectors(rgt0, fwd0, up0));
  680.  
  681.                 Vec3 rgt1 = qt1.q * Vec3(1, 0, 0);
  682.                 Vec3 fwd1 = qt1.q * Vec3(0, 1, 0);
  683.                 Vec3 up1 = qt1.q * Vec3(0, 0, 1);
  684.  
  685.                 QuatT qth = ExtractHComponent(qt1);
  686.                 QuatT qtv = ExtractVComponent(qt1);
  687.                 QuatT qt2;
  688.  
  689.                 if (flat)
  690.                         qt2 = CombineHVComponents2D(qth, qtv);
  691.                 else
  692.                         qt2 = CombineHVComponents2D(qth, qtv);
  693.  
  694.                 QuatT hybrid;
  695.                 hybrid.SetNLerp(qt1, qt2, 0.5f);
  696.                 bool c1 = !qt1.IsEquivalent(qt1, qt2);
  697.                 bool c2 = !hybrid.IsEquivalent(hybrid, qt1);
  698.                 bool c3 = !hybrid.IsEquivalent(hybrid, qt2);
  699.  
  700.                 if (c1 || c2 || c3)
  701.                 {
  702.                         errors++;
  703.  
  704.                         Vec3 rgt2 = qt2.q * Vec3(1, 0, 0);
  705.                         Vec3 fwd2 = qt2.q * Vec3(0, 1, 0);
  706.                         Vec3 up2 = qt2.q * Vec3(0, 0, 1);
  707.  
  708.                         Vec3 rgtH = qth.q * Vec3(1, 0, 0);
  709.                         Vec3 fwdH = qth.q * Vec3(0, 1, 0);
  710.                         Vec3 upH = qth.q * Vec3(0, 0, 1);
  711.  
  712.                         Vec3 rgtV = qtv.q * Vec3(1, 0, 0);
  713.                         Vec3 fwdV = qtv.q * Vec3(0, 1, 0);
  714.                         Vec3 upV = qtv.q * Vec3(0, 0, 1);
  715.                 }
  716.         }
  717.  
  718.         return (errors == 0);
  719. }
  720. #endif
  721.  
  722. //--------------------------------------------------------------------------------
  723.  
  724. #ifdef _DEBUG
  725. bool RunQuatConcatTest()
  726. {
  727.         int validConcatCountWorst = 10000;
  728.         int validConcatCountBest = 0;
  729.         bool allValid = true;
  730.  
  731.         for (int i = 0; i < 100; i++)
  732.         {
  733.                 Quat o(IDENTITY);
  734.  
  735.                 for (int j = 0; j < 1000; j++)
  736.                 {
  737.                         if (!o.IsValid())
  738.                         {
  739.                                 validConcatCountWorst = min(j, validConcatCountWorst);
  740.                                 validConcatCountBest = max(j, validConcatCountBest);
  741.                                 allValid = false;
  742.                                 break;
  743.                         }
  744.  
  745.                         Quat q;
  746.                         /*
  747.                               Vec3 rgt(1, 0, 0);
  748.                               Vec3 fwd(0, 1, 0);
  749.                               Vec3 up(0, 0, 1);
  750.                               Vec3 r(
  751.                                 cry_random(-1.0f, 1.0f),
  752.                                 cry_random(-1.0f, 1.0f),
  753.                                 cry_random(-1.0f, 1.0f));
  754.                               fwd = r.GetNormalizedSafe(fwd);
  755.                               r.Set(
  756.                                 cry_random(-1.0f, 1.0f),
  757.                                 cry_random(-1.0f, 1.0f),
  758.                                 cry_random(-1.0f, 1.0f));
  759.                               up = r.GetNormalizedSafe(up);
  760.                               rgt = (fwd % up).GetNormalizedSafe(rgt);
  761.                               up = (rgt % fwd).GetNormalizedSafe(up);
  762.                               q = Quat(Matrix33::CreateFromVectors(rgt, fwd, up));
  763.                          */
  764.                         q.v.x = cry_random(-1.0f, 1.0f);
  765.                         q.v.y = cry_random(-1.0f, 1.0f);
  766.                         q.v.z = cry_random(-1.0f, 1.0f);
  767.                         q.w = cry_random(-1.0f, 1.0f);
  768.                         q.Normalize();
  769.                         CRY_ASSERT(q.IsValid());
  770.  
  771.                         Quat qInv = q.GetInverted();
  772.                         CRY_ASSERT(qInv.IsValid());
  773.  
  774.                         o = o * qInv;
  775.                 }
  776.         }
  777.  
  778.         if (!allValid)
  779.                 CryLog("RunQuatConcatTest: valid consecutive concatenations - worst case %d, best case %d.", validConcatCountWorst, validConcatCountBest);
  780.  
  781.         return allValid;
  782. }
  783. #endif
  784.  
  785. //--------------------------------------------------------------------------------
  786.  
  787. #ifdef _DEBUG
  788. bool RunQuatPredicateTest()
  789. {
  790.         int errors = 0;
  791.  
  792.         for (int i = 0; i < 1000; i++)
  793.         {
  794.                 Quat q;
  795.                 q.v = Vec3(0.0f, 0.0f, cry_random(0.0f, 1.0f));
  796.                 q.w = cry_random(0.0f, 1.0f);
  797.  
  798.                 q.Normalize();
  799.  
  800.                 Vec3 fwd = q.GetColumn1();
  801.                 float rz1 = atan2f(fwd.y, fwd.x);
  802.                 float rz2 = atan2f(-fwd.x, fwd.y);
  803.                 float rz3 = q.GetRotZ();
  804.  
  805.                 if (fabs(rz2 - rz3) > 0.0001f)
  806.                 {
  807.                         errors++;
  808.                 }
  809.         }
  810.  
  811.         return (errors == 0);
  812. }
  813. #endif
  814.  
  815. //--------------------------------------------------------------------------------
  816.  
  817. void CAnimatedCharacter::RunTests()
  818. {
  819. #ifndef _DEBUG
  820.         return;
  821. #else
  822.  
  823.         static bool m_bDebugRunTests = false;
  824.  
  825.         if (!m_bDebugRunTests)
  826.                 return;
  827.  
  828.         m_bDebugRunTests = false;
  829.  
  830.         RunExtractCombineTest(true);
  831.         RunExtractCombineTest(false);
  832.         RunQuatConcatTest();
  833.         RunQuatPredicateTest();
  834.  
  835. #endif
  836. }
  837.  
  838. //--------------------------------------------------------------------------------
  839.  
downloadAnimatedCharacterPPS_Debug.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