UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
Spline.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "SplineTypeId.h"
8#include "SplineInterfaces.h"
9
10namespace UE
11{
12namespace Geometry
13{
14namespace Spline
15{
16
17template <typename SPLINETYPE> class UE_EXPERIMENTAL(5.7, "New spline APIs are experimental.") TSplineWrapper;
18
19/*
20 * A spline which wraps another fully implemented spline (SplineType must derive from TSplineInterface)
21 */
22template <typename SPLINETYPE>
23class TSplineWrapper : public TSplineInterface<typename SPLINETYPE::ValueType>
24{
25public:
27 typedef typename SplineType::ValueType ValueType; // Explicitly define ValueType
28
29 virtual ~TSplineWrapper() override = default;
30
31 // ISplineInterface Forwarding
32 virtual void Clear() override { InternalSpline.Clear(); }
33 virtual bool IsEqual(const ISplineInterface* OtherSpline) const override { return InternalSpline.IsEqual(OtherSpline); }
34 virtual int32 GetNumberOfSegments() const override { return InternalSpline.GetNumberOfSegments(); }
35 virtual FInterval1f GetSegmentParameterRange(int32 SegmentIndex) const override { return InternalSpline.GetSegmentParameterRange(SegmentIndex); }
36 virtual bool Serialize(FArchive& Ar) override
37 {
38 // Call parent's Serialize
40 {
41 return false;
42 }
43 // Serialize wrapped spline
44 return InternalSpline.Serialize(Ar);
45 }
46 virtual FString GetValueTypeName() const override { return InternalSpline.GetValueTypeName(); }
47 virtual FString GetImplementationName() const override { return InternalSpline.GetImplementationName(); }
48 virtual FInterval1f GetParameterSpace() const override { return InternalSpline.GetParameterSpace(); }
49 virtual void SetClosedLoop(bool bClosed) override { InternalSpline.SetClosedLoop(bClosed); }
50 virtual bool IsClosedLoop() const override { return InternalSpline.IsClosedLoop(); }
51
52 // TSplineInterface Forwarding
53
54 // TSplineInterface<ValueType>::PreInfinityMode is the one that actually matters, but we propagate to InternalSpline for clarity
60
61 // TSplineInterface<ValueType>::PostInfinityMode is the one that actually matters, but we propagate to InternalSpline for clarity
67
68 virtual EOutOfBoundsHandlingMode GetPreInfinityMode() const override { return InternalSpline.GetPreInfinityMode(); }
69 virtual EOutOfBoundsHandlingMode GetPostInfinityMode() const override { return InternalSpline.GetPostInfinityMode(); }
70
71 virtual ValueType EvaluateImpl(float Parameter) const override { return InternalSpline.EvaluateImpl(Parameter); }
72 virtual float FindNearest(const ValueType& Point, float& OutSquaredDistance) const override
73 { return InternalSpline.FindNearest(Point, OutSquaredDistance); }
74 virtual TUniquePtr<ISplineInterface> Clone() const override
75 {
77
78 // Clone the internal spline (assuming SplineType has proper copy semantics)
79 ClonedWrapper->InternalSpline = InternalSpline;
80
81 // Copy infinity modes and any other wrapper-specific properties
82 ClonedWrapper->PreInfinityMode = this->PreInfinityMode;
83 ClonedWrapper->PostInfinityMode = this->PostInfinityMode;
84
85 return ClonedWrapper;
86 }
88 {
90 return Ar;
91 }
92protected:
94};
95
100{
101 // Store original archive position
102 int64 OriginalPos = Ar.Tell();
103
104 // Read version
105 int32 Version;
106 Ar << Version;
107
108 if (Version < 1)
109 {
110 UE_LOG(LogSpline, Error, TEXT("Unsupported spline serialization version: %d"), Version);
111 return nullptr;
112 }
113
114 // Read type ID
116 Ar << TypeId;
117
118 // Create instance
120
121 if (!Result)
122 {
123 UE_LOG(LogSpline, Error, TEXT("Failed to create spline type 0x%08X"), TypeId);
124 return nullptr;
125 }
126
127 // Reset archive position so ISplineInterface::Serialize can read version and TypeId again
128 Ar.Seek(OriginalPos);
129
130 // Now deserialize
131 Result->Serialize(Ar);
132
133 return Result;
134}
135} // end namespace UE::Geometry::Spline
136} // end namespace UE::Geometry
137} // end namespace UE
#define UE_EXPERIMENTAL(Version, Message)
Definition CoreMiscDefines.h:369
#define TEXT(x)
Definition Platform.h:1272
FPlatformTypes::int64 int64
A 64-bit signed integer.
Definition Platform.h:1127
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
#define UE_LOG(CategoryName, Verbosity, Format,...)
Definition LogMacros.h:270
Definition Archive.h:1208
virtual void Serialize(void *V, int64 Length)
Definition Archive.h:1689
virtual int64 Tell()
Definition Archive.h:149
virtual void Seek(int64 InPos)
Definition Archive.h:1753
Definition UniquePtr.h:107
FSplineTypeId::IdType TypeId
Definition SplineTypeRegistry.h:26
static TUniquePtr< ISplineInterface > CreateSpline(TypeId TypeId)
Definition SplineTypeRegistry.h:90
Definition SplineInterfaces.h:35
Definition SplineInterfaces.h:92
EOutOfBoundsHandlingMode PostInfinityMode
Definition SplineInterfaces.h:191
EOutOfBoundsHandlingMode PreInfinityMode
Definition SplineInterfaces.h:190
virtual TUniquePtr< ISplineInterface > Clone() const override
Definition Spline.h:74
virtual EOutOfBoundsHandlingMode GetPostInfinityMode() const override
Definition Spline.h:69
virtual void SetPreInfinityMode(EOutOfBoundsHandlingMode InMode) override
Definition Spline.h:55
virtual void Clear() override
Definition Spline.h:32
virtual void SetPostInfinityMode(EOutOfBoundsHandlingMode InMode) override
Definition Spline.h:62
virtual bool IsClosedLoop() const override
Definition Spline.h:50
friend FArchive & operator<<(FArchive &Ar, TSplineWrapper &SplineWrapper)
Definition Spline.h:87
virtual int32 GetNumberOfSegments() const override
Definition Spline.h:34
virtual ValueType EvaluateImpl(float Parameter) const override
Definition Spline.h:71
virtual float FindNearest(const ValueType &Point, float &OutSquaredDistance) const override
Definition Spline.h:72
virtual FInterval1f GetSegmentParameterRange(int32 SegmentIndex) const override
Definition Spline.h:35
SplineType InternalSpline
Definition Spline.h:93
SPLINETYPE SplineType
Definition Spline.h:26
virtual bool Serialize(FArchive &Ar) override
Definition Spline.h:36
virtual EOutOfBoundsHandlingMode GetPreInfinityMode() const override
Definition Spline.h:68
virtual FString GetValueTypeName() const override
Definition Spline.h:46
virtual ~TSplineWrapper() override=default
virtual FString GetImplementationName() const override
Definition Spline.h:47
virtual bool IsEqual(const ISplineInterface *OtherSpline) const override
Definition Spline.h:33
virtual FInterval1f GetParameterSpace() const override
Definition Spline.h:48
virtual void SetClosedLoop(bool bClosed) override
Definition Spline.h:49
SplineType::ValueType ValueType
Definition Spline.h:27
TUniquePtr< ISplineInterface > CreateSplineFromArchive(FArchive &Ar)
Definition Spline.h:99
Definition AdvancedWidgetsModule.cpp:13