#include <set>
#include <vector>
-#include "mesh.h"
-#include "program.h"
+#include "blend.h"
+#include "depthtest.h"
+#include "query.h"
#include "scene.h"
namespace Msp {
namespace GL {
+class Mesh;
+class Program;
+
/**
A scene that performs occlusion queries on renderables to skip those that are
entirely occluded by others.
*/
class OccludedScene: public Scene
{
+public:
+ using Scene::Loader;
+
private:
struct OccludedRenderable
{
const Geometry::BoundingSphere<float, 3> *bounding_sphere;
bool in_frustum;
bool occluder;
- unsigned query;
OccludedRenderable();
};
- typedef std::set<Renderable *> RenderableSet;
- typedef std::vector<OccludedRenderable> OccludedArray;
-
const Mesh &bounding_mesh;
const Program &bounding_shader;
- RenderableSet renderables;
+ Blend no_color_write;
+ DepthTest no_depth_write;
+ std::set<Renderable *> renderables;
float occluder_min_size;
- mutable OccludedArray occluded_cache;
+ mutable QueryPool queries;
+ mutable std::vector<OccludedRenderable> occluded_cache;
mutable bool cache_dirty;
public:
- OccludedScene(Resources &);
- ~OccludedScene();
+ OccludedScene();
virtual void add(Renderable &);
virtual void remove(Renderable &);
virtual void setup_frame(Renderer &);
virtual void finish_frame();
- virtual void render(Renderer &, const Tag & = Tag()) const;
+ virtual void render(Renderer &, Tag = Tag()) const;
};
} // namespace GL