]> git.tdb.fi Git - libs/gl.git/blob - source/render/renderer.h
1a84d8bf8507c50d596bc3d1490a289f8c2f5855
[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 modelview_matrix;
90                 unsigned texture_count;
91                 unsigned lowest_effect_texunit;
92                 const Material *material;
93                 const Lighting *lighting;
94                 Matrix lighting_matrix;
95                 const Clipping *clipping;
96                 Matrix clipping_matrix;
97                 const Program *shprog;
98                 unsigned shdata_count;
99                 const VertexSetup *vertex_setup;
100                 const WindingTest *winding_test;
101                 bool reverse_winding;
102                 unsigned object_lod_bias;
103
104                 State();
105         };
106
107         enum ChangeMask
108         {
109                 MATRIX = 2,
110                 SHADER_DATA = 16,
111                 MATERIAL_SHDATA = 32,
112                 STANDARD_SHDATA = 64
113         };
114
115         const Camera *default_camera;
116         unsigned char changed;
117         std::vector<State> state_stack;
118         State *state;
119         std::vector<BoundTexture> texture_stack;
120         ProgramData standard_shdata;
121         std::vector<BoundProgramData> shdata_stack;
122         std::set<const Renderable *> excluded;
123
124 public:
125         Renderer();
126         DEPRECATED Renderer(const Camera *);
127 private:
128         void init();
129 public:
130         ~Renderer();
131
132         /** Sets the camera to render from.  The modelview matrix is reset to the
133         camera's view matrix. */
134         void set_camera(const Camera &);
135
136         const Camera *get_camera() const { return state->camera; }
137
138         /** Replaces the Renderer's modelview matrix. */
139         void set_matrix(const Matrix &);
140
141         /** Applies a transform to the Renderer's modelview matrix. */
142         void transform(const Matrix &);
143
144         /** Returns the current modelview matrix. */
145         const Matrix &get_matrix() const { return state->modelview_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