From d2b167f2d1ca15e42a177b65cdf34f35592452f7 Mon Sep 17 00:00:00 2001 From: Dan Goodliffe Date: Sat, 13 Feb 2021 14:52:03 +0000 Subject: New .obj parser, packer, mesher --- gfx/models/obj.ll | 121 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 121 insertions(+) create mode 100644 gfx/models/obj.ll (limited to 'gfx/models/obj.ll') diff --git a/gfx/models/obj.ll b/gfx/models/obj.ll new file mode 100644 index 0000000..9329a5a --- /dev/null +++ b/gfx/models/obj.ll @@ -0,0 +1,121 @@ +%option batch +%option c++ +%option noyywrap +%option 8bit +%option stack +%option yyclass="ObjParser" +%option prefix="objbase" + +%{ +#pragma GCC diagnostic ignored "-Wsign-compare" +#pragma GCC diagnostic ignored "-Wimplicit-fallthrough" +#if __clang__ +#pragma GCC diagnostic ignored "-Wnull-conversion" +#endif +#include +#include +#include +#include +#include +class objbaseFlexLexer; +%} + +comment #.* +float -?[0-9.]+ +index -?[0-9]+ +linestring [^\r\n]* +truthy (1|on) +falsey (0|off) + +%x FACE +%x MTLLIB +%x OBJECT +%x SMOOTH +%x USEMTL +%x VERTEX +%x NORMAL +%x TEXCOORD + +%% + +{comment} { + // fprintf(stderr, "COMMENT %s\n", YYText()); +} +"f " { + BEGIN(FACE); + faces.emplace_back(); + faces.back().emplace_back(); + axis = 0; +} +"mtllib " { + BEGIN(MTLLIB); +} +"o " { + BEGIN(OBJECT); +} +"s " { + BEGIN(SMOOTH); +} +"usemtl " { + BEGIN(USEMTL); +} +"v " { + BEGIN(VERTEX); + vertices.emplace_back(0, 0, 0, 1); + axis = 0; +} +"vn " { + BEGIN(NORMAL); + normals.emplace_back(0, 0, 0); + axis = 0; +} +"vt " { + BEGIN(TEXCOORD); + texCoords.emplace_back(0, 1, 1); + axis = 0; +} +{linestring} { + // fprintf(stderr, "USEMTL <%s>\n", YYText()); +} +{linestring} { + // fprintf(stderr, "MTLLIB <%s>\n", YYText()); +} +{linestring} { + // fprintf(stderr, "OBJECT <%s>\n", YYText()); +} +{truthy} { + // fprintf(stderr, "Set smooth\n"); +} +{falsey} { + // fprintf(stderr, "Set flat\n"); +} +{float} { + vertices.back()[axis++] = std::stof(YYText()); +} +{float} { + normals.back()[axis++] = std::stof(YYText()); +} +{float} { + texCoords.back()[axis++] = std::stof(YYText()); +} +{index} { + faces.back().back()[axis] = std::stoi(YYText()); +} +\/ { + axis++; +} +[ \t] { + faces.back().emplace_back(); + axis = 0; +} + +<*>[ \t] { +} +<*>[\r\n\f] { + BEGIN(INITIAL); +} + +%% + +// Make iwyu think unistd.h is required +[[maybe_unused]]static auto x=getpid; -- cgit v1.2.3