public static bool NativeHullHullContact(ref NativeManifold result, RigidTransform transform1, NativeHull hull1, RigidTransform transform2, NativeHull hull2)
        {
            FaceQueryResult faceQuery1;

            HullCollision.QueryFaceDistance(out faceQuery1, transform1, hull1, transform2, hull2);
            if (faceQuery1.Distance > 0)
            {
                return(false);
            }

            FaceQueryResult faceQuery2;

            HullCollision.QueryFaceDistance(out faceQuery2, transform2, hull2, transform1, hull1);
            if (faceQuery2.Distance > 0)
            {
                return(false);
            }

            HullCollision.QueryEdgeDistance(out EdgeQueryResult edgeQuery, transform1, hull1, transform2, hull2);
            if (edgeQuery.Distance > 0)
            {
                return(false);
            }

            float kRelEdgeTolerance = 0.90f; //90%
            float kRelFaceTolerance = 0.95f; //95%
            float kAbsTolerance     = 0.5f * 0.005f;

            // Favor face contacts over edge contacts.
            float maxFaceSeparation = math.max(faceQuery1.Distance, faceQuery2.Distance);

            if (edgeQuery.Distance > kRelEdgeTolerance * maxFaceSeparation + kAbsTolerance)
            {
                CreateEdgeContact(ref result, edgeQuery, transform1, hull1, transform2, hull2);
            }
            else
            {
                // Favor first hull face to avoid face flip-flops.
                if (faceQuery2.Distance > kRelFaceTolerance * faceQuery1.Distance + kAbsTolerance)
                {
                    // 2 = reference, 1 = incident.
                    CreateFaceContact(ref result, faceQuery2, transform2, hull2, transform1, hull1, true);
                }
                else
                {
                    // 1 = reference, 2 = incident.
                    CreateFaceContact(ref result, faceQuery1, transform1, hull1, transform2, hull2, false);
                }
            }

            return(true);
        }
            public bool Execute(NativeArray <BatchCollisionInput> hulls, NativeList <BatchCollisionResult> results)
            {
                var isCollision = false;

                for (int i = 0; i < hulls.Length; ++i)
                {
                    for (int j = i + 1; j < hulls.Length; j++)
                    {
                        var a = hulls[i];
                        var b = hulls[j];

                        if (HullCollision.IsColliding(a.Transform, a.Hull, b.Transform, b.Hull))
                        {
                            isCollision = true;
                            results.Add(new BatchCollisionResult
                            {
                                A = a,
                                B = b,
                            });
                        }
                    }
                }
                return(isCollision);
            }
 public float3 Execute(RigidTransform t1, NativeHull hull1, float3 point)
 {
     return(HullCollision.ClosestPoint(t1, hull1, point));
 }
 public bool Execute(RigidTransform t1, NativeHull hull1, float3 point)
 {
     return(HullCollision.Contains(t1, hull1, point));
 }
 public bool Execute(RigidTransform t1, NativeHull hull1, RigidTransform t2, NativeHull hull2)
 {
     return(HullCollision.IsColliding(t1, hull1, t2, hull2));
 }