]> git.tdb.fi Git - libs/gl.git/commitdiff
Add a MatrixStack to VertexBuilder
authorMikko Rasa <tdb@tdb.fi>
Sun, 5 Dec 2010 19:16:12 +0000 (19:16 +0000)
committerMikko Rasa <tdb@tdb.fi>
Sun, 5 Dec 2010 19:16:12 +0000 (19:16 +0000)
Change the vertex handler function to take a Vector4 as parameter

source/primitivebuilder.cpp
source/primitivebuilder.h
source/vertexarraybuilder.cpp
source/vertexarraybuilder.h
source/vertexbuilder.h

index 22106a344a828326c7329c5f482bc2a230e56a92..42e9d39cbb71c5bf1f56eaf53975bdd140fd607d 100644 (file)
@@ -53,7 +53,7 @@ PrimitiveType PrimitiveBuilder::get_type() const
        return type;
 }
 
-void PrimitiveBuilder::vertex_(float x, float y, float z, float w)
+void PrimitiveBuilder::vertex_(const Vector4 &v)
 {
        vab.color(col);
        vab.normal(nor);
@@ -61,7 +61,7 @@ void PrimitiveBuilder::vertex_(float x, float y, float z, float w)
                vab.multitexcoord(i->first, i->second);
        for(std::map<unsigned, Vector4>::iterator i=attr.begin(); i!=attr.end(); ++i)
                vab.attrib(i->first, i->second);
-       vab.vertex(x, y, z, w);
+       vab.vertex(v);
 
        if(in_batch)
                element_(array.size()-1);
index 8cc1e7292b29598f1f93a228f4ee837459f1ff0a..a4e34a67a76be15d9786ee1efd15309dac28266f 100644 (file)
@@ -38,7 +38,7 @@ public:
        void element(unsigned);
        PrimitiveType get_type() const;
 protected:
-       virtual void vertex_(float, float, float, float);
+       virtual void vertex_(const Vector4 &);
        virtual void begin_() =0;
        virtual void end_() =0;
        virtual void element_(unsigned) =0;
index 5c0a019605f08938ce630fe77d2148cbbdd81ce0..c31a60a6d9b1194494cdc9de4bc4371a189b6186 100644 (file)
@@ -20,7 +20,7 @@ VertexArrayBuilder::~VertexArrayBuilder()
        array.update_data();
 }
 
-void VertexArrayBuilder::vertex_(float x, float y, float z, float w)
+void VertexArrayBuilder::vertex_(const Vector4 &v)
 {
        float *ptr = array.append();
        for(const unsigned char *c=array.get_format().begin(); c!=array.get_format().end(); ++c)
@@ -30,10 +30,10 @@ void VertexArrayBuilder::vertex_(float x, float y, float z, float w)
                switch(t)
                {
                case 0:
-                       *ptr++ = x;
-                       *ptr++ = y;
-                       if(sz>=3) *ptr++ = z;
-                       if(sz>=4) *ptr++ = w;
+                       *ptr++ = v.x;
+                       *ptr++ = v.y;
+                       if(sz>=3) *ptr++ = v.z;
+                       if(sz>=4) *ptr++ = v.w;
                        break;
                case 1:
                        *ptr++ = nor.x;
index 3b1f821645e21b9c235680e677e10be017e6f73b..b6af0b9534476f495379218c31a07aae37f5eefe 100644 (file)
@@ -28,7 +28,7 @@ public:
        ~VertexArrayBuilder();
 
 private:
-       virtual void vertex_(float, float, float, float);
+       virtual void vertex_(const Vector4 &);
 };
 
 } // namespace GL
index e7f9b13231797cecd77a553bf7d90eb8f8811645..764fef500ab0108eae10a10b815eac5be6a06598 100644 (file)
@@ -10,6 +10,7 @@ Distributed under the LGPL
 
 #include <map>
 #include "color.h"
+#include "matrix.h"
 #include "vector.h"
 
 namespace Msp {
@@ -26,11 +27,21 @@ data.  Attributes can be read from protected member variables.
 */
 class VertexBuilder
 {
+protected:
+       MatrixStack mtx;
+       Vector3 nor;
+       Color col;
+       std::map<unsigned, Vector4> texc;
+       std::map<unsigned, Vector4> attr;
+
 public:
        VertexBuilder(): nor(0, 0, 1) { }
 
        virtual ~VertexBuilder() { }
 
+       MatrixStack &matrix()
+       { return mtx; }
+
        void vertex(float x, float y)
        { vertex(x, y, 0, 1); }
 
@@ -38,20 +49,23 @@ 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 Vector4 &v)
-       { vertex(v.x, v.y, v.z, v.w); }
+       { vertex_(mtx.top()*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.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); }
@@ -112,12 +126,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