UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
MovieSceneEntityGroupingSystem.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "Containers/Map.h"
7#include "CoreTypes.h"
17
18#include "MovieSceneEntityGroupingSystem.generated.h"
19
20#define UE_API MOVIESCENE_API
21
23
24namespace UE::MovieScene
25{
26
27struct FAddGroupMutation;
28struct FUpdateGroupsTask;
29
32{
33 template <typename T>
34 auto Requires(T& In) -> decltype(&T::InitializeGroupKeys);
35};
36
61
66{
70
71#if WITH_EDITOR
72 virtual void OnObjectsReplaced(const TMap<UObject*, UObject*>& ReplacementMap) = 0;
73#endif
74};
75
80template<typename GroupingPolicy, typename ComponentIndices, typename ...ComponentTypes>
82
83template<typename GroupingPolicy, typename ...ComponentTypes>
85 : TEntityGroupingHandlerImpl<GroupingPolicy, TMakeIntegerSequence<int, sizeof...(ComponentTypes)>, ComponentTypes...>
86{
92};
93
94
95
96template<typename GroupingPolicy>
98{
99 using GroupKeyType = typename GroupingPolicy::GroupKeyType;
100
102 {
103 int32& GroupIndex = GroupKeyToIndex.FindOrAdd(InGroupKey, INDEX_NONE);
104 if (GroupIndex == INDEX_NONE)
105 {
106 // This group key isn't known to us... let's allocate a new group index for it.
107 // Try to find an available index first. Otherwise use a new high index.
108 GroupIndex = Builder->AllocateGroupIndex();
109 IndexToGroupKey.FindOrAdd(GroupIndex, InGroupKey);
110 }
111 else
112 {
113 // We know this group key, so we'll return the group index we already have
114 // associated with it. We just need to "revive" it in case it was scheduled
115 // for being freed.
116 Builder->ReportUsedGroupIndex(GroupIndex);
117 }
118 return GroupIndex;
119 }
120
121protected:
122
126};
127
128
129
130
131template<typename GroupingPolicy, int ...ComponentIndices, typename ...ComponentTypes>
132struct TEntityGroupingHandlerImpl<GroupingPolicy, TIntegerSequence<int, ComponentIndices...>, ComponentTypes...> : TEntityGroupingHandlerBase<GroupingPolicy>, IEntityGroupingHandler
133{
134 using GroupKeyType = typename GroupingPolicy::GroupKeyType;
135
138
141
147
150 {
151 const FBuiltInComponentTypes* BuiltInComponents = FBuiltInComponentTypes::Get();
152 const FComponentMask& AllocationType = Item.GetAllocationType();
153 const bool bNeedsLink = AllocationType.Contains(BuiltInComponents->Tags.NeedsLink);
154 const bool bNeedsUnlink = AllocationType.Contains(BuiltInComponents->Tags.NeedsUnlink);
156
157 if (bNeedsLink)
158 {
159 VisitLinkedEntities(Item, EntityIDs, GroupIDs, Builder);
160 }
161 else if (bNeedsUnlink)
162 {
163 VisitUnlinkedEntities(Item, EntityIDs, GroupIDs, Builder);
164 }
165 }
166
168 {
170 {
171 const FEntityAllocation* Allocation = Item.GetAllocation();
172 Policy.InitializeGroupKeys(*this, Builder, Item, EntityIDs, GroupIDs, Allocation->ReadComponents(Components.template Get<ComponentIndices>())...);
173 }
174 else
175 {
176 const FEntityAllocation* Allocation = Item.GetAllocation();
177 const int32 Num = Allocation->Num();
178
180
182 Allocation->ReadComponents(Components.template Get<ComponentIndices>())...);
183
184 for (int32 Index = 0; Index < Num; ++Index)
185 {
187 const bool bValidGroupKey = Policy.GetGroupKey(ComponentReaders.template Get<ComponentIndices>()[Index]..., GroupKey);
188
189 const FMovieSceneEntityID EntityID(EntityIDs[Index]);
190 FEntityGroupID& GroupID(GroupIDs[Index]);
191
192 if (bValidGroupKey)
193 {
194 // Find or create the appropriate group and put the entity in it.
195 int32 NewGroupIndex = this->GetOrAllocateGroupIndex(GroupKey, Builder);
197 Builder->AddEntityToGroup(EntityID, NewGroupID);
198 GroupID = NewGroupID;
199 }
200 else
201 {
202 // This entity doesn't belong to any group.
203 // Let's assign an invalid group ID that nonetheless has a valid policy key
204 // pointing to this grouping.
205 GroupID = InvalidGroupID;
206 }
207 }
208 }
209 }
210
212 {
213 const FEntityAllocation* Allocation = Item.GetAllocation();
214 const int32 Num = Allocation->Num();
215
216 for (int32 Index = 0; Index < Num; ++Index)
217 {
218 const FMovieSceneEntityID EntityID(EntityIDs[Index]);
219 FEntityGroupID& GroupID(GroupIDs[Index]);
220
221 if (GroupID.HasGroup())
222 {
223 Builder->RemoveEntityFromGroup(EntityID, GroupID);
224 // Leave the GroupID on the entity so that downstream systems can use it to track
225 // that this entity is leaving its group, but flag it so we don't re-free it.
228 }
229 }
230 }
231
232 virtual void OnGroupIndexFreed(int32 GroupIndex) override
233 {
234 GroupKeyType Key = this->IndexToGroupKey.FindChecked(GroupIndex);
235 ensure(this->IndexToGroupKey.Remove(GroupIndex) == 1);
236 ensure(this->GroupKeyToIndex.Remove(Key) == 1);
237 }
238
239#if WITH_EDITOR
240 virtual void OnObjectsReplaced(const TMap<UObject*, UObject*>& ReplacementMap) override
241 {
242 // Get a list of keys that contain replaced objects.
244 for (const TPair<GroupKeyType, int32>& Pair : this->GroupKeyToIndex)
245 {
246 GroupKeyType NewKey = Pair.Key;
247 if (Policy.OnObjectsReplaced(NewKey, ReplacementMap))
248 {
249 ReplacedKeys.Add(Pair.Key, NewKey);
250 }
251 }
252 // Replace the keys but keep the group indices.
254 {
255 int32 GroupIndex;
256 const bool bRemoved = this->GroupKeyToIndex.RemoveAndCopyValue(Pair.Key, GroupIndex);
257 if (ensure(bRemoved))
258 {
259 this->GroupKeyToIndex.Add(Pair.Value, GroupIndex);
260 this->IndexToGroupKey.Add(GroupIndex, Pair.Value);
261 }
262 }
263 }
264#endif
265};
266
267namespace Private
268{
269 template<typename T>
271 {
272 return false;
273 }
274
275 template<typename T>
277 {
278 UObject* CurrentObject = InOutElem;
279 if (UObject* const* NewObject = ReplacementMap.Find(CurrentObject))
280 {
282 return true;
283 }
284 return false;
285 }
286}
287
291template<typename... ComponentTypes>
293{
294 using GroupKeyType = TTuple<ComponentTypes...>;
295
297 {
299 return true;
300 }
301
303 {
304 bool bReplaced = false;
305 VisitTupleElements([&ReplacementMap, &bReplaced](auto& InElem)
306 {
308 },
309 InOutKey);
310 return bReplaced;
311 }
312};
313
314} // namespace UE::MovieScene
315
316
317UCLASS(MinimalAPI)
319{
320public:
321
326
328
330
359 template<typename GroupingPolicy, typename ...ComponentTypes>
364
365 template<typename GroupingPolicy, typename ...ComponentTypes>
367 {
368 using namespace UE::MovieScene;
369
371
372 static_assert(sizeof(NewGroupHandlerType) <= 256, "Handler type too big! Please increase the TInlineValue size.");
373
374 const int32 HandlerIndex = GroupHandlers.Emplace();
375 FEntityGroupingHandlerInfo& HandlerInfo = GroupHandlers[HandlerIndex];
377 HandlerInfo.ComponentFilter = MoveTemp(InComponentFilter);
378 HandlerInfo.ComponentFilter.All({ InComponents... });
379
381 return NewPolicyKey;
382 }
383
387 template<typename ...ComponentTypes>
393
397 UE_API void RemoveGrouping(FEntityGroupingPolicyKey InPolicyKey);
398
403 UE_API int32 AllocateGroupIndex(FEntityGroupingPolicyKey InPolicy);
404
405
410 {
411 return AllocatedGroupIndices.GetMaxIndex();
412 }
413
414 void FreeEmptyGroups();
415
416private:
417
418 virtual bool IsRelevantImpl(UMovieSceneEntitySystemLinker* InLinker) const override;
419 virtual void OnRun(FSystemTaskPrerequisites& InPrerequisites, FSystemSubsequentTasks& Subsequents) override;
420 virtual void OnLink() override;
421 virtual void OnUnlink() override;
422 virtual void OnCleanTaggedGarbage() override;
423
424 void ProcessModifiedGroups();
425
426#if WITH_EDITOR
427 void OnObjectsReplaced(const TMap<UObject*, UObject*>& ReplacementMap);
428#endif
429
430private:
431
432
434 TSparseArray<FEntityGroupingPolicyKey> AllocatedGroupIndices;
435
436 struct FEntityGroupInfo
437 {
438 int32 NumEntities = 0;
439 };
440
442
443 TSparseArray<FEntityGroupID> EntityIDToGroup;
444
446 TBitArray<> EmptyGroupIndices;
447
448 struct FEntityGroupingHandlerInfo
449 {
452 };
453
455
459};
460
461
462#undef UE_API
#define ensure( InExpression)
Definition AssertionMacros.h:464
@ INDEX_NONE
Definition CoreMiscDefines.h:150
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
constexpr bool EnumHasAllFlags(Enum Flags, Enum Contains)
Definition EnumClassFlags.h:28
typename UE4IntegerSequence_Private::TMakeIntegerSequenceImpl< T, N >::Type TMakeIntegerSequence
Definition IntegerSequence.h:31
@ Num
Definition MetalRHIPrivate.h:234
#define UE_API
Definition MovieSceneEntityGroupingSystem.h:20
#define GENERATED_BODY(...)
Definition ObjectMacros.h:765
#define UCLASS(...)
Definition ObjectMacros.h:776
#define UE_API
Definition SColorGradingComponentViewer.h:12
constexpr TTuple< std::decay_t< Types >... > MakeTuple(Types &&... Args)
Definition Tuple.h:794
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 UObjectGlobals.h:1292
Definition EnableIf.h:20
Definition InlineValue.h:22
Definition UnrealString.h.inl:34
Definition SparseArray.h:524
Definition MovieSceneEntityGroupingSystem.h:319
FEntityGroupingPolicyKey AddGrouping(GroupingPolicy &&InPolicy, UE::MovieScene::FEntityComponentFilter &&InComponentFilter, TComponentTypeID< ComponentTypes >... InComponents)
Definition MovieSceneEntityGroupingSystem.h:366
int32 NumGroups() const
Definition MovieSceneEntityGroupingSystem.h:409
FEntityGroupingPolicyKey AddGrouping(TComponentTypeID< ComponentTypes >... InComponents)
Definition MovieSceneEntityGroupingSystem.h:388
Definition MovieSceneEntitySystemLinker.h:113
Definition MovieSceneEntitySystem.h:62
Definition Object.h:95
Definition OverriddenPropertySet.cpp:45
bool ReplaceGroupKeyObjectElement(T &&InElem, const TMap< UObject *, UObject * > &ReplacementMap)
Definition MovieSceneEntityGroupingSystem.h:270
Definition ConstraintsManager.h:14
U16 Index
Definition radfft.cpp:71
TCallTraitsParamTypeHelper< T, PassByValue >::ParamType ParamType
Definition UnrealTypeTraits.h:275
Definition IntegerSequence.h:9
Definition Tuple.h:652
Definition MovieSceneEntityGroupingSystem.h:32
auto Requires(T &In) -> decltype(&T::InitializeGroupKeys)
Definition MovieSceneEntityGroupingSystem.cpp:106
Definition BuiltInComponentTypes.h:578
struct UE::MovieScene::FBuiltInComponentTypes::@1489 Tags
FComponentTypeID NeedsLink
Definition BuiltInComponentTypes.h:789
static MOVIESCENE_API FBuiltInComponentTypes * Get()
Definition BuiltInComponentTypes.cpp:667
FComponentTypeID NeedsUnlink
Definition BuiltInComponentTypes.h:790
Definition MovieSceneEntityIDs.h:40
bool Contains(FComponentTypeID InComponentType) const
Definition MovieSceneEntityIDs.h:429
Definition MovieSceneEntitySystemTypes.h:977
MOVIESCENE_API const FComponentMask & GetAllocationType() const
Definition MovieSceneEntitySystemTypes.cpp:154
MOVIESCENE_API const FEntityAllocation * GetAllocation() const
Definition MovieSceneEntitySystemTypes.cpp:144
Definition MovieSceneEntitySystemTypes.h:624
TComponentLock< TRead< T > > ReadComponents(TComponentTypeID< T > ComponentType) const
Definition MovieSceneEntitySystemTypes.h:877
int32 Num() const
Definition MovieSceneEntitySystemTypes.h:813
Definition MovieSceneEntitySystemTypes.h:295
Definition MovieSceneEntityGroupingSystem.h:41
FEntityGroupID MakeInvalidGroupID() const
Definition MovieSceneEntityGroupingSystem.h:47
UE_API void ReportUsedGroupIndex(int32 GroupIndex)
Definition MovieSceneEntityGroupingSystem.cpp:91
UE_API void RemoveEntityFromGroup(const FMovieSceneEntityID &InEntity, const FEntityGroupID &InPreviousGroupID)
Definition MovieSceneEntityGroupingSystem.cpp:51
UE_API int32 AllocateGroupIndex()
Definition MovieSceneEntityGroupingSystem.cpp:99
UE_API void AddEntityToGroup(const FMovieSceneEntityID &InEntity, const FEntityGroupID &InNewGroupID)
Definition MovieSceneEntityGroupingSystem.cpp:25
FEntityGroupID MakeGroupID(int32 GroupIndex) const
Definition MovieSceneEntityGroupingSystem.h:45
Definition BuiltInComponentTypes.h:534
EEntityGroupFlags Flags
Definition BuiltInComponentTypes.h:539
bool HasGroup() const
Definition BuiltInComponentTypes.h:558
Definition BuiltInComponentTypes.h:495
Definition MovieSceneEntityIDs.h:302
Definition MovieSceneSystemTaskDependencies.h:98
Definition MovieSceneSystemTaskDependencies.h:29
Definition MovieSceneEntityGroupingSystem.cpp:155
Definition MovieSceneEntityGroupingSystem.h:66
virtual ~IEntityGroupingHandler()
Definition MovieSceneEntityGroupingSystem.h:67
virtual void ProcessAllocation(FEntityAllocationIteratorItem Item, FReadEntityIDs EntityIDs, TWrite< FEntityGroupID > GroupIDs, FEntityGroupBuilder *Builder)=0
virtual void OnGroupIndexFreed(int32 InGroupIndex)
Definition MovieSceneEntityGroupingSystem.h:69
Definition MovieSceneEntityIDs.h:283
Definition MovieSceneEntityGroupingSystem.h:98
int32 GetOrAllocateGroupIndex(typename TCallTraits< GroupKeyType >::ParamType InGroupKey, FEntityGroupBuilder *Builder)
Definition MovieSceneEntityGroupingSystem.h:101
TMap< int32, GroupKeyType > IndexToGroupKey
Definition MovieSceneEntityGroupingSystem.h:125
typename GroupingPolicy::GroupKeyType GroupKeyType
Definition MovieSceneEntityGroupingSystem.h:99
TMap< GroupKeyType, int32 > GroupKeyToIndex
Definition MovieSceneEntityGroupingSystem.h:124
void VisitLinkedEntities(FEntityAllocationIteratorItem Item, FReadEntityIDs EntityIDs, TWrite< FEntityGroupID > GroupIDs, FEntityGroupBuilder *Builder)
Definition MovieSceneEntityGroupingSystem.h:167
typename GroupingPolicy::GroupKeyType GroupKeyType
Definition MovieSceneEntityGroupingSystem.h:134
void VisitUnlinkedEntities(FEntityAllocationIteratorItem Item, FReadEntityIDs EntityIDs, TWrite< FEntityGroupID > GroupIDs, FEntityGroupBuilder *Builder)
Definition MovieSceneEntityGroupingSystem.h:211
virtual void ProcessAllocation(FEntityAllocationIteratorItem Item, FReadEntityIDs EntityIDs, TWrite< FEntityGroupID > GroupIDs, FEntityGroupBuilder *Builder) override
Definition MovieSceneEntityGroupingSystem.h:149
TTuple< TComponentTypeID< ComponentTypes >... > Components
Definition MovieSceneEntityGroupingSystem.h:140
TEntityGroupingHandlerImpl(GroupingPolicy &&InPolicy, TComponentTypeID< ComponentTypes >... InComponents)
Definition MovieSceneEntityGroupingSystem.h:142
virtual void OnGroupIndexFreed(int32 GroupIndex) override
Definition MovieSceneEntityGroupingSystem.h:232
Definition MovieSceneEntityGroupingSystem.h:81
Definition MovieSceneEntityGroupingSystem.h:86
TEntityGroupingHandler(GroupingPolicy &&InPolicy, TComponentTypeID< ComponentTypes >... InComponents)
Definition MovieSceneEntityGroupingSystem.h:87
Definition MovieSceneComponentPtr.h:195
Definition MovieSceneEntityGroupingSystem.h:293
bool OnObjectsReplaced(GroupKeyType &InOutKey, const TMap< UObject *, UObject * > &ReplacementMap)
Definition MovieSceneEntityGroupingSystem.h:302
bool GetGroupKey(ComponentTypes... InComponents, GroupKeyType &OutGroupKey)
Definition MovieSceneEntityGroupingSystem.h:296
Definition MovieSceneComponentPtr.h:288