Exemplo n.º 1
0
 public bool FindNearest(Point pt, out Point3D pos, out Vector3D normal, out DependencyObject obj)
 {
     return(Viewport3DHelper.FindNearest(Viewport, pt, out pos, out normal, out obj));
 }
Exemplo n.º 2
0
        private void MouseDownHandler(object sender, MouseButtonEventArgs e)
        {
            if (!Enabled)
            {
                return;
            }
            if (Viewport == null)
            {
                throw new NullReferenceException("Viewport");
            }

            var element = (UIElement)sender;

            if (element.IsMouseCaptured)
            {
                return;
            }

            mouseDownPosition = e.GetPosition(this);
            fixRelative       = new Vector3D();

            // reset camera
            if (CheckButton(e, MouseAction.ResetCamera))
            {
                ResetCamera();
            }

            Point3D          point;
            Vector3D         normal;
            DependencyObject visual;

            if (Viewport3DHelper.FindNearest(Viewport, mouseDownPosition, out point, out normal, out visual))
            {
                mouseDownPoint3D = point;
            }
            else
            {
                mouseDownPoint3D = null;
            }

            lastPoint3D = UnProject(mouseDownPosition, CameraTarget, LookDirection);

            // select object
            if (CheckButton(e, MouseAction.Select) && visual != null)
            {
                OnSelectionChanged(visual);
            }

            zooming  = CheckButton(e, MouseAction.Zoom);
            panning  = CheckButton(e, MouseAction.Pan);
            rotating = CheckButton(e, MouseAction.Rotate);
            isFixed  = false;

            // change the 'lookat' point
            if (mouseDownPoint3D != null && CheckButton(e, MouseAction.ChangeLookAt))
            {
                LookAt(mouseDownPoint3D.Value, 0);
                rotating = true;
            }

            if (zooming || panning || rotating)
            {
                bool rightWinKey = (Keyboard.IsKeyDown(Key.RWin));
                if (FixedMouseDownPoint || rightWinKey)
                {
                    if (!panning && mouseDownPoint3D != null)
                    {
                        fixRelative = mouseDownPoint3D.Value - CameraTarget;
                        ShowTargetAdorner(mouseDownPosition);
                        isFixed = true;
                    }
                }
                else
                {
                    // show the adorner in the middle
                    ShowTargetAdorner(new Point(Viewport.ActualWidth / 2, Viewport.ActualHeight / 2));
                }

                /*
                 * Position += _fixRelative;
                 * ShowTargetModel();
                 * Position -= _fixRelative;
                 */

                if (zooming || panning || rotating)
                {
                    e.Handled = true;
                    element.CaptureMouse();
                }

                spinWatch.Reset();
                spinWatch.Start();

                // ProjectToTrackball(EventSurface.ActualWidth, EventSurface.ActualHeight, _mouseDownPosition);
                lastPosition = mouseDownPosition;
            }

            isSpinning = false;
        }