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

using namespace rive;

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

static Vec2D in_vector(const CubicDetachedVertex& v) {
    return Vec2D(cos(v.inRotation()) * v.inDistance(),
                 sin(v.inRotation()) * v.inDistance());
}

static Vec2D out_vector(const CubicDetachedVertex& v) {
    return Vec2D(cos(v.outRotation()) * v.outDistance(),
                 sin(v.outRotation()) * v.outDistance());
}

void CubicDetachedVertex::computeIn() {
    m_InPoint = get_point(*this) + in_vector(*this);
}

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

void CubicDetachedVertex::inRotationChanged() {
    m_InValid = false;
    markGeometryDirty();
}
void CubicDetachedVertex::inDistanceChanged() {
    m_InValid = false;
    markGeometryDirty();
}
void CubicDetachedVertex::outRotationChanged() {
    m_OutValid = false;
    markGeometryDirty();
}
void CubicDetachedVertex::outDistanceChanged() {
    m_OutValid = false;
    markGeometryDirty();
}
