-/* $Id$
-
-This file is part of libmspgl
-Copyright © 2007 Mikko Rasa, Mikkosoft Productions
-Distributed under the LGPL
-*/
-
+#include "error.h"
#include "primitivebuilder.h"
+using namespace std;
+
namespace Msp {
namespace GL {
PrimitiveBuilder::PrimitiveBuilder(VertexArray &a):
array(a),
vab(array),
- in_batch(false)
+ in_batch(false),
+ offs(0)
{ }
void PrimitiveBuilder::begin(PrimitiveType t)
{
if(in_batch)
- throw InvalidState("begin() already called");
+ throw invalid_operation("PrimitiveBuilder::begin");
type = t;
in_batch = true;
void PrimitiveBuilder::end()
{
if(!in_batch)
- throw InvalidState("end() called without begin()");
+ 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 InvalidState("Element specification not between begin() and end()");
- if(i>=array.size())
- throw InvalidParameterValue("Element index out of range");
- element_(i);
+ 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 InvalidState("Not between begin() and end()");
+ throw invalid_operation("PrimitiveBuilder::get_type");
return type;
}
-void PrimitiveBuilder::vertex_(float x, float y, float z, float w)
+void PrimitiveBuilder::vertex_(const Vector4 &v)
{
- vab.texcoord(ts, tt, tr, tq);
- vab.color(cr, cg, cb, ca);
- vab.normal(nx, ny, nz);
- for(std::map<unsigned, Attrib>::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);
+ 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);