/// <summary> /// <para>Casts a convex shape against the space.</para> /// <para>Convex casts are sensitive to length; avoid extremely long convex casts for better stability and performance.</para> /// </summary> /// <param name="castShape">Shape to cast.</param> /// <param name="startingTransform">Initial transform of the shape.</param> /// <param name="sweep">Sweep to apply to the shape. Avoid extremely long convex casts for better stability and performance.</param> /// <param name="filter">Delegate to prune out hit candidates before performing a cast against them. Return true from the filter to process an entry or false to ignore the entry.</param> /// <param name="castResult">Hit data, if any.</param> /// <returns>Whether or not the cast hit anything.</returns> public bool ConvexCast(ConvexShape castShape, ref RigidTransform startingTransform, ref Vector3f sweep, Func <BroadPhaseEntry, bool> filter, out RayCastResult castResult) { var castResults = PhysicsResources.GetRayCastResultList(); bool didHit = ConvexCast(castShape, ref startingTransform, ref sweep, filter, castResults); castResult = castResults.Elements[0]; for (int i = 1; i < castResults.Count; i++) { RayCastResult candidate = castResults.Elements[i]; if (candidate.HitData.T < castResult.HitData.T) { castResult = candidate; } } PhysicsResources.GiveBack(castResults); return(didHit); }
/// <summary> /// Tests a ray against the space. /// </summary> /// <param name="ray">Ray to test.</param> /// <param name="maximumLength">Maximum length of the ray in units of the ray direction's length.</param> /// <param name="filter">Delegate to prune out hit candidates before performing a ray cast against them. Return true from the filter to process an entry or false to ignore the entry.</param> /// <param name="result">Hit data of the ray, if any.</param> /// <returns>Whether or not the ray hit anything.</returns> public bool RayCast(Ray ray, float maximumLength, Func <BroadPhaseEntry, bool> filter, out RayCastResult result) { var resultsList = PhysicsResources.GetRayCastResultList(); bool didHit = RayCast(ray, maximumLength, filter, resultsList); result = resultsList.Elements[0]; for (int i = 1; i < resultsList.Count; i++) { RayCastResult candidate = resultsList.Elements[i]; if (candidate.HitData.T < result.HitData.T) { result = candidate; } } PhysicsResources.GiveBack(resultsList); return(didHit); }