namespace Dreamteck.Splines.Editor { using UnityEngine; using System.Collections; using UnityEditor; public static class SplineEditorHandles { private static SplineSample evalResult = new SplineSample(); public enum SplineSliderGizmo { ForwardTriangle, BackwardTriangle, DualArrow, Rectangle, Circle } public static bool Slider(SplineComputer spline, ref double percent, Color color, string text = "", SplineSliderGizmo gizmo = SplineSliderGizmo.Rectangle, float buttonSize = 1f) { Camera cam = SceneView.currentDrawingSceneView.camera; spline.Evaluate(percent, evalResult); float size = HandleUtility.GetHandleSize(evalResult.position); Handles.color = new Color(color.r, color.g, color.b, 0.4f); Handles.DrawSolidDisc(evalResult.position, cam.transform.position - evalResult.position, size * 0.2f * buttonSize); Handles.color = Color.white; if ((color.r + color.g + color.b + color.a) / 4f >= 0.9f) Handles.color = Color.black; Vector3 center = evalResult.position; Vector2 screenPosition = HandleUtility.WorldToGUIPoint(center); screenPosition.y += 20f; Vector3 localPos = cam.transform.InverseTransformPoint(center); if (text != "" && localPos.z > 0f) { Handles.BeginGUI(); DreamteckEditorGUI.Label(new Rect(screenPosition.x - 120 + text.Length * 4, screenPosition.y, 120, 25), text); Handles.EndGUI(); } bool buttonClick = SliderButton(center, false, Color.white, 0.3f); Vector3 lookAtCamera = (cam.transform.position - evalResult.position).normalized; Vector3 right = Vector3.Cross(lookAtCamera, evalResult.forward).normalized * size * 0.1f * buttonSize; Vector3 front = Vector3.forward; switch (gizmo) { case SplineSliderGizmo.BackwardTriangle: center += evalResult.forward * size * 0.06f * buttonSize; front = center - evalResult.forward * size * 0.2f * buttonSize; Handles.DrawLine(center + right, front); Handles.DrawLine(front, center - right); Handles.DrawLine(center - right, center + right); break; case SplineSliderGizmo.ForwardTriangle: center -= evalResult.forward * size * 0.06f * buttonSize; front = center + evalResult.forward * size * 0.2f * buttonSize; Handles.DrawLine(center + right, front); Handles.DrawLine(front, center - right); Handles.DrawLine(center - right, center + right); break; case SplineSliderGizmo.DualArrow: center += evalResult.forward * size * 0.025f * buttonSize; front = center + evalResult.forward * size * 0.17f * buttonSize; Handles.DrawLine(center + right, front); Handles.DrawLine(front, center - right); Handles.DrawLine(center - right, center + right); center -= evalResult.forward * size * 0.05f * buttonSize; front = center - evalResult.forward * size * 0.17f * buttonSize; Handles.DrawLine(center + right, front); Handles.DrawLine(front, center - right); Handles.DrawLine(center - right, center + right); break; case SplineSliderGizmo.Rectangle: break; case SplineSliderGizmo.Circle: Handles.DrawWireDisc(center, lookAtCamera, 0.13f * size * buttonSize); break; } Vector3 lastPos = evalResult.position; Handles.color = Color.clear; //var fmh_78_79_638379167653620604 = Quaternion.LookRotation(cam.transform.position - evalResult.position); evalResult.position = Handles.FreeMoveHandle(evalResult.position, size * 0.2f * buttonSize, Vector3.zero, Handles.CircleHandleCap); if (evalResult.position != lastPos) percent = spline.Project(evalResult.position).percent; Handles.color = Color.white; return buttonClick; } static bool SliderButton(Vector3 position, bool drawHandle, Color color, float size) { Camera cam = SceneView.currentDrawingSceneView.camera; Vector3 localPos = cam.transform.InverseTransformPoint(position); if (localPos.z < 0f) return false; size *= HandleUtility.GetHandleSize(position); Vector2 screenPos = HandleUtility.WorldToGUIPoint(position); Vector2 screenRectBase = HandleUtility.WorldToGUIPoint(position - cam.transform.right * size + cam.transform.up * size); Rect rect = new Rect(screenRectBase.x, screenRectBase.y, (screenPos.x - screenRectBase.x) * 2f, (screenPos.y - screenRectBase.y) * 2f); if (drawHandle) { Color previousColor = Handles.color; Handles.color = color; Handles.RectangleHandleCap(0, position, Quaternion.LookRotation(-cam.transform.forward), HandleUtility.GetHandleSize(position) * 0.1f, EventType.Repaint); Handles.color = previousColor; } if (rect.Contains(Event.current.mousePosition)) { if (Event.current.type == EventType.MouseDown && Event.current.button == 0) { return true; } } return false; } public static bool CircleButton(Vector3 position, Quaternion rotation, float size, float clickableAreaMultiplier, Color color) { Color prev = Handles.color; bool result = false; Handles.color = color; result = Handles.Button(position, rotation, size, size * clickableAreaMultiplier, Handles.CircleHandleCap); Handles.color = prev; return result; } public static Vector3 FreeMoveRectangle(Vector3 position, float size) { return Vector3.zero; //var fmh_123_53_638379167653639409 = Quaternion.identity; return Handles.FreeMoveHandle(position, size, Vector3.zero, Handles.CircleHandleCap); } public static Vector3 FreeMoveCircle(Vector3 position, float size) { return Vector3.zero; //var fmh_128_53_638379167653649262 = Quaternion.identity; return Handles.FreeMoveHandle(position, size, Vector3.zero, Handles.CircleHandleCap); } public static void DrawSolidSphere(Vector3 position, float radius) { Handles.SphereHandleCap(0, position, Quaternion.identity, radius, EventType.Repaint); } public static void DrawCircle(Vector3 position, Quaternion rotation, float radius) { Handles.CircleHandleCap(0, position, rotation, radius, EventType.Repaint); } public static void DrawRectangle(Vector3 position, Quaternion rotation, float size) { Handles.RectangleHandleCap(0, position, rotation, size, EventType.Repaint); } public static void DrawArrowCap(Vector3 position, Quaternion rotation, float size) { Handles.ArrowHandleCap(0, position, rotation, size, EventType.Repaint); } public static bool HoverArea(Vector3 position, float size) { Camera cam = SceneView.currentDrawingSceneView.camera; Vector3 localPos = cam.transform.InverseTransformPoint(position); if (localPos.z < 0f) return false; size *= HandleUtility.GetHandleSize(position); Vector2 screenPos = HandleUtility.WorldToGUIPoint(position); Vector2 screenRectBase = HandleUtility.WorldToGUIPoint(position - cam.transform.right * size + cam.transform.up * size); Rect rect = new Rect(screenRectBase.x, screenRectBase.y, (screenPos.x - screenRectBase.x) * 2f, (screenPos.y - screenRectBase.y) * 2f); if (rect.Contains(Event.current.mousePosition)) return true; else return false; } } }