1 #ifndef MSP_GL_RENDERER_H_
2 #define MSP_GL_RENDERER_H_
8 #include "programdata.h"
9 #include "renderer_backend.h"
30 Rendering supervisor. This is the primary interface for setting state and
31 issuing draw commands.
33 The Renderer class allows setting textures and uniform values by names (using
34 ProgramData for the latter). The names are resolved into binding points when
35 the resources are needed for a draw command.
37 A state stack is provided to help with state management in render graphs.
38 Renderables can save the state by pushing it on the stack before beginning
39 their work, and pop it afterwards to restore it without disturbing state set
42 class Renderer: public RendererBackend
44 friend RendererBackend;
48 RAII helper class for pushing state on the stack.
56 Push(Renderer &r): renderer(r) { renderer.push_state(); }
57 ~Push() { renderer.pop_state(); }
64 mutable int binding = -1;
65 const Texture *texture = 0;
66 const Sampler *sampler = 0;
71 struct BoundProgramData
73 const ProgramData *shdata;
74 mutable unsigned generation = 0;
76 BoundProgramData(const ProgramData *);
81 const Camera *camera = 0;
83 const Framebuffer *framebuffer = 0;
84 const Rect *viewport = 0;
85 const Rect *scissor = 0;
86 unsigned texture_count = 0;
87 const Program *shprog = 0;
88 unsigned shdata_count = 0;
89 const VertexSetup *vertex_setup = 0;
90 FaceWinding front_face = NON_MANIFOLD;
91 CullMode face_cull = NO_CULL;
92 const DepthTest *depth_test = 0;
93 const StencilTest *stencil_test = 0;
94 const Blend *blend = 0;
95 unsigned object_lod_bias = 0;
104 unsigned frame_index = 0;
105 unsigned char changed = 0;
106 std::vector<State> state_stack;
107 State *current_state = 0;
108 ProgramData standard_shdata;
109 std::vector<BoundProgramData> shdata_stack;
110 std::vector<BoundTexture> texture_stack;
116 /** Begins rendering, allowing commands to be issued. */
119 /** Ends rendering. Any global state is reset to defaults. No further
120 commands are allowed before the next call to begin(). */
123 using RendererBackend::begin;
124 using RendererBackend::end;
126 /** Saves the current state so it can be restored later. */
129 /** Restores a previously saved state. Must be matched with an earlier
134 State &get_state() const;
137 /** Sets the camera to render from. The model matrix is reset to identity. */
138 void set_camera(const Camera &);
140 const Camera *get_camera() const { return get_state().camera; }
142 /** Replaces the Renderer's model matrix. */
143 void set_matrix(const Matrix &);
145 /** Returns the current model matrix. */
146 const Matrix &get_matrix() const { return get_state().model_matrix; }
148 void set_framebuffer(const Framebuffer *);
149 void set_viewport(const Rect *);
150 void set_scissor(const Rect *);
152 const Framebuffer *get_framebuffer() const { return get_state().framebuffer; }
154 /** Sets the shader program to use. As a convenience, uniform values may be
155 specified at the same time. */
156 void set_shader_program(const Program *prog, const ProgramData *data = 0);
158 /** Adds uniform values, which will be available for shader programs. If
159 multiple ProgramData objects with the same uniforms are added, the one added
160 last will be used. */
161 void add_shader_data(const ProgramData &data);
163 void set_texture(Tag, const Texture *, const Sampler * = 0);
164 void set_texture(Tag, const Texture *, int, const Sampler * = 0);
167 void flush_shader_data();
168 void flush_textures();
171 void set_vertex_setup(const VertexSetup *);
172 void set_front_face(FaceWinding);
173 void set_face_cull(CullMode);
175 void set_depth_test(const DepthTest *);
176 void set_stencil_test(const StencilTest *);
177 void set_blend(const Blend *);
179 void set_object_lod_bias(unsigned);
180 unsigned get_object_lod_bias() const { return get_state().object_lod_bias; }
182 /** Clears framebuffer contents. If values is not null, it must contain one
183 element for each attachment. Otherwise the framebuffer contents are
184 discarded and become undefined. */
185 void clear(const ClearValue *values);
187 /** Draws a batch of primitives. A shader must be active. */
188 void draw(const Batch &);
190 /** Draws multiple instances of a batch of primitives. A shader must be active. */
191 void draw_instanced(const Batch &, unsigned);
193 /** Resolves multisample attachments from the active framebuffer into
195 void resolve_multisample(Framebuffer &target);
197 void begin_query(const QueryPool &, unsigned);
198 void end_query(const QueryPool &, unsigned);