X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fcore%2Fmesh.cpp;h=de05102a358a5665a51b12cd0c345c21441052d5;hp=492f416d1adeccb28e2abf3febfbe874a679abeb;hb=d493917dbc215cd6ba3f8773a52a289d9f14380d;hpb=f1244e29afd2a36aafc2373d485457b4cb0411ff diff --git a/source/core/mesh.cpp b/source/core/mesh.cpp index 492f416d..de05102a 100644 --- a/source/core/mesh.cpp +++ b/source/core/mesh.cpp @@ -31,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); @@ -89,7 +89,6 @@ void Mesh::check_buffers(unsigned mask) ibuf = new Buffer; if(!batches.empty()) batches.front().change_buffer(ibuf); - vtx_setup.set_index_buffer(*ibuf); dirty |= INDEX_BUFFER; #ifdef DEBUG @@ -97,6 +96,9 @@ void Mesh::check_buffers(unsigned mask) vbuf->set_debug_name(debug_name+" [IBO]"); #endif } + + if(!batches.empty()) + vtx_setup.set_index_buffer(*ibuf, batches.front().get_index_type()); } } @@ -105,7 +107,7 @@ unsigned Mesh::get_n_vertices() const return vertices.size(); } -float *Mesh::modify_vertex(unsigned i) +char *Mesh::modify_vertex(unsigned i) { if(vertices.get_format().empty()) throw invalid_operation("Mesh::modify_vertex"); @@ -146,12 +148,25 @@ void Mesh::add_batch(const Batch &b) batches.back().use_buffer(ibuf, prev); } + DataType existing_type = batches.front().get_index_type(); + DataType added_type = batches.back().get_index_type(); + if(existing_type!=added_type) + { + if(get_type_size(existing_type)>get_type_size(added_type)) + batches.back().set_index_type(existing_type); + else + { + for(vector::iterator i=batches.begin(); i!=batches.end(); ++i) + i->set_index_type(added_type); + } + } + check_buffers(INDEX_BUFFER); } -void Mesh::set_winding(const WindingTest *w) +void Mesh::set_winding(FaceWinding w) { - winding = w; + face_winding = w; } void Mesh::draw(Renderer &renderer) const @@ -183,7 +198,7 @@ void Mesh::draw(Renderer &renderer, const VertexSetup *vs, unsigned count) const resize_buffers(); renderer.set_vertex_setup(vs ? vs : &vtx_setup); - renderer.set_winding_test(winding); + renderer.set_front_face(face_winding); if(!count) { @@ -256,7 +271,7 @@ Mesh::Loader::Loader(Mesh &m, bool g): add("storage", &Loader::storage); add("vertices", &Loader::vertices); add("vertices", &Loader::vertices_with_format); - add("winding", &Loader::winding); + add("winding", &Mesh::face_winding); } void Mesh::Loader::storage(const vector &a) @@ -290,14 +305,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),