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>(); } }
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(); }
public MaterialPropPopup(MaterialOverrideAsset overrideAsset, SerializedObject serializedObject) { _overrideAsset = overrideAsset; _serializedObject = serializedObject; }
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(); }