X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fcore%2Fmesh.cpp;h=360d588f97659d9a3e2d395fa876029a4d84a337;hp=029c16e0fac6b04d35f1847faf2590fafd320c1f;hb=HEAD;hpb=acaefb4c669f01855252818ef0a2958cbdababc3 diff --git a/source/core/mesh.cpp b/source/core/mesh.cpp index 029c16e0..360d588f 100644 --- a/source/core/mesh.cpp +++ b/source/core/mesh.cpp @@ -9,27 +9,25 @@ using namespace std; namespace Msp { namespace GL { -Mesh::Mesh(ResourceManager *rm) +Mesh::Mesh(const VertexFormat &f) { - init(rm); -} - -Mesh::Mesh(const VertexFormat &f, ResourceManager *rm) -{ - init(rm); storage(f); } -void Mesh::init(ResourceManager *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)) { - vbuf = 0; - ibuf = 0; - dirty = 0; - disallow_rendering = false; - face_winding = NON_MANIFOLD; - - if(rm) - set_manager(rm); + other.vbuf = 0; + other.ibuf = 0; } Mesh::~Mesh() @@ -47,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() @@ -65,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 @@ -97,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); } @@ -129,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; @@ -210,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; } @@ -258,9 +259,8 @@ void Mesh::set_debug_name(const string &name) } -Mesh::Loader::Loader(Mesh &m, bool g): - DataFile::ObjectLoader(m), - allow_gl_calls(g) +Mesh::Loader::Loader(Mesh &m): + DataFile::ObjectLoader(m) { add("batch", &Loader::batch); add("storage", &Loader::storage); @@ -297,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); @@ -330,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)