46template<
typename ValueType>
128template<
typename VALUETYPE>
140 TEXT(
"TangentBezier"),
150 ,
TangentModes({ETangentMode::Auto, ETangentMode::Auto})
169 StartPoint + StartTangent / 3.0f,
170 EndPoint - (EndTangent / 3.0f),
250 Spline.Serialize(Ar);
280 Result.Reparameterize(EParameterizationPolicy::Uniform);
298 int32 NumSegments = 4)
305 Center, Radius, StartAngle, EndAngle, NumSegments);
308 Result.TangentModes.Init(ETangentMode::Auto, Result.GetNumPoints());
312 Result.Reparameterize(EParameterizationPolicy::Centripetal);
327 int32 NumSegments = 4)
335 Result.TangentModes.Init(ETangentMode::Auto, Result.GetNumPoints());
338 Result.Reparameterize(EParameterizationPolicy::Centripetal);
355 int32 NumSegments = 4)
363 Result.TangentModes.Init(ETangentMode::Auto, Result.GetNumPoints());
366 Result.Reparameterize(EParameterizationPolicy::Centripetal);
378 Clone->Tension = this->
Tension;
467 const int32 NumPoints = Points.
Num();
478 return InitializeFirstSegment(Points[0],
OutNewIndex);
488 const int32 NumSegments = NumPoints - 1;
489 BezierPoints.
Reserve(NumSegments * 4);
491 for (
int32 i = 0; i < NumSegments; ++i)
503 if (StartPoint.
TangentMode == ETangentMode::Auto ||
504 StartPoint.
TangentMode == ETangentMode::AutoClamped)
507 if (i == 0 && NumPoints > 2)
512 else if (i == NumPoints - 2 && NumPoints > 2)
517 else if (NumPoints > 2)
529 if (StartPoint.
TangentMode == ETangentMode::AutoClamped)
540 else if (StartPoint.
TangentMode == ETangentMode::Linear)
545 else if (StartPoint.
TangentMode == ETangentMode::Constant)
561 if (i + 1 == 0 && NumPoints > 2)
566 else if (i + 1 == NumPoints - 1 && NumPoints > 2)
571 else if (NumPoints > 2)
583 if (EndPoint.
TangentMode == ETangentMode::AutoClamped)
594 else if (EndPoint.
TangentMode == ETangentMode::Linear)
599 else if (EndPoint.
TangentMode == ETangentMode::Constant)
615 BezierPoints.
Add(P0);
616 BezierPoints.
Add(P1);
617 BezierPoints.
Add(P2);
618 BezierPoints.
Add(P3);
648 const int32 NumPoints = Points.
Num();
653 UE_LOG(
LogSpline,
Warning,
TEXT(
"AddControlPoints requires at least 2 points to add a valid segment. Got %d points."), NumPoints);
667 for (
int32 i = 0; i < NumPoints; ++i)
684 if (Points[0].TangentMode != ETangentMode::User && Points[0].TangentMode != ETangentMode::Broken)
699 for (
int32 i = NumPoints - 1; i >= 0; --i)
702 if (i == NumPoints - 1)
713 if (Points[i].TangentMode != ETangentMode::User && Points[i].TangentMode != ETangentMode::Broken)
770 if (InitializeFirstSegment(ControlPoint,
OutNewIndex))
781 (ControlPoint.TangentMode == ETangentMode::User ||
782 ControlPoint.TangentMode == ETangentMode::Broken))
831 (ControlPoint.TangentMode == ETangentMode::User ||
832 ControlPoint.TangentMode == ETangentMode::Broken))
879 if (InitializeFirstSegment(ControlPoint,
OutNewIndex))
890 if (ControlPoint.TangentMode == ETangentMode::User ||
891 ControlPoint.TangentMode == ETangentMode::Broken)
937 if (InitializeFirstSegment(ControlPoint, NewIndex))
951 TangentModes[NewIndex - 1] == ETangentMode::AutoClamped)
965 if (ControlPoint.TangentMode == ETangentMode::User ||
966 ControlPoint.TangentMode == ETangentMode::Broken)
969 P2 = P3 - (ControlPoint.TangentIn / 3.0f);
986 if (ControlPoint.TangentMode == ETangentMode::Auto ||
987 ControlPoint.TangentMode == ETangentMode::AutoClamped)
991 TangentModes[NewIndex - 1] == ETangentMode::AutoClamped)
1023 Result.TangentMode = ETangentMode::Auto;
1120 else if (
Index == NumPoints - 1)
1137 if (ControlPoint.TangentMode != ETangentMode::Auto &&
1138 ControlPoint.TangentMode != ETangentMode::AutoClamped &&
1139 ControlPoint.TangentMode != ETangentMode::Linear &&
1140 ControlPoint.TangentMode != ETangentMode::Constant)
1249 return (P3 - P2) * 3.0f;
1276 return (P1 - P0) * 3.0f;
1403 if (NewIndex !=
Index)
1441 for (
int32 i = 0; i < NumPoints; ++i)
1455 if (
Index < 0 || Index >= NumPoints || Mode == ETangentMode::User || Mode == ETangentMode::Broken)
1472 ?
static_cast<float>(
Index - 1)
1473 : (
IsClosedLoop() ?
static_cast<float>(NumPoints - 1) :
static_cast<float>(
Index));
1482 PrevParam -=
static_cast<float>(NumPoints);
1486 NextParam +=
static_cast<float>(NumPoints);
1495 case ETangentMode::Auto:
1496 case ETangentMode::AutoClamped:
1505 if (Mode == ETangentMode::AutoClamped)
1536 case ETangentMode::Linear:
1560 case ETangentMode::Constant:
1568 case ETangentMode::User:
1571 case ETangentMode::Unknown:
1634 return ETangentMode::Unknown;
1676 return ((Mode == ETangentMode::Auto) || (Mode == ETangentMode::AutoClamped) || (Mode == ETangentMode::User) || (Mode == ETangentMode::Broken));
1708 else if (NumPoints == 1)
1710 constexpr bool bAppend =
true;
#define ensureAlwaysMsgf(InExpression, InFormat,...)
Definition AssertionMacros.h:467
#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_KINDA_SMALL_NUMBER
Definition UnrealMathUtility.h:131
Definition Archive.h:1208
virtual void Serialize(void *V, int64 Length)
Definition Archive.h:1689
UE_FORCEINLINE_HINT bool IsLoading() const
Definition Archive.h:236
UE_REWRITE SizeType Num() const
Definition Array.h:1144
void RemoveAt(SizeType Index, EAllowShrinking AllowShrinking=UE::Core::Private::AllowShrinkingByDefault< AllocatorType >())
Definition Array.h:2083
void Reset(SizeType NewSize=0)
Definition Array.h:2246
SizeType AddDefaulted()
Definition Array.h:2795
void InsertDefaulted(SizeType Index)
Definition Array.h:1841
UE_REWRITE bool IsEmpty() const
Definition Array.h:1133
void SetNum(SizeType NewNum, EAllowShrinking AllowShrinking=UE::Core::Private::AllowShrinkingByDefault< AllocatorType >())
Definition Array.h:2308
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
void Empty(SizeType Slack=0)
Definition Array.h:2273
UE_FORCEINLINE_HINT void Reserve(SizeType Number)
Definition Array.h:3016
Definition UniquePtr.h:107
Definition SplineInterfaces.h:35
virtual bool IsClosedLoop() const override
Definition BSpline.h:233
virtual bool RemoveValue(int32 Index)
Definition BSpline.h:329
int32 NumKeys() const
Definition BSpline.h:295
bool SetValue(int32 Idx, const ValueType &NewValue)
Definition BSpline.h:310
const ValueType & GetValue(int32 Idx) const
Definition BSpline.h:300
const TArray< FKnot > & GetKnotVector() const
Definition BSpline.h:422
int32 AddValue(const ValueType &NewValue)
Definition BSpline.h:305
void Dump() const
Definition BSpline.h:152
Definition PolyBezierSpline.h:22
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 FInterval1f GetSegmentParameterRange(int32 SegmentIndex) const override
Definition PolyBezierSpline.h:1062
int32 FindSegmentIndex(float Parameter, float &OutLocalParam) const
Definition PolyBezierSpline.h:1486
bool RemoveSegment(const int32 SegmentIndex)
Definition PolyBezierSpline.h:902
virtual FInterval1f GetParameterSpace() const override
Definition PolyBezierSpline.h:1094
void SetClosedLoopFlag(bool bClosed)
Definition PolyBezierSpline.h:1326
virtual int32 SetParameter(int32 Index, float NewParameter) override
Definition PolyBezierSpline.h:1118
virtual float GetParameter(int32 Index) const override
Definition PolyBezierSpline.h:1101
static TPolyBezierSpline< ValueType > CreateLine(const ValueType &Start, const ValueType &End)
Definition PolyBezierSpline.h:66
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 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
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
static TPolyBezierSpline< ValueType > CreateCircle(const ValueType &Center, float Radius, int32 NumSegments=4)
Definition PolyBezierSpline.h:172
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
virtual FSplineTypeId::IdType GetTypeId() const override
Definition SplineInterfaces.h:168
EOutOfBoundsHandlingMode PreInfinityMode
Definition SplineInterfaces.h:190
ValueType Evaluate(float Parameter) const
Definition SplineInterfaces.h:117
SplineType InternalSpline
Definition Spline.h:93
Definition TangentBezierSpline.h:132
TTangentBezierControlPoint< ValueType > FTangentBezierControlPoint
Definition TangentBezierSpline.h:136
TTangentBezierSpline(const TTangentBezierSpline &Other)
Definition TangentBezierSpline.h:175
DECLARE_SPLINE_TYPE_ID(TEXT("TangentBezier"), *TSplineValueTypeTraits< VALUETYPE >::Name)
ValueType GetValue(float Parameter) const
Definition TangentBezierSpline.h:1174
ValueType GetTangent(float Parameter) const
Definition TangentBezierSpline.h:1214
void SetTangentIn(int32 Index, const ValueType &NewTangent)
Definition TangentBezierSpline.h:1282
virtual bool IsClosedLoop() const override
Definition TangentBezierSpline.h:389
void RemovePoint(int32 Index)
Definition TangentBezierSpline.h:1033
const TArray< ETangentMode > & GetTangentModes() const
Definition TangentBezierSpline.h:1644
void SetPointTangentMode(int32 Index, ETangentMode Mode)
Definition TangentBezierSpline.h:1372
virtual bool Serialize(FArchive &Ar) override
Definition TangentBezierSpline.h:206
ValueType GetValue(int32 Index) const
Definition TangentBezierSpline.h:1180
float FindNearestOnSegment(const ValueType &Point, int32 SegmentIndex, float &OutSquaredDistance) const
Definition TangentBezierSpline.h:1660
static TTangentBezierSpline CreateLine(const ValueType &StartPoint, const ValueType &EndPoint)
Definition TangentBezierSpline.h:270
FTangentBezierControlPoint GetControlPoint(int32 Index) const
Definition TangentBezierSpline.h:1003
bool AddControlPoints(const TArray< FTangentBezierControlPoint > &Points, bool bAppend=true)
Definition TangentBezierSpline.h:644
bool IsAutoTangent(int32 Index) const
Definition TangentBezierSpline.h:1362
int32 SetParameter(int32 Index, float NewParameter)
Definition TangentBezierSpline.h:1397
const TArray< FKnot > & GetKnotVector() const
Definition TangentBezierSpline.h:1609
int32 FindSegmentIndex(float Parameter, float &OutLocalParam) const
Definition TangentBezierSpline.h:1425
virtual TUniquePtr< ISplineInterface > Clone() const override
Definition TangentBezierSpline.h:370
void PrependPoint(const FTangentBezierControlPoint &ControlPoint)
Definition TangentBezierSpline.h:864
int32 InsertPointAtPosition(int32 PointIndex, const FTangentBezierControlPoint &ControlPoint)
Definition TangentBezierSpline.h:815
ETangentMode GetTangentMode(int32 Index) const
Definition TangentBezierSpline.h:1630
virtual int32 GetNumberOfSegments() const override
Definition TangentBezierSpline.h:1351
void SetStationaryEndpoints(bool bInStationaryEndpoints)
Definition TangentBezierSpline.h:1649
bool SetControlPoints(const TArray< FTangentBezierControlPoint > &Points)
Definition TangentBezierSpline.h:465
void SetKnotVector(const TArray< FKnot > &InKnots)
Definition TangentBezierSpline.h:1602
float Tension
Definition TangentBezierSpline.h:1765
float GetTension() const
Definition TangentBezierSpline.h:1620
void SetTangentOut(int32 Index, const ValueType &NewTangent)
Definition TangentBezierSpline.h:1313
TArray< ETangentMode > TangentModes
Definition TangentBezierSpline.h:1768
virtual FInterval1f GetParameterSpace() const override
Definition TangentBezierSpline.h:1415
virtual void SetClosedLoop(bool bInClosedLoop) override
Definition TangentBezierSpline.h:394
bool IsStationaryEndpoints() const
Definition TangentBezierSpline.h:1655
void SetTangentModes(const TArray< ETangentMode > &InTangentModes)
Definition TangentBezierSpline.h:1639
static TTangentBezierSpline CreateCircleArc(const ValueType &Center, float Radius, float StartAngle, float EndAngle, int32 NumSegments=4)
Definition TangentBezierSpline.h:293
ValueType GetTangentIn(int32 Index) const
Definition TangentBezierSpline.h:1220
TTangentBezierSpline & operator=(const TTangentBezierSpline &Other)
Definition TangentBezierSpline.h:183
TTangentBezierSpline(const ValueType &StartPoint, const ValueType &EndPoint, const ValueType &StartTangent, const ValueType &EndTangent, bool bAutoTangents=false)
Definition TangentBezierSpline.h:158
bool bStationaryEndpoint
Definition TangentBezierSpline.h:1770
void UpdateBezierControlPoint(int32 Index, const ValueType &NewValue)
Definition TangentBezierSpline.h:1665
void Reparameterize(EParameterizationPolicy Policy=EParameterizationPolicy::Centripetal)
Definition TangentBezierSpline.h:1594
float GetParameter(int32 Index) const
Definition TangentBezierSpline.h:1391
bool operator==(const TTangentBezierSpline< ValueType > &Other) const
Definition TangentBezierSpline.h:254
TTangentBezierSpline(const ValueType &StartPoint, const ValueType &EndPoint)
Definition TangentBezierSpline.h:148
TSplineWrapper< TPolyBezierSpline< VALUETYPE > >::ValueType ValueType
Definition TangentBezierSpline.h:134
void SetValue(int32 Index, const ValueType &NewValue)
Definition TangentBezierSpline.h:1166
static TTangentBezierSpline CreateEllipse(const ValueType &Center, float RadiusX, float RadiusY, int32 NumSegments=4)
Definition TangentBezierSpline.h:351
int32 InsertPointAtGlobalParam(float Parameter, const FTangentBezierControlPoint &ControlPoint)
Definition TangentBezierSpline.h:741
void UpdateTangents()
Definition TangentBezierSpline.h:1433
static TTangentBezierSpline CreateCircle(const ValueType &Center, float Radius, int32 NumSegments=4)
Definition TangentBezierSpline.h:324
const FPolyBezierSpline3d & GetInternalSpline() const
Definition TangentBezierSpline.h:1615
void ModifyPoint(int32 Index, const FTangentBezierControlPoint &ControlPoint)
Definition TangentBezierSpline.h:1096
int32 InsertPointAtSegmentParam(int32 SegmentIndex, float LocalT, const FTangentBezierControlPoint &ControlPoint, EParameterizationPolicy ParameterizationPolicy=EParameterizationPolicy::Centripetal)
Definition TangentBezierSpline.h:762
virtual bool IsEqual(const ISplineInterface *OtherSpline) const override
Definition TangentBezierSpline.h:195
ValueType GetTangentOut(int32 Index) const
Definition TangentBezierSpline.h:1255
virtual void Clear() override
Definition TangentBezierSpline.h:1385
void AppendPoint(const FTangentBezierControlPoint &ControlPoint)
Definition TangentBezierSpline.h:922
int32 GetNumPoints() const
Definition TangentBezierSpline.h:1332
void UpdatePointTangents(int32 Index, ETangentMode Mode)
Definition TangentBezierSpline.h:1452
virtual float FindNearest(const ValueType &Point, float &OutSquaredDistance) const override
Definition TangentBezierSpline.h:1588
void SetTension(const float InTension)
Definition TangentBezierSpline.h:1625
virtual ~TTangentBezierSpline() override=default
virtual FInterval1f GetSegmentParameterRange(int32 SegmentIndex) const override
Definition TangentBezierSpline.h:1356
TTangentBezierSpline()=default
friend FArchive & operator<<(FArchive &Ar, TTangentBezierSpline &Spline)
Definition TangentBezierSpline.h:248
@ ControlPoint
Definition Visu.h:27
double Size(const T &Value)
Definition SplineMath.h:158
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
TPolyBezierSpline< FVector3d > FPolyBezierSpline3d
Definition PolyBezierSpline.h:1947
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
static UE_FORCEINLINE_HINT bool IsNearlyZero(float Value, float ErrorTolerance=UE_SMALL_NUMBER)
Definition UnrealMathUtility.h:407
Definition SplineTypeId.h:21
Definition TangentBezierSpline.h:48
ETangentMode TangentMode
Definition TangentBezierSpline.h:59
TTangentBezierControlPoint()
Definition TangentBezierSpline.h:62
bool operator==(const TTangentBezierControlPoint &Other) const
Definition TangentBezierSpline.h:114
TTangentBezierControlPoint(const ValueType &InPosition)
Definition TangentBezierSpline.h:71
friend FArchive & operator<<(FArchive &Ar, TTangentBezierControlPoint &Point)
Definition TangentBezierSpline.h:108
ValueType TangentOut
Definition TangentBezierSpline.h:56
void Serialize(FArchive &Ar)
Definition TangentBezierSpline.h:92
ValueType TangentIn
Definition TangentBezierSpline.h:53
ValueType Position
Definition TangentBezierSpline.h:50
TTangentBezierControlPoint(const ValueType &InPosition, const ValueType &InTangentIn, const ValueType &InTangentOut, ETangentMode InTangentMode)
Definition TangentBezierSpline.h:80