UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
Grid.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2#pragma once
3
4#include "Core/Chrono.h"
5#include "Geo/GeoEnum.h"
6#include "Geo/GeoPoint.h"
7#include "Math/Point.h"
8#include "Mesh/MeshEnum.h"
11#include "UI/Display.h"
12
13#ifdef CADKERNEL_DEV
14#include "UI/DefineForDebug.h"
15#endif
16
17
18namespace UE::CADKernel
19{
20
21struct FCuttingPoint;
22struct FCuttingGrid;
23
24class FIsoNode;
25class FIsoSegment;
26class FLoopNode;
27class FModelMesh;
28class FThinZone2DFinder;
29class FTopologicalFace;
30
31
32enum class ENodeMarker : uint8
33{
34 None = 0x00u, // No flags.
35
36 IsInside = 0x01u,
37 IsInsideButTooCloseToLoop = 0x02u, // node inside the loop but too close to the loop to be include in the mesh
38 IsCloseToLoop = 0x04u,
39
40 All = 0xFFu
41};
43
44
45class FGrid : public FGridBase
46{
47protected:
48
49 /*
50 * Cutting coordinates of the face respecting the meshing criteria
51 */
53
54 virtual const FCoordinateGrid& GetCoordinateGrid() const override
55 {
56 return CoordinateGrid;
57 }
58
60 const double MinimumElementSize;
61
63
64
69
74
79
81
86
88
94
95public:
96#ifdef CADKERNEL_DEV
98#endif
99
101
102#ifdef CADKERNEL_DEBUG
103 virtual ~FGrid()
104 {
105 Close3DDebugSession(bDisplay);
106 }
107#else
108 virtual ~FGrid() = default;
109#endif
110
111 // ======================================================================================================================================================================================================================
112 // Meshing tools =========================================================================================================================================================================================================
113 // ======================================================================================================================================================================================================================
114
121
127 bool GeneratePointCloud();
128
134 void ProcessPointCloud();
135
136protected:
137
143 void ScaleLoops();
144
148 void FindInnerFacePoints();
149
161
172
178
182 bool GetMeshOfLoops();
185
186 // Meshing tools =========================================================================================================================================================================================================
187 // ======================================================================================================================================================================================================================
188
193
197 bool CheckIf2DGridIsDegenerate() const;
198
199public:
200
201 // ======================================================================================================================================================================================================================
202 // GET Methodes =========================================================================================================================================================================================================
203 // ======================================================================================================================================================================================================================
204
205 constexpr const int32 GetCuttingCount(EIso Iso) const
206 {
207 return CuttingCount[Iso];
208 }
209
214 {
215 return CuttingSize;
216 }
217
218 const double GetTolerance(EIso Iso) const
219 {
220 return FaceTolerance[Iso];
221 }
222
230
235
244
253
259
268
273
277 const int32 InnerNodesCount() const
278 {
279 return CountOfInnerNodes;
280 }
281
289
294
299
305
310
315
320 {
322 }
323
328 {
329 return Normals[Index];
330 }
331
336
338 {
339 return CoordinateGrid;
340 }
341
346 {
347 return Normals;
348 }
349
351 {
352 return NodeIdsOfFaceLoops;
353 }
354
355 const FVector2d& GetLoop2DPoint(EGridSpace Space, int32 LoopIndex, int32 Index) const
356 {
357 return FaceLoops2D[(int32)Space][LoopIndex][Index];
358 }
359
361 {
362 FaceLoops2D[(int32)Space][LoopIndex][Index] = NewCoordinate;
363 }
364
365 const FVector& GetLoop3DPoint(int32 LoopIndex, int32 Index) const
366 {
367 return FaceLoops3D[LoopIndex][Index];
368 }
369
370 const int32 GetLoopCount() const
371 {
372 return FaceLoops2D[0].Num();
373 }
374
379 {
380 return FaceLoops2D[(int32)Space];
381 }
382
387 {
388 return FaceLoops3D;
389 }
390
395 {
396 return FaceLoops3D;
397 }
398
403 {
404 return NormalsOfFaceLoops;
405 }
406
415
419 double GetMinElementSize() const
420 {
421 return MinimumElementSize;
422 }
423
424 // ======================================================================================================================================================================================================================
425 // Display Methodes ================================================================================================================================================================================================
426 // ======================================================================================================================================================================================================================
427#ifdef CADKERNEL_DEV
428 void PrintTimeElapse() const;
429#endif
430
431#ifdef CADKERNEL_DEBUG
432
434 void DisplayIsoNode(EGridSpace Space, const FIsoNode& Node, FIdent Ident = 0, EVisuProperty Property = EVisuProperty::BluePoint) const;
436
437 void DisplayIsoNodes(const FString& Message, EGridSpace Space, const TArray<const FIsoNode*>& Nodes, EVisuProperty Property = EVisuProperty::BluePoint) const
438 {
439 if (!bDisplay)
440 {
441 return;
442 }
443 F3DDebugSession _(Message);
444 DisplayIsoNodes(Space, Nodes, Property);
445 }
446
447 void DisplayIsoPolyline(const FString& Message, EGridSpace Space, const TArray<const FIsoNode*>& Nodes, EVisuProperty Property = EVisuProperty::BluePoint) const
448 {
449 if (!bDisplay)
450 {
451 return;
452 }
453 F3DDebugSession _(Message);
454 const FIsoNode* LastNode = Nodes.Last();
455 for (const FIsoNode* Node : Nodes)
456 {
457 DisplayIsoSegment(Space, *LastNode, *Node, 0, (EVisuProperty)(Property + 1));
458 LastNode = Node;
459 }
460 DisplayIsoNodes(Space, Nodes, Property);
461 }
462
463 void DisplayIsoSegment(EGridSpace Space, const FIsoSegment& Segment, FIdent Ident = 0, EVisuProperty Property = EVisuProperty::BlueCurve, bool bDisplayOrientation = false) const;
464 void DisplayIsoSegment(EGridSpace Space, const FIsoNode& NodeA, const FIsoNode& NodeB, FIdent Ident = 0, EVisuProperty Property = EVisuProperty::BlueCurve) const;
465
467 void DisplayIsoSegments(const FString& Message, EGridSpace Space, const TArray<FIsoSegment*>& Segments, bool bDisplayNode = false, bool bDisplayOrientation = false, bool bSplitBySegment = false, EVisuProperty Property = EVisuProperty::BlueCurve) const
468 {
469 if (!bDisplay)
470 {
471 return;
472 }
473 F3DDebugSession _(Message);
475 }
476
477 void DisplayTriangle(EGridSpace Space, const FIsoNode& NodeA, const FIsoNode& NodeB, const FIsoNode& NodeC) const;
478 void DisplayTriangle3D(const FIsoNode& NodeA, const FIsoNode& NodeB, const FIsoNode& NodeC) const;
479
480 void DisplayGridPolyline(EGridSpace Space, const FLoopNode& StartNode, bool bDisplayNode, EVisuProperty Property = EVisuProperty::BlueCurve) const;
484 void DisplayGridPolyline(const FString& Message, EGridSpace Space, const TArray<FLoopNode*>& Nodes, bool bDisplayNode, EVisuProperty Property = EVisuProperty::BlueCurve) const
485 {
486 if (!bDisplay)
487 {
488 return;
489 }
490 F3DDebugSession _(Message);
492 }
493
494 void DisplayGridPolyline(const FString& Message, EGridSpace Space, const TArray<FLoopNode>& Nodes, bool bDisplayNode, EVisuProperty Property = EVisuProperty::BlueCurve) const
495 {
496 if (!bDisplay)
497 {
498 return;
499 }
500 F3DDebugSession _(Message);
502 }
503
504 void DisplayNodes(const TCHAR* Message, EGridSpace Space, const TArray<const FIsoNode*>& Nodes, EVisuProperty Property) const;
505
506 virtual void DisplayGridPoints(EGridSpace DisplaySpace) const override;
507 void DisplayInnerPoints(TCHAR* Message, EGridSpace DisplaySpace) const;
508
509 void DisplayGridNormal() const;
510
511 template<typename TPoint>
512 void DisplayInnerDomainPoints(FString Message, const TArray<TPoint>& Points) const
513 {
514 if (!bDisplay)
515 {
516 return;
517 }
518
519 F3DDebugSession _(Message);
520 for (int32 Index = 0; Index < Points.Num(); ++Index)
521 {
523 {
524 DisplayPoint2DWithScale(Points[Index], EVisuProperty::OrangePoint, Index);
525 }
527 {
528 DisplayPoint2DWithScale(Points[Index], EVisuProperty::BluePoint, Index);
529 }
530 else if (IsNodeTooCloseToLoop(Index))
531 {
532 DisplayPoint2DWithScale(Points[Index], EVisuProperty::RedPoint, Index);
533 }
534 else
535 {
537 }
538 }
539 }
540
541 template<typename TPoint>
542 void DisplayGridLoop(FString Message, const TArray<TPoint>& Loop, bool bDisplayNodes, bool bMakeGroup, bool bDisplaySegments) const
543 {
544 if (!bDisplay)
545 {
546 return;
547 }
548
549 F3DDebugSession _(bMakeGroup, Message);
550
551 const TPoint* FirstSegmentPoint = &Loop[0];
552 if (bDisplayNodes)
553 {
554 F3DDebugSession Q(bDisplaySegments, FString::Printf(TEXT("FirstNode")));
556 }
557
558 for (int32 Index = 1; Index < Loop.Num(); ++Index)
559 {
561 F3DDebugSession B(bDisplaySegments, FString::Printf(TEXT("Segment %d"), Index));
563 if (bDisplayNodes)
564 {
566 }
568 }
569
570 {
571 F3DDebugSession C(bDisplaySegments, FString::Printf(TEXT("Segment %d"), Loop.Num()));
573 }
574 }
575
576 template<typename TPoint>
577 void DisplayGridLoops(FString Message, const TArray<TArray<TPoint>>& Loops, bool bDisplayNodes, bool bMakeGroup, bool bDisplaySegments) const
578 {
579 if (!bDisplay)
580 {
581 return;
582 }
583
584 F3DDebugSession _(*Message);
585 int32 LoopIndex = 0;
586 for (const TArray<TPoint>& Loop : Loops)
587 {
588 FString LoopName = FString::Printf(TEXT("Loop %d"), LoopIndex++);
590 }
591 }
592
593 void DisplayGridLoops(FString Message, EGridSpace DisplaySpace, bool bDisplayNodes, bool bMakeGroup, bool bDisplaySegments) const
594 {
596 }
597
598#endif
599};
600
601}
#define TEXT(x)
Definition Platform.h:1272
FPlatformTypes::TCHAR TCHAR
Either ANSICHAR or WIDECHAR, depending on whether the platform supports wide characters or the requir...
Definition Platform.h:1135
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
uint32 FIdent
Definition Types.h:27
#define ENUM_CLASS_FLAGS(Enum)
Definition EnumClassFlags.h:6
uint8_t uint8
Definition binka_ue_file_header.h:8
Definition Array.h:670
UE_REWRITE SizeType Num() const
Definition Array.h:1144
UE_NODEBUG UE_FORCEINLINE_HINT ElementType & Last(SizeType IndexFromTheEnd=0) UE_LIFETIMEBOUND
Definition Array.h:1263
Definition GridBase.h:73
int32 CuttingSize
Definition GridBase.h:84
int32 CuttingCount[2]
Definition GridBase.h:83
TArray< FVector3f > Normals
Definition GridBase.h:101
int32 GobalIndex(int32 IndexU, int32 IndexV) const
Definition GridBase.h:241
FGridChronos Chronos
Definition GridBase.h:104
TArray< FVector2d > Points2D[EGridSpace::EndGridSpace]
Definition GridBase.h:91
Definition Grid.h:46
const bool IsNodeInsideAndMeshable(int32 Index) const
Definition Grid.h:226
bool GeneratePointCloud()
Definition Grid.cpp:192
int32 CountOfInnerNodes
Definition Grid.h:85
void SetInner2DPoint(EGridSpace Space, int32 Index, const FVector2d &NewCoordinate)
Definition Grid.h:311
const double MinimumElementSize
Definition Grid.h:60
const bool IsNodeInsideButTooCloseToLoop(int32 Index) const
Definition Grid.h:231
double MinOfMaxElementSize
Definition Grid.h:87
void GetMeshOfLoop(const FTopologicalLoop &Loop)
Definition Grid.cpp:717
void GetPreferredUVCuttingParametersFromLoops(FCuttingGrid &CuttingFromLoops)
Definition Grid.cpp:92
double GetMinElementSize() const
Definition Grid.h:419
const bool IsNodeCloseToLoop(int32 Index) const
Definition Grid.h:285
void ProcessPointCloud()
Definition Grid.cpp:27
TArray< FVector3f > & GetNormals()
Definition Grid.h:345
const bool IsNodeOutsideFace(int32 Index) const
Definition Grid.h:248
virtual const FCoordinateGrid & GetCoordinateGrid() const override
Definition Grid.h:54
const TArray< TArray< int32 > > & GetNodeIdsOfFaceLoops() const
Definition Grid.h:350
const TArray< TArray< FVector > > & GetLoops3D() const
Definition Grid.h:394
TArray< TArray< FVector > > FaceLoops3D
Definition Grid.h:73
void GetMeshOfThinZone(const FThinZone2D &ThinZone)
Definition Grid.cpp:930
void SetNodeInside(int32 Index)
Definition Grid.h:269
const FVector2d & GetLoop2DPoint(EGridSpace Space, int32 LoopIndex, int32 Index) const
Definition Grid.h:355
const FVector3f & GetPointNormal(int32 Index) const
Definition Grid.h:327
const int32 GetTotalCuttingCount() const
Definition Grid.h:213
const bool IsNodeInsideAndCloseToLoop(int32 Index) const
Definition Grid.h:254
TArray< TArray< int32 > > NodeIdsOfFaceLoops
Definition Grid.h:80
const int32 GetLoopCount() const
Definition Grid.h:370
FCoordinateGrid & CoordinateGrid
Definition Grid.h:52
virtual ~FGrid()=default
const TArray< TArray< FVector3f > > & GetLoopNormals() const
Definition Grid.h:402
const bool IsNodeTooCloseToLoop(int32 Index) const
Definition Grid.h:290
void DefineCuttingParameters()
Definition Grid.cpp:47
TArray< TArray< FVector2d > > FaceLoops2D[EGridSpace::EndGridSpace]
Definition Grid.h:68
void ResetInsideLoop(int32 Index)
Definition Grid.h:306
constexpr const int32 GetCuttingCount(EIso Iso) const
Definition Grid.h:205
void FindPointsCloseToLoop()
Definition Grid.cpp:215
const TArray< TArray< FVector2d > > & GetLoops2D(EGridSpace Space) const
Definition Grid.h:378
void SetLoop2DPoint(EGridSpace Space, int32 LoopIndex, int32 Index, const FVector2d &NewCoordinate)
Definition Grid.h:360
const bool IsNodeOusideFaceButClose(int32 Index) const
Definition Grid.h:263
const FCoordinateGrid & GetCuttingCoordinates() const
Definition Grid.h:337
void ScaleLoops()
Definition Grid.cpp:1151
void RemovePointsCloseToLoop()
Definition Grid.cpp:446
const FVector & GetLoop3DPoint(int32 LoopIndex, int32 Index) const
Definition Grid.h:365
void UVIndexFromGlobalIndex(int32 GLobalIndex, int32 &OutIndexU, int32 &OutIndexV) const
Definition Grid.h:410
const TArray< double > & GetCuttingCoordinatesAlongIso(EIso Iso) const
Definition Grid.h:332
const double GetTolerance(EIso Iso) const
Definition Grid.h:218
TArray< ENodeMarker > NodeMarkers
Definition Grid.h:93
FModelMesh & MeshModel
Definition Grid.h:62
void SetTooCloseToLoop(int32 Index)
Definition Grid.h:300
bool GetMeshOfLoops()
Definition Grid.cpp:1081
TArray< TArray< FVector3f > > NormalsOfFaceLoops
Definition Grid.h:78
bool CheckIfExternalLoopIsDegenerate() const
Definition Grid.cpp:1527
bool CheckIf2DGridIsDegenerate() const
Definition Grid.cpp:1187
const bool IsNodeFarFromFace(int32 Index) const
Definition Grid.h:239
void FindInnerFacePoints()
Definition Grid.cpp:1211
const FSurfacicTolerance FaceTolerance
Definition Grid.h:59
void SetCloseToLoop(int32 Index)
Definition Grid.h:295
TArray< TArray< FVector > > & GetLoops3D()
Definition Grid.h:386
const int32 InnerNodesCount() const
Definition Grid.h:277
const FVector3f & GetPointNormal(int32 IndexU, int32 IndexV) const
Definition Grid.h:319
Definition IsoNode.h:62
Definition ModelMesh.h:21
Definition ThinZone2D.h:157
Definition TopologicalFace.h:56
Definition TopologicalLoop.h:60
Definition CADEntity.cpp:23
ENodeMarker
Definition Grid.h:33
void DisplaySegment(const FVector &Point1, const FVector &Point2, FIdent Ident, EVisuProperty Property)
Definition Display.cpp:1268
EGridSpace
Definition MeshEnum.h:17
@ EndGridSpace
Definition MeshEnum.h:21
void DisplayPoint(const TPoint &Point, FIdent Ident)
Definition Display.h:145
void Close3DDebugSession(bool bIsDisplayed=true)
Definition Display.h:58
EIso
Definition GeoEnum.h:66
@ IsoU
Definition GeoEnum.h:67
EVisuProperty
Definition Visu.h:15
@ RedPoint
Definition Visu.h:32
@ BluePoint
Definition Visu.h:30
@ GreenPoint
Definition Visu.h:36
@ OrangePoint
Definition Visu.h:40
@ YellowPoint
Definition Visu.h:28
@ BlueCurve
Definition Visu.h:31
@ Iso
Definition Visu.h:20
U16 Index
Definition radfft.cpp:71
Definition GeoPoint.h:103
Definition TopologicalEdge.h:1007
Definition GridBase.h:31