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