public static ExtendShaderGUI Get(MaterialEditor editor)
 {
     if (editor.customShaderGUI != null && editor.customShaderGUI is ExtendShaderGUI)
     {
         ExtendShaderGUI gui = editor.customShaderGUI as ExtendShaderGUI;
         return(gui);
     }
     else
     {
         Debug.LogWarning("Please add \'CustomEditor \"ExtendShaderGUI\"\' in your shader!");
         return(null);
     }
 }
    private bool NeedShow(MaterialEditor editor)
    {
        for (int i = 0; i < targets.Length; i++)
        {
            string target   = targets[i];
            float  value    = values[i];
            var    property = ExtendShaderGUI.Get(editor)?.FindProperty(target);
            if (property == null)
            {
                return(false);
            }

            bool result = false;
            switch (property.type)
            {
            case MaterialProperty.PropType.Color:
                result = property.colorValue == new Color(value, value, value, value); break;

            case MaterialProperty.PropType.Vector:
                result = property.vectorValue == new Vector4(value, value, value, value); break;

            case MaterialProperty.PropType.Float:
            case MaterialProperty.PropType.Range:
                result = property.floatValue == value; break;

            case MaterialProperty.PropType.Texture:
                result = property.textureValue != null; break;
            }
            if (!invent)
            {
                if (!result)
                {
                    return(false);
                }
            }
            else
            {
                if (result)
                {
                    return(false);
                }
            }
        }
        return(true);
    }
    public override void OnGUI(Rect p, MaterialProperty prop, GUIContent label, MaterialEditor editor)
    {
        var p0 = params2 != null?ExtendShaderGUI.Get(editor)?.FindProperty(params2) : null;

        var p1 = ExtendShaderGUI.Get(editor)?.FindProperty(property1);
        var p2 = ExtendShaderGUI.Get(editor)?.FindProperty(property2);
        var p3 = ExtendShaderGUI.Get(editor)?.FindProperty(property3);

        EditorGUIUtility.labelWidth = 0;
        EditorGUI.indentLevel++;
        fold = EditorGUILayout.BeginFoldoutHeaderGroup(fold, label.text);
        if (fold)
        {
            EditorGUI.BeginChangeCheck();
            Vector3 v1 = new Vector3();
            Vector3 v2 = new Vector3();
            v1.x = EditorGUILayout.Slider("色相", prop.vectorValue.x, -180f, 180f);
            v1.y = EditorGUILayout.Slider("饱和", prop.vectorValue.y, 0, 2);
            v1.z = EditorGUILayout.Slider("明度", prop.vectorValue.z, 0, 2);
            if (p0 != null)
            {
                v2.x = EditorGUILayout.Slider("青 - 红", p0.vectorValue.x, -1f, 1f);
                v2.y = EditorGUILayout.Slider("洋 - 绿", p0.vectorValue.y, -1f, 1f);
                v2.z = EditorGUILayout.Slider("黄 - 蓝", p0.vectorValue.z, -1f, 1f);
            }
            EditorGUILayout.EndFoldoutHeaderGroup();
            if (EditorGUI.EndChangeCheck())
            {
                prop.vectorValue = v1;
                float h   = v1[0];
                float s   = v1[1];
                float v   = v1[2];
                float vsu = v * s * Mathf.Cos(h * Mathf.PI / 180f);
                float vsw = v * s * Mathf.Sin(h * Mathf.PI / 180f);

                Matrix4x4 hsv = new Matrix4x4(
                    new Vector4(.299f * v + .701f * vsu + .168f * vsw,
                                .587f * v - .587f * vsu + .330f * vsw,
                                .114f * v - .114f * vsu - .497f * vsw, 0),
                    new Vector4(.299f * v - .299f * vsu - .328f * vsw,
                                +.587f * v + .413f * vsu + .035f * vsw,
                                +.114f * v - .114f * vsu + .292f * vsw, 0),
                    new Vector4(.299f * v - .300f * vsu + 1.25f * vsw,
                                +.587f * v - .588f * vsu - 1.05f * vsw,
                                +.114f * v + .886f * vsu - .203f * vsw, 0),
                    new Vector4(0, 0, 0, 1));

                if (p0 != null)
                {
                    p0.vectorValue = v2;
                    float     r       = v2.x;
                    float     g       = v2.y;
                    float     b       = v2.z;
                    Matrix4x4 balance = new Matrix4x4(
                        new Vector4(1 - r, r * 0.5f, r * 0.5f, 0),
                        new Vector4(g * 0.5f, 1 - g, g * 0.5f, 0),
                        new Vector4(b * 0.5f, b * 0.5f, 1 - b, 0),
                        new Vector4(0, 0, 0, 1));
                    hsv = balance * hsv;
                }
                p1.vectorValue = hsv.GetColumn(0);
                p2.vectorValue = hsv.GetColumn(1);
                p3.vectorValue = hsv.GetColumn(2);
            }
        }
        EditorGUI.indentLevel--;
    }