--- /dev/null
+/* $Id$
+
+This file is part of libmspgl
+Copyright © 2010 Mikko Rasa, Mikkosoft Productions
+Distributed under the LGPL
+*/
+
+#include <msp/core/getopt.h>
+#include <msp/gl/mesh.h>
+#include <msp/io/print.h>
+#include <msp/strings/formatter.h>
+
+using namespace std;
+using namespace Msp;
+
+const char *types[] =
+{
+ "unsigned char", "GL_UNSIGNED_BYTE",
+ "unsigned short", "GL_UNSIGNED_SHORT",
+ "unsigned", "GL_UNSIGNED_INT"
+};
+
+int main(int argc, char **argv)
+{
+ string prefix;
+ bool render_func = false;
+ GetOpt getopt;
+ getopt.add_option('p', "prefix", prefix, GetOpt::REQUIRED_ARG);
+ getopt.add_option('r', "render-func", render_func, GetOpt::NO_ARG);
+ getopt(argc, argv);
+
+ const vector<string> &args = getopt.get_args();
+ if(args.empty())
+ {
+ IO::print(IO::cerr, "Usage: %s [options] <meshfile>\n", argv[0]);
+ return 1;
+ }
+
+ GL::Mesh mesh;
+ 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)
+ {
+ 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");
+
+ const char **type = 0;
+ if(array.size()<0x100)
+ type = types;
+ else if(array.size()<0x10000)
+ type = types+2;
+ else
+ type = types+4;
+
+ IO::print("%s %sindices[] =\n{", type[0], prefix);
+ for(list<GL::Batch>::const_iterator i=mesh.get_batches().begin(); i!=mesh.get_batches().end(); ++i)
+ {
+ const vector<unsigned> &indices = i->get_indices();
+ for(unsigned j=0; j<indices.size(); ++j)
+ {
+ if(j%16==0)
+ IO::print("\n\t");
+ IO::print("%d, ", indices[j]);
+ }
+ }
+ IO::print("\n};\n\n");
+
+ if(render_func)
+ IO::print("void %srender()\n{\n", prefix);
+ else
+ IO::print("/*\nTo render the object, #include this file and add the following code:\n");
+ unsigned offset = 0;
+ for(const unsigned char *i=fmt.begin(); i!=fmt.end(); ++i)
+ {
+ unsigned kind = (*i)>>2;
+ unsigned size = ((*i)&3)+1;
+ switch((*i)>>2)
+ {
+ case 0:
+ IO::print("\tglVertexPointer(%d, GL_FLOAT, %d*sizeof(float), %svertex_data+%d);\n",
+ size, stride, prefix, offset);
+ 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);
+ 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");
+ 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");
+ 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);
+ break;
+ }
+ offset += size;
+ }
+ offset = 0;
+ for(list<GL::Batch>::const_iterator i=mesh.get_batches().begin(); i!=mesh.get_batches().end(); ++i)
+ {
+ string mode;
+ switch(i->get_type())
+ {
+ case GL_TRIANGLE_STRIP: mode = "GL_TRIANGLE_STRIP"; break;
+ 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();
+ }
+ if(render_func)
+ {
+ IO::print("}\n\n");
+ IO::print("/* To render this object, #include this file and call %srender() */\n", prefix);
+ }
+ else
+ IO::print("*/\n");
+
+ return 0;
+}
/* $Id$
This file is part of libmspgl
-Copyright © 2007 Mikko Rasa, Mikkosoft Productions
+Copyright © 2007, 2009-2010 Mikko Rasa, Mikkosoft Productions
Distributed under the LGPL
*/
bool empty() const { return !data || !data[0]; }
const unsigned char *begin() const { return data ? data+1 : 0; }
const unsigned char *end() const { return data ? data+1+data[0] : 0; }
+ unsigned stride() const;
};
VertexFormat operator,(const VertexFormat &f, VertexComponent c);
inline VertexFormat operator,(VertexComponent c, unsigned i)
{ return (VertexFormat(c), i); }
-uint get_stride(const VertexFormat &);
+inline uint get_stride(const VertexFormat &f)
+{ return f.stride(); }
+
std::istream &operator>>(std::istream &, VertexFormat &);
} // namespace GL