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;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								}
							 |