diff options
author | Robert Adams | 2012-09-13 13:51:42 -0700 |
---|---|---|
committer | Robert Adams | 2012-09-15 15:31:54 -0700 |
commit | 6632eb7c051e2638ea1c58c2876e7d6825398556 (patch) | |
tree | 15e19cbd50e4ab1934d7ae2290784cf54488641f /OpenSim/Region/Physics/BulletSPlugin | |
parent | BulletSim: set all linkset objects center of mass to the whole linkset's cent... (diff) | |
download | opensim-SC-6632eb7c051e2638ea1c58c2876e7d6825398556.zip opensim-SC-6632eb7c051e2638ea1c58c2876e7d6825398556.tar.gz opensim-SC-6632eb7c051e2638ea1c58c2876e7d6825398556.tar.bz2 opensim-SC-6632eb7c051e2638ea1c58c2876e7d6825398556.tar.xz |
BulletSim: Remove calculation and passing of unused collied object type.
Fix collision code to properly sense mega-region children regions as terrain.
When setting an object physical, reset all the physical properties (friction, ...).
Diffstat (limited to 'OpenSim/Region/Physics/BulletSPlugin')
-rw-r--r-- | OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs | 8 | ||||
-rwxr-xr-x | OpenSim/Region/Physics/BulletSPlugin/BSPhysObject.cs | 2 | ||||
-rw-r--r-- | OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs | 28 | ||||
-rw-r--r-- | OpenSim/Region/Physics/BulletSPlugin/BSScene.cs | 26 |
4 files changed, 36 insertions, 28 deletions
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs b/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs index a9b1365..526dbad 100644 --- a/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs | |||
@@ -529,22 +529,20 @@ public class BSCharacter : BSPhysObject | |||
529 | // The collision, if it should be reported to the character, is placed in a collection | 529 | // The collision, if it should be reported to the character, is placed in a collection |
530 | // that will later be sent to the simulator when SendCollisions() is called. | 530 | // that will later be sent to the simulator when SendCollisions() is called. |
531 | CollisionEventUpdate collisionCollection = null; | 531 | CollisionEventUpdate collisionCollection = null; |
532 | public override bool Collide(uint collidingWith, BSPhysObject collidee, ActorTypes type, Vector3 contactPoint, Vector3 contactNormal, float pentrationDepth) | 532 | public override bool Collide(uint collidingWith, BSPhysObject collidee, Vector3 contactPoint, Vector3 contactNormal, float pentrationDepth) |
533 | { | 533 | { |
534 | // m_log.DebugFormat("{0}: Collide: ms={1}, id={2}, with={3}", LogHeader, _subscribedEventsMs, LocalID, collidingWith); | ||
535 | |||
536 | bool ret = false; | 534 | bool ret = false; |
537 | 535 | ||
538 | // The following makes IsColliding() and IsCollidingGround() work | 536 | // The following makes IsColliding() and IsCollidingGround() work |
539 | _collidingStep = Scene.SimulationStep; | 537 | _collidingStep = Scene.SimulationStep; |
540 | if (collidingWith == BSScene.TERRAIN_ID || collidingWith == BSScene.GROUNDPLANE_ID) | 538 | if (collidingWith <= Scene.TerrainManager.HighestTerrainID) |
541 | { | 539 | { |
542 | _collidingGroundStep = Scene.SimulationStep; | 540 | _collidingGroundStep = Scene.SimulationStep; |
543 | } | 541 | } |
544 | // DetailLog("{0},BSCharacter.Collison,call,with={1}", LocalID, collidingWith); | 542 | // DetailLog("{0},BSCharacter.Collison,call,with={1}", LocalID, collidingWith); |
545 | 543 | ||
546 | // throttle collisions to the rate specified in the subscription | 544 | // throttle collisions to the rate specified in the subscription |
547 | if (_subscribedEventsMs != 0) { | 545 | if (SubscribedEvents()) { |
548 | int nowTime = Scene.SimulationNowTime; | 546 | int nowTime = Scene.SimulationNowTime; |
549 | if (nowTime >= _nextCollisionOkTime) { | 547 | if (nowTime >= _nextCollisionOkTime) { |
550 | _nextCollisionOkTime = nowTime + _subscribedEventsMs; | 548 | _nextCollisionOkTime = nowTime + _subscribedEventsMs; |
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSPhysObject.cs b/OpenSim/Region/Physics/BulletSPlugin/BSPhysObject.cs index 969c53e..3fe71e1 100755 --- a/OpenSim/Region/Physics/BulletSPlugin/BSPhysObject.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSPhysObject.cs | |||
@@ -41,7 +41,7 @@ public abstract class BSPhysObject : PhysicsActor | |||
41 | { | 41 | { |
42 | public abstract BSLinkset Linkset { get; set; } | 42 | public abstract BSLinkset Linkset { get; set; } |
43 | 43 | ||
44 | public abstract bool Collide(uint collidingWith, BSPhysObject collidee, ActorTypes type, | 44 | public abstract bool Collide(uint collidingWith, BSPhysObject collidee, |
45 | OMV.Vector3 contactPoint, OMV.Vector3 contactNormal, float pentrationDepth); | 45 | OMV.Vector3 contactPoint, OMV.Vector3 contactNormal, float pentrationDepth); |
46 | public abstract void SendCollisions(); | 46 | public abstract void SendCollisions(); |
47 | 47 | ||
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs b/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs index 04b7be5..6827be0 100644 --- a/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs | |||
@@ -545,14 +545,31 @@ public sealed class BSPrim : BSPhysObject | |||
545 | { | 545 | { |
546 | // Not a Bullet static object | 546 | // Not a Bullet static object |
547 | m_currentCollisionFlags = BulletSimAPI.RemoveFromCollisionFlags2(BSBody.Ptr, CollisionFlags.CF_STATIC_OBJECT); | 547 | m_currentCollisionFlags = BulletSimAPI.RemoveFromCollisionFlags2(BSBody.Ptr, CollisionFlags.CF_STATIC_OBJECT); |
548 | |||
549 | // Set various physical properties so internal things will get computed correctly as they are set | ||
550 | BulletSimAPI.SetFriction2(BSBody.Ptr, Scene.Params.defaultFriction); | ||
551 | BulletSimAPI.SetRestitution2(BSBody.Ptr, Scene.Params.defaultRestitution); | ||
552 | // per http://www.bulletphysics.org/Bullet/phpBB3/viewtopic.php?t=3382 | ||
553 | BulletSimAPI.SetInterpolationLinearVelocity2(BSBody.Ptr, OMV.Vector3.Zero); | ||
554 | BulletSimAPI.SetInterpolationAngularVelocity2(BSBody.Ptr, OMV.Vector3.Zero); | ||
555 | BulletSimAPI.SetInterpolationVelocity2(BSBody.Ptr, OMV.Vector3.Zero, OMV.Vector3.Zero); | ||
556 | |||
548 | // A dynamic object has mass | 557 | // A dynamic object has mass |
549 | IntPtr collisionShapePtr = BulletSimAPI.GetCollisionShape2(BSBody.Ptr); | 558 | IntPtr collisionShapePtr = BulletSimAPI.GetCollisionShape2(BSBody.Ptr); |
550 | OMV.Vector3 inertia = BulletSimAPI.CalculateLocalInertia2(collisionShapePtr, Linkset.LinksetMass); | 559 | OMV.Vector3 inertia = BulletSimAPI.CalculateLocalInertia2(collisionShapePtr, Linkset.LinksetMass); |
551 | BulletSimAPI.SetMassProps2(BSBody.Ptr, _mass, inertia); | 560 | BulletSimAPI.SetMassProps2(BSBody.Ptr, _mass, inertia); |
552 | // Inertia is based on our new mass | 561 | // Inertia is based on our new mass |
553 | BulletSimAPI.UpdateInertiaTensor2(BSBody.Ptr); | 562 | BulletSimAPI.UpdateInertiaTensor2(BSBody.Ptr); |
563 | |||
564 | // Various values for simulation limits | ||
565 | BulletSimAPI.SetDamping2(BSBody.Ptr, Scene.Params.linearDamping, Scene.Params.angularDamping); | ||
566 | BulletSimAPI.SetDeactivationTime2(BSBody.Ptr, Scene.Params.deactivationTime); | ||
567 | BulletSimAPI.SetSleepingThresholds2(BSBody.Ptr, Scene.Params.linearSleepingThreshold, Scene.Params.angularSleepingThreshold); | ||
568 | BulletSimAPI.SetContactProcessingThreshold2(BSBody.Ptr, Scene.Params.contactProcessingThreshold); | ||
569 | |||
554 | // There can be special things needed for implementing linksets | 570 | // There can be special things needed for implementing linksets |
555 | Linkset.MakeDynamic(this); | 571 | Linkset.MakeDynamic(this); |
572 | |||
556 | // Force activation of the object so Bullet will act on it. | 573 | // Force activation of the object so Bullet will act on it. |
557 | BulletSimAPI.Activate2(BSBody.Ptr, true); | 574 | BulletSimAPI.Activate2(BSBody.Ptr, true); |
558 | } | 575 | } |
@@ -1475,16 +1492,15 @@ public sealed class BSPrim : BSPhysObject | |||
1475 | // I've collided with something | 1492 | // I've collided with something |
1476 | // Called at taint time from within the Step() function | 1493 | // Called at taint time from within the Step() function |
1477 | CollisionEventUpdate collisionCollection; | 1494 | CollisionEventUpdate collisionCollection; |
1478 | public override bool Collide(uint collidingWith, BSPhysObject collidee, ActorTypes type, OMV.Vector3 contactPoint, OMV.Vector3 contactNormal, float pentrationDepth) | 1495 | public override bool Collide(uint collidingWith, BSPhysObject collidee, OMV.Vector3 contactPoint, OMV.Vector3 contactNormal, float pentrationDepth) |
1479 | { | 1496 | { |
1480 | // m_log.DebugFormat("{0}: Collide: ms={1}, id={2}, with={3}", LogHeader, _subscribedEventsMs, LocalID, collidingWith); | ||
1481 | bool ret = false; | 1497 | bool ret = false; |
1482 | 1498 | ||
1483 | // The following lines make IsColliding() and IsCollidingGround() work | 1499 | // The following lines make IsColliding() and IsCollidingGround() work |
1484 | _collidingStep = _scene.SimulationStep; | 1500 | _collidingStep = Scene.SimulationStep; |
1485 | if (collidingWith == BSScene.TERRAIN_ID || collidingWith == BSScene.GROUNDPLANE_ID) | 1501 | if (collidingWith <= Scene.TerrainManager.HighestTerrainID) |
1486 | { | 1502 | { |
1487 | _collidingGroundStep = _scene.SimulationStep; | 1503 | _collidingGroundStep = Scene.SimulationStep; |
1488 | } | 1504 | } |
1489 | 1505 | ||
1490 | // DetailLog("{0},BSPrim.Collison,call,with={1}", LocalID, collidingWith); | 1506 | // DetailLog("{0},BSPrim.Collison,call,with={1}", LocalID, collidingWith); |
@@ -1498,7 +1514,7 @@ public sealed class BSPrim : BSPhysObject | |||
1498 | // if someone has subscribed for collision events.... | 1514 | // if someone has subscribed for collision events.... |
1499 | if (SubscribedEvents()) { | 1515 | if (SubscribedEvents()) { |
1500 | // throttle the collisions to the number of milliseconds specified in the subscription | 1516 | // throttle the collisions to the number of milliseconds specified in the subscription |
1501 | int nowTime = _scene.SimulationNowTime; | 1517 | int nowTime = Scene.SimulationNowTime; |
1502 | if (nowTime >= _nextCollisionOkTime) { | 1518 | if (nowTime >= _nextCollisionOkTime) { |
1503 | _nextCollisionOkTime = nowTime + _subscribedEventsMs; | 1519 | _nextCollisionOkTime = nowTime + _subscribedEventsMs; |
1504 | 1520 | ||
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSScene.cs b/OpenSim/Region/Physics/BulletSPlugin/BSScene.cs index 9c958d5..c38867f 100644 --- a/OpenSim/Region/Physics/BulletSPlugin/BSScene.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSScene.cs | |||
@@ -583,27 +583,21 @@ public class BSScene : PhysicsScene, IPhysicsParameters | |||
583 | return; // don't send collisions to the terrain | 583 | return; // don't send collisions to the terrain |
584 | } | 584 | } |
585 | 585 | ||
586 | BSPhysObject collider = PhysObjects[localID]; | 586 | BSPhysObject collider; |
587 | // TODO: as of this code, terrain was not in the physical object list. | 587 | if (!PhysObjects.TryGetValue(localID, out collider)) |
588 | // When BSTerrain is created and it will be in the list, we can remove | ||
589 | // the possibility that it's not there and just fetch the collidee. | ||
590 | BSPhysObject collidee = null; | ||
591 | |||
592 | ActorTypes type = ActorTypes.Prim; | ||
593 | if (collidingWith <= TerrainManager.HighestTerrainID) | ||
594 | { | 588 | { |
595 | type = ActorTypes.Ground; | 589 | // If the object that is colliding cannot be found, just ignore the collision. |
596 | } | 590 | return; |
597 | else | ||
598 | { | ||
599 | collidee = PhysObjects[collidingWith]; | ||
600 | if (collidee is BSCharacter) | ||
601 | type = ActorTypes.Agent; | ||
602 | } | 591 | } |
603 | 592 | ||
593 | // The terrain is not in the physical object list so 'collidee' | ||
594 | // can be null when Collide() is called. | ||
595 | BSPhysObject collidee = null; | ||
596 | PhysObjects.TryGetValue(collidingWith, out collidee); | ||
597 | |||
604 | // DetailLog("{0},BSScene.SendCollision,collide,id={1},with={2}", DetailLogZero, localID, collidingWith); | 598 | // DetailLog("{0},BSScene.SendCollision,collide,id={1},with={2}", DetailLogZero, localID, collidingWith); |
605 | 599 | ||
606 | if (collider.Collide(collidingWith, collidee, type, collidePoint, collideNormal, penetration)) | 600 | if (collider.Collide(collidingWith, collidee, collidePoint, collideNormal, penetration)) |
607 | { | 601 | { |
608 | // If a collision was posted, remember to send it to the simulator | 602 | // If a collision was posted, remember to send it to the simulator |
609 | m_objectsWithCollisions.Add(collider); | 603 | m_objectsWithCollisions.Add(collider); |