UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
SplineInterfaces.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"
6#include "BoxTypes.h"
7#include "SplineTypeId.h"
8
9namespace UE
10{
11namespace Geometry
12{
13namespace Spline
14{
15
16// Forward declarations
17class UE_EXPERIMENTAL(5.7, "New spline APIs are experimental.") ISplineInterface;
18template <typename VALUETYPE> class UE_EXPERIMENTAL(5.7, "New spline APIs are experimental.") TSplineInterface;
19
23enum class UE_EXPERIMENTAL(5.7, "New spline APIs are experimental.") EOutOfBoundsHandlingMode
24{
25 Zero, // Null out the values outside of the bounds
26 Constant, // Choose the nearest of the first/last value
27 Cycle // Repeat the curve indefinitely (mod of the parameter space)
28};
29
35{
36public:
37 virtual ~ISplineInterface() = default;
38
39 virtual void Clear() = 0;
41 virtual bool IsEqual(const ISplineInterface* OtherSpline) const = 0;
42
43 virtual FString GetValueTypeName() const = 0;
44 virtual FString GetImplementationName() const = 0;
45 virtual FInterval1f GetParameterSpace() const = 0;
46 virtual void SetClosedLoop(bool bClosed) = 0;
47 virtual bool IsClosedLoop() const = 0;
52 virtual FSplineTypeId::IdType GetTypeId() const = 0;
53
54 virtual int32 GetNumberOfSegments() const = 0;
55 virtual FInterval1f GetSegmentParameterRange(int32 SegmentIndex) const = 0;
56
57 virtual bool Serialize(FArchive& Ar)
58 {
59 // Simple version marker for future compatibility
60 int32 Version = 1;
61 Ar << Version;
62
63 if (Ar.IsSaving())
64 {
65 // Just write type ID (4 bytes)
67 Ar << TypeId;
68 }
69 else // Loading
70 {
71 // Just read (and discard) the type ID - object already created
73 Ar << TypeId;
74 }
75
76 return true;
77 }
78
80 {
81 Spline.Serialize(Ar);
82 return Ar;
83 }
84};
85
90template <typename VALUETYPE>
92{
93 static FString TypeName;
94
95public:
97
102 {
103 // Ensure the value type name is initialized if not already
104 if (TypeName.IsEmpty())
105 {
107 }
108 }
109
110 virtual ~TSplineInterface() override = default;
111
117 ValueType Evaluate(float Parameter) const
118 {
120 {
121 return ValueType();
122 }
123
124 return EvaluateImpl(HandleOutOfBounds(Parameter));
125 }
126
133 virtual float FindNearest(const ValueType& Point, float& OutSquaredDistance) const = 0;
134
138 virtual bool Serialize(FArchive& Ar) override
139 {
140 // Call base class Serialize first to handle version and type ID
142 {
143 return false;
144 }
145 // Serialize infinity modes
146 uint8 PreMode = static_cast<uint8>(PreInfinityMode);
147 uint8 PostMode = static_cast<uint8>(PostInfinityMode);
148 Ar << PreMode;
149 Ar << PostMode;
150
151 if (Ar.IsLoading())
152 {
155 }
156 return true;
157 }
158
160 {
161 Spline.Serialize(Ar);
162 return Ar;
163 }
164
168 virtual FSplineTypeId::IdType GetTypeId() const override { return 0; }
169
173 static void SetTypeName(const FString& InTypeName) { TypeName = InTypeName; }
174 virtual FString GetValueTypeName() const override { return TypeName; }
175
178
181
184
187
188protected:
190 EOutOfBoundsHandlingMode PreInfinityMode = EOutOfBoundsHandlingMode::Zero;
191 EOutOfBoundsHandlingMode PostInfinityMode = EOutOfBoundsHandlingMode::Zero;
192
194 float HandleOutOfBounds(float Parameter) const
195 {
197 if (Parameter < ParentSpaceRange.Min)
198 {
199 switch (PreInfinityMode)
200 {
201 case EOutOfBoundsHandlingMode::Zero:
202 return 0.0f;
203 case EOutOfBoundsHandlingMode::Constant:
204 return ParentSpaceRange.Min;
205 case EOutOfBoundsHandlingMode::Cycle:
206 {
207 const float Range = ParentSpaceRange.Length();
208 return FMath::Fmod(Parameter - ParentSpaceRange.Min, Range) + ParentSpaceRange.Min;
209 }
210 }
211 }
212 else if (Parameter > ParentSpaceRange.Max)
213 {
214 switch (PostInfinityMode)
215 {
216 case EOutOfBoundsHandlingMode::Zero:
217 return 0.0f;
218 case EOutOfBoundsHandlingMode::Constant:
219 return ParentSpaceRange.Max;
220 case EOutOfBoundsHandlingMode::Cycle:
221 {
222 const float Range = ParentSpaceRange.Length();
223 return FMath::Fmod(Parameter - ParentSpaceRange.Min, Range) + ParentSpaceRange.Min;
224 }
225 }
226 }
227 return Parameter;
228 }
229
233 virtual ValueType EvaluateImpl(float Parameter) const = 0;
234};
235
236// Initialize static member
237template <typename VALUETYPE>
239
240} // namespace Spline
241} // namespace Geometry
242} // namespace UE
#define UE_EXPERIMENTAL(Version, Message)
Definition CoreMiscDefines.h:369
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
uint8_t uint8
Definition binka_ue_file_header.h:8
Definition Archive.h:1208
UE_FORCEINLINE_HINT bool IsLoading() const
Definition Archive.h:236
UE_FORCEINLINE_HINT bool IsSaving() const
Definition Archive.h:248
Definition UniquePtr.h:107
uint32 IdType
Definition SplineTypeId.h:33
Definition SplineInterfaces.h:35
virtual TUniquePtr< ISplineInterface > Clone() const =0
virtual FInterval1f GetParameterSpace() const =0
virtual bool IsClosedLoop() const =0
virtual FSplineTypeId::IdType GetTypeId() const =0
virtual int32 GetNumberOfSegments() const =0
virtual FString GetImplementationName() const =0
virtual bool IsEqual(const ISplineInterface *OtherSpline) const =0
virtual bool Serialize(FArchive &Ar)
Definition SplineInterfaces.h:57
virtual void SetClosedLoop(bool bClosed)=0
virtual FString GetValueTypeName() const =0
virtual FInterval1f GetSegmentParameterRange(int32 SegmentIndex) const =0
friend FArchive & operator<<(FArchive &Ar, ISplineInterface &Spline)
Definition SplineInterfaces.h:79
Definition SplineInterfaces.h:92
TSplineInterface()
Definition SplineInterfaces.h:101
friend FArchive & operator<<(FArchive &Ar, TSplineInterface &Spline)
Definition SplineInterfaces.h:159
virtual ~TSplineInterface() override=default
EOutOfBoundsHandlingMode PostInfinityMode
Definition SplineInterfaces.h:191
virtual float FindNearest(const ValueType &Point, float &OutSquaredDistance) const =0
VALUETYPE ValueType
Definition SplineInterfaces.h:96
virtual EOutOfBoundsHandlingMode GetPreInfinityMode() const
Definition SplineInterfaces.h:183
static void SetTypeName(const FString &InTypeName)
Definition SplineInterfaces.h:173
virtual void SetPostInfinityMode(EOutOfBoundsHandlingMode InMode)
Definition SplineInterfaces.h:180
virtual FString GetValueTypeName() const override
Definition SplineInterfaces.h:174
virtual FSplineTypeId::IdType GetTypeId() const override
Definition SplineInterfaces.h:168
virtual EOutOfBoundsHandlingMode GetPostInfinityMode() const
Definition SplineInterfaces.h:186
EOutOfBoundsHandlingMode PreInfinityMode
Definition SplineInterfaces.h:190
virtual void SetPreInfinityMode(EOutOfBoundsHandlingMode InMode)
Definition SplineInterfaces.h:177
ValueType Evaluate(float Parameter) const
Definition SplineInterfaces.h:117
float HandleOutOfBounds(float Parameter) const
Definition SplineInterfaces.h:194
virtual bool Serialize(FArchive &Ar) override
Definition SplineInterfaces.h:138
virtual ValueType EvaluateImpl(float Parameter) const =0
Definition AdvancedWidgetsModule.cpp:13