namespace GL {
Immediate::Immediate(VertexFormat f):
- array(f),
- in_batch(false),
- n_vertices(0)
+ PrimitiveBuilder(array),
+ array(f)
{ }
-void Immediate::begin(PrimitiveType t)
+void Immediate::reset()
{
- type=t;
- in_batch=true;
- n_vertices=0;
- builder=array.modify();
+ if(in_batch)
+ throw InvalidState("Can't reset Immediate between begin() and end()");
+
+ array.clear();
+ indices.clear();
}
-void Immediate::end()
+void Immediate::end_()
{
- builder=0;
-
array.apply();
- glDrawArrays(type, 0, n_vertices);
+ draw_elements(type, indices.size(), &indices[0]);
- array.clear();
- in_batch=false;
+ indices.clear();
}
-void Immediate::vertex_(float x, float y, float z, float w)
+void Immediate::element_(unsigned i)
{
- if(!in_batch)
- throw InvalidState("Vertex specification not between begin and end");
-
- builder->texcoord(ts, tt, tr,tq);
- builder->color(cr, cg, cb, ca);
- builder->normal(nx, ny, nz);
- builder->vertex(x, y, z, w);
-
- ++n_vertices;
+ indices.push_back(i);
}
} // namespace GL