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<string, Texture2D> cache = new Dictionary<string, Texture2D>();
private readonly HashSet<string> cachedResources = new HashSet<string>();
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<Texture2D>();
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<string> GetAllFiles()
{
return ResourceLoader.ListAllResources();
}
public IEnumerable<string> GetFiles(string path)
{
throw new System.NotImplementedException();
}
public IEnumerable<string> 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;
}
/// <summary>
/// Create 1x1 pixel texture of specified color.
/// </summary>
/// <param name="name">Name for texture object.</param>
/// <param name="color">Pixel color.</param>
/// <returns>
/// The new <c>Texture2D</c> instance.
/// </returns>
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<T>(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;
}
}
}