using UnityEditor.EditorTools;
using UnityEngine;
using UnityEngine.Splines;
namespace UnityEditor.Splines
{
[CustomEditor(typeof(SplineMoveTool))]
class SplineMoveToolSettings : SplineToolSettings { }
///
/// Provides methods that move knots and tangents in the Scene view. This tool is only available when you use SplineToolContext.
/// `SplineMoveTool` works similarly to the Move tool for GameObjects, except that it has extra handle configurations according to the `handleOrientation` settings.
/// `SplineToolContext` manages the selection of knots and tangents. You can manipulate the selection of knots and tangents with `SplineMoveTool`.
///
#if UNITY_2021_2_OR_NEWER
[EditorTool("Spline Move Tool", typeof(ISplineContainer), typeof(SplineToolContext))]
#else
[EditorTool("Spline Move Tool", typeof(ISplineContainer))]
#endif
public sealed class SplineMoveTool : SplineTool
{
///
public override bool gridSnapEnabled
{
get => handleOrientation == HandleOrientation.Global;
}
///
public override GUIContent toolbarIcon => PathIcons.splineMoveTool;
///
public override void OnToolGUI(EditorWindow window)
{
switch (Event.current.type)
{
case EventType.Layout:
UpdatePivotPosition();
break;
case EventType.MouseDrag:
if (handleOrientation == HandleOrientation.Element || handleOrientation == HandleOrientation.Parent)
TransformOperation.pivotFreeze |= TransformOperation.PivotFreeze.Rotation;
// In rotation sync center mode, pivot has to be allowed to move away
// from the selection center. Therefore we freeze pivot's position
// and force the position later on based on handle's translation delta.
if (Tools.pivotMode == PivotMode.Center)
TransformOperation.pivotFreeze |= TransformOperation.PivotFreeze.Position;
break;
case EventType.MouseUp:
TransformOperation.pivotFreeze = TransformOperation.PivotFreeze.None;
UpdatePivotPosition();
UpdateHandleRotation();
break;
}
if (TransformOperation.canManipulate && !DirectManipulation.IsDragging)
{
EditorGUI.BeginChangeCheck();
var newPos = Handles.DoPositionHandle(pivotPosition, handleRotation);
if (EditorGUI.EndChangeCheck())
{
EditorSplineUtility.RecordSelection($"Move Spline Elements ({SplineSelection.Count})");
TransformOperation.ApplyTranslation(newPos - pivotPosition);
if (Tools.pivotMode == PivotMode.Center)
TransformOperation.ForcePivotPosition(newPos);
}
}
}
}
}