Refactor vertex builders
authorMikko Rasa <tdb@tdb.fi>
Sun, 21 Mar 2021 09:21:35 +0000 (11:21 +0200)
committerMikko Rasa <tdb@tdb.fi>
Sun, 21 Mar 2021 15:42:46 +0000 (17:42 +0200)
All attributes are now stored in a single vector.

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

index dd869908d9240df76b2f48a2308a0396613a35ad..4b88618a0874f05519a8c22690c5ce982e003563 100644 (file)
@@ -59,12 +59,13 @@ PrimitiveType PrimitiveBuilder::get_type() const
 
 void PrimitiveBuilder::vertex_(const Vector4 &v)
 {
-       vab.color(col);
-       vab.normal(nor);
-       for(std::map<unsigned, Vector4>::iterator i=texc.begin(); i!=texc.end(); ++i)
-               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);
+       const VertexFormat &format = array.get_format();
+       for(const unsigned char *c=format.begin(); c!=format.end(); ++c)
+       {
+               unsigned t = get_component_type(*c);
+               if(t<attr.size())
+                       vab.attrib(t, attr[t]);
+       }
        vab.vertex(v);
 
        if(in_batch)
index 55b2a6a821b80c001a3ff282ee339a3c69a02eaf..ddec548f6d1bc8868a55e93155226a1f5efd91d6 100644 (file)
@@ -8,50 +8,32 @@ VertexArrayBuilder::VertexArrayBuilder(VertexArray &a):
        array(a)
 { }
 
-void VertexArrayBuilder::vertex_(const Vector4 &ver)
+void VertexArrayBuilder::vertex_(const Vector4 &vtx)
 {
        float *ptr = array.append();
-       for(const unsigned char *c=array.get_format().begin(); c!=array.get_format().end(); ++c)
+       const VertexFormat &format = array.get_format();
+       for(const unsigned char *c=format.begin(); c!=format.end(); ++c)
        {
                unsigned sz = get_component_size(*c);
                unsigned t = get_component_type(*c);
-               if(*c==COLOR4_UBYTE)
+               if(t>=attr.size())
+                       ptr += sz;
+               else if(*c==COLOR4_UBYTE)
                {
                        union { unsigned char c[4]; float f; } u;
-                       u.c[0] = static_cast<unsigned char>(col.r*255);
-                       u.c[1] = static_cast<unsigned char>(col.g*255);
-                       u.c[2] = static_cast<unsigned char>(col.b*255);
-                       u.c[3] = static_cast<unsigned char>(col.a*255);
+                       u.c[0] = static_cast<unsigned char>(attr[t].x*255);
+                       u.c[1] = static_cast<unsigned char>(attr[t].y*255);
+                       u.c[2] = static_cast<unsigned char>(attr[t].z*255);
+                       u.c[3] = static_cast<unsigned char>(attr[t].w*255);
                        *ptr++ = u.f;
                }
-               else if(*c==NORMAL3)
-               {
-                       *ptr++ = nor.x;
-                       *ptr++ = nor.y;
-                       *ptr++ = nor.z;
-               }
-               else if(t==get_component_type(COLOR4_FLOAT))
-               {
-                       *ptr++ = col.r;
-                       *ptr++ = col.g;
-                       *ptr++ = col.b;
-                       if(sz>=4) *ptr++ = col.a;
-               }
                else
                {
-                       const Vector4 *v = 0;
-                       if(t==get_component_type(VERTEX3))
-                               v = &ver;
-                       else if(*c>=TEXCOORD1 && *c<=TEXCOORD4+12)
-                               v = &texc[t-get_component_type(TEXCOORD1)];
-                       else if(*c>=ATTRIB1)
-                               v = &attr[t-get_component_type(ATTRIB1)];
-                       else
-                               v = &attr[t];
-                       *ptr++ = v->x;
-                       if(sz>=2) *ptr++ = v->y;
-                       if(sz>=3) *ptr++ = v->z;
-                       if(sz>=4) *ptr++ = v->w;
+                       const Vector4 &v = (t==0 ? vtx : attr[t]);
+                       *ptr++ = v.x;
+                       if(sz>=2) *ptr++ = v.y;
+                       if(sz>=3) *ptr++ = v.z;
+                       if(sz>=4) *ptr++ = v.w;
                }
        }
 }
index 55f914a31a24b7400b7efbe9b786d32940fa882c..28fb6be2b797a8929a44cb31b27e24dc91838112 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_component_type(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_component_type(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_component_type(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_component_type(TEXCOORD4)+i, t); }
 
        void color(unsigned char r, unsigned char g, unsigned char b)
        { color(r, g, b, 255); }
@@ -143,7 +138,7 @@ public:
        { color(Color(r, g, b, a)); }
 
        void color(const Color &c)
-       { col = c; }
+       { attrib(get_component_type(COLOR4_FLOAT), Vector4(c.r, c.g, c.b, c.a)); }
 
        void attrib(unsigned i, float x)
        { attrib(i, x, 0, 0, 1); }
@@ -156,9 +151,6 @@ public:
 
        void attrib(unsigned i, float x, float y, float z, float w)
        { attrib(i, Vector4(x, y, z, w)); }
-
-       void attrib(unsigned i, const Vector4 &a)
-       { attr[i] = a; }
 };
 
 } // namespace GL