aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs
diff options
context:
space:
mode:
authorRobert Adams2012-09-18 08:39:52 -0700
committerRobert Adams2012-09-27 22:01:11 -0700
commitee7cda261cbbc9dcd558c35eabc070cc0bf45644 (patch)
treef30f9c9baf15ef6988983e53bf3141749eab75f9 /OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs
parentComment out unused RestPlugins text in OpenSimDefaults.ini (diff)
downloadopensim-SC_OLD-ee7cda261cbbc9dcd558c35eabc070cc0bf45644.zip
opensim-SC_OLD-ee7cda261cbbc9dcd558c35eabc070cc0bf45644.tar.gz
opensim-SC_OLD-ee7cda261cbbc9dcd558c35eabc070cc0bf45644.tar.bz2
opensim-SC_OLD-ee7cda261cbbc9dcd558c35eabc070cc0bf45644.tar.xz
BulletSim: move a bunch of common logic out of BSPrim and BSCharacter
and into the parent class BSPhysObject. Rework collision logic to enable extra collision after done colliding. Rename 'Scene' to 'PhysicsScene' to differentiate it from the simulator 'Scene'.
Diffstat (limited to '')
-rw-r--r--OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs232
1 files changed, 72 insertions, 160 deletions
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs b/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs
index 26a581f..29f27e8 100644
--- a/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs
@@ -49,8 +49,6 @@ public sealed class BSPrim : BSPhysObject
49 private ulong _hullKey; 49 private ulong _hullKey;
50 private List<ConvexResult> _hulls; 50 private List<ConvexResult> _hulls;
51 51
52 private BSScene _scene;
53 public BSScene Scene { get { return _scene; } }
54 private String _avName; 52 private String _avName;
55 private uint _localID = 0; 53 private uint _localID = 0;
56 54
@@ -87,18 +85,6 @@ public sealed class BSPrim : BSPhysObject
87 private bool _kinematic; 85 private bool _kinematic;
88 private float _buoyancy; 86 private float _buoyancy;
89 87
90 // Membership in a linkset is controlled by this class.
91 public override BSLinkset Linkset { get; set; }
92
93 private int _subscribedEventsMs = 0;
94 private int _nextCollisionOkTime = 0;
95 long _collidingStep;
96 long _collidingGroundStep;
97 CollisionFlags m_currentCollisionFlags = 0;
98
99 public override BulletBody BSBody { get; set; }
100 public override BulletShape BSShape { get; set; }
101
102 private BSDynamics _vehicle; 88 private BSDynamics _vehicle;
103 89
104 private OMV.Vector3 _PIDTarget; 90 private OMV.Vector3 _PIDTarget;
@@ -113,10 +99,10 @@ public sealed class BSPrim : BSPhysObject
113 OMV.Quaternion rotation, PrimitiveBaseShape pbs, bool pisPhysical) 99 OMV.Quaternion rotation, PrimitiveBaseShape pbs, bool pisPhysical)
114 { 100 {
115 // m_log.DebugFormat("{0}: BSPrim creation of {1}, id={2}", LogHeader, primName, localID); 101 // m_log.DebugFormat("{0}: BSPrim creation of {1}, id={2}", LogHeader, primName, localID);
102 base.BaseInitialize(parent_scene);
116 _localID = localID; 103 _localID = localID;
117 _avName = primName; 104 _avName = primName;
118 _physicsActorType = (int)ActorTypes.Prim; 105 _physicsActorType = (int)ActorTypes.Prim;
119 _scene = parent_scene;
120 _position = pos; 106 _position = pos;
121 _size = size; 107 _size = size;
122 _scale = new OMV.Vector3(1f, 1f, 1f); // the scale will be set by CreateGeom depending on object type 108 _scale = new OMV.Vector3(1f, 1f, 1f); // the scale will be set by CreateGeom depending on object type
@@ -129,25 +115,23 @@ public sealed class BSPrim : BSPhysObject
129 _pbs = pbs; 115 _pbs = pbs;
130 _isPhysical = pisPhysical; 116 _isPhysical = pisPhysical;
131 _isVolumeDetect = false; 117 _isVolumeDetect = false;
132 _subscribedEventsMs = 0; 118 _friction = PhysicsScene.Params.defaultFriction; // TODO: compute based on object material
133 _friction = _scene.Params.defaultFriction; // TODO: compute based on object material 119 _density = PhysicsScene.Params.defaultDensity; // TODO: compute based on object material
134 _density = _scene.Params.defaultDensity; // TODO: compute based on object material 120 _restitution = PhysicsScene.Params.defaultRestitution;
135 _restitution = _scene.Params.defaultRestitution; 121 _vehicle = new BSDynamics(PhysicsScene, this); // add vehicleness
136 Linkset = new BSLinkset(Scene, this); // a linkset of one
137 _vehicle = new BSDynamics(Scene, this); // add vehicleness
138 _mass = CalculateMass(); 122 _mass = CalculateMass();
139 DetailLog("{0},BSPrim.constructor,call", LocalID); 123 DetailLog("{0},BSPrim.constructor,call", LocalID);
140 // do the actual object creation at taint time 124 // do the actual object creation at taint time
141 _scene.TaintedObject("BSPrim.create", delegate() 125 PhysicsScene.TaintedObject("BSPrim.create", delegate()
142 { 126 {
143 CreateGeomAndObject(true); 127 CreateGeomAndObject(true);
144 128
145 // Get the pointer to the physical body for this object. 129 // Get the pointer to the physical body for this object.
146 // At the moment, we're still letting BulletSim manage the creation and destruction 130 // At the moment, we're still letting BulletSim manage the creation and destruction
147 // of the object. Someday we'll move that into the C# code. 131 // of the object. Someday we'll move that into the C# code.
148 BSBody = new BulletBody(LocalID, BulletSimAPI.GetBodyHandle2(_scene.World.Ptr, LocalID)); 132 BSBody = new BulletBody(LocalID, BulletSimAPI.GetBodyHandle2(PhysicsScene.World.Ptr, LocalID));
149 BSShape = new BulletShape(BulletSimAPI.GetCollisionShape2(BSBody.Ptr)); 133 BSShape = new BulletShape(BulletSimAPI.GetCollisionShape2(BSBody.Ptr));
150 m_currentCollisionFlags = BulletSimAPI.GetCollisionFlags2(BSBody.Ptr); 134 CurrentCollisionFlags = BulletSimAPI.GetCollisionFlags2(BSBody.Ptr);
151 }); 135 });
152 } 136 }
153 137
@@ -168,11 +152,11 @@ public sealed class BSPrim : BSPhysObject
168 // Undo any vehicle properties 152 // Undo any vehicle properties
169 this.VehicleType = (int)Vehicle.TYPE_NONE; 153 this.VehicleType = (int)Vehicle.TYPE_NONE;
170 154
171 _scene.TaintedObject("BSPrim.destroy", delegate() 155 PhysicsScene.TaintedObject("BSPrim.destroy", delegate()
172 { 156 {
173 DetailLog("{0},BSPrim.Destroy,taint,", LocalID); 157 DetailLog("{0},BSPrim.Destroy,taint,", LocalID);
174 // everything in the C# world will get garbage collected. Tell the C++ world to free stuff. 158 // everything in the C# world will get garbage collected. Tell the C++ world to free stuff.
175 BulletSimAPI.DestroyObject(_scene.WorldID, LocalID); 159 BulletSimAPI.DestroyObject(PhysicsScene.WorldID, LocalID);
176 }); 160 });
177 } 161 }
178 162
@@ -183,7 +167,7 @@ public sealed class BSPrim : BSPhysObject
183 get { return _size; } 167 get { return _size; }
184 set { 168 set {
185 _size = value; 169 _size = value;
186 _scene.TaintedObject("BSPrim.setSize", delegate() 170 PhysicsScene.TaintedObject("BSPrim.setSize", delegate()
187 { 171 {
188 _mass = CalculateMass(); // changing size changes the mass 172 _mass = CalculateMass(); // changing size changes the mass
189 // Since _size changed, the mesh needs to be rebuilt. If rebuilt, all the correct 173 // Since _size changed, the mesh needs to be rebuilt. If rebuilt, all the correct
@@ -196,7 +180,7 @@ public sealed class BSPrim : BSPhysObject
196 public override PrimitiveBaseShape Shape { 180 public override PrimitiveBaseShape Shape {
197 set { 181 set {
198 _pbs = value; 182 _pbs = value;
199 _scene.TaintedObject("BSPrim.setShape", delegate() 183 PhysicsScene.TaintedObject("BSPrim.setShape", delegate()
200 { 184 {
201 _mass = CalculateMass(); // changing the shape changes the mass 185 _mass = CalculateMass(); // changing the shape changes the mass
202 CreateGeomAndObject(false); 186 CreateGeomAndObject(false);
@@ -214,7 +198,7 @@ public sealed class BSPrim : BSPhysObject
214 public override bool Selected { 198 public override bool Selected {
215 set { 199 set {
216 _isSelected = value; 200 _isSelected = value;
217 _scene.TaintedObject("BSPrim.setSelected", delegate() 201 PhysicsScene.TaintedObject("BSPrim.setSelected", delegate()
218 { 202 {
219 SetObjectDynamic(); 203 SetObjectDynamic();
220 }); 204 });
@@ -283,13 +267,13 @@ public sealed class BSPrim : BSPhysObject
283 _position = BulletSimAPI.GetPosition2(BSBody.Ptr); 267 _position = BulletSimAPI.GetPosition2(BSBody.Ptr);
284 268
285 // don't do the GetObjectPosition for root elements because this function is called a zillion times 269 // don't do the GetObjectPosition for root elements because this function is called a zillion times
286 // _position = BulletSimAPI.GetObjectPosition(_scene.WorldID, _localID); 270 // _position = BulletSimAPI.GetObjectPosition(Scene.WorldID, _localID);
287 return _position; 271 return _position;
288 } 272 }
289 set { 273 set {
290 _position = value; 274 _position = value;
291 // TODO: what does it mean to set the position of a child prim?? Rebuild the constraint? 275 // TODO: what does it mean to set the position of a child prim?? Rebuild the constraint?
292 _scene.TaintedObject("BSPrim.setPosition", delegate() 276 PhysicsScene.TaintedObject("BSPrim.setPosition", delegate()
293 { 277 {
294 DetailLog("{0},BSPrim.SetPosition,taint,pos={1},orient={2}", LocalID, _position, _orientation); 278 DetailLog("{0},BSPrim.SetPosition,taint,pos={1},orient={2}", LocalID, _position, _orientation);
295 BulletSimAPI.SetTranslation2(BSBody.Ptr, _position, _orientation); 279 BulletSimAPI.SetTranslation2(BSBody.Ptr, _position, _orientation);
@@ -327,7 +311,7 @@ public sealed class BSPrim : BSPhysObject
327 get { return _force; } 311 get { return _force; }
328 set { 312 set {
329 _force = value; 313 _force = value;
330 _scene.TaintedObject("BSPrim.setForce", delegate() 314 PhysicsScene.TaintedObject("BSPrim.setForce", delegate()
331 { 315 {
332 DetailLog("{0},BSPrim.setForce,taint,force={1}", LocalID, _force); 316 DetailLog("{0},BSPrim.setForce,taint,force={1}", LocalID, _force);
333 BulletSimAPI.SetObjectForce2(BSBody.Ptr, _force); 317 BulletSimAPI.SetObjectForce2(BSBody.Ptr, _force);
@@ -342,40 +326,40 @@ public sealed class BSPrim : BSPhysObject
342 set { 326 set {
343 Vehicle type = (Vehicle)value; 327 Vehicle type = (Vehicle)value;
344 BSPrim vehiclePrim = this; 328 BSPrim vehiclePrim = this;
345 _scene.TaintedObject("setVehicleType", delegate() 329 PhysicsScene.TaintedObject("setVehicleType", delegate()
346 { 330 {
347 // Done at taint time so we're sure the physics engine is not using the variables 331 // Done at taint time so we're sure the physics engine is not using the variables
348 // Vehicle code changes the parameters for this vehicle type. 332 // Vehicle code changes the parameters for this vehicle type.
349 _vehicle.ProcessTypeChange(type); 333 _vehicle.ProcessTypeChange(type);
350 // Tell the scene about the vehicle so it will get processing each frame. 334 // Tell the scene about the vehicle so it will get processing each frame.
351 _scene.VehicleInSceneTypeChanged(this, type); 335 PhysicsScene.VehicleInSceneTypeChanged(this, type);
352 }); 336 });
353 } 337 }
354 } 338 }
355 public override void VehicleFloatParam(int param, float value) 339 public override void VehicleFloatParam(int param, float value)
356 { 340 {
357 _scene.TaintedObject("BSPrim.VehicleFloatParam", delegate() 341 PhysicsScene.TaintedObject("BSPrim.VehicleFloatParam", delegate()
358 { 342 {
359 _vehicle.ProcessFloatVehicleParam((Vehicle)param, value); 343 _vehicle.ProcessFloatVehicleParam((Vehicle)param, value);
360 }); 344 });
361 } 345 }
362 public override void VehicleVectorParam(int param, OMV.Vector3 value) 346 public override void VehicleVectorParam(int param, OMV.Vector3 value)
363 { 347 {
364 _scene.TaintedObject("BSPrim.VehicleVectorParam", delegate() 348 PhysicsScene.TaintedObject("BSPrim.VehicleVectorParam", delegate()
365 { 349 {
366 _vehicle.ProcessVectorVehicleParam((Vehicle)param, value); 350 _vehicle.ProcessVectorVehicleParam((Vehicle)param, value);
367 }); 351 });
368 } 352 }
369 public override void VehicleRotationParam(int param, OMV.Quaternion rotation) 353 public override void VehicleRotationParam(int param, OMV.Quaternion rotation)
370 { 354 {
371 _scene.TaintedObject("BSPrim.VehicleRotationParam", delegate() 355 PhysicsScene.TaintedObject("BSPrim.VehicleRotationParam", delegate()
372 { 356 {
373 _vehicle.ProcessRotationVehicleParam((Vehicle)param, rotation); 357 _vehicle.ProcessRotationVehicleParam((Vehicle)param, rotation);
374 }); 358 });
375 } 359 }
376 public override void VehicleFlags(int param, bool remove) 360 public override void VehicleFlags(int param, bool remove)
377 { 361 {
378 _scene.TaintedObject("BSPrim.VehicleFlags", delegate() 362 PhysicsScene.TaintedObject("BSPrim.VehicleFlags", delegate()
379 { 363 {
380 _vehicle.ProcessVehicleFlags(param, remove); 364 _vehicle.ProcessVehicleFlags(param, remove);
381 }); 365 });
@@ -393,8 +377,9 @@ public sealed class BSPrim : BSPhysObject
393 public override void SetVolumeDetect(int param) { 377 public override void SetVolumeDetect(int param) {
394 bool newValue = (param != 0); 378 bool newValue = (param != 0);
395 _isVolumeDetect = newValue; 379 _isVolumeDetect = newValue;
396 _scene.TaintedObject("BSPrim.SetVolumeDetect", delegate() 380 PhysicsScene.TaintedObject("BSPrim.SetVolumeDetect", delegate()
397 { 381 {
382 DetailLog("{0},setVolumeDetect,taint,volDetect={1}", LocalID, _isVolumeDetect);
398 SetObjectDynamic(); 383 SetObjectDynamic();
399 }); 384 });
400 return; 385 return;
@@ -404,7 +389,7 @@ public sealed class BSPrim : BSPhysObject
404 get { return _velocity; } 389 get { return _velocity; }
405 set { 390 set {
406 _velocity = value; 391 _velocity = value;
407 _scene.TaintedObject("BSPrim.setVelocity", delegate() 392 PhysicsScene.TaintedObject("BSPrim.setVelocity", delegate()
408 { 393 {
409 DetailLog("{0},BSPrim.SetVelocity,taint,vel={1}", LocalID, _velocity); 394 DetailLog("{0},BSPrim.SetVelocity,taint,vel={1}", LocalID, _velocity);
410 BulletSimAPI.SetLinearVelocity2(BSBody.Ptr, _velocity); 395 BulletSimAPI.SetLinearVelocity2(BSBody.Ptr, _velocity);
@@ -438,9 +423,9 @@ public sealed class BSPrim : BSPhysObject
438 set { 423 set {
439 _orientation = value; 424 _orientation = value;
440 // TODO: what does it mean if a child in a linkset changes its orientation? Rebuild the constraint? 425 // TODO: what does it mean if a child in a linkset changes its orientation? Rebuild the constraint?
441 _scene.TaintedObject("BSPrim.setOrientation", delegate() 426 PhysicsScene.TaintedObject("BSPrim.setOrientation", delegate()
442 { 427 {
443 // _position = BulletSimAPI.GetObjectPosition(_scene.WorldID, _localID); 428 // _position = BulletSimAPI.GetObjectPosition(Scene.WorldID, _localID);
444 DetailLog("{0},BSPrim.setOrientation,taint,pos={1},orient={2}", LocalID, _position, _orientation); 429 DetailLog("{0},BSPrim.setOrientation,taint,pos={1},orient={2}", LocalID, _position, _orientation);
445 BulletSimAPI.SetTranslation2(BSBody.Ptr, _position, _orientation); 430 BulletSimAPI.SetTranslation2(BSBody.Ptr, _position, _orientation);
446 }); 431 });
@@ -454,8 +439,9 @@ public sealed class BSPrim : BSPhysObject
454 get { return _isPhysical; } 439 get { return _isPhysical; }
455 set { 440 set {
456 _isPhysical = value; 441 _isPhysical = value;
457 _scene.TaintedObject("BSPrim.setIsPhysical", delegate() 442 PhysicsScene.TaintedObject("BSPrim.setIsPhysical", delegate()
458 { 443 {
444 DetailLog("{0},setIsPhysical,taint,isPhys={1}", LocalID, _isPhysical);
459 SetObjectDynamic(); 445 SetObjectDynamic();
460 }); 446 });
461 } 447 }
@@ -493,9 +479,9 @@ public sealed class BSPrim : BSPhysObject
493 // Bullet wants static objects to have a mass of zero 479 // Bullet wants static objects to have a mass of zero
494 float mass = IsStatic ? 0f : _mass; 480 float mass = IsStatic ? 0f : _mass;
495 481
496 BulletSimAPI.SetObjectProperties(_scene.WorldID, LocalID, IsStatic, IsSolid, SubscribedEvents(), mass); 482 BulletSimAPI.SetObjectProperties(Scene.WorldID, LocalID, IsStatic, IsSolid, SubscribedEvents(), mass);
497 */ 483 */
498 BulletSimAPI.RemoveObjectFromWorld2(Scene.World.Ptr, BSBody.Ptr); 484 BulletSimAPI.RemoveObjectFromWorld2(PhysicsScene.World.Ptr, BSBody.Ptr);
499 485
500 // Set up the object physicalness (does gravity and collisions move this object) 486 // Set up the object physicalness (does gravity and collisions move this object)
501 MakeDynamic(IsStatic); 487 MakeDynamic(IsStatic);
@@ -506,15 +492,15 @@ public sealed class BSPrim : BSPhysObject
506 // Arrange for collisions events if the simulator wants them 492 // Arrange for collisions events if the simulator wants them
507 EnableCollisions(SubscribedEvents()); 493 EnableCollisions(SubscribedEvents());
508 494
509 BulletSimAPI.AddObjectToWorld2(Scene.World.Ptr, BSBody.Ptr); 495 BulletSimAPI.AddObjectToWorld2(PhysicsScene.World.Ptr, BSBody.Ptr);
510 496
511 // Recompute any linkset parameters. 497 // Recompute any linkset parameters.
512 // When going from non-physical to physical, this re-enables the constraints that 498 // When going from non-physical to physical, this re-enables the constraints that
513 // had been automatically disabled when the mass was set to zero. 499 // had been automatically disabled when the mass was set to zero.
514 Linkset.Refresh(this); 500 Linkset.Refresh(this);
515 501
516 DetailLog("{0},BSPrim.UpdatePhysicalParameters,taint,static={1},solid={2},mass={3}, cf={4}", 502 DetailLog("{0},BSPrim.UpdatePhysicalParameters,taint,static={1},solid={2},mass={3},collide={4},cf={5}",
517 LocalID, IsStatic, IsSolid, _mass, m_currentCollisionFlags); 503 LocalID, IsStatic, IsSolid, _mass, SubscribedEvents(), CurrentCollisionFlags);
518 } 504 }
519 505
520 // "Making dynamic" means changing to and from static. 506 // "Making dynamic" means changing to and from static.
@@ -527,7 +513,7 @@ public sealed class BSPrim : BSPhysObject
527 if (makeStatic) 513 if (makeStatic)
528 { 514 {
529 // Become a Bullet 'static' object type 515 // Become a Bullet 'static' object type
530 m_currentCollisionFlags = BulletSimAPI.AddToCollisionFlags2(BSBody.Ptr, CollisionFlags.CF_STATIC_OBJECT); 516 CurrentCollisionFlags = BulletSimAPI.AddToCollisionFlags2(BSBody.Ptr, CollisionFlags.CF_STATIC_OBJECT);
531 // Stop all movement 517 // Stop all movement
532 BulletSimAPI.ClearAllForces2(BSBody.Ptr); 518 BulletSimAPI.ClearAllForces2(BSBody.Ptr);
533 // Center of mass is at the center of the object 519 // Center of mass is at the center of the object
@@ -539,16 +525,17 @@ public sealed class BSPrim : BSPhysObject
539 // There can be special things needed for implementing linksets 525 // There can be special things needed for implementing linksets
540 Linkset.MakeStatic(this); 526 Linkset.MakeStatic(this);
541 // The activation state is 'sleeping' so Bullet will not try to act on it 527 // The activation state is 'sleeping' so Bullet will not try to act on it
542 BulletSimAPI.ForceActivationState2(BSBody.Ptr, ActivationState.ISLAND_SLEEPING); 528 // BulletSimAPI.ForceActivationState2(BSBody.Ptr, ActivationState.ISLAND_SLEEPING);
529 BulletSimAPI.ForceActivationState2(BSBody.Ptr, ActivationState.DISABLE_SIMULATION);
543 } 530 }
544 else 531 else
545 { 532 {
546 // Not a Bullet static object 533 // Not a Bullet static object
547 m_currentCollisionFlags = BulletSimAPI.RemoveFromCollisionFlags2(BSBody.Ptr, CollisionFlags.CF_STATIC_OBJECT); 534 CurrentCollisionFlags = BulletSimAPI.RemoveFromCollisionFlags2(BSBody.Ptr, CollisionFlags.CF_STATIC_OBJECT);
548 535
549 // Set various physical properties so internal things will get computed correctly as they are set 536 // Set various physical properties so internal dynamic properties will get computed correctly as they are set
550 BulletSimAPI.SetFriction2(BSBody.Ptr, Scene.Params.defaultFriction); 537 BulletSimAPI.SetFriction2(BSBody.Ptr, PhysicsScene.Params.defaultFriction);
551 BulletSimAPI.SetRestitution2(BSBody.Ptr, Scene.Params.defaultRestitution); 538 BulletSimAPI.SetRestitution2(BSBody.Ptr, PhysicsScene.Params.defaultRestitution);
552 // per http://www.bulletphysics.org/Bullet/phpBB3/viewtopic.php?t=3382 539 // per http://www.bulletphysics.org/Bullet/phpBB3/viewtopic.php?t=3382
553 BulletSimAPI.SetInterpolationLinearVelocity2(BSBody.Ptr, OMV.Vector3.Zero); 540 BulletSimAPI.SetInterpolationLinearVelocity2(BSBody.Ptr, OMV.Vector3.Zero);
554 BulletSimAPI.SetInterpolationAngularVelocity2(BSBody.Ptr, OMV.Vector3.Zero); 541 BulletSimAPI.SetInterpolationAngularVelocity2(BSBody.Ptr, OMV.Vector3.Zero);
@@ -562,10 +549,10 @@ public sealed class BSPrim : BSPhysObject
562 BulletSimAPI.UpdateInertiaTensor2(BSBody.Ptr); 549 BulletSimAPI.UpdateInertiaTensor2(BSBody.Ptr);
563 550
564 // Various values for simulation limits 551 // Various values for simulation limits
565 BulletSimAPI.SetDamping2(BSBody.Ptr, Scene.Params.linearDamping, Scene.Params.angularDamping); 552 BulletSimAPI.SetDamping2(BSBody.Ptr, PhysicsScene.Params.linearDamping, PhysicsScene.Params.angularDamping);
566 BulletSimAPI.SetDeactivationTime2(BSBody.Ptr, Scene.Params.deactivationTime); 553 BulletSimAPI.SetDeactivationTime2(BSBody.Ptr, PhysicsScene.Params.deactivationTime);
567 BulletSimAPI.SetSleepingThresholds2(BSBody.Ptr, Scene.Params.linearSleepingThreshold, Scene.Params.angularSleepingThreshold); 554 BulletSimAPI.SetSleepingThresholds2(BSBody.Ptr, PhysicsScene.Params.linearSleepingThreshold, PhysicsScene.Params.angularSleepingThreshold);
568 BulletSimAPI.SetContactProcessingThreshold2(BSBody.Ptr, Scene.Params.contactProcessingThreshold); 555 BulletSimAPI.SetContactProcessingThreshold2(BSBody.Ptr, PhysicsScene.Params.contactProcessingThreshold);
569 556
570 // There can be special things needed for implementing linksets 557 // There can be special things needed for implementing linksets
571 Linkset.MakeDynamic(this); 558 Linkset.MakeDynamic(this);
@@ -581,11 +568,11 @@ public sealed class BSPrim : BSPhysObject
581 if (makeSolid) 568 if (makeSolid)
582 { 569 {
583 // Easy in Bullet -- just remove the object flag that controls collision response 570 // Easy in Bullet -- just remove the object flag that controls collision response
584 m_currentCollisionFlags = BulletSimAPI.RemoveFromCollisionFlags2(BSBody.Ptr, CollisionFlags.CF_NO_CONTACT_RESPONSE); 571 CurrentCollisionFlags = BulletSimAPI.RemoveFromCollisionFlags2(BSBody.Ptr, CollisionFlags.CF_NO_CONTACT_RESPONSE);
585 } 572 }
586 else 573 else
587 { 574 {
588 m_currentCollisionFlags = BulletSimAPI.AddToCollisionFlags2(BSBody.Ptr, CollisionFlags.CF_NO_CONTACT_RESPONSE); 575 CurrentCollisionFlags = BulletSimAPI.AddToCollisionFlags2(BSBody.Ptr, CollisionFlags.CF_NO_CONTACT_RESPONSE);
589 } 576 }
590 } 577 }
591 578
@@ -594,11 +581,11 @@ public sealed class BSPrim : BSPhysObject
594 { 581 {
595 if (wantsCollisionEvents) 582 if (wantsCollisionEvents)
596 { 583 {
597 m_currentCollisionFlags = BulletSimAPI.AddToCollisionFlags2(BSBody.Ptr, CollisionFlags.BS_SUBSCRIBE_COLLISION_EVENTS); 584 CurrentCollisionFlags = BulletSimAPI.AddToCollisionFlags2(BSBody.Ptr, CollisionFlags.BS_SUBSCRIBE_COLLISION_EVENTS);
598 } 585 }
599 else 586 else
600 { 587 {
601 m_currentCollisionFlags = BulletSimAPI.RemoveFromCollisionFlags2(BSBody.Ptr, CollisionFlags.BS_SUBSCRIBE_COLLISION_EVENTS); 588 CurrentCollisionFlags = BulletSimAPI.RemoveFromCollisionFlags2(BSBody.Ptr, CollisionFlags.BS_SUBSCRIBE_COLLISION_EVENTS);
602 } 589 }
603 } 590 }
604 591
@@ -618,11 +605,11 @@ public sealed class BSPrim : BSPhysObject
618 set { _throttleUpdates = value; } 605 set { _throttleUpdates = value; }
619 } 606 }
620 public override bool IsColliding { 607 public override bool IsColliding {
621 get { return (_collidingStep == _scene.SimulationStep); } 608 get { return (CollidingStep == PhysicsScene.SimulationStep); }
622 set { _isColliding = value; } 609 set { _isColliding = value; }
623 } 610 }
624 public override bool CollidingGround { 611 public override bool CollidingGround {
625 get { return (_collidingGroundStep == _scene.SimulationStep); } 612 get { return (CollidingGroundStep == PhysicsScene.SimulationStep); }
626 set { _collidingGround = value; } 613 set { _collidingGround = value; }
627 } 614 }
628 public override bool CollidingObj { 615 public override bool CollidingObj {
@@ -656,7 +643,7 @@ public sealed class BSPrim : BSPhysObject
656 set { 643 set {
657 _rotationalVelocity = value; 644 _rotationalVelocity = value;
658 // m_log.DebugFormat("{0}: RotationalVelocity={1}", LogHeader, _rotationalVelocity); 645 // m_log.DebugFormat("{0}: RotationalVelocity={1}", LogHeader, _rotationalVelocity);
659 _scene.TaintedObject("BSPrim.setRotationalVelocity", delegate() 646 PhysicsScene.TaintedObject("BSPrim.setRotationalVelocity", delegate()
660 { 647 {
661 DetailLog("{0},BSPrim.SetRotationalVel,taint,rotvel={1}", LocalID, _rotationalVelocity); 648 DetailLog("{0},BSPrim.SetRotationalVel,taint,rotvel={1}", LocalID, _rotationalVelocity);
662 BulletSimAPI.SetAngularVelocity2(BSBody.Ptr, _rotationalVelocity); 649 BulletSimAPI.SetAngularVelocity2(BSBody.Ptr, _rotationalVelocity);
@@ -673,13 +660,13 @@ public sealed class BSPrim : BSPhysObject
673 get { return _buoyancy; } 660 get { return _buoyancy; }
674 set { 661 set {
675 _buoyancy = value; 662 _buoyancy = value;
676 _scene.TaintedObject("BSPrim.setBuoyancy", delegate() 663 PhysicsScene.TaintedObject("BSPrim.setBuoyancy", delegate()
677 { 664 {
678 DetailLog("{0},BSPrim.SetBuoyancy,taint,buoy={1}", LocalID, _buoyancy); 665 DetailLog("{0},BSPrim.SetBuoyancy,taint,buoy={1}", LocalID, _buoyancy);
679 // Buoyancy is faked by changing the gravity applied to the object 666 // Buoyancy is faked by changing the gravity applied to the object
680 float grav = Scene.Params.gravity * (1f - _buoyancy); 667 float grav = PhysicsScene.Params.gravity * (1f - _buoyancy);
681 BulletSimAPI.SetGravity2(BSBody.Ptr, new OMV.Vector3(0f, 0f, grav)); 668 BulletSimAPI.SetGravity2(BSBody.Ptr, new OMV.Vector3(0f, 0f, grav));
682 // BulletSimAPI.SetObjectBuoyancy(_scene.WorldID, _localID, _buoyancy); 669 // BulletSimAPI.SetObjectBuoyancy(Scene.WorldID, _localID, _buoyancy);
683 }); 670 });
684 } 671 }
685 } 672 }
@@ -730,7 +717,7 @@ public sealed class BSPrim : BSPhysObject
730 m_log.WarnFormat("{0}: Got a NaN force applied to a prim. LocalID={1}", LogHeader, LocalID); 717 m_log.WarnFormat("{0}: Got a NaN force applied to a prim. LocalID={1}", LogHeader, LocalID);
731 return; 718 return;
732 } 719 }
733 _scene.TaintedObject("BSPrim.AddForce", delegate() 720 PhysicsScene.TaintedObject("BSPrim.AddForce", delegate()
734 { 721 {
735 OMV.Vector3 fSum = OMV.Vector3.Zero; 722 OMV.Vector3 fSum = OMV.Vector3.Zero;
736 lock (m_accumulatedForces) 723 lock (m_accumulatedForces)
@@ -754,30 +741,6 @@ public sealed class BSPrim : BSPhysObject
754 public override void SetMomentum(OMV.Vector3 momentum) { 741 public override void SetMomentum(OMV.Vector3 momentum) {
755 DetailLog("{0},BSPrim.SetMomentum,call,mom={1}", LocalID, momentum); 742 DetailLog("{0},BSPrim.SetMomentum,call,mom={1}", LocalID, momentum);
756 } 743 }
757 public override void SubscribeEvents(int ms) {
758 _subscribedEventsMs = ms;
759 if (ms > 0)
760 {
761 // make sure first collision happens
762 _nextCollisionOkTime = Util.EnvironmentTickCount() - _subscribedEventsMs;
763
764 Scene.TaintedObject("BSPrim.SubscribeEvents", delegate()
765 {
766 m_currentCollisionFlags = BulletSimAPI.AddToCollisionFlags2(BSBody.Ptr, CollisionFlags.BS_SUBSCRIBE_COLLISION_EVENTS);
767 });
768 }
769 }
770 public override void UnSubscribeEvents() {
771 _subscribedEventsMs = 0;
772 Scene.TaintedObject("BSPrim.UnSubscribeEvents", delegate()
773 {
774 m_currentCollisionFlags = BulletSimAPI.RemoveFromCollisionFlags2(BSBody.Ptr, CollisionFlags.BS_SUBSCRIBE_COLLISION_EVENTS);
775 });
776 }
777 public override bool SubscribedEvents() {
778 return (_subscribedEventsMs > 0);
779 }
780
781 #region Mass Calculation 744 #region Mass Calculation
782 745
783 private float CalculateMass() 746 private float CalculateMass()
@@ -1071,8 +1034,8 @@ public sealed class BSPrim : BSPhysObject
1071 if (returnMass <= 0) 1034 if (returnMass <= 0)
1072 returnMass = 0.0001f; 1035 returnMass = 0.0001f;
1073 1036
1074 if (returnMass > _scene.MaximumObjectMass) 1037 if (returnMass > PhysicsScene.MaximumObjectMass)
1075 returnMass = _scene.MaximumObjectMass; 1038 returnMass = PhysicsScene.MaximumObjectMass;
1076 1039
1077 return returnMass; 1040 return returnMass;
1078 }// end CalculateMass 1041 }// end CalculateMass
@@ -1090,7 +1053,7 @@ public sealed class BSPrim : BSPhysObject
1090 bool haveShape = false; 1053 bool haveShape = false;
1091 1054
1092 // If the prim attributes are simple, this could be a simple Bullet native shape 1055 // If the prim attributes are simple, this could be a simple Bullet native shape
1093 if ((_pbs.SculptEntry && !Scene.ShouldMeshSculptedPrim) 1056 if ((_pbs.SculptEntry && !PhysicsScene.ShouldMeshSculptedPrim)
1094 || (_pbs.ProfileBegin == 0 && _pbs.ProfileEnd == 0 1057 || (_pbs.ProfileBegin == 0 && _pbs.ProfileEnd == 0
1095 && _pbs.ProfileHollow == 0 1058 && _pbs.ProfileHollow == 0
1096 && _pbs.PathTwist == 0 && _pbs.PathTwistBegin == 0 1059 && _pbs.PathTwist == 0 && _pbs.PathTwistBegin == 0
@@ -1156,12 +1119,12 @@ public sealed class BSPrim : BSPhysObject
1156 private bool CreateGeomMesh() 1119 private bool CreateGeomMesh()
1157 { 1120 {
1158 // level of detail based on size and type of the object 1121 // level of detail based on size and type of the object
1159 float lod = _scene.MeshLOD; 1122 float lod = PhysicsScene.MeshLOD;
1160 if (_pbs.SculptEntry) 1123 if (_pbs.SculptEntry)
1161 lod = _scene.SculptLOD; 1124 lod = PhysicsScene.SculptLOD;
1162 float maxAxis = Math.Max(_size.X, Math.Max(_size.Y, _size.Z)); 1125 float maxAxis = Math.Max(_size.X, Math.Max(_size.Y, _size.Z));
1163 if (maxAxis > _scene.MeshMegaPrimThreshold) 1126 if (maxAxis > PhysicsScene.MeshMegaPrimThreshold)
1164 lod = _scene.MeshMegaPrimLOD; 1127 lod = PhysicsScene.MeshMegaPrimLOD;
1165 1128
1166 ulong newMeshKey = (ulong)_pbs.GetMeshKey(_size, lod); 1129 ulong newMeshKey = (ulong)_pbs.GetMeshKey(_size, lod);
1167 // m_log.DebugFormat("{0}: CreateGeomMesh: lID={1}, oldKey={2}, newKey={3}", LogHeader, _localID, _meshKey, newMeshKey); 1130 // m_log.DebugFormat("{0}: CreateGeomMesh: lID={1}, oldKey={2}, newKey={3}", LogHeader, _localID, _meshKey, newMeshKey);
@@ -1175,14 +1138,14 @@ public sealed class BSPrim : BSPhysObject
1175 { 1138 {
1176 // m_log.DebugFormat("{0}: CreateGeom: deleting old mesh. lID={1}, Key={2}", LogHeader, _localID, _meshKey); 1139 // m_log.DebugFormat("{0}: CreateGeom: deleting old mesh. lID={1}, Key={2}", LogHeader, _localID, _meshKey);
1177 DetailLog("{0},BSPrim.CreateGeomMesh,deleteOld,key={1}", LocalID, _meshKey); 1140 DetailLog("{0},BSPrim.CreateGeomMesh,deleteOld,key={1}", LocalID, _meshKey);
1178 BulletSimAPI.DestroyMesh(_scene.WorldID, _meshKey); 1141 BulletSimAPI.DestroyMesh(PhysicsScene.WorldID, _meshKey);
1179 _mesh = null; 1142 _mesh = null;
1180 _meshKey = 0; 1143 _meshKey = 0;
1181 } 1144 }
1182 1145
1183 _meshKey = newMeshKey; 1146 _meshKey = newMeshKey;
1184 // always pass false for physicalness as this creates some sort of bounding box which we don't need 1147 // always pass false for physicalness as this creates some sort of bounding box which we don't need
1185 _mesh = _scene.mesher.CreateMesh(_avName, _pbs, _size, lod, false); 1148 _mesh = PhysicsScene.mesher.CreateMesh(_avName, _pbs, _size, lod, false);
1186 1149
1187 int[] indices = _mesh.getIndexListAsInt(); 1150 int[] indices = _mesh.getIndexListAsInt();
1188 List<OMV.Vector3> vertices = _mesh.getVertexList(); 1151 List<OMV.Vector3> vertices = _mesh.getVertexList();
@@ -1198,7 +1161,7 @@ public sealed class BSPrim : BSPhysObject
1198 1161
1199 // m_log.DebugFormat("{0}: CreateGeomMesh: calling CreateMesh. lid={1}, key={2}, indices={3}, vertices={4}", 1162 // m_log.DebugFormat("{0}: CreateGeomMesh: calling CreateMesh. lid={1}, key={2}, indices={3}, vertices={4}",
1200 // LogHeader, _localID, _meshKey, indices.Length, vertices.Count); 1163 // LogHeader, _localID, _meshKey, indices.Length, vertices.Count);
1201 BulletSimAPI.CreateMesh(_scene.WorldID, _meshKey, indices.GetLength(0), indices, 1164 BulletSimAPI.CreateMesh(PhysicsScene.WorldID, _meshKey, indices.GetLength(0), indices,
1202 vertices.Count, verticesAsFloats); 1165 vertices.Count, verticesAsFloats);
1203 1166
1204 _shapeType = ShapeData.PhysicsShapeType.SHAPE_MESH; 1167 _shapeType = ShapeData.PhysicsShapeType.SHAPE_MESH;
@@ -1211,7 +1174,7 @@ public sealed class BSPrim : BSPhysObject
1211 // Returns 'true' of a mesh was actually rebuild (we could also have one of these specs). 1174 // Returns 'true' of a mesh was actually rebuild (we could also have one of these specs).
1212 private bool CreateGeomHull() 1175 private bool CreateGeomHull()
1213 { 1176 {
1214 float lod = _pbs.SculptEntry ? _scene.SculptLOD : _scene.MeshLOD; 1177 float lod = _pbs.SculptEntry ? PhysicsScene.SculptLOD : PhysicsScene.MeshLOD;
1215 ulong newHullKey = (ulong)_pbs.GetMeshKey(_size, lod); 1178 ulong newHullKey = (ulong)_pbs.GetMeshKey(_size, lod);
1216 // m_log.DebugFormat("{0}: CreateGeomHull: lID={1}, oldKey={2}, newKey={3}", LogHeader, _localID, _hullKey, newHullKey); 1179 // m_log.DebugFormat("{0}: CreateGeomHull: lID={1}, oldKey={2}, newKey={3}", LogHeader, _localID, _hullKey, newHullKey);
1217 1180
@@ -1225,7 +1188,7 @@ public sealed class BSPrim : BSPhysObject
1225 { 1188 {
1226 // m_log.DebugFormat("{0}: CreateGeom: deleting old hull. Key={1}", LogHeader, _hullKey); 1189 // m_log.DebugFormat("{0}: CreateGeom: deleting old hull. Key={1}", LogHeader, _hullKey);
1227 DetailLog("{0},BSPrim.CreateGeomHull,deleteOldHull,key={1}", LocalID, _hullKey); 1190 DetailLog("{0},BSPrim.CreateGeomHull,deleteOldHull,key={1}", LocalID, _hullKey);
1228 BulletSimAPI.DestroyHull(_scene.WorldID, _hullKey); 1191 BulletSimAPI.DestroyHull(PhysicsScene.WorldID, _hullKey);
1229 _hullKey = 0; 1192 _hullKey = 0;
1230 } 1193 }
1231 1194
@@ -1314,7 +1277,7 @@ public sealed class BSPrim : BSPhysObject
1314 1277
1315 // create the hull definition in Bullet 1278 // create the hull definition in Bullet
1316 // m_log.DebugFormat("{0}: CreateGeom: calling CreateHull. lid={1}, key={2}, hulls={3}", LogHeader, _localID, _hullKey, hullCount); 1279 // m_log.DebugFormat("{0}: CreateGeom: calling CreateHull. lid={1}, key={2}, hulls={3}", LogHeader, _localID, _hullKey, hullCount);
1317 BulletSimAPI.CreateHull(_scene.WorldID, _hullKey, hullCount, convHulls); 1280 BulletSimAPI.CreateHull(PhysicsScene.WorldID, _hullKey, hullCount, convHulls);
1318 _shapeType = ShapeData.PhysicsShapeType.SHAPE_HULL; 1281 _shapeType = ShapeData.PhysicsShapeType.SHAPE_HULL;
1319 // meshes are already scaled by the meshmerizer 1282 // meshes are already scaled by the meshmerizer
1320 _scale = new OMV.Vector3(1f, 1f, 1f); 1283 _scale = new OMV.Vector3(1f, 1f, 1f);
@@ -1354,10 +1317,10 @@ public sealed class BSPrim : BSPhysObject
1354 ShapeData shape; 1317 ShapeData shape;
1355 FillShapeInfo(out shape); 1318 FillShapeInfo(out shape);
1356 // m_log.DebugFormat("{0}: CreateObject: lID={1}, shape={2}", LogHeader, _localID, shape.Type); 1319 // m_log.DebugFormat("{0}: CreateObject: lID={1}, shape={2}", LogHeader, _localID, shape.Type);
1357 bool ret = BulletSimAPI.CreateObject(_scene.WorldID, shape); 1320 bool ret = BulletSimAPI.CreateObject(PhysicsScene.WorldID, shape);
1358 1321
1359 // the CreateObject() may have recreated the rigid body. Make sure we have the latest address. 1322 // the CreateObject() may have recreated the rigid body. Make sure we have the latest address.
1360 BSBody = new BulletBody(LocalID, BulletSimAPI.GetBodyHandle2(_scene.World.Ptr, LocalID)); 1323 BSBody = new BulletBody(LocalID, BulletSimAPI.GetBodyHandle2(PhysicsScene.World.Ptr, LocalID));
1361 BSShape = new BulletShape(BulletSimAPI.GetCollisionShape2(BSBody.Ptr)); 1324 BSShape = new BulletShape(BulletSimAPI.GetCollisionShape2(BSBody.Ptr));
1362 1325
1363 return ret; 1326 return ret;
@@ -1490,61 +1453,10 @@ public sealed class BSPrim : BSPhysObject
1490 } 1453 }
1491 */ 1454 */
1492 } 1455 }
1493
1494 // I've collided with something
1495 // Called at taint time from within the Step() function
1496 CollisionEventUpdate collisionCollection;
1497 public override bool Collide(uint collidingWith, BSPhysObject collidee, OMV.Vector3 contactPoint, OMV.Vector3 contactNormal, float pentrationDepth)
1498 {
1499 bool ret = false;
1500
1501 // The following lines make IsColliding() and IsCollidingGround() work
1502 _collidingStep = Scene.SimulationStep;
1503 if (collidingWith <= Scene.TerrainManager.HighestTerrainID)
1504 {
1505 _collidingGroundStep = Scene.SimulationStep;
1506 }
1507
1508 // DetailLog("{0},BSPrim.Collison,call,with={1}", LocalID, collidingWith);
1509
1510 // prims in the same linkset cannot collide with each other
1511 if (collidee != null && (this.Linkset.LinksetID == collidee.Linkset.LinksetID))
1512 {
1513 return ret;
1514 }
1515
1516 // if someone has subscribed for collision events....
1517 if (SubscribedEvents()) {
1518 // throttle the collisions to the number of milliseconds specified in the subscription
1519 int nowTime = Scene.SimulationNowTime;
1520 if (nowTime >= _nextCollisionOkTime) {
1521 _nextCollisionOkTime = nowTime + _subscribedEventsMs;
1522
1523 if (collisionCollection == null)
1524 collisionCollection = new CollisionEventUpdate();
1525 collisionCollection.AddCollider(collidingWith, new ContactPoint(contactPoint, contactNormal, pentrationDepth));
1526 ret = true;
1527 }
1528 }
1529 return ret;
1530 }
1531
1532 // The scene is telling us it's time to pass our collected collisions into the simulator
1533 public override void SendCollisions()
1534 {
1535 if (collisionCollection != null && collisionCollection.Count > 0)
1536 {
1537 base.SendCollisionUpdate(collisionCollection);
1538 // The collisionCollection structure is passed around in the simulator.
1539 // Make sure we don't have a handle to that one and that a new one is used next time.
1540 collisionCollection = null;
1541 }
1542 }
1543
1544 // Invoke the detailed logger and output something if it's enabled. 1456 // Invoke the detailed logger and output something if it's enabled.
1545 private void DetailLog(string msg, params Object[] args) 1457 private void DetailLog(string msg, params Object[] args)
1546 { 1458 {
1547 Scene.PhysicsLogging.Write(msg, args); 1459 PhysicsScene.PhysicsLogging.Write(msg, args);
1548 } 1460 }
1549} 1461}
1550} 1462}