X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fcore%2Fmesh.cpp;h=4414a90e6577910e7881dee65877134e7cd1ba69;hb=fe9836f2d8d7abb0480582c544611a5b248310cc;hp=f63b32933c64245f988004df8fbca9377d62541c;hpb=a5a26e4e2eb2d0b05c3531b667411be657ac74f1;p=libs%2Fgl.git diff --git a/source/core/mesh.cpp b/source/core/mesh.cpp index f63b3293..4414a90e 100644 --- a/source/core/mesh.cpp +++ b/source/core/mesh.cpp @@ -14,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) @@ -32,7 +31,7 @@ void Mesh::init(ResourceManager *rm) ibuf = 0; dirty = 0; disallow_rendering = false; - winding = 0; + face_winding = NON_MANIFOLD; if(rm) set_manager(rm); @@ -46,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(); @@ -60,7 +68,7 @@ void Mesh::check_buffers(unsigned mask) if(!vbuf || (vbuf->get_size()>0 && vbuf->get_size()get_size()>0 && ibuf->get_size() &a) +void Mesh::Loader::storage(const vector &a) { if(a.empty()) throw invalid_argument("No vertex attributes"); @@ -255,13 +267,20 @@ void Mesh::Loader::vertices(const vector &a) VertexFormat fmt; 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) @@ -271,14 +290,6 @@ void Mesh::Loader::batch(PrimitiveType p) obj.add_batch(btc); } -void Mesh::Loader::winding(FaceWinding w) -{ - if(w==CLOCKWISE) - obj.winding = &WindingTest::clockwise(); - else if(w==COUNTERCLOCKWISE) - obj.winding = &WindingTest::counterclockwise(); -} - Mesh::AsyncLoader::AsyncLoader(Mesh &m, IO::Seekable &i): mesh(m), @@ -315,7 +326,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();