예제 #1
0
        public override void OnInspectorGUI()
        {
            serializedObject.Update();

            _rampObj = target as KamakuraRampTexture;

            var widthProp = serializedObject.FindProperty("width");

            EditorGUI.BeginChangeCheck();
            EditorGUILayout.IntSlider(widthProp, 4, 128);
            if (EditorGUI.EndChangeCheck())
            {
                serializedObject.ApplyModifiedProperties();
            }

            EditorGUI.BeginChangeCheck();
            _list.DoLayoutList();
            if (EditorGUI.EndChangeCheck())
            {
                serializedObject.ApplyModifiedProperties();
            }

            if (NeedsUpdate(_rampObj))
            {
                _cachedTexture = UpdateTex(_rampObj);
            }

            using (var disableScope = new EditorGUI.DisabledScope(_cachedTexture == null))
            {
                if (GUILayout.Button("Export as PNG"))
                {
                    ExportToPNG(_cachedTexture);
                }
            }
        }
예제 #2
0
        private Texture2D UpdateTex(KamakuraRampTexture rampObj)
        {
            var path = AssetDatabase.GetAssetPath(rampObj);

            if (string.IsNullOrEmpty(path))
            {
                return(null);
            }

            var objs = AssetDatabase.LoadAllAssetsAtPath(path);

            Texture2D tex = null;

            foreach (var o in objs)
            {
                if (o is Texture2D)
                {
                    tex = o as Texture2D;
                }
            }

            if (rampObj.gradients.Length == 0)
            {
                return(tex);
            }

            if (tex == null)
            {
                tex          = new Texture2D(rampObj.width, rampObj.gradients.Length, TextureFormat.RGB24, false);
                tex.wrapMode = TextureWrapMode.Clamp;
                tex.name     = "RampTexture";
                AssetDatabase.AddObjectToAsset(tex, path);
                AssetDatabase.ImportAsset(path);
            }
            else if (tex.width != rampObj.width || tex.height != rampObj.gradients.Length)
            {
                tex.Resize(rampObj.width, rampObj.gradients.Length);
            }

            var width  = tex.width;
            var height = tex.height;
            var colors = new Color[tex.width * tex.height];

            for (int y = 0; y < height; ++y)
            {
                for (int x = 0; x < width; ++x)
                {
                    colors[y * width + x] = rampObj.gradients[height - y - 1].Evaluate(1.0f * x / (width - 1));
                }
            }
            tex.SetPixels(colors);
            tex.Apply();

            EditorUtility.SetDirty(rampObj);
            return(tex);
        }
예제 #3
0
        private bool NeedsUpdate(KamakuraRampTexture ramp)
        {
            if (_cachedGradients == null)
            {
                _cachedGradients = new List <Gradient>();
                foreach (var g in ramp.gradients)
                {
                    var ng = new Gradient();
                    ng.SetKeys(g.colorKeys, g.alphaKeys);
                    _cachedGradients.Add(ng);
                }
                _width = ramp.width;
                return(true);
            }

            var changed = false;

            while (_cachedGradients.Count > ramp.gradients.Length)
            {
                _cachedGradients.RemoveAt(0);
                changed = true;
            }

            while (_cachedGradients.Count < ramp.gradients.Length)
            {
                var ng = new Gradient();
                _cachedGradients.Add(ng);
                changed = true;
            }

            if (!changed)
            {
                for (int i = 0; i < _cachedGradients.Count; ++i)
                {
                    var g       = ramp.gradients[i];
                    var xColors = g.colorKeys;
                    var xAlphas = g.alphaKeys;

                    var yColors = _cachedGradients[i].colorKeys;
                    var yAlphas = _cachedGradients[i].alphaKeys;

                    if (g.mode != _cachedGradients[i].mode)
                    {
                        changed = true; break;
                    }
                    if (xColors.Length != yColors.Length)
                    {
                        changed = true; break;
                    }
                    if (xAlphas.Length != yAlphas.Length)
                    {
                        changed = true; break;
                    }

                    for (int t = 0; t < xColors.Length; ++t)
                    {
                        if (xColors[t].color != yColors[t].color)
                        {
                            changed = true; break;
                        }
                        if (xColors[t].time != yColors[t].time)
                        {
                            changed = true; break;
                        }
                    }

                    if (changed)
                    {
                        break;
                    }

                    for (int t = 0; t < xAlphas.Length; ++t)
                    {
                        if (xAlphas[t].alpha != yAlphas[t].alpha)
                        {
                            changed = true; break;
                        }
                        if (xAlphas[t].time != yAlphas[t].time)
                        {
                            changed = true; break;
                        }
                    }

                    if (changed)
                    {
                        break;
                    }
                }
            }

            if (changed)
            {
                for (int i = 0; i < _cachedGradients.Count; ++i)
                {
                    var g = ramp.gradients[i];
                    _cachedGradients[i].mode = g.mode;
                    _cachedGradients[i].SetKeys(g.colorKeys, g.alphaKeys);
                }
            }

            if (_width != ramp.width)
            {
                _width  = ramp.width;
                changed = true;
            }

            return(changed);
        }