Пример #1
0
 private void ClearPointSelection()
 {
     foreach (var p in SelectedControlPoints.OfType <ControlPointViewModelBase>())
     {
         p.IsSelected = false;
     }
     SelectedControlPoints.Clear();
 }
Пример #2
0
        private void InitSceneGui()
        {
            SelectedControlPoints.Clear();
            _flipAxis = Vector3.zero;

            //Setup Screen positions & controlID for control points (in case of modification of drag points coordinates outside)
            foreach (var controlPoint in ControlPoints)
            {
                controlPoint.WorldPos  = controlPoint.DragPoint.Vertex.ToUnityVector3();
                controlPoint.WorldPos += DragPointEditable.GetEditableOffset();
                controlPoint.WorldPos += DragPointEditable.GetDragPointOffset(controlPoint.IndexRatio);
                controlPoint.WorldPos  = Transform.localToWorldMatrix.MultiplyPoint(controlPoint.WorldPos);
                _flipAxis             += controlPoint.WorldPos;
                controlPoint.ScrPos    = Handles.matrix.MultiplyPoint(controlPoint.WorldPos);
                if (controlPoint.IsSelected)
                {
                    if (!controlPoint.DragPoint.IsLocked)
                    {
                        SelectedControlPoints.Add(controlPoint);
                    }
                }

                HandleUtility.AddControl(controlPoint.ControlId,
                                         HandleUtility.DistanceToCircle(controlPoint.ScrPos,
                                                                        HandleUtility.GetHandleSize(controlPoint.WorldPos) * ControlPoint.ScreenRadius *
                                                                        _sceneViewHandler.ControlPointsSizeRatio));
            }

            if (ControlPoints.Count > 0)
            {
                _flipAxis /= ControlPoints.Count;
            }

            //Setup PositionHandle if some control points are selected
            if (SelectedControlPoints.Count > 0)
            {
                _positionHandlePosition = Vector3.zero;
                foreach (var sCp in SelectedControlPoints)
                {
                    _positionHandlePosition += sCp.WorldPos;
                }

                _positionHandlePosition /= SelectedControlPoints.Count;
            }

            if (CurveTravellerVisible)
            {
                HandleUtility.AddControl(CurveTravellerControlId,
                                         HandleUtility.DistanceToCircle(Handles.matrix.MultiplyPoint(CurveTravellerPosition),
                                                                        HandleUtility.GetHandleSize(CurveTravellerPosition) * ControlPoint.ScreenRadius *
                                                                        _sceneViewHandler.CurveTravellerSizeRatio * 0.5f));
            }
        }
Пример #3
0
        public override void Destroy()
        {
            var curvesCopy = curves.ToList();

            // clear before destroying
            curves.Clear();
            SelectedControlPoints.Clear();
            selectedCurve = null;

            foreach (var curve in curvesCopy)
            {
                curve.Destroy();
            }
            base.Destroy();
        }
Пример #4
0
        private void Select(WindowsRect selectionRect, bool isSingleSelection)
        {
            var editableCurve = SelectedCurve as IEditableCurveViewModel;

            if (editableCurve == null)
            {
                return;
            }

            // TODO: move this to the curve (especially hit testing)
            IList <ControlPointViewModelBase> selectedPoints = editableCurve.ControlPoints.Where(c => selectionRect.Contains(c.ActualPoint)).ToList();

            if (selectedPoints.Count > 1 && isSingleSelection)
            {
                var rectCenter = new WindowsPoint(selectionRect.Left + selectionRect.Width * 0.5, selectionRect.Top + selectionRect.Height * 0.5);
                var closest    = CurveHelper.GetClosestPoint(selectedPoints, rectCenter);
                selectedPoints = new[] { closest };
            }
            switch (Keyboard.Modifiers)
            {
            case ModifierKeys.None:
                ClearPointSelection();
                goto case ModifierKeys.Shift;

            case ModifierKeys.Shift:
                // FIXME: do this atomically in the curve
                foreach (var p in selectedPoints.Where(p => !p.IsSelected))
                {
                    SelectedControlPoints.Add(p);
                    p.IsSelected = true;
                }
                break;

            case ModifierKeys.Control:
                // FIXME: do this atomically in the curve
                foreach (var p in selectedPoints.Where(p => p.IsSelected))
                {
                    SelectedControlPoints.Remove(p);
                    p.IsSelected = false;
                }
                break;
            }
        }
Пример #5
0
        public void Focus()
        {
            var count = SelectedControlPoints.Count;

            switch (count)
            {
            case 0:
                // Focus on whole curve
                ResetAxes();
                break;

            default:
                Debug.Assert(SelectedCurve != null);
                // Focus on the selection
                var center = (WindowsPoint)(SelectedControlPoints
                                            .Select(s => (WindowsVector?)(s as ControlPointViewModelBase)?.ActualPoint)
                                            .Aggregate(new WindowsVector(), (c, s) => s.HasValue ? s.Value + c : c) / count);
                SelectedCurve.XAxis?.Center(center);
                SelectedCurve.YAxis?.Center(center);
                break;
            }
        }
Пример #6
0
        private void DeleteSelectedPoints()
        {
            var editableCurve = selectedCurve as IEditableCurveViewModel;

            if (editableCurve == null)
            {
                return;
            }

            var count = SelectedControlPoints.Count;

            if (count == 0)
            {
                return;
            }

            using (var transaction = UndoRedoService.CreateTransaction())
            {
                DeletePoints(SelectedControlPoints.Cast <ControlPointViewModelBase>(), editableCurve);
                UndoRedoService.SetName(transaction, $"Delete {SelectedControlPoints.Count} point{(count > 1 ? "s" : "")} from curve '{selectedCurve.DisplayName}'");
            }
        }
Пример #7
0
        private void NavigateToControlPoint(int navigation)
        {
            if (SelectedControlPoints.Count == 0)
            {
                return;
            }

            var point = SelectedControlPoints[0] as ControlPointViewModelBase;

            if (point == null)
            {
                return;
            }

#if !DEBUG
            var wasSelected = point.IsSelected;
#endif
            point.IsSelected = false;
            if (navigation == int.MinValue)
            {
                // navigate to first point
                while (point.Previous != null)
                {
                    point = point.Previous;
                }
            }
            else if (navigation == int.MaxValue)
            {
                // navigate to last point
                while (point.Next != null)
                {
                    point = point.Next;
                }
            }
            else if (navigation == -1)
            {
                // navigate to previous point (works also with multi selection)
                point = point.Previous ?? point;
            }
            else if (navigation == 1)
            {
                // if multiple points are selected go to the next one following the selection
                point = SelectedControlPoints[SelectedControlPoints.Count - 1] as ControlPointViewModelBase ?? point;
                // navigate to next point
                point = point.Next ?? point;
            }
            else
            {
                // invalid (shouldn't happen)
#if DEBUG
                throw new ArgumentException($"Expected parameter navigation to be one of {{{int.MinValue}, {int.MaxValue}, {-1} or {1}}} but got {navigation} instead.", nameof(navigation));
#else
                point.IsSelected = wasSelected;
                return;
#endif
            }

            // FIXME: do this atomically in the curve
            ClearPointSelection();
            SelectedControlPoints.Add(point);
            point.IsSelected = true;
        }