UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
InstanceDataSceneProxy.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "InstanceDataTypes.h"
6#include "RenderTransform.h"
7#include "Tasks/Task.h"
10
13
15{
16public:
18
22 inline bool IsIdentity() const { return IndexToIdMap.IsEmpty(); }
23
28
33
37 inline bool IsValidId(FPrimitiveInstanceId InstanceId) const { return InstanceId.Id >= 0 && InstanceId.Id < GetMaxInstanceId() && (IsIdentity() || IdToIndexMap[InstanceId.Id] != INDEX_NONE); }
41 inline int32 IdToIndex(FPrimitiveInstanceId InstanceId) const
42 {
43 return IsIdentity() ? InstanceId.Id : IdToIndexMap[InstanceId.Id];
44 }
45
49 inline FPrimitiveInstanceId IndexToId(int32 InstanceIndex) const
50 {
51 check(InstanceIndex < GetMaxInstanceIndex());
52 return IsIdentity() ? FPrimitiveInstanceId{ InstanceIndex } : IndexToIdMap[InstanceIndex];
53 }
54
58 inline void SetInvalid(FPrimitiveInstanceId InstanceId)
59 {
60 IdToIndexMap[InstanceId.Id] = INDEX_NONE;
61 }
62
67 inline void Update(FPrimitiveInstanceId InstanceId, int32 InstanceIndex)
68 {
69 IndexToIdMap[InstanceIndex] = InstanceId;
70 IdToIndexMap[InstanceId.Id] = InstanceIndex;
71 }
72
77
82
88
92
96
97protected:
98
101 ENGINE_API void RebuildFromIndexToIdMap(int32 MaxInstanceId);
102
103 // Bidirectional mapping to / from ID.
106 // used when the mapping is implicit (i.e., identity)
108};
109
110#if WITH_EDITOR
111
113{
114 static inline uint32 Pack(const FColor& HitProxyColor, bool bSelected)
115 {
116 return uint32(HitProxyColor.R) | uint32(HitProxyColor.G) << 8u | uint32(HitProxyColor.B) << 16u | (bSelected ? 1u << 24u : 0u);
117 }
118
119 static inline void Unpack(const uint32 Packed, FColor& OutHitProxyColor, bool& bOutSelected)
120 {
121 OutHitProxyColor.R = uint8((Packed >> 0u) & 0xFFu);
122 OutHitProxyColor.G = uint8((Packed >> 8u) & 0xFFu);
123 OutHitProxyColor.B = uint8((Packed >> 16u) & 0xFFu);
124 bOutSelected = (Packed >> 24u) != 0;
125 }
126};
127
128#endif
129
135{
136public:
140
154
155 inline const FInstanceDataFlags& GetFlags() const { return Flags; }
156
158 inline int32 GetNumCustomDataFloats(FAccessTag AccessTag = FAccessTag()) const { ValidateAccess(AccessTag); return NumCustomDataFloats; }
159
161
162
163 ENGINE_API uint32 GetPayloadDataStride(FAccessTag AccessTag = FAccessTag()) const;
164
168 ENGINE_API FRenderBounds GetInstanceLocalBounds(int32 InstanceIndex, FAccessTag AccessTag = FAccessTag()) const;
169
175 ENGINE_API FRenderBounds GetInstancePrimitiveRelativeBounds(int32 InstanceIndex, FAccessTag AccessTag = FAccessTag()) const;
176
180 ENGINE_API FBoxSphereBounds GetInstanceWorldBounds(int32 InstanceIndex, FAccessTag AccessTag = FAccessTag()) const;
181
184 ENGINE_API FMatrix GetInstanceToWorld(int32 InstanceIndex, FAccessTag AccessTag = FAccessTag()) const;
185
187 inline bool IsInstanceDataGPUOnly(FAccessTag AccessTag = FAccessTag()) const { ValidateAccess(AccessTag); return bInstanceDataIsGPUOnly; }
188
191 inline FRenderTransform GetInstanceToPrimitiveRelative(int32 InstanceIndex, FAccessTag AccessTag = FAccessTag()) const { ValidateAccess(AccessTag); return InstanceToPrimitiveRelative[InstanceIndex]; }
192
196
201
202 inline bool GetInstanceVisible(int32 InstanceIndex, FAccessTag AccessTag = FAccessTag()) const { ValidateAccess(AccessTag);return !Flags.bHasPerInstanceVisible || VisibleInstances[InstanceIndex]; }
203
205
207
208 ENGINE_API void SetPrimitiveLocalToWorld(const FMatrix &PrimitiveLocalToWorld, FAccessTag AccessTag = FAccessTag());
209
210 ENGINE_API FInstanceDataBufferHeader GetHeader(FAccessTag AccessTag = FAccessTag()) const;
211
212 ENGINE_API void ValidateData() const;
213
215 {
216 // TODO: compress the location - store delta to primitive loc for example
219 };
220
245
247 {
248 check(AccessTag.Kind == FAccessTag::EKind::Writer && AccessTag.WriterTag != 0u);
249 uint32 PrevTagValue = 0u;
250#if DO_CHECK
251 check(CurrentWriterTag.Value.compare_exchange_strong(PrevTagValue, AccessTag.WriterTag));
252#endif
253 return FWriteView
254 {
255 AccessTag,
267 #if WITH_EDITOR
269 SelectedInstances,
270 #endif
274 Flags
275 };
276 }
278 {
280 check(AccessTag.Kind == FAccessTag::EKind::Writer && AccessTag.WriterTag != 0u);
281 uint32 PrevTagValue = AccessTag.WriterTag;
282#if DO_CHECK
283 check(CurrentWriterTag.Value.compare_exchange_strong(PrevTagValue, 0U));
284#endif
285 }
286
287
312
341
342 ENGINE_API void SetImmutable(FInstanceSceneDataImmutable &&ImmutableData, FAccessTag AccessTag);
344
345protected:
357#if WITH_EDITOR
359 TBitArray<> SelectedInstances;
360#endif
362
366
368 bool bInstanceDataIsGPUOnly : 1 = false;
369
370#if DO_CHECK
371 struct FCurrentWriterTag
372 {
375 {
376 check(Other.Value == 0u);
377 }
378
379 std::atomic<uint32> Value = 0;
380 };
382
383 inline void ValidateAccess(const FAccessTag& AccessTag) const
384 {
385 check(AccessTag.Kind == FAccessTag::EKind::Reader && CurrentWriterTag.Value == 0u
386 || AccessTag.Kind == FAccessTag::EKind::Writer && CurrentWriterTag.Value == AccessTag.WriterTag);
387 }
388#else
389 inline void ValidateAccess(const FAccessTag& AccessTag) const {}
390#endif
391
393};
394
399{
400public:
402
403 inline const TArray<FInstanceSceneDataBuffers::FCompressedSpatialHashItem> &GetCompressedInstanceSpatialHashes() const { return CompressedInstanceSpatialHashes; }
404private:
405 // Encodes consecutive ranges of instances that share the same spatial hash location
407};
408
413{
414public:
416
417 //
418 ENGINE_API void UpdateDefaultInstance(const FMatrix &PrimitiveLocalToWorld, const FRenderBounds LocalBounds);
419};
420
425{
426public:
431 inline const FInstanceDataBufferHeader &GetHeader() const { return InstanceDataBufferHeader; }
432
437
438private:
439 template <typename TaskLambdaType>
440 friend void BeginInstanceDataUpdateTask(FInstanceDataUpdateTaskInfo& InstanceDataUpdateTaskInfo, TaskLambdaType&& TaskLambda, const FInstanceDataBufferHeader& InInstanceDataBufferHeader);
441
442
443 UE::Tasks::FTask UpdateTaskHandle;
444 FInstanceDataBufferHeader InstanceDataBufferHeader;
445};
446
#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
ESceneDepthPriorityGroup
Definition EngineTypes.h:187
uint8_t uint8
Definition binka_ue_file_header.h:8
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition Archive.h:1208
Definition InstanceDataSceneProxy.h:448
virtual const FInstanceSceneDataBuffers * GeInstanceSceneDataBuffers() const
Definition InstanceDataSceneProxy.h:454
ENGINE_API FInstanceDataSceneProxy()
Definition InstanceDataSceneProxy.cpp:289
FInstanceSceneDataBuffers InstanceSceneDataBuffers
Definition InstanceDataSceneProxy.h:472
virtual FInstanceDataUpdateTaskInfo * GetUpdateTaskInfo()
Definition InstanceDataSceneProxy.h:459
ENGINE_API void IncStatCounters()
Definition InstanceDataSceneProxy.cpp:303
ENGINE_API void DecStatCounters()
Definition InstanceDataSceneProxy.cpp:331
virtual void DebugDrawInstanceChanges(FPrimitiveDrawInterface *DebugPDI, ESceneDepthPriorityGroup SceneDepthPriorityGroup)
Definition InstanceDataSceneProxy.h:461
virtual ENGINE_API ~FInstanceDataSceneProxy()
Definition InstanceDataSceneProxy.cpp:298
virtual FStaticMeshInstanceBuffer * GetLegacyInstanceBuffer()
Definition InstanceDataSceneProxy.h:466
Definition InstanceDataSceneProxy.h:425
friend void BeginInstanceDataUpdateTask(FInstanceDataUpdateTaskInfo &InstanceDataUpdateTaskInfo, TaskLambdaType &&TaskLambda, const FInstanceDataBufferHeader &InInstanceDataBufferHeader)
Definition InstanceDataUpdateUtils.h:363
ENGINE_API void WaitForUpdateCompletion()
Definition InstanceDataSceneProxy.cpp:284
const FInstanceDataBufferHeader & GetHeader() const
Definition InstanceDataSceneProxy.h:431
Definition InstanceDataSceneProxy.h:15
ENGINE_API void CreateExplicitIdentityMapping()
Definition InstanceDataSceneProxy.cpp:51
int32 NumInstances
Definition InstanceDataSceneProxy.h:107
ENGINE_API void RebuildFromIndexToIdMap(TArray< FPrimitiveInstanceId > &&InIndexToIdMap, int32 MaxInstanceId)
Definition InstanceDataSceneProxy.cpp:101
int32 GetMaxInstanceId() const
Definition InstanceDataSceneProxy.h:27
int32 GetMaxInstanceIndex() const
Definition InstanceDataSceneProxy.h:32
bool IsIdentity() const
Definition InstanceDataSceneProxy.h:22
void Update(FPrimitiveInstanceId InstanceId, int32 InstanceIndex)
Definition InstanceDataSceneProxy.h:67
FPrimitiveInstanceId IndexToId(int32 InstanceIndex) const
Definition InstanceDataSceneProxy.h:49
TArray< int32 > IdToIndexMap
Definition InstanceDataSceneProxy.h:105
int32 IdToIndex(FPrimitiveInstanceId InstanceId) const
Definition InstanceDataSceneProxy.h:41
bool IsValidId(FPrimitiveInstanceId InstanceId) const
Definition InstanceDataSceneProxy.h:37
TArray< FPrimitiveInstanceId > IndexToIdMap
Definition InstanceDataSceneProxy.h:104
ENGINE_API void ResizeExplicit(int32 InNumInstances, int32 MaxInstanceId)
Definition InstanceDataSceneProxy.cpp:31
FInstanceIdIndexMap()=default
void SetInvalid(FPrimitiveInstanceId InstanceId)
Definition InstanceDataSceneProxy.h:58
Definition InstanceDataSceneProxy.h:135
TArray< FRenderTransform > PrevInstanceToPrimitiveRelative
Definition InstanceDataSceneProxy.h:356
int32 GetNumCustomDataFloats(FAccessTag AccessTag=FAccessTag()) const
Definition InstanceDataSceneProxy.h:158
TArray< FRenderBounds > InstanceLocalBounds
Definition InstanceDataSceneProxy.h:348
FWriteView BeginWriteAccess(FAccessTag AccessTag)
Definition InstanceDataSceneProxy.h:246
ENGINE_API FInstanceSceneDataBuffers()
Definition InstanceDataSceneProxy.cpp:107
FInstanceSceneDataImmutablePtr Immutable
Definition InstanceDataSceneProxy.h:392
FInstanceDataFlags Flags
Definition InstanceDataSceneProxy.h:365
ENGINE_API void ValidateData() const
Definition InstanceDataSceneProxy.cpp:245
FInstanceSceneDataImmutablePtr GetImmutable() const
Definition InstanceDataSceneProxy.h:343
TArray< float > InstanceRandomIDs
Definition InstanceDataSceneProxy.h:350
bool GetInstanceVisible(int32 InstanceIndex, FAccessTag AccessTag=FAccessTag()) const
Definition InstanceDataSceneProxy.h:202
ENGINE_API void SetPrimitiveLocalToWorld(const FMatrix &PrimitiveLocalToWorld, FAccessTag AccessTag=FAccessTag())
Definition InstanceDataSceneProxy.cpp:222
int32 NumCustomDataFloats
Definition InstanceDataSceneProxy.h:364
FReadView GetReadView(FAccessTag AccessTag=FAccessTag()) const
Definition InstanceDataSceneProxy.h:313
void EndWriteAccess(FAccessTag AccessTag)
Definition InstanceDataSceneProxy.h:277
TArray< uint32 > InstanceHierarchyOffset
Definition InstanceDataSceneProxy.h:353
ENGINE_API void SetImmutable(FInstanceSceneDataImmutable &&ImmutableData, FAccessTag AccessTag)
Definition InstanceDataSceneProxy.cpp:261
FRenderTransform PrimitiveToRelativeWorld
Definition InstanceDataSceneProxy.h:346
TArray< uint32 > InstanceSkinningData
Definition InstanceDataSceneProxy.h:352
const FInstanceDataFlags & GetFlags() const
Definition InstanceDataSceneProxy.h:155
static ENGINE_API uint32 CalcPayloadDataStride(FInstanceDataFlags Flags, int32 InNumCustomDataFloats, int32 InNumPayloadExtensionFloat4s)
Definition InstanceDataSceneProxy.cpp:116
const FVector & GetPrimitiveWorldSpaceOffset(FAccessTag AccessTag=FAccessTag()) const
Definition InstanceDataSceneProxy.h:200
FRenderTransform GetInstanceToPrimitiveRelative(int32 InstanceIndex, FAccessTag AccessTag=FAccessTag()) const
Definition InstanceDataSceneProxy.h:191
void ValidateAccess(const FAccessTag &AccessTag) const
Definition InstanceDataSceneProxy.h:389
ENGINE_API FMatrix GetInstanceToWorld(int32 InstanceIndex, FAccessTag AccessTag=FAccessTag()) const
Definition InstanceDataSceneProxy.cpp:205
ENGINE_API FRenderBounds GetInstanceLocalBounds(int32 InstanceIndex, FAccessTag AccessTag=FAccessTag()) const
Definition InstanceDataSceneProxy.cpp:181
TArray< FVector4f > InstancePayloadExtension
Definition InstanceDataSceneProxy.h:354
bool bInstanceDataIsGPUOnly
Definition InstanceDataSceneProxy.h:368
TArray< FVector4f > InstanceLightShadowUVBias
Definition InstanceDataSceneProxy.h:351
bool IsInstanceDataGPUOnly(FAccessTag AccessTag=FAccessTag()) const
Definition InstanceDataSceneProxy.h:187
FVector PrimitiveWorldSpaceOffset
Definition InstanceDataSceneProxy.h:347
int32 GetNumInstances(FAccessTag AccessTag=FAccessTag()) const
Definition InstanceDataSceneProxy.h:157
ENGINE_API FBoxSphereBounds GetInstanceWorldBounds(int32 InstanceIndex, FAccessTag AccessTag=FAccessTag()) const
Definition InstanceDataSceneProxy.cpp:194
ENGINE_API FRenderTransform ComputeInstanceToPrimitiveRelative(const FMatrix44f &InstanceToPrimitive, FAccessTag AccessTag=FAccessTag())
Definition InstanceDataSceneProxy.cpp:212
ENGINE_API FInstanceDataBufferHeader GetHeader(FAccessTag AccessTag=FAccessTag()) const
Definition InstanceDataSceneProxy.cpp:230
FInstanceSceneDataBuffers(FInstanceSceneDataBuffers &&Other)=default
int32 NumInstancesGPUOnly
Definition InstanceDataSceneProxy.h:363
TArray< FRenderTransform > InstanceToPrimitiveRelative
Definition InstanceDataSceneProxy.h:355
ENGINE_API FRenderBounds GetInstancePrimitiveRelativeBounds(int32 InstanceIndex, FAccessTag AccessTag=FAccessTag()) const
Definition InstanceDataSceneProxy.cpp:188
TArray< float > InstanceCustomData
Definition InstanceDataSceneProxy.h:349
const FRenderTransform & GetPrimitiveToRelativeWorld(FAccessTag AccessTag=FAccessTag()) const
Definition InstanceDataSceneProxy.h:204
FRenderTransform GetPrevInstanceToPrimitiveRelative(int32 InstanceIndex, FAccessTag AccessTag=FAccessTag()) const
Definition InstanceDataSceneProxy.h:195
ENGINE_API uint32 GetPayloadDataStride(FAccessTag AccessTag=FAccessTag()) const
Definition InstanceDataSceneProxy.cpp:162
TBitArray VisibleInstances
Definition InstanceDataSceneProxy.h:361
Definition InstanceDataSceneProxy.h:399
FInstanceSceneDataImmutable(const TArray< FInstanceSceneDataBuffers::FCompressedSpatialHashItem > &InCompressedInstanceSpatialHashes)
Definition InstanceDataSceneProxy.h:401
const TArray< FInstanceSceneDataBuffers::FCompressedSpatialHashItem > & GetCompressedInstanceSpatialHashes() const
Definition InstanceDataSceneProxy.h:403
Definition PrimitiveDrawInterface.h:19
Definition InstanceDataSceneProxy.h:413
ENGINE_API FSingleInstanceDataBuffers()
Definition InstanceDataSceneProxy.cpp:268
ENGINE_API void UpdateDefaultInstance(const FMatrix &PrimitiveLocalToWorld, const FRenderBounds LocalBounds)
Definition InstanceDataSceneProxy.cpp:275
Definition InstancedStaticMesh.h:71
Definition Array.h:670
UE_REWRITE SizeType Num() const
Definition Array.h:1144
UE_REWRITE bool IsEmpty() const
Definition Array.h:1133
bool Unpack(FUdpPingPacket &OutPacket, uint8 *const Buf, const SIZE_T BufSize)
Definition UDPPing.cpp:1154
Definition Color.h:486
uint8 G
Definition Color.h:492
uint8 R
Definition Color.h:492
uint8 B
Definition Color.h:492
Definition InstanceDataTypes.h:65
Definition InstanceDataSceneProxy.h:142
FAccessTag(uint32 InWriterTag)
Definition InstanceDataSceneProxy.h:149
uint32 WriterTag
Definition InstanceDataSceneProxy.h:151
EKind
Definition InstanceDataSceneProxy.h:144
EKind Kind
Definition InstanceDataSceneProxy.h:152
FAccessTag()
Definition InstanceDataSceneProxy.h:148
Definition InstanceDataSceneProxy.h:215
RenderingSpatialHash::FLocation64 Location
Definition InstanceDataSceneProxy.h:217
int32 NumInstances
Definition InstanceDataSceneProxy.h:218
Definition InstanceDataSceneProxy.h:289
const TArray< FRenderTransform > & InstanceToPrimitiveRelative
Definition InstanceDataSceneProxy.h:299
const TArray< FVector4f > & InstanceLightShadowUVBias
Definition InstanceDataSceneProxy.h:295
int32 NumInstancesGPUOnly
Definition InstanceDataSceneProxy.h:307
const TArray< uint32 > & InstanceHierarchyOffset
Definition InstanceDataSceneProxy.h:297
const TArray< FRenderTransform > & PrevInstanceToPrimitiveRelative
Definition InstanceDataSceneProxy.h:300
const TArray< uint32 > & InstanceSkinningData
Definition InstanceDataSceneProxy.h:296
const TArray< float > & InstanceRandomIDs
Definition InstanceDataSceneProxy.h:294
const TArray< FRenderBounds > & InstanceLocalBounds
Definition InstanceDataSceneProxy.h:292
const TArray< FVector4f > & InstancePayloadExtension
Definition InstanceDataSceneProxy.h:298
const FRenderTransform & PrimitiveToRelativeWorld
Definition InstanceDataSceneProxy.h:290
const TBitArray & VisibleInstances
Definition InstanceDataSceneProxy.h:305
bool bInstanceDataIsGPUOnly
Definition InstanceDataSceneProxy.h:310
const FVector & PrimitiveWorldSpaceOffset
Definition InstanceDataSceneProxy.h:291
int32 NumCustomDataFloats
Definition InstanceDataSceneProxy.h:308
FInstanceDataFlags Flags
Definition InstanceDataSceneProxy.h:309
const TArray< float > & InstanceCustomData
Definition InstanceDataSceneProxy.h:293
Definition InstanceDataSceneProxy.h:222
FRenderTransform & PrimitiveToRelativeWorld
Definition InstanceDataSceneProxy.h:224
TArray< float > & InstanceRandomIDs
Definition InstanceDataSceneProxy.h:228
TArray< uint32 > & InstanceHierarchyOffset
Definition InstanceDataSceneProxy.h:231
FInstanceDataFlags & Flags
Definition InstanceDataSceneProxy.h:243
int32 & NumCustomDataFloats
Definition InstanceDataSceneProxy.h:242
TArray< FVector4f > & InstancePayloadExtension
Definition InstanceDataSceneProxy.h:232
TArray< FRenderTransform > & InstanceToPrimitiveRelative
Definition InstanceDataSceneProxy.h:233
TBitArray & VisibleInstances
Definition InstanceDataSceneProxy.h:239
TArray< FRenderTransform > & PrevInstanceToPrimitiveRelative
Definition InstanceDataSceneProxy.h:234
FVector & PrimitiveWorldSpaceOffset
Definition InstanceDataSceneProxy.h:225
TArray< FVector4f > & InstanceLightShadowUVBias
Definition InstanceDataSceneProxy.h:229
TArray< float > & InstanceCustomData
Definition InstanceDataSceneProxy.h:227
FInstanceSceneDataBuffers::FAccessTag AccessTag
Definition InstanceDataSceneProxy.h:223
TArray< uint32 > & InstanceSkinningData
Definition InstanceDataSceneProxy.h:230
TArray< FRenderBounds > & InstanceLocalBounds
Definition InstanceDataSceneProxy.h:226
int32 & NumInstancesGPUOnly
Definition InstanceDataSceneProxy.h:241
Definition InstanceDataTypes.h:19
int32 Id
Definition InstanceDataTypes.h:32
Definition RenderTransform.h:272
Definition RenderTransform.h:23
Definition RenderingSpatialHash.h:17
Definition BoxSphereBounds.h:25
Definition InstanceDataTypes.h:36
uint16 bHasPerInstanceVisible
Definition InstanceDataTypes.h:48