75 lines
2.8 KiB
Plaintext
75 lines
2.8 KiB
Plaintext
|
/* -*-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 <http://www.gnu.org/licenses/>
|
||
|
*/
|
||
|
#ifndef OSGEARTHSYMBOLOGY_MESH_SUBDIVIDER
|
||
|
#define OSGEARTHSYMBOLOGY_MESH_SUBDIVIDER
|
||
|
|
||
|
#include <osgEarth/Common>
|
||
|
#include <osgEarth/GeoMath>
|
||
|
#include <osg/Geometry>
|
||
|
#include <osg/PrimitiveSet>
|
||
|
|
||
|
namespace osgEarth
|
||
|
{
|
||
|
/**
|
||
|
* Recursively subdivides (tesselates) a geocentric geometry mesh to the specified
|
||
|
* granularity. This class will densify a geocentric primitive to more accurately
|
||
|
* conform to the ellipsoidal surface of the earth, for example.
|
||
|
*/
|
||
|
class OSGEARTH_EXPORT MeshSubdivider
|
||
|
{
|
||
|
public:
|
||
|
/**
|
||
|
* Construct a new subdivider.
|
||
|
* Optionally, provide localizer/delocalizer transforms that will take
|
||
|
* vertex locations in and out of world geocentric coordinates.
|
||
|
*/
|
||
|
MeshSubdivider(
|
||
|
const osg::Matrixd& world2local =osg::Matrixd::identity(),
|
||
|
const osg::Matrixd& local2world =osg::Matrixd::identity() );
|
||
|
|
||
|
/**
|
||
|
* Sets the maximum number elements in each generated primitive set.
|
||
|
*/
|
||
|
void setMaxElementsPerEBO( unsigned int value ) {
|
||
|
_maxElementsPerEBO = value; }
|
||
|
|
||
|
/**
|
||
|
* Subdivides an OSG geometry's primitives to the specified granularity.
|
||
|
* Granularity is an angle, specified in radians - it is the maximum
|
||
|
* allowable angle between two points in a triangle.
|
||
|
*
|
||
|
* This method will also coalesce all the polygonal primitive sets in the geometry
|
||
|
* into a single GL_TRIANGLES primitive.
|
||
|
*
|
||
|
* Note! This utility currently does nothing with repsect to the geometry's
|
||
|
* color or texture attributes, so it is best used prior to setting those.
|
||
|
*/
|
||
|
void run(
|
||
|
osg::Geometry& geom,
|
||
|
double granurality_radians,
|
||
|
GeoInterpolation interp =GEOINTERP_RHUMB_LINE );
|
||
|
|
||
|
protected:
|
||
|
osg::Matrixd _local2world, _world2local;
|
||
|
unsigned int _maxElementsPerEBO;
|
||
|
};
|
||
|
} // namespace osgEarth
|
||
|
|
||
|
#endif // OSGEARTHSYMBOLOGY_MESH_SUBDIVIDER
|