UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
MeshTangents.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "Containers/Array.h"
6#include "DynamicMesh3.h"
9#include "Math/Vector.h"
11#include "VectorTypes.h"
12
13
14namespace UE
15{
16namespace Geometry
17{
18
19using namespace UE::Math;
20
56
57
62{
64 bool bAveraged = true;
66 bool bAngleWeighted = true;
67};
68
69
74template<typename RealType>
76{
77protected:
86
87public:
89 {
90 Mesh = nullptr;
91 }
92
97
99 {
100 this->Mesh = MeshIn;
101 }
102
104
106
108
109 // Get the target mesh
110 const FDynamicMesh3* GetMesh() const
111 {
112 return Mesh;
113 }
114
115 //
116 // Per-Triangle-Vertex Tangents
117 // Number of Tangents is NumTriangles * 3
118 //
119
128
132 template<typename OtherRealType>
134
140
141
148
155 {
156 int32 k = TriangleID * 3 + TriVertIdx;
157 TangentOut = Tangents[k];
159 }
160
161
167 template<typename VectorType, typename OtherRealType>
168 void GetPerTriangleTangent(int32 TriangleID, int32 TriVertIdx, VectorType& TangentOut, VectorType& BitangentOut) const
169 {
170 int32 k = TriangleID * 3 + TriVertIdx;
171 TangentOut.X = (OtherRealType)Tangents[k].X;
172 TangentOut.Y = (OtherRealType)Tangents[k].Y;
173 TangentOut.Z = (OtherRealType)Tangents[k].Z;
177 }
178
179
188 const UE::Math::TVector<RealType>& BaryCoords,
189 UE::Math::TVector<RealType>& TangentOut,
191 {
192 int32 k = TriangleID * 3;
193 if (k >= 0 && (k+2) < Tangents.Num())
194 {
195 TangentOut = Blend3(Tangents[k], Tangents[k+1], Tangents[k+2], BaryCoords.X, BaryCoords.Y, BaryCoords.Z);
196 Normalize(TangentOut);
197 BitangentOut = Blend3(Bitangents[k], Bitangents[k+1], Bitangents[k+2], BaryCoords.X, BaryCoords.Y, BaryCoords.Z);
199 }
200 else
201 {
202 TangentOut = TVector<RealType>::UnitX();
204 }
205 }
206
207
213 void SetPerTriangleTangent(int TriangleID, int TriVertIdx, const TVector<RealType>& Tangent, const TVector<RealType>& Bitangent)
214 {
215 int k = TriangleID * 3 + TriVertIdx;
216 Tangents[k] = Tangent;
217 Bitangents[k] = Bitangent;
218 }
219
225 template<typename OtherVectorType>
227 {
228 int k = TriangleID * 3 + TriVertexIndex;
229 TangentOut = (OtherVectorType)Tangents[k];
231 }
232
233
234 //
235 // Per-Triangle Tangents
236 // Number of Tangents is NumTriangles
237 //
238
244
250
251
257
258
259
265 {
266 const FDynamicMeshAttributeSet* Attributes = Mesh.Attributes();
267 if (!Attributes)
268 {
269 return false;
270 }
271 const FDynamicMeshUVOverlay* UVOverlay = Attributes->PrimaryUV();
272 const FDynamicMeshNormalOverlay* NormalOverlay = Attributes->PrimaryNormals();
273 if (UVOverlay && NormalOverlay)
274 {
277 Tangents.ComputeTriVertexTangents(NormalOverlay, UVOverlay, FComputeTangentsOptions());
279 return Tangents.CopyToOverlays(Mesh);
280 }
281 return false;
282 }
283
284protected:
289
290 // calculate per-triangle tangents and then projected to overlay normals at each triangle-vertex
291 void ComputeSeparatePerTriangleTangents(const FDynamicMeshNormalOverlay* NormalOverlay, const FDynamicMeshUVOverlay* UVOverlay, const FComputeTangentsOptions& Options);
292
293 // Calculate MikkT-space-style tangents
294 void ComputeMikkTStyleTangents(const FDynamicMeshNormalOverlay* NormalOverlay, const FDynamicMeshUVOverlay* UVOverlay, const FComputeTangentsOptions& Options);
295};
296
299
300
301
302
303template<typename RealType>
304template<typename OtherRealType>
306{
309
311 check(Mesh->MaxTriangleID() * 3 == Num);
312 InitializeTriVertexTangents(false);
313 for (int32 k = 0; k < Num; ++k)
314 {
316 Bitangents[k] = TVector<RealType>(OtherBitangents[k]);
317 }
318 AllDegenerateTris = OtherMeshTangents.GetDegenerateTris();
319}
320
321
322} // end namespace UE::Geometry
323} // end namespace UE
@ Normal
Definition AndroidInputInterface.h:116
#define check(expr)
Definition AssertionMacros.h:314
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
#define X(Name, Desc)
Definition FormatStringSan.h:47
@ Num
Definition MetalRHIPrivate.h:234
Definition Array.h:670
UE_REWRITE SizeType Num() const
Definition Array.h:1144
Definition DynamicMesh3.h:108
int MaxTriangleID() const
Definition DynamicMesh3.h:399
FDynamicMeshAttributeSet * Attributes()
Definition DynamicMesh3.h:1039
Definition DynamicMeshAttributeSet.h:84
FDynamicMeshNormalOverlay * PrimaryNormals()
Definition DynamicMeshAttributeSet.h:250
FDynamicMeshUVOverlay * PrimaryUV()
Definition DynamicMeshAttributeSet.h:198
GEOMETRYCORE_API void EnableTangents()
Definition DynamicMeshAttributeSet.cpp:683
Definition MeshTangents.h:25
const FDynamicMeshNormalOverlay * Bitangents
Definition MeshTangents.h:30
const FDynamicMeshNormalOverlay * Tangents
Definition MeshTangents.h:29
GEOMETRYCORE_API bool HasValidTangents(bool bCheckValues=false) const
Definition MeshTangents.cpp:26
const FDynamicMesh3 * Mesh
Definition MeshTangents.h:27
GEOMETRYCORE_API void GetTangentFrame(int32 TriangleID, int32 TriVertexIndex, FVector3f &NormalOut, FVector3f &TangentOut, FVector3f &BitangentOut) const
Definition MeshTangents.cpp:62
const FDynamicMeshNormalOverlay * Normals
Definition MeshTangents.h:28
GEOMETRYCORE_API void GetTangentVectors(int32 TriangleID, int32 TriVertexIndex, const FVector3f &Normal, FVector3f &TangentOut, FVector3f &BitangentOut) const
Definition MeshTangents.cpp:86
Definition DynamicMeshOverlay.h:714
Definition MeshTangents.h:76
GEOMETRYCORE_API void ComputeTriangleTangents(const FDynamicMeshUVOverlay *UVOverlay, bool bOrthogonalize=true)
Definition MeshTangents.cpp:238
const FDynamicMesh3 * Mesh
Definition MeshTangents.h:79
void SetMesh(const FDynamicMesh3 *MeshIn)
Definition MeshTangents.h:98
GEOMETRYCORE_API bool CopyToOverlays(FDynamicMesh3 &MeshToSet) const
Definition MeshTangents.cpp:298
void SetPerTriangleTangent(int TriangleID, int TriVertIdx, const TVector< RealType > &Tangent, const TVector< RealType > &Bitangent)
Definition MeshTangents.h:213
void InitializeTriangleTangents(bool bClearToZero)
Definition MeshTangents.h:240
void GetPerTriangleTangent(int32 TriangleID, int32 TriVertIdx, VectorType &TangentOut, VectorType &BitangentOut) const
Definition MeshTangents.h:168
void GetInterpolatedTriangleTangent(int32 TriangleID, const UE::Math::TVector< RealType > &BaryCoords, UE::Math::TVector< RealType > &TangentOut, UE::Math::TVector< RealType > &BitangentOut) const
Definition MeshTangents.h:187
void GetPerTriangleTangent(int32 TriangleID, int32 TriVertIdx, UE::Math::TVector< RealType > &TangentOut, UE::Math::TVector< RealType > &BitangentOut) const
Definition MeshTangents.h:154
void ComputeSeparatePerTriangleTangents(const FDynamicMeshNormalOverlay *NormalOverlay, const FDynamicMeshUVOverlay *UVOverlay, const FComputeTangentsOptions &Options)
Definition MeshTangents.cpp:349
void ComputeMikkTStyleTangents(const FDynamicMeshNormalOverlay *NormalOverlay, const FDynamicMeshUVOverlay *UVOverlay, const FComputeTangentsOptions &Options)
Definition MeshTangents.cpp:395
static bool ComputeDefaultOverlayTangents(FDynamicMesh3 &Mesh)
Definition MeshTangents.h:264
const TArray< TVector< RealType > > & GetTangents() const
Definition MeshTangents.h:103
GEOMETRYCORE_API void ComputeTriVertexTangents(const FDynamicMeshNormalOverlay *NormalOverlay, const FDynamicMeshUVOverlay *UVOverlay, const FComputeTangentsOptions &Options)
Definition MeshTangents.cpp:177
GEOMETRYCORE_API void SetTangentCount(int Count, bool bClearToZero)
Definition MeshTangents.cpp:119
void InitializeTriVertexTangents(bool bClearToZero)
Definition MeshTangents.h:124
const TArray< TVector< RealType > > & GetBitangents() const
Definition MeshTangents.h:105
TArray< TVector< RealType > > Bitangents
Definition MeshTangents.h:83
const FDynamicMesh3 * GetMesh() const
Definition MeshTangents.h:110
void GetTriangleVertexTangentVectors(int32 TriangleID, int32 TriVertexIndex, OtherVectorType &TangentOut, OtherVectorType &BitangentOut) const
Definition MeshTangents.h:226
TMeshTangents(const FDynamicMesh3 *Mesh)
Definition MeshTangents.h:93
TArray< int32 > AllDegenerateTris
Definition MeshTangents.h:85
const TArray< int32 > & GetDegenerateTris() const
Definition MeshTangents.h:107
TMeshTangents()
Definition MeshTangents.h:88
void CopyTriVertexTangents(const TMeshTangents< OtherRealType > &OtherTangents)
Definition MeshTangents.h:305
TArray< TVector< RealType > > Tangents
Definition MeshTangents.h:81
UE::Math::TVector< T > Blend3(const UE::Math::TVector< T > &A, const UE::Math::TVector< T > &B, const UE::Math::TVector< T > &C, const T &WeightA, const T &WeightB, const T &WeightC)
Definition VectorTypes.h:365
TMeshTangents< float > FMeshTangentsf
Definition MeshTangents.h:297
T Normalize(UE::Math::TVector2< T > &Vector, const T Epsilon=0)
Definition VectorTypes.h:46
TMeshTangents< double > FMeshTangentsd
Definition MeshTangents.h:298
Definition Sphere.cpp:10
Definition AdvancedWidgetsModule.cpp:13
Definition MeshTangents.h:62
bool bAveraged
Definition MeshTangents.h:64
bool bAngleWeighted
Definition MeshTangents.h:66
static TVector< T > UnitX()
Definition Vector.h:118
T Z
Definition Vector.h:68
T Y
Definition Vector.h:65
static TVector< T > UnitY()
Definition Vector.h:121
T X
Definition Vector.h:62