private void PreallocateChildAlgorithms(CollisionObject body0, CollisionObject body1) { CollisionObject colObj = m_isSwapped ? body1 : body0; CollisionObject otherObj = m_isSwapped ? body0 : body1; Debug.Assert(colObj.GetCollisionShape().IsCompound()); CompoundShape compoundShape = (CompoundShape)(colObj.GetCollisionShape()); int numChildren = compoundShape.GetNumChildShapes(); int i; //m_childCollisionAlgorithms.resize(numChildren); m_childCollisionAlgorithms.Clear(); for (i = 0; i < numChildren; i++) { if (compoundShape.GetDynamicAabbTree() != null) { m_childCollisionAlgorithms.Add(null); } else { CollisionShape tmpShape = colObj.GetCollisionShape(); CollisionShape childShape = compoundShape.GetChildShape(i); colObj.InternalSetTemporaryCollisionShape(childShape); CollisionAlgorithm ca = m_dispatcher.FindAlgorithm(colObj, otherObj, m_sharedManifold); m_childCollisionAlgorithms.Add(ca); colObj.InternalSetTemporaryCollisionShape(tmpShape); } } }
public void GImpactVsCompoundshape(CollisionObject body0, CollisionObject body1, GImpactShapeInterface shape0, CompoundShape shape1, bool swapped) { IndexedMatrix orgtrans1 = body1.GetWorldTransform(); #if DEBUG if (BulletGlobals.g_streamWriter != null && BulletGlobals.debugGimpactAlgo) { BulletGlobals.g_streamWriter.WriteLine("GImpactAglo::GImpactVsCompoundshape"); } #endif int i = shape1.GetNumChildShapes(); while (i-- != 0) { CollisionShape colshape1 = shape1.GetChildShape(i); IndexedMatrix childtrans1 = orgtrans1 * shape1.GetChildTransform(i); body1.SetWorldTransform(ref childtrans1); //collide child shape GImpactVsShape(body0, body1, shape0, colshape1, swapped); //restore transforms body1.SetWorldTransform(ref orgtrans1); } }
public void ProcessChildShape(CollisionShape childShape, int index) { Debug.Assert(index >= 0); CompoundShape compoundShape = (CompoundShape)(m_compoundColObj.GetCollisionShape()); Debug.Assert(index < compoundShape.GetNumChildShapes()); //backup IndexedMatrix orgTrans = m_compoundColObj.GetWorldTransform(); IndexedMatrix orgInterpolationTrans = m_compoundColObj.GetInterpolationWorldTransform(); IndexedMatrix childTrans = compoundShape.GetChildTransform(index); IndexedMatrix newChildWorldTrans = orgTrans * childTrans; //perform an AABB check first IndexedVector3 aabbMin0; IndexedVector3 aabbMax0; IndexedVector3 aabbMin1; IndexedVector3 aabbMax1; childShape.GetAabb(ref newChildWorldTrans, out aabbMin0, out aabbMax0); m_otherObj.GetCollisionShape().GetAabb(m_otherObj.GetWorldTransform(), out aabbMin1, out aabbMax1); if (AabbUtil2.TestAabbAgainstAabb2(ref aabbMin0, ref aabbMax0, ref aabbMin1, ref aabbMax1)) { m_compoundColObj.SetWorldTransform(ref newChildWorldTrans); m_compoundColObj.SetInterpolationWorldTransform(ref newChildWorldTrans); //the contactpoint is still projected back using the original inverted worldtrans CollisionShape tmpShape = m_compoundColObj.GetCollisionShape(); m_compoundColObj.InternalSetTemporaryCollisionShape(childShape); if (m_childCollisionAlgorithms[index] == null) { m_childCollisionAlgorithms[index] = m_dispatcher.FindAlgorithm(m_compoundColObj, m_otherObj, m_sharedManifold); if (m_childCollisionAlgorithms[index] == m_parent) { int ibreak = 0; } } ///detect swapping case if (m_resultOut.GetBody0Internal() == m_compoundColObj) { m_resultOut.SetShapeIdentifiersA(-1, index); } else { m_resultOut.SetShapeIdentifiersB(-1, index); } m_childCollisionAlgorithms[index].ProcessCollision(m_compoundColObj, m_otherObj, m_dispatchInfo, m_resultOut); if (m_dispatchInfo.getDebugDraw() != null && (((m_dispatchInfo.getDebugDraw().GetDebugMode() & DebugDrawModes.DBG_DrawAabb)) != 0)) { IndexedVector3 worldAabbMin = IndexedVector3.Zero, worldAabbMax = IndexedVector3.Zero; m_dispatchInfo.getDebugDraw().DrawAabb(aabbMin0, aabbMax0, new IndexedVector3(1, 1, 1)); m_dispatchInfo.getDebugDraw().DrawAabb(aabbMin1, aabbMax1, new IndexedVector3(1, 1, 1)); } //revert back transform m_compoundColObj.InternalSetTemporaryCollisionShape(tmpShape); m_compoundColObj.SetWorldTransform(ref orgTrans); m_compoundColObj.SetInterpolationWorldTransform(ref orgInterpolationTrans); } }