#include "rive/shapes/cubic_asymmetric_vertex.hpp"
#include "rive/math/vec2d.hpp"
#include <cmath>

using namespace rive;

static Vec2D get_point(const CubicAsymmetricVertex& v)
{
    return Vec2D(v.x(), v.y());
}

static Vec2D in_vector(const CubicAsymmetricVertex& v)
{
    return Vec2D(std::cos(v.rotation()) * v.inDistance(),
                 std::sin(v.rotation()) * v.inDistance());
}

static Vec2D out_vector(const CubicAsymmetricVertex& v)
{
    return Vec2D(std::cos(v.rotation()) * v.outDistance(),
                 std::sin(v.rotation()) * v.outDistance());
}

void CubicAsymmetricVertex::computeIn()
{
    m_InPoint = get_point(*this) - in_vector(*this);
}

void CubicAsymmetricVertex::computeOut()
{
    m_OutPoint = get_point(*this) + out_vector(*this);
}

void CubicAsymmetricVertex::rotationChanged()
{
    m_InValid = false;
    m_OutValid = false;
    markGeometryDirty();
}
void CubicAsymmetricVertex::inDistanceChanged()
{
    m_InValid = false;
    markGeometryDirty();
}
void CubicAsymmetricVertex::outDistanceChanged()
{
    m_OutValid = false;
    markGeometryDirty();
}
