]> git.tdb.fi Git - libs/gl.git/blobdiff - source/mesh.cpp
Check for armature mismatches in Animation
[libs/gl.git] / source / mesh.cpp
index 301c00f94b331fc6c87087bc9f79a8b558c675a0..b3b719c516942c42e5012a8ad92ad21dec06958d 100644 (file)
@@ -1,4 +1,5 @@
 #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"
@@ -29,7 +30,7 @@ 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;
@@ -40,6 +41,7 @@ void Mesh::init(ResourceManager *rm)
 
 Mesh::~Mesh()
 {
+       set_manager(0);
        delete vbuf;
        delete ibuf;
        if(vao_id)
@@ -126,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<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);
+               }
        }
 }
 
@@ -153,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<Batch>::const_iterator i=batches.begin(); i!=batches.end(); ++i)
+       for(vector<Batch>::const_iterator i=batches.begin(); i!=batches.end(); ++i)
                i->draw();
 }
 
@@ -172,7 +193,7 @@ void Mesh::draw(Renderer &renderer) const
        renderer.set_mesh(this);
        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);
 }
 
@@ -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)