aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Physics/BulletSPlugin
diff options
context:
space:
mode:
authorRobert Adams2012-10-29 11:41:25 -0700
committerRobert Adams2012-11-03 21:14:00 -0700
commit8c9e4c1f7bdde47c9f29a9dfcf917421b943bb32 (patch)
tree8ab3b3034bd373dc99de7433a6729851330f6122 /OpenSim/Region/Physics/BulletSPlugin
parentBulletSim: add post taint taints and post step taints. The post taints operat... (diff)
downloadopensim-SC-8c9e4c1f7bdde47c9f29a9dfcf917421b943bb32.zip
opensim-SC-8c9e4c1f7bdde47c9f29a9dfcf917421b943bb32.tar.gz
opensim-SC-8c9e4c1f7bdde47c9f29a9dfcf917421b943bb32.tar.bz2
opensim-SC-8c9e4c1f7bdde47c9f29a9dfcf917421b943bb32.tar.xz
BulletSim: Use Refresh/PostTaints to cause recomputing of constraint variables before the simulation step. Update logging and messages to properly name LinksetConstraints. Use UpdatePhysicalMassProperties to put the whole linkset mass into all the physical linkset members so they have the inertia to move the whole linkset.
Diffstat (limited to '')
-rwxr-xr-xOpenSim/Region/Physics/BulletSPlugin/BSLinksetConstraints.cs65
1 files changed, 36 insertions, 29 deletions
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSLinksetConstraints.cs b/OpenSim/Region/Physics/BulletSPlugin/BSLinksetConstraints.cs
index 67979b3..086aa12 100755
--- a/OpenSim/Region/Physics/BulletSPlugin/BSLinksetConstraints.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSLinksetConstraints.cs
@@ -43,23 +43,20 @@ public sealed class BSLinksetConstraints : BSLinkset
43 43
44 // When physical properties are changed the linkset needs to recalculate 44 // When physical properties are changed the linkset needs to recalculate
45 // its internal properties. 45 // its internal properties.
46 // May be called at runtime or taint-time (just pass the appropriate flag). 46 // This is queued in such a way that the
47 public override void Refresh(BSPhysObject requestor, bool inTaintTime) 47 // refresh will only happen once after all the other taints are applied.
48 public override void Refresh(BSPhysObject requestor)
48 { 49 {
49 // If there are no children or not root, I am not the one that recomputes the constraints 50 // If there are no children, there are no constraints to recompute.
50 if (!HasAnyChildren || !IsRoot(requestor)) 51 if (!HasAnyChildren)
51 return; 52 return;
52 53
53 BSScene.TaintCallback refreshOperation = delegate() 54 // Queue to happen after all the other taint processing
55 PhysicsScene.PostTaintObject("BSLinksetContraints.Refresh", requestor.LocalID, delegate()
54 { 56 {
55 RecomputeLinksetConstraintVariables(); 57 RecomputeLinksetConstraintVariables();
56 DetailLog("{0},BSLinkset.Refresh,complete,rBody={1}", 58 });
57 LinksetRoot.LocalID, LinksetRoot.BSBody.ptr.ToString("X")); 59
58 };
59 if (inTaintTime)
60 refreshOperation();
61 else
62 PhysicsScene.TaintedObject("BSLinkSet.Refresh", refreshOperation);
63 } 60 }
64 61
65 // The object is going dynamic (physical). Do any setup necessary 62 // The object is going dynamic (physical). Do any setup necessary
@@ -104,14 +101,14 @@ public sealed class BSLinksetConstraints : BSLinkset
104 if (IsRoot(child)) 101 if (IsRoot(child))
105 { 102 {
106 // If the one with the dependency is root, must undo all children 103 // If the one with the dependency is root, must undo all children
107 DetailLog("{0},BSLinkset.RemoveBodyDependencies,removeChildrenForRoot,rID={1},rBody={2}", 104 DetailLog("{0},BSLinksetConstraint.RemoveBodyDependencies,removeChildrenForRoot,rID={1},rBody={2}",
108 child.LocalID, LinksetRoot.LocalID, LinksetRoot.BSBody.ptr.ToString("X")); 105 child.LocalID, LinksetRoot.LocalID, LinksetRoot.BSBody.ptr.ToString("X"));
109 106
110 ret = PhysicallyUnlinkAllChildrenFromRoot(LinksetRoot); 107 ret = PhysicallyUnlinkAllChildrenFromRoot(LinksetRoot);
111 } 108 }
112 else 109 else
113 { 110 {
114 DetailLog("{0},BSLinkset.RemoveBodyDependencies,removeSingleChild,rID={1},rBody={2},cID={3},cBody={4}", 111 DetailLog("{0},BSLinksetConstraint.RemoveBodyDependencies,removeSingleChild,rID={1},rBody={2},cID={3},cBody={4}",
115 child.LocalID, 112 child.LocalID,
116 LinksetRoot.LocalID, LinksetRoot.BSBody.ptr.ToString("X"), 113 LinksetRoot.LocalID, LinksetRoot.BSBody.ptr.ToString("X"),
117 child.LocalID, child.BSBody.ptr.ToString("X")); 114 child.LocalID, child.BSBody.ptr.ToString("X"));
@@ -132,7 +129,7 @@ public sealed class BSLinksetConstraints : BSLinkset
132 { 129 {
133 if (IsRoot(child)) 130 if (IsRoot(child))
134 { 131 {
135 DetailLog("{0},BSLinkset.RestoreBodyDependencies,restoreChildrenForRoot,rID={1},numChild={2}", 132 DetailLog("{0},BSLinksetConstraint.RestoreBodyDependencies,restoreChildrenForRoot,rID={1},numChild={2}",
136 child.LocalID, LinksetRoot.LocalID, m_taintChildren.Count); 133 child.LocalID, LinksetRoot.LocalID, m_taintChildren.Count);
137 foreach (BSPhysObject bpo in m_taintChildren) 134 foreach (BSPhysObject bpo in m_taintChildren)
138 { 135 {
@@ -141,7 +138,7 @@ public sealed class BSLinksetConstraints : BSLinkset
141 } 138 }
142 else 139 else
143 { 140 {
144 DetailLog("{0},BSLinkset.RestoreBodyDependencies,restoreSingleChild,rID={1},rBody={2},cID={3},cBody={4}", 141 DetailLog("{0},BSLinksetConstraint.RestoreBodyDependencies,restoreSingleChild,rID={1},rBody={2},cID={3},cBody={4}",
145 LinksetRoot.LocalID, 142 LinksetRoot.LocalID,
146 LinksetRoot.LocalID, LinksetRoot.BSBody.ptr.ToString("X"), 143 LinksetRoot.LocalID, LinksetRoot.BSBody.ptr.ToString("X"),
147 child.LocalID, child.BSBody.ptr.ToString("X")); 144 child.LocalID, child.BSBody.ptr.ToString("X"));
@@ -178,6 +175,7 @@ public sealed class BSLinksetConstraints : BSLinkset
178 PhysicallyLinkAChildToRoot(rootx, childx); 175 PhysicallyLinkAChildToRoot(rootx, childx);
179 m_taintChildren.Add(child); 176 m_taintChildren.Add(child);
180 }); 177 });
178 Refresh(LinksetRoot);
181 } 179 }
182 return; 180 return;
183 } 181 }
@@ -211,9 +209,9 @@ public sealed class BSLinksetConstraints : BSLinkset
211 { 209 {
212 m_taintChildren.Remove(child); 210 m_taintChildren.Remove(child);
213 PhysicallyUnlinkAChildFromRoot(rootx, childx); 211 PhysicallyUnlinkAChildFromRoot(rootx, childx);
214 RecomputeLinksetConstraintVariables();
215 }); 212 });
216 213 // See that the linkset parameters are recomputed at the end of the taint time.
214 Refresh(LinksetRoot);
217 } 215 }
218 else 216 else
219 { 217 {
@@ -237,7 +235,7 @@ public sealed class BSLinksetConstraints : BSLinkset
237 // real world coordinate of midpoint between the two objects 235 // real world coordinate of midpoint between the two objects
238 OMV.Vector3 midPoint = rootPrim.Position + (childRelativePosition / 2); 236 OMV.Vector3 midPoint = rootPrim.Position + (childRelativePosition / 2);
239 237
240 DetailLog("{0},BSLinkset.PhysicallyLinkAChildToRoot,taint,root={1},rBody={2},child={3},cBody={4},rLoc={5},cLoc={6},midLoc={7}", 238 DetailLog("{0},BSLinksetConstraint.PhysicallyLinkAChildToRoot,taint,root={1},rBody={2},child={3},cBody={4},rLoc={5},cLoc={6},midLoc={7}",
241 rootPrim.LocalID, 239 rootPrim.LocalID,
242 rootPrim.LocalID, rootPrim.BSBody.ptr.ToString("X"), 240 rootPrim.LocalID, rootPrim.BSBody.ptr.ToString("X"),
243 childPrim.LocalID, childPrim.BSBody.ptr.ToString("X"), 241 childPrim.LocalID, childPrim.BSBody.ptr.ToString("X"),
@@ -248,6 +246,7 @@ public sealed class BSLinksetConstraints : BSLinkset
248 246
249 BSConstraint6Dof constrain = new BSConstraint6Dof( 247 BSConstraint6Dof constrain = new BSConstraint6Dof(
250 PhysicsScene.World, rootPrim.BSBody, childPrim.BSBody, midPoint, true, true ); 248 PhysicsScene.World, rootPrim.BSBody, childPrim.BSBody, midPoint, true, true );
249 // PhysicsScene.World, childPrim.BSBody, rootPrim.BSBody, midPoint, true, true );
251 250
252 /* NOTE: below is an attempt to build constraint with full frame computation, etc. 251 /* NOTE: below is an attempt to build constraint with full frame computation, etc.
253 * Using the midpoint is easier since it lets the Bullet code manipulate the transforms 252 * Using the midpoint is easier since it lets the Bullet code manipulate the transforms
@@ -264,7 +263,7 @@ public sealed class BSLinksetConstraints : BSLinkset
264 263
265 // create a constraint that allows no freedom of movement between the two objects 264 // create a constraint that allows no freedom of movement between the two objects
266 // http://bulletphysics.org/Bullet/phpBB3/viewtopic.php?t=4818 265 // http://bulletphysics.org/Bullet/phpBB3/viewtopic.php?t=4818
267 DetailLog("{0},BSLinkset.PhysicallyLinkAChildToRoot,taint,root={1},child={2}", rootPrim.LocalID, rootPrim.LocalID, childPrim.LocalID); 266 DetailLog("{0},BSLinksetConstraint.PhysicallyLinkAChildToRoot,taint,root={1},child={2}", rootPrim.LocalID, rootPrim.LocalID, childPrim.LocalID);
268 BS6DofConstraint constrain = new BS6DofConstraint( 267 BS6DofConstraint constrain = new BS6DofConstraint(
269 PhysicsScene.World, rootPrim.Body, childPrim.Body, 268 PhysicsScene.World, rootPrim.Body, childPrim.Body,
270 OMV.Vector3.Zero, 269 OMV.Vector3.Zero,
@@ -307,7 +306,7 @@ public sealed class BSLinksetConstraints : BSLinkset
307 private bool PhysicallyUnlinkAChildFromRoot(BSPhysObject rootPrim, BSPhysObject childPrim) 306 private bool PhysicallyUnlinkAChildFromRoot(BSPhysObject rootPrim, BSPhysObject childPrim)
308 { 307 {
309 bool ret = false; 308 bool ret = false;
310 DetailLog("{0},BSLinkset.PhysicallyUnlinkAChildFromRoot,taint,root={1},rBody={2},child={3},cBody={4}", 309 DetailLog("{0},BSLinksetConstraint.PhysicallyUnlinkAChildFromRoot,taint,root={1},rBody={2},child={3},cBody={4}",
311 rootPrim.LocalID, 310 rootPrim.LocalID,
312 rootPrim.LocalID, rootPrim.BSBody.ptr.ToString("X"), 311 rootPrim.LocalID, rootPrim.BSBody.ptr.ToString("X"),
313 childPrim.LocalID, childPrim.BSBody.ptr.ToString("X")); 312 childPrim.LocalID, childPrim.BSBody.ptr.ToString("X"));
@@ -327,7 +326,7 @@ public sealed class BSLinksetConstraints : BSLinkset
327 // Called at taint time! 326 // Called at taint time!
328 private bool PhysicallyUnlinkAllChildrenFromRoot(BSPhysObject rootPrim) 327 private bool PhysicallyUnlinkAllChildrenFromRoot(BSPhysObject rootPrim)
329 { 328 {
330 DetailLog("{0},BSLinkset.PhysicallyUnlinkAllChildren,taint", rootPrim.LocalID); 329 DetailLog("{0},BSLinksetConstraint.PhysicallyUnlinkAllChildren,taint", rootPrim.LocalID);
331 bool ret = false; 330 bool ret = false;
332 331
333 if (PhysicsScene.Constraints.RemoveAndDestroyConstraint(rootPrim.BSBody)) 332 if (PhysicsScene.Constraints.RemoveAndDestroyConstraint(rootPrim.BSBody))
@@ -350,7 +349,7 @@ public sealed class BSLinksetConstraints : BSLinkset
350 BSConstraint constrain; 349 BSConstraint constrain;
351 if (PhysicsScene.Constraints.TryGetConstraint(LinksetRoot.BSBody, child.BSBody, out constrain)) 350 if (PhysicsScene.Constraints.TryGetConstraint(LinksetRoot.BSBody, child.BSBody, out constrain))
352 { 351 {
353 // DetailLog("{0},BSLinkset.RecomputeLinksetConstraintVariables,taint,child={1},mass={2},A={3},B={4}", 352 // DetailLog("{0},BSLinksetConstraint.RecomputeLinksetConstraintVariables,taint,child={1},mass={2},A={3},B={4}",
354 // LinksetRoot.LocalID, child.LocalID, linksetMass, constrain.Body1.ID, constrain.Body2.ID); 353 // LinksetRoot.LocalID, child.LocalID, linksetMass, constrain.Body1.ID, constrain.Body2.ID);
355 constrain.RecomputeConstraintVariables(linksetMass); 354 constrain.RecomputeConstraintVariables(linksetMass);
356 } 355 }
@@ -367,15 +366,23 @@ public sealed class BSLinksetConstraints : BSLinkset
367 { 366 {
368 // If this is a multiple object linkset, set everybody's center of mass to the set's center of mass 367 // If this is a multiple object linkset, set everybody's center of mass to the set's center of mass
369 OMV.Vector3 centerOfMass = ComputeLinksetCenterOfMass(); 368 OMV.Vector3 centerOfMass = ComputeLinksetCenterOfMass();
370 BulletSimAPI.SetCenterOfMassByPosRot2(LinksetRoot.BSBody.ptr, 369 BulletSimAPI.SetCenterOfMassByPosRot2(LinksetRoot.BSBody.ptr, centerOfMass, OMV.Quaternion.Identity);
371 centerOfMass, OMV.Quaternion.Identity); 370 // BulletSimAPI.SetCollisionFilterMask2(LinksetRoot.BSBody.ptr,
372 DetailLog("{0},BSLinkset.RecomputeLinksetConstraintVariables,setCenterOfMass,COM={1},rBody={2}", 371 // (uint)CollisionFilterGroups.LinksetFilter, (uint)CollisionFilterGroups.LinksetMask);
373 LinksetRoot.LocalID, centerOfMass, LinksetRoot.BSBody.ptr.ToString("X")); 372 DetailLog("{0},BSLinksetConstraint.RecomputeLinksetConstraintVariables,setCenterOfMass,COM={1},rBody={2},linksetMass={3}",
373 LinksetRoot.LocalID, centerOfMass, LinksetRoot.BSBody.ptr.ToString("X"), linksetMass);
374 foreach (BSPhysObject child in m_taintChildren) 374 foreach (BSPhysObject child in m_taintChildren)
375 { 375 {
376 BulletSimAPI.SetCenterOfMassByPosRot2(child.BSBody.ptr, 376 BulletSimAPI.SetCenterOfMassByPosRot2(child.BSBody.ptr, centerOfMass, OMV.Quaternion.Identity);
377 centerOfMass, OMV.Quaternion.Identity); 377 // A child in the linkset physically shows the mass of the whole linkset.
378 // This allows Bullet to apply enough force on the child to move the whole linkset.
379 child.UpdatePhysicalMassProperties(linksetMass);
380 // DEBUG: see of inter-linkset collisions are causing problems
381 // BulletSimAPI.SetCollisionFilterMask2(child.BSBody.ptr,
382 // (uint)CollisionFilterGroups.LinksetFilter, (uint)CollisionFilterGroups.LinksetMask);
378 } 383 }
384 // Also update the root's physical mass to the whole linkset
385 LinksetRoot.UpdatePhysicalMassProperties(linksetMass);
379 386
380 // BulletSimAPI.DumpAllInfo2(PhysicsScene.World.ptr); // DEBUG DEBUG DEBUG 387 // BulletSimAPI.DumpAllInfo2(PhysicsScene.World.ptr); // DEBUG DEBUG DEBUG
381 } 388 }