From 1c6689b6b6de01495f65c6e7a8860ddf74bd68d5 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Tue, 5 Mar 2024 02:30:16 +0300 Subject: [PATCH] sounds variants --- src/assets/Assets.cpp | 1 - src/assets/AssetsLoader.cpp | 2 ++ src/assets/assetload_funcs.cpp | 34 +++++++++++++++++++++++++++------- src/audio/audio.h | 2 ++ src/constants.h | 1 + src/engine.cpp | 3 +-- 6 files changed, 33 insertions(+), 10 deletions(-) diff --git a/src/assets/Assets.cpp b/src/assets/Assets.cpp index f05cda5f..6dabd8c6 100644 --- a/src/assets/Assets.cpp +++ b/src/assets/Assets.cpp @@ -34,7 +34,6 @@ void Assets::store(Shader* shader, std::string name){ shaders.emplace(name, shader); } - Font* Assets::getFont(std::string name) const { auto found = fonts.find(name); if (found == fonts.end()) diff --git a/src/assets/AssetsLoader.cpp b/src/assets/AssetsLoader.cpp index cd8f6d3e..a68ea942 100644 --- a/src/assets/AssetsLoader.cpp +++ b/src/assets/AssetsLoader.cpp @@ -18,6 +18,7 @@ AssetsLoader::AssetsLoader(Assets* assets, const ResPaths* paths) addLoader(ASSET_FONT, assetload::font); addLoader(ASSET_ATLAS, assetload::atlas); addLoader(ASSET_LAYOUT, assetload::layout); + addLoader(ASSET_SOUND, assetload::sound); } void AssetsLoader::addLoader(int tag, aloader_func func) { @@ -78,6 +79,7 @@ void AssetsLoader::addDefaults(AssetsLoader& loader, const Content* content) { loader.add(ASSET_TEXTURE, TEXTURES_FOLDER"/misc/moon.png", "misc/moon"); loader.add(ASSET_TEXTURE, TEXTURES_FOLDER"/misc/sun.png", "misc/sun"); loader.add(ASSET_TEXTURE, TEXTURES_FOLDER"/gui/crosshair.png", "gui/crosshair"); + loader.add(ASSET_SOUND, SOUNDS_FOLDER"/steps/grass.ogg", "steps/grass"); addLayouts(0, "core", loader.getPaths()->getMainRoot()/fs::path("layouts"), loader); for (auto& entry : content->getPacks()) { diff --git a/src/assets/assetload_funcs.cpp b/src/assets/assetload_funcs.cpp index e185e948..e8e0ec5a 100644 --- a/src/assets/assetload_funcs.cpp +++ b/src/assets/assetload_funcs.cpp @@ -160,7 +160,6 @@ bool assetload::layout( return false; } } - bool assetload::sound( AssetsLoader& loader, Assets* assets, @@ -170,13 +169,34 @@ bool assetload::sound( std::shared_ptr config ) { auto cfg = dynamic_cast(config.get()); - auto sound = audio::load_sound(paths->find(file), cfg->keepPCM); - if (sound == nullptr) { - std::cerr << "failed to load sound '" << name << "' from '"; - std::cerr << file << "'" << std::endl; - return false; + auto soundFile = paths->find(file); + + bool keepPCM = cfg ? cfg->keepPCM : false; + + size_t lastindex = file.find_last_of("."); + std::string extension = file.substr(lastindex); + std::string extensionless = file.substr(0, lastindex); + try { + std::unique_ptr baseSound = nullptr; + if (fs::exists(soundFile)) { + baseSound.reset(audio::load_sound(soundFile, keepPCM)); + } + auto variantFile = paths->find(extensionless+"_0"+extension); + if (fs::exists(variantFile)) { + baseSound.reset(audio::load_sound(variantFile, keepPCM)); + } + for (uint i = 1; ; i++) { + auto variantFile = paths->find(extensionless+"_"+std::to_string(i)+extension); + if (!fs::exists(variantFile)) { + break; + } + baseSound->variants.emplace_back(audio::load_sound(variantFile, keepPCM)); + } + assets->store(baseSound.release(), name); + } + catch (std::runtime_error& err) { + std::cerr << err.what() << std::endl; } - assets->store(sound, name); return true; } diff --git a/src/audio/audio.h b/src/audio/audio.h index 694ba006..c3fa7f0b 100644 --- a/src/audio/audio.h +++ b/src/audio/audio.h @@ -192,6 +192,8 @@ namespace audio { /// So it's audio data is stored in memory. class Sound { public: + std::vector> variants; + virtual ~Sound() {} /// @brief Get sound duration diff --git a/src/constants.h b/src/constants.h index bf7771f0..123f115e 100644 --- a/src/constants.h +++ b/src/constants.h @@ -40,5 +40,6 @@ inline constexpr uint vox_index(uint x, uint y, uint z, uint w=CHUNK_W, uint d=C #define TEXTURES_FOLDER "textures" #define FONTS_FOLDER "fonts" #define LAYOUTS_FOLDER "layouts" +#define SOUNDS_FOLDER "sounds" #endif // SRC_CONSTANTS_H_ diff --git a/src/engine.cpp b/src/engine.cpp index 4f6755ad..d7dad0c9 100644 --- a/src/engine.cpp +++ b/src/engine.cpp @@ -151,9 +151,8 @@ Engine::~Engine() { std::cout << "-- shutting down" << std::endl; screen.reset(); content.reset(); - - audio::close(); assets.reset(); + audio::close(); scripting::close(); Window::terminate(); std::cout << "-- engine finished" << std::endl;