From 69506798c22d10b7e7105daefcf2bfd779e3d43d Mon Sep 17 00:00:00 2001 From: Kearwood Gilbert Date: Thu, 21 Feb 2013 11:21:18 -0800 Subject: [PATCH] Implemented KRAudioManager::setListenerOrientation Implemented KRAudioManager::setListenerOrientationFromModelMatrix Implemented KRAudioManager::getListenerForward Implemented KRAudioManager::getListenerUp Implemented KRAudioManager::getListenerPosition Listener position and orientation are no longer automatically coupled to the camera's model matrix, and must be set manually using these new functions. --- KREngine/kraken/KRAudioManager.cpp | 53 ++++++++++++++++++++++-------- KREngine/kraken/KRAudioManager.h | 7 ++-- KREngine/kraken/KRCamera.cpp | 3 -- 3 files changed, 45 insertions(+), 18 deletions(-) diff --git a/KREngine/kraken/KRAudioManager.cpp b/KREngine/kraken/KRAudioManager.cpp index 6a53aba..b3d5dab 100644 --- a/KREngine/kraken/KRAudioManager.cpp +++ b/KREngine/kraken/KRAudioManager.cpp @@ -36,6 +36,7 @@ #include "KRAudioBuffer.h" #include "KRContext.h" #include "KRVector2.h" +#include "KRCollider.h" #include OSStatus alcASASetListenerProc(const ALuint property, ALvoid *data, ALuint dataSize); @@ -1071,18 +1072,36 @@ void KRAudioManager::makeCurrentContext() } } -void KRAudioManager::setViewMatrix(const KRMat4 &viewMatrix) +void KRAudioManager::setListenerOrientationFromModelMatrix(const KRMat4 &modelMatrix) { - KRMat4 invView = viewMatrix; - invView.invert(); - - m_listener_position = KRMat4::Dot(invView, KRVector3(0.0, 0.0, 0.0)); - m_listener_forward = KRMat4::Dot(invView, KRVector3(0.0, 0.0, -1.0)) - m_listener_position; - m_listener_up = KRMat4::Dot(invView, KRVector3(0.0, 1.0, 0.0)) - m_listener_position; - - m_listener_up.normalize(); - m_listener_forward.normalize(); - + setListenerOrientation( + KRMat4::Dot(modelMatrix, KRVector3(0.0, 0.0, 0.0)), + KRVector3::Normalize(KRMat4::Dot(modelMatrix, KRVector3(0.0, 0.0, -1.0)) - m_listener_position), + KRVector3::Normalize(KRMat4::Dot(modelMatrix, KRVector3(0.0, 1.0, 0.0)) - m_listener_position) + ); +} + +KRVector3 &KRAudioManager::getListenerForward() +{ + return m_listener_forward; +} + +KRVector3 &KRAudioManager::getListenerPosition() +{ + return m_listener_position; +} + +KRVector3 &KRAudioManager::getListenerUp() +{ + return m_listener_up; +} + +void KRAudioManager::setListenerOrientation(const KRVector3 &position, const KRVector3 &forward, const KRVector3 &up) +{ + m_listener_position = position; + m_listener_forward = forward; + m_listener_up = up; + makeCurrentContext(); if(m_audio_engine == KRAKEN_AUDIO_OPENAL) { ALDEBUG(alListener3f(AL_POSITION, m_listener_position.x, m_listener_position.y, m_listener_position.z)); @@ -1253,12 +1272,20 @@ void KRAudioManager::renderHRTF() KRAudioSource *source = *itr; KRAudioSample *source_sample = source->getAudioSample(); if(source_sample) { - - KRVector3 source_listener_space = KRMat4::Dot(inv_listener_mat, source->getWorldTranslation()); + KRVector3 source_world_position = source->getWorldTranslation(); + KRVector3 source_listener_space = KRMat4::Dot(inv_listener_mat, source_world_position); KRVector3 source_dir = KRVector3::Normalize(source_listener_space); float distance = source_listener_space.magnitude(); float gain = source->getGain() * m_global_gain / pow(KRMAX(distance / source->getReferenceDistance(), 1.0f), source->getRolloffFactor()); + if(source->getEnableOcclusion() && false) { + KRHitInfo hitinfo; + if(source->getScene().lineCast(m_listener_position, source_world_position, hitinfo, KRAKEN_COLLIDER_AUDIO)) { + gain = 0.0f; + } + } + + float azimuth = atan2(source_dir.x, source_dir.z); float elevation = atan( source_dir.y / sqrt(source_dir.x * source_dir.x + source_dir.z * source_dir.z)); diff --git a/KREngine/kraken/KRAudioManager.h b/KREngine/kraken/KRAudioManager.h index f61da6b..a970b8a 100644 --- a/KREngine/kraken/KRAudioManager.h +++ b/KREngine/kraken/KRAudioManager.h @@ -64,8 +64,11 @@ public: KRAudioSample *load(const std::string &name, const std::string &extension, KRDataBlock *data); KRAudioSample *get(const std::string &name); - void setViewMatrix(const KRMat4 &viewMatrix); - + void setListenerOrientation(const KRVector3 &position, const KRVector3 &forward, const KRVector3 &up); + void setListenerOrientationFromModelMatrix(const KRMat4 &modelMatrix); + KRVector3 &getListenerForward(); + KRVector3 &getListenerPosition(); + KRVector3 &getListenerUp(); void makeCurrentContext(); diff --git a/KREngine/kraken/KRCamera.cpp b/KREngine/kraken/KRCamera.cpp index 54e4f47..9acf9c3 100644 --- a/KREngine/kraken/KRCamera.cpp +++ b/KREngine/kraken/KRCamera.cpp @@ -69,9 +69,6 @@ void KRCamera::renderFrame(float deltaTime, GLint renderBufferWidth, GLint rende KRMat4 viewMatrix = KRMat4::Invert(getModelMatrix()); - getContext().getAudioManager()->setViewMatrix(viewMatrix); // FINDME, TODO - Should we support de-coupling the audio listener location from the camera? - - settings.setViewportSize(KRVector2(backingWidth, backingHeight)); KRMat4 projectionMatrix;