BulletSim: add ClearCollisionProxyCache function to API.
Add proxy cache clearing when some properties are changed. This fixes a problem where objects would stop colliding of they were moved with setPosition mulitple times.0.7.6-extended
							parent
							
								
									b6568c7e22
								
							
						
					
					
						commit
						568ff6fddc
					
				|  | @ -725,6 +725,13 @@ public override bool RemoveObjectFromWorld(BulletWorld world, BulletBody obj) | ||||||
|     return BSAPICPP.RemoveObjectFromWorld2(worldu.ptr, bodyu.ptr); |     return BSAPICPP.RemoveObjectFromWorld2(worldu.ptr, bodyu.ptr); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | public override bool ClearCollisionProxyCache(BulletWorld world, BulletBody obj) | ||||||
|  | { | ||||||
|  |     BulletWorldUnman worldu = world as BulletWorldUnman; | ||||||
|  |     BulletBodyUnman bodyu = obj as BulletBodyUnman; | ||||||
|  |     return BSAPICPP.ClearCollisionProxyCache2(worldu.ptr, bodyu.ptr); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| public override bool AddConstraintToWorld(BulletWorld world, BulletConstraint constrain, bool disableCollisionsBetweenLinkedObjects) | public override bool AddConstraintToWorld(BulletWorld world, BulletConstraint constrain, bool disableCollisionsBetweenLinkedObjects) | ||||||
| { | { | ||||||
|     BulletWorldUnman worldu = world as BulletWorldUnman; |     BulletWorldUnman worldu = world as BulletWorldUnman; | ||||||
|  | @ -1712,6 +1719,9 @@ public static extern bool AddObjectToWorld2(IntPtr world, IntPtr obj); | ||||||
| [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity] | [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity] | ||||||
| public static extern bool RemoveObjectFromWorld2(IntPtr world, IntPtr obj); | public static extern bool RemoveObjectFromWorld2(IntPtr world, IntPtr obj); | ||||||
| 
 | 
 | ||||||
|  | [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity] | ||||||
|  | public static extern bool ClearCollisionProxyCache2(IntPtr world, IntPtr obj); | ||||||
|  | 
 | ||||||
| [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity] | [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity] | ||||||
| public static extern bool AddConstraintToWorld2(IntPtr world, IntPtr constrain, bool disableCollisionsBetweenLinkedObjects); | public static extern bool AddConstraintToWorld2(IntPtr world, IntPtr constrain, bool disableCollisionsBetweenLinkedObjects); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -169,6 +169,19 @@ private sealed class BulletConstraintXNA : BulletConstraint | ||||||
|         return true; |         return true; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     public override bool ClearCollisionProxyCache(BulletWorld pWorld, BulletBody pBody) | ||||||
|  |     { | ||||||
|  |         DiscreteDynamicsWorld world = (pWorld as BulletWorldXNA).world; | ||||||
|  |         RigidBody body = ((BulletBodyXNA)pBody).rigidBody; | ||||||
|  |         CollisionObject collisionObject = ((BulletBodyXNA)pBody).body; | ||||||
|  |         if (body != null && collisionObject != null && collisionObject.GetBroadphaseHandle() != null) | ||||||
|  |         { | ||||||
|  |             world.RemoveCollisionObject(collisionObject); | ||||||
|  |             world.AddCollisionObject(collisionObject); | ||||||
|  |         } | ||||||
|  |         return true; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     public override bool AddConstraintToWorld(BulletWorld pWorld, BulletConstraint pConstraint, bool pDisableCollisionsBetweenLinkedObjects) |     public override bool AddConstraintToWorld(BulletWorld pWorld, BulletConstraint pConstraint, bool pDisableCollisionsBetweenLinkedObjects) | ||||||
|     { |     { | ||||||
|         DiscreteDynamicsWorld world = (pWorld as BulletWorldXNA).world; |         DiscreteDynamicsWorld world = (pWorld as BulletWorldXNA).world; | ||||||
|  |  | ||||||
|  | @ -498,6 +498,8 @@ public abstract bool AddObjectToWorld(BulletWorld world, BulletBody obj); | ||||||
| 
 | 
 | ||||||
| public abstract bool RemoveObjectFromWorld(BulletWorld world, BulletBody obj); | public abstract bool RemoveObjectFromWorld(BulletWorld world, BulletBody obj); | ||||||
| 
 | 
 | ||||||
|  | public abstract bool ClearCollisionProxyCache(BulletWorld world, BulletBody obj); | ||||||
|  | 
 | ||||||
| public abstract bool AddConstraintToWorld(BulletWorld world, BulletConstraint constrain, bool disableCollisionsBetweenLinkedObjects); | public abstract bool AddConstraintToWorld(BulletWorld world, BulletConstraint constrain, bool disableCollisionsBetweenLinkedObjects); | ||||||
| 
 | 
 | ||||||
| public abstract bool RemoveConstraintFromWorld(BulletWorld world, BulletConstraint constrain); | public abstract bool RemoveConstraintFromWorld(BulletWorld world, BulletConstraint constrain); | ||||||
|  |  | ||||||
|  | @ -300,8 +300,16 @@ public abstract class BSPhysObject : PhysicsActor | ||||||
|     // Called in taint-time!! |     // Called in taint-time!! | ||||||
|     public void ActivateIfPhysical(bool forceIt) |     public void ActivateIfPhysical(bool forceIt) | ||||||
|     { |     { | ||||||
|         if (IsPhysical && PhysBody.HasPhysicalBody) |         if (PhysBody.HasPhysicalBody) | ||||||
|             PhysScene.PE.Activate(PhysBody, forceIt); |         { | ||||||
|  |             // Clear the collision cache since we've changed some properties. | ||||||
|  |             PhysScene.PE.ClearCollisionProxyCache(PhysScene.World, PhysBody); | ||||||
|  |             if (IsPhysical) | ||||||
|  |             { | ||||||
|  |                 // Physical objects might need activating | ||||||
|  |                 PhysScene.PE.Activate(PhysBody, forceIt); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     // 'actors' act on the physical object to change or constrain its motion. These can range from |     // 'actors' act on the physical object to change or constrain its motion. These can range from | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 Robert Adams
						Robert Adams