diff options
author | Robert Adams | 2013-07-11 14:33:03 -0700 |
---|---|---|
committer | Robert Adams | 2013-07-22 10:27:15 -0700 |
commit | b4c3a791aa55390bff071b3fe4bbe70c1d252703 (patch) | |
tree | 4823ba36ddaee6f13e7b11559d9701937ecf7cf1 /OpenSim/Region/Physics/BulletSPlugin/BSLinkset.cs | |
parent | Add experimental stubs for an extension function interface on both (diff) | |
download | opensim-SC-b4c3a791aa55390bff071b3fe4bbe70c1d252703.zip opensim-SC-b4c3a791aa55390bff071b3fe4bbe70c1d252703.tar.gz opensim-SC-b4c3a791aa55390bff071b3fe4bbe70c1d252703.tar.bz2 opensim-SC-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 '')
-rwxr-xr-x | OpenSim/Region/Physics/BulletSPlugin/BSLinkset.cs | 75 |
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 | } |