X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fcore%2Fmesh.cpp;h=ea14d590b3012815526247555a4d4a2c74d473d1;hb=d40673bd28c4b4524d3642b949d9d109dc6f9f24;hp=dba8a9915489aede7906f8a684b9d59e288428b5;hpb=7aaec9a70b8d7733429bec043f8e33e02956f266;p=libs%2Fgl.git diff --git a/source/core/mesh.cpp b/source/core/mesh.cpp index dba8a991..ea14d590 100644 --- a/source/core/mesh.cpp +++ b/source/core/mesh.cpp @@ -1,6 +1,7 @@ #include #include #include +#include #include "buffer.h" #include "error.h" #include "mesh.h" @@ -13,16 +14,15 @@ using namespace std; namespace Msp { namespace GL { -Mesh::Mesh(ResourceManager *rm): - vertices(VERTEX3) +Mesh::Mesh(ResourceManager *rm) { init(rm); } -Mesh::Mesh(const VertexFormat &f, ResourceManager *rm): - vertices(f) +Mesh::Mesh(const VertexFormat &f, ResourceManager *rm) { init(rm); + storage(f); } void Mesh::init(ResourceManager *rm) @@ -45,6 +45,15 @@ Mesh::~Mesh() delete ibuf; } +void Mesh::storage(const VertexFormat &fmt) +{ + if(!vertices.get_format().empty()) + throw invalid_operation("Mesh::storage"); + + vertices.set_format(fmt); + vtx_setup.set_format(fmt); +} + void Mesh::clear() { vertices.clear(); @@ -63,6 +72,11 @@ void Mesh::check_buffers(unsigned mask) vertices.use_buffer(vbuf); vtx_setup.set_vertex_array(vertices); dirty |= VERTEX_BUFFER; + +#ifdef DEBUG + if(!debug_name.empty()) + vbuf->set_debug_name(debug_name+" [VBO]"); +#endif } } @@ -77,6 +91,11 @@ void Mesh::check_buffers(unsigned mask) batches.front().change_buffer(ibuf); vtx_setup.set_index_buffer(*ibuf); dirty |= INDEX_BUFFER; + +#ifdef DEBUG + if(!debug_name.empty()) + vbuf->set_debug_name(debug_name+" [IBO]"); +#endif } } } @@ -88,6 +107,8 @@ unsigned Mesh::get_n_vertices() const float *Mesh::modify_vertex(unsigned i) { + if(vertices.get_format().empty()) + throw invalid_operation("Mesh::modify_vertex"); return vertices.modify(i); } @@ -155,6 +176,9 @@ void Mesh::draw(Renderer &renderer, const VertexSetup *vs, unsigned count) const return; } + if(batches.empty()) + return; + if(dirty) resize_buffers(); @@ -177,7 +201,7 @@ void Mesh::resize_buffers() const { if(dirty&VERTEX_BUFFER) vbuf->storage(vertices.get_required_buffer_size()); - if(dirty&INDEX_BUFFER) + if((dirty&INDEX_BUFFER) && !batches.empty()) ibuf->storage(batches.front().get_required_buffer_size()); dirty = 0; } @@ -202,37 +226,61 @@ void Mesh::unload() vertices.clear(); vertices.use_buffer(0); batches.clear(); + vtx_setup.unload(); delete vbuf; delete ibuf; vbuf = 0; ibuf = 0; } +void Mesh::set_debug_name(const string &name) +{ +#ifdef DEBUG + debug_name = name; + if(vbuf) + vbuf->set_debug_name(name+" [VBO]"); + if(ibuf) + ibuf->set_debug_name(name+" [IBO]"); + vtx_setup.set_debug_name(name+" [VAO]"); +#else + (void)name; +#endif +} + Mesh::Loader::Loader(Mesh &m, bool g): DataFile::ObjectLoader(m), allow_gl_calls(g) { add("batch", &Loader::batch); + add("storage", &Loader::storage); add("vertices", &Loader::vertices); + add("vertices", &Loader::vertices_with_format); add("winding", &Loader::winding); } -void Mesh::Loader::vertices(const vector &c) +void Mesh::Loader::storage(const vector &a) { - if(c.empty()) - throw invalid_argument("No vertex components"); + if(a.empty()) + throw invalid_argument("No vertex attributes"); VertexFormat fmt; - for(vector::const_iterator i=c.begin(); i!=c.end(); ++i) + for(vector::const_iterator i=a.begin(); i!=a.end(); ++i) fmt = (fmt, *i); - obj.vertices.reset(fmt); + obj.storage(fmt); +} + +void Mesh::Loader::vertices() +{ load_sub(obj.vertices); if(allow_gl_calls) - { obj.check_buffers(VERTEX_BUFFER); - obj.vtx_setup.refresh(); - } +} + +void Mesh::Loader::vertices_with_format(const vector &a) +{ + storage(a); + vertices(); } void Mesh::Loader::batch(PrimitiveType p) @@ -286,7 +334,6 @@ bool Mesh::AsyncLoader::process() 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();