18template<
typename VALUETYPE>
79 Result.Reparameterize(EParameterizationPolicy::Uniform);
89 int32 NumSegments = 4)
92 if (EndAngle < StartAngle)
94 float Temp = StartAngle;
95 StartAngle = EndAngle;
100 NumSegments = FMath::Max(1, NumSegments);
115 Points.
SetNum(NumSegments + 1);
117 for (
int32 i = 0; i <= NumSegments; i++)
121 Radius * FMath::Cos(
Angle),
122 Radius * FMath::Sin(
Angle),
150 for (
int32 i = 1; i < NumSegments; i++)
165 Result.AppendBezierSegment(P1, P2, P3);
175 int32 NumSegments = 4)
178 NumSegments = FMath::Max(4, NumSegments);
185 Result.SetClosedLoop(
true);
187 Result.Reparameterize(EParameterizationPolicy::Centripetal);
196 int32 NumSegments = 4)
199 if (NumSegments < 4) NumSegments = 4;
230 for (
int32 i = 1; i < NumSegments; ++i)
249 Result.AppendBezierSegment(P1, P2, P3);
253 Result.SetClosedLoop(
true);
256 Result.Reparameterize(EParameterizationPolicy::Centripetal);
282 if (!IsValidSegmentIndex(SegmentIndex))
290 const int32 BaseIndex = SegmentIndex * 4;
299 Coeffs[0] = P0 -
Point;
300 Coeffs[1] = (P1 - P0) * 3;
301 Coeffs[2] = (P2 - P1*2 + P0) * 3;
302 Coeffs[3] = P3 - P2*3 + P1*3 - P0;
314 for (
int32 i = 0; i < NumSegments; ++i)
340 template<
int32 Order>
349 if constexpr (Order == 0)
351 return InterpolateWindow(
Window, Parameter);
383 const int32 NumPoints = Points.
Num();
388 UE_LOG(
LogSpline,
Warning,
TEXT(
"SetControlPoints requires at least 4 points to add a valid segment. Got %d points."), NumPoints);
401 int32 NumSegments = (NumPoints) / 4;
411 for (
int32 SegmentIndex = 0; SegmentIndex < NumSegments; ++SegmentIndex)
413 const int32 BaseIndex = SegmentIndex * 4;
416 if (BaseIndex + 3 >= NumPoints)
428 if (SegmentIndex == 0)
510 const int32 NumPoints = Points.
Num();
515 UE_LOG(
LogSpline,
Warning,
TEXT(
"AddBezierSegments requires at least 4 points to add a valid segment. Got %d points."), NumPoints);
529 if (NumPoints % 3 != 1)
538 if (NumPoints % 3 != 1)
585 const int32 BaseIndex = 1 + SegmentIndex * 3;
589 const ValueType& P2 = Points[BaseIndex + 1];
590 const ValueType& P3 = Points[BaseIndex + 2];
606 const int32 BaseIndex = i * 3;
610 const ValueType& P1 = Points[BaseIndex + 1];
611 const ValueType& P2 = Points[BaseIndex + 2];
688 return AddBezierSegmentInternal(0, P0, P1, P2, P3,
707 float SquaredDistance;
708 float LocalT = FindLocalParameterNearestToPosition(SegmentIndex,
Position, SquaredDistance);
733 if (NumSegments == 0)
741 SegmentIndex =
FMath::Clamp(SegmentIndex, 0, NumSegments - 1);
783 const int32 BaseIndex = SegmentIndex * 4;
804 const float mt = 1.0f - t;
830 for (
int32 i = 0; i < 4; ++i)
939 const int32 BaseIndex = SegmentIndex * 4;
944 for (
int32 i = 3; i >= 0; --i)
960 for (
int32 i = 3; i >= 0; --i)
982 for (
int32 i = 0; i < 4; ++i)
1002 const int32 SegmentIndex,
1040 const int32 BaseIndex = SegmentIndex * 4;
1084 const int32 NumValues = Points.
Num();
1086 GenerateDistanceKnotsForBezier(Mode);
1110 if (SegmentIndex >= NumSegments)
1115 return Range.Interpolate(T);
1269 if (
Segment != NumSegments - 1)
1296 for (
int32 i = 0; i < NumSegments; ++i)
1301 if (i == NumSegments - 1 && Parameter ==
End)
1307 if (Parameter >= Start && Parameter <
End)
1342 if (NumSegments >= 1)
1354 ValueType P2 = FirstPoint - Direction * 0.33f;
1365 if (NumSegments > 0)
1428 SegmentIndex = LastEvaluatedSegment;
1462 LastEvaluatedSegment = SegmentIndex;
1496 int32 NumSegments = NumValues / 4;
1499 if (NumSegments == 0)
1503 return 4 + (NumSegments - 1) * 3 + 4;
1524 int NumSegments = Points.
Num() / 4;
1529 for (
int32 i = 0; i < NumSegments; ++i)
1531 const int32 StartIndex = i * 4;
1532 const int32 EndIndex = StartIndex + 3;
1534 if (EndIndex < Points.
Num())
1536 SegmentLengths.Add(ComputeSegmentLength(Points[StartIndex], Points[EndIndex], Mode));
1551 if (Result !=
Val)
return Result;
1556 :
UE::Geometry::Spline::Param::EDir::
Left);
1571 for (
int32 i = 0; i < NumSegments - 1; ++i)
1595 virtual FWindow FindWindow(
float Parameter)
const override
1613 SegmentIndex = SegmentIndex % NumSegments;
1614 if (SegmentIndex < 0) SegmentIndex += NumSegments;
1618 const int32 BaseIndex = SegmentIndex * 4;
1623 const int32 NumPoints = Entries.
Num();
1626 return ((
Index % NumPoints) + NumPoints) % NumPoints;
1637 if (BaseIndex + 3 >= Entries.
Num())
1645 Window[Idx] = &Entries[BaseIndex + Idx];
1666 const float t2 = t * t;
1670 const float Basis[4] =
1689 float FindLocalParameterNearestToPosition(
1709 if (SegmentLength == 0.f)
1733 bool InitializeFirstSegment(
1793 check (NewIndex == 0);
1839 float ComputeSegmentLength(
1846 case EParameterizationPolicy::ChordLength:
1848 case EParameterizationPolicy::Centripetal:
1850 case EParameterizationPolicy::Uniform:
1859 void ApplyInternalKnotsMultiplicity()
1868 int32 AddBezierSegmentInternal(
1878 SegmentIndex =
FMath::Clamp(SegmentIndex, 0, NumSegments);
1895 if (NumSegments == 0)
1901 else if (bAppendToEnd)
1909 else if (bPrependToStart)
1922 this->ApplyInternalKnotsMultiplicity();
1924 return SegmentIndex;
constexpr auto MakeArrayView(OtherRangeType &&Other)
Definition ArrayView.h:873
#define check(expr)
Definition AssertionMacros.h:314
bool bSuccess
Definition ConvexDecomposition3.cpp:819
@ INDEX_NONE
Definition CoreMiscDefines.h:150
#define UE_EXPERIMENTAL(Version, Message)
Definition CoreMiscDefines.h:369
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
#define UE_LOG(CategoryName, Verbosity, Format,...)
Definition LogMacros.h:270
#define ON_SCOPE_EXIT
Definition ScopeExit.h:73
#define UE_PI
Definition UnrealMathUtility.h:129
#define UE_SMALL_NUMBER
Definition UnrealMathUtility.h:130
#define UE_KINDA_SMALL_NUMBER
Definition UnrealMathUtility.h:131
float Val(const FString &Value)
Definition UnrealMath.cpp:3163
uint32 Offset
Definition VulkanMemory.cpp:4033
Definition ArrayView.h:139
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
void SetNum(SizeType NewNum, EAllowShrinking AllowShrinking=UE::Core::Private::AllowShrinkingByDefault< AllocatorType >())
Definition Array.h:2308
UE_FORCEINLINE_HINT void Swap(SizeType FirstIndexToSwap, SizeType SecondIndexToSwap)
Definition Array.h:3300
UE_FORCEINLINE_HINT void Reserve(SizeType Number)
Definition Array.h:3016
Definition StaticArray.h:26
Definition UniquePtr.h:107
int32 InsertValue(int32 Idx, const ValueType &NewValue)
Definition BSpline.h:320
virtual void SetClosedLoop(bool bClosed) override
Definition BSpline.h:228
virtual bool IsClosedLoop() const override
Definition BSpline.h:233
TStaticArray< const ValueType *, WindowSize > FWindow
Definition BSpline.h:132
float GetNearestAvailableKnotValue(const FValidKnotSearchParams &InSearchParams) const
Definition BSpline.h:679
static constexpr int32 Degree
Definition BSpline.h:128
void MarkFlatKnotsCacheDirty() const
Definition BSpline.h:1115
bool InsertKnot(FKnot InKnot)
Definition BSpline.h:628
bool bClampEnds
Definition BSpline.h:1270
TArray< FKnot > PairKnots
Definition BSpline.h:1261
void SetKnot(int32 KnotIdx, float NewValue)
Definition BSpline.h:576
void ApplyClampedKnotsMultiplicity()
Definition BSpline.h:1089
void PrintKnotVector() const
Definition BSpline.h:1123
TArray< ValueType > Values
Definition BSpline.h:1258
virtual bool RemoveValue(int32 Index)
Definition BSpline.h:329
typename TSplineInterface< VALUETYPE >::ValueType ValueType
Definition BSpline.h:129
int32 NumKeys() const
Definition BSpline.h:295
bool IsClampedEnds() const
Definition BSpline.h:554
bool bIsClosedLoop
Definition BSpline.h:1267
virtual void Clear() override
Definition BSpline.h:176
bool SetValue(int32 Idx, const ValueType &NewValue)
Definition BSpline.h:310
const ValueType & GetValue(int32 Idx) const
Definition BSpline.h:300
bool RemoveKnot(int32 KnotIdx)
Definition BSpline.h:593
void SwapKnots(int32 KnotIdxA, int32 KnotIdxB)
Definition BSpline.h:611
int32 AddValue(const ValueType &NewValue)
Definition BSpline.h:305
void Dump() const
Definition BSpline.h:152
void ResetKnotVector()
Definition BSpline.h:433
bool SetCustomKnots(const TArray< FKnot > &NewKnots)
Definition BSpline.h:459
static constexpr int32 WindowSize
Definition BSpline.h:131
Definition PolyBezierSpline.h:22
bool AddBezierSegments(const TArray< ValueType > &Points, bool bAppend, EParameterizationPolicy ParameterizationPolicy)
Definition PolyBezierSpline.h:505
bool UpdateSegment(int32 SegmentIndex, const ValueType &P0, const ValueType &P1, const ValueType &P2, const ValueType &P3)
Definition PolyBezierSpline.h:1027
int32 GetNumDistinctSegments() const
Definition PolyBezierSpline.h:1481
ValueType EvaluateDerivative(float Parameter) const
Definition PolyBezierSpline.h:341
int32 AppendBezierSegment(const ValueType &P1, const ValueType &P2, const ValueType &P3, EParameterizationPolicy ParameterizationPolicy=EParameterizationPolicy::Centripetal)
Definition PolyBezierSpline.h:633
virtual int32 GetNumberOfSegments() const override
Definition PolyBezierSpline.h:1051
virtual void Clear() override
Definition PolyBezierSpline.h:262
virtual void SetClosedLoop(bool bShouldClose) override
Definition PolyBezierSpline.h:1331
virtual FInterval1f GetSegmentParameterRange(int32 SegmentIndex) const override
Definition PolyBezierSpline.h:1062
TPolyBezierSpline()=default
int32 FindSegmentIndex(float Parameter, float &OutLocalParam) const
Definition PolyBezierSpline.h:1486
bool RemoveSegment(const int32 SegmentIndex)
Definition PolyBezierSpline.h:902
static TPolyBezierSpline CreateDefault()
Definition PolyBezierSpline.h:53
virtual FInterval1f GetParameterSpace() const override
Definition PolyBezierSpline.h:1094
void SetClosedLoopFlag(bool bClosed)
Definition PolyBezierSpline.h:1326
void FlipSegment(int32 Segment)
Definition PolyBezierSpline.h:1229
int32 InsertBezierSegment(float Parameter, const ValueType &P1, const ValueType &P2, const ValueType &P3, EParameterizationPolicy ParameterizationPolicy=EParameterizationPolicy::Centripetal)
Definition PolyBezierSpline.h:854
virtual int32 SetParameter(int32 Index, float NewParameter) override
Definition PolyBezierSpline.h:1118
virtual float GetParameter(int32 Index) const override
Definition PolyBezierSpline.h:1101
Base::ValueType ValueType
Definition PolyBezierSpline.h:25
static int32 GetDegree()
Definition PolyBezierSpline.h:332
static TPolyBezierSpline< ValueType > CreateLine(const ValueType &Start, const ValueType &End)
Definition PolyBezierSpline.h:66
int32 InsertPoint(float Parameter, const ValueType &Position, EParameterizationPolicy ParameterizationPolicy=EParameterizationPolicy::Centripetal)
Definition PolyBezierSpline.h:763
TPolyBezierSpline(const ValueType &P0, const ValueType &P1, const ValueType &P2, const ValueType &P3, EParameterizationPolicy Parameterization=EParameterizationPolicy::Uniform)
Definition PolyBezierSpline.h:37
bool MapGlobalParameterToLocalSegment(float GlobalParam, int32 &OutSegmentIndex, float &OutLocalParam) const
Definition PolyBezierSpline.h:1395
virtual void Reparameterize(EParameterizationPolicy Mode=EParameterizationPolicy::Centripetal) override
Definition PolyBezierSpline.h:1081
int32 InsertPointAtPosition(int32 SegmentIndex, const ValueType &Position, EParameterizationPolicy ParameterizationPolicy=EParameterizationPolicy::Centripetal)
Definition PolyBezierSpline.h:701
bool UpdateSegmentPoint(const int32 SegmentIndex, const int32 PointIndex, const ValueType &NewValue)
Definition PolyBezierSpline.h:1001
virtual TUniquePtr< ISplineInterface > Clone() const override
Definition PolyBezierSpline.h:263
typename Base::FWindow FWindow
Definition PolyBezierSpline.h:26
bool RemovePoint(int32 PointIndex)
Definition PolyBezierSpline.h:930
static TPolyBezierSpline< ValueType > CreateCircleArc(const ValueType &Center, float Radius, float StartAngle, float EndAngle, int32 NumSegments=4)
Definition PolyBezierSpline.h:84
virtual ~TPolyBezierSpline() override=default
DECLARE_SPLINE_TYPE_ID(TEXT("PolyBezier"), *TSplineValueTypeTraits< VALUETYPE >::Name)
int32 InsertPointAtSegmentParam(int32 SegmentIndex, float LocalT, const ValueType &Position, EParameterizationPolicy ParameterizationPolicy=EParameterizationPolicy::Centripetal)
Definition PolyBezierSpline.h:725
static TPolyBezierSpline< ValueType > CreateEllipse(const ValueType &Center, float RadiusX, float RadiusY, int32 NumSegments=4)
Definition PolyBezierSpline.h:192
virtual int32 GetExpectedNumKnots() const override
Definition PolyBezierSpline.h:1492
static TPolyBezierSpline< ValueType > CreateCircle(const ValueType &Center, float Radius, int32 NumSegments=4)
Definition PolyBezierSpline.h:172
virtual int32 FindIndexForParameter(float Parameter, float &OutLocalParam) const override
Definition PolyBezierSpline.h:1290
float MapLocalSegmentParameterToGlobal(int32 SegmentIndex, float LocalParam) const
Definition PolyBezierSpline.h:1382
float FindNearestOnSegment(const ValueType &Point, int32 SegmentIndex, float &OutSquaredDistance) const
Definition PolyBezierSpline.h:280
void SetKnotVector(const TArray< FKnot > &NewKnots)
Definition PolyBezierSpline.h:1506
virtual float FindNearest(const ValueType &Point, float &OutSquaredDistance) const override
Definition PolyBezierSpline.h:308
int32 PrependBezierSegment(const ValueType &P0, const ValueType &P1, const ValueType &P2, EParameterizationPolicy ParameterizationPolicy=EParameterizationPolicy::Centripetal)
Definition PolyBezierSpline.h:668
bool SetControlPoints(const TArray< ValueType > &Points, EParameterizationPolicy ParameterizationPolicy)
Definition PolyBezierSpline.h:379
Definition SplineTypeRegistry.h:236
EOutOfBoundsHandlingMode PostInfinityMode
Definition SplineInterfaces.h:191
EOutOfBoundsHandlingMode PreInfinityMode
Definition SplineInterfaces.h:190
ValueType Evaluate(float Parameter) const
Definition SplineInterfaces.h:117
static T InterpolateWithBasis(TArrayView< const T *const > Window, TArrayView< const float > Basis)
Definition InterpolationPolicies.h:61
CORE_API void Reset(int32 NewReservedSize=0)
Definition String.cpp.inl:326
int32 WrapIndex(int32 V, int32 Begin, int32 End)
Definition Utilities.h:632
@ ControlPoint
Definition Visu.h:27
float FindNearestPoint_Cubic(const TArrayView< ValueType > Coeffs, float StartParam, float EndParam, float &OutSquaredDistance)
Definition SplineMath.h:757
bool Equals(const T &A, const T &B, float Tolerance=UE_KINDA_SMALL_NUMBER)
Definition SplineMath.h:242
double CentripetalDistance(const T &A, const T &B)
Definition SplineMath.h:198
T GetSafeNormal(const T &Value)
Definition SplineMath.h:221
double Distance(const T &A, const T &B)
Definition SplineMath.h:186
double SizeSquared(const T &Value)
Definition SplineMath.h:172
float PrevDistinct(float t)
Definition SplineMath.h:128
float Step(float t, EDir d)
Definition SplineMath.h:134
float NextDistinct(float t)
Definition SplineMath.h:123
TInterval1< float > FInterval1f
Definition BoxTypes.h:241
T DistanceSquared(const UE::Math::TVector2< T > &V1, const UE::Math::TVector2< T > &V2)
Definition VectorTypes.h:82
Definition AdvancedWidgetsModule.cpp:13
U16 Index
Definition radfft.cpp:71
static constexpr UE_FORCEINLINE_HINT T Clamp(const T X, const T MinValue, const T MaxValue)
Definition UnrealMathUtility.h:592
Definition NumericLimits.h:41
Definition Optional.h:131
static T Compute(TArrayView< const T *const > Window, float Parameter, float SegmentScale)
Definition SplineMath.h:702
Definition SplineTypeId.h:21
RealType Min
Definition BoxTypes.h:20
static TInterval1< float > Empty()
Definition BoxTypes.h:34