public void OnPreprocessTexture() { TextureImporter importer = (TextureImporter)this.assetImporter; if (importer.assetPath.ContainsAny("Themes", "@Themes")) { ColorImportSettings.Apply(importer); } }
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); } }