X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fprimitivebuilder.cpp;h=95faa3fb5f74aee13e63f392bda69e4871d700e5;hb=927a1aa0a3a27e463ec0efc08bd08e7c4e969909;hp=ca8f4f3c5343ff973aef0ab1e33173b5d6e4adc4;hpb=d1800d7ea80290f4913d0203241cef1409656522;p=libs%2Fgl.git diff --git a/source/primitivebuilder.cpp b/source/primitivebuilder.cpp index ca8f4f3c..95faa3fb 100644 --- a/source/primitivebuilder.cpp +++ b/source/primitivebuilder.cpp @@ -12,6 +12,7 @@ namespace GL { PrimitiveBuilder::PrimitiveBuilder(VertexArray &a): array(a), + vab(array), in_batch(false) { } @@ -22,22 +23,29 @@ void PrimitiveBuilder::begin(PrimitiveType t) type=t; in_batch=true; - builder=array.modify(); begin_(); } void PrimitiveBuilder::end() { - if(in_batch) + if(!in_batch) throw InvalidState("end() called without begin()"); - builder=0; in_batch=false; end_(); } +void PrimitiveBuilder::element(unsigned i) +{ + if(!in_batch) + throw InvalidState("Element specification not between begin() and end()"); + if(i>=array.size()) + throw InvalidParameterValue("Element index out of range"); + element_(i); +} + PrimitiveType PrimitiveBuilder::get_type() const { if(!in_batch) @@ -47,13 +55,15 @@ PrimitiveType PrimitiveBuilder::get_type() const void PrimitiveBuilder::vertex_(float x, float y, float z, float w) { - if(!in_batch) - throw InvalidState("Vertex specification not between begin() and end()"); + vab.texcoord(ts, tt, tr, tq); + vab.color(cr, cg, cb, ca); + vab.normal(nx, ny, nz); + for(std::map::iterator i=av.begin(); i!=av.end(); ++i) + vab.attrib(i->first, i->second.x, i->second.y, i->second.z, i->second.w); + vab.vertex(x, y, z, w); - builder->texcoord(ts, tt, tr,tq); - builder->color(cr, cg, cb, ca); - builder->normal(nx, ny, nz); - builder->vertex(x, y, z, w); + if(in_batch) + element_(array.size()-1); } } // namespace GL