#include <msp/gl/extensions/arb_vertex_array_object.h>
+#include <msp/gl/extensions/arb_vertex_buffer_object.h>
#include <msp/gl/extensions/arb_vertex_shader.h>
#include <msp/gl/extensions/nv_primitive_restart.h>
#include "buffer.h"
vbuf = 0;
ibuf = 0;
vao_id = 0;
- defer_buffers = true;
+ defer_buffers = ARB_vertex_buffer_object;
dirty = true;
disallow_rendering = false;
winding = 0;
Mesh::~Mesh()
{
+ set_manager(0);
delete vbuf;
delete ibuf;
if(vao_id)
batches.back().append(b);
else
{
+ bool reallocate = (batches.size()==batches.capacity());
+ if(reallocate && ibuf)
+ {
+ for(vector<Batch>::iterator i=batches.end(); i!=batches.begin(); )
+ (--i)->use_buffer(0);
+ }
+
Batch *prev = (batches.empty() ? 0 : &batches.back());
batches.push_back(b);
if(ibuf)
- batches.back().use_buffer(ibuf, prev);
+ {
+ if(reallocate)
+ {
+ prev = 0;
+ for(vector<Batch>::iterator i=batches.begin(); i!=batches.end(); ++i)
+ {
+ i->use_buffer(ibuf, prev);
+ prev = &*i;
+ }
+ }
+ else
+ batches.back().use_buffer(ibuf, prev);
+ }
}
}
if(!current())
vertices.apply();
- Bind bind_ibuf(ibuf, ELEMENT_ARRAY_BUFFER);
+ BindRestore bind_ibuf(ibuf, ELEMENT_ARRAY_BUFFER);
Bind bind_winding(winding);
- for(list<Batch>::const_iterator i=batches.begin(); i!=batches.end(); ++i)
+ for(vector<Batch>::const_iterator i=batches.begin(); i!=batches.end(); ++i)
i->draw();
}
}
renderer.set_mesh(this);
- renderer.set_element_buffer(ibuf);
renderer.set_winding_test(winding);
- for(list<Batch>::const_iterator i=batches.begin(); i!=batches.end(); ++i)
+ for(vector<Batch>::const_iterator i=batches.begin(); i!=batches.end(); ++i)
renderer.draw(*i);
}
glBindVertexArray(0);
}
-Resource::AsyncLoader *Mesh::load(IO::Seekable &io)
+Resource::AsyncLoader *Mesh::load(IO::Seekable &io, const Resources *)
{
return new AsyncLoader(*this, io);
}
phase(0)
{
// Make sure the extension is initialized in the rendering thread.
- (bool)NV_primitive_restart;
+ (void)(bool)NV_primitive_restart;
mesh.disallow_rendering = true;
if(mesh.defer_buffers)