Пример #1
0
 public virtual List <ContactResult> SphereProbe(Vector3 position, float radius, int Count, RayFilterFlags flags)
 {
     return(new List <ContactResult>());
 }
Пример #2
0
 public virtual List <ContactResult> RaycastActor(PhysicsActor actor, Vector3 position, Vector3 direction, float length, int Count, RayFilterFlags flags)
 {
     return(new List <ContactResult>());
 }
Пример #3
0
 public virtual List <ContactResult> BoxProbe(Vector3 position, Vector3 size, Quaternion orientation, int Count, RayFilterFlags flags)
 {
     return(new List <ContactResult>());
 }
Пример #4
0
 public object RayCastFiltered(Vector3 position, Vector3 direction, float length, int Count, RayFilterFlags filter)      
 {
     if (PhysicsScene == null)
         return null;
     return PhysicsScene.RaycastWorld(position, direction, length, Count, filter);
 }
Пример #5
0
 public virtual object RaycastWorld(Vector3 position, Vector3 direction, float length, int Count, RayFilterFlags filter)
 {
     return(null);
 }
Пример #6
0
 public virtual List<ContactResult> BoxProbe(Vector3 position, Vector3 size, Quaternion orientation, int Count, RayFilterFlags flags)
 {
     return new List<ContactResult>();
 }
Пример #7
0
        public override List<ContactResult> SphereProbe(Vector3 position, float radius, int Count, RayFilterFlags flags)
        {
            List<ContactResult> ourResults = null;
            object SyncObject = new object();

            ProbeSphereCallback retMethod = delegate(List<ContactResult> results)
            {
                ourResults = results;
                Monitor.PulseAll(SyncObject);
            };

            ODERayRequest req = new ODERayRequest();
            req.actor = null;
            req.callbackMethod = retMethod;
            req.length = radius;
            req.Origin = position;
            req.Count = Count;
            req.filter = flags;


            lock (SyncObject)
            {
                m_rayCastManager.QueueRequest(req);
                if (!Monitor.Wait(SyncObject, 500))
                    return new List<ContactResult>();
            }

            if (ourResults == null)
                return new List<ContactResult>();
            return ourResults;
        }
Пример #8
0
        public override List<ContactResult> PlaneProbe(PhysicsActor actor, Vector4 plane, int Count, RayFilterFlags flags)
        {
            IntPtr geom = IntPtr.Zero;;

            if (actor != null)
            {
                if (actor is OdePrim)
                    geom = ((OdePrim)actor).prim_geom;
                else if (actor is OdeCharacter)
                    geom = ((OdePrim)actor).prim_geom;
            }

            List<ContactResult> ourResults = null;
            object SyncObject = new object();

            ProbePlaneCallback retMethod = delegate(List<ContactResult> results)
            {
                ourResults = results;
                Monitor.PulseAll(SyncObject);
            };

            ODERayRequest req = new ODERayRequest();
            req.actor = null;
            req.callbackMethod = retMethod;
            req.length = plane.W;
            req.Normal.X = plane.X;
            req.Normal.Y = plane.Y;
            req.Normal.Z = plane.Z;
            req.Count = Count;
            req.filter = flags;

            lock (SyncObject)
            {
                m_rayCastManager.QueueRequest(req);
                if (!Monitor.Wait(SyncObject, 500))
                    return new List<ContactResult>();
            }

            if (ourResults == null)
                return new List<ContactResult>();
            return ourResults;
        }
Пример #9
0
        public override List<ContactResult> RaycastActor(PhysicsActor actor, Vector3 position, Vector3 direction, float length, int Count, RayFilterFlags flags)
        {
            if (actor == null)
                return new List<ContactResult>();

            IntPtr geom;
            if (actor is OdePrim)
                geom = ((OdePrim)actor).prim_geom;
            else if (actor is OdeCharacter)
                geom = ((OdePrim)actor).prim_geom;
            else
                return new List<ContactResult>();

            if (geom == IntPtr.Zero)
                return new List<ContactResult>();

            List<ContactResult> ourResults = null;
            object SyncObject = new object();

            RayCallback retMethod = delegate(List<ContactResult> results)
            {
                lock (SyncObject)
                {
                    ourResults = results;
                    Monitor.PulseAll(SyncObject);
                }
            };

            ODERayRequest req = new ODERayRequest();
            req.actor = actor;
            req.callbackMethod = retMethod;
            req.length = length;
            req.Normal = direction;
            req.Origin = position;
            req.Count = Count;
            req.filter = flags;

            lock (SyncObject)
            {
                m_rayCastManager.QueueRequest(req);
                if (!Monitor.Wait(SyncObject, 500))
                    return new List<ContactResult>();
            }

            if (ourResults == null)
                return new List<ContactResult>();
            return ourResults;
        }
Пример #10
0
        public override List<ContactResult> BoxProbe(Vector3 position, Vector3 size, Quaternion orientation, int Count, RayFilterFlags flags)
        {
            List<ContactResult> ourResults = null;
            object SyncObject = new object();

            ProbeBoxCallback retMethod = delegate(List<ContactResult> results)
            {
                lock (SyncObject)
                {
                    ourResults = results;
                    Monitor.PulseAll(SyncObject);
                }
            };

            ODERayRequest req = new ODERayRequest();
            req.actor = null;
            req.callbackMethod = retMethod;
            req.Normal = size;
            req.Origin = position;
            req.orientation = orientation;
            req.Count = Count;
            req.filter = flags;

            lock (SyncObject)
            {
                m_rayCastManager.QueueRequest(req);
                if (!Monitor.Wait(SyncObject, 500))
                    return new List<ContactResult>();
            }

            if (ourResults == null)
                return new List<ContactResult>();
            return ourResults;
        }
Пример #11
0
        public override object RaycastWorld(Vector3 position, Vector3 direction, float length, int Count, RayFilterFlags filter)
        {
            object SyncObject = new object();
            List<ContactResult> ourresults = new List<ContactResult>();

            RayCallback retMethod = delegate(List<ContactResult> results)
            {
                lock (SyncObject)
                {
                    ourresults = results;
                    Monitor.PulseAll(SyncObject);
                }
            };

            ODERayRequest req = new ODERayRequest();
            req.actor = null;
            req.callbackMethod = retMethod;
            req.length = length;
            req.Normal = direction;
            req.Origin = position;
            req.Count = Count;
            req.filter = filter;

            lock (SyncObject)
            {
                m_rayCastManager.QueueRequest(req);
                if (!Monitor.Wait(SyncObject, 500))
                    return null;
                else
                    return ourresults;
            }
        }
Пример #12
0
 public virtual List<ContactResult> PlaneProbe(PhysicsActor actor, Vector4 plane, int Count, RayFilterFlags flags)
 {
     return new List<ContactResult>();
 }
Пример #13
0
 public virtual List<ContactResult> SphereProbe(Vector3 position, float radius, int Count, RayFilterFlags flags)
 {
     return new List<ContactResult>();
 }
Пример #14
0
 public virtual List <ContactResult> PlaneProbe(PhysicsActor actor, Vector4 plane, int Count, RayFilterFlags flags)
 {
     return(new List <ContactResult>());
 }
Пример #15
0
        /// <summary>
        /// Process all queued raycast requests
        /// </summary>
        /// <returns>Time in MS the raycasts took to process.</returns>
        public int ProcessQueuedRequests()
        {
            if (m_PendingRequests.Count <= 0)
            {
                return(0);
            }

            if (m_scene.ContactgeomsArray == IntPtr.Zero || ray == IntPtr.Zero)
            // oops something got wrong or scene isn't ready still
            {
                m_PendingRequests.Clear();
                return(0);
            }

            int time = Util.EnvironmentTickCount();

            ODERayRequest       req;
            int                 closestHit;
            int                 backfacecull;
            CollisionCategories catflags;

            while (m_PendingRequests.Dequeue(out req))
            {
                if (req.callbackMethod != null)
                {
                    IntPtr geom = IntPtr.Zero;
                    if (req.actor != null)
                    {
                        if (m_scene.haveActor(req.actor))
                        {
                            if (req.actor is OdePrim)
                            {
                                geom = ((OdePrim)req.actor).prim_geom;
                            }
                            else if (req.actor is OdeCharacter)
                            {
                                geom = ((OdePrim)req.actor).prim_geom;
                            }
                        }
                        if (geom == IntPtr.Zero)
                        {
                            NoContacts(req);
                            continue;
                        }
                    }

                    CurrentRayFilter = req.filter;
                    CurrentMaxCount  = req.Count;

                    CollisionContactGeomsPerTest = req.Count & 0xffff;

                    closestHit   = ((CurrentRayFilter & RayFilterFlags.ClosestHit) == 0 ? 0 : 1);
                    backfacecull = ((CurrentRayFilter & RayFilterFlags.BackFaceCull) == 0 ? 0 : 1);

                    if (req.callbackMethod is ProbeBoxCallback)
                    {
                        if (CollisionContactGeomsPerTest > 80)
                        {
                            CollisionContactGeomsPerTest = 80;
                        }
                        SafeNativeMethods.GeomBoxSetLengths(Box, req.Normal.X, req.Normal.Y, req.Normal.Z);
                        SafeNativeMethods.GeomSetPosition(Box, req.Origin.X, req.Origin.Y, req.Origin.Z);
                        SafeNativeMethods.Quaternion qtmp;
                        qtmp.X = req.orientation.X;
                        qtmp.Y = req.orientation.Y;
                        qtmp.Z = req.orientation.Z;
                        qtmp.W = req.orientation.W;
                        SafeNativeMethods.GeomSetQuaternion(Box, ref qtmp);
                    }
                    else if (req.callbackMethod is ProbeSphereCallback)
                    {
                        if (CollisionContactGeomsPerTest > 80)
                        {
                            CollisionContactGeomsPerTest = 80;
                        }

                        SafeNativeMethods.GeomSphereSetRadius(Sphere, req.length);
                        SafeNativeMethods.GeomSetPosition(Sphere, req.Origin.X, req.Origin.Y, req.Origin.Z);
                    }
                    else if (req.callbackMethod is ProbePlaneCallback)
                    {
                        if (CollisionContactGeomsPerTest > 80)
                        {
                            CollisionContactGeomsPerTest = 80;
                        }

                        SafeNativeMethods.GeomPlaneSetParams(Plane, req.Normal.X, req.Normal.Y, req.Normal.Z, req.length);
                    }

                    else
                    {
                        if (CollisionContactGeomsPerTest > 25)
                        {
                            CollisionContactGeomsPerTest = 25;
                        }

                        SafeNativeMethods.GeomRaySetLength(ray, req.length);
                        SafeNativeMethods.GeomRaySet(ray, req.Origin.X, req.Origin.Y, req.Origin.Z, req.Normal.X, req.Normal.Y, req.Normal.Z);
                        SafeNativeMethods.GeomRaySetParams(ray, 0, backfacecull);

                        if (req.callbackMethod is RaycastCallback)
                        {
                            // if we only want one get only one per Collision pair saving memory
                            CurrentRayFilter |= RayFilterFlags.ClosestHit;
                            SafeNativeMethods.GeomRaySetClosestHit(ray, 1);
                        }
                        else
                        {
                            SafeNativeMethods.GeomRaySetClosestHit(ray, closestHit);
                        }
                    }

                    if ((CurrentRayFilter & RayFilterFlags.ContactsUnImportant) != 0)
                    {
                        unchecked
                        {
                            CollisionContactGeomsPerTest |= (int)SafeNativeMethods.CONTACTS_UNIMPORTANT;
                        }
                    }

                    if (geom == IntPtr.Zero)
                    {
                        // translate ray filter to Collision flags
                        catflags = 0;
                        if ((CurrentRayFilter & RayFilterFlags.volumedtc) != 0)
                        {
                            catflags |= CollisionCategories.VolumeDtc;
                        }
                        if ((CurrentRayFilter & RayFilterFlags.phantom) != 0)
                        {
                            catflags |= CollisionCategories.Phantom;
                        }
                        if ((CurrentRayFilter & RayFilterFlags.agent) != 0)
                        {
                            catflags |= CollisionCategories.Character;
                        }
                        if ((CurrentRayFilter & RayFilterFlags.PrimsNonPhantom) != 0)
                        {
                            catflags |= CollisionCategories.Geom;
                        }
                        if ((CurrentRayFilter & RayFilterFlags.land) != 0)
                        {
                            catflags |= CollisionCategories.Land;
                        }
                        if ((CurrentRayFilter & RayFilterFlags.water) != 0)
                        {
                            catflags |= CollisionCategories.Water;
                        }

                        if (catflags != 0)
                        {
                            if (req.callbackMethod is ProbeBoxCallback)
                            {
                                catflags |= CollisionCategories.Space;
                                SafeNativeMethods.GeomSetCollideBits(Box, (uint)catflags);
                                SafeNativeMethods.GeomSetCategoryBits(Box, (uint)catflags);
                                doProbe(req, Box);
                            }
                            else if (req.callbackMethod is ProbeSphereCallback)
                            {
                                catflags |= CollisionCategories.Space;
                                SafeNativeMethods.GeomSetCollideBits(Sphere, (uint)catflags);
                                SafeNativeMethods.GeomSetCategoryBits(Sphere, (uint)catflags);
                                doProbe(req, Sphere);
                            }
                            else if (req.callbackMethod is ProbePlaneCallback)
                            {
                                catflags |= CollisionCategories.Space;
                                SafeNativeMethods.GeomSetCollideBits(Plane, (uint)catflags);
                                SafeNativeMethods.GeomSetCategoryBits(Plane, (uint)catflags);
                                doPlane(req, IntPtr.Zero);
                            }
                            else
                            {
                                SafeNativeMethods.GeomSetCollideBits(ray, (uint)catflags);
                                doSpaceRay(req);
                            }
                        }
                    }
                    else
                    {
                        // if we select a geom don't use filters

                        if (req.callbackMethod is ProbePlaneCallback)
                        {
                            SafeNativeMethods.GeomSetCollideBits(Plane, (uint)CollisionCategories.All);
                            doPlane(req, geom);
                        }
                        else
                        {
                            SafeNativeMethods.GeomSetCollideBits(ray, (uint)CollisionCategories.All);
                            doGeomRay(req, geom);
                        }
                    }
                }

                if (Util.EnvironmentTickCountSubtract(time) > MaxTimePerCallMS)
                {
                    break;
                }
            }

            lock (m_contactResults)
                m_contactResults.Clear();

            return(Util.EnvironmentTickCountSubtract(time));
        }
Пример #16
0
 public virtual object RaycastWorld(Vector3 position, Vector3 direction, float length, int Count, RayFilterFlags filter)
 {
     return null;
 }
Пример #17
0
 public virtual List<ContactResult> RaycastActor(PhysicsActor actor, Vector3 position, Vector3 direction, float length, int Count, RayFilterFlags flags)
 {
     return new List<ContactResult>();
 }