static bool EvaluateBoolWithOverride(FrameSettingsField field, Field forField, FrameSettings defaultFrameSettings, SerializedFrameSettings serializedFrameSettings, bool negative) { bool value; if (forField.customOverrideable != null) { return(forField.customOverrideable() ^ negative); } if (serializedFrameSettings.GetOverrides(field)) { value = serializedFrameSettings.IsEnabled(field) ?? false; } else { value = defaultFrameSettings.IsEnabled(field); } return(value ^ negative); }
void DrawField(Field field, bool withOverride) { int indentLevel = attributes[field.field].indentLevel; if (indentLevel == 0) { --EditorGUI.indentLevel; //alignment provided by the space for override checkbox } else { for (int i = indentLevel - 1; i > 0; --i) { ++EditorGUI.indentLevel; } } bool enabled = field.IsOverrideableWithDependencies(serializedFrameSettings, defaultFrameSettings); withOverride &= enabled & GUI.enabled; bool shouldBeDisabled = withOverride || !enabled || !GUI.enabled; using (new EditorGUILayout.HorizontalScope()) { var overrideRect = GUILayoutUtility.GetRect(15f, 17f, GUILayout.ExpandWidth(false)); //15 = kIndentPerLevel if (withOverride) { bool originalValue = serializedFrameSettings.GetOverrides(field.field); overrideRect.yMin += 4f; EditorGUI.showMixedValue = serializedFrameSettings.HaveMultipleOverride(field.field); bool modifiedValue = GUI.Toggle(overrideRect, originalValue, overrideTooltip, CoreEditorStyles.smallTickbox); EditorGUI.showMixedValue = false; if (originalValue ^ modifiedValue) { serializedFrameSettings.SetOverrides(field.field, modifiedValue); } shouldBeDisabled = !modifiedValue; } using (new EditorGUI.DisabledScope(shouldBeDisabled)) { EditorGUI.showMixedValue = serializedFrameSettings.HaveMultipleValue(field.field); using (new EditorGUILayout.VerticalScope()) { //the following block will display a default value if provided instead of actual value (case if(true)) if (shouldBeDisabled) { if (field.overridedDefaultValue == null) { switch (attributes[field.field].type) { case FrameSettingsFieldAttribute.DisplayType.BoolAsCheckbox: DrawFieldShape(field.label, defaultFrameSettings.IsEnabled(field.field)); break; case FrameSettingsFieldAttribute.DisplayType.BoolAsEnumPopup: //shame but it is not possible to use Convert.ChangeType to convert int into enum in current C# //rely on string parsing for the moment var oldEnumValue = Enum.Parse(attributes[field.field].targetType, defaultFrameSettings.IsEnabled(field.field) ? "1" : "0"); DrawFieldShape(field.label, oldEnumValue); break; case FrameSettingsFieldAttribute.DisplayType.Others: var oldValue = field.customGetter(); DrawFieldShape(field.label, oldValue); break; default: throw new ArgumentException("Unknown FrameSettingsFieldAttribute"); } } else { DrawFieldShape(field.label, field.overridedDefaultValue); } } else { switch (attributes[field.field].type) { case FrameSettingsFieldAttribute.DisplayType.BoolAsCheckbox: bool oldBool = serializedFrameSettings.IsEnabled(field.field) ?? false; bool newBool = (bool)DrawFieldShape(field.label, oldBool); if (oldBool ^ newBool) { Undo.RecordObject(serializedFrameSettings.serializedObject.targetObject, "Changed FrameSettings " + field.field); serializedFrameSettings.SetEnabled(field.field, newBool); } break; case FrameSettingsFieldAttribute.DisplayType.BoolAsEnumPopup: //shame but it is not possible to use Convert.ChangeType to convert int into enum in current C# //Also, Enum.Equals and Enum operator!= always send true here. As it seams to compare object reference instead of value. var oldBoolValue = serializedFrameSettings.IsEnabled(field.field); int oldEnumIntValue = -1; int newEnumIntValue; object newEnumValue; if (oldBoolValue.HasValue) { var oldEnumValue = Enum.GetValues(attributes[field.field].targetType).GetValue(oldBoolValue.Value ? 1 : 0); newEnumValue = Convert.ChangeType(DrawFieldShape(field.label, oldEnumValue), attributes[field.field].targetType); oldEnumIntValue = ((IConvertible)oldEnumValue).ToInt32(System.Globalization.CultureInfo.CurrentCulture); newEnumIntValue = ((IConvertible)newEnumValue).ToInt32(System.Globalization.CultureInfo.CurrentCulture); } else //in multi edition, do not assume any previous value { newEnumIntValue = EditorGUILayout.Popup(field.label, -1, Enum.GetNames(attributes[field.field].targetType)); newEnumValue = newEnumIntValue < 0 ? null : Enum.GetValues(attributes[field.field].targetType).GetValue(newEnumIntValue); } if (oldEnumIntValue != newEnumIntValue) { Undo.RecordObject(serializedFrameSettings.serializedObject.targetObject, "Changed FrameSettings " + field.field); serializedFrameSettings.SetEnabled(field.field, Convert.ToInt32(newEnumValue) == 1); } break; case FrameSettingsFieldAttribute.DisplayType.Others: var oldValue = field.customGetter(); var newValue = DrawFieldShape(field.label, oldValue); if (oldValue != newValue) { Undo.RecordObject(serializedFrameSettings.serializedObject.targetObject, "Changed FrameSettings " + field.field); field.customSetter(newValue); } break; default: throw new ArgumentException("Unknown FrameSettingsFieldAttribute"); } } } EditorGUI.showMixedValue = false; } } if (indentLevel == 0) { ++EditorGUI.indentLevel; } else { for (int i = indentLevel - 1; i > 0; --i) { --EditorGUI.indentLevel; } } }
static void Drawer_SectionRenderingSettings(SerializedFrameSettings serialized, Editor owner, bool withOverride) { RenderPipelineSettings hdrpSettings = GetHDRPAssetFor(owner).currentPlatformRenderPipelineSettings; FrameSettings defaultFrameSettings = GetDefaultFrameSettingsFor(owner); var area = OverridableFrameSettingsArea.GetGroupContent(0, defaultFrameSettings, serialized); LitShaderMode defaultShaderLitMode; switch (hdrpSettings.supportedLitShaderMode) { case RenderPipelineSettings.SupportedLitShaderMode.ForwardOnly: defaultShaderLitMode = LitShaderMode.Forward; break; case RenderPipelineSettings.SupportedLitShaderMode.DeferredOnly: defaultShaderLitMode = LitShaderMode.Deferred; break; case RenderPipelineSettings.SupportedLitShaderMode.Both: defaultShaderLitMode = defaultFrameSettings.litShaderMode; break; default: throw new System.ArgumentOutOfRangeException("Unknown ShaderLitMode"); } area.AmmendInfo(FrameSettingsField.LitShaderMode, overrideable: () => !GL.wireframe && hdrpSettings.supportedLitShaderMode == RenderPipelineSettings.SupportedLitShaderMode.Both, overridedDefaultValue: defaultShaderLitMode); bool hdrpAssetSupportForward = hdrpSettings.supportedLitShaderMode != RenderPipelineSettings.SupportedLitShaderMode.DeferredOnly; bool hdrpAssetSupportDeferred = hdrpSettings.supportedLitShaderMode != RenderPipelineSettings.SupportedLitShaderMode.ForwardOnly; bool frameSettingsOverrideToForward = serialized.GetOverrides(FrameSettingsField.LitShaderMode) && serialized.litShaderMode == LitShaderMode.Forward; bool frameSettingsOverrideToDeferred = serialized.GetOverrides(FrameSettingsField.LitShaderMode) && serialized.litShaderMode == LitShaderMode.Deferred; bool defaultForwardUsed = !serialized.GetOverrides(FrameSettingsField.LitShaderMode) && defaultShaderLitMode == LitShaderMode.Forward; bool defaultDefferedUsed = !serialized.GetOverrides(FrameSettingsField.LitShaderMode) && defaultShaderLitMode == LitShaderMode.Deferred; bool msaaEnablable = !GL.wireframe && hdrpAssetSupportForward && hdrpSettings.supportMSAA && (frameSettingsOverrideToForward || defaultForwardUsed); bool depthPrepassEnablable = hdrpAssetSupportDeferred && (defaultDefferedUsed || frameSettingsOverrideToDeferred); area.AmmendInfo(FrameSettingsField.MSAA, overrideable: () => msaaEnablable, overridedDefaultValue: msaaEnablable && defaultFrameSettings.IsEnabled(FrameSettingsField.MSAA), customOverrideable: () => { switch (hdrpSettings.supportedLitShaderMode) { case RenderPipelineSettings.SupportedLitShaderMode.ForwardOnly: return(false); //negative dependency case RenderPipelineSettings.SupportedLitShaderMode.DeferredOnly: return(true); //negative dependency case RenderPipelineSettings.SupportedLitShaderMode.Both: return(!(frameSettingsOverrideToForward || defaultForwardUsed)); //negative dependency default: throw new System.ArgumentOutOfRangeException("Unknown ShaderLitMode"); } }); area.AmmendInfo(FrameSettingsField.DepthPrepassWithDeferredRendering, overrideable: () => depthPrepassEnablable, overridedDefaultValue: depthPrepassEnablable && defaultFrameSettings.IsEnabled(FrameSettingsField.DepthPrepassWithDeferredRendering), customOverrideable: () => { switch (hdrpSettings.supportedLitShaderMode) { case RenderPipelineSettings.SupportedLitShaderMode.ForwardOnly: return(false); case RenderPipelineSettings.SupportedLitShaderMode.DeferredOnly: return(true); case RenderPipelineSettings.SupportedLitShaderMode.Both: return(frameSettingsOverrideToDeferred || defaultDefferedUsed); default: throw new System.ArgumentOutOfRangeException("Unknown ShaderLitMode"); } }); area.AmmendInfo(FrameSettingsField.MotionVectors, overrideable: () => hdrpSettings.supportMotionVectors); area.AmmendInfo(FrameSettingsField.ObjectMotionVectors, overrideable: () => hdrpSettings.supportMotionVectors); area.AmmendInfo(FrameSettingsField.Decals, overrideable: () => hdrpSettings.supportDecals); area.AmmendInfo(FrameSettingsField.Distortion, overrideable: () => hdrpSettings.supportDistortion); area.AmmendInfo( FrameSettingsField.LODBiasMode, overridedDefaultValue: LODBiasMode.FromQualitySettings, customGetter: () => (LODBiasMode)serialized.lodBiasMode.enumValueIndex, customSetter: v => serialized.lodBiasMode.enumValueIndex = (int)v ); area.AmmendInfo(FrameSettingsField.LODBias, overridedDefaultValue: QualitySettings.lodBias, customGetter: () => serialized.lodBias.floatValue, customSetter: v => serialized.lodBias.floatValue = (float)v, customOverrideable: () => serialized.lodBiasMode.enumValueIndex != (int)LODBiasMode.FromQualitySettings); area.AmmendInfo( FrameSettingsField.MaximumLODLevelMode, overridedDefaultValue: MaximumLODLevelMode.FromQualitySettings, customGetter: () => (MaximumLODLevelMode)serialized.maximumLODLevelMode.enumValueIndex, customSetter: v => serialized.maximumLODLevelMode.enumValueIndex = (int)v ); area.AmmendInfo(FrameSettingsField.MaximumLODLevel, overridedDefaultValue: QualitySettings.maximumLODLevel, customGetter: () => serialized.maximumLODLevel.intValue, customSetter: v => serialized.maximumLODLevel.intValue = (int)v, customOverrideable: () => serialized.maximumLODLevelMode.enumValueIndex != (int)MaximumLODLevelMode.FromQualitySettings); area.Draw(withOverride); }