DYT/Tool/OpenSceneGraph-3.6.5/include/osgEarth/HorizonClipPlane
2024-12-25 07:49:36 +08:00

97 lines
3.2 KiB
C++

/* -*-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.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
* IN THE SOFTWARE.
*
* 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_HORIZON_CLIP_PLANE_H
#define OSGEARTH_HORIZON_CLIP_PLANE_H 1
#include <osgEarth/Common>
#include <osgEarth/Horizon>
#include <osgEarth/Containers>
#include <osg/NodeCallback>
#include <osg/CoordinateSystemNode>
#include <osg/Plane>
namespace osgEarth
{
/**
* Installs an OpenGL clip plane that will clip graphics
* at the geocentric horizon. Usage:
*
* HorizonClipPlane* hcp = new HorizonClipPlane();
* hcp->setClipPlaneNumber(0);
* mapNode->addCullCallback(hcp);
*
* Then, anywhere under that node that you want to apply clipping:
*
* node->getOrCreateStateSet()->setMode(GL_CLIP_DISTANCE0, 1);
*/
class OSGEARTH_EXPORT HorizonClipPlane : public osg::NodeCallback
{
public:
//! Construct a new horizon clip plane with default (WGS84) ellipsoid
HorizonClipPlane();
//! Construct a new horizon clip plane with specific ellipsoid
HorizonClipPlane(const Ellipsoid&);
//! Set the GL clip plane to use. Default is zero.
void setClipPlaneNumber(unsigned n);
unsigned getClipPlaneNumber() const { return _num; }
public: // osg::NodeCallback
void operator()(osg::Node* node, osg::NodeVisitor* nv);
public: // osg::Object
virtual void resizeGLObjectBuffers(unsigned maxSize);
virtual void releaseGLObjects(osg::State* state) const;
private:
unsigned _num;
Ellipsoid _ellipsoid;
struct PerCameraData {
osg::ref_ptr<Horizon> horizon;
osg::ref_ptr<osg::StateSet> stateSet;
osg::ref_ptr<osg::Uniform> uniform;
};
typedef PerObjectFastMap<osg::Camera*, PerCameraData> DataMap;
DataMap _data;
struct ResizeFunctor : public DataMap::Functor {
unsigned _s;
ResizeFunctor(unsigned s) : _s(s) { }
virtual void operator()(PerCameraData& data);
};
struct ReleaseFunctor : public DataMap::ConstFunctor {
osg::State* _state;
ReleaseFunctor(osg::State* state) : _state(state) { }
virtual void operator()(const PerCameraData& data) const;
};
};
} // namespace osgEarth
#endif // OSGEARTH_HORIZON_CLIP_PLANE_H