BVB Source Codes

CRYENGINE Show Command_Buffer.cpp Source code

Return Download CRYENGINE: download Command_Buffer.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 "Command_Buffer.h"
  5.  
  6. #include "Command_Commands.h"
  7. #include "CharacterInstance.h"
  8. #include "SkeletonAnim.h"
  9. #include "SkeletonPose.h"
  10.  
  11. using namespace Command;
  12.  
  13. /*
  14.    CState
  15.  */
  16.  
  17. bool CState::Initialize(CCharInstance* pInstance, const QuatTS& location)
  18. {
  19.         m_pInstance = pInstance;
  20.         m_pDefaultSkeleton = pInstance->m_pDefaultSkeleton;
  21.  
  22.         m_location = location;
  23.  
  24.         m_pPoseData = pInstance->m_SkeletonPose.GetPoseDataWriteable();
  25.  
  26.         m_jointCount = pInstance->m_pDefaultSkeleton->GetJointCount();
  27.  
  28.         m_lod = m_pInstance->GetAnimationLOD();
  29.  
  30.         m_originalTimeDelta = m_pInstance->m_fOriginalDeltaTime;
  31.  
  32.         m_pJointMask = NULL;
  33.         m_jointMaskCount = 0;
  34.  
  35.         return true;
  36. }
  37.  
  38. /*
  39.    CBuffer
  40.  */
  41.  
  42. bool CBuffer::Initialize(CCharInstance* pInstance, const QuatTS& location)
  43. {
  44.         m_pCommands = m_pBuffer;
  45.         m_commandCount = 0;
  46.  
  47.         m_state.Initialize(pInstance, location);
  48.  
  49.         m_pInstance = pInstance;
  50.         return true;
  51. }
  52.  
  53. void CBuffer::Execute()
  54. {
  55.         DEFINE_PROFILER_FUNCTION();
  56.  
  57.         if (!m_pInstance->m_SkeletonPose.m_physics.m_bPhysicsRelinquished)
  58.                 m_state.m_pPoseData->ResetToDefault(*m_pInstance->m_pDefaultSkeleton);
  59.  
  60.         // Temporary (stack-local) buffers
  61.         PREFAST_SUPPRESS_WARNING(6255)
  62.         QuatT * pJointsTemp = static_cast<QuatT*>(alloca(m_state.m_jointCount * sizeof(QuatT)));
  63.         PREFAST_SUPPRESS_WARNING(6255)
  64.         float* pScalingTemp = static_cast<float*>(alloca(m_state.m_jointCount * sizeof(float)));
  65.         std::fill(pScalingTemp, pScalingTemp + m_state.m_jointCount, 1.0f);
  66.         PREFAST_SUPPRESS_WARNING(6255)
  67.         Vec3 * pJWeightSumTemp = static_cast<Vec3*>(alloca(m_state.m_jointCount * sizeof(Vec3)));
  68.         PREFAST_SUPPRESS_WARNING(6255)
  69.         JointState * pJointsStatusTemp = static_cast<JointState*>(alloca(m_state.m_jointCount * sizeof(JointState)));
  70.         ::memset(pJointsStatusTemp, 0, m_state.m_jointCount * sizeof(JointState));
  71.  
  72.         // Base buffers
  73.         QuatT* const __restrict pJointsRelative = m_state.m_pPoseData->GetJointsRelative();
  74.         PREFAST_SUPPRESS_WARNING(6255)
  75.         float* const pScalingRelativeDummy = static_cast<float*>(alloca(m_state.m_jointCount * sizeof(float)));
  76.         std::fill(pScalingRelativeDummy, pScalingRelativeDummy + m_state.m_jointCount, 1.0f);
  77.         JointState* const __restrict pJointsStatusBase = m_state.m_pPoseData->GetJointsStatus();
  78.         ::memset(pJointsStatusBase, 0, m_state.m_jointCount * sizeof(JointState));
  79.  
  80.         m_state.m_pJointMask = NULL;
  81.         m_state.m_jointMaskCount = 0;
  82.  
  83.         CEvaluationContext evalContext = CEvaluationContext();
  84.         evalContext.m_buffers[TmpBuffer + 0] = pJointsTemp;
  85.         evalContext.m_buffers[TmpBuffer + 1] = pJointsStatusTemp;
  86.         evalContext.m_buffers[TmpBuffer + 2] = pJWeightSumTemp;
  87.         evalContext.m_buffers[TmpBuffer + 3] = pScalingTemp;
  88.         evalContext.m_buffers[TargetBuffer + 0] = pJointsRelative;
  89.         evalContext.m_buffers[TargetBuffer + 1] = pJointsStatusBase;
  90.         evalContext.m_buffers[TargetBuffer + 2] = nullptr;
  91.         evalContext.m_buffers[TargetBuffer + 3] = pScalingRelativeDummy;
  92.  
  93.         uint8* pCommands = m_pBuffer;
  94.         uint32 commandOffset = 0;
  95.         for (uint32 i = 0; i < m_commandCount; ++i)
  96.         {
  97.                 uint8& command = pCommands[commandOffset];
  98.                 switch (command)
  99.                 {
  100.                 case ClearPoseBuffer::ID:
  101.                         {
  102.                                 ((ClearPoseBuffer&)command).Execute(m_state, evalContext);
  103.                                 commandOffset += sizeof(ClearPoseBuffer);
  104.                                 break;
  105.                         }
  106.  
  107.                 case PerJointBlending::ID:
  108.                         {
  109.                                 ((PerJointBlending&)command).Execute(m_state, evalContext);
  110.                                 commandOffset += sizeof(PerJointBlending);
  111.                                 break;
  112.                         }
  113.  
  114.                 case SampleAddAnimFull::ID:
  115.                         {
  116.                                 ((SampleAddAnimFull&)command).Execute(m_state, evalContext);
  117.                                 commandOffset += sizeof(SampleAddAnimFull);
  118.                                 break;
  119.                         }
  120.  
  121.                 case AddPoseBuffer::ID:
  122.                         {
  123.                                 ((AddPoseBuffer&)command).Execute(m_state, evalContext);
  124.                                 commandOffset += sizeof(AddPoseBuffer);
  125.                                 break;
  126.                         }
  127.  
  128.                 case NormalizeFull::ID:
  129.                         {
  130.                                 ((NormalizeFull&)command).Execute(m_state, evalContext);
  131.                                 commandOffset += sizeof(NormalizeFull);
  132.                                 break;
  133.                         }
  134.  
  135.                 case ScaleUniformFull::ID:
  136.                         {
  137.                                 ((ScaleUniformFull&)command).Execute(m_state, evalContext);
  138.                                 commandOffset += sizeof(ScaleUniformFull);
  139.                                 break;
  140.                         }
  141.                 case PoseModifier::ID:
  142.                         {
  143.                                 ((PoseModifier&)command).Execute(m_state, evalContext);
  144.                                 commandOffset += sizeof(PoseModifier);
  145.                                 break;
  146.                         }
  147.  
  148.                 case SampleAddAnimPart::ID:
  149.                         {
  150.                                 ((SampleAddAnimPart&)command).Execute(m_state, evalContext);
  151.                                 commandOffset += sizeof(SampleAddAnimPart);
  152.                                 break;
  153.                         }
  154.  
  155.                 case JointMask::ID:
  156.                         {
  157.                                 if (Console::GetInst().ca_UseJointMasking)
  158.                                 {
  159.                                         m_state.m_pJointMask = ((JointMask&)command).m_pMask;
  160.                                         m_state.m_jointMaskCount = ((JointMask&)command).m_count;
  161.                                 }
  162.                                 commandOffset += sizeof(JointMask);
  163.                                 break;
  164.                         }
  165.  
  166.                 case SampleAddPoseFull::ID:
  167.                         {
  168.                                 ((SampleAddPoseFull&)command).Execute(m_state, evalContext);
  169.                                 commandOffset += sizeof(SampleAddPoseFull);
  170.                                 break;
  171.                         }
  172.  
  173.                 case UpdateRedirectedJoint::ID:
  174.                         {
  175.                                 ((UpdateRedirectedJoint&)command).Execute(m_state, evalContext);
  176.                                 commandOffset += sizeof(UpdateRedirectedJoint);
  177.                                 break;
  178.                         }
  179.  
  180.                 case UpdatePendulumRow::ID:
  181.                         {
  182.                                 ((UpdatePendulumRow&)command).Execute(m_state, evalContext);
  183.                                 commandOffset += sizeof(UpdatePendulumRow);
  184.                                 break;
  185.                         }
  186.  
  187.                 case PrepareAllRedirectedTransformations::ID:
  188.                         {
  189.                                 ((PrepareAllRedirectedTransformations&)command).Execute(m_state, evalContext);
  190.                                 commandOffset += sizeof(PrepareAllRedirectedTransformations);
  191.                                 break;
  192.                         }
  193.  
  194.                 case GenerateProxyModelRelativeTransformations::ID:
  195.                         {
  196.                                 ((GenerateProxyModelRelativeTransformations&)command).Execute(m_state, evalContext);
  197.                                 commandOffset += sizeof(GenerateProxyModelRelativeTransformations);
  198.                                 break;
  199.                         }
  200.  
  201.                 case ComputeAbsolutePose::ID:
  202.                         {
  203.                                 ((ComputeAbsolutePose&)command).Execute(m_state, evalContext);
  204.                                 commandOffset += sizeof(ComputeAbsolutePose);
  205.                                 break;
  206.                         }
  207.  
  208.                 case ProcessAnimationDrivenIk::ID:
  209.                         {
  210.                                 ((ProcessAnimationDrivenIk&)command).Execute(m_state, evalContext);
  211.                                 commandOffset += sizeof(ProcessAnimationDrivenIk);
  212.                                 break;
  213.                         }
  214.  
  215.                 case PhysicsSync::ID:
  216.                         {
  217.                                 ((PhysicsSync&)command).Execute(m_state, evalContext);
  218.                                 commandOffset += sizeof(PhysicsSync);
  219.                                 break;
  220.                         }
  221.  
  222. #ifdef _DEBUG
  223.                 case VerifyFull::ID:
  224.                         ((VerifyFull&)command).Execute(m_state, evalContext);
  225.                         commandOffset += sizeof(VerifyFull);
  226.                         break;
  227. #endif
  228.                 default:
  229.                         CryFatalError("CryAnimation: Command-Buffer Invalid: Command %u  Model: %s", command, m_state.m_pDefaultSkeleton->GetModelFilePath());
  230.                         break;
  231.                 }
  232.  
  233.                 // In case any of the scaling tracks have been updated, we want to swap the dummy scaling
  234.                 // output buffer with the actual lazily-allocated Skeleton::CPose one (a one-time operation).
  235.                 if (evalContext.m_isScalingPresent && evalContext.m_buffers[TargetBuffer + 3] == pScalingRelativeDummy)
  236.                 {
  237.                         if (float* pScalingRelative = m_state.m_pPoseData->GetScalingRelative())
  238.                         {
  239.                                 std::copy(pScalingRelativeDummy, pScalingRelativeDummy + m_state.m_jointCount, pScalingRelative);
  240.                                 evalContext.m_buffers[TargetBuffer + 3] = pScalingRelative;
  241.                         }
  242.                 }
  243.         }
  244.  
  245.         if (Console::GetInst().ca_DebugCommandBuffer)
  246.                 DebugDraw();
  247. }
  248.  
  249. void CBuffer::DebugDraw()
  250. {
  251.         float charsize = 1.4f;
  252.         uint32 yscan = 14;
  253.         float fColor2[4] = { 1, 0, 1, 1 };
  254.         g_pAuxGeom->Draw2dLabel(1, g_YLine, 1.3f, fColor2, false,
  255.                                 "m_CommandBufferCounter %d  Commands: %d", GetLengthUsed(), m_commandCount);
  256.         g_YLine += 10;
  257.  
  258.         const IAnimationSet* pAnimationSet = m_state.m_pDefaultSkeleton->GetIAnimationSet();
  259.  
  260.         uint8* pCommands = m_pBuffer;
  261.         uint32 commandOffset = 0;
  262.         for (uint32 c = 0; c < m_commandCount; c++)
  263.         {
  264.                 int32 anim_command = pCommands[commandOffset];
  265.                 switch (anim_command)
  266.                 {
  267.                 case ClearPoseBuffer::ID:
  268.                         g_pAuxGeom->Draw2dLabel(1, g_YLine, charsize, fColor2, false, "ClearPoseBuffer");
  269.                         g_YLine += yscan;
  270.                         commandOffset += sizeof(ClearPoseBuffer);
  271.                         break;
  272.  
  273.                 case SampleAddAnimFull::ID:
  274.                         {
  275.                                 const SampleAddAnimFull* pCommand = reinterpret_cast<const SampleAddAnimFull*>(&pCommands[commandOffset]);
  276.                                 g_pAuxGeom->Draw2dLabel(1, g_YLine, charsize, fColor2, false, "SampleAddAnimFull: w:%f t:%f %s", pCommand->m_fWeight, pCommand->m_fETimeNew, pAnimationSet->GetNameByAnimID(pCommand->m_nEAnimID));
  277.                                 g_YLine += yscan;
  278.                                 commandOffset += sizeof(SampleAddAnimFull);
  279.                                 break;
  280.                         }
  281.  
  282.                 case AddPoseBuffer::ID:
  283.                         g_pAuxGeom->Draw2dLabel(1, g_YLine, charsize, fColor2, false, "AddPoseBuffer");
  284.                         g_YLine += yscan;
  285.                         commandOffset += sizeof(AddPoseBuffer);
  286.                         break;
  287.  
  288.                 case NormalizeFull::ID:
  289.                         g_pAuxGeom->Draw2dLabel(1, g_YLine, charsize, fColor2, false, "NormalizeFull");
  290.                         g_YLine += yscan;
  291.                         commandOffset += sizeof(NormalizeFull);
  292.                         break;
  293.  
  294.                 case ScaleUniformFull::ID:
  295.                         g_pAuxGeom->Draw2dLabel(1, g_YLine, charsize, fColor2, false, "ScaleUniformFull");
  296.                         g_YLine += yscan;
  297.                         commandOffset += sizeof(ScaleUniformFull);
  298.                         break;
  299.  
  300.                 case SampleAddAnimPart::ID:
  301.                         {
  302.                                 const SampleAddAnimPart* pCommand = reinterpret_cast<const SampleAddAnimPart*>(&pCommands[commandOffset]);
  303.                                 g_pAuxGeom->Draw2dLabel(1, g_YLine, charsize, fColor2, false, "SampleAddAnimPart: w:%f t:%f %s", pCommand->m_fWeight, pCommand->m_fAnimTime, pAnimationSet->GetNameByAnimID(pCommand->m_nEAnimID));
  304.                                 g_YLine += yscan;
  305.                                 commandOffset += sizeof(SampleAddAnimPart);
  306.                                 break;
  307.                         }
  308.  
  309.                 case PerJointBlending::ID:
  310.                         g_pAuxGeom->Draw2dLabel(1, g_YLine, charsize, fColor2, false, "PerJointBlending");
  311.                         g_YLine += yscan;
  312.                         commandOffset += sizeof(PerJointBlending);
  313.                         break;
  314.  
  315. #ifdef _DEBUG
  316.                 case VerifyFull::ID:
  317.                         g_pAuxGeom->Draw2dLabel(1, g_YLine, charsize, fColor2, false, "VerifyFull");
  318.                         g_YLine += yscan;
  319.                         commandOffset += sizeof(VerifyFull);
  320.                         break;
  321. #endif
  322.  
  323.                 case PoseModifier::ID:
  324.                         g_pAuxGeom->Draw2dLabel(1, g_YLine, charsize, fColor2, false, "PoseModifier: %s", ((PoseModifier*)&pCommands[commandOffset])->m_pPoseModifier->GetFactory()->GetName());
  325.                         g_YLine += yscan;
  326.                         commandOffset += sizeof(PoseModifier);
  327.                         break;
  328.  
  329.                 case JointMask::ID:
  330.                         g_pAuxGeom->Draw2dLabel(1, g_YLine, charsize, fColor2, false, "State_JOINTMASK");
  331.                         g_YLine += yscan;
  332.                         commandOffset += sizeof(JointMask);
  333.                         break;
  334.  
  335.                 //just for aim-files
  336.                 case SampleAddPoseFull::ID:
  337.                         {
  338.                                 const SampleAddPoseFull* pCommand = reinterpret_cast<const SampleAddPoseFull*>(&pCommands[commandOffset]);
  339.                                 g_pAuxGeom->Draw2dLabel(1, g_YLine, charsize, fColor2, false, "SampleAddPoseFull: w:%f t:%f %s", pCommand->m_fWeight, pCommand->m_fETimeNew, pAnimationSet->GetNameByAnimID(pCommand->m_nEAnimID));
  340.                                 g_YLine += yscan;
  341.                                 commandOffset += sizeof(SampleAddPoseFull);
  342.                                 break;
  343.                         }
  344.  
  345.                 case UpdateRedirectedJoint::ID:
  346.                         {
  347.                                 const UpdateRedirectedJoint* pCommand = reinterpret_cast<const UpdateRedirectedJoint*>(&pCommands[commandOffset]);
  348.                                 g_pAuxGeom->Draw2dLabel(1, g_YLine, charsize, fColor2, false, "UpdateRedirectedJoint");
  349.                                 g_YLine += yscan;
  350.                                 commandOffset += sizeof(UpdateRedirectedJoint);
  351.                                 break;
  352.                         }
  353.  
  354.                 case UpdatePendulumRow::ID:
  355.                         {
  356.                                 const UpdatePendulumRow* pCommand = reinterpret_cast<const UpdatePendulumRow*>(&pCommands[commandOffset]);
  357.                                 g_pAuxGeom->Draw2dLabel(1, g_YLine, charsize, fColor2, false, "UpdatePendulumRow");
  358.                                 g_YLine += yscan;
  359.                                 commandOffset += sizeof(UpdatePendulumRow);
  360.                                 break;
  361.                         }
  362.  
  363.                 case PrepareAllRedirectedTransformations::ID:
  364.                         {
  365.                                 const PrepareAllRedirectedTransformations* pCommand = reinterpret_cast<const PrepareAllRedirectedTransformations*>(&pCommands[commandOffset]);
  366.                                 g_pAuxGeom->Draw2dLabel(1, g_YLine, charsize, fColor2, false, "PrepareAllRedirectedTransformations");
  367.                                 g_YLine += yscan;
  368.                                 commandOffset += sizeof(PrepareAllRedirectedTransformations);
  369.                                 break;
  370.                         }
  371.  
  372.                 case GenerateProxyModelRelativeTransformations::ID:
  373.                         {
  374.                                 const GenerateProxyModelRelativeTransformations* pCommand = reinterpret_cast<const GenerateProxyModelRelativeTransformations*>(&pCommands[commandOffset]);
  375.                                 g_pAuxGeom->Draw2dLabel(1, g_YLine, charsize, fColor2, false, "GenerateProxyModelRelativeTransformations");
  376.                                 g_YLine += yscan;
  377.                                 commandOffset += sizeof(GenerateProxyModelRelativeTransformations);
  378.                                 break;
  379.                         }
  380.  
  381.                 case ComputeAbsolutePose::ID:
  382.                         {
  383.                                 const ComputeAbsolutePose* pCommand = reinterpret_cast<const ComputeAbsolutePose*>(&pCommands[commandOffset]);
  384.                                 g_pAuxGeom->Draw2dLabel(1, g_YLine, charsize, fColor2, false, "ComputeAbsolutePose");
  385.                                 g_YLine += yscan;
  386.                                 commandOffset += sizeof(ComputeAbsolutePose);
  387.                                 break;
  388.                         }
  389.  
  390.                 case ProcessAnimationDrivenIk::ID:
  391.                         {
  392.                                 const ProcessAnimationDrivenIk* pCommand = reinterpret_cast<const ProcessAnimationDrivenIk*>(&pCommands[commandOffset]);
  393.                                 g_pAuxGeom->Draw2dLabel(1, g_YLine, charsize, fColor2, false, "ProcessAnimationDrivenIk");
  394.                                 g_YLine += yscan;
  395.                                 commandOffset += sizeof(ProcessAnimationDrivenIk);
  396.                                 break;
  397.                         }
  398.  
  399.                 case PhysicsSync::ID:
  400.                         {
  401.                                 const PhysicsSync* pCommand = reinterpret_cast<const PhysicsSync*>(&pCommands[commandOffset]);
  402.                                 g_pAuxGeom->Draw2dLabel(1, g_YLine, charsize, fColor2, false, "PhysicsSync");
  403.                                 g_YLine += yscan;
  404.                                 commandOffset += sizeof(PhysicsSync);
  405.                                 break;
  406.                         }
  407.  
  408.                 default:
  409.                         CryFatalError("CryAnimation: Command-Buffer Invalid: Command %d  Model: %s", anim_command, m_state.m_pDefaultSkeleton->GetModelFilePath());
  410.                         break;
  411.                 }
  412.         }
  413. }
  414.  
downloadCommand_Buffer.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