using System; using System.Linq; using System.Collections.Generic; using UnityEngine; using UnityEditor; using UnityEditor.IMGUI.Controls; namespace AmazingAssets.CurvedWorldEditor { internal class ShaderSelectionDropdown : AdvancedDropdown { private class ShaderDropdownItem : AdvancedDropdownItem { private string m_FullName; private string m_Prefix; public string fullName => m_FullName; public string prefix => m_Prefix; public ShaderDropdownItem(string prefix, string fullName, string shaderName) : base(shaderName) { m_FullName = fullName; m_Prefix = prefix; base.id = (prefix + fullName + shaderName).GetHashCode(); } } private Action m_OnSelectedShaderPopup; public ShaderSelectionDropdown(Action onSelectedShaderPopup) : base(new AdvancedDropdownState()) { base.minimumSize = new Vector2(270f, 308f); m_OnSelectedShaderPopup = onSelectedShaderPopup; } protected override AdvancedDropdownItem BuildRoot() { AdvancedDropdownItem root = new AdvancedDropdownItem("Shaders"); ShaderInfo[] allShaderInfo = ShaderUtil.GetAllShaderInfo(); List list = new List(); List list2 = new List(); List list3 = new List(); List list4 = new List(); ShaderInfo[] array = allShaderInfo; for (int i = 0; i < array.Length; i++) { ShaderInfo shaderInfo = array[i]; if (!shaderInfo.name.StartsWith("Deprecated") && !shaderInfo.name.StartsWith("Hidden")) { if (shaderInfo.hasErrors) { list4.Add(shaderInfo.name); } else if (!shaderInfo.supported) { list3.Add(shaderInfo.name); } else if (shaderInfo.name.StartsWith("Legacy Shaders/")) { list2.Add(shaderInfo.name); } else { list.Add(shaderInfo.name); } } } list.Sort(delegate (string s1, string s2) { int num = s2.Count((char c) => c == '/') - s1.Count((char c) => c == '/'); if (num == 0) { num = s1.CompareTo(s2); } return num; }); list2.Sort(); list3.Sort(); list4.Sort(); list.ForEach(delegate (string s) { AddShaderToMenu("", root, s, s); }); if (list2.Any() || list3.Any() || list4.Any()) { root.AddSeparator(); } list2.ForEach(delegate (string s) { AddShaderToMenu("", root, s, s); }); list3.ForEach(delegate (string s) { AddShaderToMenu("Not supported/", root, s, "Not supported/" + s); }); list4.ForEach(delegate (string s) { AddShaderToMenu("Failed to compile/", root, s, "Failed to compile/" + s); }); return root; } protected override void ItemSelected(AdvancedDropdownItem item) { m_OnSelectedShaderPopup(((ShaderDropdownItem)item).fullName); } private void AddShaderToMenu(string prefix, AdvancedDropdownItem parent, string fullShaderName, string shaderName) { string[] array = shaderName.Split('/'); if (array.Length > 1) { AddShaderToMenu(prefix, FindOrCreateChild(parent, shaderName), fullShaderName, shaderName.Substring(array[0].Length + 1)); return; } ShaderDropdownItem shaderDropdownItem = new ShaderDropdownItem(prefix, fullShaderName, shaderName); parent.AddChild(shaderDropdownItem); } private AdvancedDropdownItem FindOrCreateChild(AdvancedDropdownItem parent, string path) { string[] array = path.Split('/'); string text = array[0]; foreach (AdvancedDropdownItem child in parent.children) { if (child.name == text) { return child; } } AdvancedDropdownItem advancedDropdownItem = new AdvancedDropdownItem(text); parent.AddChild(advancedDropdownItem); return advancedDropdownItem; } } }