From b1381ddd693995d4920a0e683b313ed46869bf6f Mon Sep 17 00:00:00 2001
From: Sergey Shambir <sergey.shambir.auto@gmail.com>
Date: Mon, 25 Feb 2013 04:12:41 +0400
Subject: [PATCH 01/20] Nif loader: workaround for missed textures in BB/BH

Works for Better Bodies / Better Heads addons.
---
 components/nifogre/ogre_nif_loader.cpp | 13 ++++++++++++-
 1 file changed, 12 insertions(+), 1 deletion(-)

diff --git a/components/nifogre/ogre_nif_loader.cpp b/components/nifogre/ogre_nif_loader.cpp
index dfbc93ee90..0ee778df30 100644
--- a/components/nifogre/ogre_nif_loader.cpp
+++ b/components/nifogre/ogre_nif_loader.cpp
@@ -540,7 +540,7 @@ static Ogre::String getMaterial(const Nif::NiTriShape *shape, const Ogre::String
         Nif::NiSourceTexture *st = t->textures[0].texture.getPtr();
         if (st->external)
         {
-            /* Bethesda at some at some point converted all their BSA
+            /* Bethesda at some point converted all their BSA
              * textures from tga to dds for increased load speed, but all
              * texture file name references were kept as .tga.
              */
@@ -559,6 +559,17 @@ static Ogre::String getMaterial(const Nif::NiTriShape *shape, const Ogre::String
                 if(!Ogre::ResourceGroupManager::getSingleton().resourceExistsInAnyGroup(texName))
                     texName = path + st->filename;
             }
+            else if (!Ogre::ResourceGroupManager::getSingleton().resourceExistsInAnyGroup(texName))
+            {
+                // workaround for Better Heads addon
+                size_t lastSlash = st->filename.rfind('\\');
+                if (lastSlash != std::string::npos && lastSlash + 1 != st->filename.size()) {
+                    texName = path + st->filename.substr(lastSlash + 1);
+                    // workaround for Better Bodies addon
+                    if (!Ogre::ResourceGroupManager::getSingleton().resourceExistsInAnyGroup(texName))
+                        texName = st->filename;
+                }
+            }
         }
         else warn("Found internal texture, ignoring.");
     }

From 151ecaad049411e42fde0de45e36b7dd2bee27aa Mon Sep 17 00:00:00 2001
From: Marc Zinnschlag <marc@zpages.de>
Date: Mon, 25 Feb 2013 10:32:38 +0100
Subject: [PATCH 02/20] workaround for garbage after an end statement

---
 components/compiler/fileparser.cpp | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/components/compiler/fileparser.cpp b/components/compiler/fileparser.cpp
index 9b184f1ffb..98be2d3d1f 100644
--- a/components/compiler/fileparser.cpp
+++ b/components/compiler/fileparser.cpp
@@ -45,7 +45,10 @@ namespace Compiler
                 reportWarning ("Names for script " + mName + " do not match", loc);
 
             mState = EndCompleteState;
-            return true;
+            return false; // we are stopping here, because there might be more garbage on the end line,
+                          // that we must ignore.
+                          //
+                          /// \todo allow this workaround to be disabled for newer scripts
         }
 
         return Parser::parseName (name, loc, scanner);

From 5d5d28c06ccabbbeae221a8eb4d906aeebc69b79 Mon Sep 17 00:00:00 2001
From: Chris Robinson <chris.kcat@gmail.com>
Date: Mon, 25 Feb 2013 07:43:56 -0800
Subject: [PATCH 03/20] Increase the ID cache to 40

Helps improve performance with Tribunal and Bloodmoon's scripts
---
 apps/openmw/mwworld/cells.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/apps/openmw/mwworld/cells.cpp b/apps/openmw/mwworld/cells.cpp
index 59c62e37d6..b912f5ccca 100644
--- a/apps/openmw/mwworld/cells.cpp
+++ b/apps/openmw/mwworld/cells.cpp
@@ -86,7 +86,7 @@ MWWorld::Ptr MWWorld::Cells::getPtrAndCache (const std::string& name, Ptr::CellS
 
 MWWorld::Cells::Cells (const MWWorld::ESMStore& store, std::vector<ESM::ESMReader>& reader)
 : mStore (store), mReader (reader),
-  mIdCache (20, std::pair<std::string, Ptr::CellStore *> ("", (Ptr::CellStore*)0)), /// \todo make cache size configurable
+  mIdCache (40, std::pair<std::string, Ptr::CellStore *> ("", (Ptr::CellStore*)0)), /// \todo make cache size configurable
   mIdCacheIndex (0)
 {}
 

From 88e8659a4959b9dcf0670796f75af6cac8b3b9f4 Mon Sep 17 00:00:00 2001
From: Marc Zinnschlag <marc@zpages.de>
Date: Mon, 25 Feb 2013 16:52:31 +0100
Subject: [PATCH 04/20] minor cleanup

---
 apps/openmw/mwmechanics/mechanicsmanagerimp.cpp | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/apps/openmw/mwmechanics/mechanicsmanagerimp.cpp b/apps/openmw/mwmechanics/mechanicsmanagerimp.cpp
index 3cc3dcde39..5ed3770fd4 100644
--- a/apps/openmw/mwmechanics/mechanicsmanagerimp.cpp
+++ b/apps/openmw/mwmechanics/mechanicsmanagerimp.cpp
@@ -557,7 +557,8 @@ namespace MWMechanics
         float fPerDieRollMult = gmst.find("fPerDieRollMult")->getFloat();
         float fPerTempMult = gmst.find("fPerTempMult")->getFloat();
 
-        float x,y = 0;
+        float x = 0;
+        float y = 0;
 
         float roll = static_cast<float> (std::rand()) / RAND_MAX * 100;
 

From ff1ecb85c6cc1f02821024e1964abbf81633d545 Mon Sep 17 00:00:00 2001
From: Chris Robinson <chris.kcat@gmail.com>
Date: Mon, 25 Feb 2013 08:22:57 -0800
Subject: [PATCH 05/20] Don't bother storing the shape name for the submesh
 name

The submesh name Ogre has is completely useless to us
---
 components/nifogre/ogre_nif_loader.cpp | 9 +++------
 1 file changed, 3 insertions(+), 6 deletions(-)

diff --git a/components/nifogre/ogre_nif_loader.cpp b/components/nifogre/ogre_nif_loader.cpp
index 1582826b81..826d247c6f 100644
--- a/components/nifogre/ogre_nif_loader.cpp
+++ b/components/nifogre/ogre_nif_loader.cpp
@@ -763,7 +763,6 @@ class NIFMeshLoader : Ogre::ManualResourceLoader
     std::string mGroup;
     size_t mShapeIndex;
     std::string mMaterialName;
-    std::string mShapeName;
 
     void warn(const std::string &msg)
     {
@@ -872,8 +871,7 @@ class NIFMeshLoader : Ogre::ManualResourceLoader
         Ogre::VertexDeclaration *decl;
         int nextBuf = 0;
 
-        Ogre::SubMesh *sub = ((mShapeName.length() > 0) ? mesh->createSubMesh(mShapeName) :
-                                                          mesh->createSubMesh());
+        Ogre::SubMesh *sub = mesh->createSubMesh();
 
         // Add vertices
         sub->useSharedVertices = false;
@@ -1061,12 +1059,11 @@ public:
         if(node->recType == Nif::RC_NiTriShape && !(flags&0x01)) // Not hidden
         {
             const Nif::NiTriShape *shape = dynamic_cast<const Nif::NiTriShape*>(node);
-            mShapeName = shape->name;
 
             Ogre::MeshManager &meshMgr = Ogre::MeshManager::getSingleton();
             std::string fullname = mName+"@index="+Ogre::StringConverter::toString(shape->recIndex);
-            if(mShapeName.length() > 0)
-                fullname += "@shape="+mShapeName;
+            if(shape->name.length() > 0)
+                fullname += "@shape="+shape->name;
 
             Misc::StringUtils::toLower(fullname);
             Ogre::MeshPtr mesh = meshMgr.getByName(fullname);

From 48271e49eccff7379911ae4abcaf00ba39a87125 Mon Sep 17 00:00:00 2001
From: Chris Robinson <chris.kcat@gmail.com>
Date: Mon, 25 Feb 2013 09:57:34 -0800
Subject: [PATCH 06/20] Properly update the Ptr object in the mechanics manager
 when moving across cells

---
 apps/openmw/mwbase/mechanicsmanager.hpp         | 2 +-
 apps/openmw/mwmechanics/activators.cpp          | 6 ++++--
 apps/openmw/mwmechanics/activators.hpp          | 4 ++--
 apps/openmw/mwmechanics/actors.cpp              | 6 ++++--
 apps/openmw/mwmechanics/actors.hpp              | 4 ++--
 apps/openmw/mwmechanics/character.cpp           | 6 ++++++
 apps/openmw/mwmechanics/character.hpp           | 2 ++
 apps/openmw/mwmechanics/mechanicsmanagerimp.cpp | 6 +++---
 apps/openmw/mwmechanics/mechanicsmanagerimp.hpp | 2 +-
 apps/openmw/mwworld/worldimp.cpp                | 2 +-
 10 files changed, 26 insertions(+), 14 deletions(-)

diff --git a/apps/openmw/mwbase/mechanicsmanager.hpp b/apps/openmw/mwbase/mechanicsmanager.hpp
index cb9539ef65..b8733259ff 100644
--- a/apps/openmw/mwbase/mechanicsmanager.hpp
+++ b/apps/openmw/mwbase/mechanicsmanager.hpp
@@ -43,7 +43,7 @@ namespace MWBase
             virtual void remove (const MWWorld::Ptr& ptr) = 0;
             ///< Deregister an object for management
 
-            virtual void updateCell(const MWWorld::Ptr &ptr) = 0;
+            virtual void updateCell(const MWWorld::Ptr &old, const MWWorld::Ptr &ptr) = 0;
             ///< Moves an object to a new cell
 
             virtual void drop (const MWWorld::CellStore *cellStore) = 0;
diff --git a/apps/openmw/mwmechanics/activators.cpp b/apps/openmw/mwmechanics/activators.cpp
index 1a743cad59..b67fcb2164 100644
--- a/apps/openmw/mwmechanics/activators.cpp
+++ b/apps/openmw/mwmechanics/activators.cpp
@@ -26,13 +26,15 @@ void Activators::removeActivator (const MWWorld::Ptr& ptr)
         mActivators.erase(iter);
 }
 
-void Activators::updateActivatorCell(const MWWorld::Ptr &ptr)
+void Activators::updateActivator(const MWWorld::Ptr &old, const MWWorld::Ptr &ptr)
 {
-    PtrControllerMap::iterator iter = mActivators.find(ptr);
+    PtrControllerMap::iterator iter = mActivators.find(old);
     if(iter != mActivators.end())
     {
         CharacterController ctrl = iter->second;
         mActivators.erase(iter);
+
+        ctrl.updatePtr(ptr);
         mActivators.insert(std::make_pair(ptr, ctrl));
     }
 }
diff --git a/apps/openmw/mwmechanics/activators.hpp b/apps/openmw/mwmechanics/activators.hpp
index 0b9e984aa6..137674a57a 100644
--- a/apps/openmw/mwmechanics/activators.hpp
+++ b/apps/openmw/mwmechanics/activators.hpp
@@ -28,8 +28,8 @@ namespace MWMechanics
         void removeActivator (const MWWorld::Ptr& ptr);
         ///< Deregister an activator
 
-        void updateActivatorCell(const MWWorld::Ptr& ptr);
-        ///< Updates an activator with a new cell store
+        void updateActivator(const MWWorld::Ptr &old, const MWWorld::Ptr& ptr);
+        ///< Updates an activator with a new Ptr
 
         void dropActivators (const MWWorld::CellStore *cellStore);
         ///< Deregister all activators in the given cell.
diff --git a/apps/openmw/mwmechanics/actors.cpp b/apps/openmw/mwmechanics/actors.cpp
index a8c05f17e3..9632bdf769 100644
--- a/apps/openmw/mwmechanics/actors.cpp
+++ b/apps/openmw/mwmechanics/actors.cpp
@@ -179,13 +179,15 @@ namespace MWMechanics
             mActors.erase(iter);
     }
 
-    void Actors::updateActorCell(const MWWorld::Ptr &ptr)
+    void Actors::updateActor(const MWWorld::Ptr &old, const MWWorld::Ptr &ptr)
     {
-        PtrControllerMap::iterator iter = mActors.find(ptr);
+        PtrControllerMap::iterator iter = mActors.find(old);
         if(iter != mActors.end())
         {
             CharacterController ctrl = iter->second;
             mActors.erase(iter);
+
+            ctrl.updatePtr(ptr);
             mActors.insert(std::make_pair(ptr, ctrl));
         }
     }
diff --git a/apps/openmw/mwmechanics/actors.hpp b/apps/openmw/mwmechanics/actors.hpp
index fbd787e835..fc4af8dd63 100644
--- a/apps/openmw/mwmechanics/actors.hpp
+++ b/apps/openmw/mwmechanics/actors.hpp
@@ -58,8 +58,8 @@ namespace MWMechanics
             ///
             /// \note Ignored, if \a ptr is not a registered actor.
 
-            void updateActorCell(const MWWorld::Ptr& ptr);
-            ///< Updates an actor with a new cell store
+            void updateActor(const MWWorld::Ptr &old, const MWWorld::Ptr& ptr);
+            ///< Updates an actor with a new Ptr
 
             void dropActors (const MWWorld::CellStore *cellStore);
             ///< Deregister all actors in the given cell.
diff --git a/apps/openmw/mwmechanics/character.cpp b/apps/openmw/mwmechanics/character.cpp
index 8f7929805f..ae0114a351 100644
--- a/apps/openmw/mwmechanics/character.cpp
+++ b/apps/openmw/mwmechanics/character.cpp
@@ -131,6 +131,12 @@ CharacterController::~CharacterController()
 }
 
 
+void CharacterController::updatePtr(const MWWorld::Ptr &ptr)
+{
+    mPtr = ptr;
+}
+
+
 void CharacterController::markerEvent(float time, const std::string &evt)
 {
     if(evt == "stop")
diff --git a/apps/openmw/mwmechanics/character.hpp b/apps/openmw/mwmechanics/character.hpp
index 2465aea98f..2b3c50864a 100644
--- a/apps/openmw/mwmechanics/character.hpp
+++ b/apps/openmw/mwmechanics/character.hpp
@@ -79,6 +79,8 @@ public:
     CharacterController(const CharacterController &rhs);
     virtual ~CharacterController();
 
+    void updatePtr(const MWWorld::Ptr &ptr);
+
     Ogre::Vector3 update(float duration);
 
     void playGroup(const std::string &groupname, int mode, int count);
diff --git a/apps/openmw/mwmechanics/mechanicsmanagerimp.cpp b/apps/openmw/mwmechanics/mechanicsmanagerimp.cpp
index eee72f8805..a02b64e9d3 100644
--- a/apps/openmw/mwmechanics/mechanicsmanagerimp.cpp
+++ b/apps/openmw/mwmechanics/mechanicsmanagerimp.cpp
@@ -191,12 +191,12 @@ namespace MWMechanics
         mActivators.removeActivator(ptr);
     }
 
-    void MechanicsManager::updateCell(const MWWorld::Ptr &ptr)
+    void MechanicsManager::updateCell(const MWWorld::Ptr &old, const MWWorld::Ptr &ptr)
     {
         if(ptr.getTypeName() == typeid(ESM::Activator).name())
-            mActivators.updateActivatorCell(ptr);
+            mActivators.updateActivator(old, ptr);
         else
-            mActors.updateActorCell(ptr);
+            mActors.updateActor(old, ptr);
     }
 
 
diff --git a/apps/openmw/mwmechanics/mechanicsmanagerimp.hpp b/apps/openmw/mwmechanics/mechanicsmanagerimp.hpp
index 99010b7ffd..5ad8705719 100644
--- a/apps/openmw/mwmechanics/mechanicsmanagerimp.hpp
+++ b/apps/openmw/mwmechanics/mechanicsmanagerimp.hpp
@@ -48,7 +48,7 @@ namespace MWMechanics
             virtual void remove (const MWWorld::Ptr& ptr);
             ///< Deregister an object for management
 
-            virtual void updateCell(const MWWorld::Ptr &ptr);
+            virtual void updateCell(const MWWorld::Ptr &old, const MWWorld::Ptr &ptr);
             ///< Moves an object to a new cell
 
             virtual void drop(const MWWorld::CellStore *cellStore);
diff --git a/apps/openmw/mwworld/worldimp.cpp b/apps/openmw/mwworld/worldimp.cpp
index f723934be9..c1725c00c8 100644
--- a/apps/openmw/mwworld/worldimp.cpp
+++ b/apps/openmw/mwworld/worldimp.cpp
@@ -773,7 +773,7 @@ namespace MWWorld
                     mRendering->updateObjectCell(ptr, copy);
 
                     MWBase::MechanicsManager *mechMgr = MWBase::Environment::get().getMechanicsManager();
-                    mechMgr->updateCell(copy);
+                    mechMgr->updateCell(ptr, copy);
 
                     std::string script =
                         MWWorld::Class::get(ptr).getScript(ptr);

From 661fd73c6e1668a2c929f4ad5dd07afcaf83ec7a Mon Sep 17 00:00:00 2001
From: greye <greye@null.net>
Date: Mon, 25 Feb 2013 22:00:50 +0400
Subject: [PATCH 07/20] fix rotation for objects in inactive cells and forced
 vanity mode

---
 apps/openmw/mwworld/worldimp.cpp | 16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)

diff --git a/apps/openmw/mwworld/worldimp.cpp b/apps/openmw/mwworld/worldimp.cpp
index f723934be9..5eaa71b750 100644
--- a/apps/openmw/mwworld/worldimp.cpp
+++ b/apps/openmw/mwworld/worldimp.cpp
@@ -832,16 +832,16 @@ namespace MWWorld
         rot.y = Ogre::Degree(y).valueRadians();
         rot.z = Ogre::Degree(z).valueRadians();
 
-        float *objRot = ptr.getRefData().getPosition().rot;
-        if(ptr.getRefData().getBaseNode() == 0 || !mRendering->rotateObject(ptr, rot, adjust))
+        if (mRendering->rotateObject(ptr, rot, adjust))
         {
-            objRot[0] = (adjust ? objRot[0] + rot.x : rot.x), objRot[1] = (adjust ? objRot[1] + rot.y : rot.y), objRot[2] = (adjust ? objRot[2] + rot.z : rot.z);
-            return;
-         }
+            // rotate physically iff renderer confirm so
+            float *objRot = ptr.getRefData().getPosition().rot;
+            objRot[0] = rot.x, objRot[1] = rot.y, objRot[2] = rot.z;
 
-        // do this after rendering rotated the object so it gets changed by Class->adjustRotation
-        objRot[0] = rot.x, objRot[1] = rot.y, objRot[2] = rot.z;
-        mPhysics->rotateObject(ptr);
+            if (ptr.getRefData().getBaseNode() != 0) {
+                mPhysics->rotateObject(ptr);
+            }
+        }
     }
 
     void World::safePlaceObject(const MWWorld::Ptr& ptr,MWWorld::CellStore &Cell,ESM::Position pos)

From 5f2c8970014a0c0719be67d9e2453f2323ce2731 Mon Sep 17 00:00:00 2001
From: Chris Robinson <chris.kcat@gmail.com>
Date: Mon, 25 Feb 2013 10:29:48 -0800
Subject: [PATCH 08/20] Better handle which collision shapes to load

---
 components/nifbullet/bullet_nif_loader.cpp | 25 ++++++++++++----------
 1 file changed, 14 insertions(+), 11 deletions(-)

diff --git a/components/nifbullet/bullet_nif_loader.cpp b/components/nifbullet/bullet_nif_loader.cpp
index a619bdda23..3d9c16ebbf 100644
--- a/components/nifbullet/bullet_nif_loader.cpp
+++ b/components/nifbullet/bullet_nif_loader.cpp
@@ -155,6 +155,8 @@ void ManualBulletShapeLoader::handleNode(const Nif::Node *node, int flags,
     // the flags we currently use, at least.
     flags |= node->flags;
 
+    isCollisionNode = isCollisionNode || (node->recType == Nif::RC_RootCollisionNode);
+
     // Marker objects: no collision
     /// \todo don't do this in the editor
     if (node->name.find("marker") != std::string::npos)
@@ -191,25 +193,26 @@ void ManualBulletShapeLoader::handleNode(const Nif::Node *node, int flags,
         }
     }
 
-    if(node->hasBounds)
+    if(!hasCollisionNode || isCollisionNode)
     {
-        cShape->boxTranslation = node->boundPos;
-        cShape->boxRotation = node->boundRot;
-        mBoundingBox = new btBoxShape(getbtVector(node->boundXYZ));
-    }
+        if(node->hasBounds)
+        {
+            cShape->boxTranslation = node->boundPos;
+            cShape->boxRotation = node->boundRot;
+            mBoundingBox = new btBoxShape(getbtVector(node->boundXYZ));
+        }
 
-    if(node->recType == Nif::RC_NiTriShape && (isCollisionNode || !hasCollisionNode))
-    {
-        cShape->mCollide = !(flags&0x800);
-        handleNiTriShape(static_cast<const Nif::NiTriShape*>(node), flags, node->getWorldTransform(), raycastingOnly);
+        if(node->recType == Nif::RC_NiTriShape)
+        {
+            cShape->mCollide = !(flags&0x800);
+            handleNiTriShape(static_cast<const Nif::NiTriShape*>(node), flags, node->getWorldTransform(), raycastingOnly);
+        }
     }
 
     // For NiNodes, loop through children
     const Nif::NiNode *ninode = dynamic_cast<const Nif::NiNode*>(node);
     if(ninode)
     {
-        isCollisionNode = isCollisionNode || (node->recType == Nif::RC_RootCollisionNode);
-
         const Nif::NodeList &list = ninode->children;
         for(size_t i = 0;i < list.length();i++)
         {

From da575b181e4f6929b97d0255ccc8dec1f8362b6e Mon Sep 17 00:00:00 2001
From: Chris Robinson <chris.kcat@gmail.com>
Date: Mon, 25 Feb 2013 13:04:17 -0800
Subject: [PATCH 09/20] Use the correct GMST for the race menu

---
 apps/openmw/mwgui/race.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/apps/openmw/mwgui/race.cpp b/apps/openmw/mwgui/race.cpp
index 699c687ff6..71a4d1b3e4 100644
--- a/apps/openmw/mwgui/race.cpp
+++ b/apps/openmw/mwgui/race.cpp
@@ -61,7 +61,7 @@ RaceDialog::RaceDialog(MWBase::WindowManager& parWindowManager)
     prevButton->eventMouseButtonClick += MyGUI::newDelegate(this, &RaceDialog::onSelectPreviousHair);
     nextButton->eventMouseButtonClick += MyGUI::newDelegate(this, &RaceDialog::onSelectNextHair);
 
-    setText("RaceT", mWindowManager.getGameSettingString("sRaceMenu4", "Race"));
+    setText("RaceT", mWindowManager.getGameSettingString("sRaceMenu5", "Race"));
     getWidget(mRaceList, "RaceList");
     mRaceList->setScrollVisible(true);
     mRaceList->eventListSelectAccept += MyGUI::newDelegate(this, &RaceDialog::onSelectRace);

From 429bc23cf6c2bc763213cb6d1052ee398f374391 Mon Sep 17 00:00:00 2001
From: Chris Robinson <chris.kcat@gmail.com>
Date: Mon, 25 Feb 2013 13:08:40 -0800
Subject: [PATCH 10/20] Convert the 0-1 glossiness parameter to 0-255 for
 shininess

---
 components/nifogre/ogre_nif_loader.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/components/nifogre/ogre_nif_loader.cpp b/components/nifogre/ogre_nif_loader.cpp
index 826d247c6f..fd376045f3 100644
--- a/components/nifogre/ogre_nif_loader.cpp
+++ b/components/nifogre/ogre_nif_loader.cpp
@@ -683,7 +683,7 @@ static Ogre::String getMaterial(const Nif::NiTriShape *shape, const Ogre::String
         new sh::Vector4(diffuse.x, diffuse.y, diffuse.z, alpha)));
 
     instance->setProperty ("specular", sh::makeProperty<sh::Vector4> (
-        new sh::Vector4(specular.x, specular.y, specular.z, glossiness)));
+        new sh::Vector4(specular.x, specular.y, specular.z, glossiness*255.0f)));
 
     instance->setProperty ("emissive", sh::makeProperty<sh::Vector3> (
         new sh::Vector3(emissive.x, emissive.y, emissive.z)));

From aefd12dfe046f08ab55160ff4248f8576ca8e406 Mon Sep 17 00:00:00 2001
From: Chris Robinson <chris.kcat@gmail.com>
Date: Mon, 25 Feb 2013 15:44:59 -0800
Subject: [PATCH 11/20] Don't create meshes for collision shapes

---
 components/nifogre/ogre_nif_loader.cpp | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/components/nifogre/ogre_nif_loader.cpp b/components/nifogre/ogre_nif_loader.cpp
index fd376045f3..97b297238f 100644
--- a/components/nifogre/ogre_nif_loader.cpp
+++ b/components/nifogre/ogre_nif_loader.cpp
@@ -1031,6 +1031,10 @@ public:
 
     void createMeshes(const Nif::Node *node, MeshInfoList &meshes, int flags=0)
     {
+        // Do not create meshes for the collision shape (includes all children)
+        if(node->recType == Nif::RC_RootCollisionNode)
+            return;
+
         flags |= node->flags;
 
         // Marker objects: just skip the entire node

From a576e9e430b0feaf5c27bce36a3c3313b831a11a Mon Sep 17 00:00:00 2001
From: Chris Robinson <chris.kcat@gmail.com>
Date: Mon, 25 Feb 2013 16:40:08 -0800
Subject: [PATCH 12/20] Set the race selection character preview in a valid
 (idle) pose.

---
 apps/openmw/mwrender/characterpreview.cpp | 6 ++++++
 apps/openmw/mwrender/characterpreview.hpp | 2 ++
 2 files changed, 8 insertions(+)

diff --git a/apps/openmw/mwrender/characterpreview.cpp b/apps/openmw/mwrender/characterpreview.cpp
index 36cac2155d..c32e9d1d68 100644
--- a/apps/openmw/mwrender/characterpreview.cpp
+++ b/apps/openmw/mwrender/characterpreview.cpp
@@ -161,6 +161,7 @@ namespace MWRender
 
     void RaceSelectionPreview::update(float angle)
     {
+        mAnimation->runAnimation(0.0f);
         mNode->roll(Ogre::Radian(angle), Ogre::SceneNode::TS_LOCAL);
 
         mNode->setVisible (true);
@@ -175,4 +176,9 @@ namespace MWRender
         rebuild();
         update(0);
     }
+
+    void RaceSelectionPreview::onSetup ()
+    {
+        mAnimation->play("idle", "start", "stop", false);
+    }
 }
diff --git a/apps/openmw/mwrender/characterpreview.hpp b/apps/openmw/mwrender/characterpreview.hpp
index d07a03be7d..cf1e250692 100644
--- a/apps/openmw/mwrender/characterpreview.hpp
+++ b/apps/openmw/mwrender/characterpreview.hpp
@@ -85,6 +85,8 @@ namespace MWRender
     public:
         RaceSelectionPreview();
 
+        virtual void onSetup();
+
         void update(float angle);
 
         const ESM::NPC &getPrototype() const {

From 955e2713a949e1d65d3c0f1bbf7975048960c8e0 Mon Sep 17 00:00:00 2001
From: Chris Robinson <chris.kcat@gmail.com>
Date: Mon, 25 Feb 2013 17:29:32 -0800
Subject: [PATCH 13/20] Fix encumbrance term calculation

---
 apps/openmw/mwclass/npc.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/apps/openmw/mwclass/npc.cpp b/apps/openmw/mwclass/npc.cpp
index 12b40bfdcf..c8c61e118f 100644
--- a/apps/openmw/mwclass/npc.cpp
+++ b/apps/openmw/mwclass/npc.cpp
@@ -382,7 +382,7 @@ namespace MWClass
         const MWMechanics::MagicEffects &mageffects = npcdata->mCreatureStats.getMagicEffects();
         const float encumbranceTerm = fJumpEncumbranceBase->getFloat() +
                                           fJumpEncumbranceMultiplier->getFloat() *
-                                          (Npc::getEncumbrance(ptr)/Npc::getCapacity(ptr));
+                                          (1.0f - Npc::getEncumbrance(ptr)/Npc::getCapacity(ptr));
 
         float a = npcdata->mNpcStats.getSkill(ESM::Skill::Acrobatics).getModified();
         float b = 0.0f;

From 1a43d86d9e33cb1a8351347d37eaeaedfebca47b Mon Sep 17 00:00:00 2001
From: vorenon <edelmann.manuel@gmail.com>
Date: Tue, 26 Feb 2013 15:58:32 +0100
Subject: [PATCH 14/20] Close messages boxes with the activation key (Bug #589)

---
 apps/openmw/mwinput/inputmanagerimp.cpp | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/apps/openmw/mwinput/inputmanagerimp.cpp b/apps/openmw/mwinput/inputmanagerimp.cpp
index f7e1c8a845..5a6998d9ee 100644
--- a/apps/openmw/mwinput/inputmanagerimp.cpp
+++ b/apps/openmw/mwinput/inputmanagerimp.cpp
@@ -179,6 +179,11 @@ namespace MWInput
             case A_Activate:
                 resetIdleTime();
                 activate();
+                if( MWBase::Environment::get().getWindowManager()->isGuiMode()
+                    && MWBase::Environment::get().getWindowManager()->getMode() == MWGui::GM_InterMessageBox ) {
+                        // Pressing the activation key when a messagebox is prompting for "ok" will activate the ok button
+                        MWBase::Environment::get().getWindowManager()->enterPressed();
+                    }
                 break;
             case A_Journal:
                 toggleJournal ();

From b1ca719d61b4df9b5ebcfd58457640febbd7da51 Mon Sep 17 00:00:00 2001
From: vorenon <edelmann.manuel@gmail.com>
Date: Tue, 26 Feb 2013 16:37:59 +0100
Subject: [PATCH 15/20] Added click sound to OK button for message boxes

---
 apps/openmw/mwgui/messagebox.cpp | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/apps/openmw/mwgui/messagebox.cpp b/apps/openmw/mwgui/messagebox.cpp
index 896ab3bb56..0ee042e326 100644
--- a/apps/openmw/mwgui/messagebox.cpp
+++ b/apps/openmw/mwgui/messagebox.cpp
@@ -1,6 +1,8 @@
 #include <components/misc/stringops.hpp>
 
 #include "messagebox.hpp"
+#include "../mwbase/environment.hpp"
+#include "../mwbase/soundmanager.hpp"
 
 using namespace MWGui;
 
@@ -375,6 +377,7 @@ void InteractiveMessageBox::enterPressed()
         if(Misc::StringUtils::lowerCase((*button)->getCaption()) == ok)
         {
             buttonActivated(*button);
+            MWBase::Environment::get().getSoundManager()->playSound("Menu Click", 1.f, 1.f);
             break;
         }
     }

From fb990b5e69d96865f490f5ea4f747ad64d571a51 Mon Sep 17 00:00:00 2001
From: Marc Zinnschlag <marc@zpages.de>
Date: Tue, 26 Feb 2013 17:08:34 +0100
Subject: [PATCH 16/20] updated credits file

---
 credits.txt | 1 +
 1 file changed, 1 insertion(+)

diff --git a/credits.txt b/credits.txt
index 535e922ae1..027dc09860 100644
--- a/credits.txt
+++ b/credits.txt
@@ -34,6 +34,7 @@ lazydev
 Leon Saunders (emoose)
 Lukasz Gromanowski (lgro)
 Marcin Hulist (Gohan)
+Manuel Edelmann (vorenon)
 Michael Mc Donnell
 Michael Papageorgiou (werdanith)
 Nathan Jeffords (blunted2night)

From cd99e9d952d9a2b2b3f24425e678a83a1c9dd73c Mon Sep 17 00:00:00 2001
From: pvdk <pvdkloet@gmail.com>
Date: Tue, 26 Feb 2013 17:28:39 +0100
Subject: [PATCH 17/20] Updated credits.txt and corrected license info in
 readme.txt

---
 credits.txt | 58 +++++++++++++++++++++++++++++++++++------------------
 readme.txt  |  2 +-
 2 files changed, 40 insertions(+), 20 deletions(-)

diff --git a/credits.txt b/credits.txt
index 027dc09860..6f7e72aa1c 100644
--- a/credits.txt
+++ b/credits.txt
@@ -12,66 +12,74 @@ Marc Zinnschlag (Zini) - Lead Programmer/Project Manager
 
 Adam Hogan (aurix)
 Aleksandar Jovanov
+Alexander Nadeau (wareya)
 Alexander Olofsson (Ace)
 Artem Kotsynyak (greye)
 athile
 BrotherBrick
-Chris Robinson
+Chris Robinson (KittyCat)
 Cory F. Cohen (cfcohen)
 Cris Mihalache (Mirceam)
 Douglas Diniz (Dgdiniz)
+Douglas Mencken (dougmencken)
+Edmondo Tommasina (edmondo)
 Eduard Cot (trombonecot)
 Eli2
-Emanuel "potatoesmaster" Guével
-gugus / gus
+Emanuel Guével (potatoesmaster)
+gugus/gus
 Jacob Essex (Yacoby)
 Jannik Heller (scrawl)
 Jason Hooks (jhooks)
 Joel Graff (graffy)
+Jordan Milne
+Julien Voisin (jvoisin/ap0)
 Karl-Felix Glatzer (k1ll)
 Lars Söderberg (Lazaroth)
 lazydev
 Leon Saunders (emoose)
 Lukasz Gromanowski (lgro)
 Marcin Hulist (Gohan)
+Mark Siewert (mark76)
 Manuel Edelmann (vorenon)
 Michael Mc Donnell
 Michael Papageorgiou (werdanith)
 Nathan Jeffords (blunted2night)
 Nikolay Kasyanov (corristo)
+Nolan Poe (nopoe)
+Paul McElroy (Greendogo)
 Pieter van der Kloet (pvdk)
+Radu-Marius Popovici (rpopovici)
 Roman Melnik (Kromgart)
+Sandy Carter (bwrsandman)
 Sebastian Wick (swick)
 Sergey Shambir
-Sylvain T. (Garvek)
+Sylvain Thesnieres (Garvek)
 Tom Mason (wheybags)
 
+
 Packagers:
 Alexander Olofsson (Ace) - Windows
 BrotherBrick - Ubuntu Linux
-Edmondo Tommasina - Gentoo Linux
+Edmondo Tommasina (edmondo) - Gentoo Linux
+Julian Ospald (hasufell) - Gentoo Linux
+Karl-Felix Glatzer (k1ll) - Linux Binaries
 Kenny Armstrong (artorius) - Fedora Linux
 Nikolay Kasyanov (corristo) - Mac OS X
 Sandy Carter (bwrsandman) - Arch Linux
 
 
-Public Relations:
-ElderTroll - Release Manager
-sir_herrbatka - News Writer
+Public Relations and Translations:
+Julien Voisin (jvoisin/ap0) - French News Writer
+Artem Kotsynyak (greye) - Russian News Writer
+Pithorn - Chinese News Writer
+sir_herrbatka - English/Polish News Writer
 WeirdSexy - Podcaster
 
 
 Website:
-juanmnzsk8 - Spanish News Writer
-Julien Voisin (jvoisin/ap0) - French News Writer
-Kingpix - Italian News Writer
 Lukasz Gromanowski (lgro) - Website Administrator
-Nikolay Kasyanov (corristo) - Russian News Writer
-Okulo - Dutch News Writer
-penguinroad - Indonesian News Writer
 Ryan Sardonic (Wry) - Wiki Editor
-sir_herrbatka - Forum Admin/Polish News Writer
-spyboot - German News Writer
+sir_herrbatka - Forum Administrator
 
 
 Formula Research:
@@ -87,20 +95,32 @@ Sadler
 
 Artwork:
 Necrod - OpenMW Logo
-raevol - Wordpress Theme
-
+Mickey Lyle (raevol) - Wordpress Theme
+Okulo - OpenMW Editor Icons
 
 Inactive Contributors:
 Ardekantur
 Armin Preiml
+Carl Maxwell
 Diggory Hardy
-Jan Borsodi
+Dmitry Marakasov (AMDmi3)
+ElderTroll
+guidoj
 Jan-Peter Nilsson (peppe)
+Jan Borsodi
 Josua Grawitter
+juanmnzsk8
+Kingpix
 Lordrea
+Michal Sciubidlo
 Nicolay Korslund
+pchan3
+penguinroad
+psi29a
 sergoz
+spyboot
 Star-Demon
+Thoronador
 Yuri Krupenin
 
 
diff --git a/readme.txt b/readme.txt
index 3124744c30..228278a919 100644
--- a/readme.txt
+++ b/readme.txt
@@ -9,7 +9,7 @@ Website: http://www.openmw.org
 
 Font Licenses:
 EBGaramond-Regular.ttf: OFL (see OFL.txt for more information)
-VeraMono.ttf: custom (see Bitstream Vera License.txt for more information)
+DejaVuLGCSansMono.ttf: custom (see DejaVu Font License.txt for more information)
 
 
 

From 21f502e3ddf191d67ff5569ac846a01574dcedc5 Mon Sep 17 00:00:00 2001
From: Nathan Jeffords <blunted2night@gmail.com>
Date: Tue, 26 Feb 2013 09:36:56 -0800
Subject: [PATCH 18/20] properly handle potentially non 16 bit planar audio
 formats

---
 apps/openmw/mwsound/ffmpeg_decoder.cpp | 19 ++++++++++++++-----
 1 file changed, 14 insertions(+), 5 deletions(-)

diff --git a/apps/openmw/mwsound/ffmpeg_decoder.cpp b/apps/openmw/mwsound/ffmpeg_decoder.cpp
index 54df45ff4c..7e8751c598 100644
--- a/apps/openmw/mwsound/ffmpeg_decoder.cpp
+++ b/apps/openmw/mwsound/ffmpeg_decoder.cpp
@@ -134,6 +134,18 @@ size_t FFmpeg_Decoder::readAVAudioData(void *data, size_t length)
     return dec;
 }
 
+static AVSampleFormat ffmpegNonPlanarSampleFormat (AVSampleFormat format)
+{
+    switch (format)
+    {
+    case AV_SAMPLE_FMT_U8P:  return AV_SAMPLE_FMT_U8;
+    case AV_SAMPLE_FMT_S16P: return AV_SAMPLE_FMT_S16;
+    case AV_SAMPLE_FMT_S32P: return AV_SAMPLE_FMT_S32;
+    case AV_SAMPLE_FMT_FLTP: return AV_SAMPLE_FMT_FLT;
+    case AV_SAMPLE_FMT_DBLP: return AV_SAMPLE_FMT_DBL;
+    default:return format;
+    }
+}
 
 void FFmpeg_Decoder::open(const std::string &fname)
 {
@@ -153,10 +165,6 @@ void FFmpeg_Decoder::open(const std::string &fname)
 
     try
     {
-        for(size_t j = 0;j < mFormatCtx->nb_streams;j++)
-            if(mFormatCtx->streams[j]->codec->codec_type == AVMEDIA_TYPE_AUDIO)
-                mFormatCtx->streams[j]->codec->request_sample_fmt = AV_SAMPLE_FMT_S16;
-
         if(avformat_find_stream_info(mFormatCtx, NULL) < 0)
             fail("Failed to find stream info in "+fname);
 
@@ -164,7 +172,6 @@ void FFmpeg_Decoder::open(const std::string &fname)
         {
             if(mFormatCtx->streams[j]->codec->codec_type == AVMEDIA_TYPE_AUDIO)
             {
-                mFormatCtx->streams[j]->codec->request_sample_fmt = AV_SAMPLE_FMT_S16;
                 mStream = &mFormatCtx->streams[j];
                 break;
             }
@@ -172,6 +179,8 @@ void FFmpeg_Decoder::open(const std::string &fname)
         if(!mStream)
             fail("No audio streams in "+fname);
 
+        (*mStream)->codec->request_sample_fmt = ffmpegNonPlanarSampleFormat ((*mStream)->codec->sample_fmt);
+
         AVCodec *codec = avcodec_find_decoder((*mStream)->codec->codec_id);
         if(!codec)
         {

From ceafcc2ebbc4a86e4f5cbc6f188658a10fdc58b4 Mon Sep 17 00:00:00 2001
From: Chris Robinson <chris.kcat@gmail.com>
Date: Tue, 26 Feb 2013 10:19:33 -0800
Subject: [PATCH 19/20] Support float samples with ffmpeg

Requires the AL_EXT_FLOAT32 extension in OpenAL
---
 apps/openmw/mwrender/videoplayer.cpp    |  2 ++
 apps/openmw/mwsound/ffmpeg_decoder.cpp  |  2 ++
 apps/openmw/mwsound/openal_output.cpp   | 45 +++++++++++++++++++++++++
 apps/openmw/mwsound/sound_decoder.hpp   |  3 +-
 apps/openmw/mwsound/soundmanagerimp.cpp |  2 ++
 5 files changed, 53 insertions(+), 1 deletion(-)

diff --git a/apps/openmw/mwrender/videoplayer.cpp b/apps/openmw/mwrender/videoplayer.cpp
index b710225042..a0dedb6bc2 100644
--- a/apps/openmw/mwrender/videoplayer.cpp
+++ b/apps/openmw/mwrender/videoplayer.cpp
@@ -404,6 +404,8 @@ public:
             *type = MWSound::SampleType_UInt8;
         else if(mAVStream->codec->sample_fmt == AV_SAMPLE_FMT_S16)
             *type = MWSound::SampleType_Int16;
+        else if(mAVStream->codec->sample_fmt == AV_SAMPLE_FMT_FLT)
+            *type = MWSound::SampleType_Float32;
         else
             fail(std::string("Unsupported sample format: ")+
                  av_get_sample_fmt_name(mAVStream->codec->sample_fmt));
diff --git a/apps/openmw/mwsound/ffmpeg_decoder.cpp b/apps/openmw/mwsound/ffmpeg_decoder.cpp
index 54df45ff4c..8c857f4ea1 100644
--- a/apps/openmw/mwsound/ffmpeg_decoder.cpp
+++ b/apps/openmw/mwsound/ffmpeg_decoder.cpp
@@ -224,6 +224,8 @@ void FFmpeg_Decoder::getInfo(int *samplerate, ChannelConfig *chans, SampleType *
         *type = SampleType_UInt8;
     else if((*mStream)->codec->sample_fmt == AV_SAMPLE_FMT_S16)
         *type = SampleType_Int16;
+    else if((*mStream)->codec->sample_fmt == AV_SAMPLE_FMT_FLT)
+        *type = SampleType_Float32;
     else
         fail(std::string("Unsupported sample format: ")+
              av_get_sample_fmt_name((*mStream)->codec->sample_fmt));
diff --git a/apps/openmw/mwsound/openal_output.cpp b/apps/openmw/mwsound/openal_output.cpp
index 67008e2bcd..1dc5f9974f 100644
--- a/apps/openmw/mwsound/openal_output.cpp
+++ b/apps/openmw/mwsound/openal_output.cpp
@@ -88,6 +88,51 @@ static ALenum getALFormat(ChannelConfig chans, SampleType type)
             }
         }
     }
+    if(alIsExtensionPresent("AL_EXT_FLOAT32"))
+    {
+        static const struct {
+            char name[32];
+            ChannelConfig chans;
+            SampleType type;
+        } fltfmtlist[] = {
+            { "AL_FORMAT_MONO_FLOAT32",   ChannelConfig_Mono,   SampleType_Float32 },
+            { "AL_FORMAT_STEREO_FLOAT32", ChannelConfig_Stereo, SampleType_Float32 },
+        };
+        static const size_t fltfmtlistsize = sizeof(fltfmtlist)/sizeof(fltfmtlist[0]);
+
+        for(size_t i = 0;i < fltfmtlistsize;i++)
+        {
+            if(fltfmtlist[i].chans == chans && fltfmtlist[i].type == type)
+            {
+                ALenum format = alGetEnumValue(fltfmtlist[i].name);
+                if(format != 0 && format != -1)
+                    return format;
+            }
+        }
+        if(alIsExtensionPresent("AL_EXT_MCFORMATS"))
+        {
+            static const struct {
+                char name[32];
+                ChannelConfig chans;
+                SampleType type;
+            } fltmcfmtlist[] = {
+                { "AL_FORMAT_QUAD32",  ChannelConfig_Quad,    SampleType_Float32 },
+                { "AL_FORMAT_51CHN32", ChannelConfig_5point1, SampleType_Float32 },
+                { "AL_FORMAT_71CHN32", ChannelConfig_7point1, SampleType_Float32 },
+            };
+            static const size_t fltmcfmtlistsize = sizeof(fltmcfmtlist)/sizeof(fltmcfmtlist[0]);
+
+            for(size_t i = 0;i < fltmcfmtlistsize;i++)
+            {
+                if(fltmcfmtlist[i].chans == chans && fltmcfmtlist[i].type == type)
+                {
+                    ALenum format = alGetEnumValue(fltmcfmtlist[i].name);
+                    if(format != 0 && format != -1)
+                        return format;
+                }
+            }
+        }
+    }
 
     fail(std::string("Unsupported sound format (")+getChannelConfigName(chans)+", "+getSampleTypeName(type)+")");
     return AL_NONE;
diff --git a/apps/openmw/mwsound/sound_decoder.hpp b/apps/openmw/mwsound/sound_decoder.hpp
index 29d99e8fa4..151b580360 100644
--- a/apps/openmw/mwsound/sound_decoder.hpp
+++ b/apps/openmw/mwsound/sound_decoder.hpp
@@ -9,7 +9,8 @@ namespace MWSound
 {
     enum SampleType {
         SampleType_UInt8,
-        SampleType_Int16
+        SampleType_Int16,
+        SampleType_Float32
     };
     const char *getSampleTypeName(SampleType type);
 
diff --git a/apps/openmw/mwsound/soundmanagerimp.cpp b/apps/openmw/mwsound/soundmanagerimp.cpp
index c502906808..1b07dfe627 100644
--- a/apps/openmw/mwsound/soundmanagerimp.cpp
+++ b/apps/openmw/mwsound/soundmanagerimp.cpp
@@ -607,6 +607,7 @@ namespace MWSound
         {
             case SampleType_UInt8: return "U8";
             case SampleType_Int16: return "S16";
+            case SampleType_Float32: return "Float32";
         }
         return "(unknown sample type)";
     }
@@ -638,6 +639,7 @@ namespace MWSound
         {
             case SampleType_UInt8: frames *= 1; break;
             case SampleType_Int16: frames *= 2; break;
+            case SampleType_Float32: frames *= 4; break;
         }
         return frames;
     }

From 6b86db6b6fa7ff0a5020a4d95baa0da6ee6e9567 Mon Sep 17 00:00:00 2001
From: pvdk <pvdkloet@gmail.com>
Date: Tue, 26 Feb 2013 20:49:20 +0100
Subject: [PATCH 20/20] Forgot the release manager and added the license terms
 of EB Garamond

---
 credits.txt | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/credits.txt b/credits.txt
index 6f7e72aa1c..d1e85c6904 100644
--- a/credits.txt
+++ b/credits.txt
@@ -69,8 +69,9 @@ Sandy Carter (bwrsandman) - Arch Linux
 
 
 Public Relations and Translations:
-Julien Voisin (jvoisin/ap0) - French News Writer
 Artem Kotsynyak (greye) - Russian News Writer
+Julien Voisin (jvoisin/ap0) - French News Writer
+Mickey Lyle (raevol) - Release Manager
 Pithorn - Chinese News Writer
 sir_herrbatka - English/Polish News Writer
 WeirdSexy - Podcaster
@@ -138,7 +139,7 @@ Thanks to Kevin Ryan,
 for creating the icon used for the Data Files tab of the OpenMW Launcher.
 
 Thanks to Georg Duffner,
-for the open-source EB Garamond fontface.
+for his EB Garamond fontface, see OFL.txt for his license terms.
 
 Thanks to Dongle,
 for his Daedric fontface, see Daedric Font License.txt for his license terms.