3 This file is part of libmspgl
4 Copyright © 2011 Mikko Rasa, Mikkosoft Productions
5 Distributed under the LGPL
8 #include <msp/core/except.h>
14 #include "programdata.h"
17 #include "texturing.h"
18 #include "vertexarray.h"
25 Renderer::Renderer(const Camera *c):
29 state(&state_stack.back()),
31 vertex_array_changed(false),
34 MatrixStack::modelview().push();
37 MatrixStack::projection().push();
39 mtx_stack = camera->get_matrix();
42 mtx_stack = MatrixStack::modelview().top();
48 MatrixStack::projection().pop();
49 MatrixStack::modelview().pop();
52 Texture::unbind_from(0);
55 Buffer::unbind_from(ELEMENT_ARRAY_BUFFER);
58 MatrixStack &Renderer::matrix_stack()
64 void Renderer::set_texture(const Texture *t)
70 void Renderer::set_texturing(const Texturing *t)
76 void Renderer::set_material(const Material *m)
81 void Renderer::set_shader(const Program *p, const ProgramData *d)
85 state->shdata.assign(1, d);
87 state->shdata.clear();
90 void Renderer::add_shader_data(const ProgramData *d)
93 throw InvalidState("No shader program");
95 state->shdata.push_back(d);
98 void Renderer::set_vertex_array(const VertexArray *a)
100 vertex_array_changed = (a!=vertex_array);
104 void Renderer::set_element_buffer(const Buffer *b)
109 void Renderer::push_state()
111 state_stack.push_back(state_stack.back());
112 state = &state_stack.back();
116 void Renderer::pop_state()
118 if(state_stack.size()==1)
119 throw InvalidState("Can't pop the last state");
121 state_stack.pop_back();
122 state = &state_stack.back();
126 void Renderer::escape()
129 Buffer::unbind_from(ELEMENT_ARRAY_BUFFER);
132 void Renderer::draw(const Batch &batch)
135 throw InvalidState("Can't draw without a vertex array");
139 // Until VertexArray acquires VAO support and becomes Bindable
140 if(vertex_array_changed)
141 vertex_array->apply();
144 element_buffer->bind_to(ELEMENT_ARRAY_BUFFER);
146 Buffer::unbind_from(ELEMENT_ARRAY_BUFFER);
151 void Renderer::apply_state()
153 // We let the objects themselves figure out if the binding has changed
156 state->texturing->bind();
161 state->texture->bind_to(0);
163 Texture::unbind_from(0);
167 state->material->bind();
173 state->shprog->bind();
174 for(vector<const ProgramData *>::const_iterator i=state->shdata.begin(); i!=state->shdata.end(); ++i)
182 MatrixStack::modelview() = mtx_stack.top();
188 Renderer::State::State():