#include "coordinateconverter.hpp"

#include <components/esm/loadcell.hpp>
#include <components/esm/loadland.hpp>

namespace MWMechanics
{
    CoordinateConverter::CoordinateConverter(const ESM::Cell* cell)
        : mCellX(0), mCellY(0)
    {
        if (cell->isExterior())
        {
            mCellX = cell->mData.mX * ESM::Land::REAL_SIZE;
            mCellY = cell->mData.mY * ESM::Land::REAL_SIZE;
        }
    }

    void CoordinateConverter::toWorld(ESM::Pathgrid::Point& point)
    {
        point.mX += mCellX;
        point.mY += mCellY;
    }

    void CoordinateConverter::toWorld(osg::Vec3f& point)
    {
        point.x() += static_cast<float>(mCellX);
        point.y() += static_cast<float>(mCellY);
    }

    void CoordinateConverter::toLocal(osg::Vec3f& point)
    {
        point.x() -= static_cast<float>(mCellX);
        point.y() -= static_cast<float>(mCellY);
    }

    osg::Vec3f CoordinateConverter::toLocalVec3(const ESM::Pathgrid::Point& point)
    {
        return osg::Vec3f(
            static_cast<float>(point.mX - mCellX),
            static_cast<float>(point.mY - mCellY),
            static_cast<float>(point.mZ));
    }
}