]> git.tdb.fi Git - libs/gl.git/blob - source/render/zsortedscene.h
Add attenuation calculations and related export code for point lights
[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 = BACK_TO_FRONT;
47         DepthReference reference = FURTHEST;
48         mutable std::vector<SortedRenderable> sorted_cache;
49
50 public:
51         virtual void add(Renderable &);
52         virtual void remove(Renderable &);
53
54         /// Sets the sort order.  Default is back to front.
55         void set_order(SortOrder);
56
57         /// Sets the reference point for sorting.  Default is furthest from camera.
58         void set_reference(DepthReference);
59
60 private:
61         void populate_cache() const;
62
63 public:
64         virtual void setup_frame(Renderer &);
65         virtual void finish_frame();
66
67         virtual void render(Renderer &, Tag = Tag()) const;
68 };
69
70 } // namespace GL
71 } // namespace Msp
72
73 #endif