public void OnMouseDown(object sender, MouseEventArgs e) { var mouse = new { Close = Camera.UnProject(new Vector2(e.X, e.Y), -1.0f), Far = Camera.UnProject(new Vector2(e.X, e.Y), 1.0f) }; var callback = new ClosestRayResultCullFaceCallback(mouse.Close, mouse.Far) { CollisionFilterGroup = CollisionFilterGroups.AllFilter, CollisionFilterMask = CollisionFilterGroups.AllFilter }; CollisionManager.World.RayTest(mouse.Close, mouse.Far, callback); if (callback.HasHit) { var clickableCollisionObject = callback.CollisionObject as IClickable; if (clickableCollisionObject != null) { RegisterEventHandler(clickableCollisionObject); clickableCollisionObject.OnMouseDown(this, new SceneMouseEventArgs(Camera, new Vector2(e.X, e.Y), default(Vector3), e.Button)); } SelectObject(callback.CollisionObject); } else if (e.Button == MouseButtons.Left) { SelectObject(null); } }
public SceneMouseEventArgs(Camera camera, Vector2 mouseViewportCoordinates, Vector3 mouseWorldCoordinates, MouseButtons button) { // Project the mouse coordinates into world-space at the far z-plane var distantWorldPoint = camera.UnProject(mouseViewportCoordinates, 1); // Produce a ray originating at the camera and pointing towards the distant world point^ Camera = camera; this.ScreenCoordinates = mouseViewportCoordinates; this.MouseRay = new Ray(camera.Position, distantWorldPoint); this.MouseRayFarPoint = (distantWorldPoint - camera.Position).Length; this.Button = button; this.WorldCoordinates = distantWorldPoint; }
public void OnMouseMove(object sender, MouseEventArgs e) { var mouse = new { Close = Camera.UnProject(new Vector2(e.X, e.Y), -1.0f), Far = Camera.UnProject(new Vector2(e.X, e.Y), 1.0f) }; var callback = new ClosestRayResultCallback(mouse.Close, mouse.Far) { CollisionFilterMask = ( CollisionFilterGroups )CollisionGroup.Objects }; CollisionManager.World.RayTest(mouse.Close, mouse.Far, callback); if (callback.HasHit) { CurrentMouseWorldPosition = callback.HitPointWorld; GLDebug.QueuePointDraw(0, CurrentMouseWorldPosition); } MouseMove?.Invoke(this, new SceneMouseEventArgs(Camera, new Vector2(e.X, e.Y), default(Vector3), e.Button)); }