]> git.tdb.fi Git - libs/gl.git/blob - source/render/occludedscene.h
2fb463c641b9d826e5f664f3d57d99d3deb339a7
[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         typedef std::set<Renderable *> RenderableSet;
35         typedef std::vector<OccludedRenderable> OccludedArray;
36
37         const Mesh &bounding_mesh;
38         const Program &bounding_shader;
39         RenderableSet renderables;
40         float occluder_min_size;
41         mutable OccludedArray occluded_cache;
42         mutable bool cache_dirty;
43
44 public:
45         OccludedScene(Resources &);
46         ~OccludedScene();
47
48         virtual void add(Renderable &);
49         virtual void remove(Renderable &);
50
51 private:
52         void populate_cache() const;
53
54 public:
55         virtual void setup_frame(Renderer &);
56         virtual void finish_frame();
57
58         virtual void render(Renderer &, Tag = Tag()) const;
59 };
60
61 } // namespace GL
62 } // namespace Msp
63
64 #endif