From: Mikko Rasa Date: Thu, 4 Feb 2010 07:43:30 +0000 (+0000) Subject: Add a tool to convert a mesh into C code X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=commitdiff_plain;h=c6c4fc39952e372eba1f44f2bc504428140f3d0e Add a tool to convert a mesh into C code Add Batch::get_type() accessor Make get_stride a member of VertexFormat Add a #define GLX_GLXEXT_PROTOTYPES to allow compilation against Mesa --- diff --git a/Build b/Build index 7e98f4c7..71596923 100644 --- a/Build +++ b/Build @@ -21,6 +21,15 @@ package "mspgl" install true; }; + program "mesh2c" + { + source "mesh2c.cpp"; + build_info + { + library "mspgl"; + }; + }; + tarball "@src" { source "License.txt"; diff --git a/mesh2c.cpp b/mesh2c.cpp new file mode 100644 index 00000000..be72fd4c --- /dev/null +++ b/mesh2c.cpp @@ -0,0 +1,139 @@ +/* $Id$ + +This file is part of libmspgl +Copyright © 2010 Mikko Rasa, Mikkosoft Productions +Distributed under the LGPL +*/ + +#include +#include +#include +#include + +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 &args = getopt.get_args(); + if(args.empty()) + { + IO::print(IO::cerr, "Usage: %s [options] \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::const_iterator i=mesh.get_batches().begin(); i!=mesh.get_batches().end(); ++i) + { + const vector &indices = i->get_indices(); + for(unsigned j=0; j>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::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; +} diff --git a/source/batch.h b/source/batch.h index 9b2072de..6950af89 100644 --- a/source/batch.h +++ b/source/batch.h @@ -1,7 +1,7 @@ /* $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 */ @@ -39,6 +39,7 @@ public: Batch(PrimitiveType t); Batch &append(uint); void append(const std::vector &); + PrimitiveType get_type() const { return type; } unsigned size() const { return indices.size(); } const std::vector &get_indices() const { return indices; } void draw() const; diff --git a/source/extension.cpp b/source/extension.cpp index 6383cd3c..cd8c6297 100644 --- a/source/extension.cpp +++ b/source/extension.cpp @@ -1,12 +1,13 @@ /* $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 */ #include #ifndef WIN32 +#define GLX_GLXEXT_PROTOTYPES #include #endif #include diff --git a/source/vertexformat.cpp b/source/vertexformat.cpp index b9bd7b94..457cffad 100644 --- a/source/vertexformat.cpp +++ b/source/vertexformat.cpp @@ -1,7 +1,7 @@ /* $Id$ This file is part of libmspgl -Copyright © 2007-2009 Mikko Rasa, Mikkosoft Productions +Copyright © 2007-2010 Mikko Rasa, Mikkosoft Productions Distributed under the LGPL */ @@ -55,6 +55,14 @@ VertexFormat::~VertexFormat() delete[] data; } +unsigned VertexFormat::stride() const +{ + uint s=0; + for(const unsigned char *i=begin(); i!=end(); ++i) + s+=(*i&3)+1; + return s; +} + VertexFormat operator,(const VertexFormat &f, VertexComponent c) { VertexFormat r=f; @@ -96,14 +104,6 @@ VertexFormat operator,(const VertexFormat &f, unsigned i) return r; } -uint get_stride(const VertexFormat &f) -{ - uint stride=0; - for(const unsigned char *i=f.begin(); i!=f.end(); ++i) - stride+=(*i&3)+1; - return stride; -} - istream &operator>>(istream &in, VertexFormat &f) { string str; diff --git a/source/vertexformat.h b/source/vertexformat.h index 2432d7b6..75e33473 100644 --- a/source/vertexformat.h +++ b/source/vertexformat.h @@ -1,7 +1,7 @@ /* $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 */ @@ -46,6 +46,7 @@ struct VertexFormat 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); @@ -56,7 +57,9 @@ VertexFormat operator,(const VertexFormat &f, unsigned i); 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