public RayCast ( BEPUutilities.Ray ray, float maximumLength, bool>.Func |
||
ray | BEPUutilities.Ray | Ray to test. |
maximumLength | float | Maximum length of the ray in units of the ray direction's length. |
filter | bool>.Func | 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. |
outputRayCastResults | IList |
Hit data of the ray, if any. |
return | bool |
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;
}
Space::RayCast ( BEPUutilities.Ray ray, bool>.Func |
|
Space::RayCast ( BEPUutilities.Ray ray, |
|
Space::RayCast ( BEPUutilities.Ray ray, float maximumLength, bool>.Func |
|
Space::RayCast ( BEPUutilities.Ray ray, float maximumLength, IList |
|
Space::RayCast ( BEPUutilities.Ray ray, float maximumLength, |
/// <summary> /// Determines whether there is a cliff nearby. /// </summary> /// <param name="position">Position to look from.</param> /// <param name="facingDirection">Direction to check in.</param> /// <param name="filter">Anonymous function to filter out unwanted objects.</param> /// <param name="space">The space to check for a cliff in.</param> /// <param name="distance">The distance to check at.</param> /// <returns>True if a cliff was detected, false otherwise.</returns> public static bool FindCliff(Vector3 position, Vector3 facingDirection, Func<BroadPhaseEntry, bool> filter, Space space, float distance) { // If there is a wall before the requested distance assume there is no cliff. Ray forwardRay = new Ray(position, new Vector3(facingDirection.X, 0, facingDirection.Z)); RayCastResult forwardResult = new RayCastResult(); space.RayCast(forwardRay, filter, out forwardResult); if ((forwardResult.HitData.Location - position).Length() < distance) { return false; } facingDirection.Normalize(); Ray futureDownRay = new Ray(position + new Vector3(facingDirection.X * distance, 0, facingDirection.Z * distance), Vector3.Down); RayCastResult result = new RayCastResult(); space.RayCast(futureDownRay, filter, out result); Vector3 drop = result.HitData.Location - futureDownRay.Position; if (drop.Y < -6.0f) { return true; } else { return false; } }