X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fmesh.cpp;h=b3b719c516942c42e5012a8ad92ad21dec06958d;hp=3e9e118ac52e6a9eb40b47345cce0f9692d9b140;hb=af0ba2af0167247bcda74e76f3c83c0c0e89650a;hpb=fcd9e657d0c86cfa4c5bb951ccad2ff5f242863a diff --git a/source/mesh.cpp b/source/mesh.cpp index 3e9e118a..b3b719c5 100644 --- a/source/mesh.cpp +++ b/source/mesh.cpp @@ -1,4 +1,5 @@ #include +#include #include #include #include "buffer.h" @@ -29,8 +30,9 @@ void Mesh::init(ResourceManager *rm) vbuf = 0; ibuf = 0; vao_id = 0; - defer_buffers = true; + defer_buffers = ARB_vertex_buffer_object; dirty = true; + disallow_rendering = false; winding = 0; if(rm) @@ -39,6 +41,7 @@ void Mesh::init(ResourceManager *rm) Mesh::~Mesh() { + set_manager(0); delete vbuf; delete ibuf; if(vao_id) @@ -125,10 +128,29 @@ void Mesh::add_batch(const Batch &b) batches.back().append(b); else { + bool reallocate = (batches.size()==batches.capacity()); + if(reallocate && ibuf) + { + for(vector::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::iterator i=batches.begin(); i!=batches.end(); ++i) + { + i->use_buffer(ibuf, prev); + prev = &*i; + } + } + else + batches.back().use_buffer(ibuf, prev); + } } } @@ -152,10 +174,10 @@ void Mesh::draw() const if(!current()) vertices.apply(); - Bind bind_ibuf(ibuf, ELEMENT_ARRAY_BUFFER); + BindRestore bind_ibuf(ibuf, ELEMENT_ARRAY_BUFFER); Bind bind_winding(winding); - for(list::const_iterator i=batches.begin(); i!=batches.end(); ++i) + for(vector::const_iterator i=batches.begin(); i!=batches.end(); ++i) i->draw(); } @@ -169,10 +191,9 @@ void Mesh::draw(Renderer &renderer) const } renderer.set_mesh(this); - renderer.set_element_buffer(ibuf); renderer.set_winding_test(winding); - for(list::const_iterator i=batches.begin(); i!=batches.end(); ++i) + for(vector::const_iterator i=batches.begin(); i!=batches.end(); ++i) renderer.draw(*i); } @@ -183,7 +204,7 @@ void Mesh::bind() const if(!vao_id) { unbind(); - vertices.apply(); + vertices.apply(false); } else if(set_current(this)) { @@ -200,7 +221,7 @@ void Mesh::unbind() glBindVertexArray(0); } -Resource::AsyncLoader *Mesh::load(IO::Seekable &io) +Resource::AsyncLoader *Mesh::load(IO::Seekable &io, const Resources *) { return new AsyncLoader(*this, io); } @@ -273,7 +294,7 @@ Mesh::AsyncLoader::AsyncLoader(Mesh &m, IO::Seekable &i): 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)