UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
RichCurve.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "CoreMinimal.h"
7#include "UObject/Class.h"
8#include "Curves/KeyHandle.h"
9#include "Curves/RealCurve.h"
10#include "Chaos/Curve.h"
11#include "RichCurve.generated.h"
12
14UENUM(BlueprintType)
16{
18 RCTM_Auto UMETA(DisplayName="Auto"),
20 RCTM_User UMETA(DisplayName="User"),
22 RCTM_Break UMETA(DisplayName="Break"),
26 RCTM_SmartAuto UMETA(DisplayName = "Smart Auto"),
27};
28
29
31UENUM(BlueprintType)
33{
35 RCTWM_WeightedNone UMETA(DisplayName="None"),
37 RCTWM_WeightedArrive UMETA(DisplayName="Arrive"),
39 RCTWM_WeightedLeave UMETA(DisplayName="Leave"),
41 RCTWM_WeightedBoth UMETA(DisplayName="Both")
42};
43
45UENUM()
47{
49 RCCF_Empty UMETA(DisplayName = "Empty"),
50
52 RCCF_Constant UMETA(DisplayName = "Constant"),
53
55 RCCF_Linear UMETA(DisplayName = "Linear"),
56
58 RCCF_Cubic UMETA(DisplayName = "Cubic"),
59
61 RCCF_Mixed UMETA(DisplayName = "Mixed"),
62
64 RCCF_Weighted UMETA(DisplayName = "Weighted"),
65};
66
68UENUM()
70{
72 RCKTCF_uint16 UMETA(DisplayName = "uint16"),
73
75 RCKTCF_float32 UMETA(DisplayName = "float32"),
76};
77
79USTRUCT(BlueprintType)
81{
83
84
85 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Key")
87
89 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Key")
91
93 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Key")
95
97 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Key")
98 float Time;
99
101 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Key")
102 float Value;
103
105 UPROPERTY()
106 float ArriveTangent;
107
109 UPROPERTY()
110 float ArriveTangentWeight;
111
113 UPROPERTY()
114 float LeaveTangent;
115
117 UPROPERTY()
118 float LeaveTangentWeight;
119
121 : InterpMode(RCIM_Linear)
122 , TangentMode(RCTM_Auto)
123 , TangentWeightMode(RCTWM_WeightedNone)
124 , Time(0.f)
125 , Value(0.f)
126 , ArriveTangent(0.f)
127 , ArriveTangentWeight(0.f)
128 , LeaveTangent(0.f)
129 , LeaveTangentWeight(0.f)
130 { }
131
133 : InterpMode(RCIM_Linear)
134 , TangentMode(RCTM_Auto)
135 , TangentWeightMode(RCTWM_WeightedNone)
136 , Time(InTime)
137 , Value(InValue)
138 , ArriveTangent(0.f)
139 , ArriveTangentWeight(0.f)
140 , LeaveTangent(0.f)
141 , LeaveTangentWeight(0.f)
142 { }
143
145 : InterpMode(InInterpMode)
146 , TangentMode(RCTM_Auto)
147 , TangentWeightMode(RCTWM_WeightedNone)
148 , Time(InTime)
149 , Value(InValue)
150 , ArriveTangent(InArriveTangent)
151 , ArriveTangentWeight(0.f)
152 , LeaveTangent(InLeaveTangent)
153 , LeaveTangentWeight(0.f)
154 { }
155
161
163 ENGINE_API bool Serialize(FArchive& Ar);
164 ENGINE_API bool operator==(const FRichCurveKey& Other) const;
165 ENGINE_API bool operator!=(const FRichCurveKey& Other) const;
166
168 {
169 P.Serialize(Ar);
170 return Ar;
171 }
172};
173
174
175template<>
177{
178 enum { Value = true };
179};
180
181
182template<>
194
195
197USTRUCT()
200{
202
203public:
204
206 ENGINE_API TArray<FRichCurveKey> GetCopyOfKeys() const;
207
209 ENGINE_API const TArray<FRichCurveKey>& GetConstRefOfKeys() const;
210
213
215 ENGINE_API FRichCurveKey& GetKey(FKeyHandle KeyHandle);
216 ENGINE_API FRichCurveKey GetKey(FKeyHandle KeyHandle) const;
217 ENGINE_API const FRichCurveKey& GetKeyRef(FKeyHandle KeyHandle) const;
218
220 ENGINE_API FRichCurveKey GetFirstKey() const;
221 ENGINE_API FRichCurveKey GetLastKey() const;
222
224 ENGINE_API FRichCurveKey* GetFirstMatchingKey(const TArray<FKeyHandle>& KeyHandles);
225
232 ENGINE_API virtual FKeyHandle AddKey(float InTime, float InValue, const bool bUnwindRotation = false, FKeyHandle KeyHandle = FKeyHandle()) final override;
233
239 ENGINE_API void ReserveKeys(const int32 Number);
240
248 ENGINE_API void SetKeys(const TArray<FRichCurveKey>& InKeys);
249
256 ENGINE_API void DeleteKey(FKeyHandle KeyHandle) final override;
257
259 ENGINE_API virtual FKeyHandle UpdateOrAddKey(float InTime, float InValue, const bool bUnwindRotation = false, float KeyTimeTolerance = UE_KINDA_SMALL_NUMBER) final override;
260
262 ENGINE_API virtual void SetKeyTime(FKeyHandle KeyHandle, float NewTime) final override;
263
265 ENGINE_API virtual float GetKeyTime(FKeyHandle KeyHandle) const final override;
266
268 ENGINE_API virtual void SetKeyValue(FKeyHandle KeyHandle, float NewValue, bool bAutoSetTangents = true) final override;
269
271 ENGINE_API virtual float GetKeyValue(FKeyHandle KeyHandle) const final override;
272
274 ENGINE_API virtual TPair<float, float> GetKeyTimeValuePair(FKeyHandle KeyHandle) const final override;
275
277 ENGINE_API bool IsConstant(float Tolerance = UE_SMALL_NUMBER) const;
278
280 bool IsEmpty() const { return Keys.Num() == 0; }
281
283 ENGINE_API virtual void SetKeyInterpMode(FKeyHandle KeyHandle, ERichCurveInterpMode NewInterpMode) final override;
284 ENGINE_API void SetKeyInterpMode(FKeyHandle KeyHandle, ERichCurveInterpMode NewInterpMode, bool bAutoSetTangents);
285
287 ENGINE_API void SetKeyTangentMode(FKeyHandle KeyHandle, ERichCurveTangentMode NewTangentMode, bool bAutoSetTangents = true);
288
290 ENGINE_API void SetKeyTangentWeightMode(FKeyHandle KeyHandle, ERichCurveTangentWeightMode NewTangentWeightMode, bool bAutoSetTangents = true);
291
293 ENGINE_API virtual ERichCurveInterpMode GetKeyInterpMode(FKeyHandle KeyHandle) const final override;
294
296 ENGINE_API ERichCurveTangentMode GetKeyTangentMode(FKeyHandle KeyHandle) const;
297
299 ENGINE_API virtual void GetTimeRange(float& MinTime, float& MaxTime) const final override;
300
302 ENGINE_API virtual void GetValueRange(float& MinValue, float& MaxValue) const final override;
303
305 ENGINE_API virtual void Reset() final override;
306
308 ENGINE_API virtual void RemapTimeValue(float& InTime, float& CycleValueOffset) const final override;
309
311 ENGINE_API virtual float Eval(float InTime, float InDefaultValue = 0.0f) const final override;
312
314 ENGINE_API void AutoSetTangents(float Tension = 0.f);
315
317 ENGINE_API virtual void ReadjustTimeRange(float NewMinTimeRange, float NewMaxTimeRange, bool bInsert/* whether insert or remove*/, float OldStartTime, float OldEndTime) final override;
318
320 ENGINE_API bool operator == (const FRichCurve& Curve) const;
321
323 ENGINE_API virtual void BakeCurve(float SampleRate) final override;
324 ENGINE_API virtual void BakeCurve(float SampleRate, float FirstKeyTime, float LastKeyTime) final override;
325
327 ENGINE_API void RemoveRedundantAutoTangentKeys(float Tolerance);
328 ENGINE_API virtual void RemoveRedundantKeys(float Tolerance, FFrameRate SampleRate) final override;
329
330 ENGINE_API void RemoveRedundantAutoTangentKeys(float Tolerance, float FirstKeyTime, float LastKeyTime);
331 ENGINE_API virtual void RemoveRedundantKeys(float Tolerance, float FirstKeyTime, float LastKeyTime, FFrameRate SampleRate) final override;
332
334 ENGINE_API void CompressCurve(struct FCompressedRichCurve& OutCurve, float ErrorThreshold = 0.0001f, float SampleRate = 120.0) const;
335
337 virtual FIndexedCurve* Duplicate() const final { return new FRichCurve(*this); }
338
340 ENGINE_API void ConvertToChaosCurve(Chaos::FLinearCurve& OutCurve) const;
341
342private:
343 ENGINE_API void RemoveRedundantKeysInternal(float Tolerance, int32 InStartKeepKey, int32 InEndKeepKey, FFrameRate SampleRate);
344 ENGINE_API virtual int32 GetKeyIndex(float KeyTime, float KeyTimeTolerance) const override final;
345
346public:
347
348 // FIndexedCurve interface
349
350 virtual int32 GetNumKeys() const final override { return Keys.Num(); }
351
352public:
353
355 UPROPERTY(EditAnywhere, EditFixedSize, Category="Curve", meta=(EditFixedOrder))
357};
358
362USTRUCT()
364{
366
367
369
372
375
378
386
393
396
398 : CompressionFormat(RCCF_Empty)
399 , KeyTimeCompressionFormat(RCKTCF_float32)
400 , PreInfinityExtrap(RCCE_None)
401 , PostInfinityExtrap(RCCE_None)
402 , ConstantValueNumKeys()
403 , CompressedKeys()
404 {}
405
407 ENGINE_API float Eval(float InTime, float InDefaultValue = 0.0f) const;
408
410 ENGINE_API void PopulateCurve(FRichCurve& OutCurve) const;
411
412 // Encapsulates the StaticEval arguments
414 {
417
419 ERichCurveExtrapolation PostInfinityExtrap = RCCE_None;
420
422
423 const uint8* CompressedKeys = nullptr;
424
425 float Time = 0.0f;
426
427 float DefaultValue = 0.0f;
428 };
429
431 static ENGINE_API float StaticEval(const FStaticEvalArgs& Args);
432
434 UE_DEPRECATED(5.6, "Please use StaticEval with the packed arguments structure as it has improved performance")
435 static ENGINE_API float StaticEval(ERichCurveCompressionFormat CompressionFormat, ERichCurveKeyTimeCompressionFormat KeyTimeCompressionFormat, ERichCurveExtrapolation PreInfinityExtrap, ERichCurveExtrapolation PostInfinityExtrap, TConstantValueNumKeys ConstantValueNumKeys, const uint8* CompressedKeys, float InTime, float InDefaultValue = 0.0f);
436
438 ENGINE_API bool Serialize(FArchive& Ar);
439 ENGINE_API bool operator==(const FCompressedRichCurve& Other) const;
440 bool operator!=(const FCompressedRichCurve& Other) const { return !(*this == Other); }
441
443 {
444 Curve.Serialize(Ar);
445 return Ar;
446 }
447};
448
449/*
450 * Override serialization for compressed rich curves to handle the union
451 */
452template<>
464
468template<class T>
507
508
509// Rename and deprecate
#define UE_DEPRECATED(Version, Message)
Definition CoreMiscDefines.h:302
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
UE_FORCEINLINE_HINT bool operator!=(const FIndexedPointer &Other) const
Definition LockFreeList.h:76
#define UPROPERTY(...)
UObject definition macros.
Definition ObjectMacros.h:744
#define UENUM(...)
Definition ObjectMacros.h:749
#define USTRUCT(...)
Definition ObjectMacros.h:746
EPropertyObjectReferenceType
Definition ObjectMacros.h:533
#define GENERATED_USTRUCT_BODY(...)
Definition ObjectMacros.h:767
ERichCurveExtrapolation
Definition RealCurve.h:27
ERichCurveInterpMode
Definition RealCurve.h:13
ERichCurveInterpMode GetKeyInterpMode(ERichCurveCompressionFormat Format)
Definition RichCurve.cpp:2250
ERichCurveKeyTimeCompressionFormat
Definition RichCurve.h:70
@ UMETA
Definition RichCurve.h:18
ERichCurveTangentWeightMode
Definition RichCurve.h:33
FRichCurveEditInfoTemplate< const FRealCurve * > FRichCurveEditInfoConst
Definition RichCurve.h:511
FRichCurveEditInfoTemplate< FRealCurve * > FRichCurveEditInfo
Definition RichCurve.h:510
ERichCurveCompressionFormat
Definition RichCurve.h:47
ERichCurveTangentMode
Definition RichCurve.h:16
uint32 PointerHash(const void *Key)
Definition TypeHash.h:91
UE_FORCEINLINE_HINT uint32 GetTypeHashHelper(const T &V)
Definition TypeHash.h:215
constexpr uint32 HashCombine(uint32 A, uint32 C)
Definition TypeHash.h:36
#define UE_SMALL_NUMBER
Definition UnrealMathUtility.h:130
#define UE_KINDA_SMALL_NUMBER
Definition UnrealMathUtility.h:131
uint8_t uint8
Definition binka_ue_file_header.h:8
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition Curve.h:24
Definition Archive.h:1208
Definition InterpCurvePoint.h:51
Definition NameTypes.h:617
Definition Array.h:670
Definition EnumAsByte.h:22
Definition Array.h:64
Definition RichCurve.h:414
TConstantValueNumKeys ConstantValueNumKeys
Definition RichCurve.h:421
Definition RichCurve.h:364
friend FArchive & operator<<(FArchive &Ar, FCompressedRichCurve &Curve)
Definition RichCurve.h:442
TArray< uint8 > CompressedKeys
Definition RichCurve.h:395
FCompressedRichCurve()
Definition RichCurve.h:397
TConstantValueNumKeys ConstantValueNumKeys
Definition RichCurve.h:392
Definition FrameRate.h:21
Definition IndexedCurve.h:18
Definition KeyHandle.h:15
Definition RealCurve.h:125
Definition RichCurve.h:470
uint32 GetTypeHash() const
Definition RichCurve.h:497
FRichCurveEditInfoTemplate(T InCurveToEdit)
Definition RichCurve.h:482
friend uint32 GetTypeHash(const FRichCurveEditInfoTemplate< T > &RichCurveEditInfo)
Definition RichCurve.h:502
FRichCurveEditInfoTemplate(T InCurveToEdit, FName InCurveName)
Definition RichCurve.h:487
T CurveToEdit
Definition RichCurve.h:475
FRichCurveEditInfoTemplate()
Definition RichCurve.h:477
FName CurveName
Definition RichCurve.h:472
bool operator==(const FRichCurveEditInfoTemplate< T > &Other) const
Definition RichCurve.h:492
Definition RichCurve.h:81
FRichCurveKey(float InTime, float InValue)
Definition RichCurve.h:132
FRichCurveKey(float InTime, float InValue, float InArriveTangent, const float InLeaveTangent, ERichCurveInterpMode InInterpMode)
Definition RichCurve.h:144
friend FArchive & operator<<(FArchive &Ar, FRichCurveKey &P)
Definition RichCurve.h:167
Definition RichCurve.h:200
virtual int32 GetNumKeys() const final override
Definition RichCurve.h:350
bool IsEmpty() const
Definition RichCurve.h:280
Definition IsPODType.h:12
@ Value
Definition IsPODType.h:13
Definition StructOpsTypeTraits.h:11
@ WithIdenticalViaEquality
Definition StructOpsTypeTraits.h:18
@ WithCopy
Definition StructOpsTypeTraits.h:17
@ WithSerializer
Definition StructOpsTypeTraits.h:23
static constexpr EPropertyObjectReferenceType WithSerializerObjectReferences
Definition StructOpsTypeTraits.h:41
Definition StructOpsTypeTraits.h:46
Definition Tuple.h:652
TConstantValueNumKeys()
Definition RichCurve.h:384
int32 NumKeys
Definition RichCurve.h:382
float ConstantValue
Definition RichCurve.h:381