#include <msp/gl/extensions/arb_vertex_array_object.h>
#include <msp/gl/extensions/arb_vertex_shader.h>
#include "buffer.h"
+#include "error.h"
#include "mesh.h"
#include "renderer.h"
void Mesh::refresh() const
{
+ if(!vbuf)
+ return;
+
vertices.refresh();
if(dirty)
{
if(dirty&1)
{
- unbind();
for(list<Batch>::const_iterator i=batches.begin(); i!=batches.end(); ++i)
i->refresh();
}
if(dirty&2)
{
- glBindVertexArray(vao_id);
- BufferAlias<ARRAY_BUFFER> vbuf_alias(*vbuf);
- Bind bind_vbuf(vbuf_alias);
+ Bind bind_vbuf(vbuf, ARRAY_BUFFER);
+
+ bool bind_here = !current();
+ if(bind_here)
+ glBindVertexArray(vao_id);
const VertexFormat &fmt = vertices.get_format();
unsigned stride = get_stride(fmt)*sizeof(float);
ptr += sz;
}
glBindBuffer(ELEMENT_ARRAY_BUFFER, ibuf->get_id());
- glBindVertexArray(0);
+
+ if(bind_here)
+ glBindVertexArray(0);
}
dirty = 0;
void Mesh::draw() const
{
+ const Mesh *cur = current();
+ if(cur && cur!=this)
+ throw invalid_operation("Mesh::draw");
+
refresh();
if(!current())
- {
vertices.apply();
- if(ibuf)
- ibuf->bind_to(ELEMENT_ARRAY_BUFFER);
- }
-
+ Bind bind_ibuf(ibuf, ELEMENT_ARRAY_BUFFER);
Bind bind_winding(winding);
for(list<Batch>::const_iterator i=batches.begin(); i!=batches.end(); ++i)
i->draw();
-
- if(!current() && ibuf)
- Buffer::unbind_from(ELEMENT_ARRAY_BUFFER);
}
void Mesh::draw(Renderer &renderer) const
{
- vertices.apply();
+ refresh();
+
+ renderer.set_mesh(this);
renderer.set_element_buffer(ibuf);
renderer.set_winding_test(winding);
called. Thus unbind won't try to call a null function either. */
if(!vao_id)
unbind();
- else
- {
- if(Buffer::current(ELEMENT_ARRAY_BUFFER))
- {
- unbind();
- Buffer::unbind_from(ELEMENT_ARRAY_BUFFER);
- }
- if(set_current(this))
- glBindVertexArray(vao_id);
- }
+ else if(set_current(this))
+ glBindVertexArray(vao_id);
}
void Mesh::unbind()