/* -*-c++-*- */ /* osgEarth - Geospatial SDK for OpenSceneGraph * Copyright 2019 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_DRIVERS_MP_TERRAIN_ENGINE_HFCACHE #define OSGEARTH_DRIVERS_MP_TERRAIN_ENGINE_HFCACHE 1 #include "Common" #include "TileNode" #include "TileNodeRegistry" #include "MPTerrainEngineOptions" #include #include #include #include #include #include #include namespace osgEarth { namespace Drivers { namespace MPTerrainEngine { using namespace osgEarth; /** Key into the height field cache */ struct HFKey { TileKey _key; Revision _revision; ElevationSamplePolicy _samplePolicy; bool operator < (const HFKey& rhs) const { if ( _key < rhs._key ) return true; if ( rhs._key < _key ) return false; if ( _revision < rhs._revision ) return true; if ( _revision > rhs._revision ) return false; return _samplePolicy < rhs._samplePolicy; } }; /** value in the height field cache */ struct HFValue { osg::ref_ptr _hf; bool _isFallback; }; /** caches hightfields for fast neighor lookup */ class HeightFieldCache : public osg::Referenced //, public Revisioned { public: HeightFieldCache(const MPTerrainEngineOptions& options); void setTileSize(int tileSize) { _tileSize = tileSize; } bool getOrCreateHeightField( const MapFrame& frame, const TileKey& key, const osg::HeightField* parent_hf, osg::ref_ptr& out_hf, bool& out_isFallback, ElevationSamplePolicy samplePolicy, ElevationInterpolation interp, ProgressCallback* progress ); void clear() { _cache.clear(); } private: bool _enabled; mutable LRUCache _cache; int _tileSize; bool _useParentAsReferenceHF; }; } } } // namespace osgEarth::Drivers::MPTerrainEngine #endif // OSGEARTH_DRIVERS_MP_TERRAIN_ENGINE_HFCACHE