{
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();
}
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)
{
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;