public bool RayCastAgainstEntity(Vector3 from, Vector3 to, out Vector3 pos, out float distance, out Entity hitEntity) { hitEntity = null; var dir = to - from; var dist = dir.Length(); var ndir = dir.Normalized(); distance = float.MaxValue; Ray ray = new Ray(from, ndir); pos = to; var rcr = new RayCastResult(); var bRay = MathConverter.Convert(ray); bool result = PhysSpace.RayCast(bRay, dist, out rcr); if (!result) { return(false); } var convex = rcr.HitObject as ConvexCollidable; pos = MathConverter.Convert(rcr.HitData.Location); if (convex != null) { hitEntity = convex.Entity.Tag as Entity; } distance = rcr.HitData.T; return(true); }
/// <summary> /// /// </summary> /// <param name="from"></param> /// <param name="to"></param> /// <param name="normal"></param> /// <param name="pos"></param> /// <returns></returns> public bool RayCastAgainstAll(Vector3 from, Vector3 to, out Vector3 normal, out Vector3 pos, out Entity hitEntity, Entity skipEntity = null) { hitEntity = null; var dir = to - from; var dist = dir.Length(); var ndir = dir.Normalized(); Ray ray = new Ray(from, ndir); normal = Vector3.Zero; pos = to; Func <BroadPhaseEntry, bool> filterFunc = delegate(BroadPhaseEntry bpe) { if (skipEntity == null) { return(true); } ConvexCollidable cc = bpe as ConvexCollidable; if (cc == null) { return(true); } Entity ent = cc.Entity.Tag as Entity; if (ent == null) { return(true); } if (ent == skipEntity) { return(false); } return(true); }; var rcr = new RayCastResult(); var bRay = MathConverter.Convert(ray); bool result = PhysSpace.RayCast(bRay, dist, filterFunc, out rcr); if (!result) { return(false); } var convex = rcr.HitObject as ConvexCollidable; normal = MathConverter.Convert(rcr.HitData.Normal).Normalized(); pos = MathConverter.Convert(rcr.HitData.Location); hitEntity = (convex == null) ? null : convex.Entity.Tag as Entity; return(true); }