UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
InstanceUniformShaderParameters.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"
7#include "SceneTypes.h"
8#include "RenderResource.h"
9#include "RenderTransform.h"
10#include "ShaderParameters.h"
11#include "UniformBuffer.h"
13#include "SceneDefinitions.h"
14
15#define INVALID_LAST_UPDATE_FRAME 0xFFFFFFFFu
16
18{
20
21 // Should always use this accessor so shearing is properly
22 // removed from the concatenated transform.
23 inline FRenderTransform ComputeLocalToWorld(const FRenderTransform& PrimitiveToWorld) const
24 {
25 FRenderTransform LocalToWorld = LocalToPrimitive * PrimitiveToWorld;
26
27 // TODO: Enable when scale is decomposed within FRenderTransform, so we don't have 3x
28 // length calls to retrieve the scale when checking for non-uniform scaling.
29 #if 0
30 // Shearing occurs when applying a rotation and then non-uniform scaling. It is much more likely that
31 // an instance would be non-uniformly scaled than the primitive, so we'll check if the primitive has
32 // non-uniform scaling, and orthogonalize in that case.
33 if (PrimitiveToWorld.IsScaleNonUniform())
34 #endif
35 {
36 LocalToWorld.Orthogonalize();
37 }
38
39 return LocalToWorld;
40 }
41};
42
44{
46
47 // Should always use this accessor so shearing is properly
48 // removed from the concatenated transform.
49 inline FRenderTransform ComputePrevLocalToWorld(const FRenderTransform& PrevPrimitiveToWorld) const
50 {
52
53 // TODO: Enable when scale is decomposed within FRenderTransform, so we don't have 3x
54 // length calls to retrieve the scale when checking for non-uniform scaling.
55 #if 0
56 // Shearing occurs when applying a rotation and then non-uniform scaling. It is much more likely that
57 // an instance would be non-uniformly scaled than the primitive, so we'll check if the primitive has
58 // non-uniform scaling, and orthogonalize in that case.
59 if (PrevPrimitiveToWorld.IsScaleNonUniform())
60 #endif
61 {
63 }
64
65 return PrevLocalToWorld;
66 }
67};
68
70{
71private:
72 // Must match GetInstanceSceneData() in SceneData.ush
73 // Allocate the max Float4s usage when compressed transform is used.
74 static constexpr uint32 CompressedTransformDataStrideInFloat4s = 3;
75 static constexpr uint32 UnCompressedTransformDataStrideInFloat4s = 4;
76
77public:
79
81
83 {
84 return (GetDataStrideInFloat4s() * sizeof(FVector4f));
85 }
86
90
91 ENGINE_API void Build
92 (
93 uint32 PrimitiveId,
95 uint32 InstanceFlags,
96 uint32 LastUpdateFrame,
98 float RandomID,
99 bool bIsVisible = true
100 );
101
102 ENGINE_API void Build
103 (
104 uint32 PrimitiveId,
106 uint32 InstanceFlags,
107 uint32 LastUpdateFrame,
109 float RandomID,
110 const FRenderTransform& LocalToPrimitive,
111 const FRenderTransform& PrimitiveToWorld,
112 bool bIsVisible = true
113 );
114
115 inline void BuildInternal
116 (
117 uint32 PrimitiveId,
119 uint32 InstanceFlags,
120 uint32 LastUpdateFrame,
122 float RandomID,
123 const FRenderTransform& LocalToWorld,
124 bool bIsVisible,
126 )
127 {
128 // Note: layout must match GetInstanceData in SceneData.ush and InitializeInstanceSceneData in GPUSceneWriter.ush
129
130 const float RotDeterminant = LocalToWorld.RotDeterminant();
131 if (RotDeterminant < 0.0f)
132 {
134 }
135 else
136 {
138 }
139
140 // Mark zero scaled instances as hidden.
141 if (!bIsVisible || RotDeterminant == 0.0f)
142 {
143 InstanceFlags |= INSTANCE_SCENE_DATA_FLAG_HIDDEN;
144 }
145
146 checkSlow((PrimitiveId & 0x000FFFFF) == PrimitiveId);
147 checkSlow((InstanceFlags & 0x00000FFF) == InstanceFlags);
148 checkSlow((RelativeId & 0x00FFFFFF) == RelativeId);
149 checkSlow((CustomDataCount & 0x000000FF) == CustomDataCount);
150
151 const uint32 Packed0 = (InstanceFlags << 20u) | PrimitiveId;
152 const uint32 Packed1 = (CustomDataCount << 24u) | RelativeId;
153
154 Data[0].X = *(const float*)&Packed0;
155 Data[0].Y = *(const float*)&Packed1;
156 Data[0].Z = *(const float*)&LastUpdateFrame;
157 Data[0].W = *(const float*)&RandomID;
158
160 {
162 Data[1] = *(const FVector4f*)&CompressedLocalToWorld.Rotation[0];
163 Data[2] = *(const FVector3f*)&CompressedLocalToWorld.Translation;
164 }
165 else
166 {
167 // Note: writes 3x float4s
168 LocalToWorld.To3x4MatrixTranspose((float*)&Data[1]);
169 }
170 }
171
173};
#define checkSlow(expr)
Definition AssertionMacros.h:332
@ NoInit
Definition CoreMiscDefines.h:158
@ InPlace
Definition CoreMiscDefines.h:162
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition StaticArray.h:26
Definition RenderTransform.h:440
Definition InstanceUniformShaderParameters.h:44
FRenderTransform ComputePrevLocalToWorld(const FRenderTransform &PrevPrimitiveToWorld) const
Definition InstanceUniformShaderParameters.h:49
FRenderTransform PrevLocalToPrimitive
Definition InstanceUniformShaderParameters.h:45
Definition InstanceUniformShaderParameters.h:18
FRenderTransform LocalToPrimitive
Definition InstanceUniformShaderParameters.h:19
FRenderTransform ComputeLocalToWorld(const FRenderTransform &PrimitiveToWorld) const
Definition InstanceUniformShaderParameters.h:23
Definition InstanceUniformShaderParameters.h:70
static ENGINE_API bool SupportsCompressedTransforms()
Definition InstanceUniformShaderParameters.cpp:8
static ENGINE_API uint32 GetDataStrideInFloat4s()
Definition InstanceUniformShaderParameters.cpp:13
FInstanceSceneShaderData()
Definition InstanceUniformShaderParameters.h:87
void BuildInternal(uint32 PrimitiveId, uint32 RelativeId, uint32 InstanceFlags, uint32 LastUpdateFrame, uint32 CustomDataCount, float RandomID, const FRenderTransform &LocalToWorld, bool bIsVisible, bool bSupportsCompressedTransforms)
Definition InstanceUniformShaderParameters.h:116
TStaticArray< FVector4f, UnCompressedTransformDataStrideInFloat4s > Data
Definition InstanceUniformShaderParameters.h:172
static uint32 GetEffectiveNumBytes()
Definition InstanceUniformShaderParameters.h:82
Definition RenderTransform.h:23
bool IsScaleNonUniform() const
Definition RenderTransform.h:212
void Orthogonalize()
Definition RenderTransform.h:223
float RotDeterminant() const
Definition RenderTransform.h:182
void To3x4MatrixTranspose(float *Result) const
Definition RenderTransform.h:127