]> git.tdb.fi Git - libs/gl.git/blobdiff - source/vertexarraybuilder.cpp
Move VertexFormat and VertexArrayBuilder to their own files
[libs/gl.git] / source / vertexarraybuilder.cpp
diff --git a/source/vertexarraybuilder.cpp b/source/vertexarraybuilder.cpp
new file mode 100644 (file)
index 0000000..5f469a9
--- /dev/null
@@ -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<float> &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