namespace Dreamteck.Splines.Editor { using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEditor; public class OffsetModifierEditor : SplineSampleModifierEditor { public bool allowSelection = true; private float addTime = 0f; Matrix4x4 matrix = new Matrix4x4(); public OffsetModifierEditor(SplineUser user, SplineUserEditor editor) : base(user, editor, "_offsetModifier") { title = "Offset Modifiers"; } public void ClearSelection() { selected = -1; } public override void DrawInspector() { base.DrawInspector(); if (!isOpen) return; if (GUILayout.Button("Add New Offset")) { AddKey(addTime - 0.1f, addTime + 0.1f); UpdateValues(); } } protected override void KeyGUI(SerializedProperty key) { SerializedProperty offset = key.FindPropertyRelative("offset"); base.KeyGUI(key); EditorGUILayout.PropertyField(offset); } protected override bool KeyHandles(SerializedProperty key, bool edit) { if (!isOpen) return false; bool changed = false; bool is2D = user.spline != null && user.spline.is2D; SplineSample result = new SplineSample(); SerializedProperty start = key.FindPropertyRelative("_featherStart"); SerializedProperty end = key.FindPropertyRelative("_featherEnd"); SerializedProperty centerStart = key.FindPropertyRelative("_centerStart"); SerializedProperty centerEnd = key.FindPropertyRelative("_centerEnd"); SerializedProperty offset = key.FindPropertyRelative("offset"); float position = GetPosition(start.floatValue, end.floatValue, centerStart.floatValue, centerEnd.floatValue); user.spline.Evaluate(position, ref result); matrix.SetTRS(result.position, Quaternion.LookRotation(result.forward, result.up), Vector3.one * result.size); Vector3 pos = matrix.MultiplyPoint(offset.vector2Value); if (is2D) { Handles.DrawLine(result.position, result.position + result.right * offset.vector2Value.x * result.size); Handles.DrawLine(result.position, result.position - result.right * offset.vector2Value.x * result.size); } else Handles.DrawWireDisc(result.position, result.forward, offset.vector2Value.magnitude * result.size); Handles.DrawLine(result.position, pos); if (edit) { Vector3 lastPos = pos; pos = SplineEditorHandles.FreeMoveRectangle(pos, HandleUtility.GetHandleSize(pos) * 0.1f); if (pos != lastPos) { changed = true; pos = matrix.inverse.MultiplyPoint(pos); pos.z = 0f; if (is2D) { offset.vector2Value = Vector2.right * pos.x; } else { offset.vector2Value = pos; } } } return base.KeyHandles(key, edit) || changed; } } }