using System; using System.IO; using System.Reflection; using UnityEditor; using UnityEngine; namespace Unity.VisualScripting { public static class IconExportUtility { #if VISUAL_SCRIPT_INTERNAL [MenuItem("Tools/Bolt/Internal/Export Type Icon...", priority = LudiqProduct.DeveloperToolsMenuPriority + 302)] #endif public static void ExportTypeIcon() { var size = 16; var type = typeof(Animator); var restoreSize = EditorGUIUtility.GetIconSize(); EditorGUIUtility.SetIconSize(new Vector2(size, size)); var icon = type.Icon()[size]; icon.filterMode = FilterMode.Point; var rt = RenderTexture.GetTemporary(icon.width, icon.height); rt.filterMode = FilterMode.Point; RenderTexture.active = rt; Graphics.Blit(icon, rt); var readableIcon = new Texture2D(icon.width, icon.height); readableIcon.ReadPixels(new Rect(0, 0, icon.width, icon.height), 0, 0); readableIcon.Apply(); RenderTexture.active = null; icon = readableIcon; File.WriteAllBytes($"{Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), type.CSharpFileName(false))}@{size}x.png", icon.EncodeToPNG()); EditorGUIUtility.SetIconSize(restoreSize); } #if VISUAL_SCRIPT_INTERNAL [MenuItem("Tools/Bolt/Internal/Export Message Icon...", priority = LudiqProduct.DeveloperToolsMenuPriority + 302)] #endif public static void ExportMessageIcon() { var size = 16; var type = MessageType.Warning; var restoreSize = EditorGUIUtility.GetIconSize(); EditorGUIUtility.SetIconSize(new Vector2(size, size)); var icon = LudiqGUIUtility.GetHelpIcon(type); icon.filterMode = FilterMode.Point; var rt = RenderTexture.GetTemporary(icon.width, icon.height); rt.filterMode = FilterMode.Point; RenderTexture.active = rt; Graphics.Blit(icon, rt); var readableIcon = new Texture2D(icon.width, icon.height); readableIcon.ReadPixels(new Rect(0, 0, icon.width, icon.height), 0, 0); readableIcon.Apply(); RenderTexture.active = null; icon = readableIcon; File.WriteAllBytes($"{Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), type.ToString())}@{size}x.png", icon.EncodeToPNG()); EditorGUIUtility.SetIconSize(restoreSize); } private static Texture2D CreateReadableCopy(Texture2D source) { RenderTexture rt = RenderTexture.GetTemporary( source.width, source.height, 0, RenderTextureFormat.Default, RenderTextureReadWrite.Linear); Graphics.Blit(source, rt); RenderTexture previous = RenderTexture.active; RenderTexture.active = rt; Texture2D readableText = new Texture2D(source.width, source.height); readableText.ReadPixels(new Rect(0, 0, rt.width, rt.height), 0, 0); readableText.Apply(); RenderTexture.active = previous; RenderTexture.ReleaseTemporary(rt); return readableText; } #if VISUAL_SCRIPT_INTERNAL [MenuItem("Tools/Bolt/Internal/Export All Editor Icons...", priority = LudiqProduct.DeveloperToolsMenuPriority + 302)] #endif public static void ExportAllEditorIcon() { var assetBundle = typeof(EditorGUIUtility).GetMethod("GetEditorAssetBundle", BindingFlags.Static | BindingFlags.NonPublic) .Invoke(null, null) as AssetBundle; var outputFolder = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "EditorTextures"); PathUtility.CreateDirectoryIfNeeded(outputFolder); var textures = assetBundle.LoadAllAssets(); try { for (int i = 0; i < textures.Length; i++) { var texture = textures[i]; try { ProgressUtility.DisplayProgressBar("Export Editor Textures", texture.name, (float)i / textures.Length); var outputPath = Path.Combine(outputFolder, texture.name + ".png"); File.WriteAllBytes(outputPath, CreateReadableCopy(texture).EncodeToPNG()); } catch (Exception ex) { Debug.LogError($"Failed to export {texture.name}:\n{ex}"); } } } finally { ProgressUtility.ClearProgressBar(); } } } }