diff --git a/include/blt/gfx/loader/obj_loader.h b/include/blt/gfx/loader/obj_loader.h index ab63d00..3c4b72f 100644 --- a/include/blt/gfx/loader/obj_loader.h +++ b/include/blt/gfx/loader/obj_loader.h @@ -20,12 +20,16 @@ #define BLT_WITH_GRAPHICS_OBJ_LOADER_H #include "blt/math/vectors.h" +#include "blt/std/hashmap.h" +#include +#include +#include namespace blt::gfx { - typedef blt::vec4 vertex_t; - typedef blt::vec3 uv_t; + typedef blt::vec3 vertex_t; + typedef blt::vec2 uv_t; typedef blt::vec3 normal_t; struct face_t @@ -33,6 +37,68 @@ namespace blt::gfx std::int32_t vertex, uv, normal; }; + struct constructed_vertex_t + { + vertex_t vertex; + uv_t uv; + normal_t normal; + }; + + struct triangle_t + { + std::int32_t v1, v2, v3; + }; + + class obj_loader; + + class obj_object_t + { + friend obj_loader; + private: + // TODO: shared VBO? + std::string object_name; + std::vector vertices_; + std::vector indices_; + + obj_object_t(std::string_view name, std::vector vertices, std::vector indices): + object_name(name), vertices_(std::move(vertices)), indices_(std::move(indices)) + {} + + public: + inline const std::vector& vertices() + { + return vertices_; + }; + + inline const std::vector& indices() + { + return indices_; + }; + }; + + class obj_loader + { + private: + std::vector vertices; + std::vector uvs; + std::vector normals; + struct object_data + { + std::string object_name; + // maps between vertex indices -> face (constructed vertex) + HASHMAP vertex_data; + std::vector indices; + }; + + private: + void parse_face(std::string_view line); + + public: + void parseFile(std::string_view file); + }; + + std::vector quick_load(std::string_view file); + } #endif //BLT_WITH_GRAPHICS_OBJ_LOADER_H diff --git a/src/blt/gfx/loader/obj_loader.cpp b/src/blt/gfx/loader/obj_loader.cpp index a25db51..ee3b36c 100644 --- a/src/blt/gfx/loader/obj_loader.cpp +++ b/src/blt/gfx/loader/obj_loader.cpp @@ -15,4 +15,79 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -#include \ No newline at end of file +#include +#include +#include +#include + +namespace blt::gfx +{ + class char_tokenizer + { + private: + std::string_view string; + std::size_t current_pos = 0; + public: + explicit char_tokenizer(std::string_view view): string(view) + {} + + char peek() + { + return string[current_pos]; + } + + char advance() + { + return string[current_pos++]; + } + + bool has_next(size_t offset = 0) + { + return current_pos + offset < string.size(); + } + }; + + std::vector quick_load(std::string_view file) + { + std::vector objects; + + + return objects; + } + + void obj_loader::parseFile(std::string_view file) + { + auto lines = blt::fs::getLinesFromFile(std::string(file)); + for (const auto& line : lines) + { + char_tokenizer token(line); + // line is empty? + if (!token.has_next()) + continue; + switch (token.advance()) + { + case '#': + continue; + case 'f': + { + + break; + } + case 'v': + { + + break; + } + case 'o': + { + + } + } + } + } + + void obj_loader::parse_face(std::string_view line) + { + + } +} \ No newline at end of file