private static void DummyBoundsFeatures(Manifold manifold, out CollisionFeatures features) { var aRect = new AlignedRectangle(manifold.A.Entity.Transform.WorldPosition, manifold.A.AABB.Size / 2); var bRect = new AlignedRectangle(manifold.B.Entity.Transform.WorldPosition, manifold.B.AABB.Size / 2); CalculateCollisionFeatures(aRect, bRect, 1, out features); }
private static void BoxBox(Manifold manifold, PhysShapeAabb a, PhysShapeAabb b, float flip, out CollisionFeatures features) { var aRect = new AlignedRectangle(manifold.A.Entity.Transform.WorldPosition, a.LocalBounds.Size / 2); var bRect = new AlignedRectangle(manifold.B.Entity.Transform.WorldPosition, b.LocalBounds.Size / 2); CalculateCollisionFeatures(in aRect, in bRect, flip, out features); }
private static void RectCircle(Manifold manifold, PhysShapeRect a, PhysShapeCircle b, float flip, out CollisionFeatures features) { var aPos = manifold.A.Entity.Transform.WorldPosition; var bPos = manifold.B.Entity.Transform.WorldPosition; var aRot = (float)manifold.A.Entity.Transform.WorldRotation.Theta; CalculateCollisionFeatures(new OrientedRectangle(aPos, a.Rectangle, aRot), new Circle(bPos, b.Radius), (float)flip, out features); }
private static void CircleBox(Manifold manifold, PhysShapeCircle a, PhysShapeAabb b, float flip, out CollisionFeatures features) { var aRad = a.Radius; var aPos = manifold.A.Entity.Transform.WorldPosition; var bRect = new AlignedRectangle(manifold.B.Entity.Transform.WorldPosition, b.LocalBounds.Size / 2); CalculateCollisionFeatures(bRect, new Circle(aPos, aRad), (float)flip * -1, out features); }
private static void CircleCircle(Manifold manifold, PhysShapeCircle a, PhysShapeCircle b, float flip, out CollisionFeatures features) { var aRad = a.Radius; var bRad = b.Radius; var aPos = manifold.A.Entity.Transform.WorldPosition; var bPos = manifold.B.Entity.Transform.WorldPosition; CalculateCollisionFeatures(new Circle(aPos, aRad), new Circle(bPos, bRad), (float)flip, out features); }
private static void CircleBBox(Manifold manifold, PhysShapeCircle a, PhysShapeAabb b, bool flip, out CollisionFeatures features) { var aRad = a.Radius; var aPos = manifold.A.Entity.Transform.WorldPosition; var bBox = b.LocalBounds.Translated(manifold.B.Entity.Transform.WorldPosition); CalculateCollisionFeatures(in bBox, new Circle(aPos, aRad), flip, out features); }
public static void CalculateFeatures(Manifold manifold, IPhysShape a, IPhysShape b, out CollisionFeatures features) { // 2D table of all possible PhysShape combinations switch (a) { case PhysShapeCircle aCircle: switch (b) { case PhysShapeCircle bCircle: CircleCircle(manifold, aCircle, bCircle, false, out features); return; case PhysShapeAabb bAabb: CircleBBox(manifold, aCircle, bAabb, false, out features); return; case PhysShapeRect bRect: RectCircle(manifold, bRect, aCircle, true, out features); return; case PhysShapeGrid bGrid: features = default; return; } break; case PhysShapeAabb aAabb: switch (b) { case PhysShapeCircle bCircle: features = default; return; case PhysShapeAabb bAabb: features = default; return; case PhysShapeRect bRect: features = default; return; case PhysShapeGrid bGrid: features = default; return; } break; case PhysShapeRect aRect: switch (b) { case PhysShapeCircle bCircle: features = default; return; case PhysShapeAabb bAabb: features = default; return; case PhysShapeRect bRect: features = default; return; case PhysShapeGrid bGrid: features = default; return; } break; case PhysShapeGrid aGrid: switch (b) { case PhysShapeCircle bCircle: features = default; return; case PhysShapeAabb bAabb: features = default; return; case PhysShapeRect bRect: features = default; return; case PhysShapeGrid bGrid: features = default; return; } break; } features = default; }