/* $Id$
This file is part of libmspgl
-Copyright © 2007 Mikko Rasa, Mikkosoft Productions
+Copyright © 2008, 2010 Mikko Rasa, Mikkosoft Productions
Distributed under the LGPL
*/
PrimitiveBuilder::PrimitiveBuilder(VertexArray &a):
array(a),
+ vab(array),
in_batch(false)
{ }
if(in_batch)
throw InvalidState("begin() already called");
- type=t;
- in_batch=true;
- builder=array.modify();
+ type = t;
+ in_batch = true;
begin_();
}
if(!in_batch)
throw InvalidState("end() called without begin()");
- builder=0;
- in_batch=false;
+ 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)
return type;
}
-void PrimitiveBuilder::vertex_(float x, float y, float z, float w)
+void PrimitiveBuilder::vertex_(const Vector4 &v)
{
- if(!in_batch)
- throw InvalidState("Vertex specification not between begin() and end()");
+ vab.color(col);
+ vab.normal(nor);
+ for(std::map<unsigned, Vector4>::iterator i=texc.begin(); i!=texc.end(); ++i)
+ vab.multitexcoord(i->first, i->second);
+ for(std::map<unsigned, Vector4>::iterator i=attr.begin(); i!=attr.end(); ++i)
+ vab.attrib(i->first, i->second);
+ vab.vertex(v);
- 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