+ changed |= SHADER_DATA;
+ }
+ shdata_applied = min<unsigned>(shdata_applied, shdata_stack.size());
+ 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());
+ else
+ standard_shdata.uniform("projection_matrix", Matrix());
+ changed |= STANDARD_SHDATA|LEGACY_PROJECTION;
+ }
+ /* 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;
+ }
+ changed |= LEGACY_LIGHTING;
+ }
+ if(state->clipping!=old_clipping || camera_changed)
+ {
+ if(state->clipping)
+ {
+ state->clipping->update_shader_data(standard_shdata, state->clipping_matrix);
+ changed |= STANDARD_SHDATA;
+ }
+ changed |= LEGACY_CLIPPING;
+ }