UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
HierarchicalInstancedStaticMeshComponent.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "CoreMinimal.h"
6#include "Stats/Stats.h"
8#include "Async/AsyncWork.h"
10#include "StaticMeshResources.h"
11
12#include "HierarchicalInstancedStaticMeshComponent.generated.h"
13
14class FStaticLightingTextureMapping_InstancedStaticMesh;
15
16
17UENUM()
19{
20 Grass,
21 Foliage,
22 HISM
23};
24
25// Due to BulkSerialize we can't edit the struct, so we must deprecated this one and create a new one
26USTRUCT()
28{
30
31 UPROPERTY()
32 FVector3f BoundMin;
33 UPROPERTY()
34 int32 FirstChild;
35 UPROPERTY()
36 FVector3f BoundMax;
37 UPROPERTY()
38 int32 LastChild;
39 UPROPERTY()
40 int32 FirstInstance;
41 UPROPERTY()
42 int32 LastInstance;
43
45 : BoundMin(MAX_flt, MAX_flt, MAX_flt)
46 , FirstChild(-1)
47 , BoundMax(-MAX_flt, -MAX_flt, -MAX_flt)
48 , LastChild(-1)
49 , FirstInstance(-1)
50 , LastInstance(-1)
51 {
52 }
53
55 {
56 // @warning BulkSerialize: FClusterNode is serialized as memory dump
57 // See TArray::BulkSerialize for detailed description of implied limitations.
58 Ar << NodeData.BoundMin;
59 Ar << NodeData.FirstChild;
60 Ar << NodeData.BoundMax;
61 Ar << NodeData.LastChild;
62 Ar << NodeData.FirstInstance;
63 Ar << NodeData.LastInstance;
64
65 return Ar;
66 }
67};
68
69
70USTRUCT()
72{
74
75 UPROPERTY()
76 FVector3f BoundMin;
77 UPROPERTY()
78 int32 FirstChild;
79 UPROPERTY()
80 FVector3f BoundMax;
81 UPROPERTY()
82 int32 LastChild;
83 UPROPERTY()
84 int32 FirstInstance;
85 UPROPERTY()
86 int32 LastInstance;
87
88 UPROPERTY()
89 FVector3f MinInstanceScale;
90 UPROPERTY()
91 FVector3f MaxInstanceScale;
92
94 : BoundMin(MAX_flt, MAX_flt, MAX_flt)
95 , FirstChild(-1)
96 , BoundMax(-MAX_flt, -MAX_flt, -MAX_flt)
97 , LastChild(-1)
98 , FirstInstance(-1)
99 , LastInstance(-1)
100 , MinInstanceScale(MAX_flt)
101 , MaxInstanceScale(-MAX_flt)
102 {
103 }
104
106 : BoundMin(OldNode.BoundMin)
107 , FirstChild(OldNode.FirstChild)
108 , BoundMax(OldNode.BoundMax)
109 , LastChild(OldNode.LastChild)
110 , FirstInstance(OldNode.FirstChild)
111 , LastInstance(OldNode.LastInstance)
112 , MinInstanceScale(MAX_flt)
113 , MaxInstanceScale(-MAX_flt)
114 {
115 }
116
117 friend FArchive& operator<<(FArchive& Ar, FClusterNode& NodeData)
118 {
119 // @warning BulkSerialize: FClusterNode is serialized as memory dump
120 // See TArray::BulkSerialize for detailed description of implied limitations.
121 Ar << NodeData.BoundMin;
122 Ar << NodeData.FirstChild;
123 Ar << NodeData.BoundMax;
124 Ar << NodeData.LastChild;
125 Ar << NodeData.FirstInstance;
126 Ar << NodeData.LastInstance;
127 Ar << NodeData.MinInstanceScale;
128 Ar << NodeData.MaxInstanceScale;
129
130 return Ar;
131 }
132};
133
134UCLASS(ClassGroup=Rendering, meta=(BlueprintSpawnableComponent), MinimalAPI)
136{
138
140
142
144
145 // If true then we allow a translated space when building the cluster tree.
146 // This can help for implementations (foliage) where we can have instances with offsets to large for single float precision.
147 UPROPERTY()
148 uint32 bUseTranslatedInstanceSpace : 1;
149
150 // Origin of the translated space used when building the cluster tree.
151 UPROPERTY()
152 FVector TranslatedInstanceSpaceOrigin;
153
154 // Table for remapping instances from cluster tree to PerInstanceSMData order
155 UPROPERTY()
156 TArray<int32> SortedInstances;
157
158 // The number of instances in the ClusterTree. Subsequent instances will always be rendered.
159 UPROPERTY()
160 int32 NumBuiltInstances;
161
162 // Normally equal to NumBuiltInstances, but can be lower if density scaling is in effect
163 int32 NumBuiltRenderInstances;
164
165 // Bounding box of any built instances (cached from the ClusterTree)
166 UPROPERTY()
167 FBox BuiltInstanceBounds;
168
169 // Bounding box of any unbuilt instances
170 UPROPERTY()
171 FBox UnbuiltInstanceBounds;
172
173 // Bounds of each individual unbuilt instance, used for LOD calculation
174 UPROPERTY()
175 TArray<FBox> UnbuiltInstanceBoundsList;
176
177 // Enable for detail meshes that don't really affect the game. Disable for anything important.
178 // Typically, this will be enabled for small meshes without collision (e.g. grass) and disabled for large meshes with collision (e.g. trees)
179 UPROPERTY()
180 uint32 bEnableDensityScaling:1;
181
182 // Current value of density scaling applied to this component
183 float CurrentDensityScaling;
184
185 // The number of nodes in the occlusion layer
186 UPROPERTY()
187 int32 OcclusionLayerNumNodes;
188
189 // The last mesh bounds that was cache
190 UPROPERTY()
191 FBoxSphereBounds CacheMeshExtendedBounds;
192
193 // Instances to render (including removed one until the build is complete)
194 UPROPERTY()
195 int32 InstanceCountToRender;
196
197 bool bIsAsyncBuilding : 1;
198 bool bIsOutOfDate : 1;
199 bool bConcurrentChanges : 1;
200 bool bAutoRebuildTreeOnInstanceChanges : 1;
201
202#if WITH_EDITOR
203 // in Editor mode we might disable the density scaling for edition
205#endif
206
207public:
209 {
213 int32 OutOcclusionLayerNum = 0;
214
215 bool PrintLevel(int32 NodeIndex, int32 Level, int32 CurrentLevel, int32 Parent);
216 };
217
219 {
220 public:
222 ENGINE_API void BuildTreeAndBufferAsync(ENamedThreads::Type CurrentThread, const FGraphEventRef& MyCompletionGraphEvent);
223 ENGINE_API void BuildTreeAndBuffer();
224 ENGINE_API void BuildTree();
225
226 protected:
227 void Split(int32 InNum);
228 void Split(int32 Start, int32 End);
229 void BuildInstanceBuffer();
230 void Init();
231
232 public:
235
236 protected:
245
249
255
256 struct FRunPair
257 {
260
262 : Start(InStart)
263 , Num(InNum)
264 {
265 }
266
267 bool operator< (const FRunPair& Other) const
268 {
269 return Start < Other.Start;
270 }
271 };
273
275 {
276 float d;
278
279 bool operator< (const FSortPair& Other) const
280 {
281 return d < Other.d;
282 }
283 };
285 };
286
287 // Apply the results of the async build
288 ENGINE_API void ApplyBuildTreeAsync(ENamedThreads::Type CurrentThread, const FGraphEventRef& MyCompletionGraphEvent, TSharedRef<FClusterBuilder, ESPMode::ThreadSafe> Builder, double StartTime);
289
290 //Begin UObject Interface
291 ENGINE_API virtual void Serialize(FArchive& Ar) override;
292 ENGINE_API virtual void GetResourceSizeEx(FResourceSizeEx& CumulativeResourceSize) override;
293 ENGINE_API virtual void PostLoad() override;
294 ENGINE_API virtual void PostEditImport() override;
295 ENGINE_API virtual FPrimitiveSceneProxy* CreateSceneProxy() override;
296 ENGINE_API virtual FBoxSphereBounds CalcBounds(const FTransform& BoundTransform) const override;
297
298#if WITH_EDITOR
299 ENGINE_API virtual void PostStaticMeshCompilation() override;
300 ENGINE_API virtual void PostEditUndo() override;
301 ENGINE_API virtual void PostEditChangeChainProperty(FPropertyChangedChainEvent& PropertyChangedEvent) override;
302#endif
303
304 // UInstancedStaticMesh interface
305 ENGINE_API virtual int32 AddInstance(const FTransform& InstanceTransform, bool bWorldSpace = false) override;
306 ENGINE_API virtual TArray<int32> AddInstances(const TArray<FTransform>& InstanceTransforms, bool bShouldReturnIndices, bool bWorldSpace = false, bool bUpdateNavigation = true) override;
307 ENGINE_API virtual bool RemoveInstance(int32 InstanceIndex) override;
308 ENGINE_API virtual bool RemoveInstances(const TArray<int32>& InstancesToRemove) override;
309 ENGINE_API virtual bool RemoveInstances(const TArray<int32>& InstancesToRemove, bool bInstanceArrayAlreadySortedInReverseOrder) override;
310 ENGINE_API virtual bool UpdateInstanceTransform(int32 InstanceIndex, const FTransform& NewInstanceTransform, bool bWorldSpace, bool bMarkRenderStateDirty = false, bool bTeleport = false) override;
311 ENGINE_API virtual bool SetCustomDataValue(int32 InstanceIndex, int32 CustomDataIndex, float CustomDataValue, bool bMarkRenderStateDirty = false) override;
312 ENGINE_API virtual bool SetCustomData(int32 InstanceIndex, TArrayView<const float> InCustomData, bool bMarkRenderStateDirty = false) override;
313 ENGINE_API virtual bool BatchUpdateInstancesTransforms(int32 StartInstanceIndex, const TArray<FTransform>& NewInstancesTransforms, bool bWorldSpace=false, bool bMarkRenderStateDirty=false, bool bTeleport=false) override;
314 ENGINE_API virtual bool BatchUpdateInstancesTransforms(int32 StartInstanceIndex, TArrayView<const FTransform> NewInstancesTransforms, bool bWorldSpace, bool bMarkRenderStateDirty, bool bTeleport) override;
315
316 ENGINE_API virtual bool BatchUpdateInstancesTransform(int32 StartInstanceIndex, int32 NumInstances, const FTransform& NewInstancesTransform, bool bWorldSpace=false, bool bMarkRenderStateDirty=false, bool bTeleport=false) override;
317 ENGINE_API virtual bool BatchUpdateInstancesData(int32 StartInstanceIndex, int32 NumInstances, FInstancedStaticMeshInstanceData* StartInstanceData, bool bMarkRenderStateDirty = false, bool bTeleport = false) override;
318
319 ENGINE_API virtual void ClearInstances() override;
320 ENGINE_API virtual TArray<int32> GetInstancesOverlappingSphere(const FVector& Center, float Radius, bool bSphereInWorldSpace = true) const override;
321 ENGINE_API virtual TArray<int32> GetInstancesOverlappingBox(const FBox& Box, bool bBoxInWorldSpace = true) const override;
322 ENGINE_API virtual void PreAllocateInstancesMemory(int32 AddedInstanceCount) override;
323 virtual bool SupportsRemoveSwap() const override { return true; }
324
326 ENGINE_API int32 GetOverlappingSphereCount(const FSphere& Sphere) const;
328 ENGINE_API int32 GetOverlappingBoxCount(const FBox& Box) const;
330 ENGINE_API void GetOverlappingBoxTransforms(const FBox& Box, TArray<FTransform>& OutTransforms) const;
331
332 ENGINE_API bool BuildTreeIfOutdated(bool Async, bool ForceUpdate);
333 bool IsAsyncBuilding() const { return bIsAsyncBuilding; }
334 bool IsTreeFullyBuilt() const { return !bIsOutOfDate; }
336 ENGINE_API FVector GetAverageScale() const;
337
339 ENGINE_API int32 DesiredInstancesPerLeaf();
340
341 ENGINE_API virtual void ApplyComponentInstanceData(struct FInstancedStaticMeshComponentInstanceData* InstancedMeshData) override;
342
343 // Number of instances in the render-side instance buffer
344 virtual int32 GetNumRenderInstances() const { return SortedInstances.Num(); }
345
347 ENGINE_API void UpdateDensityScaling();
348
349 ENGINE_API virtual void PropagateLightingScenarioChange() override;
350
351 EHISMViewRelevanceType GetViewRelevanceType() const { return ViewRelevanceType; }
352
353protected:
354 UE_DEPRECATED(5.7, "Please use BuildComponentInstanceData with EShaderPlatform argument and not ERHIFeatureLevel::Type")
355 ENGINE_API virtual void BuildComponentInstanceData(ERHIFeatureLevel::Type FeatureLevel, FInstanceUpdateComponentDesc& OutData) override;
357
358
359 ENGINE_API virtual void BuildTree();
360 ENGINE_API virtual void BuildTreeAsync();
361 ENGINE_API void ApplyBuildTree(FClusterBuilder& Builder, const bool bWasAsyncBuild);
362 ENGINE_API void ApplyEmpty();
363 ENGINE_API void SetPerInstanceLightMapAndEditorData(FStaticMeshInstanceData& PerInstanceData, const TArray<TRefCountPtr<HHitProxy>>& HitProxies);
364
365 ENGINE_API FVector CalcTranslatedInstanceSpaceOrigin() const;
366 ENGINE_API void GetInstanceTransforms(TArray<FMatrix>& InstanceTransforms, FVector const& Offset) const;
367
369 ENGINE_API void RemoveInstancesInternal(TConstArrayView<int32> InstanceIndices);
370
372 ENGINE_API int32 GetVertsForLOD(int32 LODIndex);
374 ENGINE_API float ActualInstancesPerLeaf();
376 ENGINE_API void PostBuildStats();
377
378 ENGINE_API virtual void OnPostLoadPerInstanceData() override;
379
380 ENGINE_API virtual FPrimitiveSceneProxy* CreateStaticMeshSceneProxy(Nanite::FMaterialAudit& NaniteMaterials, bool bCreateNanite) override;
381
382 virtual FVector GetTranslatedInstanceSpaceOrigin() const override { return TranslatedInstanceSpaceOrigin; }
383
384 ENGINE_API static FBox GetClusterTreeBounds(TArray<FClusterNode> const& InClusterTree, const FVector& InOffset);
385
386 UE_DEPRECATED(5.4, "UHierarchicalInstancedStaticMeshComponent is no longer overriding UInstancedStaticMeshComponent::GetNavigationPerInstanceTransforms.")
387 ENGINE_API virtual void GetNavigationPerInstanceTransforms(const FBox& AreaBox, TArray<FTransform>& InstanceData) const override;
388 UE_DEPRECATED(5.4, "UHierarchicalInstancedStaticMeshComponent is no longer overriding UInstancedStaticMeshComponent::PartialNavigationUpdate.")
389 ENGINE_API virtual void PartialNavigationUpdate(int32 InstanceIdx) override;
390 UE_DEPRECATED(5.4, "UHierarchicalInstancedStaticMeshComponent is no longer overriding UInstancedStaticMeshComponent::SupportsPartialNavigationUpdate.")
391 virtual bool SupportsPartialNavigationUpdate() const override { return Super::SupportsPartialNavigationUpdate(); }
392 UE_DEPRECATED(5.4, "FlushAccumulatedNavigationUpdates has been deprecated. Use UInstancedStaticMeshComponent::PartialNavigationUpdates if you want to manually update the navigation data.")
393 ENGINE_API void FlushAccumulatedNavigationUpdates();
394
395 UE_DEPRECATED(5.4, "AccumulatedNavigationDirtyArea has been deprecated.")
396 mutable FBox AccumulatedNavigationDirtyArea;
397 UE_DEPRECATED(5.4, "AccumulatedNavigationDirtyAreas has been deprecated.")
398 mutable TArray<FBox> AccumulatedNavigationDirtyAreas; //Remember to also remove the disable deprecation macro wrapper around ~UHierarchicalInstancedStaticMeshComponent() when removing the variable
399
400 FGraphEventArray BuildTreeAsyncTasks;
402
403private:
405 ENGINE_API bool BatchUpdateInstancesTransformsInternal(int32 StartInstanceIndex, TArrayView<const FTransform> NewInstancesTransforms, bool bWorldSpace, bool bMarkRenderStateDirty, bool bTeleport);
406
408 friend FStaticLightingTextureMapping_InstancedStaticMesh;
409 friend FInstancedLightMap2D;
410 friend FInstancedShadowMap2D;
412};
413
#define UE_DEPRECATED(Version, Message)
Definition CoreMiscDefines.h:302
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
EHISMViewRelevanceType
Definition HierarchicalInstancedStaticMeshComponent.h:19
bool operator<(const FTextFormatString &LHS, const FTextFormatString &RHS)
Definition ITextFormatArgumentModifier.h:147
void Init()
Definition LockFreeList.h:4
@ Num
Definition MetalRHIPrivate.h:234
#define MAX_flt
Definition NumericLimits.h:29
#define UPROPERTY(...)
UObject definition macros.
Definition ObjectMacros.h:744
#define GENERATED_UCLASS_BODY(...)
Definition ObjectMacros.h:768
#define UCLASS(...)
Definition ObjectMacros.h:776
#define UENUM(...)
Definition ObjectMacros.h:749
#define USTRUCT(...)
Definition ObjectMacros.h:746
#define GENERATED_USTRUCT_BODY(...)
Definition ObjectMacros.h:767
#define Split(a, ahi, alo)
Definition Predicates.inl:204
EShaderPlatform
Definition RHIShaderPlatform.h:11
ESPMode
Definition SharedPointerFwd.h:12
uint32 Offset
Definition VulkanMemory.cpp:4033
uint8_t uint8
Definition binka_ue_file_header.h:8
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition LightWeightInstanceStaticMeshManager.h:16
Definition Archive.h:1208
Definition PrimitiveSceneProxy.h:296
Definition StaticMeshResources.h:1031
Definition HitProxies.h:135
Definition ArrayView.h:139
Definition Array.h:670
Definition SharedPointer.h:692
Definition SharedPointer.h:153
Definition UniquePtr.h:107
Definition HierarchicalInstancedStaticMeshComponent.h:219
int32 OriginalNum
Definition HierarchicalInstancedStaticMeshComponent.h:237
TArray< int32 > SortIndex
Definition HierarchicalInstancedStaticMeshComponent.h:250
TArray< FSortPair > SortPairs
Definition HierarchicalInstancedStaticMeshComponent.h:284
TArray< FVector > SortPoints
Definition HierarchicalInstancedStaticMeshComponent.h:251
bool GenerateInstanceScalingRange
Definition HierarchicalInstancedStaticMeshComponent.h:248
TArray< float > CustomDataFloats
Definition HierarchicalInstancedStaticMeshComponent.h:253
float DensityScaling
Definition HierarchicalInstancedStaticMeshComponent.h:247
int32 InstancingRandomSeed
Definition HierarchicalInstancedStaticMeshComponent.h:246
int32 NumRoots
Definition HierarchicalInstancedStaticMeshComponent.h:244
int32 NumCustomDataFloats
Definition HierarchicalInstancedStaticMeshComponent.h:254
int32 Num
Definition HierarchicalInstancedStaticMeshComponent.h:238
TUniquePtr< FClusterTree > Result
Definition HierarchicalInstancedStaticMeshComponent.h:233
int32 BranchingFactor
Definition HierarchicalInstancedStaticMeshComponent.h:240
TArray< FMatrix > Transforms
Definition HierarchicalInstancedStaticMeshComponent.h:252
FBox InstBox
Definition HierarchicalInstancedStaticMeshComponent.h:239
int32 InternalNodeBranchingFactor
Definition HierarchicalInstancedStaticMeshComponent.h:241
TUniquePtr< FStaticMeshInstanceData > BuiltInstanceData
Definition HierarchicalInstancedStaticMeshComponent.h:234
TArray< FRunPair > Clusters
Definition HierarchicalInstancedStaticMeshComponent.h:272
int32 OcclusionLayerTarget
Definition HierarchicalInstancedStaticMeshComponent.h:242
int32 MaxInstancesPerLeaf
Definition HierarchicalInstancedStaticMeshComponent.h:243
Definition HierarchicalInstancedStaticMeshComponent.h:136
bool IsAsyncBuilding() const
Definition HierarchicalInstancedStaticMeshComponent.h:333
virtual int32 GetNumRenderInstances() const
Definition HierarchicalInstancedStaticMeshComponent.h:344
EHISMViewRelevanceType GetViewRelevanceType() const
Definition HierarchicalInstancedStaticMeshComponent.h:351
virtual bool SupportsRemoveSwap() const override
Definition HierarchicalInstancedStaticMeshComponent.h:323
bool IsTreeFullyBuilt() const
Definition HierarchicalInstancedStaticMeshComponent.h:334
Definition InstancedStaticMeshComponent.h:158
Type
Definition TaskGraphInterfaces.h:57
Definition SceneComponent.h:24
Definition SkinnedMeshComponent.h:50
Definition HierarchicalInstancedStaticMeshComponent.h:28
friend FArchive & operator<<(FArchive &Ar, FClusterNode_DEPRECATED &NodeData)
Definition HierarchicalInstancedStaticMeshComponent.h:54
int32 FirstInstance
Definition HierarchicalInstancedStaticMeshComponent.h:40
FVector3f BoundMax
Definition HierarchicalInstancedStaticMeshComponent.h:36
int32 LastInstance
Definition HierarchicalInstancedStaticMeshComponent.h:42
int32 LastChild
Definition HierarchicalInstancedStaticMeshComponent.h:38
FVector3f BoundMin
Definition HierarchicalInstancedStaticMeshComponent.h:32
int32 FirstChild
Definition HierarchicalInstancedStaticMeshComponent.h:34
Definition HierarchicalInstancedStaticMeshComponent.h:72
int32 FirstChild
Definition HierarchicalInstancedStaticMeshComponent.h:78
FVector3f MaxInstanceScale
Definition HierarchicalInstancedStaticMeshComponent.h:91
int32 LastChild
Definition HierarchicalInstancedStaticMeshComponent.h:82
FVector3f BoundMin
Definition HierarchicalInstancedStaticMeshComponent.h:76
friend FArchive & operator<<(FArchive &Ar, FClusterNode &NodeData)
Definition HierarchicalInstancedStaticMeshComponent.h:117
FVector3f BoundMax
Definition HierarchicalInstancedStaticMeshComponent.h:80
FVector3f MinInstanceScale
Definition HierarchicalInstancedStaticMeshComponent.h:89
FClusterNode(const FClusterNode_DEPRECATED &OldNode)
Definition HierarchicalInstancedStaticMeshComponent.h:105
int32 LastInstance
Definition HierarchicalInstancedStaticMeshComponent.h:86
int32 FirstInstance
Definition HierarchicalInstancedStaticMeshComponent.h:84
Definition ISMInstanceDataManager.h:17
Definition InstancedStaticMeshComponent.h:840
Definition InstancedStaticMeshComponent.h:40
Definition UnrealType.h:7001
Definition ResourceSize.h:31
Definition BoxSphereBounds.h:25
Definition HierarchicalInstancedStaticMeshComponent.h:257
int32 Num
Definition HierarchicalInstancedStaticMeshComponent.h:259
int32 Start
Definition HierarchicalInstancedStaticMeshComponent.h:258
FRunPair(int32 InStart, int32 InNum)
Definition HierarchicalInstancedStaticMeshComponent.h:261
Definition HierarchicalInstancedStaticMeshComponent.h:275
int32 Index
Definition HierarchicalInstancedStaticMeshComponent.h:277
float d
Definition HierarchicalInstancedStaticMeshComponent.h:276
Definition HierarchicalInstancedStaticMeshComponent.h:209
TArray< FClusterNode > Nodes
Definition HierarchicalInstancedStaticMeshComponent.h:210
TArray< int32 > SortedInstances
Definition HierarchicalInstancedStaticMeshComponent.h:211
TArray< int32 > InstanceReorderTable
Definition HierarchicalInstancedStaticMeshComponent.h:212