private static float SnapScale(float aOriginalScale, float aNewScale, PathSnap aSnapMode = PathSnap.Unity) { float result = aNewScale; if (!Event.current.control) { return(result); } float snap = EditorTools.GetUnityScaleSnap(); if (aSnapMode == PathSnap.Local || aSnapMode == PathSnap.World) { result = SnapScalar(aNewScale, snap); } if (aSnapMode == PathSnap.Relative) { result = aOriginalScale + SnapScalar(aNewScale - aOriginalScale, snap); } return(result); }
private static Vector2 Snap(Vector2 aOriginalPoint, Vector2 aNewPoint, Matrix4x4 aTransform, Matrix4x4 aInvTransform, PathSnap aSnapMode = PathSnap.Unity) { Vector2 result = aNewPoint; if (!Event.current.control) { return(result); } Vector3 snap = EditorTools.GetUnitySnap(); if (aSnapMode == PathSnap.Local) { result = SnapVector(aNewPoint, snap); } if (aSnapMode == PathSnap.World) { result = aInvTransform.MultiplyPoint(SnapVector(aTransform.MultiplyPoint(aNewPoint), snap)); } if (aSnapMode == PathSnap.Relative) { result = aOriginalPoint + SnapVector(aNewPoint - aOriginalPoint, snap); } return(result); }
public static void OnSceneGUIEasy(SerializedProperty aPath, Path2D.Plane aPlane = Path2D.Plane.XY, PathSnap aSnapMode = PathSnap.Unity, float aSmartSnapDist = 0, PathEditorVisuals aVisuals = null) { SerializedObject obj = aPath.serializedObject; Transform t = ((Component)obj.targetObject).transform; Path2D raw = EditorTools.GetTargetObjectOfProperty(aPath) as Path2D; OnSceneGUI(t.localToWorldMatrix, t.worldToLocalMatrix, aPath, raw, true, null, null, aPlane, aSnapMode, aSmartSnapDist, KeyCode.C, aVisuals); DoDragSelect(t.localToWorldMatrix, raw, new Rect(0, 0, Screen.width, Screen.height), aVisuals); obj.ApplyModifiedProperties(); }
private static Vector2 SnapRadial(Vector3 aWorldPt, Vector2 aOriginalPoint, Vector2 aNewPoint, Matrix4x4 aTransform, Matrix4x4 aInvTransform, PathSnap aSnapMode = PathSnap.Unity) { Vector2 result = aNewPoint; if (!Event.current.control) { return(result); } float angleSnap = EditorTools.GetUnityRotationSnap(); float magnitudeSnap = EditorTools.GetUnityScaleSnap(); Vector2 src = aNewPoint; if (aSnapMode == PathSnap.Local) { src = aNewPoint; } if (aSnapMode == PathSnap.World) { src = aInvTransform.MultiplyVector(aNewPoint); } if (aSnapMode == PathSnap.Relative) { src = aNewPoint; } Vector2 polar = new Vector2(PathUtil.ClockwiseAngle(src, Vector2.right), src.magnitude); Vector3 polarSnap = new Vector3(angleSnap, magnitudeSnap, 0); polar = SnapVector(polar, polarSnap); polar.x *= Mathf.Deg2Rad; result = new Vector2(Mathf.Cos(polar.x) * polar.y, Mathf.Sin(polar.x) * polar.y); if (aSnapMode == PathSnap.World) { result = aInvTransform.MultiplyVector(result); } return(result); }
private static void ShowPoint(Path2D aPathRaw, int aIndex, Selection aSelection, Matrix4x4 aTransform, Matrix4x4 aInvTransform, SerializedProperty aPath, Path2D.Plane aPlane, Plane aEditPlane, PathSnap aSnapMode, float aSmartSnapDist, PathEditorVisuals aVisuals) { Handles.color = aVisuals.colorHandle * _activeHandleTint; Handles.CapFunction cap = aVisuals.capVertex; if (aVisuals.capVertexTypes != null) { cap = aVisuals.capVertexTypes[(int)aPathRaw.GetControls(aIndex).type]; } Vector3 v = aTransform.MultiplyPoint3x4(Plane(aPathRaw[aIndex], aPlane)); Vector3 nV = Handles.FreeMoveHandle(v, SceneView.lastActiveSceneView.camera.transform.rotation, HandleUtility.GetHandleSize(v) * aVisuals.sizeVertex, Vector3.zero, cap); if (nV != v) { nV = EditorTools.ProjectPoint(nV, aEditPlane); nV = aInvTransform.MultiplyPoint3x4(nV); Vector2 newPos = Deplane(nV, aPlane); newPos = Snap(aPathRaw[aIndex], newPos, aTransform, aInvTransform, aSnapMode); if (!Event.current.control && aSmartSnapDist != 0) { newPos = SmartSnap(newPos, aPathRaw, aIndex, aSelection.ids, aSmartSnapDist); } Vector2 delta = newPos - aPathRaw[aIndex]; aSelection.Each(aIndex, i => aPath.FindPropertyRelative("_points").GetArrayElementAtIndex(i).vector2Value += delta); GUI.changed = true; _recentInteract = aIndex; } }
public static void OnSceneGUI(Matrix4x4 aTransform, Matrix4x4 aInvTransform, SerializedProperty aPath, Path2D aPathRaw, bool aShowShiftAdd = true, Action <SerializedProperty, int> aOnAddPoint = null, Action <SerializedProperty, int> aOnRemovePoint = null, Path2D.Plane aPlane = Path2D.Plane.XY, PathSnap aSnapMode = PathSnap.Unity, float aSmartSnapDist = 0, KeyCode aVertModeKey = KeyCode.C, PathEditorVisuals aVisuals = null) { if (aVisuals == null) { aVisuals = _defaultVisuals; } // get the current selection list Selection selection = GetSelection(aPathRaw); bool showControls = !Event.current.shift && !Event.current.alt; // check for point type switching mode if (Event.current.type == EventType.KeyDown && Event.current.keyCode == aVertModeKey) { _vMode = true; Event.current.Use(); } if (Event.current.type == EventType.KeyUp && Event.current.keyCode == aVertModeKey) { _vMode = false; Event.current.Use(); } bool deleteMode = Event.current.alt; // draw all the curve and handle lines if (Event.current.type == EventType.Repaint) { ShowPathLines(aPathRaw, aTransform, showControls, aPlane, aVisuals); } // create the plane on which all edits occur Plane editPlane; if (aPlane == Path2D.Plane.XY) { editPlane = new Plane(aTransform.MultiplyPoint3x4(Vector3.zero), aTransform.MultiplyPoint3x4(Vector3.right), aTransform.MultiplyPoint3x4(Vector3.up)); } else { editPlane = new Plane(aTransform.MultiplyPoint3x4(Vector3.zero), aTransform.MultiplyPoint3x4(Vector3.right), aTransform.MultiplyPoint3x4(Vector3.forward)); } // check for shift-add point to path if (Event.current.shift && aShowShiftAdd && Event.current.button != 1 && !Event.current.control) { ShowShiftAdd(aPathRaw, aTransform, aInvTransform, aPath, aOnAddPoint, aPlane, editPlane, aVisuals); } // draw the handles for each point for (int i = 0; i < aPathRaw.Count; i++) { if (selection.Count > 0) { _activeHandleTint = selection.IsSelected(i) ? aVisuals.colorSelectionTint : aVisuals.colorUnselectedTint; } else { _activeHandleTint = aVisuals.colorNoSelectionTint; } if (deleteMode) { ShowPointDeleteMode(aPathRaw, i, selection, aTransform, aPath, aOnRemovePoint, aPlane, aVisuals); } else if (_vMode) { ShowPointTypeMode(aPathRaw, i, selection, aTransform, aInvTransform, aPath, aPlane, aVisuals); } else { ShowPoint(aPathRaw, i, selection, aTransform, aInvTransform, aPath, aPlane, editPlane, aSnapMode, aSmartSnapDist, aVisuals); } if (showControls) { ShowHandles(aPathRaw, i, aTransform, aInvTransform, aPath, i == _recentInteract, _vMode, aPlane, editPlane, aVisuals); } } if (GUI.changed) { SetDirty(aPath); } Handles.color = Color.white; }