// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "Containers/Array.h" #include "CoreMinimal.h" #include "CoreTypes.h" #include "Internationalization/Text.h" #include "Misc/FrameNumber.h" #include "Misc/InlineValue.h" #include "MovieSceneNameableTrack.h" #include "MovieSceneSection.h" #include "Templates/SubclassOf.h" #include "UObject/ObjectMacros.h" #include "UObject/ObjectPtr.h" #include "UObject/UObjectGlobals.h" #include "MovieSceneSubTrack.generated.h" class UMovieSceneSequence; class UMovieSceneSubSection; class UObject; struct FMovieSceneSegmentCompilerRules; /** * A track that holds sub-sequences within a larger sequence. */ UCLASS(MinimalAPI) class UMovieSceneSubTrack : public UMovieSceneNameableTrack { GENERATED_BODY() public: MOVIESCENE_API UMovieSceneSubTrack( const FObjectInitializer& ObjectInitializer ); /** * Adds a movie scene section at the requested time. * * @param Sequence The sequence to add * @param StartTime The time to add the section at * @param Duration The duration of the section in frames * @return The newly created sub section */ virtual UMovieSceneSubSection* AddSequence(UMovieSceneSequence* Sequence, FFrameNumber StartTime, int32 Duration) { return AddSequenceOnRow(Sequence, StartTime, Duration, INDEX_NONE); } /** * Adds a movie scene section at the requested time. * * @param Sequence The sequence to add * @param StartTime The time to add the section at * @param Duration The duration of the section in frames * @param bInsertSequence Whether or not to insert the sequence and push existing sequences out * @return The newly created sub section */ MOVIESCENE_API virtual UMovieSceneSubSection* AddSequenceOnRow(UMovieSceneSequence* Sequence, FFrameNumber StartTime, int32 Duration, int32 RowIndex); /** * Check whether this track contains the given sequence. * * @param Sequence The sequence to find. * @param Recursively Whether to search for the sequence in sub-sequences. * @param SectionToSkip Skip this section when searching the track (ie. the section is already set to this sequence). * @return true if the sequence is in this track, false otherwise. */ MOVIESCENE_API bool ContainsSequence(const UMovieSceneSequence& Sequence, bool Recursively = false, const UMovieSceneSection* SectionToSkip = nullptr) const; /** * Finds all sections at the current time. * * @param Time The time relative to the owning movie scene where the sections should be * @return The found sections. */ MOVIESCENE_API TArray> FindAllSections(FFrameNumber Time) const; /** * Finds a section at the current time. * * @param Time The time relative to the owning movie scene where the section should be * @return The found section. */ MOVIESCENE_API UMovieSceneSection* FindSection(FFrameNumber Time) const; /** * Finds a section at the current time or extends an existing one * * @param Time The time relative to the owning movie scene where the section should be * @param OutWeight The weight of the section if found * @return The found section. */ MOVIESCENE_API UMovieSceneSection* FindOrExtendSection(FFrameNumber Time, float& OutWeight); /** * Finds a section at the current time, or adds one if no section is found. * * @param Time The time relative to the owning movie scene where the section should be * @param bSectionAdded Whether a section was added or not * @return The found section, or the new section. */ MOVIESCENE_API UMovieSceneSection* FindOrAddSection(FFrameNumber Time, bool& bSectionAdded); public: // UMovieSceneTrack interface MOVIESCENE_API virtual void AddSection(UMovieSceneSection& Section) override; MOVIESCENE_API virtual bool SupportsType(TSubclassOf SectionClass) const override; MOVIESCENE_API virtual UMovieSceneSection* CreateNewSection() override; MOVIESCENE_API virtual const TArray& GetAllSections() const override; MOVIESCENE_API virtual bool HasSection(const UMovieSceneSection& Section) const override; MOVIESCENE_API virtual bool IsEmpty() const override; MOVIESCENE_API virtual void RemoveAllAnimationData() override; MOVIESCENE_API virtual void RemoveSection(UMovieSceneSection& Section) override; MOVIESCENE_API virtual void RemoveSectionAt(int32 SectionIndex) override; MOVIESCENE_API virtual bool SupportsMultipleRows() const override; #if WITH_EDITORONLY_DATA MOVIESCENE_API virtual FText GetDefaultDisplayName() const override; virtual UMovieSceneSection* GetSectionToKey() const override { return SectionToKey; } MOVIESCENE_API virtual void SetSectionToKey(UMovieSceneSection* Section) override; #endif protected: /** All movie scene sections. */ UPROPERTY() TArray> Sections; #if WITH_EDITORONLY_DATA public: /** * Get the height of this track's rows */ int32 GetRowHeight() const { return RowHeight; } /** * Set the height of this track's rows */ void SetRowHeight(int32 NewRowHeight) { RowHeight = FMath::Max(16, NewRowHeight); } private: /** The height for each row of this track */ UPROPERTY() int32 RowHeight; /** Section we should Key */ UPROPERTY() TObjectPtr SectionToKey; #endif };