Exemplo n.º 1
0
        public void OnPreprocessTexture()
        {
            TextureImporter importer = (TextureImporter)this.assetImporter;

            if (importer.assetPath.ContainsAny("Themes", "@Themes"))
            {
                ColorImportSettings.Apply(importer);
            }
        }
Exemplo n.º 2
0
        public void ApplyTexture(string path, Texture2D texture)
        {
            var empty = false;

            Worker.MainThread(() => empty = texture.IsNull());
            if (empty)
            {
                return;
            }
            var name        = path.GetPathTerm().TrimLeft("#");
            var ignoreAlpha = name.StartsWith("A-");
            var isSplat     = name.StartsWith("!");
            var parts       = name.TrimLeft("!", "A-").Split("-");

            if (isSplat && parts.Length < 2)
            {
                Log.Warning("[ThemePalette] : Improperly formed splat texture -- " + path.GetPathTerm());
                return;
            }
            var colorA = isSplat ? this.ParseColor(parts[0]) : Color.clear;
            var colorB = isSplat ? this.ParseColor(parts[1]) : Color.clear;
            var colorC = isSplat ? this.ParseColor(parts[2]) : Color.clear;

            if (isSplat)
            {
                parts = parts.Skip(3).ToArray();
            }
            name = parts.Join("-");
            bool      changes       = false;
            Texture2D originalImage = null;
            var       originalPath  = path.GetDirectory().GetDirectory() + "/" + name;
            var       pixels        = new Color[0];
            Action    method        = () => {
                originalImage = File.GetAsset <Texture2D>(originalPath, false);
                if (originalImage.IsNull() && !originalPath.ContainsAny("Themes", "@Themes"))
                {
                    originalImage = File.GetAsset <Texture2D>(name, false);
                }
                pixels = texture.GetPixels();
                if (originalImage.IsNull() || pixels.Length != originalImage.GetPixels().Length)
                {
                    Log.Show("[TexturePalette] : Generating source for index/splat -- " + originalPath.GetPathTerm());
                    texture.SaveAs(originalPath);
                    var assetPath = originalPath.GetAssetPath();
                    ProxyEditor.ImportAsset(assetPath);
                    var importer = TextureImporter.GetAtPath(assetPath).As <TextureImporter>();
                    ColorImportSettings.Apply(importer);
                    importer.SaveAndReimport();
                    originalImage = File.GetAsset <Texture2D>(originalPath, false);
                }
                originalPath = originalImage.GetAssetPath();
                if (Theme.debug && originalImage.format != TextureFormat.RGBA32)
                {
                    Log.Show("[ThemePalette] Original image is not an RGBA32 texture -- " + originalPath);
                }
            };

            Worker.MainThread(method);
            if (Theme.debug && pixels.Length > 65536)
            {
                Log.Warning("[ThemePalette] Dynamic image has over 65K pixels. Performance can be affected -- " + name);
            }
            var swapKeys       = this.swap.Keys.ToArray();
            var originalPixels = pixels.Copy();

            for (int index = 0; index < pixels.Length; ++index)
            {
                var pixel = pixels[index];
                if (isSplat)
                {
                    var emptyRed    = pixel.r == 0 || colorA.a == 0;
                    var emptyGreen  = pixel.g == 0 || colorB.a == 0;
                    var emptyBlue   = pixel.b == 0 || colorC.a == 0;
                    var colorAStart = emptyGreen && emptyBlue?colorA.SetAlpha(0) : Color.clear;

                    var colorBStart = emptyRed && emptyBlue?colorB.SetAlpha(0) : Color.clear;

                    var colorCStart = emptyRed && emptyGreen?colorC.SetAlpha(0) : Color.clear;

                    var splatA     = colorAStart.Lerp(colorA, pixel.r);
                    var splatB     = colorBStart.Lerp(colorB, pixel.g);
                    var splatC     = colorCStart.Lerp(colorC, pixel.b);
                    var pixelColor = splatA + splatB + splatC;
                    pixelColor.a *= pixel.a;
                    if (originalPixels[index] != pixelColor)
                    {
                        originalPixels[index] = pixelColor;
                        changes = true;
                    }
                    continue;
                }
                for (int swapIndex = 0; swapIndex < swapKeys.Length; ++swapIndex)
                {
                    var swapColor = swapKeys[swapIndex];
                    if (pixel.Matches(swapColor, false))
                    {
                        var color = this.swap[swapColor].value;
                        color.a = ignoreAlpha ? pixel.a : color.a * pixel.a;
                        if (originalPixels[index] != color)
                        {
                            originalPixels[index] = color;
                            changes = true;
                        }
                    }
                }
            }
            if (changes)
            {
                method = () => {
                    originalImage.SetPixels(originalPixels);
                    originalImage.Apply();
                };
                Worker.MainThread(method);
            }
        }