diff options
Diffstat (limited to 'OpenSim/Region/Physics/BulletSPlugin/BSLinkset.cs')
-rwxr-xr-x | OpenSim/Region/Physics/BulletSPlugin/BSLinkset.cs | 29 |
1 files changed, 11 insertions, 18 deletions
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSLinkset.cs b/OpenSim/Region/Physics/BulletSPlugin/BSLinkset.cs index 087b9bb..9e3f0db 100755 --- a/OpenSim/Region/Physics/BulletSPlugin/BSLinkset.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSLinkset.cs | |||
@@ -42,6 +42,9 @@ public class BSLinkset | |||
42 | private BSScene m_physicsScene; | 42 | private BSScene m_physicsScene; |
43 | public BSScene PhysicsScene { get { return m_physicsScene; } } | 43 | public BSScene PhysicsScene { get { return m_physicsScene; } } |
44 | 44 | ||
45 | static int m_nextLinksetID = 1; | ||
46 | public int LinksetID { get; private set; } | ||
47 | |||
45 | // The children under the root in this linkset | 48 | // The children under the root in this linkset |
46 | private List<BSPrim> m_children; | 49 | private List<BSPrim> m_children; |
47 | 50 | ||
@@ -74,6 +77,10 @@ public class BSLinkset | |||
74 | public BSLinkset(BSScene scene, BSPrim parent) | 77 | public BSLinkset(BSScene scene, BSPrim parent) |
75 | { | 78 | { |
76 | // A simple linkset of one (no children) | 79 | // A simple linkset of one (no children) |
80 | LinksetID = m_nextLinksetID++; | ||
81 | // We create LOTS of linksets. | ||
82 | if (m_nextLinksetID < 0) | ||
83 | m_nextLinksetID = 1; | ||
77 | m_physicsScene = scene; | 84 | m_physicsScene = scene; |
78 | m_linksetRoot = parent; | 85 | m_linksetRoot = parent; |
79 | m_children = new List<BSPrim>(); | 86 | m_children = new List<BSPrim>(); |
@@ -258,8 +265,7 @@ public class BSLinkset | |||
258 | BSPrim childx = child; | 265 | BSPrim childx = child; |
259 | m_physicsScene.TaintedObject("AddChildToLinkset", delegate() | 266 | m_physicsScene.TaintedObject("AddChildToLinkset", delegate() |
260 | { | 267 | { |
261 | // DebugLog("{0}: AddChildToLinkset: adding child {1} to {2}", LogHeader, child.LocalID, m_linksetRoot.LocalID); | 268 | DetailLog("{0},AddChildToLinkset,taint,child={1}", m_linksetRoot.LocalID, child.LocalID); |
262 | // DetailLog("{0},AddChildToLinkset,taint,child={1}", m_linksetRoot.LocalID, child.LocalID); | ||
263 | PhysicallyLinkAChildToRoot(rootx, childx); // build the physical binding between me and the child | 269 | PhysicallyLinkAChildToRoot(rootx, childx); // build the physical binding between me and the child |
264 | }); | 270 | }); |
265 | } | 271 | } |
@@ -287,8 +293,7 @@ public class BSLinkset | |||
287 | BSPrim childx = child; | 293 | BSPrim childx = child; |
288 | m_physicsScene.TaintedObject("RemoveChildFromLinkset", delegate() | 294 | m_physicsScene.TaintedObject("RemoveChildFromLinkset", delegate() |
289 | { | 295 | { |
290 | // DebugLog("{0}: RemoveChildFromLinkset: Removing constraint to {1}", LogHeader, child.LocalID); | 296 | DetailLog("{0},RemoveChildFromLinkset,taint,child={1}", m_linksetRoot.LocalID, child.LocalID); |
291 | // DetailLog("{0},RemoveChildFromLinkset,taint,child={1}", m_linksetRoot.LocalID, child.LocalID); | ||
292 | 297 | ||
293 | PhysicallyUnlinkAChildFromRoot(rootx, childx); | 298 | PhysicallyUnlinkAChildFromRoot(rootx, childx); |
294 | }); | 299 | }); |
@@ -319,7 +324,6 @@ public class BSLinkset | |||
319 | 324 | ||
320 | // create a constraint that allows no freedom of movement between the two objects | 325 | // create a constraint that allows no freedom of movement between the two objects |
321 | // http://bulletphysics.org/Bullet/phpBB3/viewtopic.php?t=4818 | 326 | // http://bulletphysics.org/Bullet/phpBB3/viewtopic.php?t=4818 |
322 | // DebugLog("{0}: CreateLinkset: Adding a constraint between root prim {1} and child prim {2}", LogHeader, LocalID, childPrim.LocalID); | ||
323 | DetailLog("{0},PhysicallyLinkAChildToRoot,taint,root={1},child={2},rLoc={3},cLoc={4},midLoc={5}", | 327 | DetailLog("{0},PhysicallyLinkAChildToRoot,taint,root={1},child={2},rLoc={3},cLoc={4},midLoc={5}", |
324 | rootPrim.LocalID, rootPrim.LocalID, childPrim.LocalID, rootPrim.Position, childPrim.Position, midPoint); | 328 | rootPrim.LocalID, rootPrim.LocalID, childPrim.LocalID, rootPrim.Position, childPrim.Position, midPoint); |
325 | BS6DofConstraint constrain = new BS6DofConstraint( | 329 | BS6DofConstraint constrain = new BS6DofConstraint( |
@@ -328,10 +332,10 @@ public class BSLinkset | |||
328 | true, | 332 | true, |
329 | true | 333 | true |
330 | ); | 334 | ); |
331 | /* NOTE: attempt to build constraint with full frame computation, etc. | 335 | /* NOTE: below is an attempt to build constraint with full frame computation, etc. |
332 | * Using the midpoint is easier since it lets the Bullet code use the transforms | 336 | * Using the midpoint is easier since it lets the Bullet code use the transforms |
333 | * of the objects. | 337 | * of the objects. |
334 | * Code left here as an example. | 338 | * Code left as a warning to future programmers. |
335 | // ================================================================================== | 339 | // ================================================================================== |
336 | // relative position normalized to the root prim | 340 | // relative position normalized to the root prim |
337 | OMV.Quaternion invThisOrientation = OMV.Quaternion.Inverse(rootPrim.Orientation); | 341 | OMV.Quaternion invThisOrientation = OMV.Quaternion.Inverse(rootPrim.Orientation); |
@@ -343,7 +347,6 @@ public class BSLinkset | |||
343 | 347 | ||
344 | // create a constraint that allows no freedom of movement between the two objects | 348 | // create a constraint that allows no freedom of movement between the two objects |
345 | // http://bulletphysics.org/Bullet/phpBB3/viewtopic.php?t=4818 | 349 | // http://bulletphysics.org/Bullet/phpBB3/viewtopic.php?t=4818 |
346 | // DebugLog("{0}: CreateLinkset: Adding a constraint between root prim {1} and child prim {2}", LogHeader, LocalID, childPrim.LocalID); | ||
347 | DetailLog("{0},PhysicallyLinkAChildToRoot,taint,root={1},child={2}", rootPrim.LocalID, rootPrim.LocalID, childPrim.LocalID); | 350 | DetailLog("{0},PhysicallyLinkAChildToRoot,taint,root={1},child={2}", rootPrim.LocalID, rootPrim.LocalID, childPrim.LocalID); |
348 | BS6DofConstraint constrain = new BS6DofConstraint( | 351 | BS6DofConstraint constrain = new BS6DofConstraint( |
349 | PhysicsScene.World, rootPrim.Body, childPrim.Body, | 352 | PhysicsScene.World, rootPrim.Body, childPrim.Body, |
@@ -382,8 +385,6 @@ public class BSLinkset | |||
382 | // Called at taint time! | 385 | // Called at taint time! |
383 | private void PhysicallyUnlinkAChildFromRoot(BSPrim rootPrim, BSPrim childPrim) | 386 | private void PhysicallyUnlinkAChildFromRoot(BSPrim rootPrim, BSPrim childPrim) |
384 | { | 387 | { |
385 | // DebugLog("{0}: PhysicallyUnlinkAChildFromRoot: RemoveConstraint between root prim {1} and child prim {2}", | ||
386 | // LogHeader, rootPrim.LocalID, childPrim.LocalID); | ||
387 | DetailLog("{0},PhysicallyUnlinkAChildFromRoot,taint,root={1},child={2}", rootPrim.LocalID, rootPrim.LocalID, childPrim.LocalID); | 388 | DetailLog("{0},PhysicallyUnlinkAChildFromRoot,taint,root={1},child={2}", rootPrim.LocalID, rootPrim.LocalID, childPrim.LocalID); |
388 | 389 | ||
389 | // Find the constraint for this link and get rid of it from the overall collection and from my list | 390 | // Find the constraint for this link and get rid of it from the overall collection and from my list |
@@ -397,20 +398,12 @@ public class BSLinkset | |||
397 | // Called at taint time! | 398 | // Called at taint time! |
398 | private void PhysicallyUnlinkAllChildrenFromRoot(BSPrim rootPrim) | 399 | private void PhysicallyUnlinkAllChildrenFromRoot(BSPrim rootPrim) |
399 | { | 400 | { |
400 | // DebugLog("{0}: PhysicallyUnlinkAllChildren:", LogHeader); | ||
401 | DetailLog("{0},PhysicallyUnlinkAllChildren,taint", rootPrim.LocalID); | 401 | DetailLog("{0},PhysicallyUnlinkAllChildren,taint", rootPrim.LocalID); |
402 | 402 | ||
403 | m_physicsScene.Constraints.RemoveAndDestroyConstraint(rootPrim.Body); | 403 | m_physicsScene.Constraints.RemoveAndDestroyConstraint(rootPrim.Body); |
404 | } | 404 | } |
405 | 405 | ||
406 | // Invoke the detailed logger and output something if it's enabled. | 406 | // Invoke the detailed logger and output something if it's enabled. |
407 | private void DebugLog(string msg, params Object[] args) | ||
408 | { | ||
409 | if (m_physicsScene.ShouldDebugLog) | ||
410 | m_physicsScene.Logger.DebugFormat(msg, args); | ||
411 | } | ||
412 | |||
413 | // Invoke the detailed logger and output something if it's enabled. | ||
414 | private void DetailLog(string msg, params Object[] args) | 407 | private void DetailLog(string msg, params Object[] args) |
415 | { | 408 | { |
416 | m_physicsScene.PhysicsLogging.Write(msg, args); | 409 | m_physicsScene.PhysicsLogging.Write(msg, args); |