winding = w;
}
-void Mesh::draw() const
-{
- const Mesh *cur = current();
- if(cur && cur!=this)
- throw invalid_operation("Mesh::draw");
-
- if(manager)
- {
- manager->resource_used(*this);
- if(disallow_rendering)
- return;
- }
-
- BindRestore bind_vtxs(vtx_setup);
- BindRestore bind_ibuf(ibuf, ELEMENT_ARRAY_BUFFER);
- Bind bind_winding(winding);
-
- for(vector<Batch>::const_iterator i=batches.begin(); i!=batches.end(); ++i)
- i->draw();
-}
-
void Mesh::draw(Renderer &renderer) const
{
- if(manager)
- {
- manager->resource_used(*this);
- if(disallow_rendering)
- return;
- }
-
- renderer.set_mesh(this);
- renderer.set_winding_test(winding);
-
- for(vector<Batch>::const_iterator i=batches.begin(); i!=batches.end(); ++i)
- renderer.draw(*i);
+ draw(renderer, 0, 0);
}
void Mesh::draw_instanced(Renderer &renderer, const VertexSetup &vs, unsigned count) const
if(vs.get_vertex_array()!=&vertices)
throw invalid_argument("Mesh::draw_instanced");
+ draw(renderer, &vs, count);
+}
+
+void Mesh::draw(Renderer &renderer, const VertexSetup *vs, unsigned count) const
+{
if(manager)
{
manager->resource_used(*this);
return;
}
- renderer.set_vertex_setup(&vs);
+ renderer.set_vertex_setup(vs ? vs : &vtx_setup);
renderer.set_winding_test(winding);
- for(vector<Batch>::const_iterator i=batches.begin(); i!=batches.end(); ++i)
- renderer.draw_instanced(*i, count);
-}
-
-void Mesh::bind() const
-{
- if(set_current(this))
+ if(!count)
{
- vtx_setup.bind();
- vertices.refresh();
+ for(vector<Batch>::const_iterator i=batches.begin(); i!=batches.end(); ++i)
+ renderer.draw(*i);
+ }
+ else
+ {
+ for(vector<Batch>::const_iterator i=batches.begin(); i!=batches.end(); ++i)
+ renderer.draw_instanced(*i, count);
}
-}
-
-void Mesh::unbind()
-{
- if(set_current(0))
- VertexSetup::unbind();
}
Resource::AsyncLoader *Mesh::load(IO::Seekable &io, const Resources *)