X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Frenderer.cpp;h=8daa13ce414bbc508a6924064ac282392a7bfb5c;hb=e3561c5c4d0b2caf00a0e50ce85c11a9fb62aa72;hp=184d326928381722e5766eed46e030b572278771;hpb=50a0c7fd661fe6bfa3f929ad66e47cfab4a0fb87;p=libs%2Fgl.git diff --git a/source/renderer.cpp b/source/renderer.cpp index 184d3269..8daa13ce 100644 --- a/source/renderer.cpp +++ b/source/renderer.cpp @@ -1,6 +1,7 @@ #include "batch.h" #include "buffer.h" #include "camera.h" +#include "clipping.h" #include "error.h" #include "lighting.h" #include "material.h" @@ -61,6 +62,16 @@ void Renderer::begin(const Camera *c) } } +void Renderer::set_matrix(const Matrix &matrix) +{ + mtx_stack.load(matrix); +} + +void Renderer::transform(const Matrix &matrix) +{ + mtx_stack *= matrix; +} + void Renderer::set_texture(const Texture *t) { state->texture = t; @@ -92,6 +103,15 @@ void Renderer::set_lighting(const Lighting *l) changed |= LIGHTING; } +void Renderer::set_clipping(const Clipping *c) +{ + state->clipping = c; + state->clipping_matrix = mtx_stack.top(); + if(c) + c->update_shader_data(standard_shdata, mtx_stack.top()); + changed |= CLIPPING; +} + void Renderer::set_shader_program(const Program *p, const ProgramData *d) { state->shprog = p; @@ -134,6 +154,7 @@ void Renderer::pop_state() throw stack_underflow("Renderer::pop_state"); const Lighting *old_lighting = state->lighting; + const Clipping *old_clipping = state->clipping; state_stack.pop_back(); state = &state_stack.back(); if(shdata_stack.size()>state->shdata_count) @@ -150,6 +171,12 @@ void Renderer::pop_state() state->lighting->update_shader_data(standard_shdata, state->lighting_matrix); changed |= LIGHTING; } + if(state->clipping!=old_clipping) + { + if(state->clipping) + state->clipping->update_shader_data(standard_shdata, state->clipping_matrix); + changed |= CLIPPING; + } } void Renderer::escape() @@ -171,6 +198,7 @@ void Renderer::end() Texture::unbind_from(0); Material::unbind(); Lighting::unbind(); + Clipping::unbind(); Program::unbind(); Buffer::unbind_from(ELEMENT_ARRAY_BUFFER); WindingTest::unbind(); @@ -246,6 +274,23 @@ void Renderer::apply_state() } } + if(state->clipping) + { + if(legacy_bindings) + { + if(changed&CLIPPING) + { + MatrixStack::modelview() = state->clipping_matrix; + state->clipping->bind(true); + changed = (changed&~CLIPPING)|LEGACY_MATRIX; + } + } + else + state->clipping->bind(false); + } + else + Clipping::unbind(); + if(state->shprog) { bool shprog_changed = (state->shprog!=Program::current()); @@ -347,6 +392,7 @@ Renderer::State::State(): lowest_effect_texunit(TexUnit::get_n_units()), material(0), lighting(0), + clipping(0), shprog(0), shdata_count(0), mesh(0),