UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
MovieScenePlaybackCapabilities.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "CoreTypes.h"
8#include "MovieSceneFwd.h"
11#include <type_traits>
12
15
16namespace UE::MovieScene
17{
18
25
30{
31 void* Ptr = 0;
33
34 template<typename T>
35 T* ResolveOptional() const
36 {
37 if (Ptr)
38 {
39 switch (StorageMode)
40 {
42 return static_cast<T*>(Ptr);
44 return *static_cast<T**>(Ptr);
46 return static_cast<TSharedPtr<T>*>(Ptr)->Get();
47 default:
48 checkf(false, TEXT("Unexpected playback capability storage mode"));
49 return nullptr;
50 }
51 }
52 return nullptr;
53 }
54
55 template<typename T>
56 T& ResolveChecked() const
57 {
58 check(Ptr);
59 switch (StorageMode)
60 {
62 return *static_cast<T*>(Ptr);
64 return **static_cast<T**>(Ptr);
66 return *static_cast<TSharedPtr<T>*>(Ptr)->Get();
67 default:
68 checkf(false, TEXT("Unexpected playback capability storage mode"));
69 // Nothing reasonable to do, let's just proceed as if it was inline
70 return *static_cast<T*>(Ptr);
71 }
72 }
73};
74
75// Utility callbacks for the concrete capability objects we have in a container.
78
79// Callback for casting a stored capabilty object to an IPlaybackCapability pointer if possible.
80template<typename StorageType>
82{
84 {
86 {
87 return static_cast<IPlaybackCapability*>((StorageType*)Ptr);
88 }
89 else
90 {
91 return nullptr;
92 }
93 }
94};
95template<typename PointedType>
97{
99 {
101 {
102 PointedType* TypedPtr = *(PointedType**)Ptr;
103 return static_cast<IPlaybackCapability*>(TypedPtr);
104 }
105 else
106 {
107 return nullptr;
108 }
109 };
110};
111template<typename PointedType>
113{
115 {
117 {
119 return static_cast<IPlaybackCapability*>(TypedPtr.Get());
120 }
121 else
122 {
123 return nullptr;
124 }
125 };
126};
127
128// Callback for destroying the stored capability object, whether that's the capability itself
129// (when stored inline), or a shared pointer, or whatever else.
130template<typename StorageType>
132{
133 static void Destroy(void* Ptr)
134 {
135 StorageType* StoragePtr = (StorageType*)Ptr;
136 StoragePtr->~StorageType();
137 }
138};
139
140// Helper callbacks for managing the lifetime of a capability.
146
147template<typename StorageType>
158
159// Storage traits for playback capabilities, only for internal use.
160template<typename StorageType, typename CapabilityType, typename=void>
162
163template<typename StorageType, typename CapabilityType>
164struct TPlaybackCapabilityStorageTraits<StorageType, CapabilityType, typename TEnableIf<TPointerIsConvertibleFromTo<StorageType, CapabilityType>::Value>::Type>
165{
167
168 static uint8 ComputePointerOffset(StorageType* StoragePtr)
169 {
170 const uint64 PointerOffset =
171 reinterpret_cast<uint64>(static_cast<CapabilityType*>(StoragePtr))
172 -
173 reinterpret_cast<uint64>(StoragePtr);
174 check(PointerOffset <= TNumericLimits<uint8>::Max());
175 return static_cast<uint8>(PointerOffset);
176 }
177};
178
179template<typename CapabilityType>
180struct TPlaybackCapabilityStorageTraits<CapabilityType*, CapabilityType, void>
181{
183
184 static uint8 ComputePointerOffset(CapabilityType** StoragePtr) { return 0; }
185};
186
187template<typename CapabilityType>
194
199{
200#if UE_MOVIESCENE_ENTITY_DEBUG
201 // Extra debugging field.
202 IPlaybackCapabilityDebuggingTypedPtr* DebugPtr = nullptr;
203#endif
204
205 // 2 Bytes
207
208 // 2 Bytes
210
211 // 1 Byte
213
214 // 1 Byte
216
217 // 1 Byte
219
226};
227
232{
233protected:
234
236
239
242
244 {
245 return (AllCapabilities & CapabilityBit) != 0;
246 }
247
249 {
251 {
253 check(Index >= 0 && Index < 255);
254 return GetHeader(static_cast<uint8>(Index)).Resolve(Memory);
255 }
256
257 return FPlaybackCapabilityPtr();
258 }
259
266
276 template<typename StorageType, typename CapabilityType, typename ...ArgTypes>
278 {
279 checkf((AllCapabilities & CapabilityBit) == 0, TEXT("Capability already exists!"));
280
281 // Add the enum entry
283
284 // Find the index of the new capability by counting how many bits are set before it
285 // For example, given CapabilityBit=0b00010000 and AllCapabilities=0b00011011:
286 // (CapabilityBit-1) = 0b00001111
287 // AllCapabilities & (CapabilityBit-1) = 0b00001011
288 // CountBits(0b00001011) = 3
289 const int32 NewCapabilityIndex = static_cast<int32>(FMath::CountBits(AllCapabilities & (CapabilityBit-1u)));
290
292
293 uint64 RequiredAlignment = FMath::Max(alignof(StorageType), alignof(FPlaybackCapabilityHeader));
294
295 const int32 ExistingNum = static_cast<int32>(Num);
296
297 // Compute our required alignment for the allocation
298 {
299 for (int32 Index = 0; Index < ExistingNum; ++Index)
300 {
301 RequiredAlignment = FMath::Max(RequiredAlignment, (uint64)ExistingHeaders[Index].Alignment);
302 }
303 }
304
305 // We'll keep track of where all our new capabilities will go, relative to the buffer start
308
309 // Compute the required size of our allocation
311
312 {
313 // Allocate space for headers
315
316 int32 Index = 0;
317
318 // Count up the sizes and alignments of pre-existing capabilities that exist before this new entry
319 for (; Index < NewCapabilityIndex; ++Index)
320 {
324 }
325
326 // Count up the size and alignment for the new capability
327 RequiredSizeof = Align(RequiredSizeof, alignof(StorageType));
329 RequiredSizeof += sizeof(StorageType);
330 ++Index;
331
332 // Now count up the sizes and alignments of pre-existing capabilities that exist after this new entry
333 for (; Index < ExistingNum+1; ++Index)
334 {
338 }
339 }
340
341 check( RequiredAlignment <= 0XFF );
342
344
346
347 // Make a new allocation if necessary
348 const bool bNeedsReallocation = RequiredAlignment > Alignment || RequiredSizeof > Capacity;
350 {
351 // Use the greater of the required size or double the current size to allow some additional capcity
352 Capacity = static_cast<uint16>(FMath::Max(RequiredSizeof, uint64(Capacity)*2));
353 Memory = reinterpret_cast<uint8*>(FMemory::Malloc(Capacity, RequiredAlignment));
354 }
355
356 // We now have an extra entry
357 ++Num;
358
359 // We now need to re-arrange memory carefully, going back to front in order to avoid overlaps.
360 // For instance we can only move headers at the end of the whole operation, otherwise they could overwrite
361 // the memory of the first couple capabilities before we've had a chance to move them. So we do:
362 //
363 // 1) Relocate capabilities from the last one up to where the new one will go
364 // 2) Allocate the new capability
365 // 3) Relocate capabilities from the one just before the new one, down to the first one
366 // 4) Relocate headers from the last one up to where the new one will go
367 // 5) Allocate the new header
368 // 6) Relocate headers from the one just before the new header, down to the first one
369 //
370 // In order to set the new capability pointers (obtained in steps 1-3) on the new headers (obtained in
371 // steps 4-6), we save these pointers in a temporary array.
372
373 const FPlaybackCapabilityHeader* OldHeaders = ExistingHeaders; // Better named variable for the rest of the steps...
374
375 auto RelocateCapability = [this, OldMemory, OldHeaders, &NewCapabilityOffsets](int32 OldIndex, int32 NewIndex)
376 {
377 void* NewCapabilityPtr = this->Memory + NewCapabilityOffsets[NewIndex];
378 void* OldCapabilityPtr = OldHeaders[OldIndex].Capability.Resolve(OldMemory);
380 };
381
382 // Step 1
383 int32 Index = static_cast<int32>(Num) - 1;
384 for (; Index > NewCapabilityIndex; --Index)
385 {
387 }
388
389 // Step 2
390 {
391 void* NewCapabilityPtr = this->Memory + NewCapabilityOffsets[Index];
392 StorageType* NewCapabilityTypedPtr = reinterpret_cast<StorageType*>(NewCapabilityPtr);
393 new (NewCapabilityTypedPtr) StorageType (Forward<ArgTypes>(InArgs)...);
394 }
395 --Index;
396
397 // Step 3
398 for (; Index >= 0; --Index)
399 {
401 }
402
404
405 auto RelocateHeader = [this, OldHeaders, NewHeaders, &NewCapabilityOffsets](int32 OldIndex, int32 NewIndex)
406 {
410
411 // Re-create the relative capability pointer, since the offset has changed (it's one capability
412 // further down), and the base pointer may have changed too (if we re-allocated the buffer)
413 void* NewCapabilityPtr = this->Memory + NewCapabilityOffsets[NewIndex];
414 NewHeaderPtr->Capability = TRelativePtr<void, uint16>(this->Memory, NewCapabilityPtr);
415
416 // The new header will share its debugging pointer with the old header at this point. But the old
417 // header will be gone when we free the entire old memory buffer after step 6.
418 };
419
420 // Step 4
421 Index = static_cast<int32>(Num) - 1;
422 for (; Index > NewCapabilityIndex; --Index)
423 {
425 }
426
427 // Step 5
429 {
431 static_assert(alignof(StorageType) < 0x7F, "Required alignment of capability must fit in 7 bytes");
432
434 StorageType* NewCapabilityTypedPtr = reinterpret_cast<StorageType*>(NewCapabilityPtr);
435
436 static_assert(sizeof(StorageType) <= MAX_uint16, "Can't store a playback capability with a size above 65535 bits. Store it as a raw or shared pointer.");
437 static_assert(alignof(StorageType) <= MAX_uint8, "Can't store a playback capability with an alignment above 255 bits. Store it as a raw or shared pointer.");
438
439 new (NewHeaderPtr) FPlaybackCapabilityHeader(); // Reset to default constructor
440
442 NewHeaderPtr->Sizeof = static_cast<uint16>(sizeof(StorageType));
443 NewHeaderPtr->Alignment = static_cast<uint8>(alignof(StorageType));
444 NewHeaderPtr->StorageMode = FStorageTraits::GetStorageMode();
445 // The pointer offset is whatever we need to add to the capability pointer in order to get
446 // a pointer to capability type itself (in case the storage type is a sub-class of it)
447 // We only need it if the capability object is stored inline inside our memory buffer.
448 NewHeaderPtr->PointerOffset = FStorageTraits::ComputePointerOffset(NewCapabilityTypedPtr);
449
450#if UE_MOVIESCENE_ENTITY_DEBUG
451 // Set the debug pointer.
453#endif
454 }
455 --Index;
456
457 // Step 6
458 for (; Index >= 0; --Index)
459 {
461 }
462
464
465 // Tidy up the old allocation. We do not call destructors here because we relocated everything.
467 {
469 }
470
471 // Insert the helpers for the new capability.
473
474 // Return the new capability pointer. We call the header's Resolve method here because returning
475 // the pointer of the stored capability would return the derived type pointer.
476 // We want the base (capability) pointer.
477 return NewHeaderPtr->Resolve(Memory);
478 }
479
480 template<typename StorageType, typename CapabilityType, typename ...ArgTypes>
482 {
483 if (!ensureMsgf(HasCapability(CapabilityBit), TEXT("The given capability does not exist in this container")))
484 {
485 return false;
486 }
487
488 // Get the header for this capability
491
492 // Check that we are overwriting the same storage mode
494 EPlaybackCapabilityStorageMode GivenStorageMode = FStorageTraits::GetStorageMode();
495 if (!ensureMsgf(GivenStorageMode == Header.StorageMode, TEXT("The given capability storage mode does not match the existing one")))
496 {
497 return false;
498 }
499
500 // Check that the types and alignments match
501 size_t GivenSizeof = sizeof(StorageType);
502 uint16 GivenAlignment = alignof(StorageType);
503 if (!ensureMsgf(
504 (GivenSizeof == Header.Sizeof && GivenAlignment == Header.Alignment),
505 TEXT("The given capability size and alignment do not match the existing one")))
506 {
507 return false;
508 }
509
510 // Don't use the header's Resolve method, we don't want to offset the pointer, we want
511 // the actual pointer to the actual stored capability.
512 void* CapabilityPtr = Header.Capability.Resolve(Memory);
513
514 // Call the destructor on the previous capability, which is important if it was stored inline or as
515 // a shared pointer.
516 Helpers[Index].Destructor(CapabilityPtr);
517
518 // Allocate the new capability.
519 StorageType* TypedCapabilityPtr = reinterpret_cast<StorageType*>(CapabilityPtr);
520 new (TypedCapabilityPtr) StorageType(Forward<ArgTypes>(InArgs)...);
521
522 // If we have inline storage, we could potentially have changed from a stored base-class to
523 // a stored child-class, or vice-versa, or from one child-class to another child-class. In all these
524 // cases, the helper functions (destructor, interface cast, etc) have changed, so let's store the
525 // new helper functions on the header.
527
528#if UE_MOVIESCENE_ENTITY_DEBUG
529 // Update the debug pointer.
530 delete Header.DebugPtr;
532#endif
533
534 return true;
535 }
536
538 {
539 check(Index < Num);
540 return reinterpret_cast<FPlaybackCapabilityHeader*>(Memory)[Index];
541 }
542
544 {
545 check(Index < Num);
546 return reinterpret_cast<FPlaybackCapabilityHeader*>(Memory)[Index];
547 }
548
553
555 {
556 if ( (AllCapabilities & CapabilityBit) == 0)
557 {
558 return INDEX_NONE;
559 }
560 return FMath::CountBits(AllCapabilities & (CapabilityBit-1u));
561 }
562
563 // Schema:
564 // [header_1|...|header_n|entry_0|...|entry_n]
565 uint8* Memory = nullptr;
568 uint8 Num = 0u;
570
571 // Function pointers for invalidating, destroying, etc. capabilities.
573};
574
575namespace Internal
576{
577
579template<typename T, typename = void>
581
583template<typename T>
585 T,
586 std::enable_if_t<
587 std::is_assignable_v<FPlaybackCapabilityID, decltype(T::GetPlaybackCapabilityID())>
588 >>
589{
590 using Type = std::decay_t<decltype(T::GetPlaybackCapabilityID())>;
591
592 static Type Get() { return T::GetPlaybackCapabilityID(); }
593};
594
596template<typename T>
598 T,
599 std::enable_if_t<
600 std::is_assignable_v<FPlaybackCapabilityID, decltype(T::ID)>
601 >>
602{
603 using Type = std::decay_t<decltype(T::ID)>;
604
605 static Type Get() { return T::ID; }
606};
607
608} // namespace Internal
609
614{
616
619
622
624
626 template<typename T>
632
634 template<typename T>
635 T* FindCapability() const
636 {
637 // T must be the base capability type, and not a sub-class, because we are returning a pointer to it,
638 // and we can't check what sort of sub-class we have or not.
640 static_assert(std::is_same<T, typename CapabilityIDType::CapabilityType>::value, "You must pass the actual playback capability type as a template parameter, not a sub-class.");
641
643 uint32 CapabilityBit = 1 << CapabilityID.Index;
645 return Ptr.ResolveOptional<T>();
646 }
647
649 template<typename T>
651 {
652 // T must be the base capability type, and not a sub-class, because we are returning a reference to it,
653 // and we can't check what sort of sub-class we have or not.
655 static_assert(std::is_same<T, typename CapabilityIDType::CapabilityType>::value, "You must pass the actual playback capability type as a template parameter, not a sub-class.");
656
658 uint32 CapabilityBit = 1 << CapabilityID.Index;
660 return Ptr.ResolveChecked<T>();
661 }
662
670 template<typename T, typename ...ArgTypes>
671 T& AddCapability(ArgTypes&&... InArgs)
672 {
674 using CapabilityType = typename CapabilityIDType::CapabilityType;
675
677 return static_cast<T&>(NewCapability);
678 }
679
684 template<typename T, typename U, typename ...ArgTypes>
686 {
688 return static_cast<T&>(NewCapability);
689 }
690
696 template<typename T>
698 {
700 using CapabilityType = typename CapabilityIDType::CapabilityType;
701
703 return static_cast<T&>(NewCapability);
704 }
705
711 template<typename T>
713 {
715 using CapabilityType = typename CapabilityIDType::CapabilityType;
716
718 return static_cast<T&>(NewCapability);
719 }
720
728 template<typename T, typename ...ArgTypes>
730 {
732 using CapabilityType = typename CapabilityIDType::CapabilityType;
733
735 return static_cast<T&>(NewCapability);
736 }
737
742 template<typename T>
744 {
746 using CapabilityType = typename CapabilityIDType::CapabilityType;
747
749 return static_cast<T&>(NewCapability);
750 }
751
756 template<typename T>
765
766public:
767
772
777
778private:
779
780 template<typename Callback, typename ...ArgTypes>
781 void ForEachCapabilityInterface(Callback&& InCallback, ArgTypes&&... InArgs)
782 {
784 for (int32 Index = 0; Index < Headers.Num(); ++Index)
785 {
786 const FPlaybackCapabilityHeader& Header = Headers[Index];
788 check(ThisHelpers.InterfaceCast != nullptr);
789 {
790 void* Ptr = Header.Capability.Resolve(Memory);
791 if (IPlaybackCapability* Interface = (*ThisHelpers.InterfaceCast)(Ptr))
792 {
793 InCallback(*Interface, Forward<ArgTypes>(InArgs)...);
794 }
795 }
796 }
797 }
798
799 template<typename Impl, typename T, typename ...ArgTypes>
800 T& DoAddCapability(TPlaybackCapabilityID<T> CapabilityID, ArgTypes&&... InArgs)
801 {
802 uint32 CapabilityBit = 1 << CapabilityID.Index;
803 FPlaybackCapabilityPtr Ptr = FPlaybackCapabilitiesImpl::AddCapability<Impl, T>(CapabilityBit, Forward<ArgTypes>(InArgs)...);
804 return Ptr.ResolveChecked<T>();
805 }
806
807 template<typename Impl, typename T, typename ...ArgTypes>
808 T& DoOverwriteCapability(TPlaybackCapabilityID<T> CapabilityID, ArgTypes&&... InArgs)
809 {
810 uint32 CapabilityBit = 1 << CapabilityID.Index;
811 FPlaybackCapabilitiesImpl::OverwriteCapability<Impl, T>(CapabilityBit, Forward<ArgTypes>(InArgs)...);
813 }
814
815 void Destroy();
816};
817
818} // namespace UE::MovieScene
OODEFFUNC typedef void(OODLE_CALLBACK t_fp_OodleCore_Plugin_Free)(void *ptr)
constexpr T Align(T Val, uint64 Alignment)
Definition AlignmentTemplates.h:18
constexpr auto MakeArrayView(OtherRangeType &&Other)
Definition ArrayView.h:873
#define check(expr)
Definition AssertionMacros.h:314
#define ensureMsgf( InExpression, InFormat,...)
Definition AssertionMacros.h:465
#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
FPlatformTypes::uint64 uint64
A 64-bit unsigned integer.
Definition Platform.h:1117
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
#define MAX_uint16
Definition NumericLimits.h:20
#define MAX_uint8
Definition NumericLimits.h:19
uint8_t uint8
Definition binka_ue_file_header.h:8
uint16_t uint16
Definition binka_ue_file_header.h:7
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition IMovieScenePlaybackClient.h:25
Definition IMovieScenePlayer.h:90
Definition ArrayView.h:139
UE_FORCEINLINE_HINT constexpr SizeType Num() const
Definition ArrayView.h:380
Definition Array.h:670
void SetNum(SizeType NewNum, EAllowShrinking AllowShrinking=UE::Core::Private::AllowShrinkingByDefault< AllocatorType >())
Definition Array.h:2308
Definition EnableIf.h:20
Definition SharedPointer.h:692
UE_FORCEINLINE_HINT ObjectType * Get() const
Definition SharedPointer.h:1065
Definition SharedPointer.h:153
Definition MovieSceneEntitySystemLinker.h:113
Definition ExpressionParserTypes.h:21
Definition ByteSwap.h:14
Definition Linker.cpp:38
Definition ConstraintsManager.h:14
void(*)(void *Ptr) FPlaybackCapabilityDestructionHelper
Definition MovieScenePlaybackCapabilities.h:77
EPlaybackCapabilityStorageMode
Definition MovieScenePlaybackCapabilities.h:20
IPlaybackCapability *(*)(void *Ptr) FPlaybackCapabilityInterfaceCastHelper
Definition MovieScenePlaybackCapabilities.h:76
U16 Index
Definition radfft.cpp:71
static UE_FORCEINLINE_HINT void * Memmove(void *Dest, const void *Src, SIZE_T Count)
Definition UnrealMemory.h:109
static FORCENOINLINE CORE_API void Free(void *Original)
Definition UnrealMemory.cpp:685
Definition NumericLimits.h:41
Definition PointerIsConvertibleFromTo.h:60
Definition RelativePtr.h:11
T * Resolve(const void *BasePtr) const
Definition RelativePtr.h:34
void Reset(TYPE_OF_NULLPTR)
Definition RelativePtr.h:45
Definition MovieSceneSequenceInstanceHandle.h:15
Definition MovieScenePlaybackCapabilities.h:232
FPlaybackCapabilitiesImpl & operator=(const FPlaybackCapabilitiesImpl &)=delete
FPlaybackCapabilitiesImpl(const FPlaybackCapabilitiesImpl &)=delete
uint8 Num
Definition MovieScenePlaybackCapabilities.h:568
FPlaybackCapabilityPtr AddCapability(uint32 CapabilityBit, ArgTypes &&... InArgs)
Definition MovieScenePlaybackCapabilities.h:277
FPlaybackCapabilitiesImpl & operator=(FPlaybackCapabilitiesImpl &&)=delete
bool HasCapability(uint32 CapabilityBit) const
Definition MovieScenePlaybackCapabilities.h:243
TArray< FPlaybackCapabilityHelpers > Helpers
Definition MovieScenePlaybackCapabilities.h:572
const FPlaybackCapabilityHeader & GetHeader(uint8 Index) const
Definition MovieScenePlaybackCapabilities.h:537
bool OverwriteCapability(uint32 CapabilityBit, ArgTypes &&... InArgs)
Definition MovieScenePlaybackCapabilities.h:481
uint32 AllCapabilities
Definition MovieScenePlaybackCapabilities.h:569
uint16 Alignment
Definition MovieScenePlaybackCapabilities.h:566
uint8 * Memory
Definition MovieScenePlaybackCapabilities.h:565
TArrayView< const FPlaybackCapabilityHeader > GetHeaders() const
Definition MovieScenePlaybackCapabilities.h:549
int32 GetCapabilityIndex(uint32 CapabilityBit) const
Definition MovieScenePlaybackCapabilities.h:554
FPlaybackCapabilityPtr FindCapability(uint32 CapabilityBit) const
Definition MovieScenePlaybackCapabilities.h:248
FPlaybackCapabilityHeader & GetHeader(uint8 Index)
Definition MovieScenePlaybackCapabilities.h:543
FPlaybackCapabilityPtr GetCapabilityChecked(uint32 CapabilityBit) const
Definition MovieScenePlaybackCapabilities.h:260
uint16 Capacity
Definition MovieScenePlaybackCapabilities.h:567
FPlaybackCapabilitiesImpl(FPlaybackCapabilitiesImpl &&)=delete
Definition MovieScenePlaybackCapabilities.h:614
T & OverwriteCapabilityRaw(T *InPointer)
Definition MovieScenePlaybackCapabilities.h:743
void InvalidateCachedData(UMovieSceneEntitySystemLinker *Linker)
Definition MovieScenePlaybackCapabilities.cpp:46
T & OverwriteCapability(ArgTypes &&... InArgs)
Definition MovieScenePlaybackCapabilities.h:729
T & AddCapability(const TPlaybackCapabilityID< U > CapabilityID, ArgTypes &&... InArgs)
Definition MovieScenePlaybackCapabilities.h:685
FPlaybackCapabilities(const FPlaybackCapabilities &)=delete
bool HasCapability() const
Definition MovieScenePlaybackCapabilities.h:627
T & AddCapability(ArgTypes &&... InArgs)
Definition MovieScenePlaybackCapabilities.h:671
FPlaybackCapabilities & operator=(const FPlaybackCapabilities &)=delete
T & AddCapabilityShared(TSharedRef< T > InSharedRef)
Definition MovieScenePlaybackCapabilities.h:712
T & AddCapabilityRaw(T *InPointer)
Definition MovieScenePlaybackCapabilities.h:697
T * FindCapability() const
Definition MovieScenePlaybackCapabilities.h:635
T & OverwriteCapabilityShared(TSharedRef< T > InSharedRef)
Definition MovieScenePlaybackCapabilities.h:757
MOVIESCENE_API ~FPlaybackCapabilities()
Definition MovieScenePlaybackCapabilities.cpp:36
void OnSubInstanceCreated(TSharedRef< const FSharedPlaybackState > Owner, const FInstanceHandle InstanceHandle)
Definition MovieScenePlaybackCapabilities.cpp:41
T & GetCapabilityChecked() const
Definition MovieScenePlaybackCapabilities.h:650
Definition MovieScenePlaybackCapabilities.h:199
TRelativePtr< void, uint16 > Capability
Definition MovieScenePlaybackCapabilities.h:206
EPlaybackCapabilityStorageMode StorageMode
Definition MovieScenePlaybackCapabilities.h:218
FPlaybackCapabilityPtr Resolve(void *InMemory) const
Definition MovieScenePlaybackCapabilities.h:221
uint16 Sizeof
Definition MovieScenePlaybackCapabilities.h:209
uint8 PointerOffset
Definition MovieScenePlaybackCapabilities.h:215
uint8 Alignment
Definition MovieScenePlaybackCapabilities.h:212
Definition MovieScenePlaybackCapabilities.h:142
FPlaybackCapabilityDestructionHelper Destructor
Definition MovieScenePlaybackCapabilities.h:144
FPlaybackCapabilityInterfaceCastHelper InterfaceCast
Definition MovieScenePlaybackCapabilities.h:143
Definition MovieScenePlaybackCapabilities.h:30
EPlaybackCapabilityStorageMode StorageMode
Definition MovieScenePlaybackCapabilities.h:32
T * ResolveOptional() const
Definition MovieScenePlaybackCapabilities.h:35
void * Ptr
Definition MovieScenePlaybackCapabilities.h:31
T & ResolveChecked() const
Definition MovieScenePlaybackCapabilities.h:56
Definition IMovieScenePlaybackCapability.h:78
Definition MovieScenePlaybackCapabilities.h:580
Definition MovieScenePlaybackCapabilities.h:132
static void Destroy(void *Ptr)
Definition MovieScenePlaybackCapabilities.h:133
Definition MovieScenePlaybackCapabilities.h:149
static FPlaybackCapabilityHelpers GetHelpers()
Definition MovieScenePlaybackCapabilities.h:150
Definition IMovieScenePlaybackCapability.h:46
static IPlaybackCapability * InterfaceCast(void *Ptr)
Definition MovieScenePlaybackCapabilities.h:98
static IPlaybackCapability * InterfaceCast(void *Ptr)
Definition MovieScenePlaybackCapabilities.h:114
Definition MovieScenePlaybackCapabilities.h:82
static IPlaybackCapability * InterfaceCast(void *Ptr)
Definition MovieScenePlaybackCapabilities.h:83
static uint8 ComputePointerOffset(CapabilityType **StoragePtr)
Definition MovieScenePlaybackCapabilities.h:184
static EPlaybackCapabilityStorageMode GetStorageMode()
Definition MovieScenePlaybackCapabilities.h:182
static EPlaybackCapabilityStorageMode GetStorageMode()
Definition MovieScenePlaybackCapabilities.h:190
static uint8 ComputePointerOffset(TSharedPtr< CapabilityType > *StoragePtr)
Definition MovieScenePlaybackCapabilities.h:192
Definition MovieScenePlaybackCapabilities.h:161