UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
FieldSystem.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
6#include "CoreMinimal.h"
7#include "Containers/Array.h"
9#include "Containers/Queue.h"
12#include "Math/Vector.h"
13
22{
27
28 static void ContiguousIndices(
30 const int NumParticles,
31 const bool bForce = true)
32 {
33 if(bForce)
34 {
35 Array.SetNum(NumParticles);
36 for(int32 i = 0; i < Array.Num(); ++i)
37 {
38 Array[i].Result = i;
39 Array[i].Sample = i;
40 }
41 }
42 }
43
46};
47
50{
51 LinearForce = 0,
53 AngularTorque = 2,
55 NumOutputs = 4
56};
57
60{
61 FinalResult = 0,
63 NumResults = 2
64};
65
68{
70 InsideHandles = 1,
71 NumHandles = 2
72};
73
101
103template<typename FieldType>
104FORCEINLINE void ResetResultsArray(const int32 FieldSize, TArray<FieldType>& FieldArray, const FieldType DefaultValue)
105{
107 for (int32 i = 0; i < FieldSize; ++i)
108 {
109 FieldArray[i] = DefaultValue;
110 }
111}
112
114template<typename FieldType>
116{
117 for (const EFieldCommandOutputType& FieldTarget : FieldTargets)
118 {
119 if (FieldTarget < EFieldCommandOutputType::NumOutputs)
120 {
121 ResetResultsArray(FieldSize, FieldArray[FieldTarget], DefaultValue);
122 }
123 }
124}
125
127template<typename FieldType>
132
134template<typename FieldType>
145
173
174
184
196
197template<class T>
207
217
240
242{
245
246 FFieldContext() = delete;
247
248 FFieldContext(const FFieldContext&) = delete;
252
288
307
309 {
311 {
312 // No culling took place
313 return SampleIndices;
314 }
315
316 // Culling fields created an evaluation set
318 }
319
320 //
321 // Ryan - TODO: This concept of having discreet sample data needs to change.
322 // I think we'd be better off supplying lambda accessors which can be specialized
323 // for each respective use case. That means the method by which this data is
324 // traversed also needs to change; possibly to some load balanced threaded iterator
325 // or task based paradigm.
326
329
333
338};
340template<typename ResultType>
342
344template<>
349
351template<>
356
358template<>
363
370{
376
377public:
378
380 : TargetContext(InContext)
381 {
383 MetaType = InMetaData->Type();
384 TargetContext.MetaData.Add(MetaType, InMetaData);
385 }
386
388 {
389 TargetContext.MetaData.Remove(MetaType);
390 }
391
392private:
394 FFieldContext& TargetContext;
395};
396
404{
405
406public:
407
416
437
438 FFieldNodeBase() : Name("") {}
439 virtual ~FFieldNodeBase() {}
440 virtual EFieldType Type() const { check(false); return EFieldType::EField_None; }
442 virtual FFieldNodeBase * NewCopy() const = 0;
443 virtual void Serialize(FArchive& Ar) { Ar << Name; }
444 virtual bool operator==(const FFieldNodeBase& Node) { return Name.IsEqual(Node.GetName()); }
445
447 virtual void FillSetupCount(int32& NumOffsets, int32& NumParams) const {}
448
450 virtual void FillSetupDatas(TArray<int32>& NodesOffsets, TArray<float>& NodesParams, const float CommandTime) const {}
451
453 virtual float EvalMaxMagnitude() const { return 1.0; }
454
456 virtual void ComputeFieldBounds(FVector& MinBounds, FVector& MaxBounds, FVector& CenterPosition) const
457 {
460 CenterPosition = FVector::Zero();
461 }
462
463 FName GetName() const { return Name; }
464 void SetName(const FName & NameIn) { Name = NameIn; }
465
466private:
467 FName Name;
468};
469
470
479template<class T>
481{
482public:
483
484 virtual ~FFieldNode() {}
485
486 virtual void Evaluate(FFieldContext&, TFieldArrayView<T>& Results) const = 0;
487
489 virtual EFieldType Type() const { return StaticType(); }
490
492 virtual void FillSetupCount(int32& NumOffsets, int32& NumParams) const override
493 {
494 ++NumOffsets;
495 NumParams += 2;
496 }
497
499 virtual void FillSetupDatas(TArray<int32>& NodesOffsets, TArray<float>& NodesParams, const float CommandTime) const override
500 {
501 NodesOffsets.Add(NodesParams.Num());
502 NodesParams.Add(static_cast<float>(Type()));
503 NodesParams.Add(static_cast<float>(SerializationType()));
504 }
505};
506
507template<> inline FFieldNodeBase::EFieldType FFieldNode<int32>::StaticType() { return EFieldType::EField_Int32; }
508template<> inline FFieldNodeBase::EFieldType FFieldNode<float>::StaticType() { return EFieldType::EField_Float; }
509template<> inline FFieldNodeBase::EFieldType FFieldNode<FVector>::StaticType() { return EFieldType::EField_FVector; }
510
522{
523public:
554
555 // Commands are copied when moved from the one thread to
556 // another. This requires a full copy of all associated data.
572
574 {
575 return MetaData.Contains(Key) && GetMetaData(Key) != nullptr;
576 }
577
579 const FFieldSystemMetaData::EMetaType Key) const
580 {
581 return MetaData[Key];
582 }
583
584 template <class TMetaData>
586 {
587 return static_cast<const TMetaData*>(GetMetaData(Key).Get());
588 }
589
594
599
600 void InitFieldNodes(const double TimeSeconds, const FName& Name)
601 {
603 TimeCreation = (float)TimeSeconds;
604 }
605
606 CHAOS_API void Serialize(FArchive& Ar);
607 CHAOS_API bool operator==(const FFieldSystemCommand&) const;
608 bool operator!=(const FFieldSystemCommand& Other) const { return !this->operator==(Other); }
609
612
615
620
622};
623
624
625
626/*
627* Equality testing for pointer wrapped FieldNodes
628*/
629template<class T>
630bool FieldsEqual(const TUniquePtr<T>& NodeA, const TUniquePtr<T>& NodeB)
631{
632 if (NodeA.IsValid() == NodeB.IsValid())
633 {
634 if (NodeA.IsValid())
635 {
636 if (NodeA->SerializationType() == NodeB->SerializationType())
637 {
638 return NodeA->operator==(*NodeB);
639 }
640 }
641 else
642 {
643 return true;
644 }
645 }
646 return false;
647}
648
649
650
#define FORCEINLINE
Definition AndroidPlatform.h:140
#define check(expr)
Definition AssertionMacros.h:314
@ 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
EFieldObjectType
Definition FieldSystemTypes.h:103
EFieldResolutionType
Definition FieldSystemTypes.h:72
const FName & GetFieldPhysicsName(EFieldPhysicsType PhysicsType)
Definition FieldSystemTypes.h:374
EFieldPhysicsType
Definition FieldSystemTypes.h:148
EFieldPhysicsType GetFieldPhysicsType(const FName &PhysicsName)
Definition FieldSystemTypes.h:382
EFieldPositionType
Definition FieldSystemTypes.h:119
EFieldFilterType
Definition FieldSystemTypes.h:86
FORCEINLINE void ResetResultsArrays(const int32 FieldSize, const TArray< EFieldCommandOutputType > &FieldTargets, TArray< FieldType > FieldArray[(uint8) EFieldCommandOutputType::NumOutputs], const FieldType DefaultValue)
Definition FieldSystem.h:115
FORCEINLINE TArray< FVector > & GetResultArray< FVector >(FFieldContext &FieldContext)
Definition FieldSystem.h:345
EFieldCommandHandlesType
Definition FieldSystem.h:68
FORCEINLINE void ResetResultsArray(const int32 FieldSize, TArray< FieldType > &FieldArray, const FieldType DefaultValue)
Definition FieldSystem.h:104
FORCEINLINE TArray< float > & GetResultArray< float >(FFieldContext &FieldContext)
Definition FieldSystem.h:352
FORCEINLINE void EmptyResultsArray(TArray< FieldType > &FieldArray)
Definition FieldSystem.h:128
EFieldCommandResultType
Definition FieldSystem.h:60
FORCEINLINE TArray< ResultType > & GetResultArray(FFieldContext &FieldContext)
FORCEINLINE TArray< int32 > & GetResultArray< int32 >(FFieldContext &FieldContext)
Definition FieldSystem.h:359
bool FieldsEqual(const TUniquePtr< T > &NodeA, const TUniquePtr< T > &NodeB)
Definition FieldSystem.h:630
EFieldCommandOutputType
Definition FieldSystem.h:50
FORCEINLINE void EmptyResultsArrays(const TArray< EFieldCommandOutputType > &FieldTargets, TArray< FieldType > FieldArray[(uint8) EFieldCommandOutputType::NumOutputs])
Definition FieldSystem.h:135
#define FVector
Definition IOSSystemIncludes.h:8
@ Num
Definition MetalRHIPrivate.h:234
USkinnedMeshComponent float
Definition SkinnedMeshComponent.h:60
UE_INTRINSIC_CAST UE_REWRITE constexpr std::remove_reference_t< T > && MoveTemp(T &&Obj) noexcept
Definition UnrealTemplate.h:520
uint8_t uint8
Definition binka_ue_file_header.h:8
Definition Archive.h:1208
Definition FieldSystem.h:404
virtual ~FFieldNodeBase()
Definition FieldSystem.h:439
virtual void FillSetupDatas(TArray< int32 > &NodesOffsets, TArray< float > &NodesParams, const float CommandTime) const
Definition FieldSystem.h:450
ESerializationType
Definition FieldSystem.h:418
@ FieldNode_FRadialIntMask
Definition FieldSystem.h:421
@ FieldNode_FRandomVector
Definition FieldSystem.h:429
@ FieldNode_FUniformInteger
Definition FieldSystem.h:420
@ FieldNode_FRadialFalloff
Definition FieldSystem.h:423
@ FieldNode_FWaveScalar
Definition FieldSystem.h:434
@ FieldNode_FCullingField
Definition FieldSystem.h:433
@ FieldNode_FSumScalar
Definition FieldSystem.h:430
@ FieldNode_FBoxFalloff
Definition FieldSystem.h:425
@ FieldNode_FRadialVector
Definition FieldSystem.h:428
@ FieldNode_FSumVector
Definition FieldSystem.h:431
@ FieldNode_FConversionField
Definition FieldSystem.h:432
@ FieldNode_FReturnResultsTerminal
Definition FieldSystem.h:435
@ FieldNode_FUniformScalar
Definition FieldSystem.h:422
@ FieldNode_FPlaneFalloff
Definition FieldSystem.h:424
@ FieldNode_FUniformVector
Definition FieldSystem.h:427
@ FieldNode_Null
Definition FieldSystem.h:419
@ FieldNode_FNoiseField
Definition FieldSystem.h:426
void SetName(const FName &NameIn)
Definition FieldSystem.h:464
FName GetName() const
Definition FieldSystem.h:463
virtual ESerializationType SerializationType() const
Definition FieldSystem.h:441
virtual float EvalMaxMagnitude() const
Definition FieldSystem.h:453
virtual FFieldNodeBase * NewCopy() const =0
EFieldType
Definition FieldSystem.h:409
@ EField_None
Definition FieldSystem.h:410
@ EField_Results
Definition FieldSystem.h:411
@ EField_Float
Definition FieldSystem.h:413
@ EField_FVector
Definition FieldSystem.h:414
@ EField_Int32
Definition FieldSystem.h:412
FFieldNodeBase()
Definition FieldSystem.h:438
virtual void Serialize(FArchive &Ar)
Definition FieldSystem.h:443
virtual bool operator==(const FFieldNodeBase &Node)
Definition FieldSystem.h:444
virtual EFieldType Type() const
Definition FieldSystem.h:440
virtual void ComputeFieldBounds(FVector &MinBounds, FVector &MaxBounds, FVector &CenterPosition) const
Definition FieldSystem.h:456
virtual void FillSetupCount(int32 &NumOffsets, int32 &NumParams) const
Definition FieldSystem.h:447
Definition FieldSystem.h:481
virtual ~FFieldNode()
Definition FieldSystem.h:484
virtual void FillSetupDatas(TArray< int32 > &NodesOffsets, TArray< float > &NodesParams, const float CommandTime) const override
Definition FieldSystem.h:499
virtual EFieldType Type() const
Definition FieldSystem.h:489
virtual void FillSetupCount(int32 &NumOffsets, int32 &NumParams) const override
Definition FieldSystem.h:492
virtual void Evaluate(FFieldContext &, TFieldArrayView< T > &Results) const =0
static EFieldType StaticType()
Definition FieldSystem.h:522
float MaxMagnitude
Definition FieldSystem.h:618
FName TargetAttribute
Definition FieldSystem.h:610
FFieldSystemCommand(const EFieldPhysicsType PhsyicsTypeIn, FFieldNodeBase *RootNodeIn)
Definition FieldSystem.h:544
bool operator!=(const FFieldSystemCommand &Other) const
Definition FieldSystem.h:608
FFieldSystemCommand(const FFieldSystemCommand &Other)
Definition FieldSystem.h:557
FVector CenterPosition
Definition FieldSystem.h:619
void InitFieldNodes(const double TimeSeconds, const FName &Name)
Definition FieldSystem.h:600
bool HasMetaData(const FFieldSystemMetaData::EMetaType Key) const
Definition FieldSystem.h:573
CHAOS_API bool operator==(const FFieldSystemCommand &) const
Definition FieldSystem.cpp:32
const TMetaData * GetMetaDataAs(const FFieldSystemMetaData::EMetaType Key) const
Definition FieldSystem.h:585
FBox BoundingBox
Definition FieldSystem.h:616
FFieldSystemCommand()
Definition FieldSystem.h:524
float TimeCreation
Definition FieldSystem.h:614
EFieldPhysicsType PhysicsType
Definition FieldSystem.h:617
TUniquePtr< FFieldNodeBase > RootNode
Definition FieldSystem.h:611
FFieldSystemCommand(const FName &TargetAttributeIn, FFieldNodeBase *RootNodeIn)
Definition FieldSystem.h:534
void SetMetaData(const FFieldSystemMetaData::EMetaType Key, TUniquePtr< FFieldSystemMetaData > &&Value)
Definition FieldSystem.h:590
void SetMetaData(const FFieldSystemMetaData::EMetaType Key, FFieldSystemMetaData *Value)
Definition FieldSystem.h:595
const TUniquePtr< FFieldSystemMetaData > & GetMetaData(const FFieldSystemMetaData::EMetaType Key) const
Definition FieldSystem.h:578
FName CommandName
Definition FieldSystem.h:613
TMap< FFieldSystemMetaData::EMetaType, TUniquePtr< FFieldSystemMetaData > > MetaData
Definition FieldSystem.h:621
Definition FieldSystem.h:219
FFieldSystemMetaDataCulling(TArray< FFieldContextIndex > &CullingIndicesIn)
Definition FieldSystem.h:221
TArray< FFieldContextIndex > & CullingIndices
Definition FieldSystem.h:238
bool bCullingActive
Definition FieldSystem.h:237
virtual FFieldSystemMetaData * NewCopy() const
Definition FieldSystem.h:232
virtual ~FFieldSystemMetaDataCulling()=default
virtual EMetaType Type() const
Definition FieldSystem.h:228
Definition FieldSystem.h:185
virtual FFieldSystemMetaData * NewCopy() const
Definition FieldSystem.h:190
EFieldObjectType ObjectType
Definition FieldSystem.h:193
FFieldSystemMetaDataFilter(EFieldFilterType FilterTypeIn, EFieldObjectType ObjectTypeIn, EFieldPositionType PositionTypeIn)
Definition FieldSystem.h:187
virtual EMetaType Type() const
Definition FieldSystem.h:189
EFieldFilterType FilterType
Definition FieldSystem.h:192
EFieldPositionType PositionType
Definition FieldSystem.h:194
virtual ~FFieldSystemMetaDataFilter()
Definition FieldSystem.h:188
Definition FieldSystem.h:208
virtual EMetaType Type() const
Definition FieldSystem.h:212
virtual ~FFieldSystemMetaDataIteration()
Definition FieldSystem.h:211
int32 Iterations
Definition FieldSystem.h:215
FFieldSystemMetaDataIteration(int32 IterationsIn)
Definition FieldSystem.h:210
virtual FFieldSystemMetaData * NewCopy() const
Definition FieldSystem.h:213
Definition FieldSystem.h:175
FFieldSystemMetaDataProcessingResolution(EFieldResolutionType ProcessingResolutionIn)
Definition FieldSystem.h:177
virtual ~FFieldSystemMetaDataProcessingResolution()
Definition FieldSystem.h:178
virtual EMetaType Type() const
Definition FieldSystem.h:179
virtual FFieldSystemMetaData * NewCopy() const
Definition FieldSystem.h:180
EFieldResolutionType ProcessingResolution
Definition FieldSystem.h:182
Definition FieldSystem.h:198
const TFieldArrayView< T > & Results
Definition FieldSystem.h:205
virtual FFieldSystemMetaData * NewCopy() const
Definition FieldSystem.h:203
virtual ~FFieldSystemMetaDataResults()
Definition FieldSystem.h:201
FFieldSystemMetaDataResults(const TFieldArrayView< T > &ResultsIn)
Definition FieldSystem.h:200
virtual EMetaType Type() const
Definition FieldSystem.h:202
Definition FieldSystem.h:155
virtual ~FFieldSystemMetaData()
Definition FieldSystem.h:169
virtual EMetaType Type() const =0
EMetaType
Definition FieldSystem.h:159
@ ECommandData_Filter
Definition FieldSystem.h:165
@ ECommandData_ProcessingResolution
Definition FieldSystem.h:161
@ ECommandData_None
Definition FieldSystem.h:160
@ ECommandData_Results
Definition FieldSystem.h:162
@ ECommandData_Culling
Definition FieldSystem.h:164
@ ECommandData_Iteration
Definition FieldSystem.h:163
virtual FFieldSystemMetaData * NewCopy() const =0
Definition NameTypes.h:617
FORCEINLINE bool IsEqual(const FName &Other, const ENameCase CompareMethod=ENameCase::IgnoreCase, const bool bCompareNumber=true) const
Definition NameTypes.h:1585
Definition FieldSystem.h:370
~FScopedFieldContextMetaData()
Definition FieldSystem.h:387
FScopedFieldContextMetaData(FFieldContext &InContext, FFieldSystemMetaData *InMetaData)
Definition FieldSystem.h:379
Definition Array.h:670
UE_REWRITE SizeType Num() const
Definition Array.h:1144
void SetNum(SizeType NewNum, EAllowShrinking AllowShrinking=UE::Core::Private::AllowShrinkingByDefault< AllocatorType >())
Definition Array.h:2308
UE_NODEBUG UE_FORCEINLINE_HINT SizeType Add(ElementType &&Item)
Definition Array.h:2696
Definition FieldArrayView.h:18
Definition UnrealString.h.inl:34
Definition UniquePtr.h:107
bool IsValid() const
Definition UniquePtr.h:280
UE_FORCEINLINE_HINT T * Get() const
Definition UniquePtr.h:324
FRealDouble FReal
Definition Real.h:22
@ false
Definition radaudio_common.h:23
Definition FieldSystem.h:22
static void ContiguousIndices(TArray< FFieldContextIndex > &Array, const int NumParticles, const bool bForce=true)
Definition FieldSystem.h:28
FFieldContextIndex(int32 InSample=INDEX_NONE, int32 InResult=INDEX_NONE)
Definition FieldSystem.h:23
int32 Result
Definition FieldSystem.h:45
int32 Sample
Definition FieldSystem.h:44
Definition FieldSystem.h:242
TArray< int32 > & IntegerResults
Definition FieldSystem.h:336
TFieldArrayView< FVector > SamplePositions
Definition FieldSystem.h:328
Chaos::FReal TimeSeconds
Definition FieldSystem.h:332
FFieldContext(const TFieldArrayView< FFieldContextIndex > &SampleIndicesIn, const TFieldArrayView< FVector > &SamplePositionsIn, const UniquePointerMap &MetaDataIn, const Chaos::FReal TimeSecondsIn, TArray< FVector > &VectorResultsIn, TArray< float > &ScalarResultsIn, TArray< int32 > &IntegerResultsIn, TArray< FFieldContextIndex > &IndexResultsIn, TArray< FFieldContextIndex > &CullingResultsIn)
Definition FieldSystem.h:253
FFieldContext(const FFieldContext &)=delete
TMap< FFieldSystemMetaData::EMetaType, FFieldSystemMetaData * > PointerMap
Definition FieldSystem.h:244
TMap< FFieldSystemMetaData::EMetaType, TUniquePtr< FFieldSystemMetaData > > UniquePointerMap
Definition FieldSystem.h:243
FFieldContext & operator=(const FFieldContext &)=delete
TUniquePtr< FFieldSystemMetaDataCulling > CullingData
Definition FieldSystem.h:331
FFieldContext()=delete
TArray< FVector > & VectorResults
Definition FieldSystem.h:334
TFieldArrayView< FFieldContextIndex > SampleIndices
Definition FieldSystem.h:327
FFieldContext(FFieldExecutionDatas &ExecutionDatas, const UniquePointerMap &MetaDataIn, const Chaos::FReal TimeSecondsIn)
Definition FieldSystem.h:289
PointerMap MetaData
Definition FieldSystem.h:330
TFieldArrayView< FFieldContextIndex > GetEvaluatedSamples()
Definition FieldSystem.h:308
FFieldContext(const TFieldArrayView< FFieldContextIndex > &SampleIndicesIn, const TFieldArrayView< FVector > &SamplePositionsIn, const PointerMap &MetaDataIn, const Chaos::FReal TimeSecondsIn, TArray< FVector > &VectorResultsIn, TArray< float > &ScalarResultsIn, TArray< int32 > &IntegerResultsIn, TArray< FFieldContextIndex > &IndexResultsIn, TArray< FFieldContextIndex > &CullingResultsIn)
Definition FieldSystem.h:273
FFieldContext(FFieldContext &&)=delete
TArray< float > & ScalarResults
Definition FieldSystem.h:335
TArray< FFieldContextIndex > & IndexResults
Definition FieldSystem.h:337
Definition FieldSystem.h:76
TArray< Chaos::FGeometryParticleHandle * > ParticleHandles[(uint8) EFieldCommandHandlesType::NumHandles]
Definition FieldSystem.h:84
TArray< FVector > SamplePositions
Definition FieldSystem.h:78
TArray< FVector > FieldOutputs[(uint8) EFieldCommandOutputType::NumOutputs]
Definition FieldSystem.h:87
TArray< int32 > IntegerResults[(uint8) EFieldCommandResultType::NumResults]
Definition FieldSystem.h:96
TArray< float > ScalarResults[(uint8) EFieldCommandResultType::NumResults]
Definition FieldSystem.h:93
TArray< FVector > VectorResults[(uint8) EFieldCommandResultType::NumResults]
Definition FieldSystem.h:90
TArray< FFieldContextIndex > IndexResults[(uint8) EFieldCommandResultType::NumResults]
Definition FieldSystem.h:99
TArray< FFieldContextIndex > SampleIndices
Definition FieldSystem.h:81
Definition Tuple.h:652
static TVector< double > Zero()
Definition Vector.h:112