4#include "Core/Factory.h"
12#include "UI/DefineForDebug.h"
19class FIntersectionSegmentTool;
21class FIsoTriangulator;
68 return (
Nodes[0] ? 1 : 0) + (
Nodes[1] ? 1 : 0);
136 bool bFirstRun =
true;
139 int32 SubCycleNodeCount = 0;
143 double MeanSquareLength = 0;
144 bool bAcuteTriangle =
false;
146 int32 IntersectionCountAllowed = 0;
147 int32 MaxIntersectionCounted = 0;
149 int32 FirstSideStartIndex = -1;
150 int32 FirstSideEndIndex = -1;
151 int32 TriangleThirdIndex = -1;
158 FCandidateNode* ExtremityCandidateNodes[2] = {
nullptr,
nullptr };
165 bool bNeedIntersectionToolUpdate =
true;
176 bool CanCycleBeMeshed();
179 void InitializeArrays();
181 void InitializeCycleForMeshing();
182 void FillSegmentStack();
188 return (
Index + 1) == SubCycleNodeCount ? 0 :
Index + 1;
193 return Index == 0 ? SubCycleNodeCount - 1 :
Index - 1;
202 bool FindTheBestAcuteTriangle();
208 bool FindCandidateNodes(
int32 StartIndex);
210 bool FindTheBestCandidateNode();
212 bool BuildTheBestPolygonFromTheSelectedTriangle();
215 void ValidateAddNodesAccordingSlopeWithSide(
FAdditionalIso& Side);
219 void ValidateComplementaryNodesWithInsideAndIntersectionsCriteria(
FAdditionalIso& Side);
224 void ComputeSideCandidateEquilateralCriteria(
FAdditionalIso& Side);
238 void SortCycleIntersectionToolIfNeeded();
242 for (
int32 IndexA = 0; IndexA < Nodes.
Num() - 1; ++IndexA)
244 for (
int32 IndexB = IndexA + 1; IndexB < Nodes.
Num() - 1; ++IndexB)
246 if (InnerToOuterIsoSegmentsIntersectionTool.
DoesIntersect(*Nodes[IndexA], *Nodes[IndexB]))
255 int32 CountIntersectionWithIso()
257 FirstSideStartNode = SubCycleNodes[FirstSideStartIndex];
258 FirstSideEndNode = SubCycleNodes[FirstSideEndIndex];
260 NodeToIntersection.
Reserve(CandidateNodes.
Num());
293enum ETriangleOfPentagon :
uint8
309constexpr uint8 TrianglesOfPentagon[10][3] = { { 0, 1, 2 }, { 0, 1, 3 }, { 0, 1, 4 }, { 0, 2, 3 }, { 0, 2, 4 }, { 0, 3, 4 }, { 1, 2, 3 }, { 1, 2, 4 }, { 1, 3, 4 }, { 2, 3, 4 } };
312enum class EPentagon :
uint8
315 P012_023_034 = 0x01u,
316 P012_024_234 = 0x02u,
317 P012_023_034_or_P012_024_234 = 0x03u,
318 P013_034_123 = 0x04u,
319 P012_023_034_or_P013_034_123 = 0x05u,
320 P014_123_134 = 0x08u,
321 P013_034_123_or_P014_123_134 = 0x0Cu,
322 P014_124_234 = 0x10u,
323 P012_024_234_or_P014_124_234 = 0x12u,
324 P014_123_134_or_P014_124_234 = 0x18u,
330constexpr EPentagon TriangleToPentagon[10] = {
331 EPentagon::P012_023_034_or_P012_024_234,
332 EPentagon::P013_034_123,
333 EPentagon::P014_123_134_or_P014_124_234,
334 EPentagon::P012_023_034,
335 EPentagon::P012_024_234,
336 EPentagon::P012_023_034_or_P013_034_123,
337 EPentagon::P013_034_123_or_P014_123_134,
338 EPentagon::P014_124_234,
339 EPentagon::P014_123_134,
340 EPentagon::P012_024_234_or_P014_124_234
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
UE_REWRITE SizeType Num() const
Definition Array.h:1144
UE_FORCEINLINE_HINT SizeType Emplace(ArgsType &&... Args)
Definition Array.h:2561
UE_NODEBUG UE_FORCEINLINE_HINT SizeType Add(ElementType &&Item)
Definition Array.h:2696
UE_FORCEINLINE_HINT void Reserve(SizeType Number)
Definition Array.h:3016
Definition AndroidPlatformMisc.h:14
Definition CycleTriangulator.h:116
bool MeshCycle()
Definition CycleTriangulator.cpp:32
Definition IsoSegment.h:52
Definition IsoTriangulator.h:79
@ None
Definition EnvQueryTypes.h:117
@ All
Definition LogVerbosity.h:56
void MeshQuadrilateral(const FGrid &Grid, FIsoNode **Nodes, FFaceMesh &Mesh)
Definition CycleTriangulator.cpp:1398
void MeshTriangle(const FGrid &Grid, FIsoNode **Nodes, FFaceMesh &Mesh)
Definition CycleTriangulator.cpp:1386
void MeshPentagon(const FGrid &Grid, FIsoNode **Nodes, FFaceMesh &Mesh)
Definition CycleTriangulator.cpp:1448
constexpr double TwoPiSlope
Definition SlopeUtils.h:81
Definition CADEntity.cpp:23
double ClockwiseSlope(const FVector2d &StartPoint, const FVector2d &EndPoint, double ReferenceSlope)
Definition SlopeUtils.h:306
TFunction< double(const FVector2d &, const FVector2d &, double)> SlopeMethod
Definition CycleTriangulator.h:23
EGridSpace
Definition MeshEnum.h:17
@ UniformScaled
Definition MeshEnum.h:20
double CounterClockwiseSlope(const FVector2d &StartPoint, const FVector2d &EndPoint, double ReferenceSlope)
Definition SlopeUtils.h:311
@ End
Definition GeoEnum.h:101
@ Start
Definition GeoEnum.h:100
TFunction< int32(int32)> NextIndexMethod
Definition CycleTriangulator.h:24
@ false
Definition radaudio_common.h:23
U16 Index
Definition radfft.cpp:71
Definition CycleTriangulator.h:45
double EquilateralCriteria[2]
Definition CycleTriangulator.h:55
int32 EndIndex
Definition CycleTriangulator.h:49
FAdditionalIso(int32 InStartIndex, int32 InEndIndex, FIsoNode *InStartNode, FIsoNode *InEndNode)
Definition CycleTriangulator.h:59
void AddTo(TArray< FIsoNode * > &PolygonNodes)
Definition CycleTriangulator.h:71
FIsoNode * Nodes[2]
Definition CycleTriangulator.h:53
void RemoveCandidate(int32 Index)
Definition CycleTriangulator.h:82
int32 NodeIndices[2]
Definition CycleTriangulator.h:52
int32 CandidateNodeCount()
Definition CycleTriangulator.h:66
int32 StartIndex
Definition CycleTriangulator.h:46
FIsoNode * StartNode
Definition CycleTriangulator.h:47
void Reset()
Definition CycleTriangulator.h:89
void RemoveCandidateIfPresent(FIsoNode *ForbiddenNode)
Definition CycleTriangulator.h:100
bool bForceNodes
Definition CycleTriangulator.h:57
FIsoNode * EndNode
Definition CycleTriangulator.h:50
Definition CycleTriangulator.h:27
FCandidateNode(FIsoNode *InNode, double InSlopeAtStartNode, double InSlopeAtEndNode, int32 InIndex)
Definition CycleTriangulator.h:35
double SlopeAtStartNode
Definition CycleTriangulator.h:29
int32 Index
Definition CycleTriangulator.h:31
FIsoNode * Node
Definition CycleTriangulator.h:28
bool bIsValid
Definition CycleTriangulator.h:32
double SlopeAtEndNode
Definition CycleTriangulator.h:30