]> git.tdb.fi Git - libs/gl.git/blob - source/render/renderer.h
Use persistent uniform blocks for Camera, Lighting and Clipping
[libs/gl.git] / source / render / renderer.h
1 #ifndef MSP_GL_RENDERER_H_
2 #define MSP_GL_RENDERER_H_
3
4 #include <set>
5 #include <vector>
6 #include "matrix.h"
7 #include "programdata.h"
8 #include "tag.h"
9
10 namespace Msp {
11 namespace GL {
12
13 class Batch;
14 class Buffer;
15 class Camera;
16 class Clipping;
17 class Material;
18 class Mesh;
19 class Lighting;
20 class Program;
21 class Renderable;
22 class Sampler;
23 class Texture;
24 class Texturing;
25 class VertexSetup;
26 class WindingTest;
27
28 /**
29 A class for supervising the rendering process.  While many Renderables (in
30 particular, Objects and Scenes) can by rendered without a Renderer, using one
31 will often be more efficient.  This is especially true for ObjectInstances.
32
33 The Renderer works by deferring GL state changes until something is actually
34 being drawn.  This avoids many unnecessary GL calls if consecutive renderables
35 use the same resources.
36
37 A state stack is provided to help with state scoping.  Typically a Renderable
38 will push the current state on entry, set whatever state it requires, render
39 itself, and pop the state when it's done.  An RAII helper class is provided for
40 the push/pop operation.
41 */
42 class Renderer
43 {
44 public:
45         class Push
46         {
47         private:
48                 Renderer &renderer;
49
50         public:
51                 Push(Renderer &r): renderer(r) { renderer.push_state(); }
52                 ~Push() { renderer.pop_state(); }
53         };
54
55         class Exclude
56         {
57         private:
58                 Renderer &renderer;
59                 const Renderable &renderable;
60
61         public:
62                 Exclude(Renderer &r, const Renderable &e): renderer(r), renderable(e) { renderer.exclude(renderable); }
63                 ~Exclude() { renderer.include(renderable); }
64         };
65
66 private:
67         struct BoundTexture
68         {
69                 Tag tag;
70                 mutable int unit;
71                 const Texture *texture;
72                 const Sampler *sampler;
73                 int replaced;
74
75                 BoundTexture();
76         };
77
78         struct BoundProgramData
79         {
80                 const ProgramData *shdata;
81                 mutable unsigned generation;
82
83                 BoundProgramData(const ProgramData *);
84         };
85
86         struct State
87         {
88                 const Camera *camera;
89                 Matrix model_matrix;
90                 unsigned texture_count;
91                 unsigned lowest_effect_texunit;
92                 const Material *material;
93                 const Lighting *lighting;
94                 const Clipping *clipping;
95                 const Program *shprog;
96                 unsigned shdata_count;
97                 const VertexSetup *vertex_setup;
98                 const WindingTest *winding_test;
99                 bool reverse_winding;
100                 unsigned object_lod_bias;
101
102                 State();
103         };
104
105         enum ChangeMask
106         {
107                 MATRIX = 2,
108                 SHADER_DATA = 16,
109                 MATERIAL_SHDATA = 32,
110                 STANDARD_SHDATA = 64,
111                 CAMERA_SHDATA = 128,
112                 LIGHTING_SHDATA = 256,
113                 CLIPPING_SHDATA = 512
114         };
115
116         const Camera *default_camera;
117         unsigned char changed;
118         std::vector<State> state_stack;
119         State *state;
120         std::vector<BoundTexture> texture_stack;
121         ProgramData standard_shdata;
122         std::vector<BoundProgramData> shdata_stack;
123         std::set<const Renderable *> excluded;
124
125 public:
126         Renderer();
127         DEPRECATED Renderer(const Camera *);
128 private:
129         void init();
130 public:
131         ~Renderer();
132
133         /** Sets the camera to render from.  The model matrix is reset to identity. */
134         void set_camera(const Camera &);
135
136         const Camera *get_camera() const { return state->camera; }
137
138         /** Replaces the Renderer's model matrix. */
139         void set_matrix(const Matrix &);
140
141         /** Applies a transform to the Renderer's model matrix. */
142         void transform(const Matrix &);
143
144         /** Returns the current model matrix. */
145         const Matrix &get_matrix() const { return state->model_matrix; }
146
147         void set_texture(Tag, const Texture *, const Sampler * = 0);
148 private:
149         void set_texture(Tag, int, const Texture *, const Sampler *);
150         void flush_textures();
151 public:
152 #pragma GCC diagnostic push
153 #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
154         DEPRECATED void set_texture(const Texture *, const Sampler * = 0);
155         DEPRECATED void set_texturing(const Texturing *);
156         DEPRECATED unsigned allocate_effect_texunit();
157 #pragma GCC diagnostic pop
158         void set_material(const Material *);
159
160         void set_lighting(const Lighting *);
161         void set_clipping(const Clipping *);
162
163         /** Sets the shader program to use.  An initial set of data can be set as
164         well, with the same semantics as add_shader_data. */
165         void set_shader_program(const Program *prog, const ProgramData *data = 0);
166
167         /** Adds another set of data to be use with shader programs.  The data is
168         independent of any shader program changes and remains in effect until the
169         Renderer state is popped. */
170         void add_shader_data(const ProgramData &data);
171
172         void flush_shader_data();
173
174         void set_vertex_setup(const VertexSetup *);
175         void set_winding_test(const WindingTest *);
176         void set_reverse_winding(bool);
177
178         void set_object_lod_bias(unsigned);
179         unsigned get_object_lod_bias() const { return state->object_lod_bias; }
180
181         /** Saves the current state so it can be restored later. */
182         void push_state();
183
184         /** Restores a previously saved state.  Must be matched with an earlier
185         push_state call. */
186         void pop_state();
187
188         /** Unbinds all objects and resets related state.  There must be no unpopped
189         state in the stack.  The Renderer remains valid and may be reused for
190         further rendering. */
191         void end();
192
193         void exclude(const Renderable &);
194         void include(const Renderable &);
195
196         void render(const Renderable &, Tag = Tag());
197         void draw(const Batch &);
198         void draw_instanced(const Batch &, unsigned);
199
200 private:
201         void apply_state();
202 };
203
204 } // namespace GL
205 } // namespace Msp
206
207 #endif