diff options
Diffstat (limited to 'OpenSim/Region/Physics/BulletSPlugin/BSLinksetConstraints.cs')
-rwxr-xr-x | OpenSim/Region/Physics/BulletSPlugin/BSLinksetConstraints.cs | 40 |
1 files changed, 13 insertions, 27 deletions
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSLinksetConstraints.cs b/OpenSim/Region/Physics/BulletSPlugin/BSLinksetConstraints.cs index 8cdbd9b..65aed77 100755 --- a/OpenSim/Region/Physics/BulletSPlugin/BSLinksetConstraints.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSLinksetConstraints.cs | |||
@@ -94,7 +94,7 @@ public sealed class BSLinksetConstraints : BSLinkset | |||
94 | bool ret = false; | 94 | bool ret = false; |
95 | 95 | ||
96 | DetailLog("{0},BSLinksetConstraint.RemoveBodyDependencies,removeChildrenForRoot,rID={1},rBody={2}", | 96 | DetailLog("{0},BSLinksetConstraint.RemoveBodyDependencies,removeChildrenForRoot,rID={1},rBody={2}", |
97 | child.LocalID, LinksetRoot.LocalID, LinksetRoot.BSBody.ptr.ToString("X")); | 97 | child.LocalID, LinksetRoot.LocalID, LinksetRoot.PhysBody.ptr.ToString("X")); |
98 | 98 | ||
99 | lock (m_linksetActivityLock) | 99 | lock (m_linksetActivityLock) |
100 | { | 100 | { |
@@ -124,9 +124,6 @@ public sealed class BSLinksetConstraints : BSLinkset | |||
124 | { | 124 | { |
125 | m_children.Add(child); | 125 | m_children.Add(child); |
126 | 126 | ||
127 | BSPhysObject rootx = LinksetRoot; // capture the root as of now | ||
128 | BSPhysObject childx = child; | ||
129 | |||
130 | DetailLog("{0},BSLinksetConstraints.AddChildToLinkset,call,child={1}", LinksetRoot.LocalID, child.LocalID); | 127 | DetailLog("{0},BSLinksetConstraints.AddChildToLinkset,call,child={1}", LinksetRoot.LocalID, child.LocalID); |
131 | 128 | ||
132 | // Cause constraints and assorted properties to be recomputed before the next simulation step. | 129 | // Cause constraints and assorted properties to be recomputed before the next simulation step. |
@@ -135,17 +132,6 @@ public sealed class BSLinksetConstraints : BSLinkset | |||
135 | return; | 132 | return; |
136 | } | 133 | } |
137 | 134 | ||
138 | // Forcefully removing a child from a linkset. | ||
139 | // This is not being called by the child so we have to make sure the child doesn't think | ||
140 | // it's still connected to the linkset. | ||
141 | // Normal OpenSimulator operation will never do this because other SceneObjectPart information | ||
142 | // also has to be updated (like pointer to prim's parent). | ||
143 | protected override void RemoveChildFromOtherLinkset(BSPhysObject pchild) | ||
144 | { | ||
145 | pchild.Linkset = BSLinkset.Factory(PhysicsScene, pchild); | ||
146 | RemoveChildFromLinkset(pchild); | ||
147 | } | ||
148 | |||
149 | // Remove the specified child from the linkset. | 135 | // Remove the specified child from the linkset. |
150 | // Safe to call even if the child is not really in my linkset. | 136 | // Safe to call even if the child is not really in my linkset. |
151 | protected override void RemoveChildFromLinkset(BSPhysObject child) | 137 | protected override void RemoveChildFromLinkset(BSPhysObject child) |
@@ -157,8 +143,8 @@ public sealed class BSLinksetConstraints : BSLinkset | |||
157 | 143 | ||
158 | DetailLog("{0},BSLinksetConstraints.RemoveChildFromLinkset,call,rID={1},rBody={2},cID={3},cBody={4}", | 144 | DetailLog("{0},BSLinksetConstraints.RemoveChildFromLinkset,call,rID={1},rBody={2},cID={3},cBody={4}", |
159 | childx.LocalID, | 145 | childx.LocalID, |
160 | rootx.LocalID, rootx.BSBody.ptr.ToString("X"), | 146 | rootx.LocalID, rootx.PhysBody.ptr.ToString("X"), |
161 | childx.LocalID, childx.BSBody.ptr.ToString("X")); | 147 | childx.LocalID, childx.PhysBody.ptr.ToString("X")); |
162 | 148 | ||
163 | PhysicsScene.TaintedObject("BSLinksetConstraints.RemoveChildFromLinkset", delegate() | 149 | PhysicsScene.TaintedObject("BSLinksetConstraints.RemoveChildFromLinkset", delegate() |
164 | { | 150 | { |
@@ -197,15 +183,15 @@ public sealed class BSLinksetConstraints : BSLinkset | |||
197 | 183 | ||
198 | DetailLog("{0},BSLinksetConstraint.BuildConstraint,taint,root={1},rBody={2},child={3},cBody={4},rLoc={5},cLoc={6},midLoc={7}", | 184 | DetailLog("{0},BSLinksetConstraint.BuildConstraint,taint,root={1},rBody={2},child={3},cBody={4},rLoc={5},cLoc={6},midLoc={7}", |
199 | rootPrim.LocalID, | 185 | rootPrim.LocalID, |
200 | rootPrim.LocalID, rootPrim.BSBody.ptr.ToString("X"), | 186 | rootPrim.LocalID, rootPrim.PhysBody.ptr.ToString("X"), |
201 | childPrim.LocalID, childPrim.BSBody.ptr.ToString("X"), | 187 | childPrim.LocalID, childPrim.PhysBody.ptr.ToString("X"), |
202 | rootPrim.Position, childPrim.Position, midPoint); | 188 | rootPrim.Position, childPrim.Position, midPoint); |
203 | 189 | ||
204 | // create a constraint that allows no freedom of movement between the two objects | 190 | // create a constraint that allows no freedom of movement between the two objects |
205 | // http://bulletphysics.org/Bullet/phpBB3/viewtopic.php?t=4818 | 191 | // http://bulletphysics.org/Bullet/phpBB3/viewtopic.php?t=4818 |
206 | 192 | ||
207 | BSConstraint6Dof constrain = new BSConstraint6Dof( | 193 | BSConstraint6Dof constrain = new BSConstraint6Dof( |
208 | PhysicsScene.World, rootPrim.BSBody, childPrim.BSBody, midPoint, true, true ); | 194 | PhysicsScene.World, rootPrim.PhysBody, childPrim.PhysBody, midPoint, true, true ); |
209 | // PhysicsScene.World, childPrim.BSBody, rootPrim.BSBody, midPoint, true, true ); | 195 | // PhysicsScene.World, childPrim.BSBody, rootPrim.BSBody, midPoint, true, true ); |
210 | 196 | ||
211 | /* NOTE: below is an attempt to build constraint with full frame computation, etc. | 197 | /* NOTE: below is an attempt to build constraint with full frame computation, etc. |
@@ -262,14 +248,14 @@ public sealed class BSLinksetConstraints : BSLinkset | |||
262 | bool ret = false; | 248 | bool ret = false; |
263 | DetailLog("{0},BSLinksetConstraint.PhysicallyUnlinkAChildFromRoot,taint,root={1},rBody={2},child={3},cBody={4}", | 249 | DetailLog("{0},BSLinksetConstraint.PhysicallyUnlinkAChildFromRoot,taint,root={1},rBody={2},child={3},cBody={4}", |
264 | rootPrim.LocalID, | 250 | rootPrim.LocalID, |
265 | rootPrim.LocalID, rootPrim.BSBody.ptr.ToString("X"), | 251 | rootPrim.LocalID, rootPrim.PhysBody.ptr.ToString("X"), |
266 | childPrim.LocalID, childPrim.BSBody.ptr.ToString("X")); | 252 | childPrim.LocalID, childPrim.PhysBody.ptr.ToString("X")); |
267 | 253 | ||
268 | // Find the constraint for this link and get rid of it from the overall collection and from my list | 254 | // Find the constraint for this link and get rid of it from the overall collection and from my list |
269 | if (PhysicsScene.Constraints.RemoveAndDestroyConstraint(rootPrim.BSBody, childPrim.BSBody)) | 255 | if (PhysicsScene.Constraints.RemoveAndDestroyConstraint(rootPrim.PhysBody, childPrim.PhysBody)) |
270 | { | 256 | { |
271 | // Make the child refresh its location | 257 | // Make the child refresh its location |
272 | BulletSimAPI.PushUpdate2(childPrim.BSBody.ptr); | 258 | BulletSimAPI.PushUpdate2(childPrim.PhysBody.ptr); |
273 | ret = true; | 259 | ret = true; |
274 | } | 260 | } |
275 | 261 | ||
@@ -283,7 +269,7 @@ public sealed class BSLinksetConstraints : BSLinkset | |||
283 | { | 269 | { |
284 | DetailLog("{0},BSLinksetConstraint.PhysicallyUnlinkAllChildren,taint", rootPrim.LocalID); | 270 | DetailLog("{0},BSLinksetConstraint.PhysicallyUnlinkAllChildren,taint", rootPrim.LocalID); |
285 | 271 | ||
286 | return PhysicsScene.Constraints.RemoveAndDestroyConstraint(rootPrim.BSBody); | 272 | return PhysicsScene.Constraints.RemoveAndDestroyConstraint(rootPrim.PhysBody); |
287 | } | 273 | } |
288 | 274 | ||
289 | // Call each of the constraints that make up this linkset and recompute the | 275 | // Call each of the constraints that make up this linkset and recompute the |
@@ -300,7 +286,7 @@ public sealed class BSLinksetConstraints : BSLinkset | |||
300 | // BulletSimAPI.SetCollisionFilterMask2(LinksetRoot.BSBody.ptr, | 286 | // BulletSimAPI.SetCollisionFilterMask2(LinksetRoot.BSBody.ptr, |
301 | // (uint)CollisionFilterGroups.LinksetFilter, (uint)CollisionFilterGroups.LinksetMask); | 287 | // (uint)CollisionFilterGroups.LinksetFilter, (uint)CollisionFilterGroups.LinksetMask); |
302 | DetailLog("{0},BSLinksetConstraint.RecomputeLinksetConstraints,set,rBody={1},linksetMass={2}", | 288 | DetailLog("{0},BSLinksetConstraint.RecomputeLinksetConstraints,set,rBody={1},linksetMass={2}", |
303 | LinksetRoot.LocalID, LinksetRoot.BSBody.ptr.ToString("X"), linksetMass); | 289 | LinksetRoot.LocalID, LinksetRoot.PhysBody.ptr.ToString("X"), linksetMass); |
304 | 290 | ||
305 | foreach (BSPhysObject child in m_children) | 291 | foreach (BSPhysObject child in m_children) |
306 | { | 292 | { |
@@ -310,7 +296,7 @@ public sealed class BSLinksetConstraints : BSLinkset | |||
310 | child.UpdatePhysicalMassProperties(linksetMass); | 296 | child.UpdatePhysicalMassProperties(linksetMass); |
311 | 297 | ||
312 | BSConstraint constrain; | 298 | BSConstraint constrain; |
313 | if (!PhysicsScene.Constraints.TryGetConstraint(LinksetRoot.BSBody, child.BSBody, out constrain)) | 299 | if (!PhysicsScene.Constraints.TryGetConstraint(LinksetRoot.PhysBody, child.PhysBody, out constrain)) |
314 | { | 300 | { |
315 | // If constraint doesn't exist yet, create it. | 301 | // If constraint doesn't exist yet, create it. |
316 | constrain = BuildConstraint(LinksetRoot, child); | 302 | constrain = BuildConstraint(LinksetRoot, child); |