]> git.tdb.fi Git - libs/gl.git/blobdiff - source/vertexbuilder.h
Remove support for legacy OpenGL features
[libs/gl.git] / source / vertexbuilder.h
index e7f9b13231797cecd77a553bf7d90eb8f8811645..55f914a31a24b7400b7efbe9b786d32940fa882c 100644 (file)
@@ -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 <map>
 #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<unsigned, Vector4> texc;
+       std::map<unsigned, Vector4> 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<unsigned, Vector4> texc;
-       std::map<unsigned, Vector4> attr;
 };
 
 } // namespace GL