From 63d0c8b01a2fbd1fbbd7f0c6a545fd79a6e6756f Mon Sep 17 00:00:00 2001 From: MihailRis Date: Tue, 30 Jul 2024 12:02:32 +0300 Subject: [PATCH] fix: audio positioning when non-base camera active --- src/frontend/LevelFrontend.cpp | 25 +++++++++++++++++++------ src/frontend/LevelFrontend.hpp | 3 ++- src/frontend/screens/LevelScreen.cpp | 6 +++--- 3 files changed, 24 insertions(+), 10 deletions(-) diff --git a/src/frontend/LevelFrontend.cpp b/src/frontend/LevelFrontend.cpp index 13157da7..067b71a3 100644 --- a/src/frontend/LevelFrontend.cpp +++ b/src/frontend/LevelFrontend.cpp @@ -9,11 +9,13 @@ #include "../graphics/render/BlocksPreview.hpp" #include "../logic/LevelController.hpp" #include "../logic/PlayerController.hpp" +#include "../objects/Player.hpp" #include "../voxels/Block.hpp" #include "../world/Level.hpp" -LevelFrontend::LevelFrontend(LevelController* controller, Assets* assets) - : level(controller->getLevel()), +LevelFrontend::LevelFrontend( + Player* currentPlayer, LevelController* controller, Assets* assets +) : level(controller->getLevel()), controller(controller), assets(assets), contentCache(std::make_unique(level->content, assets)) @@ -23,7 +25,7 @@ LevelFrontend::LevelFrontend(LevelController* controller, Assets* assets) "block-previews" ); controller->getBlocksController()->listenBlockInteraction( - [=](Player*, glm::ivec3 pos, const Block* def, BlockInteraction type) { + [=](Player* player, glm::ivec3 pos, const Block* def, BlockInteraction type) { auto material = level->content->findBlockMaterial(def->material); if (material == nullptr) { return; @@ -31,10 +33,21 @@ LevelFrontend::LevelFrontend(LevelController* controller, Assets* assets) if (type == BlockInteraction::step) { auto sound = assets->get(material->stepsSound); + glm::vec3 pos {}; + auto soundsCamera = currentPlayer->currentCamera.get(); + if (soundsCamera == currentPlayer->spCamera.get() || + soundsCamera == currentPlayer->tpCamera.get()) { + soundsCamera = currentPlayer->camera.get(); + } + bool relative = player == currentPlayer && + soundsCamera == currentPlayer->camera.get(); + if (!relative) { + pos = player->getPosition(); + } audio::play( sound, - glm::vec3(), - true, + pos, + relative, 0.333f, 1.0f + (rand() % 6 - 3) * 0.05f, false, @@ -50,7 +63,7 @@ LevelFrontend::LevelFrontend(LevelController* controller, Assets* assets) case BlockInteraction::destruction: sound = assets->get(material->breakSound); break; - case BlockInteraction::step: + default: break; } audio::play( diff --git a/src/frontend/LevelFrontend.hpp b/src/frontend/LevelFrontend.hpp index 6e100670..0a57e7c7 100644 --- a/src/frontend/LevelFrontend.hpp +++ b/src/frontend/LevelFrontend.hpp @@ -5,6 +5,7 @@ class Level; class Assets; +class Player; class ContentGfxCache; class LevelController; @@ -14,7 +15,7 @@ class LevelFrontend { Assets* assets; std::unique_ptr contentCache; public: - LevelFrontend(LevelController* controller, Assets* assets); + LevelFrontend(Player* currentPlayer, LevelController* controller, Assets* assets); ~LevelFrontend(); Level* getLevel() const; diff --git a/src/frontend/screens/LevelScreen.cpp b/src/frontend/screens/LevelScreen.cpp index 28557680..bdf6032f 100644 --- a/src/frontend/screens/LevelScreen.cpp +++ b/src/frontend/screens/LevelScreen.cpp @@ -38,7 +38,7 @@ LevelScreen::LevelScreen(Engine* engine, std::unique_ptr level) menu->reset(); controller = std::make_unique(settings, std::move(level)); - frontend = std::make_unique(controller.get(), assets); + frontend = std::make_unique(controller->getPlayer(), controller.get(), assets); worldRenderer = std::make_unique(engine, frontend.get(), controller->getPlayer()); hud = std::make_unique(engine, frontend.get(), controller->getPlayer()); @@ -132,7 +132,7 @@ void LevelScreen::update(float delta) { } auto player = controller->getPlayer(); - auto camera = player->camera; + auto camera = player->currentCamera; bool paused = hud->isPause(); audio::get_channel("regular")->setPaused(paused); @@ -142,7 +142,7 @@ void LevelScreen::update(float delta) { velocity = hitbox->velocity; } audio::set_listener( - camera->position-camera->dir, + camera->position, velocity, camera->dir, glm::vec3(0, 1, 0)