Files
UnrealEngine/Engine/Source/Runtime/MovieScene/Public/Evaluation/MovieSceneEvalTemplateBase.h
2025-05-18 13:04:45 +08:00

153 lines
4.7 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "UObject/ObjectMacros.h"
#include "Evaluation/MovieScenePlayback.h"
#include "MovieSceneEvalTemplateBase.generated.h"
struct FPersistentEvaluationData;
class IMovieScenePlayer;
/** Empty struct used for serialization */
USTRUCT()
struct FMovieSceneEmptyStruct
{
GENERATED_BODY()
};
/**
* Base structure used for all movie scene evaluation templates
*/
USTRUCT()
struct FMovieSceneEvalTemplateBase
{
public:
GENERATED_BODY()
/**
* Default constructor
*/
FMovieSceneEvalTemplateBase()
: OverrideMask(0)
{
}
/**
* Virtual destruction
*/
virtual ~FMovieSceneEvalTemplateBase() {}
/**
* Access the most derived script struct type of this instance for serialization purposes
*/
UScriptStruct& GetScriptStruct() const { return GetScriptStructImpl(); }
/**
* Check whether this entity requires set up when it is first evaluated
*/
FORCEINLINE bool RequiresSetup() const { return (OverrideMask & RequiresSetupFlag) != 0; }
/**
* Check whether this entity requires tear up when it no longer being evaluated
*/
FORCEINLINE bool RequiresTearDown() const { return (OverrideMask & RequiresTearDownFlag) != 0; }
/**
* Called before this template is evaluated for the first time, or since OnEndEvaluation has been called
*
* @param PersistentData Persistent data proxy that may contain data pertaining to this entity
* @param Player The player that is responsible for playing back this template
*/
FORCEINLINE void OnBeginEvaluation(FPersistentEvaluationData& PersistentData, IMovieScenePlayer& Player) const
{
if (RequiresSetup())
{
Setup(PersistentData, Player);
}
}
/**
* Called after this template is no longer being evaluated
*
* @param PersistentData Persistent data proxy that may contain data pertaining to this entity
* @param Player The player that is responsible for playing back this template
*/
FORCEINLINE void OnEndEvaluation(FPersistentEvaluationData& PersistentData, IMovieScenePlayer& Player) const
{
if (RequiresTearDown())
{
TearDown(PersistentData, Player);
}
}
/**
* Called after construction to enable overridden functions required by this type.
* @note Should call EnableOverrides() in derived structs with the appropriate flag mask.
* This is implemented as a virtual function to ensure consistency between serialized data and code.
* Overriden function flags are not serialized to allow for future changes without breaking serialized data.
*/
virtual void SetupOverrides()
{
}
protected:
/**
* Called before this template is evaluated for the first time, or since OnEndEvaluation has been called. Implement in derived classes.
* @note Only called when a derived type sets EnableOverrides(RequiresSetupFlag)
*
* @param PersistentData Persistent data proxy that may contain data pertaining to this entity
* @param Player The player that is responsible for playing back this template
*/
virtual void Setup(FPersistentEvaluationData& PersistentData, IMovieScenePlayer& Player) const
{
ensureMsgf(false, TEXT("FMovieSceneEvalTemplateBase::Setup has not been implemented. Did you erroneously call EnableOverrides(RequiresSetupFlag)?"));
}
/**
* Called after this template is no longer being evaluated. Implement in derived classes.
* @note Only called when a derived type sets EnableOverrides(RequiresTearDownFlag)
*
* @param PersistentData Persistent data proxy that may contain data pertaining to this entity
* @param Player The player that is responsible for playing back this template
*/
virtual void TearDown(FPersistentEvaluationData& PersistentData, IMovieScenePlayer& Player) const
{
ensureMsgf(false, TEXT("FMovieSceneEvalTemplateBase::TearDown has not been implemented. Did you erroneously call EnableOverrides(RequiresTearDownFlag)?"));
}
/**
* Retrieve the script struct pertaining to the most-derived type of this instance. Must be implemented in all derived classes for serialization to work correctly.
*/
virtual UScriptStruct& GetScriptStructImpl() const
{
ensureMsgf(false, TEXT("GetScriptStructImpl has not been implemented. This type will not serialize correctly."));
return *StaticStruct();
}
protected:
/**
* Enable the overrides referred to by the specified flag mask
*/
void EnableOverrides(uint8 OverrideFlag)
{
OverrideMask |= OverrideFlag;
}
/** Base class flag mask that should be considered by any implementations of FMovieSceneEvalTemplateBase */
enum EOverrideMask
{
RequiresSetupFlag = 0x001,
RequiresTearDownFlag = 0x002,
};
/** Mask of overridden properties - not serialized, but setup in SetupOverrides */
uint8 OverrideMask;
};