UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
MeshDescription.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "Algo/Accumulate.h"
6#include "Algo/Copy.h"
7#include "Algo/Find.h"
8#include "Containers/Array.h"
10#include "Containers/BitArray.h"
13#include "Containers/Map.h"
14#include "Containers/Set.h"
17#include "CoreFwd.h"
18#include "CoreTypes.h"
19#include "HAL/CriticalSection.h"
20#include "HAL/PlatformCrt.h"
21#include "Math/Box.h"
22#include "Math/MathFwd.h"
23#include "Math/Plane.h"
24#include "Math/Vector.h"
25#include "MeshAttributeArray.h"
26#include "MeshElementArray.h"
28#include "MeshElementIndexer.h"
29#include "MeshTypes.h"
31#include "Misc/EnumClassFlags.h"
32#include "Misc/Guid.h"
35#include "Templates/Tuple.h"
38#include "UObject/NameTypes.h"
39#include "UObject/Object.h"
42
43#include "MeshDescription.generated.h"
44
45class FArchive;
46class UObject;
48
49enum
50{
51 //Remove the _MD when FRawMesh will be remove
53};
54
55
64
68template <typename AttributeType> using TEdgeAttributesRef = TMeshAttributesRef<FEdgeID, AttributeType>;
69template <typename AttributeType> using TUVAttributesRef = TMeshAttributesRef<FUVID, AttributeType>;
73
81
82UENUM()
84{
85 None = 0x00000000, // No flags
86 Normals = 0x00000001, //Compute the normals
87 Tangents = 0x00000002, //Compute the tangents
88 WeightedNTBs = 0x00000004, //Use weight angle when computing NTBs to proportionally distribute the vertex instance contribution to the normal/tangent/binormal in a smooth group. i.e. Weight solve the cylinder problem
89};
91
92
94{
95public:
96
97 // Mesh description should be a moveable type.
98 // Hence explicitly declare all the below as defaulted, to ensure they will be generated by the compiler.
100 ~FMeshDescription() = default;
105
106 friend FArchive& operator<<(FArchive& Ar, FMeshDescription& MeshDescription)
107 {
108 MeshDescription.Serialize(Ar);
109 return Ar;
110 }
111
112 // Serialize the mesh description
114
115 // Legacy serialization for old assets
117
118 // Empty the meshdescription
120
121 // Operations on all the indexers
125
126 // Return whether the mesh description is empty
127 MESHDESCRIPTION_API bool IsEmpty() const;
128
129 FVertexArray& Vertices() { return static_cast<TMeshElementContainer<FVertexID>&>(VertexElements->Get()); }
130 const FVertexArray& Vertices() const { return static_cast<const TMeshElementContainer<FVertexID>&>(VertexElements->Get()); }
131
132 FVertexInstanceArray& VertexInstances() { return static_cast<TMeshElementContainer<FVertexInstanceID>&>(VertexInstanceElements->Get()); }
133 const FVertexInstanceArray& VertexInstances() const { return static_cast<const TMeshElementContainer<FVertexInstanceID>&>(VertexInstanceElements->Get()); }
134
135 FEdgeArray& Edges() { return static_cast<TMeshElementContainer<FEdgeID>&>(EdgeElements->Get()); }
136 const FEdgeArray& Edges() const { return static_cast<const TMeshElementContainer<FEdgeID>&>(EdgeElements->Get()); }
137
138 FUVArray& UVs(int32 Index) { return static_cast<TMeshElementContainer<FUVID>&>(UVElements->Get(Index)); }
139 const FUVArray& UVs(int32 Index) const { return static_cast<const TMeshElementContainer<FUVID>&>(UVElements->Get(Index)); }
140
141 FTriangleArray& Triangles() { return static_cast<TMeshElementContainer<FTriangleID>&>(TriangleElements->Get()); }
142 const FTriangleArray& Triangles() const { return static_cast<const TMeshElementContainer<FTriangleID>&>(TriangleElements->Get()); }
143
144 FPolygonArray& Polygons() { return static_cast<TMeshElementContainer<FPolygonID>&>(PolygonElements->Get()); }
145 const FPolygonArray& Polygons() const { return static_cast<const TMeshElementContainer<FPolygonID>&>(PolygonElements->Get()); }
146
147 FPolygonGroupArray& PolygonGroups() { return static_cast<TMeshElementContainer<FPolygonGroupID>&>(PolygonGroupElements->Get()); }
148 const FPolygonGroupArray& PolygonGroups() const { return static_cast<const TMeshElementContainer<FPolygonGroupID>&>(PolygonGroupElements->Get()); }
149
152
155
158
159 TAttributesSet<FUVID>& UVAttributes(int32 Index) { return UVs(Index).GetAttributes(); }
160 const TAttributesSet<FUVID>& UVAttributes(int32 Index) const { return UVs(Index).GetAttributes(); }
161
164
167
170
172 const TMap<FName, FMeshElementTypeWrapper>& GetElements() const { return Elements; }
173
174 void SuspendVertexIndexing() { VertexToVertexInstances.Suspend(); VertexToEdges.Suspend(); }
175 void SuspendVertexInstanceIndexing() { VertexInstanceToTriangles.Suspend(); }
176 void SuspendEdgeIndexing() { EdgeToTriangles.Suspend(); }
177 void SuspendPolygonIndexing() { PolygonToTriangles.Suspend(); }
178 void SuspendPolygonGroupIndexing() { PolygonGroupToPolygons.Suspend(); PolygonGroupToTriangles.Suspend(); }
179 void SuspendUVIndexing() { UVToTriangles.Suspend(); }
180
181 void ResumeVertexIndexing() { VertexToVertexInstances.Resume(); VertexToEdges.Resume(); }
182 void ResumeVertexInstanceIndexing() { VertexInstanceToTriangles.Resume(); }
183 void ResumeEdgeIndexing() { EdgeToTriangles.Resume(); }
184 void ResumePolygonIndexing() { PolygonToTriangles.Resume(); }
185 void ResumePolygonGroupIndexing() { PolygonGroupToPolygons.Resume(); PolygonGroupToTriangles.Resume(); }
186 void ResumeUVIndexing() { UVToTriangles.Resume(); }
187
188 void BuildVertexIndexers() { VertexToVertexInstances.Build(); VertexToEdges.Build(); }
189 void BuildVertexInstanceIndexers() { VertexInstanceToTriangles.Build(); }
190 void BuildEdgeIndexers() { EdgeToTriangles.Build(); }
191 void BuildPolygonIndexers() { PolygonToTriangles.Build(); }
192 void BuildPolygonGroupIndexers() { PolygonGroupToPolygons.Build(), PolygonGroupToTriangles.Build(); }
193
195// Create / remove mesh elements
196
198 void ReserveNewVertices(const int32 NumVertices)
199 {
200 VertexElements->Get().Reserve(VertexElements->Get().Num() + NumVertices);
201 }
202
205 {
206 const FVertexID VertexID = VertexElements->Get().Add();
207 return VertexID;
208 }
209
211 void CreateVertexWithID(const FVertexID VertexID)
212 {
213 VertexElements->Get().Insert(VertexID);
214 }
215
217 void DeleteVertex(const FVertexID VertexID)
218 {
219 check(VertexToVertexInstances.Find(VertexID).Num() == 0);
220 check(VertexToEdges.Find(VertexID).Num() == 0);
221 VertexElements->Get().Remove(VertexID);
222 VertexToVertexInstances.RemoveKey(VertexID);
223 VertexToEdges.RemoveKey(VertexID);
224 }
225
227 bool IsVertexValid(const FVertexID VertexID) const
228 {
229 return VertexElements->Get().IsValid(VertexID);
230 }
231
234 {
235 VertexInstanceElements->Get().Reserve(VertexInstanceElements->Get().Num() + NumVertexInstances);
236 }
237
240 {
241 const FVertexInstanceID VertexInstanceID = VertexInstanceElements->Get().Add();
242 CreateVertexInstance_Internal(VertexInstanceID, VertexID);
243 return VertexInstanceID;
244 }
245
247 void CreateVertexInstanceWithID(const FVertexInstanceID VertexInstanceID, const FVertexID VertexID)
248 {
249 VertexInstanceElements->Get().Insert(VertexInstanceID);
250 CreateVertexInstance_Internal(VertexInstanceID, VertexID);
251 }
252
255
257 bool IsVertexInstanceValid(const FVertexInstanceID VertexInstanceID) const
258 {
259 return VertexInstanceElements->Get().IsValid(VertexInstanceID);
260 }
261
263 void ReserveNewUVs(const int32 NumUVs, const int32 UVChannel = 0)
264 {
265 UVElements->Get(UVChannel).Reserve(UVElements->Get(UVChannel).Num() + NumUVs);
266 }
267
269 FUVID CreateUV(const int32 UVChannel = 0)
270 {
271 const FUVID UVID = UVElements->Get(UVChannel).Add();
272 return UVID;
273 }
274
276 void CreateUVWithID(const FUVID UVID, const int32 UVChannel = 0)
277 {
278 UVElements->Get(UVChannel).Insert(UVID);
279 }
280
282 void DeleteUV(const FUVID UVID, const int32 UVChannel = 0)
283 {
284 check(UVToTriangles.Find(UVID).Num() == 0);
285 UVElements->Get(UVChannel).Remove(UVID);
286 UVToTriangles.RemoveKey(UVID);
287 }
288
290 bool IsUVValid(const FUVID UVID, const int32 UVChannel = 0) const
291 {
292 return UVElements->Get(UVChannel).IsValid(UVID);
293 }
294
296 void ReserveNewEdges(const int32 NumEdges)
297 {
298 EdgeElements->Get().Reserve(EdgeElements->Get().Num() + NumEdges);
299 }
300
303 {
304 const FEdgeID EdgeID = EdgeElements->Get().Add();
305 CreateEdge_Internal(EdgeID, VertexID0, VertexID1);
306 return EdgeID;
307 }
308
311 {
312 EdgeElements->Get().Insert(EdgeID);
313 CreateEdge_Internal(EdgeID, VertexID0, VertexID1);
314 }
315
318
320 bool IsEdgeValid(const FEdgeID EdgeID) const
321 {
322 return EdgeElements->Get().IsValid(EdgeID);
323 }
324
326 void ReserveNewTriangles(const int32 NumTriangles)
327 {
328 TriangleElements->Get().Reserve(TriangleElements->Get().Num() + NumTriangles);
329 }
330
333 {
334 const FTriangleID TriangleID = TriangleElements->Get().Add();
335 CreateTriangle_Internal(TriangleID, PolygonGroupID, VertexInstanceIDs, OutEdgeIDs);
336 return TriangleID;
337 }
338
340 void CreateTriangleWithID(const FTriangleID TriangleID, const FPolygonGroupID PolygonGroupID, TArrayView<const FVertexInstanceID> VertexInstanceIDs, TArray<FEdgeID>* OutEdgeIDs = nullptr)
341 {
342 TriangleElements->Get().Insert(TriangleID);
343 CreateTriangle_Internal(TriangleID, PolygonGroupID, VertexInstanceIDs, OutEdgeIDs);
344 }
345
348
353
355 bool IsTriangleValid(const FTriangleID TriangleID) const
356 {
357 return TriangleElements->Get().IsValid(TriangleID);
358 }
359
362 {
363 PolygonElements->Get().Reserve(PolygonElements->Get().Num() + NumPolygons);
364 }
365
368 {
369 const FPolygonID PolygonID = PolygonElements->Get().Add();
370 CreatePolygon_Internal(PolygonID, PolygonGroupID, VertexInstanceIDs, OutEdgeIDs);
371 return PolygonID;
372 }
373
375 void CreatePolygonWithID(const FPolygonID PolygonID, const FPolygonGroupID PolygonGroupID, TArrayView<const FVertexInstanceID> VertexInstanceIDs, TArray<FEdgeID>* OutEdgeIDs = nullptr)
376 {
377 PolygonElements->Get().Insert(PolygonID);
378 CreatePolygon_Internal(PolygonID, PolygonGroupID, VertexInstanceIDs, OutEdgeIDs);
379 }
380
383
388
390 bool IsPolygonValid(const FPolygonID PolygonID) const
391 {
392 return PolygonElements->Get().IsValid(PolygonID);
393 }
394
397 {
398 PolygonGroupElements->Get().Reserve(PolygonGroupElements->Get().Num() + NumPolygonGroups);
399 }
400
403 {
404 const FPolygonGroupID PolygonGroupID = PolygonGroupElements->Get().Add();
405 return PolygonGroupID;
406 }
407
409 void CreatePolygonGroupWithID(const FPolygonGroupID PolygonGroupID)
410 {
411 PolygonGroupElements->Get().Insert(PolygonGroupID);
412 }
413
415 void DeletePolygonGroup(const FPolygonGroupID PolygonGroupID)
416 {
417 check(PolygonGroupToPolygons.Find(PolygonGroupID).Num() == 0);
418 PolygonGroupElements->Get().Remove(PolygonGroupID);
419 PolygonGroupToPolygons.RemoveKey(PolygonGroupID);
420 PolygonGroupToTriangles.RemoveKey(PolygonGroupID);
421 }
422
424 bool IsPolygonGroupValid(const FPolygonGroupID PolygonGroupID) const
425 {
426 return PolygonGroupElements->Get().IsValid(PolygonGroupID);
427 }
428
429
431// MeshDescription general functions
432
433public:
434
436 // Vertex operations
437
439 MESHDESCRIPTION_API bool IsVertexOrphaned(const FVertexID VertexID) const;
440
443
446 {
447 return VertexToEdges.Find<FEdgeID>(VertexID);
448 }
449
450 UE_DEPRECATED(4.26, "Please use GetVertexConnectedEdgeIDs instead.")
452 {
454 }
455
458 {
459 return VertexToEdges.Find(VertexID).Num();
460 }
461
464 {
465 return VertexToVertexInstances.Find<FVertexInstanceID>(VertexID);
466 }
467
468 UE_DEPRECATED(4.26, "Please use GetVertexVertexInstanceIDs instead.")
473
476 {
477 return VertexToVertexInstances.Find(VertexID).Num();
478 }
479
481 template <typename Alloc>
483 {
485 for (const FVertexInstanceID& VertexInstanceID : VertexToVertexInstances.Find<FVertexInstanceID>(VertexID))
486 {
487 TArrayView<const FTriangleID> ConnectedTris = VertexInstanceToTriangles.Find<FTriangleID>(VertexInstanceID);
488 OutConnectedTriangleIDs.Append(ConnectedTris.GetData(), ConnectedTris.Num());
489 }
490 }
491
493 template <typename Alloc>
495 {
497 this->GetVertexConnectedTriangles(VertexID, Result);
498 return Result;
499 }
500
503 {
504 TArray<FTriangleID> Result;
505 this->GetVertexConnectedTriangles(VertexID, Result);
506 return Result;
507 }
508
511 {
514 [this](const FVertexInstanceID ID) { return VertexInstanceToTriangles.Find(ID).Num(); },
515 0);
516 }
517
519 template <typename Alloc>
521 {
523 for (const FVertexInstanceID& VertexInstanceID : VertexToVertexInstances.Find<FVertexInstanceID>(VertexID))
524 {
525 for (const FTriangleID& TriangleID : VertexInstanceToTriangles.Find<FTriangleID>(VertexInstanceID))
526 {
527 OutConnectedPolygonIDs.AddUnique(TrianglePolygons[TriangleID]);
528 }
529 }
530 }
531
533 template <typename Alloc>
535 {
537 this->GetVertexConnectedPolygons(VertexID, Result);
538 return Result;
539 }
540
543 {
544 TArray<FPolygonID> Result;
545 this->GetVertexConnectedPolygons(VertexID, Result);
546 return Result;
547 }
548
551 {
553 }
554
556 template <typename Alloc>
558 {
559 TArrayView<const FEdgeID> ConnectedEdgeIDs = VertexToEdges.Find<FEdgeID>(VertexID);
560 OutAdjacentVertexIDs.SetNumUninitialized(ConnectedEdgeIDs.Num());
561
562 int32 Index = 0;
563 for (const FEdgeID& EdgeID : ConnectedEdgeIDs)
564 {
565 TArrayView<const FVertexID> EdgeVertexIDs = EdgeVertices[EdgeID];
567 Index++;
568 }
569 }
570
572 template <typename Alloc>
574 {
576 this->GetVertexAdjacentVertices(VertexID, Result);
577 return Result;
578 }
579
582 {
583 TArray<FVertexID> Result;
584 this->GetVertexAdjacentVertices(VertexID, Result);
585 return Result;
586 }
587
590 {
591 return VertexPositions[VertexID];
592 }
593
595 {
596 return VertexPositions;
597 }
598
600 {
601 return VertexPositions;
602 }
603
605 // Vertex instance operations
606
609 {
610 return VertexInstanceVertices[VertexInstanceID];
611 }
612
615
618 {
619 return VertexInstanceToTriangles.Find<FTriangleID>(VertexInstanceID);
620 }
621
622 UE_DEPRECATED(4.26, "Please use GetVertexInstanceTriangleIDs() instead.")
627
630 {
631 return VertexInstanceToTriangles.Find(VertexInstanceID).Num();
632 }
633
635 template <typename Alloc>
637 {
638 OutPolygonIDs.Reset(VertexInstanceToTriangles.Find(VertexInstanceID).Num());
639 for (const FTriangleID& TriangleID : VertexInstanceToTriangles.Find<FTriangleID>(VertexInstanceID))
640 {
641 OutPolygonIDs.AddUnique(TrianglePolygons[TriangleID]);
642 }
643 }
644
646 template <typename Alloc>
648 {
650 this->GetVertexInstanceConnectedPolygons(VertexInstanceID, Result);
651 return Result;
652 }
653
656 {
657 TArray<FPolygonID> Result;
658 this->GetVertexInstanceConnectedPolygons(VertexInstanceID, Result);
659 return Result;
660 }
661
664 {
666 }
667
668
670 // Edge operations
671
673 bool IsEdgeInternal(const FEdgeID EdgeID) const
674 {
675 TArrayView<const FTriangleID> ConnectedTriangles = EdgeToTriangles.Find<FTriangleID>(EdgeID);
676 return ConnectedTriangles.Num() == 2 &&
677 TrianglePolygons[ConnectedTriangles[0]] == TrianglePolygons[ConnectedTriangles[1]];
678 }
679
681 bool IsEdgeInternalToPolygon(const FEdgeID EdgeID, const FPolygonID PolygonID) const
682 {
683 TArrayView<const FTriangleID> ConnectedTriangles = EdgeToTriangles.Find<FTriangleID>(EdgeID);
684 return ConnectedTriangles.Num() == 2 &&
685 TrianglePolygons[ConnectedTriangles[0]] == PolygonID &&
686 TrianglePolygons[ConnectedTriangles[1]] == PolygonID;
687 }
688
691 {
692 return EdgeToTriangles.Find<FTriangleID>(EdgeID);
693 }
694
695 UE_DEPRECATED(4.26, "Please use GetEdgeConnectedTriangleIDs() instead.")
700
702 {
703 return EdgeToTriangles.Find(EdgeID).Num();
704 }
705
707 template <typename Alloc>
709 {
710 OutPolygonIDs.Reset(EdgeToTriangles.Find(EdgeID).Num());
711 for (const FTriangleID& TriangleID : EdgeToTriangles.Find<FTriangleID>(EdgeID))
712 {
713 OutPolygonIDs.AddUnique(TrianglePolygons[TriangleID]);
714 }
715 }
716
718 template <typename Alloc>
720 {
722 this->GetEdgeConnectedPolygons(EdgeID, Result);
723 return Result;
724 }
725
728 {
729 TArray<FPolygonID> Result;
730 this->GetEdgeConnectedPolygons(EdgeID, Result);
731 return Result;
732 }
733
736 {
738 }
739
742 {
743 check(VertexNumber == 0 || VertexNumber == 1);
744 TArrayView<const FVertexID> EdgeVertexIDs = EdgeVertices[EdgeID];
746 }
747
750 {
751 return EdgeVertices[EdgeID];
752 }
753
754
756 // Triangle operations
757
760 {
761 return TrianglePolygons[TriangleID];
762 }
763
766 {
767 return TrianglePolygonGroups[TriangleID];
768 }
769
771 bool IsTrianglePartOfNgon(const FTriangleID TriangleID) const
772 {
773 return PolygonToTriangles.Find(TrianglePolygons[TriangleID]).Num() > 1;
774 }
775
778 {
779 return TriangleVertexInstances[TriangleID];
780 }
781
784 {
785 check(Index >= 0 && Index < 3);
786 TArrayView<const FVertexInstanceID> TriVertexInstanceIDs = TriangleVertexInstances[TriangleID];
788 }
789
791 UE_DEPRECATED(4.26, "Use the other form of GetTriangleVertices")
793 {
794 check(OutVertexIDs.Num() >= 3);
795 TArrayView<const FVertexID> TriVerts = TriangleVertices[TriangleID];
796 for (int32 Index = 0; Index < 3; ++Index)
797 {
799 }
800 }
801
804 {
805 return TriangleVertices[TriangleID];
806 }
807
809 UE_DEPRECATED(4.26, "Use the other form of GetTriangleEdges")
811 {
812 check(OutEdgeIDs.Num() >= 3);
813 TArrayView<const FEdgeID> TriEdges = TriangleEdges[TriangleID];
814 for (int32 Index = 0; Index < 3; ++Index)
815 {
817 }
818 }
819
822 {
823 return TriangleEdges[TriangleID];
824 }
825
827 template <typename Alloc>
829 {
830 OutTriangleIDs.Reset();
831 for (const FEdgeID& EdgeID : GetTriangleEdges(TriangleID))
832 {
833 for (const int32& TriangleIndex : EdgeToTriangles.Find(EdgeID))
834 {
835 FTriangleID OtherTriangleID(TriangleIndex);
836 if (OtherTriangleID != TriangleID)
837 {
839 }
840 }
841 }
842 }
843
845 template <typename Alloc>
847 {
849 this->GetTriangleAdjacentTriangles(TriangleID, Result);
850 return Result;
851 }
852
855 {
856 TArray<FTriangleID> Result;
857 this->GetTriangleAdjacentTriangles(TriangleID, Result);
858 return Result;
859 }
860
862 TArrayView<FUVID> GetTriangleUVIndices(const FTriangleID TriangleID, int32 UVChannel = 0) const
863 {
864 return TriangleUVs.Get(TriangleID, UVChannel);
865 }
866
869 {
871 GetTriangleVertexInstances(TriangleID),
872 [this, VertexID](const FVertexInstanceID VertexInstanceID) { return (GetVertexInstanceVertex(VertexInstanceID) == VertexID); });
873
875 }
876
879
882
884 // Polygon operations
885
888 {
889 return PolygonToTriangles.Find<FTriangleID>(PolygonID);
890 }
891
892 UE_DEPRECATED(4.26, "Please use GetPolygonTriangles() instead.")
894 {
895 return TArray<FTriangleID>(GetPolygonTriangles(PolygonID));
896 }
897
900 {
901 return PolygonToTriangles.Find(PolygonID).Num();
902 }
903
905 template <typename Alloc>
907 {
908 OutVertexInstanceIDs.SetNumUninitialized(GetNumPolygonVertices(PolygonID));
909 TArrayView<const FTriangleID> Tris = PolygonToTriangles.Find<FTriangleID>(PolygonID);
910 if (Tris.Num() == 1)
911 {
912 OutVertexInstanceIDs = TriangleVertexInstances[Tris[0]];
913 }
914 else
915 {
917 Result.SetNumUninitialized(Tris.Num() + 2);
918 FindPolygonPerimeter(Tris, Result);
919 for (int32 Index = 0; Index < Result.Num(); Index++)
920 {
921 FTriangleID TriangleID = Tris[Result[Index].Get<0>()];
922 int32 VertexInstanceNumber = Result[Index].Get<1>();
923 OutVertexInstanceIDs[Index] = TriangleVertexInstances[TriangleID][VertexInstanceNumber];
924 }
925 }
926 }
927
928 template <typename Alloc>
930 {
932 this->GetPolygonVertexInstances(PolygonID, Result);
933 return Result;
934 }
935
937 {
939 this->GetPolygonVertexInstances(PolygonID, Result);
940 return Result;
941 }
942
945 {
946 TArrayView<const FTriangleID> Tris = PolygonToTriangles.Find<FTriangleID>(PolygonID);
947 return Tris.Num() + 2;
948 }
949
951 template <typename Alloc>
953 {
954 OutVertexIDs.SetNumUninitialized(GetNumPolygonVertices(PolygonID));
955 TArrayView<const FTriangleID> Tris = PolygonToTriangles.Find<FTriangleID>(PolygonID);
956 if (Tris.Num() == 1)
957 {
958 OutVertexIDs = TriangleVertices[Tris[0]];
959 }
960 else
961 {
963 Result.SetNumUninitialized(Tris.Num() + 2);
964 FindPolygonPerimeter(Tris, Result);
965 for (int32 Index = 0; Index < Result.Num(); Index++)
966 {
967 FTriangleID TriangleID = Tris[Result[Index].Get<0>()];
968 int32 VertexNumber = Result[Index].Get<1>();
969 OutVertexIDs[Index] = TriangleVertices[TriangleID][VertexNumber];
970 }
971 }
972 }
973
975 template <typename Alloc>
977 {
979 this->GetPolygonVertices(PolygonID, Result);
980 return Result;
981 }
982
985 {
986 TArray<FVertexID> Result;
987 this->GetPolygonVertices(PolygonID, Result);
988 return Result;
989 }
990
992 template <typename Alloc>
994 {
995 OutEdgeIDs.SetNumUninitialized(GetNumPolygonVertices(PolygonID));
996 TArrayView<const FTriangleID> Tris = PolygonToTriangles.Find<FTriangleID>(PolygonID);
997 if (Tris.Num() == 1)
998 {
999 OutEdgeIDs = TriangleEdges[Tris[0]];
1000 }
1001 else
1002 {
1004 Result.SetNumUninitialized(Tris.Num() + 2);
1005 FindPolygonPerimeter(Tris, Result);
1006 for (int32 Index = 0; Index < Result.Num(); Index++)
1007 {
1008 FTriangleID TriangleID = Tris[Result[Index].Get<0>()];
1009 int32 EdgeNumber = Result[Index].Get<1>();
1010 OutEdgeIDs[Index] = TriangleEdges[TriangleID][EdgeNumber];
1011 }
1012 }
1013 }
1014
1016 template <typename Alloc>
1018 {
1020 this->GetPolygonPerimeterEdges(PolygonID, Result);
1021 return Result;
1022 }
1023
1026 {
1027 TArray<FEdgeID> Result;
1028 this->GetPolygonPerimeterEdges(PolygonID, Result);
1029 return Result;
1030 }
1031
1034 template <typename Alloc>
1036 {
1037 OutEdgeIDs.Reset(GetNumPolygonVertices(PolygonID) - 3);
1038 if (GetNumPolygonVertices(PolygonID) > 3)
1039 {
1040 TArray<FVertexInstanceID> VertexInstanceIDs = GetPolygonVertexInstances(PolygonID);
1041 for (const FVertexInstanceID& VertexInstanceID : VertexInstanceIDs)
1042 {
1043 for (const FEdgeID& EdgeID : GetVertexConnectedEdgeIDs(GetVertexInstanceVertex(VertexInstanceID)))
1044 {
1045 if (!OutEdgeIDs.Contains(EdgeID) && IsEdgeInternalToPolygon(EdgeID, PolygonID))
1046 {
1047 OutEdgeIDs.Add(EdgeID);
1048 }
1049 }
1050 }
1051 }
1052 }
1053
1055 template <typename Alloc>
1057 {
1059 this->GetPolygonInternalEdges(PolygonID, Result);
1060 return Result;
1061 }
1062
1065 {
1066 TArray<FEdgeID> Result;
1067 this->GetPolygonInternalEdges(PolygonID, Result);
1068 return Result;
1069 }
1070
1073 {
1074 return PolygonToTriangles.Find(PolygonID).Num() - 1;
1075 }
1076
1078 template <typename Alloc>
1080 {
1081 OutPolygonIDs.Reset();
1082 for (const FEdgeID& EdgeID : GetPolygonPerimeterEdges<TInlineAllocator<16>>(PolygonID))
1083 {
1085 {
1086 if (OtherPolygonID != PolygonID)
1087 {
1089 }
1090 }
1091 }
1092 }
1093
1095 template <typename Alloc>
1097 {
1099 this->GetPolygonAdjacentPolygons(PolygonID, Result);
1100 return Result;
1101 }
1102
1105 {
1106 TArray<FPolygonID> Result;
1107 this->GetPolygonAdjacentPolygons(PolygonID, Result);
1108 return Result;
1109 }
1110
1113 {
1114 return PolygonPolygonGroups[PolygonID];
1115 }
1116
1119 {
1120 TArray<FVertexInstanceID> VertexInstanceIDs = GetPolygonVertexInstances(PolygonID);
1121 const FVertexInstanceID* VertexInstanceIDPtr = VertexInstanceIDs.FindByPredicate(
1122 [this, VertexID](const FVertexInstanceID VertexInstanceID) { return (GetVertexInstanceVertex(VertexInstanceID) == VertexID); });
1123
1125 }
1126
1128 MESHDESCRIPTION_API void SetPolygonVertexInstance(const FPolygonID PolygonID, const int32 PerimeterIndex, const FVertexInstanceID VertexInstanceID);
1130
1132 void SetPolygonPolygonGroup(const FPolygonID PolygonID, const FPolygonGroupID PolygonGroupID)
1133 {
1134 FPolygonGroupID OldPolygonGroupID = PolygonPolygonGroups[PolygonID];
1135 PolygonGroupToPolygons.RemoveReferenceFromKey(OldPolygonGroupID, PolygonID);
1136
1137 PolygonPolygonGroups[PolygonID] = PolygonGroupID;
1138 PolygonGroupToPolygons.AddReferenceToKey(PolygonGroupID, PolygonID);
1139
1140 for (const int32& TriangleIndex: PolygonToTriangles.Find(PolygonID))
1141 {
1142 const FTriangleID TriangleID(TriangleIndex);
1143 check(TrianglePolygonGroups[TriangleID] == OldPolygonGroupID);
1144 PolygonGroupToTriangles.RemoveReferenceFromKey(OldPolygonGroupID, TriangleID);
1145
1146 TrianglePolygonGroups[TriangleID] = PolygonGroupID;
1147 PolygonGroupToTriangles.AddReferenceToKey(PolygonGroupID, TriangleID);
1148 }
1149 }
1150
1153
1157
1160
1162
1163
1165 // Polygon group operations
1166
1169 {
1170 return PolygonGroupToPolygons.Find<FPolygonID>(PolygonGroupID);
1171 }
1172
1173 UE_DEPRECATED(4.26, "Please use GetPolygonGroupPolygonIDs() instead.")
1175 {
1176 return TArray<FPolygonID>(GetPolygonGroupPolygonIDs(PolygonGroupID));
1177 }
1178
1181 {
1182 return PolygonGroupToTriangles.Find<FTriangleID>(PolygonGroupID);
1183 }
1184
1187 {
1188 return PolygonGroupToPolygons.Find(PolygonGroupID).Num();
1189 }
1190
1193 {
1194 return PolygonGroupToTriangles.Find(PolygonGroupID).Num();
1195 }
1196
1199
1202
1204 // Whole mesh operations
1205
1207 MESHDESCRIPTION_API bool NeedsCompact() const;
1208
1211
1214
1216 int32 GetNumUVElementChannels() const { return UVElements->GetNumChannels(); }
1217
1220
1223
1226
1229
1230 MESHDESCRIPTION_API float GetTriangleCornerAngleForVertex(const FTriangleID TriangleID, const FVertexID VertexID) const;
1231 MESHDESCRIPTION_API float GetPolygonCornerAngleForVertex(const FPolygonID PolygonID, const FVertexID VertexID) const;
1232
1234
1235private:
1236
1239
1240private:
1241
1242 MESHDESCRIPTION_API void Initialize();
1243 MESHDESCRIPTION_API void InitializeIndexers();
1244 MESHDESCRIPTION_API void Cache();
1245
1246 MESHDESCRIPTION_API void CreateVertexInstance_Internal(const FVertexInstanceID VertexInstanceID, const FVertexID VertexID);
1247 MESHDESCRIPTION_API void CreateEdge_Internal(const FEdgeID EdgeID, const FVertexID VertexID0, const FVertexID VertexID1);
1248 MESHDESCRIPTION_API void CreateTriangle_Internal(const FTriangleID TriangleID, const FPolygonGroupID PolygonGroupID, TArrayView<const FVertexInstanceID> VertexInstanceIDs, TArray<FEdgeID>* OutEdgeIDs);
1249 MESHDESCRIPTION_API void CreatePolygon_Internal(const FPolygonID PolygonID, const FPolygonGroupID PolygonGroupID, TArrayView<const FVertexInstanceID> VertexInstanceIDs, TArray<FEdgeID>* OutEdgeIDs);
1250 MESHDESCRIPTION_API void CreatePolygonTriangles(const FPolygonID PolygonID, TArrayView<const FVertexInstanceID> VertexInstanceIDs);
1251 MESHDESCRIPTION_API void RemovePolygonTriangles(const FPolygonID PolygonID);
1252
1253 template <template <typename...> class TContainer>
1254 void DeleteVertexInstance_Internal(const FVertexInstanceID VertexInstanceID, TContainer<FVertexID>* InOutOrphanedVerticesPtr = nullptr);
1255 template <template <typename...> class TContainer>
1256 void DeleteEdge_Internal(const FEdgeID EdgeID, TContainer<FVertexID>* InOutOrphanedVerticesPtr = nullptr);
1257 template <template <typename...> class TContainer>
1259 template <template <typename...> class TContainer>
1261
1263 MESHDESCRIPTION_API void FixUpElementIDs(const FElementIDRemappings& Remappings);
1264
1265 template <class T>
1266 void AddUnique(TArray<T>& Container, const T& Item)
1267 {
1268 Container.AddUnique(Item);
1269 }
1270
1271 template <class T>
1272 void AddUnique(TSet<T>& Container, const T& Item)
1273 {
1274 Container.Add(Item);
1275 }
1276
1277public:
1285
1286private:
1288
1289 FMeshElementChannels* VertexElements;
1290 FMeshElementChannels* VertexInstanceElements;
1291 FMeshElementChannels* UVElements;
1292 FMeshElementChannels* EdgeElements;
1293 FMeshElementChannels* TriangleElements;
1294 FMeshElementChannels* PolygonElements;
1295 FMeshElementChannels* PolygonGroupElements;
1296
1297 TMeshAttributesArray<FVertexID> VertexInstanceVertices;
1300 TMeshAttributesArray<FPolygonID> TrianglePolygons;
1304 TMeshAttributesArray<FPolygonGroupID> TrianglePolygonGroups;
1305 TMeshAttributesArray<FPolygonGroupID> PolygonPolygonGroups;
1306 TMeshAttributesArray<FVector3f> VertexPositions;
1307
1308 // The indexers are all mutable because they may be rebuilt during what is essentially a get operation
1309 mutable FMeshElementIndexer VertexToVertexInstances;
1310 mutable FMeshElementIndexer VertexToEdges;
1311 mutable FMeshElementIndexer VertexInstanceToTriangles;
1312 mutable FMeshElementIndexer EdgeToTriangles;
1313 mutable FMeshElementIndexer UVToTriangles;
1314 mutable FMeshElementIndexer PolygonToTriangles;
1315 mutable FMeshElementIndexer PolygonGroupToTriangles;
1316 mutable FMeshElementIndexer PolygonGroupToPolygons;
1317};
1318
1319#if WITH_EDITORONLY_DATA
1320
1325{
1326public:
1328 : bBulkDataUpdated(false)
1329 , bGuidIsHash(false)
1330 {
1331 }
1332
1335
1338
1341
1344
1346 bool IsEmpty() const { return !BulkData.HasPayloadData(); }
1347
1349 MESHDESCRIPTION_API FString GetIdString() const;
1350
1352 MESHDESCRIPTION_API void UseHashAsGuid();
1353
1355 int64 GetBulkDataSize() { return BulkData.GetPayloadSize(); }
1356
1359
1360private:
1362
1363#if WITH_EDITOR
1366#endif
1369
1371 FGuid Guid;
1372
1374 MESHDESCRIPTION_API FGuid GetHash() const;
1375
1377 FCustomVersionContainer CustomVersions;
1378 FPackageFileVersion UEVersion;
1380
1381
1383 bool bBulkDataUpdated;
1384
1386 bool bGuidIsHash;
1387};
1388#endif // WITH_EDITORONLY_DATA
1389
OODEFFUNC typedef void(OODLE_CALLBACK t_fp_OodleCore_Plugin_Free)(void *ptr)
#define check(expr)
Definition AssertionMacros.h:314
@ INDEX_NONE
Definition CoreMiscDefines.h:150
#define UE_DEPRECATED(Version, Message)
Definition CoreMiscDefines.h:302
FPlatformTypes::int64 int64
A 64-bit signed integer.
Definition Platform.h:1127
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 ENUM_CLASS_FLAGS(Enum)
Definition EnumClassFlags.h:6
EComputeNTBsOptions
Definition MeshDescription.h:84
@ MAX_MESH_TEXTURE_COORDS_MD
Definition MeshDescription.h:52
@ Num
Definition MetalRHIPrivate.h:234
#define UENUM(...)
Definition ObjectMacros.h:749
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition Archive.h:1208
Definition CustomVersion.h:111
Definition MeshElementContainer.h:367
void Remove(const int32 Index)
Definition MeshElementContainer.h:110
void Insert(const int32 Index)
Definition MeshElementContainer.h:85
int32 Add()
Definition MeshElementContainer.h:65
void Reserve(const int32 Elements)
Definition MeshElementContainer.h:62
bool IsValid(const int32 Index) const
Definition MeshElementContainer.h:132
int32 Num() const
Definition MeshElementContainer.h:120
Definition MeshElementIndexer.h:48
MESHDESCRIPTION_API void Build()
Definition MeshElementIndexer.cpp:195
MESHDESCRIPTION_API void AddReferenceToKey(int32 KeyIndex, int32 ReferenceIndex, int32 KeyChannelIndex=0)
Definition MeshElementIndexer.cpp:119
TArrayView< const int32 > Find(int32 KeyIndex, int32 KeyChannelIndex=0)
Definition MeshElementIndexer.h:101
MESHDESCRIPTION_API void RemoveKey(int32 KeyIndex, int32 KeyChannelIndex=0)
Definition MeshElementIndexer.cpp:58
void Resume()
Definition MeshElementIndexer.h:161
MESHDESCRIPTION_API void RemoveReferenceFromKey(int32 KeyIndex, int32 ReferenceIndex, int32 KeyChannelIndex=0)
Definition MeshElementIndexer.cpp:85
void Suspend()
Definition MeshElementIndexer.h:156
Definition NameTypes.h:617
Definition ArrayView.h:139
UE_FORCEINLINE_HINT constexpr SizeType Num() const
Definition ArrayView.h:380
Definition Array.h:670
ElementType * FindByPredicate(Predicate Pred)
Definition Array.h:1471
Definition MeshAttributeArray.h:1873
Definition UnrealString.h.inl:34
Definition MeshAttributeArray.h:836
Definition MeshElementContainer.h:246
TAttributesSet< ElementIDType > & GetAttributes()
Definition MeshElementContainer.h:279
Definition ContainerAllocationPolicies.h:894
Definition CriticalSection.h:14
Definition EditorBulkData.h:132
Definition Object.h:95
T TransformAccumulate(const A &Input, MapT MapOp, T Init, OpT Op)
Definition Accumulate.h:71
UE_REWRITE constexpr auto FindByPredicate(RangeType &&Range, PredicateType Pred) -> decltype(AlgoImpl::FindByPredicate(Forward< RangeType >(Range), MoveTemp(Pred)))
Definition Find.h:83
U16 Index
Definition radfft.cpp:71
Definition MeshTypes.h:150
Definition MeshElementRemappings.h:12
Definition Guid.h:109
Definition MeshDescription.h:94
MESHDESCRIPTION_API void DeletePolygons(const TArray< FPolygonID > &Polygons)
Definition MeshDescription.cpp:1090
void ReserveNewVertices(const int32 NumVertices)
Definition MeshDescription.h:198
TAttributesSet< FTriangleID > & TriangleAttributes()
Definition MeshDescription.h:162
static MESHDESCRIPTION_API FName VerticesName
Definition MeshDescription.h:1278
MESHDESCRIPTION_API bool IsEmpty() const
Definition MeshDescription.cpp:613
int32 GetNumPolygonGroupTriangles(const FPolygonGroupID PolygonGroupID) const
Definition MeshDescription.h:1192
TArrayView< FUVID > GetTriangleUVIndices(const FTriangleID TriangleID, int32 UVChannel=0) const
Definition MeshDescription.h:862
void SuspendEdgeIndexing()
Definition MeshDescription.h:176
TArray< FEdgeID > GetPolygonPerimeterEdges(const FPolygonID PolygonID) const
Definition MeshDescription.h:1025
void ReserveNewUVs(const int32 NumUVs, const int32 UVChannel=0)
Definition MeshDescription.h:263
void BuildPolygonIndexers()
Definition MeshDescription.h:191
TArray< FTriangleID, Alloc > GetTriangleAdjacentTriangles(const FTriangleID TriangleID) const
Definition MeshDescription.h:846
void SuspendVertexInstanceIndexing()
Definition MeshDescription.h:175
TArray< FEdgeID > GetPolygonInternalEdges(const FPolygonID PolygonID) const
Definition MeshDescription.h:1064
FEdgeID CreateEdge(const FVertexID VertexID0, const FVertexID VertexID1)
Definition MeshDescription.h:302
TArrayView< const FTriangleID > GetVertexInstanceConnectedTriangleIDs(const FVertexInstanceID VertexInstanceID) const
Definition MeshDescription.h:617
MESHDESCRIPTION_API void ReversePolygonFacing(const FPolygonID PolygonID)
Definition MeshDescription.cpp:1936
bool IsTriangleValid(const FTriangleID TriangleID) const
Definition MeshDescription.h:355
int32 GetNumVertexInstanceConnectedTriangles(const FVertexInstanceID VertexInstanceID) const
Definition MeshDescription.h:629
void ReserveNewVertexInstances(const int32 NumVertexInstances)
Definition MeshDescription.h:233
void DeleteUV(const FUVID UVID, const int32 UVChannel=0)
Definition MeshDescription.h:282
MESHDESCRIPTION_API FEdgeID GetVertexPairEdge(const FVertexID VertexID0, const FVertexID VertexID1) const
Definition MeshDescription.cpp:1135
TArray< FVertexInstanceID > GetVertexVertexInstances(const FVertexID VertexID) const
Definition MeshDescription.h:469
FPolygonGroupID CreatePolygonGroup()
Definition MeshDescription.h:402
bool IsEdgeInternalToPolygon(const FEdgeID EdgeID, const FPolygonID PolygonID) const
Definition MeshDescription.h:681
MESHDESCRIPTION_API float GetTriangleCornerAngleForVertex(const FTriangleID TriangleID, const FVertexID VertexID) const
TAttributesSet< FVertexID > & VertexAttributes()
Definition MeshDescription.h:150
FPolygonGroupID GetTrianglePolygonGroup(const FTriangleID TriangleID) const
Definition MeshDescription.h:765
void GetEdgeConnectedPolygons(const FEdgeID EdgeID, TArray< FPolygonID, Alloc > &OutPolygonIDs) const
Definition MeshDescription.h:708
TAttributesSet< FVertexInstanceID > & VertexInstanceAttributes()
Definition MeshDescription.h:153
int32 GetNumVertexConnectedEdges(const FVertexID VertexID) const
Definition MeshDescription.h:457
FPolygonID GetTrianglePolygon(const FTriangleID TriangleID) const
Definition MeshDescription.h:759
void ResumeEdgeIndexing()
Definition MeshDescription.h:183
void SuspendPolygonGroupIndexing()
Definition MeshDescription.h:178
FPolygonArray & Polygons()
Definition MeshDescription.h:144
TVertexAttributesRef< FVector3f > GetVertexPositions()
Definition MeshDescription.h:594
MESHDESCRIPTION_API void SplitPolygon(FPolygonID PolygonID)
Definition MeshDescription.cpp:1554
TArray< FVertexID > GetVertexAdjacentVertices(const FVertexID VertexID) const
Definition MeshDescription.h:581
TArrayView< const FPolygonID > GetPolygonGroupPolygonIDs(const FPolygonGroupID PolygonGroupID) const
Definition MeshDescription.h:1168
FVertexID CreateVertex()
Definition MeshDescription.h:204
int32 GetNumEdgeConnectedPolygons(const FEdgeID EdgeID) const
Definition MeshDescription.h:735
TArray< FPolygonID, Alloc > GetEdgeConnectedPolygons(const FEdgeID EdgeID) const
Definition MeshDescription.h:719
MESHDESCRIPTION_API FMeshDescription()
Definition MeshDescription.cpp:37
MESHDESCRIPTION_API void DeleteTriangle(const FTriangleID TriangleID, TArray< FEdgeID > *InOutOrphanedEdgesPtr=nullptr, TArray< FVertexInstanceID > *InOutOrphanedVertexInstancesPtr=nullptr, TArray< FPolygonGroupID > *InOutOrphanedPolygonGroupsPtr=nullptr)
Definition MeshDescription.cpp:932
MESHDESCRIPTION_API void ComputePolygonTriangulation(const FPolygonID PolygonID)
Definition MeshDescription.cpp:1483
MESHDESCRIPTION_API void SetTriangleUVIndices(const FTriangleID TriangleID, TArrayView< const FUVID > UVIDs, int32 UVChannel=0)
Definition MeshDescription.cpp:843
TArrayView< const FVertexID > GetTriangleVertices(const FTriangleID TriangleID) const
Definition MeshDescription.h:803
MESHDESCRIPTION_API void DeletePolygon(const FPolygonID PolygonID, TArray< FEdgeID > *InOutOrphanedEdgesPtr=nullptr, TArray< FVertexInstanceID > *InOutOrphanedVertexInstancesPtr=nullptr, TArray< FPolygonGroupID > *InOutOrphanedPolygonGroupsPtr=nullptr)
Definition MeshDescription.cpp:1085
FVertexInstanceID GetVertexInstanceForTriangleVertex(const FTriangleID TriangleID, const FVertexID VertexID) const
Definition MeshDescription.h:868
static MESHDESCRIPTION_API FName PolygonsName
Definition MeshDescription.h:1283
void ReserveNewTriangles(const int32 NumTriangles)
Definition MeshDescription.h:326
void GetVertexConnectedTriangles(const FVertexID VertexID, TArray< FTriangleID, Alloc > &OutConnectedTriangleIDs) const
Definition MeshDescription.h:482
MESHDESCRIPTION_API FMeshDescription & operator=(const FMeshDescription &)
Definition MeshDescription.cpp:50
TArray< FVertexInstanceID, Alloc > GetPolygonVertexInstances(const FPolygonID PolygonID) const
Definition MeshDescription.h:929
void ResumeVertexIndexing()
Definition MeshDescription.h:181
int32 GetNumPolygonGroupPolygons(const FPolygonGroupID PolygonGroupID) const
Definition MeshDescription.h:1186
void GetVertexConnectedPolygons(const FVertexID VertexID, TArray< FPolygonID, Alloc > &OutConnectedPolygonIDs) const
Definition MeshDescription.h:520
int32 GetNumVertexVertexInstances(const FVertexID VertexID) const
Definition MeshDescription.h:475
TArrayView< const FVertexInstanceID > GetTriangleVertexInstances(const FTriangleID TriangleID) const
Definition MeshDescription.h:777
bool IsTrianglePartOfNgon(const FTriangleID TriangleID) const
Definition MeshDescription.h:771
MESHDESCRIPTION_API void DeleteVertexInstance(const FVertexInstanceID VertexInstanceID, TArray< FVertexID > *InOutOrphanedVerticesPtr=nullptr)
Definition MeshDescription.cpp:732
bool IsVertexInstanceValid(const FVertexInstanceID VertexInstanceID) const
Definition MeshDescription.h:257
int32 GetNumPolygonTriangles(const FPolygonID PolygonID) const
Definition MeshDescription.h:899
MESHDESCRIPTION_API void ReverseAllPolygonFacing()
Definition MeshDescription.cpp:1950
bool IsVertexValid(const FVertexID VertexID) const
Definition MeshDescription.h:227
void BuildPolygonGroupIndexers()
Definition MeshDescription.h:192
FVector3f GetVertexPosition(const FVertexID VertexID) const
Definition MeshDescription.h:589
TArray< FTriangleID > GetVertexInstanceConnectedTriangles(const FVertexInstanceID VertexInstanceID) const
Definition MeshDescription.h:623
FVertexInstanceID CreateVertexInstance(const FVertexID VertexID)
Definition MeshDescription.h:239
TArray< FTriangleID > GetTriangleAdjacentTriangles(const FTriangleID TriangleID) const
Definition MeshDescription.h:854
FPolygonGroupID GetPolygonPolygonGroup(const FPolygonID PolygonID) const
Definition MeshDescription.h:1112
void SuspendUVIndexing()
Definition MeshDescription.h:179
void BuildVertexIndexers()
Definition MeshDescription.h:188
TArray< FTriangleID > GetPolygonTriangleIDs(const FPolygonID PolygonID) const
Definition MeshDescription.h:893
void GetTriangleEdges(const FTriangleID TriangleID, TArrayView< FEdgeID > OutEdgeIDs) const
Definition MeshDescription.h:810
int32 GetNumVertexConnectedPolygons(const FVertexID VertexID) const
Definition MeshDescription.h:550
void ReserveNewPolygons(const int32 NumPolygons)
Definition MeshDescription.h:361
MESHDESCRIPTION_API void Compact(FElementIDRemappings &OutRemappings)
Definition MeshDescription.cpp:638
MESHDESCRIPTION_API void SetNumUVChannels(const int32 NumUVChannels)
Definition MeshDescription.cpp:1816
void CreateVertexInstanceWithID(const FVertexInstanceID VertexInstanceID, const FVertexID VertexID)
Definition MeshDescription.h:247
MESHDESCRIPTION_API void ReverseTriangleFacing(const FTriangleID TriangleID)
Definition MeshDescription.cpp:1925
void SuspendPolygonIndexing()
Definition MeshDescription.h:177
MESHDESCRIPTION_API void BuildIndexers()
Definition MeshDescription.cpp:577
MESHDESCRIPTION_API bool IsVertexOrphaned(const FVertexID VertexID) const
Definition MeshDescription.cpp:1119
static MESHDESCRIPTION_API FName EdgesName
Definition MeshDescription.h:1281
void CreatePolygonGroupWithID(const FPolygonGroupID PolygonGroupID)
Definition MeshDescription.h:409
void BuildVertexInstanceIndexers()
Definition MeshDescription.h:189
void GetPolygonVertexInstances(const FPolygonID PolygonID, TArray< FVertexInstanceID, Alloc > &OutVertexInstanceIDs) const
Definition MeshDescription.h:906
MESHDESCRIPTION_API void TriangulateMesh()
Definition MeshDescription.cpp:1806
TArray< FPolygonID, Alloc > GetVertexInstanceConnectedPolygons(const FVertexInstanceID VertexInstanceID) const
Definition MeshDescription.h:647
TArrayView< const FTriangleID > GetEdgeConnectedTriangleIDs(const FEdgeID EdgeID) const
Definition MeshDescription.h:690
const TAttributesSet< FPolygonID > & PolygonAttributes() const
Definition MeshDescription.h:166
void GetPolygonVertices(const FPolygonID PolygonID, TArray< FVertexID, Alloc > &OutVertexIDs) const
Definition MeshDescription.h:952
void CreatePolygonWithID(const FPolygonID PolygonID, const FPolygonGroupID PolygonGroupID, TArrayView< const FVertexInstanceID > VertexInstanceIDs, TArray< FEdgeID > *OutEdgeIDs=nullptr)
Definition MeshDescription.h:375
static MESHDESCRIPTION_API FName UVsName
Definition MeshDescription.h:1280
MESHDESCRIPTION_API void SetPolygonVertexInstances(const FPolygonID PolygonID, TArrayView< const FVertexInstanceID > VertexInstanceIDs)
Definition MeshDescription.cpp:1206
void CreateTriangleWithID(const FTriangleID TriangleID, const FPolygonGroupID PolygonGroupID, TArrayView< const FVertexInstanceID > VertexInstanceIDs, TArray< FEdgeID > *OutEdgeIDs=nullptr)
Definition MeshDescription.h:340
int32 GetNumVertexConnectedTriangles(const FVertexID VertexID) const
Definition MeshDescription.h:510
FEdgeArray & Edges()
Definition MeshDescription.h:135
int32 GetNumPolygonVertices(const FPolygonID PolygonID) const
Definition MeshDescription.h:944
TArray< FTriangleID > GetEdgeConnectedTriangles(const FEdgeID EdgeID) const
Definition MeshDescription.h:696
const FTriangleArray & Triangles() const
Definition MeshDescription.h:142
void ReserveNewEdges(const int32 NumEdges)
Definition MeshDescription.h:296
TArray< FPolygonID > GetPolygonGroupPolygons(const FPolygonGroupID PolygonGroupID) const
Definition MeshDescription.h:1174
TArray< FVertexID > GetPolygonVertices(const FPolygonID PolygonID) const
Definition MeshDescription.h:984
MESHDESCRIPTION_API void SerializeLegacy(FArchive &Ar)
Definition MeshDescription.cpp:422
TAttributesSet< FPolygonGroupID > & PolygonGroupAttributes()
Definition MeshDescription.h:168
TArray< FTriangleID > GetVertexConnectedTriangles(const FVertexID VertexID) const
Definition MeshDescription.h:502
void SuspendVertexIndexing()
Definition MeshDescription.h:174
MESHDESCRIPTION_API void Empty()
Definition MeshDescription.cpp:603
void GetPolygonPerimeterEdges(const FPolygonID PolygonID, TArray< FEdgeID, Alloc > &OutEdgeIDs) const
Definition MeshDescription.h:993
FVertexInstanceArray & VertexInstances()
Definition MeshDescription.h:132
void DeletePolygonGroup(const FPolygonGroupID PolygonGroupID)
Definition MeshDescription.h:415
void GetPolygonAdjacentPolygons(const FPolygonID PolygonID, TArray< FPolygonID, Alloc > &OutPolygonIDs) const
Definition MeshDescription.h:1079
TArray< FPolygonID > GetPolygonAdjacentPolygons(const FPolygonID PolygonID) const
Definition MeshDescription.h:1104
~FMeshDescription()=default
MESHDESCRIPTION_API FEdgeID GetVertexInstancePairEdge(const FVertexInstanceID VertexInstanceID0, const FVertexInstanceID VertexInstanceID1) const
Definition MeshDescription.cpp:1152
TAttributesSet< FEdgeID > & EdgeAttributes()
Definition MeshDescription.h:156
FMeshDescription & operator=(FMeshDescription &&)=default
void CreateVertexWithID(const FVertexID VertexID)
Definition MeshDescription.h:211
TAttributesSet< FPolygonID > & PolygonAttributes()
Definition MeshDescription.h:165
TArrayView< const FTriangleID > GetPolygonGroupTriangles(const FPolygonGroupID PolygonGroupID) const
Definition MeshDescription.h:1180
TArrayView< const FVertexID > GetEdgeVertices(const FEdgeID EdgeID) const
Definition MeshDescription.h:749
TMap< FName, FMeshElementTypeWrapper > & GetElements()
Definition MeshDescription.h:171
TArray< FVertexID, Alloc > GetPolygonVertices(const FPolygonID PolygonID) const
Definition MeshDescription.h:976
void DeleteVertex(const FVertexID VertexID)
Definition MeshDescription.h:217
bool IsUVValid(const FUVID UVID, const int32 UVChannel=0) const
Definition MeshDescription.h:290
const TAttributesSet< FVertexID > & VertexAttributes() const
Definition MeshDescription.h:151
MESHDESCRIPTION_API void RemapPolygonGroups(const TMap< FPolygonGroupID, FPolygonGroupID > &Remap)
Definition MeshDescription.cpp:1960
TArrayView< const FVertexInstanceID > GetVertexVertexInstanceIDs(const FVertexID VertexID) const
Definition MeshDescription.h:463
void SetPolygonPolygonGroup(const FPolygonID PolygonID, const FPolygonGroupID PolygonGroupID)
Definition MeshDescription.h:1132
MESHDESCRIPTION_API void Serialize(FArchive &Ar)
Definition MeshDescription.cpp:171
friend FArchive & operator<<(FArchive &Ar, FMeshDescription &MeshDescription)
Definition MeshDescription.h:106
FUVArray & UVs(int32 Index)
Definition MeshDescription.h:138
void GetVertexAdjacentVertices(const FVertexID VertexID, TArray< FVertexID, Alloc > &OutAdjacentVertexIDs) const
Definition MeshDescription.h:557
const TAttributesSet< FEdgeID > & EdgeAttributes() const
Definition MeshDescription.h:157
const TAttributesSet< FVertexInstanceID > & VertexInstanceAttributes() const
Definition MeshDescription.h:154
TArray< FPolygonID > GetVertexConnectedPolygons(const FVertexID VertexID) const
Definition MeshDescription.h:542
TArray< FPolygonID > GetVertexInstanceConnectedPolygons(const FVertexInstanceID VertexInstanceID) const
Definition MeshDescription.h:655
const TAttributesSet< FTriangleID > & TriangleAttributes() const
Definition MeshDescription.h:163
void GetPolygonInternalEdges(const FPolygonID PolygonID, TArray< FEdgeID, Alloc > &OutEdgeIDs) const
Definition MeshDescription.h:1035
TVertexAttributesRef< const FVector3f > GetVertexPositions() const
Definition MeshDescription.h:599
void ResumeVertexInstanceIndexing()
Definition MeshDescription.h:182
int32 GetNumEdgeConnectedTriangles(const FEdgeID EdgeID) const
Definition MeshDescription.h:701
MESHDESCRIPTION_API float GetPolygonCornerAngleForVertex(const FPolygonID PolygonID, const FVertexID VertexID) const
Definition MeshDescription.cpp:1869
void ReserveNewPolygonGroups(const int32 NumPolygonGroups)
Definition MeshDescription.h:396
MESHDESCRIPTION_API void ResetIndexers()
Definition MeshDescription.cpp:564
const FVertexArray & Vertices() const
Definition MeshDescription.h:130
TArrayView< const FTriangleID > GetPolygonTriangles(const FPolygonID PolygonID) const
Definition MeshDescription.h:887
MESHDESCRIPTION_API void TransferPolygonGroup(FPolygonGroupID SourceID, FPolygonGroupID DestinationID)
Definition MeshDescription.cpp:2012
void GetTriangleAdjacentTriangles(const FTriangleID TriangleID, TArray< FTriangleID, Alloc > &OutTriangleIDs) const
Definition MeshDescription.h:828
TArray< FPolygonID > GetEdgeConnectedPolygons(const FEdgeID EdgeID) const
Definition MeshDescription.h:727
int32 GetNumVertexInstanceConnectedPolygons(const FVertexInstanceID VertexInstanceID) const
Definition MeshDescription.h:663
static MESHDESCRIPTION_API FName VertexInstancesName
Definition MeshDescription.h:1279
const TMap< FName, FMeshElementTypeWrapper > & GetElements() const
Definition MeshDescription.h:172
MESHDESCRIPTION_API FBox ComputeBoundingBox() const
Definition MeshDescription.cpp:1912
const TAttributesSet< FPolygonGroupID > & PolygonGroupAttributes() const
Definition MeshDescription.h:169
FPolygonGroupArray & PolygonGroups()
Definition MeshDescription.h:147
const FUVArray & UVs(int32 Index) const
Definition MeshDescription.h:139
bool IsEdgeInternal(const FEdgeID EdgeID) const
Definition MeshDescription.h:673
void BuildEdgeIndexers()
Definition MeshDescription.h:190
TArray< FVertexInstanceID > GetPolygonVertexInstances(const FPolygonID PolygonID) const
Definition MeshDescription.h:936
const FVertexInstanceArray & VertexInstances() const
Definition MeshDescription.h:133
const TAttributesSet< FUVID > & UVAttributes(int32 Index) const
Definition MeshDescription.h:160
MESHDESCRIPTION_API bool NeedsCompact() const
Definition MeshDescription.cpp:625
TAttributesSet< FUVID > & UVAttributes(int32 Index)
Definition MeshDescription.h:159
int32 GetNumUVElementChannels() const
Definition MeshDescription.h:1216
void ResumeUVIndexing()
Definition MeshDescription.h:186
FVertexID GetEdgeVertex(const FEdgeID EdgeID, int32 VertexNumber) const
Definition MeshDescription.h:741
const FPolygonArray & Polygons() const
Definition MeshDescription.h:145
bool IsPolygonGroupValid(const FPolygonGroupID PolygonGroupID) const
Definition MeshDescription.h:424
TArrayView< const FEdgeID > GetVertexConnectedEdgeIDs(const FVertexID VertexID) const
Definition MeshDescription.h:445
MESHDESCRIPTION_API void SetPolygonVertexInstance(const FPolygonID PolygonID, const int32 PerimeterIndex, const FVertexInstanceID VertexInstanceID)
Definition MeshDescription.cpp:1171
TArray< FVertexID, Alloc > GetVertexAdjacentVertices(const FVertexID VertexID) const
Definition MeshDescription.h:573
TArray< FEdgeID > GetVertexConnectedEdges(const FVertexID VertexID) const
Definition MeshDescription.h:451
FUVID CreateUV(const int32 UVChannel=0)
Definition MeshDescription.h:269
MESHDESCRIPTION_API void Remap(const FElementIDRemappings &Remappings)
Definition MeshDescription.cpp:651
FVertexInstanceID GetTriangleVertexInstance(const FTriangleID TriangleID, const int32 Index) const
Definition MeshDescription.h:783
TArray< FPolygonID, Alloc > GetVertexConnectedPolygons(const FVertexID VertexID) const
Definition MeshDescription.h:534
MESHDESCRIPTION_API void DeleteTriangles(const TArray< FTriangleID > &Triangles)
Definition MeshDescription.cpp:937
bool IsEdgeValid(const FEdgeID EdgeID) const
Definition MeshDescription.h:320
FVertexArray & Vertices()
Definition MeshDescription.h:129
FMeshDescription(FMeshDescription &&)=default
FVertexID GetVertexInstanceVertex(const FVertexInstanceID VertexInstanceID) const
Definition MeshDescription.h:608
MESHDESCRIPTION_API FBoxSphereBounds GetBounds() const
Definition MeshDescription.cpp:1775
static MESHDESCRIPTION_API FName PolygonGroupsName
Definition MeshDescription.h:1284
FVertexInstanceID GetVertexInstanceForPolygonVertex(const FPolygonID PolygonID, const FVertexID VertexID) const
Definition MeshDescription.h:1118
void CreateEdgeWithID(const FEdgeID EdgeID, const FVertexID VertexID0, const FVertexID VertexID1)
Definition MeshDescription.h:310
bool IsPolygonValid(const FPolygonID PolygonID) const
Definition MeshDescription.h:390
void ResumePolygonIndexing()
Definition MeshDescription.h:184
void ResumePolygonGroupIndexing()
Definition MeshDescription.h:185
TArray< FEdgeID, Alloc > GetPolygonPerimeterEdges(const FPolygonID PolygonID) const
Definition MeshDescription.h:1017
TArray< FTriangleID, Alloc > GetVertexConnectedTriangles(const FVertexID VertexID) const
Definition MeshDescription.h:494
const FPolygonGroupArray & PolygonGroups() const
Definition MeshDescription.h:148
TArray< FEdgeID, Alloc > GetPolygonInternalEdges(const FPolygonID PolygonID) const
Definition MeshDescription.h:1056
MESHDESCRIPTION_API void FindPolygonPerimeter(TArrayView< const FTriangleID > Triangles, TArrayView< TTuple< int32, int32 > > Result) const
Definition MeshDescription.cpp:1387
static MESHDESCRIPTION_API FName TrianglesName
Definition MeshDescription.h:1282
FPolygonID CreatePolygon(const FPolygonGroupID PolygonGroupID, TArrayView< const FVertexInstanceID > VertexInstanceIDs, TArray< FEdgeID > *OutEdgeIDs=nullptr)
Definition MeshDescription.h:367
void GetVertexInstanceConnectedPolygons(const FVertexInstanceID VertexInstanceID, TArray< FPolygonID, Alloc > &OutPolygonIDs) const
Definition MeshDescription.h:636
int32 GetNumPolygonInternalEdges(const FPolygonID PolygonID) const
Definition MeshDescription.h:1072
MESHDESCRIPTION_API void DeleteEdge(const FEdgeID EdgeID, TArray< FVertexID > *InOutOrphanedVerticesPtr=nullptr)
Definition MeshDescription.cpp:779
TArray< FPolygonID, Alloc > GetPolygonAdjacentPolygons(const FPolygonID PolygonID) const
Definition MeshDescription.h:1096
const FEdgeArray & Edges() const
Definition MeshDescription.h:136
FTriangleID CreateTriangle(const FPolygonGroupID PolygonGroupID, TArrayView< const FVertexInstanceID > VertexInstanceIDs, TArray< FEdgeID > *OutEdgeIDs=nullptr)
Definition MeshDescription.h:332
TArrayView< FEdgeID > GetTriangleEdges(const FTriangleID TriangleID) const
Definition MeshDescription.h:821
void CreateUVWithID(const FUVID UVID, const int32 UVChannel=0)
Definition MeshDescription.h:276
MESHDESCRIPTION_API void RebuildIndexers()
Definition MeshDescription.cpp:590
void GetTriangleVertices(const FTriangleID TriangleID, TArrayView< FVertexID > OutVertexIDs) const
Definition MeshDescription.h:792
FTriangleArray & Triangles()
Definition MeshDescription.h:141
Definition ObjectVersion.h:762
Definition MeshTypes.h:236
Definition MeshTypes.h:266
Definition MeshTypes.h:206
Definition MeshTypes.h:180
Definition MeshTypes.h:90
Definition MeshTypes.h:120
Definition Tuple.h:652
Definition BoxSphereBounds.h:25