コード例 #1
0
        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);
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        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);
        }
コード例 #4
0
        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);
        }
コード例 #5
0
        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);
        }
コード例 #6
0
        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);
        }
コード例 #7
0
        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;
        }