From a5360483bbbef3581383d60918f7b3eb754d3e04 Mon Sep 17 00:00:00 2001
From: logzero <core13@gmx.net>
Date: Sun, 25 Dec 2016 15:34:43 +0100
Subject: [PATCH] Back off slightly when we are touching something. This can
 reduce the amount of movement solver failures significantly. I've observed a
 drop of 8 iteration cases by almost factor of ten.

---
 apps/openmw/mwphysics/physicssystem.cpp | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/apps/openmw/mwphysics/physicssystem.cpp b/apps/openmw/mwphysics/physicssystem.cpp
index 2a3cb6137f..db72ac6365 100644
--- a/apps/openmw/mwphysics/physicssystem.cpp
+++ b/apps/openmw/mwphysics/physicssystem.cpp
@@ -395,6 +395,13 @@ namespace MWPhysics
                     break;
                 }
 
+                // We are touching something.
+                if (tracer.mFraction < 1E-9f)
+                {
+                    // Try to separate by backing off slighly to unstuck the solver
+                    const osg::Vec3f backOff = (newPosition - tracer.mHitPoint) * 1E-3f;
+                    newPosition += backOff;
+                }
 
                 // We hit something. Check if we can step up.
                 float hitHeight = tracer.mHitPoint.z() - tracer.mEndPos.z() + halfExtents.z();