public override void OnMouseUp(MouseEventArgs mouseEvent) { base.OnMouseUp(mouseEvent); if (mouseEvent.Button != MouseButtons.Left) { return; } // Make sure we don't use the trace data before it is ready if (mouseDownPosition == mouseEvent.Position && cubeTraceData != null) { Ray ray = world.GetRayForLocalBounds(mouseEvent.Position); IntersectInfo info = cubeTraceData.GetClosestIntersection(ray); if (info != null) { var hitData = GetHitData(info.HitPosition); var normalAndUp = GetDirectionForFace(hitData); var look = Matrix4X4.LookAt(Vector3.Zero, normalAndUp.normal, normalAndUp.up); var start = new Quaternion(interactionLayer.World.RotationMatrix); var end = new Quaternion(look); Task.Run(() => { // TODO: stop any spinning happening in the view double duration = .25; var timer = Stopwatch.StartNew(); var time = timer.Elapsed.TotalSeconds; while (time < duration) { var current = Quaternion.Slerp(start, end, time / duration); UiThread.RunOnIdle(() => { interactionLayer.World.RotationMatrix = Matrix4X4.CreateRotation(current); Invalidate(); }); time = timer.Elapsed.TotalSeconds; Thread.Sleep(10); } interactionLayer.World.RotationMatrix = Matrix4X4.CreateRotation(end); Invalidate(); }); } } interactionLayer.Focus(); }
public override void OnMouseUp(MouseEventArgs mouseEvent) { base.OnMouseUp(mouseEvent); // Make sure we don't use the trace data before it is ready if (mouseDownPosition == mouseEvent.Position && cubeTraceData != null) { Ray ray = world.GetRayForLocalBounds(mouseEvent.Position); IntersectInfo info = cubeTraceData.GetClosestIntersection(ray); if (info != null) { var normal = ((TriangleShape)info.closestHitObject).Plane.Normal; var directionForward = -new Vector3(normal); var directionUp = Vector3.UnitY; if (directionForward.Equals(Vector3.UnitX, .001)) { directionUp = Vector3.UnitZ; } else if (directionForward.Equals(-Vector3.UnitX, .001)) { directionUp = Vector3.UnitZ; } else if (directionForward.Equals(Vector3.UnitY, .001)) { directionUp = Vector3.UnitZ; } else if (directionForward.Equals(-Vector3.UnitY, .001)) { directionUp = Vector3.UnitZ; } else if (directionForward.Equals(Vector3.UnitZ, .001)) { directionUp = -Vector3.UnitY; } var look = Matrix4X4.LookAt(Vector3.Zero, directionForward, directionUp); var start = new Quaternion(interactionLayer.World.RotationMatrix); var end = new Quaternion(look); Task.Run(() => { // TODO: stop any spinning happening in the view double duration = .25; var timer = Stopwatch.StartNew(); var time = timer.Elapsed.TotalSeconds; while (time < duration) { var current = Quaternion.Slerp(start, end, time / duration); UiThread.RunOnIdle(() => { interactionLayer.World.RotationMatrix = Matrix4X4.CreateRotation(current); Invalidate(); }); time = timer.Elapsed.TotalSeconds; Thread.Sleep(10); } interactionLayer.World.RotationMatrix = Matrix4X4.CreateRotation(end); Invalidate(); }); } } interactionLayer.Focus(); }