X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fvertexbuilder.h;h=55f914a31a24b7400b7efbe9b786d32940fa882c;hb=bec07999d95b76f4b47cffcc564d0cd0afc0435e;hp=25eb0e76e57170151c0fdffcb43c4468a085ab0b;hpb=f14435e58bfa0fa697a06ba9a454bb30cd37d9d8;p=libs%2Fgl.git diff --git a/source/vertexbuilder.h b/source/vertexbuilder.h index 25eb0e76..55f914a3 100644 --- a/source/vertexbuilder.h +++ b/source/vertexbuilder.h @@ -5,6 +5,7 @@ #include "color.h" #include "matrix.h" #include "vector.h" +#include "vertexformat.h" namespace Msp { namespace GL { @@ -20,8 +21,20 @@ 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: - MatrixStack mtx; + Matrix mtx; Vector3 nor; Color col; std::map texc; @@ -32,7 +45,13 @@ public: virtual ~VertexBuilder() { } - MatrixStack &matrix() + 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) @@ -44,8 +63,11 @@ public: 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); } + { vertex_(mtx*v); } protected: virtual void vertex_(const Vector4 &) = 0; @@ -56,10 +78,28 @@ public: void normal(const Vector3 &n) { - Vector4 tn = mtx.top()*Vector4(n.x, n.y, n.z, 0); + 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); }