Mesh::~Mesh()
{
set_manager(0);
+ batches.clear();
delete vbuf;
delete ibuf;
}
{
if(mask&VERTEX_BUFFER)
{
- if(!vbuf)
+ unsigned req_size = vertices.get_required_buffer_size();
+ if(!vbuf || (vbuf->get_size()>0 && vbuf->get_size()<req_size))
{
+ delete vbuf;
vbuf = new Buffer(ARRAY_BUFFER);
vertices.use_buffer(vbuf);
vtx_setup.set_vertex_array(vertices);
- }
- unsigned req_size = vertices.get_required_buffer_size();
- if(vbuf->get_size()<req_size)
- {
dirty |= VERTEX_BUFFER;
- vertices.buffer_resized();
}
}
if(mask&INDEX_BUFFER)
{
- if(!ibuf)
+ unsigned req_size = (batches.empty() ? 0 : batches.front().get_required_buffer_size());
+ if(!ibuf || (ibuf->get_size()>0 && ibuf->get_size()<req_size))
{
+ delete ibuf;
ibuf = new Buffer(ELEMENT_ARRAY_BUFFER);
if(!batches.empty())
- batches.front().use_buffer(ibuf);
+ batches.front().change_buffer(ibuf);
vtx_setup.set_index_buffer(*ibuf);
- }
- unsigned req_size = (batches.empty() ? 0 : batches.front().get_required_buffer_size());
- if(ibuf->get_size()<req_size)
- {
dirty |= INDEX_BUFFER;
- if(!batches.empty())
- batches.front().buffer_resized();
}
}
}
void Mesh::resize_buffers() const
{
if(dirty&VERTEX_BUFFER)
- vbuf->data(vertices.get_required_buffer_size(), 0);
+ vbuf->storage(vertices.get_required_buffer_size());
if(dirty&INDEX_BUFFER)
- ibuf->data(batches.front().get_required_buffer_size(), 0);
+ ibuf->storage(batches.front().get_required_buffer_size());
dirty = 0;
}
}
-Mesh::Loader::Loader(Mesh &m):
- DataFile::ObjectLoader<Mesh>(m)
+Mesh::Loader::Loader(Mesh &m, bool g):
+ DataFile::ObjectLoader<Mesh>(m),
+ allow_gl_calls(g)
{
add("batch", &Loader::batch);
add("vertices", &Loader::vertices);
fmt = (fmt, *i);
obj.vertices.reset(fmt);
load_sub(obj.vertices);
- obj.check_buffers(VERTEX_BUFFER);
+ if(allow_gl_calls)
+ {
+ obj.check_buffers(VERTEX_BUFFER);
+ obj.vtx_setup.refresh();
+ }
}
void Mesh::Loader::batch(PrimitiveType p)
{
// TODO use correct filename
DataFile::Parser parser(io, "async");
- Loader loader(mesh);
+ Loader loader(mesh, false);
loader.load(parser);
}
else if(phase==1)
{
mesh.resize_buffers();
+ mesh.vtx_setup.refresh();
vertex_updater = mesh.vertices.refresh_async();
if(!mesh.batches.empty())
index_updater = mesh.batches.front().refresh_async();