X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Frenderer.cpp;h=416a0fc89ced4827147982f234ca009fb94576c0;hb=917db342def84f9ce925df3cb27043b92ef2bfda;hp=d6090d7d2cd57db6fb7318f15df8d8752abcbe30;hpb=b5791c97adfa8477e92b26960889c9e5ad8dd917;p=libs%2Fgl.git diff --git a/source/renderer.cpp b/source/renderer.cpp index d6090d7d..416a0fc8 100644 --- a/source/renderer.cpp +++ b/source/renderer.cpp @@ -9,6 +9,7 @@ #include "programdata.h" #include "renderable.h" #include "renderer.h" +#include "sampler.h" #include "texture.h" #include "texturing.h" #include "texunit.h" @@ -73,9 +74,10 @@ void Renderer::transform(const Matrix &matrix) changed |= MATRIX; } -void Renderer::set_texture(const Texture *t) +void Renderer::set_texture(const Texture *t, const Sampler *s) { state->texture = t; + state->sampler = s; state->texturing = 0; } @@ -83,6 +85,7 @@ void Renderer::set_texturing(const Texturing *t) { state->texturing = t; state->texture = 0; + state->sampler = 0; } unsigned Renderer::allocate_effect_texunit() @@ -271,6 +274,9 @@ void Renderer::draw_instanced(const Batch &batch, unsigned count) void Renderer::apply_state() { + if(!state->shprog) + throw invalid_operation("Renderer::apply_state"); + /* We (mostly) let the objects themselves figure out if the binding has changed */ @@ -280,7 +286,13 @@ void Renderer::apply_state() { Texturing::unbind(); if(state->texture) + { + if(state->sampler) + state->sampler->bind_to(0); + else + Sampler::unbind_from(0); state->texture->bind_to(0); + } else Texture::unbind_from(0); } @@ -290,45 +302,40 @@ void Renderer::apply_state() else Clipping::unbind(); - if(state->shprog) - { - bool shprog_changed = (state->shprog!=Program::current()); - state->shprog->bind(); + bool shprog_changed = (state->shprog!=Program::current()); + state->shprog->bind(); - if(changed&MATRIX) - { - standard_shdata.uniform("eye_obj_matrix", state->modelview_matrix); - LinAl::SquareMatrix nm = state->modelview_matrix.block<3, 3>(0, 0); - nm = transpose(invert(nm)); - standard_shdata.uniform_matrix3("eye_obj_normal_matrix", &nm(0, 0)); - changed = (changed&~MATRIX)|STANDARD_SHDATA; - } + if(changed&MATRIX) + { + standard_shdata.uniform("eye_obj_matrix", state->modelview_matrix); + LinAl::SquareMatrix nm = state->modelview_matrix.block<3, 3>(0, 0); + nm = transpose(invert(nm)); + standard_shdata.uniform_matrix3("eye_obj_normal_matrix", &nm(0, 0)); + changed = (changed&~MATRIX)|STANDARD_SHDATA; + } - if(state->material && ((changed&MATERIAL_SHDATA) || shprog_changed)) - { - state->material->get_shader_data().apply(); - changed &= ~MATERIAL_SHDATA; - } + if(state->material && ((changed&MATERIAL_SHDATA) || shprog_changed)) + { + state->material->get_shader_data().apply(); + changed &= ~MATERIAL_SHDATA; + } - if((changed&STANDARD_SHDATA) || shprog_changed) - { - standard_shdata.apply(); - changed &= ~STANDARD_SHDATA; - } + if((changed&STANDARD_SHDATA) || shprog_changed) + { + standard_shdata.apply(); + changed &= ~STANDARD_SHDATA; + } - bool extra_shdata = (shdata_stack.size()>state->shdata_count); + bool extra_shdata = (shdata_stack.size()>state->shdata_count); - if((changed&SHADER_DATA) || shprog_changed || extra_shdata) - { - if(extra_shdata) - shdata_stack.erase(shdata_stack.begin()+state->shdata_count, shdata_stack.end()); - for(vector::const_iterator i=shdata_stack.begin(); i!=shdata_stack.end(); ++i) - (*i)->apply(); - changed &= ~SHADER_DATA; - } + if((changed&SHADER_DATA) || shprog_changed || extra_shdata) + { + if(extra_shdata) + shdata_stack.erase(shdata_stack.begin()+state->shdata_count, shdata_stack.end()); + for(vector::const_iterator i=shdata_stack.begin(); i!=shdata_stack.end(); ++i) + (*i)->apply(); + changed &= ~SHADER_DATA; } - else - Program::unbind(); if(state->vertex_setup) state->vertex_setup->bind();