/* # _____ ____ ___ # | \/ ____| |___| # | | | \ | | #----------------------------------------------------------------------- # Copyright 2022, tyra - https://github.com/h4570/tyra # Licensed under Apache License 2.0 # Sandro Sobczyński */ #pragma once #include "../../loader.hpp" #include "../builder/mesh_builder_data.hpp" #include #include "renderer/models/color.hpp" #include "loaders/3d/obj_loader/tiny_obj_loader.hpp" #include namespace Tyra { struct ObjLoaderAnimationOptions { u16 count = 1; u16 startingIndex = 1; }; struct ObjLoaderOptions { bool flipUVs = false; float scale = 1.0F; ObjLoaderAnimationOptions animation; }; struct MaterialVertexCount { size_t materialId; int count; }; /** Class responsible for loading & parsing obj files */ class ObjLoader : public Loader { public: ObjLoader(); ~ObjLoader(); std::unique_ptr load(const char* fullpath); std::unique_ptr load(const char* fullpath, const ObjLoaderOptions& options); std::unique_ptr load(const std::string& fullpath); std::unique_ptr load(const std::string& fullpath, const ObjLoaderOptions& options); private: void addOutputMaterialsAndFrames( MeshBuilderData* output, const tinyobj::attrib_t& attrib, const std::vector& shapes, const std::vector& materials, const u16& framesCount, std::vector& materialVertexCounts); std::vector scan( const std::vector& shapes, const std::vector& materials); void importFrame(MeshBuilderData* output, const tinyobj::attrib_t& attrib, const std::vector& shapes, const std::vector& materials, const u16& frameIndex, const float& scale, const bool& invertY, const u16& count); }; } // namespace Tyra