aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs')
-rw-r--r--OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs47
1 files changed, 41 insertions, 6 deletions
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs b/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs
index 4f10d46..4d17e6c 100644
--- a/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs
@@ -474,12 +474,13 @@ public sealed class BSPrim : BSPhysObject
474 */ 474 */
475 BulletSimAPI.RemoveObjectFromWorld2(PhysicsScene.World.Ptr, BSBody.Ptr); 475 BulletSimAPI.RemoveObjectFromWorld2(PhysicsScene.World.Ptr, BSBody.Ptr);
476 476
477 // Set up the object physicalness (does gravity and collisions move this object)
478 MakeDynamic(IsStatic);
479
480 // Make solid or not (do things bounce off or pass through this object) 477 // Make solid or not (do things bounce off or pass through this object)
478 // This is done first because it can change the collisionObject type.
481 MakeSolid(IsSolid); 479 MakeSolid(IsSolid);
482 480
481 // Set up the object physicalness (does gravity and collisions move this object)
482 MakeDynamic(IsStatic);
483
483 // Arrange for collisions events if the simulator wants them 484 // Arrange for collisions events if the simulator wants them
484 EnableCollisions(SubscribedEvents()); 485 EnableCollisions(SubscribedEvents());
485 486
@@ -554,17 +555,51 @@ public sealed class BSPrim : BSPhysObject
554 } 555 }
555 556
556 // "Making solid" means that other object will not pass through this object. 557 // "Making solid" means that other object will not pass through this object.
558 // To make transparent, we create a Bullet ghost object.
559 // Note: This expects to be called from the UpdatePhysicalParameters() routine as
560 // the functions after this one set up the state of a possibly newly created collision body.
557 private void MakeSolid(bool makeSolid) 561 private void MakeSolid(bool makeSolid)
558 { 562 {
563 CollisionObjectTypes bodyType = (CollisionObjectTypes)BulletSimAPI.GetBodyType2(BSBody.Ptr);
564 /*
559 if (makeSolid) 565 if (makeSolid)
560 { 566 {
561 // Easy in Bullet -- just remove the object flag that controls collision response 567 if ((bodyType & CollisionObjectTypes.CO_RIGID_BODY) == 0)
562 CurrentCollisionFlags = BulletSimAPI.RemoveFromCollisionFlags2(BSBody.Ptr, CollisionFlags.CF_NO_CONTACT_RESPONSE); 568 {
569 // Solid things are made out of rigid bodies. Remove this old body from the world
570 // and use this shape in a new rigid body.
571 BulletBody oldBody = BSBody;
572 BulletSimAPI.RemoveObjectFromWorld2(PhysicsScene.World.Ptr, BSBody.Ptr);
573 BSShape = new BulletShape(BulletSimAPI.GetCollisionShape2(BSBody.Ptr));
574 BSBody = new BulletBody(LocalID, BulletSimAPI.CreateBodyFromShape2(PhysicsScene.World.Ptr, BSShape.Ptr, _position, _orientation));
575 BulletSimAPI.DestroyObject2(PhysicsScene.World.Ptr, oldBody.Ptr);
576 BulletSimAPI.AddObjectToWorld2(PhysicsScene.World.Ptr, BSBody.Ptr);
577 }
563 } 578 }
564 else 579 else
565 { 580 {
566 CurrentCollisionFlags = BulletSimAPI.AddToCollisionFlags2(BSBody.Ptr, CollisionFlags.CF_NO_CONTACT_RESPONSE); 581 if ((bodyType & CollisionObjectTypes.CO_GHOST_OBJECT) == 0)
582 {
583 // Non-solid things are made out of ghost objects. Remove this old body from the world
584 // and use this shape in a new rigid body.
585 BulletBody oldBody = BSBody;
586 BulletSimAPI.RemoveObjectFromWorld2(PhysicsScene.World.Ptr, BSBody.Ptr);
587 BSShape = new BulletShape(BulletSimAPI.GetCollisionShape2(BSBody.Ptr));
588 BSBody = new BulletBody(LocalID,
589 BulletSimAPI.CreateGhostFromShape2(PhysicsScene.World.Ptr, BSShape.Ptr, _position, _orientation));
590 if (BSBody.Ptr == IntPtr.Zero)
591 {
592 m_log.ErrorFormat("{0} BSPrim.MakeSolid: failed creation of ghost object. LocalID=[1}", LogHeader, LocalID);
593 BSBody = oldBody;
594 }
595 else
596 {
597 BulletSimAPI.DestroyObject2(PhysicsScene.World.Ptr, oldBody.Ptr);
598 BulletSimAPI.AddObjectToWorld2(PhysicsScene.World.Ptr, BSBody.Ptr);
599 }
600 }
567 } 601 }
602 */
568 } 603 }
569 604
570 // Turn on or off the flag controlling whether collision events are returned to the simulator. 605 // Turn on or off the flag controlling whether collision events are returned to the simulator.