UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
MassEntityBuilder.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
7#include "MassEntityHandle.h"
8#include "MassEntityTypes.h"
10#include "MassTypeManager.h"
11
12#define UE_API MASSENTITY_API
13
15
16namespace UE::Mass
17{
18 struct FTypeHandle;
19 namespace Private
20 {
21 struct FEntityBuilderHelper;
22 }
23
61{
64
67
70
73
76
79
82 , const FMassArchetypeCompositionDescriptor& Composition
84 , TConstArrayView<FConstSharedStruct> ConstSharedFragments = {}
85 , TConstArrayView<FSharedStruct> SharedFragments = {});
86
91 , TArray<FConstSharedStruct>&& ConstSharedFragments
92 , TArray<FSharedStruct>&& SharedFragments);
93
99
106
108 UE_API void Reprepare();
109
114 UE_API void Reset(const bool bReleaseEntityHandleIfReserved = true);
115
123
130
137
145 template<typename T, typename... TArgs>
146 T& Add_GetRef(TArgs&&... InArgs) requires (CElement<T> && !(CTag<T> || CChunkFragment<T>));
147
153 template<typename T, typename... TArgs>
154 T& GetOrCreate(TArgs&&... InArgs) requires (CElement<T> && !(CTag<T> || CChunkFragment<T>));
155
160 template<CTag T>
162
167 template<CChunkFragment T>
169
174 template<typename T, typename... TArgs>
175 FEntityBuilder& Add(TArgs&&... InArgs) requires (CElement<T> && !(CTag<T> || CChunkFragment<T>));
176
182
185
193
200
202 template<UE::Mass::CRelation T>
204
211 UE_API void ForEachRelation(const TFunctionRef<bool(FPendingRelationParams&)>& Operator);
212
218 template<typename T>
219 T* Find() requires (CElement<T> && !(CTag<T> || CChunkFragment<T>));
220
227
230
232
234 bool IsValid() const;
235
237 bool HasReservedEntityHandle() const;
238
240 bool IsCommitted() const;
241
244
245protected:
247
251
253 {
254 template<typename TInstancedStruct>
256 {
257 return Instance.GetScriptStruct() == SearchedType;
258 }
259 const UScriptStruct* SearchedType = nullptr;
260 };
261
262private:
263 template<typename TInstancedStruct>
265
266 template<typename T>
267 bool HandleTypeInstance(const UScriptStruct* Type, TArray<FInstancedStruct>*& OutTargetContainer, bool& bOutAlreadyInComposition);
268
269 TSharedRef<FMassEntityManager> EntityManager;
270 mutable FMassEntityHandle EntityHandle;
271
273
274 FMassArchetypeSharedFragmentValues CachedSharedFragmentValues;
275 FMassArchetypeHandle CachedArchetypeHandle;
276
278 FMassArchetypeCreationParams ArchetypeCreationParams;
279
280 template<CFragment T>
281 TArray<FInstancedStruct>& GetInstancedStructContainerInternal()
282 {
283 return Fragments;
284 }
285
286 template<CSharedFragment T>
287 TArray<FInstancedStruct>& GetInstancedStructContainerInternal()
288 {
289 // Resetting the cached shared values because this function is always called
290 // with the intent to modify the contents of SharedFragments, invalidating the
291 // cached data anyway
292 CachedSharedFragmentValues.Reset();
293 return SharedFragments;
294 }
295
296 template<CConstSharedFragment T>
297 TArray<FInstancedStruct>& GetInstancedStructContainerInternal()
298 {
299 CachedSharedFragmentValues.Reset();
300 return ConstSharedFragments;
301 }
302
303 template<typename T>
304 auto& GetBitSetBuilder()
305 {
306 return Composition.GetContainer<T>();
307 }
308
310 void ConditionallyReleaseEntityHandle();
311
312 void CacheEntityHandle() const;
313
314 static void CreateEntityImpl(FMassEntityManager& EntityManager, FMassEntityHandle EntityHandle, const FMassArchetypeHandle& ArchetypeHandle
316
317 TArray<FInstancedStruct> Fragments;
318 TArray<FInstancedStruct> SharedFragments;
319 TArray<FInstancedStruct> ConstSharedFragments;
320 TArray<FPendingRelationParams> RelationsParams;
321
322 enum class EState : uint8
323 {
324 Empty,
325 ReadyToCommit,
326 Committed,
327 Invalid,
328 };
329 EState State = EState::Empty;
330};
331
333{
335
336 template<typename... TArgs>
338 : FEntityBuilder(Forward<TArgs>(InArgs)...)
339 {
340 }
341
343 {
344 Commit();
345 }
346};
347
348//-----------------------------------------------------------------------------
349// Inlines and specializations
350//-----------------------------------------------------------------------------
351template<CTag T>
353{
354 Composition.GetTags().Add<T>();
355 State = EState::ReadyToCommit;
356 CachedArchetypeHandle = FMassArchetypeHandle();
357 return *this;
358}
359
360template<CChunkFragment T>
362{
363 Composition.GetChunkFragments().Add<T>();
364 State = EState::ReadyToCommit;
365 CachedArchetypeHandle = FMassArchetypeHandle();
366 return *this;
367}
368
369template<typename T, typename... TArgs>
371{
372 Add_GetRef<T>(InArgs...);
373 return *this;
374}
375
376template<typename T, typename... TArgs>
378{
379 using FElementType = UE::Mass::TElementType<T>;
380
381 State = EState::ReadyToCommit;
382
383 if (ensureMsgf(GetBitSetBuilder<FElementType>().template Contains<T>() == false, TEXT("Element of type %s has already been added"), *T::StaticStruct()->GetName()))
384 {
386 CachedArchetypeHandle = FMassArchetypeHandle();
387
388 return GetInstancedStructContainerInternal<T>().Add_GetRef(FInstancedStruct::Make<T>(InArgs...)).template GetMutable<T>();
389 }
390
391 return GetInstancedStructContainerInternal<T>().FindByPredicate(FStructInstanceFindingPredicate{T::StaticStruct()})
392 ->template GetMutable<T>();
393}
394
395template<typename T, typename... TArgs>
397{
398 using FElementType = UE::Mass::TElementType<T>;
399
400 State = EState::ReadyToCommit;
401
404 {
405 // replace
407
408 checkf(ElementFound, TEXT("We expect the element to be found since we already tested the Composition"));
409 ElementFound->GetMutable<T>() = T(InArgs...);
410 }
411 else
412 {
414 CachedArchetypeHandle = FMassArchetypeHandle();
415
416 ElementFound = &GetInstancedStructContainerInternal<T>().Add_GetRef(FInstancedStruct::Make<T>(InArgs...));
417 }
418
419 return ElementFound->GetMutable<T>();
420}
421
422template<typename T>
424{
425 using FElementType = UE::Mass::TElementType<T>;
426
428 {
430
431 checkf(ElementFound, TEXT("We expect the element to be found since we already tested the Composition"));
432 return ElementFound->GetMutablePtr<T>();
433 }
434
435 return nullptr;
436}
437
438template<UE::Mass::CRelation T>
443
444inline bool FEntityBuilder::IsValid() const
445{
446 return State != EState::Invalid;
447}
448
450{
451 return State != EState::Committed && EntityHandle.IsValid();
452}
453
455{
456 return State == EState::Committed;
457}
458
460{
461 return EntityManager;
462}
463
468
469} // namespace UE::Mass
470
471#undef UE_API
#define ensureMsgf( InExpression, InFormat,...)
Definition AssertionMacros.h:465
#define checkf(expr, format,...)
Definition AssertionMacros.h:315
#define TEXT(x)
Definition Platform.h:1272
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
@ Composition
Definition HairStrandsComposition.cpp:43
T TNotNull
Definition NotNull.h:307
#define UE_API
Definition SColorGradingComponentViewer.h:12
uint8_t uint8
Definition binka_ue_file_header.h:8
Definition Array.h:670
Definition AssetRegistryState.h:50
Definition SharedPointer.h:153
Definition Class.h:1720
Definition MassEntityConcepts.h:26
Definition MassEntityConcepts.h:38
Definition MassEntityConcepts.h:23
@ Invalid
Definition BTCompositeNode.h:38
@ Committed
Definition MemPro.h:149
Definition OverriddenPropertySet.cpp:45
ERelationRole
Definition MassEntityRelations.h:46
Definition MassArchetypeData.h:21
typename Private::TElementTypeHelper< T >::Type TElementType
Definition MassEntityConcepts.h:58
Definition InstancedStruct.h:32
Definition MassEntityTypes.h:74
Definition MassEntityTypes.h:816
Definition MassArchetypeTypes.h:39
Definition MassEntityTypes.h:297
void Reset()
Definition MassEntityTypes.h:1001
Definition MassEntityHandle.h:13
bool IsValid() const
Definition MassEntityHandle.h:48
Definition MassEntityManager.h:96
Definition InstancedStruct.h:307
Definition MassEntityBuilder.h:188
FMassEntityHandle OtherEntity
Definition MassEntityBuilder.h:190
UE::Mass::FTypeHandle RelationTypeHandle
Definition MassEntityBuilder.h:189
Relations::ERelationRole OtherEntityRole
Definition MassEntityBuilder.h:191
bool operator()(const TInstancedStruct &Instance) const
Definition MassEntityBuilder.h:255
const UScriptStruct * SearchedType
Definition MassEntityBuilder.h:259
Definition MassEntityBuilder.h:61
T * Find()
Definition MassEntityBuilder.h:423
bool IsCommitted() const
Definition MassEntityBuilder.h:454
UE_API FEntityBuilder & operator=(const FEntityBuilder &Other)
Definition MassEntityBuilder.cpp:138
bool HasReservedEntityHandle() const
Definition MassEntityBuilder.h:449
UE_API bool AppendDataFromEntity(const FMassEntityHandle SourceEntityHandle)
Definition MassEntityBuilder.cpp:382
static UE_API FEntityBuilder Make(const TSharedRef< FMassEntityManager > &InEntityManager, const FMassArchetypeCompositionDescriptor &Composition, TConstArrayView< FInstancedStruct > InitialFragmentValues={}, TConstArrayView< FConstSharedStruct > ConstSharedFragments={}, TConstArrayView< FSharedStruct > SharedFragments={})
Definition MassEntityBuilder.cpp:215
UE_API FMassEntityHandle GetEntityHandle() const
Definition MassEntityBuilder.cpp:435
UE_API void CacheArchetypeHandle()
Definition MassEntityBuilder.cpp:460
UE_API FEntityBuilder & AddRelation(UE::Mass::FTypeHandle RelationTypeHandle, FMassEntityHandle OtherEntity, Relations::ERelationRole InputEntityRole=Relations::ERelationRole::Object)
Definition MassEntityBuilder.cpp:600
UE_API void Reprepare()
Definition MassEntityBuilder.cpp:335
T & Add_GetRef(TArgs &&... InArgs)
Definition MassEntityBuilder.h:377
TSharedRef< FMassEntityManager > GetEntityManager()
Definition MassEntityBuilder.h:459
T & GetOrCreate(TArgs &&... InArgs)
Definition MassEntityBuilder.h:396
UE_API void ForEachRelation(const TFunctionRef< bool(FPendingRelationParams &)> &Operator)
Definition MassEntityBuilder.cpp:606
UE_API FMassArchetypeHandle GetArchetypeHandle()
Definition MassEntityBuilder.cpp:474
UE_API ~FEntityBuilder()
Definition MassEntityBuilder.cpp:210
UE_API bool CopyDataFromEntity(const FMassEntityHandle SourceEntityHandle)
Definition MassEntityBuilder.cpp:411
void ConfigureArchetypeCreation(const FMassArchetypeCreationParams &InCreationParams)
Definition MassEntityBuilder.h:464
UE_API bool SetReservedEntityHandle(const FMassEntityHandle ReservedEntityHandle)
Definition MassEntityBuilder.cpp:365
bool IsValid() const
Definition MassEntityBuilder.h:444
UE_API FMassEntityHandle Commit()
Definition MassEntityBuilder.cpp:260
UE_API void CacheSharedFragmentValue()
Definition MassEntityBuilder.cpp:480
UE_API void InvalidateCachedData()
Definition MassEntityBuilder.cpp:468
UE_API FMassEntityHandle CommitAndReprepare()
Definition MassEntityBuilder.cpp:328
FEntityBuilder & Add()
Definition MassEntityBuilder.h:352
Definition MassEntityBuilder.h:333
~FScopedEntityBuilder()
Definition MassEntityBuilder.h:342
FScopedEntityBuilder(TArgs &&... InArgs)
Definition MassEntityBuilder.h:337
UE_NONCOPYABLE(FScopedEntityBuilder)
Definition MassTypeManager.h:27
static FTypeHandle MakeTypeHandle(TNotNull< const UStruct * > InTypeKey)
Definition MassTypeManager.h:307
Definition MassEntityBuilder.cpp:32