7 #include "programdata.h"
10 #include "texturing.h"
11 #include "vertexarray.h"
12 #include "windingtest.h"
19 Renderer::Renderer(const Camera *c):
24 state(&state_stack.back()),
26 vertex_array_changed(false),
29 MatrixStack::modelview().push();
32 MatrixStack::projection().push();
34 mtx_stack.load(camera->get_matrix());
37 mtx_stack.load(MatrixStack::modelview().top());
43 MatrixStack::projection().pop();
44 MatrixStack::modelview().pop();
47 Texture::unbind_from(0);
50 Buffer::unbind_from(ELEMENT_ARRAY_BUFFER);
51 WindingTest::unbind();
54 void Renderer::set_texture(const Texture *t)
60 void Renderer::set_texturing(const Texturing *t)
66 void Renderer::set_material(const Material *m)
71 void Renderer::set_shader(const Program *p, const ProgramData *d)
75 state->shdata.assign(1, d);
77 state->shdata.clear();
78 shdata_changed = true;
81 void Renderer::add_shader_data(const ProgramData *d)
84 throw invalid_operation("Renderer::add_shader_data");
86 state->shdata.push_back(d);
87 shdata_changed = true;
90 void Renderer::set_vertex_array(const VertexArray *a)
92 vertex_array_changed = (a!=vertex_array);
96 void Renderer::set_element_buffer(const Buffer *b)
101 void Renderer::set_winding_test(const WindingTest *w)
103 state->winding_test = w;
106 void Renderer::push_state()
108 state_stack.push_back(state_stack.back());
109 state = &state_stack.back();
113 void Renderer::pop_state()
115 if(state_stack.size()==1)
116 throw stack_underflow("Renderer::pop_state");
118 state_stack.pop_back();
119 state = &state_stack.back();
122 shdata_changed = true;
125 void Renderer::escape()
128 Buffer::unbind_from(ELEMENT_ARRAY_BUFFER);
131 void Renderer::draw(const Batch &batch)
134 throw invalid_operation("Renderer::draw");
138 // Until VertexArray acquires VAO support and becomes Bindable
139 if(vertex_array_changed)
141 vertex_array->apply();
142 vertex_array_changed = false;
146 element_buffer->bind_to(ELEMENT_ARRAY_BUFFER);
148 Buffer::unbind_from(ELEMENT_ARRAY_BUFFER);
153 void Renderer::apply_state()
155 // We let the objects themselves figure out if the binding has changed
158 state->texturing->bind();
163 state->texture->bind_to(0);
165 Texture::unbind_from(0);
169 state->material->bind();
175 state->shprog->bind();
178 for(vector<const ProgramData *>::const_iterator i=state->shdata.begin(); i!=state->shdata.end(); ++i)
180 shdata_changed = false;
186 if(state->winding_test)
187 state->winding_test->bind();
189 WindingTest::unbind();
193 MatrixStack::modelview() = mtx_stack.top();
199 Renderer::State::State():
208 Renderer::MtxStack::MtxStack(Renderer &r):
212 void Renderer::MtxStack::update()
214 renderer.mtx_changed = true;