X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Frenderer.cpp;h=d4cbbfe3454e39ef91a881bcf72cb8e06e00628a;hb=ed7ca8892daceebb963950945fed5e75bd96a8a1;hp=302d943727a2812e66bd6b85f748f398117bd4d9;hpb=a40fc85277dba5c34402a0e703d038efd30cc57b;p=libs%2Fgl.git diff --git a/source/renderer.cpp b/source/renderer.cpp index 302d9437..d4cbbfe3 100644 --- a/source/renderer.cpp +++ b/source/renderer.cpp @@ -5,7 +5,6 @@ #include "error.h" #include "lighting.h" #include "material.h" -#include "mesh.h" #include "program.h" #include "programdata.h" #include "renderable.h" @@ -22,34 +21,35 @@ using namespace std; namespace Msp { namespace GL { +Renderer::Renderer(): + default_camera(0) +{ + init(); +} + Renderer::Renderer(const Camera *c): - default_camera(c), - changed(0), - state_stack(1) + default_camera(c) { - state_stack.reserve(16); - shdata_stack.reserve(32); - state = &state_stack.back(); + init(); if(c) set_camera(*c); - else - { - standard_shdata.uniform("projection_matrix", Matrix()); - standard_shdata.uniform("eye_world_matrix", Matrix()); - } } -Renderer::~Renderer() +void Renderer::init() { - end(); + state_stack.reserve(16); + state_stack.push_back(State()); + shdata_stack.reserve(32); + state = &state_stack.back(); + + standard_shdata.uniform("projection_matrix", Matrix()); + standard_shdata.uniform("eye_world_matrix", Matrix()); } -void Renderer::begin(const Camera *c) +Renderer::~Renderer() { end(); - if(c) - set_camera(*c); } void Renderer::set_camera(const Camera &c) @@ -144,11 +144,6 @@ void Renderer::flush_shader_data() shdata_stack.erase(shdata_stack.begin()+state->shdata_count, shdata_stack.end()); } -void Renderer::set_mesh(const Mesh *m) -{ - state->mesh = m; -} - void Renderer::set_vertex_setup(const VertexSetup *vs) { state->vertex_setup = vs; @@ -235,7 +230,6 @@ void Renderer::end() shdata_stack.clear(); excluded.clear(); - Mesh::unbind(); Texturing::unbind(); Texture::unbind_from(0); Clipping::unbind(); @@ -277,6 +271,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 */ @@ -296,57 +293,45 @@ 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->mesh) - state->mesh->bind(); + if(state->vertex_setup) + state->vertex_setup->bind(); else - { - Mesh::unbind(); - - if(state->vertex_setup) - state->vertex_setup->bind(); - else - VertexSetup::unbind(); - } + VertexSetup::unbind(); if(state->winding_test) { @@ -370,7 +355,6 @@ Renderer::State::State(): clipping(0), shprog(0), shdata_count(0), - mesh(0), vertex_setup(0), winding_test(0), reverse_winding(false),