#include "rive/shapes/cubic_vertex.hpp"
#include "rive/bones/cubic_weight.hpp"
using namespace rive;

const Vec2D& CubicVertex::renderIn() {
    if (hasWeight()) {
        return weight<CubicWeight>()->inTranslation();
    } else {
        return inPoint();
    }
}

const Vec2D& CubicVertex::renderOut() {
    if (hasWeight()) {
        return weight<CubicWeight>()->outTranslation();
    } else {
        return outPoint();
    }
}

const Vec2D& CubicVertex::inPoint() {
    if (!m_InValid) {
        computeIn();
        m_InValid = true;
    }
    return m_InPoint;
}

const Vec2D& CubicVertex::outPoint() {
    if (!m_OutValid) {
        computeOut();
        m_OutValid = true;
    }
    return m_OutPoint;
}

void CubicVertex::outPoint(const Vec2D& value) {
    m_OutPoint = value;
    m_OutValid = true;
}

void CubicVertex::inPoint(const Vec2D& value) {
    m_InPoint = value;
    m_InValid = true;
}

void CubicVertex::xChanged() {
    Super::xChanged();
    m_InValid = m_OutValid = false;
}
void CubicVertex::yChanged() {
    Super::yChanged();
    m_InValid = m_OutValid = false;
}

void CubicVertex::deform(const Mat2D& worldTransform,
                         const float* boneTransforms) {
    Super::deform(worldTransform, boneTransforms);

    auto cubicWeight = weight<CubicWeight>();

    auto inp = inPoint();
    Weight::deform(inp[0],
                   inp[1],
                   cubicWeight->inIndices(),
                   cubicWeight->inValues(),
                   worldTransform,
                   boneTransforms,
                   cubicWeight->inTranslation());

    auto outp = outPoint();
    Weight::deform(outp[0],
                   outp[1],
                   cubicWeight->outIndices(),
                   cubicWeight->outValues(),
                   worldTransform,
                   boneTransforms,
                   cubicWeight->outTranslation());
}
