UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
DynamicSubmesh3.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3// Port of geometry3cpp DSubmesh3
4
5#pragma once
6
8#include "DynamicMeshEditor.h"
10
11namespace UE
12{
13namespace Geometry
14{
15
17{
18protected:
21
22 // TODO: this is a fully generic mapping backed by TMaps both ways
23 // we could instead back the reverse mapping by a TArray since it's dense for submeshes
25
26 TSet<int> BaseBorderE; // set of internal border edge indices on base mesh. Does not include mesh boundary edges.
27 TSet<int> BaseBoundaryE; // set of mesh-boundary edges on base mesh that are in submesh
28 TSet<int> BaseBorderV; // set of border vertex indices on base mesh (ie verts of BaseBorderE - does not include mesh boundary vertices)
29
30public:
34 bool bComputeTriMaps = true;
35
36public:
38 FDynamicSubmesh3() : BaseMesh(nullptr) {}
39
44
50
52 inline const FDynamicMesh3* GetBaseMesh() const
53 {
54 return BaseMesh;
55 }
56
59 {
60 return Submesh;
61 }
62
64 inline const FDynamicMesh3& GetSubmesh() const
65 {
66 return Submesh;
67 }
68
70 inline const TSet<int> GetBaseBorderEdges() const
71 {
72 return BaseBorderE;
73 }
74
76 inline const TSet<int> GetBaseBoundaryEdges() const
77 {
78 return BaseBoundaryE;
79 }
80
82 inline const TSet<int> GetBaseBorderVertices() const
83 {
84 return BaseBorderV;
85 }
86
88 inline bool InBaseBorderEdges(int BaseEID) const
89 {
90 return BaseBorderE.Contains(BaseEID);
91 }
92
94 inline bool InBaseBoundaryEdges(int BaseEID) const
95 {
96 return BaseBoundaryE.Contains(BaseEID);
97 }
98
100 inline bool InBaseBorderVertices(int BaseVID) const
101 {
102 return BaseBorderV.Contains(BaseVID);
103 }
104
106 inline int MapVertexToSubmesh(int BaseVID) const
107 {
109 }
111 inline int MapVertexToBaseMesh(int SubVID) const
112 {
114 }
115
128 {
129 for (int i = 0; i < Vertices.Num(); ++i)
130 {
131 Vertices[i] = MapVertexToSubmesh(Vertices[i]);
132 }
133 }
134
153 {
154 for (int i = 0; i < Edges.Num(); ++i)
155 {
156 Edges[i] = MapEdgeToSubmesh(Edges[i]);
157 }
158 }
159
160
162 inline int MapTriangleToSubmesh(int BaseTID) const
163 {
165 return Mappings.GetTriangleMap().GetTo(BaseTID);
166 }
168 inline int MapTriangleToBaseMesh(int SubTID) const
169 {
172 }
175 {
177 for (int i = 0; i < Triangles.Num(); ++i)
178 {
179 Triangles[i] = MapTriangleToSubmesh(Triangles[i]);
180 }
181 }
182
184 inline int MapGroupToSubmesh(int BaseGID) const
185 {
188 }
190 inline int MapGroupToBaseMesh(int SubGID) const
191 {
194 }
197 {
199 for (int i = 0; i < GroupIDs.Num(); ++i)
200 {
202 }
203 }
204
210
216
218 int MapUVToSubmesh(int UVLayer, int BaseUVID) const
219 {
221 }
222
224 int MapUVToBaseMesh(int UVLayer, int SubUVID) const
225 {
227 }
228
231 {
233 }
234
237 {
239 }
240
248 {
250
251 // construct submesh matching basemesh & desired flags
254 {
257 }
258
259 int EstVerts = SubTriangles.Num() / 2;
260
263 Editor.AppendTriangles(BaseMesh, SubTriangles, Mappings, ResultOut, bComputeTriMaps);
264
266 }
267
269 void Compute(FDynamicMesh3* Base, const TArrayView<const int>& Triangles, int WantComponents = (int)EMeshComponents::All, bool bAttributes = true)
270 {
271 BaseMesh = Base;
273 }
274
275protected:
276
282 {
284
285 // set of base-mesh triangles that are in submesh
287 for (int TID : SubTriangles)
288 {
289 SubTris.Add(TID);
290 }
291
292 BaseBorderV.Reset();
293 BaseBorderE.Reset();
294 BaseBoundaryE.Reset();
295
296 // Iterate through edges in submesh roi on base mesh. If
297 // one of the tris of the edge is not in submesh roi, then this
298 // is a boundary edge.
299 //
300 // (edge iteration via triangle iteration processes each internal edge twice...)
301 for (int TID : SubTriangles)
302 {
304 for (int j = 0; j < 3; ++j)
305 {
306 int eid = tedges[j];
307 FIndex2i tris = BaseMesh->GetEdgeT(eid);
308 if (tris.B == FDynamicMesh3::InvalidID) // this is a boundary edge
309 {
310 BaseBoundaryE.Add(eid);
311
312 }
313 else if (SubTris[tris.A] != SubTris[tris.B]) // this is a border edge
314 {
315 BaseBorderE.Add(eid);
317 BaseBorderV.Add(ve.A);
318 BaseBorderV.Add(ve.B);
319 }
320 }
321 }
322
323 }
324};
325
326
327
328} // end namespace UE::Geometry
329} // end namespace UE
#define checkSlow(expr)
Definition AssertionMacros.h:332
#define check(expr)
Definition AssertionMacros.h:314
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
@ Compute
Definition MetalRHIPrivate.h:232
Definition ArrayView.h:139
UE_FORCEINLINE_HINT constexpr SizeType Num() const
Definition ArrayView.h:380
Definition Array.h:670
Definition DynamicMesh3.h:108
int MaxTriangleID() const
Definition DynamicMesh3.h:399
FIndex2i GetEdgeT(int EdgeID) const
Definition DynamicMesh3.h:882
bool HasAttributes() const
Definition DynamicMesh3.h:436
GEOMETRYCORE_API void EnableAttributes()
Definition DynamicMesh3.cpp:673
FIndex2i GetEdgeV(int EdgeID) const
Definition DynamicMesh3.h:862
GEOMETRYCORE_API int GetComponentsFlags() const
Definition DynamicMesh3.cpp:530
FDynamicMeshAttributeSet * Attributes()
Definition DynamicMesh3.h:1039
GEOMETRYCORE_API int FindEdge(int VertexA, int VertexB) const
Definition DynamicMesh3.cpp:1546
static constexpr int InvalidID
Definition DynamicMesh3.h:158
FIndex3i GetTriEdges(int TriangleID) const
Definition DynamicMesh3.h:798
GEOMETRYCORE_API void EnableMatchingAttributes(const FDynamicMeshAttributeSet &ToMatch, bool bClearExisting=true, bool bDiscardExtraAttributes=false)
Definition DynamicMeshAttributeSet.cpp:445
Definition DynamicMeshEditor.h:71
Definition SparseIndexCollectionTypes.h:21
EMeshComponents
Definition DynamicMesh3.h:50
Definition AdvancedWidgetsModule.cpp:13
Definition DynamicMeshEditor.h:26
Definition DynamicSubmesh3.h:17
const FDynamicMesh3 * GetBaseMesh() const
Definition DynamicSubmesh3.h:52
void MapEdgesToSubmesh(TArrayView< int > &Edges) const
Definition DynamicSubmesh3.h:152
const FDynamicMesh3 * BaseMesh
Definition DynamicSubmesh3.h:19
FIndex2i MapVerticesToSubmesh(FIndex2i VIDs) const
Definition DynamicSubmesh3.h:117
int MapNormalToBaseMesh(int NormalLayer, int SubNID) const
Definition DynamicSubmesh3.h:212
TSet< int > BaseBorderV
Definition DynamicSubmesh3.h:28
int MapColorToSubmesh(int BaseCID) const
Definition DynamicSubmesh3.h:230
const TSet< int > GetBaseBoundaryEdges() const
Definition DynamicSubmesh3.h:76
FDynamicMesh3 & GetSubmesh()
Definition DynamicSubmesh3.h:58
const FDynamicMesh3 & GetSubmesh() const
Definition DynamicSubmesh3.h:64
void ComputeBoundaryInfo(const TArrayView< const int > &SubTriangles)
Definition DynamicSubmesh3.h:281
int MapVertexToBaseMesh(int SubVID) const
Definition DynamicSubmesh3.h:111
int MapNormalToSubmesh(int NormalLayer, int BaseNID) const
Definition DynamicSubmesh3.h:206
const TSet< int > GetBaseBorderVertices() const
Definition DynamicSubmesh3.h:82
void Compute(FDynamicMesh3 *Base, const TArrayView< const int > &Triangles, int WantComponents=(int) EMeshComponents::All, bool bAttributes=true)
Definition DynamicSubmesh3.h:269
FMeshIndexMappings Mappings
Definition DynamicSubmesh3.h:24
bool InBaseBorderVertices(int BaseVID) const
Definition DynamicSubmesh3.h:100
int MapUVToBaseMesh(int UVLayer, int SubUVID) const
Definition DynamicSubmesh3.h:224
FDynamicSubmesh3(const FDynamicMesh3 *BaseMesh, const TArray< int > &Triangles, int WantComponents=(int) EMeshComponents::All, bool bAttributes=true)
Definition DynamicSubmesh3.h:46
int MapEdgeToSubmesh(int BaseEID) const
Definition DynamicSubmesh3.h:136
void Compute(const TArrayView< const int > &SubTriangles, int WantComponents=(int) EMeshComponents::All, bool bAttributes=true)
Definition DynamicSubmesh3.h:247
int MapEdgeToBaseMesh(int SubEID) const
Definition DynamicSubmesh3.h:144
bool bComputeTriMaps
Definition DynamicSubmesh3.h:34
int MapTriangleToSubmesh(int BaseTID) const
Definition DynamicSubmesh3.h:162
void MapTrianglesToSubmesh(TArrayView< int > &Triangles) const
Definition DynamicSubmesh3.h:174
void MapVerticesToSubmesh(TArrayView< int > &Vertices) const
Definition DynamicSubmesh3.h:127
TSet< int > BaseBoundaryE
Definition DynamicSubmesh3.h:27
const TSet< int > GetBaseBorderEdges() const
Definition DynamicSubmesh3.h:70
bool InBaseBorderEdges(int BaseEID) const
Definition DynamicSubmesh3.h:88
FDynamicMesh3 Submesh
Definition DynamicSubmesh3.h:20
int MapGroupToSubmesh(int BaseGID) const
Definition DynamicSubmesh3.h:184
int MapGroupToBaseMesh(int SubGID) const
Definition DynamicSubmesh3.h:190
bool InBaseBoundaryEdges(int BaseEID) const
Definition DynamicSubmesh3.h:94
int MapTriangleToBaseMesh(int SubTID) const
Definition DynamicSubmesh3.h:168
FDynamicSubmesh3(const FDynamicMesh3 *BaseMesh)
Definition DynamicSubmesh3.h:41
int MapVertexToSubmesh(int BaseVID) const
Definition DynamicSubmesh3.h:106
FIndex2i MapVerticesToBaseMesh(FIndex2i VIDs) const
Definition DynamicSubmesh3.h:122
TSet< int > BaseBorderE
Definition DynamicSubmesh3.h:26
FDynamicSubmesh3()
Definition DynamicSubmesh3.h:38
int MapUVToSubmesh(int UVLayer, int BaseUVID) const
Definition DynamicSubmesh3.h:218
int MapColorToBaseMesh(int SubCID) const
Definition DynamicSubmesh3.h:236
void MapGroupsToSubmesh(TArrayView< int32 > GroupIDs) const
Definition DynamicSubmesh3.h:196
Definition IndexTypes.h:27
int A
Definition IndexTypes.h:32
int B
Definition IndexTypes.h:32
Definition IndexTypes.h:158
Definition MeshIndexMappings.h:22
FIndexMapi & GetUVMap(int UVLayer)
Definition MeshIndexMappings.h:78
FIndexMapi & GetNormalMap(int NormalLayer)
Definition MeshIndexMappings.h:84
FIndexMapi & GetVertexMap()
Definition MeshIndexMappings.h:60
FIndexMapi & GetColorMap()
Definition MeshIndexMappings.h:90
FIndexMapi & GetTriangleMap()
Definition MeshIndexMappings.h:66
FIndexMapi & GetGroupMap()
Definition MeshIndexMappings.h:72
IntType GetFrom(IntType ToID) const
Definition GeometryTypes.h:160
IntType GetTo(IntType FromID) const
Definition GeometryTypes.h:151