/// <summary> /// Tests a ray against the space, possibly returning multiple hits. /// </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 cast against them. Return true from the filter to process an entry or false to ignore the entry.</param> /// <param name="outputRayCastResults">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, IList <RayCastResult> outputRayCastResults) { var outputIntersections = PhysicsResources.GetBroadPhaseEntryList(); if (BroadPhase.QueryAccelerator.RayCast(ray, maximumLength, outputIntersections)) { for (int i = 0; i < outputIntersections.Count; i++) { RayHit rayHit; BroadPhaseEntry candidate = outputIntersections.Elements[i]; if (candidate.RayCast(ray, maximumLength, filter, out rayHit)) { outputRayCastResults.Add(new RayCastResult(rayHit, candidate)); } } } PhysicsResources.GiveBack(outputIntersections); return(outputRayCastResults.Count > 0); }
/// <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="outputCastResults">Hit data, if any.</param> /// <returns>Whether or not the cast hit anything.</returns> public bool ConvexCast(ConvexShape castShape, ref RigidTransform startingTransform, ref Vector3 sweep, Func <BroadPhaseEntry, bool> filter, IList <RayCastResult> outputCastResults) { var overlappedElements = PhysicsResources.GetBroadPhaseEntryList(); BoundingBox boundingBox; castShape.GetSweptBoundingBox(ref startingTransform, ref sweep, out boundingBox); BroadPhase.QueryAccelerator.GetEntries(boundingBox, overlappedElements); for (int i = 0; i < overlappedElements.Count; ++i) { RayHit hit; if (overlappedElements.Elements[i].ConvexCast(castShape, ref startingTransform, ref sweep, filter, out hit)) { outputCastResults.Add(new RayCastResult { HitData = hit, HitObject = overlappedElements.Elements[i] }); } } PhysicsResources.GiveBack(overlappedElements); return(outputCastResults.Count > 0); }