Files
pico-launcher/arm9/source/animation/ThreePointCubicBezierCurve.h
2025-11-25 17:41:31 +01:00

48 lines
1.4 KiB
C++

#pragma once
#include "Curve.h"
#include "CubicBezierCurve.h"
class ThreePointCubicBezierCurve : public Curve
{
using fx = fix16<13>;
fix32<26> _midPointX;
fix32<26> _midPointY;
fix32<26> _invMidPointX;
fix32<26> _invOneMinusMidPointX;
const CubicBezierCurve _firstCurve;
const CubicBezierCurve _secondCurve;
public:
constexpr ThreePointCubicBezierCurve(
fx a1x, fx a1y, fx b1x, fx b1y,
fx midpointx, fx midpointy,
fx a2x, fx a2y, fx b2x, fx b2y)
: _midPointX(midpointx)
, _midPointY(midpointy)
, _invMidPointX(fix32<26>(1) / midpointx)
, _invOneMinusMidPointX(fix32<26>(1) / (1 - midpointx))
, _firstCurve(
a1x / midpointx,
a1y / midpointy,
b1x / midpointx,
b1y / midpointy)
, _secondCurve(
(a2x - midpointx) / (1 - midpointx),
(a2y - midpointy) / (1 - midpointy),
(b2x - midpointx) / (1 - midpointx),
(b2y - midpointy) / (1 - midpointy)) { }
[[gnu::noinline]]
fix32<26> Compute(fix32<26> t) const override
{
if (t < _midPointX)
return _firstCurve.Compute(t * _invMidPointX) * _midPointY;
else
{
fix32<26> scaledT = (t - _midPointX) * _invOneMinusMidPointX;
return _secondCurve.Compute(scaledT) * (1 - _midPointY) + _midPointY;
}
}
};