You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
116 lines
3.7 KiB
116 lines
3.7 KiB
/* -*-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_GEOMETRYTECHNIQUE |
|
#define OSGTERRAIN_GEOMETRYTECHNIQUE 1 |
|
|
|
#include <osg/MatrixTransform> |
|
#include <osg/Geode> |
|
#include <osg/Geometry> |
|
|
|
#include <osgTerrain/TerrainTechnique> |
|
#include <osgTerrain/Locator> |
|
|
|
namespace osgTerrain { |
|
|
|
class OSGTERRAIN_EXPORT GeometryTechnique : public TerrainTechnique |
|
{ |
|
public: |
|
|
|
GeometryTechnique(); |
|
|
|
/** Copy constructor using CopyOp to manage deep vs shallow copy.*/ |
|
GeometryTechnique(const GeometryTechnique&,const osg::CopyOp& copyop=osg::CopyOp::SHALLOW_COPY); |
|
|
|
META_Object(osgTerrain, GeometryTechnique); |
|
|
|
virtual void init(int dirtyMask, bool assumeMultiThreaded); |
|
|
|
virtual Locator* computeMasterLocator(); |
|
|
|
|
|
virtual void update(osgUtil::UpdateVisitor* nv); |
|
|
|
virtual void cull(osgUtil::CullVisitor* nv); |
|
|
|
/** Traverse the terain subgraph.*/ |
|
virtual void traverse(osg::NodeVisitor& nv); |
|
|
|
virtual void cleanSceneGraph(); |
|
|
|
void setFilterBias(float filterBias); |
|
float getFilterBias() const { return _filterBias; } |
|
|
|
void setFilterWidth(float filterWidth); |
|
float getFilterWidth() const { return _filterWidth; } |
|
|
|
void setFilterMatrix(const osg::Matrix3& matrix); |
|
osg::Matrix3& getFilterMatrix() { return _filterMatrix; } |
|
const osg::Matrix3& getFilterMatrix() const { return _filterMatrix; } |
|
|
|
enum FilterType |
|
{ |
|
GAUSSIAN, |
|
SMOOTH, |
|
SHARPEN |
|
}; |
|
|
|
void setFilterMatrixAs(FilterType filterType); |
|
|
|
/** If State is non-zero, this function releases any associated OpenGL objects for |
|
* the specified graphics context. Otherwise, releases OpenGL objects |
|
* for all graphics contexts. */ |
|
virtual void releaseGLObjects(osg::State* = 0) const; |
|
|
|
|
|
protected: |
|
|
|
virtual ~GeometryTechnique(); |
|
|
|
class BufferData : public osg::Referenced |
|
{ |
|
public: |
|
BufferData() {} |
|
|
|
osg::ref_ptr<osg::MatrixTransform> _transform; |
|
osg::ref_ptr<osg::Geode> _geode; |
|
osg::ref_ptr<osg::Geometry> _geometry; |
|
|
|
protected: |
|
~BufferData() {} |
|
}; |
|
|
|
virtual osg::Vec3d computeCenterModel(BufferData& buffer, Locator* masterLocator); |
|
|
|
virtual void generateGeometry(BufferData& buffer, Locator* masterLocator, const osg::Vec3d& centerModel); |
|
|
|
virtual void applyColorLayers(BufferData& buffer); |
|
|
|
virtual void applyTransparency(BufferData& buffer); |
|
|
|
|
|
OpenThreads::Mutex _writeBufferMutex; |
|
osg::ref_ptr<BufferData> _currentBufferData; |
|
osg::ref_ptr<BufferData> _newBufferData; |
|
|
|
float _filterBias; |
|
osg::ref_ptr<osg::Uniform> _filterBiasUniform; |
|
float _filterWidth; |
|
osg::ref_ptr<osg::Uniform> _filterWidthUniform; |
|
osg::Matrix3 _filterMatrix; |
|
osg::ref_ptr<osg::Uniform> _filterMatrixUniform; |
|
}; |
|
|
|
} |
|
|
|
#endif
|
|
|