diff options
author | Robert Adams | 2012-09-18 08:39:52 -0700 |
---|---|---|
committer | Robert Adams | 2012-09-27 22:01:11 -0700 |
commit | ee7cda261cbbc9dcd558c35eabc070cc0bf45644 (patch) | |
tree | f30f9c9baf15ef6988983e53bf3141749eab75f9 /OpenSim/Region/Physics/BulletSPlugin/BSLinkset.cs | |
parent | Comment out unused RestPlugins text in OpenSimDefaults.ini (diff) | |
download | opensim-SC_OLD-ee7cda261cbbc9dcd558c35eabc070cc0bf45644.zip opensim-SC_OLD-ee7cda261cbbc9dcd558c35eabc070cc0bf45644.tar.gz opensim-SC_OLD-ee7cda261cbbc9dcd558c35eabc070cc0bf45644.tar.bz2 opensim-SC_OLD-ee7cda261cbbc9dcd558c35eabc070cc0bf45644.tar.xz |
BulletSim: move a bunch of common logic out of BSPrim and BSCharacter
and into the parent class BSPhysObject.
Rework collision logic to enable extra collision after done colliding.
Rename 'Scene' to 'PhysicsScene' to differentiate it from the simulator 'Scene'.
Diffstat (limited to 'OpenSim/Region/Physics/BulletSPlugin/BSLinkset.cs')
-rwxr-xr-x | OpenSim/Region/Physics/BulletSPlugin/BSLinkset.cs | 42 |
1 files changed, 20 insertions, 22 deletions
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSLinkset.cs b/OpenSim/Region/Physics/BulletSPlugin/BSLinkset.cs index 7e784eb..005a758 100755 --- a/OpenSim/Region/Physics/BulletSPlugin/BSLinkset.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSLinkset.cs | |||
@@ -36,11 +36,9 @@ public class BSLinkset | |||
36 | { | 36 | { |
37 | private static string LogHeader = "[BULLETSIM LINKSET]"; | 37 | private static string LogHeader = "[BULLETSIM LINKSET]"; |
38 | 38 | ||
39 | private BSPhysObject m_linksetRoot; | 39 | public BSPhysObject LinksetRoot { get; protected set; } |
40 | public BSPhysObject LinksetRoot { get { return m_linksetRoot; } } | ||
41 | 40 | ||
42 | private BSScene m_physicsScene; | 41 | public BSScene PhysicsScene { get; private set; } |
43 | public BSScene PhysicsScene { get { return m_physicsScene; } } | ||
44 | 42 | ||
45 | static int m_nextLinksetID = 1; | 43 | static int m_nextLinksetID = 1; |
46 | public int LinksetID { get; private set; } | 44 | public int LinksetID { get; private set; } |
@@ -81,8 +79,8 @@ public class BSLinkset | |||
81 | // We create LOTS of linksets. | 79 | // We create LOTS of linksets. |
82 | if (m_nextLinksetID < 0) | 80 | if (m_nextLinksetID < 0) |
83 | m_nextLinksetID = 1; | 81 | m_nextLinksetID = 1; |
84 | m_physicsScene = scene; | 82 | PhysicsScene = scene; |
85 | m_linksetRoot = parent; | 83 | LinksetRoot = parent; |
86 | m_children = new List<BSPhysObject>(); | 84 | m_children = new List<BSPhysObject>(); |
87 | m_mass = parent.MassRaw; | 85 | m_mass = parent.MassRaw; |
88 | } | 86 | } |
@@ -131,7 +129,7 @@ public class BSLinkset | |||
131 | // Return 'true' if the passed object is the root object of this linkset | 129 | // Return 'true' if the passed object is the root object of this linkset |
132 | public bool IsRoot(BSPhysObject requestor) | 130 | public bool IsRoot(BSPhysObject requestor) |
133 | { | 131 | { |
134 | return (requestor.LocalID == m_linksetRoot.LocalID); | 132 | return (requestor.LocalID == LinksetRoot.LocalID); |
135 | } | 133 | } |
136 | 134 | ||
137 | public int NumberOfChildren { get { return m_children.Count; } } | 135 | public int NumberOfChildren { get { return m_children.Count; } } |
@@ -159,7 +157,7 @@ public class BSLinkset | |||
159 | 157 | ||
160 | private float ComputeLinksetMass() | 158 | private float ComputeLinksetMass() |
161 | { | 159 | { |
162 | float mass = m_linksetRoot.MassRaw; | 160 | float mass = LinksetRoot.MassRaw; |
163 | foreach (BSPhysObject bp in m_children) | 161 | foreach (BSPhysObject bp in m_children) |
164 | { | 162 | { |
165 | mass += bp.MassRaw; | 163 | mass += bp.MassRaw; |
@@ -169,8 +167,8 @@ public class BSLinkset | |||
169 | 167 | ||
170 | private OMV.Vector3 ComputeLinksetCenterOfMass() | 168 | private OMV.Vector3 ComputeLinksetCenterOfMass() |
171 | { | 169 | { |
172 | OMV.Vector3 com = m_linksetRoot.Position * m_linksetRoot.MassRaw; | 170 | OMV.Vector3 com = LinksetRoot.Position * LinksetRoot.MassRaw; |
173 | float totalMass = m_linksetRoot.MassRaw; | 171 | float totalMass = LinksetRoot.MassRaw; |
174 | 172 | ||
175 | lock (m_linksetActivityLock) | 173 | lock (m_linksetActivityLock) |
176 | { | 174 | { |
@@ -188,7 +186,7 @@ public class BSLinkset | |||
188 | 186 | ||
189 | private OMV.Vector3 ComputeLinksetGeometricCenter() | 187 | private OMV.Vector3 ComputeLinksetGeometricCenter() |
190 | { | 188 | { |
191 | OMV.Vector3 com = m_linksetRoot.Position; | 189 | OMV.Vector3 com = LinksetRoot.Position; |
192 | 190 | ||
193 | lock (m_linksetActivityLock) | 191 | lock (m_linksetActivityLock) |
194 | { | 192 | { |
@@ -256,7 +254,7 @@ public class BSLinkset | |||
256 | foreach (BSPhysObject child in m_children) | 254 | foreach (BSPhysObject child in m_children) |
257 | { | 255 | { |
258 | BSConstraint constrain; | 256 | BSConstraint constrain; |
259 | if (m_physicsScene.Constraints.TryGetConstraint(LinksetRoot.BSBody, child.BSBody, out constrain)) | 257 | if (PhysicsScene.Constraints.TryGetConstraint(LinksetRoot.BSBody, child.BSBody, out constrain)) |
260 | { | 258 | { |
261 | // DetailLog("{0},BSLinkset.RecomputeLinksetConstraintVariables,taint,child={1},mass={2},A={3},B={4}", | 259 | // DetailLog("{0},BSLinkset.RecomputeLinksetConstraintVariables,taint,child={1},mass={2},A={3},B={4}", |
262 | // LinksetRoot.LocalID, child.LocalID, linksetMass, constrain.Body1.ID, constrain.Body2.ID); | 260 | // LinksetRoot.LocalID, child.LocalID, linksetMass, constrain.Body1.ID, constrain.Body2.ID); |
@@ -306,9 +304,9 @@ public class BSLinkset | |||
306 | 304 | ||
307 | BSPhysObject rootx = LinksetRoot; // capture the root as of now | 305 | BSPhysObject rootx = LinksetRoot; // capture the root as of now |
308 | BSPhysObject childx = child; | 306 | BSPhysObject childx = child; |
309 | m_physicsScene.TaintedObject("AddChildToLinkset", delegate() | 307 | PhysicsScene.TaintedObject("AddChildToLinkset", delegate() |
310 | { | 308 | { |
311 | DetailLog("{0},AddChildToLinkset,taint,child={1}", m_linksetRoot.LocalID, child.LocalID); | 309 | DetailLog("{0},AddChildToLinkset,taint,child={1}", LinksetRoot.LocalID, child.LocalID); |
312 | PhysicallyLinkAChildToRoot(rootx, childx); // build the physical binding between me and the child | 310 | PhysicallyLinkAChildToRoot(rootx, childx); // build the physical binding between me and the child |
313 | }); | 311 | }); |
314 | } | 312 | } |
@@ -322,7 +320,7 @@ public class BSLinkset | |||
322 | // has to be updated also (like pointer to prim's parent). | 320 | // has to be updated also (like pointer to prim's parent). |
323 | private void RemoveChildFromOtherLinkset(BSPhysObject pchild) | 321 | private void RemoveChildFromOtherLinkset(BSPhysObject pchild) |
324 | { | 322 | { |
325 | pchild.Linkset = new BSLinkset(m_physicsScene, pchild); | 323 | pchild.Linkset = new BSLinkset(PhysicsScene, pchild); |
326 | RemoveChildFromLinkset(pchild); | 324 | RemoveChildFromLinkset(pchild); |
327 | } | 325 | } |
328 | 326 | ||
@@ -334,9 +332,9 @@ public class BSLinkset | |||
334 | { | 332 | { |
335 | BSPhysObject rootx = LinksetRoot; // capture the root as of now | 333 | BSPhysObject rootx = LinksetRoot; // capture the root as of now |
336 | BSPhysObject childx = child; | 334 | BSPhysObject childx = child; |
337 | m_physicsScene.TaintedObject("RemoveChildFromLinkset", delegate() | 335 | PhysicsScene.TaintedObject("RemoveChildFromLinkset", delegate() |
338 | { | 336 | { |
339 | DetailLog("{0},RemoveChildFromLinkset,taint,child={1}", m_linksetRoot.LocalID, child.LocalID); | 337 | DetailLog("{0},RemoveChildFromLinkset,taint,child={1}", LinksetRoot.LocalID, child.LocalID); |
340 | 338 | ||
341 | PhysicallyUnlinkAChildFromRoot(rootx, childx); | 339 | PhysicallyUnlinkAChildFromRoot(rootx, childx); |
342 | RecomputeLinksetConstraintVariables(); | 340 | RecomputeLinksetConstraintVariables(); |
@@ -370,7 +368,7 @@ public class BSLinkset | |||
370 | DetailLog("{0},PhysicallyLinkAChildToRoot,taint,root={1},child={2},rLoc={3},cLoc={4},midLoc={5}", | 368 | DetailLog("{0},PhysicallyLinkAChildToRoot,taint,root={1},child={2},rLoc={3},cLoc={4},midLoc={5}", |
371 | rootPrim.LocalID, rootPrim.LocalID, childPrim.LocalID, rootPrim.Position, childPrim.Position, midPoint); | 369 | rootPrim.LocalID, rootPrim.LocalID, childPrim.LocalID, rootPrim.Position, childPrim.Position, midPoint); |
372 | BS6DofConstraint constrain = new BS6DofConstraint( | 370 | BS6DofConstraint constrain = new BS6DofConstraint( |
373 | m_physicsScene.World, rootPrim.BSBody, childPrim.BSBody, | 371 | PhysicsScene.World, rootPrim.BSBody, childPrim.BSBody, |
374 | midPoint, | 372 | midPoint, |
375 | true, | 373 | true, |
376 | true | 374 | true |
@@ -408,7 +406,7 @@ public class BSLinkset | |||
408 | // ================================================================================== | 406 | // ================================================================================== |
409 | */ | 407 | */ |
410 | 408 | ||
411 | m_physicsScene.Constraints.AddConstraint(constrain); | 409 | PhysicsScene.Constraints.AddConstraint(constrain); |
412 | 410 | ||
413 | // zero linear and angular limits makes the objects unable to move in relation to each other | 411 | // zero linear and angular limits makes the objects unable to move in relation to each other |
414 | constrain.SetLinearLimits(OMV.Vector3.Zero, OMV.Vector3.Zero); | 412 | constrain.SetLinearLimits(OMV.Vector3.Zero, OMV.Vector3.Zero); |
@@ -435,7 +433,7 @@ public class BSLinkset | |||
435 | DetailLog("{0},PhysicallyUnlinkAChildFromRoot,taint,root={1},child={2}", rootPrim.LocalID, rootPrim.LocalID, childPrim.LocalID); | 433 | DetailLog("{0},PhysicallyUnlinkAChildFromRoot,taint,root={1},child={2}", rootPrim.LocalID, rootPrim.LocalID, childPrim.LocalID); |
436 | 434 | ||
437 | // Find the constraint for this link and get rid of it from the overall collection and from my list | 435 | // Find the constraint for this link and get rid of it from the overall collection and from my list |
438 | m_physicsScene.Constraints.RemoveAndDestroyConstraint(rootPrim.BSBody, childPrim.BSBody); | 436 | PhysicsScene.Constraints.RemoveAndDestroyConstraint(rootPrim.BSBody, childPrim.BSBody); |
439 | 437 | ||
440 | // Make the child refresh its location | 438 | // Make the child refresh its location |
441 | BulletSimAPI.PushUpdate2(childPrim.BSBody.Ptr); | 439 | BulletSimAPI.PushUpdate2(childPrim.BSBody.Ptr); |
@@ -447,13 +445,13 @@ public class BSLinkset | |||
447 | { | 445 | { |
448 | DetailLog("{0},PhysicallyUnlinkAllChildren,taint", rootPrim.LocalID); | 446 | DetailLog("{0},PhysicallyUnlinkAllChildren,taint", rootPrim.LocalID); |
449 | 447 | ||
450 | m_physicsScene.Constraints.RemoveAndDestroyConstraint(rootPrim.BSBody); | 448 | PhysicsScene.Constraints.RemoveAndDestroyConstraint(rootPrim.BSBody); |
451 | } | 449 | } |
452 | 450 | ||
453 | // Invoke the detailed logger and output something if it's enabled. | 451 | // Invoke the detailed logger and output something if it's enabled. |
454 | private void DetailLog(string msg, params Object[] args) | 452 | private void DetailLog(string msg, params Object[] args) |
455 | { | 453 | { |
456 | m_physicsScene.PhysicsLogging.Write(msg, args); | 454 | PhysicsScene.PhysicsLogging.Write(msg, args); |
457 | } | 455 | } |
458 | 456 | ||
459 | } | 457 | } |