summaryrefslogtreecommitdiff
path: root/gfx/models
diff options
context:
space:
mode:
Diffstat (limited to 'gfx/models')
-rw-r--r--gfx/models/obj.h38
-rw-r--r--gfx/models/obj.impl.cpp77
-rw-r--r--gfx/models/obj.ll116
3 files changed, 0 insertions, 231 deletions
diff --git a/gfx/models/obj.h b/gfx/models/obj.h
deleted file mode 100644
index e28f7de..0000000
--- a/gfx/models/obj.h
+++ /dev/null
@@ -1,38 +0,0 @@
-#pragma once
-
-#ifndef yyFlexLexer
-# define yyFlexLexer objbaseFlexLexer
-# include <FlexLexer.h>
-#endif
-#include <filesystem>
-#include <fstream>
-#include <glm/glm.hpp>
-#include <map>
-#include <memory>
-#include <vector>
-
-class Mesh;
-class Vertex;
-
-class ObjParser : yyFlexLexer {
-public:
- explicit ObjParser(const std::filesystem::path & fileName);
- explicit ObjParser(std::unique_ptr<std::istream> in);
-
- int yylex() override;
-
- std::vector<glm::vec4> vertices;
- std::vector<glm::vec3> texCoords;
- std::vector<glm::vec3> normals;
- using FaceElement = glm::vec<3, unsigned int>;
- using Face = std::vector<FaceElement>;
- using Faces = std::vector<Face>;
- using Object = std::pair<std::string, Faces>;
- std::vector<Object> objects;
- glm::length_t axis {0};
-
- using NamedMeshesData = std::map<std::string, std::pair<std::vector<Vertex>, std::vector<unsigned int>>>;
- [[nodiscard]] NamedMeshesData createMeshData() const;
- using NamedMeshes = std::map<std::string, std::shared_ptr<const Mesh>>;
- [[nodiscard]] NamedMeshes createMeshes() const;
-};
diff --git a/gfx/models/obj.impl.cpp b/gfx/models/obj.impl.cpp
deleted file mode 100644
index 205abc8..0000000
--- a/gfx/models/obj.impl.cpp
+++ /dev/null
@@ -1,77 +0,0 @@
-#include "obj.h"
-#include <algorithm>
-#include <cassert>
-#include <filesystem>
-#include <fstream>
-#include <gfx/models/mesh.h> // IWYU pragma: keep
-#include <gfx/models/vertex.hpp>
-#include <glm/glm.hpp>
-#include <iterator>
-#include <map>
-#include <memory>
-#include <utility>
-#include <vector>
-
-ObjParser::ObjParser(const std::filesystem::path & fileName) : ObjParser {std::make_unique<std::ifstream>(fileName)} { }
-
-ObjParser::ObjParser(std::unique_ptr<std::istream> in) : yyFlexLexer(in.get())
-{
- assert(in);
- ObjParser::yylex();
- assert(in->good());
- constexpr const glm::mat4 obj2ilt {
- -1, 0, 0, 0, // x
- 0, 0, 1, 0, // y
- 0, 1, 0, 0, // z
- 0, 0, 0, 0, // w
- };
- std::for_each(vertices.begin(), vertices.end(), [&obj2ilt](auto & v) {
- v = v * obj2ilt;
- });
- std::for_each(normals.begin(), normals.end(), [&obj2ilt](auto & v) {
- v = glm::vec4 {v, 0} * obj2ilt;
- });
-}
-
-ObjParser::NamedMeshes
-ObjParser::createMeshes() const
-{
- NamedMeshes out;
- const auto data {createMeshData()};
- std::transform(data.begin(), data.end(), std::inserter(out, out.end()), [](auto && obj) {
- return std::make_pair(obj.first, std::make_shared<Mesh>(obj.second.first, obj.second.second));
- });
- return out;
-}
-
-ObjParser::NamedMeshesData
-ObjParser::createMeshData() const
-{
- NamedMeshesData out;
- std::transform(objects.begin(), objects.end(), std::inserter(out, out.end()), [this](auto && obj) {
- std::vector<Vertex> overtices;
- std::vector<ObjParser::FaceElement> vertexOrder;
- std::vector<unsigned int> indices;
- for (const auto & face : obj.second) {
- for (auto idx = 2U; idx < face.size(); idx += 1) {
- auto f = [&](auto idx) {
- const auto & fe {face[idx]};
- if (const auto existing = std::find(vertexOrder.begin(), vertexOrder.end(), fe);
- existing != vertexOrder.end()) {
- indices.push_back(static_cast<unsigned int>(std::distance(vertexOrder.begin(), existing)));
- }
- else {
- indices.push_back(static_cast<unsigned int>(overtices.size()));
- overtices.emplace_back(vertices[fe.x - 1], texCoords[fe.y - 1], -normals[fe.z - 1]);
- vertexOrder.emplace_back(fe);
- }
- };
- f(0U);
- f(idx);
- f(idx - 1);
- }
- }
- return std::make_pair(obj.first, std::make_pair(overtices, indices));
- });
- return out;
-}
diff --git a/gfx/models/obj.ll b/gfx/models/obj.ll
deleted file mode 100644
index 84884fe..0000000
--- a/gfx/models/obj.ll
+++ /dev/null
@@ -1,116 +0,0 @@
-%option batch
-%option c++
-%option noyywrap
-%option 8bit
-%option stack
-%option yyclass="ObjParser"
-%option prefix="objbase"
-
-%{
-#include <gfx/models/obj.h>
-#include <glm/glm.hpp>
-#include <memory>
-#include <string>
-#include <vector>
-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
-
-%%
-
-<INITIAL>{comment} {
- // fprintf(stderr, "COMMENT %s\n", YYText());
-}
-<INITIAL>"f " {
- BEGIN(FACE);
- objects.back().second.emplace_back();
- objects.back().second.back().emplace_back();
- axis = 0;
-}
-<INITIAL>"mtllib " {
- BEGIN(MTLLIB);
-}
-<INITIAL>"o " {
- BEGIN(OBJECT);
-}
-<INITIAL>"s " {
- BEGIN(SMOOTH);
-}
-<INITIAL>"usemtl " {
- BEGIN(USEMTL);
-}
-<INITIAL>"v " {
- BEGIN(VERTEX);
- vertices.emplace_back(0, 0, 0, 1);
- axis = 0;
-}
-<INITIAL>"vn " {
- BEGIN(NORMAL);
- normals.emplace_back(0, 0, 0);
- axis = 0;
-}
-<INITIAL>"vt " {
- BEGIN(TEXCOORD);
- texCoords.emplace_back(0, 1, 1);
- axis = 0;
-}
-<USEMTL>{linestring} {
- // fprintf(stderr, "USEMTL <%s>\n", YYText());
-}
-<MTLLIB>{linestring} {
- // fprintf(stderr, "MTLLIB <%s>\n", YYText());
-}
-<OBJECT>{linestring} {
- objects.emplace_back(YYText(), Faces{});
-}
-<SMOOTH>{truthy} {
- // fprintf(stderr, "Set smooth\n");
-}
-<SMOOTH>{falsey} {
- // fprintf(stderr, "Set flat\n");
-}
-<VERTEX>{float} {
- vertices.back()[axis++] = std::stof(YYText());
-}
-<NORMAL>{float} {
- normals.back()[axis++] = std::stof(YYText());
-}
-<TEXCOORD>{float} {
- texCoords.back()[axis++] = std::stof(YYText());
-}
-<FACE>{index} {
- objects.back().second.back().back()[axis] = std::stoi(YYText());
-}
-<FACE>\/ {
- axis++;
-}
-<FACE>[ \t] {
- objects.back().second.back().emplace_back();
- axis = 0;
-}
-
-<*>[ \t] {
-}
-<*>[\r\n\f] {
- BEGIN(INITIAL);
-}
-
-%%
-
-// Make iwyu think unistd.h is required
-[[maybe_unused]]static auto x=getpid;