X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fvertexbuilder.h;h=55f914a31a24b7400b7efbe9b786d32940fa882c;hb=a40fc85277dba5c34402a0e703d038efd30cc57b;hp=998f7a6cea4d001c20d41f3529c72aac4ccc8763;hpb=2b779717e42b514210f7128cf9aee2276650e003;p=libs%2Fgl.git diff --git a/source/vertexbuilder.h b/source/vertexbuilder.h index 998f7a6c..55f914a3 100644 --- a/source/vertexbuilder.h +++ b/source/vertexbuilder.h @@ -21,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; @@ -33,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) @@ -49,7 +67,7 @@ public: { 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; @@ -60,7 +78,7 @@ 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); } @@ -69,7 +87,7 @@ public: void tangent(const Vector3 &t) { - Vector4 tt = mtx.top()*Vector4(t.x, t.y, t.z, 0); + Vector4 tt = mtx*Vector4(t.x, t.y, t.z, 0); attrib(get_component_type(TANGENT3), tt); } @@ -78,7 +96,7 @@ public: void binormal(const Vector3 &b) { - Vector4 tb = mtx.top()*Vector4(b.x, b.y, b.z, 0); + Vector4 tb = mtx*Vector4(b.x, b.y, b.z, 0); attrib(get_component_type(BINORMAL3), tb); }