]> git.tdb.fi Git - libs/gl.git/blob - source/render/zsortedscene.h
Add support for integer vertex attributes
[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         typedef std::set<Renderable *> RenderableSet;
46         typedef std::vector<SortedRenderable> SortedArray;
47
48         RenderableSet renderables;
49         SortOrder order;
50         DepthReference reference;
51         mutable SortedArray sorted_cache;
52
53 public:
54         ZSortedScene();
55
56         virtual void add(Renderable &);
57         virtual void remove(Renderable &);
58
59         /// Sets the sort order.  Default is back to front.
60         void set_order(SortOrder);
61
62         /// Sets the reference point for sorting.  Default is furthest from camera.
63         void set_reference(DepthReference);
64
65 private:
66         void populate_cache() const;
67
68 public:
69         virtual void setup_frame(Renderer &);
70         virtual void finish_frame();
71
72         virtual void render(Renderer &, Tag = Tag()) const;
73 };
74
75 } // namespace GL
76 } // namespace Msp
77
78 #endif