9#define UE_API MASSENTITY_API
35#if WITH_MASSENTITY_DEBUG
36 Query->DebugSize =
sizeof(T);
37 Query->ValidateAccessors();
43 template<
typename... Ts>
46 friend ::UMassProcessor;
58 return LogOwner.
Get();
61 template<
typename TAccessors,
typename TFunc>
66 Accessors.AccessorTuple.ApplyBefore([&
Context](
auto&... Accessor)
68 (Accessor.SetupForChunk(
Context), ...);
70 ExecuteFunction(
Context, Accessors);
74 template<
typename TAccessors,
typename TFunc>
83 (Accessor.SetupForChunk(
Context), ...);
90 template<
typename TAccessors,
typename TFunc>
95 Accessors.AccessorTuple.ApplyBefore([&
Context](
auto&... Accessor)
97 (Accessor.SetupForChunk(
Context), ...);
102 ExecuteFunction(
Context, Accessors, EntityIndex);
107 template<
typename TAccessors,
typename TFunc>
115 (Accessor.SetupForChunk(
Context), ...);
138#if WITH_MASSENTITY_DEBUG
144template <
typename...>
147template <
typename T,
typename... Rest>
148inline constexpr auto IsUnique<T, Rest...> = std::bool_constant<(!std::is_same_v<typename T::FragmentType, typename Rest::FragmentType> && ...) &&
IsUnique<Rest...>>{};
151template <
typename T,
typename U,
typename...
Us>
154 if constexpr (std::is_same<T, typename U::FragmentType>::value)
160 static_assert(
sizeof...(Us) > 0,
"Type not found in accessor collection.");
165template <
typename T,
typename U,
typename...
Us>
168 static_assert(
IsUnique<U,
Us...>,
"An accessor collection must only contain a single instance of each fragment/subsystem/tag type.");
176template<
typename... Accessors>
181 Owner.AccessorsPtr =
this;
188 AccessorTuple.ApplyBefore([&EntityQuery, &ProcessorRequirements](
auto&... Accessor)
190 (Accessor.ConfigureQuery(EntityQuery, ProcessorRequirements), ...);
199 (Accessor.SetupForExecute(
Context), ...);
207 (Accessor.SetupForChunk(
Context), ...);
211 template <
typename TFragment>
212 inline constexpr auto&
Get()
219template<
typename TFragment>
222 template<
typename... Ts>
256template<
typename TFragment>
259 template<
typename... Ts>
293template<
typename TFragment>
296 template<
typename... Ts>
340template<
typename TFragment>
343 template<
typename... Ts>
367 return View.Num() > 0;
387template<
typename TTag>
390 template<
typename... Ts>
411template<
typename TFragment>
430template<
typename TFragment>
433 template<
typename... Ts>
474template<
typename TFragment>
477 template<
typename... Ts>
518template<
typename TFragment>
521 template<
typename... Ts>
562template<
typename TFragment>
565 template<
typename... Ts>
606template<
typename TFragment>
609 template<
typename... Ts>
652template<
typename TFragment>
655 template<
typename... Ts>
704 template<
typename... Ts>
752 template<
typename... Ts>
#define check(expr)
Definition AssertionMacros.h:314
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
T TNotNull
Definition NotNull.h:307
const bool
Definition NetworkReplayStreaming.h:178
#define UE_API
Definition SColorGradingComponentViewer.h:12
Definition ArrayView.h:139
UE_FORCEINLINE_HINT constexpr SizeType Num() const
Definition ArrayView.h:380
Definition SharedPointer.h:692
Definition MassProcessor.h:78
Definition MassArchetypeData.h:21
constexpr auto IsUnique
Definition MassQueryExecutor.h:145
constexpr auto GetIndexRecursive()
Definition MassQueryExecutor.h:152
constexpr auto GetAccessorIndex()
Definition MassQueryExecutor.h:166
U16 Index
Definition radfft.cpp:71
Definition MassEntityQuery.h:51
Definition MassExecutionContext.h:29
FMassFragmentRequirements & AddSharedRequirement(const EMassFragmentAccess AccessMode, const EMassFragmentPresence Presence=EMassFragmentPresence::All)
Definition MassRequirements.h:421
FMassFragmentRequirements & AddRequirement(const UScriptStruct *FragmentType, const EMassFragmentAccess AccessMode, const EMassFragmentPresence Presence=EMassFragmentPresence::All)
Definition MassRequirements.h:179
FMassFragmentRequirements & AddConstSharedRequirement(const EMassFragmentPresence Presence=EMassFragmentPresence::All)
Definition MassRequirements.h:363
FMassFragmentRequirements & AddChunkRequirement(const EMassFragmentAccess AccessMode, const EMassFragmentPresence Presence=EMassFragmentPresence::All)
Definition MassRequirements.h:311
FMassFragmentRequirements & AddTagRequirement(TNotNull< const UScriptStruct * > TagType, const EMassFragmentPresence Presence)
Definition MassRequirements.h:245
Definition MassRequirements.h:72
FMassSubsystemRequirements & AddSubsystemRequirement(const EMassFragmentAccess AccessMode)
Definition MassRequirements.h:78
Definition WeakObjectPtrTemplates.h:25
FORCEINLINE T * Get(bool bEvenIfPendingKill) const
Definition WeakObjectPtrTemplates.h:132
Definition MassQueryExecutor.h:564
TFragment FragmentType
Definition MassQueryExecutor.h:568
void ConfigureQuery(FMassEntityQuery &EntityQuery, FMassSubsystemRequirements &ProcessorRequirements) const
Definition MassQueryExecutor.h:589
FConstChunkFragmentAccess()=default
const TFragment * Fragment
Definition MassQueryExecutor.h:603
const TFragment * operator->() const
Definition MassQueryExecutor.h:584
const TFragment & operator*() const
Definition MassQueryExecutor.h:578
void SetupForExecute(FMassExecutionContext &Context)
Definition MassQueryExecutor.h:594
const TFragment & Get() const
Definition MassQueryExecutor.h:572
void SetupForChunk(FMassExecutionContext &Context)
Definition MassQueryExecutor.h:598
Definition MassQueryExecutor.h:258
const TConstArrayView< TFragment > & Get() const
Definition MassQueryExecutor.h:266
const TFragment & operator[](int32 Index) const
Definition MassQueryExecutor.h:271
TConstArrayView< TFragment > View
Definition MassQueryExecutor.h:290
void SetupForExecute(FMassExecutionContext &Context)
Definition MassQueryExecutor.h:281
void SetupForChunk(FMassExecutionContext &Context)
Definition MassQueryExecutor.h:285
TFragment FragmentType
Definition MassQueryExecutor.h:262
FConstFragmentAccess()=default
void ConfigureQuery(FMassEntityQuery &EntityQuery, FMassSubsystemRequirements &ProcessorRequirements) const
Definition MassQueryExecutor.h:276
Definition MassQueryExecutor.h:654
void SetupForExecute(FMassExecutionContext &Context)
Definition MassQueryExecutor.h:689
const TFragment * operator->() const
Definition MassQueryExecutor.h:674
TFragment FragmentType
Definition MassQueryExecutor.h:658
const TFragment & operator*() const
Definition MassQueryExecutor.h:668
FConstOptionalChunkFragmentAccess()=default
void SetupForChunk(FMassExecutionContext &Context)
Definition MassQueryExecutor.h:693
void ConfigureQuery(FMassEntityQuery &EntityQuery, FMassSubsystemRequirements &ProcessorRequirements) const
Definition MassQueryExecutor.h:684
const TFragment * Get()
Definition MassQueryExecutor.h:662
const TFragment * Fragment
Definition MassQueryExecutor.h:698
Definition MassQueryExecutor.h:342
void ConfigureQuery(FMassEntityQuery &EntityQuery, FMassSubsystemRequirements &ProcessorRequirements) const
Definition MassQueryExecutor.h:370
TFragment FragmentType
Definition MassQueryExecutor.h:346
const TFragment & operator[](int32 Index) const
Definition MassQueryExecutor.h:355
FConstOptionalFragmentAccess()=default
void SetupForExecute(FMassExecutionContext &Context)
Definition MassQueryExecutor.h:375
const TConstArrayView< TFragment > & Get() const
Definition MassQueryExecutor.h:350
int32 Num() const
Definition MassQueryExecutor.h:360
TConstArrayView< TFragment > View
Definition MassQueryExecutor.h:384
void SetupForChunk(FMassExecutionContext &Context)
Definition MassQueryExecutor.h:379
Definition MassQueryExecutor.h:476
void SetupForChunk(FMassExecutionContext &Context)
Definition MassQueryExecutor.h:510
const TFragment & Get() const
Definition MassQueryExecutor.h:484
TFragment FragmentType
Definition MassQueryExecutor.h:480
const TFragment & operator*() const
Definition MassQueryExecutor.h:490
void SetupForExecute(FMassExecutionContext &Context)
Definition MassQueryExecutor.h:506
void ConfigureQuery(FMassEntityQuery &EntityQuery, FMassSubsystemRequirements &ProcessorRequirements) const
Definition MassQueryExecutor.h:501
const TFragment * Fragment
Definition MassQueryExecutor.h:515
const TFragment * operator->() const
Definition MassQueryExecutor.h:496
FConstSharedFragmentAccess()=default
Definition MassQueryExecutor.h:751
void SetupForChunk(FMassExecutionContext &Context)
Definition MassQueryExecutor.h:790
const TSubsystem * operator->() const
Definition MassQueryExecutor.h:770
const TSubsystem * Get() const
Definition MassQueryExecutor.h:759
void SetupForExecute(FMassExecutionContext &Context)
Definition MassQueryExecutor.h:785
TSubsystem FragmentType
Definition MassQueryExecutor.h:755
FConstSubsystemAccess()=default
void ConfigureQuery(FMassEntityQuery &EntityQuery, FMassSubsystemRequirements &ProcessorRequirements) const
Definition MassQueryExecutor.h:780
const TSubsystem * Subsystem
Definition MassQueryExecutor.h:794
const TSubsystem & operator*() const
Definition MassQueryExecutor.h:764
Definition MassQueryExecutor.h:413
void ConfigureQuery(FMassEntityQuery &EntityQuery, FMassSubsystemRequirements &ProcessorRequirements) const
Definition MassQueryExecutor.h:416
TFragment FragmentType
Definition MassQueryExecutor.h:414
void SetupForChunk(FMassExecutionContext &Context)
Definition MassQueryExecutor.h:425
void SetupForExecute(FMassExecutionContext &Context)
Definition MassQueryExecutor.h:421
Definition MassQueryExecutor.h:389
void ConfigureQuery(FMassEntityQuery &EntityQuery, FMassSubsystemRequirements &ProcessorRequirements) const
Definition MassQueryExecutor.h:397
void SetupForExecute(FMassExecutionContext &Context)
Definition MassQueryExecutor.h:402
FMassTagRequired()=default
void SetupForChunk(FMassExecutionContext &Context)
Definition MassQueryExecutor.h:406
TTag FragmentType
Definition MassQueryExecutor.h:393
Definition MassQueryExecutor.h:520
void ConfigureQuery(FMassEntityQuery &EntityQuery, FMassSubsystemRequirements &ProcessorRequirements) const
Definition MassQueryExecutor.h:545
TFragment * operator->() const
Definition MassQueryExecutor.h:540
TFragment * Fragment
Definition MassQueryExecutor.h:559
TFragment & operator*() const
Definition MassQueryExecutor.h:534
void SetupForChunk(FMassExecutionContext &Context)
Definition MassQueryExecutor.h:554
FMutableChunkFragmentAccess()=default
TFragment & Get() const
Definition MassQueryExecutor.h:528
void SetupForExecute(FMassExecutionContext &Context)
Definition MassQueryExecutor.h:550
TFragment FragmentType
Definition MassQueryExecutor.h:524
Definition MassQueryExecutor.h:221
FMutableFragmentAccess()=default
TFragment FragmentType
Definition MassQueryExecutor.h:225
void SetupForChunk(FMassExecutionContext &Context)
Definition MassQueryExecutor.h:248
TFragment & operator[](int32 Index)
Definition MassQueryExecutor.h:234
void SetupForExecute(FMassExecutionContext &Context)
Definition MassQueryExecutor.h:244
void ConfigureQuery(FMassEntityQuery &EntityQuery, FMassSubsystemRequirements &ProcessorRequirements)
Definition MassQueryExecutor.h:239
TArrayView< TFragment > & Get()
Definition MassQueryExecutor.h:229
TArrayView< TFragment > View
Definition MassQueryExecutor.h:253
Definition MassQueryExecutor.h:608
TFragment * operator->() const
Definition MassQueryExecutor.h:628
TFragment & operator*() const
Definition MassQueryExecutor.h:622
void SetupForExecute(FMassExecutionContext &Context)
Definition MassQueryExecutor.h:640
FMutableOptionalChunkFragmentAccess()=default
TFragment FragmentType
Definition MassQueryExecutor.h:612
void ConfigureQuery(FMassEntityQuery &EntityQuery, FMassSubsystemRequirements &ProcessorRequirements) const
Definition MassQueryExecutor.h:635
void SetupForChunk(FMassExecutionContext &Context)
Definition MassQueryExecutor.h:644
TFragment * Fragment
Definition MassQueryExecutor.h:649
TFragment * Get() const
Definition MassQueryExecutor.h:616
Definition MassQueryExecutor.h:295
void SetupForExecute(FMassExecutionContext &Context)
Definition MassQueryExecutor.h:328
TFragment & operator[](int32 Index) const
Definition MassQueryExecutor.h:308
FMutableOptionalFragmentAccess()=default
void ConfigureQuery(FMassEntityQuery &EntityQuery, FMassSubsystemRequirements &ProcessorRequirements) const
Definition MassQueryExecutor.h:323
int32 Num() const
Definition MassQueryExecutor.h:313
void SetupForChunk(FMassExecutionContext &Context)
Definition MassQueryExecutor.h:332
TFragment FragmentType
Definition MassQueryExecutor.h:299
TArrayView< TFragment > View
Definition MassQueryExecutor.h:337
TArrayView< TFragment > & Get() const
Definition MassQueryExecutor.h:303
Definition MassQueryExecutor.h:432
TFragment & operator*() const
Definition MassQueryExecutor.h:446
void ConfigureQuery(FMassEntityQuery &EntityQuery, FMassSubsystemRequirements &ProcessorRequirements) const
Definition MassQueryExecutor.h:457
void SetupForExecute(FMassExecutionContext &Context)
Definition MassQueryExecutor.h:462
TFragment FragmentType
Definition MassQueryExecutor.h:436
TFragment * Fragment
Definition MassQueryExecutor.h:471
TFragment * operator->() const
Definition MassQueryExecutor.h:452
TFragment & Get() const
Definition MassQueryExecutor.h:440
void SetupForChunk(FMassExecutionContext &Context)
Definition MassQueryExecutor.h:466
FMutableSharedFragmentAccess()=default
Definition MassQueryExecutor.h:703
TSubsystem FragmentType
Definition MassQueryExecutor.h:707
TSubsystem * Get() const
Definition MassQueryExecutor.h:711
void ConfigureQuery(FMassEntityQuery &EntityQuery, FMassSubsystemRequirements &ProcessorRequirements) const
Definition MassQueryExecutor.h:732
TSubsystem & operator*() const
Definition MassQueryExecutor.h:716
FMutableSubsystemAccess()=default
TSubsystem * Subsystem
Definition MassQueryExecutor.h:746
void SetupForExecute(FMassExecutionContext &Context)
Definition MassQueryExecutor.h:737
TSubsystem * operator->() const
Definition MassQueryExecutor.h:722
void SetupForChunk(FMassExecutionContext &Context)
Definition MassQueryExecutor.h:742
Definition MassQueryExecutor.h:18
virtual void ConfigureQuery(FMassEntityQuery &EntityQuery, FMassSubsystemRequirements &ProcessorRequirements)=0
virtual void SetupForExecute(FMassExecutionContext &Context)=0
Definition MassQueryExecutor.h:178
virtual void ConfigureQuery(FMassEntityQuery &EntityQuery, FMassSubsystemRequirements &ProcessorRequirements) override
Definition MassQueryExecutor.h:186
TTuple< Accessors... > AccessorTuple
Definition MassQueryExecutor.h:184
void SetupForChunk(FMassExecutionContext &Context)
Definition MassQueryExecutor.h:203
FQueryDefinition(FQueryExecutor &Owner)
Definition MassQueryExecutor.h:179
constexpr auto & Get()
Definition MassQueryExecutor.h:212
virtual void SetupForExecute(FMassExecutionContext &Context) override
Definition MassQueryExecutor.h:195
Definition MassQueryExecutor.h:27
void ForEachEntityChunk(FMassExecutionContext &ExecutionContext, TAccessors &Accessors, const TFunc &&ExecuteFunction)
Definition MassQueryExecutor.h:62
static TSharedPtr< T > CreateQuery(FMassEntityQuery &InQuery, UObject *InLogOwner=nullptr)
Definition MassQueryExecutor.h:29
virtual ~FQueryExecutor()=default
UE_API FQueryExecutor()
Definition MassQueryExecutor.cpp:17
UObject * GetLogOwner()
Definition MassQueryExecutor.h:56
virtual void Execute(FMassExecutionContext &Context)=0
void ParallelForEachEntityChunk(FMassExecutionContext &ExecutionContext, const TAccessors &Accessors, const TFunc &&ExecuteFunction)
Definition MassQueryExecutor.h:75
void ParallelForEachEntity(FMassExecutionContext &ExecutionContext, TAccessors &Accessors, const TFunc &&ExecuteFunction)
Definition MassQueryExecutor.h:108
void ForEachEntity(FMassExecutionContext &ExecutionContext, TAccessors &Accessors, const TFunc &&ExecuteFunction)
Definition MassQueryExecutor.h:91