public static PoiSettings getInstance() { PoiSettings instance = (PoiSettings)PoiHelper.FindEditorWindow(typeof(PoiSettings)); if (instance == null) { instance = ScriptableObject.CreateInstance <PoiSettings>(); } return(instance); }
//-------------Functions------------------ public static void UpdateRenderQueue(Material material, Shader defaultShader) { if (material.shader.renderQueue != material.renderQueue) { Shader renderQueueShader = defaultShader; if (material.renderQueue != renderQueueShader.renderQueue) { renderQueueShader = PoiHelper.createRenderQueueShaderIfNotExists(defaultShader, material.renderQueue, true); } material.shader = renderQueueShader; } }
//-------------Init functions-------------------- //finds all properties and headers and stores them in correct order private void CollectAllProperties(MaterialProperty[] props, MaterialEditor materialEditor) { shaderparts = new ShaderHeader(); Stack <ShaderHeader> headerStack = new Stack <ShaderHeader>(); headerStack.Push(shaderparts); headerStack.Push(shaderparts); footer = new List <string>(); textureFieldsCount = 0; int headerCount = 0; for (int i = 0; i < props.Length; i++) { if (props[i].name.StartsWith("m_end") && props[i].flags == MaterialProperty.PropFlags.HideInInspector) { headerStack.Pop(); headerCount--; } else if (props[i].name.StartsWith("m_start") && props[i].flags == MaterialProperty.PropFlags.HideInInspector) { headerCount++; ShaderHeader newHeader = new ShaderHeader(props[i], materialEditor, headerCount); headerStack.Peek().addPart(newHeader); headerStack.Push(newHeader); } else if (props[i].name.StartsWith("m_") && props[i].flags == MaterialProperty.PropFlags.HideInInspector) { ShaderHeader newHeader = new ShaderHeader(props[i], materialEditor, headerCount); headerStack.Pop(); headerStack.Peek().addPart(newHeader); headerStack.Push(newHeader); } else if (props[i].name.StartsWith("footer_") && props[i].flags == MaterialProperty.PropFlags.HideInInspector) { footer.Add(props[i].displayName); } else if (props[i].flags != MaterialProperty.PropFlags.HideInInspector) { int extraOffset = 0; extraOffset = PoiHelper.propertyOptionToInt(EXTRA_OFFSET_OPTION, props[i]); string displayName = props[i].displayName.Replace("-" + EXTRA_OFFSET_OPTION + "=" + extraOffset, ""); ShaderProperty newPorperty = new ShaderProperty(props[i], displayName, headerCount + extraOffset); headerStack.Peek().addPart(newPorperty); if (props[i].type == MaterialProperty.PropType.Texture) { textureFieldsCount++; } } } }
public static void saveAllPoiMaterials() { StreamWriter writer = new StreamWriter(POI_MATERIALS_FILE_PATH, false); string[] materialGuids = AssetDatabase.FindAssets("t:material"); foreach (string mG in materialGuids) { Material material = AssetDatabase.LoadAssetAtPath <Material>(AssetDatabase.GUIDToAssetPath(mG)); if (material.HasProperty(Shader.PropertyToID("shader_eable_poi_settings_selection"))) { writer.WriteLine(mG + ":" + PoiHelper.getDefaultShaderName(material.shader.name) + ":" + material.renderQueue); } } writer.Close(); }
void OnGUI() { scrollPos = GUILayout.BeginScrollView(scrollPos); GUILayout.Label("Config", EditorStyles.boldLabel); config = PoiHelper.GetConfig(); if (GUILayout.Toggle(config.bigTextures, "Big Texture Fields") != config.bigTextures) { config.bigTextures = !config.bigTextures; config.save(); PoiHelper.RepaintAllMaterialEditors(); } if (GUILayout.Toggle(config.useRenderQueueSelection, "Use Render Queue Selection") != config.useRenderQueueSelection) { config.useRenderQueueSelection = !config.useRenderQueueSelection; config.save(); PoiHelper.RepaintAllMaterialEditors(); } drawLine(); if (poiShaders == null || reload) { string[] shaderGuids = AssetDatabase.FindAssets("t:shader"); List <string> poiShaders = new List <string>(); foreach (string g in shaderGuids) { Shader shader = AssetDatabase.LoadAssetAtPath <Shader>(AssetDatabase.GUIDToAssetPath(g)); Material m = new Material(shader); if (m.HasProperty(Shader.PropertyToID("shader_eable_poi_settings_selection"))) { string defaultShaderName = PoiHelper.getDefaultShaderName(shader.name); if (!poiShaders.Contains(defaultShaderName)) { poiShaders.Add(defaultShaderName); } } } this.poiShaders = new string[poiShaders.Count + 1]; for (int i = 0; i < poiShaders.Count; i++) { this.poiShaders[i + 1] = poiShaders[i]; } } if (GUILayout.Button("Backup Poi Materials", GUILayout.MaxWidth(150))) { PoiHelper.saveAllPoiMaterials(); } if (GUILayout.Button("Restore Poi Materials", GUILayout.MaxWidth(150))) { PoiHelper.restorePoiMaterials(); } drawLine(); if (activeShader != null) { poiShaders[0] = PoiHelper.getDefaultShaderName(activeShader.name); } else { poiShaders[0] = "None"; } int newSelectShader = EditorGUILayout.Popup(0, poiShaders, GUILayout.MaxWidth(200)); if (newSelectShader != selectedShader) { selectedShader = newSelectShader; activeShader = Shader.Find(poiShaders[newSelectShader]); presetHandler = new PoiPresetHandler(activeShader); } if (reload) { presetHandler = new PoiPresetHandler(activeShader); } if (activeShader != null) { string defaultShaderName = PoiHelper.getDefaultShaderName(activeShader.name);; Shader defaultShader = Shader.Find(defaultShaderName); GUIStyle style = new GUIStyle(GUI.skin.label); style.richText = true; EditorGUILayout.LabelField("<size=16>" + defaultShaderName + "</size>", style, GUILayout.MinHeight(18)); GUILayout.Label("Generate Render Queue Shaders", EditorStyles.boldLabel); GUILayout.BeginHorizontal(); if (GUILayout.Button("Generate All Queues", GUILayout.MaxWidth(200))) { for (int i = createShadersFrom; i <= createShadersTo; i++) { PoiHelper.createRenderQueueShaderIfNotExists(defaultShader, i, false); } AssetDatabase.Refresh(); } GUILayout.Label("from", GUILayout.MaxWidth(30)); createShadersFrom = EditorGUILayout.IntField(createShadersFrom, GUILayout.MaxWidth(50)); GUILayout.Label("to", GUILayout.MaxWidth(15)); createShadersTo = EditorGUILayout.IntField(createShadersTo, GUILayout.MaxWidth(50)); GUILayout.EndHorizontal(); if (GUILayout.Button("Generate most common Queues", GUILayout.MaxWidth(200))) { foreach (int i in COMMON_QUEUES) { PoiHelper.createRenderQueueShaderIfNotExists(defaultShader, i, false); } AssetDatabase.Refresh(); } if (presetHandler != null) { presetHandler.drawPresetsSettings(); } } GUILayout.EndScrollView(); reload = false; if (GUILayout.Button("ReLoad")) { reload = true; } }
//-------------Main Function-------------- public override void OnGUI(MaterialEditor materialEditor, MaterialProperty[] props) { PoiHelper.updateQueueShadersIfNessecary(); Object[] targets = materialEditor.targets; Material[] materials = new Material[targets.Length]; for (int i = 0; i < targets.Length; i++) { materials[i] = targets[i] as Material; } config = PoiHelper.GetConfig(); if (presetHandler == null) { presetHandler = new PoiPresetHandler(props); } else { presetHandler.testPresetsChanged(props); } SetupStyle(); CollectAllProperties(props, materialEditor); // load default toggle values LoadDefaults(materials[0]); //shader name + presets EditorGUILayout.BeginHorizontal(); byte[] fileData = File.ReadAllBytes(AssetDatabase.GUIDToAssetPath(AssetDatabase.FindAssets("poiSettigsIcon")[0])); Texture2D tex = new Texture2D(2, 2); tex.LoadImage(fileData); if (GUILayout.Button(tex, new GUILayoutOption[] { GUILayout.MaxWidth(24), GUILayout.MaxHeight(18) })) { sendActiveShader = true; PoiSettings window = PoiSettings.getInstance(); window.Show(); window.Focus(); } MaterialProperty shader_master_label = FindProperty(props, "shader_master_label"); if (shader_master_label != null) { DrawMasterLabel(shader_master_label.displayName); } presetHandler.drawPresets(props, materials); EditorGUILayout.EndHorizontal(); //shader properties foreach (ShaderPart part in shaderparts.parts) { drawShaderPart(part, materialEditor); } Shader shader = materials[0].shader; string defaultShaderName = materials[0].shader.name.Split(new string[] { "-queue" }, System.StringSplitOptions.None)[0].Replace(".differentQueues/", ""); Shader defaultShader = Shader.Find(defaultShaderName); //Render Queue if (config.useRenderQueueSelection) { drawRenderQueueSelector(materials[0], defaultShader); EditorGUILayout.LabelField("Default: " + defaultShaderName); EditorGUILayout.LabelField("Shader: " + shader.name); } ToggleDefines(materials[0]); //big/small texture toggle /*if (textureFieldsCount > 0) { * if(EditorGUILayout.Toggle("Big Texture Fields", config.bigTextures) != config.bigTextures) * { * config.bigTextures = !config.bigTextures; * config.save(); * } * }*/ //footer EditorGUILayout.BeginHorizontal(); GUILayout.FlexibleSpace(); GUILayout.Space(2); foreach (string footNote in footer) { string[] splitNote = footNote.TrimEnd(')').Split("(".ToCharArray(), 2); string value = splitNote[1]; string type = splitNote[0]; if (type == "linkButton") { string[] values = value.Split(",".ToCharArray()); drawLinkButton(70, 20, values[0], values[1]); } GUILayout.Space(2); } GUILayout.FlexibleSpace(); EditorGUILayout.EndHorizontal(); if (!config.useRenderQueueSelection) { materials[0].renderQueue = defaultShader.renderQueue; } UpdateRenderQueue(materials[0], defaultShader); if (sendActiveShader) { PoiSettings.activeShader = defaultShader; PoiSettings.presetHandler = presetHandler; EditorWindow win = PoiHelper.FindEditorWindow(typeof(PoiSettings)); if (win != null) { win.Repaint(); } sendActiveShader = false; } }