using System.Collections; using System.Collections.Generic; using System.IO; using Unity.VisualScripting.TextureAssets; using UnityEngine; namespace Unity.VisualScripting { internal sealed class EmbeddedResourceProvider : IResourceProvider { internal const string VISUAL_SCRIPTING_PACKAGE = "com.unity.visualscripting"; private static readonly Dictionary cache = new Dictionary(); private readonly HashSet cachedResources = new HashSet(); public EmbeddedResourceProvider() { cache.Clear(); } internal static Texture2D LoadFromMemoryResources(string name) { if (!name.StartsWith(VISUAL_SCRIPTING_PACKAGE)) { name = $"{VISUAL_SCRIPTING_PACKAGE}.{name}"; } if (cache.Count == 0) { Texture2D[] arrayOfTexture2D = Resources.FindObjectsOfTypeAll(); foreach (Texture2D asset in arrayOfTexture2D) { if (asset.name.StartsWith(VISUAL_SCRIPTING_PACKAGE)) { cache[asset.name] = asset; } } } Texture2D texture2D; cache.TryGetValue(name, out texture2D); return texture2D; } public IEnumerable GetAllFiles() { return ResourceLoader.ListAllResources(); } public IEnumerable GetFiles(string path) { throw new System.NotImplementedException(); } public IEnumerable GetDirectories(string path) { throw new System.NotImplementedException(); } string IResourceProvider.GetPersonalPath(string path, float width) { var name = Path.GetFileNameWithoutExtension(path).PartBefore('@'); var extension = Path.GetExtension(path); var directory = Path.GetDirectoryName(path); return $"{name}@{width}x{extension}"; } public string GetProfessionalPath(string path, float width) { var name = Path.GetFileNameWithoutExtension(path).PartBefore('@'); var extension = Path.GetExtension(path); return $"{name}_Pro@{width}x{extension}"; } public bool FileExists(string path) { if (cachedResources.Count == 0) foreach (string resource in ResourceLoader.ListAllResources()) cachedResources.Add(resource.Trim()); return cachedResources.Contains(ResourceLoader.NormalizerPath(path).Trim()); } public bool DirectoryExists(string path) { throw new System.NotImplementedException(); } public string DebugPath(string path) { return path; } /// /// Create 1x1 pixel texture of specified color. /// /// Name for texture object. /// Pixel color. /// /// The new Texture2D instance. /// internal static Texture2D CreatePixelTexture(string name, Color color, int width, int height) { if (!name.StartsWith(VISUAL_SCRIPTING_PACKAGE)) { name = $"{VISUAL_SCRIPTING_PACKAGE}.{name}"; } Texture2D texture2D = LoadFromMemoryResources(name); if (texture2D == null) { texture2D = new Texture2D(width, height, TextureFormat.ARGB32, false, LudiqGUIUtility.createLinearTextures); texture2D.name = name; texture2D.hideFlags = HideFlags.HideAndDontSave; texture2D.filterMode = FilterMode.Point; texture2D.SetPixel(0, 0, color); texture2D.Apply(); cache[name] = texture2D; } return texture2D; } public T LoadAsset(string path) where T : Object { throw new System.NotImplementedException(); } public Texture2D LoadTexture(string path, CreateTextureOptions options) { path = ResourceLoader.NormalizerPath(path); string name = $"{VISUAL_SCRIPTING_PACKAGE}.{path}"; Texture2D texture = LoadFromMemoryResources(name); if (texture == null) { byte[] textureData = ResourceLoader.LoadTexture(path); texture = new Texture2D(0, 0); texture.name = name; texture.alphaIsTransparency = options.alphaIsTransparency; texture.filterMode = options.filterMode; texture.hideFlags = options.hideFlags; texture.LoadImage(textureData); cache[name] = texture; } return texture; } } }