]> git.tdb.fi Git - libs/gl.git/blobdiff - source/core/mesh.cpp
Check the flat qualifier from the correct member
[libs/gl.git] / source / core / mesh.cpp
index 981a59e8002c46585f498887da1c32f00429b7ce..360d588f97659d9a3e2d395fa876029a4d84a337 100644 (file)
@@ -9,21 +9,25 @@ using namespace std;
 namespace Msp {
 namespace GL {
 
-Mesh::Mesh(ResourceManager *rm):
-       vbuf(0),
-       ibuf(0),
-       dirty(0),
-       disallow_rendering(false),
-       face_winding(NON_MANIFOLD)
+Mesh::Mesh(const VertexFormat &f)
 {
-       if(rm)
-               set_manager(rm);
+       storage(f);
 }
 
-Mesh::Mesh(const VertexFormat &f, ResourceManager *rm):
-       Mesh(rm)
+Mesh::Mesh(Mesh &&other):
+       Resource(move(other)),
+       vertices(move(other.vertices)),
+       batches(move(other.batches)),
+       vbuf(other.vbuf),
+       ibuf(other.ibuf),
+       vtx_setup(move(other.vtx_setup)),
+       dirty(other.dirty),
+       disallow_rendering(other.disallow_rendering),
+       face_winding(other.face_winding),
+       debug_name(move(other.debug_name))
 {
-       storage(f);
+       other.vbuf = 0;
+       other.ibuf = 0;
 }
 
 Mesh::~Mesh()
@@ -41,6 +45,8 @@ void Mesh::storage(const VertexFormat &fmt)
 
        vertices.set_format(fmt);
        vtx_setup.set_format(fmt);
+       if(vbuf)
+               vtx_setup.set_vertex_array(vertices);
 }
 
 void Mesh::clear()
@@ -59,7 +65,8 @@ void Mesh::check_buffers(unsigned mask)
                        delete vbuf;
                        vbuf = new Buffer;
                        vertices.use_buffer(vbuf);
-                       vtx_setup.set_vertex_array(vertices);
+                       if(!vertices.get_format().empty())
+                               vtx_setup.set_vertex_array(vertices);
                        dirty |= VERTEX_BUFFER;
 
 #ifdef DEBUG
@@ -91,23 +98,23 @@ void Mesh::check_buffers(unsigned mask)
        }
 }
 
-unsigned Mesh::get_n_vertices() const
+size_t Mesh::get_n_vertices() const
 {
        return vertices.size();
 }
 
-char *Mesh::modify_vertex(unsigned i)
+char *Mesh::modify_vertex(size_t i)
 {
        if(vertices.get_format().empty())
                throw invalid_operation("Mesh::modify_vertex");
        return vertices.modify(i);
 }
 
-void Mesh::add_batch(const Batch &b)
+void Mesh::add_batch(Batch &&b)
 {
        if(batches.empty())
        {
-               batches.push_back(b);
+               batches.emplace_back(move(b));
                if(ibuf)
                        batches.back().use_buffer(ibuf);
        }
@@ -123,7 +130,7 @@ void Mesh::add_batch(const Batch &b)
                }
 
                Batch *prev = &batches.back();
-               batches.push_back(b);
+               batches.emplace_back(move(b));
                if(reallocate)
                {
                        prev = 0;
@@ -204,9 +211,9 @@ void Mesh::draw(Renderer &renderer, const VertexSetup *vs, unsigned count) const
 void Mesh::resize_buffers() const
 {
        if(dirty&VERTEX_BUFFER)
-               vbuf->storage(vertices.get_required_buffer_size());
+               vbuf->storage(vertices.get_required_buffer_size(), STATIC);
        if((dirty&INDEX_BUFFER) && !batches.empty())
-               ibuf->storage(batches.front().get_required_buffer_size());
+               ibuf->storage(batches.front().get_required_buffer_size(), STATIC);
        dirty = 0;
 }
 
@@ -252,9 +259,8 @@ void Mesh::set_debug_name(const string &name)
 }
 
 
-Mesh::Loader::Loader(Mesh &m, bool g):
-       DataFile::ObjectLoader<Mesh>(m),
-       allow_gl_calls(g)
+Mesh::Loader::Loader(Mesh &m):
+       DataFile::ObjectLoader<Mesh>(m)
 {
        add("batch",    &Loader::batch);
        add("storage",  &Loader::storage);
@@ -291,16 +297,13 @@ void Mesh::Loader::batch(PrimitiveType p)
 {
        Batch btc(p);
        load_sub(btc);
-       obj.add_batch(btc);
+       obj.add_batch(move(btc));
 }
 
 
 Mesh::AsyncLoader::AsyncLoader(Mesh &m, IO::Seekable &i):
        mesh(m),
-       io(i),
-       vertex_updater(0),
-       index_updater(0),
-       phase(0)
+       io(i)
 {
        mesh.disallow_rendering = true;
        mesh.check_buffers(VERTEX_BUFFER|INDEX_BUFFER);
@@ -324,7 +327,8 @@ bool Mesh::AsyncLoader::process()
        {
                // TODO use correct filename
                DataFile::Parser parser(io, "async");
-               Loader loader(mesh, false);
+               Loader loader(mesh);
+               loader.allow_gl_calls = false;
                loader.load(parser);
        }
        else if(phase==1)