aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim')
-rw-r--r--OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs74
1 files changed, 62 insertions, 12 deletions
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs b/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs
index 39d20dc..44937df 100644
--- a/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs
@@ -242,8 +242,8 @@ public sealed class BSPrim : BSPhysObject
242 _acceleration = OMV.Vector3.Zero; 242 _acceleration = OMV.Vector3.Zero;
243 _rotationalVelocity = OMV.Vector3.Zero; 243 _rotationalVelocity = OMV.Vector3.Zero;
244 244
245 // Zero some other properties directly into the physics engine 245 // Zero some other properties in the physics engine
246 BulletSimAPI.ClearForces2(BSBody.ptr); 246 BulletSimAPI.ClearAllForces2(BSBody.ptr);
247 } 247 }
248 248
249 public override void LockAngularMotion(OMV.Vector3 axis) 249 public override void LockAngularMotion(OMV.Vector3 axis)
@@ -275,6 +275,7 @@ public sealed class BSPrim : BSPhysObject
275 { 275 {
276 // DetailLog("{0},BSPrim.SetPosition,taint,pos={1},orient={2}", LocalID, _position, _orientation); 276 // DetailLog("{0},BSPrim.SetPosition,taint,pos={1},orient={2}", LocalID, _position, _orientation);
277 BulletSimAPI.SetTranslation2(BSBody.ptr, _position, _orientation); 277 BulletSimAPI.SetTranslation2(BSBody.ptr, _position, _orientation);
278 ActivateIfPhysical(false);
278 }); 279 });
279 } 280 }
280 } 281 }
@@ -287,6 +288,7 @@ public sealed class BSPrim : BSPhysObject
287 _position = value; 288 _position = value;
288 PositionSanityCheck(); 289 PositionSanityCheck();
289 BulletSimAPI.SetTranslation2(BSBody.ptr, _position, _orientation); 290 BulletSimAPI.SetTranslation2(BSBody.ptr, _position, _orientation);
291 ActivateIfPhysical(false);
290 } 292 }
291 } 293 }
292 294
@@ -401,6 +403,7 @@ public sealed class BSPrim : BSPhysObject
401 // Done at taint time so we're sure the physics engine is not using the variables 403 // Done at taint time so we're sure the physics engine is not using the variables
402 // Vehicle code changes the parameters for this vehicle type. 404 // Vehicle code changes the parameters for this vehicle type.
403 _vehicle.ProcessTypeChange(type); 405 _vehicle.ProcessTypeChange(type);
406 ActivateIfPhysical(false);
404 }); 407 });
405 } 408 }
406 } 409 }
@@ -409,6 +412,7 @@ public sealed class BSPrim : BSPhysObject
409 PhysicsScene.TaintedObject("BSPrim.VehicleFloatParam", delegate() 412 PhysicsScene.TaintedObject("BSPrim.VehicleFloatParam", delegate()
410 { 413 {
411 _vehicle.ProcessFloatVehicleParam((Vehicle)param, value); 414 _vehicle.ProcessFloatVehicleParam((Vehicle)param, value);
415 ActivateIfPhysical(false);
412 }); 416 });
413 } 417 }
414 public override void VehicleVectorParam(int param, OMV.Vector3 value) 418 public override void VehicleVectorParam(int param, OMV.Vector3 value)
@@ -416,6 +420,7 @@ public sealed class BSPrim : BSPhysObject
416 PhysicsScene.TaintedObject("BSPrim.VehicleVectorParam", delegate() 420 PhysicsScene.TaintedObject("BSPrim.VehicleVectorParam", delegate()
417 { 421 {
418 _vehicle.ProcessVectorVehicleParam((Vehicle)param, value); 422 _vehicle.ProcessVectorVehicleParam((Vehicle)param, value);
423 ActivateIfPhysical(false);
419 }); 424 });
420 } 425 }
421 public override void VehicleRotationParam(int param, OMV.Quaternion rotation) 426 public override void VehicleRotationParam(int param, OMV.Quaternion rotation)
@@ -423,6 +428,7 @@ public sealed class BSPrim : BSPhysObject
423 PhysicsScene.TaintedObject("BSPrim.VehicleRotationParam", delegate() 428 PhysicsScene.TaintedObject("BSPrim.VehicleRotationParam", delegate()
424 { 429 {
425 _vehicle.ProcessRotationVehicleParam((Vehicle)param, rotation); 430 _vehicle.ProcessRotationVehicleParam((Vehicle)param, rotation);
431 ActivateIfPhysical(false);
426 }); 432 });
427 } 433 }
428 public override void VehicleFlags(int param, bool remove) 434 public override void VehicleFlags(int param, bool remove)
@@ -540,6 +546,8 @@ public sealed class BSPrim : BSPhysObject
540 { 546 {
541 // DetailLog("{0},setIsPhysical,taint,isPhys={1}", LocalID, _isPhysical); 547 // DetailLog("{0},setIsPhysical,taint,isPhys={1}", LocalID, _isPhysical);
542 SetObjectDynamic(true); 548 SetObjectDynamic(true);
549 // whether phys-to-static or static-to-phys, the object is not moving.
550 ZeroMotion();
543 }); 551 });
544 } 552 }
545 } 553 }
@@ -623,7 +631,7 @@ public sealed class BSPrim : BSPhysObject
623 // Become a Bullet 'static' object type 631 // Become a Bullet 'static' object type
624 CurrentCollisionFlags = BulletSimAPI.AddToCollisionFlags2(BSBody.ptr, CollisionFlags.CF_STATIC_OBJECT); 632 CurrentCollisionFlags = BulletSimAPI.AddToCollisionFlags2(BSBody.ptr, CollisionFlags.CF_STATIC_OBJECT);
625 // Stop all movement 633 // Stop all movement
626 BulletSimAPI.ClearAllForces2(BSBody.ptr); 634 ZeroMotion();
627 // Center of mass is at the center of the object 635 // Center of mass is at the center of the object
628 BulletSimAPI.SetCenterOfMassByPosRot2(Linkset.LinksetRoot.BSBody.ptr, _position, _orientation); 636 BulletSimAPI.SetCenterOfMassByPosRot2(Linkset.LinksetRoot.BSBody.ptr, _position, _orientation);
629 // Mass is zero which disables a bunch of physics stuff in Bullet 637 // Mass is zero which disables a bunch of physics stuff in Bullet
@@ -634,7 +642,7 @@ public sealed class BSPrim : BSPhysObject
634 if (PhysicsScene.Params.ccdMotionThreshold > 0f) 642 if (PhysicsScene.Params.ccdMotionThreshold > 0f)
635 { 643 {
636 BulletSimAPI.SetCcdMotionThreshold2(BSBody.ptr, PhysicsScene.Params.ccdMotionThreshold); 644 BulletSimAPI.SetCcdMotionThreshold2(BSBody.ptr, PhysicsScene.Params.ccdMotionThreshold);
637 BulletSimAPI.SetCcdSweepSphereRadius2(BSBody.ptr, PhysicsScene.Params.ccdSweptSphereRadius); 645 BulletSimAPI.SetCcdSweptSphereRadius2(BSBody.ptr, PhysicsScene.Params.ccdSweptSphereRadius);
638 } 646 }
639 // There can be special things needed for implementing linksets 647 // There can be special things needed for implementing linksets
640 Linkset.MakeStatic(this); 648 Linkset.MakeStatic(this);
@@ -656,14 +664,14 @@ public sealed class BSPrim : BSPhysObject
656 BulletSimAPI.SetRestitution2(BSBody.ptr, PhysicsScene.Params.defaultRestitution); 664 BulletSimAPI.SetRestitution2(BSBody.ptr, PhysicsScene.Params.defaultRestitution);
657 665
658 // per http://www.bulletphysics.org/Bullet/phpBB3/viewtopic.php?t=3382 666 // per http://www.bulletphysics.org/Bullet/phpBB3/viewtopic.php?t=3382
659 BulletSimAPI.ClearAllForces2(BSBody.ptr); 667 // Since this can be called multiple times, only zero forces when becoming physical
668 // BulletSimAPI.ClearAllForces2(BSBody.ptr);
660 669
661 // For good measure, make sure the transform is set through to the motion state 670 // For good measure, make sure the transform is set through to the motion state
662 BulletSimAPI.SetTranslation2(BSBody.ptr, _position, _orientation); 671 BulletSimAPI.SetTranslation2(BSBody.ptr, _position, _orientation);
663 672
664 // A dynamic object has mass 673 // A dynamic object has mass
665 IntPtr collisionShapePtr = BulletSimAPI.GetCollisionShape2(BSBody.ptr); 674 OMV.Vector3 inertia = BulletSimAPI.CalculateLocalInertia2(BSShape.ptr, Mass);
666 OMV.Vector3 inertia = BulletSimAPI.CalculateLocalInertia2(collisionShapePtr, Mass);
667 BulletSimAPI.SetMassProps2(BSBody.ptr, _mass, inertia); 675 BulletSimAPI.SetMassProps2(BSBody.ptr, _mass, inertia);
668 BulletSimAPI.UpdateInertiaTensor2(BSBody.ptr); 676 BulletSimAPI.UpdateInertiaTensor2(BSBody.ptr);
669 677
@@ -671,7 +679,7 @@ public sealed class BSPrim : BSPhysObject
671 if (PhysicsScene.Params.ccdMotionThreshold > 0f) 679 if (PhysicsScene.Params.ccdMotionThreshold > 0f)
672 { 680 {
673 BulletSimAPI.SetCcdMotionThreshold2(BSBody.ptr, PhysicsScene.Params.ccdMotionThreshold); 681 BulletSimAPI.SetCcdMotionThreshold2(BSBody.ptr, PhysicsScene.Params.ccdMotionThreshold);
674 BulletSimAPI.SetCcdSweepSphereRadius2(BSBody.ptr, PhysicsScene.Params.ccdSweptSphereRadius); 682 BulletSimAPI.SetCcdSweptSphereRadius2(BSBody.ptr, PhysicsScene.Params.ccdSweptSphereRadius);
675 } 683 }
676 684
677 // Various values for simulation limits 685 // Various values for simulation limits
@@ -721,6 +729,15 @@ public sealed class BSPrim : BSPhysObject
721 } 729 }
722 } 730 }
723 731
732 // Enable physical actions. Bullet will keep sleeping non-moving physical objects so
733 // they need waking up when parameters are changed.
734 // Called in taint-time!!
735 private void ActivateIfPhysical(bool forceIt)
736 {
737 if (IsPhysical)
738 BulletSimAPI.Activate2(BSBody.ptr, forceIt);
739 }
740
724 // Turn on or off the flag controlling whether collision events are returned to the simulator. 741 // Turn on or off the flag controlling whether collision events are returned to the simulator.
725 private void EnableCollisions(bool wantsCollisionEvents) 742 private void EnableCollisions(bool wantsCollisionEvents)
726 { 743 {
@@ -901,8 +918,7 @@ public sealed class BSPrim : BSPhysObject
901 } 918 }
902 m_accumulatedForces.Clear(); 919 m_accumulatedForces.Clear();
903 } 920 }
904 // DetailLog("{0},BSPrim.AddObjectForce,taint,force={1}", LocalID, fSum); 921 DetailLog("{0},BSPrim.AddForce,taint,force={1}", LocalID, fSum);
905 // For unknown reasons, "ApplyCentralForce" adds this force to the total force on the object.
906 if (fSum != OMV.Vector3.Zero) 922 if (fSum != OMV.Vector3.Zero)
907 BulletSimAPI.ApplyCentralForce2(BSBody.ptr, fSum); 923 BulletSimAPI.ApplyCentralForce2(BSBody.ptr, fSum);
908 }; 924 };
@@ -912,9 +928,43 @@ public sealed class BSPrim : BSPhysObject
912 PhysicsScene.TaintedObject("BSPrim.AddForce", addForceOperation); 928 PhysicsScene.TaintedObject("BSPrim.AddForce", addForceOperation);
913 } 929 }
914 930
931 private List<OMV.Vector3> m_accumulatedAngularForces = new List<OMV.Vector3>();
915 public override void AddAngularForce(OMV.Vector3 force, bool pushforce) { 932 public override void AddAngularForce(OMV.Vector3 force, bool pushforce) {
916 // DetailLog("{0},BSPrim.AddAngularForce,call,angForce={1},push={2}", LocalID, force, pushforce); 933 AddAngularForce(force, pushforce, false);
917 // m_log.DebugFormat("{0}: AddAngularForce. f={1}, push={2}", LogHeader, force, pushforce); 934 }
935 public void AddAngularForce(OMV.Vector3 force, bool pushforce, bool inTaintTime)
936 {
937 if (force.IsFinite())
938 {
939 // _force += force;
940 lock (m_accumulatedAngularForces)
941 m_accumulatedAngularForces.Add(new OMV.Vector3(force));
942 }
943 else
944 {
945 m_log.WarnFormat("{0}: Got a NaN force applied to a prim. LocalID={1}", LogHeader, LocalID);
946 return;
947 }
948 BSScene.TaintCallback addAngularForceOperation = delegate()
949 {
950 OMV.Vector3 fSum = OMV.Vector3.Zero;
951 lock (m_accumulatedAngularForces)
952 {
953 // Sum the accumulated additional forces for one big force to apply once.
954 foreach (OMV.Vector3 v in m_accumulatedAngularForces)
955 {
956 fSum += v;
957 }
958 m_accumulatedAngularForces.Clear();
959 }
960 // DetailLog("{0},BSPrim.AddAngularForce,taint,aForce={1}", LocalID, fSum);
961 if (fSum != OMV.Vector3.Zero)
962 BulletSimAPI.ApplyTorque2(BSBody.ptr, fSum);
963 };
964 if (inTaintTime)
965 addAngularForceOperation();
966 else
967 PhysicsScene.TaintedObject("BSPrim.AddForce", addAngularForceOperation);
918 } 968 }
919 public override void SetMomentum(OMV.Vector3 momentum) { 969 public override void SetMomentum(OMV.Vector3 momentum) {
920 // DetailLog("{0},BSPrim.SetMomentum,call,mom={1}", LocalID, momentum); 970 // DetailLog("{0},BSPrim.SetMomentum,call,mom={1}", LocalID, momentum);