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