3 This file is part of libmspgl
4 Copyright © 2007-2011 Mikko Rasa, Mikkosoft Productions
5 Distributed under the LGPL
25 Mesh::Mesh(const VertexFormat &f):
43 void Mesh::use_buffers(bool b)
47 vertices.use_vertex_buffer();
49 ibuf = new Buffer(ELEMENT_ARRAY_BUFFER);
54 vertices.use_vertex_buffer(0);
61 unsigned Mesh::get_n_vertices() const
63 return vertices.size();
66 float *Mesh::modify_vertex(unsigned i)
68 return vertices.modify(i);
71 void Mesh::add_batch(const Batch &b)
73 bool can_append = false;
76 PrimitiveType type = b.get_type();
77 can_append = (type==batches.back().get_type() &&
78 type!=LINE_STRIP && type!=LINE_LOOP && type!=POLYGON &&
79 (type!=TRIANGLE_FAN || is_supported("GL_NV_primitive_restart")));
84 ibuf = new Buffer(ELEMENT_ARRAY_BUFFER);
89 batches.back().append(b);
92 Batch *prev = (batches.empty() ? 0 : &batches.back());
95 batches.back().use_index_buffer(ibuf, prev);
99 void Mesh::set_winding(const WindingTest *w)
104 void Mesh::draw() const
109 ibuf->bind_to(ELEMENT_ARRAY_BUFFER);
110 Bind bind_winding(winding);
112 for(list<Batch>::const_iterator i=batches.begin(); i!=batches.end(); ++i)
116 Buffer::unbind_from(ELEMENT_ARRAY_BUFFER);
119 void Mesh::draw(Renderer &renderer) const
121 renderer.set_vertex_array(&vertices);
122 renderer.set_element_buffer(ibuf);
123 renderer.set_winding_test(winding);
125 for(list<Batch>::const_iterator i=batches.begin(); i!=batches.end(); ++i)
128 renderer.set_winding_test(0);
132 Mesh::Loader::Loader(Mesh &m):
133 DataFile::ObjectLoader<Mesh>(m)
135 add("batch", &Loader::batch);
136 add("vertices", &Loader::vertices);
137 add("winding", &Loader::winding);
140 void Mesh::Loader::vertices(VertexFormat f)
142 obj.vertices.reset(f);
143 load_sub(obj.vertices);
146 void Mesh::Loader::batch(PrimitiveType p)
153 void Mesh::Loader::winding(FaceWinding w)
156 obj.winding = &WindingTest::clockwise();
157 else if(w==COUNTERCLOCKWISE)
158 obj.winding = &WindingTest::counterclockwise();