/* -*-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
*/
#pragma once
#include
#include
#include
#include
#include
#include
#include
#include
namespace osgEarth { namespace Util
{
using namespace osgEarth;
class PagedNode2;
class OSGEARTH_EXPORT SimplePager : public osg::Group
{
public:
SimplePager(const osgEarth::Map* map, const osgEarth::Profile* dataProfile);
//! Initializes the graph. If you override this, be sure to call
//! buildRootNode and add that as a child of whatever you create.
virtual void build();
//! Whether this pager uses additive lods.
bool getAdditive() const { return _additive; }
void setAdditive(bool additive) { _additive = additive; }
//! Tell the pager to stop paging and cancel pending requests
void setDone();
unsigned int getMinLevel() const { return _minLevel; }
void setMinLevel(unsigned int minLevel) { _minLevel = minLevel; }
unsigned int getMaxLevel() const { return _maxLevel; }
void setMaxLevel(unsigned int maxLevel) { _maxLevel = maxLevel; }
float getRangeFactor() const { return _rangeFactor; }
void setRangeFactor(float value);
float getMaxRange() const { return _maxRange; }
void setMaxRange(float value);
float getMaxPixels() const { return _maxPixels; }
void setMaxPixels(float value);
float getMinPixels() const { return _minPixels; }
void setMinPixels(float value);
void setLODMethod(const LODMethod& value);
LODMethod getLODMethod() const { return _useRange ? LODMethod::CAMERA_DISTANCE : LODMethod::SCREEN_SPACE; }
float getPriorityScale() const { return _priorityScale; }
void setPriorityScale(float value) { _priorityScale = value; }
float getPriorityOffset() const { return _priorityOffset; }
void setPriorityOffset(float value) { _priorityOffset = value; }
void setEnableCancelation(bool value);
bool getEnableCancelation() const;
//! Whether to install cluster culling for geographic nodes
void setClusterCullingEnabled(bool value);
bool getClusterCullingEnabled() const;
//! Whether to use the bounds of loaded data to compute the paging bounds of that
//! data's children. Default = false. (By default, it will use the tile key bounds
//! and the built-in ElevationRanges to compute paging bounds.)
//! This is optimal when you know every level will be populated by geometry that
//! fits approximately inside its parent's bounds (e.g., terrain tiles).
void setUsePayloadBoundsForChildren(bool value);
bool getUsePayloadBoundsForChildren() const;
using CreateNodeFunction = std::function(const TileKey& key, ProgressCallback* progress)>;
void setCreateNodeFunction(CreateNodeFunction func) { _createNodeFunction = func; }
using CreatePagedNodeFunction = std::function;
void setCreatePagedNodeFunction(CreatePagedNodeFunction func) { _createPagedNodeFunction = func; }
//! Scene graph callbacks for notification of changes. Call before calling build().
void setSceneGraphCallbacks(SceneGraphCallbacks* value) { _sceneGraphCallbacks = value; }
SceneGraphCallbacks* getSceneGraphCallbacks() const { return _sceneGraphCallbacks.get(); }
//! Gets the profile for the SimplePager.
const osgEarth::Profile* getProfile() const;
//! Creates a payload for the given TileKey.
//! Doesn't do anything with paging, just gets the raw data.
//! Subclasses override this method to provide their data for TileKeys, OR you can
//! call setCreateNodeFunction and createNode will call that.
virtual osg::ref_ptr createNode(const TileKey& key, ProgressCallback* progress);
//! Callback fired when a node is created.
Callback onCreateNode;
public:
//! (INTERNAL) Creates a group containing 4 PagedNodes,
//! one for each child of the given TileKey.
osg::ref_ptr createPagedChildrenOf(const TileKey& parent, ProgressCallback* progress);
void traverse(osg::NodeVisitor&) override;
protected:
//! Gets the bounding sphere for a given TileKey.
osg::BoundingSphered getBounds(const TileKey& key) const;
//! The root node is a special node. If you override this method,
//! be sure to all this to include it in the scene graph.
osg::ref_ptr buildRootNode();
//! Creates a paging data for the given TileKey
osg::ref_ptr createChildNode(const TileKey& key, ProgressCallback* progress);
bool _additive = false;
bool _useRange = true;
double _rangeFactor = 6.0;
float _maxRange = FLT_MAX;
float _minPixels = 0.0f;
float _maxPixels = FLT_MAX;
unsigned int _minLevel = 0;
unsigned int _maxLevel = 30;
float _priorityScale = 1.0f;
float _priorityOffset = 0.0f;
bool _canCancel = true;
bool _done = false;
bool _clusterCullingEnabled = true;
bool _usePayloadBoundsForChildren = false;
osg::observer_ptr _map;
osg::ref_ptr _profile;
osg::ref_ptr _mapProfile;
osg::ref_ptr _sceneGraphCallbacks;
CreateNodeFunction _createNodeFunction;
CreatePagedNodeFunction _createPagedNodeFunction;
void fire_onCreateNode(const TileKey& key, osg::Node* node);
};
} } // namespace osgEarth::Util