/* -*-c++-*- */
/* osgEarth - Geospatial SDK for OpenSceneGraph
 * Copyright 2020 Pelican Mapping
 * http://osgearth.org
 *
 * osgEarth is free software; you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>
 */

#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
