public MaterialPropPopup(MaterialOverrideAsset overrideAsset, SerializedObject serializedObject)
 {
     _overrideAsset        = overrideAsset;
     _serializedObject     = serializedObject;
     _generatedScriptPaths = new List <string>();
     propertyListChanged   = false;
 }
    public override void OnInspectorGUI()
    {
        serializedObject.Update();
        DrawDefaultInspector();

        MaterialOverride overrideComponent = (target as MaterialOverride);

        if (overrideComponent != null)
        {
            MaterialOverrideAsset overrideAsset = overrideComponent.overrideAsset;
            if (overrideAsset != null)
            {
                SerializedObject assetObj = new SerializedObject(overrideAsset);

                assetObj.Update();

                //TODO(atheisen): this just provides a way to edit the asset from the gameobject for convenience. we might actually want assets to be overridable as well
                SerializedProperty overrideListProp = assetObj.FindProperty("overrideList");
                for (int i = 0; i < overrideListProp.arraySize; i++)
                {
                    SerializedProperty overrideProp = overrideListProp.GetArrayElementAtIndex(i);
                    string             strName      = overrideProp.FindPropertyRelative("name").stringValue;
                    ShaderPropertyType type         = (ShaderPropertyType)overrideProp.FindPropertyRelative("type").intValue;

                    switch (type)
                    {
                    case (ShaderPropertyType.Color):
                    {
                        SerializedProperty colorProp = overrideProp.FindPropertyRelative("colorValue");
                        EditorGUILayout.PropertyField(colorProp, new GUIContent(strName));
                        break;
                    }

                    case (ShaderPropertyType.Vector):
                    {
                        SerializedProperty vector4Prop = overrideProp.FindPropertyRelative("vector4Value");
                        EditorGUILayout.PropertyField(vector4Prop, new GUIContent(strName));
                        break;
                    }

                    case (ShaderPropertyType.Float):
                    {
                        SerializedProperty floatProp = overrideProp.FindPropertyRelative("floatValue");
                        EditorGUILayout.PropertyField(floatProp, new GUIContent(strName));
                        break;
                    }

                    default:
                    {
                        Debug.Log("Property " + strName + " is of unsupported type " + type + " for material override.");
                        break;
                    }
                    }
                }

                assetObj.ApplyModifiedProperties();
            }
        }

        serializedObject.ApplyModifiedProperties();
    }
    public override void OnInspectorGUI()
    {
        serializedObject.Update();

        MaterialOverrideAsset overrideAsset = (target as MaterialOverrideAsset);
        Material currentMat = overrideAsset.material;

        bool dirtyGameObjects = false;

        EditorGUI.BeginChangeCheck();

        EditorGUILayout.PropertyField(serializedObject.FindProperty("material"), new GUIContent("Material"));

        SerializedProperty overrideListProp = serializedObject.FindProperty("overrideList");

        for (int i = 0; i < overrideListProp.arraySize; i++)
        {
            SerializedProperty overrideProp = overrideListProp.GetArrayElementAtIndex(i);
            string             displayName  = overrideProp.FindPropertyRelative("displayName").stringValue;
            ShaderPropertyType type         = (ShaderPropertyType)overrideProp.FindPropertyRelative("type").intValue;

            if (type == ShaderPropertyType.Color)
            {
                SerializedProperty colorProp = overrideProp.FindPropertyRelative("value");
                Color   color    = new Color(colorProp.vector4Value.x, colorProp.vector4Value.y, colorProp.vector4Value.z, colorProp.vector4Value.w);
                Color   newColor = EditorGUILayout.ColorField(new GUIContent(displayName), color);
                Vector4 vec4     = new Vector4(newColor.r, newColor.g, newColor.b, newColor.a);
                colorProp.vector4Value = vec4;
            }
            else if (type == ShaderPropertyType.Vector)
            {
                SerializedProperty vector4Prop = overrideProp.FindPropertyRelative("value");
                EditorGUILayout.PropertyField(vector4Prop, new GUIContent(displayName));
            }
            else if (type == ShaderPropertyType.Float || type == ShaderPropertyType.Range)
            {
                SerializedProperty floatProp = overrideProp.FindPropertyRelative("value");
                float f    = floatProp.vector4Value.x;
                float newF = EditorGUILayout.FloatField(new GUIContent(displayName), f);
                floatProp.vector4Value = new Vector4(newF, 0.0f, 0.0f, 0.0f);
            }
            else
            {
                Debug.Log("Property " + displayName + " is of unsupported type " + type + " for material override.");
            }
        }

        if (EditorGUI.EndChangeCheck())
        {
            dirtyGameObjects = true;
        }

        string buttonTxt = overrideAsset.material == null ? "Select a Material" : "Add Property Overrride";

        if (overrideAsset.material == null)
        {
            GUI.enabled = false;
        }


        if (GUILayout.Button(buttonTxt))
        {
            if (Event.current.type == EventType.Repaint)
            {
                _buttonRect = GUILayoutUtility.GetLastRect();
            }
            _buttonRect.x = Event.current.mousePosition.x;
            _buttonRect.y = Event.current.mousePosition.y;
            _popupWindow  = new MaterialPropPopup(overrideAsset, serializedObject);
            PopupWindow.Show(_buttonRect, _popupWindow);
        }
        GUI.enabled = true;

        if (_popupWindow != null)
        {
            dirtyGameObjects = _popupWindow.propertyListChanged ? true : dirtyGameObjects;
        }
        if (dirtyGameObjects)
        {
            foreach (var overrideComponent in FindObjectsOfType <MaterialOverride>())
            {
                if (overrideComponent.overrideAsset == target)
                {
                    EditorUtility.SetDirty(overrideComponent);
                }
            }
        }

        serializedObject.ApplyModifiedProperties();
        if (currentMat != overrideAsset.material)
        {
            overrideAsset.overrideList = new List <MaterialOverrideAsset.OverrideData>();
        }
    }
Beispiel #4
0
    public override void OnInspectorGUI()
    {
        Font defaultFont = EditorStyles.label.font;

        serializedObject.Update();
        SerializedProperty assetProp = serializedObject.FindProperty("overrideAsset");

        EditorGUILayout.PropertyField(assetProp, new GUIContent("Override Asset"));

        MaterialOverride overrideComponent = (target as MaterialOverride);

        if (overrideComponent != null)
        {
            MaterialOverrideAsset overrideAsset = overrideComponent.overrideAsset;
            if (overrideAsset != null)
            {
                SerializedProperty overrideListProp = serializedObject.FindProperty("overrideList");
                for (int i = 0; i < overrideListProp.arraySize; i++)
                {
                    SerializedProperty overrideProp = overrideListProp.GetArrayElementAtIndex(i);
                    string             displayName  = overrideProp.FindPropertyRelative("displayName").stringValue;
                    ShaderPropertyType type         = (ShaderPropertyType)overrideProp.FindPropertyRelative("type").intValue;
                    SerializedProperty instanceProp = overrideProp.FindPropertyRelative("instanceOverride");

                    Rect fieldRect = EditorGUILayout.GetControlRect(true, EditorGUIUtility.singleLineHeight);
                    GUI.skin.font = defaultFont;
                    if (instanceProp.boolValue)
                    {
                        DrawOverrideMargin(fieldRect);
                        GUI.skin.font = EditorStyles.boldFont;
                    }

                    EditorGUI.BeginChangeCheck();
                    if (type == ShaderPropertyType.Color)
                    {
                        SerializedProperty colorProp = overrideProp.FindPropertyRelative("value");

                        Color   color    = new Color(colorProp.vector4Value.x, colorProp.vector4Value.y, colorProp.vector4Value.z, colorProp.vector4Value.w);
                        Color   newColor = EditorGUI.ColorField(fieldRect, new GUIContent(displayName), color);
                        Vector4 vec4     = new Vector4(newColor.r, newColor.g, newColor.b, newColor.a);
                        colorProp.vector4Value = vec4;
                    }
                    else if (type == ShaderPropertyType.Vector)
                    {
                        SerializedProperty vector4Prop = overrideProp.FindPropertyRelative("value");

                        Vector4 vec4    = vector4Prop.vector4Value;
                        Vector4 newVec4 = EditorGUI.Vector4Field(fieldRect, new GUIContent(displayName), vec4);
                        vector4Prop.vector4Value = newVec4;
                    }
                    else if (type == ShaderPropertyType.Float || type == ShaderPropertyType.Range)
                    {
                        SerializedProperty floatProp = overrideProp.FindPropertyRelative("value");

                        float f    = floatProp.vector4Value.x;
                        float newF = EditorGUI.FloatField(fieldRect, new GUIContent(displayName), f);
                        floatProp.vector4Value = new Vector4(newF, 0.0f, 0.0f, 0.0f);
                    }
                    else
                    {
                        Debug.Log("Property " + displayName + " is of unsupported type " + type + " for material override.");
                    }
                    if (EditorGUI.EndChangeCheck())
                    {
                        instanceProp.boolValue = true;
                    }


                    if (instanceProp.boolValue)
                    {
                        if (fieldRect.Contains(Event.current.mousePosition) && Event.current.type == EventType.ContextClick)
                        {
                            GenericMenu menu = new GenericMenu();
                            menu.AddItem(new GUIContent("Apply to MaterialOverride '" + overrideComponent.overrideAsset.name + "'"),
                                         false, ApplyToOverrideAsset, i);
                            menu.AddItem(new GUIContent("Revert"), false, RevertGameobjectOverride, i);
                            menu.ShowAsContext();
                            Event.current.Use();
                        }
                    }
                }
            }
        }
        serializedObject.ApplyModifiedProperties();
    }
Beispiel #5
0
 public MaterialPropPopup(MaterialOverrideAsset overrideAsset, SerializedObject serializedObject)
 {
     _overrideAsset    = overrideAsset;
     _serializedObject = serializedObject;
 }
Beispiel #6
0
    public override void OnInspectorGUI()
    {
        serializedObject.Update();

        MaterialOverrideAsset overrideAsset = (target as MaterialOverrideAsset);

        if (GUILayout.Button("Add Material Override"))
        {
            if (overrideAsset != null)
            {
                PopupWindow.Show(_buttonRect, new MaterialPropPopup(overrideAsset, serializedObject));
                if (Event.current.type == EventType.Repaint)
                {
                    _buttonRect = GUILayoutUtility.GetLastRect();
                }
            }
        }

        EditorGUILayout.PropertyField(serializedObject.FindProperty("shader"), new GUIContent("shader"));

        SerializedProperty overrideListProp = serializedObject.FindProperty("overrideList");

        for (int i = 0; i < overrideListProp.arraySize; i++)
        {
            SerializedProperty overrideProp = overrideListProp.GetArrayElementAtIndex(i);
            string             strName      = overrideProp.FindPropertyRelative("name").stringValue;
            ShaderPropertyType type         = (ShaderPropertyType)overrideProp.FindPropertyRelative("type").intValue;

            switch (type)
            {
            case (ShaderPropertyType.Color):
            {
                SerializedProperty colorProp = overrideProp.FindPropertyRelative("colorValue");
                EditorGUILayout.PropertyField(colorProp, new GUIContent(strName));
                break;
            }

            case (ShaderPropertyType.Vector):
            {
                SerializedProperty vector4Prop = overrideProp.FindPropertyRelative("vector4Value");
                EditorGUILayout.PropertyField(vector4Prop, new GUIContent(strName));
                break;
            }

            case (ShaderPropertyType.Float):
            {
                SerializedProperty floatProp = overrideProp.FindPropertyRelative("floatValue");
                EditorGUILayout.PropertyField(floatProp, new GUIContent(strName));
                break;
            }

            //TODO(atheisen): add support for vector1,2,3 and find out about Texture and Range overrides
            //case (ShaderPropertyType.Range):
            //{
            //    Debug.Log("Property " + strName + " is of unsupported type " + type + " for material override.");
            //    break;
            //}
            //case (ShaderPropertyType.Texture):
            //{
            //    Debug.Log("Property " + strName + " is of unsupported type " + type + " for material override.");
            //    break;
            //}
            default:
            {
                Debug.Log("Property " + strName + " is of unsupported type " + type + " for material override.");
                break;
            }
            }
        }

        serializedObject.ApplyModifiedProperties();
    }