/// <summary> /// Queues a raycast /// </summary> /// <param name="position">Origin of Ray</param> /// <param name="direction">Ray normal</param> /// <param name="length">Ray length</param> /// <param name="retMethod">Return method to send the results</param> public void QueueRequest(Vector3 position, Vector3 direction, float length, RayCallback retMethod) { ODERayRequest req = new ODERayRequest(); req.geom = IntPtr.Zero; req.callbackMethod = retMethod; req.Count = 0; req.length = length; req.Normal = direction; req.Origin = position; m_PendingRequests.Enqueue(req); }
/// <summary> /// Queues a raycast /// </summary> /// <param name="position">Origin of Ray</param> /// <param name="direction">Ray normal</param> /// <param name="length">Ray length</param> /// <param name="count"></param> /// <param name="retMethod">Return method to send the results</param> public void QueueRequest(Vector3 position, Vector3 direction, float length, int count, RayCallback retMethod) { lock (m_PendingRequests) { ODERayRequest req = new ODERayRequest(); req.callbackMethod = retMethod; req.length = length; req.Normal = direction; req.Origin = position; req.Count = count; m_PendingRayRequests.Add(req); } }
/// <summary> /// Method that actually initiates the raycast /// </summary> /// <param name="req"></param> private void RayCast(ODERayRequest req) { // Create the ray IntPtr ray = d.CreateRay(m_scene.space, req.length); d.GeomRaySet(ray, req.Origin.X, req.Origin.Y, req.Origin.Z, req.Normal.X, req.Normal.Y, req.Normal.Z); // Collide test d.SpaceCollide2(m_scene.space, ray, IntPtr.Zero, nearCallback); // Remove Ray d.GeomDestroy(ray); // Find closest contact and object. lock (m_contactResults) { // Return results if (req.callbackMethod != null) { req.callbackMethod(m_contactResults); } } }
/// <summary> /// Method that actually initiates the raycast with a geom /// </summary> /// <param name="req"></param> private void doGeomRay(ODERayRequest req) { // Create the ray // IntPtr ray = d.CreateRay(m_scene.TopSpace, req.length); d.GeomRaySetLength(ray, req.length); d.GeomRaySet(ray, req.Origin.X, req.Origin.Y, req.Origin.Z, req.Normal.X, req.Normal.Y, req.Normal.Z); // Collide test d.SpaceCollide2(req.geom, ray, IntPtr.Zero, nearCallback); // still do this to have full AABB pre test // Remove Ray // d.GeomDestroy(ray); if (req.callbackMethod == null) return; if (req.callbackMethod is RaycastCallback) { // Define default results bool hitYN = false; uint hitConsumerID = 0; float distance = 999999999999f; Vector3 closestcontact = new Vector3(99999f, 99999f, 99999f); Vector3 snormal = Vector3.Zero; // Find closest contact and object. lock (m_contactResults) { foreach (ContactResult cResult in m_contactResults) { if (Vector3.Distance(req.Origin, cResult.Pos) < Vector3.Distance(req.Origin, closestcontact)) { closestcontact = cResult.Pos; hitConsumerID = cResult.ConsumerID; distance = cResult.Depth; hitYN = true; snormal = cResult.Normal; } } m_contactResults.Clear(); } ((RaycastCallback)req.callbackMethod)(hitYN, closestcontact, hitConsumerID, distance, snormal); } else { ((RayCallback)req.callbackMethod)(m_contactResults); lock (m_PendingRequests) m_contactResults.Clear(); } }
public void QueueRequest(IntPtr geom, Vector3 position, Vector3 direction, float length, int count, RaycastCallback retMethod) { ODERayRequest req = new ODERayRequest(); req.geom = geom; req.callbackMethod = retMethod; req.length = length; req.Normal = direction; req.Origin = position; req.Count = count; m_PendingRequests.Enqueue(req); }
/// <summary> /// Method that actually initiates the raycast /// </summary> /// <param name="req"></param> private void RayCast(ODERayRequest req) { // Create the ray IntPtr ray = d.CreateRay(m_scene.space, req.length); d.GeomRaySet(ray, req.Origin.X, req.Origin.Y, req.Origin.Z, req.Normal.X, req.Normal.Y, req.Normal.Z); // Collide test d.SpaceCollide2(m_scene.space, ray, IntPtr.Zero, nearCallback); // Remove Ray d.GeomDestroy(ray); // Find closest contact and object. lock (m_contactResults) { // Return results if (req.callbackMethod != null) req.callbackMethod(m_contactResults); } }
/// <summary> /// Queues a raycast /// </summary> /// <param name="position">Origin of Ray</param> /// <param name="direction">Ray normal</param> /// <param name="length">Ray length</param> /// <param name="count"></param> /// <param name="retMethod">Return method to send the results</param> public void QueueRequest(Vector3 position, Vector3 direction, float length, int count, RayCallback retMethod) { lock (m_PendingRequests) { ODERayRequest req = new ODERayRequest(); req.callbackMethod = retMethod; req.length = length; req.Normal = direction; req.Origin = position; req.Count = count; m_PendingRayRequests.Add(req); } }