]> git.tdb.fi Git - libs/gl.git/blob - source/render/occludedscene.h
Use default member initializers for simple types
[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 "query.h"
9 #include "scene.h"
10
11 namespace Msp {
12 namespace GL {
13
14 class Mesh;
15 class Program;
16
17 /**
18 A scene that performs occlusion queries on renderables to skip those that are
19 entirely occluded by others.
20 */
21 class OccludedScene: public Scene
22 {
23 public:
24         using Scene::Loader;
25
26 private:
27         struct OccludedRenderable
28         {
29                 Renderable *renderable = 0;
30                 const Geometry::BoundingSphere<float, 3> *bounding_sphere = 0;
31                 bool in_frustum = false;
32                 bool occluder = false;
33         };
34
35         const Mesh &bounding_mesh;
36         const Program &bounding_shader;
37         Blend no_color_write;
38         DepthTest no_depth_write = { LEQUAL, false };
39         std::set<Renderable *> renderables;
40         float occluder_min_size = 0.25f;
41         mutable QueryPool queries;
42         mutable std::vector<OccludedRenderable> occluded_cache;
43         mutable bool cache_dirty = false;
44
45 public:
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