fix: audio positioning when non-base camera active

This commit is contained in:
MihailRis 2024-07-30 12:02:32 +03:00
parent c50f564b80
commit 63d0c8b01a
3 changed files with 24 additions and 10 deletions

View File

@ -9,11 +9,13 @@
#include "../graphics/render/BlocksPreview.hpp" #include "../graphics/render/BlocksPreview.hpp"
#include "../logic/LevelController.hpp" #include "../logic/LevelController.hpp"
#include "../logic/PlayerController.hpp" #include "../logic/PlayerController.hpp"
#include "../objects/Player.hpp"
#include "../voxels/Block.hpp" #include "../voxels/Block.hpp"
#include "../world/Level.hpp" #include "../world/Level.hpp"
LevelFrontend::LevelFrontend(LevelController* controller, Assets* assets) LevelFrontend::LevelFrontend(
: level(controller->getLevel()), Player* currentPlayer, LevelController* controller, Assets* assets
) : level(controller->getLevel()),
controller(controller), controller(controller),
assets(assets), assets(assets),
contentCache(std::make_unique<ContentGfxCache>(level->content, assets)) contentCache(std::make_unique<ContentGfxCache>(level->content, assets))
@ -23,7 +25,7 @@ LevelFrontend::LevelFrontend(LevelController* controller, Assets* assets)
"block-previews" "block-previews"
); );
controller->getBlocksController()->listenBlockInteraction( 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); auto material = level->content->findBlockMaterial(def->material);
if (material == nullptr) { if (material == nullptr) {
return; return;
@ -31,10 +33,21 @@ LevelFrontend::LevelFrontend(LevelController* controller, Assets* assets)
if (type == BlockInteraction::step) { if (type == BlockInteraction::step) {
auto sound = assets->get<audio::Sound>(material->stepsSound); auto sound = assets->get<audio::Sound>(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( audio::play(
sound, sound,
glm::vec3(), pos,
true, relative,
0.333f, 0.333f,
1.0f + (rand() % 6 - 3) * 0.05f, 1.0f + (rand() % 6 - 3) * 0.05f,
false, false,
@ -50,7 +63,7 @@ LevelFrontend::LevelFrontend(LevelController* controller, Assets* assets)
case BlockInteraction::destruction: case BlockInteraction::destruction:
sound = assets->get<audio::Sound>(material->breakSound); sound = assets->get<audio::Sound>(material->breakSound);
break; break;
case BlockInteraction::step: default:
break; break;
} }
audio::play( audio::play(

View File

@ -5,6 +5,7 @@
class Level; class Level;
class Assets; class Assets;
class Player;
class ContentGfxCache; class ContentGfxCache;
class LevelController; class LevelController;
@ -14,7 +15,7 @@ class LevelFrontend {
Assets* assets; Assets* assets;
std::unique_ptr<ContentGfxCache> contentCache; std::unique_ptr<ContentGfxCache> contentCache;
public: public:
LevelFrontend(LevelController* controller, Assets* assets); LevelFrontend(Player* currentPlayer, LevelController* controller, Assets* assets);
~LevelFrontend(); ~LevelFrontend();
Level* getLevel() const; Level* getLevel() const;

View File

@ -38,7 +38,7 @@ LevelScreen::LevelScreen(Engine* engine, std::unique_ptr<Level> level)
menu->reset(); menu->reset();
controller = std::make_unique<LevelController>(settings, std::move(level)); controller = std::make_unique<LevelController>(settings, std::move(level));
frontend = std::make_unique<LevelFrontend>(controller.get(), assets); frontend = std::make_unique<LevelFrontend>(controller->getPlayer(), controller.get(), assets);
worldRenderer = std::make_unique<WorldRenderer>(engine, frontend.get(), controller->getPlayer()); worldRenderer = std::make_unique<WorldRenderer>(engine, frontend.get(), controller->getPlayer());
hud = std::make_unique<Hud>(engine, frontend.get(), controller->getPlayer()); hud = std::make_unique<Hud>(engine, frontend.get(), controller->getPlayer());
@ -132,7 +132,7 @@ void LevelScreen::update(float delta) {
} }
auto player = controller->getPlayer(); auto player = controller->getPlayer();
auto camera = player->camera; auto camera = player->currentCamera;
bool paused = hud->isPause(); bool paused = hud->isPause();
audio::get_channel("regular")->setPaused(paused); audio::get_channel("regular")->setPaused(paused);
@ -142,7 +142,7 @@ void LevelScreen::update(float delta) {
velocity = hitbox->velocity; velocity = hitbox->velocity;
} }
audio::set_listener( audio::set_listener(
camera->position-camera->dir, camera->position,
velocity, velocity,
camera->dir, camera->dir,
glm::vec3(0, 1, 0) glm::vec3(0, 1, 0)