/* -*-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
*/
#pragma once
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
namespace osgEarth
{
/**
* ImageOverlay drapes a rectangular texture on the terrain.
*/
class OSGEARTH_EXPORT ImageOverlay : public AnnotationNode
{
public:
META_AnnotationNode(osgEarth, ImageOverlay);
enum ControlPoint
{
CONTROLPOINT_CENTER,
CONTROLPOINT_LOWER_LEFT,
CONTROLPOINT_LOWER_RIGHT,
CONTROLPOINT_UPPER_LEFT,
CONTROLPOINT_UPPER_RIGHT
};
/**
* Constructs an image overlay.
*/
ImageOverlay(MapNode* mapNode, osg::Image* image = NULL);
/**
* Construcs an image overlay annotation from a serialized representation
*/
ImageOverlay(const Config& conf, const osgDB::Options* dbOptions);
virtual ~ImageOverlay() { }
void setCorners(const osg::Vec2d& lowerLeft, const osg::Vec2d& lowerRight,
const osg::Vec2d& upperLeft, const osg::Vec2d& upperRight);
void setLowerLeft(double lon_deg, double lat_deg);
const osg::Vec2d& getLowerLeft() const { return _lowerLeft; }
void setLowerRight(double lon_deg, double lat_deg);
const osg::Vec2d& getLowerRight() const { return _lowerRight;}
void setUpperLeft(double lon_deg, double lat_deg);
const osg::Vec2d& getUpperLeft() const { return _upperLeft; }
void setUpperRight(double lon_deg, double lat_deg);
const osg::Vec2d& getUpperRight() const { return _upperRight;}
osg::Vec2d getCenter() const;
void setCenter(double lon_deg, double lat_deg);
osg::Vec2d getControlPoint(ControlPoint controlPoint);
void setControlPoint(ControlPoint controlPoint, double lon_deg, double lat_deg, bool singleVert=false);
/** When refining the mesh to fit the curtavure of the earth, this is the target resolution of the triangle mesh.
Default is 5 degrees */
void setGeometryResolution(const Distance& d) { _geometryResolution = d; }
const Distance& getGeometryResolution() const { return _geometryResolution; }
struct ImageOverlayCallback : public osg::Referenced
{
virtual void onOverlayChanged() {};
virtual ~ImageOverlayCallback() { }
};
typedef std::list< osg::ref_ptr > CallbackList;
void addCallback( ImageOverlayCallback* callback );
void removeCallback( ImageOverlayCallback* callback );
osgEarth::Bounds getBounds() const;
void setBounds(const osgEarth::Bounds& bounds);
void setBoundsAndRotation(const osgEarth::Bounds& bounds, const Angular& rotation);
osg::Image* getImage() const;
void setImage( osg::Image* image );
osg::Texture::FilterMode getMinFilter() const;
void setMinFilter( osg::Texture::FilterMode filter );
osg::Texture::FilterMode getMagFilter() const;
void setMagFilter( osg::Texture::FilterMode filter );
void setNorth(double value_deg);
void setSouth(double value_deg);
void setEast(double value_deg);
void setWest(double value_deg);
float getAlpha() const;
void setAlpha(float alpha);
void dirty();
bool getDraped() const;
void setDraped( bool draped );
/** Serialize the contents of this node */
Config getConfig() const;
public: // MapNodeObserver
virtual void setMapNode( MapNode* mapNode );
public: // osg::Node
virtual void traverse(osg::NodeVisitor& nv);
public:
// callback from Terrain whsen new data arrives
void onTileUpdate(
const TileKey& key,
osg::Node* graph,
TerrainCallbackContext& context);
private:
void fireCallback(ImageOverlay::ControlPoint point, const osg::Vec2d& location);
void construct();
void compile();
void clampLatitudes();
void updateFilters();
osg::Node* createNode();
osg::Vec2d _lowerLeft;
osg::Vec2d _lowerRight;
osg::Vec2d _upperRight;
osg::Vec2d _upperLeft;
osg::Polytope _boundingPolytope;
osg::ref_ptr< osg::Image > _image;
bool _dirty;
std::mutex _mutex;
osg::Group* _root;
osg::Texture* _texture;
Distance _geometryResolution;
//float _alpha;
CallbackList _callbacks;
optional _imageURI;
optional _alpha;
optional _minFilter;
optional _magFilter;
optional _draped;
bool _updateScheduled;
ImageOverlay() { }
ImageOverlay(const ImageOverlay&, const osg::CopyOp&) { }
};
}