UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
InstancedStaticMeshComponentHelper.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
12#include "NaniteVertexFactory.h"
13#include "PSOPrecacheFwd.h"
14#include "PSOPrecache.h"
15
18{
19public:
20 template<class T>
22
23 template<class T>
25
26 template<class T>
28
29 template<class T>
31
32 template<class T>
34
35private:
36 // Dummy instance buffer used for PSO pre-caching
37 class FDummyStaticMeshInstanceBuffer : public FStaticMeshInstanceBuffer
38 {
39 public:
40 FDummyStaticMeshInstanceBuffer()
41 : FStaticMeshInstanceBuffer(GMaxRHIFeatureLevel, false /*InRequireCPUAccess*/)
42 {
44 }
45 };
46
47 static TGlobalResource<FDummyStaticMeshInstanceBuffer> DummyStaticMeshInstanceBuffer;
48};
49
50template<class T>
52{
53 if (Component.GetStaticMesh() == nullptr || Component.GetStaticMesh()->GetRenderData() == nullptr)
54 {
55 return;
56 }
57
59 FStaticMeshInstanceBuffer* InstanceBuffer = bCanUseGPUScene ? nullptr : &FInstancedStaticMeshComponentHelper::DummyStaticMeshInstanceBuffer;
60 int32 LightMapCoordinateIndex = Component.GetStaticMesh()->GetLightMapCoordinateIndex();
61
62 auto ISMC_GetElements = [LightMapCoordinateIndex, InstanceBuffer, &Component](const FStaticMeshLODResources& LODRenderData, int32 LODIndex, bool bSupportsManualVertexFetch, FVertexDeclarationElementList& Elements)
63 {
66 const FColorVertexBuffer* ColorVertexBuffer = LODRenderData.bHasColorVertexData ? &(LODRenderData.VertexBuffers.ColorVertexBuffer) : nullptr;
67 if (Component.LODData.IsValidIndex(LODIndex) && Component.LODData[LODIndex].OverrideVertexColors)
68 {
69 ColorVertexBuffer = Component.LODData[LODIndex].OverrideVertexColors;
70 }
71 FInstancedStaticMeshVertexFactory::InitInstancedStaticMeshVertexFactoryComponents(LODRenderData.VertexBuffers, ColorVertexBuffer, InstanceBuffer, nullptr /*VertexFactory*/, LightMapCoordinateIndex, bSupportsManualVertexFetch, Data, InstanceData);
73 };
74
75 Nanite::FMaterialAudit NaniteMaterials{};
77 {
79 }
80 else
81 {
83 }
84}
85
86template<class T>
88{
90
91 // Navigation data will get refreshed once async compilation finishes
92 UStaticMesh* StaticMesh = Component.GetStaticMesh();
93 if (StaticMesh && !StaticMesh->IsCompiling() && StaticMesh->GetNavCollision())
94 {
95 UNavCollisionBase* NavCollision = StaticMesh->GetNavCollision();
96 if (Component.ShouldExportAsObstacle(*NavCollision))
97 {
98 Data.Modifiers.MarkAsPerInstanceModifier();
99 NavCollision->GetNavigationModifier(Data.Modifiers, FTransform::Identity);
100
101 // Hook per instance transform delegate
102 Data.NavDataPerInstanceTransformDelegate = Delegate;
103 }
104 }
105}
106
107template<class T>
109{
110 UStaticMesh* StaticMesh = Component.GetStaticMesh();
111 if (StaticMesh && StaticMesh->GetNavCollision())
112 {
113 UNavCollisionBase* NavCollision = StaticMesh->GetNavCollision();
114 if (Component.ShouldExportAsObstacle(*NavCollision))
115 {
116 return false;
117 }
118
119 if (NavCollision->HasConvexGeometry())
120 {
122 }
123 else
124 {
125 UBodySetup* BodySetup = StaticMesh->GetBodySetup();
126 if (BodySetup)
127 {
128 GeomExport.ExportRigidBodySetup(*BodySetup, FTransform::Identity);
129 }
130 }
131
132 // Hook per instance transform delegate
133 GeomExport.SetNavDataPerInstanceTransformDelegate(Delegate);
134 }
135
136 // we don't want "regular" collision export for this component
137 return false;
138}
139
140template<class T>
142{
144 if (InstanceBounds.IsValid)
145 {
146 const FBox LocalAreaBox = AreaBox.InverseTransformBy(Component.GetComponentTransform());
147 for (const auto& InstancedData : Component.PerInstanceSMData)
148 {
150 if (!InstanceToComponent.GetScale3D().IsZero())
151 {
153 if (LocalAreaBox.Intersect(TransformedInstanceBounds.GetBox()))
154 {
155 InstanceData.Add(InstanceToComponent * Component.GetComponentTransform());
156 }
157 }
158 }
159 }
160}
161
162template<class T>
164{
165 if (const UStaticMesh* Mesh = Component.GetStaticMesh())
166 {
167 const UNavCollisionBase* NavCollision = Mesh->GetNavCollision();
168 const FBox NavBounds = NavCollision ? NavCollision->GetBounds() : FBox();
169 return NavBounds.IsValid ? NavBounds : Mesh->GetBounds().GetBox();
170 }
171
172 return FBox();
173}
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
UE::Math::TBox< double > FBox
Definition MathFwd.h:55
@ VET_Half2
Definition RHIDefinitions.h:509
#define GVertexElementTypeSupport
Definition RHIGlobals.h:843
ERHIFeatureLevel::Type GMaxRHIFeatureLevel
Definition RHI.cpp:1338
EShaderPlatform GMaxRHIShaderPlatform
Definition RHI.cpp:1335
bool UseGPUScene(const FStaticShaderPlatform Platform, const FStaticFeatureLevel FeatureLevel)
Definition RenderUtils.cpp:1636
Definition ColorVertexBuffer.h:16
Definition InstancedStaticMeshComponentHelper.h:18
static void GetNavigationPerInstanceTransforms(const T &Component, const FBox &AreaBox, TArray< FTransform > &InstanceData)
Definition InstancedStaticMeshComponentHelper.h:141
static bool DoCustomNavigableGeometryExport(const T &Component, FNavigableGeometryExport &GeomExport, const FNavDataPerInstanceTransformDelegate &Delegate)
Definition InstancedStaticMeshComponentHelper.h:108
static void GetNavigationData(const T &Component, FNavigationRelevantData &Data, const FNavDataPerInstanceTransformDelegate &Delegate)
Definition InstancedStaticMeshComponentHelper.h:87
static FBox GetInstanceNavigationBounds(const T &Component)
Definition InstancedStaticMeshComponentHelper.h:163
static void CollectPSOPrecacheData(const T &Component, const FPSOPrecacheParams &BasePrecachePSOParams, FMaterialInterfacePSOPrecacheParamsList &OutParams)
Definition InstancedStaticMeshComponentHelper.h:51
static void AddNavigationModifier(const T &Component, FNavigationRelevantData &OutData)
Definition PrimitiveComponentHelper.h:84
static void CollectPSOPrecacheDataImpl(const T &Component, const FVertexFactoryType *VFType, const FPSOPrecacheParams &BasePrecachePSOParams, GetPSOVertexElementsFn GetVertexElements, FMaterialInterfacePSOPrecacheParamsList &OutParams)
Definition StaticMeshComponentHelper.h:172
Definition InstancedStaticMesh.h:71
TSharedPtr< FStaticMeshInstanceData, ESPMode::ThreadSafe > InstanceData
Definition InstancedStaticMesh.h:148
static bool ShouldCreateNaniteProxy(const T &Component, FMaterialAudit *OutNaniteMaterials)
Definition NaniteResourcesHelper.h:112
Definition Array.h:670
Definition RenderResource.h:543
Definition BodySetup.h:128
Definition NavCollisionBase.h:23
virtual bool ExportGeometry(const FTransform &LocalToWorld, FNavigableGeometryExport &GeoExport) const PURE_VIRTUAL(UNavCollisionBase
Definition NavCollisionBase.h:58
Definition StaticMesh.h:593
Definition InstancedStaticMesh.h:240
static ENGINE_API void InitInstancedStaticMeshVertexFactoryComponents(const FStaticMeshVertexBuffers &VertexBuffers, const FColorVertexBuffer *ColorVertexBuffer, const FStaticMeshInstanceBuffer *InstanceBuffer, const FInstancedStaticMeshVertexFactory *VertexFactory, int32 LightMapCoordinateIndex, bool bRHISupportsManualVertexFetch, FInstancedStaticMeshVertexFactory::FDataType &OutData, FInstancedStaticMeshDataType &OutInstanceData)
Definition InstancedStaticMesh.cpp:983
static ENGINE_API void GetVertexElements(ERHIFeatureLevel::Type FeatureLevel, EVertexInputStreamType InputStreamType, bool bSupportsManualVertexFetch, FDataType &Data, FInstancedStaticMeshDataType &InstanceData, FVertexDeclarationElementList &Elements)
Definition InstancedStaticMesh.cpp:792
Definition LocalVertexFactory.h:60
Definition NavigationSystemHelpers.h:25
Definition NavigationRelevantData.h:40
Definition PSOPrecache.h:30
Definition StaticMeshResources.h:426
Definition NaniteSceneProxy.h:66
Definition BoxSphereBounds.h:25
TBoxSphereBounds< T, TExtent > TransformBy(const TMatrix< T > &M) const
Definition BoxSphereBounds.h:501
TBox< T > InverseTransformBy(const TTransform< T > &M) const
Definition Box.h:937
uint8 IsValid
Definition Box.h:45
static CORE_API const TTransform< double > Identity
Definition TransformNonVectorized.h:58