UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
MovieSceneTestDataBuilders.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
8#include "CoreTypes.h"
10#include "IMovieScenePlayer.h"
11#include "KeyParams.h"
12#include "MovieScene.h"
13#include "MovieSceneSection.h"
14#include "MovieSceneSequence.h"
15#include "Templates/EnableIf.h"
18
19#include "MovieSceneTestDataBuilders.generated.h"
20
27UCLASS(MinimalAPI)
29{
31
32public:
34 UPROPERTY()
36
37public:
40
47 MOVIESCENETRACKS_API FGuid AddObjectBinding(TObjectPtr<UObject> InObject);
48
49public:
51 virtual void BindPossessableObject(const FGuid& ObjectId, UObject& PossessedObject, UObject* Context) override {}
52 virtual bool CanPossessObject(UObject& Object, UObject* InPlaybackContext) const override { return true; }
53 MOVIESCENETRACKS_API virtual void LocateBoundObjects(const FGuid& ObjectId, UObject* Context, TArray<UObject*, TInlineAllocator<1>>& OutObjects) const override;
54 virtual UMovieScene* GetMovieScene() const override { return MovieScene; }
55 virtual UObject* GetParentObject(UObject* Object) const override { return nullptr; }
56 virtual void UnbindPossessableObjects(const FGuid& ObjectId) override {}
57 virtual void UnbindObjects(const FGuid& ObjectId, const TArray<UObject*>& InObjects, UObject* Context) override {}
58 virtual void UnbindInvalidObjects(const FGuid& ObjectId, UObject* Context) override {}
59
60private:
61 UPROPERTY()
62 TArray<TObjectPtr<UObject>> BoundObjects;
63
64 UPROPERTY()
65 TArray<FGuid> BindingGuids;
66};
67
68namespace UE::MovieScene::Test
69{
70
71template<typename TrackClass> struct FSequenceTrackBuilder;
72template<typename TrackClass> struct FSequenceSectionBuilder;
73
77struct FSequenceBuilder
78{
80 FGuid CurrentBinding;
81
82 FSequenceBuilder()
83 {
85 Sequence->Initialize();
86 }
87
88 FSequenceBuilder& AddObjectBinding(TObjectPtr<UObject> InObject)
89 {
90 CurrentBinding = Sequence->AddObjectBinding(InObject);
91 return *this;
92 }
93
94 FSequenceBuilder& AddObjectBinding(TObjectPtr<UObject> InObject, FGuid& OutBindingID)
95 {
96 AddObjectBinding(InObject);
97 OutBindingID = CurrentBinding;
98 return *this;
99 }
100
101 template<typename TrackClass>
103 {
104 UMovieScene* MovieScene = Sequence->GetMovieScene();
105 TrackClass* Track = MovieScene->AddTrack<TrackClass>();
106 return FSequenceTrackBuilder<TrackClass>(*this, Track);
107 }
108
109 template<typename TrackClass>
111 {
112 checkf(CurrentBinding.IsValid(), TEXT("Specify an object binding first with AddObjectBinding"));
113 UMovieScene* MovieScene = Sequence->GetMovieScene();
114 TrackClass* Track = MovieScene->AddTrack<TrackClass>(CurrentBinding);
115 return FSequenceTrackBuilder<TrackClass>(*this, Track);
116 }
117
118 template<typename TrackClass>
120 {
121 checkf(CurrentBinding.IsValid(), TEXT("Specify an object binding first with AddObjectBinding"));
122 UMovieScene* MovieScene = Sequence->GetMovieScene();
123 TrackClass* Track = MovieScene->AddTrack<TrackClass>(CurrentBinding);
124 Track->SetPropertyNameAndPath(InPropertyName, InPropertyName.ToString());
125 return FSequenceTrackBuilder<TrackClass>(*this, Track);
126 }
127};
128
132template<typename TrackClass>
133struct FSequenceTrackBuilder
134{
135 FSequenceBuilder& Parent;
137
138 FSequenceTrackBuilder(FSequenceBuilder& InParent, TrackClass* InTrack)
139 : Parent(InParent), Track(InTrack)
140 {}
141
142 FSequenceTrackBuilder& Assign(TrackClass*& OutTrack)
143 {
144 OutTrack = Track;
145 return *this;
146 }
147
148 template<typename Func>
149 FSequenceBuilder& Do(Func&& Callback)
150 {
151 Callback(Track);
152 return *this;
153 }
154
156 {
157 UMovieSceneSection* NewSection = Track->CreateNewSection();
159 if (InRowIndex != INDEX_NONE)
160 {
161 NewSection->SetRowIndex(InRowIndex);
162 }
163 Track->AddSection(*NewSection);
165 }
166
167 FSequenceBuilder& Pop() { return Parent; }
168};
169
173template<typename ParentTrackClass>
174struct FSequenceSectionBuilder
175{
176 FSequenceTrackBuilder<ParentTrackClass>& Parent;
178
179 FSequenceSectionBuilder(FSequenceTrackBuilder<ParentTrackClass>& InParent, UMovieSceneSection* InSection)
180 : Parent(InParent), Section(InSection)
181 {}
182
183 FSequenceSectionBuilder& Assign(UMovieSceneSection*& OutSection)
184 {
185 OutSection = Section;
186 return *this;
187 }
188
189 template<typename SectionClass>
190 FSequenceSectionBuilder& Assign(SectionClass*& OutSection)
191 {
193 return *this;
194 }
195
196 FSequenceSectionBuilder& SetBlendType(EMovieSceneBlendType InBlendType)
197 {
198 Section->SetBlendType(InBlendType);
199 return *this;
200 }
201
202 FSequenceSectionBuilder& SetEaseIn(int32 InDurationTicks, EMovieSceneBuiltInEasing InEasingType = EMovieSceneBuiltInEasing::Linear)
203 {
204 FMovieSceneEasingSettings& Easing = Section->Easing;
205 Easing.bManualEaseIn = true;
206 Easing.ManualEaseInDuration = InDurationTicks;
208 {
209 Function->Type = InEasingType;
210 }
211 return *this;
212 }
213
214 FSequenceSectionBuilder& SetEaseOut(int32 InDurationTicks, EMovieSceneBuiltInEasing InEasingType = EMovieSceneBuiltInEasing::Linear)
215 {
216 FMovieSceneEasingSettings& Easing = Section->Easing;
217 Easing.bManualEaseOut = true;
218 Easing.ManualEaseOutDuration = InDurationTicks;
220 {
221 Function->Type = InEasingType;
222 }
223 return *this;
224 }
225
226 template<typename ChannelType, typename ValueType>
227 FSequenceSectionBuilder& AddKey(
230 ValueType InValue,
231 EMovieSceneKeyInterpolation Interpolation = EMovieSceneKeyInterpolation::Auto)
232 {
233 FMovieSceneChannelProxy& ChannelProxy = Section->GetChannelProxy();
234 ChannelType* Channel = ChannelProxy.GetChannel<ChannelType>(InChannelIndex);
235 return AddKeys(Channel, TArray<FFrameNumber>({ InTime }), TArray<ValueType>({ InValue }), Interpolation);
236 }
237
238 template<typename ChannelType, typename ValueType>
239 FSequenceSectionBuilder& AddKeys(
243 EMovieSceneKeyInterpolation Interpolation = EMovieSceneKeyInterpolation::Auto)
244 {
245 FMovieSceneChannelProxy& ChannelProxy = Section->GetChannelProxy();
246 ChannelType* Channel = ChannelProxy.GetChannel<ChannelType>(InChannelIndex);
247 return AddKeys(Channel, InTimes, InValues, Interpolation);
248 }
249
250#if WITH_EDITOR
251 template<typename ChannelType, typename ValueType>
252 FSequenceSectionBuilder& AddKeys(
256 EMovieSceneKeyInterpolation Interpolation = EMovieSceneKeyInterpolation::Auto)
257 {
258 FMovieSceneChannelProxy& ChannelProxy = Section->GetChannelProxy();
259 TMovieSceneChannelHandle<ChannelType> ChannelHandle = ChannelProxy.GetChannelByName<ChannelType>(InChannelName);
260 return AddKeys(ChannelHandle.Get(), InTimes, InValues, Interpolation);
261 }
262#endif
263
264 template<typename ChannelType, typename ValueType>
265 FSequenceSectionBuilder& AddKeys(
266 ChannelType* InChannel,
269 EMovieSceneKeyInterpolation Interpolation = EMovieSceneKeyInterpolation::Auto)
270 {
271 ensure(InTimes.Num() == InValues.Num());
272 int32 Num = FMath::Min(InTimes.Num(), InValues.Num());
273 for (int32 Index = 0; Index < Num; ++Index)
274 {
276 }
277 return *this;
278 }
279
280 template<typename Func>
281 FSequenceSectionBuilder& Do(Func&& Callback)
282 {
283 Callback(Section);
284 return *this;
285 }
286
287 template<typename SectionClass, typename Func>
288 FSequenceSectionBuilder& Do(Func&& Callback)
289 {
290 Callback(Cast<SectionClass>(Section));
291 return *this;
292 }
293
294 FSequenceTrackBuilder<ParentTrackClass>& Pop() { return Parent; }
295};
296
297} // namespace UE::MovieScene::Test
298
#define ensure( InExpression)
Definition AssertionMacros.h:464
#define checkf(expr, format,...)
Definition AssertionMacros.h:315
@ INDEX_NONE
Definition CoreMiscDefines.h:150
#define TEXT(x)
Definition Platform.h:1272
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
EMovieSceneKeyInterpolation
Definition KeyParams.h:12
@ Num
Definition MetalRHIPrivate.h:234
EMovieSceneBlendType
Definition MovieSceneBlendType.h:19
FKeyHandle AddKeyToChannel(FMovieSceneDoubleChannel *Channel, FFrameNumber InFrameNumber, double InValue, EMovieSceneKeyInterpolation Interpolation)
Definition MovieSceneDoubleChannel.cpp:666
EMovieSceneBuiltInEasing
Definition MovieSceneEasingCurves.h:22
#define UPROPERTY(...)
UObject definition macros.
Definition ObjectMacros.h:744
#define GENERATED_BODY(...)
Definition ObjectMacros.h:765
#define UCLASS(...)
Definition ObjectMacros.h:776
Definition NameTypes.h:617
Definition MovieScene.Build.cs:6
Definition Array.h:670
Definition Range.h:50
Definition ContainerAllocationPolicies.h:894
Definition MovieSceneEasingCurves.h:46
Definition MovieSceneSection.h:243
Definition MovieSceneSequence.h:73
Definition MovieSceneTestDataBuilders.h:29
virtual UMovieScene * GetMovieScene() const override
Definition MovieSceneTestDataBuilders.h:54
virtual void UnbindInvalidObjects(const FGuid &ObjectId, UObject *Context) override
Definition MovieSceneTestDataBuilders.h:58
virtual void UnbindPossessableObjects(const FGuid &ObjectId) override
Definition MovieSceneTestDataBuilders.h:56
virtual bool CanPossessObject(UObject &Object, UObject *InPlaybackContext) const override
Definition MovieSceneTestDataBuilders.h:52
virtual UObject * GetParentObject(UObject *Object) const override
Definition MovieSceneTestDataBuilders.h:55
virtual void UnbindObjects(const FGuid &ObjectId, const TArray< UObject * > &InObjects, UObject *Context) override
Definition MovieSceneTestDataBuilders.h:57
Definition MovieScene.h:358
Definition Object.h:95
Definition TestUtils.cpp:8
Definition AdvancedWidgetsModule.cpp:13
U16 Index
Definition radfft.cpp:71
Definition FrameNumber.h:18
Definition Guid.h:109
bool IsValid() const
Definition Guid.h:318
Definition MovieSceneChannelProxy.h:198
ChannelType * GetChannel(int32 ChannelIndex) const
Definition MovieSceneChannelProxy.h:448
Definition MovieSceneSection.h:112
Definition MovieSceneChannelHandle.h:167
ChannelType * Get() const
Definition MovieSceneChannelHandle.h:183
Definition ObjectPtr.h:488