aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Physics/BulletSPlugin/BSLinkset.cs
diff options
context:
space:
mode:
authorRobert Adams2012-10-29 14:33:31 -0700
committerRobert Adams2012-11-03 21:14:41 -0700
commit93fe384cce42e91337f446fd658ef29ca3d9f733 (patch)
tree8ed885f7b33d929a73a8742063b5a7f9e32a98bb /OpenSim/Region/Physics/BulletSPlugin/BSLinkset.cs
parentBulletSim: Add gravity force to vehicle. Some debugging additions. (diff)
downloadopensim-SC_OLD-93fe384cce42e91337f446fd658ef29ca3d9f733.zip
opensim-SC_OLD-93fe384cce42e91337f446fd658ef29ca3d9f733.tar.gz
opensim-SC_OLD-93fe384cce42e91337f446fd658ef29ca3d9f733.tar.bz2
opensim-SC_OLD-93fe384cce42e91337f446fd658ef29ca3d9f733.tar.xz
BulletSim: Use the PostTaints operation to build the linkset once before the next simulation step. This eliminates the management of children vs taintChildren and simplifies the constratin creation code.
Diffstat (limited to '')
-rwxr-xr-xOpenSim/Region/Physics/BulletSPlugin/BSLinkset.cs52
1 files changed, 20 insertions, 32 deletions
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSLinkset.cs b/OpenSim/Region/Physics/BulletSPlugin/BSLinkset.cs
index 569d2e7..187951e 100755
--- a/OpenSim/Region/Physics/BulletSPlugin/BSLinkset.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSLinkset.cs
@@ -61,16 +61,7 @@ public abstract class BSLinkset
61 public int LinksetID { get; private set; } 61 public int LinksetID { get; private set; }
62 62
63 // The children under the root in this linkset. 63 // The children under the root in this linkset.
64 // There are two lists of children: the current children at runtime
65 // and the children at taint-time. For instance, if you delink a
66 // child from the linkset, the child is removed from m_children
67 // but the constraint won't be removed until taint time.
68 // Two lists lets this track the 'current' children and
69 // the physical 'taint' children separately.
70 // After taint processing and before the simulation step, these
71 // two lists must be the same.
72 protected HashSet<BSPhysObject> m_children; 64 protected HashSet<BSPhysObject> m_children;
73 protected HashSet<BSPhysObject> m_taintChildren;
74 65
75 // We lock the diddling of linkset classes to prevent any badness. 66 // We lock the diddling of linkset classes to prevent any badness.
76 // This locks the modification of the instances of this class. Changes 67 // This locks the modification of the instances of this class. Changes
@@ -110,7 +101,6 @@ public abstract class BSLinkset
110 PhysicsScene = scene; 101 PhysicsScene = scene;
111 LinksetRoot = parent; 102 LinksetRoot = parent;
112 m_children = new HashSet<BSPhysObject>(); 103 m_children = new HashSet<BSPhysObject>();
113 m_taintChildren = new HashSet<BSPhysObject>();
114 m_mass = parent.MassRaw; 104 m_mass = parent.MassRaw;
115 } 105 }
116 106
@@ -192,7 +182,7 @@ public abstract class BSLinkset
192 lock (m_linksetActivityLock) 182 lock (m_linksetActivityLock)
193 { 183 {
194 action(LinksetRoot); 184 action(LinksetRoot);
195 foreach (BSPhysObject po in m_taintChildren) 185 foreach (BSPhysObject po in m_children)
196 { 186 {
197 if (action(po)) 187 if (action(po))
198 break; 188 break;
@@ -201,9 +191,24 @@ public abstract class BSLinkset
201 return ret; 191 return ret;
202 } 192 }
203 193
194 // I am the root of a linkset and a new child is being added
195 // Called while LinkActivity is locked.
196 protected abstract void AddChildToLinkset(BSPhysObject child);
197
198 // Forcefully removing a child from a linkset.
199 // This is not being called by the child so we have to make sure the child doesn't think
200 // it's still connected to the linkset.
201 // Normal OpenSimulator operation will never do this because other SceneObjectPart information
202 // also has to be updated (like pointer to prim's parent).
203 protected abstract void RemoveChildFromOtherLinkset(BSPhysObject pchild);
204
205 // I am the root of a linkset and one of my children is being removed.
206 // Safe to call even if the child is not really in my linkset.
207 protected abstract void RemoveChildFromLinkset(BSPhysObject child);
208
204 // When physical properties are changed the linkset needs to recalculate 209 // When physical properties are changed the linkset needs to recalculate
205 // its internal properties. 210 // its internal properties.
206 // May be called at runtime or taint-time (just pass the appropriate flag). 211 // May be called at runtime or taint-time.
207 public abstract void Refresh(BSPhysObject requestor); 212 public abstract void Refresh(BSPhysObject requestor);
208 213
209 // The object is going dynamic (physical). Do any setup necessary 214 // The object is going dynamic (physical). Do any setup necessary
@@ -238,8 +243,6 @@ public abstract class BSLinkset
238 public abstract void RestoreBodyDependencies(BSPrim child); 243 public abstract void RestoreBodyDependencies(BSPrim child);
239 244
240 // ================================================================ 245 // ================================================================
241 // Below this point is internal magic
242
243 protected virtual float ComputeLinksetMass() 246 protected virtual float ComputeLinksetMass()
244 { 247 {
245 float mass = LinksetRoot.MassRaw; 248 float mass = LinksetRoot.MassRaw;
@@ -264,7 +267,7 @@ public abstract class BSLinkset
264 com = LinksetRoot.Position * LinksetRoot.MassRaw; 267 com = LinksetRoot.Position * LinksetRoot.MassRaw;
265 float totalMass = LinksetRoot.MassRaw; 268 float totalMass = LinksetRoot.MassRaw;
266 269
267 foreach (BSPhysObject bp in m_taintChildren) 270 foreach (BSPhysObject bp in m_children)
268 { 271 {
269 com += bp.Position * bp.MassRaw; 272 com += bp.Position * bp.MassRaw;
270 totalMass += bp.MassRaw; 273 totalMass += bp.MassRaw;
@@ -283,31 +286,16 @@ public abstract class BSLinkset
283 { 286 {
284 com = LinksetRoot.Position; 287 com = LinksetRoot.Position;
285 288
286 foreach (BSPhysObject bp in m_taintChildren) 289 foreach (BSPhysObject bp in m_children)
287 { 290 {
288 com += bp.Position * bp.MassRaw; 291 com += bp.Position * bp.MassRaw;
289 } 292 }
290 com /= (m_taintChildren.Count + 1); 293 com /= (m_children.Count + 1);
291 } 294 }
292 295
293 return com; 296 return com;
294 } 297 }
295 298
296 // I am the root of a linkset and a new child is being added
297 // Called while LinkActivity is locked.
298 protected abstract void AddChildToLinkset(BSPhysObject child);
299
300 // Forcefully removing a child from a linkset.
301 // This is not being called by the child so we have to make sure the child doesn't think
302 // it's still connected to the linkset.
303 // Normal OpenSimulator operation will never do this because other SceneObjectPart information
304 // also has to be updated (like pointer to prim's parent).
305 protected abstract void RemoveChildFromOtherLinkset(BSPhysObject pchild);
306
307 // I am the root of a linkset and one of my children is being removed.
308 // Safe to call even if the child is not really in my linkset.
309 protected abstract void RemoveChildFromLinkset(BSPhysObject child);
310
311 // Invoke the detailed logger and output something if it's enabled. 299 // Invoke the detailed logger and output something if it's enabled.
312 protected void DetailLog(string msg, params Object[] args) 300 protected void DetailLog(string msg, params Object[] args)
313 { 301 {