147 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			C#
		
	
	
	
			
		
		
	
	
			147 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			C#
		
	
	
	
| // Curved World <http://u3d.as/1W8h>
 | |
| // Copyright (c) Amazing Assets <https://amazingassets.world>
 | |
|  
 | |
| using System;
 | |
| using System.Linq;
 | |
| using System.Collections.Generic;
 | |
| 
 | |
| using UnityEngine;
 | |
| using UnityEditor;
 | |
| using UnityEditor.IMGUI.Controls;
 | |
| 
 | |
| 
 | |
| namespace AmazingAssets.CurvedWorld.Editor
 | |
| {
 | |
| 	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<object> m_OnSelectedShaderPopup;
 | |
| 
 | |
| 
 | |
| 		public ShaderSelectionDropdown(Action<object> 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<string> list = new List<string>();
 | |
| 			List<string> list2 = new List<string>();
 | |
| 			List<string> list3 = new List<string>();
 | |
| 			List<string> list4 = new List<string>();
 | |
| 			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;
 | |
| 		}
 | |
| 	}
 | |
| }
 |