/// <summary> /// Adds a new control point to the scene view and its drag point data /// to the game object. /// </summary> public void AddDragPointOnTraveller() { if (CurveTravellerControlPointIdx < 0 || CurveTravellerControlPointIdx >= ControlPoints.Count) { return; } var dragPoint = new DragPointData(DragPointEditable.GetDragPoints()[CurveTravellerControlPointIdx]) { IsLocked = false }; var newIdx = CurveTravellerControlPointIdx + 1; float ratio = (float)newIdx / (DragPointEditable.GetDragPoints().Length - 1); var dragPointPosition = Transform.worldToLocalMatrix.MultiplyPoint(CurveTravellerPosition); dragPointPosition -= DragPointEditable.GetEditableOffset(); dragPointPosition -= DragPointEditable.GetDragPointOffset(ratio); dragPoint.Vertex = dragPointPosition.ToVertex3D(); var dragPoints = DragPointEditable.GetDragPoints().ToList(); dragPoints.Insert(newIdx, dragPoint); DragPointEditable.SetDragPoints(dragPoints.ToArray()); ControlPoints.Insert(newIdx, new ControlPoint( DragPointEditable.GetDragPoints()[newIdx], GUIUtility.GetControlID(FocusType.Passive), newIdx, ratio )); RebuildControlPoints(); }
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)); } }