#include "error.h"
#include "lighting.h"
#include "material.h"
+#include "mesh.h"
#include "program.h"
#include "programdata.h"
#include "renderable.h"
MatrixStack::projection().push();
camera->apply();
mtx_stack.load(camera->get_matrix());
+ standard_shdata.uniform("projection_matrix", camera->get_projection_matrix());
}
else
+ {
+ standard_shdata.uniform("projection_matrix", MatrixStack::projection().top());
mtx_stack.load(MatrixStack::modelview().top());
+ }
}
Renderer::~Renderer()
MatrixStack::projection().pop();
MatrixStack::modelview().pop();
+ Mesh::unbind();
Texturing::unbind();
Texture::unbind_from(0);
Material::unbind();
{
state->lighting = l;
state->lighting_matrix = mtx_stack.top();
+ if(l)
+ /* XXX I'm not happy with this, but can't come up with anything better
+ right now. */
+ const_cast<Lighting *>(l)->update_shader_data(mtx_stack.top());
lighting_changed = true;
}
shdata_changed = true;
}
+void Renderer::set_mesh(const Mesh *m)
+{
+ state->mesh = m;
+}
+
void Renderer::set_element_buffer(const Buffer *b)
{
element_buffer = b;
{
apply_state();
- if(element_buffer)
- element_buffer->bind_to(ELEMENT_ARRAY_BUFFER);
- else
- Buffer::unbind_from(ELEMENT_ARRAY_BUFFER);
+ bool legacy_bindings = (!state->shprog || state->shprog->uses_legacy_variables());
+ if(legacy_bindings)
+ {
+ if(element_buffer)
+ element_buffer->bind_to(ELEMENT_ARRAY_BUFFER);
+ else
+ Buffer::unbind_from(ELEMENT_ARRAY_BUFFER);
+ }
batch.draw();
}
/* We (mostly) let the objects themselves figure out if the binding has
changed */
+ bool legacy_bindings = (!state->shprog || state->shprog->uses_legacy_variables());
+
if(state->texturing)
state->texturing->bind();
else
Texture::unbind_from(0);
}
- if(state->material)
- state->material->bind();
- else
- Material::unbind();
-
- if(lighting_changed)
+ if(legacy_bindings)
{
- if(state->lighting)
+ if(state->material)
+ state->material->bind();
+ else
+ Material::unbind();
+
+ if(lighting_changed)
{
- MatrixStack::modelview() = state->lighting_matrix;
- state->lighting->bind();
- mtx_changed = true;
- lighting_changed = false;
+ if(state->lighting)
+ {
+ MatrixStack::modelview() = state->lighting_matrix;
+ state->lighting->bind();
+ mtx_changed = true;
+ lighting_changed = false;
+ }
+ else
+ Lighting::unbind();
}
- else
- Lighting::unbind();
}
if(state->shprog)
{
state->shprog->bind();
+
+ if(!legacy_bindings)
+ {
+ const Matrix &m = mtx_stack.top();
+ standard_shdata.uniform("eye_obj_matrix", mtx_stack.top());
+ LinAl::SquareMatrix<float, 3> nm;
+ for(unsigned i=0; i<3; ++i)
+ for(unsigned j=0; j<3; ++j)
+ nm(i, j) = m(i, j);
+ nm = transpose(invert(nm));
+ standard_shdata.uniform_matrix3("eye_obj_normal_matrix", &nm(0, 0));
+ if(state->lighting)
+ state->lighting->get_shader_data().apply();
+ if(state->material)
+ state->material->get_shader_data().apply();
+ standard_shdata.apply();
+ }
+
if(shdata_changed)
{
for(vector<const ProgramData *>::const_iterator i=shdata_stack.begin(); i!=shdata_stack.end(); ++i)
else
Program::unbind();
+ if(state->mesh)
+ {
+ if(legacy_bindings)
+ {
+ Mesh::unbind();
+ state->mesh->get_vertices().apply();
+ }
+ else
+ state->mesh->bind();
+ }
+ else
+ Mesh::unbind();
+
if(state->winding_test)
{
if(state->reverse_winding)
else
WindingTest::unbind();
- if(mtx_changed)
+ if(legacy_bindings && mtx_changed)
{
MatrixStack::modelview() = mtx_stack.top();
mtx_changed = false;
lighting(0),
shprog(0),
shdata_count(0),
+ mesh(0),
winding_test(0)
{ }
#include <set>
#include <vector>
#include "matrix.h"
+#include "programdata.h"
#include "tag.h"
namespace Msp {
class Buffer;
class Camera;
class Material;
+class Mesh;
class Lighting;
class Program;
-class ProgramData;
class Renderable;
class Texture;
class Texturing;
Matrix lighting_matrix;
const Program *shprog;
unsigned shdata_count;
+ const Mesh *mesh;
const WindingTest *winding_test;
bool reverse_winding;
std::vector<State> state_stack;
State *state;
bool lighting_changed;
+ ProgramData standard_shdata;
std::vector<const ProgramData *> shdata_stack;
bool shdata_changed;
const Buffer *element_buffer;
Renderer state is popped. */
void add_shader_data(const ProgramData &data);
+ void set_mesh(const Mesh *);
void set_element_buffer(const Buffer *);
void set_winding_test(const WindingTest *);
void set_reverse_winding(bool);