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(); +        } +    } +} | 
