Files
2025-05-18 13:04:45 +08:00

70 lines
2.3 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "MetaHumanSmoothingPreProcessor.h"
#include "Roles/LiveLinkBasicRole.h"
#include "UObject/Package.h"
UMetaHumanSmoothingPreProcessor::FMetaHumanSmoothingPreProcessorWorker::FMetaHumanSmoothingPreProcessorWorker(const TMap<FName, FMetaHumanRealtimeSmoothingParam>& InSmoothingParams)
: FMetaHumanRealtimeSmoothing(InSmoothingParams)
{
}
TSubclassOf<ULiveLinkRole> UMetaHumanSmoothingPreProcessor::FMetaHumanSmoothingPreProcessorWorker::GetRole() const
{
return ULiveLinkBasicRole::StaticClass();
}
bool UMetaHumanSmoothingPreProcessor::FMetaHumanSmoothingPreProcessorWorker::PreProcessFrame(const FLiveLinkStaticDataStruct& InStaticData, FLiveLinkFrameDataStruct& InOutFrame)
{
const FLiveLinkBaseStaticData* LiveLinkSourceStaticData = InStaticData.Cast<FLiveLinkBaseStaticData>();
if (!ensureMsgf(LiveLinkSourceStaticData, TEXT("Unexpected static data type when applying MetaHuman smoothing pre-processor")))
{
return false;
}
FLiveLinkBaseFrameData* LiveLinkSourceFrameData = InOutFrame.Cast<FLiveLinkBaseFrameData>();
if (!ensureMsgf(LiveLinkSourceFrameData, TEXT("Unexpected frame data type when applying MetaHuman smoothing pre-processor")))
{
return false;
}
const double Now = FPlatformTime::Seconds();
const double DeltaTime = Now - LastTime;
LastTime = Now;
return ProcessFrame(LiveLinkSourceStaticData->PropertyNames, LiveLinkSourceFrameData->PropertyValues, DeltaTime);
}
UMetaHumanSmoothingPreProcessor::UMetaHumanSmoothingPreProcessor()
{
static constexpr const TCHAR* SmoothingPath = TEXT("/MetaHumanCoreTech/RealtimeMono/DefaultSmoothing.DefaultSmoothing");
Parameters = LoadObject<UMetaHumanRealtimeSmoothingParams>(GetTransientPackage(), SmoothingPath);
}
#if WITH_EDITOR
void UMetaHumanSmoothingPreProcessor::PostEditChangeChainProperty(struct FPropertyChangedChainEvent& PropertyChangedEvent)
{
Worker.Reset();
Super::PostEditChangeChainProperty(PropertyChangedEvent);
}
#endif //WITH_EDITOR
TSubclassOf<ULiveLinkRole> UMetaHumanSmoothingPreProcessor::GetRole() const
{
return ULiveLinkBasicRole::StaticClass();
}
ULiveLinkFramePreProcessor::FWorkerSharedPtr UMetaHumanSmoothingPreProcessor::FetchWorker()
{
if (!Worker.IsValid() && Parameters)
{
Worker = MakeShared<FMetaHumanSmoothingPreProcessorWorker>(Parameters->Parameters);
}
return Worker;
}