Files
UnrealEngine/Engine/Source/Runtime/MovieScene/Private/Evaluation/PreAnimatedState/MovieScenePreAnimatedCaptureSources.inl
Brandyn / Techy fcc1b09210 init
2026-04-04 15:40:51 -05:00

206 lines
5.6 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "Evaluation/PreAnimatedState/MovieScenePreAnimatedCaptureSources.h"
#include "Evaluation/PreAnimatedState/MovieScenePreAnimatedStateExtension.h"
#include "Evaluation/PreAnimatedState/MovieSceneRestoreStateParams.h"
#include "Algo/Find.h"
namespace UE
{
namespace MovieScene
{
template<typename KeyType>
TPreAnimatedCaptureSources<KeyType>::TPreAnimatedCaptureSources(FPreAnimatedStateExtension* InOwner)
: Owner(InOwner)
{}
template<typename KeyType>
EPreAnimatedCaptureSourceState TPreAnimatedCaptureSources<KeyType>::BeginTrackingCaptureSource(const KeyType& InKey, const FPreAnimatedStateMetaData& MetaData)
{
FPreAnimatedStateMetaDataArray& Array = KeyToMetaData.FindOrAdd(InKey);
if (FPreAnimatedStateMetaData* Existing = Algo::FindBy(Array, MetaData.Entry, &FPreAnimatedStateMetaData::Entry))
{
if (Existing->bWantsRestoreState != MetaData.bWantsRestoreState)
{
Existing->bWantsRestoreState = MetaData.bWantsRestoreState;
Owner->UpdateMetaData(*Existing);
return EPreAnimatedCaptureSourceState::Updated;
}
return EPreAnimatedCaptureSourceState::UpToDate;
}
Array.Add(MetaData);
Owner->AddMetaData(MetaData);
return EPreAnimatedCaptureSourceState::New;
}
template<typename KeyType>
void TPreAnimatedCaptureSources<KeyType>::StopTrackingCaptureSource(const KeyType& InKey, FPreAnimatedStorageID InStorageID)
{
FPreAnimatedStateMetaDataArray* Array = KeyToMetaData.Find(InKey);
if (Array)
{
for (int32 Index = Array->Num()-1; Index >= 0; --Index)
{
const FPreAnimatedStateMetaData& MetaData = (*Array)[Index];
if (MetaData.Entry.ValueHandle.TypeID == InStorageID)
{
Owner->RemoveMetaData(MetaData);
Array->RemoveAt(Index, EAllowShrinking::No);
}
}
if (Array->Num() == 0)
{
KeyToMetaData.Remove(InKey);
}
}
}
template<typename KeyType>
void TPreAnimatedCaptureSources<KeyType>::StopTrackingCaptureSource(const KeyType& InKey)
{
FPreAnimatedStateMetaDataArray* Array = KeyToMetaData.Find(InKey);
if (Array)
{
for (int32 Index = Array->Num()-1; Index >= 0; --Index)
{
Owner->RemoveMetaData((*Array)[Index]);
}
KeyToMetaData.Remove(InKey);
}
}
template<typename KeyType>
void TPreAnimatedCaptureSources<KeyType>::Reset()
{
KeyToMetaData.Empty();
}
template<typename KeyType>
void TPreAnimatedCaptureSources<KeyType>::GatherAndRemoveExpiredMetaData(const FRestoreStateParams& Params, TArray<FPreAnimatedStateMetaData>& OutExpiredMetaData)
{
FInstanceHandle InstanceHandle = Params.TerminalInstanceHandle;
if (!InstanceHandle.IsValid())
{
for (auto It = KeyToMetaData.CreateIterator(); It; ++It)
{
OutExpiredMetaData.Append(It.Value());
}
KeyToMetaData.Empty();
}
else for (auto It = KeyToMetaData.CreateIterator(); It; ++It)
{
FPreAnimatedStateMetaDataArray& Array = It.Value();
for (int32 Index = Array.Num()-1; Index >= 0; --Index)
{
FPreAnimatedStateMetaData& MetaData = Array[Index];
if (MetaData.RootInstanceHandle == InstanceHandle)
{
OutExpiredMetaData.Add(MetaData);
Array.RemoveAt(Index, 1, EAllowShrinking::No);
}
}
if (Array.Num() == 0)
{
It.RemoveCurrent();
}
}
}
template<typename KeyType>
void TPreAnimatedCaptureSources<KeyType>::GatherAndRemoveMetaDataForGroup(FPreAnimatedStorageGroupHandle Group, TArray<FPreAnimatedStateMetaData>& OutExpiredMetaData)
{
for (auto It = KeyToMetaData.CreateIterator(); It; ++It)
{
FPreAnimatedStateMetaDataArray& Array = It.Value();
for (int32 Index = Array.Num()-1; Index >= 0; --Index)
{
const FPreAnimatedStateMetaData& MetaData = Array[Index];
if (MetaData.Entry.GroupHandle == Group)
{
OutExpiredMetaData.Add(MetaData);
Array.RemoveAt(Index, 1, EAllowShrinking::No);
}
}
if (Array.Num() == 0)
{
It.RemoveCurrent();
}
}
}
template<typename KeyType>
void TPreAnimatedCaptureSources<KeyType>::GatherAndRemoveMetaDataForStorage(FPreAnimatedStorageID StorageID, FPreAnimatedStorageIndex StorageIndex, TArray<FPreAnimatedStateMetaData>& OutExpiredMetaData)
{
for (auto It = KeyToMetaData.CreateIterator(); It; ++It)
{
FPreAnimatedStateMetaDataArray& Array = It.Value();
for (int32 Index = Array.Num()-1; Index >= 0; --Index)
{
const FPreAnimatedStateMetaData& MetaData = Array[Index];
if (MetaData.Entry.ValueHandle.TypeID == StorageID &&
(!StorageIndex.IsValid() || MetaData.Entry.ValueHandle.StorageIndex == StorageIndex))
{
OutExpiredMetaData.Add(MetaData);
Array.RemoveAt(Index, 1, EAllowShrinking::No);
}
}
if (Array.Num() == 0)
{
It.RemoveCurrent();
}
}
}
template<typename KeyType>
void TPreAnimatedCaptureSources<KeyType>::GatherAndRemoveMetaDataForRootInstance(FRootInstanceHandle InstanceHandle, TArray<FPreAnimatedStateMetaData>& OutExpiredMetaData)
{
for (auto It = KeyToMetaData.CreateIterator(); It; ++It)
{
FPreAnimatedStateMetaDataArray& Array = It.Value();
for (int32 Index = Array.Num()-1; Index >= 0; --Index)
{
const FPreAnimatedStateMetaData& MetaData = Array[Index];
if (MetaData.RootInstanceHandle == InstanceHandle)
{
OutExpiredMetaData.Add(MetaData);
Array.RemoveAt(Index, 1, EAllowShrinking::No);
}
}
if (Array.Num() == 0)
{
It.RemoveCurrent();
}
}
}
template<typename KeyType>
bool TPreAnimatedCaptureSources<KeyType>::ContainsInstanceHandle(FRootInstanceHandle RootInstanceHandle) const
{
for (const TPair<KeyType, FPreAnimatedStateMetaDataArray>& Pair : KeyToMetaData)
{
for (const FPreAnimatedStateMetaData& MetaData : Pair.Value)
{
if (MetaData.RootInstanceHandle == RootInstanceHandle)
{
return true;
}
}
}
return false;
}
} // namespace MovieScene
} // namespace UE