Files
UnrealEngine/Engine/Source/Runtime/MovieScene/Public/Evaluation/MovieSceneEvaluationTemplate.h
Brandyn / Techy fcc1b09210 init
2026-04-04 15:40:51 -05:00

300 lines
8.2 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "Containers/ArrayView.h"
#include "Containers/Map.h"
#include "Containers/Set.h"
#include "Containers/SparseArray.h"
#include "CoreMinimal.h"
#include "CoreTypes.h"
#include "Evaluation/MovieSceneEvaluationTrack.h"
#include "Evaluation/MovieSceneEvaluationTree.h"
#include "Evaluation/MovieSceneSegment.h"
#include "Evaluation/MovieSceneTrackIdentifier.h"
#include "Misc/Guid.h"
#include "MovieSceneFrameMigration.h"
#include "MovieSceneTrack.h"
#include "Serialization/Archive.h"
#include "UObject/Class.h"
#include "UObject/ObjectMacros.h"
#include "UObject/ScriptMacros.h"
#include "UObject/WeakObjectPtr.h"
#include "UObject/WeakObjectPtrTemplates.h"
#include "MovieSceneEvaluationTemplate.generated.h"
class UMovieSceneSequence;
class UMovieSceneSubSection;
struct FMovieSceneEvaluationTrack;
struct FMovieSceneFrameRange;
USTRUCT()
struct FMovieSceneTemplateGenerationLedger
{
GENERATED_BODY()
public:
/**
* Lookup a track identifier by its originating signature
*/
MOVIESCENE_API FMovieSceneTrackIdentifier FindTrackIdentifier(const FGuid& InSignature) const;
/**
* Add a new track for the specified signature. Signature must not have already been used
*/
MOVIESCENE_API void AddTrack(const FGuid& InSignature, FMovieSceneTrackIdentifier Identifier);
/**
* Check whether we already have a sub section for the specified signature
*/
bool ContainsSubSection(const FGuid& InSignature)
{
return SubSectionRanges.Contains(InSignature);
}
public:
UPROPERTY()
FMovieSceneTrackIdentifier LastTrackIdentifier;
/** Map of track signature to array of track identifiers that it created */
UPROPERTY()
TMap<FGuid, FMovieSceneTrackIdentifier> TrackSignatureToTrackIdentifier;
/** Map of sub section ranges that exist in a template */
UPROPERTY()
TMap<FGuid, FMovieSceneFrameRange> SubSectionRanges;
};
template<> struct TStructOpsTypeTraits<FMovieSceneTemplateGenerationLedger> : public TStructOpsTypeTraitsBase2<FMovieSceneTemplateGenerationLedger> { enum { WithCopy = true }; };
/** Data that represents a single sub-section */
USTRUCT()
struct FMovieSceneSubSectionData
{
GENERATED_BODY()
FMovieSceneSubSectionData() : Flags(ESectionEvaluationFlags::None) {}
FMovieSceneSubSectionData(UMovieSceneSubSection& InSubSection, const FGuid& InObjectBindingId, ESectionEvaluationFlags InFlags);
friend FArchive& operator<<(FArchive& Ar, FMovieSceneSubSectionData& In)
{
return Ar << In.Section << In.ObjectBindingId << In.Flags;
}
friend bool operator==(const FMovieSceneSubSectionData& A, const FMovieSceneSubSectionData& B)
{
return A.Section == B.Section && A.ObjectBindingId == B.ObjectBindingId && A.Flags == B.Flags;
}
/** The sub section itself */
UPROPERTY()
TWeakObjectPtr<UMovieSceneSubSection> Section;
/** The object binding that the sub section belongs to (usually zero) */
UPROPERTY()
FGuid ObjectBindingId;
/** Evaluation flags for the section */
UPROPERTY()
ESectionEvaluationFlags Flags;
};
/**
* Sereal number used to identify evaluation template state that can only ever increase over its lifetime.
* Only to be stored internally on FMovieSceneEvaluationTemplate.
*/
USTRUCT()
struct FMovieSceneEvaluationTemplateSerialNumber
{
GENERATED_BODY()
FMovieSceneEvaluationTemplateSerialNumber()
: Value(0)
{}
/**
* Access this serial number's value
*/
uint32 GetValue() const
{
return Value;
}
/**
* Increment this serial number
*/
void Increment()
{
++Value;
}
private:
friend struct FMovieSceneEvaluationTemplate;
/**
* Copy/move semantics only ever initialize to zero, or passthrough, to ensure that FMovieSceneEvaluationTemplate::TemplateSerialNumber cannot ever move backwards.
*/
FMovieSceneEvaluationTemplateSerialNumber(const FMovieSceneEvaluationTemplateSerialNumber&) : Value(0) {}
FMovieSceneEvaluationTemplateSerialNumber(FMovieSceneEvaluationTemplateSerialNumber&&) : Value(0) {}
FMovieSceneEvaluationTemplateSerialNumber& operator=(const FMovieSceneEvaluationTemplateSerialNumber&) { return *this; }
FMovieSceneEvaluationTemplateSerialNumber& operator=(FMovieSceneEvaluationTemplateSerialNumber&&) { return *this; }
/** The internal value of the serial number */
UPROPERTY()
uint32 Value;
};
template<> struct TStructOpsTypeTraits<FMovieSceneEvaluationTemplateSerialNumber> : public TStructOpsTypeTraitsBase2<FMovieSceneEvaluationTemplateSerialNumber> { enum { WithCopy = false }; };
/**
* Template that is used for efficient runtime evaluation of a movie scene sequence. Potentially serialized into the asset.
*/
USTRUCT()
struct FMovieSceneEvaluationTemplate
{
GENERATED_BODY()
public:
/**
* Attempt to locate a track with the specified identifier
*/
FMovieSceneEvaluationTrack* FindTrack(FMovieSceneTrackIdentifier Identifier)
{
// Fast, most common path
if (FMovieSceneEvaluationTrack* Track = Tracks.Find(Identifier))
{
return Track;
}
return StaleTracks.Find(Identifier);
}
/**
* Attempt to locate a track with the specified identifier
*/
const FMovieSceneEvaluationTrack* FindTrack(FMovieSceneTrackIdentifier Identifier) const
{
// Fast, most common path
if (const FMovieSceneEvaluationTrack* Track = Tracks.Find(Identifier))
{
return Track;
}
return StaleTracks.Find(Identifier);
}
/**
* Find a track within this template that relates to the specified signature
*/
FMovieSceneEvaluationTrack* FindTrack(const FGuid& InSignature)
{
return FindTrack(TemplateLedger.FindTrackIdentifier(InSignature));
}
/**
* Find a track within this template that relates to the specified signature
*/
const FMovieSceneEvaluationTrack* FindTrack(const FGuid& InSignature) const
{
return FindTrack(TemplateLedger.FindTrackIdentifier(InSignature));
}
/**
* Test whether the specified track identifier relates to a stale track
*/
bool IsTrackStale(FMovieSceneTrackIdentifier Identifier) const
{
return StaleTracks.Contains(Identifier);
}
/**
* Add a new track for the specified identifier
*/
MOVIESCENE_API FMovieSceneTrackIdentifier AddTrack(const FGuid& InSignature, FMovieSceneEvaluationTrack&& InTrack);
/**
* Remove any tracks that correspond to the specified signature
*/
MOVIESCENE_API void RemoveTrack(const FGuid& InSignature);
/**
* Iterate this template's tracks.
*/
MOVIESCENE_API const TMap<FMovieSceneTrackIdentifier, FMovieSceneEvaluationTrack>& GetTracks() const;
/**
* Iterate this template's tracks (non-const).
* NOTE that this is intended for use during the compilation phase in-editor.
* Beware of using this to modify tracks afterwards as it will almost certainly break evaluation.
*/
MOVIESCENE_API TMap<FMovieSceneTrackIdentifier, FMovieSceneEvaluationTrack>& GetTracks();
/**
* Access this template's stale tracks.
*/
MOVIESCENE_API const TMap<FMovieSceneTrackIdentifier, FMovieSceneEvaluationTrack>& GetStaleTracks() const;
/**
* Called after this template has been serialized in some way
*/
#if WITH_EDITORONLY_DATA
MOVIESCENE_API void PostSerialize(const FArchive& Ar);
#endif
/**
* Purge any stale tracks we may have
*/
void PurgeStaleTracks()
{
StaleTracks.Reset();
}
public:
/**
* Get this template's generation ledger
*/
const FMovieSceneTemplateGenerationLedger& GetLedger() const
{
return TemplateLedger;
}
/**
* Remove any data within this template that does not reside in the specified set of signatures
*/
void RemoveStaleData(const TSet<FGuid>& ActiveSignatures);
private:
/** Map of evaluation tracks from identifier to track */
UPROPERTY()
TMap<FMovieSceneTrackIdentifier, FMovieSceneEvaluationTrack> Tracks;
/** Transient map of stale tracks. */
TMap<FMovieSceneTrackIdentifier, FMovieSceneEvaluationTrack> StaleTracks;
public:
UPROPERTY()
FGuid SequenceSignature;
/** Serial number that is incremented every time this template is re-generated through FMovieSceneEvaluationTemplateGenerator */
UPROPERTY()
FMovieSceneEvaluationTemplateSerialNumber TemplateSerialNumber;
private:
UPROPERTY()
FMovieSceneTemplateGenerationLedger TemplateLedger;
};
#if WITH_EDITORONLY_DATA
template<> struct TStructOpsTypeTraits<FMovieSceneEvaluationTemplate> : public TStructOpsTypeTraitsBase2<FMovieSceneEvaluationTemplate> { enum { WithPostSerialize = true }; };
#endif