Files
Brandyn / Techy fcc1b09210 init
2026-04-04 15:40:51 -05:00

149 lines
6.5 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "LiveLinkTest.h"
#include "InterpolationProcessor/LiveLinkBasicFrameInterpolateProcessor.h"
#include "Misc/AutomationTest.h"
#include UE_INLINE_GENERATED_CPP_BY_NAME(LiveLinkTest)
#if WITH_DEV_AUTOMATION_TESTS
IMPLEMENT_SIMPLE_AUTOMATION_TEST(FLiveLinkInterpolationTest, "System.Engine.Animation.LiveLink.Interpolation", EAutomationTestFlags_ApplicationContextMask | EAutomationTestFlags::EngineFilter)
/** */
bool FLiveLinkInterpolationTest::RunTest(const FString& Parameters)
{
const int32 IntA = 1;
const int32 IntB = 4;
const int32 IntR = 2;
const float FloatA = 2.f;
const float FloatB = 8.f;
const float FloatR = 4.f;
const FVector VectorA = FVector(11, 21, 31);
const FVector VectorB = FVector(14, 24, 34);
const FVector VectorR = FVector(12, 22, 32);
FLiveLinkInnerTestInternal InternalA;
FLiveLinkInnerTestInternal InternalB;
InternalA.InnerSingleFloat = FloatA * -1.f;
InternalB.InnerSingleFloat = FloatB * -1.f;
InternalA.InnerSingleInt = IntA * -1.f;
InternalB.InnerSingleInt = IntB * -1.f;
InternalA.InnerVectorDim[0] = VectorA * -1.f;
InternalB.InnerVectorDim[0] = VectorB * -1.f;
InternalA.InnerVectorDim[1] = VectorA * -1.f - 100.f;
InternalB.InnerVectorDim[1] = VectorB * -1.f - 100.f;
InternalA.InnerFloatDim[0] = FloatA * -1.f;
InternalB.InnerFloatDim[0] = FloatB * -1.f;
InternalA.InnerFloatDim[1] = FloatA * -1.f - 100.f;
InternalB.InnerFloatDim[1] = FloatB * -1.f - 100.f;
InternalA.InnerIntDim[0] = IntA * -1.f;
InternalB.InnerIntDim[0] = IntB * -1.f;
InternalA.InnerIntDim[1] = IntA * -1.f - 100;
InternalB.InnerIntDim[1] = IntB * -1.f - 100;
InternalA.InnerIntArray.Add(IntA * -1.f);
InternalB.InnerIntArray.Add(IntB * -1.f);
InternalA.InnerIntArray.Add(IntA * -1.f - 100);
InternalB.InnerIntArray.Add(IntB * -1.f - 100);
FLiveLinkFrameDataStruct FrameDataStructA(FLiveLinkTestFrameDataInternal::StaticStruct());
FLiveLinkFrameDataStruct FrameDataStructB(FLiveLinkTestFrameDataInternal::StaticStruct());
FLiveLinkTestFrameDataInternal& FrameA = *FrameDataStructA.Cast<FLiveLinkTestFrameDataInternal>();
FLiveLinkTestFrameDataInternal& FrameB = *FrameDataStructB.Cast<FLiveLinkTestFrameDataInternal>();
FrameA.PropertyValues.Add(FloatA);
FrameB.PropertyValues.Add(FloatB);
FrameA.PropertyValues.Add(FloatA +100.f);
FrameB.PropertyValues.Add(FloatB +100.f);
FrameA.MetaData.StringMetaData.Add("StringKeyA", "StringValueA");
FrameB.MetaData.StringMetaData.Add("StringKeyB", "StringValueB");
FrameA.MetaData.SceneTime.Rate = FFrameRate(24, 1);
FrameB.MetaData.SceneTime.Rate = FFrameRate(24, 1);
FrameA.MetaData.SceneTime.Time.FrameNumber = IntA;
FrameB.MetaData.SceneTime.Time.FrameNumber = IntB;
FrameA.WorldTime = FLiveLinkWorldTime(1000.0, 0.0);
FrameB.WorldTime = FLiveLinkWorldTime(4000.0, 0.0);
FrameA.NotInterpolated = IntA;
FrameB.NotInterpolated = IntB;
FrameA.SingleVector = VectorA;
FrameB.SingleVector = VectorB;
FrameA.SingleStruct = InternalA;
FrameB.SingleStruct = InternalB;
FrameA.SingleFloat = FloatA;
FrameB.SingleFloat = FloatB;
FrameA.SingleInt = IntA;
FrameB.SingleInt = IntB;
FrameA.VectorArray.Add(VectorA);
FrameB.VectorArray.Add(VectorB);
FrameA.VectorArray.Add(VectorA + 100.f);
FrameB.VectorArray.Add(VectorB + 100.f);
FrameA.StructArray.Add(InternalA);
FrameB.StructArray.Add(InternalB);
FrameA.FloatArray.Add(FloatA);
FrameB.FloatArray.Add(FloatB);
FrameA.FloatArray.Add(FloatA + 100.f);
FrameB.FloatArray.Add(FloatB + 100.f);
FrameA.IntArray.Add(IntA);
FrameB.IntArray.Add(IntB);
FrameA.IntArray.Add(IntA + 100);
FrameB.IntArray.Add(IntB + 100);
ULiveLinkBasicFrameInterpolationProcessor* Interpolator = NewObject<ULiveLinkBasicFrameInterpolationProcessor>();
Interpolator->bInterpolatePropertyValues = true;
ULiveLinkFrameInterpolationProcessor::FWorkerSharedPtr Worker = Interpolator->FetchWorker();
TSharedPtr<ULiveLinkBasicFrameInterpolationProcessor::FLiveLinkBasicFrameInterpolationProcessorWorker, ESPMode::ThreadSafe> BasicWorker = StaticCastSharedPtr<ULiveLinkBasicFrameInterpolationProcessor::FLiveLinkBasicFrameInterpolationProcessorWorker>(Worker);
FLiveLinkFrameDataStruct FrameDataStructR(FLiveLinkTestFrameDataInternal::StaticStruct());
double BlendFactor = BasicWorker->GetBlendFactor(2000.0, FrameDataStructA, FrameDataStructB);
ULiveLinkBasicFrameInterpolationProcessor::FLiveLinkBasicFrameInterpolationProcessorWorker::FGenericInterpolateOptions InterpolationOptions;
BasicWorker->GenericInterpolate(BlendFactor, InterpolationOptions, FrameDataStructA, FrameDataStructB, FrameDataStructR);
const FLiveLinkTestFrameDataInternal& FrameR = *FrameDataStructR.Cast<FLiveLinkTestFrameDataInternal>();
auto TestStruct = [=, this](const FLiveLinkInnerTestInternal& FrameR, int32 OuterIndex)
{
TestEqual(TEXT("InnerSingleFloat"), FrameR.InnerSingleFloat, FloatR * -1.f - 100 * OuterIndex);
TestEqual(TEXT("InnerSingleInt"), FrameR.InnerSingleInt, IntR * -1 - 100 * OuterIndex);
for (int32 Index = 0; Index < 2; ++Index)
{
TestEqual(TEXT("InnerVectorDim"), FrameR.InnerVectorDim[Index], VectorR * -1.f - 100 * Index);
TestEqual(TEXT("InnerFloatDim"), FrameR.InnerFloatDim[Index], FloatR * -1.f - 100 * Index);
TestEqual(TEXT("InnerIntDim"), FrameR.InnerIntDim[Index], IntR * -1 - 100 * Index);
TestEqual(TEXT("InnerIntArray"), FrameR.InnerIntArray[Index], IntR * -1 - 100 * Index);
}
};
TestEqual(TEXT("PropertyValues.Num"), FrameR.PropertyValues.Num(), 2);
for (int32 Index = 0; Index < 2; ++Index)
{
TestEqual(TEXT("PropertyValues.At"), FrameR.PropertyValues[Index], FloatR + 100*Index);
}
//TestEqual(TEXT("MetaData.StringMetaData"), FrameR.MetaData.StringMetaData, FrameA.MetaData.StringMetaData);
//TestEqual(TEXT("MetaData.SceneTime"), FrameR.MetaData.SceneTime, FrameA.MetaData.SceneTime);
TestEqual(TEXT("WorldTime"), FrameR.WorldTime.GetOffsettedTime(), 2000.0);
TestEqual(TEXT("NotInterpolated"), FrameR.NotInterpolated, FrameA.NotInterpolated);
TestEqual(TEXT("SingleVector"), FrameR.SingleVector, VectorR);
TestStruct(FrameR.SingleStruct, 0);
TestEqual(TEXT("SingleFloat"), FrameR.SingleFloat, FloatR);
TestEqual(TEXT("SingleInt"), FrameR.SingleInt, IntR);
TestStruct(FrameR.StructArray[0], 0);
for(int32 Index = 0; Index < 2; ++Index)
{
TestEqual(TEXT("VectorArray"), FrameR.VectorArray[Index], VectorR + 100 * Index);
TestEqual(TEXT("FloatArray"), FrameR.FloatArray[Index], FloatR + 100 * Index);
TestEqual(TEXT("IntArray"), FrameR.IntArray[Index], IntR + 100 * Index);
}
return true;
}
#endif //WITH_DEV_AUTOMATION_TESTS