From f9fb1484aa00f8bfadead06ce71d004502fb564e Mon Sep 17 00:00:00 2001
From: Robert Adams
Date: Fri, 3 May 2013 15:46:35 -0700
Subject: BulletSim: extend BSActorLockAxis to allow locking linear movement in
 addition to angular movement. Not enabled by anything yet.

---
 .../Physics/BulletSPlugin/BSActorLockAxis.cs       | 25 +++++++++++++++++-----
 .../Region/Physics/BulletSPlugin/BSPhysObject.cs   |  9 +++++---
 OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs     |  4 ++--
 3 files changed, 28 insertions(+), 10 deletions(-)

diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSActorLockAxis.cs b/OpenSim/Region/Physics/BulletSPlugin/BSActorLockAxis.cs
index 7801d8e..8b0fdeb 100755
--- a/OpenSim/Region/Physics/BulletSPlugin/BSActorLockAxis.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSActorLockAxis.cs
@@ -64,9 +64,9 @@ public class BSActorLockAxis : BSActor
     public override void Refresh()
     {
         m_physicsScene.DetailLog("{0},BSActorLockAxis,refresh,lockedAxis={1},enabled={2},pActive={3}",
-                                    m_controllingPrim.LocalID, m_controllingPrim.LockedAxis, Enabled, m_controllingPrim.IsPhysicallyActive);
+                                    m_controllingPrim.LocalID, m_controllingPrim.LockedAngularAxis, Enabled, m_controllingPrim.IsPhysicallyActive);
         // If all the axis are free, we don't need to exist
-        if (m_controllingPrim.LockedAxis == m_controllingPrim.LockedAxisFree)
+        if (m_controllingPrim.LockedAngularAxis == m_controllingPrim.LockedAxisFree)
         {
             Enabled = false;
         }
@@ -123,23 +123,38 @@ public class BSActorLockAxis : BSActor
             // Free to move linearly in the region
             OMV.Vector3 linearLow = OMV.Vector3.Zero;
             OMV.Vector3 linearHigh = m_physicsScene.TerrainManager.DefaultRegionSize;
+            if (m_controllingPrim.LockedLinearAxis.X != BSPhysObject.FreeAxis)
+            {
+                linearLow.X = m_controllingPrim.RawPosition.X;
+                linearHigh.X = m_controllingPrim.RawPosition.X;
+            }
+            if (m_controllingPrim.LockedLinearAxis.Y != BSPhysObject.FreeAxis)
+            {
+                linearLow.Y = m_controllingPrim.RawPosition.Y;
+                linearHigh.Y = m_controllingPrim.RawPosition.Y;
+            }
+            if (m_controllingPrim.LockedLinearAxis.Z != BSPhysObject.FreeAxis)
+            {
+                linearLow.Z = m_controllingPrim.RawPosition.Z;
+                linearHigh.Z = m_controllingPrim.RawPosition.Z;
+            }
             axisConstrainer.SetLinearLimits(linearLow, linearHigh);
 
             // Angular with some axis locked
             float fPI = (float)Math.PI;
             OMV.Vector3 angularLow = new OMV.Vector3(-fPI, -fPI, -fPI);
             OMV.Vector3 angularHigh = new OMV.Vector3(fPI, fPI, fPI);
-            if (m_controllingPrim.LockedAxis.X != 1f)
+            if (m_controllingPrim.LockedAngularAxis.X != BSPhysObject.FreeAxis)
             {
                 angularLow.X = 0f;
                 angularHigh.X = 0f;
             }
-            if (m_controllingPrim.LockedAxis.Y != 1f)
+            if (m_controllingPrim.LockedAngularAxis.Y != BSPhysObject.FreeAxis)
             {
                 angularLow.Y = 0f;
                 angularHigh.Y = 0f;
             }
-            if (m_controllingPrim.LockedAxis.Z != 1f)
+            if (m_controllingPrim.LockedAngularAxis.Z != BSPhysObject.FreeAxis)
             {
                 angularLow.Z = 0f;
                 angularHigh.Z = 0f;
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSPhysObject.cs b/OpenSim/Region/Physics/BulletSPlugin/BSPhysObject.cs
index e796804..cca887a 100755
--- a/OpenSim/Region/Physics/BulletSPlugin/BSPhysObject.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSPhysObject.cs
@@ -108,7 +108,8 @@ public abstract class BSPhysObject : PhysicsActor
         CollisionScore = 0;
 
         // All axis free.
-        LockedAxis = LockedAxisFree;
+        LockedLinearAxis = LockedAxisFree;
+        LockedAngularAxis = LockedAxisFree;
     }
 
     // Tell the object to clean up.
@@ -265,8 +266,10 @@ public abstract class BSPhysObject : PhysicsActor
     // Note this is a displacement from the root's coordinates. Zero means use the root prim as center-of-mass.
     public OMV.Vector3? UserSetCenterOfMassDisplacement { get; set; }
 
-    public OMV.Vector3 LockedAxis { get; set; } // zero means locked. one means free.
-    public readonly OMV.Vector3 LockedAxisFree = new OMV.Vector3(1f, 1f, 1f);  // All axis are free
+    public OMV.Vector3 LockedLinearAxis { get; set; } // zero means locked. one means free.
+    public OMV.Vector3 LockedAngularAxis { get; set; } // zero means locked. one means free.
+    public const float FreeAxis = 1f;
+    public readonly OMV.Vector3 LockedAxisFree = new OMV.Vector3(FreeAxis, FreeAxis, FreeAxis);  // All axis are free
 
     // Enable physical actions. Bullet will keep sleeping non-moving physical objects so
     //     they need waking up when parameters are changed.
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs b/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs
index d3f3475..f5b0361 100644
--- a/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs
@@ -256,9 +256,9 @@ public class BSPrim : BSPhysObject
         if (axis.X != 1) locking.X = 0f;
         if (axis.Y != 1) locking.Y = 0f;
         if (axis.Z != 1) locking.Z = 0f;
-        LockedAxis = locking;
+        LockedAngularAxis = locking;
 
-        EnableActor(LockedAxis != LockedAxisFree, LockedAxisActorName, delegate()
+        EnableActor(LockedAngularAxis != LockedAxisFree, LockedAxisActorName, delegate()
         {
             return new BSActorLockAxis(PhysScene, this, LockedAxisActorName);
         });
-- 
cgit v1.1