UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
Surface.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2#pragma once
3
5#include "Core/CADEntity.h"
6#include "Core/EntityGeom.h"
7#include "Core/Types.h"
8#include "Geo/GeoEnum.h"
9#include "Geo/GeoPoint.h"
10#include "Math/Boundary.h"
11#include "Math/MatrixH.h"
12#include "Math/Point.h"
13#include "Utils/Cache.h"
14
15namespace UE::CADKernel
16{
17class FGrid;
18class FInfoEntity;
19class FSurfacicPolyline;
20struct FCurvePoint2D;
21struct FCurvePoint;
22struct FSurfacicSampling;
23struct FNurbsSurfaceData;
24struct FNurbsSurfaceHomogeneousData;
25
27{
28 friend FEntity;
29
30protected:
31
34
43
44private:
45
46 virtual void InitBoundary()
47 {
48 Boundary.Set();
49 }
50
51protected:
52
53 FSurface() = default;
54
56 : FEntityGeom()
57 , Tolerance3D(InToleranceGeometric)
58 {
59
60 }
61
63 : FEntityGeom()
64 , Boundary(InBoundary)
65 , Tolerance3D(InToleranceGeometric)
66 {
67 Boundary.IsValid();
68 }
69
70 FSurface(double InToleranceGeometric, double UMin, double UMax, double VMin, double VMax)
71 : FEntityGeom()
72 , Tolerance3D(InToleranceGeometric)
73 {
74 Boundary.Set(UMin, UMax, VMin, VMax);
75 }
76
78 {
79 MinToleranceIso.Set(Boundary[EIso::IsoU].ComputeMinimalTolerance(), Boundary[EIso::IsoV].ComputeMinimalTolerance());
80 }
81
82public:
83
84 static TSharedPtr<FSurface> MakeBezierSurface(const double InToleranceGeometric, int32 InUDegre, int32 InVDegre, const TArray<FVector>& InPoles);
85 static TSharedPtr<FSurface> MakeConeSurface(const double InToleranceGeometric, const FMatrixH& InMatrix, double InStartRadius, double InConeAngle, const FSurfacicBoundary& InBoundary);
86 static TSharedPtr<FSurface> MakeCylinderSurface(const double InToleranceGeometric, const FMatrixH& InMatrix, const double InRadius, const FSurfacicBoundary& InBoundary);
87 static TSharedPtr<FSurface> MakeNurbsSurface(const double InToleranceGeometric, const FNurbsSurfaceData& NurbsData);
88 static TSharedPtr<FSurface> MakeNurbsSurface(const double InToleranceGeometric, const FNurbsSurfaceHomogeneousData& NurbsData);
89 static TSharedPtr<FSurface> MakePlaneSurface(const double InToleranceGeometric, const FMatrixH& InMatrix, const FSurfacicBoundary& InBoundary);
90 static TSharedPtr<FSurface> MakeSphericalSurface(const double InToleranceGeometric, const FMatrixH& InMatrix, double InRadius, const FSurfacicBoundary& InBoundary);
91 static TSharedPtr<FSurface> MakeTorusSurface(const double InToleranceGeometric, const FMatrixH& InMatrix, double InMajorRadius, double InMinorRadius, const FSurfacicBoundary& InBoundary);
92
94
95 virtual void Serialize(FCADKernelArchive& Ar) override
96 {
97 // Surface's type is serialize because it is used to instantiate the correct entity on de-serialization (@see Deserialize(FCADKernelArchive& Archive))
98 if (Ar.IsSaving())
99 {
100 ESurface SurfaceType = GetSurfaceType();
101 Ar << SurfaceType;
102 }
103 FEntityGeom::Serialize(Ar);
104
105 Ar << Tolerance3D;
106 Ar << MinToleranceIso;
107 Ar << Boundary;
108 }
109
113 static TSharedPtr<FSurface> Deserialize(FCADKernelArchive& Archive);
114
115 virtual ~FSurface() = default;
116
117#ifdef CADKERNEL_DEV
118 virtual FInfoEntity& GetInfo(FInfoEntity&) const override;
119#endif
120
121 virtual EEntity GetEntityType() const override
122 {
123 return EEntity::Surface;
124 }
125
126 virtual ESurface GetSurfaceType() const = 0;
127
129 {
130 ensureCADKernel(Boundary.IsValid());
131 return Boundary;
132 };
133
135 {
136 Boundary.TrimAt(NewLimit);
137 }
138
140 {
141 Boundary.ExtendTo(MaxLimit);
142 }
143
145
154 {
155 ensureCADKernel(MinToleranceIso.IsValid());
156 return *MinToleranceIso;
157 }
158
164 double GetIsoTolerance(EIso Iso) const
165 {
166 ensureCADKernel(MinToleranceIso.IsValid());
167 return (*MinToleranceIso)[Iso];
168 }
169
170 double Get3DTolerance() const
171 {
172 return Tolerance3D;
173 }
174
175
177
181 virtual void EvaluatePoints(FSurfacicPolyline& Polyline) const;
182 virtual void EvaluatePoints(const TArray<FCurvePoint2D>& Points2D, FSurfacicPolyline& Polyline) const;
183
196 virtual void EvaluatePointGridInCylindricalSpace(const FCoordinateGrid& Coordinates, TArray<FVector2d>&) const { ; }
197
198 virtual void EvaluatePointGrid(const FCoordinateGrid& Coordinates, FSurfacicSampling& OutPoints, bool bComputeNormals = false) const;
199 void EvaluateGrid(FGrid& Grid) const;
200
201 virtual void EvaluateNormals(const TArray<FVector2d>& Points2D, TArray<FVector3f>& Normals) const;
202
204 {
205 int32 DerivativeOrder = 1;
207 EvaluatePoint(InPoint2D, SurfacicPoint, DerivativeOrder);
208
209 Point = SurfacicPoint.Point;
210
211 FVector NormalD = SurfacicPoint.GradientU ^ SurfacicPoint.GradientV;
213 }
214
216 {
217 int32 DerivativeOrder = 1;
219 EvaluatePoint(InPoint2D, Point3D, DerivativeOrder);
220
221 FVector Normal = Point3D.GradientU ^ Point3D.GradientV;
223 return Normal;
224 }
225
230
235
240 virtual void Presample(const FSurfacicBoundary& InBoundaries, FCoordinateGrid& OutCoordinates);
241
246
251
257 virtual void IsSurfaceClosed(bool& bOutClosedAlongU, bool& bOutClosedAlongV) const
258 {
259 bOutClosedAlongU = false;
260 bOutClosedAlongV = false;
261 }
262
264 {
265 constexpr double SixOverPi = 6 / DOUBLE_PI;
266 double Delta = InBoundaries.Length(Iso);
267 int32 SampleCount = /*FMath::Max(3, */ (int32)(Delta * SixOverPi + 1)/*)*/;
268 Delta /= SampleCount;
269
270 Coordinates[Iso].Empty(SampleCount + 1);
271 double Sample = InBoundaries[Iso].GetMin();
272 for (int32 Index = 0; Index <= SampleCount; ++Index)
273 {
274 Coordinates[Iso].Add(Sample);
275 Sample += Delta;
276 }
277 }
278
287 {
288 FVector Point = InMatrix.Multiply(InAxis);
290 return Length;
291 };
292
293
294};
295} // namespace UE::CADKernel
296
@ Normal
Definition AndroidInputInterface.h:116
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 ensureCADKernel(InExpression)
Definition Types.h:115
UE::Math::TVector< float > FVector3f
Definition MathFwd.h:73
#define DOUBLE_PI
Definition UnrealMathUtility.h:71
Definition Array.h:670
Definition SharedPointer.h:692
Definition CADKernelArchive.h:19
bool IsSaving() const
Definition CADKernelArchive.h:113
Definition EntityGeom.h:15
Definition CADEntity.h:56
Definition Grid.h:46
Definition MatrixH.h:14
Definition Surface.h:27
const FSurfacicBoundary & GetBoundary() const
Definition Surface.h:128
virtual void EvaluatePointAndNormal(const FVector2d &InPoint2D, FVector &Point, FVector3f &Normal) const
Definition Surface.h:203
FSurfacicBoundary Boundary
Definition Surface.h:32
static double ComputeScaleAlongAxis(const FVector &InAxis, const FMatrixH &InMatrix, const FVector &InOrigin)
Definition Surface.h:286
FSurface(double InToleranceGeometric, double UMin, double UMax, double VMin, double VMax)
Definition Surface.h:70
void TrimBoundaryTo(const FSurfacicBoundary NewLimit)
Definition Surface.h:134
FSurface(double InToleranceGeometric)
Definition Surface.h:55
virtual void ValidateUVPoints(TArray< FVector2d > &UVPoints) const
Definition Surface.h:93
void ComputeDefaultMinToleranceIso()
Definition Surface.h:77
virtual void EvaluatePoint(const FVector2d &InSurfacicCoordinate, FSurfacicPoint &OutPoint3D, int32 InDerivativeOrder=0) const =0
virtual FVector EvaluateNormal(const FVector2d &InPoint2D) const
Definition Surface.h:215
virtual void EvaluatePointGridInCylindricalSpace(const FCoordinateGrid &Coordinates, TArray< FVector2d > &) const
Definition Surface.h:196
const FSurfacicTolerance & GetIsoTolerances() const
Definition Surface.h:153
virtual ESurface GetSurfaceType() const =0
virtual void LinesNotDerivables(const FSurfacicBoundary &Bounds, int32 InDerivativeOrder, FCoordinateGrid &OutNotDerivableCoordinates) const
Definition Surface.h:242
virtual void IsSurfaceClosed(bool &bOutClosedAlongU, bool &bOutClosedAlongV) const
Definition Surface.h:257
void LinesNotDerivables(int32 InDerivativeOrder, FCoordinateGrid &OutNotDerivableCoordinates) const
Definition Surface.h:247
double Get3DTolerance() const
Definition Surface.h:170
virtual TSharedPtr< FEntityGeom > ApplyMatrix(const FMatrixH &InMatrix) const =0
double Tolerance3D
Definition Surface.h:33
double GetIsoTolerance(EIso Iso) const
Definition Surface.h:164
void PresampleIsoCircle(const FSurfacicBoundary &InBoundaries, FCoordinateGrid &Coordinates, EIso Iso)
Definition Surface.h:263
virtual EEntity GetEntityType() const override
Definition Surface.h:121
TCache< FSurfacicTolerance > MinToleranceIso
Definition Surface.h:42
void ExtendBoundaryTo(const FSurfacicBoundary MaxLimit)
Definition Surface.h:139
virtual void Serialize(FCADKernelArchive &Ar) override
Definition Surface.h:95
FSurface(double InToleranceGeometric, const FSurfacicBoundary &InBoundary)
Definition Surface.h:62
virtual FVector2d EvaluatePointInCylindricalSpace(const FVector2d &InSurfacicCoordinate) const
Definition Surface.h:195
virtual ~FSurface()=default
Definition Boundary.h:248
bool IsValid() const
Definition Boundary.h:330
void ExtendTo(const FSurfacicBoundary &MaxLimit)
Definition Boundary.h:390
void Set(const FVector2d &Point1, const FVector2d &Point2)
Definition Boundary.h:282
void TrimAt(const FSurfacicBoundary &MaxLimit)
Definition Boundary.h:384
Definition SurfacicPolyline.h:30
Definition Cache.h:12
bool IsValid() const
Definition Cache.h:83
void Set(const ObjectType &NewValue)
Definition Cache.h:38
Definition CADEntity.cpp:23
ESurface
Definition GeoEnum.h:34
EIso
Definition GeoEnum.h:66
@ Iso
Definition Visu.h:20
EEntity
Definition CADEntity.h:18
U16 Index
Definition radfft.cpp:71
Definition GeoPoint.h:103
Definition NurbsSurfaceData.h:27
Definition NurbsSurfaceData.h:11
Definition GeoPoint.h:19
Definition SurfacicSampling.h:14
static CORE_API const TVector2< double > ZeroVector
Definition Vector2D.h:63
bool Normalize(T Tolerance=UE_SMALL_NUMBER)
Definition Vector.h:1767
static UE_FORCEINLINE_HINT double Distance(const TVector< double > &V1, const TVector< double > &V2)
Definition Vector.h:1018
TVector< T > GetSafeNormal(T Tolerance=UE_SMALL_NUMBER, const TVector< T > &ResultIfZero=ZeroVector) const
Definition Vector.h:2060