mtx_changed(false),
camera(c),
state_stack(1),
- state(&state_stack.back()),
vertex_array(0),
vertex_array_changed(false),
element_buffer(0)
{
+ state_stack.reserve(16);
+ shdata_stack.reserve(32);
+ state = &state_stack.back();
+
MatrixStack::modelview().push();
if(camera)
{
state->shprog = p;
if(p && d)
add_shader_data(*d);
+
+ /* Even if we have no new shdata, the existing ones need to be re-applied
+ to the new program */
shdata_changed = true;
}
void Renderer::add_shader_data(const ProgramData &d)
{
- state->shdata.push_back(&d);
+ shdata_stack.push_back(&d);
+ state->shdata_count = shdata_stack.size();
shdata_changed = true;
}
state_stack.pop_back();
state = &state_stack.back();
+ if(shdata_stack.size()>state->shdata_count)
+ shdata_stack.erase(shdata_stack.begin()+state->shdata_count, shdata_stack.end());
mtx_stack.pop();
mtx_changed = true;
shdata_changed = true;
state->shprog->bind();
if(shdata_changed)
{
- for(vector<const ProgramData *>::const_iterator i=state->shdata.begin(); i!=state->shdata.end(); ++i)
+ for(vector<const ProgramData *>::const_iterator i=shdata_stack.begin(); i!=shdata_stack.end(); ++i)
(*i)->apply();
shdata_changed = false;
}