/* -*-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 */ #ifndef OSGEARTHFEATURES_TESSELLATE_OPERATOR_H #define OSGEARTHFEATURES_TESSELLATE_OPERATOR_H 1 #include #include #include namespace osgEarth { namespace Util { /** * Tessellates linear data in a feature geometry by subdividing each * line segment a specified # of times. */ class OSGEARTH_EXPORT TessellateOperator { public: // static methods /** * Tessellates a straight line into multiple segments. */ static void tessellateLinear( const osg::Vec3d& p0, const osg::Vec3d& p1, unsigned parts, std::vector& out ); /** * Tessellates a geographic line (great circle or rhumb) between * two geographic points (long,lat,alt) into multiple segments along * a spheroid. */ static void tessellateGeo( const osg::Vec3d& p0, const osg::Vec3d& p1, unsigned parts, GeoInterpolation interp, std::vector& out ); public: /** * Constructs a new tessellation operator. */ TessellateOperator(); virtual ~TessellateOperator() { } /** * Sets the maximum size of each tessellated partition in the geometry. * The "numPartitions" is calculated from this value. */ void setMaxPartitionSize( const Distance& value ) { _maxDistance = value; } void setNumPartitions( unsigned value ) { _numPartitions = value; } void setDefaultGeoInterp( GeoInterpolation value ) { _defaultInterp = value; } public: /** * Operate on a feature */ void operator()( Feature* feature, FilterContext& context ) const; FilterContext push(FeatureList& input, FilterContext& context) const; protected: optional _maxDistance; unsigned _numPartitions; GeoInterpolation _defaultInterp; }; } } #endif // OSGEARTHFEATURES_TESSELLATE_OPERATOR_H