diff --git a/src/assets/AssetsLoader.cpp b/src/assets/AssetsLoader.cpp index 142934d1..d3806157 100644 --- a/src/assets/AssetsLoader.cpp +++ b/src/assets/AssetsLoader.cpp @@ -43,7 +43,11 @@ void AssetsLoader::add( const std::string& alias, std::shared_ptr settings ) { + if (enqueued.find({tag, alias}) != enqueued.end()){ + return; + } entries.push(aloader_entry {tag, filename, alias, std::move(settings)}); + enqueued.insert({tag, alias}); } bool AssetsLoader::hasNext() const { @@ -148,6 +152,16 @@ void AssetsLoader::processPreload( std::make_shared(map.at("keep-pcm").get(keepPCM))); break; } + case AssetType::ATLAS: { + std::string typeName = "atlas"; + map.at("type").get(typeName); + auto type = AtlasType::ATLAS; + if (typeName == "separate") { + type = AtlasType::SEPARATE; + } + add(tag, path, name, std::make_shared(type)); + break; + } default: add(tag, path, name); break; diff --git a/src/assets/AssetsLoader.hpp b/src/assets/AssetsLoader.hpp index 2321f9a3..cd6db950 100644 --- a/src/assets/AssetsLoader.hpp +++ b/src/assets/AssetsLoader.hpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include #include @@ -37,6 +38,17 @@ struct SoundCfg : AssetCfg { } }; +enum class AtlasType { + ATLAS, SEPARATE +}; + +struct AtlasCfg : AssetCfg { + AtlasType type; + + AtlasCfg(AtlasType type) : type(type) { + } +}; + using aloader_func = std::function< assetload:: postfunc(AssetsLoader*, const ResPaths*, const std::string&, const std::string&, std::shared_ptr)>; @@ -52,6 +64,7 @@ class AssetsLoader { Assets* assets; std::map loaders; std::queue entries; + std::set> enqueued; const ResPaths* paths; void tryAddSound(const std::string& name); diff --git a/src/assets/assetload_funcs.cpp b/src/assets/assetload_funcs.cpp index ce8b65c9..813d1c87 100644 --- a/src/assets/assetload_funcs.cpp +++ b/src/assets/assetload_funcs.cpp @@ -103,12 +103,25 @@ static bool append_atlas(AtlasBuilder& atlas, const fs::path& file) { } assetload::postfunc assetload::atlas( - AssetsLoader*, + AssetsLoader* loader, const ResPaths* paths, const std::string& directory, const std::string& name, - const std::shared_ptr& + const std::shared_ptr& config ) { + auto atlasConfig = std::dynamic_pointer_cast(config); + if (atlasConfig && atlasConfig->type == AtlasType::SEPARATE) { + for (const auto& file : paths->listdir(directory)) { + if (!imageio::is_read_supported(file.extension().u8string())) + continue; + loader->add( + AssetType::TEXTURE, + directory + "/" + file.stem().u8string(), + name + "/" + file.stem().u8string() + ); + } + return [](auto){}; + } AtlasBuilder builder; for (const auto& file : paths->listdir(directory)) { if (!imageio::is_read_supported(file.extension().u8string())) continue;