aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Physics/BulletSPlugin/BSLinkset.cs
diff options
context:
space:
mode:
authorRobert Adams2013-07-11 14:33:03 -0700
committerRobert Adams2013-07-22 10:27:15 -0700
commitb4c3a791aa55390bff071b3fe4bbe70c1d252703 (patch)
tree4823ba36ddaee6f13e7b11559d9701937ecf7cf1 /OpenSim/Region/Physics/BulletSPlugin/BSLinkset.cs
parentAdd experimental stubs for an extension function interface on both (diff)
downloadopensim-SC_OLD-b4c3a791aa55390bff071b3fe4bbe70c1d252703.zip
opensim-SC_OLD-b4c3a791aa55390bff071b3fe4bbe70c1d252703.tar.gz
opensim-SC_OLD-b4c3a791aa55390bff071b3fe4bbe70c1d252703.tar.bz2
opensim-SC_OLD-b4c3a791aa55390bff071b3fe4bbe70c1d252703.tar.xz
BulletSim: move collision processing for linksets from BSPrimLinkable
into the linkset implementation classes. Add HasSomeCollision attribute that remembers of any component of a linkset has a collision. Update vehicle code (BSDynamic) to use the HasSomeCollision in place of IsColliding to make constraint based linksets properly notice the ground. Add linkset functions to change physical attributes of all the members of a linkset.
Diffstat (limited to 'OpenSim/Region/Physics/BulletSPlugin/BSLinkset.cs')
-rwxr-xr-xOpenSim/Region/Physics/BulletSPlugin/BSLinkset.cs75
1 files changed, 74 insertions, 1 deletions
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSLinkset.cs b/OpenSim/Region/Physics/BulletSPlugin/BSLinkset.cs
index ad8e10f..78c0af7 100755
--- a/OpenSim/Region/Physics/BulletSPlugin/BSLinkset.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSLinkset.cs
@@ -203,6 +203,33 @@ public abstract class BSLinkset
203 return ret; 203 return ret;
204 } 204 }
205 205
206 // Called after a simulation step to post a collision with this object.
207 // Return 'true' if linkset processed the collision. 'false' says the linkset didn't have
208 // anything to add for the collision and it should be passed through normal processing.
209 // Default processing for a linkset.
210 public virtual bool HandleCollide(uint collidingWith, BSPhysObject collidee,
211 OMV.Vector3 contactPoint, OMV.Vector3 contactNormal, float pentrationDepth)
212 {
213 bool ret = false;
214
215 // prims in the same linkset cannot collide with each other
216 BSPrimLinkable convCollidee = collidee as BSPrimLinkable;
217 if (convCollidee != null && (LinksetID == convCollidee.Linkset.LinksetID))
218 {
219 // By returning 'true', we tell the caller the collision has been 'handled' so it won't
220 // do anything about this collision and thus, effectivily, ignoring the collision.
221 ret = true;
222 }
223 else
224 {
225 // Not a collision between members of the linkset. Must be a real collision.
226 // So the linkset root can know if there is a collision anywhere in the linkset.
227 LinksetRoot.SomeCollisionSimulationStep = m_physicsScene.SimulationStep;
228 }
229
230 return ret;
231 }
232
206 // I am the root of a linkset and a new child is being added 233 // I am the root of a linkset and a new child is being added
207 // Called while LinkActivity is locked. 234 // Called while LinkActivity is locked.
208 protected abstract void AddChildToLinkset(BSPrimLinkable child); 235 protected abstract void AddChildToLinkset(BSPrimLinkable child);
@@ -251,6 +278,53 @@ public abstract class BSLinkset
251 public abstract bool RemoveDependencies(BSPrimLinkable child); 278 public abstract bool RemoveDependencies(BSPrimLinkable child);
252 279
253 // ================================================================ 280 // ================================================================
281 // Some physical setting happen to all members of the linkset
282 public virtual void SetPhysicalFriction(float friction)
283 {
284 ForEachMember((member) =>
285 {
286 if (member.PhysBody.HasPhysicalBody)
287 m_physicsScene.PE.SetFriction(member.PhysBody, friction);
288 return false; // 'false' says to continue looping
289 }
290 );
291 }
292 public virtual void SetPhysicalRestitution(float restitution)
293 {
294 ForEachMember((member) =>
295 {
296 if (member.PhysBody.HasPhysicalBody)
297 m_physicsScene.PE.SetRestitution(member.PhysBody, restitution);
298 return false; // 'false' says to continue looping
299 }
300 );
301 }
302 public virtual void SetPhysicalGravity(OMV.Vector3 gravity)
303 {
304 ForEachMember((member) =>
305 {
306 if (member.PhysBody.HasPhysicalBody)
307 m_physicsScene.PE.SetGravity(member.PhysBody, gravity);
308 return false; // 'false' says to continue looping
309 }
310 );
311 }
312 public virtual void ComputeLocalInertia()
313 {
314 ForEachMember((member) =>
315 {
316 if (member.PhysBody.HasPhysicalBody)
317 {
318 OMV.Vector3 inertia = m_physicsScene.PE.CalculateLocalInertia(member.PhysShape.physShapeInfo, member.Mass);
319 member.Inertia = inertia * BSParam.VehicleInertiaFactor;
320 m_physicsScene.PE.SetMassProps(member.PhysBody, member.Mass, member.Inertia);
321 m_physicsScene.PE.UpdateInertiaTensor(member.PhysBody);
322 }
323 return false; // 'false' says to continue looping
324 }
325 );
326 }
327 // ================================================================
254 protected virtual float ComputeLinksetMass() 328 protected virtual float ComputeLinksetMass()
255 { 329 {
256 float mass = LinksetRoot.RawMass; 330 float mass = LinksetRoot.RawMass;
@@ -311,6 +385,5 @@ public abstract class BSLinkset
311 if (m_physicsScene.PhysicsLogging.Enabled) 385 if (m_physicsScene.PhysicsLogging.Enabled)
312 m_physicsScene.DetailLog(msg, args); 386 m_physicsScene.DetailLog(msg, args);
313 } 387 }
314
315} 388}
316} 389}