]> git.tdb.fi Git - libs/gl.git/blobdiff - source/occludedscene.h
Implement a scene class that performs occlusion culling on renderables
[libs/gl.git] / source / occludedscene.h
diff --git a/source/occludedscene.h b/source/occludedscene.h
new file mode 100644 (file)
index 0000000..3f8ca76
--- /dev/null
@@ -0,0 +1,54 @@
+#ifndef MSP_GL_OCCLUDEDSCENE_H_
+#define MSP_GL_OCCLUDEDSCENE_H_
+
+#include <set>
+#include <vector>
+#include "mesh.h"
+#include "program.h"
+#include "scene.h"
+
+namespace Msp {
+namespace GL {
+
+/**
+A scene that performs occlusion queries on renderables to skip those that are
+entirely occluded by others.
+*/
+class OccludedScene: public Scene
+{
+private:
+       struct OccludedRenderable
+       {
+               const Renderable *renderable;
+               const Geometry::BoundingSphere<float, 3> *bounding_sphere;
+               bool in_frustum;
+               bool occluder;
+               unsigned query;
+
+               OccludedRenderable();
+       };
+
+       typedef std::set<const Renderable *> RenderableSet;
+       typedef std::vector<OccludedRenderable> OccludedArray;
+
+       Mesh bounding_mesh;
+       Program bounding_shader;
+       RenderableSet renderables;
+       float occluder_min_size;
+       mutable OccludedArray occluded_cache;
+       mutable bool cache_dirty;
+
+public:
+       OccludedScene();
+       ~OccludedScene();
+
+       virtual void add(const Renderable &);
+       virtual void remove(const Renderable &);
+
+       virtual void render(Renderer &, const Tag &) const;
+};
+
+} // namespace GL
+} // namespace Msp
+
+#endif