public virtual bool NeedsResponse(CollisionObject body0, CollisionObject body1) { //here you can do filtering bool hasResponse = (body0.HasContactResponse() && body1.HasContactResponse()); //no response between two static/kinematic bodies: hasResponse = hasResponse && ((!body0.IsStaticOrKinematicObject()) || (!body1.IsStaticOrKinematicObject())); return(hasResponse); }
public virtual void StoreIslandActivationState(CollisionWorld collisionWorld) { int index = 0; ObjectArray <CollisionObject> list = collisionWorld.GetCollisionObjectArray(); int length = list.Count; CollisionObject[] rawList = list.GetRawArray(); for (int i = 0; i < length; ++i) { CollisionObject collisionObject = rawList[i]; if (!collisionObject.IsStaticOrKinematicObject()) { collisionObject.SetIslandTag(m_unionFind.Find(index)); collisionObject.SetCompanionId(-1); } else { collisionObject.SetIslandTag(-1); collisionObject.SetCompanionId(-2); } index++; } }
public void UpdateSingleAabb(CollisionObject colObj) { IndexedVector3 minAabb; IndexedVector3 maxAabb; IndexedMatrix wt = colObj.GetWorldTransform(); colObj.GetCollisionShape().GetAabb(ref wt, out minAabb, out maxAabb); //need to increase the aabb for contact thresholds IndexedVector3 contactThreshold = new IndexedVector3(BulletGlobals.gContactBreakingThreshold); minAabb -= contactThreshold; maxAabb += contactThreshold; if (GetDispatchInfo().m_useContinuous && colObj.GetInternalType() == CollisionObjectTypes.CO_RIGID_BODY && !colObj.IsStaticOrKinematicObject()) { IndexedVector3 minAabb2,maxAabb2; colObj.GetCollisionShape().GetAabb(colObj.GetInterpolationWorldTransform(),out minAabb2 ,out maxAabb2); minAabb2 -= contactThreshold; maxAabb2 += contactThreshold; MathUtil.VectorMin(ref minAabb2,ref minAabb); MathUtil.VectorMax(ref maxAabb2, ref maxAabb); } if (BulletGlobals.g_streamWriter != null && BulletGlobals.debugCollisionWorld) { MathUtil.PrintVector3(BulletGlobals.g_streamWriter, "updateSingleAabbMin", minAabb); MathUtil.PrintVector3(BulletGlobals.g_streamWriter, "updateSingleAabbMax", maxAabb); } IBroadphaseInterface bp = m_broadphasePairCache as IBroadphaseInterface; //moving objects should be moderately sized, probably something wrong if not if (colObj.IsStaticObject() || ((maxAabb - minAabb).LengthSquared() < 1e12f)) { bp.SetAabb(colObj.GetBroadphaseHandle(), ref minAabb, ref maxAabb, m_dispatcher1); } else { //something went wrong, investigate //this assert is unwanted in 3D modelers (danger of loosing work) colObj.SetActivationState(ActivationState.DISABLE_SIMULATION); //static bool reportMe = true; bool reportMe = true; if (reportMe && m_debugDrawer != null) { reportMe = false; m_debugDrawer.ReportErrorWarning("Overflow in AABB, object removed from simulation"); m_debugDrawer.ReportErrorWarning("If you can reproduce this, please email [email protected]\n"); m_debugDrawer.ReportErrorWarning("Please include above information, your Platform, version of OS.\n"); m_debugDrawer.ReportErrorWarning("Thanks.\n"); } } }
public virtual bool NeedsResponse(CollisionObject body0, CollisionObject body1) { //here you can do filtering bool hasResponse = (body0.HasContactResponse() && body1.HasContactResponse()); //no response between two static/kinematic bodies: hasResponse = hasResponse && ((!body0.IsStaticOrKinematicObject()) || (!body1.IsStaticOrKinematicObject())); return hasResponse; }
public virtual bool NeedsCollision(CollisionObject body0, CollisionObject body1) { Debug.Assert(body0 != null); Debug.Assert(body1 != null); bool needsCollision = true; #if BT_DEBUG if ((m_dispatcherFlags & DispatcherFlags.CD_STATIC_STATIC_REPORTED == 0)) { //broadphase filtering already deals with this if ((body0.IsStaticOrKinematicObject()) && body1.isStaticOrKinematicObject()) { m_dispatcherFlags |= DispatcherFlags.CD_STATIC_STATIC_REPORTED; System.err.Writeline("warning CollisionDispatcher::needsCollision: static-static collision!\n"); } } #endif //BT_DEBUG if ((!body0.IsActive()) && (!body1.IsActive())) { needsCollision = false; } else if (!body0.CheckCollideWith(body1)) { needsCollision = false; } return needsCollision; }