From 7a3bc69df7d33a0b0629d7637b182efe0d6fb4f1 Mon Sep 17 00:00:00 2001
From: scrawl <scrawl@baseoftrash.de>
Date: Tue, 12 May 2015 19:02:56 +0200
Subject: [PATCH] Readded sound listener

---
 apps/openmw/mwbase/soundmanager.hpp           |  9 +--
 apps/openmw/mwphysics/physicssystem.cpp       |  8 +++
 apps/openmw/mwphysics/physicssystem.hpp       |  8 ++-
 .../mwscript/transformationextensions.cpp     | 37 +++++-----
 apps/openmw/mwsound/loudness.cpp              |  4 +-
 apps/openmw/mwsound/openal_output.cpp         | 22 +++---
 apps/openmw/mwsound/openal_output.hpp         |  4 +-
 apps/openmw/mwsound/sound.hpp                 |  6 +-
 apps/openmw/mwsound/sound_output.hpp          |  8 +--
 apps/openmw/mwsound/soundmanagerimp.cpp       | 16 ++---
 apps/openmw/mwsound/soundmanagerimp.hpp       | 10 +--
 apps/openmw/mwworld/containerstore.cpp        |  2 +-
 apps/openmw/mwworld/projectilemanager.hpp     |  8 +--
 apps/openmw/mwworld/worldimp.cpp              | 72 +++++++++----------
 14 files changed, 108 insertions(+), 106 deletions(-)

diff --git a/apps/openmw/mwbase/soundmanager.hpp b/apps/openmw/mwbase/soundmanager.hpp
index e71558de0b..4fccec40bb 100644
--- a/apps/openmw/mwbase/soundmanager.hpp
+++ b/apps/openmw/mwbase/soundmanager.hpp
@@ -7,11 +7,6 @@
 
 #include "../mwworld/ptr.hpp"
 
-namespace Ogre
-{
-    class Vector3;
-}
-
 namespace MWWorld
 {
     class CellStore;
@@ -125,7 +120,7 @@ namespace MWBase
             ///< Play a 3D sound attached to an MWWorld::Ptr. Will be updated automatically with the Ptr's position, unless Play_NoTrack is specified.
             ///< @param offset Value from [0,1] meaning from which fraction the sound the playback starts.
 
-            virtual MWBase::SoundPtr playManualSound3D(const Ogre::Vector3& initialPos, const std::string& soundId,
+            virtual MWBase::SoundPtr playManualSound3D(const osg::Vec3f& initialPos, const std::string& soundId,
                                                              float volume, float pitch, PlayType type, PlayMode mode, float offset=0) = 0;
             ///< Play a 3D sound at \a initialPos. If the sound should be moving, it must be updated manually using Sound::setPosition.
 
@@ -162,7 +157,7 @@ namespace MWBase
 
             virtual void update(float duration) = 0;
 
-            virtual void setListenerPosDir(const Ogre::Vector3 &pos, const Ogre::Vector3 &dir, const Ogre::Vector3 &up) = 0;
+            virtual void setListenerPosDir(const osg::Vec3f &pos, const osg::Vec3f &dir, const osg::Vec3f &up) = 0;
 
             virtual void updatePtr (const MWWorld::Ptr& old, const MWWorld::Ptr& updated) = 0;
 
diff --git a/apps/openmw/mwphysics/physicssystem.cpp b/apps/openmw/mwphysics/physicssystem.cpp
index 81fc1e2251..04b53a8e38 100644
--- a/apps/openmw/mwphysics/physicssystem.cpp
+++ b/apps/openmw/mwphysics/physicssystem.cpp
@@ -802,6 +802,14 @@ namespace MWPhysics
         }
     }
 
+    Actor *PhysicsSystem::getActor(const MWWorld::Ptr &ptr)
+    {
+        ActorMap::iterator found = mActors.find(ptr);
+        if (found != mActors.end())
+            return found->second;
+        return NULL;
+    }
+
     void PhysicsSystem::updateScale(const MWWorld::Ptr &ptr)
     {
         ObjectMap::iterator found = mObjects.find(ptr);
diff --git a/apps/openmw/mwphysics/physicssystem.hpp b/apps/openmw/mwphysics/physicssystem.hpp
index 54cf48ad17..91e166bef4 100644
--- a/apps/openmw/mwphysics/physicssystem.hpp
+++ b/apps/openmw/mwphysics/physicssystem.hpp
@@ -53,6 +53,11 @@ namespace MWPhysics
             void disableWater();
 
             void addObject (const MWWorld::Ptr& ptr, const std::string& mesh);
+            void addActor (const MWWorld::Ptr& ptr, const std::string& mesh);
+
+            void updatePtr (const MWWorld::Ptr& old, const MWWorld::Ptr& updated);
+
+            Actor* getActor(const MWWorld::Ptr& ptr);
 
             // Object or Actor
             void remove (const MWWorld::Ptr& ptr);
@@ -61,9 +66,6 @@ namespace MWPhysics
             void updateRotation (const MWWorld::Ptr& ptr);
             void updatePosition (const MWWorld::Ptr& ptr);
 
-            void updatePtr (const MWWorld::Ptr& old, const MWWorld::Ptr& updated);
-
-            void addActor (const MWWorld::Ptr& ptr, const std::string& mesh);
 
             void addHeightField (float* heights, int x, int y, float triSize, float sqrtVerts);
 
diff --git a/apps/openmw/mwscript/transformationextensions.cpp b/apps/openmw/mwscript/transformationextensions.cpp
index e71a4a34b6..d43eae021e 100644
--- a/apps/openmw/mwscript/transformationextensions.cpp
+++ b/apps/openmw/mwscript/transformationextensions.cpp
@@ -1,4 +1,4 @@
-#include <OgreSceneNode.h>
+#include <osg/PositionAttitudeTransform>
 
 #include <components/esm/loadcell.hpp>
 
@@ -519,17 +519,17 @@ namespace MWScript
                     for (int i=0; i<count; ++i)
                     {
                         ESM::Position ipos = actor.getRefData().getPosition();
-                        Ogre::Vector3 pos(ipos.pos[0],ipos.pos[1],ipos.pos[2]);
-                        Ogre::Quaternion rot(Ogre::Radian(-ipos.rot[2]), Ogre::Vector3::UNIT_Z);
-                        if(direction == 0) pos = pos + distance*rot.yAxis();
-                        else if(direction == 1) pos = pos - distance*rot.yAxis();
-                        else if(direction == 2) pos = pos - distance*rot.xAxis();
-                        else if(direction == 3) pos = pos + distance*rot.xAxis();
+                        osg::Vec3f pos(ipos.asVec3());
+                        osg::Quat rot(ipos.rot[2], osg::Vec3f(0,0,-1));
+                        if(direction == 0) pos = pos + (rot * osg::Vec3f(0,1,0)) * distance;
+                        else if(direction == 1) pos = pos - (rot * osg::Vec3f(0,1,0)) * distance;
+                        else if(direction == 2) pos = pos - (rot * osg::Vec3f(1,0,0)) * distance;
+                        else if(direction == 3) pos = pos + (rot * osg::Vec3f(1,0,0)) * distance;
                         else throw std::runtime_error ("direction must be 0,1,2 or 3");
 
-                        ipos.pos[0] = pos.x;
-                        ipos.pos[1] = pos.y;
-                        ipos.pos[2] = pos.z;
+                        ipos.pos[0] = pos.x();
+                        ipos.pos[1] = pos.y();
+                        ipos.pos[2] = pos.z();
 
                         if (actor.getClass().isActor())
                         {
@@ -670,29 +670,30 @@ namespace MWScript
                     Interpreter::Type_Float movement = (runtime[0].mFloat*MWBase::Environment::get().getFrameDuration());
                     runtime.pop();
 
-                    Ogre::Vector3 posChange;
+                    osg::Vec3f posChange;
                     if (axis == "x")
                     {
-                        posChange=Ogre::Vector3(movement, 0, 0);
+                        posChange=osg::Vec3f(movement, 0, 0);
                     }
                     else if (axis == "y")
                     {
-                        posChange=Ogre::Vector3(0, movement, 0);
+                        posChange=osg::Vec3f(0, movement, 0);
                     }
                     else if (axis == "z")
                     {
-                        posChange=Ogre::Vector3(0, 0, movement);
+                        posChange=osg::Vec3f(0, 0, movement);
                     }
                     else
                         throw std::runtime_error ("invalid movement axis: " + axis);
 
-                    if (!ptr.getRefData().getBaseNodeOld())
+                    // is it correct that disabled objects can't be Move-d?
+                    if (!ptr.getRefData().getBaseNode())
                         return;
 
-                    Ogre::Vector3 diff = ptr.getRefData().getBaseNodeOld()->getOrientation() * posChange;
-                    Ogre::Vector3 worldPos(ptr.getRefData().getPosition().pos);
+                    osg::Vec3f diff = ptr.getRefData().getBaseNode()->getAttitude() * posChange;
+                    osg::Vec3f worldPos(ptr.getRefData().getPosition().asVec3());
                     worldPos += diff;
-                    MWBase::Environment::get().getWorld()->moveObject(ptr, worldPos.x, worldPos.y, worldPos.z);
+                    MWBase::Environment::get().getWorld()->moveObject(ptr, worldPos.x(), worldPos.y(), worldPos.z());
                 }
         };
 
diff --git a/apps/openmw/mwsound/loudness.cpp b/apps/openmw/mwsound/loudness.cpp
index 0077919840..9446a1daea 100644
--- a/apps/openmw/mwsound/loudness.cpp
+++ b/apps/openmw/mwsound/loudness.cpp
@@ -1,5 +1,7 @@
 #include "loudness.hpp"
 
+#include <stdint.h>
+
 #include "soundmanagerimp.hpp"
 
 namespace MWSound
@@ -28,7 +30,7 @@ namespace MWSound
                     value = ((char)(data[sample*advance]^0x80))/128.f;
                 else if (type == SampleType_Int16)
                 {
-                    value = *reinterpret_cast<const Ogre::int16*>(&data[sample*advance]);
+                    value = *reinterpret_cast<const uint16_t*>(&data[sample*advance]);
                     value /= float(std::numeric_limits<Ogre::int16>::max());
                 }
                 else if (type == SampleType_Float32)
diff --git a/apps/openmw/mwsound/openal_output.cpp b/apps/openmw/mwsound/openal_output.cpp
index 266b97f875..6862bb889d 100644
--- a/apps/openmw/mwsound/openal_output.cpp
+++ b/apps/openmw/mwsound/openal_output.cpp
@@ -271,7 +271,7 @@ private:
 
 
 OpenAL_SoundStream::OpenAL_SoundStream(OpenAL_Output &output, ALuint src, DecoderPtr decoder, float basevol, float pitch, int flags)
-  : Sound(Ogre::Vector3(0.0f), 1.0f, basevol, pitch, 1.0f, 1000.0f, flags)
+  : Sound(osg::Vec3f(0.f, 0.f, 0.f), 1.0f, basevol, pitch, 1.0f, 1000.0f, flags)
   , mOutput(output), mSource(src), mSamplesQueued(0), mDecoder(decoder), mIsFinished(true), mIsInitialBatchEnqueued(false)
 {
     throwALerror();
@@ -505,7 +505,7 @@ private:
     OpenAL_Sound& operator=(const OpenAL_Sound &rhs);
 
 public:
-    OpenAL_Sound(OpenAL_Output &output, ALuint src, ALuint buf, const Ogre::Vector3& pos, float vol, float basevol, float pitch, float mindist, float maxdist, int flags);
+    OpenAL_Sound(OpenAL_Output &output, ALuint src, ALuint buf, const osg::Vec3f& pos, float vol, float basevol, float pitch, float mindist, float maxdist, int flags);
     virtual ~OpenAL_Sound();
 
     virtual void stop();
@@ -524,14 +524,14 @@ class OpenAL_Sound3D : public OpenAL_Sound
     OpenAL_Sound3D& operator=(const OpenAL_Sound &rhs);
 
 public:
-    OpenAL_Sound3D(OpenAL_Output &output, ALuint src, ALuint buf, const Ogre::Vector3& pos, float vol, float basevol, float pitch, float mindist, float maxdist, int flags)
+    OpenAL_Sound3D(OpenAL_Output &output, ALuint src, ALuint buf, const osg::Vec3f& pos, float vol, float basevol, float pitch, float mindist, float maxdist, int flags)
       : OpenAL_Sound(output, src, buf, pos, vol, basevol, pitch, mindist, maxdist, flags)
     { }
 
     virtual void update();
 };
 
-OpenAL_Sound::OpenAL_Sound(OpenAL_Output &output, ALuint src, ALuint buf, const Ogre::Vector3& pos, float vol, float basevol, float pitch, float mindist, float maxdist, int flags)
+OpenAL_Sound::OpenAL_Sound(OpenAL_Output &output, ALuint src, ALuint buf, const osg::Vec3f& pos, float vol, float basevol, float pitch, float mindist, float maxdist, int flags)
   : Sound(pos, vol, basevol, pitch, mindist, maxdist, flags)
   , mOutput(output), mSource(src), mBuffer(buf)
 {
@@ -628,7 +628,7 @@ void OpenAL_Sound3D::update()
 {
     ALfloat gain = mVolume*mBaseVolume;
     ALfloat pitch = mPitch;
-    if(mPos.squaredDistance(mOutput.mPos) > mMaxDistance*mMaxDistance)
+    if((mPos - mOutput.mPos).length2() > mMaxDistance*mMaxDistance)
         gain = 0.0f;
     else if(!(mFlags&MWBase::SoundManager::Play_NoEnv) && mOutput.mLastEnvironment == Env_Underwater)
     {
@@ -867,7 +867,7 @@ MWBase::SoundPtr OpenAL_Output::playSound(const std::string &fname, float vol, f
     try
     {
         buf = getBuffer(fname).mALBuffer;
-        sound.reset(new OpenAL_Sound(*this, src, buf, Ogre::Vector3(0.0f), vol, basevol, pitch, 1.0f, 1000.0f, flags));
+        sound.reset(new OpenAL_Sound(*this, src, buf, osg::Vec3f(0.f, 0.f, 0.f), vol, basevol, pitch, 1.0f, 1000.0f, flags));
     }
     catch(std::exception&)
     {
@@ -892,7 +892,7 @@ MWBase::SoundPtr OpenAL_Output::playSound(const std::string &fname, float vol, f
     return sound;
 }
 
-MWBase::SoundPtr OpenAL_Output::playSound3D(const std::string &fname, const Ogre::Vector3 &pos, float vol, float basevol, float pitch,
+MWBase::SoundPtr OpenAL_Output::playSound3D(const std::string &fname, const osg::Vec3f &pos, float vol, float basevol, float pitch,
                                             float min, float max, int flags, float offset, bool extractLoudness)
 {
     boost::shared_ptr<OpenAL_Sound> sound;
@@ -967,7 +967,7 @@ MWBase::SoundPtr OpenAL_Output::streamSound(DecoderPtr decoder, float volume, fl
 }
 
 
-void OpenAL_Output::updateListener(const Ogre::Vector3 &pos, const Ogre::Vector3 &atdir, const Ogre::Vector3 &updir, Environment env)
+void OpenAL_Output::updateListener(const osg::Vec3f &pos, const osg::Vec3f &atdir, const osg::Vec3f &updir, Environment env)
 {
     mPos = pos;
     mLastEnvironment = env;
@@ -975,10 +975,10 @@ void OpenAL_Output::updateListener(const Ogre::Vector3 &pos, const Ogre::Vector3
     if(mContext)
     {
         ALfloat orient[6] = {
-            atdir.x, atdir.y, atdir.z,
-            updir.x, updir.y, updir.z
+            atdir.x(), atdir.y(), atdir.z(),
+            updir.x(), updir.y(), updir.z()
         };
-        alListener3f(AL_POSITION, mPos.x, mPos.y, mPos.z);
+        alListener3f(AL_POSITION, mPos.x(), mPos.y(), mPos.z());
         alListenerfv(AL_ORIENTATION, orient);
         throwALerror();
     }
diff --git a/apps/openmw/mwsound/openal_output.hpp b/apps/openmw/mwsound/openal_output.hpp
index 1a95d61505..755a0e5b62 100644
--- a/apps/openmw/mwsound/openal_output.hpp
+++ b/apps/openmw/mwsound/openal_output.hpp
@@ -54,11 +54,11 @@ namespace MWSound
         /// @param offset Value from [0,1] meaning from which fraction the sound the playback starts.
         virtual MWBase::SoundPtr playSound(const std::string &fname, float vol, float basevol, float pitch, int flags, float offset);
         /// @param offset Value from [0,1] meaning from which fraction the sound the playback starts.
-        virtual MWBase::SoundPtr playSound3D(const std::string &fname, const Ogre::Vector3 &pos,
+        virtual MWBase::SoundPtr playSound3D(const std::string &fname, const osg::Vec3f &pos,
                                              float vol, float basevol, float pitch, float min, float max, int flags, float offset, bool extractLoudness=false);
         virtual MWBase::SoundPtr streamSound(DecoderPtr decoder, float volume, float pitch, int flags);
 
-        virtual void updateListener(const Ogre::Vector3 &pos, const Ogre::Vector3 &atdir, const Ogre::Vector3 &updir, Environment env);
+        virtual void updateListener(const osg::Vec3f &pos, const osg::Vec3f &atdir, const osg::Vec3f &updir, Environment env);
 
         virtual void pauseSounds(int types);
         virtual void resumeSounds(int types);
diff --git a/apps/openmw/mwsound/sound.hpp b/apps/openmw/mwsound/sound.hpp
index 1b5c001966..bdc8cf459e 100644
--- a/apps/openmw/mwsound/sound.hpp
+++ b/apps/openmw/mwsound/sound.hpp
@@ -15,7 +15,7 @@ namespace MWSound
         Sound(const Sound &rhs);
 
     protected:
-        Ogre::Vector3 mPos;
+        osg::Vec3f mPos;
         float mVolume; /* NOTE: Real volume = mVolume*mBaseVolume */
         float mBaseVolume;
         float mPitch;
@@ -31,7 +31,7 @@ namespace MWSound
         virtual void stop() = 0;
         virtual bool isPlaying() = 0;
         virtual double getTimeOffset() = 0;
-        void setPosition(const Ogre::Vector3 &pos) { mPos = pos; }
+        void setPosition(const osg::Vec3f &pos) { mPos = pos; }
         void setVolume(float volume) { mVolume = volume; }
         void setFadeout(float duration) { mFadeOutTime=duration; }
         void setLoudnessVector(const std::vector<float>& loudnessVector, float loudnessFPS);
@@ -44,7 +44,7 @@ namespace MWSound
         { return (MWBase::SoundManager::PlayType)(mFlags&MWBase::SoundManager::Play_TypeMask); }
 
 
-        Sound(const Ogre::Vector3& pos, float vol, float basevol, float pitch, float mindist, float maxdist, int flags)
+        Sound(const osg::Vec3f& pos, float vol, float basevol, float pitch, float mindist, float maxdist, int flags)
           : mPos(pos)
           , mVolume(vol)
           , mBaseVolume(basevol)
diff --git a/apps/openmw/mwsound/sound_output.hpp b/apps/openmw/mwsound/sound_output.hpp
index 4f5c210bbe..a0c6fb17b9 100644
--- a/apps/openmw/mwsound/sound_output.hpp
+++ b/apps/openmw/mwsound/sound_output.hpp
@@ -4,8 +4,6 @@
 #include <string>
 #include <memory>
 
-#include <OgreVector3.h>
-
 #include "soundmanagerimp.hpp"
 
 #include "../mwworld/ptr.hpp"
@@ -27,11 +25,11 @@ namespace MWSound
         /// @param offset Value from [0,1] meaning from which fraction the sound the playback starts.
         virtual MWBase::SoundPtr playSound(const std::string &fname, float vol, float basevol, float pitch, int flags, float offset) = 0;
         /// @param offset Value from [0,1] meaning from which fraction the sound the playback starts.
-        virtual MWBase::SoundPtr playSound3D(const std::string &fname, const Ogre::Vector3 &pos,
+        virtual MWBase::SoundPtr playSound3D(const std::string &fname, const osg::Vec3f &pos,
                                              float vol, float basevol, float pitch, float min, float max, int flags, float offset, bool extractLoudness=false) = 0;
         virtual MWBase::SoundPtr streamSound(DecoderPtr decoder, float volume, float pitch, int flags) = 0;
 
-        virtual void updateListener(const Ogre::Vector3 &pos, const Ogre::Vector3 &atdir, const Ogre::Vector3 &updir, Environment env) = 0;
+        virtual void updateListener(const osg::Vec3f &pos, const osg::Vec3f &atdir, const osg::Vec3f &updir, Environment env) = 0;
 
         virtual void pauseSounds(int types) = 0;
         virtual void resumeSounds(int types) = 0;
@@ -41,7 +39,7 @@ namespace MWSound
 
     protected:
         bool mInitialized;
-        Ogre::Vector3 mPos;
+        osg::Vec3f mPos;
 
         Sound_Output(SoundManager &mgr)
           : mManager(mgr)
diff --git a/apps/openmw/mwsound/soundmanagerimp.cpp b/apps/openmw/mwsound/soundmanagerimp.cpp
index 775e3da199..a5ae9f0e27 100644
--- a/apps/openmw/mwsound/soundmanagerimp.cpp
+++ b/apps/openmw/mwsound/soundmanagerimp.cpp
@@ -268,7 +268,7 @@ namespace MWSound
             float basevol = volumeFromType(Play_TypeVoice);
             std::string filePath = "Sound/"+filename;
             const ESM::Position &pos = ptr.getRefData().getPosition();
-            const Ogre::Vector3 objpos(pos.pos);
+            const osg::Vec3f objpos(pos.asVec3());
 
             MWBase::World* world = MWBase::Environment::get().getWorld();
             static const float fAudioMinDistanceMult = world->getStore().get<ESM::GameSetting>().find("fAudioMinDistanceMult")->getFloat();
@@ -396,9 +396,9 @@ namespace MWSound
             float min, max;
             std::string file = lookup(soundId, volume, min, max);
             const ESM::Position &pos = ptr.getRefData().getPosition();
-            const Ogre::Vector3 objpos(pos.pos);
+            const osg::Vec3f objpos(pos.asVec3());
 
-            if ((mode & Play_RemoveAtDistance) && mListenerPos.squaredDistance(objpos) > 2000*2000)
+            if ((mode & Play_RemoveAtDistance) && (mListenerPos-objpos).length2() > 2000*2000)
             {
                 return MWBase::SoundPtr();
             }
@@ -416,7 +416,7 @@ namespace MWSound
         return sound;
     }
 
-    MWBase::SoundPtr SoundManager::playManualSound3D(const Ogre::Vector3& initialPos, const std::string& soundId,
+    MWBase::SoundPtr SoundManager::playManualSound3D(const osg::Vec3f& initialPos, const std::string& soundId,
                                                      float volume, float pitch, PlayType type, PlayMode mode, float offset)
     {
         MWBase::SoundPtr sound;
@@ -666,11 +666,11 @@ namespace MWSound
                 if(!ptr.isEmpty())
                 {
                     const ESM::Position &pos = ptr.getRefData().getPosition();
-                    const Ogre::Vector3 objpos(pos.pos);
+                    const osg::Vec3f objpos(pos.asVec3());
                     snditer->first->setPosition(objpos);
 
                     if ((snditer->first->mFlags & Play_RemoveAtDistance)
-                            && mListenerPos.squaredDistance(Ogre::Vector3(ptr.getRefData().getPosition().pos)) > 2000*2000)
+                            && (mListenerPos - ptr.getRefData().getPosition().asVec3()).length2() > 2000*2000)
                     {
                         mActiveSounds.erase(snditer++);
                         continue;
@@ -728,7 +728,7 @@ namespace MWSound
         }
     }
 
-    void SoundManager::setListenerPosDir(const Ogre::Vector3 &pos, const Ogre::Vector3 &dir, const Ogre::Vector3 &up)
+    void SoundManager::setListenerPosDir(const osg::Vec3f &pos, const osg::Vec3f &dir, const osg::Vec3f &up)
     {
         mListenerPos = pos;
         mListenerDir = dir;
@@ -738,7 +738,7 @@ namespace MWSound
             MWBase::Environment::get().getWorld()->getPlayerPtr();
         const MWWorld::CellStore *cell = player.getCell();
 
-        mListenerUnderwater = ((cell->getCell()->mData.mFlags&ESM::Cell::HasWater) && mListenerPos.z < cell->getWaterLevel());
+        mListenerUnderwater = ((cell->getCell()->mData.mFlags&ESM::Cell::HasWater) && mListenerPos.z() < cell->getWaterLevel());
     }
 
     void SoundManager::updatePtr(const MWWorld::Ptr &old, const MWWorld::Ptr &updated)
diff --git a/apps/openmw/mwsound/soundmanagerimp.hpp b/apps/openmw/mwsound/soundmanagerimp.hpp
index 8089a7e6f5..27af1e65b9 100644
--- a/apps/openmw/mwsound/soundmanagerimp.hpp
+++ b/apps/openmw/mwsound/soundmanagerimp.hpp
@@ -55,9 +55,9 @@ namespace MWSound
         MWBase::SoundPtr mUnderwaterSound;
 
         bool mListenerUnderwater;
-        Ogre::Vector3 mListenerPos;
-        Ogre::Vector3 mListenerDir;
-        Ogre::Vector3 mListenerUp;
+        osg::Vec3f mListenerPos;
+        osg::Vec3f mListenerDir;
+        osg::Vec3f mListenerUp;
 
         int mPausedSoundTypes;
 
@@ -132,7 +132,7 @@ namespace MWSound
         ///< Play a 3D sound attached to an MWWorld::Ptr. Will be updated automatically with the Ptr's position, unless Play_NoTrack is specified.
         ///< @param offset Value from [0,1] meaning from which fraction the sound the playback starts.
 
-        virtual MWBase::SoundPtr playManualSound3D(const Ogre::Vector3& initialPos, const std::string& soundId,
+        virtual MWBase::SoundPtr playManualSound3D(const osg::Vec3f& initialPos, const std::string& soundId,
                                                          float volume, float pitch, PlayType type, PlayMode mode, float offset=0);
         ///< Play a 3D sound at \a initialPos. If the sound should be moving, it must be updated manually using Sound::setPosition.
 
@@ -171,7 +171,7 @@ namespace MWSound
 
         virtual void update(float duration);
 
-        virtual void setListenerPosDir(const Ogre::Vector3 &pos, const Ogre::Vector3 &dir, const Ogre::Vector3 &up);
+        virtual void setListenerPosDir(const osg::Vec3f &pos, const osg::Vec3f &dir, const osg::Vec3f &up);
 
         virtual void updatePtr (const MWWorld::Ptr& old, const MWWorld::Ptr& updated);
 
diff --git a/apps/openmw/mwworld/containerstore.cpp b/apps/openmw/mwworld/containerstore.cpp
index 371543f2e1..d4aadc6c7a 100644
--- a/apps/openmw/mwworld/containerstore.cpp
+++ b/apps/openmw/mwworld/containerstore.cpp
@@ -242,7 +242,7 @@ MWWorld::ContainerStoreIterator MWWorld::ContainerStore::add (const Ptr& itemPtr
     MWWorld::Ptr item = *it;
 
     // we may have copied an item from the world, so reset a few things first
-    item.getRefData().setBaseNodeOld(NULL); // Especially important, otherwise scripts on the item could think that it's actually in a cell
+    item.getRefData().setBaseNode(NULL); // Especially important, otherwise scripts on the item could think that it's actually in a cell
     ESM::Position pos;
     pos.rot[0] = 0;
     pos.rot[1] = 0;
diff --git a/apps/openmw/mwworld/projectilemanager.hpp b/apps/openmw/mwworld/projectilemanager.hpp
index 93f54c0086..f46f544d28 100644
--- a/apps/openmw/mwworld/projectilemanager.hpp
+++ b/apps/openmw/mwworld/projectilemanager.hpp
@@ -6,18 +6,14 @@
 #include <OgreVector3.h>
 
 #include <components/esm/effectlist.hpp>
-#include <components/nifogre/ogrenifloader.hpp>
 
 #include "../mwbase/soundmanager.hpp"
 
 #include "ptr.hpp"
 
-namespace OEngine
+namespace MWPhysics
 {
-namespace Physic
-{
-    class PhysicEngine;
-}
+    class PhysicsSystem;
 }
 
 namespace Loading
diff --git a/apps/openmw/mwworld/worldimp.cpp b/apps/openmw/mwworld/worldimp.cpp
index 6ea38a8fbe..6c7fd6ff38 100644
--- a/apps/openmw/mwworld/worldimp.cpp
+++ b/apps/openmw/mwworld/worldimp.cpp
@@ -44,6 +44,7 @@
 #include "../mwclass/door.hpp"
 
 #include "../mwphysics/physicssystem.hpp"
+#include "../mwphysics/actor.hpp"
 
 #include "player.hpp"
 #include "manualref.hpp"
@@ -1314,7 +1315,7 @@ namespace MWWorld
     {
         ESM::Position pos (ptr.getRefData().getPosition());
 
-        if(!ptr.getRefData().getBaseNodeOld())
+        if(!ptr.getRefData().getBaseNode())
         {
             // will be adjusted when Ptr's cell becomes active
             return;
@@ -1596,9 +1597,9 @@ namespace MWWorld
         performUpdateSceneQueries ();
 
         updateWindowManager ();
-
+        */
         updateSoundListener();
-
+        /*
         if (!paused && mPlayer->getPlayer().getCell()->isExterior())
         {
             ESM::Position pos = mPlayer->getPlayer().getRefData().getPosition();
@@ -1611,17 +1612,21 @@ namespace MWWorld
 
     void World::updateSoundListener()
     {
-        /*
-        Ogre::Vector3 playerPos = mPlayer->getPlayer().getRefData().getBaseNodeOld()->getPosition();
+        const ESM::Position& refpos = getPlayerPtr().getRefData().getPosition();
+        osg::Vec3f playerPos = refpos.asVec3();
 
-        const OEngine::Physic::PhysicActor *actor = mPhysEngine->getCharacter(getPlayerPtr().getRefData().getHandle());
-        if(actor) playerPos.z += 1.85f * actor->getHalfExtents().z;
-        Ogre::Quaternion playerOrient = Ogre::Quaternion(Ogre::Radian(getPlayerPtr().getRefData().getPosition().rot[2]), Ogre::Vector3::NEGATIVE_UNIT_Z) *
-                    Ogre::Quaternion(Ogre::Radian(getPlayerPtr().getRefData().getPosition().rot[0]), Ogre::Vector3::NEGATIVE_UNIT_X) *
-                    Ogre::Quaternion(Ogre::Radian(getPlayerPtr().getRefData().getPosition().rot[1]), Ogre::Vector3::NEGATIVE_UNIT_Y);
-        MWBase::Environment::get().getSoundManager()->setListenerPosDir(playerPos, playerOrient.yAxis(),
-                                                                        playerOrient.zAxis());
-        */
+        const MWPhysics::Actor* actor = mPhysics->getActor(getPlayerPtr());
+        if (actor)
+            playerPos.z() += 1.85f * actor->getHalfExtents().z();
+
+        osg::Quat playerOrient = osg::Quat(refpos.rot[1], osg::Vec3f(0,-1,0)) *
+                osg::Quat(refpos.rot[0], osg::Vec3f(-1,0,0)) *
+                osg::Quat(refpos.rot[2], osg::Vec3f(0,0,-1));
+
+        osg::Vec3f forward = playerOrient * osg::Vec3f(0,1,0);
+        osg::Vec3f up = playerOrient * osg::Vec3f(0,0,1);
+
+        MWBase::Environment::get().getSoundManager()->setListenerPosDir(playerPos, forward, up);
     }
 
     void World::updateWindowManager ()
@@ -1987,9 +1992,9 @@ namespace MWWorld
                 && isLevitationEnabled())
             return true;
 
-        //const OEngine::Physic::PhysicActor *actor = 0;//mPhysEngine->getCharacter(ptr.getRefData().getHandle());
-        //if(!actor || !actor->getCollisionMode())
-        //    return true;
+        const MWPhysics::Actor* actor = mPhysics->getActor(ptr);
+        if(!actor || !actor->getCollisionMode())
+            return true;
 
         return false;
     }
@@ -2027,10 +2032,10 @@ namespace MWWorld
         const float *fpos = object.getRefData().getPosition().pos;
         Ogre::Vector3 pos(fpos[0], fpos[1], fpos[2]);
 
-        //const OEngine::Physic::PhysicActor *actor = 0;//mPhysEngine->getCharacter(object.getRefData().getHandle());
-        //if (actor)
+        const MWPhysics::Actor* actor = mPhysics->getActor(object);
+        if (actor)
         {
-        //    pos.z += heightRatio*2*actor->getHalfExtents().z;
+            pos.z += heightRatio*2*actor->getHalfExtents().z();
         }
 
         return isUnderwater(object.getCell(), pos);
@@ -2134,17 +2139,16 @@ namespace MWWorld
         CellStore *currentCell = mWorldScene->getCurrentCell();
 
         Ptr player = mPlayer->getPlayer();
-        //RefData &refdata = player.getRefData();
-        //Ogre::Vector3 playerPos(refdata.getPosition().pos);
+        RefData &refdata = player.getRefData();
+        Ogre::Vector3 playerPos(refdata.getPosition().pos);
 
-        /*
-        const OEngine::Physic::PhysicActor *physactor = mPhysEngine->getCharacter(refdata.getHandle());
-        if (!physactor)
+        const MWPhysics::Actor* actor = mPhysics->getActor(player);
+        if (!actor)
             throw std::runtime_error("can't find player");
 
-        if((!physactor->getOnGround()&&physactor->getCollisionMode()) || isUnderwater(currentCell, playerPos) || isWalkingOnWater(player))
+        if((!actor->getOnGround()&&actor->getCollisionMode()) || isUnderwater(currentCell, playerPos) || isWalkingOnWater(player))
             return 2;
-            */
+
         if((currentCell->getCell()->mData.mFlags&ESM::Cell::NoSleep) ||
            player.getClass().getNpcStats(player).isWerewolf())
             return 1;
@@ -2359,9 +2363,10 @@ namespace MWWorld
     {
         if (!targetActor.getRefData().isEnabled() || !actor.getRefData().isEnabled())
             return false; // cannot get LOS unless both NPC's are enabled
-        if (!targetActor.getRefData().getBaseNodeOld() || !targetActor.getRefData().getBaseNodeOld())
+        if (!targetActor.getRefData().getBaseNode() || !targetActor.getRefData().getBaseNode())
             return false; // not in active cell
 
+        // TODO: move to PhysicsSystem
         /*
         OEngine::Physic::PhysicActor* actor1 = mPhysEngine->getCharacter(actor.getRefData().getHandle());
         OEngine::Physic::PhysicActor* actor2 = mPhysEngine->getCharacter(targetActor.getRefData().getHandle());
@@ -2402,11 +2407,9 @@ namespace MWWorld
 
     void World::enableActorCollision(const MWWorld::Ptr& actor, bool enable)
     {
-        /*
-        OEngine::Physic::PhysicActor *physicActor = 0;//mPhysEngine->getCharacter(actor.getRefData().getHandle());
+        MWPhysics::Actor *physicActor = mPhysics->getActor(actor);
         if (physicActor)
             physicActor->enableCollisionBody(enable);
-            */
     }
 
     bool World::findInteriorPosition(const std::string &name, ESM::Position &pos)
@@ -3261,9 +3264,9 @@ namespace MWWorld
             {
                 MWBase::SoundManager *sndMgr = MWBase::Environment::get().getSoundManager();
                 if(!effect->mAreaSound.empty())
-                    sndMgr->playManualSound3D(origin, effect->mAreaSound, 1.0f, 1.0f, MWBase::SoundManager::Play_TypeSfx, MWBase::SoundManager::Play_NoTrack);
+                    sndMgr->playManualSound3D(osg::Vec3f(origin.x, origin.y, origin.z), effect->mAreaSound, 1.0f, 1.0f, MWBase::SoundManager::Play_TypeSfx, MWBase::SoundManager::Play_NoTrack);
                 else
-                    sndMgr->playManualSound3D(origin, schools[effect->mData.mSchool]+" area", 1.0f, 1.0f, MWBase::SoundManager::Play_TypeSfx, MWBase::SoundManager::Play_NoTrack);
+                    sndMgr->playManualSound3D(osg::Vec3f(origin.x, origin.y, origin.z), schools[effect->mData.mSchool]+" area", 1.0f, 1.0f, MWBase::SoundManager::Play_TypeSfx, MWBase::SoundManager::Play_NoTrack);
             }
             // Get the actors in range of the effect
             std::vector<MWWorld::Ptr> objects;
@@ -3348,12 +3351,9 @@ namespace MWWorld
 
     bool World::isWalkingOnWater(const Ptr &actor)
     {
-        return false;
-        /*
-        OEngine::Physic::PhysicActor* physicActor = mPhysEngine->getCharacter(actor.getRefData().getHandle());
+        MWPhysics::Actor* physicActor = mPhysics->getActor(actor);
         if (physicActor && physicActor->isWalkingOnWater())
             return true;
         return false;
-        */
     }
 }