//Plane3d dPlane = new Plane3d(); public void OnSceneGUI() { if (spriteDeformerEditor.selectedPoints.Count <= 0) { return; } // dPlane = new Plane3d(spriteDeformerEditor.spriteDeformer.transform.position, spriteDeformerEditor.spriteDeformer.transform.rotation); CurrentTool nextTool = CurrentTool.NONE; float newHandleSize = HandleUtility.GetHandleSize(pos2Dto3D(pivot)); Vector2 newPivotHandle = pivot - oriantDirUp * newHandleSize / 3f; Vector2 newOriantHandle = pivot + oriantDir * newHandleSize * 1.5f; float newScaleStandartDistance = newHandleSize * 1.3f; Vector2 newScaleVerticalHandle = pivot + oriantDirUp * newScaleStandartDistance; Vector2 newScaleHorizontalHandle = pivot + oriantDir * newScaleStandartDistance; Vector2 newRotateHandle = pivot + oriantDirUp * newHandleSize * 1.5f; if (spriteDeformerEditor.currentTool == CurrentTool.NONE) { if (Vector3.Distance(Event.current.mousePosition, pos2DtoScreen(pivot)) < 7f) { nextTool = CurrentTool.MOVE_POINTS; } else { Vector2 l1Screen = pos2DtoScreen(pivot); Vector2 l2Screen = pos2DtoScreen(pivot + oriantDir * newHandleSize); Vector2 l2UpScreen = pos2DtoScreen(pivot + oriantDirUp * newHandleSize); float d = Vector2.Distance(Line.ClosestPointOnSegment(l1Screen, l2Screen, Event.current.mousePosition), Event.current.mousePosition); float dUP = Vector2.Distance(Line.ClosestPointOnSegment(l1Screen, l2UpScreen, Event.current.mousePosition), Event.current.mousePosition); if (Mathf.Min(d, dUP) < 6f) { nextTool = d < dUP ? CurrentTool.MOVE_RIGHT : CurrentTool.MOVE_UP; } else if (Vector2.Distance(pos2DtoScreen(newPivotHandle), Event.current.mousePosition) < 6) { nextTool = CurrentTool.MOVE_PIVOT; } else if (Vector2.Distance(pos2DtoScreen(newScaleHorizontalHandle), Event.current.mousePosition) < 6) { nextTool = CurrentTool.SCALE_HORIZONTAL; calculateLocalPositions(); } else if (Vector2.Distance(pos2DtoScreen(newScaleVerticalHandle), Event.current.mousePosition) < 6) { nextTool = CurrentTool.SCALE_VERTICAL; calculateLocalPositions(); } else if (Vector2.Distance(pos2DtoScreen(newOriantHandle), Event.current.mousePosition) < 6) { nextTool = CurrentTool.ORIANT; } else if (Vector2.Distance(pos2DtoScreen(newRotateHandle), Event.current.mousePosition) < 6) { nextTool = CurrentTool.ROTATE; calculateLocalPositions(); } } pivotDeltaClick = mouse2Dpos - pivot; } if (Event.current.type == EventType.MouseDown && nextTool != CurrentTool.NONE) { spriteDeformerEditor.currentTool = nextTool; } if (spriteDeformerEditor.currentTool == CurrentTool.MOVE_POINTS) { Vector2 newPos = mouse2Dpos - pivotDeltaClick; movePoints(pivot, newPos); pivot = newPos; } if (spriteDeformerEditor.currentTool == CurrentTool.MOVE_RIGHT || spriteDeformerEditor.currentTool == CurrentTool.MOVE_UP) { Vector2 cDir = spriteDeformerEditor.currentTool == CurrentTool.MOVE_RIGHT ? oriantDir : oriantDirUp; Vector2 newPivotPos = Line3d.closestPointInLine(mouse2Dpos - pivotDeltaClick, pivot, pivot + cDir); movePoints(pivot, newPivotPos); pivot = newPivotPos; } if (spriteDeformerEditor.currentTool == CurrentTool.MOVE_PIVOT) { pivot = mouse2Dpos - pivotDeltaClick; } if (spriteDeformerEditor.currentTool == CurrentTool.SCALE_HORIZONTAL || spriteDeformerEditor.currentTool == CurrentTool.SCALE_VERTICAL) { Vector2 lineStart = pivot; Vector2 line = spriteDeformerEditor.currentTool == CurrentTool.SCALE_HORIZONTAL ? oriantDir : oriantDirUp; float t = Vector2.Dot(mouse2Dpos - lineStart, line); if (spriteDeformerEditor.currentTool == CurrentTool.SCALE_HORIZONTAL) { newScaleHorizontalHandle = lineStart + line * t; setPointsFromPointsInPivotLocal(new Vector2(t / newScaleStandartDistance, 1f)); } else { newScaleVerticalHandle = lineStart + line * t; setPointsFromPointsInPivotLocal(new Vector2(1f, t / newScaleStandartDistance)); } } if (spriteDeformerEditor.currentTool == CurrentTool.ORIANT) { Vector2 mlp = mouse2Dpos; oriant = Mathf.Atan2(mlp.y - pivot.y, mlp.x - pivot.x); } if (spriteDeformerEditor.currentTool == CurrentTool.ROTATE) { calculateLocalPositions(); Vector2 mlp = mouse2Dpos; float a = Mathf.Atan2(mlp.y - pivot.y, mlp.x - pivot.x) - Mathf.PI / 2f; setPointsFromPointsInPivotLocal(new Vector2(1f, 1f), a - oriant); oriant = a; } Color overColor = spriteDeformerEditor.colorSets[ColorSet.DEFORMER_TOOL].over; Color standartColor = spriteDeformerEditor.colorSets[ColorSet.DEFORMER_TOOL].standart; Handles.color = nextTool == CurrentTool.MOVE_RIGHT ? overColor : standartColor; List <CurrentTool> candraw = new List <CurrentTool>() { CurrentTool.NONE, CurrentTool.ORIANT, CurrentTool.MOVE_PIVOT, CurrentTool.MOVE_RIGHT, CurrentTool.ROTATE }; if (candraw.Contains(spriteDeformerEditor.currentTool)) { Handles.ArrowCap(15, pos2Dto3D(pivot), spriteDeformerEditor.spriteDeformer.transform.rotation * Quaternion.Euler(0 - oriant * Mathf.Rad2Deg, 90, 0), newHandleSize); } Handles.color = nextTool == CurrentTool.MOVE_UP ? overColor : standartColor; candraw = new List <CurrentTool>() { CurrentTool.NONE, CurrentTool.ORIANT, CurrentTool.MOVE_PIVOT, CurrentTool.MOVE_UP, CurrentTool.ROTATE }; if (candraw.Contains(spriteDeformerEditor.currentTool)) { Handles.ArrowCap(15, pos2Dto3D(pivot), spriteDeformerEditor.spriteDeformer.transform.rotation * Quaternion.Euler(-90 - oriant * Mathf.Rad2Deg, 90, 0), newHandleSize); } Handles.color = nextTool == CurrentTool.MOVE_POINTS ? overColor : standartColor; Handles.CylinderCap(15, pos2Dto3D(pivot), spriteDeformerEditor.spriteDeformer.transform.rotation, newHandleSize / 5f); candraw = new List <CurrentTool>() { CurrentTool.NONE, CurrentTool.ORIANT, CurrentTool.MOVE_PIVOT, CurrentTool.MOVE_PIVOT }; Handles.color = nextTool == CurrentTool.MOVE_PIVOT ? overColor : standartColor; if (candraw.Contains(spriteDeformerEditor.currentTool)) { Handles.SphereCap(0, pos2Dto3D(newPivotHandle), Quaternion.identity, newHandleSize / 10f); } Handles.color = nextTool == CurrentTool.SCALE_HORIZONTAL ? overColor : standartColor; candraw = new List <CurrentTool>() { CurrentTool.NONE, CurrentTool.ORIANT, CurrentTool.MOVE_PIVOT, CurrentTool.SCALE_HORIZONTAL }; if (candraw.Contains(spriteDeformerEditor.currentTool)) { Handles.CubeCap(0, pos2Dto3D(newScaleHorizontalHandle), spriteDeformerEditor.spriteDeformer.transform.rotation * Quaternion.Euler(0, 0, oriant * Mathf.Rad2Deg), newHandleSize / 7f); } Handles.color = nextTool == CurrentTool.SCALE_VERTICAL ? overColor : standartColor; candraw = new List <CurrentTool>() { CurrentTool.NONE, CurrentTool.ORIANT, CurrentTool.MOVE_PIVOT, CurrentTool.SCALE_VERTICAL }; if (candraw.Contains(spriteDeformerEditor.currentTool)) { Handles.CubeCap(0, pos2Dto3D(newScaleVerticalHandle), spriteDeformerEditor.spriteDeformer.transform.rotation * Quaternion.Euler(0, 0, oriant * Mathf.Rad2Deg), newHandleSize / 7f); } Handles.color = nextTool == CurrentTool.ORIANT ? overColor : standartColor; candraw = new List <CurrentTool>() { CurrentTool.NONE, CurrentTool.ORIANT, CurrentTool.MOVE_PIVOT, CurrentTool.MOVE_PIVOT }; if (candraw.Contains(spriteDeformerEditor.currentTool)) { Handles.ConeCap(0, pos2Dto3D(newOriantHandle), Quaternion.LookRotation(pos2Dto3D(newOriantHandle) - pos2Dto3D(pivot)), newHandleSize / 6f); } Handles.color = nextTool == CurrentTool.ROTATE ? overColor : standartColor; candraw = new List <CurrentTool>() { CurrentTool.NONE, CurrentTool.ORIANT, CurrentTool.MOVE_PIVOT, CurrentTool.MOVE_PIVOT, CurrentTool.ROTATE }; if (candraw.Contains(spriteDeformerEditor.currentTool)) { Handles.ConeCap(0, pos2Dto3D(newRotateHandle), Quaternion.LookRotation(pos2Dto3D(newOriantHandle) - pos2Dto3D(pivot)), newHandleSize / 6f); } }