153 lines
4.7 KiB
C++
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;
|
|
};
|