205 lines
7.7 KiB
Plaintext
205 lines
7.7 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 OSGEARTHFEATURES_FEATURE_DISPLAY_LAYOUT_H
|
||
|
#define OSGEARTHFEATURES_FEATURE_DISPLAY_LAYOUT_H 1
|
||
|
|
||
|
#include <osgEarth/Common>
|
||
|
#include <osgEarth/Feature>
|
||
|
#include <osgEarth/Filter>
|
||
|
#include <osgEarth/Style>
|
||
|
#include <osg/Geode>
|
||
|
#include <vector>
|
||
|
|
||
|
namespace osgEarth
|
||
|
{
|
||
|
/**
|
||
|
* Settings for a single level of detail of feature data
|
||
|
*/
|
||
|
class OSGEARTH_EXPORT FeatureLevel
|
||
|
{
|
||
|
public:
|
||
|
/** Constructs a feature level from serialized data */
|
||
|
FeatureLevel( const Config& config );
|
||
|
|
||
|
/** Constructs a feature level with range information */
|
||
|
FeatureLevel( float minRange, float maxRange );
|
||
|
|
||
|
/** Constructs a feature level with range information and a style class */
|
||
|
FeatureLevel( float minRange, float maxRange, const std::string& styleName );
|
||
|
|
||
|
/** Minimum and aximum display ranges for this level */
|
||
|
optional<float>& minRange() { return _minRange; }
|
||
|
const optional<float>& minRange() const { return _minRange; }
|
||
|
|
||
|
optional<float>& maxRange() { return _maxRange; }
|
||
|
const optional<float>& maxRange() const { return _maxRange; }
|
||
|
|
||
|
/** Style class (or style selector) name associated with this level (optional) */
|
||
|
optional<std::string>& styleName() { return _styleName; }
|
||
|
const optional<std::string>& styleName() const { return _styleName; }
|
||
|
|
||
|
/** Scripting expression to resolve for the style */
|
||
|
optional<StringExpression>& styleExpression() { return _styleExpr; }
|
||
|
const optional<StringExpression>& styleExpression() const { return _styleExpr; }
|
||
|
|
||
|
|
||
|
virtual ~FeatureLevel() { }
|
||
|
|
||
|
|
||
|
public:
|
||
|
Config getConfig() const;
|
||
|
|
||
|
protected:
|
||
|
void fromConfig( const Config& conf );
|
||
|
|
||
|
optional<float> _minRange;
|
||
|
optional<float> _maxRange;
|
||
|
optional<std::string> _styleName;
|
||
|
optional<StringExpression> _styleExpr;
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Defines a multi-LOD layout for a feature model layer.
|
||
|
*/
|
||
|
class OSGEARTH_EXPORT FeatureDisplayLayout : public osg::Referenced
|
||
|
{
|
||
|
public:
|
||
|
FeatureDisplayLayout( const Config& conf =Config() );
|
||
|
virtual ~FeatureDisplayLayout() { }
|
||
|
|
||
|
/**
|
||
|
* The size (in one dimension) of each tile of features in the layout
|
||
|
* at the maximum range. Maximum range must be set for this to take effect.
|
||
|
*/
|
||
|
optional<float>& tileSize() { return _tileSize; }
|
||
|
const optional<float>& tileSize() const { return _tileSize; }
|
||
|
|
||
|
/**
|
||
|
* The ratio of visibility range to feature tile radius. Default is 15.
|
||
|
* Increase this to produce more, smaller tiles at a given visibility
|
||
|
* range; decrease this to produce fewer, larger tiles.
|
||
|
*
|
||
|
* For example, for factor=15, at a visibility range of (say) 120,000m
|
||
|
* the system will attempt to create tiles that are approximately
|
||
|
* 8,000m in radius. (120,000 / 15 = 8,000).
|
||
|
*/
|
||
|
optional<float>& tileSizeFactor() { return _tileSizeFactor; }
|
||
|
const optional<float>& tileSizeFactor() const { return _tileSizeFactor; }
|
||
|
|
||
|
/**
|
||
|
* The desired max range for pre-tiled feature sources like TFS. The tileSizeFactor will be automatically computed
|
||
|
* based on the first level of the feature profile so that it shows up at that range.
|
||
|
*/
|
||
|
optional<float>& maxRange() { return _maxRange;}
|
||
|
const optional<float>& maxRange() const { return _maxRange;}
|
||
|
|
||
|
/**
|
||
|
* Minimum visibility range for all tiles in the layout.
|
||
|
*/
|
||
|
optional<float>& minRange() { return _minRange; }
|
||
|
const optional<float>& minRange() const { return _minRange; }
|
||
|
|
||
|
/**
|
||
|
* Whether to crop geometry to fit within the cell extents when chopping
|
||
|
* a feature level up into grid cells. By default, this is false, meaning
|
||
|
* that a feature whose centroid falls within the cell will be included.
|
||
|
* Setting this to true means that if any part of the feature falls within
|
||
|
* the working cell, it will be cropped to the cell extents and used.
|
||
|
*/
|
||
|
optional<bool>& cropFeatures() { return _cropFeatures; }
|
||
|
const optional<bool>& cropFeatures() const { return _cropFeatures; }
|
||
|
|
||
|
/**
|
||
|
* Sets the offset that will be applied to the computed paging priority
|
||
|
* of tiles in this layout. Adjusting this can affect the priority of this
|
||
|
* data with respect to other paged data in the scene (like terrain or other
|
||
|
* feature layers).
|
||
|
* Default = 0.0
|
||
|
*/
|
||
|
optional<float>& priorityOffset() { return _priorityOffset; }
|
||
|
const optional<float>& priorityOffset() const { return _priorityOffset; }
|
||
|
|
||
|
/**
|
||
|
* Sets the scale factor to be applied to the computed paging priority
|
||
|
* of tiles in this layout. Adjusting this can affect the priority of this
|
||
|
* data with respect to other paged data in the scene (like terrain or other
|
||
|
* feature layers).
|
||
|
* Default = 1.0.
|
||
|
*/
|
||
|
optional<float>& priorityScale() { return _priorityScale; }
|
||
|
const optional<float>& priorityScale() const { return _priorityScale; }
|
||
|
|
||
|
/**
|
||
|
* Minimum time, in second, before a feature tile is eligible for pageout.
|
||
|
* Set this to a negative number to disable expiration altogether (i.e., tiles
|
||
|
* will never page out).
|
||
|
*/
|
||
|
optional<float>& minExpiryTime() { return _minExpiryTime; }
|
||
|
const optional<float>& minExpiryTime() const { return _minExpiryTime; }
|
||
|
|
||
|
/**
|
||
|
* Whether tiles are paged in vs. created at load time (default, paged=true)
|
||
|
*/
|
||
|
optional<bool>& paged() { return _paged; }
|
||
|
const optional<bool>& paged() const { return _paged; }
|
||
|
|
||
|
|
||
|
/** Adds a new feature level */
|
||
|
void addLevel( const FeatureLevel& level );
|
||
|
|
||
|
/** Gets the number of feature levels in the schema */
|
||
|
unsigned getNumLevels() const;
|
||
|
|
||
|
/** Gets the nth level */
|
||
|
const FeatureLevel* getLevel( unsigned i ) const;
|
||
|
|
||
|
/**
|
||
|
* Calculates the "best" quadtree LOD for the specified level, given the radius
|
||
|
* of the full extent of the dataset.
|
||
|
*/
|
||
|
unsigned chooseLOD( const FeatureLevel& level, double fullExtentRadius ) const;
|
||
|
|
||
|
public:
|
||
|
Config getConfig() const;
|
||
|
|
||
|
protected:
|
||
|
optional<float> _tileSize;
|
||
|
optional<float> _tileSizeFactor;
|
||
|
optional<float> _minRange;
|
||
|
optional<float> _maxRange;
|
||
|
optional<bool> _cropFeatures;
|
||
|
optional<float> _priorityOffset;
|
||
|
optional<float> _priorityScale;
|
||
|
optional<float> _minExpiryTime;
|
||
|
optional<bool> _paged;
|
||
|
typedef std::multimap<float,FeatureLevel> Levels;
|
||
|
Levels _levels;
|
||
|
|
||
|
void fromConfig( const Config& conf );
|
||
|
};
|
||
|
|
||
|
} // namespace osgEarth
|
||
|
|
||
|
OSGEARTH_SPECIALIZE_CONFIG(osgEarth::FeatureLevel);
|
||
|
OSGEARTH_SPECIALIZE_CONFIG(osgEarth::FeatureDisplayLayout);
|
||
|
|
||
|
|
||
|
#endif // OSGEARTHFEATURES_FEATURE_DISPLAY_LAYOUT_H
|