- 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;
+ changed |= MATRIX;
+ bool camera_changed = (state->camera!=old_camera);
+ if(camera_changed)
+ {
+ if(state->camera)
+ {
+ standard_shdata.uniform("projection_matrix", state->camera->get_projection_matrix());
+ standard_shdata.uniform("eye_world_matrix", state->camera->get_view_matrix());
+ }
+ else
+ {
+ standard_shdata.uniform("projection_matrix", Matrix());
+ standard_shdata.uniform("eye_world_matrix", Matrix());
+ }
+ changed |= STANDARD_SHDATA;
+ }
+ /* This actually should compare the relevant matrices rather than check for
+ camera, but in practice lighting and clipping is set right after the camera
+ and a boolean check is much faster than matrix comparison. */
+ if(state->lighting!=old_lighting || camera_changed)
+ {
+ if(state->lighting)
+ {
+ state->lighting->update_shader_data(standard_shdata, state->lighting_matrix);
+ changed |= STANDARD_SHDATA;
+ }
+ }
+ if(state->clipping!=old_clipping || camera_changed)
+ {
+ if(state->clipping)
+ {
+ state->clipping->update_shader_data(standard_shdata, state->clipping_matrix);
+ changed |= STANDARD_SHDATA;
+ }
+ }