]> git.tdb.fi Git - libs/gl.git/blob - source/render/occludedscene.h
Use QueryPool in OccludedScene
[libs/gl.git] / source / render / occludedscene.h
1 #ifndef MSP_GL_OCCLUDEDSCENE_H_
2 #define MSP_GL_OCCLUDEDSCENE_H_
3
4 #include <set>
5 #include <vector>
6 #include "blend.h"
7 #include "depthtest.h"
8 #include "mesh.h"
9 #include "program.h"
10 #include "query.h"
11 #include "scene.h"
12
13 namespace Msp {
14 namespace GL {
15
16 /**
17 A scene that performs occlusion queries on renderables to skip those that are
18 entirely occluded by others.
19 */
20 class OccludedScene: public Scene
21 {
22 public:
23         using Scene::Loader;
24
25 private:
26         struct OccludedRenderable
27         {
28                 Renderable *renderable;
29                 const Geometry::BoundingSphere<float, 3> *bounding_sphere;
30                 bool in_frustum;
31                 bool occluder;
32
33                 OccludedRenderable();
34         };
35
36         const Mesh &bounding_mesh;
37         const Program &bounding_shader;
38         Blend no_color_write;
39         DepthTest no_depth_write;
40         std::set<Renderable *> renderables;
41         float occluder_min_size;
42         mutable QueryPool queries;
43         mutable std::vector<OccludedRenderable> occluded_cache;
44         mutable bool cache_dirty;
45
46 public:
47         OccludedScene();
48
49         virtual void add(Renderable &);
50         virtual void remove(Renderable &);
51
52 private:
53         void populate_cache() const;
54
55 public:
56         virtual void setup_frame(Renderer &);
57         virtual void finish_frame();
58
59         virtual void render(Renderer &, Tag = Tag()) const;
60 };
61
62 } // namespace GL
63 } // namespace Msp
64
65 #endif