From 2c8f291d7b9a5591756e12f326f955ad2f334236 Mon Sep 17 00:00:00 2001 From: John Date: Thu, 29 Sep 2016 17:28:54 +0800 Subject: [PATCH] [unity] SpineEditorUtilities Handles --- .../Editor/SpineEditorUtilities.cs | 61 +++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git a/spine-unity/Assets/spine-unity/Editor/SpineEditorUtilities.cs b/spine-unity/Assets/spine-unity/Editor/SpineEditorUtilities.cs index a065608d7..050e11c76 100644 --- a/spine-unity/Assets/spine-unity/Editor/SpineEditorUtilities.cs +++ b/spine-unity/Assets/spine-unity/Editor/SpineEditorUtilities.cs @@ -1434,6 +1434,67 @@ namespace Spine.Unity.Editor { } #endregion + #region Handles + static public void DrawBone (Matrix4x4 transformMatrix) { + SpineEditorUtilities.Icons.BoneMaterial.SetPass(0); + Graphics.DrawMeshNow(SpineEditorUtilities.Icons.BoneMesh, transformMatrix); + } + + static float[] pathVertexBuffer; + static public void DrawPath (Slot s, PathAttachment p, Transform t) { + int worldVerticesLength = p.WorldVerticesLength; + + if (pathVertexBuffer == null || pathVertexBuffer.Length < worldVerticesLength) + pathVertexBuffer = new float[worldVerticesLength]; + + float[] pv = pathVertexBuffer; + p.ComputeWorldVertices(s, pv); + + var ocolor = Handles.color; + Handles.color = new Color(254f/255f, 127f/255f, 0); // Path orange + + Matrix4x4 m = t.localToWorldMatrix; + const int step = 6; + int n = worldVerticesLength - step; + Vector3 p0, p1, p2, p3; + for (int i = 2; i < n; i += step) { + p0 = m.MultiplyPoint(new Vector3(pv[i], pv[i+1])); + p1 = m.MultiplyPoint(new Vector3(pv[i+2], pv[i+3])); + p2 = m.MultiplyPoint(new Vector3(pv[i+4], pv[i+5])); + p3 = m.MultiplyPoint(new Vector3(pv[i+6], pv[i+7])); + DrawCubicBezier(p0, p1, p2, p3); + } + + n += step; + if (p.Closed) { + p0 = m.MultiplyPoint(new Vector3(pv[n - 4], pv[n - 3])); + p1 = m.MultiplyPoint(new Vector3(pv[n - 2], pv[n - 1])); + p2 = m.MultiplyPoint(new Vector3(pv[0], pv[1])); + p3 = m.MultiplyPoint(new Vector3(pv[2], pv[3])); + DrawCubicBezier(p0, p1, p2, p3); + } + + const float endCapSize = 0.05f; + var q = Quaternion.identity; + Handles.DotCap(0, m.MultiplyPoint(new Vector3(pv[2], pv[3])), q, endCapSize); +// if (!p.Closed) Handles.DotCap(0, m.MultiplyPoint(new Vector3(pv[n - 4], pv[n - 3])), q, endCapSize); + + Handles.color = ocolor; + } + + static public void DrawCubicBezier (Vector3 p0, Vector3 p1, Vector3 p2, Vector3 p3) { + Handles.DrawBezier(p0, p3, p1, p2, Handles.color, Texture2D.whiteTexture, 2f); +// const float dotSize = 0.01f; +// Quaternion q = Quaternion.identity; +// Handles.DotCap(0, p0, q, dotSize); +// Handles.DotCap(0, p1, q, dotSize); +// Handles.DotCap(0, p2, q, dotSize); +// Handles.DotCap(0, p3, q, dotSize); +// Handles.DrawLine(p0, p1); +// Handles.DrawLine(p3, p2); + } + #endregion + public static string GetPathSafeRegionName (AtlasRegion region) { return region.name.Replace("/", "_"); }