X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fprimitivebuilder.cpp;h=046cc5b248c12874ab889c1c09358d9946795880;hp=ca8f4f3c5343ff973aef0ab1e33173b5d6e4adc4;hb=f14435e58bfa0fa697a06ba9a454bb30cd37d9d8;hpb=d1800d7ea80290f4913d0203241cef1409656522 diff --git a/source/primitivebuilder.cpp b/source/primitivebuilder.cpp index ca8f4f3c..046cc5b2 100644 --- a/source/primitivebuilder.cpp +++ b/source/primitivebuilder.cpp @@ -1,10 +1,3 @@ -/* $Id$ - -This file is part of libmspgl -Copyright © 2007 Mikko Rasa, Mikkosoft Productions -Distributed under the LGPL -*/ - #include "primitivebuilder.h" namespace Msp { @@ -12,7 +5,9 @@ namespace GL { PrimitiveBuilder::PrimitiveBuilder(VertexArray &a): array(a), - in_batch(false) + vab(array), + in_batch(false), + offs(0) { } void PrimitiveBuilder::begin(PrimitiveType t) @@ -20,24 +15,38 @@ void PrimitiveBuilder::begin(PrimitiveType t) if(in_batch) throw InvalidState("begin() already called"); - type=t; - in_batch=true; - builder=array.modify(); + type = t; + in_batch = true; begin_(); } void PrimitiveBuilder::end() { - if(in_batch) + if(!in_batch) throw InvalidState("end() called without begin()"); - builder=0; - in_batch=false; + in_batch = false; end_(); } +void PrimitiveBuilder::offset(unsigned o) +{ + if(o>array.size()) + throw InvalidParameterValue("Element offset out of range"); + offs = o; +} + +void PrimitiveBuilder::element(unsigned i) +{ + if(!in_batch) + throw InvalidState("Element specification not between begin() and end()"); + if(offs+i>=array.size()) + throw InvalidParameterValue("Element index out of range"); + element_(offs+i); +} + PrimitiveType PrimitiveBuilder::get_type() const { if(!in_batch) @@ -45,15 +54,18 @@ PrimitiveType PrimitiveBuilder::get_type() const 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::iterator i=texc.begin(); i!=texc.end(); ++i) + vab.multitexcoord(i->first, i->second); + for(std::map::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