3 #include "nv_primitive_restart.h"
18 Mesh::Mesh(const VertexFormat &f):
36 void Mesh::use_buffers(bool b)
40 vertices.use_vertex_buffer();
42 ibuf = new Buffer(ELEMENT_ARRAY_BUFFER);
47 vertices.use_vertex_buffer(0);
54 unsigned Mesh::get_n_vertices() const
56 return vertices.size();
59 float *Mesh::modify_vertex(unsigned i)
61 return vertices.modify(i);
64 void Mesh::add_batch(const Batch &b)
66 bool can_append = false;
69 PrimitiveType type = b.get_type();
70 can_append = (type==batches.back().get_type() &&
71 type!=LINE_STRIP && type!=LINE_LOOP && type!=POLYGON &&
72 (type!=TRIANGLE_FAN || NV_primitive_restart));
77 ibuf = new Buffer(ELEMENT_ARRAY_BUFFER);
82 batches.back().append(b);
85 Batch *prev = (batches.empty() ? 0 : &batches.back());
88 batches.back().use_buffer(ibuf, prev);
92 void Mesh::set_winding(const WindingTest *w)
97 void Mesh::draw() const
102 ibuf->bind_to(ELEMENT_ARRAY_BUFFER);
103 Bind bind_winding(winding);
105 for(list<Batch>::const_iterator i=batches.begin(); i!=batches.end(); ++i)
109 Buffer::unbind_from(ELEMENT_ARRAY_BUFFER);
112 void Mesh::draw(Renderer &renderer) const
114 renderer.set_vertex_array(&vertices);
115 renderer.set_element_buffer(ibuf);
116 renderer.set_winding_test(winding);
118 for(list<Batch>::const_iterator i=batches.begin(); i!=batches.end(); ++i)
121 renderer.set_winding_test(0);
125 Mesh::Loader::Loader(Mesh &m):
126 DataFile::ObjectLoader<Mesh>(m)
128 add("batch", &Loader::batch);
129 add("vertices", &Loader::vertices);
130 add("winding", &Loader::winding);
133 void Mesh::Loader::vertices(VertexFormat f)
135 obj.vertices.reset(f);
136 load_sub(obj.vertices);
139 void Mesh::Loader::batch(PrimitiveType p)
146 void Mesh::Loader::winding(FaceWinding w)
149 obj.winding = &WindingTest::clockwise();
150 else if(w==COUNTERCLOCKWISE)
151 obj.winding = &WindingTest::counterclockwise();