BlendTreeRangeRemapperNodeTests.cpp 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. /*
  2. * Copyright (c) Contributors to the Open 3D Engine Project.
  3. * For complete copyright and license terms please see the LICENSE at the root of this distribution.
  4. *
  5. * SPDX-License-Identifier: Apache-2.0 OR MIT
  6. *
  7. */
  8. #include <Tests/AnimGraphFixture.h>
  9. #include "EMotionFX_Traits_Platform.h"
  10. #include <EMotionFX/Source/AnimGraph.h>
  11. #include <EMotionFX/Source/AnimGraphBindPoseNode.h>
  12. #include <EMotionFX/Source/AnimGraphNode.h>
  13. #include <EMotionFX/Source/AnimGraphStateMachine.h>
  14. #include <EMotionFX/Source/BlendTree.h>
  15. #include <EMotionFX/Source/BlendTreeBlend2Node.h>
  16. #include <EMotionFX/Source/BlendTreeFloatConstantNode.h>
  17. #include <EMotionFX/Source/BlendTreeRangeRemapperNode.h>
  18. #include <EMotionFX/Source/EMotionFXManager.h>
  19. namespace EMotionFX
  20. {
  21. struct BlendTreeRangeRemapperNodeTestData
  22. {
  23. // Range of the Range Remapper Node Input/Output
  24. float m_minInputFloat;
  25. float m_maxInputFloat;
  26. float m_minOutputFloat;
  27. float m_maxOutputFloat;
  28. // Input floats for the Range Remapper Node, and expected outputs
  29. // Generally output is a linear conversion of the input
  30. // TODO: When min > max input range, output is always maxOutput, create a warning in graph analyzer
  31. std::vector<float> m_inputFloats;
  32. std::vector<float> m_expectedOutputs;
  33. };
  34. class BlendTreeRangeRemapperNodeFixture
  35. : public AnimGraphFixture
  36. , public ::testing::WithParamInterface<BlendTreeRangeRemapperNodeTestData>
  37. {
  38. public:
  39. void ConstructGraph() override
  40. {
  41. AnimGraphFixture::ConstructGraph();
  42. m_param = GetParam();
  43. m_blendTreeAnimGraph = AnimGraphFactory::Create<OneBlendTreeNodeAnimGraph>();
  44. m_rootStateMachine = m_blendTreeAnimGraph->GetRootStateMachine();
  45. m_blendTree = m_blendTreeAnimGraph->GetBlendTreeNode();
  46. /*
  47. +------------+
  48. |bindPoseNode|--+
  49. +------------+ +>+----------+ +---------+
  50. |blend2Node|--->|finalNode|
  51. +-----------------+ +-------------------+ +>+----------+ +---------+
  52. |floatConstantNode|--->|m_RangeRemapperNode|--+
  53. +-----------------+ +-------------------+
  54. */
  55. m_rangeRemapperNode = aznew BlendTreeRangeRemapperNode();
  56. m_floatConstantNode = aznew BlendTreeFloatConstantNode();
  57. AnimGraphBindPoseNode* bindPoseNode = aznew AnimGraphBindPoseNode();
  58. BlendTreeBlend2Node* blend2Node = aznew BlendTreeBlend2Node();
  59. BlendTreeFinalNode* finalNode = aznew BlendTreeFinalNode();
  60. m_blendTree->AddChildNode(m_rangeRemapperNode);
  61. m_blendTree->AddChildNode(m_floatConstantNode);
  62. m_blendTree->AddChildNode(bindPoseNode);
  63. m_blendTree->AddChildNode(blend2Node);
  64. m_blendTree->AddChildNode(finalNode);
  65. m_rangeRemapperNode->AddConnection(m_floatConstantNode, BlendTreeFloatConstantNode::OUTPUTPORT_RESULT, BlendTreeRangeRemapperNode::INPUTPORT_X);
  66. blend2Node->AddConnection(bindPoseNode, AnimGraphBindPoseNode::PORTID_OUTPUT_POSE, BlendTreeBlend2Node::INPUTPORT_POSE_A);
  67. blend2Node->AddConnection(bindPoseNode, AnimGraphBindPoseNode::PORTID_OUTPUT_POSE, BlendTreeBlend2Node::INPUTPORT_POSE_B);
  68. blend2Node->AddConnection(m_rangeRemapperNode, BlendTreeRangeRemapperNode::OUTPUTPORT_RESULT, BlendTreeBlend2Node::INPUTPORT_WEIGHT);
  69. finalNode->AddConnection(blend2Node, BlendTreeBlend2Node::OUTPUTPORT_POSE, BlendTreeFinalNode::INPUTPORT_POSE);
  70. m_blendTreeAnimGraph->InitAfterLoading();
  71. }
  72. void SetUp() override
  73. {
  74. AnimGraphFixture::SetUp();
  75. m_animGraphInstance->Destroy();
  76. m_animGraphInstance = m_blendTreeAnimGraph->GetAnimGraphInstance(m_actorInstance, m_motionSet);
  77. }
  78. protected:
  79. BlendTree* m_blendTree = nullptr;
  80. BlendTreeRangeRemapperNode* m_rangeRemapperNode = nullptr;
  81. BlendTreeFloatConstantNode* m_floatConstantNode = nullptr;
  82. BlendTreeRangeRemapperNodeTestData m_param;
  83. };
  84. #if AZ_TRAIT_DISABLE_FAILED_EMOTION_FX_TESTS
  85. TEST_P(BlendTreeRangeRemapperNodeFixture, DISABLED_OutputsCorrectFloatTest)
  86. #else
  87. TEST_P(BlendTreeRangeRemapperNodeFixture, OutputsCorrectFloatTest)
  88. #endif // AZ_TRAIT_DISABLE_FAILED_EMOTION_FX_TESTS
  89. {
  90. // Setup Blend Tree Range Remapper Node's input/output ranges
  91. m_rangeRemapperNode->SetInputMin(m_param.m_minInputFloat);
  92. m_rangeRemapperNode->SetInputMax(m_param.m_maxInputFloat);
  93. m_rangeRemapperNode->SetOutputMin(m_param.m_minOutputFloat);
  94. m_rangeRemapperNode->SetOutputMax(m_param.m_maxOutputFloat);
  95. // Test with input floats and compare outputs with expected outputs
  96. AZ::u32 outputIndex = 0;
  97. for (float inputFloat : m_param.m_inputFloats)
  98. {
  99. m_floatConstantNode->SetValue(inputFloat);
  100. GetEMotionFX().Update(1.0f / 60.0f);
  101. const float actualOutput = m_rangeRemapperNode->GetOutputFloat(m_animGraphInstance,
  102. BlendTreeRangeRemapperNode::OUTPUTPORT_RESULT)->GetValue();
  103. const float expectedOutput = m_param.m_expectedOutputs[outputIndex];
  104. EXPECT_EQ(actualOutput, expectedOutput) << "Expected Output: " << expectedOutput;
  105. outputIndex++;
  106. }
  107. };
  108. std::vector<BlendTreeRangeRemapperNodeTestData> blendTreeRangeRemapperNodeTestData
  109. {
  110. {
  111. 0.0f, 0.0f, 0.0f, 0.0f, {-1.1f, 0.0f, 1.1f}, {0.0f, 0.0f, 0.0f}
  112. },
  113. {
  114. 0.0f, 1.0f, 0.0f, 1.0f, {-0.5f, 0.0f, 0.5f, 1.5f}, {0.0f, 0.0f, 0.5f, 1.0f}
  115. },
  116. {
  117. 0.0f, 1.0f, -10.0f, 10.0f, {-0.5f, 0.0f, 0.5f, 1.5f}, {-10.0f, -10.0f, 0.0f, 10.0f}
  118. },
  119. {
  120. -10.0f, 10.0f, 0.0f, 1.0f, {-10.5f, 0.0f, 5.5f, 11.5f}, {0.0f, 0.5f, 0.775f, 1.0f}
  121. },
  122. {
  123. 5.0f, 0.0f, 0.0f, 5.0f, {-1.5f, 0.0f, 4.5f, 11.5f}, {5.0f, 5.0f, 5.0f, 5.0f}
  124. },
  125. {
  126. 0.0f, 5.0f, 5.0f, 0.0f, {-1.5f, 0.0f, 4.5f, 11.5f}, {5.0f, 5.0f, 0.5f, 0.0f}
  127. },
  128. {
  129. 5.0f, 0.0f, 5.0f, 0.0f, {-1.5f, 0.0f, 4.5f, 11.5f}, {0.0f, 0.0f, 0.0f, 0.0f}
  130. }
  131. };
  132. INSTANTIATE_TEST_CASE_P(BlendTreeRangeRemapperNode_ValidOutputTests,
  133. BlendTreeRangeRemapperNodeFixture,
  134. ::testing::ValuesIn(blendTreeRangeRemapperNodeTestData)
  135. );
  136. } // end namespace EMotionFX