X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fvertexarraybuilder.cpp;fp=source%2Fvertexarraybuilder.cpp;h=5f469a985173b3f5f8cc0143ebe54406ee393703;hp=0000000000000000000000000000000000000000;hb=85facfb688035b5bbc9a3a87d080582fbf34930b;hpb=fd1b14ee491dfd62881876afe007ac63301b422a diff --git a/source/vertexarraybuilder.cpp b/source/vertexarraybuilder.cpp new file mode 100644 index 00000000..5f469a98 --- /dev/null +++ b/source/vertexarraybuilder.cpp @@ -0,0 +1,71 @@ +/* $Id$ + +This file is part of libmspgl +Copyright © 2007 Mikko Rasa, Mikkosoft Productions +Distributed under the LGPL +*/ + +#include "vertexarray.h" +#include "vertexarraybuilder.h" + +namespace Msp { +namespace GL { + +VertexArrayBuilder::VertexArrayBuilder(VertexArray &a, std::vector &d): + data(d), + array(a) +{ } + +VertexArrayBuilder::~VertexArrayBuilder() +{ + array.update_data(); +} + +void VertexArrayBuilder::vertex_(float x, float y, float z, float w) +{ + for(uint fmt=array.get_format(); fmt; fmt>>=4) + { + uint size=(fmt&3)+1; + switch(fmt&12) + { + case 0: + data.push_back(x); + data.push_back(y); + if(size>=3) data.push_back(z); + if(size>=4) data.push_back(w); + break; + case 4: + data.push_back(nx); + data.push_back(ny); + data.push_back(nz); + break; + case 8: + data.push_back(ts); + if(size>=2) data.push_back(tt); + if(size>=3) data.push_back(tr); + if(size>=4) data.push_back(tq); + break; + case 12: + if(size==1) + { + union { ubyte c[4]; float f; } u; + u.c[0]=(ubyte)(cr*255); + u.c[1]=(ubyte)(cg*255); + u.c[2]=(ubyte)(cb*255); + u.c[3]=(ubyte)(ca*255); + data.push_back(u.f); + } + else + { + data.push_back(cr); + data.push_back(cg); + data.push_back(cb); + if(size>=4) data.push_back(ca); + } + break; + } + } +} + +} // namespace GL +} // namespace Msp