示例#1
0
        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);
        }
示例#2
0
        /// <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);
        }