public void AddChildShape(ref IndexedMatrix localTransform, CollisionShape shape) { m_updateRevision++; //m_childTransforms.push_back(localTransform); //m_childShapes.push_back(shape); CompoundShapeChild child = new CompoundShapeChild(); child.m_transform = localTransform; child.m_childShape = shape; child.m_childShapeType = shape.GetShapeType(); child.m_childMargin = shape.GetMargin(); //extend the local aabbMin/aabbMax IndexedVector3 localAabbMin; IndexedVector3 localAabbMax; shape.GetAabb(ref localTransform, out localAabbMin, out localAabbMax); MathUtil.VectorMin(ref localAabbMin, ref m_localAabbMin); MathUtil.VectorMax(ref localAabbMax, ref m_localAabbMax); if (m_dynamicAabbTree != null) { DbvtAabbMm bounds = DbvtAabbMm.FromMM(ref localAabbMin, ref localAabbMax); int index = m_children.Count; child.m_treeNode = m_dynamicAabbTree.Insert(ref bounds, (object)index); } m_children.Add(child); }
public void GImpactVsShape(CollisionObject body0, CollisionObject body1, GImpactShapeInterface shape0, CollisionShape shape1, bool swapped) { #if DEBUG if (BulletGlobals.g_streamWriter != null && BulletGlobals.debugGimpactAlgo) { BulletGlobals.g_streamWriter.WriteLine("GImpactAglo::GImpactVsShape"); } #endif if (shape0.GetGImpactShapeType() == GIMPACT_SHAPE_TYPE.CONST_GIMPACT_TRIMESH_SHAPE) { GImpactMeshShape meshshape0 = shape0 as GImpactMeshShape; // check this... //int& part = swapped ? m_part1 : m_part0; //part = meshshape0.GetMeshPartCount(); int part = meshshape0.GetMeshPartCount(); while (part-- != 0) { GImpactVsShape(body0, body1, meshshape0.GetMeshPart(part), shape1, swapped); } if (swapped) { m_part1 = part; } else { m_part0 = part; } return; } #if GIMPACT_VS_PLANE_COLLISION if (shape0.GetGImpactShapeType() == GIMPACT_SHAPE_TYPE.CONST_GIMPACT_TRIMESH_SHAPE_PART && shape1.GetShapeType() == BroadphaseNativeTypes.STATIC_PLANE_PROXYTYPE) { GImpactMeshShapePart shapepart = shape0 as GImpactMeshShapePart; StaticPlaneShape planeshape = shape1 as StaticPlaneShape; GImpactTrimeshpartVsPlaneCollision(body0, body1, shapepart, planeshape, swapped); return; } #endif if (shape1.IsCompound()) { CompoundShape compoundshape = shape1 as CompoundShape; GImpactVsCompoundshape(body0, body1, shape0, compoundshape, swapped); return; } else if (shape1.IsConcave()) { ConcaveShape concaveshape = shape1 as ConcaveShape; GImpactVsConcave(body0, body1, shape0, concaveshape, swapped); return; } IndexedMatrix orgtrans0 = body0.GetWorldTransform(); IndexedMatrix orgtrans1 = body1.GetWorldTransform(); ObjectArray <int> collided_results = new ObjectArray <int>(64); GImpactVsShapeFindPairs(ref orgtrans0, ref orgtrans1, shape0, shape1, collided_results); if (collided_results.Count == 0) { return; } shape0.LockChildShapes(); using (GIM_ShapeRetriever retriever0 = BulletGlobals.GIM_ShapeRetrieverPool.Get()) { retriever0.Initialize(shape0); bool child_has_transform0 = shape0.ChildrenHasTransform(); int i = collided_results.Count; #if DEBUG if (BulletGlobals.g_streamWriter != null && BulletGlobals.debugGimpactAlgo) { BulletGlobals.g_streamWriter.WriteLine("GImpactAglo::GImpactVsShape [{0}]", collided_results.Count); } #endif while (i-- != 0) { int child_index = collided_results[i]; if (swapped) { m_triface1 = child_index; } else { m_triface0 = child_index; } CollisionShape colshape0 = retriever0.GetChildShape(child_index); if (child_has_transform0) { body0.SetWorldTransform(orgtrans0 * shape0.GetChildTransform(child_index)); } //collide two shapes if (swapped) { ShapeVsShapeCollision(body1, body0, shape1, colshape0); } else { ShapeVsShapeCollision(body0, body1, colshape0, shape1); } //restore transforms if (child_has_transform0) { body0.SetWorldTransform(ref orgtrans0); } } shape0.UnlockChildShapes(); } }