X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Frender%2Frenderer.cpp;fp=source%2Frender%2Frenderer.cpp;h=fceee6e8c631f71cacfb3a3ce908ad65cce8afc1;hp=336b631aaf91c467dbca5577abd81f2b79ebaebe;hb=7b1a814276741e1aff68c6e9066537374c19c283;hpb=1cc48c919cc47895ea5ae23199c20dfe909b4e4c diff --git a/source/render/renderer.cpp b/source/render/renderer.cpp index 336b631a..fceee6e8 100644 --- a/source/render/renderer.cpp +++ b/source/render/renderer.cpp @@ -40,7 +40,6 @@ void Renderer::begin() RendererBackend::begin(); - add_shader_data(standard_shdata); commands.begin_frame(frame_index); } @@ -103,7 +102,6 @@ void Renderer::set_pipeline_key(uintptr_t key) void Renderer::set_camera(const Camera &c) { get_state().camera = &c; - add_shader_data(c.get_shader_data()); set_matrix(Matrix()); } @@ -347,6 +345,17 @@ void Renderer::apply_state() bool shprog_changed = (state.shprog!=ps.get_shader_program()); ps.set_shader_program(state.shprog); + bool shdata_changed = changed&SHADER_DATA; + for(auto i=shdata_stack.begin(); (!shdata_changed && i!=shdata_stack.end()); ++i) + shdata_changed = (i->shdata->get_generation()!=i->generation); + bool extra_shdata = (shdata_stack.size()>state.shdata_count); + + if(changed&CAMERA) + { + shdata_changed = true; + changed &= ~CAMERA; + } + if(changed&MATRIX) { standard_shdata.uniform("world_obj_matrix", state.model_matrix); @@ -354,17 +363,16 @@ void Renderer::apply_state() nm = transpose(invert(nm)); standard_shdata.uniform("world_obj_normal_matrix", nm); changed &= ~MATRIX; + shdata_changed = true; } - bool shdata_changed = changed&SHADER_DATA; - for(auto i=shdata_stack.begin(); (!shdata_changed && i!=shdata_stack.end()); ++i) - shdata_changed = (i->shdata->get_generation()!=i->generation); - bool extra_shdata = (shdata_stack.size()>state.shdata_count); - if(shdata_changed || shprog_changed || pipeline_changed || extra_shdata) { if(extra_shdata) shdata_stack.erase(shdata_stack.begin()+state.shdata_count, shdata_stack.end()); + standard_shdata.apply(*state.shprog, ps, frame_index); + if(state.camera) + state.camera->get_shader_data().apply(*state.shprog, ps, frame_index); for(const BoundProgramData &d: shdata_stack) { d.shdata->apply(*state.shprog, ps, frame_index);