aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Physics/BulletSPlugin
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/Physics/BulletSPlugin')
-rwxr-xr-xOpenSim/Region/Physics/BulletSPlugin/BSLinksetCompound.cs90
1 files changed, 27 insertions, 63 deletions
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSLinksetCompound.cs b/OpenSim/Region/Physics/BulletSPlugin/BSLinksetCompound.cs
index a20bbc3..be01808 100755
--- a/OpenSim/Region/Physics/BulletSPlugin/BSLinksetCompound.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSLinksetCompound.cs
@@ -93,9 +93,12 @@ public sealed class BSLinksetCompound : BSLinkset
93{ 93{
94 private static string LogHeader = "[BULLETSIM LINKSET COMPOUND]"; 94 private static string LogHeader = "[BULLETSIM LINKSET COMPOUND]";
95 95
96 private BSShape LinksetShape;
97
96 public BSLinksetCompound(BSScene scene, BSPrimLinkable parent) 98 public BSLinksetCompound(BSScene scene, BSPrimLinkable parent)
97 : base(scene, parent) 99 : base(scene, parent)
98 { 100 {
101 LinksetShape = new BSShapeNull();
99 } 102 }
100 103
101 // When physical properties are changed the linkset needs to recalculate 104 // When physical properties are changed the linkset needs to recalculate
@@ -391,22 +394,21 @@ public sealed class BSLinksetCompound : BSLinkset
391 { 394 {
392 try 395 try
393 { 396 {
394 /* 397 // This replaces the physical shape of the root prim with a compound shape made up of the root
395 // Suppress rebuilding while rebuilding. (We know rebuilding is on only one thread.) 398 // shape and all the children.
396 Rebuilding = true; 399
400 // RootPrim.PhysShape is the shape of the root prim.
401 // Here we build the compound shape made up of all the children.
402
403 // Free up any shape we'd previously built.
404 LinksetShape.Dereference(PhysicsScene);
397 405
398 // Cause the root shape to be rebuilt as a compound object with just the root in it 406 LinksetShape = BSShapeCompound.GetReference(PhysicsScene, LinksetRoot);
399 LinksetRoot.ForceBodyShapeRebuild(true /* inTaintTime );
400 407
401 // The center of mass for the linkset is the geometric center of the group. 408 // The center of mass for the linkset is the geometric center of the group.
402 // Compute a displacement for each component so it is relative to the center-of-mass. 409 // Compute a displacement for each component so it is relative to the center-of-mass.
403 // Bullet presumes an object's origin (relative <0,0,0>) is its center-of-mass 410 // Bullet presumes an object's origin (relative <0,0,0>) is its center-of-mass
404 OMV.Vector3 centerOfMassW = LinksetRoot.RawPosition; 411 OMV.Vector3 centerOfMassW = ComputeLinksetCenterOfMass();
405 if (!disableCOM) // DEBUG DEBUG
406 {
407 // Compute a center-of-mass in world coordinates.
408 centerOfMassW = ComputeLinksetCenterOfMass();
409 }
410 412
411 OMV.Quaternion invRootOrientation = OMV.Quaternion.Inverse(LinksetRoot.RawOrientation); 413 OMV.Quaternion invRootOrientation = OMV.Quaternion.Inverse(LinksetRoot.RawOrientation);
412 414
@@ -414,20 +416,7 @@ public sealed class BSLinksetCompound : BSLinkset
414 OMV.Vector3 centerDisplacement = (centerOfMassW - LinksetRoot.RawPosition) * invRootOrientation; 416 OMV.Vector3 centerDisplacement = (centerOfMassW - LinksetRoot.RawPosition) * invRootOrientation;
415 LinksetRoot.SetEffectiveCenterOfMassW(centerDisplacement); 417 LinksetRoot.SetEffectiveCenterOfMassW(centerDisplacement);
416 418
417 // This causes the physical position of the root prim to be offset to accomodate for the displacements 419 // TODO: add phantom root shape to be the center-of-mass
418 LinksetRoot.ForcePosition = LinksetRoot.RawPosition;
419
420 // Update the local transform for the root child shape so it is offset from the <0,0,0> which is COM
421 PhysicsScene.PE.UpdateChildTransform(LinksetRoot.PhysShape.physShapeInfo, 0 /* childIndex ,
422 -centerDisplacement,
423 OMV.Quaternion.Identity, // LinksetRoot.RawOrientation,
424 false /* shouldRecalculateLocalAabb (is done later after linkset built) );
425
426 DetailLog("{0},BSLinksetCompound.RecomputeLinksetCompound,COM,com={1},rootPos={2},centerDisp={3}",
427 LinksetRoot.LocalID, centerOfMassW, LinksetRoot.RawPosition, centerDisplacement);
428
429 DetailLog("{0},BSLinksetCompound.RecomputeLinksetCompound,start,rBody={1},rShape={2},numChildren={3}",
430 LinksetRoot.LocalID, LinksetRoot.PhysBody, LinksetRoot.PhysShape, NumberOfChildren);
431 420
432 // Add a shape for each of the other children in the linkset 421 // Add a shape for each of the other children in the linkset
433 int memberIndex = 1; 422 int memberIndex = 1;
@@ -440,56 +429,31 @@ public sealed class BSLinksetCompound : BSLinkset
440 else 429 else
441 { 430 {
442 cPrim.LinksetChildIndex = memberIndex; 431 cPrim.LinksetChildIndex = memberIndex;
432 }
443 433
444 if (cPrim.PhysShape.isNativeShape) 434 BSShape childShape = cPrim.PhysShape;
445 { 435 childShape.IncrementReference();
446 // A native shape is turned into a hull collision shape because native 436 OMV.Vector3 offsetPos = (cPrim.RawPosition - LinksetRoot.RawPosition) * invRootOrientation - centerDisplacement;
447 // shapes are not shared so we have to hullify it so it will be tracked 437 OMV.Quaternion offsetRot = cPrim.RawOrientation * invRootOrientation;
448 // and freed at the correct time. This also solves the scaling problem 438 PhysicsScene.PE.AddChildShapeToCompoundShape(LinksetShape.physShapeInfo, childShape.physShapeInfo, offsetPos, offsetRot);
449 // (native shapes scale but hull/meshes are assumed to not be). 439 DetailLog("{0},BSLinksetCompound.RecomputeLinksetCompound,addChild,indx={1},rShape={2},cShape={3},offPos={4},offRot={5}",
450 // TODO: decide of the native shape can just be used in the compound shape.
451 // Use call to CreateGeomNonSpecial().
452 BulletShape saveShape = cPrim.PhysShape;
453 cPrim.PhysShape.Clear(); // Don't let the create free the child's shape
454 PhysicsScene.Shapes.CreateGeomMeshOrHull(cPrim, null);
455 BulletShape newShape = cPrim.PhysShape;
456 cPrim.PhysShape = saveShape;
457
458 OMV.Vector3 offsetPos = (cPrim.RawPosition - LinksetRoot.RawPosition) * invRootOrientation - centerDisplacement;
459 OMV.Quaternion offsetRot = cPrim.RawOrientation * invRootOrientation;
460 PhysicsScene.PE.AddChildShapeToCompoundShape(LinksetRoot.PhysShape, newShape, offsetPos, offsetRot);
461 DetailLog("{0},BSLinksetCompound.RecomputeLinksetCompound,addNative,indx={1},rShape={2},cShape={3},offPos={4},offRot={5}",
462 LinksetRoot.LocalID, memberIndex, LinksetRoot.PhysShape, newShape, offsetPos, offsetRot);
463 }
464 else
465 {
466 // For the shared shapes (meshes and hulls), just use the shape in the child.
467 // The reference count added here will be decremented when the compound shape
468 // is destroyed in BSShapeCollection (the child shapes are looped over and dereferenced).
469 if (PhysicsScene.Shapes.ReferenceShape(cPrim.PhysShape))
470 {
471 PhysicsScene.Logger.ErrorFormat("{0} Rebuilt sharable shape when building linkset! Region={1}, primID={2}, shape={3}",
472 LogHeader, PhysicsScene.RegionName, cPrim.LocalID, cPrim.PhysShape);
473 }
474 OMV.Vector3 offsetPos = (cPrim.RawPosition - LinksetRoot.RawPosition) * invRootOrientation - centerDisplacement;
475 OMV.Quaternion offsetRot = cPrim.RawOrientation * invRootOrientation;
476 PhysicsScene.PE.AddChildShapeToCompoundShape(LinksetRoot.PhysShape, cPrim.PhysShape, offsetPos, offsetRot);
477 DetailLog("{0},BSLinksetCompound.RecomputeLinksetCompound,addNonNative,indx={1},rShape={2},cShape={3},offPos={4},offRot={5}",
478 LinksetRoot.LocalID, memberIndex, LinksetRoot.PhysShape, cPrim.PhysShape, offsetPos, offsetRot); 440 LinksetRoot.LocalID, memberIndex, LinksetRoot.PhysShape, cPrim.PhysShape, offsetPos, offsetRot);
479 441
480 } 442 memberIndex++;
481 memberIndex++; 443
482 }
483 return false; // 'false' says to move onto the next child in the list 444 return false; // 'false' says to move onto the next child in the list
484 }); 445 });
485 446
447 // Sneak the built compound shape in as the shape of the root prim.
448 // Note this doesn't touch the root prim's PhysShape so be sure the manage the difference.
449 PhysicsScene.PE.SetCollisionShape(PhysicsScene.World, LinksetRoot.PhysBody, LinksetShape.physShapeInfo);
450
486 // With all of the linkset packed into the root prim, it has the mass of everyone. 451 // With all of the linkset packed into the root prim, it has the mass of everyone.
487 LinksetMass = ComputeLinksetMass(); 452 LinksetMass = ComputeLinksetMass();
488 LinksetRoot.UpdatePhysicalMassProperties(LinksetMass, true); 453 LinksetRoot.UpdatePhysicalMassProperties(LinksetMass, true);
489 454
490 // Enable the physical position updator to return the position and rotation of the root shape 455 // Enable the physical position updator to return the position and rotation of the root shape
491 PhysicsScene.PE.AddToCollisionFlags(LinksetRoot.PhysBody, CollisionFlags.BS_RETURN_ROOT_COMPOUND_SHAPE); 456 PhysicsScene.PE.AddToCollisionFlags(LinksetRoot.PhysBody, CollisionFlags.BS_RETURN_ROOT_COMPOUND_SHAPE);
492 */
493 } 457 }
494 finally 458 finally
495 { 459 {