UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
DynamicMesh3.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3// Port of geometry3cpp DMesh3
4
5#pragma once
6
8#include "BoxTypes.h"
9#include "Containers/Array.h"
12#include "FrameTypes.h"
13#include "GeometryTypes.h"
14#include "HAL/Platform.h"
15#include "IndexTypes.h"
16#include "InfoTypes.h"
17#include "Math/UnrealMathSSE.h"
18#include "Math/Vector.h"
19#include "Math/Vector2D.h"
20#include "MathUtil.h"
22#include "Misc/Optional.h"
23#include "Quaternion.h"
25#include "Templates/Function.h"
26#include "Templates/UniquePtr.h"
28#include "Util/CompactMaps.h"
29#include "Util/DynamicVector.h"
30#include "Util/IndexUtil.h"
31#include "Util/IteratorUtil.h"
32#include "Util/RefCountVector.h"
33#include "Util/SmallListSet.h"
34#include "VectorTypes.h"
35#include "VectorUtil.h"
36
37#include <atomic>
38#include <initializer_list>
39
40namespace UE
41{
42namespace Geometry
43{
44
45class FCompactMaps;
46class FDynamicMeshAttributeSet;
47class FMeshShapeGenerator;
48
50{
51 None = 0,
52 VertexNormals = 1,
53 VertexColors = 2,
54 VertexUVs = 4,
55 FaceGroups = 8,
56 All = 15
57};
58
108{
109
110// TODO:
111// - Many of the iterators depend on lambda functions, can we replace these with calls to
112// internal/static functions that do the same thing?
113// - CompactInPlace() does not compact VertexEdgeLists
114
115public:
123
124 // Inline-allocator array types optionally used for mesh queries, to reduce heap allocations
127
128 struct FEdge
129 {
132 friend bool operator!=(const FEdge& e0, const FEdge& e1)
133 {
134 return (e0.Vert != e1.Vert) || (e0.Tri != e1.Tri);
135 }
136
145 {
146 E.Serialize(Ar);
147 return Ar;
148 }
149
152 {
153 Ar << Vert;
154 Ar << Tri;
155 }
156 };
158 constexpr static int InvalidID = IndexConstants::InvalidID;
160 constexpr static int NonManifoldID = -2;
162 constexpr static int DuplicateTriangleID = -3;
163
167
168protected:
181
192
197
200
201protected:
202 UE_DEPRECATED(5.7, "bEnableShapeChangeStamp is no longer used. Use SetShapeChangeStampEnabled and HasShapeChangeStampEnabled instead.")
204
205 UE_DEPRECATED(5.7, "ShapeChangeStamp is no longer used. Use GetShapeChangeStamp or UpdateChangeStamps instead.")
206 std::atomic<uint32> ShapeChangeStamp = 0;
207 UE_DEPRECATED(5.7, "TopologyChangeStamp is no longer used. Use GetTopologyChangeStamp or UpdateChangeStamps instead.")
208 std::atomic<uint32> TopologyChangeStamp = 0;
209
210private:
211 struct FChangeStamp
212 {
213 explicit FChangeStamp(bool bInIsEnabled)
214 : bIsEnabled(bInIsEnabled)
215 {
216 }
217
218 UE_NONCOPYABLE(FChangeStamp);
219
221 bool bIsEnabled = false;
222
224 mutable FTransactionallySafeMutex Mutex;
225
227 uint32 Value = 1;
228
230 void IncrementIfEnabled()
231 {
232 if (bIsEnabled)
233 {
234 Mutex.Lock();
235 ++Value;
236 Mutex.Unlock();
237 }
238 }
239
241 void Set(uint32 NewValue)
242 {
243 if (bIsEnabled)
244 {
245 Mutex.Lock();
246 Value = NewValue;
247 Mutex.Unlock();
248 }
249 }
250
252 uint32 GetValue() const
253 {
254 uint32 Result = 1;
255
256 if (bIsEnabled)
257 {
258 Mutex.Lock();
259 Result = Value;
260 Mutex.Unlock();
261 }
262
263 return Result;
264 }
265 };
266
267 // Shape change tracking can be problematic in multi-threaded contexts so they're disabled by default.
268 // In fact, it is not suggested that these be used at all. (See comment for SetShapeChangeStampEnabled.)
269 FChangeStamp ChangeStampShape{/*bIsEnabled=*/ false};
270
271 // Topological change tracking is enabled by default.
272 FChangeStamp ChangeStampTopology{/*bIsEnabled=*/ true};
273
274public:
277
281
285
288
289
291 GEOMETRYCORE_API explicit FDynamicMesh3(bool bWantNormals, bool bWantColors, bool bWantUVs, bool bWantTriGroups);
293
296
298 GEOMETRYCORE_API void Copy(const FDynamicMesh3& CopyMesh, bool bNormals = true, bool bColors = true, bool bUVs = true,
299 bool bAttributes = true);
300
305 GEOMETRYCORE_API bool Copy(const FMeshShapeGenerator* Generator);
306
307 // Tracks how IDs are offset and number of elements appended by a mesh append operation
309 {
310 // Offsets for base mesh element IDs
312
313 // Offsets for normals/tangents overlay element; will remain zero if the corresponding 'normal layer' is not present
315
316 // The number appended of each element type -- including 'invalid' slots, i.e. the amount by which MaxID increased
318 };
319
333
346 GEOMETRYCORE_API void CompactCopy(const FDynamicMesh3& CopyMesh, bool bNormals = true, bool bColors = true, bool bUVs = true,
347 bool bAttributes = true, FCompactMaps* CompactInfo = nullptr);
348
350 GEOMETRYCORE_API void Clear();
351
358 GEOMETRYCORE_API void EnableMatchingAttributes(const FDynamicMesh3& ToMatch, bool bClearExisting = true, bool bDiscardExtraAttributes = false);
359
368 {
369 Mesh.Serialize(Ar);
370 return Ar;
371 }
372
375
376public:
378 int VertexCount() const
379 {
380 return (int)VertexRefCounts.GetCount();
381 }
383 int TriangleCount() const
384 {
385 return (int)TriangleRefCounts.GetCount();
386 }
388 int EdgeCount() const
389 {
390 return (int)EdgeRefCounts.GetCount();
391 }
392
394 int MaxVertexID() const
395 {
396 return (int)VertexRefCounts.GetMaxIndex();
397 }
399 int MaxTriangleID() const
400 {
401 return (int)TriangleRefCounts.GetMaxIndex();
402 }
404 int MaxEdgeID() const
405 {
406 return (int)EdgeRefCounts.GetMaxIndex();
407 }
409 int MaxGroupID() const
410 {
411 return GroupIDCounter;
412 }
413
414
416 bool HasVertexNormals() const
417 {
418 return VertexNormals.IsSet();
419 }
421 bool HasVertexColors() const
422 {
423 return VertexColors.IsSet();
424 }
426 bool HasVertexUVs() const
427 {
428 return VertexUVs.IsSet();
429 }
431 bool HasTriangleGroups() const
432 {
433 return TriangleGroups.IsSet();
434 }
436 bool HasAttributes() const
437 {
438 return AttributeSet.IsValid();
439 }
440
443
444
446 inline bool IsVertex(int VertexID) const
447 {
448 return VertexRefCounts.IsValid(VertexID);
449 }
451 inline bool IsReferencedVertex(int VertexID) const
452 {
453 return VertexID >= 0 && VertexID < (int)VertexRefCounts.GetMaxIndex() &&
454 VertexRefCounts.GetRefCount(VertexID) > 1;
455 }
457 inline bool IsTriangle(int TriangleID) const
458 {
459 return TriangleRefCounts.IsValid(TriangleID);
460 }
462 inline bool IsEdge(int EdgeID) const
463 {
464 return EdgeRefCounts.IsValid(EdgeID);
465 }
466
467
468
469
470 //
471 // Change Tracking support
472 //
473 // Note: May someday be removed (see comment for SetShapeChangeStampEnabled)
474 //
475public:
476
485 void SetShapeChangeStampEnabled(bool bEnabled)
486 {
487 ChangeStampShape.bIsEnabled = bEnabled;
488 }
489
492 {
493 ChangeStampTopology.bIsEnabled = bEnabled;
494 }
495
498 {
499 return ChangeStampShape.bIsEnabled;
500 }
501
504 {
505 return ChangeStampTopology.bIsEnabled;
506 }
507
510 {
512 {
513 ChangeStampShape.IncrementIfEnabled();
514 }
515 if (bTopologyChange)
516 {
517 ChangeStampTopology.IncrementIfEnabled();
518 }
519 }
520
526 {
527 ensureMsgf(ChangeStampShape.bIsEnabled, TEXT("Shape change tracking is not enabled on this mesh. Use SetShapeChangeStampEnabled() to enable."));
528 return ChangeStampShape.GetValue();
529 }
530
536 {
537 ensureMsgf(ChangeStampTopology.bIsEnabled, TEXT("Topology change tracking is not enabled on this mesh. Use SetTopologyChangeStampEnabled() to enable."));
538 return ChangeStampTopology.GetValue();
539 }
540
542 inline uint64 GetChangeStamp() const
543 {
544 return ChangeStampShape.GetValue() + ChangeStampTopology.GetValue();
545 }
546
547 //
548 // Mesh Element Iterators
549 // The functions VertexIndicesItr() / TriangleIndicesItr() / EdgeIndicesItr() allow you to do:
550 // for ( int eid : EdgeIndicesItr() ) { ... }
551 // and other related begin() / end() idioms
552public:
553 // simplify names for iterations
557 template<typename T>
560
563 {
564 return VertexRefCounts.Indices();
565 }
566
572
575 {
576 return EdgeRefCounts.Indices();
577 }
578
579 // TODO: write helper functions that allow us to do these iterations w/o lambdas
580
583 {
584 return EdgeRefCounts.FilteredIndices([this](int EdgeID) { return Edges[EdgeID].Tri[1] == InvalidID; });
585 }
586
589 {
590 return VertexRefCounts.MappedIndices<FVector3d>([this](int VertexID) { return Vertices[VertexID]; });
591 }
592
595 {
596 return TriangleRefCounts.MappedIndices<FIndex3i>([this](int TriangleID) { return Triangles[TriangleID]; });
597 }
598
601 {
602 return EdgeRefCounts.MappedIndices<FEdge>([this](int EdgeID) {
603 return Edges[EdgeID];
604 });
605 }
606
609 {
611 return VertexEdgeLists.MappedValues(VertexID,
612 [VertexID, this](int eid) { return GetOtherEdgeVertex(eid, VertexID); });
613 }
614
617 {
619 VertexEdgeLists.Enumerate(VertexID, [this, &VertexFunc, VertexID](int32 eid)
620 {
622 });
623 }
624
625
628 {
630 return VertexEdgeLists.Values(VertexID);
631 }
632
635 {
638 }
639
640
643 {
645 return vtx_triangles_enumerable(VertexEdgeLists.Values(VertexID), [this, VertexID](int EdgeID) {
646 return GetOrderedOneRingEdgeTris(VertexID, EdgeID);
647 });
648 }
649
652
655
658
659
660 //
661 // Mesh Construction
662 //
663public:
666
669 {
671 }
672
674 GEOMETRYCORE_API int AppendVertex(const FDynamicMesh3& SourceMesh, int SourceVertexID);
675
677 GEOMETRYCORE_API int AppendTriangle(const FIndex3i& TriVertices, int GroupID = 0);
678
680 inline int AppendTriangle(int Vertex0, int Vertex1, int Vertex2, int GroupID = 0)
681 {
682 return AppendTriangle(FIndex3i(Vertex0, Vertex1, Vertex2), GroupID);
683 }
684
685 //
686 // Support for inserting vertex and triangle at specific IDs. This is a bit tricky
687 // because we likely will need to update the free lists in the RefCountVectors, which
688 // can be expensive. If you are going to do many inserts (eg inside a loop), wrap in
689 // BeginUnsafe / EndUnsafe calls, and pass bUnsafe = true to the InsertX() calls, to
690 // the defer free list rebuild until you are done.
691 //
692
695 {
696 // do nothing...
697 }
698
701 {
703 }
704
710 GEOMETRYCORE_API EMeshResult InsertVertex(int VertexID, const FVertexInfo& VertInfo, bool bUnsafe = false);
711
714 {
715 // do nothing...
716 }
717
723
729 GEOMETRYCORE_API EMeshResult InsertTriangle(int TriangleID, const FIndex3i& TriVertices, int GroupID = 0, bool bUnsafe = false);
730
731 //
732 // Vertex/Tri/Edge accessors
733 //
734public:
736 inline FVector3d GetVertex(int VertexID) const
737 {
738 checkSlow(IsVertex(VertexID));
739 return Vertices[VertexID];
740 }
741
743 inline const FVector3d& GetVertexRef(int VertexID) const
744 {
745 checkSlow(IsVertex(VertexID));
746 return Vertices[VertexID];
747 }
748
753 inline void SetVertex(int VertexID, const FVector3d& vNewPos, bool bTrackChange = true)
754 {
756 checkSlow(IsVertex(VertexID));
758 {
759 Vertices[VertexID] = vNewPos;
760 if (bTrackChange)
761 {
762 UpdateChangeStamps(true, false);
763 }
764 }
765 }
766
767
769 GEOMETRYCORE_API bool GetVertex(int VertexID, FVertexInfo& VertInfo, bool bWantNormals, bool bWantColors, bool bWantUVs) const;
770
772 GEOMETRYCORE_API FVertexInfo GetVertexInfo(int VertexID) const;
773
775 int GetVtxEdgeCount(int VertexID) const
776 {
777 return VertexRefCounts.IsValid(VertexID) ? VertexEdgeLists.GetCount(VertexID) : -1;
778 }
779
782
784 inline FIndex3i GetTriangle(int TriangleID) const
785 {
786 checkSlow(IsTriangle(TriangleID));
787 return Triangles[TriangleID];
788 }
789
791 inline const FIndex3i& GetTriangleRef(int TriangleID) const
792 {
793 checkSlow(IsTriangle(TriangleID));
794 return Triangles[TriangleID];
795 }
796
798 inline FIndex3i GetTriEdges(int TriangleID) const
799 {
800 checkSlow(IsTriangle(TriangleID));
801 return TriangleEdges[TriangleID];
802 }
803
805 inline const FIndex3i& GetTriEdgesRef(int TriangleID) const
806 {
807 checkSlow(IsTriangle(TriangleID));
808 return TriangleEdges[TriangleID];
809 }
810
812 inline int GetTriEdge(int TriangleID, int j) const
813 {
814 checkSlow(IsTriangle(TriangleID));
815 return TriangleEdges[TriangleID][j];
816 }
817
827
829 GEOMETRYCORE_API FIndex3i GetTriNeighbourTris(int TriangleID) const;
830
832 template<typename VecType>
833 inline void GetTriVertices(int TriangleID, VecType& v0, VecType& v1, VecType& v2) const
834 {
835 const FIndex3i& Triangle = Triangles[TriangleID];
836 v0 = Vertices[Triangle[0]];
837 v1 = Vertices[Triangle[1]];
838 v2 = Vertices[Triangle[2]];
839 }
840
842 inline FVector3d GetTriVertex(int TriangleID, int j) const
843 {
844 return Vertices[Triangles[TriangleID][j]];
845 }
846
848 inline FEdge GetEdge(int EdgeID) const
849 {
850 checkSlow(IsEdge(EdgeID));
851 return Edges[EdgeID];
852 }
853
855 inline const FEdge& GetEdgeRef(int EdgeID) const
856 {
857 checkSlow(IsEdge(EdgeID));
858 return Edges[EdgeID];
859 }
860
862 inline FIndex2i GetEdgeV(int EdgeID) const
863 {
864 checkSlow(IsEdge(EdgeID));
865 return Edges[EdgeID].Vert;
866 }
867
869 inline bool GetEdgeV(int EdgeID, FVector3d& a, FVector3d& b) const
870 {
871 checkSlow(IsEdge(EdgeID));
872
873 const FIndex2i Verts = Edges[EdgeID].Vert;
874
875 a = Vertices[Verts[0]];
876 b = Vertices[Verts[1]];
877
878 return true;
879 }
880
882 inline FIndex2i GetEdgeT(int EdgeID) const
883 {
884 checkSlow(IsEdge(EdgeID));
885 return Edges[EdgeID].Tri;
886 }
887
890
892 inline FMeshTriEdgeID GetTriEdgeIDFromEdgeID(int EdgeID) const
893 {
894 checkSlow(IsEdge(EdgeID));
895 int32 TriIndex = Edges[EdgeID].Tri.A;
897 if (TriEdges.A == EdgeID)
898 {
899 return FMeshTriEdgeID(TriIndex, 0);
900 }
901 {
902 return FMeshTriEdgeID(TriIndex, ( TriEdges.B == EdgeID ) ? 1 : 2 );
903 }
904 }
905
908 {
909 const FMeshTriEdgeID FirstTriEdgeID = GetTriEdgeIDFromEdgeID(EdgeID); // function gets MeshTriEdgeID for edge included in EdgeTri.A only
911
912 // have to get MeshTriEdgeID for edge included in EdgeTri.B
913 const int OtherTriID = GetEdgeT(EdgeID).B;
915 {
918 if (SecondTriEdges.A == EdgeID)
919 {
921 }
922 else
923 {
924 SecondTriEdgeID = FMeshTriEdgeID(OtherTriID, ( SecondTriEdges.B == EdgeID ) ? 1 : 2 );
925 }
927 }
928 }
929
930 //
931 // Vertex and Triangle attribute arrays
932 //
933public:
940
943
945 {
946 if (HasVertexNormals() == false)
947 {
948 return FVector3f::UnitY();
949 }
952 return Normals[vID];
953 }
954
956 {
957 if (HasVertexNormals())
958 {
962 }
963 }
964
965 GEOMETRYCORE_API void EnableVertexColors(const FVector3f& InitialColor);
967
968
970 {
971 if (HasVertexColors() == false)
972 {
973 return FVector3f::One();
974 }
976
977 const TDynamicVector<FVector3f>& Colors = VertexColors.GetValue();
978 return Colors[vID];
979 }
980
982 {
983 if (HasVertexColors())
984 {
986 TDynamicVector<FVector3f>& Colors = VertexColors.GetValue();
987 Colors[vID] = vNewColor;
988 }
989 }
990
993
995 {
996 if (HasVertexUVs() == false)
997 {
998 return FVector2f::Zero();
999 }
1001 const TDynamicVector<FVector2f>& UVs = VertexUVs.GetValue();
1002 return UVs[vID];
1003 }
1004
1006 {
1007 if (HasVertexUVs())
1008 {
1011 UVs[vID] = vNewUV;
1012 }
1013 }
1014
1017
1019 {
1020 return GroupIDCounter++;
1021 }
1022
1023 int GetTriangleGroup(int tID) const
1024 {
1025 return (HasTriangleGroups() == false) ? -1 :
1026 (TriangleRefCounts.IsValid(tID) ? TriangleGroups.GetValue()[tID] : 0);
1027 }
1028
1030 {
1031 if (HasTriangleGroups())
1032 {
1034 TriangleGroups.GetValue()[tid] = group_id;
1035 GroupIDCounter = FMath::Max(GroupIDCounter, group_id + 1);
1036 }
1037 }
1038
1040 {
1041 return HasAttributes() ? AttributeSet.Get() : nullptr;
1042 }
1044 {
1045 return HasAttributes() ? AttributeSet.Get() : nullptr;
1046 }
1047
1050
1051
1052 //
1053 // topological queries
1054 //
1055public:
1057 inline bool IsBoundaryEdge(int EdgeID) const
1058 {
1059 checkSlow(IsEdge(EdgeID));
1060 return Edges[EdgeID].Tri[1] == InvalidID;
1061 }
1062
1064 GEOMETRYCORE_API bool IsBoundaryVertex(int VertexID) const;
1065
1067 GEOMETRYCORE_API bool IsBoundaryTriangle(int TriangleID) const;
1068
1070 GEOMETRYCORE_API int FindEdge(int VertexA, int VertexB) const;
1071
1073 GEOMETRYCORE_API int FindEdgeFromTri(int VertexA, int VertexB, int TriangleID) const;
1074
1077
1079 GEOMETRYCORE_API int FindTriangle(int A, int B, int C) const;
1080
1085 GEOMETRYCORE_API FIndex2i GetEdgeOpposingV(int EdgeID) const;
1086
1090 GEOMETRYCORE_API void GetVtxNbrhood(int EdgeID, int VertexID, int& OtherVertOut, int& OppVert1Out, int& OppVert2Out, int& Tri1Out,
1091 int& Tri2Out) const;
1092
1097 GEOMETRYCORE_API int GetVtxBoundaryEdges(int VertexID, int& Edge0Out, int& Edge1Out) const;
1098
1106 template<typename ArrayType = FLocalIntArray>
1107 GEOMETRYCORE_API int GetAllVtxBoundaryEdges(int VertexID, ArrayType& EdgeListOut) const;
1108
1112 GEOMETRYCORE_API int GetVtxTriangleCount(int VertexID) const;
1113
1118 template<typename ArrayType = FLocalIntArray>
1120
1121
1125 GEOMETRYCORE_API int GetVtxSingleTriangle(int VertexID) const;
1126
1135 template<typename IntArrayType = FLocalIntArray, typename BoolArrayType = FLocalBoolArray>
1137 BoolArrayType& GroupIsLoop) const;
1138
1140 GEOMETRYCORE_API bool IsGroupBoundaryEdge(int EdgeID) const;
1141
1143 GEOMETRYCORE_API bool IsGroupBoundaryVertex(int VertexID) const;
1144
1146 GEOMETRYCORE_API bool IsGroupJunctionVertex(int VertexID) const;
1147
1149 GEOMETRYCORE_API bool GetVertexGroups(int VertexID, FIndex4i& GroupsOut) const;
1150
1152 template<typename ArrayType = FLocalIntArray>
1153 GEOMETRYCORE_API bool GetAllVertexGroups(int VertexID, ArrayType& GroupsOut) const;
1154
1156 GEOMETRYCORE_API bool IsBowtieVertex(int VertexID) const;
1157
1159 bool IsCompact() const
1160 {
1162 }
1163
1165 bool IsCompactV() const
1166 {
1167 return VertexRefCounts.IsDense();
1168 }
1169
1171 bool IsCompactT() const
1172 {
1173 return TriangleRefCounts.IsDense();
1174 }
1175
1177 double CompactMetric() const
1178 {
1179 return ((double)VertexCount() / (double)MaxVertexID() + (double)TriangleCount() / (double)MaxTriangleID()) * 0.5;
1180 }
1181
1183 GEOMETRYCORE_API bool IsClosed() const;
1184
1185
1186 //
1187 // Geometric queries
1188 //
1189public:
1191 GEOMETRYCORE_API FAxisAlignedBox3d GetBounds(bool bParallel = false) const;
1192
1202 GEOMETRYCORE_API FFrame3d GetVertexFrame(int VertexID, bool bFrameNormalY = false, FVector3d* UseNormal = nullptr) const;
1203
1205 GEOMETRYCORE_API FVector3d GetTriNormal(int TriangleID) const;
1206
1208 GEOMETRYCORE_API double GetTriArea(int TriangleID) const;
1209
1215 GEOMETRYCORE_API void GetTriInfo(int TriangleID, FVector3d& Normal, double& Area, FVector3d& Centroid) const;
1216
1218 GEOMETRYCORE_API FVector3d GetTriCentroid(int TriangleID) const;
1219
1221 GEOMETRYCORE_API FVector3d GetTriBaryPoint(int TriangleID, double Bary0, double Bary1, double Bary2) const;
1222
1224 GEOMETRYCORE_API FVector3d GetTriBaryNormal(int TriangleID, double Bary0, double Bary1, double Bary2) const;
1225
1227 GEOMETRYCORE_API void GetTriBaryPoint(int TriangleID, double Bary0, double Bary1, double Bary2, FVertexInfo& VertInfo) const;
1228
1230 GEOMETRYCORE_API FAxisAlignedBox3d GetTriBounds(int TriangleID) const;
1231
1233 GEOMETRYCORE_API FFrame3d GetTriFrame(int TriangleID, int Edge = 0) const;
1234
1236 GEOMETRYCORE_API double GetTriSolidAngle(int TriangleID, const FVector3d& p) const;
1237
1239 GEOMETRYCORE_API double GetTriInternalAngleR(int TriangleID, int i) const;
1240
1242 GEOMETRYCORE_API FVector3d GetTriInternalAnglesR(int TriangleID) const;
1243
1245 GEOMETRYCORE_API FVector3d GetEdgeNormal(int EdgeID) const;
1246
1248 GEOMETRYCORE_API FVector3d GetEdgePoint(int EdgeID, double ParameterT) const;
1249
1255
1263
1264 //
1265 // direct buffer access
1266 //
1267public:
1269 {
1270 return Vertices;
1271 }
1273 {
1274 return VertexRefCounts;
1275 }
1277 {
1278 return HasVertexNormals() ? &VertexNormals.GetValue() : nullptr;
1279 }
1281 {
1282 return HasVertexColors() ? &VertexColors.GetValue() : nullptr;
1283 }
1285 {
1286 return HasVertexUVs() ? &VertexUVs.GetValue() : nullptr;
1287 }
1289 {
1290 return Triangles;
1291 }
1293 {
1294 return TriangleRefCounts;
1295 }
1297 {
1298 return HasTriangleGroups() ? &TriangleGroups.GetValue() : nullptr;
1299 }
1301 {
1302 return Edges;
1303 }
1305 {
1306 return EdgeRefCounts;
1307 }
1309 {
1310 return VertexEdgeLists;
1311 }
1313 {
1314 return TriangleEdges;
1315 }
1316 //
1317 // Mesh Edit operations
1318 //
1319public:
1327
1333
1338
1343 GEOMETRYCORE_API void ReverseOrientation(bool bFlipNormals = true);
1344
1349
1356 GEOMETRYCORE_API EMeshResult RemoveVertex(int VertexID, bool bPreserveManifold = false);
1357
1365 GEOMETRYCORE_API EMeshResult RemoveTriangle(int TriangleID, bool bRemoveIsolatedVertices = true, bool bPreserveManifold = false);
1366
1372 GEOMETRYCORE_API virtual EMeshResult SetTriangle(int TriangleID, const FIndex3i& NewVertices, bool bRemoveIsolatedVertices = true);
1373
1385
1394
1407
1415
1416
1426
1434
1458 GEOMETRYCORE_API virtual EMeshResult CanCollapseEdge(int vKeep, int vRemove, const FCollapseEdgeOptions& Options) const;
1459
1468 GEOMETRYCORE_API virtual EMeshResult CanCollapseEdge(int vKeep, int vRemove, double EdgeParameterT = 0) const;
1469
1481
1490
1510
1511
1530
1536
1538 {
1539 // If false, we disallow vertex merges that attempt to merge one non-boundary vert to a
1540 // a non-adjacent vert, even if this is possible through a bowtie. Note that merging
1541 // boundary verts to create a bowtie on the boundary is still allowed, as this is a
1542 // common intermediate step when welding edges.
1544 };
1545
1560 GEOMETRYCORE_API virtual EMeshResult MergeVertices(int KeepVid, int DiscardVid, double InterpolationT,
1562
1566 virtual EMeshResult MergeVertices(int KeepVid, int DiscardVid, double InterpolationT, FMergeVerticesInfo& MergeInfo)
1567 {
1568 return MergeVertices(KeepVid, DiscardVid, InterpolationT, FMergeVerticesOptions(), MergeInfo);
1569 }
1570
1578
1587
1590 {
1591 return PokeTriangle(TriangleID, FVector3d::One() / 3.0, PokeInfo);
1592 }
1593
1594 //
1595 // Debug utility functions
1596 //
1597public:
1601 GEOMETRYCORE_API virtual FString MeshInfoString() const;
1602
1604
1609 {
1611 bool bCheckEdgeIDs = false;
1612 bool bCheckNormals = false;
1613 bool bCheckColors = false;
1614 bool bCheckUVs = false;
1615 bool bCheckGroups = false;
1616 bool bCheckAttributes = false;
1617
1618 // Ignore gaps and padding in the data layout, i.e. the exact index is irrelevant as long as valid entries are equal in value and in the same order.
1619 bool bIgnoreDataLayout = false;
1620
1621 // comparisons check for smaller or equal than this value. used on on 32-bit floating point checks
1623
1624 // comparisons check for smaller or equal than this value. used for 64-bit comparisons, such as on points.
1625 double EpsilonDouble { static_cast<double>(TMathUtil<float>::Epsilon) };
1626 };
1627
1629 {
1630 // Reasons for difference between meshes
1631 enum class EReason
1632 {
1633 Unknown,
1636 EdgeCount,
1637 Vertex,
1638 Triangle,
1639 Edge,
1641 Normal,
1642 Color,
1643 UV,
1644 Group,
1645 Attribute
1646 };
1648
1649 // May contain further detail on the difference
1650 FString Detail;
1651
1652 // Types of element ID that could be set below
1653 enum class EIDType
1654 {
1655 None,
1656 Vertex,
1657 Triangle,
1658 Edge
1659 };
1660
1661 // ID in this mesh of element where the difference was found, or InvalidID if not applicable
1663 // ID in the compared-against mesh where the difference was found, or InvalidID if not applicable
1665 // Type of element that the ID references
1667
1668 // Helpers to set different ID types
1670 {
1671 ID = VID;
1672 OtherID = OtherVID;
1674 }
1676 {
1677 ID = TID;
1678 OtherID = OtherTID;
1680 }
1682 {
1683 ID = EID;
1684 OtherID = OtherEID;
1686 }
1687 };
1688
1693 GEOMETRYCORE_API virtual bool IsSameAs(const FDynamicMesh3& OtherMesh, const FSameAsOptions& Options) const;
1699 GEOMETRYCORE_API virtual bool IsSameAs(const FDynamicMesh3& OtherMesh, const FSameAsOptions& Options, FMeshDifferenceInfo& OutMeshDifferenceInfo) const;
1700private:
1701 GEOMETRYCORE_API bool IsSameAs_Helper(const FDynamicMesh3& OtherMesh, const FSameAsOptions& Options, FMeshDifferenceInfo* OutMeshDifferenceInfo = nullptr) const;
1702public:
1703
1731
1735 GEOMETRYCORE_API virtual bool CheckValidity(FValidityOptions ValidityOptions = FValidityOptions(),
1737
1738 //
1739 // Internal functions
1740 //
1741protected:
1742 inline void SetTriangleInternal(int TriangleID, int v0, int v1, int v2)
1743 {
1744 Triangles[TriangleID] = FIndex3i(v0, v1, v2);
1745 }
1746 inline void SetTriangleEdgesInternal(int TriangleID, int e0, int e1, int e2)
1747 {
1748 TriangleEdges[TriangleID] = FIndex3i(e0, e1, e2);
1749 }
1750
1751 inline int AddEdgeInternal(int vA, int vB, int tA, int tB = InvalidID)
1752 {
1753 if (vB < vA) {
1754 int t = vB; vB = vA; vA = t;
1755 }
1756 int eid = EdgeRefCounts.Allocate();
1757 Edges.InsertAt(FEdge{ {vA, vB},{tA, tB} }, eid);
1760 return eid;
1761
1762 }
1763 GEOMETRYCORE_API int AddTriangleInternal(int a, int b, int c, int e0, int e1, int e2);
1764
1765 inline int ReplaceTriangleVertex(int TriangleID, int vOld, int vNew)
1766 {
1767 FIndex3i& Triangle = Triangles[TriangleID];
1768 for (int i : {0, 1, 2})
1769 {
1770 if (Triangle[i] == vOld)
1771 {
1772 Triangle[i] = vNew;
1773 return 0;
1774 }
1775 }
1776 return -1;
1777 }
1778
1779 inline void AllocateEdgesList(int VertexID)
1780 {
1781 if (VertexID < (int)VertexEdgeLists.Size())
1782 {
1783 VertexEdgeLists.Clear(VertexID);
1784 }
1785 VertexEdgeLists.AllocateAt(VertexID);
1786 }
1787
1788 template<typename ArrayType = FLocalIntArray>
1789 void GetVertexEdgesList(int VertexID, ArrayType& EdgesOut) const
1790 {
1791 for (int eid : VertexEdgeLists.Values(VertexID))
1792 {
1793 EdgesOut.Add(eid);
1794 }
1795 }
1796
1797 inline void SetEdgeVerticesInternal(int EdgeID, int a, int b)
1798 {
1799 if (a > b)
1800 {
1801 Swap(a,b);
1802 }
1803 Edges[EdgeID].Vert[0] = a;
1804 Edges[EdgeID].Vert[1] = b;
1805 }
1806
1807 inline void SetEdgeTrianglesInternal(int EdgeID, int t0, int t1)
1808 {
1809 Edges[EdgeID].Tri[0] = t0;
1810 Edges[EdgeID].Tri[1] = t1;
1811 }
1812
1813 GEOMETRYCORE_API int ReplaceEdgeVertex(int EdgeID, int vOld, int vNew);
1814 GEOMETRYCORE_API int ReplaceEdgeTriangle(int EdgeID, int tOld, int tNew);
1815 GEOMETRYCORE_API int ReplaceTriangleEdge(int EdgeID, int eOld, int eNew);
1816
1817 inline bool TriangleHasVertex(int TriangleID, int VertexID) const
1818 {
1819 return Triangles[TriangleID][0] == VertexID || Triangles[TriangleID][1] == VertexID ||
1820 Triangles[TriangleID][2] == VertexID;
1821 }
1822
1829
1830 inline bool TriHasSequentialVertices(int TriangleID, int vA, int vB) const
1831 {
1832 const FIndex3i& Tri = Triangles[TriangleID];
1833 return ((Tri.A == vA && Tri.B == vB) || (Tri.B == vA && Tri.C == vB) || (Tri.C == vA && Tri.A == vB));
1834 }
1835
1836 GEOMETRYCORE_API int FindTriangleEdge(int TriangleID, int vA, int vB) const;
1837
1838 GEOMETRYCORE_API int32 FindEdgeInternal(int32 vA, int32 vB, bool& bIsBoundary) const;
1839
1840 inline bool EdgeHasVertex(int EdgeID, int VertexID) const
1841 {
1842 const FIndex2i Verts = Edges[EdgeID].Vert;
1843 return (Verts[0] == VertexID) || (Verts[1] == VertexID);
1844 }
1845 inline bool EdgeHasTriangle(int EdgeID, int TriangleID) const
1846 {
1847 const FIndex2i Tris = Edges[EdgeID].Tri;
1848 return (Tris[0] == TriangleID) || (Tris[1] == TriangleID);
1849 }
1850
1851 inline int GetOtherEdgeVertex(int EdgeID, int VertexID) const
1852 {
1853 const FIndex2i Verts = Edges[EdgeID].Vert;
1854 return (Verts[0] == VertexID) ? Verts[1] : ((Verts[1] == VertexID) ? Verts[0] : InvalidID);
1855 }
1856 inline int GetOtherEdgeTriangle(int EdgeID, int TriangleID) const
1857 {
1858 const FIndex2i Tris = Edges[EdgeID].Tri;
1859 return (Tris[0] == TriangleID) ? Tris[1] : ((Tris[1] == TriangleID) ? Tris[0] : InvalidID);
1860 }
1861
1862 inline void AddTriangleEdge(int TriangleID, int v0, int v1, int j, int EdgeID)
1863 {
1865 if (EdgeID != InvalidID)
1866 {
1867 Edges[EdgeID].Tri[1] = TriangleID;
1868 TriEdges[j] = EdgeID;
1869 }
1870 else
1871 {
1872 TriEdges[j] = AddEdgeInternal(v0, v1, TriangleID);
1873 }
1874 }
1875
1876 // utility function that returns one or two triangles of edge, used to enumerate vertex one-ring triangles
1877 // The logic is a bit tricky to follow without drawing it out on paper, but this will only return
1878 // each triangle once, for the 'outgoing' edge from the vertex, and each triangle only has one such edge
1879 // at any vertex (including boundary triangles)
1880 inline FIndex2i GetOrderedOneRingEdgeTris(int VertexID, int EdgeID) const
1881 {
1882 const FIndex2i Tris = Edges[EdgeID].Tri;
1883
1884 int vOther = GetOtherEdgeVertex(EdgeID, VertexID);
1885 int et1 = Tris[1];
1886 et1 = (et1 != InvalidID && TriHasSequentialVertices(et1, VertexID, vOther)) ? et1 : InvalidID;
1887 int et0 = Tris[0];
1889 }
1890
1891
1893
1899 template<int Variant>
1900 void SerializeInternal(FArchive& Ar, void* Ptr);
1901
1902 /* We keep this version of CanCollapseEdge internal because the CollapseInfo struct may only be partially filled out by the function */
1904private:
1907
1910};
1911
1912
1913
1914
1915namespace Debug
1916{
1917 /*
1918 * Store a copy of Mesh in a global Debug Meshes TMap<DebugMeshName, Mesh>.
1919 * The mesh will exist until the Engine exits, unless FetchDebugMesh or ClearAllDebugMeshes removes it
1920 */
1922
1928
1933}
1934
1935
1936
1937} // end namespace UE::Geometry
1938} // end namespace UE
1939
1940template<> struct TCanBulkSerialize<UE::Geometry::FDynamicMesh3::FEdge> { enum { Value = true }; };
@ Normal
Definition AndroidInputInterface.h:116
#define checkSlow(expr)
Definition AssertionMacros.h:332
#define ensureMsgf( InExpression, InFormat,...)
Definition AssertionMacros.h:465
#define UE_NONCOPYABLE(TypeName)
Definition CoreMiscDefines.h:457
#define UE_DEPRECATED(Version, Message)
Definition CoreMiscDefines.h:302
#define TEXT(x)
Definition Platform.h:1272
FPlatformTypes::SIZE_T SIZE_T
An unsigned integer the same size as a pointer, the same as UPTRINT.
Definition Platform.h:1150
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
FPlatformTypes::uint64 uint64
A 64-bit unsigned integer.
Definition Platform.h:1117
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
const bool
Definition NetworkReplayStreaming.h:178
uint8_t uint8
Definition binka_ue_file_header.h:8
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition Archive.h:1208
virtual void Serialize(void *V, int64 Length)
Definition Archive.h:1689
Definition UnrealType.h:3087
Definition ArrayView.h:139
Definition Array.h:670
Definition AssetRegistryState.h:50
Definition MathUtil.h:150
Definition UniquePtr.h:107
Definition Mutex.h:18
UE_API void Lock()
Definition RecursiveMutex.cpp:40
UE_API void Unlock()
Definition RecursiveMutex.cpp:115
Definition CompactMaps.h:20
Definition DynamicMesh3.h:108
GEOMETRYCORE_API FVector3d GetTriBaryPoint(int TriangleID, double Bary0, double Bary1, double Bary2) const
Definition DynamicMesh3_Queries.cpp:777
TUniquePtr< FDynamicMeshAttributeSet > AttributeSet
Definition DynamicMesh3.h:199
bool HasVertexUVs() const
Definition DynamicMesh3.h:426
GEOMETRYCORE_API FFrame3d GetTriFrame(int TriangleID, int Edge=0) const
Definition DynamicMesh3_Queries.cpp:845
FRefCountVector VertexRefCounts
Definition DynamicMesh3.h:172
const FRefCountVector & GetEdgesRefCounts() const
Definition DynamicMesh3.h:1304
GEOMETRYCORE_API EMeshResult InsertVertex(int VertexID, const FVertexInfo &VertInfo, bool bUnsafe=false)
Definition DynamicMesh3_Edits.cpp:102
void SetVertexNormal(int vID, const FVector3f &vNewNormal)
Definition DynamicMesh3.h:955
virtual void BeginUnsafeTrianglesInsert()
Definition DynamicMesh3.h:713
int EdgeCount() const
Definition DynamicMesh3.h:388
DynamicMeshInfo::FEdgeCollapseInfo FEdgeCollapseInfo
Definition DynamicMesh3.h:118
GEOMETRYCORE_API void DiscardVertexNormals()
Definition DynamicMesh3.cpp:605
GEOMETRYCORE_API void EnumerateEdgeTriangles(int32 EdgeID, TFunctionRef< void(int32)> ApplyFunc) const
Definition DynamicMesh3.cpp:803
TOptional< TDynamicVector< FVector2f > > VertexUVs
Definition DynamicMesh3.h:178
FRefCountVector::IndexEnumerable edge_iterator
Definition DynamicMesh3.h:556
int MaxTriangleID() const
Definition DynamicMesh3.h:399
int AddEdgeInternal(int vA, int vB, int tA, int tB=InvalidID)
Definition DynamicMesh3.h:1751
uint64 GetChangeStamp() const
Definition DynamicMesh3.h:542
const FRefCountVector & GetTrianglesRefCounts() const
Definition DynamicMesh3.h:1292
int TriangleCount() const
Definition DynamicMesh3.h:383
const FVector3d & GetVertexRef(int VertexID) const
Definition DynamicMesh3.h:743
GEOMETRYCORE_API FIndex2i GetOrientedBoundaryEdgeV(int EdgeID) const
Definition DynamicMesh3_Queries.cpp:325
int AppendVertex(const FVector3d &Position)
Definition DynamicMesh3.h:668
void EnumerateTriEdgeIDsFromEdgeID(const int32 EdgeID, const TFunctionRef< void(FMeshTriEdgeID TriEdgeID)> &TriEdgeFunc) const
Definition DynamicMesh3.h:907
int GetTriEdge(int TriangleID, int j) const
Definition DynamicMesh3.h:812
value_iteration< FIndex3i > TrianglesItr() const
Definition DynamicMesh3.h:594
GEOMETRYCORE_API void EnableMeshComponents(int MeshComponentsFlags)
Definition DynamicMesh3.cpp:552
GEOMETRYCORE_API EMeshResult RemoveVertex(int VertexID, bool bPreserveManifold=false)
Definition DynamicMesh3_Edits.cpp:614
const FDynamicMeshAttributeSet * Attributes() const
Definition DynamicMesh3.h:1043
virtual EMeshResult CollapseEdge(int KeepVertID, int RemoveVertID, const FCollapseEdgeOptions &Options, FEdgeCollapseInfo &CollapseInfo)
Definition DynamicMesh3.h:1486
virtual GEOMETRYCORE_API EMeshResult MergeEdges(int KeepEdgeID, int DiscardEdgeID, double InterpolationT, FMergeEdgesInfo &MergeInfo, bool bCheckValidOrientation=true)
Definition DynamicMesh3_Edits.cpp:1799
GEOMETRYCORE_API void EnableVertexNormals(const FVector3f &InitialNormal)
Definition DynamicMesh3.cpp:588
virtual GEOMETRYCORE_API EMeshResult CanCollapseEdgeInternal(int vKeep, int vRemove, double collapse_t, FEdgeCollapseInfo *OutCollapseInfo) const
Definition DynamicMesh3_Edits.cpp:1300
FRefCountVector::IndexEnumerable triangle_iterator
Definition DynamicMesh3.h:555
GEOMETRYCORE_API int GetVtxSingleTriangle(int VertexID) const
Definition DynamicMesh3_Queries.cpp:119
GEOMETRYCORE_API int AddTriangleInternal(int a, int b, int c, int e0, int e1, int e2)
Definition DynamicMesh3.cpp:1438
GEOMETRYCORE_API bool GetVertexGroups(int VertexID, FIndex4i &GroupsOut) const
Definition DynamicMesh3_Queries.cpp:433
GEOMETRYCORE_API void GetTriInfo(int TriangleID, FVector3d &Normal, double &Area, FVector3d &Centroid) const
Definition DynamicMesh3_Queries.cpp:768
void SetVertex(int VertexID, const FVector3d &vNewPos, bool bTrackChange=true)
Definition DynamicMesh3.h:753
int MaxEdgeID() const
Definition DynamicMesh3.h:404
int MaxVertexID() const
Definition DynamicMesh3.h:394
edge_iterator EdgeIndicesItr() const
Definition DynamicMesh3.h:574
bool EdgeHasVertex(int EdgeID, int VertexID) const
Definition DynamicMesh3.h:1840
const TDynamicVector< FVector3f > * GetNormalsBuffer() const
Definition DynamicMesh3.h:1276
bool HasVertexColors() const
Definition DynamicMesh3.h:421
virtual GEOMETRYCORE_API EMeshResult SetTriangle(int TriangleID, const FIndex3i &NewVertices, bool bRemoveIsolatedVertices=true)
Definition DynamicMesh3_Edits.cpp:759
FIndex2i GetEdgeT(int EdgeID) const
Definition DynamicMesh3.h:882
FRefCountVector::IndexEnumerable vertex_iterator
Definition DynamicMesh3.h:554
GEOMETRYCORE_API FIndex2i GetEdgeOpposingV(int EdgeID) const
Definition DynamicMesh3_Queries.cpp:8
GEOMETRYCORE_API int FindTriangleEdge(int TriangleID, int vA, int vB) const
returns edge ID
Definition DynamicMesh3.cpp:1514
bool TriHasNeighbourTri(int CheckTriID, int NbrTriID) const
Definition DynamicMesh3.h:1823
GEOMETRYCORE_API int ReplaceTriangleEdge(int EdgeID, int eOld, int eNew)
Definition DynamicMesh3.cpp:1497
bool HasAttributes() const
Definition DynamicMesh3.h:436
FSmallListSet::ValueEnumerable VtxEdgesItr(int VertexID) const
Definition DynamicMesh3.h:627
int GetOtherEdgeVertex(int EdgeID, int VertexID) const
Definition DynamicMesh3.h:1851
GEOMETRYCORE_API int FindTriangle(int A, int B, int C) const
Definition DynamicMesh3_Queries.cpp:573
static constexpr int NonManifoldID
Definition DynamicMesh3.h:160
const FEdge & GetEdgeRef(int EdgeID) const
Definition DynamicMesh3.h:855
virtual GEOMETRYCORE_API bool CheckValidity(FValidityOptions ValidityOptions=FValidityOptions(), EValidityCheckFailMode FailMode=EValidityCheckFailMode::Check) const
Definition DynamicMesh3.cpp:1227
GEOMETRYCORE_API bool IsGroupBoundaryEdge(int EdgeID) const
Definition DynamicMesh3_Queries.cpp:344
GEOMETRYCORE_API int AppendVertex(const FVertexInfo &VertInfo)
Definition DynamicMesh3_Edits.cpp:9
GEOMETRYCORE_API double CalculateWindingNumber(const FVector3d &QueryPoint) const
Definition DynamicMesh3_Queries.cpp:911
GEOMETRYCORE_API FIndex3i GetTriNeighbourTris(int TriangleID) const
Definition DynamicMesh3.cpp:750
bool TriangleHasVertex(int TriangleID, int VertexID) const
Definition DynamicMesh3.h:1817
GEOMETRYCORE_API FDynamicMesh3()
Definition DynamicMesh3.cpp:19
virtual EMeshResult MergeVertices(int KeepVid, int DiscardVid, FMergeVerticesInfo &MergeInfo)
Definition DynamicMesh3.h:1574
bool HasTopologyChangeStampEnabled() const
Definition DynamicMesh3.h:503
static constexpr FIndex2i InvalidEdge
Definition DynamicMesh3.h:166
GEOMETRYCORE_API int AppendTriangle(const FIndex3i &TriVertices, int GroupID=0)
Definition DynamicMesh3_Edits.cpp:150
GEOMETRYCORE_API int ReplaceEdgeVertex(int EdgeID, int vOld, int vNew)
Definition DynamicMesh3.cpp:1447
GEOMETRYCORE_API void CompactInPlace(FCompactMaps *CompactInfo=nullptr)
Definition DynamicMesh3_Edits.cpp:331
GEOMETRYCORE_API void EnableTriangleGroups(int InitialGroupID=0)
Definition DynamicMesh3.cpp:650
virtual void BeginUnsafeVerticesInsert()
Definition DynamicMesh3.h:694
GEOMETRYCORE_API void EnableAttributes()
Definition DynamicMesh3.cpp:673
bool IsReferencedVertex(int VertexID) const
Definition DynamicMesh3.h:451
GEOMETRYCORE_API FVector3d GetEdgePoint(int EdgeID, double ParameterT) const
Definition DynamicMesh3_Queries.cpp:687
FSmallListSet VertexEdgeLists
Definition DynamicMesh3.h:180
FVector3d GetVertex(int VertexID) const
Definition DynamicMesh3.h:736
FIndex3i GetTriangle(int TriangleID) const
Definition DynamicMesh3.h:784
DynamicMeshInfo::FEdgeFlipInfo FEdgeFlipInfo
Definition DynamicMesh3.h:116
GEOMETRYCORE_API int32 FindEdgeInternal(int32 vA, int32 vB, bool &bIsBoundary) const
Definition DynamicMesh3.cpp:1524
GEOMETRYCORE_API void DiscardAttributes()
Definition DynamicMesh3.cpp:683
void SetEdgeVerticesInternal(int EdgeID, int a, int b)
Definition DynamicMesh3.h:1797
virtual void EndUnsafeTrianglesInsert()
Definition DynamicMesh3.h:719
FRefCountVector::FilteredEnumerable BoundaryEdgeIndicesItr() const
Definition DynamicMesh3.h:582
GEOMETRYCORE_API int32 RemoveUnusedVertices()
Definition DynamicMesh3_Edits.cpp:289
GEOMETRYCORE_API int GetMaxVtxEdgeCount() const
Definition DynamicMesh3.cpp:717
bool HasShapeChangeStampEnabled() const
Definition DynamicMesh3.h:497
GEOMETRYCORE_API EMeshResult GetVtxContiguousTriangles(int VertexID, IntArrayType &TrianglesOut, IntArrayType &ContiguousGroupLengths, BoolArrayType &GroupIsLoop) const
virtual EMeshResult CollapseEdge(int KeepVertID, int RemoveVertID, FEdgeCollapseInfo &CollapseInfo)
Definition DynamicMesh3.h:1506
triangle_iterator TriangleIndicesItr() const
Definition DynamicMesh3.h:568
bool IsEdge(int EdgeID) const
Definition DynamicMesh3.h:462
virtual GEOMETRYCORE_API FString MeshInfoString() const
Definition DynamicMesh3.cpp:818
const FIndex3i & GetTriEdgesRef(int TriangleID) const
Definition DynamicMesh3.h:805
int MaxGroupID() const
Definition DynamicMesh3.h:409
const TDynamicVector< int > * GetTriangleGroupsBuffer() const
Definition DynamicMesh3.h:1296
void SetTriangleInternal(int TriangleID, int v0, int v1, int v2)
Definition DynamicMesh3.h:1742
const TDynamicVector< FVector3d > & GetVerticesBuffer() const
Definition DynamicMesh3.h:1268
virtual GEOMETRYCORE_API EMeshResult MergeVertices(int KeepVid, int DiscardVid, double InterpolationT, const FMergeVerticesOptions &Options, FMergeVerticesInfo &MergeInfo)
Definition DynamicMesh3_Edits.cpp:2121
FRefCountVector TriangleRefCounts
Definition DynamicMesh3.h:185
GEOMETRYCORE_API void AppendWithOffsets(const FDynamicMesh3 &ToAppend, FAppendInfo *OutAppendInfo=nullptr)
Definition DynamicMesh3.cpp:248
TOptional< TDynamicVector< int > > TriangleGroups
Definition DynamicMesh3.h:189
GEOMETRYCORE_API static const FVector3d InvalidVertex
Definition DynamicMesh3.h:164
GEOMETRYCORE_API FVector3d GetTriCentroid(int TriangleID) const
Definition DynamicMesh3_Queries.cpp:800
FIndex2i GetEdgeV(int EdgeID) const
Definition DynamicMesh3.h:862
GEOMETRYCORE_API bool IsBoundaryVertex(int VertexID) const
Definition DynamicMesh3_Queries.cpp:295
std::atomic< uint32 > ShapeChangeStamp
Definition DynamicMesh3.h:206
void SerializeInternal(FArchive &Ar, void *Ptr)
bool IsBoundaryEdge(int EdgeID) const
Definition DynamicMesh3.h:1057
FIndex2i GetOrderedOneRingEdgeTris(int VertexID, int EdgeID) const
Definition DynamicMesh3.h:1880
void SetVertexColor(int vID, const FVector3f &vNewColor)
Definition DynamicMesh3.h:981
TDynamicVector< FVector3d > Vertices
Definition DynamicMesh3.h:170
virtual GEOMETRYCORE_API bool SplitVertexWouldLeaveIsolated(int VertexID, const TArrayView< const int > &TrianglesToUpdate)
Definition DynamicMesh3_Edits.cpp:1287
GEOMETRYCORE_API FVector3d GetTriInternalAnglesR(int TriangleID) const
Definition DynamicMesh3_Queries.cpp:895
int GetOtherEdgeTriangle(int EdgeID, int TriangleID) const
Definition DynamicMesh3.h:1856
FSmallListSet::MappedValueEnumerable VtxVerticesItr(int VertexID) const
Definition DynamicMesh3.h:608
uint32 GetShapeChangeStamp() const
Definition DynamicMesh3.h:525
static constexpr int DuplicateTriangleID
Definition DynamicMesh3.h:162
bool bEnableShapeChangeStamp
Definition DynamicMesh3.h:203
GEOMETRYCORE_API int GetComponentsFlags() const
Definition DynamicMesh3.cpp:530
DynamicMeshInfo::FVertexSplitInfo FVertexSplitInfo
Definition DynamicMesh3.h:122
GEOMETRYCORE_API void EnableMatchingAttributes(const FDynamicMesh3 &ToMatch, bool bClearExisting=true, bool bDiscardExtraAttributes=false)
Definition DynamicMesh3.cpp:471
void AddTriangleEdge(int TriangleID, int v0, int v1, int j, int EdgeID)
Definition DynamicMesh3.h:1862
const TDynamicVector< FIndex3i > & GetTriangleEdges() const
Definition DynamicMesh3.h:1312
virtual EMeshResult MergeVertices(int KeepVid, int DiscardVid, double InterpolationT, FMergeVerticesInfo &MergeInfo)
Definition DynamicMesh3.h:1566
FEdge GetEdge(int EdgeID) const
Definition DynamicMesh3.h:848
virtual GEOMETRYCORE_API EMeshResult SplitEdge(int EdgeAB, FEdgeSplitInfo &SplitInfo, double SplitParameterT=0.5)
Definition DynamicMesh3_Edits.cpp:888
int GroupIDCounter
Definition DynamicMesh3.h:191
GEOMETRYCORE_API bool IsClosed() const
Definition DynamicMesh3_Queries.cpp:651
GEOMETRYCORE_API SIZE_T GetByteCount() const
Definition DynamicMesh3.cpp:834
FRefCountVector EdgeRefCounts
Definition DynamicMesh3.h:196
const TDynamicVector< FIndex3i > & GetTrianglesBuffer() const
Definition DynamicMesh3.h:1288
GEOMETRYCORE_API int GetVtxBoundaryEdges(int VertexID, int &Edge0Out, int &Edge1Out) const
Definition DynamicMesh3_Queries.cpp:28
GEOMETRYCORE_API int FindEdgeFromTriPair(int TriangleA, int TriangleB) const
Definition DynamicMesh3.cpp:1599
GEOMETRYCORE_API void EnableVertexColors(const FVector3f &InitialColor)
Definition DynamicMesh3.cpp:610
FDynamicMeshAttributeSet * Attributes()
Definition DynamicMesh3.h:1039
GEOMETRYCORE_API bool HasUnusedVertices() const
Definition DynamicMesh3_Edits.cpp:316
void SetEdgeTrianglesInternal(int EdgeID, int t0, int t1)
Definition DynamicMesh3.h:1807
bool IsTriangle(int TriangleID) const
Definition DynamicMesh3.h:457
GEOMETRYCORE_API void EnumerateVertexTriangles(int32 VertexID, TFunctionRef< void(int32)> ApplyFunc) const
Definition DynamicMesh3.cpp:769
GEOMETRYCORE_API int FindEdgeFromTri(int VertexA, int VertexB, int TriangleID) const
Definition DynamicMesh3.cpp:1580
GEOMETRYCORE_API FAxisAlignedBox3d GetBounds(bool bParallel=false) const
Definition DynamicMesh3_Queries.cpp:605
bool HasTriangleGroups() const
Definition DynamicMesh3.h:431
bool IsVertex(int VertexID) const
Definition DynamicMesh3.h:446
bool IsCompact() const
Definition DynamicMesh3.h:1159
friend class FDynamicMeshBulkEdit
Definition DynamicMesh3.h:1909
GEOMETRYCORE_API int GetAllVtxBoundaryEdges(int VertexID, ArrayType &EdgeListOut) const
vertex_iterator VertexIndicesItr() const
Definition DynamicMesh3.h:562
virtual GEOMETRYCORE_API EMeshResult FlipEdge(int EdgeAB, FEdgeFlipInfo &FlipInfo)
Definition DynamicMesh3_Edits.cpp:1110
void GetTriVertices(int TriangleID, VecType &v0, VecType &v1, VecType &v2) const
Definition DynamicMesh3.h:833
double CompactMetric() const
Definition DynamicMesh3.h:1177
GEOMETRYCORE_API EMeshResult RemoveTriangle(int TriangleID, bool bRemoveIsolatedVertices=true, bool bPreserveManifold=false)
Definition DynamicMesh3_Edits.cpp:679
TPairExpandEnumerable< FSmallListSet::ValueIterator > vtx_triangles_enumerable
Definition DynamicMesh3.h:559
const FRefCountVector & GetVerticesRefCounts() const
Definition DynamicMesh3.h:1272
GEOMETRYCORE_API int ReplaceEdgeTriangle(int EdgeID, int tOld, int tNew)
Definition DynamicMesh3.cpp:1470
GEOMETRYCORE_API bool IsBowtieVertex(int VertexID) const
Definition DynamicMesh3_Queries.cpp:501
int ReplaceTriangleVertex(int TriangleID, int vOld, int vNew)
Definition DynamicMesh3.h:1765
GEOMETRYCORE_API bool IsGroupBoundaryVertex(int VertexID) const
Definition DynamicMesh3_Queries.cpp:360
bool TriHasSequentialVertices(int TriangleID, int vA, int vB) const
Definition DynamicMesh3.h:1830
TDynamicVector< FIndex3i > TriangleEdges
Definition DynamicMesh3.h:187
GEOMETRYCORE_API double GetTriInternalAngleR(int TriangleID, int i) const
Definition DynamicMesh3_Queries.cpp:877
GEOMETRYCORE_API bool IsGroupJunctionVertex(int VertexID) const
Definition DynamicMesh3_Queries.cpp:396
GEOMETRYCORE_API FAxisAlignedBox3d GetTriBounds(int TriangleID) const
Definition DynamicMesh3_Queries.cpp:836
GEOMETRYCORE_API void CompactCopy(const FDynamicMesh3 &CopyMesh, bool bNormals=true, bool bColors=true, bool bUVs=true, bool bAttributes=true, FCompactMaps *CompactInfo=nullptr)
Definition DynamicMesh3.cpp:360
virtual GEOMETRYCORE_API EMeshResult SplitVertex(int VertexID, const TArrayView< const int > &TrianglesToUpdate, FVertexSplitInfo &SplitInfo)
Definition DynamicMesh3_Edits.cpp:1227
GEOMETRYCORE_API FVector3d GetEdgeNormal(int EdgeID) const
Definition DynamicMesh3_Queries.cpp:670
const TDynamicVector< FVector3f > * GetColorsBuffer() const
Definition DynamicMesh3.h:1280
GEOMETRYCORE_API EMeshResult InsertTriangle(int TriangleID, const FIndex3i &TriVertices, int GroupID=0, bool bUnsafe=false)
Definition DynamicMesh3_Edits.cpp:221
const FIndex3i & GetTriangleRef(int TriangleID) const
Definition DynamicMesh3.h:791
const FSmallListSet & GetVertexEdges() const
Definition DynamicMesh3.h:1308
GEOMETRYCORE_API int32 GetSingleVertexTriangle(int32 VID) const
Definition DynamicMesh3.cpp:792
int AppendTriangle(int Vertex0, int Vertex1, int Vertex2, int GroupID=0)
Definition DynamicMesh3.h:680
virtual GEOMETRYCORE_API EMeshResult CanCollapseEdge(int vKeep, int vRemove, const FCollapseEdgeOptions &Options) const
Definition DynamicMesh3_Edits.cpp:1471
int GetVtxEdgeCount(int VertexID) const
Definition DynamicMesh3.h:775
GEOMETRYCORE_API void DiscardVertexColors()
Definition DynamicMesh3.cpp:625
GEOMETRYCORE_API FVertexInfo GetVertexInfo(int VertexID) const
Definition DynamicMesh3.cpp:727
GEOMETRYCORE_API void GetVtxNbrhood(int EdgeID, int VertexID, int &OtherVertOut, int &OppVert1Out, int &OppVert2Out, int &Tri1Out, int &Tri2Out) const
Definition DynamicMesh3_Queries.cpp:76
bool EdgeHasTriangle(int EdgeID, int TriangleID) const
Definition DynamicMesh3.h:1845
int GetTriangleGroup(int tID) const
Definition DynamicMesh3.h:1023
GEOMETRYCORE_API bool GetAllVertexGroups(int VertexID, ArrayType &GroupsOut) const
GEOMETRYCORE_API int FindEdge(int VertexA, int VertexB) const
Definition DynamicMesh3.cpp:1546
bool IsCompactV() const
Definition DynamicMesh3.h:1165
virtual GEOMETRYCORE_API bool IsSameAs(const FDynamicMesh3 &OtherMesh, const FSameAsOptions &Options) const
Definition DynamicMesh3.cpp:844
void GetVertexEdgesList(int VertexID, ArrayType &EdgesOut) const
Definition DynamicMesh3.h:1789
static constexpr int InvalidID
Definition DynamicMesh3.h:158
virtual GEOMETRYCORE_API EMeshResult CollapseEdge(int KeepVertID, int RemoveVertID, double EdgeParameterT, const FCollapseEdgeOptions &Options, FEdgeCollapseInfo &CollapseInfo)
Definition DynamicMesh3_Edits.cpp:1481
vtx_triangles_enumerable VtxTrianglesItr(int VertexID) const
Definition DynamicMesh3.h:642
void SetTriangleGroup(int tid, int group_id)
Definition DynamicMesh3.h:1029
GEOMETRYCORE_API const FDynamicMesh3 & operator=(const FDynamicMesh3 &CopyMesh)
Definition DynamicMesh3.cpp:97
GEOMETRYCORE_API int GetVtxTriangleCount(int VertexID) const
Definition DynamicMesh3_Queries.cpp:94
GEOMETRYCORE_API void DiscardVertexUVs()
Definition DynamicMesh3.cpp:645
void EnumerateVertexVertices(int32 VertexID, TFunctionRef< void(int32)> VertexFunc) const
Definition DynamicMesh3.h:616
bool GetEdgeV(int EdgeID, FVector3d &a, FVector3d &b) const
Definition DynamicMesh3.h:869
std::atomic< uint32 > TopologyChangeStamp
Definition DynamicMesh3.h:208
GEOMETRYCORE_API void GetVtxOneRingCentroid(int VertexID, FVector3d &CentroidOut) const
Definition DynamicMesh3_Queries.cpp:703
virtual GEOMETRYCORE_API EMeshResult PokeTriangle(int TriangleID, const FVector3d &BaryCoordinates, FPokeTriangleInfo &PokeInfo)
Definition DynamicMesh3_Edits.cpp:2242
GEOMETRYCORE_API EMeshResult ReverseTriOrientation(int TriangleID)
Definition DynamicMesh3_Edits.cpp:574
static constexpr FIndex3i InvalidTriangle
Definition DynamicMesh3.h:165
bool HasVertexNormals() const
Definition DynamicMesh3.h:416
GEOMETRYCORE_API FVector3d GetTriBaryNormal(int TriangleID, double Bary0, double Bary1, double Bary2) const
Definition DynamicMesh3_Queries.cpp:786
TOptional< TDynamicVector< FVector3f > > VertexNormals
Definition DynamicMesh3.h:174
GEOMETRYCORE_API void EnableVertexUVs(const FVector2f &InitialUV)
Definition DynamicMesh3.cpp:630
void UpdateChangeStamps(bool bShapeChange, bool bTopologyChange)
Definition DynamicMesh3.h:509
GEOMETRYCORE_API FVector3d GetTriNormal(int TriangleID) const
Definition DynamicMesh3_Queries.cpp:752
value_iteration< FEdge > EdgesItr() const
Definition DynamicMesh3.h:600
GEOMETRYCORE_API double GetTriArea(int TriangleID) const
Definition DynamicMesh3_Queries.cpp:759
friend FArchive & operator<<(FArchive &Ar, FDynamicMesh3 &Mesh)
Definition DynamicMesh3.h:367
TOptional< TDynamicVector< FVector3f > > VertexColors
Definition DynamicMesh3.h:176
FVector3f GetVertexColor(int vID) const
Definition DynamicMesh3.h:969
GEOMETRYCORE_API FFrame3d GetVertexFrame(int VertexID, bool bFrameNormalY=false, FVector3d *UseNormal=nullptr) const
Definition DynamicMesh3_Queries.cpp:723
int AllocateTriangleGroup()
Definition DynamicMesh3.h:1018
value_iteration< FVector3d > VerticesItr() const
Definition DynamicMesh3.h:588
int VertexCount() const
Definition DynamicMesh3.h:378
TDynamicVector< FEdge > Edges
Definition DynamicMesh3.h:194
void SetShapeChangeStampEnabled(bool bEnabled)
Definition DynamicMesh3.h:485
GEOMETRYCORE_API double GetTriSolidAngle(int TriangleID, const FVector3d &p) const
Definition DynamicMesh3_Queries.cpp:863
GEOMETRYCORE_API void Clear()
Definition DynamicMesh3.cpp:446
GEOMETRYCORE_API void ReverseTriOrientationInternal(int TriangleID)
Definition DynamicMesh3_Edits.cpp:585
void AllocateEdgesList(int VertexID)
Definition DynamicMesh3.h:1779
void SetTriangleEdgesInternal(int TriangleID, int e0, int e1, int e2)
Definition DynamicMesh3.h:1746
void SetTopologyChangeStampEnabled(bool bEnabled)
Definition DynamicMesh3.h:491
void SetVertexUV(int vID, const FVector2f &vNewUV)
Definition DynamicMesh3.h:1005
FVector2f GetVertexUV(int vID) const
Definition DynamicMesh3.h:994
FMeshTriEdgeID GetTriEdgeIDFromEdgeID(int EdgeID) const
Definition DynamicMesh3.h:892
uint32 GetTopologyChangeStamp() const
Definition DynamicMesh3.h:535
FVector3f GetVertexNormal(int vID) const
Definition DynamicMesh3.h:944
const TDynamicVector< FEdge > & GetEdgesBuffer() const
Definition DynamicMesh3.h:1300
GEOMETRYCORE_API void DiscardTriangleGroups()
Definition DynamicMesh3.cpp:667
virtual EMeshResult PokeTriangle(int TriangleID, FPokeTriangleInfo &PokeInfo)
Definition DynamicMesh3.h:1589
void EnumerateVertexEdges(int32 VertexID, TFunctionRef< void(int32)> EdgeFunc) const
Definition DynamicMesh3.h:634
GEOMETRYCORE_API EMeshResult GetVtxTriangles(int VertexID, ArrayType &TrianglesOut) const
DynamicMeshInfo::FPokeTriangleInfo FPokeTriangleInfo
Definition DynamicMesh3.h:121
FIndex3i GetTriEdges(int TriangleID) const
Definition DynamicMesh3.h:798
virtual void EndUnsafeVerticesInsert()
Definition DynamicMesh3.h:700
bool IsCompactT() const
Definition DynamicMesh3.h:1171
FVector3d GetTriVertex(int TriangleID, int j) const
Definition DynamicMesh3.h:842
const TDynamicVector< FVector2f > * GetUVBuffer() const
Definition DynamicMesh3.h:1284
DynamicMeshInfo::FMergeEdgesInfo FMergeEdgesInfo
Definition DynamicMesh3.h:119
void EnumerateTriEdgeIDsFromTriID(const int TriID, const TFunctionRef< void(FMeshTriEdgeID TriEdgeID)> &TriEdgeFunc) const
Definition DynamicMesh3.h:819
GEOMETRYCORE_API void ReverseOrientation(bool bFlipNormals=true)
Definition DynamicMesh3_Edits.cpp:597
GEOMETRYCORE_API bool IsBoundaryTriangle(int TriangleID) const
Definition DynamicMesh3_Queries.cpp:311
TDynamicVector< FIndex3i > Triangles
Definition DynamicMesh3.h:183
virtual GEOMETRYCORE_API ~FDynamicMesh3()
Definition DynamicMeshAttributeSet.h:84
Definition MeshShapeGenerator.h:19
Definition RefCountVector.h:445
Definition RefCountVector.h:25
MappedEnumerable< ToType > MappedIndices(TFunction< ToType(int)> MapFunc) const
Definition RefCountVector.h:497
void RebuildFreeList()
Definition RefCountVector.h:306
size_t GetMaxIndex() const
Definition RefCountVector.h:56
size_t GetCount() const
Definition RefCountVector.h:51
bool IsDense() const
Definition RefCountVector.h:61
int GetRefCount(int Index) const
Definition RefCountVector.h:76
bool IsValid(int Index) const
Definition RefCountVector.h:66
FilteredEnumerable FilteredIndices(TFunction< bool(int)> FilterFunc) const
Definition RefCountVector.h:527
int Allocate()
Definition RefCountVector.h:102
IndexEnumerable Indices() const
Definition RefCountVector.h:458
Definition SmallListSet.h:36
GEOMETRYCORE_API void AllocateAt(int32 ListIndex)
Definition SmallListSet.cpp:44
GEOMETRYCORE_API void Insert(int32 ListIndex, int32 Value)
Definition SmallListSet.cpp:195
size_t Size() const
Definition SmallListSet.h:75
void Enumerate(int32 ListIndex, const IntToVoidFunc &ApplyFunc) const
Definition SmallListSet.h:293
ValueEnumerable Values(int32 ListIndex) const
Definition SmallListSet.h:571
MappedValueEnumerable MappedValues(int32 ListIndex, TFunction< int32(int32)> MapFunc) const
Definition SmallListSet.h:660
int32 GetCount(int32 ListIndex) const
Definition SmallListSet.h:155
GEOMETRYCORE_API void Clear(int32 ListIndex)
Definition SmallListSet.cpp:305
Definition DynamicVector.h:27
Definition IteratorUtil.h:369
constexpr int InvalidID
Definition IndexTypes.h:13
GEOMETRYCORE_API bool FetchDebugMesh(FString DebugMeshName, FDynamicMesh3 &MeshOut, bool bClear)
Definition DynamicMesh3.cpp:1669
GEOMETRYCORE_API void StashDebugMesh(const FDynamicMesh3 &Mesh, FString DebugMeshName)
Definition DynamicMesh3.cpp:1654
GEOMETRYCORE_API void ClearAllDebugMeshes()
Definition DynamicMesh3.cpp:1639
bool IsFinite(const TVector2< RealType > &V)
Definition VectorUtil.h:42
EMeshResult
Definition GeometryTypes.h:18
EValidityCheckFailMode
Definition GeometryTypes.h:72
@ Area
Definition FitOrientedBox2.h:17
EMeshComponents
Definition DynamicMesh3.h:50
Definition AdvancedWidgetsModule.cpp:13
@ false
Definition radaudio_common.h:23
Definition InfoTypes.h:181
Definition InfoTypes.h:171
Definition InfoTypes.h:155
Definition InfoTypes.h:197
Definition InfoTypes.h:216
Definition InfoTypes.h:229
Definition InfoTypes.h:242
Definition Array.h:45
@ Value
Definition Array.h:46
Definition Optional.h:131
Definition DynamicMesh3.h:309
int32 GroupOffset
Definition DynamicMesh3.h:311
int32 EdgeOffset
Definition DynamicMesh3.h:311
int32 NumVertex
Definition DynamicMesh3.h:317
int32 NormalOverlayOffsets[3]
Definition DynamicMesh3.h:314
int32 NumEdge
Definition DynamicMesh3.h:317
int32 VertexOffset
Definition DynamicMesh3.h:311
int32 NumTriangle
Definition DynamicMesh3.h:317
int32 TriangleOffset
Definition DynamicMesh3.h:311
bool bAllowCollapsingInternalEdgeWithBoundaryVertices
Definition DynamicMesh3.h:1450
bool bAllowTetrahedronCollapse
Definition DynamicMesh3.h:1456
bool bAllowHoleCollapse
Definition DynamicMesh3.h:1444
Definition DynamicMesh3.h:129
FIndex2i Tri
Definition DynamicMesh3.h:131
FIndex2i Vert
Definition DynamicMesh3.h:130
void Serialize(FArchive &Ar)
Definition DynamicMesh3.h:151
friend FArchive & operator<<(FArchive &Ar, FEdge &E)
Definition DynamicMesh3.h:144
friend bool operator!=(const FEdge &e0, const FEdge &e1)
Definition DynamicMesh3.h:132
bool bAllowNonBoundaryBowtieCreation
Definition DynamicMesh3.h:1543
int32 OtherID
Definition DynamicMesh3.h:1664
EIDType IDType
Definition DynamicMesh3.h:1666
EReason Reason
Definition DynamicMesh3.h:1647
FString Detail
Definition DynamicMesh3.h:1650
int32 ID
Definition DynamicMesh3.h:1662
void SetEID(int32 EID, int32 OtherEID=InvalidID)
Definition DynamicMesh3.h:1681
void SetVID(int32 VID, int32 OtherVID=InvalidID)
Definition DynamicMesh3.h:1669
void SetTID(int32 TID, int32 OtherTID=InvalidID)
Definition DynamicMesh3.h:1675
Definition DynamicMesh3.h:1609
bool bCheckAttributes
Definition DynamicMesh3.h:1616
bool bIgnoreDataLayout
Definition DynamicMesh3.h:1619
bool bCheckGroups
Definition DynamicMesh3.h:1615
bool bCheckColors
Definition DynamicMesh3.h:1613
float EpsilonFloat
Definition DynamicMesh3.h:1622
bool bCheckEdgeIDs
Definition DynamicMesh3.h:1611
bool bCheckNormals
Definition DynamicMesh3.h:1612
bool bCheckConnectivity
Definition DynamicMesh3.h:1610
double EpsilonDouble
Definition DynamicMesh3.h:1625
bool bCheckUVs
Definition DynamicMesh3.h:1614
Definition DynamicMesh3.h:1708
bool bAllowAdjacentFacesReverseOrientation
Definition DynamicMesh3.h:1710
static FValidityOptions Permissive()
Definition DynamicMesh3.h:1723
bool bAllowNonManifoldVertices
Definition DynamicMesh3.h:1709
FValidityOptions(bool bAllowNonManifoldVertices=false, bool bAllowAdjacentFacesReverseOrientation=false)
Definition DynamicMesh3.h:1715
Definition AdaptiveTessellator.h:29
Definition IndexTypes.h:27
int B
Definition IndexTypes.h:32
Definition IndexTypes.h:158
int B
Definition IndexTypes.h:164
int A
Definition IndexTypes.h:163
int C
Definition IndexTypes.h:165
Definition IndexTypes.h:296
Definition InfoTypes.h:55
Definition InfoTypes.h:17
static TVector2< float > Zero()
Definition Vector2D.h:79
static TVector< float > One()
Definition Vector.h:115
static TVector< float > UnitY()
Definition Vector.h:121