Example #1
0
        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();
        }
Example #2
0
        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();
        }