From 458e0005690ea9d579588a0a12368fc2c2c9a93a Mon Sep 17 00:00:00 2001 From: untodesu Date: Tue, 1 Jul 2025 03:08:39 +0500 Subject: I hyper-focued on refactoring again - I put a cool-sounding "we are number one" remix on repeat and straight up grinded the entire repository to a better state until 03:09 AM. I guess I have something wrong in my brain that makes me do this shit --- game/client/entity/sound_emitter.cc | 60 +++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 game/client/entity/sound_emitter.cc (limited to 'game/client/entity/sound_emitter.cc') diff --git a/game/client/entity/sound_emitter.cc b/game/client/entity/sound_emitter.cc new file mode 100644 index 0000000..7ee5cc1 --- /dev/null +++ b/game/client/entity/sound_emitter.cc @@ -0,0 +1,60 @@ +#include "client/pch.hh" + +#include "client/entity/sound_emitter.hh" + +#include "core/config/number.hh" +#include "core/math/constexpr.hh" + +#include "shared/entity/transform.hh" +#include "shared/entity/velocity.hh" +#include "shared/world/dimension.hh" + +#include "shared/coord.hh" + +#include "client/entity/camera.hh" +#include "client/sound/sound.hh" + +#include "client/globals.hh" + +entity::SoundEmitter::SoundEmitter(void) +{ + alGenSources(1, &source); + sound = nullptr; +} + +entity::SoundEmitter::~SoundEmitter(void) +{ + alSourceStop(source); + alDeleteSources(1, &source); +} + +void entity::SoundEmitter::update(void) +{ + if(globals::dimension) { + const auto view = globals::dimension->entities.view(); + + const auto& pivot = entity::camera::position_chunk; + const auto gain = math::clamp(sound::volume_effects.get_value() * 0.01f, 0.0f, 1.0f); + + for(const auto [entity, emitter] : view.each()) { + alSourcef(emitter.source, AL_GAIN, gain); + + if(const auto transform = globals::dimension->entities.try_get(entity)) { + auto position = coord::to_relative(pivot, transform->chunk, transform->local); + alSource3f(emitter.source, AL_POSITION, position.x, position.y, position.z); + } + + if(const auto velocity = globals::dimension->entities.try_get(entity)) { + alSource3f(emitter.source, AL_VELOCITY, velocity->value.x, velocity->value.y, velocity->value.z); + } + + ALint source_state; + alGetSourcei(emitter.source, AL_SOURCE_STATE, &source_state); + + if(source_state == AL_STOPPED) { + alSourceRewind(emitter.source); + emitter.sound = nullptr; + } + } + } +} -- cgit