2007-03-14 20:00:54 +08:00
|
|
|
/* -*-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 <osg/Object>
|
2007-03-22 00:34:04 +08:00
|
|
|
#include <osg/Vec3d>
|
2007-03-27 19:23:57 +08:00
|
|
|
#include <osg/CoordinateSystemNode>
|
2007-03-14 20:00:54 +08:00
|
|
|
|
|
|
|
#include <osgTerrain/Export>
|
|
|
|
|
|
|
|
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);
|
|
|
|
|
2007-03-26 23:52:22 +08:00
|
|
|
META_Object(osgTerrain, Locator);
|
2007-03-29 00:28:20 +08:00
|
|
|
|
2007-08-28 00:59:51 +08:00
|
|
|
/** CoordinateSystemType provides the classification of the type coordinate system represented.*/
|
|
|
|
enum CoordinateSystemType
|
2007-03-29 00:28:20 +08:00
|
|
|
{
|
2007-08-28 00:59:51 +08:00
|
|
|
/** GEOCENTRIC coordinate systems are ones mapped to the around the ellipsoid, i.e. whole earth.*/
|
|
|
|
GEOCENTRIC,
|
2007-03-14 20:00:54 +08:00
|
|
|
|
2007-08-28 00:59:51 +08:00
|
|
|
/** GEOGRAPHIC coordinate systems are ones mapped to latitude and longitude.*/
|
|
|
|
GEOGRAPHIC,
|
2007-03-14 20:00:54 +08:00
|
|
|
|
2007-12-11 01:30:18 +08:00
|
|
|
/** PROJECTED coordinate systems are ones projected to a local projected coordinate system i.e. UTMs.*/
|
2007-08-28 00:59:51 +08:00
|
|
|
PROJECTED
|
|
|
|
};
|
2007-03-14 20:00:54 +08:00
|
|
|
|
2007-08-28 00:59:51 +08:00
|
|
|
/** Set the CoordinatesSyetemType.
|
2007-12-11 01:30:18 +08:00
|
|
|
* Note, the user must keep the CoordinateSystemString consistent with the type of the CoordinateSystem.*/
|
2007-08-28 00:59:51 +08:00
|
|
|
void setCoordinateSystemType(CoordinateSystemType type) { _coordinateSystemType = type; }
|
2007-05-03 19:11:03 +08:00
|
|
|
|
2007-08-28 00:59:51 +08:00
|
|
|
/** Get the CoordinatesSyetemType.*/
|
|
|
|
CoordinateSystemType getCoordinateSystemType() const { return _coordinateSystemType; }
|
2007-05-03 19:11:03 +08:00
|
|
|
|
2007-08-28 00:59:51 +08:00
|
|
|
/** 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; }
|
2007-03-27 19:23:57 +08:00
|
|
|
|
2007-08-28 00:59:51 +08:00
|
|
|
/** 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; }
|
2007-03-27 19:23:57 +08:00
|
|
|
|
|
|
|
|
2007-08-28 00:59:51 +08:00
|
|
|
/** 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(); }
|
2007-03-27 19:23:57 +08:00
|
|
|
|
|
|
|
|
2007-08-31 03:26:52 +08:00
|
|
|
/** Set the transformation from local coordinates to model coordinates.*/
|
2007-09-17 01:48:07 +08:00
|
|
|
void setTransform(const osg::Matrixd& transform) { _transform = transform; _inverse.invert(_transform); }
|
2007-05-03 19:11:03 +08:00
|
|
|
|
2007-08-31 03:26:52 +08:00
|
|
|
/** Set the transformation from local coordinates to model coordinates.*/
|
|
|
|
const osg::Matrixd& getTransform() const { return _transform; }
|
2007-03-27 19:23:57 +08:00
|
|
|
|
2007-08-31 03:26:52 +08:00
|
|
|
/** Set the extents of the local coords.*/
|
|
|
|
void setTransformAsExtents(double minX, double minY, double maxX, double maxY);
|
2007-05-04 00:23:19 +08:00
|
|
|
|
2007-08-28 00:59:51 +08:00
|
|
|
|
|
|
|
virtual bool orientationOpenGL() const;
|
2007-05-04 00:23:19 +08:00
|
|
|
|
2007-08-28 00:59:51 +08:00
|
|
|
virtual bool convertLocalToModel(const osg::Vec3d& /*local*/, osg::Vec3d& /*world*/) const;
|
2007-05-04 00:23:19 +08:00
|
|
|
|
2007-08-28 00:59:51 +08:00
|
|
|
virtual bool convertModelToLocal(const osg::Vec3d& /*world*/, osg::Vec3d& /*local*/) const;
|
2007-05-04 00:23:19 +08:00
|
|
|
|
2007-08-28 00:59:51 +08:00
|
|
|
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;
|
|
|
|
}
|
|
|
|
|
2009-01-05 19:26:26 +08:00
|
|
|
bool computeLocalBounds(Locator& source, osg::Vec3d& bottomLeft, osg::Vec3d& topRight) const;
|
2007-09-05 22:15:55 +08:00
|
|
|
|
|
|
|
void setDefinedInFile(bool flag) { _definedInFile = flag; }
|
|
|
|
bool getDefinedInFile() const { return _definedInFile; }
|
2007-12-14 01:51:43 +08:00
|
|
|
|
|
|
|
void setTransformScaledByResolution(bool scaledByResolution) { _transformScaledByResolution = scaledByResolution; }
|
|
|
|
bool getTransformScaledByResolution() const { return _transformScaledByResolution; }
|
2007-05-04 00:23:19 +08:00
|
|
|
|
2007-08-28 00:59:51 +08:00
|
|
|
protected:
|
2007-05-04 00:23:19 +08:00
|
|
|
|
2007-08-28 00:59:51 +08:00
|
|
|
virtual ~Locator();
|
|
|
|
|
|
|
|
CoordinateSystemType _coordinateSystemType;
|
2007-05-04 00:23:19 +08:00
|
|
|
|
2007-08-28 00:59:51 +08:00
|
|
|
std::string _format;
|
|
|
|
std::string _cs;
|
|
|
|
osg::ref_ptr<osg::EllipsoidModel> _ellipsoidModel;
|
2007-05-04 00:23:19 +08:00
|
|
|
|
2007-08-31 03:26:52 +08:00
|
|
|
osg::Matrixd _transform;
|
|
|
|
osg::Matrixd _inverse;
|
2007-09-05 22:15:55 +08:00
|
|
|
|
|
|
|
bool _definedInFile;
|
2007-12-14 01:51:43 +08:00
|
|
|
bool _transformScaledByResolution;
|
2007-05-04 00:23:19 +08:00
|
|
|
|
2007-03-27 19:23:57 +08:00
|
|
|
};
|
|
|
|
|
2007-03-14 20:00:54 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
#endif
|