From 6942fa97da5042e0d3911b8d400c5032a4dbafe4 Mon Sep 17 00:00:00 2001 From: Chris Robinson Date: Sun, 30 Sep 2012 17:23:05 -0700 Subject: [PATCH] Specify a proper up vector for the listener --- apps/openmw/mwbase/soundmanager.hpp | 2 +- apps/openmw/mwrender/player.cpp | 4 +++- apps/openmw/mwsound/soundmanagerimp.cpp | 5 +++-- apps/openmw/mwsound/soundmanagerimp.hpp | 3 ++- 4 files changed, 9 insertions(+), 5 deletions(-) diff --git a/apps/openmw/mwbase/soundmanager.hpp b/apps/openmw/mwbase/soundmanager.hpp index 93d1e27e1c..745832583c 100644 --- a/apps/openmw/mwbase/soundmanager.hpp +++ b/apps/openmw/mwbase/soundmanager.hpp @@ -114,7 +114,7 @@ namespace MWBase virtual void update(float duration) = 0; - virtual void setListenerPosDir(const Ogre::Vector3 &pos, const Ogre::Vector3 &dir) = 0; + virtual void setListenerPosDir(const Ogre::Vector3 &pos, const Ogre::Vector3 &dir, const Ogre::Vector3 &up) = 0; }; inline int operator|(SoundManager::PlayMode a, SoundManager::PlayMode b) diff --git a/apps/openmw/mwrender/player.cpp b/apps/openmw/mwrender/player.cpp index 8c8bbb86f7..5e74938b01 100644 --- a/apps/openmw/mwrender/player.cpp +++ b/apps/openmw/mwrender/player.cpp @@ -111,12 +111,14 @@ namespace MWRender { Ogre::Vector3 pos = mCamera->getRealPosition(); Ogre::Vector3 dir = mCamera->getRealDirection(); + Ogre::Vector3 up = mCamera->getRealUp(); Ogre::Real xch; xch = pos.y, pos.y = -pos.z, pos.z = xch; xch = dir.y, dir.y = -dir.z, dir.z = xch; + xch = up.y, up.y = -up.z, up.z = xch; - MWBase::Environment::get().getSoundManager()->setListenerPosDir(pos, dir); + MWBase::Environment::get().getSoundManager()->setListenerPosDir(pos, dir, up); } void Player::update(float duration) diff --git a/apps/openmw/mwsound/soundmanagerimp.cpp b/apps/openmw/mwsound/soundmanagerimp.cpp index dbe45c5241..f8f4781f34 100644 --- a/apps/openmw/mwsound/soundmanagerimp.cpp +++ b/apps/openmw/mwsound/soundmanagerimp.cpp @@ -486,7 +486,7 @@ namespace MWSound mOutput->updateListener( mListenerPos, mListenerDir, - Ogre::Vector3::UNIT_Z, + mListenerUp, env ); @@ -546,10 +546,11 @@ namespace MWSound } } - void SoundManager::setListenerPosDir(const Ogre::Vector3 &pos, const Ogre::Vector3 &dir) + void SoundManager::setListenerPosDir(const Ogre::Vector3 &pos, const Ogre::Vector3 &dir, const Ogre::Vector3 &up) { mListenerPos = pos; mListenerDir = dir; + mListenerUp = up; } // Default readAll implementation, for decoders that can't do anything diff --git a/apps/openmw/mwsound/soundmanagerimp.hpp b/apps/openmw/mwsound/soundmanagerimp.hpp index 6931e53256..f91e291efc 100644 --- a/apps/openmw/mwsound/soundmanagerimp.hpp +++ b/apps/openmw/mwsound/soundmanagerimp.hpp @@ -52,6 +52,7 @@ namespace MWSound Ogre::Vector3 mListenerPos; Ogre::Vector3 mListenerDir; + Ogre::Vector3 mListenerUp; std::string lookup(const std::string &soundId, float &volume, float &min, float &max); @@ -128,7 +129,7 @@ namespace MWSound virtual void update(float duration); - virtual void setListenerPosDir(const Ogre::Vector3 &pos, const Ogre::Vector3 &dir); + virtual void setListenerPosDir(const Ogre::Vector3 &pos, const Ogre::Vector3 &dir, const Ogre::Vector3 &up); }; }