diff options
author | Robert Adams | 2012-09-18 08:39:52 -0700 |
---|---|---|
committer | Robert Adams | 2012-09-27 22:01:11 -0700 |
commit | ee7cda261cbbc9dcd558c35eabc070cc0bf45644 (patch) | |
tree | f30f9c9baf15ef6988983e53bf3141749eab75f9 /OpenSim/Region/Physics/BulletSPlugin/BSScene.cs | |
parent | Comment out unused RestPlugins text in OpenSimDefaults.ini (diff) | |
download | opensim-SC-ee7cda261cbbc9dcd558c35eabc070cc0bf45644.zip opensim-SC-ee7cda261cbbc9dcd558c35eabc070cc0bf45644.tar.gz opensim-SC-ee7cda261cbbc9dcd558c35eabc070cc0bf45644.tar.bz2 opensim-SC-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 'OpenSim/Region/Physics/BulletSPlugin/BSScene.cs')
-rw-r--r-- | OpenSim/Region/Physics/BulletSPlugin/BSScene.cs | 60 |
1 files changed, 41 insertions, 19 deletions
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSScene.cs b/OpenSim/Region/Physics/BulletSPlugin/BSScene.cs index 52997dd..dabced5 100644 --- a/OpenSim/Region/Physics/BulletSPlugin/BSScene.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSScene.cs | |||
@@ -75,10 +75,11 @@ public class BSScene : PhysicsScene, IPhysicsParameters | |||
75 | 75 | ||
76 | public Dictionary<uint, BSPhysObject> PhysObjects = new Dictionary<uint, BSPhysObject>(); | 76 | public Dictionary<uint, BSPhysObject> PhysObjects = new Dictionary<uint, BSPhysObject>(); |
77 | 77 | ||
78 | private HashSet<BSPhysObject> m_objectsWithCollisions = new HashSet<BSPhysObject>(); | 78 | public HashSet<BSPhysObject> ObjectsWithCollisions = new HashSet<BSPhysObject>(); |
79 | // Following is a kludge and can be removed when avatar animation updating is | 79 | public HashSet<BSPhysObject> ObjectsWithNoMoreCollisions = new HashSet<BSPhysObject>(); |
80 | // moved to a better place. | 80 | // Keep track of all the avatars so we can send them a collision event |
81 | private HashSet<BSPhysObject> m_avatarsWithCollisions = new HashSet<BSPhysObject>(); | 81 | // every tick so OpenSim will update its animation. |
82 | private HashSet<BSPhysObject> m_avatars = new HashSet<BSPhysObject>(); | ||
82 | 83 | ||
83 | // List of all the objects that have vehicle properties and should be called | 84 | // List of all the objects that have vehicle properties and should be called |
84 | // to update each physics step. | 85 | // to update each physics step. |
@@ -379,7 +380,7 @@ public class BSScene : PhysicsScene, IPhysicsParameters | |||
379 | // TODO: Remove kludge someday. | 380 | // TODO: Remove kludge someday. |
380 | // We must generate a collision for avatars whether they collide or not. | 381 | // We must generate a collision for avatars whether they collide or not. |
381 | // This is required by OpenSim to update avatar animations, etc. | 382 | // This is required by OpenSim to update avatar animations, etc. |
382 | lock (m_avatarsWithCollisions) m_avatarsWithCollisions.Add(actor); | 383 | lock (m_avatars) m_avatars.Add(actor); |
383 | 384 | ||
384 | return actor; | 385 | return actor; |
385 | } | 386 | } |
@@ -397,7 +398,7 @@ public class BSScene : PhysicsScene, IPhysicsParameters | |||
397 | { | 398 | { |
398 | lock (PhysObjects) PhysObjects.Remove(actor.LocalID); | 399 | lock (PhysObjects) PhysObjects.Remove(actor.LocalID); |
399 | // Remove kludge someday | 400 | // Remove kludge someday |
400 | lock (m_avatarsWithCollisions) m_avatarsWithCollisions.Remove(bsactor); | 401 | lock (m_avatars) m_avatars.Remove(bsactor); |
401 | } | 402 | } |
402 | catch (Exception e) | 403 | catch (Exception e) |
403 | { | 404 | { |
@@ -464,6 +465,9 @@ public class BSScene : PhysicsScene, IPhysicsParameters | |||
464 | int collidersCount = 0; | 465 | int collidersCount = 0; |
465 | IntPtr collidersPtr; | 466 | IntPtr collidersPtr; |
466 | 467 | ||
468 | int beforeTime = 0; | ||
469 | int simTime = 0; | ||
470 | |||
467 | // prevent simulation until we've been initialized | 471 | // prevent simulation until we've been initialized |
468 | if (!m_initialized) return 5.0f; | 472 | if (!m_initialized) return 5.0f; |
469 | 473 | ||
@@ -481,10 +485,14 @@ public class BSScene : PhysicsScene, IPhysicsParameters | |||
481 | int numSubSteps = 0; | 485 | int numSubSteps = 0; |
482 | try | 486 | try |
483 | { | 487 | { |
488 | if (PhysicsLogging.Enabled) beforeTime = Util.EnvironmentTickCount(); | ||
489 | |||
484 | numSubSteps = BulletSimAPI.PhysicsStep(WorldID, timeStep, m_maxSubSteps, m_fixedTimeStep, | 490 | numSubSteps = BulletSimAPI.PhysicsStep(WorldID, timeStep, m_maxSubSteps, m_fixedTimeStep, |
485 | out updatedEntityCount, out updatedEntitiesPtr, out collidersCount, out collidersPtr); | 491 | out updatedEntityCount, out updatedEntitiesPtr, out collidersCount, out collidersPtr); |
486 | DetailLog("{0},Simulate,call, nTaints= {1}, substeps={2}, updates={3}, colliders={4}", | 492 | |
487 | DetailLogZero, numTaints, numSubSteps, updatedEntityCount, collidersCount); | 493 | if (PhysicsLogging.Enabled) simTime = Util.EnvironmentTickCountSubtract(beforeTime); |
494 | DetailLog("{0},Simulate,call, nTaints={1}, simTime={2}, substeps={3}, updates={4}, colliders={5}", | ||
495 | DetailLogZero, numTaints, simTime, numSubSteps, updatedEntityCount, collidersCount); | ||
488 | } | 496 | } |
489 | catch (Exception e) | 497 | catch (Exception e) |
490 | { | 498 | { |
@@ -502,12 +510,6 @@ public class BSScene : PhysicsScene, IPhysicsParameters | |||
502 | // Get a value for 'now' so all the collision and update routines don't have to get their own | 510 | // Get a value for 'now' so all the collision and update routines don't have to get their own |
503 | SimulationNowTime = Util.EnvironmentTickCount(); | 511 | SimulationNowTime = Util.EnvironmentTickCount(); |
504 | 512 | ||
505 | // This is a kludge to get avatar movement updates. | ||
506 | // ODE sends collisions for avatars even if there are have been no collisions. This updates | ||
507 | // avatar animations and stuff. | ||
508 | // If you fix avatar animation updates, remove this overhead and let normal collision processing happen. | ||
509 | m_objectsWithCollisions = new HashSet<BSPhysObject>(m_avatarsWithCollisions); | ||
510 | |||
511 | // If there were collisions, process them by sending the event to the prim. | 513 | // If there were collisions, process them by sending the event to the prim. |
512 | // Collisions must be processed before updates. | 514 | // Collisions must be processed before updates. |
513 | if (collidersCount > 0) | 515 | if (collidersCount > 0) |
@@ -523,11 +525,31 @@ public class BSScene : PhysicsScene, IPhysicsParameters | |||
523 | } | 525 | } |
524 | } | 526 | } |
525 | 527 | ||
528 | // This is a kludge to get avatar movement updates. | ||
529 | // ODE sends collisions for avatars even if there are have been no collisions. This updates | ||
530 | // avatar animations and stuff. | ||
531 | // If you fix avatar animation updates, remove this overhead and let normal collision processing happen. | ||
532 | foreach (BSPhysObject bsp in m_avatars) | ||
533 | bsp.SendCollisions(); | ||
534 | |||
526 | // The above SendCollision's batch up the collisions on the objects. | 535 | // The above SendCollision's batch up the collisions on the objects. |
527 | // Now push the collisions into the simulator. | 536 | // Now push the collisions into the simulator. |
528 | foreach (BSPhysObject bsp in m_objectsWithCollisions) | 537 | // If the object is done colliding, it will add itself to the ObjectsWithNoMoreCollisions list. |
529 | bsp.SendCollisions(); | 538 | if (ObjectsWithCollisions.Count > 0) |
530 | m_objectsWithCollisions.Clear(); | 539 | { |
540 | foreach (BSPhysObject bsp in ObjectsWithCollisions) | ||
541 | if (!m_avatars.Contains(bsp)) // don't call avatars twice | ||
542 | bsp.SendCollisions(); | ||
543 | } | ||
544 | |||
545 | // Objects that are done colliding are removed from the ObjectsWithCollisions list. | ||
546 | // This can't be done by SendCollisions because it is inside an iteration of ObjectWithCollisions. | ||
547 | if (ObjectsWithNoMoreCollisions.Count > 0) | ||
548 | { | ||
549 | foreach (BSPhysObject po in ObjectsWithNoMoreCollisions) | ||
550 | ObjectsWithCollisions.Remove(po); | ||
551 | ObjectsWithNoMoreCollisions.Clear(); | ||
552 | } | ||
531 | 553 | ||
532 | // If any of the objects had updated properties, tell the object it has been changed by the physics engine | 554 | // If any of the objects had updated properties, tell the object it has been changed by the physics engine |
533 | if (updatedEntityCount > 0) | 555 | if (updatedEntityCount > 0) |
@@ -555,7 +577,7 @@ public class BSScene : PhysicsScene, IPhysicsParameters | |||
555 | // The physics engine returns the number of milliseconds it simulated this call. | 577 | // The physics engine returns the number of milliseconds it simulated this call. |
556 | // These are summed and normalized to one second and divided by 1000 to give the reported physics FPS. | 578 | // These are summed and normalized to one second and divided by 1000 to give the reported physics FPS. |
557 | // Since Bullet normally does 5 or 6 substeps, this will normally sum to about 60 FPS. | 579 | // Since Bullet normally does 5 or 6 substeps, this will normally sum to about 60 FPS. |
558 | return numSubSteps * m_fixedTimeStep; | 580 | return numSubSteps * m_fixedTimeStep * 1000; |
559 | } | 581 | } |
560 | 582 | ||
561 | // Something has collided | 583 | // Something has collided |
@@ -583,7 +605,7 @@ public class BSScene : PhysicsScene, IPhysicsParameters | |||
583 | if (collider.Collide(collidingWith, collidee, collidePoint, collideNormal, penetration)) | 605 | if (collider.Collide(collidingWith, collidee, collidePoint, collideNormal, penetration)) |
584 | { | 606 | { |
585 | // If a collision was posted, remember to send it to the simulator | 607 | // If a collision was posted, remember to send it to the simulator |
586 | m_objectsWithCollisions.Add(collider); | 608 | ObjectsWithCollisions.Add(collider); |
587 | } | 609 | } |
588 | 610 | ||
589 | return; | 611 | return; |