]> git.tdb.fi Git - libs/gl.git/blob - source/render/zsortedscene.h
Use a default sampler in Renderer if null was passed in
[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 = 0,
14         BACK_TO_FRONT = 1
15 };
16
17 enum DepthReference
18 {
19         CLOSEST = 0,
20         CENTER = 1,
21         FURTHEST = 2
22 };
23
24 /**
25 A scene which sorts renderables by their distance from the camera before
26 rendering.
27
28 Renderables must have valid model matrices to be sorted.  Those without a
29 matrix are sorted as closest to the camera.
30 */
31 class ZSortedScene: public Scene
32 {
33 public:
34         using Scene::Loader;
35
36 private:
37         struct SortedRenderable
38         {
39                 Renderable *renderable;
40                 bool in_frustum = false;
41                 float depth = 0.0f;
42
43                 SortedRenderable(Renderable *r): renderable(r) { }
44
45                 bool operator<(const SortedRenderable &o) const { return depth<o.depth; }
46         };
47
48         std::vector<Renderable *> content;
49         SortOrder order = BACK_TO_FRONT;
50         DepthReference reference = FURTHEST;
51         mutable std::map<const Camera *, std::vector<SortedRenderable> > sorted_cache;
52
53 public:
54         virtual void add(Renderable &);
55         virtual void remove(Renderable &);
56
57         /// Sets the sort order.  Default is back to front.
58         void set_order(SortOrder);
59
60         /// Sets the reference point for sorting.  Default is furthest from camera.
61         void set_reference(DepthReference);
62
63         virtual void setup_frame(Renderer &);
64         virtual void finish_frame();
65
66         virtual void render(Renderer &, Tag = Tag()) const;
67 };
68
69 } // namespace GL
70 } // namespace Msp
71
72 #endif