X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fvertexbuilder.h;h=25eb0e76e57170151c0fdffcb43c4468a085ab0b;hp=8235c7afea0d8274d0847daa9e3b80eed024f083;hb=f14435e58bfa0fa697a06ba9a454bb30cd37d9d8;hpb=b617c5d7b5283ad260a77f01e42e6170cabbc03d diff --git a/source/vertexbuilder.h b/source/vertexbuilder.h index 8235c7af..25eb0e76 100644 --- a/source/vertexbuilder.h +++ b/source/vertexbuilder.h @@ -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 +#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 texc; + std::map 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 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