using Unity.GraphAuthoring.Editor.ProviderSystem; using Unity.GraphAuthoring.Editor.ProviderSystem.Hints; using static Unity.GraphAuthoring.Editor.ProviderSystem.HintUtils; using System.Collections.Generic; namespace UnityEditor.ShaderGraph.ProviderSystem { internal class FunctionHeader : StrongHeader { internal string referenceName { get; private set; } internal string displayName { get; private set; } internal string tooltip { get; private set; } internal string returnDisplayName { get; private set; } internal string returnTooltip { get; private set; } internal IShaderType returnType { get; private set; } internal bool hasReturnValueType => returnType.Name != "void"; internal string searchName { get; private set; } internal string[] searchTerms { get; private set; } internal string searchCategory { get; private set; } internal ParameterHeader returnHeader { get; private set; } internal bool allowPrecision { get; private set; } internal string helpUrl { get; private set; } internal string version { get; private set; } internal string groupKey { get; private set; } internal string groupDropdownEntryName { get; private set; } internal string groupLabel { get; private set; } internal string[] groupSearchTerms { get; private set; } internal (IProvider provider, string label)[] groupCandidates { get; private set; } internal (IProvider provider, string version)[] versionCandidates { get; private set; } bool skipGroup = false; private void OnProcessNoGroup(IShaderFunction func, IProvider provider) { skipGroup = true; OnProcess(func, provider); skipGroup = false; } protected override void OnProcess(IShaderFunction func, IProvider provider) { referenceName = func.Name; returnType = func.ReturnType; version = provider.Version; displayName = func.Hints.GetHint()?.Value as string; tooltip = func.Hints.GetHint()?.Value as string; returnDisplayName = func.Hints.GetHint()?.Value as string; returnTooltip = func.Hints.GetHint()?.Value as string; searchName = func.Hints.GetHint()?.Value as string; searchTerms = func.Hints.GetHint()?.Value as string[]; searchCategory = func.Hints.GetHint()?.Value as string; allowPrecision = func.Hints.GetHint()?.IsResolved ?? false; helpUrl = func.Hints.GetHint()?.Value as string; if (provider.Group != null) { var groupKeyHint = func.Hints.GetHint(); groupDropdownEntryName = displayName; displayName = groupKeyHint?.DisplayName ?? provider.Group; searchName = displayName; groupLabel = groupKeyHint?.Label ?? "Variant"; List searchTerms = new(); List<(IProvider provider, string label)> groupEntries = new(); if (!skipGroup && ProviderLibrary.TryGetInstance(out var lib)) { var groupHeader = new FunctionHeader(); bool first = true; foreach (var groupProvider in lib.ProvidersByGroup(provider.Group)) { groupHeader.OnProcessNoGroup(groupProvider.Definition, groupProvider); if (first) // Main provider's information wins. { displayName = groupHeader.displayName; groupLabel = groupHeader.groupLabel; helpUrl ??= groupHeader.helpUrl; first = false; } groupEntries.Add((groupProvider, groupHeader.groupDropdownEntryName)); // aggregate search terms from all headers. searchTerms.AddRange(groupHeader.searchTerms); } groupCandidates = groupEntries.ToArray(); this.searchTerms = searchTerms.ToArray(); } else { groupEntries.Add(((IProvider)provider, groupDropdownEntryName)); } } // Version: List<(IProvider provider, string version)> rawVersions = new(); if (ProviderLibrary.TryGetInstance(out var versionLib)) { foreach(var versionedProvider in versionLib.ProvidersByVersion(provider.ProviderKey)) rawVersions.Add((versionedProvider, versionedProvider.Version)); } else { rawVersions.Add((provider as IProvider, provider.Version)); } versionCandidates = rawVersions.ToArray(); // Return: returnHeader = new ParameterHeader(returnDisplayName, func.ReturnType, returnTooltip, provider); } } }