AssetBlendTrackTest.cpp 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  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. #if !defined(_RELEASE)
  9. #include <AnimKey.h>
  10. #include <Maestro/Types/AssetBlendKey.h>
  11. #include <Cinematics/AssetBlendTrack.h>
  12. #include <AzTest/AzTest.h>
  13. namespace AssetBlendTrackTest
  14. {
  15. const AZ::Data::AssetId KEY1_ASSET_ID = AZ::Data::AssetId(AZ::Uuid("{86CE36B5-D996-4CEF-943E-3F12008694E1}"), 1);
  16. const AZ::Data::AssetId KEY2_ASSET_ID = AZ::Data::AssetId(AZ::Uuid("{94D54D20-BACC-4A60-8A03-0DC9B5033E03}"), 2);
  17. const AZ::Data::AssetId KEY3_ASSET_ID = AZ::Data::AssetId(AZ::Uuid("{94D54D20-BACC-4A60-8A03-0DC9B5033E03}"), 3);
  18. const AZ::Data::AssetId ZERO_ASSET_ID = AZ::Data::AssetId();
  19. /////////////////////////////////////////////////////////////////////////////////////
  20. // Testing sub-class
  21. class CAssetBlendTrackTest : public ::testing::Test
  22. {
  23. public:
  24. CAssetBlendTrackTest();
  25. void CreateAssetBlendTestKeys();
  26. CAssetBlendTrack m_assetBlendTrack;
  27. AZStd::vector<Maestro::AssetBlend> m_vectorBlends8EvaluatingTo6 = {
  28. // m_assetId, m_time, m_blendInTime, m_blendOutTime
  29. Maestro::AssetBlend(KEY1_ASSET_ID, 0.0f, 0.1f, 0.1f),
  30. Maestro::AssetBlend(KEY1_ASSET_ID, 0.0f, 0.1f, 0.1f), // item is to be filtered out due to the ambiguous key time
  31. Maestro::AssetBlend(ZERO_ASSET_ID, 0.5f, 0.1f, 0.1f), // item is to be filtered out due to the invalid asset Id
  32. Maestro::AssetBlend(KEY1_ASSET_ID, 0.5f, 0.1f, 0.1f),
  33. Maestro::AssetBlend(KEY2_ASSET_ID, 1.0f, 0.1f, 0.1f),
  34. Maestro::AssetBlend(KEY2_ASSET_ID, 1.5f, 0.1f, 0.1f),
  35. Maestro::AssetBlend(KEY3_ASSET_ID, 2.5f, 0.3f, 0.3f), // item is to be sorted down, its duration cannot be determined other than 0.3f + 0.3f + tolerance
  36. Maestro::AssetBlend(KEY3_ASSET_ID, 2.0f, 0.1f, 0.1f)
  37. };
  38. Maestro::AssetBlends<AZ::Data::AssetData> m_AssetBlends8EvaluatingTo6 = {
  39. m_vectorBlends8EvaluatingTo6 // AZStd::vector<AssetBlend> m_assetBlends
  40. };
  41. };
  42. /////////////////////////////////////////////////////////////////////////////////////
  43. // Testing setup methods
  44. CAssetBlendTrackTest::CAssetBlendTrackTest()
  45. {
  46. CreateAssetBlendTestKeys();
  47. }
  48. void CAssetBlendTrackTest::CreateAssetBlendTestKeys()
  49. {
  50. int keyIndex = 0;
  51. AZ::IAssetBlendKey key1;
  52. key1.time = 1.0f;
  53. key1.m_duration = 1.0f;
  54. key1.m_assetId = KEY1_ASSET_ID;
  55. m_assetBlendTrack.CreateKey(key1.time);
  56. m_assetBlendTrack.SetKey(keyIndex++, &key1);
  57. AZ::IAssetBlendKey key2;
  58. key2.time = 2.0f;
  59. key2.m_duration = 1.0f;
  60. key2.m_assetId = KEY2_ASSET_ID;
  61. m_assetBlendTrack.CreateKey(key2.time);
  62. m_assetBlendTrack.SetKey(keyIndex++, &key2);
  63. AZ::IAssetBlendKey key3;
  64. key3.time = 3.0f;
  65. key3.m_duration = 1.0f;
  66. key3.m_assetId = KEY3_ASSET_ID;
  67. m_assetBlendTrack.CreateKey(key3.time);
  68. m_assetBlendTrack.SetKey(keyIndex++, &key3);
  69. }
  70. /////////////////////////////////////////////////////////////////////////////////////
  71. // Tests
  72. // Asset Blend Track
  73. TEST_F(CAssetBlendTrackTest, Maestro_CAssetBlendTrackTest_Test01)
  74. {
  75. Maestro::AssetBlends<AZ::Data::AssetData> value;
  76. m_assetBlendTrack.GetValue(0.0f, value);
  77. ASSERT_GT(value.m_assetBlends.size(), 0) << "Expected to find at least one AssetBlend at time 0.0f.";
  78. ASSERT_EQ(value.m_assetBlends.at(0).m_assetId, KEY1_ASSET_ID) << "Expected KEY1_ASSET_ID at time 0.0f.";
  79. m_assetBlendTrack.GetValue(1.5f, value);
  80. ASSERT_GT(value.m_assetBlends.size(), 0) << "Expected to find at least one AssetBlend at time 1.5f.";
  81. ASSERT_EQ(value.m_assetBlends.at(0).m_assetId, KEY1_ASSET_ID) << "Expected KEY1_ASSET_ID at time 1.5f.";
  82. m_assetBlendTrack.GetValue(2.5f, value);
  83. ASSERT_GT(value.m_assetBlends.size(), 0) << "Expected to find at least one AssetBlend at time 1.5f.";
  84. ASSERT_EQ(value.m_assetBlends.at(0).m_assetId, KEY2_ASSET_ID) << "Expected KEY2_ASSET_ID at time 1.5f.";
  85. m_assetBlendTrack.GetValue(3.5f, value);
  86. ASSERT_GT(value.m_assetBlends.size(), 0) << "Expected to find at least one AssetBlend at time 3.0f.";
  87. ASSERT_EQ(value.m_assetBlends.at(0).m_assetId, KEY3_ASSET_ID) << "Expected KEY3_ASSET_ID at time 3.0f.";
  88. };
  89. TEST_F(CAssetBlendTrackTest, SetValue_EmptyBlends_ExpectNoKeys)
  90. {
  91. Maestro::AssetBlends<AZ::Data::AssetData> emptyAssetBlends;
  92. m_assetBlendTrack.SetValue(0.f, emptyAssetBlends, false);
  93. ASSERT_EQ(m_assetBlendTrack.GetNumKeys(), 0) << "Expected no keys.";
  94. CreateAssetBlendTestKeys();
  95. m_assetBlendTrack.SetValue(0.f, emptyAssetBlends, true);
  96. ASSERT_EQ(m_assetBlendTrack.GetNumKeys(), 0) << "Expected no keys.";
  97. CreateAssetBlendTestKeys();
  98. m_assetBlendTrack.SetDefaultValue(emptyAssetBlends);
  99. ASSERT_EQ(m_assetBlendTrack.GetNumKeys(), 0) << "Expected no keys.";
  100. }
  101. TEST_F(CAssetBlendTrackTest, SetValue_Default_8Blends_Expect6Keys)
  102. {
  103. constexpr float timeOffset = 1.0f;
  104. m_assetBlendTrack.SetValue(timeOffset, m_AssetBlends8EvaluatingTo6, true); // save default blends and then reconstruct keys from these
  105. Maestro::AssetBlends<AZ::Data::AssetData> resultingDefaultBlends;
  106. m_assetBlendTrack.GetDefaultValue(resultingDefaultBlends);
  107. // Invalid elements (with invalid AssetId) and ambiguous elements (with the repeating AssetId and time key) are filtered out
  108. ASSERT_EQ(resultingDefaultBlends.m_assetBlends.size(), 6) << "Expected 6 blends, 2 of 8 were to be filtered out.";
  109. // Setting blends reconstructs keys accordingly, filtering out invalid and ambiguous elements
  110. auto numKeys = m_assetBlendTrack.GetNumKeys();
  111. ASSERT_EQ(numKeys, 6) << "Expected 6 keys, 2 of 8 blends were to be filtered out.";
  112. AZ::IAssetBlendKey key;
  113. m_assetBlendTrack.GetKey(4, &key);
  114. ASSERT_LE(fabs(key.time - 2.0f - timeOffset), AZ::Constants::FloatEpsilon) << "Wrong key time.";
  115. ASSERT_LE(fabs(key.m_duration - 0.5f), AZ::Constants::FloatEpsilon) << "Wrong key duration.";
  116. m_assetBlendTrack.GetKey(5, &key); // last key
  117. ASSERT_LE(fabs(key.time - 2.5f - timeOffset), AZ::Constants::FloatEpsilon) << "Wrong key time.";
  118. ASSERT_LE(fabs(key.m_duration - 0.6f), AZ::Constants::Tolerance + AZ::Constants::FloatEpsilon);
  119. ASSERT_LE(fabs(m_assetBlendTrack.GetEndTime() - key.m_endTime), AZ::Constants::FloatEpsilon) << "Wrong sequence end time.";
  120. m_assetBlendTrack.SetValue(0.f, m_AssetBlends8EvaluatingTo6, false); // reconstruct current keys from given blends
  121. // Setting blends reconstructs keys accordingly, filtering out invalid and ambiguous elements
  122. numKeys = m_assetBlendTrack.GetNumKeys();
  123. ASSERT_EQ(numKeys, 6) << "Expected 6 keys, 2 of 8 possible keys were to be filtered out.";
  124. m_assetBlendTrack.GetKey(4, &key);
  125. ASSERT_LE(fabs(key.time - 2.0f), AZ::Constants::FloatEpsilon) << "Wrong key time.";
  126. ASSERT_LE(fabs(key.m_duration - 0.5f), AZ::Constants::FloatEpsilon) << "Wrong key duration.";
  127. m_assetBlendTrack.GetKey(5, &key); // last key
  128. ASSERT_LE(fabs(key.time - 2.5f), AZ::Constants::FloatEpsilon) << "Wrong key time.";
  129. ASSERT_LE(fabs(m_assetBlendTrack.GetEndTime() - key.m_endTime), AZ::Constants::FloatEpsilon) << "Wrong sequence end time.";
  130. }
  131. }; // namespace AssetBlendTrackTest
  132. #endif // !defined(_RELEASE)