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