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)); } }
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; } }
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; }