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