BlendTreeMotionMatchNode.h 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  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. #pragma once
  9. #include <AzCore/Debug/Timer.h>
  10. #include <EMotionFX/Source/AnimGraphNode.h>
  11. #include <EMotionFX/Source/EMotionFXConfig.h>
  12. #include <MotionMatchingInstance.h>
  13. #include <FeatureSchema.h>
  14. #include <MotionMatchingData.h>
  15. #include <ImGuiMonitor.h>
  16. namespace EMotionFX::MotionMatching
  17. {
  18. class EMFX_API BlendTreeMotionMatchNode
  19. : public AnimGraphNode
  20. {
  21. public:
  22. AZ_RTTI(BlendTreeMotionMatchNode, "{1DC80DCD-6536-4950-9260-A4615C03E3C5}", AnimGraphNode)
  23. AZ_CLASS_ALLOCATOR_DECL
  24. enum
  25. {
  26. INPUTPORT_TARGETPOS = 0,
  27. INPUTPORT_TARGETFACINGDIR = 1,
  28. INPUTPORT_USEFACINGDIR = 2,
  29. OUTPUTPORT_POSE = 0
  30. };
  31. enum
  32. {
  33. PORTID_INPUT_TARGETPOS = 0,
  34. PORTID_INPUT_TARGETFACINGDIR = 1,
  35. PORTID_INPUT_USEFACINGDIR = 2,
  36. PORTID_OUTPUT_POSE = 0
  37. };
  38. class EMFX_API UniqueData
  39. : public AnimGraphNodeData
  40. {
  41. EMFX_ANIMGRAPHOBJECTDATA_IMPLEMENT_LOADSAVE
  42. public:
  43. AZ_CLASS_ALLOCATOR_DECL
  44. UniqueData(AnimGraphNode* node, AnimGraphInstance* animGraphInstance)
  45. : AnimGraphNodeData(node, animGraphInstance)
  46. {
  47. }
  48. ~UniqueData()
  49. {
  50. delete m_data;
  51. delete m_instance;
  52. }
  53. void Update() override;
  54. public:
  55. MotionMatching::MotionMatchingInstance* m_instance = nullptr;
  56. MotionMatching::MotionMatchingData* m_data = nullptr;
  57. };
  58. BlendTreeMotionMatchNode();
  59. ~BlendTreeMotionMatchNode();
  60. bool InitAfterLoading(AnimGraph* animGraph) override;
  61. bool GetSupportsVisualization() const override { return true; }
  62. bool GetHasOutputPose() const override { return true; }
  63. bool GetSupportsDisable() const override { return true; }
  64. AZ::Color GetVisualColor() const override { return AZ::Colors::Green; }
  65. AnimGraphPose* GetMainOutputPose(AnimGraphInstance* animGraphInstance) const override { return GetOutputPose(animGraphInstance, OUTPUTPORT_POSE)->GetValue(); }
  66. const char* GetPaletteName() const override;
  67. AnimGraphObject::ECategory GetPaletteCategory() const override;
  68. AnimGraphObjectData* CreateUniqueData(AnimGraphInstance* animGraphInstance) override { return aznew UniqueData(this, animGraphInstance); }
  69. static void Reflect(AZ::ReflectContext* context);
  70. const FeatureSchema& GetFeatureSchema() const { return m_featureSchema; }
  71. private:
  72. void Output(AnimGraphInstance* animGraphInstance) override;
  73. void Update(AnimGraphInstance* animGraphInstance, float timePassedInSeconds) override;
  74. void PostUpdate(AnimGraphInstance* animGraphInstance, float timePassedInSeconds) override;
  75. AZ::Crc32 GetTrajectoryPathSettingsVisibility() const;
  76. AZ::Crc32 GetFeatureScalerTypeSettingsVisibility() const;
  77. AZ::Crc32 GetMinMaxSettingsVisibility() const;
  78. AZ::Crc32 OnVisualizeSchemaButtonClicked();
  79. AZStd::string OnVisualizeSchemaButtonText() const;
  80. FeatureSchema m_featureSchema;
  81. AZStd::vector<AZStd::string> m_motionIds;
  82. float m_pathRadius = 1.0f;
  83. float m_pathSpeed = 1.0f;
  84. float m_lowestCostSearchFrequency = 5.0f;
  85. AZ::u32 m_sampleRate = 30;
  86. AZ::u32 m_maxKdTreeDepth = 15;
  87. AZ::u32 m_minFramesPerKdTreeNode = 1000;
  88. TrajectoryQuery::EMode m_trajectoryQueryMode = TrajectoryQuery::MODE_TARGETDRIVEN;
  89. bool m_mirror = false;
  90. // Data normalization.
  91. bool m_normalizeData = false;
  92. MotionMatchingData::FeatureScalerType m_featureScalerType = MotionMatchingData::StandardScalerType;
  93. float m_featureMin = 0.0f;
  94. float m_featureMax = 1.0f;
  95. bool m_clipFeatures = false;
  96. AZ::Debug::Timer m_timer;
  97. float m_updateTimeInMs = 0.0f;
  98. float m_postUpdateTimeInMs = 0.0f;
  99. float m_outputTimeInMs = 0.0f;
  100. #ifdef IMGUI_ENABLED
  101. ImGuiMonitor m_imguiMonitor;
  102. #endif
  103. };
  104. } // namespace EMotionFX::MotionMatching