]> git.tdb.fi Git - libs/gl.git/blobdiff - source/renderer.cpp
Clear matrices_loaded flag after resetting matrices
[libs/gl.git] / source / renderer.cpp
index 606dd341336fcbc8668bc8724e38898f9fe084bb..bac7b6b854bcc2ea1c51d684b2ff700589e2d9a8 100644 (file)
@@ -22,7 +22,8 @@ namespace GL {
 
 Renderer::Renderer(const Camera *c):
        mtx_stack(*this),
-       mtx_changed(false),
+       mtx_changed(true),
+       matrices_loaded(false),
        camera(c),
        state_stack(1),
        lighting_changed(false),
@@ -32,11 +33,8 @@ Renderer::Renderer(const Camera *c):
        shdata_stack.reserve(32);
        state = &state_stack.back();
 
-       MatrixStack::modelview().push();
        if(camera)
        {
-               MatrixStack::projection().push();
-               camera->apply();
                mtx_stack.load(camera->get_matrix());
                standard_shdata.uniform("projection_matrix", camera->get_projection_matrix());
        }
@@ -49,18 +47,7 @@ Renderer::Renderer(const Camera *c):
 
 Renderer::~Renderer()
 {
-       if(camera)
-               MatrixStack::projection().pop();
-       MatrixStack::modelview().pop();
-
-       Mesh::unbind();
-       Texturing::unbind();
-       Texture::unbind_from(0);
-       Material::unbind();
-       Lighting::unbind();
-       Program::unbind();
-       Buffer::unbind_from(ELEMENT_ARRAY_BUFFER);
-       WindingTest::unbind();
+       end();
 }
 
 void Renderer::set_texture(const Texture *t)
@@ -157,6 +144,32 @@ void Renderer::escape()
 {
        apply_state();
        Buffer::unbind_from(ELEMENT_ARRAY_BUFFER);
+       matrices_loaded = false;
+}
+
+void Renderer::end()
+{
+       if(state_stack.size()>1)
+               throw invalid_operation("Renderer::end");
+
+       if(matrices_loaded)
+       {
+               if(camera)
+                       MatrixStack::projection().pop();
+               MatrixStack::modelview().pop();
+               matrices_loaded = false;
+       }
+
+       Mesh::unbind();
+       Texturing::unbind();
+       Texture::unbind_from(0);
+       Material::unbind();
+       Lighting::unbind();
+       Program::unbind();
+       Buffer::unbind_from(ELEMENT_ARRAY_BUFFER);
+       WindingTest::unbind();
+
+       *state = State();
 }
 
 void Renderer::exclude(const Renderable &renderable)
@@ -282,10 +295,24 @@ void Renderer::apply_state()
        else
                WindingTest::unbind();
 
-       if(legacy_bindings && mtx_changed)
+       if(legacy_bindings)
        {
-               MatrixStack::modelview() = mtx_stack.top();
-               mtx_changed = false;
+               if(!matrices_loaded)
+               {
+                       MatrixStack::modelview().push();
+                       if(camera)
+                       {
+                               MatrixStack::projection().push();
+                               camera->apply();
+                       }
+                       matrices_loaded = true;
+               }
+
+               if(mtx_changed)
+               {
+                       MatrixStack::modelview() = mtx_stack.top();
+                       mtx_changed = false;
+               }
        }
 }