-/* $Id$
-
-This file is part of libmspgl
-Copyright © 2011 Mikko Rasa, Mikkosoft Productions
-Distributed under the LGPL
-*/
-
-#include <msp/core/except.h>
#include "batch.h"
#include "buffer.h"
#include "camera.h"
+#include "error.h"
#include "material.h"
#include "program.h"
#include "programdata.h"
#include "texture.h"
#include "texturing.h"
#include "vertexarray.h"
+#include "windingtest.h"
using namespace std;
namespace GL {
Renderer::Renderer(const Camera *c):
+ mtx_stack(*this),
mtx_changed(false),
camera(c),
state_stack(1),
{
MatrixStack::projection().push();
camera->apply();
- mtx_stack = camera->get_matrix();
+ mtx_stack.load(camera->get_matrix());
}
else
- mtx_stack = MatrixStack::modelview().top();
+ mtx_stack.load(MatrixStack::modelview().top());
}
Renderer::~Renderer()
Material::unbind();
Program::unbind();
Buffer::unbind_from(ELEMENT_ARRAY_BUFFER);
-}
-
-MatrixStack &Renderer::matrix_stack()
-{
- mtx_changed = true;
- return mtx_stack;
+ WindingTest::unbind();
}
void Renderer::set_texture(const Texture *t)
void Renderer::add_shader_data(const ProgramData *d)
{
if(!state->shprog)
- throw InvalidState("No shader program");
+ throw invalid_operation("Renderer::add_shader_data");
state->shdata.push_back(d);
}
element_buffer = b;
}
+void Renderer::set_winding_test(const WindingTest *w)
+{
+ state->winding_test = w;
+}
+
void Renderer::push_state()
{
state_stack.push_back(state_stack.back());
void Renderer::pop_state()
{
if(state_stack.size()==1)
- throw InvalidState("Can't pop the last state");
+ throw stack_underflow("Renderer::pop_state");
state_stack.pop_back();
state = &state_stack.back();
mtx_stack.pop();
+ mtx_changed = true;
}
void Renderer::escape()
void Renderer::draw(const Batch &batch)
{
if(!vertex_array)
- throw InvalidState("Can't draw without a vertex array");
+ throw invalid_operation("Renderer::draw");
apply_state();
// Until VertexArray acquires VAO support and becomes Bindable
if(vertex_array_changed)
+ {
vertex_array->apply();
+ vertex_array_changed = false;
+ }
if(element_buffer)
element_buffer->bind_to(ELEMENT_ARRAY_BUFFER);
else
Program::unbind();
+ if(state->winding_test)
+ state->winding_test->bind();
+ else
+ WindingTest::unbind();
+
if(mtx_changed)
{
MatrixStack::modelview() = mtx_stack.top();
texture(0),
texturing(0),
material(0),
- shprog(0)
+ shprog(0),
+ winding_test(0)
+{ }
+
+
+Renderer::MtxStack::MtxStack(Renderer &r):
+ renderer(r)
{ }
+void Renderer::MtxStack::update()
+{
+ renderer.mtx_changed = true;
+}
+
} // namespace GL
} // namespace Msp