]> git.tdb.fi Git - libs/gl.git/blob - source/render/zsortedscene.h
9653567c107be6d88b50a096d5a7b825b1b739fc
[libs/gl.git] / source / render / 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 public:
31         using Scene::Loader;
32
33 private:
34         struct SortedRenderable
35         {
36                 Renderable *renderable;
37                 bool in_frustum;
38                 float depth;
39
40                 SortedRenderable(Renderable *);
41
42                 bool operator<(const SortedRenderable &o) const { return depth<o.depth; }
43         };
44
45         std::set<Renderable *> renderables;
46         SortOrder order;
47         DepthReference reference;
48         mutable std::vector<SortedRenderable> 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 &, Tag = Tag()) const;
70 };
71
72 } // namespace GL
73 } // namespace Msp
74
75 #endif