public static bool DistanceBetween(BoxCollider box,
                                           RigidTransform boxTransform,
                                           SphereCollider sphere,
                                           RigidTransform sphereTransform,
                                           float maxDistance,
                                           out ColliderDistanceResult result)
        {
            var            boxWorldToLocal        = math.inverse(boxTransform);
            float3         sphereCenterInBoxSpace = math.transform(boxWorldToLocal, sphere.center + sphereTransform.pos);
            SphereCollider sphereInBoxSpace       = new SphereCollider(sphereCenterInBoxSpace, sphere.radius);
            bool           hit = DistanceQueries.DistanceBetween(box,
                                                                 sphereInBoxSpace,
                                                                 maxDistance,
                                                                 out DistanceQueries.ColliderDistanceResultInternal localResult);

            result = new ColliderDistanceResult
            {
                hitpointA = math.transform(boxTransform, localResult.hitpointA),
                hitpointB = math.transform(boxTransform, localResult.hitpointB),
                normalA   = math.rotate(boxTransform, localResult.normalA),
                normalB   = math.rotate(boxTransform, localResult.normalB),
                distance  = localResult.distance
            };
            return(hit);
        }
        public static bool DistanceBetween(Collider collider,
                                           RigidTransform colliderTransform,
                                           CapsuleCollider capsule,
                                           RigidTransform capsuleTransform,
                                           float maxDistance,
                                           out ColliderDistanceResult result)
        {
            switch (collider.type)
            {
            case ColliderType.Sphere:
            {
                SphereCollider col = collider;
                return(DistanceBetween(col, colliderTransform, capsule, capsuleTransform, maxDistance, out result));
            }

            case ColliderType.Capsule:
            {
                CapsuleCollider col = collider;
                return(DistanceBetween(col, colliderTransform, capsule, capsuleTransform, maxDistance, out result));
            }

            case ColliderType.Compound:
            {
                CompoundCollider col = collider;
                return(DistanceBetween(col, colliderTransform, capsule, capsuleTransform, maxDistance, out result));
            }

            default:
                result = default;
                return(false);
            }
        }
        public static bool DistanceBetween(Collider colliderA,
                                           RigidTransform aTransform,
                                           Collider colliderB,
                                           RigidTransform bTransform,
                                           float maxDistance,
                                           out ColliderDistanceResult result)
        {
            switch (colliderA.type)
            {
            case ColliderType.Sphere:
            {
                SphereCollider colA = colliderA;
                return(DistanceBetween(colA, aTransform, colliderB, bTransform, maxDistance, out result));
            }

            case ColliderType.Capsule:
            {
                CapsuleCollider colA = colliderA;
                return(DistanceBetween(colA, aTransform, colliderB, bTransform, maxDistance, out result));
            }

            case ColliderType.Compound:
            {
                CompoundCollider colA = colliderA;
                return(DistanceBetween(colA, aTransform, colliderB, bTransform, maxDistance, out result));
            }

            default:
                result = default;
                return(false);
            }
        }
Example #4
0
 private static ColliderDistanceResult FlipResult(ColliderDistanceResult resultToFlip)
 {
     return(new ColliderDistanceResult
     {
         hitpointA = resultToFlip.hitpointB,
         hitpointB = resultToFlip.hitpointA,
         normalA = resultToFlip.normalB,
         normalB = resultToFlip.normalA,
         distance = resultToFlip.distance
     });
 }
        public static bool DistanceBetween(SphereCollider sphere,
                                           RigidTransform sphereTransform,
                                           CapsuleCollider capsule,
                                           RigidTransform capsuleTransform,
                                           float maxDistance,
                                           out ColliderDistanceResult result)
        {
            bool hit = DistanceBetween(capsule, capsuleTransform, sphere, sphereTransform, maxDistance, out ColliderDistanceResult flipResult);

            result = FlipResult(flipResult);
            return(hit);
        }
        public static bool DistanceBetween(CompoundCollider compound,
                                           RigidTransform compoundTransform,
                                           SphereCollider sphere,
                                           RigidTransform sphereTransform,
                                           float maxDistance,
                                           out ColliderDistanceResult result)
        {
            bool hit = false;

            result          = default;
            result.distance = float.MaxValue;
            ref var blob = ref compound.compoundColliderBlob.Value;
        public static bool DistanceBetween(CapsuleCollider capsule,
                                           RigidTransform capsuleTransform,
                                           BoxCollider box,
                                           RigidTransform boxTransform,
                                           float maxDistance,
                                           out ColliderDistanceResult result)
        {
            bool hit = DistanceBetween(box, boxTransform, capsule, capsuleTransform, maxDistance, out ColliderDistanceResult flipResult);

            result = FlipResult(flipResult);
            return(hit);
        }
        public static bool DistanceBetween(SphereCollider sphere,
                                           RigidTransform sphereTransform,
                                           BoxCollider box,
                                           RigidTransform boxTransform,
                                           float maxDistance,
                                           out ColliderDistanceResult result)
        {
            bool hit = DistanceBetween(box, boxTransform, sphere, sphereTransform, maxDistance, out ColliderDistanceResult flipResult);

            result = FlipResult(flipResult);
            return(hit);
        }
        public static bool DistanceBetween(CapsuleCollider capsuleA,
                                           RigidTransform aTransform,
                                           CapsuleCollider capsuleB,
                                           RigidTransform bTransform,
                                           float maxDistance,
                                           out ColliderDistanceResult result)
        {
            var             aWorldToLocal      = math.inverse(aTransform);
            var             BinASpaceTransform = math.mul(aWorldToLocal, bTransform);
            CapsuleCollider BinASpace          = new CapsuleCollider(math.transform(BinASpaceTransform, capsuleB.pointA),
                                                                     math.transform(BinASpaceTransform, capsuleB.pointB),
                                                                     capsuleB.radius);
            bool hit = DistanceQueries.DistanceBetween(capsuleA, BinASpace, maxDistance, out DistanceQueries.ColliderDistanceResultInternal localResult);

            result = BinAResultToWorld(localResult, aTransform);
            return(hit);
        }
        public static bool DistanceBetween(BoxCollider box,
                                           RigidTransform boxTransform,
                                           CapsuleCollider capsule,
                                           RigidTransform capsuleTransform,
                                           float maxDistance,
                                           out ColliderDistanceResult result)
        {
            var boxWorldToLocal        = math.inverse(boxTransform);
            var capInBoxSpaceTransform = math.mul(boxWorldToLocal, capsuleTransform);
            var capsuleInBoxSpace      = new CapsuleCollider(math.transform(capInBoxSpaceTransform, capsule.pointA),
                                                             math.transform(capInBoxSpaceTransform, capsule.pointB),
                                                             capsule.radius);
            bool hit = DistanceQueries.DistanceBetween(box, capsuleInBoxSpace, maxDistance, out DistanceQueries.ColliderDistanceResultInternal localResult);

            result = BinAResultToWorld(localResult, boxTransform);
            return(hit);
        }
        public static bool DistanceBetween(SphereCollider sphereA,
                                           RigidTransform aTransform,
                                           SphereCollider sphereB,
                                           RigidTransform bTransform,
                                           float maxDistance,
                                           out ColliderDistanceResult result)
        {
            SphereCollider bInASpace = new SphereCollider(sphereB.center + bTransform.pos - aTransform.pos, sphereB.radius);
            bool           hit       = DistanceQueries.DistanceBetween(sphereA, bInASpace, maxDistance, out DistanceQueries.ColliderDistanceResultInternal localResult);

            result = new ColliderDistanceResult
            {
                hitpointA = localResult.hitpointA + aTransform.pos,
                hitpointB = localResult.hitpointB + aTransform.pos,
                normalA   = localResult.normalA,
                normalB   = localResult.normalB,
                distance  = localResult.distance
            };
            return(hit);
        }
        public static bool DistanceBetween(BoxCollider boxA,
                                           RigidTransform aTransform,
                                           BoxCollider boxB,
                                           RigidTransform bTransform,
                                           float maxDistance,
                                           out ColliderDistanceResult result)
        {
            var aWorldToLocal      = math.inverse(aTransform);
            var bWorldToLocal      = math.inverse(bTransform);
            var bInASpaceTransform = math.mul(aWorldToLocal, bTransform);
            var aInBSpaceTransform = math.mul(bWorldToLocal, aTransform);
            var hit = DistanceQueries.DistanceBetween(boxA,
                                                      boxB,
                                                      bInASpaceTransform,
                                                      aInBSpaceTransform,
                                                      maxDistance,
                                                      out DistanceQueries.ColliderDistanceResultInternal localResult);

            result = BinAResultToWorld(localResult, aTransform);
            return(hit);
        }