public ConvexPlaneCollisionAlgorithm(PersistentManifold mf, CollisionAlgorithmConstructionInfo ci, CollisionObjectWrapper body0Wrap, CollisionObjectWrapper body1Wrap, bool isSwapped, int numPerturbationIterations, int minimumPointsPerturbationThreshold) : base(btConvexPlaneCollisionAlgorithm_new(mf._native, ci._native, body0Wrap._native, body1Wrap._native, isSwapped, numPerturbationIterations, minimumPointsPerturbationThreshold)) { }
public SphereTriangleCollisionAlgorithm(PersistentManifold mf, CollisionAlgorithmConstructionInfo ci, CollisionObjectWrapper body0Wrap, CollisionObjectWrapper body1Wrap, bool swapped) { IntPtr native = btSphereTriangleCollisionAlgorithm_new(mf.Native, ci.Native, body0Wrap.Native, body1Wrap.Native, swapped); InitializeUserOwned(native); }
public SoftRigidCollisionAlgorithm(PersistentManifold mf, CollisionAlgorithmConstructionInfo ci, CollisionObjectWrapper col0, CollisionObjectWrapper col1Wrap, bool isSwapped) { IntPtr native = btSoftRigidCollisionAlgorithm_new(mf.Native, ci.Native, col0.Native, col1Wrap.Native, isSwapped); InitializeUserOwned(native); }
public Convex2DConvex2DAlgorithm(PersistentManifold mf, CollisionAlgorithmConstructionInfo ci, CollisionObjectWrapper body0Wrap, CollisionObjectWrapper body1Wrap, VoronoiSimplexSolver simplexSolver, ConvexPenetrationDepthSolver pdSolver, int numPerturbationIterations, int minimumPointsPerturbationThreshold) : base(btConvex2dConvex2dAlgorithm_new(mf._native, ci._native, body0Wrap._native, body1Wrap._native, simplexSolver._native, pdSolver._native, numPerturbationIterations, minimumPointsPerturbationThreshold)) { }
public SphereSphereCollisionAlgorithm(PersistentManifold mf, CollisionAlgorithmConstructionInfo ci, CollisionObjectWrapper col0Wrap, CollisionObjectWrapper col1Wrap) { IntPtr native = btSphereSphereCollisionAlgorithm_new(mf.Native, ci.Native, col0Wrap.Native, col1Wrap.Native); InitializeUserOwned(native); }
public SoftSoftCollisionAlgorithm(PersistentManifold mf, CollisionAlgorithmConstructionInfo ci, CollisionObjectWrapper body0Wrap, CollisionObjectWrapper body1Wrap) { IntPtr native = btSoftSoftCollisionAlgorithm_new2(mf.Native, ci.Native, body0Wrap.Native, body1Wrap.Native); InitializeUserOwned(native); }
public unsafe static void RefreshContactPoints(this PersistentManifold obj, ref OpenTK.Matrix4 trA, ref OpenTK.Matrix4 trB) { fixed(OpenTK.Matrix4 *trAPtr = &trA) { fixed(OpenTK.Matrix4 *trBPtr = &trB) { obj.RefreshContactPoints(ref *(BulletSharp.Math.Matrix *)trAPtr, ref *(BulletSharp.Math.Matrix *)trBPtr); } } }
protected bool RecoverFromPenetration(CollisionWorld collisionWorld) { // Here we must refresh the overlapping paircache as the penetrating movement itself or the // previous recovery iteration might have used setWorldTransform and pushed us into an object // that is not in the previous cache contents from the last timestep, as will happen if we // are pushed into a new AABB overlap. Unhandled this means the next convex sweep gets stuck. // // Do this by calling the broadphase's setAabb with the moved AABB, this will update the broadphase // paircache and the ghostobject's internal paircache at the same time. /BW Vector3 minAabb, maxAabb; m_convexShape.GetAabb(m_ghostObject.WorldTransform, out minAabb, out maxAabb); collisionWorld.Broadphase.SetAabbRef(m_ghostObject.BroadphaseHandle, ref minAabb, ref maxAabb, collisionWorld.Dispatcher); bool penetration = false; collisionWorld.Dispatcher.DispatchAllCollisionPairs(m_ghostObject.OverlappingPairCache, collisionWorld.DispatchInfo, collisionWorld.Dispatcher); m_currentPosition = m_ghostObject.WorldTransform.Origin; // btScalar maxPen = btScalar(0.0); for (int i = 0; i < m_ghostObject.OverlappingPairCache.NumOverlappingPairs; i++) { m_manifoldArray.Clear(); BroadphasePair collisionPair = m_ghostObject.OverlappingPairCache.OverlappingPairArray[i]; CollisionObject obj0 = collisionPair.Proxy0.ClientObject as CollisionObject; CollisionObject obj1 = collisionPair.Proxy1.ClientObject as CollisionObject; if ((obj0 != null && !obj0.HasContactResponse) || (obj1 != null && !obj1.HasContactResponse)) { continue; } if (!NeedsCollision(obj0, obj1)) { continue; } if (collisionPair.Algorithm != null) { collisionPair.Algorithm.GetAllContactManifolds(m_manifoldArray); } for (int j = 0; j < m_manifoldArray.Count; j++) { PersistentManifold manifold = m_manifoldArray[j]; float directionSign = manifold.Body0 == m_ghostObject ? -1.0f : 1.0f; for (int p = 0; p < manifold.NumContacts; p++) { ManifoldPoint pt = manifold.GetContactPoint(p); float dist = pt.Distance; if (dist < -m_maxPenetrationDepth) { // to do: cause problems on slopes, not sure if it is needed //if (dist < maxPen) //{ // maxPen = dist; // m_touchingNormal = pt.m_normalWorldOnB * directionSign;//?? //} m_currentPosition += pt.NormalWorldOnB * directionSign * dist * 0.2f; penetration = true; } else { //System.Console.WriteLine("touching " + dist); } } //manifold.ClearManifold(); } } Matrix newTrans = m_ghostObject.WorldTransform; newTrans.Origin = m_currentPosition; m_ghostObject.WorldTransform = newTrans; //System.Console.WriteLine("m_touchingNormal = " + m_touchingNormal); return(penetration); }
public SphereTriangleCollisionAlgorithm(PersistentManifold mf, CollisionAlgorithmConstructionInfo ci, CollisionObjectWrapper body0Wrap, CollisionObjectWrapper body1Wrap, bool swapped) : base(btSphereTriangleCollisionAlgorithm_new(mf._native, ci._native, body0Wrap._native, body1Wrap._native, swapped)) { }
public SoftSoftCollisionAlgorithm(PersistentManifold mf, CollisionAlgorithmConstructionInfo ci, CollisionObjectWrapper body0Wrap, CollisionObjectWrapper body1Wrap) : base(btSoftSoftCollisionAlgorithm_new2(mf.Native, ci.Native, body0Wrap.Native, body1Wrap.Native)) { }
public SphereSphereCollisionAlgorithm(PersistentManifold mf, CollisionAlgorithmConstructionInfo ci, CollisionObjectWrapper col0Wrap, CollisionObjectWrapper col1Wrap) : base(btSphereSphereCollisionAlgorithm_new(mf._native, ci._native, col0Wrap._native, col1Wrap._native)) { }
public void ReleaseManifold(PersistentManifold manifold) { btDispatcher_releaseManifold(_native, manifold._native); }
public void ClearManifold(PersistentManifold manifold) { btDispatcher_clearManifold(_native, manifold._native); }
public abstract void OnVisitPersistentManifold(PersistentManifold pm);
public SoftRigidCollisionAlgorithm(PersistentManifold mf, CollisionAlgorithmConstructionInfo ci, CollisionObjectWrapper col0, CollisionObjectWrapper col1Wrap, bool isSwapped) : base(btSoftRigidCollisionAlgorithm_new(mf.Native, ci.Native, col0.Native, col1Wrap.Native, isSwapped)) { }
protected bool RecoverFromPenetration(CollisionWorld collisionWorld) { Vector3 minAabb, maxAabb; m_convexShape.GetAabb(m_ghostObject.WorldTransform, out minAabb, out maxAabb); collisionWorld.Broadphase.SetAabbRef(m_ghostObject.BroadphaseHandle, ref minAabb, ref maxAabb, collisionWorld.Dispatcher); bool penetration = false; collisionWorld.Dispatcher.DispatchAllCollisionPairs(m_ghostObject.OverlappingPairCache, collisionWorld.DispatchInfo, collisionWorld.Dispatcher); m_currentPosition = m_ghostObject.WorldTransform.Origin; float maxPen = 0f; for (int i = 0; i < m_ghostObject.OverlappingPairCache.NumOverlappingPairs; i++) { m_manifoldArray.Clear(); BroadphasePair collisionPair = m_ghostObject.OverlappingPairCache.OverlappingPairArray[i]; CollisionObject obj0 = collisionPair.Proxy0.ClientObject as CollisionObject; CollisionObject obj1 = collisionPair.Proxy1.ClientObject as CollisionObject; if ((obj0 != null && !obj0.HasContactResponse) || (obj1 != null && !obj1.HasContactResponse)) { continue; } if (collisionPair.Algorithm != null) { collisionPair.Algorithm.GetAllContactManifolds(m_manifoldArray); } for (int j = 0; j < m_manifoldArray.Count; j++) { PersistentManifold manifold = m_manifoldArray[j]; float directionSign = manifold.Body0 == m_ghostObject ? -1f : 1f; for (int p = 0; p < manifold.NumContacts; p++) { ManifoldPoint pt = manifold.GetContactPoint(p); float dist = pt.Distance; if (dist < 0.0f) { if (dist < maxPen) { maxPen = dist; m_touchingNormal = pt.NormalWorldOnB * directionSign;//?? } m_currentPosition += pt.NormalWorldOnB * directionSign * dist * 0.2f; penetration = true; } else { //printf("touching %f\n", dist); } } //manifold.ClearManifold(); } } Matrix newTrans = m_ghostObject.WorldTransform; newTrans.Origin = m_currentPosition; m_ghostObject.WorldTransform = newTrans; // printf("m_touchingNormal = %f,%f,%f\n",m_touchingNormal[0],m_touchingNormal[1],m_touchingNormal[2]); return(penetration); }
protected bool RecoverFromPenetration(CollisionWorld collisionWorld) { Vector3 minAabb, maxAabb; m_convexShape.GetAabb(m_ghostObject.WorldTransform, out minAabb, out maxAabb); collisionWorld.Broadphase.SetAabbRef(m_ghostObject.BroadphaseHandle, ref minAabb, ref maxAabb, collisionWorld.Dispatcher); bool penetration = false; collisionWorld.Dispatcher.DispatchAllCollisionPairs(m_ghostObject.OverlappingPairCache, collisionWorld.DispatchInfo, collisionWorld.Dispatcher); m_currentPosition = m_ghostObject.WorldTransform.Origin; float maxPen = 0f; for (int i = 0; i < m_ghostObject.OverlappingPairCache.NumOverlappingPairs; i++) { m_manifoldArray.Clear(); BroadphasePair collisionPair = m_ghostObject.OverlappingPairCache.OverlappingPairArray[i]; CollisionObject obj0 = collisionPair.Proxy0.ClientObject as CollisionObject; CollisionObject obj1 = collisionPair.Proxy1.ClientObject as CollisionObject; if ((obj0 != null && !obj0.HasContactResponse) || (obj1 != null && !obj1.HasContactResponse)) { continue; } collisionPair.GetAllContactManifolds(m_manifoldArray); for (int j = 0; j < m_manifoldArray.Count; j++) { var manifoldId = AlignedManifoldArray.btAlignedManifoldArray_at(m_manifoldArray._native, j); var bodyId = PersistentManifold.btPersistentManifold_getBody0(manifoldId); var numContacts = PersistentManifold.btPersistentManifold_getNumContacts(manifoldId); float directionSign = bodyId == m_ghostObject._native ? -1f : 1f; for (int p = 0; p < numContacts; p++) { var manifoldPointId = PersistentManifold.btPersistentManifold_getContactPoint(manifoldId, p); float dist = ManifoldPoint.btManifoldPoint_getDistance(manifoldPointId); if (dist < 0.0f) { Vector3 normalWorldOnB; ManifoldPoint.btManifoldPoint_getNormalWorldOnB(manifoldPointId, out normalWorldOnB); if (dist < maxPen) { maxPen = dist; } var counterPenDir = normalWorldOnB * directionSign;; m_currentPosition += counterPenDir * dist; penetration = true; if (counterPenDir.Dot(Vector3.UnitY) > 0) { m_verticalVelocity = 0; } } } } } Matrix newTrans = m_ghostObject.WorldTransform; newTrans.Origin = m_currentPosition; m_ghostObject.WorldTransform = newTrans; return(penetration); }
public override void OnVisitPersistentManifold(PersistentManifold pm) { CollisionObject other; if (pm.Body0 == myCollisionObject) { other = pm.Body1; } else { other = pm.Body0; } PersistentManifoldList pml; if (!otherObjs2ManifoldMap.TryGetValue(other,out pml)) { //todo get from object pool pml = new PersistentManifoldList(); newContacts.Add(pml); } pml.manifolds.Add(pm); }
public SphereBoxCollisionAlgorithm(PersistentManifold mf, CollisionAlgorithmConstructionInfo ci, CollisionObjectWrapper body0Wrap, CollisionObjectWrapper body1Wrap, bool isSwapped) : base(btSphereBoxCollisionAlgorithm_new(mf.Native, ci.Native, body0Wrap.Native, body1Wrap.Native, isSwapped)) { }
public SoftSoftCollisionAlgorithm(PersistentManifold mf, CollisionAlgorithmConstructionInfo ci, CollisionObjectWrapper body0Wrap, CollisionObjectWrapper body1Wrap) : base(btSoftSoftCollisionAlgorithm_new2(mf._native, ci._native, body0Wrap._native, body1Wrap._native)) { }
public CollisionAlgorithm FindAlgorithm(CollisionObjectWrapper body0Wrap, CollisionObjectWrapper body1Wrap, PersistentManifold sharedManifold) { return(new CollisionAlgorithm(btDispatcher_findAlgorithm2(_native, body0Wrap._native, body1Wrap._native, sharedManifold._native))); }
public CollisionAlgorithm FindAlgorithm(CollisionObjectWrapper body0Wrap, CollisionObjectWrapper body1Wrap, PersistentManifold sharedManifold) { return new CollisionAlgorithm(btDispatcher_findAlgorithm2(_native, body0Wrap._native, body1Wrap._native, sharedManifold._native)); }
public SoftRigidCollisionAlgorithm(PersistentManifold mf, CollisionAlgorithmConstructionInfo ci, CollisionObjectWrapper col0, CollisionObjectWrapper col1Wrap, bool isSwapped) : base(btSoftRigidCollisionAlgorithm_new(mf._native, ci._native, col0._native, col1Wrap._native, isSwapped)) { }
public Box2DBox2DCollisionAlgorithm(PersistentManifold mf, CollisionAlgorithmConstructionInfo ci, CollisionObjectWrapper body0Wrap, CollisionObjectWrapper body1Wrap) : base(btBox2dBox2dCollisionAlgorithm_new2(mf._native, ci._native, body0Wrap._native, body1Wrap._native)) { }