UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
BCSplineFilter.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "Math/Vector2D.h"
6#include "MathUtil.h"
7
8namespace UE
9{
10namespace Geometry
11{
12
13enum class EBCSplineType
14{
15 BSpline,
18};
19
29template <EBCSplineType SplineType, bool bIsRadial>
31{
32private:
33 float InvRadius = 1.0f;
34
35 float Coeff1[3] = {0.0f, 0.0f, 0.0f};
36 float Coeff2[4] = {0.0f, 0.0f, 0.0f, 0.0f};
37
38public:
39 FBCSplineFilter(const float RadiusIn);
40
44 float GetWeight(const FVector2d& Dist) const;
45
47 bool IsInFilterRegion(const FVector2d& Dist) const;
48};
49
50template<EBCSplineType SplineType, bool bIsRadial>
52 : InvRadius(1.f/RadiusIn)
53{
54 auto ComputeCoeffs = [this](const float& B, const float& C)
55 {
56 // x < 1: 1/6 * ((12 - 9B - 6C)x^3 + (-18 + 12B + 6C)x^2 + (6 - 2B))
57 Coeff1[0] = (12.0f - 9.0f * B - 6.0f * C) / 6.0f;
58 Coeff1[1] = (-18.0f + 12.0f * B + 6.0f * C) / 6.0f;
59 Coeff1[2] = (6.0f - 2.0f * B) / 6.0f;
60
61 // 1 <= x < 2: 1/6 * ((-B - 6C)x^3 + (6B + 30C)x^2 + (-12B - 48C)x + (8B + 24C))
62 Coeff2[0] = (-B - 6.0f * C) / 6.0f;
63 Coeff2[1] = (6.0f * B + 30.0f * C) / 6.0f;
64 Coeff2[2] = (-12.0f * B - 48.0f * C) / 6.0f;
65 Coeff2[3] = (8.0f * B + 24.0f * C) / 6.0f;
66 };
67
68 if constexpr(SplineType == EBCSplineType::BSpline)
69 {
70 const float B = 1.0f;
71 const float C = 0.0f;
72 ComputeCoeffs(B, C);
73 }
74 else if constexpr(SplineType == EBCSplineType::CatmullRom)
75 {
76 const float B = 0.0f;
77 const float C = 0.5f;
78 ComputeCoeffs(B, C);
79 }
80 else if constexpr(SplineType == EBCSplineType::MitchellNetravali)
81 {
82 const float B = 1.0f / 3.0f;
83 const float C = B;
84 ComputeCoeffs(B, C);
85 }
86}
87
88template<EBCSplineType SplineType, bool bIsRadial>
90{
91 auto ComputeWeight = [this](float X) -> float
92 {
93 // Scale the filter kernel f(X) in the X-direction by making the substitution f(X/Radius)
94 const float AbsX = FMathf::Abs(X * InvRadius);
95 const float AbsX2 = AbsX * AbsX;
96 const float AbsX3 = AbsX * AbsX2;
97
98 float Weight = 0.0f;
99 if(AbsX < 1.0f)
100 {
101 Weight = Coeff1[0] * AbsX3 + Coeff1[1] * AbsX2 + Coeff1[2];
102 }
103 else if(AbsX < 2.0f)
104 {
105 Weight = Coeff2[0] * AbsX3 + Coeff2[1] * AbsX2 + Coeff2[2] * AbsX + Coeff2[3];
106 }
107 return Weight;
108 };
109
110 if constexpr(bIsRadial)
111 {
112 return ComputeWeight((float)Dist.Length());
113 }
114 else
115 {
116 const float WeightX = ComputeWeight((float)Dist.X);
117 const float WeightY = ComputeWeight((float)Dist.Y);
118 return WeightX * WeightY;
119 }
120}
121
122template<EBCSplineType SplineType, bool bIsRadial>
124{
125 if constexpr(bIsRadial)
126 {
127 return (FMathf::Abs((float)Dist.Length() * InvRadius) < 2.0f);
128 }
129 return (FMathf::Abs((float)Dist.X * InvRadius) < 2.0f) && (FMathf::Abs((float)Dist.Y * InvRadius) < 2.0f);
130}
131
135
136} // end namespace UE::Geometry
137} // end namespace UE
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
#define X(Name, Desc)
Definition FormatStringSan.h:47
static RealType Abs(const RealType Value)
Definition MathUtil.h:215
Definition BCSplineFilter.h:31
float GetWeight(const FVector2d &Dist) const
Definition BCSplineFilter.h:89
bool IsInFilterRegion(const FVector2d &Dist) const
Definition BCSplineFilter.h:123
FBCSplineFilter(const float RadiusIn)
Definition BCSplineFilter.h:51
EBCSplineType
Definition BCSplineFilter.h:14
Definition AdvancedWidgetsModule.cpp:13
UE_FORCEINLINE_HINT T Length() const
Definition Vector2D.h:497
T Y
Definition Vector2D.h:52
T X
Definition Vector2D.h:49