X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Frenderer.cpp;h=cbec16e92a1bcfb8e00ca8df55a698c007077370;hb=2a27f2d40ef2359e347c838887101904789941d2;hp=bc49b0f802941f3ae2a7509ae86351dc51a67ca8;hpb=c46c75f8e3863dc3c6f91a2d5dc7f58333ec9260;p=libs%2Fgl.git diff --git a/source/renderer.cpp b/source/renderer.cpp index bc49b0f8..cbec16e9 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() @@ -246,6 +273,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()); @@ -257,10 +301,7 @@ void Renderer::apply_state() { const Matrix &m = mtx_stack.top(); standard_shdata.uniform("eye_obj_matrix", mtx_stack.top()); - LinAl::SquareMatrix nm; - for(unsigned i=0; i<3; ++i) - for(unsigned j=0; j<3; ++j) - nm(i, j) = m(i, j); + 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; @@ -350,6 +391,7 @@ Renderer::State::State(): lowest_effect_texunit(TexUnit::get_n_units()), material(0), lighting(0), + clipping(0), shprog(0), shdata_count(0), mesh(0),