// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "MovieSceneSequenceID.h" #include "MovieSceneSignedObject.h" #include "UObject/WeakObjectPtrTemplates.h" #include "Containers/Array.h" #include "MovieSceneBindingProxy.h" #include "MovieSceneCondition.generated.h" namespace UE { namespace MovieScene { struct FSharedPlaybackState; } } /* * Defines the scope of a particular condition type. * By default, the condition scope will determine whether conditions need to be re-evaluated for different bindings or entities in the Sequence. */ UENUM(BlueprintType) enum class EMovieSceneConditionScope : uint8 { /* Condition has the same result regardless of the binding or entity.*/ Global, /* Condition may have different results for different object bindings. */ Binding, /* Condition may have different results for each different outer object owner (i.e. track, section) in the Sequence.*/ OwnerObject, }; /* Defines how often a condition needs to be checked. * Most conditions should return 'Once', but if the condition result can change during playback, 'OnTick' can be chosen to have the condition re-evaluated each tick. */ UENUM(BlueprintType) enum class EMovieSceneConditionCheckFrequency : uint8 { /* Condition result will not change during sequence playback and only needs to get checked once. */ Once, /* Condition result may change during sequence playback and should be checked per tick. */ OnTick, }; /* * Blueprint-friendly struct containing any context needed to evaluate conditions. */ USTRUCT(BlueprintType) struct FMovieSceneConditionContext { GENERATED_BODY() public: /* The world context*/ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Default") TObjectPtr WorldContext; /* Binding for the bound object currently evaluating this condition if applicable (BindingId will be invalid for conditions on global tracks/sections). */ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Default") FMovieSceneBindingProxy Binding; /* Array of objects bound to the binding currently evaluating this condition if applicable (will be empty for conditions on global tracks/sections)*/ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Default") TArray> BoundObjects; }; /* * Container struct for instanced UMovieSceneConditions, existing only to allow property type customization for choosing conditions. */ USTRUCT(BlueprintType) struct FMovieSceneConditionContainer { GENERATED_BODY() UPROPERTY(EditAnywhere, BlueprintReadWrite, Instanced, Category="Sequencer|Condition", meta = (EditInline, AllowEditInlineCustomization)) TObjectPtr Condition = nullptr; }; /** * Abstract condition class. Conditions can be applied to sections, tracks, and track rows to determine whether or not they are evaluated at runtime. * This allows developers to create Sequences with dynamic behavior based on gameplay state, local player state, player hardware, etc. */ UCLASS(abstract, Blueprintable, DefaultToInstanced, EditInlineNew, meta = (ShowWorldContextPin), CollapseCategories, MinimalAPI) class UMovieSceneCondition : public UMovieSceneSignedObject { GENERATED_BODY() public: /* Called by Sequencer code to evaluate this condition, passing relevant context. Note that BindingGuid will be invalid for conditions on global sections/tracks. */ MOVIESCENE_API bool EvaluateCondition(FGuid BindingGuid, FMovieSceneSequenceID SequenceID, TSharedRef SharedPlaybackState) const; /* Called by Sequencer to compute a cache key for this condition given the passed in context. * By default, this key will be computed based on the Binding Scope, and if relevant, the binding and entity owner. * If a condition returns the same cache key given the same or different contexts, it will not be rechecked, and a cached value may be used. */ MOVIESCENE_API virtual uint32 ComputeCacheKey(FGuid BindingGuid, FMovieSceneSequenceID SequenceID, TSharedRef SharedPlaybackState, UObject* EntityOwner) const; MOVIESCENE_API virtual bool CanCacheResult(TSharedRef SharedPlaybackState) const; MOVIESCENE_API EMovieSceneConditionScope GetConditionScope() const; #if WITH_EDITORONLY_DATA /* If true, will skip evaluating the condition and always return true. Useful for authoring or debugging. */ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Default") bool bEditorForceTrue = false; friend class FMovieSceneConditionCustomization; #endif protected: /* Override to implement your condition.*/ UFUNCTION(BlueprintImplementableEvent, CallInEditor, meta=(DisplayName = "On Evaluate Condition")) MOVIESCENE_API bool BP_EvaluateCondition(const FMovieSceneConditionContext& ConditionContext) const; /* Override in native code to implement your condition. Note that BindingGuid will be invalid for conditions on global sections/tracks.*/ MOVIESCENE_API virtual bool EvaluateConditionInternal(FGuid BindingGuid, FMovieSceneSequenceID SequenceID, TSharedRef SharedPlaybackState) const; /* Returns the scope of the condition, which determines whether the condition needs to be re-evaluated for different bindings or entities in the Sequence. */ UFUNCTION(BlueprintNativeEvent, CallInEditor, meta=(DisplayName = "Get Scope")) MOVIESCENE_API EMovieSceneConditionScope BP_GetScope() const; /* Returns the scope of the condition, which determines whether the condition needs to be re-evaluated for different bindings or entities in the Sequence. */ MOVIESCENE_API virtual EMovieSceneConditionScope GetScopeInternal() const; /* Returns the check frequency of the condition, which determines whether the condition result can change during playback and needs to get re-evaluated. */ UFUNCTION(BlueprintNativeEvent, CallInEditor, meta=(DisplayName = "Get Check Frequency")) MOVIESCENE_API EMovieSceneConditionCheckFrequency BP_GetCheckFrequency() const; /* Returns the check frequency of the condition, which determines whether the condition result can change during playback and needs to get re-evaluated. */ MOVIESCENE_API virtual EMovieSceneConditionCheckFrequency GetCheckFrequencyInternal() const; protected: /* If true, inverts the result of the condition check.*/ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Default") bool bInvert = false; };