BlendTreeFloatConstantNodeTests.cpp 3.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  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 <AzCore/Math/Random.h>
  9. #include <EMotionFX/Source/AnimGraph.h>
  10. #include <EMotionFX/Source/AnimGraphBindPoseNode.h>
  11. #include <EMotionFX/Source/AnimGraphStateMachine.h>
  12. #include <EMotionFX/Source/BlendTree.h>
  13. #include <EMotionFX/Source/BlendTreeBlend2Node.h>
  14. #include <EMotionFX/Source/BlendTreeFloatConstantNode.h>
  15. #include <EMotionFX/Source/EMotionFXManager.h>
  16. #include <limits.h>
  17. #include <Tests/AnimGraphFixture.h>
  18. namespace EMotionFX
  19. {
  20. class BlendTreeFloatConstantNodeFixture
  21. : public AnimGraphFixture
  22. {
  23. public:
  24. void ConstructGraph() override
  25. {
  26. AnimGraphFixture::ConstructGraph();
  27. m_blendTreeAnimGraph = AnimGraphFactory::Create<OneBlendTreeNodeAnimGraph>();
  28. m_rootStateMachine = m_blendTreeAnimGraph->GetRootStateMachine();
  29. m_blendTree = m_blendTreeAnimGraph->GetBlendTreeNode();
  30. // Add nodes to blend tree.
  31. BlendTreeFinalNode* finalNode = aznew BlendTreeFinalNode();
  32. m_blendTree->AddChildNode(finalNode);
  33. m_blend2Node = aznew BlendTreeBlend2Node();
  34. m_blendTree->AddChildNode(m_blend2Node);
  35. m_floatConstantNode = aznew BlendTreeFloatConstantNode();
  36. m_blendTree->AddChildNode(m_floatConstantNode);
  37. AnimGraphBindPoseNode* bindPoseNode = aznew AnimGraphBindPoseNode();
  38. m_blendTree->AddChildNode(bindPoseNode);
  39. // Connect the nodes.
  40. m_blend2Node->AddConnection(bindPoseNode, AnimGraphBindPoseNode::PORTID_OUTPUT_POSE, BlendTreeBlend2Node::INPUTPORT_POSE_A);
  41. m_blend2Node->AddConnection(bindPoseNode, AnimGraphBindPoseNode::PORTID_OUTPUT_POSE, BlendTreeBlend2Node::INPUTPORT_POSE_B);
  42. m_blend2Node->AddConnection(m_floatConstantNode, BlendTreeFloatConstantNode::PORTID_OUTPUT_RESULT, BlendTreeBlend2Node::INPUTPORT_WEIGHT);
  43. finalNode->AddConnection(m_blend2Node, BlendTreeBlend2Node::PORTID_OUTPUT_POSE, BlendTreeFinalNode::PORTID_INPUT_POSE);
  44. m_blendTreeAnimGraph->InitAfterLoading();
  45. }
  46. void SetUp() override
  47. {
  48. AnimGraphFixture::SetUp();
  49. m_animGraphInstance->Destroy();
  50. m_animGraphInstance = m_blendTreeAnimGraph->GetAnimGraphInstance(m_actorInstance, m_motionSet);
  51. }
  52. protected:
  53. BlendTreeFloatConstantNode* m_floatConstantNode = nullptr;
  54. BlendTreeBlend2Node* m_blend2Node = nullptr;
  55. BlendTree* m_blendTree = nullptr;
  56. };
  57. TEST_F(BlendTreeFloatConstantNodeFixture, NodeOutputsCorrectFloat)
  58. {
  59. // Test max float constant node value.
  60. m_floatConstantNode->SetValue(FLT_MAX);
  61. GetEMotionFX().Update(1.0f / 60.0f);
  62. EXPECT_FLOAT_EQ(m_floatConstantNode->
  63. GetOutputFloat(m_animGraphInstance, BlendTreeFloatConstantNode::PORTID_OUTPUT_RESULT)->GetValue(), FLT_MAX);
  64. // Test min float constant node value.
  65. m_floatConstantNode->SetValue(FLT_MIN);
  66. GetEMotionFX().Update(1.0f / 60.0f);
  67. EXPECT_FLOAT_EQ(m_floatConstantNode->
  68. GetOutputFloat(m_animGraphInstance, BlendTreeFloatConstantNode::PORTID_OUTPUT_RESULT)->GetValue(), FLT_MIN);
  69. // Test 10 random float constant node value in range of [-5,5).
  70. AZ::SimpleLcgRandom random;
  71. random.SetSeed(875960);
  72. for (AZ::u32 i = 0; i < 10; ++i)
  73. {
  74. const float randomFloat = random.GetRandomFloat() * 10.0f - 5.0f;
  75. m_floatConstantNode->SetValue(randomFloat);
  76. GetEMotionFX().Update(1.0f / 60.0f);
  77. EXPECT_FLOAT_EQ(m_floatConstantNode->GetOutputFloat(m_animGraphInstance,
  78. BlendTreeFloatConstantNode::PORTID_OUTPUT_RESULT)->GetValue(), randomFloat);
  79. }
  80. }
  81. } // end namespace EMotionFX