X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Frenderer.cpp;h=01c17a26ef8cc3ce5019bea833a3224e7c54e19c;hb=08e19bc2b4eba572bc7699378cf55cd8772ac67e;hp=cbec16e92a1bcfb8e00ca8df55a698c007077370;hpb=2a27f2d40ef2359e347c838887101904789941d2;p=libs%2Fgl.git diff --git a/source/renderer.cpp b/source/renderer.cpp index cbec16e9..01c17a26 100644 --- a/source/renderer.cpp +++ b/source/renderer.cpp @@ -92,6 +92,7 @@ unsigned Renderer::allocate_effect_texunit() void Renderer::set_material(const Material *m) { state->material = m; + changed |= MATERIAL_SHDATA; } void Renderer::set_lighting(const Lighting *l) @@ -99,8 +100,11 @@ void Renderer::set_lighting(const Lighting *l) state->lighting = l; state->lighting_matrix = mtx_stack.top(); if(l) + { l->update_shader_data(standard_shdata, mtx_stack.top()); - changed |= LIGHTING; + changed |= STANDARD_SHDATA; + } + changed |= LEGACY_LIGHTING; } void Renderer::set_clipping(const Clipping *c) @@ -109,7 +113,7 @@ void Renderer::set_clipping(const Clipping *c) state->clipping_matrix = mtx_stack.top(); if(c) c->update_shader_data(standard_shdata, mtx_stack.top()); - changed |= CLIPPING; + changed |= LEGACY_CLIPPING; } void Renderer::set_shader_program(const Program *p, const ProgramData *d) @@ -169,13 +173,13 @@ void Renderer::pop_state() { if(state->lighting) state->lighting->update_shader_data(standard_shdata, state->lighting_matrix); - changed |= LIGHTING; + changed |= LEGACY_LIGHTING; } if(state->clipping!=old_clipping) { if(state->clipping) state->clipping->update_shader_data(standard_shdata, state->clipping_matrix); - changed |= CLIPPING; + changed |= LEGACY_CLIPPING; } } @@ -198,6 +202,7 @@ void Renderer::end() Texture::unbind_from(0); Material::unbind(); Lighting::unbind(); + Clipping::unbind(); Program::unbind(); Buffer::unbind_from(ELEMENT_ARRAY_BUFFER); WindingTest::unbind(); @@ -260,13 +265,13 @@ void Renderer::apply_state() else Material::unbind(); - if(changed&LIGHTING) + if(changed&LEGACY_LIGHTING) { if(state->lighting) { MatrixStack::modelview() = state->lighting_matrix; state->lighting->bind(); - changed = (changed&~LIGHTING)|LEGACY_MATRIX; + changed = (changed&~LEGACY_LIGHTING)|LEGACY_MATRIX; } else Lighting::unbind(); @@ -277,11 +282,11 @@ void Renderer::apply_state() { if(legacy_bindings) { - if(changed&CLIPPING) + if(changed&LEGACY_CLIPPING) { MatrixStack::modelview() = state->clipping_matrix; state->clipping->bind(true); - changed = (changed&~CLIPPING)|LEGACY_MATRIX; + changed = (changed&~LEGACY_CLIPPING)|LEGACY_MATRIX; } } else @@ -304,12 +309,20 @@ void Renderer::apply_state() LinAl::SquareMatrix nm = m.block<3, 3>(0, 0); nm = transpose(invert(nm)); standard_shdata.uniform_matrix3("eye_obj_normal_matrix", &nm(0, 0)); - changed &= ~MODERN_MATRIX; + changed = (changed&~MODERN_MATRIX)|STANDARD_SHDATA; } - if(state->material) + if(state->material && (changed&MATERIAL_SHDATA)) + { state->material->get_shader_data().apply(); - standard_shdata.apply(); + changed &= ~MATERIAL_SHDATA; + } + + if(changed&STANDARD_SHDATA) + { + standard_shdata.apply(); + changed &= ~STANDARD_SHDATA; + } } if((changed&SHADER_DATA) || shprog_changed)