Example #1
0
 /// <summary>
 /// Casts a ray through the world and returns all intersections.
 /// </summary>
 /// <param name="objectTypes">
 /// Flags that define which objects to query for intersection with this ray.
 /// </param>
 /// <param name="flags">       Flags that define how to detect intersections.</param>
 /// <param name="maxHits">     Maximal number of hits to return.</param>
 /// <param name="skipEntities">An array of IPhysicalEntity handles.</param>
 /// <returns>Detected hits (solid and pierceable).</returns>
 public IEnumerable <RaycastHit> Cast
 (
     EntityQueryFlags objectTypes    = EntityQueryFlags.All,
     RayWorldIntersectionFlags flags = RayWorldIntersectionFlags.AnyHit,
     int maxHits           = 1,
     IntPtr[] skipEntities = null
 )
 {
     return(Ray.Cast(this.Position, this.Direction, objectTypes, flags, maxHits, skipEntities));
 }
Example #2
0
        /// <summary>
        /// Casts a ray through the world and returns all intersections.
        /// </summary>
        /// <param name="pos">         Position from which to cast a ray.</param>
        /// <param name="dir">         Direction of the ray to cast.</param>
        /// <param name="objectTypes">
        /// Flags that define which objects to query for intersection with this ray.
        /// </param>
        /// <param name="flags">       Flags that define how to detect intersections.</param>
        /// <param name="maxHits">     Maximal number of hits to return.</param>
        /// <param name="skipEntities">An array of IPhysicalEntity handles.</param>
        /// <returns>Detected hits (solid and pierceable).</returns>
        public unsafe static List <RaycastHit> Cast
        (
            Vector3 pos,
            Vector3 dir,
            EntityQueryFlags objectTypes    = EntityQueryFlags.All,
            RayWorldIntersectionFlags flags = RayWorldIntersectionFlags.AnyHit,
            int maxHits           = 1,
            IntPtr[] skipEntities = null
        )
        {
            if (maxHits < 1)
            {
                return(null);
            }
            List <RaycastHit> hits;

            // Allocate memory for entities to skip.
            using (NativeMemoryBlock skipEntitiesArray =
                       new NativeMemoryBlock(skipEntities == null ? 0 : skipEntities.Length, typeof(IntPtr)))
                // Allocate memory for ray-cast hits.
                using (NativeMemoryBlock hitsArray = new NativeMemoryBlock(maxHits, typeof(RaycastHit)))
                {
                    // Transfer handles of entities to skip to native memory.
                    if (!skipEntitiesArray.Disposed)
                    {
                        IntPtr *skipEntsPointer = (IntPtr *)skipEntitiesArray.Handle.ToPointer();
                        for (int i = 0; i < skipEntities.Length; i++)                           // Ignore that ReSharper warning.
                        {
                            skipEntsPointer[i] = skipEntities[i];
                        }
                    }
                    // Cast the ray.
                    int numberOfHits =
                        Native.PhysicsInterop.RayWorldIntersection
                        (
                            pos,
                            dir,
                            objectTypes,
                            flags,
                            maxHits,
                            skipEntitiesArray.Handle,
                            skipEntities == null ? 0 : skipEntities.Length,
                            hitsArray.Handle
                        );
                    // Transfer ray-cast hits from native memory.
                    RaycastHit *hitPointer = (RaycastHit *)hitsArray.Handle.ToPointer();
                    hits = new List <RaycastHit>(numberOfHits);
                    for (int i = 0; i < numberOfHits; i++)
                    {
                        hits.Add(hitPointer[i]);
                    }
                }
            return(hits);
        }
Example #3
0
        /// <summary>
        /// Steps through the entity grid and raytraces entities
        /// traces a finite ray from org along dir
        /// </summary>
        /// <param name="objectTypes"></param>
        /// <param name="flags"></param>
        /// <param name="maxHits"></param>
        /// <param name="skipEntities">an array of IPhysicalEntity handles. <see cref="CryEngine.Native.NativeHandleExtensions.GetIPhysicalEntity"/></param>
        /// <returns>Detected hits (solid and pierceable)</returns>
        public IEnumerable <RaycastHit> Cast(EntityQueryFlags objectTypes = EntityQueryFlags.All, RayWorldIntersectionFlags flags = RayWorldIntersectionFlags.AnyHit, int maxHits = 1, IntPtr[] skipEntities = null)
        {
            if (skipEntities != null && skipEntities.Length == 0)
            {
                skipEntities = null;
            }

            object[] hits;
            var      numHits = Native.NativePhysicsMethods.RayWorldIntersection(Position, Direction, objectTypes, flags, maxHits, skipEntities, out hits);

            if (numHits > 0)
            {
                return(hits.Cast <RaycastHit>());
            }

            return(new List <RaycastHit>());
        }
Example #4
0
 internal static extern int RayWorldIntersection(Vec3 origin, Vec3 dir, EntityQueryFlags objFlags, RayWorldIntersectionFlags flags, out RaycastHit rayHit, int maxHits, object[] skipEnts);
Example #5
0
 internal static extern int RayWorldIntersection(Vec3 origin, Vec3 dir, EntityQueryFlags objFlags, RayWorldIntersectionFlags flags, int maxHits, IntPtr[] skipEnts, out object[] hits);
Example #6
0
 public static extern int RayWorldIntersection(Vector3 origin, Vector3 dir, EntityQueryFlags objFlags,
     RayWorldIntersectionFlags flags, int maxHits, IntPtr skipEnts, int skipCount, IntPtr hits);
Example #7
0
 extern public static int RayWorldIntersection(Vec3 origin, Vec3 dir, EntityQueryFlags objFlags, RayWorldIntersectionFlags flags, int maxHits, IntPtr[] skipEnts, out object[] hits);
Example #8
0
 /// <summary>
 /// Gets a list of entities within the specified area.
 /// </summary>
 /// <param name="bbox"></param>
 /// <param name="flags"></param>
 /// <returns></returns>
 public static IEnumerable <T> GetInBox <T>(BoundingBox bbox, EntityQueryFlags flags = EntityQueryFlags.All) where T : EntityBase
 {
     return(GetEntitiesCommon <T>(NativeEntityMethods.GetEntitiesInBox(bbox, flags)));
 }
Example #9
0
 internal static extern object[] GetEntitiesInBox(BoundingBox bbox, EntityQueryFlags flags);
Example #10
0
 extern internal static object[] GetEntitiesInBox(BoundingBox bbox, EntityQueryFlags flags);
Example #11
0
 public static extern object[] GetEntitiesInBox(BoundingBox bbox, EntityQueryFlags flags);
Example #12
0
 /// <summary>
 /// Gets a list of entities within the specified area.
 /// </summary>
 /// <param name="bbox">  </param>
 /// <param name="flags"> </param>
 /// <returns> </returns>
 public static IEnumerable <EntityBase> GetInBox(BoundingBox bbox, EntityQueryFlags flags = EntityQueryFlags.All)
 {
     return(GetEntitiesCommon <EntityBase>(EntityInterop.GetEntitiesInBox(bbox, flags)));
 }
Example #13
0
        public static RaycastHit Cast(Vector3 position, Vector3 direction, float distance, EntityQueryFlags flags, RayFlags rayFlags, int maxHits)
        {
            var rayHit = new ray_hit();
            var hits   = Engine.PhysicalWorld.RayWorldIntersection(position, direction * distance, (int)flags, (uint)rayFlags, rayHit, maxHits);

            return(new RaycastHit(rayHit, hits));
        }
Example #14
0
 extern public static int RayWorldIntersection
     (Vector3 origin, Vector3 dir, EntityQueryFlags objFlags,
     RayWorldIntersectionFlags flags, int maxHits, IntPtr skipEnts, int skipCount, IntPtr hits);
Example #15
0
        public static IEnumerable <RaycastHit> Cast(Vec3 pos, Vec3 dir, EntityQueryFlags objectTypes = EntityQueryFlags.All, RayWorldIntersectionFlags flags = RayWorldIntersectionFlags.AnyHit, int maxHits = 1, IntPtr[] skipEntities = null)
        {
            var ray = new Ray(pos, dir);

            return(ray.Cast(objectTypes, flags, maxHits, skipEntities));
        }