/// <summary> /// Installs a shader extension package of the provided shader family (when available). /// </summary> public static void InstallShaderExtension(string shaderFamily) { if (!IsShaderExtensionAvailable(shaderFamily)) { Debug.LogError($"'{shaderFamily}' shader family is not available."); return; } if (IsShaderExtensionInstalled(shaderFamily)) { RemoveShaderExtension(shaderFamily); } var extensionPackage = ExtensionSources.GetShaderExtensionByFamily(shaderFamily); var packagePath = Path.Combine(PackagePath.ShaderExtensionsPath, extensionPackage.PackagePath); foreach (var file in extensionPackage.Files) { var filePath = Path.Combine(packagePath, file.FilePath); var parentDirectory = Directory.GetParent(filePath).FullName; PackagePath.CreateDirectoryAsset(parentDirectory); File.WriteAllText(filePath, file.FileContent, Encoding.UTF8); } AssetDatabase.Refresh(); UpdateShaderResources(); }
/// <summary> /// Installs a component extension package for the component of provided type (when available). /// </summary> public static void InstallComponentExtension(string extendedComponentType) { if (!IsComponentTypeSupported(extendedComponentType)) { Debug.LogError(string.Format("'{0}' type is not supported.", extendedComponentType)); return; } if (IsComponentExtensionForTypeInstalled(extendedComponentType)) { RemoveComponentExtension(extendedComponentType); } var extensionPackage = ExtensionSources.GetComponentExtensionForType(extendedComponentType); var packagePath = Path.Combine(PackagePath.ExtensionsPath, extensionPackage.PackagePath); foreach (var file in extensionPackage.Files) { var filePath = Path.Combine(packagePath, file.FilePath); var parentDirectory = Directory.GetParent(filePath).FullName; PackagePath.CreateDirectoryAsset(parentDirectory); File.WriteAllText(filePath, file.FileContent, Encoding.UTF8); } AssetDatabase.Refresh(); }
/// <summary> /// Loads the asset using <see cref="PackagePath.ExtensionSourcesAssetPath"/>. /// Will create the asset if it doesn't exist. /// </summary> public static ExtensionSources Load() { var assetPath = PackagePath.ExtensionSourcesAssetPath; var relativeAssetPath = PackagePath.ToAssetsPath(assetPath); if (!File.Exists(assetPath)) { var extensionSources = CreateInstance <ExtensionSources>(); PackagePath.CreateDirectoryAsset(Path.GetDirectoryName(assetPath)); AssetDatabase.CreateAsset(extensionSources, relativeAssetPath); AssetDatabase.SaveAssets(); return(extensionSources); } else { return(AssetDatabase.LoadAssetAtPath <ExtensionSources>(relativeAssetPath)); } }
/// <summary> /// Adds references to all the currently installed shader extensions to the <see cref="ShaderResources"/> asset. /// Will create the resources asset if it doesn't exist. /// </summary> public static void UpdateShaderResources() { ShaderResources resources; if (!File.Exists(PackagePath.ShaderResourcesAssetPath)) { resources = ScriptableObject.CreateInstance <ShaderResources>(); PackagePath.CreateDirectoryAsset(Path.GetDirectoryName(PackagePath.ShaderResourcesAssetPath)); AssetDatabase.CreateAsset(resources, PackagePath.ToAssetsPath(PackagePath.ShaderResourcesAssetPath)); AssetDatabase.SaveAssets(); } else { resources = ShaderResources.Load(); } resources.RemoveAllShaders(); var shaderPaths = Directory.GetFiles(PackagePath.ShaderExtensionsPath, "*.shader", SearchOption.AllDirectories).ToList(); foreach (var additionalPath in resources.GetAdditionalPaths()) { var fullPath = Path.GetFullPath(additionalPath); if (!Directory.Exists(fullPath)) { continue; } shaderPaths.AddRange(Directory.GetFiles(fullPath, "*.shader", SearchOption.AllDirectories)); } foreach (var shaderPath in shaderPaths) { var relativeShaderPath = PackagePath.ToAssetsPath(shaderPath); var shader = AssetDatabase.LoadAssetAtPath <Shader>(relativeShaderPath); if (IsValidShader(shader)) { resources.AddShader(shader); } } EditorUtility.SetDirty(resources); AssetDatabase.SaveAssets(); }