X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fvertexbuilder.h;h=55f914a31a24b7400b7efbe9b786d32940fa882c;hb=a40fc85277dba5c34402a0e703d038efd30cc57b;hp=e7f9b13231797cecd77a553bf7d90eb8f8811645;hpb=4443707c752ab8ee288f1c22be08cf82f27439d7;p=libs%2Fgl.git diff --git a/source/vertexbuilder.h b/source/vertexbuilder.h index e7f9b132..55f914a3 100644 --- a/source/vertexbuilder.h +++ b/source/vertexbuilder.h @@ -1,16 +1,11 @@ -/* $Id$ - -This file is part of libmspgl -Copyright © 2007, 2009-2010 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" +#include "vertexformat.h" namespace Msp { namespace GL { @@ -26,11 +21,39 @@ data. Attributes can be read from protected member variables. */ class VertexBuilder { +public: + class PushMatrix + { + private: + VertexBuilder &bld; + Matrix mtx; + + public: + PushMatrix(VertexBuilder &b): bld(b), mtx(bld.mtx) { } + ~PushMatrix() { bld.mtx = mtx; } + }; + +protected: + Matrix mtx; + Vector3 nor; + Color col; + std::map texc; + std::map attr; + public: VertexBuilder(): nor(0, 0, 1) { } virtual ~VertexBuilder() { } + void set_matrix(const Matrix &m) + { mtx = m; } + + void transform(const Matrix &m) + { mtx *= m; } + + const Matrix &get_matrix() const + { return mtx; } + void vertex(float x, float y) { vertex(x, y, 0, 1); } @@ -38,20 +61,44 @@ public: { vertex(x, y, z, 1); } void vertex(float x, float y, float z, float w) - { vertex_(x, y, z, 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(v.x, v.y, v.z, v.w); } + { vertex_(mtx*v); } protected: - virtual void vertex_(float x, float y, float z, float w) =0; + 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) - { nor = n; } + { + Vector4 tn = mtx*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*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*Vector4(b.x, b.y, b.z, 0); + attrib(get_component_type(BINORMAL3), tb); + } void texcoord(float s) { texcoord(s, 0, 0, 1); } @@ -112,12 +159,6 @@ public: void attrib(unsigned i, const Vector4 &a) { attr[i] = a; } - -protected: - Vector3 nor; - Color col; - std::map texc; - std::map attr; }; } // namespace GL