UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
MovieSceneEntityBuilder.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
12
13#include <initializer_list>
14
15
16namespace UE
17{
18namespace MovieScene
19{
20
21struct FAdd;
22struct FAddMany;
23struct FAddConditional;
24
25template<typename T> struct TAdd;
26template<typename T> struct TAddConditional;
27
28template <typename... T> struct TEntityBuilder;
29template <typename... T> struct TEntityBuilderImpl;
30
35{
38
39 bool bRemoveAll = false;
40
44 FTypelessMutation& Add(std::initializer_list<FComponentTypeID> TypeIDs)
45 {
46 AddMask.SetAll(TypeIDs);
47 return *this;
48 }
49
53 FTypelessMutation& Remove(std::initializer_list<FComponentTypeID> TypeIDs)
54 {
55 RemoveMask.SetAll(TypeIDs);
56 return *this;
57 }
58
63 {
64 bRemoveAll = true;
65 return *this;
66 }
67
72};
73
74
76{
77 virtual ~IEntityBuilder() {}
78
79 virtual FMovieSceneEntityID Create(FEntityManager* EntityManager) = 0;
80 virtual void GenerateType(FEntityManager* EntityManager, FComponentMask& OutMask, bool& OutAddMutualComponents) = 0;
81 virtual void Initialize(FEntityManager* EntityManager, const FEntityInfo& EntityInfo) = 0;
82};
83
84
111template<typename... T>
112struct TEntityBuilder : TEntityBuilderImpl<TMakeIntegerSequence<int, sizeof...(T)>, T...>
113{
114 using Super = TEntityBuilderImpl<TMakeIntegerSequence<int, sizeof...(T)>, T...>;
115
117 {
118 static_assert(sizeof...(T) == 0, "Default construction is only supported for TEntityBuilder<>");
119 }
120
121 template<typename... Args>
123 : Super(Forward<Args>(InTypes)...)
124 {}
125};
126
127
128template<>
130{
137 TEntityBuilder< FAdd > AddDefaulted(FComponentTypeID ComponentType);
138
146
154
162 template<typename U, typename PayloadType>
163 TEntityBuilder< TAdd<U> > Add(TComponentTypeID<U> ComponentType, PayloadType&& InPayload);
164
173 template<typename U, typename PayloadType>
174 TEntityBuilder< TAddConditional<U> > AddConditional(TComponentTypeID<U> ComponentType, PayloadType&& InPayload, bool bCondition);
175
183 TEntityBuilder< FAddConditional > AddDefaultedConditional(FComponentTypeID ComponentType, bool bCondition);
184
192 TEntityBuilder< FAddConditional > AddTagConditional(FComponentTypeID TagType, bool bCondition);
193
199 template<typename U>
201};
202
204{
214 {
215 bool bLocalAddMutualComponents = false;
216 GenerateType(EntityManager, NewType, bLocalAddMutualComponents);
217
219 FEntityAllocationWriteContext WriteContext(*EntityManager);
221
222 EntityManager->GetComponents()->Factories.ComputeMutuallyInclusiveComponents(MutualTypes, NewType, MutualInitializers);
223
224 FEntityInfo Entry = EntityManager->AllocateEntity(NewType);
225 Initialize(EntityManager, Entry);
226
227 // Run mutual initializers after the builder has actually constructed the entity
228 // otherwise mutual components would be reading garbage
229 MutualInitializers.Execute(Entry.Data.AsRange(), WriteContext);
230
231 return Entry.EntityID;
232 }
233};
234
235template <typename... T, int... Indices>
237{
238 virtual FMovieSceneEntityID Create(FEntityManager* EntityManager) override final
239 {
240 return CreateEntity(EntityManager);
241 }
242
243 virtual void GenerateType(FEntityManager* EntityManager, FComponentMask& OutMask, bool& OutAddMutualComponents) override final
244 {
245 VisitTupleElements([&OutMask](auto& In){ In.AccumulateMask(OutMask); }, this->Payload);
246
247 if (bAddMutualComponents)
248 {
250 }
251 }
252
253 virtual void Initialize(FEntityManager* EntityManager, const FEntityInfo& Entity) override final
254 {
255 if (Entity.Data.Allocation != nullptr)
256 {
257 VisitTupleElements([Entity](auto& In){ In.Apply(Entity.Data.Allocation, Entity.Data.ComponentOffset); }, this->Payload);
258 }
259 }
260
262
272 {
273 FMovieSceneEntityID NewEntityID = CreateEntity(EntityManager, NewType);
274 EntityManager->ReplaceEntityID(InOutEntityID, NewEntityID);
275 }
276
277
287 {
288 FComponentMask OldMask = EntityManager->GetEntityType(EntityID);
289 FComponentMask NewMask = Base.MutateType(OldMask);
290
291 VisitTupleElements([&NewMask](auto& In){ In.AccumulateMask(NewMask); }, this->Payload);
292
294 FEntityAllocationWriteContext WriteContext(*EntityManager);
295
297 EntityManager->GetComponents()->Factories.ComputeMutuallyInclusiveComponents(MutualTypes, NewMask, MutualInitializers);
298
299 if (!NewMask.CompareSetBits(OldMask))
300 {
301 EntityManager->ChangeEntityType(EntityID, NewMask);
302 }
303
304 FEntityInfo Entry = EntityManager->GetEntity(EntityID);
305
306 if (Entry.Data.Allocation != nullptr)
307 {
308 VisitTupleElements([Entry](auto& In){ In.Apply(Entry.Data.Allocation, Entry.Data.ComponentOffset); }, this->Payload);
309
310 // Run mutual initializers after the builder has actually constructed the entity
311 // otherwise mutual components would be reading garbage
312 MutualInitializers.Execute(Entry.Data.AsRange(), WriteContext);
313 }
314 }
315
325 {
326 if (InOutEntityID)
327 {
328 MutateExisting(EntityManager, InOutEntityID, Base);
329 }
330 else
331 {
332 InOutEntityID = CreateEntity(EntityManager, Base.AddMask);
333 }
334 }
335
342 TEntityBuilder<T..., FAdd > AddDefaulted(FComponentTypeID ComponentType);
343
351
359
367 template<typename U, typename PayloadType>
368 TEntityBuilder<T..., TAdd<U> > Add(TComponentTypeID<U> ComponentType, PayloadType&& InPayload);
369
378 template<typename U, typename PayloadType>
379 TEntityBuilder<T..., TAddConditional<U> > AddConditional(TComponentTypeID<U> ComponentType, PayloadType&& InPayload, bool bCondition);
380
388 TEntityBuilder< T..., FAddConditional > AddDefaultedConditional(FComponentTypeID ComponentType, bool bCondition);
389
397 TEntityBuilder<T..., FAddConditional > AddTagConditional(FComponentTypeID TagType, bool bCondition);
398
399
405 template<typename U>
406 TEntityBuilder<T..., U > Append(U&& InOther);
407
408
412 TEntityBuilder<T...> AddMutualComponents();
413
414protected:
415
417 : Payload(MoveTemp(InArgs)...)
418 , bAddMutualComponents(bInAddMutualComponents)
419 {}
420
423
425};
426
427
429
430
433{
438
443
444 void Apply(FEntityAllocation* Allocation, int32 ComponentOffset)
445 {
446 }
447};
448
449
451struct FAdd
452{
457
459 {
461 }
462
463 void Apply(FEntityAllocation* Allocation, int32 ComponentOffset)
464 {
465 }
466};
467
470{
473
478
480 {
481 if (bCondition)
482 {
484 }
485 }
486
487 void Apply(FEntityAllocation* Allocation, int32 ComponentOffset)
488 {
489 }
490};
491
493template<typename T>
494struct TAdd : FAdd
495{
497
498 template<typename PayloadType>
503
504 void Apply(FEntityAllocation* Allocation, int32 ComponentOffset)
505 {
507 check(!Header.IsTag());
508
510
511 T* ComponentPtr = static_cast<T*>(Header.GetValuePtr(ComponentOffset));
512 *ComponentPtr = MoveTemp(Payload.GetValue());
513 Payload.Reset();
514 }
515};
516
518template<typename T>
520{
522
523 template<typename PayloadType>
528
529 void Apply(FEntityAllocation* Allocation, int32 ComponentOffset)
530 {
531 if (bCondition)
532 {
534 check(!Header.IsTag());
535
537
538 T* ComponentPtr = static_cast<T*>(Header.GetValuePtr(ComponentOffset));
539 *ComponentPtr = MoveTemp(Payload.GetValue());
540 Payload.Reset();
541 }
542 }
543};
544
567
569{
570 return TEntityBuilder< FAdd >( FAdd(ComponentType), false );
571}
572
577
582
587
592
593template<typename U, typename PayloadType>
598
599template<typename U, typename PayloadType>
600inline TEntityBuilder< TAddConditional<U> > TEntityBuilderImpl<TIntegerSequence<int>>::AddConditional(TComponentTypeID<U> ComponentType, PayloadType&& InPayload, bool bCondition)
601{
603}
604
605template <typename U>
610
611
612
613template <typename... T, int... Indices>
614TEntityBuilder<T..., FAdd > TEntityBuilderImpl<TIntegerSequence<int, Indices...>, T...>::AddDefaulted(FComponentTypeID ComponentType)
615{
616 return TEntityBuilder<T..., FAdd >(MoveTemp(Payload.template Get<Indices>())..., FAdd(ComponentType), bAddMutualComponents );
617}
618
619template <typename... T, int... Indices>
621{
622 return TEntityBuilder<T..., FAddMany >( FAddMany(InComponentsToAdd), bAddMutualComponents );
623}
624
625template <typename... T, int... Indices>
627{
628 return TEntityBuilder<T..., FAdd >(MoveTemp(Payload.template Get<Indices>())..., FAdd(TagType), bAddMutualComponents );
629}
630
631template <typename... T, int... Indices>
632template<typename U, typename PayloadType>
633TEntityBuilder<T..., TAdd<U> > TEntityBuilderImpl<TIntegerSequence<int, Indices...>, T...>::Add(TComponentTypeID<U> ComponentType, PayloadType&& InPayload)
634{
635 return TEntityBuilder<T..., TAdd<U> >(MoveTemp(Payload.template Get<Indices>())..., TAdd<U>(ComponentType, Forward<PayloadType>(InPayload)), bAddMutualComponents );
636}
637
638template <typename... T, int... Indices>
639template<typename U, typename PayloadType>
640TEntityBuilder<T..., TAddConditional<U> > TEntityBuilderImpl<TIntegerSequence<int, Indices...>, T...>::AddConditional(TComponentTypeID<U> ComponentType, PayloadType&& InPayload, bool bCondition)
641{
642 return TEntityBuilder<T..., TAddConditional<U> >(MoveTemp(Payload.template Get<Indices>())..., TAddConditional<U>(ComponentType, Forward<PayloadType>(InPayload), bCondition), bAddMutualComponents );
643}
644
645template <typename... T, int... Indices>
646TEntityBuilder<T..., FAddConditional > TEntityBuilderImpl<TIntegerSequence<int, Indices...>, T...>::AddDefaultedConditional(FComponentTypeID TagType, bool bCondition)
647{
648 return TEntityBuilder<T..., FAddConditional >(MoveTemp(Payload.template Get<Indices>())..., FAddConditional(TagType, bCondition), bAddMutualComponents );
649}
650
651template <typename... T, int... Indices>
652TEntityBuilder<T..., FAddConditional > TEntityBuilderImpl<TIntegerSequence<int, Indices...>, T...>::AddTagConditional(FComponentTypeID TagType, bool bCondition)
653{
654 return TEntityBuilder<T..., FAddConditional >(MoveTemp(Payload.template Get<Indices>())..., FAddConditional(TagType, bCondition), bAddMutualComponents );
655}
656
657template <typename... T, int... Indices>
658template<typename U>
660{
661 return TEntityBuilder< T..., U >(MoveTemp(Payload.template Get<Indices>())..., MoveTemp(InOther), bAddMutualComponents );
662}
663
664template <typename... T, int... Indices>
665TEntityBuilder<T...> TEntityBuilderImpl<TIntegerSequence<int, Indices...>, T...>::AddMutualComponents()
666{
667 return TEntityBuilder<T... >(MoveTemp(Payload.template Get<Indices>())..., true );
668}
669
670} // namespace MovieScene
671} // namespace UE
#define check(expr)
Definition AssertionMacros.h:314
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
void RemoveAll(const TUniqueFunction< bool(const FDependsNode *)> &ShouldRemove, TArray< FDependsNode * > &Dependencies, TBitArray<> *FlagBits, bool IsSorted, EAllowShrinking ShrinkPolicy)
Definition DependsNode.cpp:614
return true
Definition ExternalRpcRegistry.cpp:601
typename UE4IntegerSequence_Private::TMakeIntegerSequenceImpl< T, N >::Type TMakeIntegerSequence
Definition IntegerSequence.h:31
UE_FORCEINLINE_HINT void VisitTupleElements(FuncType &&Func, FirstTupleType &&FirstTuple, TupleTypes &&... Tuples)
Definition Tuple.h:878
UE_INTRINSIC_CAST UE_REWRITE constexpr std::remove_reference_t< T > && MoveTemp(T &&Obj) noexcept
Definition UnrealTemplate.h:520
Definition MovieScene.Build.cs:6
Definition MovieSceneEntityManager.h:81
EMutuallyInclusiveComponentType
Definition MovieSceneEntitySystemTypes.h:100
Definition AdvancedWidgetsModule.cpp:13
@ false
Definition radaudio_common.h:23
Definition IntegerSequence.h:9
Definition Optional.h:131
constexpr OptionalType & GetValue()
Definition Optional.h:443
void Reset()
Definition Optional.h:306
Definition Tuple.h:652
Definition MovieSceneEntityBuilder.h:470
FComponentTypeID ComponentTypeID
Definition MovieSceneEntityBuilder.h:471
bool bCondition
Definition MovieSceneEntityBuilder.h:472
void Apply(FEntityAllocation *Allocation, int32 ComponentOffset)
Definition MovieSceneEntityBuilder.h:487
void AccumulateMask(FComponentMask &OutMask) const
Definition MovieSceneEntityBuilder.h:479
FAddConditional(FComponentTypeID InComponentTypeID, bool bInCondition)
Definition MovieSceneEntityBuilder.h:474
Definition MovieSceneEntityBuilder.h:433
void Apply(FEntityAllocation *Allocation, int32 ComponentOffset)
Definition MovieSceneEntityBuilder.h:444
FComponentMask BaseComponentMask
Definition MovieSceneEntityBuilder.h:434
FAddMany(const FComponentMask &InBaseComponentMask)
Definition MovieSceneEntityBuilder.h:435
void AccumulateMask(FComponentMask &OutMask) const
Definition MovieSceneEntityBuilder.h:439
Definition MovieSceneEntityBuilder.h:452
FComponentTypeID ComponentTypeID
Definition MovieSceneEntityBuilder.h:453
void AccumulateMask(FComponentMask &OutMask) const
Definition MovieSceneEntityBuilder.h:458
void Apply(FEntityAllocation *Allocation, int32 ComponentOffset)
Definition MovieSceneEntityBuilder.h:463
FAdd(FComponentTypeID InComponentTypeID)
Definition MovieSceneEntityBuilder.h:454
Definition MovieSceneEntitySystemTypes.h:460
Definition MovieSceneEntityIDs.h:40
FComponentMask & CombineWithBitwiseAND(const FComponentMask &Other, EBitwiseOperatorFlags InFlags)
Definition MovieSceneEntityIDs.h:88
void SetAll(std::initializer_list< FComponentTypeID > InComponentTypes)
Definition MovieSceneEntityIDs.h:454
FComponentMask & CombineWithBitwiseOR(const FComponentMask &Other, EBitwiseOperatorFlags InFlags)
Definition MovieSceneEntityIDs.h:76
int32 Num() const
Definition MovieSceneEntityIDs.h:147
static FComponentMask BitwiseNOT(const FComponentMask &A)
Definition MovieSceneEntityIDs.h:115
Definition MovieSceneEntityIDs.h:174
Definition MovieSceneEntitySystemTypes.h:425
static FEntityAllocationWriteContext NewAllocation()
Definition MovieSceneEntitySystemTypes.h:428
Definition MovieSceneEntitySystemTypes.h:624
const FComponentHeader & GetComponentHeaderChecked(FComponentTypeID ComponentTypeID) const
Definition MovieSceneEntitySystemTypes.h:714
EComponentHeaderLockMode GetCurrentLockMode() const
Definition MovieSceneEntitySystemTypes.h:848
Definition MovieSceneEntityBuilder.h:204
FMovieSceneEntityID CreateEntity(FEntityManager *EntityManager, FComponentMask NewType=FComponentMask())
Definition MovieSceneEntityBuilder.h:213
FEntityRange AsRange() const
Definition MovieSceneEntitySystemTypes.h:1057
FEntityAllocation * Allocation
Definition MovieSceneEntitySystemTypes.h:1054
int32 ComponentOffset
Definition MovieSceneEntitySystemTypes.h:1055
Definition MovieSceneEntitySystemTypes.h:1064
FMovieSceneEntityID EntityID
Definition MovieSceneEntitySystemTypes.h:1066
FEntityDataLocation Data
Definition MovieSceneEntitySystemTypes.h:1065
Definition MovieSceneEntityIDs.h:302
Definition MovieSceneMutualComponentInclusivity.h:106
Definition MovieSceneEntitySystemTypes.h:587
Definition MovieSceneEntityBuilder.h:35
FTypelessMutation & Remove(std::initializer_list< FComponentTypeID > TypeIDs)
Definition MovieSceneEntityBuilder.h:53
FComponentMask AddMask
Definition MovieSceneEntityBuilder.h:36
FTypelessMutation & Add(std::initializer_list< FComponentTypeID > TypeIDs)
Definition MovieSceneEntityBuilder.h:44
FTypelessMutation & RemoveAll()
Definition MovieSceneEntityBuilder.h:62
FComponentMask MutateType(const FComponentMask &Current) const
Definition MovieSceneEntityBuilder.h:545
FComponentMask RemoveMask
Definition MovieSceneEntityBuilder.h:37
bool bRemoveAll
Definition MovieSceneEntityBuilder.h:39
Definition MovieSceneEntityBuilder.h:76
virtual void Initialize(FEntityManager *EntityManager, const FEntityInfo &EntityInfo)=0
virtual ~IEntityBuilder()
Definition MovieSceneEntityBuilder.h:77
virtual void GenerateType(FEntityManager *EntityManager, FComponentMask &OutMask, bool &OutAddMutualComponents)=0
virtual FMovieSceneEntityID Create(FEntityManager *EntityManager)=0
Definition MovieSceneEntityBuilder.h:520
TOptional< T > Payload
Definition MovieSceneEntityBuilder.h:521
void Apply(FEntityAllocation *Allocation, int32 ComponentOffset)
Definition MovieSceneEntityBuilder.h:529
TAddConditional(TComponentTypeID< T > ComponentTypeID, PayloadType &&InPayload, bool bInCondition)
Definition MovieSceneEntityBuilder.h:524
Definition MovieSceneEntityBuilder.h:495
TAdd(TComponentTypeID< T > InComponentTypeID, PayloadType &&InPayload)
Definition MovieSceneEntityBuilder.h:499
TOptional< T > Payload
Definition MovieSceneEntityBuilder.h:496
void Apply(FEntityAllocation *Allocation, int32 ComponentOffset)
Definition MovieSceneEntityBuilder.h:504
Definition MovieSceneEntityIDs.h:283
void MutateExisting(FEntityManager *EntityManager, FMovieSceneEntityID EntityID, const FTypelessMutation &Base=FTypelessMutation())
Definition MovieSceneEntityBuilder.h:286
TEntityBuilderImpl(T &&... InArgs, bool bInAddMutualComponents)
Definition MovieSceneEntityBuilder.h:416
virtual void Initialize(FEntityManager *EntityManager, const FEntityInfo &Entity) override final
Definition MovieSceneEntityBuilder.h:253
virtual FMovieSceneEntityID Create(FEntityManager *EntityManager) override final
Definition MovieSceneEntityBuilder.h:238
virtual void GenerateType(FEntityManager *EntityManager, FComponentMask &OutMask, bool &OutAddMutualComponents) override final
Definition MovieSceneEntityBuilder.h:243
void CreateOrUpdate(FEntityManager *EntityManager, FMovieSceneEntityID &InOutEntityID, const FTypelessMutation &Base=FTypelessMutation().RemoveAll())
Definition MovieSceneEntityBuilder.h:324
void ReplaceEntity(FEntityManager *EntityManager, FMovieSceneEntityID &InOutEntityID, FComponentMask NewType=FComponentMask())
Definition MovieSceneEntityBuilder.h:271
TTuple< T... > Payload
Definition MovieSceneEntityBuilder.h:422
Definition MovieSceneEntityBuilder.h:29
Definition MovieSceneEntityBuilder.h:113
TEntityBuilder()
Definition MovieSceneEntityBuilder.h:116
TEntityBuilder(Args &&... InTypes)
Definition MovieSceneEntityBuilder.h:122