From 73f9e14b4326042dd218abd11f72eb46339c3a29 Mon Sep 17 00:00:00 2001
From: Robert Adams
Date: Mon, 23 Jul 2012 09:30:28 -0700
Subject: BulletSim: improve linking to add each link individually rather than
 rebuilding the object each time. Makes it an O(n) operation rather than
 O(n\!).

---
 OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs | 136 ++++++++++++++-----------
 1 file changed, 76 insertions(+), 60 deletions(-)

(limited to 'OpenSim')

diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs b/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs
index 71a4303..a749a97 100644
--- a/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs
@@ -149,22 +149,26 @@ public sealed class BSPrim : PhysicsActor
     {
         // m_log.DebugFormat("{0}: Destroy, id={1}", LogHeader, LocalID);
         // DetailLog("{0},Destroy", LocalID);
+
         // Undo any vehicle properties
         _vehicle.ProcessTypeChange(Vehicle.TYPE_NONE);
         _scene.RemoveVehiclePrim(this);     // just to make sure
 
-        // undo any dependance with/on other objects
-        if (_parentPrim != null)
-        {
-            // If I'm someone's child, tell them to forget about me.
-            _parentPrim.RemoveChildFromLinkset(this);
-            _parentPrim = null;
-        }
-
         _scene.TaintedObject(delegate()
         {
+            // undo any dependance with/on other objects
+            if (_parentPrim != null)
+            {
+                // If I'm someone's child, tell them to forget about me.
+                _parentPrim.RemoveChildFromLinkset(this);
+                _parentPrim = null;
+            }
+
+            // make sure there are no possible children depending on me
+            UnlinkAllChildren();
+
             // everything in the C# world will get garbage collected. Tell the C++ world to free stuff.
-            BulletSimAPI.DestroyObject(_scene.WorldID, _localID);
+            BulletSimAPI.DestroyObject(_scene.WorldID, LocalID);
         });
     }
     
@@ -272,7 +276,8 @@ public sealed class BSPrim : PhysicsActor
                 DetailLog("{0},AddChildToLinkset,child={1}", LocalID, pchild.LocalID);
                 _childrenPrims.Add(child);
                 child._parentPrim = this;    // the child has gained a parent
-                RecreateGeomAndObject();    // rebuild my shape with the new child added
+                // RecreateGeomAndObject();    // rebuild my shape with the new child added
+                LinkAChildToMe(pchild);     // build the physical binding between me and the child
             }
         });
         return;
@@ -289,13 +294,18 @@ public sealed class BSPrim : PhysicsActor
             {
                 DebugLog("{0}: RemoveChildFromLinkset: Removing constraint to {1}", LogHeader, child.LocalID);
                 DetailLog("{0},RemoveChildToLinkset,child={1}", LocalID, pchild.LocalID);
-                if (!BulletSimAPI.RemoveConstraintByID(_scene.WorldID, child.LocalID))
-                {
-                    m_log.ErrorFormat("{0}: RemoveChildFromLinkset: Failed remove constraint for {1}", LogHeader, child.LocalID);
-                }
                 _childrenPrims.Remove(child);
                 child._parentPrim = null;    // the child has lost its parent
-                RecreateGeomAndObject();    // rebuild my shape with the child removed
+                if (_childrenPrims.Count == 0)
+                {
+                    // if the linkset is empty, make sure all linkages have been removed
+                    UnlinkAllChildren();
+                }
+                else
+                {
+                    // RecreateGeomAndObject();    // rebuild my shape with the child removed
+                    UnlinkAChildFromMe(pchild);
+                }
             }
             else
             {
@@ -1247,30 +1257,6 @@ public sealed class BSPrim : PhysicsActor
         }
     }
 
-    // Create a linkset by creating a compound hull at the root prim that consists of all
-    // the children.
-    // NOTE: This does not allow proper collisions with the children prims so it is not a workable solution
-    void CreateLinksetWithCompoundHull()
-    {
-        // If I am the root prim of a linkset, replace my physical shape with all the
-        // pieces of the children.
-        // All of the children should have called CreateGeom so they have a hull
-        // in the physics engine already. Here we pull together all of those hulls
-        // into one shape.
-        int totalPrimsInLinkset = _childrenPrims.Count + 1;
-        // m_log.DebugFormat("{0}: CreateLinkset. Root prim={1}, prims={2}", LogHeader, LocalID, totalPrimsInLinkset);
-        ShapeData[] shapes = new ShapeData[totalPrimsInLinkset];
-        FillShapeInfo(out shapes[0]);
-        int ii = 1;
-        foreach (BSPrim prim in _childrenPrims)
-        {
-            // m_log.DebugFormat("{0}: CreateLinkset: adding prim {1}", LogHeader, prim.LocalID);
-            prim.FillShapeInfo(out shapes[ii]);
-            ii++;
-        }
-        BulletSimAPI.CreateLinkset(_scene.WorldID, totalPrimsInLinkset, shapes);
-    }
-
     // Copy prim's info into the BulletSim shape description structure
     public void FillShapeInfo(out ShapeData shape)
     {
@@ -1290,9 +1276,10 @@ public sealed class BSPrim : PhysicsActor
         shape.Static = _isPhysical ? ShapeData.numericFalse : ShapeData.numericTrue;
     }
 
+    #region Linkset creation and destruction
+
     // Create the linkset by putting constraints between the objects of the set so they cannot move
     // relative to each other.
-    // TODO: make this more effeicient: a large linkset gets rebuilt over and over and prims are added
     void CreateLinksetWithConstraints()
     {
         DebugLog("{0}: CreateLinkset. Root prim={1}, prims={2}", LogHeader, LocalID, _childrenPrims.Count+1);
@@ -1306,29 +1293,58 @@ public sealed class BSPrim : PhysicsActor
         // create constraints between the root prim and each of the children
         foreach (BSPrim prim in _childrenPrims)
         {
-            // Zero motion for children so they don't interpolate
-            prim.ZeroMotion();
-
-            // relative position normalized to the root prim
-            OMV.Quaternion invThisOrientation = OMV.Quaternion.Inverse(this._orientation);
-            OMV.Vector3 childRelativePosition = (prim._position - this._position) * invThisOrientation;
-
-            // relative rotation of the child to the parent
-            OMV.Quaternion childRelativeRotation = invThisOrientation * prim._orientation;
-
-            // this is a constraint that allows no freedom of movement between the two objects
-            // http://bulletphysics.org/Bullet/phpBB3/viewtopic.php?t=4818
-            DebugLog("{0}: CreateLinkset: Adding a constraint between root prim {1} and child prim {2}", LogHeader, LocalID, prim.LocalID);
-            BulletSimAPI.AddConstraint(_scene.WorldID, LocalID, prim.LocalID, 
-                childRelativePosition,
-                childRelativeRotation,
-                OMV.Vector3.Zero,
-                OMV.Quaternion.Identity,
-                OMV.Vector3.Zero, OMV.Vector3.Zero,
-                OMV.Vector3.Zero, OMV.Vector3.Zero);
+            LinkAChildToMe(prim);
         }
     }
 
+    // Create a constraint between me (root of linkset) and the passed prim (the child).
+    // Called at taint time!
+    private void LinkAChildToMe(BSPrim childPrim)
+    {
+        // Zero motion for children so they don't interpolate
+        childPrim.ZeroMotion();
+
+        // relative position normalized to the root prim
+        OMV.Quaternion invThisOrientation = OMV.Quaternion.Inverse(this._orientation);
+        OMV.Vector3 childRelativePosition = (childPrim._position - this._position) * invThisOrientation;
+
+        // relative rotation of the child to the parent
+        OMV.Quaternion childRelativeRotation = invThisOrientation * childPrim._orientation;
+
+        // create a constraint that allows no freedom of movement between the two objects
+        // http://bulletphysics.org/Bullet/phpBB3/viewtopic.php?t=4818
+        DebugLog("{0}: CreateLinkset: Adding a constraint between root prim {1} and child prim {2}", LogHeader, LocalID, childPrim.LocalID);
+        DetailLog("{0},LinkAChildToMe,taint,root={1},child={2}", LocalID, LocalID, childPrim.LocalID);
+        BulletSimAPI.AddConstraint(_scene.WorldID, LocalID, childPrim.LocalID, 
+            childRelativePosition,
+            childRelativeRotation,
+            OMV.Vector3.Zero,
+            OMV.Quaternion.Identity,
+            OMV.Vector3.Zero, OMV.Vector3.Zero,
+            OMV.Vector3.Zero, OMV.Vector3.Zero);
+    }
+
+    // Remove linkage between myself and a particular child
+    // Called at taint time!
+    private void UnlinkAChildFromMe(BSPrim childPrim)
+    {
+        DebugLog("{0}: UnlinkAChildFromMe: RemoveConstraint between root prim {1} and child prim {2}", 
+                    LogHeader, LocalID, childPrim.LocalID);
+        DetailLog("{0},UnlinkAChildFromMe,taint,root={1},child={2}", LocalID, LocalID, childPrim.LocalID);
+        BulletSimAPI.RemoveConstraint(_scene.WorldID, LocalID, childPrim.LocalID);
+    }
+
+    // Remove linkage between myself and any possible children I might have
+    // Called at taint time!
+    private void UnlinkAllChildren()
+    {
+        DebugLog("{0}: UnlinkAllChildren:", LogHeader);
+        DetailLog("{0},UnlinkAllChildren,taint", LocalID);
+        BulletSimAPI.RemoveConstraintByID(_scene.WorldID, LocalID);
+    }
+
+    #endregion // Linkset creation and destruction
+
     // Rebuild the geometry and object.
     // This is called when the shape changes so we need to recreate the mesh/hull.
     // No locking here because this is done when the physics engine is not simulating
-- 
cgit v1.1


From 85c6eb7c500b708ab0a91965eca9da20b0b02e50 Mon Sep 17 00:00:00 2001
From: Robert Adams
Date: Mon, 23 Jul 2012 10:37:52 -0700
Subject: BulletSim: add all the new functions to BulletSimAPI. Modify
 ZeroMotion() to not make tainting calls and to use new API calls.

---
 OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs     |  13 +-
 .../Region/Physics/BulletSPlugin/BulletSimAPI.cs   | 132 ++++++++++++++++++++-
 2 files changed, 139 insertions(+), 6 deletions(-)

(limited to 'OpenSim')

diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs b/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs
index a749a97..29ddddd 100644
--- a/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs
@@ -324,11 +324,20 @@ public sealed class BSPrim : PhysicsActor
     // Set motion values to zero.
     // Do it to the properties so the values get set in the physics engine.
     // Push the setting of the values to the viewer.
+    // Called at taint time!
     private void ZeroMotion()
     {
-        Velocity = OMV.Vector3.Zero;
+        _velocity = OMV.Vector3.Zero;
         _acceleration = OMV.Vector3.Zero;
-        RotationalVelocity = OMV.Vector3.Zero;
+        _rotationalVelocity = OMV.Vector3.Zero;
+
+        IntPtr obj = BulletSimAPI.GetBodyHandleWorldID2(_scene.WorldID, LocalID);
+        BulletSimAPI.SetVelocity2(obj, OMV.Vector3.Zero);
+        BulletSimAPI.SetAngularVelocity2(obj, OMV.Vector3.Zero);
+        BulletSimAPI.SetInterpolation2(obj, OMV.Vector3.Zero, OMV.Vector3.Zero);
+        BulletSimAPI.ClearForces2(obj);
+
+        // make sure this new information is pushed to the client
         base.RequestPhysicsterseUpdate();
     }
 
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BulletSimAPI.cs b/OpenSim/Region/Physics/BulletSPlugin/BulletSimAPI.cs
index babb707..54a8cfd 100644
--- a/OpenSim/Region/Physics/BulletSPlugin/BulletSimAPI.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BulletSimAPI.cs
@@ -291,13 +291,14 @@ public static extern void SetDebugLogCallback(DebugLogCallback callback);
 // ===============================================================================
 // ===============================================================================
 // ===============================================================================
-// A new version of the API that moves all the logic out of the C++ code and into
+// A new version of the API that enables moving all the logic out of the C++ code and into
 //    the C# code. This will make modifications easier for the next person.
 // This interface passes the actual pointers to the objects in the unmanaged
 //    address space. All the management (calls for creation/destruction/lookup)
 //    is done in the C# code.
-// The names have a 2 tacked on. This will be removed as the code gets rebuilt
-//    and the old code is removed from the C# code.
+// The names have a "2" tacked on. This will be removed as the C# code gets rebuilt
+//    and the old code is removed.
+
 [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
 public static extern IntPtr GetSimHandle2(uint worldID);
 
@@ -307,8 +308,101 @@ public static extern IntPtr GetBodyHandleWorldID2(uint worldID, uint id);
 [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
 public static extern IntPtr GetBodyHandle2(IntPtr sim, uint id);
 
+// ===============================================================================
 [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern IntPtr ClearForces2(IntPtr obj);
+public static extern IntPtr Initialize2(Vector3 maxPosition, IntPtr parms,
+											int maxCollisions,  IntPtr collisionArray,
+											int maxUpdates, IntPtr updateArray);
+
+[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+public static extern bool UpdateParameter2(IntPtr sim, uint localID, String parm, float value);
+
+[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+public static extern void SetHeightmap2(IntPtr sim, float[] heightmap);
+
+[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+public static extern void Shutdown2(IntPtr sim);
+
+[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+public static extern int PhysicsStep2(IntPtr sim, float timeStep, int maxSubSteps, float fixedTimeStep,
+                        out int updatedEntityCount, 
+                        out IntPtr updatedEntitiesPtr,
+                        out int collidersCount,
+                        out IntPtr collidersPtr);
+
+/*
+[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+public static extern IntPtr CreateMesh2(IntPtr sim, int indicesCount, int* indices, int verticesCount, float* vertices );
+
+[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+public static extern bool BuildHull2(IntPtr sim, IntPtr mesh);
+
+[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+public static extern bool ReleaseHull2(IntPtr sim, IntPtr mesh);
+
+[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+public static extern bool DestroyMesh2(IntPtr sim, IntPtr mesh);
+
+[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+public static extern IntPtr CreateObject2(IntPtr sim, ShapeData shapeData);
+*/
+
+[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+public static extern IntPtr CreateConstraint2(IntPtr sim, IntPtr obj1, IntPtr obj2,
+                    Vector3 frame1loc, Quaternion frame1rot,
+                    Vector3 frame2loc, Quaternion frame2rot,
+                    Vector3 lowLinear, Vector3 hiLinear, Vector3 lowAngular, Vector3 hiAngular);
+
+[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+public static extern bool DestroyConstraint2(IntPtr sim, IntPtr constrain);
+
+[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+public static extern Vector3 GetPosition2(IntPtr obj);
+
+[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+public static extern Quaternion GetOrientation2(IntPtr obj);
+
+[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+public static extern bool SetTranslation2(IntPtr obj, Vector3 position, Quaternion rotation);
+
+[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+public static extern bool SetVelocity2(IntPtr obj, Vector3 velocity);
+
+[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+public static extern bool SetAngularVelocity2(IntPtr obj, Vector3 angularVelocity);
+
+[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+public static extern bool SetObjectForce2(IntPtr obj, Vector3 force);
+
+[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+public static extern bool SetCcdMotionThreshold2(IntPtr obj, float val);
+
+[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+public static extern bool SetCcdSweepSphereRadius2(IntPtr obj, float val);
+
+[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+public static extern bool SetDamping2(IntPtr obj, float lin_damping, float ang_damping);
+
+[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+public static extern bool SetDeactivationTime2(IntPtr obj, float val);
+
+[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+public static extern bool SetSleepingThresholds2(IntPtr obj, float lin_threshold, float ang_threshold);
+
+[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+public static extern bool SetContactProcessingThreshold2(IntPtr obj, float val);
+
+[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+public static extern bool SetFriction2(IntPtr obj, float val);
+
+[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+public static extern bool SetRestitution2(IntPtr obj, float val);
+
+[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+public static extern bool SetLinearVelocity2(IntPtr obj, Vector3 val);
+
+[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+public static extern bool SetInterpolation2(IntPtr obj, Vector3 lin, Vector3 ang);
 
 [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
 public static extern IntPtr SetCollisionFlags2(IntPtr obj, uint flags);
@@ -319,5 +413,35 @@ public static extern IntPtr AddToCollisionFlags2(IntPtr obj, uint flags);
 [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
 public static extern IntPtr RemoveFromCollisionFlags2(IntPtr obj, uint flags);
 
+[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+public static extern bool SetMassProps2(IntPtr obj, float mass, Vector3 inertia);
+
+[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+public static extern bool UpdateInertiaTensor2(IntPtr obj);
+
+[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+public static extern bool SetGravity2(IntPtr obj, Vector3 val);
+
+[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+public static extern IntPtr ClearForces2(IntPtr obj);
+
+[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+public static extern bool SetMargin2(IntPtr obj, float val);
+
+[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+public static extern bool UpdateSingleAabb2(IntPtr world, IntPtr obj);
+
+[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+public static extern bool AddObjectToWorld2(IntPtr world, IntPtr obj);
+
+[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+public static extern bool RemoveObjectFromWorld2(IntPtr world, IntPtr obj);
+
+[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+public static extern bool DestroyObject2(IntPtr world, uint id);
+
+[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+public static extern void DumpPhysicsStatistics2(IntPtr sim);
+
 }
 }
-- 
cgit v1.1


From 8a574395c7626f0aef596cbb928e0b4139ebab12 Mon Sep 17 00:00:00 2001
From: Robert Adams
Date: Mon, 23 Jul 2012 13:48:40 -0700
Subject: BulletSim: add Dispose() code to free up resources and close log
 files.

---
 OpenSim/Region/Physics/BulletSPlugin/BSScene.cs | 21 +++++++++++++++++++++
 1 file changed, 21 insertions(+)

(limited to 'OpenSim')

diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSScene.cs b/OpenSim/Region/Physics/BulletSPlugin/BSScene.cs
index 8773485..7cc3fe3 100644
--- a/OpenSim/Region/Physics/BulletSPlugin/BSScene.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSScene.cs
@@ -630,6 +630,27 @@ public class BSScene : PhysicsScene, IPhysicsParameters
     public override void Dispose()
     {
         // m_log.DebugFormat("{0}: Dispose()", LogHeader);
+
+        // make sure no stepping happens while we're deleting stuff
+        m_initialized = false;
+
+        foreach (KeyValuePair<uint, BSCharacter> kvp in m_avatars)
+        {
+            kvp.Value.Destroy();
+        }
+        m_avatars.Clear();
+
+        foreach (KeyValuePair<uint, BSPrim> kvp in m_prims)
+        {
+            kvp.Value.Destroy();
+        }
+        m_prims.Clear();
+
+        // Anything left in the unmanaged code should be cleaned out
+        BulletSimAPI.Shutdown(WorldID);
+
+        // Not logging any more
+        PhysicsLogging.Close();
     }
 
     public override Dictionary<uint, float> GetTopColliders()
-- 
cgit v1.1


From dda681515b31e528ae01954a583cd7a7b4e94987 Mon Sep 17 00:00:00 2001
From: Robert Adams
Date: Mon, 23 Jul 2012 13:49:31 -0700
Subject: BulletSim: small optimizations for link and unlink code

---
 OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs | 20 ++++++++------------
 1 file changed, 8 insertions(+), 12 deletions(-)

(limited to 'OpenSim')

diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs b/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs
index 29ddddd..b49b8d9 100644
--- a/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs
@@ -293,7 +293,7 @@ public sealed class BSPrim : PhysicsActor
             if (_childrenPrims.Contains(child))
             {
                 DebugLog("{0}: RemoveChildFromLinkset: Removing constraint to {1}", LogHeader, child.LocalID);
-                DetailLog("{0},RemoveChildToLinkset,child={1}", LocalID, pchild.LocalID);
+                DetailLog("{0},RemoveChildFromLinkset,child={1}", LocalID, pchild.LocalID);
                 _childrenPrims.Remove(child);
                 child._parentPrim = null;    // the child has lost its parent
                 if (_childrenPrims.Count == 0)
@@ -331,14 +331,12 @@ public sealed class BSPrim : PhysicsActor
         _acceleration = OMV.Vector3.Zero;
         _rotationalVelocity = OMV.Vector3.Zero;
 
+        // Zero some other properties directly into the physics engine
         IntPtr obj = BulletSimAPI.GetBodyHandleWorldID2(_scene.WorldID, LocalID);
         BulletSimAPI.SetVelocity2(obj, OMV.Vector3.Zero);
         BulletSimAPI.SetAngularVelocity2(obj, OMV.Vector3.Zero);
         BulletSimAPI.SetInterpolation2(obj, OMV.Vector3.Zero, OMV.Vector3.Zero);
         BulletSimAPI.ClearForces2(obj);
-
-        // make sure this new information is pushed to the client
-        base.RequestPhysicsterseUpdate();
     }
 
     public override void LockAngularMotion(OMV.Vector3 axis)
@@ -1253,7 +1251,7 @@ public sealed class BSPrim : PhysicsActor
         if (IsRootOfLinkset)
         {
             // Create a linkset around this object
-            CreateLinksetWithConstraints();
+            CreateLinkset();
         }
         else
         {
@@ -1289,16 +1287,14 @@ public sealed class BSPrim : PhysicsActor
 
     // Create the linkset by putting constraints between the objects of the set so they cannot move
     // relative to each other.
-    void CreateLinksetWithConstraints()
+    void CreateLinkset()
     {
         DebugLog("{0}: CreateLinkset. Root prim={1}, prims={2}", LogHeader, LocalID, _childrenPrims.Count+1);
 
         // remove any constraints that might be in place
-        foreach (BSPrim prim in _childrenPrims)
-        {
-            DebugLog("{0}: CreateLinkset: RemoveConstraint between root prim {1} and child prim {2}", LogHeader, LocalID, prim.LocalID);
-            BulletSimAPI.RemoveConstraint(_scene.WorldID, LocalID, prim.LocalID);
-        }
+        DebugLog("{0}: CreateLinkset: RemoveConstraints between me and any children", LogHeader, LocalID);
+        BulletSimAPI.RemoveConstraintByID(_scene.WorldID, LocalID);
+
         // create constraints between the root prim and each of the children
         foreach (BSPrim prim in _childrenPrims)
         {
@@ -1430,7 +1426,7 @@ public sealed class BSPrim : PhysicsActor
         // Don't check for damping here -- it's done in BulletSim and SceneObjectPart.
 
         // Updates only for individual prims and for the root object of a linkset.
-        if (this._parentPrim == null)
+        if (_parentPrim == null)
         {
             // Assign to the local variables so the normal set action does not happen
             _position = entprop.Position;
-- 
cgit v1.1


From bf6547be01afbd7f79eea19013cfd068ad87837f Mon Sep 17 00:00:00 2001
From: Robert Adams
Date: Mon, 23 Jul 2012 16:31:12 -0700
Subject: BulletSim: change how prim mass is saved so it is always calculated
 but zero is given if not physical.

---
 OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs | 43 ++++++++++++++------------
 1 file changed, 23 insertions(+), 20 deletions(-)

(limited to 'OpenSim')

diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs b/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs
index b49b8d9..a19d6d7 100644
--- a/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs
@@ -133,10 +133,7 @@ public sealed class BSPrim : PhysicsActor
         _parentPrim = null;     // not a child or a parent
         _vehicle = new BSDynamics(this);    // add vehicleness
         _childrenPrims = new List<BSPrim>();
-        if (_isPhysical)
-            _mass = CalculateMass();
-        else
-            _mass = 0f;
+        _mass = CalculateMass();
         // do the actual object creation at taint time
         _scene.TaintedObject(delegate()
         {
@@ -181,8 +178,8 @@ public sealed class BSPrim : PhysicsActor
             _size = value;
             _scene.TaintedObject(delegate()
             {
-                if (_isPhysical) _mass = CalculateMass();   // changing size changes the mass
-                BulletSimAPI.SetObjectScaleMass(_scene.WorldID, _localID, _scale, _mass, _isPhysical);
+                _mass = CalculateMass();   // changing size changes the mass
+                BulletSimAPI.SetObjectScaleMass(_scene.WorldID, _localID, _scale, Mass, IsPhysical);
                 RecreateGeomAndObject();
             });
         } 
@@ -192,7 +189,7 @@ public sealed class BSPrim : PhysicsActor
             _pbs = value;
             _scene.TaintedObject(delegate()
             {
-                if (_isPhysical) _mass = CalculateMass();   // changing the shape changes the mass
+                _mass = CalculateMass();   // changing the shape changes the mass
                 RecreateGeomAndObject();
             });
         } 
@@ -278,6 +275,8 @@ public sealed class BSPrim : PhysicsActor
                 child._parentPrim = this;    // the child has gained a parent
                 // RecreateGeomAndObject();    // rebuild my shape with the new child added
                 LinkAChildToMe(pchild);     // build the physical binding between me and the child
+
+                _mass = CalculateMass();
             }
         });
         return;
@@ -306,6 +305,8 @@ public sealed class BSPrim : PhysicsActor
                     // RecreateGeomAndObject();    // rebuild my shape with the child removed
                     UnlinkAChildFromMe(pchild);
                 }
+
+                _mass = CalculateMass();
             }
             else
             {
@@ -364,9 +365,17 @@ public sealed class BSPrim : PhysicsActor
             });
         } 
     }
+
+    // Return the effective mass of the object. Non-physical objects do not have mass.
     public override float Mass { 
-        get { return _mass; } 
+        get {
+            if (IsPhysical)
+                return _mass;
+            else
+                return 0f;
+        }
     }
+
     public override OMV.Vector3 Force { 
         get { return _force; } 
         set {
@@ -446,7 +455,8 @@ public sealed class BSPrim : PhysicsActor
     // Called from Scene when doing simulation step so we're in taint processing time.
     public void StepVehicle(float timeStep)
     {
-        _vehicle.Step(timeStep);
+        if (IsPhysical)
+            _vehicle.Step(timeStep);
     }
 
     // Allows the detection of collisions with inherently non-physical prims. see llVolumeDetect for more
@@ -543,20 +553,13 @@ public sealed class BSPrim : PhysicsActor
     {
         // m_log.DebugFormat("{0}: ID={1}, SetObjectDynamic: IsStatic={2}, IsSolid={3}", LogHeader, _localID, IsStatic, IsSolid);
         // non-physical things work best with a mass of zero
-        if (IsStatic)
-        {
-            _mass = 0f;
-        }
-        else
+        if (!IsStatic)
         {
             _mass = CalculateMass();
-            // If it's dynamic, make sure the hull has been created for it
-            // This shouldn't do much work if the object had previously been built
             RecreateGeomAndObject();
-
         }
-        DetailLog("{0},SetObjectDynamic,taint,static={1},solid={2},mass={3}", LocalID, IsStatic, IsSolid, _mass);
-        BulletSimAPI.SetObjectProperties(_scene.WorldID, LocalID, IsStatic, IsSolid, SubscribedEvents(), _mass);
+        DetailLog("{0},SetObjectDynamic,taint,static={1},solid={2},mass={3}", LocalID, IsStatic, IsSolid, Mass);
+        BulletSimAPI.SetObjectProperties(_scene.WorldID, LocalID, IsStatic, IsSolid, SubscribedEvents(), Mass);
     }
 
     // prims don't fly
@@ -1273,7 +1276,7 @@ public sealed class BSPrim : PhysicsActor
         shape.Rotation = _orientation;
         shape.Velocity = _velocity;
         shape.Scale = _scale;
-        shape.Mass = _isPhysical ? _mass : 0f;
+        shape.Mass = Mass;
         shape.Buoyancy = _buoyancy;
         shape.HullKey = _hullKey;
         shape.MeshKey = _meshKey;
-- 
cgit v1.1