ibuf = 0;
dirty = 0;
disallow_rendering = false;
- winding = 0;
+ face_winding = NON_MANIFOLD;
if(rm)
set_manager(rm);
ibuf = new Buffer;
if(!batches.empty())
batches.front().change_buffer(ibuf);
- vtx_setup.set_index_buffer(*ibuf);
dirty |= INDEX_BUFFER;
#ifdef DEBUG
vbuf->set_debug_name(debug_name+" [IBO]");
#endif
}
+
+ if(!batches.empty())
+ vtx_setup.set_index_buffer(*ibuf, batches.front().get_index_type());
}
}
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");
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<Batch>::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
resize_buffers();
renderer.set_vertex_setup(vs ? vs : &vtx_setup);
- renderer.set_winding_test(winding);
+ renderer.set_front_face(face_winding);
if(!count)
{
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<VertexAttribute> &a)
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),