Esempio n. 1
0
        void OnGUI()
        {
            if (shaders == null)
            {
                this.shaders = ShaderHelper.GetThryEditorShaderNames();
                if (Settings.activeShader != null)
                {
                    for (int i = 0; i < shaders.Length; i++)
                    {
                        if (shaders[i] == Settings.activeShader.name)
                        {
                            selectedShaderIndex = i;
                        }
                    }
                }
            }
            if (propertyBackground == null)
            {
                setupStyle();
            }
            Shader activeShader = Settings.activeShader;
            int    newIndex     = EditorGUILayout.Popup(selectedShaderIndex, shaders, GUILayout.MaxWidth(500));

            if (selectedShaderIndex == -1)
            {
                newIndex = 0;
            }
            if (newIndex != selectedShaderIndex)
            {
                selectedShaderIndex = newIndex;
                selectedPreset      = 0;
                Settings.setActiveShader(Shader.Find(shaders[selectedShaderIndex]));
                activeShader     = Settings.activeShader;
                reloadProperties = true;
            }
            if (activeShader != null)
            {
                PresetHandler presetHandler = Settings.presetHandler;
                if (presetHandler.shaderHasPresetPath())
                {
                    Dictionary <string, List <string[]> > presets = presetHandler.getPresets();
                    string[] presetStrings = new string[presets.Count + 1];
                    int      i             = 0;
                    foreach (KeyValuePair <string, List <string[]> > entry in presets)
                    {
                        presetStrings[i++] = entry.Key;
                    }
                    presetStrings[presets.Count] = "<New Preset>";
                    GUILayout.BeginHorizontal();
                    int newSelectedPreset = EditorGUILayout.Popup(selectedPreset, presetStrings, GUILayout.MaxWidth(500));
                    if (newSelectedPreset != selectedPreset || reloadProperties)
                    {
                        this.selectedPreset = newSelectedPreset;
                        if (newSelectedPreset == presetStrings.Length - 1)
                        {
                            newPreset     = true;
                            newPresetName = "<name>";
                            properties    = null;
                        }
                        else
                        {
                            this.properties = presetHandler.getPropertiesOfPreset(presetStrings[selectedPreset]);
                            List <string> unusedProperties = new List <string>();
                            foreach (string pName in presetHandler.getPropertyNames())
                            {
                                bool unused = true;
                                foreach (string[] p in this.properties)
                                {
                                    if (p[0] == pName)
                                    {
                                        unused = false;
                                    }
                                }
                                if (unused)
                                {
                                    unusedProperties.Add(pName);
                                }
                            }
                            this.unusedProperties = unusedProperties.ToArray();
                            reloadProperties      = false;
                            newPreset             = false;
                        }
                    }
                    if (GUILayout.Button("Delete", GUILayout.MaxWidth(80)))
                    {
                        presetHandler.removePreset(presetStrings[selectedPreset]);
                        reloadProperties = true;
                        Repaint();
                    }
                    GUILayout.EndHorizontal();
                    if (newPreset)
                    {
                        GUILayout.BeginHorizontal();
                        newPresetName = GUILayout.TextField(newPresetName, GUILayout.MaxWidth(150));
                        if (GUILayout.Button("Add Preset", GUILayout.MaxWidth(80)))
                        {
                            presetHandler.addNewPreset(newPresetName);
                            reloadProperties = true;
                            Repaint();
                            selectedPreset = presetStrings.Length - 1;
                        }
                        GUILayout.EndHorizontal();
                    }
                    scrollPos = GUILayout.BeginScrollView(scrollPos);
                    if (properties != null)
                    {
                        for (i = 0; i < properties.Count; i++)
                        {
                            if (i % 2 == 0)
                            {
                                GUILayout.BeginHorizontal(propertyBackground);
                            }
                            else
                            {
                                GUILayout.BeginHorizontal();
                            }
                            //properties[i][0] = GUILayout.TextField(properties[i][0], GUILayout.MaxWidth(200));
                            GUILayout.Label(properties[i][0], GUILayout.MaxWidth(150));

                            bool typeFound = false;
                            ShaderUtil.ShaderPropertyType propertyType = ShaderUtil.ShaderPropertyType.Float;
                            for (int p = 0; p < ShaderUtil.GetPropertyCount(activeShader); p++)
                            {
                                if (ShaderUtil.GetPropertyName(activeShader, p) == properties[i][0])
                                {
                                    propertyType = ShaderUtil.GetPropertyType(activeShader, p);
                                    typeFound    = true;
                                    break;
                                }
                            }
                            if (typeFound)
                            {
                                switch (propertyType)
                                {
                                case ShaderUtil.ShaderPropertyType.Color:
                                    float[] rgba = new float[4] {
                                        1, 1, 1, 1
                                    };
                                    string[] rgbaString = properties[i][1].Split(',');
                                    if (rgbaString.Length > 0)
                                    {
                                        float.TryParse(rgbaString[0], out rgba[0]);
                                    }
                                    if (rgbaString.Length > 1)
                                    {
                                        float.TryParse(rgbaString[1], out rgba[1]);
                                    }
                                    if (rgbaString.Length > 2)
                                    {
                                        float.TryParse(rgbaString[2], out rgba[2]);
                                    }
                                    if (rgbaString.Length > 3)
                                    {
                                        float.TryParse(rgbaString[3], out rgba[3]);
                                    }
                                    Color p = EditorGUI.ColorField(EditorGUILayout.GetControlRect(GUILayout.MaxWidth(204)), new GUIContent(), new Color(rgba[0], rgba[1], rgba[2], rgba[3]), true, true, true, new ColorPickerHDRConfig(0, 1000, 0, 1000));
                                    properties[i][1] = "" + p.r + "," + p.g + "," + p.b + "," + p.a;
                                    break;

                                case ShaderUtil.ShaderPropertyType.TexEnv:
                                    string[] guids   = AssetDatabase.FindAssets(properties[i][1]);
                                    Texture  texture = null;
                                    if (guids.Length > 0)
                                    {
                                        texture = AssetDatabase.LoadAssetAtPath <Texture>(AssetDatabase.GUIDToAssetPath(guids[0]));
                                    }
#pragma warning disable CS0618 // Type or member is obsolete
                                    texture = (Texture)EditorGUI.ObjectField(EditorGUILayout.GetControlRect(GUILayout.MaxWidth(100)), texture, typeof(Texture));
#pragma warning restore CS0618 // Type or member is obsolete
                                    if (texture != null)
                                    {
                                        properties[i][1] = texture.name;
                                    }
                                    GUILayout.Label("(" + properties[i][1] + ")", GUILayout.MaxWidth(100));
                                    break;

                                case ShaderUtil.ShaderPropertyType.Vector:
                                    Vector4 vector = Helper.stringToVector(properties[i][1]);
                                    vector           = EditorGUI.Vector4Field(EditorGUILayout.GetControlRect(GUILayout.MaxWidth(204)), "", vector);
                                    properties[i][1] = "" + vector.x + "," + vector.y + "," + vector.z + "," + vector.w;
                                    break;

                                default:
                                    properties[i][1] = GUILayout.TextField(properties[i][1], GUILayout.MaxWidth(204));
                                    break;
                                }
                            }
                            else
                            {
                                properties[i][1] = GUILayout.TextField(properties[i][1], GUILayout.MaxWidth(204));
                            }
                            if (GUILayout.Button("Delete", GUILayout.MaxWidth(80)))
                            {
                                properties.RemoveAt(i);
                                this.reloadProperties = true;
                                saveProperties(presetHandler, presetStrings);
                            }
                            GUILayout.EndHorizontal();
                        }
                        //new preset gui
                        GUILayout.BeginHorizontal();
                        addPropertyIndex = EditorGUILayout.Popup(addPropertyIndex, unusedProperties, GUILayout.MaxWidth(150));
                        if (GUILayout.Button("Add", GUILayout.MaxWidth(80)))
                        {
                            this.reloadProperties = true;
                            properties.Add(new string[] { unusedProperties[addPropertyIndex], "" });
                            saveProperties(presetHandler, presetStrings);
                        }
                        GUILayout.EndHorizontal();
                    }
                    GUILayout.EndScrollView();
                    if (GUILayout.Button("Save", GUILayout.MinWidth(50)))
                    {
                        saveProperties(presetHandler, presetStrings);
                    }
                    Event e = Event.current;
                    if (e.isKey)
                    {
                        if (Event.current.keyCode == (KeyCode.Return))
                        {
                            saveProperties(presetHandler, presetStrings);
                        }
                    }
                }
            }
        }
        private void OnGUI()
        {
            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(ThryEditor.PROPERTY_NAME_USING_THRY_EDITOR)))
                    {
                        string defaultShaderName = Helper.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];
                }
            }

            GUILayout.Label("With thry editor the render queue selection in the material editor creates copies of the shader with different queues to make it work in vrchat. \n With this tool you can pre create those shader files so you don't have to wait.");

            Shader activeShader = Settings.activeShader;

            if (activeShader != null)
            {
                poiShaders[0] = Helper.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]);
                Settings.setActiveShader(activeShader);
            }

            if (activeShader != null)
            {
                string defaultShaderName = Helper.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++)
                    {
                        Helper.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)
                    {
                        Helper.createRenderQueueShaderIfNotExists(defaultShader, i, false);
                    }
                    AssetDatabase.Refresh();
                }
            }
        }