19template <
typename VALUETYPE,
int32 DEGREE>
class UE_EXPERIMENTAL(5.7,
"New spline APIs are experimental.")
TBSpline;
72 if (FlatKnots.
Num() < 2 * (Degree + 1))
78 for (
int32 i = 1; i < FlatKnots.
Num(); ++i)
80 if (FlatKnots[i] < FlatKnots[i - 1])
97 Ar <<
Knot.Multiplicity;
122template <
typename VALUETYPE,
int32 DEGREE>
142 template <
typename T,
typename =
void>
147 template <
typename T>
154 if constexpr (std::is_floating_point_v<ValueType>)
280 if (NumValues == 1)
return GetValue(0);
287 return InterpolateWindow(
Window, Parameter);
342 UE_LOG(
LogSpline,
Warning,
TEXT(
"SetParameter is disabled. Use Reparameterize() or a linear spline if you need manual control."));
354 for (
int j = 1; j <=
Degree; ++j)
358 return Sum /
static_cast<float>(
Degree);
395 int32 Span = FindKnotSpan(Parameter);
467 if (
Knot.Multiplicity == 0)
515 if (NumValues <
Degree + 1)
527 case EParameterizationPolicy::Uniform:
530 case EParameterizationPolicy::ChordLength:
533 case EParameterizationPolicy::Centripetal:
687 return DesiredParameter;
701 return DesiredParameter;
705 float Left = DesiredParameter;
706 float Right = DesiredParameter;
733 if (
Left <= -std::numeric_limits<float>::max())
745 bSearchRight =
false;
755 if (
Right >= +std::numeric_limits<float>::max())
757 bSearchRight =
false;
762 if (!bSearchLeft && !bSearchRight)
break;
768 ensureMsgf(
false,
TEXT(
"Step budget exhausted in GetNearestAvailableKnotValue"));
809 ? (NumValues + (2 *
Degree) + 1)
810 : (NumValues +
Degree + 1);
828 const int32 n = NumPoints;
866 Value =
static_cast<float>(i);
881 if (Points.
Num() < 2)
899 for (
int32 i = 1; i < Points.
Num(); ++i)
939 Params.SetNum(Points.
Num());
943 for (
int32 i = 1; i < Points.
Num(); ++i)
948 : (
static_cast<float>(i) /
static_cast<float>(Points.
Num() - 1));
955 const float t =
static_cast<float>(i + 1) /
static_cast<float>(
NumInternalKnots + 1);
957 const int32 LowIndex = FMath::FloorToInt(t *
static_cast<float>(Points.
Num() - 1));
959 const float Alpha = t *
static_cast<float>(Points.
Num() - 1 - LowIndex);
974 const float Param =
static_cast<float>(i) /
static_cast<float>(
KnotCount - 1);
989 if (Points.
Num() < 2)
1006 for (
int32 i = 1; i < Points.
Num(); ++i)
1043 Params.SetNum(Points.
Num());
1047 for (
int32 i = 1; i < Points.
Num(); ++i)
1052 : (
static_cast<float>(i) /
static_cast<float>(Points.
Num() - 1));
1059 const float t =
static_cast<float>(i + 1) /
static_cast<float>(
NumInternalKnots + 1);
1061 const int32 LowIndex = FMath::FloorToInt(t *
static_cast<float>(Points.
Num() - 1));
1063 const float Alpha = t *
static_cast<float>(Points.
Num() - 1 - LowIndex);
1078 const float Param =
static_cast<float>(i) /
static_cast<float>(
KnotCount - 1);
1139 int32 FindKnotSpan(
float Parameter)
const
1144 if (
Knots.Num() == 0)
1159 return NumValues - 1;
1175 if (Parameter >=
Knots[Mid] && Parameter <
Knots[Mid + 1])
1180 if (Parameter <
Knots[Mid])
1195 virtual FWindow FindWindow(
float Parameter)
const
1203 int32 Span = FindKnotSpan(Parameter);
1251 int32 Span = FindKnotSpan(Parameter);
1253 Math::ComputeBSplineBasisFunctions(
FlatKnots, Span, Parameter,
Degree, Basis);
#define ensureAlwaysMsgf(InExpression, InFormat,...)
Definition AssertionMacros.h:467
#define ensureMsgf( InExpression, InFormat,...)
Definition AssertionMacros.h:465
@ 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 UE_SMALL_NUMBER
Definition UnrealMathUtility.h:130
Definition Archive.h:1208
virtual void Serialize(void *V, int64 Length)
Definition Archive.h:1689
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 RemoveAt(SizeType Index, EAllowShrinking AllowShrinking=UE::Core::Private::AllowShrinkingByDefault< AllocatorType >())
Definition Array.h:2083
void Reset(SizeType NewSize=0)
Definition Array.h:2246
UE_NODEBUG UE_FORCEINLINE_HINT SizeType Add(ElementType &&Item)
Definition Array.h:2696
UE_NODEBUG UE_FORCEINLINE_HINT bool IsValidIndex(SizeType Index) const
Definition Array.h:1122
SizeType Insert(std::initializer_list< ElementType > InitList, const SizeType InIndex)
Definition Array.h:1875
void Empty(SizeType Slack=0)
Definition Array.h:2273
UE_FORCEINLINE_HINT void Reserve(SizeType Number)
Definition Array.h:3016
Definition StaticArray.h:26
Definition UniquePtr.h:107
Definition SplineInterfaces.h:35
int32 InsertValue(int32 Idx, const ValueType &NewValue)
Definition BSpline.h:320
virtual FInterval1f GetParameterSpace() const override
Definition BSpline.h:223
virtual void SetClosedLoop(bool bClosed) override
Definition BSpline.h:228
virtual bool IsClosedLoop() const override
Definition BSpline.h:233
virtual TUniquePtr< ISplineInterface > Clone() const override
Definition BSpline.h:238
void UpdateFlatKnotsCache() const
Definition BSpline.h:1103
TStaticArray< const ValueType *, WindowSize > FWindow
Definition BSpline.h:132
virtual FInterval1f GetSegmentParameterRange(int32 SegmentIndex) const override
Definition BSpline.h:268
virtual int32 GetExpectedNumKnots() const
Definition BSpline.h:804
float GetNearestAvailableKnotValue(const FValidKnotSearchParams &InSearchParams) const
Definition BSpline.h:679
static constexpr int32 Degree
Definition BSpline.h:128
virtual void Reparameterize(EParameterizationPolicy ParameterizationPolicy)
Definition BSpline.h:511
void MarkFlatKnotsCacheDirty() const
Definition BSpline.h:1115
virtual bool Serialize(FArchive &Ar) override
Definition BSpline.h:193
virtual bool IsEqual(const ISplineInterface *OtherSpline) const override
Definition BSpline.h:182
virtual int32 SetParameter(int32 Index, float NewParameter)
Definition BSpline.h:340
bool operator==(const TBSpline &Other) const
Definition BSpline.h:209
virtual ~TBSpline() override=default
virtual int32 GetNumberOfSegments() const override
Definition BSpline.h:256
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
const TArray< FKnot > & GetPairKnots() const
Definition BSpline.h:428
void ApplyClampedKnotsMultiplicity()
Definition BSpline.h:1089
void SetClampedEnds(bool bInClampEnds)
Definition BSpline.h:549
void PrintKnotVector() const
Definition BSpline.h:1123
TArray< ValueType > Values
Definition BSpline.h:1258
virtual bool RemoveValue(int32 Index)
Definition BSpline.h:329
virtual float FindNearest(const ValueType &Point, float &OutSquaredDistance) const override
Definition BSpline.h:290
FInterval1f GetKnotRange() const
Definition BSpline.h:560
typename TSplineInterface< VALUETYPE >::ValueType ValueType
Definition BSpline.h:129
int32 NumKeys() const
Definition BSpline.h:295
int32 GetKnotMultiplicity(int32 KnotIndex) const
Definition BSpline.h:444
bool IsClampedEnds() const
Definition BSpline.h:554
bool bIsClosedLoop
Definition BSpline.h:1267
void GenerateChordLengthKnots(int32 KnotCount)
Definition BSpline.h:878
virtual int32 FindIndexForParameter(float Parameter, float &OutLocalParam) const
Definition BSpline.h:362
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
friend FArchive & operator<<(FArchive &Ar, TBSpline &BSpline)
Definition BSpline.h:217
const TArray< FKnot > & GetKnotVector() const
Definition BSpline.h:422
bool RemoveKnot(int32 KnotIdx)
Definition BSpline.h:593
void GenerateCentripetalKnots(int32 KnotCount)
Definition BSpline.h:986
void SwapKnots(int32 KnotIdxA, int32 KnotIdxB)
Definition BSpline.h:611
TArray< float > FlatKnots
Definition BSpline.h:1264
int32 AddValue(const ValueType &NewValue)
Definition BSpline.h:305
void Dump() const
Definition BSpline.h:152
void ResetKnotVector()
Definition BSpline.h:433
bool bFlatKnotsCacheDirty
Definition BSpline.h:1265
bool SetCustomKnots(const TArray< FKnot > &NewKnots)
Definition BSpline.h:459
virtual ValueType EvaluateImpl(float Parameter) const override
Definition BSpline.h:276
DECLARE_SPLINE_TYPE_ID(BSplineNameSelector< DEGREE >::Name, *TSplineValueTypeTraits< VALUETYPE >::Name)
static constexpr int32 WindowSize
Definition BSpline.h:131
virtual float GetParameter(int32 Index) const
Definition BSpline.h:347
void GenerateUniformKnots(int32 KnotCount)
Definition BSpline.h:817
Definition SplineTypeRegistry.h:236
Definition SplineInterfaces.h:92
EOutOfBoundsHandlingMode PostInfinityMode
Definition SplineInterfaces.h:191
VALUETYPE ValueType
Definition SplineInterfaces.h:96
virtual FSplineTypeId::IdType GetTypeId() const override
Definition SplineInterfaces.h:168
EOutOfBoundsHandlingMode PreInfinityMode
Definition SplineInterfaces.h:190
static T InterpolateWithBasis(TArrayView< const T *const > Window, TArrayView< const float > Basis)
Definition InterpolationPolicies.h:61
uint32 FloatToBits(float f)
Definition SplineMath.h:22
double CentripetalDistance(const T &A, const T &B)
Definition SplineMath.h:198
double Distance(const T &A, const T &B)
Definition SplineMath.h:186
float NormalizeKey(float t)
Definition SplineMath.h:146
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
Definition AdvancedWidgetsModule.cpp:13
U16 Index
Definition radfft.cpp:71
static UE_FORCEINLINE_HINT bool IsNearlyEqual(float A, float B, float ErrorTolerance=UE_SMALL_NUMBER)
Definition UnrealMathUtility.h:388
static constexpr UE_FORCEINLINE_HINT T Lerp(const T &A, const T &B, const U &Alpha)
Definition UnrealMathUtility.h:1116
static constexpr const TCHAR * Name
Definition BSpline.h:107
static bool IsValidKnotVector(const TArray< FKnot > &InKnots, int32 Degree)
Definition BSpline.h:68
bool operator==(const FKnot &Other) const
Definition BSpline.h:89
FKnot()
Definition BSpline.h:38
static TArray< float > ConvertPairToFlatKnots(const TArray< FKnot > &PairKnots)
Definition BSpline.h:55
FKnot(float InValue, uint32 InMultiplicity=1)
Definition BSpline.h:44
friend FArchive & operator<<(FArchive &Ar, FKnot &Knot)
Definition BSpline.h:94
float Value
Definition BSpline.h:35
uint32 Multiplicity
Definition BSpline.h:36
float DesiredParameter
Definition BSpline.h:669
bool bSearchRight
Definition BSpline.h:670
FValidKnotSearchParams(float InDesiredParameter)
Definition BSpline.h:664
FValidKnotSearchParams()=default
bool bSearchLeft
Definition BSpline.h:671
Definition SplineTypeId.h:21
static TInterval1< float > Empty()
Definition BoxTypes.h:34