diff options
Diffstat (limited to '')
-rw-r--r-- | OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs | 96 |
1 files changed, 77 insertions, 19 deletions
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs b/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs index 01f231b..6d0af63 100644 --- a/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs | |||
@@ -96,7 +96,8 @@ public sealed class BSPrim : BSPhysObject | |||
96 | long _collidingGroundStep; | 96 | long _collidingGroundStep; |
97 | CollisionFlags m_currentCollisionFlags = 0; | 97 | CollisionFlags m_currentCollisionFlags = 0; |
98 | 98 | ||
99 | public override BulletBody Body { get; set; } | 99 | public override BulletBody BSBody { get; set; } |
100 | public override BulletShape BSShape { get; set; } | ||
100 | 101 | ||
101 | private BSDynamics _vehicle; | 102 | private BSDynamics _vehicle; |
102 | 103 | ||
@@ -144,8 +145,9 @@ public sealed class BSPrim : BSPhysObject | |||
144 | // Get the pointer to the physical body for this object. | 145 | // Get the pointer to the physical body for this object. |
145 | // At the moment, we're still letting BulletSim manage the creation and destruction | 146 | // At the moment, we're still letting BulletSim manage the creation and destruction |
146 | // of the object. Someday we'll move that into the C# code. | 147 | // of the object. Someday we'll move that into the C# code. |
147 | Body = new BulletBody(LocalID, BulletSimAPI.GetBodyHandle2(_scene.World.Ptr, LocalID)); | 148 | BSBody = new BulletBody(LocalID, BulletSimAPI.GetBodyHandle2(_scene.World.Ptr, LocalID)); |
148 | m_currentCollisionFlags = BulletSimAPI.GetCollisionFlags2(Body.Ptr); | 149 | BSShape = new BulletShape(BulletSimAPI.GetCollisionShape2(BSBody.Ptr)); |
150 | m_currentCollisionFlags = BulletSimAPI.GetCollisionFlags2(BSBody.Ptr); | ||
149 | }); | 151 | }); |
150 | } | 152 | } |
151 | 153 | ||
@@ -261,10 +263,10 @@ public sealed class BSPrim : BSPhysObject | |||
261 | _rotationalVelocity = OMV.Vector3.Zero; | 263 | _rotationalVelocity = OMV.Vector3.Zero; |
262 | 264 | ||
263 | // Zero some other properties directly into the physics engine | 265 | // Zero some other properties directly into the physics engine |
264 | BulletSimAPI.SetVelocity2(Body.Ptr, OMV.Vector3.Zero); | 266 | BulletSimAPI.SetLinearVelocity2(BSBody.Ptr, OMV.Vector3.Zero); |
265 | BulletSimAPI.SetAngularVelocity2(Body.Ptr, OMV.Vector3.Zero); | 267 | BulletSimAPI.SetAngularVelocity2(BSBody.Ptr, OMV.Vector3.Zero); |
266 | BulletSimAPI.SetInterpolation2(Body.Ptr, OMV.Vector3.Zero, OMV.Vector3.Zero); | 268 | BulletSimAPI.SetInterpolationVelocity2(BSBody.Ptr, OMV.Vector3.Zero, OMV.Vector3.Zero); |
267 | BulletSimAPI.ClearForces2(Body.Ptr); | 269 | BulletSimAPI.ClearForces2(BSBody.Ptr); |
268 | } | 270 | } |
269 | 271 | ||
270 | public override void LockAngularMotion(OMV.Vector3 axis) | 272 | public override void LockAngularMotion(OMV.Vector3 axis) |
@@ -327,7 +329,7 @@ public sealed class BSPrim : BSPhysObject | |||
327 | { | 329 | { |
328 | DetailLog("{0},BSPrim.setForce,taint,force={1}", LocalID, _force); | 330 | DetailLog("{0},BSPrim.setForce,taint,force={1}", LocalID, _force); |
329 | // BulletSimAPI.SetObjectForce(_scene.WorldID, _localID, _force); | 331 | // BulletSimAPI.SetObjectForce(_scene.WorldID, _localID, _force); |
330 | BulletSimAPI.SetObjectForce2(Body.Ptr, _force); | 332 | BulletSimAPI.SetObjectForce2(BSBody.Ptr, _force); |
331 | }); | 333 | }); |
332 | } | 334 | } |
333 | } | 335 | } |
@@ -472,10 +474,11 @@ public sealed class BSPrim : BSPhysObject | |||
472 | 474 | ||
473 | // Make gravity work if the object is physical and not selected | 475 | // Make gravity work if the object is physical and not selected |
474 | // No locking here because only called when it is safe | 476 | // No locking here because only called when it is safe |
475 | // There are three flags we're interested in: | 477 | // There are four flags we're interested in: |
476 | // IsStatic: Object does not move, otherwise the object has mass and moves | 478 | // IsStatic: Object does not move, otherwise the object has mass and moves |
477 | // isSolid: other objects bounce off of this object | 479 | // isSolid: other objects bounce off of this object |
478 | // collisionEvents: whether this object returns collision events | 480 | // isVolumeDetect: other objects pass through but can generate collisions |
481 | // collisionEvents: whether this object returns collision events | ||
479 | private void SetObjectDynamic() | 482 | private void SetObjectDynamic() |
480 | { | 483 | { |
481 | // If it's becoming dynamic, it will need hullness | 484 | // If it's becoming dynamic, it will need hullness |
@@ -485,14 +488,68 @@ public sealed class BSPrim : BSPhysObject | |||
485 | float mass = IsStatic ? 0f : _mass; | 488 | float mass = IsStatic ? 0f : _mass; |
486 | 489 | ||
487 | BulletSimAPI.SetObjectProperties(_scene.WorldID, LocalID, IsStatic, IsSolid, SubscribedEvents(), mass); | 490 | BulletSimAPI.SetObjectProperties(_scene.WorldID, LocalID, IsStatic, IsSolid, SubscribedEvents(), mass); |
488 | m_currentCollisionFlags = BulletSimAPI.GetCollisionFlags2(Body.Ptr); | 491 | /* |
492 | BulletSimAPI.RemoveObjectFromWorld2(Scene.World.Ptr, BSBody.Ptr); | ||
493 | |||
494 | // Set up the object physicalness (static or dynamic) | ||
495 | MakeDynamic(); | ||
496 | |||
497 | // Make solid or not and arrange for collisions, etc | ||
498 | MakeSolid(); | ||
489 | 499 | ||
490 | // recompute any linkset parameters | 500 | m_currentCollisionFlags = BulletSimAPI.GetCollisionFlags2(BSBody.Ptr); |
501 | |||
502 | BulletSimAPI.AddObjectToWorld2(Scene.World.Ptr, BSBody.Ptr); | ||
503 | */ | ||
504 | |||
505 | // Recompute any linkset parameters. | ||
506 | // When going from non-physical to physical, this re-enables the constraints that | ||
507 | // had been automatically disabled when the mass was set to zero. | ||
491 | Linkset.Refresh(this); | 508 | Linkset.Refresh(this); |
492 | 509 | ||
493 | DetailLog("{0},BSPrim.SetObjectDynamic,taint,static={1},solid={2},mass={3}, cf={4}", LocalID, IsStatic, IsSolid, mass, m_currentCollisionFlags); | 510 | DetailLog("{0},BSPrim.SetObjectDynamic,taint,static={1},solid={2},mass={3}, cf={4}", LocalID, IsStatic, IsSolid, mass, m_currentCollisionFlags); |
494 | } | 511 | } |
495 | 512 | ||
513 | // "Making dynamic" means changing to and from static. | ||
514 | // When static, gravity does not effect the object and it is fixed in space. | ||
515 | // When dynamic, the object can fall and be pushed by others. | ||
516 | // This is independent of its 'solidness' which controls what passes through | ||
517 | // this object and what interacts with it. | ||
518 | private void MakeDynamic() | ||
519 | { | ||
520 | if (IsStatic) | ||
521 | { | ||
522 | // Become a Bullet 'static' object type | ||
523 | BulletSimAPI.AddToCollisionFlags2(BSBody.Ptr, CollisionFlags.CF_STATIC_OBJECT); | ||
524 | // Stop all movement | ||
525 | BulletSimAPI.ClearAllForces2(BSBody.Ptr); | ||
526 | // Mass is zero which disables a bunch of physics stuff in Bullet | ||
527 | BulletSimAPI.SetMassProps2(BSBody.Ptr, 0f, OMV.Vector3.Zero); | ||
528 | // There is no inertia in a static object | ||
529 | BulletSimAPI.UpdateInertiaTensor2(BSBody.Ptr); | ||
530 | // The activation state is 'sleeping' so Bullet will not try to act on it | ||
531 | BulletSimAPI.ForceActivationState2(BSBody.Ptr, ActivationState.ISLAND_SLEEPING); | ||
532 | } | ||
533 | else | ||
534 | { | ||
535 | // Not a Bullet static object | ||
536 | BulletSimAPI.RemoveFromCollisionFlags2(BSBody.Ptr, CollisionFlags.CF_STATIC_OBJECT); | ||
537 | // A dynamic object has mass | ||
538 | BulletSimAPI.SetMassProps2(BSBody.Ptr, _mass, OMV.Vector3.Zero); | ||
539 | // The shape is interesting and has mass and a center of gravity | ||
540 | IntPtr collisionShapePtr = BulletSimAPI.GetCollisionShape2(BSBody.Ptr); | ||
541 | BulletSimAPI.CalculateLocalInertia2(collisionShapePtr, _mass, OMV.Vector3.Zero); | ||
542 | // Inertia is based on our new mass | ||
543 | BulletSimAPI.UpdateInertiaTensor2(BSBody.Ptr); | ||
544 | // Force activation of the object so Bullet will act on it. | ||
545 | BulletSimAPI.Activate2(BSBody.Ptr, true); | ||
546 | } | ||
547 | } | ||
548 | |||
549 | private void MakeSolid() | ||
550 | { | ||
551 | } | ||
552 | |||
496 | // prims don't fly | 553 | // prims don't fly |
497 | public override bool Flying { | 554 | public override bool Flying { |
498 | get { return _flying; } | 555 | get { return _flying; } |
@@ -615,7 +672,7 @@ public sealed class BSPrim : BSPhysObject | |||
615 | } | 672 | } |
616 | else | 673 | else |
617 | { | 674 | { |
618 | m_log.WarnFormat("{0}: Got a NaN force applied to a Character", LogHeader); | 675 | m_log.WarnFormat("{0}: Got a NaN force applied to a prim. LocalID={1}", LogHeader, LocalID); |
619 | return; | 676 | return; |
620 | } | 677 | } |
621 | _scene.TaintedObject("BSPrim.AddForce", delegate() | 678 | _scene.TaintedObject("BSPrim.AddForce", delegate() |
@@ -630,7 +687,8 @@ public sealed class BSPrim : BSPhysObject | |||
630 | m_accumulatedForces.Clear(); | 687 | m_accumulatedForces.Clear(); |
631 | } | 688 | } |
632 | DetailLog("{0},BSPrim.AddObjectForce,taint,force={1}", LocalID, _force); | 689 | DetailLog("{0},BSPrim.AddObjectForce,taint,force={1}", LocalID, _force); |
633 | BulletSimAPI.AddObjectForce2(Body.Ptr, fSum); | 690 | // For unknown reason, "ApplyCentralForce" is really additive. |
691 | BulletSimAPI.ApplyCentralForce2(BSBody.Ptr, fSum); | ||
634 | }); | 692 | }); |
635 | } | 693 | } |
636 | 694 | ||
@@ -650,7 +708,7 @@ public sealed class BSPrim : BSPhysObject | |||
650 | 708 | ||
651 | Scene.TaintedObject("BSPrim.SubscribeEvents", delegate() | 709 | Scene.TaintedObject("BSPrim.SubscribeEvents", delegate() |
652 | { | 710 | { |
653 | m_currentCollisionFlags = BulletSimAPI.AddToCollisionFlags2(Body.Ptr, CollisionFlags.BS_SUBSCRIBE_COLLISION_EVENTS); | 711 | m_currentCollisionFlags = BulletSimAPI.AddToCollisionFlags2(BSBody.Ptr, CollisionFlags.BS_SUBSCRIBE_COLLISION_EVENTS); |
654 | }); | 712 | }); |
655 | } | 713 | } |
656 | } | 714 | } |
@@ -658,7 +716,7 @@ public sealed class BSPrim : BSPhysObject | |||
658 | _subscribedEventsMs = 0; | 716 | _subscribedEventsMs = 0; |
659 | Scene.TaintedObject("BSPrim.UnSubscribeEvents", delegate() | 717 | Scene.TaintedObject("BSPrim.UnSubscribeEvents", delegate() |
660 | { | 718 | { |
661 | m_currentCollisionFlags = BulletSimAPI.RemoveFromCollisionFlags2(Body.Ptr, CollisionFlags.BS_SUBSCRIBE_COLLISION_EVENTS); | 719 | m_currentCollisionFlags = BulletSimAPI.RemoveFromCollisionFlags2(BSBody.Ptr, CollisionFlags.BS_SUBSCRIBE_COLLISION_EVENTS); |
662 | }); | 720 | }); |
663 | } | 721 | } |
664 | public override bool SubscribedEvents() { | 722 | public override bool SubscribedEvents() { |
@@ -1243,7 +1301,7 @@ public sealed class BSPrim : BSPhysObject | |||
1243 | bool ret = BulletSimAPI.CreateObject(_scene.WorldID, shape); | 1301 | bool ret = BulletSimAPI.CreateObject(_scene.WorldID, shape); |
1244 | 1302 | ||
1245 | // the CreateObject() may have recreated the rigid body. Make sure we have the latest. | 1303 | // the CreateObject() may have recreated the rigid body. Make sure we have the latest. |
1246 | Body = new BulletBody(LocalID, BulletSimAPI.GetBodyHandle2(_scene.World.Ptr, LocalID)); | 1304 | BSBody = new BulletBody(LocalID, BulletSimAPI.GetBodyHandle2(_scene.World.Ptr, LocalID)); |
1247 | 1305 | ||
1248 | return ret; | 1306 | return ret; |
1249 | } | 1307 | } |