will often be more efficient. This is especially true for ObjectInstances.
The Renderer works by deferring GL state changes until something is actually
-being drawn. This avoids many unnecessary GL calls. */
+being drawn. This avoids many unnecessary GL calls if consecutive renderables
+use the same resources.
+*/
class Renderer
{
public:
const VertexArray *vertex_array;
bool vertex_array_changed;
const Buffer *element_buffer;
+ bool shdata_changed;
public:
Renderer(const Camera *);
void set_texture(const Texture *);
void set_texturing(const Texturing *);
void set_material(const Material *);
- void set_shader(const Program *, const ProgramData *);
- void add_shader_data(const ProgramData *);
+
+ /** Sets the shader program to use. An initial set of data can be set as
+ well, with the same semantics as add_shader_data. */
+ void set_shader_program(const Program *prog, const ProgramData *data = 0);
+
+ /** Adds another set of data to be use with shader programs. The data is
+ independent of any shader program changes and remains in effect until the
+ Renderer state is popped. */
+ void add_shader_data(const ProgramData &data);
+
void set_vertex_array(const VertexArray *);
void set_element_buffer(const Buffer *);
void set_winding_test(const WindingTest *);
void push_state();
void pop_state();
- /** Prepares for temporarily bypassing the Renderer. */
+ /** Prepares for temporarily bypassing the Renderer by synchronizing the
+ current state with GL. No additional call is necessary to resume using the
+ Renderer. */
void escape();
void draw(const Batch &);