public List <FBVerletEdge> CollisionAxes(IVerletCollidable otherShape) { return(collisionEdges); }
public static bool CollidesWith(this IVerletCollidable a, IVerletCollidable b, out FBVerletCollision collisionResult) { collisionResult = null; var axes = a.CollisionAxes(b); axes.AddRange(b.CollisionAxes(a)); FBVerletCollision collisionInfo = new FBVerletCollision(); foreach (var edge in a.CollisionAxes(b)) { var axis = edge.NormalLeft; float aMin, aMax, bMin, bMax; a.Project(axis, out aMin, out aMax); b.Project(axis, out bMin, out bMax); var intervalDistance = IntervalDistance(aMin, aMax, bMin, bMax); if (intervalDistance >= 0) { return(false); } if ((intervalDistance = Math.Abs(intervalDistance)) < collisionInfo.mtvAmount) { collisionInfo.mtv = axis; collisionInfo.mtvAmount = intervalDistance; collisionInfo.collisionEdge = edge; collisionInfo.collisionEdgeShape = a; } } foreach (var edge in b.CollisionAxes(a)) { var axis = edge.NormalLeft; float aMin, aMax, bMin, bMax; a.Project(axis, out aMin, out aMax); b.Project(axis, out bMin, out bMax); var intervalDistance = IntervalDistance(aMin, aMax, bMin, bMax); if (intervalDistance >= 0) { return(false); } if ((intervalDistance = Math.Abs(intervalDistance)) < collisionInfo.mtvAmount) { collisionInfo.mtv = axis; collisionInfo.mtvAmount = intervalDistance; collisionInfo.collisionEdge = edge; collisionInfo.collisionEdgeShape = a; } } if (collisionInfo.collisionEdgeShape == b) { var temp = b; b = a; a = temp; } float minDistance = float.MaxValue; foreach (var point in a.CollisionPoints()) { var distance = (collisionInfo.mtv * (point.Position - b.Center)).LengthSquared(); if (distance < minDistance) { minDistance = distance; collisionInfo.collisionPoint = point; } } collisionResult = collisionInfo; return(true); }