X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=mesh2c.cpp;h=170799c9f196902e42e68c70eb028f4be698dc58;hb=54b22ff744391e49e5a402acb98c0c3bdd0031a7;hp=be72fd4c0eac74c5b9838b7effa187352da8e314;hpb=c6c4fc39952e372eba1f44f2bc504428140f3d0e;p=libs%2Fgl.git diff --git a/mesh2c.cpp b/mesh2c.cpp index be72fd4c..170799c9 100644 --- a/mesh2c.cpp +++ b/mesh2c.cpp @@ -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 &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>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::const_iterator i=mesh.get_batches().begin(); i!=mesh.get_batches().end(); ++i) { - const vector &indices = i->get_indices(); - for(unsigned j=0; jsize(); + for(unsigned j=0; jget_index(j)); } } IO::print("\n};\n\n"); @@ -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; @@ -124,8 +196,8 @@ int main(int argc, char **argv) case GL_TRIANGLES: mode = "GL_TRIANGLES"; break; default: mode = format("%d", i->get_type()); break; } - IO::print("\tglDrawElements(%s, %d, %s, %sindices+%d);\n", mode, i->get_indices().size(), type[1], prefix, offset); - offset += i->get_indices().size(); + IO::print("\tglDrawElements(%s, %d, %s, %sindices+%d);\n", mode, i->size(), type[1], prefix, offset); + offset += i->size(); } if(render_func) {