13 template <
typename ChannelType>
15 std::is_same_v<ChannelType, FMovieSceneDoubleChannel> ||
16 std::is_same_v<ChannelType, FMovieSceneFloatChannel>;
43 static void DrawBezierCurve(
53 using ChannelValueType =
typename ChannelType::ChannelValueType;
56 using CurveValueType =
typename ChannelType::CurveValueType;
64 const bool bComplexPreInfinityExtrapolation =
65 PreInfinityExtrapolation == ERichCurveExtrapolation::RCCE_Cycle ||
66 PreInfinityExtrapolation == ERichCurveExtrapolation::RCCE_CycleWithOffset ||
67 PreInfinityExtrapolation == ERichCurveExtrapolation::RCCE_Oscillate;
69 const bool bComplexPostInfinityExtrapolation =
70 PostInfinityExtrapolation == ERichCurveExtrapolation::RCCE_Cycle ||
71 PostInfinityExtrapolation == ERichCurveExtrapolation::RCCE_CycleWithOffset ||
72 PostInfinityExtrapolation == ERichCurveExtrapolation::RCCE_Oscillate;
75 (bComplexPreInfinityExtrapolation || bComplexPostInfinityExtrapolation) &&
76 (Times.
Num() > 1 && Values.
Num() > 1);
91 Private::PopulateCurvePoints<ChannelType, ChannelValueType, CurveValueType>(
120 static void PopulateCurvePoints(
177 static void RefineCurvePoints(
203 CurveValueType
Value = 0.0;
259 PreInfinityExtrapolation =
InChannel.PreInfinityExtrap;
260 PostInfinityExtrapolation =
InChannel.PostInfinityExtrap;
265 bComplexPreInfinityExtrapolation =
266 PreInfinityExtrapolation == ERichCurveExtrapolation::RCCE_Cycle ||
267 PreInfinityExtrapolation == ERichCurveExtrapolation::RCCE_CycleWithOffset ||
268 PreInfinityExtrapolation == ERichCurveExtrapolation::RCCE_Oscillate;
270 bComplexPostInfinityExtrapolation =
271 PostInfinityExtrapolation == ERichCurveExtrapolation::RCCE_Cycle ||
272 PostInfinityExtrapolation == ERichCurveExtrapolation::RCCE_CycleWithOffset ||
273 PostInfinityExtrapolation == ERichCurveExtrapolation::RCCE_Oscillate;
276 (bComplexPreInfinityExtrapolation || bComplexPostInfinityExtrapolation) &&
277 (Times.
Num() > 1 && Values.
Num() > 1);
293 CurveStartSeconds = Times[0] / TickResolution;
294 CurveEndSeconds = Times.
Last() / TickResolution;
295 CurveDurationSeconds = CurveEndSeconds - CurveStartSeconds;
297 VisibleCurveStartSeconds = FMath::Max(CurveStartSeconds, StartTimeSeconds);
298 VisibleCurveEndSeconds = FMath::Min(CurveEndSeconds, EndTimeSeconds);
300 PreInfinityDuration = CurveStartSeconds - StartTimeSeconds;
301 PostInfinityDuration = EndTimeSeconds - CurveEndSeconds;
303 bPreInfinityVisible = PreInfinityDuration > 0.0;
304 bPostInfinityVisible = PostInfinityDuration > 0.0;
306 bPreInfinityOscillates = PreInfinityExtrapolation == ERichCurveExtrapolation::RCCE_Oscillate;
307 bPostInfinityOscillates = PostInfinityExtrapolation == ERichCurveExtrapolation::RCCE_Oscillate;
340 if (bPreInfinityVisible)
342 if (bComplexPreInfinityExtrapolation)
354 if (bPostInfinityVisible)
356 if (bComplexPostInfinityExtrapolation)
369 const ChannelType& Channel;
375 const double TimeThreshold = 0.0;
378 const double ValueThreshold = 0.0;
381 const double StartTimeSeconds = 0.0;
384 const double EndTimeSeconds = 0.0;
393 bool bComplexPreInfinityExtrapolation =
false;
396 bool bComplexPostInfinityExtrapolation =
false;
399 double CurveStartSeconds = 0.0;
402 double CurveEndSeconds = 0.0;
405 double CurveDurationSeconds = 0.0;
408 double VisibleCurveStartSeconds = 0.0;
411 double VisibleCurveEndSeconds = 0.0;
414 double PreInfinityDuration = 0.0;
417 double PostInfinityDuration = 0.0;
420 bool bPreInfinityVisible =
false;
423 bool bPostInfinityVisible =
false;
426 bool bPreInfinityOscillates =
false;
429 bool bPostInfinityOscillates =
false;
440 if (bPreInfinityVisible && bComplexPreInfinityExtrapolation)
442 return bPreInfinityOscillates ?
444 FMath::Max(CurveStartSeconds, CurveEndSeconds - PreInfinityDuration);
448 return VisibleCurveStartSeconds;
454 if (bPreInfinityVisible && bComplexPreInfinityExtrapolation)
456 return bPreInfinityOscillates ?
457 FMath::Min(CurveEndSeconds, CurveStartSeconds + PreInfinityDuration) :
462 return VisibleCurveEndSeconds;
469 if (bPostInfinityVisible && bComplexPostInfinityExtrapolation)
471 return bPostInfinityOscillates ?
472 FMath::Max(CurveStartSeconds, CurveEndSeconds - PostInfinityDuration) :
477 return VisibleCurveStartSeconds;
484 if (bPostInfinityVisible && bComplexPostInfinityExtrapolation)
486 return bPostInfinityOscillates ?
488 FMath::Min(CurveEndSeconds, CurveStartSeconds + PostInfinityDuration);
492 return VisibleCurveEndSeconds;
505 if (PreInfinityExtrapolation == ERichCurveExtrapolation::RCCE_None ||
506 PreInfinityExtrapolation == ERichCurveExtrapolation::RCCE_Constant)
510 else if (PreInfinityExtrapolation == ERichCurveExtrapolation::RCCE_Linear)
552 const double StartTime =
FirstKey.X;
553 const double ValueOffset = PreInfinityExtrapolation == ERichCurveExtrapolation::RCCE_CycleWithOffset ?
558 for (
int32 Iteration = NumIterations; Iteration > 0; Iteration--)
560 const bool bReverse = PreInfinityExtrapolation == ERichCurveExtrapolation::RCCE_Oscillate && Iteration % 2 != 0;
577 const double Time =
Point.Get<0>() - CurveDurationSeconds * Iteration;
578 const double Value =
Point.Get<1>() - ValueOffset * Iteration;
592 if (PostInfinityExtrapolation == ERichCurveExtrapolation::RCCE_None ||
593 PostInfinityExtrapolation == ERichCurveExtrapolation::RCCE_Constant)
597 else if (PostInfinityExtrapolation == ERichCurveExtrapolation::RCCE_Linear)
639 const double StartTime =
FirstKey.X;
640 const double ValueOffset = PostInfinityExtrapolation == ERichCurveExtrapolation::RCCE_CycleWithOffset ?
647 const bool bReverse = PostInfinityExtrapolation == ERichCurveExtrapolation::RCCE_Oscillate && Iteration % 2 != 0;
664 const double Time =
Point.Get<0>() + CurveDurationSeconds * Iteration;
665 const double Value =
Point.Get<1>() + ValueOffset * Iteration;
#define ensureMsgf( InExpression, InFormat,...)
Definition AssertionMacros.h:465
#define ensure( InExpression)
Definition AssertionMacros.h:464
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
ERichCurveExtrapolation
Definition RealCurve.h:27
constexpr TTuple< std::decay_t< Types >... > MakeTuple(Types &&... Args)
Definition Tuple.h:794
#define UE_ARRAY_COUNT(array)
Definition UnrealTemplate.h:212
Definition UnrealTemplate.h:321
Definition ArrayView.h:139
UE_FORCEINLINE_HINT constexpr SizeType Num() const
Definition ArrayView.h:380
constexpr ElementType & Last(SizeType IndexFromTheEnd=0) const
Definition ArrayView.h:410
Definition MovieSceneDrawBezierCurve.h:14
UE_REWRITE auto LowerBound(const RangeType &Range, const ValueType &Value, SortPredicateType SortPredicate) -> decltype(GetNum(Range))
Definition BinarySearch.h:92
UE_REWRITE auto UpperBound(const RangeType &Range, const ValueType &Value, SortPredicateType SortPredicate) -> decltype(GetNum(Range))
Definition BinarySearch.h:133
constexpr int32 NumIterations
Definition SoftsEvolution.cpp:13
Definition OverriddenPropertySet.cpp:45
Definition ConstraintsManager.h:14
U16 Index
Definition radfft.cpp:71
Definition FrameRate.h:21
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 Min3(const T A, const T B, const T C)
Definition UnrealMathUtility.h:558
static UE_FORCEINLINE_HINT bool IsNearlyZero(float Value, float ErrorTolerance=UE_SMALL_NUMBER)
Definition UnrealMathUtility.h:407
static constexpr UE_FORCEINLINE_HINT T Max3(const T A, const T B, const T C)
Definition UnrealMathUtility.h:551
Definition MovieSceneDrawBezierCurve.h:232
FMovieSceneDrawInfiniteBezierCurve(const ChannelType &InChannel, const FFrameRate &InTickResolution, const double &InTimeThreshold, const double &InValueThreshold, const double &InStartTimeSeconds, const double &InEndTimeSeconds, TArray< TTuple< double, double > > &OutInterpolatingPoints)
Definition MovieSceneDrawBezierCurve.h:244