// // Copyright (c) BovineLabs. All rights reserved. // namespace BovineLabs.Vision.Editor.ShaderGraph { using System; using System.IO; using System.Linq; using UnityEditor; using UnityEditor.Compilation; /// /// Adds our assembly to the shader graph AssemblyInfo to give us internal access. A nasty hack required for now. /// [InitializeOnLoad] public static class UpdateShaderGraphAssemblyInfo { private const string ShaderGraphAssemblyName = "Unity.ShaderGraph.Editor"; private const string AssemblyInfoName = "AssemblyInfo.cs"; // This line should refer to your own assembly private const string VisibleLine = "[assembly: InternalsVisibleTo(\"BovineLabs.Vision.Editor\")]"; static UpdateShaderGraphAssemblyInfo() { CompilationPipeline.assemblyCompilationStarted += OnAssemblyCompilationStarted; } private static void OnAssemblyCompilationStarted(string assemblyName) { var asmdef = CompilationPipeline.GetAssemblyDefinitionFilePathFromAssemblyName(assemblyName); var name = Path.GetFileNameWithoutExtension(asmdef); if (name == null || !name.Equals(ShaderGraphAssemblyName)) { return; } var directory = Path.GetDirectoryName(asmdef); var assemblyInfoPath = Path.Combine(directory ?? throw new NullReferenceException(), AssemblyInfoName); var assemblyInfo = File.ReadAllLines(assemblyInfoPath); // Already setup if (assemblyInfo.Contains(VisibleLine)) { return; } TurnOffReadOnly(assemblyInfoPath); File.AppendAllText(assemblyInfoPath, VisibleLine); } private static void TurnOffReadOnly(string file) { File.SetAttributes(file, File.GetAttributes(file) & ~FileAttributes.ReadOnly); } } }