--- /dev/null
+#include "error.h"
+#include "primitivebuilder.h"
+
+using namespace std;
+
+namespace Msp {
+namespace GL {
+
+PrimitiveBuilder::PrimitiveBuilder(VertexArray &a):
+ array(a),
+ vab(array),
+ in_batch(false),
+ offs(0)
+{ }
+
+void PrimitiveBuilder::begin(PrimitiveType t)
+{
+ if(in_batch)
+ throw invalid_operation("PrimitiveBuilder::begin");
+
+ type = t;
+ in_batch = true;
+
+ begin_();
+}
+
+void PrimitiveBuilder::end()
+{
+ if(!in_batch)
+ throw invalid_operation("PrimitiveBuilder::end");
+
+ in_batch = false;
+
+ end_();
+}
+
+void PrimitiveBuilder::offset(unsigned o)
+{
+ if(o>array.size())
+ throw out_of_range("PrimitiveBuilder::offset");
+ offs = o;
+}
+
+void PrimitiveBuilder::element(unsigned i)
+{
+ if(!in_batch)
+ throw invalid_operation("PrimitiveBuilder::element");
+ if(offs+i>=array.size())
+ throw out_of_range("PrimitiveBuilder::element");
+ element_(offs+i);
+}
+
+PrimitiveType PrimitiveBuilder::get_type() const
+{
+ if(!in_batch)
+ throw invalid_operation("PrimitiveBuilder::get_type");
+ return type;
+}
+
+void PrimitiveBuilder::vertex_(const Vector4 &v)
+{
+ 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);
+
+ if(in_batch)
+ element_(array.size()-1);
+}
+
+} // namespace GL
+} // namespace Msp