]> git.tdb.fi Git - libs/gl.git/commitdiff
Support exporting separate arrays in mesh2c (as opposed to interleaved)
authorMikko Rasa <tdb@tdb.fi>
Tue, 15 Mar 2011 06:47:41 +0000 (06:47 +0000)
committerMikko Rasa <tdb@tdb.fi>
Tue, 15 Mar 2011 06:47:41 +0000 (06:47 +0000)
mesh2c.cpp

index c15b829e1b5d361c3462b06b076a2d6256d6f57d..170799c9f196902e42e68c70eb028f4be698dc58 100644 (file)
@@ -24,9 +24,11 @@ int main(int argc, char **argv)
 {
        string prefix;
        bool render_func = false;
+       bool separate_arrays = false;
        GetOpt getopt;
        getopt.add_option('p', "prefix",      prefix,      GetOpt::REQUIRED_ARG);
        getopt.add_option('r', "render-func", render_func, GetOpt::NO_ARG);
+       getopt.add_option('s', "separate-arrays", separate_arrays, GetOpt::NO_ARG);
        getopt(argc, argv);
 
        const vector<string> &args = getopt.get_args();
@@ -37,22 +39,69 @@ int main(int argc, char **argv)
        }
 
        GL::Mesh mesh;
+       mesh.use_buffers(false);
        DataFile::load(mesh, args[0]);
 
        IO::print("/* Exported from %s */\n", args[0]);
 
        const GL::VertexArray &array = mesh.get_vertices();
        const GL::VertexFormat &fmt = array.get_format();
-       IO::print("float %svertex_data[] =\n{", prefix);
        unsigned stride = fmt.stride();
-       for(unsigned i=0; i<array.size(); ++i)
+       if(separate_arrays)
        {
-               const float *ptr = array[i];
-               IO::print("\n\t");
-               for(unsigned j=0; j<stride; ++j)
-                       IO::print("%g, ", ptr[j]);
+               unsigned offset = 0;
+               for(const unsigned char *i=fmt.begin(); i!=fmt.end(); ++i)
+               {
+                       unsigned kind = (*i)>>2;
+                       unsigned size = ((*i)&3)+1;
+                       string name;
+                       switch(kind)
+                       {
+                       case 0:
+                               name = "vertex";
+                               break;
+                       case 1:
+                               name = "normal";
+                               break;
+                       case 2:
+                               name = "color";
+                               break;
+                       case 3:
+                               name = "texcoord";
+                               break;
+                       default:
+                               if(kind<11)
+                                       name = format("texcoord%d", kind-3);
+                               else
+                                       name = format("attrib%d", kind-11);
+                               break;
+                       }
+
+                       IO::print("float %s%s_data[] =\n{", prefix, name);
+                       for(unsigned j=0; j<array.size(); ++j)
+                       {
+                               const float *ptr = array[j]+offset;
+                               IO::print("\n\t");
+                               for(unsigned k=0; k<size; ++k)
+                                       IO::print("%g, ", ptr[k]);
+                       }
+                       IO::print("\n};\n\n");
+
+                       offset += size;
+               }
+       }
+       else
+       {
+               IO::print("float %svertex_data[] =\n{", prefix);
+               for(unsigned i=0; i<array.size(); ++i)
+               {
+                       const float *ptr = array[i];
+                       IO::print("\n\t");
+                       for(unsigned j=0; j<stride; ++j)
+                               IO::print("%g, ", ptr[j]);
+               }
+               IO::print("\n};\n\n");
        }
-       IO::print("\n};\n\n");
 
        const char **type = 0;
        if(array.size()<0x100)
@@ -84,32 +133,55 @@ int main(int argc, char **argv)
        {
                unsigned kind = (*i)>>2;
                unsigned size = ((*i)&3)+1;
+               string source = format("%svertex_data+%d", prefix, offset);
                switch((*i)>>2)
                {
                case 0:
-                       IO::print("\tglVertexPointer(%d, GL_FLOAT, %d*sizeof(float), %svertex_data+%d);\n",
-                               size, stride, prefix, offset);
+                       if(separate_arrays)
+                               source = prefix+"vertex_data";
+                       IO::print("\tglVertexPointer(%d, GL_FLOAT, %d*sizeof(float), %s);\n",
+                               size, stride, source);
                        IO::print("\tglEnableClientState(GL_VERTEX_ARRAY);\n");
                        break;
                case 1:
-                       IO::print("\tglNormalPointer(GL_FLOAT, %d*sizeof(float), %svertex_data+%d);\n",
-                               stride, prefix, offset);
+                       if(separate_arrays)
+                               source = prefix+"normal_data";
+                       IO::print("\tglNormalPointer(GL_FLOAT, %d*sizeof(float), %s);\n",
+                               stride, source);
                        IO::print("\tglEnableClientState(GL_NORMAL_ARRAY);\n");
                        break;
                case 2:
-                       IO::print("\tglTexCoordPointer(%d, GL_FLOAT, %d*sizeof(float), %svertex_data+%d);\n",
-                               size, stride, prefix, offset);
-                       IO::print("\tglEnableClientState(GL_TEXTURE_COORD_ARRAY);\n");
+                       if(separate_arrays)
+                               source = prefix+"color_data";
+                       IO::print("\tglColorPointer(%d, GL_FLOAT, %d*sizeof(float), %s);\n",
+                               size, stride, source);
+                       IO::print("\tglEnableClientState(GL_COLOR_ARRAY);\n");
                        break;
                case 3:
-                       IO::print("\tglColorPointer(%d, GL_FLOAT, %d*sizeof(float), %svertex_data+%d);\n",
-                               size, stride, prefix, offset);
-                       IO::print("\tglEnableClientState(GL_COLOR_ARRAY);\n");
+                       if(separate_arrays)
+                               source = prefix+"texcoord_data";
+                       IO::print("\tglTexCoordPointer(%d, GL_FLOAT, %d*sizeof(float), %s);\n",
+                               size, stride, source);
+                       IO::print("\tglEnableClientState(GL_TEXTURE_COORD_ARRAY);\n");
                        break;
                default:
-                       IO::print("\tglVertexAttribPointer(%d, %d, GL_FLOAT, GL_FALSE, %d*sizeof(float), %svertex_data+%d);\n",
-                               kind-4, size, stride, prefix, offset);
-                       IO::print("\tglEnableVertexAttribArray(%d);\n", kind-4);
+                       if(kind<11)
+                       {
+                               if(separate_arrays)
+                                       source = format("%stexcoord%d_data", prefix, kind-3);
+                               IO::print("\tglClientActiveTexture(GL_TEXTURE%d);\n", kind-3);
+                               IO::print("\tglTexCoordPointer(%d, GL_FLOAT, %d*sizeof(float), %s);\n",
+                                       size, stride, source);
+                               IO::print("\tglEnableClientState(GL_TEXTURE_COORD_ARRAY);\n");
+                       }
+                       else
+                       {
+                               if(separate_arrays)
+                                       source = format("%sattrib%d_data", prefix, kind-11);
+                               IO::print("\tglVertexAttribPointer(%d, %d, GL_FLOAT, GL_FALSE, %d*sizeof(float), %s);\n",
+                                       kind-11, size, stride, source);
+                               IO::print("\tglEnableVertexAttribArray(%d);\n", kind-11);
+                       }
                        break;
                }
                offset += size;