diff options
-rwxr-xr-x | OpenSim/Region/Physics/BulletSPlugin/BSLinksetCompound.cs | 44 |
1 files changed, 30 insertions, 14 deletions
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSLinksetCompound.cs b/OpenSim/Region/Physics/BulletSPlugin/BSLinksetCompound.cs index 1fd541f..e967dfc 100755 --- a/OpenSim/Region/Physics/BulletSPlugin/BSLinksetCompound.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSLinksetCompound.cs | |||
@@ -143,19 +143,18 @@ public sealed class BSLinksetCompound : BSLinkset | |||
143 | // The root is going dynamic. Rebuild the linkset so parts and mass get computed properly. | 143 | // The root is going dynamic. Rebuild the linkset so parts and mass get computed properly. |
144 | ScheduleRebuild(LinksetRoot); | 144 | ScheduleRebuild(LinksetRoot); |
145 | } | 145 | } |
146 | else | ||
147 | { | ||
148 | // The origional prims are removed from the world as the shape of the root compound | ||
149 | // shape takes over. | ||
150 | m_physicsScene.PE.AddToCollisionFlags(child.PhysBody, CollisionFlags.CF_NO_CONTACT_RESPONSE); | ||
151 | m_physicsScene.PE.ForceActivationState(child.PhysBody, ActivationState.DISABLE_SIMULATION); | ||
152 | // We don't want collisions from the old linkset children. | ||
153 | m_physicsScene.PE.RemoveFromCollisionFlags(child.PhysBody, CollisionFlags.BS_SUBSCRIBE_COLLISION_EVENTS); | ||
154 | 146 | ||
155 | child.PhysBody.collisionType = CollisionType.LinksetChild; | 147 | // The origional prims are removed from the world as the shape of the root compound |
148 | // shape takes over. | ||
149 | m_physicsScene.PE.AddToCollisionFlags(child.PhysBody, CollisionFlags.CF_NO_CONTACT_RESPONSE); | ||
150 | m_physicsScene.PE.ForceActivationState(child.PhysBody, ActivationState.DISABLE_SIMULATION); | ||
151 | // We don't want collisions from the old linkset children. | ||
152 | m_physicsScene.PE.RemoveFromCollisionFlags(child.PhysBody, CollisionFlags.BS_SUBSCRIBE_COLLISION_EVENTS); | ||
153 | |||
154 | child.PhysBody.collisionType = CollisionType.LinksetChild; | ||
155 | |||
156 | ret = true; | ||
156 | 157 | ||
157 | ret = true; | ||
158 | } | ||
159 | return ret; | 158 | return ret; |
160 | } | 159 | } |
161 | 160 | ||
@@ -190,6 +189,13 @@ public sealed class BSLinksetCompound : BSLinkset | |||
190 | // Called at taint-time. | 189 | // Called at taint-time. |
191 | public override void UpdateProperties(UpdatedProperties whichUpdated, BSPrimLinkable updated) | 190 | public override void UpdateProperties(UpdatedProperties whichUpdated, BSPrimLinkable updated) |
192 | { | 191 | { |
192 | if (!LinksetRoot.IsPhysicallyActive) | ||
193 | { | ||
194 | // No reason to do this physical stuff for static linksets. | ||
195 | DetailLog("{0},BSLinksetCompound.UpdateProperties,notPhysical", LinksetRoot.LocalID); | ||
196 | return; | ||
197 | } | ||
198 | |||
193 | // The user moving a child around requires the rebuilding of the linkset compound shape | 199 | // The user moving a child around requires the rebuilding of the linkset compound shape |
194 | // One problem is this happens when a border is crossed -- the simulator implementation | 200 | // One problem is this happens when a border is crossed -- the simulator implementation |
195 | // stores the position into the group which causes the move of the object | 201 | // stores the position into the group which causes the move of the object |
@@ -392,6 +398,13 @@ public sealed class BSLinksetCompound : BSLinkset | |||
392 | private bool disableCOM = true; // DEBUG DEBUG: disable until we get this debugged | 398 | private bool disableCOM = true; // DEBUG DEBUG: disable until we get this debugged |
393 | private void RecomputeLinksetCompound() | 399 | private void RecomputeLinksetCompound() |
394 | { | 400 | { |
401 | if (!LinksetRoot.IsPhysicallyActive) | ||
402 | { | ||
403 | // There is no reason to build all this physical stuff for a non-physical linkset | ||
404 | DetailLog("{0},BSLinksetCompound.RecomputeLinksetCompound,notPhysical", LinksetRoot.LocalID); | ||
405 | return; | ||
406 | } | ||
407 | |||
395 | try | 408 | try |
396 | { | 409 | { |
397 | // This replaces the physical shape of the root prim with a compound shape made up of the root | 410 | // This replaces the physical shape of the root prim with a compound shape made up of the root |
@@ -403,7 +416,8 @@ public sealed class BSLinksetCompound : BSLinkset | |||
403 | // Free up any shape we'd previously built. | 416 | // Free up any shape we'd previously built. |
404 | LinksetShape.Dereference(m_physicsScene); | 417 | LinksetShape.Dereference(m_physicsScene); |
405 | 418 | ||
406 | LinksetShape = BSShapeCompound.GetReference(m_physicsScene, LinksetRoot); | 419 | // Get a new compound shape to build the linkset shape in. |
420 | LinksetShape = BSShapeCompound.GetReference(m_physicsScene); | ||
407 | 421 | ||
408 | // The center of mass for the linkset is the geometric center of the group. | 422 | // The center of mass for the linkset is the geometric center of the group. |
409 | // Compute a displacement for each component so it is relative to the center-of-mass. | 423 | // Compute a displacement for each component so it is relative to the center-of-mass. |
@@ -431,8 +445,7 @@ public sealed class BSLinksetCompound : BSLinkset | |||
431 | cPrim.LinksetChildIndex = memberIndex; | 445 | cPrim.LinksetChildIndex = memberIndex; |
432 | } | 446 | } |
433 | 447 | ||
434 | BSShape childShape = cPrim.PhysShape; | 448 | BSShape childShape = cPrim.PhysShape.GetReference(m_physicsScene, cPrim); |
435 | childShape.IncrementReference(); | ||
436 | OMV.Vector3 offsetPos = (cPrim.RawPosition - LinksetRoot.RawPosition) * invRootOrientation - centerDisplacement; | 449 | OMV.Vector3 offsetPos = (cPrim.RawPosition - LinksetRoot.RawPosition) * invRootOrientation - centerDisplacement; |
437 | OMV.Quaternion offsetRot = cPrim.RawOrientation * invRootOrientation; | 450 | OMV.Quaternion offsetRot = cPrim.RawOrientation * invRootOrientation; |
438 | m_physicsScene.PE.AddChildShapeToCompoundShape(LinksetShape.physShapeInfo, childShape.physShapeInfo, offsetPos, offsetRot); | 451 | m_physicsScene.PE.AddChildShapeToCompoundShape(LinksetShape.physShapeInfo, childShape.physShapeInfo, offsetPos, offsetRot); |
@@ -446,7 +459,10 @@ public sealed class BSLinksetCompound : BSLinkset | |||
446 | 459 | ||
447 | // Sneak the built compound shape in as the shape of the root prim. | 460 | // 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. | 461 | // Note this doesn't touch the root prim's PhysShape so be sure the manage the difference. |
462 | // Object removed and added to world to get collision cache rebuilt for new shape. | ||
463 | m_physicsScene.PE.RemoveObjectFromWorld(m_physicsScene.World, LinksetRoot.PhysBody); | ||
449 | m_physicsScene.PE.SetCollisionShape(m_physicsScene.World, LinksetRoot.PhysBody, LinksetShape.physShapeInfo); | 464 | m_physicsScene.PE.SetCollisionShape(m_physicsScene.World, LinksetRoot.PhysBody, LinksetShape.physShapeInfo); |
465 | m_physicsScene.PE.AddObjectToWorld(m_physicsScene.World, LinksetRoot.PhysBody); | ||
450 | 466 | ||
451 | // With all of the linkset packed into the root prim, it has the mass of everyone. | 467 | // With all of the linkset packed into the root prim, it has the mass of everyone. |
452 | LinksetMass = ComputeLinksetMass(); | 468 | LinksetMass = ComputeLinksetMass(); |