diff options
-rwxr-xr-x | OpenSim/Region/Physics/BulletSPlugin/BSLinkset.cs | 20 | ||||
-rw-r--r-- | OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs | 20 |
2 files changed, 32 insertions, 8 deletions
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSLinkset.cs b/OpenSim/Region/Physics/BulletSPlugin/BSLinkset.cs index dc1de6c..3d73887 100755 --- a/OpenSim/Region/Physics/BulletSPlugin/BSLinkset.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSLinkset.cs | |||
@@ -202,6 +202,24 @@ public class BSLinkset | |||
202 | return com; | 202 | return com; |
203 | } | 203 | } |
204 | 204 | ||
205 | // The object is going dynamic (physical). Do any setup necessary | ||
206 | // for a dynamic linkset. | ||
207 | // Return 'true' if any properties updated on the passed object. | ||
208 | // Called at taint-time! | ||
209 | public bool MakeDynamic(BSPhysObject child) | ||
210 | { | ||
211 | return false; | ||
212 | } | ||
213 | |||
214 | // The object is going static (non-physical). Do any setup necessary | ||
215 | // for a static linkset. | ||
216 | // Return 'true' if any properties updated on the passed object. | ||
217 | // Called at taint-time! | ||
218 | public bool MakeStatic(BSPhysObject child) | ||
219 | { | ||
220 | return false; | ||
221 | } | ||
222 | |||
205 | // When physical properties are changed the linkset needs to recalculate | 223 | // When physical properties are changed the linkset needs to recalculate |
206 | // its internal properties. | 224 | // its internal properties. |
207 | public void Refresh(BSPhysObject requestor) | 225 | public void Refresh(BSPhysObject requestor) |
@@ -255,13 +273,11 @@ public class BSLinkset | |||
255 | if (!somethingMissing) | 273 | if (!somethingMissing) |
256 | { | 274 | { |
257 | // The root prim takes on the weight of the whole linkset | 275 | // The root prim takes on the weight of the whole linkset |
258 | /* | ||
259 | OMV.Vector3 inertia = BulletSimAPI.CalculateLocalInertia2(LinksetRoot.BSShape.Ptr, linksetMass); | 276 | OMV.Vector3 inertia = BulletSimAPI.CalculateLocalInertia2(LinksetRoot.BSShape.Ptr, linksetMass); |
260 | BulletSimAPI.SetMassProps2(LinksetRoot.BSBody.Ptr, linksetMass, inertia); | 277 | BulletSimAPI.SetMassProps2(LinksetRoot.BSBody.Ptr, linksetMass, inertia); |
261 | OMV.Vector3 centerOfMass = ComputeLinksetCenterOfMass(); | 278 | OMV.Vector3 centerOfMass = ComputeLinksetCenterOfMass(); |
262 | BulletSimAPI.SetCenterOfMassByPosRot2(LinksetRoot.BSBody.Ptr, centerOfMass, OMV.Quaternion.Identity); | 279 | BulletSimAPI.SetCenterOfMassByPosRot2(LinksetRoot.BSBody.Ptr, centerOfMass, OMV.Quaternion.Identity); |
263 | BulletSimAPI.UpdateInertiaTensor2(LinksetRoot.BSBody.Ptr); | 280 | BulletSimAPI.UpdateInertiaTensor2(LinksetRoot.BSBody.Ptr); |
264 | */ | ||
265 | } | 281 | } |
266 | } | 282 | } |
267 | return; | 283 | return; |
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs b/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs index 481a8db..04b7be5 100644 --- a/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs | |||
@@ -530,10 +530,14 @@ public sealed class BSPrim : BSPhysObject | |||
530 | m_currentCollisionFlags = BulletSimAPI.AddToCollisionFlags2(BSBody.Ptr, CollisionFlags.CF_STATIC_OBJECT); | 530 | m_currentCollisionFlags = BulletSimAPI.AddToCollisionFlags2(BSBody.Ptr, CollisionFlags.CF_STATIC_OBJECT); |
531 | // Stop all movement | 531 | // Stop all movement |
532 | BulletSimAPI.ClearAllForces2(BSBody.Ptr); | 532 | BulletSimAPI.ClearAllForces2(BSBody.Ptr); |
533 | // Center of mass is at the center of the object | ||
534 | BulletSimAPI.SetCenterOfMassByPosRot2(Linkset.LinksetRoot.BSBody.Ptr, _position, _orientation); | ||
533 | // Mass is zero which disables a bunch of physics stuff in Bullet | 535 | // Mass is zero which disables a bunch of physics stuff in Bullet |
534 | BulletSimAPI.SetMassProps2(BSBody.Ptr, 0f, OMV.Vector3.Zero); | 536 | BulletSimAPI.SetMassProps2(BSBody.Ptr, 0f, OMV.Vector3.Zero); |
535 | // There is no inertia in a static object | 537 | // There is no inertia in a static object |
536 | BulletSimAPI.UpdateInertiaTensor2(BSBody.Ptr); | 538 | BulletSimAPI.UpdateInertiaTensor2(BSBody.Ptr); |
539 | // There can be special things needed for implementing linksets | ||
540 | Linkset.MakeStatic(this); | ||
537 | // The activation state is 'sleeping' so Bullet will not try to act on it | 541 | // The activation state is 'sleeping' so Bullet will not try to act on it |
538 | BulletSimAPI.ForceActivationState2(BSBody.Ptr, ActivationState.ISLAND_SLEEPING); | 542 | BulletSimAPI.ForceActivationState2(BSBody.Ptr, ActivationState.ISLAND_SLEEPING); |
539 | } | 543 | } |
@@ -543,10 +547,12 @@ public sealed class BSPrim : BSPhysObject | |||
543 | m_currentCollisionFlags = BulletSimAPI.RemoveFromCollisionFlags2(BSBody.Ptr, CollisionFlags.CF_STATIC_OBJECT); | 547 | m_currentCollisionFlags = BulletSimAPI.RemoveFromCollisionFlags2(BSBody.Ptr, CollisionFlags.CF_STATIC_OBJECT); |
544 | // A dynamic object has mass | 548 | // A dynamic object has mass |
545 | IntPtr collisionShapePtr = BulletSimAPI.GetCollisionShape2(BSBody.Ptr); | 549 | IntPtr collisionShapePtr = BulletSimAPI.GetCollisionShape2(BSBody.Ptr); |
546 | OMV.Vector3 inertia = BulletSimAPI.CalculateLocalInertia2(collisionShapePtr, _mass); | 550 | OMV.Vector3 inertia = BulletSimAPI.CalculateLocalInertia2(collisionShapePtr, Linkset.LinksetMass); |
547 | BulletSimAPI.SetMassProps2(BSBody.Ptr, _mass, inertia); | 551 | BulletSimAPI.SetMassProps2(BSBody.Ptr, _mass, inertia); |
548 | // Inertia is based on our new mass | 552 | // Inertia is based on our new mass |
549 | BulletSimAPI.UpdateInertiaTensor2(BSBody.Ptr); | 553 | BulletSimAPI.UpdateInertiaTensor2(BSBody.Ptr); |
554 | // There can be special things needed for implementing linksets | ||
555 | Linkset.MakeDynamic(this); | ||
550 | // Force activation of the object so Bullet will act on it. | 556 | // Force activation of the object so Bullet will act on it. |
551 | BulletSimAPI.Activate2(BSBody.Ptr, true); | 557 | BulletSimAPI.Activate2(BSBody.Ptr, true); |
552 | } | 558 | } |
@@ -1055,11 +1061,12 @@ public sealed class BSPrim : BSPhysObject | |||
1055 | }// end CalculateMass | 1061 | }// end CalculateMass |
1056 | #endregion Mass Calculation | 1062 | #endregion Mass Calculation |
1057 | 1063 | ||
1058 | // Create the geometry information in Bullet for later use | 1064 | // Create the geometry information in Bullet for later use. |
1059 | // The objects needs a hull if it's physical otherwise a mesh is enough | 1065 | // The objects needs a hull if it's physical otherwise a mesh is enough. |
1060 | // No locking here because this is done when we know physics is not simulating | 1066 | // No locking here because this is done when we know physics is not simulating. |
1061 | // if 'forceRebuild' is true, the geometry is rebuilt. Otherwise a previously built version is used | 1067 | // if 'forceRebuild' is true, the geometry is rebuilt. Otherwise a previously built version is used. |
1062 | // Returns 'true' if the geometry was rebuilt | 1068 | // Returns 'true' if the geometry was rebuilt. |
1069 | // Called at taint-time! | ||
1063 | private bool CreateGeom(bool forceRebuild) | 1070 | private bool CreateGeom(bool forceRebuild) |
1064 | { | 1071 | { |
1065 | bool ret = false; | 1072 | bool ret = false; |
@@ -1128,6 +1135,7 @@ public sealed class BSPrim : BSPhysObject | |||
1128 | 1135 | ||
1129 | // No locking here because this is done when we know physics is not simulating | 1136 | // No locking here because this is done when we know physics is not simulating |
1130 | // Returns 'true' of a mesh was actually rebuild (we could also have one of these specs). | 1137 | // Returns 'true' of a mesh was actually rebuild (we could also have one of these specs). |
1138 | // Called at taint-time! | ||
1131 | private bool CreateGeomMesh() | 1139 | private bool CreateGeomMesh() |
1132 | { | 1140 | { |
1133 | // level of detail based on size and type of the object | 1141 | // level of detail based on size and type of the object |