UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
MovieSceneClipboard.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "Containers/Array.h"
6#include "Containers/Map.h"
7#include "CoreMinimal.h"
9#include "HAL/Platform.h"
12#include "Misc/DateTime.h"
13#include "Misc/FrameNumber.h"
14#include "Misc/FrameRate.h"
15#include "Misc/FrameTime.h"
16#include "Misc/InlineValue.h"
17#include "Misc/Optional.h"
18#include "MovieSceneTrack.h"
19#include "Templates/Function.h"
22#include "UObject/NameTypes.h"
23#include "UObject/Object.h"
24#include "UObject/UnrealNames.h"
25
26#if WITH_EDITOR
27
28
29namespace MovieSceneClipboard
30{
31 template<typename T> static FName GetKeyTypeName()
32 {
33 // Use the template type here to stop the compiler generating the code unless it's actually used
34 static_assert(!std::is_same_v<T, T>, "This function must be specialized to use with the specified type");
35 return NAME_None;
36 }
37}
38
40
48{
49public:
51 template<typename T>
53 : Time(InTime)
54 , Data(TKey<T>(MoveTemp(InValue)))
55 {
56 }
57
61
63 MOVIESCENE_API FFrameNumber GetTime() const;
64
67
73 template<typename T>
74 T GetValue() const
75 {
76 T Default = T();
78 return Default;
79 }
80
87 template<typename T>
88 bool TryGetValue(T& Value) const
89 {
90 if (!Data.IsValid())
91 {
92 return false;
93 }
94
95 // Check for same type
96 if (Data->GetTypeName() == MovieSceneClipboard::GetKeyTypeName<T>())
97 {
98 Value = static_cast<const TKey<T>&>(Data.GetValue()).Value;
99 return true;
100 }
101
102 // Check for conversion possibility
103 FConversionFunction* ConversionFunction = Data->FindConversionTo(MovieSceneClipboard::GetKeyTypeName<T>());
105 {
107 Value = static_cast<const TKey<T>&>(Key.Data.GetValue()).Value;
108 return true;
109 }
110
111 return false;
112 }
113
114private:
115
117
119 struct IKey
120 {
121 virtual ~IKey() {}
122 virtual void CopyTo(TInlineValue<IKey, 64>& OutDest) const = 0;
124 virtual FName GetTypeName() const = 0;
125 };
126
128 template<typename T>
129 struct TKey : IKey
130 {
131 TKey(T InValue) : Value(MoveTemp(InValue)) {}
132
135 {
136 TMap<FName, FConversionFunction>* ConversionBucket = ConversionMap.Find(MovieSceneClipboard::GetKeyTypeName<T>());
138 {
140 }
141 return nullptr;
142 }
143
145 virtual FName GetTypeName() const
146 {
147 return MovieSceneClipboard::GetKeyTypeName<T>();
148 }
149
151 virtual void CopyTo(TInlineValue<IKey, 64>& OutDest) const
152 {
153 OutDest = TKey(Value);
154 }
155
157 T Value;
158 };
159
162
165
166public:
167
169 template<typename FromType, typename ToType>
170 static void DefineConversion(TFunction<ToType(const FromType&)> InFunction)
171 {
173 const TKey<FromType>& TypedKey = static_cast<const TKey<FromType>&>(InKey.Data.GetValue());
174
175 return FMovieSceneClipboardKey(InKey.GetTime(), InFunction(TypedKey.Value));
176 };
177
179 .Add(MovieSceneClipboard::GetKeyTypeName<FromType>())
180 .Add(MovieSceneClipboard::GetKeyTypeName<ToType>(), Facade);
181 }
182
183private:
186};
187
190{
191public:
192
194 template<typename KeyType>
195 static FMovieSceneClipboardKeyTrack Create(FName InName, FFrameNumber KeyOffset = 0)
196 {
198 Track.TypeName = MovieSceneClipboard::GetKeyTypeName<KeyType>();
199 Track.Name = MoveTemp(InName);
200 Track.KeyOffset = KeyOffset;
201 return Track;
202 }
203
204public:
205
209
213
215 template<typename KeyType>
216 bool IsKeyOfType() const
217 {
218 return TypeName == MovieSceneClipboard::GetKeyTypeName<KeyType>();
219 }
220
222 template<typename KeyType>
223 void AddKey(FFrameNumber Time, KeyType Value)
224 {
225 Time -= KeyOffset;
226
227 checkf(IsKeyOfType<KeyType>(), TEXT("Unable to add a key of a different value type to the track"));
229 }
230
236 bool IterateKeys(TFunctionRef<bool(const FMovieSceneClipboardKey& Key)> Iter) const
237 {
238 for (const FMovieSceneClipboardKey& Key : Keys)
239 {
240 if (!Iter(Key))
241 {
242 return false;
243 }
244 }
245 return true;
246 }
247 bool IterateKeys(TFunctionRef<bool(FMovieSceneClipboardKey& Key)> Iter)
248 {
249 for (FMovieSceneClipboardKey& Key : Keys)
250 {
251 if (!Iter(Key))
252 {
253 return false;
254 }
255 }
256 return true;
257 }
258
260 MOVIESCENE_API const FName& GetName() const;
261
262private:
263
265 {}
266
269
271 FName TypeName;
272
274 FName Name;
275
277 FFrameNumber KeyOffset;
278};
279
282{
284 : CardinalTime(0)
285 , DateTime(FDateTime::UtcNow())
286 {}
287
290
292 FMovieSceneTimeTransform TimeTransform;
293
296
299};
300
303{
304public:
307
311
315
318
320 MOVIESCENE_API FText GetDisplayText() const;
321
323 MOVIESCENE_API const FMovieSceneClipboardEnvironment& GetEnvironment() const;
324
327
328private:
329 friend class FMovieSceneClipboardBuilder;
330
333
336};
337
340{
341public:
342
344 FFrameNumber KeyOffset;
345
348
356 template<typename KeyType>
358 {
360
361 TArray<FMovieSceneClipboardKeyTrack>& Tracks = TrackIndex.FindOrAdd(&ParentTrack);
362
364 return In.GetName() == InName;
365 });
366
367 if (Existing)
368 {
369 return *Existing;
370 }
371
372 int32 Index = Tracks.Num();
373 Tracks.Add(FMovieSceneClipboardKeyTrack::Create<KeyType>(MoveTemp(InName)));
374 return Tracks.GetData()[Index];
375 }
376
377private:
380};
381
383namespace MovieSceneClipboard
384{
385 template<typename From, typename To>
387 {
388 static To Cast(const From& Value) { return Value; }
389 };
390
391 template<typename From>
392 struct TImplicitConversionFacade<From, bool>
393 {
394 static bool Cast(const From& Value) { return !!Value; }
395 };
396
397 template<typename From, typename To>
399 {
400 FMovieSceneClipboardKey::DefineConversion<From, To>(InConversion);
401 }
402
403 template<typename From, typename To>
405 {
406 DefineExplicitConversion<From, To>(&TImplicitConversionFacade<From, To>::Cast);
407 }
408}
409
410#endif
#define check(expr)
Definition AssertionMacros.h:314
#define checkf(expr, format,...)
Definition AssertionMacros.h:315
FString GetTypeName()
Definition Casts.h:66
#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
TCopyQualifiersFromTo_T< From, To > * Cast(From *Src)
Definition Casts.h:95
const bool
Definition NetworkReplayStreaming.h:178
UE_INTRINSIC_CAST UE_REWRITE constexpr std::remove_reference_t< T > && MoveTemp(T &&Obj) noexcept
Definition UnrealTemplate.h:520
Definition NameTypes.h:617
Definition Text.h:385
Definition Array.h:670
ElementType * FindByPredicate(Predicate Pred)
Definition Array.h:1471
UE_REWRITE SizeType Num() const
Definition Array.h:1144
UE_NODEBUG UE_FORCEINLINE_HINT ElementType * GetData() UE_LIFETIMEBOUND
Definition Array.h:1027
UE_NODEBUG UE_FORCEINLINE_HINT SizeType Add(ElementType &&Item)
Definition Array.h:2696
Definition AssetRegistryState.h:50
Definition AndroidPlatformMisc.h:14
Definition InlineValue.h:22
Definition UnrealString.h.inl:34
Definition MovieSceneTrack.h:206
GeometryCollection::Facades::FMuscleActivationFacade Facade
Definition MuscleActivationConstraints.h:14
GeometryCollection::Facades::FMuscleActivationData Data
Definition MuscleActivationConstraints.h:15
IMAGECORE_API const TCHAR * GetName(Type Format)
Definition ImageCore.cpp:1378
Type ToType(const FString &Affiliation)
Definition XmppMultiUserChat.h:55
T::FDataType GetValue(const UBlackboardComponent &Blackboard, const FName &Name, FBlackboard::FKey &InOutCachedKey, const typename T::FDataType &DefaultValue)
Definition ValueOrBBKey.h:51
U16 Index
Definition radfft.cpp:71
Definition DateTime.h:76
Definition FrameNumber.h:18
Definition FrameRate.h:21
Definition FrameTime.h:16
Definition MovieSceneTimeTransform.h:23
Definition Optional.h:131