1f9b284de2
Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> # Conflicts: # Code/Editor/Plugins/ComponentEntityEditorPlugin/ComponentEntityEditorPlugin_precompiled.h # Code/Editor/Plugins/EditorCommon/EditorCommon_precompiled.h # Code/Editor/Plugins/EditorCommon/stdafx.cpp # Code/Editor/Plugins/FFMPEGPlugin/FFMPEGPlugin_precompiled.h # Code/Editor/Plugins/PerforcePlugin/PerforcePlugin_precompiled.h # Code/Editor/Plugins/ProjectSettingsTool/ProjectSettingsTool_precompiled.h # Code/Framework/AzToolsFramework/AzToolsFramework/AzToolsFramework_precompiled.h # Code/Tools/AssetProcessor/native/precompiled.h # Code/Tools/Standalone/StandaloneTools_precompiled.h # Gems/AssetMemoryAnalyzer/Code/Source/AssetMemoryAnalyzer_precompiled.h # Gems/Atom/Asset/ImageProcessingAtom/Code/Source/ImageProcessing_precompiled.h # Gems/Atom/RHI/DX12/Code/Source/RHI/Atom_RHI_DX12_precompiled.h # Gems/Atom/RHI/Metal/Code/Include/Platform/Mac/Atom_RHI_Metal_precompiled_Platform.h # Gems/Atom/RHI/Metal/Code/Include/Platform/iOS/Atom_RHI_Metal_precompiled_Platform.h # Gems/Atom/RHI/Metal/Code/Source/Atom_RHI_Metal_precompiled.h # Gems/Atom/RHI/Metal/Code/atom_rhi_metal_common_files.cmake # Gems/Atom/RHI/Null/Code/Source/Atom_RHI_Null_precompiled.h # Gems/Atom/RHI/Null/Code/atom_rhi_null_common_files.cmake # Gems/Atom/RHI/Vulkan/Code/Include/Platform/Android/Atom_RHI_Vulkan_precompiled_Platform.h # Gems/Atom/RHI/Vulkan/Code/Include/Platform/Linux/Atom_RHI_Vulkan_precompiled_Platform.h # Gems/Atom/RHI/Vulkan/Code/Include/Platform/Mac/Atom_RHI_Vulkan_precompiled_Platform.h # Gems/Atom/RHI/Vulkan/Code/Include/Platform/Windows/Atom_RHI_Vulkan_precompiled_Platform.h # Gems/Atom/RHI/Vulkan/Code/Source/Atom_RHI_Vulkan_precompiled.h # Gems/Atom/RHI/Vulkan/Code/Source/RHI/SwapChain.cpp # Gems/Atom/RHI/Vulkan/Code/atom_rhi_vulkan_common_files.cmake # Gems/AtomLyIntegration/AtomFont/Code/Include/AtomLyIntegration/AtomFont/AtomFont_precompiled.h # Gems/Blast/Code/Source/StdAfx.cpp # Gems/Camera/Code/Source/Camera_precompiled.h # Gems/EMotionFX/Code/Source/EMotionFX_precompiled.h # Gems/FastNoise/Code/Source/FastNoise_precompiled.h # Gems/Gestures/Code/Source/Gestures_precompiled.h # Gems/GradientSignal/Code/Source/GradientSignal_precompiled.h # Gems/GraphCanvas/Code/precompiled.h # Gems/ImGui/Code/Source/ImGui_precompiled.h # Gems/InAppPurchases/Code/Source/InAppPurchases_precompiled.h # Gems/LmbrCentral/Code/Source/LmbrCentral_precompiled.h # Gems/LmbrCentral/Code/Tests/ShapeGeometryUtilTest.cpp # Gems/LyShine/Code/Editor/UiCanvasEditor_precompiled.h # Gems/LyShine/Code/Source/Animation/LyShine_precompiled.h # Gems/LyShine/Code/Source/LyShine_precompiled.h # Gems/LyShineExamples/Code/Source/LyShineExamples_precompiled.h # Gems/Maestro/Code/Source/Cinematics/Maestro_precompiled.h # Gems/Maestro/Code/Source/Maestro_precompiled.h # Gems/MessagePopup/Code/Source/MessagePopup_precompiled.h # Gems/Metastream/Code/Source/Metastream_precompiled.h # Gems/Microphone/Code/Source/Microphone_precompiled.h # Gems/Multiplayer/Code/Source/Multiplayer_precompiled.h # Gems/PhysX/Code/NumericalMethods/Source/NumericalMethods_precompiled.h # Gems/PhysX/Code/Source/PhysXUnsupported_precompiled.h # Gems/PhysX/Code/Source/PhysX_precompiled.h # Gems/PhysX/Code/physx_unsupported_files.cmake # Gems/PhysXDebug/Code/Source/PhysXDebugUnsupported_precompiled.h # Gems/PhysXDebug/Code/Source/PhysXDebug_precompiled.h # Gems/ScriptCanvas/Code/Editor/precompiled.h # Gems/ScriptCanvas/Code/Source/precompiled.h # Gems/ScriptCanvasDeveloper/Code/Source/precompiled.h # Gems/ScriptCanvasPhysics/Code/Source/ScriptCanvasPhysics_precompiled.h # Gems/ScriptEvents/Code/Source/precompiled.h # Gems/ScriptEvents/Code/Tests/Editor/EditorTests.cpp # Gems/ScriptedEntityTweener/Code/Source/ScriptedEntityTweener_precompiled.h # Gems/SliceFavorites/Code/Source/SliceFavorites_precompiled.h # Gems/StartingPointCamera/Code/Source/StartingPointCamera_precompiled.h # Gems/StartingPointInput/Code/Source/StartingPointInput_precompiled.h # Gems/StartingPointMovement/Code/Source/StartingPointMovement_precompiled.h # Gems/SurfaceData/Code/Source/SurfaceData_precompiled.h # Gems/TextureAtlas/Code/Source/TextureAtlas_precompiled.h # Gems/TickBusOrderViewer/Code/Source/TickBusOrderViewer_precompiled.h # Gems/Twitch/Code/Source/Twitch_precompiled.h # Gems/VirtualGamepad/Code/Source/VirtualGamepad_precompiled.h # Gems/WhiteBox/Code/Source/WhiteBoxUnsupported_precompiled.h # Gems/WhiteBox/Code/Source/WhiteBox_precompiled.h
278 lines
9.6 KiB
C++
278 lines
9.6 KiB
C++
/*
|
|
* Copyright (c) Contributors to the Open 3D Engine Project.
|
|
* For complete copyright and license terms please see the LICENSE at the root of this distribution.
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0 OR MIT
|
|
*
|
|
*/
|
|
|
|
#include "SystemComponentFixture.h"
|
|
|
|
#include <AzTest/AzTest.h>
|
|
#include <AzCore/Math/MathUtils.h>
|
|
|
|
#include <EMotionFX/Source/KeyTrackLinearDynamic.h>
|
|
|
|
#include <Integration/System/SystemCommon.h>
|
|
|
|
|
|
namespace EMotionFX
|
|
{
|
|
//--------------------------------------------------------------------------
|
|
// The test fixture setup and helpers.
|
|
//--------------------------------------------------------------------------
|
|
class KeyTrackLinearDynamicFixture : public SystemComponentFixture
|
|
{
|
|
public:
|
|
KeyTrackLinearDynamicFixture()
|
|
: SystemComponentFixture()
|
|
{
|
|
}
|
|
|
|
void LogFloatTrack(KeyTrackLinearDynamic<float, float>& track)
|
|
{
|
|
AZ_Printf("EMotionFX", "----------\n");
|
|
for (AZ::u32 i=0; i < track.GetNumKeys(); ++i)
|
|
{
|
|
AZ_Printf("EMotionFX", "#%d = time:%f value:%f\n", i, track.GetKey(i)->GetTime(), track.GetKey(i)->GetValue());
|
|
}
|
|
}
|
|
|
|
void FillFloatTrackZeroToThree(KeyTrackLinearDynamic<float, float>& track)
|
|
{
|
|
track.ClearKeys();
|
|
track.AddKey(0.0f, 0.0f);
|
|
track.AddKey(1.0f, 1.0f);
|
|
track.AddKey(2.0f, 2.0f);
|
|
track.AddKey(3.0f, 3.0f);
|
|
track.Init();
|
|
}
|
|
};
|
|
|
|
//--------------------------------------------------------------------------
|
|
// The actual tests.
|
|
//--------------------------------------------------------------------------
|
|
TEST_F(KeyTrackLinearDynamicFixture, KeyTrackAdd)
|
|
{
|
|
EMotionFX::KeyTrackLinearDynamic<float, float> track;
|
|
FillFloatTrackZeroToThree(track);
|
|
ASSERT_EQ(track.GetNumKeys(), 4);
|
|
}
|
|
|
|
TEST_F(KeyTrackLinearDynamicFixture, KeyTrackAddSorted)
|
|
{
|
|
EMotionFX::KeyTrackLinearDynamic<float, float> track;
|
|
track.AddKeySorted(1.0f, 1.0f);
|
|
track.AddKeySorted(0.0f, 0.0f);
|
|
track.AddKeySorted(3.0f, 3.0f);
|
|
track.AddKeySorted(2.0f, 2.0f);
|
|
track.Init();
|
|
ASSERT_EQ(track.GetNumKeys(), 4);
|
|
ASSERT_TRUE(AZ::IsClose(track.GetKey(0)->GetTime(), 0.0f, 0.00001f));
|
|
ASSERT_TRUE(AZ::IsClose(track.GetKey(1)->GetTime(), 1.0f, 0.00001f));
|
|
ASSERT_TRUE(AZ::IsClose(track.GetKey(2)->GetTime(), 2.0f, 0.00001f));
|
|
ASSERT_TRUE(AZ::IsClose(track.GetKey(3)->GetTime(), 3.0f, 0.00001f));
|
|
}
|
|
|
|
TEST_F(KeyTrackLinearDynamicFixture, KeyTrackRemoveKey)
|
|
{
|
|
EMotionFX::KeyTrackLinearDynamic<float, float> track;
|
|
FillFloatTrackZeroToThree(track);
|
|
ASSERT_EQ(track.GetNumKeys(), 4);
|
|
|
|
track.RemoveKey(1);
|
|
track.Init();
|
|
ASSERT_FLOAT_EQ(track.GetKey(0)->GetTime(), 0.0f);
|
|
ASSERT_FLOAT_EQ(track.GetKey(1)->GetTime(), 2.0f);
|
|
ASSERT_FLOAT_EQ(track.GetKey(2)->GetTime(), 3.0f);
|
|
|
|
track.RemoveKey(2);
|
|
track.Init();
|
|
ASSERT_FLOAT_EQ(track.GetKey(0)->GetTime(), 0.0f);
|
|
ASSERT_FLOAT_EQ(track.GetKey(1)->GetTime(), 2.0f);
|
|
|
|
track.RemoveKey(0);
|
|
track.Init();
|
|
|
|
// The time should be 0, because Init makes sure the first keyframe starts at time 0
|
|
ASSERT_FLOAT_EQ(track.GetKey(0)->GetTime(), 0.0f);
|
|
|
|
track.RemoveKey(0);
|
|
track.Init();
|
|
ASSERT_EQ(track.GetNumKeys(), 0);
|
|
}
|
|
|
|
TEST_F(KeyTrackLinearDynamicFixture, KeyTrackClearKeys)
|
|
{
|
|
EMotionFX::KeyTrackLinearDynamic<float, float> track;
|
|
FillFloatTrackZeroToThree(track);
|
|
ASSERT_EQ(track.GetNumKeys(), 4);
|
|
track.ClearKeys();
|
|
ASSERT_EQ(track.GetNumKeys(), 0);
|
|
}
|
|
|
|
TEST_F(KeyTrackLinearDynamicFixture, KeyTrackCheckIfIsAnimated)
|
|
{
|
|
EMotionFX::KeyTrackLinearDynamic<float, float> track;
|
|
FillFloatTrackZeroToThree(track);
|
|
ASSERT_TRUE(track.CheckIfIsAnimated(0.0f, 0.00001f));
|
|
|
|
track.ClearKeys();
|
|
track.AddKey(0.0f, 1.0f);
|
|
track.AddKey(1.0f, 1.0f);
|
|
track.AddKey(2.0f, 1.0f);
|
|
track.AddKey(3.0f, 1.0f);
|
|
ASSERT_TRUE(!track.CheckIfIsAnimated(1.0f, 0.00001f));
|
|
|
|
track.ClearKeys();
|
|
track.AddKey(0.0f, 1.0f);
|
|
track.AddKey(1.0f, 1.0f);
|
|
track.AddKey(2.0f, 1.01f);
|
|
track.AddKey(3.0f, 1.0f);
|
|
ASSERT_TRUE(track.CheckIfIsAnimated(1.0f, 0.00001f));
|
|
}
|
|
|
|
TEST_F(KeyTrackLinearDynamicFixture, KeyTrackGetFirstKey)
|
|
{
|
|
EMotionFX::KeyTrackLinearDynamic<float, float> track;
|
|
FillFloatTrackZeroToThree(track);
|
|
ASSERT_FLOAT_EQ(track.GetFirstKey()->GetTime(), 0.0f);
|
|
ASSERT_FLOAT_EQ(track.GetFirstKey()->GetValue(), 0.0f);
|
|
|
|
track.RemoveKey(2);
|
|
track.Init();
|
|
ASSERT_FLOAT_EQ(track.GetFirstKey()->GetTime(), 0.0f);
|
|
ASSERT_FLOAT_EQ(track.GetFirstKey()->GetValue(), 0.0f);
|
|
|
|
track.RemoveKey(0);
|
|
track.Init();
|
|
|
|
// Time value is expected to be 0 for the first key, after calling Init.
|
|
// It is remapped internally to 0, if the first key's time isn't.
|
|
// The value remains the same though.
|
|
ASSERT_FLOAT_EQ(track.GetFirstKey()->GetTime(), 0.0f);
|
|
ASSERT_FLOAT_EQ(track.GetFirstKey()->GetValue(), 1.0f);
|
|
|
|
track.ClearKeys();
|
|
track.Init();
|
|
ASSERT_TRUE(!track.GetFirstKey());
|
|
}
|
|
|
|
TEST_F(KeyTrackLinearDynamicFixture, KeyTrackGetLastKey)
|
|
{
|
|
EMotionFX::KeyTrackLinearDynamic<float, float> track;
|
|
FillFloatTrackZeroToThree(track);
|
|
ASSERT_FLOAT_EQ(track.GetLastKey()->GetTime(), 3.0f);
|
|
ASSERT_FLOAT_EQ(track.GetLastKey()->GetValue(), 3.0f);
|
|
|
|
track.RemoveKey(2);
|
|
track.Init();
|
|
ASSERT_FLOAT_EQ(track.GetLastKey()->GetTime(), 3.0f);
|
|
ASSERT_FLOAT_EQ(track.GetLastKey()->GetValue(), 3.0f);
|
|
|
|
track.RemoveKey(track.GetNumKeys() - 1);
|
|
track.Init();
|
|
ASSERT_FLOAT_EQ(track.GetLastKey()->GetTime(), 1.0f);
|
|
ASSERT_FLOAT_EQ(track.GetLastKey()->GetValue(), 1.0f);
|
|
|
|
track.ClearKeys();
|
|
track.Init();
|
|
ASSERT_TRUE(!track.GetLastKey());
|
|
}
|
|
|
|
TEST_F(KeyTrackLinearDynamicFixture, KeyTrackFindKeyNumber)
|
|
{
|
|
EMotionFX::KeyTrackLinearDynamic<float, float> track;
|
|
FillFloatTrackZeroToThree(track);
|
|
|
|
ASSERT_EQ(track.FindKeyNumber(-1.0f), MCORE_INVALIDINDEX32);
|
|
ASSERT_EQ(track.FindKeyNumber(0.0f), 0);
|
|
ASSERT_EQ(track.FindKeyNumber(1.0f), 1);
|
|
ASSERT_EQ(track.FindKeyNumber(2.0f), 2);
|
|
ASSERT_EQ(track.FindKeyNumber(2.4f), 2);
|
|
ASSERT_EQ(track.FindKeyNumber(2.8f), 2);
|
|
ASSERT_EQ(track.FindKeyNumber(2.999f), 2);
|
|
ASSERT_EQ(track.FindKeyNumber(3.0f), MCORE_INVALIDINDEX32);
|
|
ASSERT_EQ(track.FindKeyNumber(3.001f), MCORE_INVALIDINDEX32);
|
|
ASSERT_EQ(track.FindKeyNumber(4.0f), MCORE_INVALIDINDEX32);
|
|
}
|
|
|
|
TEST_F(KeyTrackLinearDynamicFixture, KeyTrackSetNumKeys)
|
|
{
|
|
EMotionFX::KeyTrackLinearDynamic<float, float> track;
|
|
FillFloatTrackZeroToThree(track);
|
|
track.SetNumKeys(10);
|
|
ASSERT_EQ(track.GetNumKeys(), 10);
|
|
track.SetNumKeys(15);
|
|
ASSERT_EQ(track.GetNumKeys(), 15);
|
|
track.SetNumKeys(5);
|
|
ASSERT_EQ(track.GetNumKeys(), 5);
|
|
track.SetNumKeys(0);
|
|
ASSERT_EQ(track.GetNumKeys(), 0);
|
|
}
|
|
|
|
TEST_F(KeyTrackLinearDynamicFixture, KeyTrackOptimize)
|
|
{
|
|
EMotionFX::KeyTrackLinearDynamic<float, float> track;
|
|
track.AddKey(0.0f, 0.0f);
|
|
track.AddKey(1.0f, 1.0f);
|
|
track.AddKey(2.0f, 2.0f);
|
|
track.AddKey(3.0f, 3.0f);
|
|
track.Init();
|
|
track.Optimize(0.00001f);
|
|
ASSERT_EQ(track.GetNumKeys(), 2);
|
|
ASSERT_FLOAT_EQ(track.GetKey(0)->GetTime(), 0.0f);
|
|
ASSERT_FLOAT_EQ(track.GetKey(1)->GetTime(), 3.0f);
|
|
|
|
track.ClearKeys();
|
|
track.AddKey(0.0f, 0.0f);
|
|
track.AddKey(1.0f, 1.0f);
|
|
track.AddKey(2.0f, 1.0f);
|
|
track.AddKey(2.01f, 1.0001f);
|
|
track.AddKey(3.0f, 3.0f);
|
|
track.Init();
|
|
const uint32 numKeysRemoved = track.Optimize(0.001f);
|
|
ASSERT_EQ(numKeysRemoved, 1);
|
|
ASSERT_EQ(track.GetNumKeys(), 4);
|
|
ASSERT_FLOAT_EQ(track.GetKey(0)->GetTime(), 0.0f);
|
|
ASSERT_FLOAT_EQ(track.GetKey(1)->GetTime(), 1.0f);
|
|
ASSERT_FLOAT_EQ(track.GetKey(2)->GetTime(), 2.01f);
|
|
ASSERT_FLOAT_EQ(track.GetKey(3)->GetTime(), 3.0f);
|
|
}
|
|
|
|
TEST_F(KeyTrackLinearDynamicFixture, KeyTrackGetValueAtTime)
|
|
{
|
|
EMotionFX::KeyTrackLinearDynamic<float, float> track;
|
|
FillFloatTrackZeroToThree(track);
|
|
|
|
ASSERT_FLOAT_EQ(track.GetValueAtTime(0.0f), 0.0f);
|
|
ASSERT_FLOAT_EQ(track.GetValueAtTime(0.5f), 0.5f);
|
|
ASSERT_FLOAT_EQ(track.GetValueAtTime(1.0f), 1.0f);
|
|
ASSERT_FLOAT_EQ(track.GetValueAtTime(3.0f), 3.0f);
|
|
ASSERT_FLOAT_EQ(track.GetValueAtTime(4.0f), 3.0f);
|
|
|
|
uint8 cacheHit = 0;
|
|
uint32 cached = 0;
|
|
ASSERT_FLOAT_EQ(track.GetValueAtTime(0.0f, &cached, &cacheHit), 0.0f);
|
|
ASSERT_EQ(cached, 0);
|
|
ASSERT_EQ(cacheHit, 1);
|
|
|
|
ASSERT_FLOAT_EQ(track.GetValueAtTime(0.5f, &cached, &cacheHit), 0.5f);
|
|
ASSERT_EQ(cached, 0);
|
|
ASSERT_EQ(cacheHit, 1);
|
|
|
|
ASSERT_FLOAT_EQ(track.GetValueAtTime(1.0f, &cached, &cacheHit), 1.0f);
|
|
ASSERT_EQ(cached, 0);
|
|
ASSERT_EQ(cacheHit, 1);
|
|
|
|
ASSERT_FLOAT_EQ(track.GetValueAtTime(2.999f, &cached, &cacheHit), 2.999f);
|
|
ASSERT_EQ(cached, 2);
|
|
ASSERT_EQ(cacheHit, 0);
|
|
|
|
ASSERT_FLOAT_EQ(track.GetValueAtTime(0.0f, &cached, &cacheHit), 0.0f);
|
|
ASSERT_EQ(cached, 0);
|
|
ASSERT_EQ(cacheHit, 0);
|
|
}
|
|
|
|
} // namespace EMotionFX
|