]> git.tdb.fi Git - libs/gl.git/blobdiff - source/builders/vertexbuilder.h
Rearrange vertex attributes
[libs/gl.git] / source / builders / vertexbuilder.h
index 55f914a31a24b7400b7efbe9b786d32940fa882c..b5278045baa0ec4227cea6798436d01b879d468a 100644 (file)
@@ -35,13 +35,10 @@ public:
 
 protected:
        Matrix mtx;
-       Vector3 nor;
-       Color col;
-       std::map<unsigned, Vector4> texc;
-       std::map<unsigned, Vector4> attr;
+       std::vector<Vector4> attr;
 
 public:
-       VertexBuilder(): nor(0, 0, 1) { }
+       VertexBuilder() { normal(0, 0, 1); }
 
        virtual ~VertexBuilder() { }
 
@@ -73,32 +70,30 @@ protected:
        virtual void vertex_(const Vector4 &) = 0;
 
 public:
+       void attrib(unsigned i, const Vector4 &v)
+       {
+               if(i>=attr.size())
+                       attr.resize(i+1);
+               attr[i] = v;
+       }
+
        void normal(float x, float y, float z)
        { normal(Vector3(x, y, z)); }
 
        void normal(const Vector3 &n)
-       {
-               Vector4 tn = mtx*Vector4(n.x, n.y, n.z, 0);
-               nor = Vector3(tn.x, tn.y, tn.z);
-       }
+       { attrib(get_attribute_semantic(NORMAL3), mtx*Vector4(n.x, n.y, n.z, 0)); }
 
        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);
-       }
+       { attrib(get_attribute_semantic(TANGENT3), mtx*Vector4(t.x, t.y, t.z, 0)); }
 
        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);
-       }
+       { attrib(get_attribute_semantic(BINORMAL3), mtx*Vector4(b.x, b.y, b.z, 0)); }
 
        void texcoord(float s)
        { texcoord(s, 0, 0, 1); }
@@ -128,7 +123,7 @@ public:
        { multitexcoord(i, Vector4(s, t, r, q)); }
 
        void multitexcoord(unsigned i, const Vector4 &t)
-       { texc[i] = t; }
+       { attrib(get_attribute_semantic(TEXCOORD4)+i, t); }
 
        void color(unsigned char r, unsigned char g, unsigned char b)
        { color(r, g, b, 255); }
@@ -143,22 +138,22 @@ public:
        { color(Color(r, g, b, a)); }
 
        void color(const Color &c)
-       { col = c; }
+       { attrib(get_attribute_semantic(COLOR4_FLOAT), Vector4(c.r, c.g, c.b, c.a)); }
 
-       void attrib(unsigned i, float x)
-       { attrib(i, x, 0, 0, 1); }
+       void generic(unsigned i, float x)
+       { generic(i, x, 0, 0, 1); }
 
-       void attrib(unsigned i, float x, float y)
-       { attrib(i, x, y, 0, 1); }
+       void generic(unsigned i, float x, float y)
+       { generic(i, x, y, 0, 1); }
 
-       void attrib(unsigned i, float x, float y, float z)
-       { attrib(i, x, y, z, 1); }
+       void generic(unsigned i, float x, float y, float z)
+       { generic(i, x, y, z, 1); }
 
-       void attrib(unsigned i, float x, float y, float z, float w)
-       { attrib(i, Vector4(x, y, z, w)); }
+       void generic(unsigned i, float x, float y, float z, float w)
+       { generic(i, Vector4(x, y, z, w)); }
 
-       void attrib(unsigned i, const Vector4 &a)
-       { attr[i] = a; }
+       void generic(unsigned i, const Vector4 &a)
+       { attrib(get_attribute_semantic(GENERIC4)+i, a); }
 };
 
 } // namespace GL