]> git.tdb.fi Git - libs/gl.git/blobdiff - source/vertexbuilder.h
Drop Id tags and copyright notices from files
[libs/gl.git] / source / vertexbuilder.h
index c92a276071d9ff64ce53ab343fc9a7faddd46c0f..25eb0e76e57170151c0fdffcb43c4468a085ab0b 100644 (file)
@@ -1,14 +1,10 @@
-/* $Id$
-
-This file is part of libmspgl
-Copyright © 2007  Mikko Rasa, Mikkosoft Productions
-Distributed under the LGPL
-*/
-
 #ifndef MSP_GL_VERTEXBUILDER_H_
 #define MSP_GL_VERTEXBUILDER_H_
 
 #include <map>
+#include "color.h"
+#include "matrix.h"
+#include "vector.h"
 
 namespace Msp {
 namespace GL {
@@ -25,38 +21,104 @@ data.  Attributes can be read from protected member variables.
 class VertexBuilder
 {
 protected:
-       struct Attrib
-       {
-               float x, y, z, w;
-       };
+       MatrixStack mtx;
+       Vector3 nor;
+       Color col;
+       std::map<unsigned, Vector4> texc;
+       std::map<unsigned, Vector4> attr;
 
 public:
-       VertexBuilder();
+       VertexBuilder(): nor(0, 0, 1) { }
+
        virtual ~VertexBuilder() { }
 
-       void vertex(float x, float y)                     { vertex(x, y, 0, 1); }
-       void vertex(float x, float y, float z)            { vertex(x, y, z, 1); }
-       void vertex(float x, float y, float z, float w)   { vertex_(x, y, z, w); }
-       void normal(float x, float y, float z)            { nx=x; ny=y; nz=z; }
-       void texcoord(float s)                            { texcoord(s, 0, 0, 1); }
-       void texcoord(float s, float t)                   { texcoord(s, t, 0, 1); }
-       void texcoord(float s, float t, float r)          { texcoord(s, t, r, 1); }
-       void texcoord(float s, float t, float r, float q) { ts=s; tt=t; tr=r; tq=q; }
-       void color(unsigned char r, unsigned char g, unsigned char b)             { color(r, g, b, 255); }
-       void color(unsigned char r, unsigned char g, unsigned char b, unsigned char a)    { color(r/255.f, g/255.f, b/255.f, a/255.f); }
-       void color(float r, float g, float b)             { color(r, g, b, 1); }
-       void color(float r, float g, float b, float a)    { cr=r; cg=g; cb=b; ca=a; }
-       void attrib(unsigned i, float x)                  { attrib(i, x, 0, 0, 1); }
-       void attrib(unsigned i, float x, float y)         { attrib(i, x, y, 0, 1); }
-       void attrib(unsigned i, float x, float y, float z) { attrib(i, x, y, z, 1); }
-       void attrib(unsigned i, float x, float y, float z, float w);
+       MatrixStack &matrix()
+       { return mtx; }
+
+       void vertex(float x, float y)
+       { vertex(x, y, 0, 1); }
+
+       void vertex(float x, float y, float z)
+       { vertex(x, y, z, 1); }
+
+       void vertex(float x, float y, float z, float w)
+       { vertex(Vector4(x, y, z, w)); }
+
+       void vertex(const Vector4 &v)
+       { vertex_(mtx.top()*v); }
+
 protected:
-       float cr, cg, cb, ca;  // Color
-       float ts, tt, tr, tq;  // TexCoord
-       float nx, ny, nz;     // Normal
-       std::map<unsigned, Attrib> av;
+       virtual void vertex_(const Vector4 &) = 0;
+
+public:
+       void normal(float x, float y, float z)
+       { normal(Vector3(x, y, z)); }
+
+       void normal(const Vector3 &n)
+       {
+               Vector4 tn = mtx.top()*Vector4(n.x, n.y, n.z, 0);
+               nor = Vector3(tn.x, tn.y, tn.z);
+       }
+
+       void texcoord(float s)
+       { texcoord(s, 0, 0, 1); }
+
+       void texcoord(float s, float t)
+       { texcoord(s, t, 0, 1); }
+
+       void texcoord(float s, float t, float r)
+       { texcoord(s, t, r, 1); }
+
+       void texcoord(float s, float t, float r, float q)
+       { texcoord(Vector4(s, t, r, q)); }
+
+       void texcoord(const Vector4 &t)
+       { multitexcoord(0, t); }
+
+       void multitexcoord(unsigned i, float s)
+       { multitexcoord(i, s, 0, 0, 1); }
+
+       void multitexcoord(unsigned i, float s, float t)
+       { multitexcoord(i, s, t, 0, 1); }
+
+       void multitexcoord(unsigned i, float s, float t, float r)
+       { multitexcoord(i, s, t, r, 1); }
+
+       void multitexcoord(unsigned i, float s, float t, float r, float q)
+       { multitexcoord(i, Vector4(s, t, r, q)); }
+
+       void multitexcoord(unsigned i, const Vector4 &t)
+       { texc[i] = t; }
+
+       void color(unsigned char r, unsigned char g, unsigned char b)
+       { color(r, g, b, 255); }
+
+       void color(unsigned char r, unsigned char g, unsigned char b, unsigned char a)
+       { color(r/255.f, g/255.f, b/255.f, a/255.f); }
+
+       void color(float r, float g, float b)
+       { color(r, g, b, 1); }
+
+       void color(float r, float g, float b, float a)
+       { color(Color(r, g, b, a)); }
+
+       void color(const Color &c)
+       { col = c; }
+
+       void attrib(unsigned i, float x)
+       { attrib(i, x, 0, 0, 1); }
+
+       void attrib(unsigned i, float x, float y)
+       { attrib(i, x, y, 0, 1); }
+
+       void attrib(unsigned i, float x, float y, float z)
+       { attrib(i, x, y, z, 1); }
+
+       void attrib(unsigned i, float x, float y, float z, float w)
+       { attrib(i, Vector4(x, y, z, w)); }
 
-       virtual void vertex_(float, float, float, float) =0;
+       void attrib(unsigned i, const Vector4 &a)
+       { attr[i] = a; }
 };
 
 } // namespace GL