]> git.tdb.fi Git - libs/gl.git/blob - source/render/renderer.h
50254cdf1de09824cb50f9bd37a9f85436a41606
[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 Clipping *clipping;
93                 const Program *shprog;
94                 unsigned shdata_count;
95                 const VertexSetup *vertex_setup;
96                 const WindingTest *winding_test;
97                 bool reverse_winding;
98                 unsigned object_lod_bias;
99
100                 State();
101         };
102
103         enum ChangeMask
104         {
105                 MATRIX = 2,
106                 SHADER_DATA = 16
107         };
108
109         const Camera *default_camera;
110         unsigned char changed;
111         std::vector<State> state_stack;
112         State *state;
113         std::vector<BoundTexture> texture_stack;
114         ProgramData standard_shdata;
115         std::vector<BoundProgramData> shdata_stack;
116         std::set<const Renderable *> excluded;
117
118 public:
119         Renderer();
120         DEPRECATED Renderer(const Camera *);
121 private:
122         void init();
123 public:
124         ~Renderer();
125
126         /** Sets the camera to render from.  The model matrix is reset to identity. */
127         void set_camera(const Camera &);
128
129         const Camera *get_camera() const { return state->camera; }
130
131         /** Replaces the Renderer's model matrix. */
132         void set_matrix(const Matrix &);
133
134         /** Applies a transform to the Renderer's model matrix. */
135         void transform(const Matrix &);
136
137         /** Returns the current model matrix. */
138         const Matrix &get_matrix() const { return state->model_matrix; }
139
140         void set_texture(Tag, const Texture *, const Sampler * = 0);
141 private:
142         void set_texture(Tag, int, const Texture *, const Sampler *);
143         void flush_textures();
144 public:
145 #pragma GCC diagnostic push
146 #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
147         DEPRECATED void set_texture(const Texture *, const Sampler * = 0);
148         DEPRECATED void set_texturing(const Texturing *);
149         DEPRECATED unsigned allocate_effect_texunit();
150 #pragma GCC diagnostic pop
151         DEPRECATED void set_material(const Material *);
152
153         DEPRECATED void set_lighting(const Lighting *);
154         void set_clipping(const Clipping *);
155
156         /** Sets the shader program to use.  An initial set of data can be set as
157         well, with the same semantics as add_shader_data. */
158         void set_shader_program(const Program *prog, const ProgramData *data = 0);
159
160         /** Adds another set of data to be use with shader programs.  The data is
161         independent of any shader program changes and remains in effect until the
162         Renderer state is popped. */
163         void add_shader_data(const ProgramData &data);
164
165         DEPRECATED void flush_shader_data() { flush_shader_data_(); }
166 private:
167         void flush_shader_data_();
168
169 public:
170         void set_vertex_setup(const VertexSetup *);
171         void set_winding_test(const WindingTest *);
172         void set_reverse_winding(bool);
173
174         void set_object_lod_bias(unsigned);
175         unsigned get_object_lod_bias() const { return state->object_lod_bias; }
176
177         /** Saves the current state so it can be restored later. */
178         void push_state();
179
180         /** Restores a previously saved state.  Must be matched with an earlier
181         push_state call. */
182         void pop_state();
183
184         /** Unbinds all objects and resets related state.  There must be no unpopped
185         state in the stack.  The Renderer remains valid and may be reused for
186         further rendering. */
187         void end();
188
189         void exclude(const Renderable &);
190         void include(const Renderable &);
191
192         void render(const Renderable &, Tag = Tag());
193         void draw(const Batch &);
194         void draw_instanced(const Batch &, unsigned);
195
196 private:
197         void apply_state();
198 };
199
200 } // namespace GL
201 } // namespace Msp
202
203 #endif