diff options
Diffstat (limited to 'Assets/uGUI-2017.1/Editor/UI/SpriteDrawUtility.cs')
-rw-r--r-- | Assets/uGUI-2017.1/Editor/UI/SpriteDrawUtility.cs | 200 |
1 files changed, 200 insertions, 0 deletions
diff --git a/Assets/uGUI-2017.1/Editor/UI/SpriteDrawUtility.cs b/Assets/uGUI-2017.1/Editor/UI/SpriteDrawUtility.cs new file mode 100644 index 0000000..32b9498 --- /dev/null +++ b/Assets/uGUI-2017.1/Editor/UI/SpriteDrawUtility.cs @@ -0,0 +1,200 @@ +using System.Collections.Generic; +using UnityEngine; + +namespace UnityEditor.UI +{ + // Tools for the editor + internal class SpriteDrawUtility + { + static Texture2D s_ContrastTex; + + // Returns a usable texture that looks like a high-contrast checker board. + static Texture2D contrastTexture + { + get + { + if (s_ContrastTex == null) + s_ContrastTex = CreateCheckerTex( + new Color(0f, 0.0f, 0f, 0.5f), + new Color(1f, 1f, 1f, 0.5f)); + return s_ContrastTex; + } + } + + // Create a checker-background texture. + static Texture2D CreateCheckerTex(Color c0, Color c1) + { + Texture2D tex = new Texture2D(16, 16); + tex.name = "[Generated] Checker Texture"; + tex.hideFlags = HideFlags.DontSave; + + for (int y = 0; y < 8; ++y) for (int x = 0; x < 8; ++x) tex.SetPixel(x, y, c1); + for (int y = 8; y < 16; ++y) for (int x = 0; x < 8; ++x) tex.SetPixel(x, y, c0); + for (int y = 0; y < 8; ++y) for (int x = 8; x < 16; ++x) tex.SetPixel(x, y, c0); + for (int y = 8; y < 16; ++y) for (int x = 8; x < 16; ++x) tex.SetPixel(x, y, c1); + + tex.Apply(); + tex.filterMode = FilterMode.Point; + return tex; + } + + // Create a gradient texture. + static Texture2D CreateGradientTex() + { + Texture2D tex = new Texture2D(1, 16); + tex.name = "[Generated] Gradient Texture"; + tex.hideFlags = HideFlags.DontSave; + + Color c0 = new Color(1f, 1f, 1f, 0f); + Color c1 = new Color(1f, 1f, 1f, 0.4f); + + for (int i = 0; i < 16; ++i) + { + float f = Mathf.Abs((i / 15f) * 2f - 1f); + f *= f; + tex.SetPixel(0, i, Color.Lerp(c0, c1, f)); + } + + tex.Apply(); + tex.filterMode = FilterMode.Bilinear; + return tex; + } + + // Draws the tiled texture. Like GUI.DrawTexture() but tiled instead of stretched. + static void DrawTiledTexture(Rect rect, Texture tex) + { + float u = rect.width / tex.width; + float v = rect.height / tex.height; + + Rect texCoords = new Rect(0, 0, u, v); + TextureWrapMode originalMode = tex.wrapMode; + tex.wrapMode = TextureWrapMode.Repeat; + GUI.DrawTextureWithTexCoords(rect, tex, texCoords); + tex.wrapMode = originalMode; + } + + // Draw the specified Image. + public static void DrawSprite(Sprite sprite, Rect drawArea, Color color) + { + if (sprite == null) + return; + + Texture2D tex = sprite.texture; + if (tex == null) + return; + + Rect outer = sprite.rect; + Rect inner = outer; + inner.xMin += sprite.border.x; + inner.yMin += sprite.border.y; + inner.xMax -= sprite.border.z; + inner.yMax -= sprite.border.w; + + Vector4 uv4 = UnityEngine.Sprites.DataUtility.GetOuterUV(sprite); + Rect uv = new Rect(uv4.x, uv4.y, uv4.z - uv4.x, uv4.w - uv4.y); + Vector4 padding = UnityEngine.Sprites.DataUtility.GetPadding(sprite); + padding.x /= outer.width; + padding.y /= outer.height; + padding.z /= outer.width; + padding.w /= outer.height; + + DrawSprite(tex, drawArea, padding, outer, inner, uv, color, null); + } + + // Draw the specified Image. + public static void DrawSprite(Texture tex, Rect drawArea, Rect outer, Rect uv, Color color) + { + DrawSprite(tex, drawArea, Vector4.zero, outer, outer, uv, color, null); + } + + // Draw the specified Image. + private static void DrawSprite(Texture tex, Rect drawArea, Vector4 padding, Rect outer, Rect inner, Rect uv, Color color, Material mat) + { + // Create the texture rectangle that is centered inside rect. + Rect outerRect = drawArea; + outerRect.width = Mathf.Abs(outer.width); + outerRect.height = Mathf.Abs(outer.height); + + if (outerRect.width > 0f) + { + float f = drawArea.width / outerRect.width; + outerRect.width *= f; + outerRect.height *= f; + } + + if (drawArea.height > outerRect.height) + { + outerRect.y += (drawArea.height - outerRect.height) * 0.5f; + } + else if (outerRect.height > drawArea.height) + { + float f = drawArea.height / outerRect.height; + outerRect.width *= f; + outerRect.height *= f; + } + + if (drawArea.width > outerRect.width) + outerRect.x += (drawArea.width - outerRect.width) * 0.5f; + + // Draw the background + EditorGUI.DrawTextureTransparent(outerRect, null, ScaleMode.ScaleToFit, outer.width / outer.height); + + // Draw the Image + GUI.color = color; + + Rect paddedTexArea = new Rect( + outerRect.x + outerRect.width * padding.x, + outerRect.y + outerRect.height * padding.w, + outerRect.width - (outerRect.width * (padding.z + padding.x)), + outerRect.height - (outerRect.height * (padding.w + padding.y)) + ); + + if (mat == null) + { + GL.sRGBWrite = QualitySettings.activeColorSpace == ColorSpace.Linear; + GUI.DrawTextureWithTexCoords(paddedTexArea, tex, uv, true); + GL.sRGBWrite = false; + } + else + { + // NOTE: There is an issue in Unity that prevents it from clipping the drawn preview + // using BeginGroup/EndGroup, and there is no way to specify a UV rect... + EditorGUI.DrawPreviewTexture(paddedTexArea, tex, mat); + } + + // Draw the border indicator lines + GUI.BeginGroup(outerRect); + { + tex = contrastTexture; + GUI.color = Color.white; + + if (inner.xMin != outer.xMin) + { + float x = (inner.xMin - outer.xMin) / outer.width * outerRect.width - 1; + DrawTiledTexture(new Rect(x, 0f, 1f, outerRect.height), tex); + } + + if (inner.xMax != outer.xMax) + { + float x = (inner.xMax - outer.xMin) / outer.width * outerRect.width - 1; + DrawTiledTexture(new Rect(x, 0f, 1f, outerRect.height), tex); + } + + if (inner.yMin != outer.yMin) + { + // GUI.DrawTexture is top-left based rather than bottom-left + float y = (inner.yMin - outer.yMin) / outer.height * outerRect.height - 1; + DrawTiledTexture(new Rect(0f, outerRect.height - y, outerRect.width, 1f), tex); + } + + if (inner.yMax != outer.yMax) + { + float y = (inner.yMax - outer.yMin) / outer.height * outerRect.height - 1; + DrawTiledTexture(new Rect(0f, outerRect.height - y, outerRect.width, 1f), tex); + } + } + + GUI.EndGroup(); + } + } +} |