]> git.tdb.fi Git - libs/gl.git/blobdiff - source/mesh.cpp
Remove the deprecated ProgramBuilder class
[libs/gl.git] / source / mesh.cpp
index 3569e1c38badaac3a1f705769bfd4e6e625ff3e0..dba8a9915489aede7906f8a684b9d59e288428b5 100644 (file)
@@ -40,6 +40,7 @@ void Mesh::init(ResourceManager *rm)
 Mesh::~Mesh()
 {
        set_manager(0);
+       batches.clear();
        delete vbuf;
        delete ibuf;
 }
@@ -54,35 +55,28 @@ void Mesh::check_buffers(unsigned mask)
 {
        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();
                }
        }
 }
@@ -182,9 +176,9 @@ void Mesh::draw(Renderer &renderer, const VertexSetup *vs, unsigned count) const
 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;
 }
 
@@ -215,8 +209,9 @@ void Mesh::unload()
 }
 
 
-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);
@@ -233,7 +228,11 @@ void Mesh::Loader::vertices(const vector<VertexComponent> &c)
                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)
@@ -281,12 +280,13 @@ bool Mesh::AsyncLoader::process()
        {
                // 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();