/// <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)); } }
/// <summary> /// Flips all drag points around the given axis. /// </summary> /// <param name="flipAxis">Axis to flip</param> public void FlipDragPoints(FlipAxis flipAxis) { var axis = flipAxis == FlipAxis.X ? _flipAxis.x : flipAxis == FlipAxis.Y ? _flipAxis.y : _flipAxis.z; var offset = DragPointEditable.GetEditableOffset(); var wlMat = Transform.worldToLocalMatrix; foreach (var controlPoint in ControlPoints) { var coord = flipAxis == FlipAxis.X ? controlPoint.WorldPos.x : flipAxis == FlipAxis.Y ? controlPoint.WorldPos.y : controlPoint.WorldPos.z; coord = axis + (axis - coord); switch (flipAxis) { case FlipAxis.X: controlPoint.WorldPos.x = coord; break; case FlipAxis.Y: controlPoint.WorldPos.y = coord; break; case FlipAxis.Z: controlPoint.WorldPos.z = coord; break; default: throw new ArgumentOutOfRangeException(nameof(flipAxis), flipAxis, null); } controlPoint.UpdateDragPoint(DragPointEditable, Transform); } }