UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
MeshShapeGenerator.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "VectorTypes.h"
6#include "IntVectorTypes.h"
7#include "IndexTypes.h"
8
9namespace UE
10{
11namespace Geometry
12{
13
18class /*GEOMETRYCORE_API*/ FMeshShapeGenerator
19{
20public:
23
28
33
42
43
44public:
46 bool bReverseOrientation = false;
47
49 {
50 }
51
52
57
58 bool HasAttributes() const
59 {
60 return UVs.Num() > 0 || Normals.Num() > 0;
61 }
62
63 // Reset UV and normal-related on a generator, leaving vertices and triangles alone
64 // @param bResetPolygonIDs Whether to also reset polygon IDs
66 {
67 UVs.Reset();
69 Normals.Reset();
71 TriangleUVs.Reset();
72 TriangleNormals.Reset();
74 {
76 }
77 }
78
80 void Reset()
81 {
82 Vertices.Reset();
83 UVs.Reset();
85 Normals.Reset();
87 Triangles.Reset();
88 TriangleUVs.Reset();
89 TriangleNormals.Reset();
91 }
92
93
97 void SetBufferSizes(int NumVertices, int NumTriangles, int NumUVs, int NumNormals)
98 {
99 if (NumVertices > 0)
100 {
101 Vertices.SetNum(NumVertices);
102 }
103 if (NumTriangles > 0)
104 {
105 Triangles.SetNum(NumTriangles);
106 TriangleUVs.SetNum(NumTriangles);
107 TriangleNormals.SetNum(NumTriangles);
108 TrianglePolygonIDs.SetNum(NumTriangles);
109 }
110 if (NumUVs > 0)
111 {
112 UVs.SetNum(NumUVs);
113 UVParentVertex.SetNum(NumUVs);
114 }
115 if (NumNormals > 0)
116 {
117 Normals.SetNum(NumNormals);
119 }
120 }
124 void ExtendBufferSizes(int AddVertices, int AddTriangles, int AddUVs, int AddNormals)
125 {
126 if (AddVertices > 0)
127 {
128 int NumVertices = Vertices.Num() + AddVertices;
129 Vertices.SetNum(NumVertices);
130 }
131 if (AddTriangles > 0)
132 {
133 int NumTriangles = Triangles.Num() + AddTriangles;
134 Triangles.SetNum(NumTriangles);
135 TriangleUVs.SetNum(NumTriangles);
136 TriangleNormals.SetNum(NumTriangles);
137 TrianglePolygonIDs.SetNum(NumTriangles);
138 }
139 if (AddUVs > 0)
140 {
141 int NumUVs = UVs.Num() + AddUVs;
142 UVs.SetNum(NumUVs);
143 UVParentVertex.SetNum(NumUVs);
144 }
145 if (AddNormals > 0)
146 {
147 int NumNormals = Normals.Num() + AddNormals;
148 Normals.SetNum(NumNormals);
150 }
151 }
152
153
155 inline void SetVertex(int Index, const FVector3d& Position)
156 {
158 }
160 inline int AppendVertex(const FVector3d& Position)
161 {
162 Vertices.Add(Position);
163 return Vertices.Num()-1;
164 }
165
167 inline void SetUV(int Index, const FVector2f& UV, int ParentVertex)
168 {
169 UVs[Index] = UV;
171 }
172 inline int AppendUV(const FVector2f& UV, int ParentVertex)
173 {
174 UVs.Add(UV);
176 return UVs.Num() - 1;
177 }
178
180 inline void SetNormal(int Index, const FVector3f& Normal, int ParentVertex)
181 {
184 }
186 {
187 Normals.Add(Normal);
189 return Normals.Num() - 1;
190 }
191
192
193 inline void SetTriangle(int Index, const FIndex3i& Tri)
194 {
195 Triangles[Index] = bReverseOrientation ? FIndex3i(Tri.C, Tri.B, Tri.A) : Tri;
196 }
197 inline void SetTriangle(int Index, int A, int B, int C)
198 {
200 }
201 inline void SetTriangle(int Index, int A, int B, int C, bool bClockwiseOverride)
202 {
204 }
205
206
207 inline int AppendTriangle(int A, int B, int C)
208 {
210 TriangleUVs.SetNum(Triangles.Num());
211 TriangleNormals.SetNum(Triangles.Num());
213 return Triangles.Num() - 1;
214 }
215
216
217 inline void SetTriangleUVs(int Index, const FIndex3i& Tri)
218 {
219 TriangleUVs[Index] = bReverseOrientation ? FIndex3i(Tri.C, Tri.B, Tri.A) : Tri;
220 }
221 inline void SetTriangleUVs(int Index, int A, int B, int C)
222 {
224 }
225 inline void SetTriangleUVs(int Index, int A, int B, int C, bool bClockwiseOverride)
226 {
228 }
229
230
231 inline void SetTriangleNormals(int Index, const FIndex3i& Tri)
232 {
233 TriangleNormals[Index] = bReverseOrientation ? FIndex3i(Tri.C, Tri.B, Tri.A) : Tri;
234 }
235 inline void SetTriangleNormals(int Index, int A, int B, int C)
236 {
238 }
239 inline void SetTriangleNormals(int Index, int A, int B, int C, bool bClockwiseOverride)
240 {
242 }
243
244 inline void SetTrianglePolygon(int Index, int PolygonID)
245 {
246 TrianglePolygonIDs[Index] = PolygonID;
247 }
248
253 inline void SetTriangleWithMatchedUVNormal(int Index, int A, int B, int C)
254 {
255 SetTriangle(Index, A, B, C);
258 }
259
260
261 static FVector3d BilinearInterp(const FVector3d &v00, const FVector3d &v10, const FVector3d &v11, const FVector3d &v01, double tx, double ty)
262 {
263 FVector3d a = Lerp(v00, v01, ty);
264 FVector3d b = Lerp(v10, v11, ty);
265 return Lerp(a, b, tx);
266 }
267
268 static FVector2d BilinearInterp(const FVector2d &v00, const FVector2d &v10, const FVector2d &v11, const FVector2d &v01, double tx, double ty)
269 {
270 FVector2d a = Lerp(v00, v01, ty);
271 FVector2d b = Lerp(v10, v11, ty);
272 return Lerp(a, b, tx);
273 }
274
275 static FVector2f BilinearInterp(const FVector2f &v00, const FVector2f &v10, const FVector2f &v11, const FVector2f &v01, float tx, float ty)
276 {
277 FVector2f a = Lerp(v00, v01, ty);
278 FVector2f b = Lerp(v10, v11, ty);
279 return Lerp(a, b, tx);
280 }
281
282
283 static FVector3i LinearInterp(const FVector3i &a, const FVector3i &b, double t)
284 {
285 FVector3d c = Lerp((FVector3d)a, (FVector3d)b, t);
286 return FVector3i((int)round(c.X), (int)round(c.Y), (int)round(c.Z));
287 }
288
289};
290
291} // end namespace UE::Geometry
292} // end namespace UE
@ Normal
Definition AndroidInputInterface.h:116
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
Definition Array.h:670
void Reset(SizeType NewSize=0)
Definition Array.h:2246
void SetNum(SizeType NewNum, EAllowShrinking AllowShrinking=UE::Core::Private::AllowShrinkingByDefault< AllocatorType >())
Definition Array.h:2308
UE_NODEBUG UE_FORCEINLINE_HINT SizeType Add(ElementType &&Item)
Definition Array.h:2696
Definition MeshShapeGenerator.h:19
int AppendNormal(const FVector3f &Normal, int ParentVertex)
Definition MeshShapeGenerator.h:185
void Reset()
Definition MeshShapeGenerator.h:80
static FVector2d BilinearInterp(const FVector2d &v00, const FVector2d &v10, const FVector2d &v11, const FVector2d &v01, double tx, double ty)
Definition MeshShapeGenerator.h:268
void SetTriangle(int Index, int A, int B, int C, bool bClockwiseOverride)
Definition MeshShapeGenerator.h:201
void SetTriangleWithMatchedUVNormal(int Index, int A, int B, int C)
Definition MeshShapeGenerator.h:253
TArray< FIndex3i > TriangleUVs
Definition MeshShapeGenerator.h:37
TArray< FVector2f > UVs
Definition MeshShapeGenerator.h:25
TArray< int > TrianglePolygonIDs
Definition MeshShapeGenerator.h:41
TArray< FIndex3i > Triangles
Definition MeshShapeGenerator.h:35
virtual ~FMeshShapeGenerator()
Definition MeshShapeGenerator.h:48
TArray< int > UVParentVertex
Definition MeshShapeGenerator.h:27
TArray< FVector3d > Vertices
Definition MeshShapeGenerator.h:22
TArray< FVector3f > Normals
Definition MeshShapeGenerator.h:30
void SetTriangleNormals(int Index, int A, int B, int C, bool bClockwiseOverride)
Definition MeshShapeGenerator.h:239
void SetTriangle(int Index, const FIndex3i &Tri)
Definition MeshShapeGenerator.h:193
void SetVertex(int Index, const FVector3d &Position)
Definition MeshShapeGenerator.h:155
bool HasAttributes() const
Definition MeshShapeGenerator.h:58
void ResetAttributes(bool bResetPolygonIDs=false)
Definition MeshShapeGenerator.h:65
void ExtendBufferSizes(int AddVertices, int AddTriangles, int AddUVs, int AddNormals)
Definition MeshShapeGenerator.h:124
void SetTriangleUVs(int Index, int A, int B, int C)
Definition MeshShapeGenerator.h:221
void SetNormal(int Index, const FVector3f &Normal, int ParentVertex)
Definition MeshShapeGenerator.h:180
static FVector3i LinearInterp(const FVector3i &a, const FVector3i &b, double t)
Definition MeshShapeGenerator.h:283
void SetTriangleUVs(int Index, const FIndex3i &Tri)
Definition MeshShapeGenerator.h:217
bool bReverseOrientation
Definition MeshShapeGenerator.h:46
int AppendVertex(const FVector3d &Position)
Definition MeshShapeGenerator.h:160
int AppendTriangle(int A, int B, int C)
Definition MeshShapeGenerator.h:207
void SetTriangleNormals(int Index, int A, int B, int C)
Definition MeshShapeGenerator.h:235
TArray< int > NormalParentVertex
Definition MeshShapeGenerator.h:32
void SetTriangleUVs(int Index, int A, int B, int C, bool bClockwiseOverride)
Definition MeshShapeGenerator.h:225
void SetTrianglePolygon(int Index, int PolygonID)
Definition MeshShapeGenerator.h:244
static FVector2f BilinearInterp(const FVector2f &v00, const FVector2f &v10, const FVector2f &v11, const FVector2f &v01, float tx, float ty)
Definition MeshShapeGenerator.h:275
void SetTriangle(int Index, int A, int B, int C)
Definition MeshShapeGenerator.h:197
void SetTriangleNormals(int Index, const FIndex3i &Tri)
Definition MeshShapeGenerator.h:231
int AppendUV(const FVector2f &UV, int ParentVertex)
Definition MeshShapeGenerator.h:172
TArray< FIndex3i > TriangleNormals
Definition MeshShapeGenerator.h:39
static FVector3d BilinearInterp(const FVector3d &v00, const FVector3d &v10, const FVector3d &v11, const FVector3d &v01, double tx, double ty)
Definition MeshShapeGenerator.h:261
virtual FMeshShapeGenerator & Generate()=0
void SetUV(int Index, const FVector2f &UV, int ParentVertex)
Definition MeshShapeGenerator.h:167
void SetBufferSizes(int NumVertices, int NumTriangles, int NumUVs, int NumNormals)
Definition MeshShapeGenerator.h:97
Definition AdvancedWidgetsModule.cpp:13
U16 Index
Definition radfft.cpp:71
Definition IndexTypes.h:158
int B
Definition IndexTypes.h:164
int A
Definition IndexTypes.h:163
int C
Definition IndexTypes.h:165
Definition IntVectorTypes.h:252
T Z
Definition Vector.h:68
T Y
Definition Vector.h:65
T X
Definition Vector.h:62