]> git.tdb.fi Git - libs/gl.git/blob - source/zsortedscene.h
Trigger Mesh::check_buffers from MeshBuilder destructor
[libs/gl.git] / source / zsortedscene.h
1 #ifndef MSP_GL_ZSORTEDSCENE_H_
2 #define MSP_GL_ZSORTEDSCENE_H_
3
4 #include <set>
5 #include <vector>
6 #include "scene.h"
7
8 namespace Msp {
9 namespace GL {
10
11 enum SortOrder
12 {
13         FRONT_TO_BACK,
14         BACK_TO_FRONT
15 };
16
17 enum DepthReference
18 {
19         CLOSEST,
20         CENTER,
21         FURTHEST
22 };
23
24 /**
25 Sorts renderables by their distance from the camera before rendering.  Requires
26 renderables to have a matrix.
27 */
28 class ZSortedScene: public Scene
29 {
30 private:
31         struct SortedRenderable
32         {
33                 Renderable *renderable;
34                 bool in_frustum;
35                 float depth;
36
37                 SortedRenderable(Renderable *);
38
39                 bool operator<(const SortedRenderable &o) const { return depth<o.depth; }
40         };
41
42         typedef std::set<Renderable *> RenderableSet;
43         typedef std::vector<SortedRenderable> SortedArray;
44
45         RenderableSet renderables;
46         SortOrder order;
47         DepthReference reference;
48         mutable SortedArray sorted_cache;
49
50 public:
51         ZSortedScene();
52
53         virtual void add(Renderable &);
54         virtual void remove(Renderable &);
55
56         /// Sets the sort order.  Default is back to front.
57         void set_order(SortOrder);
58
59         /// Sets the reference point for sorting.  Default is furthest from camera.
60         void set_reference(DepthReference);
61
62 private:
63         void populate_cache() const;
64
65 public:
66         virtual void setup_frame(Renderer &);
67         virtual void finish_frame();
68
69         virtual void render(Renderer &, const Tag & = Tag()) const;
70 };
71
72 } // namespace GL
73 } // namespace Msp
74
75 #endif