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.cs77
1 files changed, 72 insertions, 5 deletions
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs b/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs
index e54bf75..e37a4a0 100644
--- a/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs
@@ -267,6 +267,7 @@ public sealed class BSPrim : BSPhysObject
267 set { 267 set {
268 _position = value; 268 _position = value;
269 // TODO: what does it mean to set the position of a child prim?? Rebuild the constraint? 269 // TODO: what does it mean to set the position of a child prim?? Rebuild the constraint?
270 PositionSanityCheck();
270 PhysicsScene.TaintedObject("BSPrim.setPosition", delegate() 271 PhysicsScene.TaintedObject("BSPrim.setPosition", delegate()
271 { 272 {
272 // DetailLog("{0},BSPrim.SetPosition,taint,pos={1},orient={2}", LocalID, _position, _orientation); 273 // DetailLog("{0},BSPrim.SetPosition,taint,pos={1},orient={2}", LocalID, _position, _orientation);
@@ -275,6 +276,63 @@ public sealed class BSPrim : BSPhysObject
275 } 276 }
276 } 277 }
277 278
279 // Check that the current position is sane and, if not, modify the position to make it so.
280 // Check for being below terrain and being out of bounds.
281 // Returns 'true' of the position was made sane by some action.
282 private bool PositionSanityCheck()
283 {
284 bool ret = false;
285
286 // If totally below the ground, move the prim up
287 // TODO: figure out the right solution for this... only for dynamic objects?
288 /*
289 float terrainHeight = PhysicsScene.TerrainManager.GetTerrainHeightAtXYZ(_position);
290 if (Position.Z < terrainHeight)
291 {
292 DetailLog("{0},BSPrim.PositionAdjustUnderGround,call,pos={1},terrain={2}", LocalID, _position, terrainHeight);
293 _position.Z = terrainHeight + 2.0f;
294 ret = true;
295 }
296 */
297 if ((CurrentCollisionFlags & CollisionFlags.BS_FLOATS_ON_WATER) != 0)
298 {
299 float waterHeight = PhysicsScene.GetWaterLevelAtXYZ(_position);
300 if (Position.Z < waterHeight)
301 {
302 _position.Z = waterHeight;
303 ret = true;
304 }
305 }
306
307 // TODO: check for out of bounds
308 return ret;
309 }
310
311 // A version of the sanity check that also makes sure a new position value is
312 // pushed back to the physics engine. This routine would be used by anyone
313 // who is not already pushing the value.
314 private bool PositionSanityCheck2(bool atTaintTime)
315 {
316 bool ret = false;
317 if (PositionSanityCheck())
318 {
319 // The new position value must be pushed into the physics engine but we can't
320 // just assign to "Position" because of potential call loops.
321 BSScene.TaintCallback sanityOperation = delegate()
322 {
323 DetailLog("{0},BSPrim.PositionSanityCheck,taint,pos={1},orient={2}", LocalID, _position, _orientation);
324 BulletSimAPI.SetObjectTranslation(PhysicsScene.WorldID, LocalID, _position, _orientation);
325 };
326 if (atTaintTime)
327 sanityOperation();
328 else
329 PhysicsScene.TaintedObject("BSPrim.PositionSanityCheck", sanityOperation);
330
331 ret = true;
332 }
333 return ret;
334 }
335
278 // Return the effective mass of the object. 336 // Return the effective mass of the object.
279 // If there are multiple items in the linkset, add them together for the root 337 // If there are multiple items in the linkset, add them together for the root
280 public override float Mass 338 public override float Mass
@@ -481,11 +539,10 @@ public sealed class BSPrim : BSPhysObject
481 // This is a NOOP if the object is not in the world (BulletSim and Bullet ignore objects not found). 539 // This is a NOOP if the object is not in the world (BulletSim and Bullet ignore objects not found).
482 BulletSimAPI.RemoveObjectFromWorld2(PhysicsScene.World.ptr, BSBody.ptr); 540 BulletSimAPI.RemoveObjectFromWorld2(PhysicsScene.World.ptr, BSBody.ptr);
483 541
484
485 // Set up the object physicalness (does gravity and collisions move this object) 542 // Set up the object physicalness (does gravity and collisions move this object)
486 MakeDynamic(IsStatic); 543 MakeDynamic(IsStatic);
487 544
488 // Do any vehicle stuff 545 // Update vehicle specific parameters
489 _vehicle.Refresh(); 546 _vehicle.Refresh();
490 547
491 // Arrange for collision events if the simulator wants them 548 // Arrange for collision events if the simulator wants them
@@ -556,7 +613,6 @@ public sealed class BSPrim : BSPhysObject
556 // A dynamic object has mass 613 // A dynamic object has mass
557 IntPtr collisionShapePtr = BulletSimAPI.GetCollisionShape2(BSBody.ptr); 614 IntPtr collisionShapePtr = BulletSimAPI.GetCollisionShape2(BSBody.ptr);
558 OMV.Vector3 inertia = BulletSimAPI.CalculateLocalInertia2(collisionShapePtr, Mass); 615 OMV.Vector3 inertia = BulletSimAPI.CalculateLocalInertia2(collisionShapePtr, Mass);
559 // OMV.Vector3 inertia = OMV.Vector3.Zero;
560 BulletSimAPI.SetMassProps2(BSBody.ptr, _mass, inertia); 616 BulletSimAPI.SetMassProps2(BSBody.ptr, _mass, inertia);
561 BulletSimAPI.UpdateInertiaTensor2(BSBody.ptr); 617 BulletSimAPI.UpdateInertiaTensor2(BSBody.ptr);
562 618
@@ -566,7 +622,7 @@ public sealed class BSPrim : BSPhysObject
566 BulletSimAPI.SetSleepingThresholds2(BSBody.ptr, PhysicsScene.Params.linearSleepingThreshold, PhysicsScene.Params.angularSleepingThreshold); 622 BulletSimAPI.SetSleepingThresholds2(BSBody.ptr, PhysicsScene.Params.linearSleepingThreshold, PhysicsScene.Params.angularSleepingThreshold);
567 BulletSimAPI.SetContactProcessingThreshold2(BSBody.ptr, PhysicsScene.Params.contactProcessingThreshold); 623 BulletSimAPI.SetContactProcessingThreshold2(BSBody.ptr, PhysicsScene.Params.contactProcessingThreshold);
568 624
569 // There can be special things needed for implementing linksets. 625 // There might be special things needed for implementing linksets.
570 Linkset.MakeDynamic(this); 626 Linkset.MakeDynamic(this);
571 627
572 // Force activation of the object so Bullet will act on it. 628 // Force activation of the object so Bullet will act on it.
@@ -656,7 +712,16 @@ public sealed class BSPrim : BSPhysObject
656 } 712 }
657 } 713 }
658 public override bool FloatOnWater { 714 public override bool FloatOnWater {
659 set { _floatOnWater = value; } 715 set {
716 _floatOnWater = value;
717 PhysicsScene.TaintedObject("BSPrim.setFloatOnWater", delegate()
718 {
719 if (_floatOnWater)
720 CurrentCollisionFlags = BulletSimAPI.AddToCollisionFlags2(BSBody.ptr, CollisionFlags.BS_FLOATS_ON_WATER);
721 else
722 CurrentCollisionFlags = BulletSimAPI.RemoveFromCollisionFlags2(BSBody.ptr, CollisionFlags.BS_FLOATS_ON_WATER);
723 });
724 }
660 } 725 }
661 public override OMV.Vector3 RotationalVelocity { 726 public override OMV.Vector3 RotationalVelocity {
662 get { 727 get {
@@ -1198,6 +1263,8 @@ public sealed class BSPrim : BSPhysObject
1198 _acceleration = entprop.Acceleration; 1263 _acceleration = entprop.Acceleration;
1199 _rotationalVelocity = entprop.RotationalVelocity; 1264 _rotationalVelocity = entprop.RotationalVelocity;
1200 1265
1266 PositionSanityCheck2(true);
1267
1201 DetailLog("{0},BSPrim.UpdateProperties,call,pos={1},orient={2},vel={3},accel={4},rotVel={5}", 1268 DetailLog("{0},BSPrim.UpdateProperties,call,pos={1},orient={2},vel={3},accel={4},rotVel={5}",
1202 LocalID, _position, _orientation, _velocity, _acceleration, _rotationalVelocity); 1269 LocalID, _position, _orientation, _velocity, _acceleration, _rotationalVelocity);
1203 1270