Esempio n. 1
0
        public static bool IsColliding(
            NativeArray <ColliderVertex> v0,
            NativeArray <ColliderVertex> v1,
            NativeArray <EdgeNormal> n0,
            NativeArray <EdgeNormal> n1)
        {
            for (int i = 0; i < n0.Length; i++)
            {
                var normal = n0[i].Value;
                var p0     = new Projection(normal, v0);
                var p1     = new Projection(normal, v1);
                if (!Projection.DoesOverlap(p0, p1))
                {
                    return(false);
                }
            }

            for (int i = 0; i < n1.Length; i++)
            {
                var normal = n1[i].Value;
                var p0     = new Projection(normal, v0);
                var p1     = new Projection(normal, v1);
                if (!Projection.DoesOverlap(p0, p1))
                {
                    return(false);
                }
            }

            return(true);
        }
Esempio n. 2
0
        public static bool IsColliding(CircleCollider c0, CircleCollider c1)
        {
            var n  = math.normalizesafe(c0.Center - c1.Center);
            var p0 = new Projection(n, c0);
            var p1 = new Projection(n, c1);

            return(Projection.DoesOverlap(p0, p1));
        }
Esempio n. 3
0
        public static bool IsColliding(CircleCollider c0, CircleCollider c1, out MTV mtv)
        {
            mtv = new MTV();
            var n  = math.normalizesafe(c0.Center - c1.Center);
            var p0 = new Projection(n, c0);
            var p1 = new Projection(n, c1);

            if (Projection.DoesOverlap(p0, p1))
            {
                mtv.Calculate(n, p0, p1, c0.Center, c1.Center);
                return(true);
            }
            return(false);
        }
Esempio n. 4
0
        public static bool IsColliding(
            CircleCollider circle,
            NativeArray <ColliderVertex> vertices,
            NativeArray <EdgeNormal> normals,
            float2 center,
            out MTV mtv)
        {
            mtv = MTV.Max;
            var shouldCheckCorner = true;

            for (int i = 0; i < normals.Length; i++)
            {
                var n  = normals[i].Value;
                var p0 = new Projection(n, circle);
                var p1 = new Projection(n, vertices);
                var d  = math.dot(circle.Center, n);
                shouldCheckCorner = shouldCheckCorner && !Projection.DoesOverlap(p1, d);

                if (!Projection.DoesOverlap(p0, p1))
                {
                    return(false);
                }

                mtv.Calculate(n, p0, p1, circle.Center, center);
            }

            if (shouldCheckCorner)
            {
                var closest = ClosestPoint(circle.Center, vertices);
                var n       = math.normalizesafe(closest - circle.Center);
                var p0      = new Projection(n, circle);
                var p1      = new Projection(n, vertices);

                if (!Projection.DoesOverlap(p0, p1))
                {
                    return(false);
                }

                mtv.Calculate(n, p0, p1, circle.Center, center);
            }

            return(true);
        }
Esempio n. 5
0
        public static bool IsColliding(
            NativeArray <ColliderVertex> v0,
            NativeArray <ColliderVertex> v1,
            NativeArray <EdgeNormal> n0,
            NativeArray <EdgeNormal> n1,
            float2 center0,
            float2 center1,
            out MTV mtv)
        {
            mtv = MTV.Max;
            for (int i = 0; i < n0.Length; i++)
            {
                var normal = n0[i].Value;
                var p0     = new Projection(normal, v0);
                var p1     = new Projection(normal, v1);
                if (!Projection.DoesOverlap(p0, p1))
                {
                    return(false);
                }

                mtv.Calculate(normal, p0, p1, center0, center1);
            }

            for (int i = 0; i < n1.Length; i++)
            {
                var normal = n1[i].Value;
                var p0     = new Projection(normal, v0);
                var p1     = new Projection(normal, v1);
                if (!Projection.DoesOverlap(p0, p1))
                {
                    return(false);
                }

                mtv.Calculate(normal, p0, p1, center1, center0);
            }

            return(true);
        }