X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Frender%2Frenderer.cpp;h=6bbfbbe0d0785628b89d1ec7c84608b2f0905b93;hb=8d211effd0c6db66e57f9ffd8ee712eef6069a1c;hp=336b631aaf91c467dbca5577abd81f2b79ebaebe;hpb=ab9b22356f16aea822527c06186641d3121e1355;p=libs%2Fgl.git diff --git a/source/render/renderer.cpp b/source/render/renderer.cpp index 336b631a..6bbfbbe0 100644 --- a/source/render/renderer.cpp +++ b/source/render/renderer.cpp @@ -21,6 +21,9 @@ using namespace std; namespace Msp { namespace GL { +const Tag Renderer::world_obj_matrix_tag("world_obj_matrix"); +const Tag Renderer::world_obj_normal_matrix_tag("world_obj_normal_matrix"); + Renderer::Renderer(): placeholder_texture(Resources::get_global().get("_placeholder.png")) { @@ -40,7 +43,6 @@ void Renderer::begin() RendererBackend::begin(); - add_shader_data(standard_shdata); commands.begin_frame(frame_index); } @@ -103,7 +105,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,24 +348,34 @@ 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); - LinAl::SquareMatrix nm = state.model_matrix.block<3, 3>(0, 0); + standard_shdata.uniform(world_obj_matrix_tag, state.model_matrix); + LinAl::Matrix nm = state.model_matrix.block<3, 3>(0, 0); nm = transpose(invert(nm)); - standard_shdata.uniform("world_obj_normal_matrix", nm); + standard_shdata.uniform(world_obj_normal_matrix_tag, 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);