1 #ifndef COMPONENTS_TERRAIN_QUADTREEWORLD_H 2 #define COMPONENTS_TERRAIN_QUADTREEWORLD_H 3 4 #include "world.hpp" 5 #include "terraingrid.hpp" 6 7 #include <mutex> 8 9 namespace osg 10 { 11 class NodeVisitor; 12 } 13 14 namespace Terrain 15 { 16 class RootNode; 17 class ViewDataMap; 18 19 /// @brief Terrain implementation that loads cells into a Quad Tree, with geometry LOD and texture LOD. 20 class QuadTreeWorld : public TerrainGrid // note: derived from TerrainGrid is only to render default cells (see loadCell) 21 { 22 public: 23 QuadTreeWorld(osg::Group* parent, osg::Group* compileRoot, Resource::ResourceSystem* resourceSystem, Storage* storage, unsigned int nodeMask, unsigned int preCompileMask, unsigned int borderMask, int compMapResolution, float comMapLevel, float lodFactor, int vertexLodMod, float maxCompGeometrySize); 24 25 QuadTreeWorld(osg::Group *parent, Storage *storage, unsigned int nodeMask, float lodFactor, float chunkSize); 26 27 ~QuadTreeWorld(); 28 29 void accept(osg::NodeVisitor& nv); 30 31 void enable(bool enabled) override; 32 setViewDistance(float distance)33 void setViewDistance(float distance) override { mViewDistance = distance; } 34 cacheCell(View * view,int x,int y)35 void cacheCell(View *view, int x, int y) override {} 36 /// @note Not thread safe. 37 void loadCell(int x, int y) override; 38 /// @note Not thread safe. 39 void unloadCell(int x, int y) override; 40 41 View* createView() override; 42 void preload(View* view, const osg::Vec3f& eyePoint, const osg::Vec4i &cellgrid, std::atomic<bool>& abort, std::atomic<int>& progress, int& progressRange) override; 43 bool storeView(const View* view, double referenceTime) override; 44 void rebuildViews() override; 45 46 void reportStats(unsigned int frameNumber, osg::Stats* stats) override; 47 48 class ChunkManager 49 { 50 public: ~ChunkManager()51 virtual ~ChunkManager(){} 52 virtual osg::ref_ptr<osg::Node> getChunk(float size, const osg::Vec2f& center, unsigned char lod, unsigned int lodFlags, bool activeGrid, const osg::Vec3f& viewPoint, bool compile) = 0; getNodeMask()53 virtual unsigned int getNodeMask() { return 0; } 54 }; 55 void addChunkManager(ChunkManager*); 56 57 private: 58 void ensureQuadTreeBuilt(); 59 60 osg::ref_ptr<RootNode> mRootNode; 61 62 osg::ref_ptr<ViewDataMap> mViewDataMap; 63 64 std::vector<ChunkManager*> mChunkManagers; 65 66 std::mutex mQuadTreeMutex; 67 bool mQuadTreeBuilt; 68 float mLodFactor; 69 int mVertexLodMod; 70 float mViewDistance; 71 float mMinSize; 72 }; 73 74 } 75 76 #endif 77