/* -*-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 OSGEARTH_DRAPING_CULL_SET #define OSGEARTH_DRAPING_CULL_SET #include #include #include #include #include #include namespace osgEarth { namespace Util { /** * Culling set for tracking groups whose contents should be "draped", * i.e. rendered to a texture and projected onto the terrain. * Internal object - do not use directly. Use a DrapeableNode instead. */ class OSGEARTH_INTERNAL DrapingCullSet { public: struct Entry { osg::observer_ptr _node; osg::ref_ptr _matrix; osg::ObserverNodePath _path; int _frame; }; public: DrapingCullSet(); ~DrapingCullSet() { } // not virtual /** Pushes a node and its matrix into the cull set */ void push(DrapeableNode* node, const osg::NodePath& path, const osg::FrameStamp* stamp); /** Runs a node visitor on the cull set, optionally popping as it goes along. */ void accept(osg::NodeVisitor& nv); //! Bounds of the latest set const osg::BoundingSphere& getBound() const; private: struct FrameData { FrameData() : _acceptFrame(-1) { } int _acceptFrame; std::vector _entries; osg::BoundingSphere _bs; }; using SortedFrameData = std::map; SortedFrameData _data; std::mutex _data_mutex; }; /** * Houses all the active DrapingCullSets under an osgEarth TerrainEngine. * Internal node - so not use directly. */ class OSGEARTH_INTERNAL DrapingManager { public: DrapingManager(); //! Gets the draping cull set associated with a camera. DrapingCullSet& get(const osg::Camera*); //! Sets the render bin number for DrapingCameras. void setRenderBinNumber(int value) { _renderBinNum = value; } int getRenderBinNumber() const { return _renderBinNum; } private: PerObjectFastMap _sets; int _renderBinNum; }; } } // namespace osgEarth #endif // OSGEARTH_DRAPING_CULL_SET