-/* $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 "types.h"
+#include "color.h"
+#include "matrix.h"
+#include "vector.h"
+#include "vertexformat.h"
namespace Msp {
namespace GL {
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(ubyte r, ubyte g, ubyte b) { color(r, g, b, 255); }
- void color(ubyte r, ubyte g, ubyte b, ubyte 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 Vector3 &v)
+ { vertex(Vector4(v.x, v.y, v.z, 1)); }
+
+ 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 tangent(float x, float y, float z)
+ { tangent(Vector3(x, y, z)); }
+
+ void tangent(const Vector3 &t)
+ {
+ Vector4 tt = mtx.top()*Vector4(t.x, t.y, t.z, 0);
+ attrib(get_component_type(TANGENT3), tt);
+ }
+
+ void binormal(float x, float y, float z)
+ { binormal(Vector3(x, y, z)); }
+
+ void binormal(const Vector3 &b)
+ {
+ Vector4 tb = mtx.top()*Vector4(b.x, b.y, b.z, 0);
+ attrib(get_component_type(BINORMAL3), tb);
+ }
+
+ 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