aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Physics/BulletSPlugin/BSPhysObject.cs
diff options
context:
space:
mode:
Diffstat (limited to '')
-rwxr-xr-xOpenSim/Region/Physics/BulletSPlugin/BSPhysObject.cs33
1 files changed, 24 insertions, 9 deletions
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSPhysObject.cs b/OpenSim/Region/Physics/BulletSPlugin/BSPhysObject.cs
index 5e8143c..a113530 100755
--- a/OpenSim/Region/Physics/BulletSPlugin/BSPhysObject.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSPhysObject.cs
@@ -96,6 +96,7 @@ public abstract class BSPhysObject : PhysicsActor
96 CollidingStep = 0; 96 CollidingStep = 0;
97 CollidingGroundStep = 0; 97 CollidingGroundStep = 0;
98 CollisionAccumulation = 0; 98 CollisionAccumulation = 0;
99 ColliderIsMoving = false;
99 CollisionScore = 0; 100 CollisionScore = 0;
100 } 101 }
101 102
@@ -177,13 +178,14 @@ public abstract class BSPhysObject : PhysicsActor
177 public abstract OMV.Vector3 RawPosition { get; set; } 178 public abstract OMV.Vector3 RawPosition { get; set; }
178 public abstract OMV.Vector3 ForcePosition { get; set; } 179 public abstract OMV.Vector3 ForcePosition { get; set; }
179 180
180 // Position is what the simulator thinks the positions of the prim is. 181 // 'Position' and 'Orientation' is what the simulator thinks the positions of the prim is.
181 // Because Bullet needs the zero coordinate to be the center of mass of the linkset, 182 // Because Bullet needs the zero coordinate to be the center of mass of the linkset,
182 // sometimes it is necessary to displace the position the physics engine thinks 183 // sometimes it is necessary to displace the position the physics engine thinks
183 // the position is. PositionDisplacement must be added and removed from the 184 // the position is. PositionDisplacement must be added and removed from the
184 // position as the simulator position is stored and fetched from the physics 185 // position as the simulator position is stored and fetched from the physics
185 // engine. 186 // engine. Similar to OrientationDisplacement.
186 public virtual OMV.Vector3 PositionDisplacement { get; set; } 187 public virtual OMV.Vector3 PositionDisplacement { get; set; }
188 public virtual OMV.Quaternion OrientationDisplacement { get; set; }
187 189
188 public abstract OMV.Quaternion RawOrientation { get; set; } 190 public abstract OMV.Quaternion RawOrientation { get; set; }
189 public abstract OMV.Quaternion ForceOrientation { get; set; } 191 public abstract OMV.Quaternion ForceOrientation { get; set; }
@@ -240,6 +242,9 @@ public abstract class BSPhysObject : PhysicsActor
240 protected long CollidingObjectStep { get; set; } 242 protected long CollidingObjectStep { get; set; }
241 // The collision flags we think are set in Bullet 243 // The collision flags we think are set in Bullet
242 protected CollisionFlags CurrentCollisionFlags { get; set; } 244 protected CollisionFlags CurrentCollisionFlags { get; set; }
245 // On a collision, check the collider and remember if the last collider was moving
246 // Used to modify the standing of avatars (avatars on stationary things stand still)
247 protected bool ColliderIsMoving;
243 248
244 // Count of collisions for this object 249 // Count of collisions for this object
245 protected long CollisionAccumulation { get; set; } 250 protected long CollisionAccumulation { get; set; }
@@ -307,7 +312,10 @@ public abstract class BSPhysObject : PhysicsActor
307 312
308 CollisionAccumulation++; 313 CollisionAccumulation++;
309 314
310 // if someone has subscribed for collision events.... 315 // For movement tests, remember if we are colliding with an object that is moving.
316 ColliderIsMoving = collidee != null ? collidee.RawVelocity != OMV.Vector3.Zero : false;
317
318 // If someone has subscribed for collision events log the collision so it will be reported up
311 if (SubscribedEvents()) { 319 if (SubscribedEvents()) {
312 CollisionCollection.AddCollider(collidingWith, new ContactPoint(contactPoint, contactNormal, pentrationDepth)); 320 CollisionCollection.AddCollider(collidingWith, new ContactPoint(contactPoint, contactNormal, pentrationDepth));
313 DetailLog("{0},{1}.Collison.AddCollider,call,with={2},point={3},normal={4},depth={5}", 321 DetailLog("{0},{1}.Collison.AddCollider,call,with={2},point={3},normal={4},depth={5}",
@@ -393,12 +401,13 @@ public abstract class BSPhysObject : PhysicsActor
393 public override bool SubscribedEvents() { 401 public override bool SubscribedEvents() {
394 return (SubscribedEventsMs > 0); 402 return (SubscribedEventsMs > 0);
395 } 403 }
396 // Because 'CollisionScore' is calls many times while sorting it should not be recomputed 404 // Because 'CollisionScore' is called many times while sorting, it should not be recomputed
397 // each time called. So this is built to be light weight for each collision and to do 405 // each time called. So this is built to be light weight for each collision and to do
398 // all the processing when the user asks for the info. 406 // all the processing when the user asks for the info.
399 public void ComputeCollisionScore() 407 public void ComputeCollisionScore()
400 { 408 {
401 // Scale the collision count by the time since the last collision 409 // Scale the collision count by the time since the last collision.
410 // The "+1" prevents dividing by zero.
402 long timeAgo = PhysicsScene.SimulationStep - CollidingStep + 1; 411 long timeAgo = PhysicsScene.SimulationStep - CollidingStep + 1;
403 CollisionScore = CollisionAccumulation / timeAgo; 412 CollisionScore = CollisionAccumulation / timeAgo;
404 } 413 }
@@ -423,13 +432,15 @@ public abstract class BSPhysObject : PhysicsActor
423 UnRegisterPreStepAction(op, id); 432 UnRegisterPreStepAction(op, id);
424 433
425 RegisteredPrestepActions[identifier] = actn; 434 RegisteredPrestepActions[identifier] = actn;
435
436 PhysicsScene.BeforeStep += actn;
426 } 437 }
427 PhysicsScene.BeforeStep += actn;
428 DetailLog("{0},BSPhysObject.RegisterPreStepAction,id={1}", LocalID, identifier); 438 DetailLog("{0},BSPhysObject.RegisterPreStepAction,id={1}", LocalID, identifier);
429 } 439 }
430 440
431 // Unregister a pre step action. Safe to call if the action has not been registered. 441 // Unregister a pre step action. Safe to call if the action has not been registered.
432 protected void UnRegisterPreStepAction(string op, uint id) 442 // Returns 'true' if an action was actually removed
443 protected bool UnRegisterPreStepAction(string op, uint id)
433 { 444 {
434 string identifier = op + "-" + id.ToString(); 445 string identifier = op + "-" + id.ToString();
435 bool removed = false; 446 bool removed = false;
@@ -443,6 +454,7 @@ public abstract class BSPhysObject : PhysicsActor
443 } 454 }
444 } 455 }
445 DetailLog("{0},BSPhysObject.UnRegisterPreStepAction,id={1},removed={2}", LocalID, identifier, removed); 456 DetailLog("{0},BSPhysObject.UnRegisterPreStepAction,id={1},removed={2}", LocalID, identifier, removed);
457 return removed;
446 } 458 }
447 459
448 protected void UnRegisterAllPreStepActions() 460 protected void UnRegisterAllPreStepActions()
@@ -468,13 +480,15 @@ public abstract class BSPhysObject : PhysicsActor
468 UnRegisterPostStepAction(op, id); 480 UnRegisterPostStepAction(op, id);
469 481
470 RegisteredPoststepActions[identifier] = actn; 482 RegisteredPoststepActions[identifier] = actn;
483
484 PhysicsScene.AfterStep += actn;
471 } 485 }
472 PhysicsScene.AfterStep += actn;
473 DetailLog("{0},BSPhysObject.RegisterPostStepAction,id={1}", LocalID, identifier); 486 DetailLog("{0},BSPhysObject.RegisterPostStepAction,id={1}", LocalID, identifier);
474 } 487 }
475 488
476 // Unregister a pre step action. Safe to call if the action has not been registered. 489 // Unregister a pre step action. Safe to call if the action has not been registered.
477 protected void UnRegisterPostStepAction(string op, uint id) 490 // Returns 'true' if an action was actually removed.
491 protected bool UnRegisterPostStepAction(string op, uint id)
478 { 492 {
479 string identifier = op + "-" + id.ToString(); 493 string identifier = op + "-" + id.ToString();
480 bool removed = false; 494 bool removed = false;
@@ -488,6 +502,7 @@ public abstract class BSPhysObject : PhysicsActor
488 } 502 }
489 } 503 }
490 DetailLog("{0},BSPhysObject.UnRegisterPostStepAction,id={1},removed={2}", LocalID, identifier, removed); 504 DetailLog("{0},BSPhysObject.UnRegisterPostStepAction,id={1},removed={2}", LocalID, identifier, removed);
505 return removed;
491 } 506 }
492 507
493 protected void UnRegisterAllPostStepActions() 508 protected void UnRegisterAllPostStepActions()