#include "rive/shapes/path_vertex.hpp"
#include "rive/shapes/path.hpp"

using namespace rive;

Vec2D PathVertex::renderTranslation()
{
    if (hasWeight())
    {
        return m_Weight->translation();
    }
    return Vec2D(x(), y());
}

StatusCode PathVertex::onAddedDirty(CoreContext* context)
{
    StatusCode code = Super::onAddedDirty(context);
    if (code != StatusCode::Ok)
    {
        return code;
    }
    if (!parent()->is<Path>())
    {
        return StatusCode::MissingObject;
    }
    parent()->as<Path>()->addVertex(this);
    return StatusCode::Ok;
}

void PathVertex::markPathDirty()
{
    if (parent() == nullptr)
    {
        // This is an acceptable condition as the parametric paths create points
        // that are not part of the core context.
        return;
    }
    parent()->as<Path>()->markPathDirty();
}

void PathVertex::xChanged() { markPathDirty(); }
void PathVertex::yChanged() { markPathDirty(); }

void PathVertex::deform(Mat2D& worldTransform, float* boneTransforms)
{
    Weight::deform(x(),
                   y(),
                   m_Weight->indices(),
                   m_Weight->values(),
                   worldTransform,
                   boneTransforms,
                   m_Weight->translation());
}