diff options
Diffstat (limited to 'OpenSim/Region/Physics/BulletSPlugin/BSLinksetCompound.cs')
-rwxr-xr-x | OpenSim/Region/Physics/BulletSPlugin/BSLinksetCompound.cs | 37 |
1 files changed, 27 insertions, 10 deletions
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSLinksetCompound.cs b/OpenSim/Region/Physics/BulletSPlugin/BSLinksetCompound.cs index e967dfc..e3ce7fb 100755 --- a/OpenSim/Region/Physics/BulletSPlugin/BSLinksetCompound.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSLinksetCompound.cs | |||
@@ -395,7 +395,8 @@ public sealed class BSLinksetCompound : BSLinkset | |||
395 | // Constraint linksets are rebuilt every time. | 395 | // Constraint linksets are rebuilt every time. |
396 | // Note that this works for rebuilding just the root after a linkset is taken apart. | 396 | // Note that this works for rebuilding just the root after a linkset is taken apart. |
397 | // Called at taint time!! | 397 | // Called at taint time!! |
398 | private bool disableCOM = true; // DEBUG DEBUG: disable until we get this debugged | 398 | private bool UseBulletSimRootOffsetHack = false; |
399 | private bool disableCOM = true; // For basic linkset debugging, turn off the center-of-mass setting | ||
399 | private void RecomputeLinksetCompound() | 400 | private void RecomputeLinksetCompound() |
400 | { | 401 | { |
401 | if (!LinksetRoot.IsPhysicallyActive) | 402 | if (!LinksetRoot.IsPhysicallyActive) |
@@ -428,11 +429,19 @@ public sealed class BSLinksetCompound : BSLinkset | |||
428 | 429 | ||
429 | // 'centerDisplacement' is the value to subtract from children to give physical offset position | 430 | // 'centerDisplacement' is the value to subtract from children to give physical offset position |
430 | OMV.Vector3 centerDisplacement = (centerOfMassW - LinksetRoot.RawPosition) * invRootOrientation; | 431 | OMV.Vector3 centerDisplacement = (centerOfMassW - LinksetRoot.RawPosition) * invRootOrientation; |
431 | LinksetRoot.SetEffectiveCenterOfMassW(centerDisplacement); | 432 | if (UseBulletSimRootOffsetHack || disableCOM) |
432 | 433 | { | |
433 | // TODO: add phantom root shape to be the center-of-mass | 434 | centerDisplacement = OMV.Vector3.Zero; |
435 | LinksetRoot.ClearDisplacement(); | ||
436 | } | ||
437 | else | ||
438 | { | ||
439 | LinksetRoot.SetEffectiveCenterOfMassDisplacement(centerDisplacement); | ||
440 | } | ||
441 | DetailLog("{0},BSLinksetCompound.RecomputeLinksetCompound,COM,rootPos={1},com={2},comDisp={3}", | ||
442 | LinksetRoot.LocalID, LinksetRoot.RawPosition, centerOfMassW, centerDisplacement); | ||
434 | 443 | ||
435 | // Add a shape for each of the other children in the linkset | 444 | // Add the shapes of all the components of the linkset |
436 | int memberIndex = 1; | 445 | int memberIndex = 1; |
437 | ForEachMember(delegate(BSPrimLinkable cPrim) | 446 | ForEachMember(delegate(BSPrimLinkable cPrim) |
438 | { | 447 | { |
@@ -449,8 +458,8 @@ public sealed class BSLinksetCompound : BSLinkset | |||
449 | OMV.Vector3 offsetPos = (cPrim.RawPosition - LinksetRoot.RawPosition) * invRootOrientation - centerDisplacement; | 458 | OMV.Vector3 offsetPos = (cPrim.RawPosition - LinksetRoot.RawPosition) * invRootOrientation - centerDisplacement; |
450 | OMV.Quaternion offsetRot = cPrim.RawOrientation * invRootOrientation; | 459 | OMV.Quaternion offsetRot = cPrim.RawOrientation * invRootOrientation; |
451 | m_physicsScene.PE.AddChildShapeToCompoundShape(LinksetShape.physShapeInfo, childShape.physShapeInfo, offsetPos, offsetRot); | 460 | m_physicsScene.PE.AddChildShapeToCompoundShape(LinksetShape.physShapeInfo, childShape.physShapeInfo, offsetPos, offsetRot); |
452 | DetailLog("{0},BSLinksetCompound.RecomputeLinksetCompound,addChild,indx={1},rShape={2},cShape={3},offPos={4},offRot={5}", | 461 | DetailLog("{0},BSLinksetCompound.RecomputeLinksetCompound,addChild,indx={1}cShape={2},offPos={3},offRot={4}", |
453 | LinksetRoot.LocalID, memberIndex, LinksetRoot.PhysShape, cPrim.PhysShape, offsetPos, offsetRot); | 462 | LinksetRoot.LocalID, memberIndex, cPrim.PhysShape, offsetPos, offsetRot); |
454 | 463 | ||
455 | memberIndex++; | 464 | memberIndex++; |
456 | 465 | ||
@@ -463,13 +472,21 @@ public sealed class BSLinksetCompound : BSLinkset | |||
463 | m_physicsScene.PE.RemoveObjectFromWorld(m_physicsScene.World, LinksetRoot.PhysBody); | 472 | m_physicsScene.PE.RemoveObjectFromWorld(m_physicsScene.World, LinksetRoot.PhysBody); |
464 | m_physicsScene.PE.SetCollisionShape(m_physicsScene.World, LinksetRoot.PhysBody, LinksetShape.physShapeInfo); | 473 | m_physicsScene.PE.SetCollisionShape(m_physicsScene.World, LinksetRoot.PhysBody, LinksetShape.physShapeInfo); |
465 | m_physicsScene.PE.AddObjectToWorld(m_physicsScene.World, LinksetRoot.PhysBody); | 474 | m_physicsScene.PE.AddObjectToWorld(m_physicsScene.World, LinksetRoot.PhysBody); |
475 | DetailLog("{0},BSLinksetCompound.RecomputeLinksetCompound,addBody,body={1},shape={2}", | ||
476 | LinksetRoot.LocalID, LinksetRoot.PhysBody, LinksetShape); | ||
466 | 477 | ||
467 | // With all of the linkset packed into the root prim, it has the mass of everyone. | 478 | // With all of the linkset packed into the root prim, it has the mass of everyone. |
468 | LinksetMass = ComputeLinksetMass(); | 479 | LinksetMass = ComputeLinksetMass(); |
469 | LinksetRoot.UpdatePhysicalMassProperties(LinksetMass, true); | 480 | LinksetRoot.UpdatePhysicalMassProperties(LinksetMass, true); |
470 | 481 | ||
471 | // Enable the physical position updator to return the position and rotation of the root shape | 482 | if (UseBulletSimRootOffsetHack) |
472 | m_physicsScene.PE.AddToCollisionFlags(LinksetRoot.PhysBody, CollisionFlags.BS_RETURN_ROOT_COMPOUND_SHAPE); | 483 | { |
484 | // Enable the physical position updator to return the position and rotation of the root shape. | ||
485 | // This enables a feature in the C++ code to return the world coordinates of the first shape in the | ||
486 | // compound shape. This eleviates the need to offset the returned physical position by the | ||
487 | // center-of-mass offset. | ||
488 | m_physicsScene.PE.AddToCollisionFlags(LinksetRoot.PhysBody, CollisionFlags.BS_RETURN_ROOT_COMPOUND_SHAPE); | ||
489 | } | ||
473 | } | 490 | } |
474 | finally | 491 | finally |
475 | { | 492 | { |
@@ -477,7 +494,7 @@ public sealed class BSLinksetCompound : BSLinkset | |||
477 | } | 494 | } |
478 | 495 | ||
479 | // See that the Aabb surrounds the new shape | 496 | // See that the Aabb surrounds the new shape |
480 | m_physicsScene.PE.RecalculateCompoundShapeLocalAabb(LinksetRoot.PhysShape.physShapeInfo); | 497 | m_physicsScene.PE.RecalculateCompoundShapeLocalAabb(LinksetShape.physShapeInfo); |
481 | } | 498 | } |
482 | } | 499 | } |
483 | } \ No newline at end of file | 500 | } \ No newline at end of file |