#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);

  // See `Vertex::deform`: a skinned cubic vertex can reach us without its
  // CubicWeight (editor coop hydration, or a tool that added the vertex
  // after the bind), and nothing at import rejects it. Hold the bind
  // position, as Vertex::deform does, rather than dereference null.
  if (!hasWeight())
  {
    return;
  }
  auto cubicWeight = weight<CubicWeight>();

  cubicWeight->inTranslation() = Weight::deform(
      inPoint(),
      cubicWeight->inIndices(),
      cubicWeight->inValues(),
      worldTransform,
      boneTransforms);

  cubicWeight->outTranslation() = Weight::deform(
      outPoint(),
      cubicWeight->outIndices(),
      cubicWeight->outValues(),
      worldTransform,
      boneTransforms);
}
