8#include "Containers/Array.h"
15#define INSTANCE_DATA_UPDATE_ENABLE_ASYNC_TASK 1
22template <
typename DeltaType,
typename ValueType,
typename IndexRemapType>
26 if (
Delta.IsDelta() || !IndexRemap.IsIdentity())
29 for (
auto It =
Delta.GetIterator(); It; ++It)
50template <
typename DeltaType,
typename ValueType,
typename IndexRemapType>
67template <
typename DeltaType,
typename ValueType,
typename InValueArrayType>
75 else if (
Delta.IsEmpty())
79 else if (
Delta.IsDelta() || ElementStride != 1)
82 for (
auto It =
Delta.GetIterator(); It; ++It)
85 OutDest.Append(&
InSource[It.GetIndex() * ElementStride], ElementStride);
119template<
typename ValueType>
124 FMemory::Memcpy(&Data[
ToIndex * NumElements], &Data[FromIndex * NumElements], NumElements *
sizeof(ValueType));
212template <
typename DeltaType,
typename IndexRemapType>
225 for (
auto It =
DeltaRange.GetIterator(); It; ++It)
227 int32 ItemIndex = It.GetItemIndex();
228 int32 InstanceIndex = It.GetIndex();
230 if (IndexRemap.Remap(ItemIndex, InstanceIndex))
242 for (
auto It =
DeltaRange.GetIterator(); It; ++It)
244 int32 ItemIndex = It.GetItemIndex();
245 int32 InstanceIndex = It.GetIndex();
247 if (IndexRemap.Remap(ItemIndex, InstanceIndex))
271template <
typename IndexRemapType>
275 if (
ChangeSet.bIdentityIdMap && IndexRemap.IsIdentity())
286 if (bIsFull && IndexRemap.IsIdentity())
307 for (
auto It =
IndexDelta.GetIterator(); It; ++It)
310 int32 ItemIndex = It.GetItemIndex();
321template <
typename IndexRemapType>
331 ChangeSet.GetEditorDataReader().Scatter(ProxyData.InstanceEditorData, IndexRemap);
335 if (
ChangeSet.Flags.bHasPerInstanceRandom)
342 if (
ChangeSet.GeneratePerInstanceRandomIds)
362template <
typename TaskLambdaType>
369#if INSTANCE_DATA_UPDATE_ENABLE_ASYNC_TASK
377template <
typename ProxyType,
typename TaskLambdaType>
385 check(!InstanceDataUpdateTaskInfo || InstanceDataUpdateTaskInfo->
GetHeader() == InstanceDataBufferHeader);
387 check(!InstanceDataUpdateTaskInfo || InstanceDataUpdateTaskInfo->
GetHeader() == InstanceDataBufferHeader);
388 check(!InstanceDataUpdateTaskInfo || InstanceDataBufferHeader.
NumInstances == InstanceDataProxy->GeInstanceSceneDataBuffers()->GetNumInstances());
408 if (InstanceDataUpdateTaskInfo)
422 [InstanceDataUpdateTaskInfo,
423 InstanceDataBufferHeader,
426 if (InstanceDataUpdateTaskInfo)
440 template <
typename ScalarType>
468 template <
typename GetWorldSpaceInstanceSphereFuncType>
473 SortedInstances.Reserve(NumInstances);
474 for (
int32 InstanceIndex = 0; InstanceIndex < NumInstances; ++InstanceIndex)
482 Item.InstanceIndex = InstanceIndex;
486 SortedInstances.Sort(
489 if (
A.InstanceLoc.Level !=
B.InstanceLoc.Level)
491 return A.InstanceLoc.Level < B.InstanceLoc.Level;
493 if (
A.InstanceLoc.Coord.X !=
B.InstanceLoc.Coord.X)
495 return A.InstanceLoc.Coord.X < B.InstanceLoc.Coord.X;
497 if (
A.InstanceLoc.Coord.Y !=
B.InstanceLoc.Coord.Y)
499 return A.InstanceLoc.Coord.Y < B.InstanceLoc.Coord.Y;
501 if (
A.InstanceLoc.Coord.Z !=
B.InstanceLoc.Coord.Z)
503 return A.InstanceLoc.Coord.Z < B.InstanceLoc.Coord.Z;
505 return A.InstanceIndex <
B.InstanceIndex;
#define check(expr)
Definition AssertionMacros.h:314
#define FORCEINLINE_DEBUGGABLE
Definition CoreMiscDefines.h:74
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
FORCEINLINE uint32 ToIndex(FHairStrandsTiles::ETileType Type)
Definition HairStrandsData.h:93
void Gather(const DeltaType &Delta, TArray< ValueType > &OutDest, const InValueArrayType &InSource, int32 ElementStride=1)
Definition InstanceDataUpdateUtils.h:68
void BeginInstanceDataUpdateTask(FInstanceDataUpdateTaskInfo &InstanceDataUpdateTaskInfo, TaskLambdaType &&TaskLambda, const FInstanceDataBufferHeader &InInstanceDataBufferHeader)
Definition InstanceDataUpdateUtils.h:363
FVector3f GetLocalBoundsPadExtent(const FRenderTransform &LocalToWorld, float PadAmount)
Definition InstanceDataUpdateUtils.h:256
FArchive & operator<<(FArchive &Ar, FInstanceSceneDataBuffers::FCompressedSpatialHashItem &Item)
Definition InstanceDataUpdateUtils.h:449
FORCEINLINE_DEBUGGABLE FRenderTransform VectorMatrixMultiply(const FRenderTransform &LocalToPrimitive, const FRenderTransformVectorRegister &PrimitiveToWorld)
Definition InstanceDataUpdateUtils.h:149
void ApplyAttributeChanges(FInstanceUpdateChangeSet &ChangeSet, const IndexRemapType &IndexRemap, FInstanceSceneDataBuffers::FWriteView &ProxyData)
Definition InstanceDataUpdateUtils.h:322
void UpdateIdMapping(FInstanceUpdateChangeSet &ChangeSet, const IndexRemapType &IndexRemap, FInstanceIdIndexMap &OutInstanceIdIndexMap)
Definition InstanceDataUpdateUtils.h:272
void Scatter(const DeltaType &Delta, TArray< ValueType > &OutDest, int32 DestNumElements, TArray< ValueType > &&InSource, const IndexRemapType &IndexRemap, int32 ElementStride=1)
Definition InstanceDataUpdateUtils.h:23
void CondMove(bool bCondition, TArray< ValueType > &Data, int32 FromIndex, int32 ToIndex, int32 NumElements=1)
Definition InstanceDataUpdateUtils.h:120
void DispatchInstanceDataUpdateTask(bool bIsUnattached, const TSharedPtr< ProxyType, ESPMode::ThreadSafe > &InstanceDataProxy, const FInstanceDataBufferHeader &InstanceDataBufferHeader, TaskLambdaType &&TaskLambda)
Definition InstanceDataUpdateUtils.h:378
FORCEINLINE void ApplyTransformUpdates(const DeltaType &DeltaRange, const IndexRemapType &IndexRemap, const FRenderTransform &PrimitiveToRelativeWorld, const TArray< FRenderTransform > &InstanceTransforms, int32 PostUpdateNumTransforms, TArray< FRenderTransform > &OutInstanceToPrimitiveRelative)
Definition InstanceDataUpdateUtils.h:213
UE::Math::TVector< float > FVector3f
Definition MathFwd.h:73
#define ENQUEUE_RENDER_COMMAND(Type)
Definition RenderingThread.h:1167
FORCEINLINE VectorRegister4Double VectorLoadFloat3(const double *Ptr)
Definition UnrealMathFPU.h:427
FORCEINLINE VectorRegister4Float VectorMultiply(const VectorRegister4Float &Vec1, const VectorRegister4Float &Vec2)
Definition UnrealMathFPU.h:758
FORCEINLINE VectorRegister4Float VectorMultiplyAdd(const VectorRegister4Float &Vec1, const VectorRegister4Float &Vec2, const VectorRegister4Float &Vec3)
Definition UnrealMathFPU.h:786
FORCEINLINE void VectorStore(const VectorRegister4Float &Vec, float *Dst)
Definition UnrealMathFPU.h:566
FORCEINLINE VectorRegister4Float VectorLoad(const float *Ptr)
Definition UnrealMathFPU.h:394
FORCEINLINE void VectorStoreFloat3(const VectorRegister4Float &Vec, float *Dst)
Definition UnrealMathFPU.h:594
#define VectorReplicate(Vec, ElementIndex)
Definition UnrealMathFPU.h:627
#define UE_SMALL_NUMBER
Definition UnrealMathUtility.h:130
UE_INTRINSIC_CAST UE_REWRITE constexpr std::remove_reference_t< T > && MoveTemp(T &&Obj) noexcept
Definition UnrealTemplate.h:520
if(Failed) console_printf("Failed.\n")
Definition Archive.h:1208
Definition InstanceUpdateChangeSet.h:16
Definition InstanceDataSceneProxy.h:425
ENGINE_API void WaitForUpdateCompletion()
Definition InstanceDataSceneProxy.cpp:284
const FInstanceDataBufferHeader & GetHeader() const
Definition InstanceDataSceneProxy.h:431
Definition InstanceDataSceneProxy.h:15
Definition InstanceUpdateChangeSet.h:298
Definition RHICommandList.h:3819
void SetNumZeroed(SizeType NewNum, EAllowShrinking AllowShrinking=UE::Core::Private::AllowShrinkingByDefault< AllocatorType >())
Definition Array.h:2340
void Reset(SizeType NewSize=0)
Definition Array.h:2246
Definition BitArray.h:1944
Definition SharedPointer.h:692
Definition InstanceDataUpdateUtils.h:439
FArchive & operator<<(FArchive &Ar, TLocation< ScalarType > &Item)
Definition InstanceDataUpdateUtils.h:441
FLocation64 CalcLevelAndLocationClamped(const FVector3d &Center, double Radius, int32 FirstLevel)
Definition RenderingSpatialHash.h:131
Private::FTaskHandle FTask
Definition Task.h:333
TTask< TInvokeResult_T< TaskBodyType > > Launch(const TCHAR *DebugName, TaskBodyType &&TaskBody, ETaskPriority Priority=ETaskPriority::Normal, EExtendedTaskPriority ExtendedPriority=EExtendedTaskPriority::None, ETaskFlags Flags=ETaskFlags::None)
Definition Task.h:266
U16 Index
Definition radfft.cpp:71
Definition InstanceDataUpdateUtils.h:93
FORCEINLINE constexpr bool RemapDestIndex(int32 Index) const
Definition InstanceDataUpdateUtils.h:96
FORCEINLINE constexpr bool IsIdentity() const
Definition InstanceDataUpdateUtils.h:94
FORCEINLINE int32 operator[](int32 InIndex) const
Definition InstanceDataUpdateUtils.h:95
FORCEINLINE bool Remap(int32 &SrcIndex, int32 &DstIndex) const
Definition InstanceDataUpdateUtils.h:97
Definition InstanceDataSceneProxy.h:215
RenderingSpatialHash::FLocation64 Location
Definition InstanceDataSceneProxy.h:217
int32 NumInstances
Definition InstanceDataSceneProxy.h:218
Definition InstanceDataSceneProxy.h:222
TArray< float > & InstanceRandomIDs
Definition InstanceDataSceneProxy.h:228
FInstanceDataFlags & Flags
Definition InstanceDataSceneProxy.h:243
int32 & NumCustomDataFloats
Definition InstanceDataSceneProxy.h:242
TArray< FVector4f > & InstanceLightShadowUVBias
Definition InstanceDataSceneProxy.h:229
TArray< float > & InstanceCustomData
Definition InstanceDataSceneProxy.h:227
TArray< uint32 > & InstanceSkinningData
Definition InstanceDataSceneProxy.h:230
static UE_FORCEINLINE_HINT void * Memcpy(void *Dest, const void *Src, SIZE_T Count)
Definition UnrealMemory.h:160
Definition InstanceDataTypes.h:19
Definition InstanceDataUpdateUtils.h:104
FORCEINLINE constexpr bool IsIdentity() const
Definition InstanceDataUpdateUtils.h:105
FORCEINLINE bool RemapDestIndex(int32 &Index) const
Definition InstanceDataUpdateUtils.h:107
FORCEINLINE bool Remap(int32 &SrcIndex, int32 &DstIndex) const
Definition InstanceDataUpdateUtils.h:108
const TArray< int32 > & IndexRemap
Definition InstanceDataUpdateUtils.h:113
FORCEINLINE FSrcIndexRemap(const TArray< int32 > &InIndexRemap)
Definition InstanceDataUpdateUtils.h:106
Definition RenderingSpatialHash.h:17
FIntVector3 Coord
Definition RenderingSpatialHash.h:19
int32 Level
Definition RenderingSpatialHash.h:20
static CORE_API const TVector< float > ZeroVector
Definition Vector.h:79
T X
Definition Vector.h:62
Definition UnrealMathFPU.h:20
Definition InstanceDataTypes.h:36
uint16 bHasPerInstanceDynamicData
Definition InstanceDataTypes.h:42
uint16 bHasPerInstancePayloadExtension
Definition InstanceDataTypes.h:47
uint16 bHasPerInstanceLocalBounds
Definition InstanceDataTypes.h:45
uint16 bHasPerInstanceLMSMUVBias
Definition InstanceDataTypes.h:44
uint16 bHasPerInstanceCustomData
Definition InstanceDataTypes.h:41
uint16 bHasPerInstanceHierarchyOffset
Definition InstanceDataTypes.h:46
uint16 bHasPerInstanceEditorData
Definition InstanceDataTypes.h:49
uint16 bHasPerInstanceSkinningData
Definition InstanceDataTypes.h:43