fix: audio positioning when non-base camera active
This commit is contained in:
parent
c50f564b80
commit
63d0c8b01a
@ -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(
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user