aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Physics/BulletSPlugin/BSPhysObject.cs
diff options
context:
space:
mode:
authorRobert Adams2013-01-28 15:11:50 -0800
committerRobert Adams2013-01-28 15:11:50 -0800
commite9aff0a91d6a4d02498ce45759389bb09b34fcbc (patch)
tree7379562cbd8825413be1db2bc9a7f4a501e58207 /OpenSim/Region/Physics/BulletSPlugin/BSPhysObject.cs
parentBulletSim: rename 'uint' to 'UInt32' to make clear the type that is passed to... (diff)
downloadopensim-SC_OLD-e9aff0a91d6a4d02498ce45759389bb09b34fcbc.zip
opensim-SC_OLD-e9aff0a91d6a4d02498ce45759389bb09b34fcbc.tar.gz
opensim-SC_OLD-e9aff0a91d6a4d02498ce45759389bb09b34fcbc.tar.bz2
opensim-SC_OLD-e9aff0a91d6a4d02498ce45759389bb09b34fcbc.tar.xz
BulletSim: do not zero an avatar's standing velocity if it is standing
on a moving object. Rearrange pre/post action subscription code to put more in locks. Add meshmerizer params to BulletSimTestUtil scene creation (and fix line endings). Rebuilt version of DLLs and SOs with cleaned up code and no profiling for sure.
Diffstat (limited to 'OpenSim/Region/Physics/BulletSPlugin/BSPhysObject.cs')
-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()