/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2006 Robert Osfield * * This library is open source and may be redistributed and/or modified under * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or * (at your option) any later version. The full license is in LICENSE file * included with this distribution, and on the openscenegraph.org website. * * This library 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 * OpenSceneGraph Public License for more details. */ #ifndef OSGTERRAIN_LOCATOR #define OSGTERRAIN_LOCATOR 1 #include #include #include #include namespace osgTerrain { class OSGTERRAIN_EXPORT Locator : public osg::Object { public: Locator(); /** Copy constructor using CopyOp to manage deep vs shallow copy.*/ Locator(const Locator&,const osg::CopyOp& copyop=osg::CopyOp::SHALLOW_COPY); META_Object(osgTerrain, Locator); /** CoordinateSystemType provides the classification of the type coordinate system represented.*/ enum CoordinateSystemType { /** GEOCENTRIC coordinate systems are ones mapped to the around the ellipsoid, i.e. whole earth.*/ GEOCENTRIC, /** GEOGRAPHIC coordinate systems are ones mapped to latitude and longitude.*/ GEOGRAPHIC, /** PROJECTED coordinate systems are ones projected to a local projected coordindate system i.e. UTMs.*/ PROJECTED }; /** Set the CoordinatesSyetemType. * Note, the user must keep the CoordinateSystemString consistent with the type of the CoordindateSystem.*/ void setCoordinateSystemType(CoordinateSystemType type) { _coordinateSystemType = type; } /** Get the CoordinatesSyetemType.*/ CoordinateSystemType getCoordinateSystemType() const { return _coordinateSystemType; } /** Set the coordinate system format string. Typical values would be WKT, PROJ4, USGS etc.*/ void setFormat(const std::string& format) { _format = format; } /** Get the coordinate system format string.*/ const std::string& getFormat() const { return _format; } /** Set the CoordinateSystem reference string, should be stored in a form consistent with the Format.*/ void setCoordinateSystem(const std::string& cs) { _cs = cs; } /** Get the CoordinateSystem reference string.*/ const std::string& getCoordinateSystem() const { return _cs; } /** Set EllipsoidModel to describe the model used to map lat, long and height into geocentric XYZ and back. */ void setEllipsoidModel(osg::EllipsoidModel* ellipsode) { _ellipsoidModel = ellipsode; } /** Get the EllipsoidModel.*/ osg::EllipsoidModel* getEllipsoidModel() { return _ellipsoidModel.get(); } /** Get the const EllipsoidModel.*/ const osg::EllipsoidModel* getEllipsoidModel() const { return _ellipsoidModel.get(); } /** Set the extents of the local coords.*/ void setExtents(double minX, double minY, double maxX, double maxY); /** Get the extents of the local coords.*/ void getExtents(double& minX, double& minY, double& maxX, double& maxY) const; void setMinX(double minX) { _minX = minX; } double getMinX() const { return _minX; } void setMinY(double minY) { _minY = minY; } double getMinY() const { return _minY; } void setMaxX(double maxX) { _maxX = maxX; } double getMaxX() const { return _maxX; } void setMaxY(double maxY) { _maxY = maxY; } double getMaxY() const { return _maxY; } virtual bool orientationOpenGL() const; virtual bool convertLocalToModel(const osg::Vec3d& /*local*/, osg::Vec3d& /*world*/) const; virtual bool convertModelToLocal(const osg::Vec3d& /*world*/, osg::Vec3d& /*local*/) const; static bool convertLocalCoordBetween(const Locator& source, const osg::Vec3d& sourceNDC, const Locator& destination, osg::Vec3d& destinationNDC) { osg::Vec3d model; if (!source.convertLocalToModel(sourceNDC, model)) return false; if (!destination.convertModelToLocal(model, destinationNDC)) return false; return true; } bool computeLocalBounds(Locator& source, osg::Vec3d& bottomLeft, osg::Vec3d& topRight); protected: virtual ~Locator(); CoordinateSystemType _coordinateSystemType; std::string _format; std::string _cs; osg::ref_ptr _ellipsoidModel; double _minX; double _minY; double _maxX; double _maxY; }; } #endif