using System; using System.Collections.Generic; using System.Linq; using System.Text; using UnityEngine; namespace UnityEditor.ShaderGraph { // Required for Unity to handle nested array serialization [Serializable] struct IntArray { public int[] array; public int this[int i] { get => array[i]; set => array[i] = value; } public static implicit operator IntArray(int[] array) { return new IntArray { array = array }; } public static implicit operator int[](IntArray array) { return array.array; } } [Serializable] class GraphCompilationResult { public string[] codeSnippets; public int[] sharedCodeIndices; public IntArray[] outputCodeIndices; public string GenerateCode(int[] outputIndices) { var codeIndexSet = new HashSet(); foreach (var codeIndex in sharedCodeIndices) { codeIndexSet.Add(codeIndex); } foreach (var outputIndex in outputIndices) { foreach (var codeIndex in outputCodeIndices[outputIndex].array) { codeIndexSet.Add(codeIndex); } } var codeIndices = new int[codeIndexSet.Count]; codeIndexSet.CopyTo(codeIndices); Array.Sort(codeIndices); var charCount = 0; foreach (var codeIndex in codeIndices) { charCount += codeSnippets[codeIndex].Length; } var sb = new StringBuilder(); sb.EnsureCapacity(charCount); foreach (var codeIndex in codeIndices) { sb.Append(codeSnippets[codeIndex]); } return sb.ToString(); } } }