From 5ba50cfbcca8190a37458d4dee1d8e132142b7c8 Mon Sep 17 00:00:00 2001 From: SHAM-DP Date: Tue, 7 Mar 2023 17:57:48 +0800 Subject: [PATCH] Fix for 3d audio (listener up vec was wrong) --- .../src/AudioSystem/SHAudioSystem.cpp | 30 +++++++++++++++---- SHADE_Engine/src/AudioSystem/SHAudioSystem.h | 1 + 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/SHADE_Engine/src/AudioSystem/SHAudioSystem.cpp b/SHADE_Engine/src/AudioSystem/SHAudioSystem.cpp index a1194d74..eac465ff 100644 --- a/SHADE_Engine/src/AudioSystem/SHAudioSystem.cpp +++ b/SHADE_Engine/src/AudioSystem/SHAudioSystem.cpp @@ -75,12 +75,12 @@ namespace SHADE fmodSystem->setDSPBufferSize(512, 4); fmodSystem->setOutput(FMOD_OUTPUTTYPE_AUTODETECT); } - FMOD_OUTPUTTYPE outputType = FMOD_OUTPUTTYPE_WINSONIC; + FMOD_OUTPUTTYPE outputType{}; fmodSystem->getSoftwareFormat(0, &speakerMode, 0); fmodSystem->getOutput(&outputType); FMOD_STUDIO_INITFLAGS studioInitFlags = FMOD_STUDIO_INIT_NORMAL; - FMOD_INITFLAGS coreInitFlags = FMOD_INIT_NORMAL | FMOD_INIT_3D_RIGHTHANDED | FMOD_INIT_PREFER_DOLBY_DOWNMIX; + FMOD_INITFLAGS coreInitFlags = FMOD_INIT_NORMAL | FMOD_INIT_3D_RIGHTHANDED; #ifdef _DEBUG studioInitFlags |= FMOD_STUDIO_INIT_LIVEUPDATE; coreInitFlags |= FMOD_INIT_PROFILE_ENABLE; @@ -133,6 +133,10 @@ namespace SHADE const ReceiverPtr ON_PAUSE_RECEIVER_PTR = std::dynamic_pointer_cast(ON_PAUSE_RECEIVER); SHEventManager::SubscribeTo(SH_EDITOR_ON_PAUSE_EVENT, ON_PAUSE_RECEIVER_PTR); + const std::shared_ptr ON_SCENE_EXIT_RECEIVER{ std::make_shared>(this, &SHAudioSystem::onSceneExit) }; + const ReceiverPtr ON_SCENE_EXIT_RECEIVER_PTR = std::dynamic_pointer_cast(ON_SCENE_EXIT_RECEIVER); + SHEventManager::SubscribeTo(SH_SCENE_EXIT_POST, ON_SCENE_EXIT_RECEIVER_PTR); + #endif } @@ -174,7 +178,9 @@ namespace SHADE FMOD_3D_ATTRIBUTES attribs{ { 0 } }; SHVec3 pos = camComponent->GetPosition(); SHVec3 forward, up, right; + camSystem->GetCameraAxis(*camComponent, forward, right, up); + up *= -1.0f; attribs.position = { pos.x, pos.y, pos.z }; attribs.forward = { forward.x, forward.y, forward.z }; attribs.up = { up.x, up.y, up.z }; @@ -185,7 +191,7 @@ namespace SHADE auto [begin, end] = audioClipLibrary.GetDenseAccess(); for (auto& it = begin; it != end; ++it) { - if(it->instance && (it->transformRef != MAX_EID)) + if(it->instance && it->instance->isValid() && (it->transformRef != MAX_EID)) { if(SHTransformComponent* transformComponent = SHComponentManager::GetComponent_s(it->transformRef)) { @@ -194,11 +200,13 @@ namespace SHADE SHQuaternion worldOrientation = transformComponent->GetWorldOrientation(); SHVec3 orientatedFoward = (worldOrientation * SHQuaternion::FromEuler(SHVec3::Forward) * SHQuaternion::Conjugate(worldOrientation)).ToEuler(); SHVec3 orientatedUp = (worldOrientation * SHQuaternion::FromEuler(SHVec3::Up) * SHQuaternion::Conjugate(worldOrientation)).ToEuler(); - + orientatedFoward = SHVec3::Normalise(orientatedFoward); + orientatedUp = SHVec3::Normalise(orientatedUp); attribs.position = {pos.x, pos.y, pos.z}; attribs.forward = {orientatedFoward.x, orientatedFoward.y, orientatedFoward.z}; attribs.up = {orientatedUp.x, orientatedUp.y, orientatedUp.z}; - it->instance->set3DAttributes(&attribs); + result = it->instance->set3DAttributes(&attribs); + ErrorCheck(); } } } @@ -825,6 +833,18 @@ namespace SHADE return onStopEvent->handle; } + + SHEventHandle SHAudioSystem::onSceneExit(SHEventPtr onSceneExitEvent) + { + auto [begin, end] = audioClipLibrary.GetDenseAccess(); + for (auto& it = begin; it != end; ++it) + { + it->instance->release(); + } + + return onSceneExitEvent->handle; + } + SHEventHandle SHAudioSystem::onPlay(SHEventPtr onStopEvent) { if(GetPaused()) diff --git a/SHADE_Engine/src/AudioSystem/SHAudioSystem.h b/SHADE_Engine/src/AudioSystem/SHAudioSystem.h index 99ff7953..7e2fac11 100644 --- a/SHADE_Engine/src/AudioSystem/SHAudioSystem.h +++ b/SHADE_Engine/src/AudioSystem/SHAudioSystem.h @@ -123,6 +123,7 @@ namespace SHADE SHEventHandle onPlay(SHEventPtr onStopEvent); SHEventHandle onStop(SHEventPtr onStopEvent); SHEventHandle onPause(SHEventPtr onStopEvent); + SHEventHandle onSceneExit(SHEventPtr onSceneExitEvent); }; }