40 const bool neg = (u & 0x80000000u) != 0;
59 if (FMath::IsNaN(
from) || !FMath::IsFinite(
from))
65 const float minNorm = std::numeric_limits<float>::min();
82 const float minNorm = std::numeric_limits<float>::min();
83 const float ay = FMath::Abs(y);
92 y = std::copysign(0.0f, y);
99 if (!FMath::IsFinite(y))
102 ? +std::numeric_limits<float>::max()
103 : -std::numeric_limits<float>::max();
157 template <
typename T>
161 return static_cast<double>(
Value.Size());
162 else if constexpr (std::is_arithmetic_v<T>)
163 return FMath::Abs(
static_cast<double>(
Value));
171 template <
typename T>
175 return static_cast<double>(
Value.SizeSquared());
176 else if constexpr (std::is_arithmetic_v<T>)
185 template <
typename T>
197 template <
typename T>
206 template <
typename T>
210 return static_cast<double>(
A.Dot(
B));
211 else if constexpr (std::is_arithmetic_v<T>)
212 return static_cast<double>(
A *
B);
220 template <
typename T>
224 return Value.GetSafeNormal();
225 else if constexpr (std::is_arithmetic_v<T>)
227 const double AbsValue = FMath::Abs(
static_cast<double>(
Value));
241 template <
typename T>
245 return A.Equals(
B, Tolerance);
246 else if constexpr (std::is_arithmetic_v<T>)
247 return FMath::Abs(
static_cast<float>(
A -
B)) <= Tolerance;
259 template <
typename T>
272 template <
typename T>
281 for (
const T* Ptr :
Window)
294 return !FPlatformMath::IsNaN(Parameter) &&
295 FPlatformMath::IsFinite(Parameter);
298 template <
typename T>
301 if (
Window.Num() < 2)
return false;
321 if (
Table.Num() == 0)
325 for (
int32 i = 1; i <= N; ++i)
338 if (
Table.Num() == 0)
341 for (
int32 i = 0; i <= N; ++i)
343 Table[i].SetNum(i + 1);
345 for (
int32 j = 1; j < i; ++j)
355 template <
int32 Order>
360 const float mt = 1.0f - t;
362 if constexpr (Order == 0)
370 else if constexpr (Order == 1)
375 OutBasis[2] = 3.0f * t * (2.0f - 3.0f * t);
378 else if constexpr (Order == 2)
386 else if constexpr (Order == 3)
397 static void ComputeBSplineBasisFunctions(
408 Right.SetNum(Degree + 1);
412 for (
int32 j = 1; j <= Degree; ++j)
432 for (
int32 r = 0; r < j; ++r)
435 const float Denominator =
Right[r + 1] +
Left[j - r];
447 Saved =
Left[j - r] * Temp;
457 template <
typename T,
int32 Order>
465 return FSplineValidation::GetDefaultValue<T>();
470#if ENABLE_NAN_DIAGNOSTIC
473 return FSplineValidation::GetDefaultValue<T>();
483 return FSplineValidation::GetDefaultValue<T>();
489 return FSplineValidation::GetDefaultValue<T>();
492 T Result = FSplineValidation::GetDefaultValue<T>();
493 const float t = Parameter;
494 const float mt = 1.0f - t;
497 for (
int32 i = 0; i <= WindowSize - Order - 1; ++i)
504 return FSplineValidation::GetDefaultValue<T>();
513 const float PowMT = FMath::Pow(
mt, WindowSize - Order - 1 - i);
514 if (FPlatformMath::IsFinite(
PowMT))
521 const float PowT = FMath::Pow(t, i);
522 if (FPlatformMath::IsFinite(
PowT))
536 template <
typename T,
int32 DerivOrder>
581 for (
int32 i = 0; i < Degree; ++i)
610 float ScaleFactor = 1.0;
650 Math::ComputeBSplineBasisFunctions(
Knots, Span, Parameter, Degree - 1, Basis);
653 for (
int32 i = 0; i < Degree; ++i)
657 return Result * ScaleFactor;
663 template <
typename T>
686 ComputeBSplineBasisFunctions(
Knots, Span, Parameter, Degree, Basis);
689 for (
int32 i = 0; i <= Degree; ++i)
691 Result += *
Window[i] * Basis[i];
699 template <
typename T,
int32 Order>
704 if constexpr (Order > 3)
706 return FSplineValidation::GetDefaultValue<T>();
712 return FSplineValidation::GetDefaultValue<T>();
720 T Result = FSplineValidation::GetDefaultValue<T>();
723 Result += *
Window[i] * Basis[i];
729 if constexpr (Order > 0)
732 float ScalingFactor = 1.0f;
733 for (
int32 i = 0; i < Order; ++i)
737 return Result * ScalingFactor;
756 template <
typename ValueType>
764 const ValueType& P0 = Coeffs[0];
765 const ValueType
At1 = P0 + Coeffs[1] + Coeffs[2] + Coeffs[3];
778 const ValueType& P1 = Coeffs[1];
779 const ValueType& P2 = Coeffs[2];
780 const ValueType& P3 = Coeffs[3];
799 const ValueType
Point = P0 +
816 template <
typename ValueType>
832 template <
typename ValueType>
843 const ValueType
Value = Spline.Evaluate(Param);
@ ForceInit
Definition CoreMiscDefines.h:155
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 logOrEnsureNanError(_FormatString_,...)
Definition LogMacros.h:436
#define UE_KINDA_SMALL_NUMBER
Definition UnrealMathUtility.h:131
uint32 Size
Definition VulkanMemory.cpp:4034
Definition ArrayView.h:139
void SetNum(SizeType NewNum, EAllowShrinking AllowShrinking=UE::Core::Private::AllowShrinkingByDefault< AllocatorType >())
Definition Array.h:2308
UE_FORCEINLINE_HINT void Reserve(SizeType Number)
Definition Array.h:3016
Definition StaticArray.h:26
Definition SplineInterfaces.h:92
float NextafterNoSubnormal(float from, bool bStepRight)
Definition SplineMath.h:57
uint32 ToOrdered(float f)
Definition SplineMath.h:37
float BitsToFloat(uint32 u)
Definition SplineMath.h:29
uint32 FloatToBits(float f)
Definition SplineMath.h:22
float FromOrdered(uint32 ordered)
Definition SplineMath.h:46
float NormalizeZeroForKey(float v)
Definition SplineMath.h:109
float FindNearestPoint_Cubic(const TArrayView< ValueType > Coeffs, float StartParam, float EndParam, float &OutSquaredDistance)
Definition SplineMath.h:757
ValueType ComputeSecondDerivativeCentralDifference(const TSplineInterface< ValueType > &Spline, double Param, double Step=0.1)
Definition SplineMath.h:833
double CentripetalDistance(const T &A, const T &B)
Definition SplineMath.h:198
ValueType ComputeFirstDerivativeCentralDifference(const TSplineInterface< ValueType > &Spline, double Param, double Step=UE_KINDA_SMALL_NUMBER)
Definition SplineMath.h:817
const TArray< TArray< double > > & GetBinomialTable()
Definition SplineMath.h:335
T GetSafeNormal(const T &Value)
Definition SplineMath.h:221
const TArray< double > & GetFactorialTable()
Definition SplineMath.h:318
double SizeSquared(const T &Value)
Definition SplineMath.h:172
float NormalizeKey(float t)
Definition SplineMath.h:146
EDir
Definition SplineMath.h:120
float PrevDistinct(float t)
Definition SplineMath.h:128
float StepInside(float t, EDir d, const FInterval1f &bounds)
Definition SplineMath.h:140
float NextDistinct(float t)
Definition SplineMath.h:123
T DistanceSquared(const UE::Math::TVector2< T > &V1, const UE::Math::TVector2< T > &V2)
Definition VectorTypes.h:82
Definition AdvancedWidgetsModule.cpp:13
float v
Definition radaudio_mdct.cpp:62
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 UE_FORCEINLINE_HINT T Clamp(const T X, const T MinValue, const T MaxValue)
Definition UnrealMathUtility.h:592
static UE_FORCEINLINE_HINT bool IsNearlyZero(float Value, float ErrorTolerance=UE_SMALL_NUMBER)
Definition UnrealMathUtility.h:407
static UE_FORCEINLINE_HINT void * Memcpy(void *Dest, const void *Src, SIZE_T Count)
Definition UnrealMemory.h:160
Definition IsConstructible.h:10
Definition SplineMath.h:257
static T GetDefaultValue()
Definition SplineMath.h:260
static bool IsValidGeometry(TArrayView< const T *const > Window, float Tolerance=UE_KINDA_SMALL_NUMBER)
Definition SplineMath.h:299
static bool IsValidWindow(TArrayView< const T *const > Window, int32 RequiredSize)
Definition SplineMath.h:273
static bool IsValidParameter(float Parameter)
Definition SplineMath.h:292
static T Compute(TArrayView< const T *const > Window, const TArray< float > &Knots, int32 Span, float Parameter, int32 Degree)
Definition SplineMath.h:677
Definition SplineMath.h:538
static T Compute(TArrayView< const T *const > Window, const TArray< float > &Knots, int32 Span, float Parameter, int32 Degree)
Definition SplineMath.h:551
Definition SplineMath.h:701
static T Compute(TArrayView< const T *const > Window, float Parameter, float SegmentScale)
Definition SplineMath.h:702
Definition SplineMath.h:459
static T Compute(TArrayView< const T *const > Window, float Parameter)
Definition SplineMath.h:460
Definition ParameterizedTypes.h:121
Definition ParameterizedTypes.h:66
Definition ParameterizedTypes.h:129
Definition ParameterizedTypes.h:105
Definition ParameterizedTypes.h:113
Definition ParameterizedTypes.h:137
Definition PolynomialRootSolver.h:18