/* osgEarth
 * Copyright 2025 Pelican Mapping
 * MIT License
 */

#ifndef OSGEARTH_LOCAL_TANGENT_PLANE_H
#define OSGEARTH_LOCAL_TANGENT_PLANE_H 1

#include <osgEarth/Common>
#include <osgEarth/Profile>
#include <osgEarth/TileKey>

namespace osgEarth
{
    /**
     * Local Tangent Plane SRS.
     * Please call SpatialReference::createLTP() to construct one of these.
     */
    class TangentPlaneSpatialReference : public SpatialReference
    {
    public:
        //! New LTP SRS
        //! @param key Key of underlying geographic SRS
        //! @param originLLA lat/long/alt origin of reference point
        TangentPlaneSpatialReference(
            const Key& key, 
            const osg::Vec3d& originLLA);

    public: // SpatialReference

        bool isGeographic() const override { return false; }
        bool isProjected() const override { return true; }
        bool isLTP() const override { return true; }

        // This SRS uses a WGS84 lat/long SRS under the hood for reprojection.
        // So we need the pre/post transforms to move from LTP to LLA and back.
        const SpatialReference* preTransform(std::vector<osg::Vec3d>& points) const override;
        const SpatialReference* postTransform(std::vector<osg::Vec3d>& points) const override;

    protected: // SpatialReference
        
        bool _isEquivalentTo(
            const SpatialReference* srs,
            bool considerVDatum =true ) const override;

        virtual ~TangentPlaneSpatialReference() { }

    private:

        osg::Vec3d   _originLLA;
        osg::Matrixd _local2world, _world2local;

    };

}

#endif // OSGEARTH_LOCAL_TANGENT_PLANE_H
