]> git.tdb.fi Git - libs/gl.git/blobdiff - source/vertexarray.cpp
Move VertexFormat and VertexArrayBuilder to their own files
[libs/gl.git] / source / vertexarray.cpp
index 3c94b4cfffc27ec20fc1b0e34a96a821e3ee40a3..e7d7386509d6208b2b5130be5bb780f3bc757521 100644 (file)
@@ -14,85 +14,13 @@ using namespace std;
 namespace Msp {
 namespace GL {
 
-uint get_stride(VertexFormat f)
-{
-       uint stride=0;
-       for(uint fmt=f; fmt; fmt>>=4)
-               stride+=(fmt&3)+1;
-       return stride*sizeof(float);
-}
-
-
-VertexArrayBuilder::VertexArrayBuilder(VertexArray &a, vector<float> &d):
-       data(d),
-       array(a),
-       format(array.get_format()),
-       stride(get_stride(format)),
-       cr(1), cg(1), cb(1), ca(1),
-       ts(0), tt(0), tr(0), tq(0),
-       nx(0), ny(0), nz(1)
-{ }
-
-void VertexArrayBuilder::vertex(float x, float y, float z, float w)
-{
-       for(uint fmt=format; fmt; fmt>>=4)
-       {
-               uint size=(fmt&3)+1;
-               switch(fmt&12)
-               {
-               case 0:
-                       data.push_back(x);
-                       data.push_back(y);
-                       if(size>=3) data.push_back(z);
-                       if(size>=4) data.push_back(w);
-                       break;
-               case 4:
-                       data.push_back(nx);
-                       data.push_back(ny);
-                       data.push_back(nz);
-                       break;
-               case 8:
-                       data.push_back(ts);
-                       if(size>=2) data.push_back(tt);
-                       if(size>=3) data.push_back(tr);
-                       if(size>=4) data.push_back(tq);
-                       break;
-               case 12:
-                       if(size==1)
-                       {
-                               union { ubyte c[4]; float f; } u;
-                               u.c[0]=(ubyte)(cr*255);
-                               u.c[1]=(ubyte)(cg*255);
-                               u.c[2]=(ubyte)(cb*255);
-                               u.c[3]=(ubyte)(ca*255);
-                               data.push_back(u.f);
-                       }
-                       else
-                       {
-                               data.push_back(cr);
-                               data.push_back(cg);
-                               data.push_back(cb);
-                               if(size>=4) data.push_back(ca);
-                       }
-                       break;
-               }
-       }
-       //cout<<"Added vertex with "<<data.size()-old_size<<" floats\n";
-}
-
-VertexArrayBuilder::~VertexArrayBuilder()
-{
-       array.update_data();
-}
-
-
 VertexArray::VertexArray(VertexFormat f):
        format(NODATA),
        stride(get_stride(f)),
        vbuf(0),
        own_vbuf(false)
 {
-       // Reverse the format so the first item is in lowest bits
+       // Reverse the format so the first item is in lowest bits.  This makes handling in bind() easier.
        for(uint fmt=f; fmt; fmt>>=4)
                format=(format, static_cast<VertexFormat>(fmt&15));
 }
@@ -125,6 +53,20 @@ void VertexArray::clear()
        data.clear();
 }
 
+void VertexArray::reset(VertexFormat f)
+{
+       clear();
+       format=NODATA;
+       for(uint fmt=f; fmt; fmt>>=4)
+               format=(format, static_cast<VertexFormat>(fmt&15));
+       stride=get_stride(format);
+}
+
+RefPtr<VertexArrayBuilder> VertexArray::modify()
+{
+       return new VertexArrayBuilder(*this, data);
+}
+
 void VertexArray::apply() const
 {
        if(vbuf) vbuf->bind();
@@ -191,5 +133,20 @@ void VertexArray::set_array(unsigned array, unsigned bit, unsigned mask) const
 unsigned VertexArray::enabled_arrays=0;
 
 
+VertexArray::Loader::Loader(VertexArray &a):
+       VertexArrayBuilder(a, a.data)
+{
+       add("vertex2",   static_cast<void (Loader::*)(float, float)>(&Loader::vertex));
+       add("vertex3",   static_cast<void (Loader::*)(float, float, float)>(&Loader::vertex));
+       add("vertex4",   static_cast<void (Loader::*)(float, float, float, float)>(&Loader::vertex));
+       add("normal3",   static_cast<void (Loader::*)(float, float, float)>(&Loader::normal));
+       add("texcoord1", static_cast<void (Loader::*)(float)>(&Loader::texcoord));
+       add("texcoord2", static_cast<void (Loader::*)(float, float)>(&Loader::texcoord));
+       add("texcoord3", static_cast<void (Loader::*)(float, float, float)>(&Loader::texcoord));
+       add("texcoord4", static_cast<void (Loader::*)(float, float, float, float)>(&Loader::texcoord));
+       add("color3",    static_cast<void (Loader::*)(float, float, float)>(&Loader::color));
+       add("color4",    static_cast<void (Loader::*)(float, float, float, float)>(&Loader::color));
+}
+
 } // namespace GL
 } // namespace Msp