From 300d28bab6f54edc4f4220548c3a3b8547a141fd Mon Sep 17 00:00:00 2001 From: devZoGok Date: Mon, 2 Jan 2023 08:44:17 +0200 Subject: [PATCH] reading directories recusively when loading assets --- .gitmodules | 3 ++ CMakeLists.txt | 2 ++ abstractAssetReader.cpp | 4 --- abstractAssetReader.h | 12 +++---- assetManager.cpp | 78 ++++++++++++++++++++++++++--------------- assetManager.h | 21 +++++------ external/tinydir | 1 + 7 files changed, 73 insertions(+), 48 deletions(-) delete mode 100644 abstractAssetReader.cpp create mode 160000 external/tinydir diff --git a/.gitmodules b/.gitmodules index d490684..8fdf824 100644 --- a/.gitmodules +++ b/.gitmodules @@ -13,3 +13,6 @@ [submodule "external/tinyxml2"] path = external/tinyxml2 url = https://github.com/leethomason/tinyxml2 +[submodule "external/tinydir"] + path = external/tinydir + url = https://github.com/cxong/tinydir diff --git a/CMakeLists.txt b/CMakeLists.txt index 216a96e..1a47c84 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -27,6 +27,8 @@ endif() set(LIB_SRC ${RENDER} ${MATH} ${UTILS} ${GUI} ${ARMATURE} ${ASSET_MANAGER} ${ASSET_READERS} ${ANIM}) + +include_directories(external/tinydir) include_directories(external/glm) include_directories(external/glm/glm) include_directories(external/glad) diff --git a/abstractAssetReader.cpp b/abstractAssetReader.cpp deleted file mode 100644 index b6f3ffe..0000000 --- a/abstractAssetReader.cpp +++ /dev/null @@ -1,4 +0,0 @@ -#include "abstractAssetReader.h" - -namespace vb01{ -} diff --git a/abstractAssetReader.h b/abstractAssetReader.h index a76245e..e2c5c30 100644 --- a/abstractAssetReader.h +++ b/abstractAssetReader.h @@ -4,12 +4,12 @@ #include "asset.h" namespace vb01{ - class AbstractAssetReader{ - public: - virtual Asset* readAsset(std::string){return nullptr;} - protected: - AbstractAssetReader(){} - }; + class AbstractAssetReader{ + public: + virtual Asset* readAsset(std::string){return nullptr;} + protected: + AbstractAssetReader(){} + }; } #endif diff --git a/assetManager.cpp b/assetManager.cpp index 1de908a..c9b4c72 100644 --- a/assetManager.cpp +++ b/assetManager.cpp @@ -5,49 +5,71 @@ #include "fontReader.h" #include "xmlModelReader.h" +#include + #include using namespace std; namespace vb01{ - AssetManager *assetManager = nullptr; + AssetManager *assetManager = nullptr; - AssetManager* AssetManager::getSingleton(){ - if(!assetManager) - assetManager = new AssetManager(); + AssetManager* AssetManager::getSingleton(){ + if(!assetManager) + assetManager = new AssetManager(); - return assetManager; + return assetManager; + } + + void AssetManager::readDir(string path, vector &contents, bool recursive){ + tinydir_dir dir; + tinydir_open_sorted(&dir, path.c_str()); + + for(int i = 0; i < dir.n_files; i++){ + tinydir_file file; + tinydir_readfile_n(&dir, &file, i); + + if(file.is_dir && recursive) + readDir(path + file.name, contents, recursive); + else if(!file.is_dir) + contents.push_back(file.name); } - void AssetManager::load(string path){ - if(getAsset(path)) - return; + tinydir_close(&dir); + } - string format = path.substr(path.find_last_of(".") + 1, string::npos); - AbstractAssetReader *assetReader = nullptr; - vector imageFormats = vector{"png", "jpeg", "jpg"}; + void AssetManager::load(string path, bool recursive){ + if(getAsset(path)) + return; - if(find(imageFormats.begin(), imageFormats.end(), format) != imageFormats.end()) - assetReader = ImageReader::getSingleton(); + vector files; + readDir(path, files, recursive); - vector fontFormats = vector{"ttf"}; + string format = path.substr(path.find_last_of(".") + 1, string::npos); + AbstractAssetReader *assetReader = nullptr; + vector imageFormats = vector{"png", "jpeg", "jpg"}; - if(find(fontFormats.begin(), fontFormats.end(), format) != fontFormats.end()) - assetReader = FontReader::getSingleton(); + if(find(imageFormats.begin(), imageFormats.end(), format) != imageFormats.end()) + assetReader = ImageReader::getSingleton(); - vector modelFormats = vector{"xml"}; + vector fontFormats = vector{"ttf"}; - if(find(modelFormats.begin(), modelFormats.end(), format) != modelFormats.end()) - assetReader = XmlModelReader::getSingleton(); + if(find(fontFormats.begin(), fontFormats.end(), format) != fontFormats.end()) + assetReader = FontReader::getSingleton(); - assets.push_back(assetReader->readAsset(path)); - } + vector modelFormats = vector{"xml"}; - Asset* AssetManager::getAsset(string path){ - for(Asset *a : assets) - if(a->path == path) - return a; - - return nullptr; - } + if(find(modelFormats.begin(), modelFormats.end(), format) != modelFormats.end()) + assetReader = XmlModelReader::getSingleton(); + + assets.push_back(assetReader->readAsset(path)); + } + + Asset* AssetManager::getAsset(string path){ + for(Asset *a : assets) + if(a->path == path) + return a; + + return nullptr; + } } diff --git a/assetManager.h b/assetManager.h index 0717dce..7a4eb97 100644 --- a/assetManager.h +++ b/assetManager.h @@ -6,18 +6,19 @@ #include namespace vb01{ - class AbstractAssetReader; + class AbstractAssetReader; - class AssetManager{ - public: - static AssetManager* getSingleton(); - void load(std::string); - Asset* getAsset(std::string); - private: - AssetManager(){} + class AssetManager{ + public: + static AssetManager* getSingleton(); + void load(std::string, bool = false); + Asset* getAsset(std::string); + private: + AssetManager(){} + void readDir(std::string, std::vector&, bool); - std::vector assets; - }; + std::vector assets; + }; } #endif diff --git a/external/tinydir b/external/tinydir new file mode 160000 index 0000000..9f866c1 --- /dev/null +++ b/external/tinydir @@ -0,0 +1 @@ +Subproject commit 9f866c1ec09e62aa4df50d7209556ed705a4dd90