From 7374013eeb9e2bf174e2a84da07b544ff253df55 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Mon, 1 Apr 2024 18:36:31 +0300 Subject: [PATCH] NumberSetting.observe --- src/data/setting.h | 13 +++++++++++++ src/delegates.h | 1 + src/engine.cpp | 31 +++++++++++++++++-------------- 3 files changed, 31 insertions(+), 14 deletions(-) diff --git a/src/data/setting.h b/src/data/setting.h index e51c1e18..625868ce 100644 --- a/src/data/setting.h +++ b/src/data/setting.h @@ -3,8 +3,10 @@ #include #include +#include #include "../typedefs.h" +#include "../delegates.h" enum class setting_format { simple, percent @@ -34,6 +36,7 @@ protected: number_t value; number_t min; number_t max; + std::vector> consumers; public: NumberSetting( number_t value, @@ -56,7 +59,13 @@ public: } void set(number_t value) { + if (value == this->value) { + return; + } this->value = value; + for (auto& callback : consumers) { + callback(value); + } } number_t getMin() const { @@ -71,6 +80,10 @@ public: return (value - min) / (max - min); } + void observe(consumer callback) { + consumers.push_back(callback); + } + virtual void resetToDefault() override { value = initial; } diff --git a/src/delegates.h b/src/delegates.h index 74ecce28..0533ba98 100644 --- a/src/delegates.h +++ b/src/delegates.h @@ -7,6 +7,7 @@ using runnable = std::function; template using supplier = std::function; +template using consumer = std::function; // data sources using wstringsupplier = std::function; diff --git a/src/engine.cpp b/src/engine.cpp index 7bc8e7e1..42c7deeb 100644 --- a/src/engine.cpp +++ b/src/engine.cpp @@ -63,6 +63,22 @@ Engine::Engine(EngineSettings& settings, EnginePaths* paths) audio::create_channel("ambient"); audio::create_channel("ui"); + settings.audio.volumeMaster.observe([=](auto value) { + audio::get_channel("master")->setVolume(value*value); + }); + settings.audio.volumeRegular.observe([=](auto value) { + audio::get_channel("regular")->setVolume(value*value); + }); + settings.audio.volumeUI.observe([=](auto value) { + audio::get_channel("ui")->setVolume(value*value); + }); + settings.audio.volumeAmbient.observe([=](auto value) { + audio::get_channel("ambient")->setVolume(value*value); + }); + settings.audio.volumeMusic.observe([=](auto value) { + audio::get_channel("music")->setVolume(value*value); + }); + auto resdir = paths->getResources(); std::cout << "-- loading assets" << std::endl; std::vector roots {resdir}; @@ -128,19 +144,6 @@ void Engine::updateHotkeys() { } } -inline constexpr float sqr(float x) { - return x*x; -} - -static void updateAudio(double delta, const AudioSettings& settings) { - audio::get_channel("master")->setVolume(sqr(settings.volumeMaster.get())); - audio::get_channel("regular")->setVolume(sqr(settings.volumeRegular.get())); - audio::get_channel("ui")->setVolume(sqr(settings.volumeUI.get())); - audio::get_channel("ambient")->setVolume(sqr(settings.volumeAmbient.get())); - audio::get_channel("music")->setVolume(sqr(settings.volumeMusic.get())); - audio::update(delta); -} - void Engine::mainloop() { setScreen(std::make_shared(this)); @@ -152,7 +155,7 @@ void Engine::mainloop() { assert(screen != nullptr); updateTimers(); updateHotkeys(); - updateAudio(delta, settings.audio); + audio::update(delta); gui->act(delta); screen->update(delta);