]> git.tdb.fi Git - libs/gl.git/blobdiff - source/render/zsortedscene.h
Rearrange soucre files into subdirectories
[libs/gl.git] / source / render / zsortedscene.h
diff --git a/source/render/zsortedscene.h b/source/render/zsortedscene.h
new file mode 100644 (file)
index 0000000..cb21061
--- /dev/null
@@ -0,0 +1,75 @@
+#ifndef MSP_GL_ZSORTEDSCENE_H_
+#define MSP_GL_ZSORTEDSCENE_H_
+
+#include <set>
+#include <vector>
+#include "scene.h"
+
+namespace Msp {
+namespace GL {
+
+enum SortOrder
+{
+       FRONT_TO_BACK,
+       BACK_TO_FRONT
+};
+
+enum DepthReference
+{
+       CLOSEST,
+       CENTER,
+       FURTHEST
+};
+
+/**
+Sorts renderables by their distance from the camera before rendering.  Requires
+renderables to have a matrix.
+*/
+class ZSortedScene: public Scene
+{
+private:
+       struct SortedRenderable
+       {
+               Renderable *renderable;
+               bool in_frustum;
+               float depth;
+
+               SortedRenderable(Renderable *);
+
+               bool operator<(const SortedRenderable &o) const { return depth<o.depth; }
+       };
+
+       typedef std::set<Renderable *> RenderableSet;
+       typedef std::vector<SortedRenderable> SortedArray;
+
+       RenderableSet renderables;
+       SortOrder order;
+       DepthReference reference;
+       mutable SortedArray sorted_cache;
+
+public:
+       ZSortedScene();
+
+       virtual void add(Renderable &);
+       virtual void remove(Renderable &);
+
+       /// Sets the sort order.  Default is back to front.
+       void set_order(SortOrder);
+
+       /// Sets the reference point for sorting.  Default is furthest from camera.
+       void set_reference(DepthReference);
+
+private:
+       void populate_cache() const;
+
+public:
+       virtual void setup_frame(Renderer &);
+       virtual void finish_frame();
+
+       virtual void render(Renderer &, const Tag & = Tag()) const;
+};
+
+} // namespace GL
+} // namespace Msp
+
+#endif