UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
CustomAttributeExample.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"
10
11namespace UE
12{
13namespace Geometry
14{
15namespace Spline
16{
17
29struct FFoo
30{
31 // A simple float value attribute
32 float Value = 0.0f;
33
34 // Constructor
35 FFoo() = default;
36
37 // Constructor with value
38 explicit FFoo(float InValue) : Value(InValue) {}
39
40 // Serialization support
42 {
43 Ar << Value;
44 return true;
45 }
46
48 {
49 Foo.Serialize(Ar);
50 return Ar;
51 }
52
53 bool operator==(const FFoo& Other) const
54 {
55 return Value == Other.Value;
56 }
57
58 // Add operator- for parameterization
59 FFoo operator-(const FFoo& Other) const
60 {
61 return FFoo(Value - Other.Value);
62 }
63
64 // Add operator+ for parameterization
65 FFoo operator+(const FFoo& Other) const
66 {
67 return FFoo(Value + Other.Value);
68 }
69
70 FFoo operator*(float Scale) const
71 {
72 return FFoo(Value * Scale);
73 }
74
75 // Size method that returns the "magnitude" of this type
76 // For a float-based type, we'll use absolute value
77 float Size() const
78 {
79 return FMath::Abs(Value);
80 }
81
82 // Square size (optimization to avoid square root)
83 float SizeSquared() const
84 {
85 return Value * Value;
86 }
87
88 // Dot product with another FFoo (required for some operations)
89 float Dot(const FFoo& Other) const
90 {
91 return Value * Other.Value;
92 }
93
94 // Get a normalized version (for when direction matters)
96 {
98 return FFoo(0.0f);
99 return FFoo(Value > 0.0f ? 1.0f : -1.0f);
100 }
101};
102
103// Register the type with the attribute system by defining a specialization
104// of TSplineValueTypeTraits with a Name field
105template<> struct TSplineValueTypeTraits<FFoo>
106{
107 static inline const FString Name = TEXT("Foo");
108};
109
110// Define a specialization of TSplineInterpolationPolicy to handle
111// interpolation for this type
112template<>
114{
115public:
116 // Basic parameter-based interpolation
118 {
119 if (Window.Num() < 2)
120 {
121 return Window.Num() == 1 ? *Window[0] : FFoo();
122 }
123
124 // Linear interpolation
125 return FFoo(FMath::Lerp(Window[0]->Value, Window[1]->Value, Parameter));
126 }
127
128 // Window-based interpolation for spline implementations
130 {
131 if (Window.Num() == 0 || Basis.Num() == 0)
132 {
133 return FFoo();
134 }
135
136 // Weighted sum of values
137 float Result = 0.0f;
138
139 for (int32 i = 0; i < FMath::Min(Window.Num(), Basis.Num()); ++i)
140 {
141 Result += Window[i]->Value * Basis[i];
142 }
143
144 return FFoo(Result);
145 }
146
147 // Template-based n-th derivative calculation
148 template<int32 Order>
150 {
151 if (Order == 0)
152 {
153 return Interpolate(Window, Parameter);
154 }
155
156 // For first derivative
157 if (Order == 1 && Window.Num() >= 2)
158 {
159 // Basic first derivative for linear interpolation
160 return FFoo((Window[1]->Value - Window[0]->Value));
161 }
162
163 // Higher order derivatives (could be more sophisticated)
164 return FFoo(0.0f);
165 }
166};
167
181{
182 // Create a PolyBezier spline with a single segment
184 FVector(0, 0, 0),
185 FVector(100, 100, 0)
186 );
187
188 // Create a MultiSpline that will host both the main spline and attribute channels
190 Spline.GetSpline() = BaseSpline; // Set the main spline
191
192 // Get direct access to the BSpline implementation
193 TBSpline<FFoo, 3>* FooSpline = Spline.CreateAttributeChannel<TBSpline<FFoo, 3>>("FooValues");
194 if (FooSpline)
195 {
196 // Now we can directly add values using the BSpline API
197 FooSpline->AddValue(FFoo(0.0f)); // Start point
198 FooSpline->AddValue(FFoo(1.0f)); // End point
199 }
200
201 // Add another segment to the main spline
202 Spline.GetSpline().AppendBezierSegment(
203 FVector(150, 50, 0), // First control point
204 FVector(150, -50, 0), // Second control point
205 FVector(200, 0, 0) // End point
206 );
207
208 // Add another value directly to the BSpline
209 if (FooSpline)
210 {
211 FooSpline->AddValue(FFoo(0.5f)); // Another point
212
213 // We can use any BSpline-specific methods
214 int32 NumFooValues = FooSpline->NumKeys();
215 UE_LOG(LogTemp, Display, TEXT("Attribute channel has %d values"), NumFooValues);
216
217 // Or access internal methods like reparameterization
218 FooSpline->Reparameterize(EParameterizationPolicy::Uniform);
219 }
220
221 // Evaluate at various points
222 for (float t = 0.0f; t <= 2.0f; t += 0.1f)
223 {
224 FVector Position = Spline.GetSpline().Evaluate(t);
225 FFoo Foo = Spline.EvaluateAttribute<FFoo>("FooValues", t);
226
227 UE_LOG(LogTemp, Display, TEXT("At t=%.1f: Position=(%.1f, %.1f, %.1f), Foo=%.2f"),
228 t, Position.X, Position.Y, Position.Z, Foo.Value);
229 }
230}
231
232} // end namespace UE::Geometry::Spline
233} // end namespace UE::Geometry
234} // end namespace UE
#define TEXT(x)
Definition Platform.h:1272
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
DIRECTLINK_API Display
Definition DirectLinkLog.h:8
#define FVector
Definition IOSSystemIncludes.h:8
#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
Definition ArrayView.h:139
UE_FORCEINLINE_HINT constexpr SizeType Num() const
Definition ArrayView.h:380
Definition BSpline.h:126
int32 AddValue(const ValueType &NewValue)
Definition BSpline.h:305
Definition MultiSpline.h:28
Definition PolyBezierSpline.h:22
static TPolyBezierSpline< ValueType > CreateLine(const ValueType &Start, const ValueType &End)
Definition PolyBezierSpline.h:66
static FFoo InterpolateWithBasis(TArrayView< const FFoo *const > Window, TArrayView< const float > Basis)
Definition CustomAttributeExample.h:129
static FFoo EvaluateDerivative(TArrayView< const FFoo *const > Window, float Parameter)
Definition CustomAttributeExample.h:149
static FFoo Interpolate(TArrayView< const FFoo *const > Window, float Parameter)
Definition CustomAttributeExample.h:117
Definition InterpolationPolicies.h:40
static T Interpolate(TArrayView< const T *const > Window, float Parameter)
Definition InterpolationPolicies.h:43
void CreatePolyBezierWithFooAttributes()
Definition CustomAttributeExample.h:180
Definition AdvancedWidgetsModule.cpp:13
static constexpr UE_FORCEINLINE_HINT T Lerp(const T &A, const T &B, const U &Alpha)
Definition UnrealMathUtility.h:1116
static UE_FORCEINLINE_HINT bool IsNearlyZero(float Value, float ErrorTolerance=UE_SMALL_NUMBER)
Definition UnrealMathUtility.h:407
Definition CustomAttributeExample.h:30
float SizeSquared() const
Definition CustomAttributeExample.h:83
float Dot(const FFoo &Other) const
Definition CustomAttributeExample.h:89
bool Serialize(FArchive &Ar)
Definition CustomAttributeExample.h:41
FFoo GetSafeNormal() const
Definition CustomAttributeExample.h:95
bool operator==(const FFoo &Other) const
Definition CustomAttributeExample.h:53
float Size() const
Definition CustomAttributeExample.h:77
FFoo operator*(float Scale) const
Definition CustomAttributeExample.h:70
friend FArchive & operator<<(FArchive &Ar, FFoo &Foo)
Definition CustomAttributeExample.h:47
float Value
Definition CustomAttributeExample.h:32
FFoo operator+(const FFoo &Other) const
Definition CustomAttributeExample.h:65
FFoo(float InValue)
Definition CustomAttributeExample.h:38
FFoo operator-(const FFoo &Other) const
Definition CustomAttributeExample.h:59