Exemplo n.º 1
0
        static void Drawer_SectionLightingSettings(SerializedFrameSettings serialized, Editor owner, bool withOverride)
        {
            RenderPipelineSettings hdrpSettings         = GetHDRPAssetFor(owner).currentPlatformRenderPipelineSettings;
            FrameSettings          defaultFrameSettings = GetDefaultFrameSettingsFor(owner);
            var area = OverridableFrameSettingsArea.GetGroupContent(1, defaultFrameSettings, serialized);

            area.AmmendInfo(FrameSettingsField.Shadowmask, overrideable: () => hdrpSettings.supportShadowMask);
            area.AmmendInfo(FrameSettingsField.SSR, overrideable: () => hdrpSettings.supportSSR);
            area.AmmendInfo(FrameSettingsField.TransparentSSR, overrideable: () => (hdrpSettings.supportSSR && hdrpSettings.supportSSRTransparent));
            area.AmmendInfo(FrameSettingsField.SSAO, overrideable: () => hdrpSettings.supportSSAO);
            area.AmmendInfo(FrameSettingsField.SSGI, overrideable: () => hdrpSettings.supportSSGI);
            area.AmmendInfo(FrameSettingsField.VolumetricClouds, overrideable: () => hdrpSettings.supportVolumetricClouds);

            // SSS
            area.AmmendInfo(
                FrameSettingsField.SubsurfaceScattering,
                overridedDefaultValue: hdrpSettings.supportSubsurfaceScattering,
                overrideable: () => hdrpSettings.supportSubsurfaceScattering
                );
            area.AmmendInfo(
                FrameSettingsField.SssQualityMode,
                overridedDefaultValue: SssQualityMode.FromQualitySettings,
                customGetter: () => serialized.sssQualityMode.GetEnumValue <SssQualityMode>(),
                customSetter: v => serialized.sssQualityMode.SetEnumValue((SssQualityMode)v),
                overrideable: () => hdrpSettings.supportSubsurfaceScattering &&
                (serialized.IsEnabled(FrameSettingsField.SubsurfaceScattering) ?? false),
                ignoreDependencies: true,
                hasMixedValues: serialized.sssQualityMode.hasMultipleDifferentValues
                );
            area.AmmendInfo(FrameSettingsField.SssQualityLevel,
                            overridedDefaultValue: ScalableLevel3ForFrameSettingsUIOnly.Low,
                            customGetter:       () => (ScalableLevel3ForFrameSettingsUIOnly)serialized.sssQualityLevel.intValue, // 3 levels
                            customSetter:       v => serialized.sssQualityLevel.intValue = Math.Max(0, Math.Min((int)v, 2)),     // Levels 0-2
                            overrideable: () => hdrpSettings.supportSubsurfaceScattering &&
                            (serialized.IsEnabled(FrameSettingsField.SubsurfaceScattering) ?? false) &&
                            (serialized.sssQualityMode.GetEnumValue <SssQualityMode>() == SssQualityMode.FromQualitySettings),
                            ignoreDependencies: true,
                            hasMixedValues: serialized.sssQualityLevel.hasMultipleDifferentValues
                            );
            area.AmmendInfo(FrameSettingsField.SssCustomSampleBudget,
                            overridedDefaultValue: (int)DefaultSssSampleBudgetForQualityLevel.Low,
                            customGetter:       () => serialized.sssCustomSampleBudget.intValue,
                            customSetter:       v => serialized.sssCustomSampleBudget.intValue = Math.Max(1, Math.Min((int)v, (int)DefaultSssSampleBudgetForQualityLevel.Max)),
                            overrideable: () => hdrpSettings.supportSubsurfaceScattering &&
                            (serialized.IsEnabled(FrameSettingsField.SubsurfaceScattering) ?? false) &&
                            (serialized.sssQualityMode.GetEnumValue <SssQualityMode>() != SssQualityMode.FromQualitySettings),
                            ignoreDependencies: true,
                            hasMixedValues: serialized.sssCustomSampleBudget.hasMultipleDifferentValues
                            );

            area.AmmendInfo(FrameSettingsField.Volumetrics, overrideable: () => hdrpSettings.supportVolumetrics);
            area.AmmendInfo(FrameSettingsField.ReprojectionForVolumetrics, overrideable: () => hdrpSettings.supportVolumetrics);
            area.AmmendInfo(FrameSettingsField.LightLayers, overrideable: () => hdrpSettings.supportLightLayers);
            area.AmmendInfo(FrameSettingsField.ProbeVolume, overrideable: () => hdrpSettings.supportProbeVolume);
            area.AmmendInfo(FrameSettingsField.ScreenSpaceShadows, overrideable: () => hdrpSettings.hdShadowInitParams.supportScreenSpaceShadows);
            area.Draw(withOverride);
        }
Exemplo n.º 2
0
        static internal void Drawer_SectionLightingSettings(SerializedFrameSettings serialized, Editor owner, bool withOverride)
        {
            bool isGUIenabled = GUI.enabled;

            FrameSettings?         defaultFrameSettings = GetDefaultFrameSettingsFor(owner);
            var                    hdrpAsset            = GetHDRPAssetFor(owner);
            RenderPipelineSettings qualityLevelSettings = hdrpAsset?.currentPlatformRenderPipelineSettings ?? default;

            var area = OverridableFrameSettingsArea.GetGroupContent(1, defaultFrameSettings, serialized);

            area.AmmendInfo(FrameSettingsField.Volumetrics, ignoreDependencies: true);
            area.AmmendInfo(FrameSettingsField.ReprojectionForVolumetrics, ignoreDependencies: true);
            area.AmmendInfo(FrameSettingsField.TransparentSSR, ignoreDependencies: true);

            //TODO: Remove hideUI when out of experimental. I don't like hideUI it make things more difficult to add a FrameSettings at a given position.
            //      This should not be used except for experimental stuff (it is not compliant with the remaining of UX flows anyway)
            area.AmmendInfo(FrameSettingsField.ProbeVolume, hideInUI: !HDRenderPipelineGlobalSettings.Ensure().supportProbeVolumes);
            area.AmmendInfo(FrameSettingsField.NormalizeReflectionProbeWithProbeVolume, hideInUI: !HDRenderPipelineGlobalSettings.Ensure().supportProbeVolumes);

            area.AmmendInfo(
                FrameSettingsField.SssQualityMode,
                overridedDefaultValue: SssQualityMode.FromQualitySettings,
                customGetter: () => serialized.sssQualityMode.GetEnumValue <SssQualityMode>(),
                customSetter: v => serialized.sssQualityMode.SetEnumValue((SssQualityMode)v),
                overrideable: () => serialized.IsEnabled(FrameSettingsField.SubsurfaceScattering) ?? false,
                ignoreDependencies: true,
                hasMixedValues: serialized.sssQualityMode.hasMultipleDifferentValues
                );
            area.AmmendInfo(FrameSettingsField.SssQualityLevel,
                            overridedDefaultValue: ScalableLevel3ForFrameSettingsUIOnly.Low,
                            customGetter: () => (ScalableLevel3ForFrameSettingsUIOnly)serialized.sssQualityLevel.intValue, // 3 levels
                            customSetter: v => serialized.sssQualityLevel.intValue = Math.Max(0, Math.Min((int)v, 2)),     // Levels 0-2
                            overrideable: () => (serialized.IsEnabled(FrameSettingsField.SubsurfaceScattering) ?? false) &&
                            (serialized.sssQualityMode.GetEnumValue <SssQualityMode>() == SssQualityMode.FromQualitySettings),
                            ignoreDependencies: true,
                            hasMixedValues: serialized.sssQualityLevel.hasMultipleDifferentValues
                            );
            area.AmmendInfo(FrameSettingsField.SssCustomSampleBudget,
                            overridedDefaultValue: (int)DefaultSssSampleBudgetForQualityLevel.Low,
                            customGetter: () => serialized.sssCustomSampleBudget.intValue,
                            customSetter: v => serialized.sssCustomSampleBudget.intValue = Math.Max(1, Math.Min((int)v, (int)DefaultSssSampleBudgetForQualityLevel.Max)),
                            overrideable: () => (serialized.IsEnabled(FrameSettingsField.SubsurfaceScattering) ?? false) &&
                            (serialized.sssQualityMode.GetEnumValue <SssQualityMode>() != SssQualityMode.FromQualitySettings),
                            ignoreDependencies: true,
                            hasMixedValues: serialized.sssCustomSampleBudget.hasMultipleDifferentValues
                            );
            area.Draw(withOverride);

            GUI.enabled = isGUIenabled;
        }
Exemplo n.º 3
0
        static internal void Drawer_SectionLightingSettings(SerializedFrameSettings serialized, Editor owner, bool withOverride)
        {
            bool isGUIenabled = GUI.enabled;

            FrameSettings?         defaultFrameSettings = GetDefaultFrameSettingsFor(owner);
            var                    hdrpAsset            = GetHDRPAssetFor(owner);
            RenderPipelineSettings qualityLevelSettings = hdrpAsset?.currentPlatformRenderPipelineSettings ?? default;

            var area = OverridableFrameSettingsArea.GetGroupContent(1, defaultFrameSettings, serialized);

            area.AmmendInfo(FrameSettingsField.Volumetrics, ignoreDependencies: true);
            area.AmmendInfo(FrameSettingsField.ReprojectionForVolumetrics, ignoreDependencies: true);
            area.AmmendInfo(FrameSettingsField.TransparentSSR, ignoreDependencies: true);
            area.AmmendInfo(FrameSettingsField.ProbeVolume, hideInUI: !HDRenderPipelineGlobalSettings.Ensure().supportProbeVolumes);

            area.AmmendInfo(
                FrameSettingsField.SssQualityMode,
                overridedDefaultValue: SssQualityMode.FromQualitySettings,
                customGetter: () => serialized.sssQualityMode.GetEnumValue <SssQualityMode>(),
                customSetter: v => serialized.sssQualityMode.SetEnumValue((SssQualityMode)v),
                overrideable: () => serialized.IsEnabled(FrameSettingsField.SubsurfaceScattering) ?? false,
                ignoreDependencies: true,
                hasMixedValues: serialized.sssQualityMode.hasMultipleDifferentValues
                );
            area.AmmendInfo(FrameSettingsField.SssQualityLevel,
                            overridedDefaultValue: ScalableLevel3ForFrameSettingsUIOnly.Low,
                            customGetter:       () => (ScalableLevel3ForFrameSettingsUIOnly)serialized.sssQualityLevel.intValue, // 3 levels
                            customSetter:       v => serialized.sssQualityLevel.intValue = Math.Max(0, Math.Min((int)v, 2)),     // Levels 0-2
                            overrideable: () => (serialized.IsEnabled(FrameSettingsField.SubsurfaceScattering) ?? false) &&
                            (serialized.sssQualityMode.GetEnumValue <SssQualityMode>() == SssQualityMode.FromQualitySettings),
                            ignoreDependencies: true,
                            hasMixedValues: serialized.sssQualityLevel.hasMultipleDifferentValues
                            );
            area.AmmendInfo(FrameSettingsField.SssCustomSampleBudget,
                            overridedDefaultValue: (int)DefaultSssSampleBudgetForQualityLevel.Low,
                            customGetter:       () => serialized.sssCustomSampleBudget.intValue,
                            customSetter:       v => serialized.sssCustomSampleBudget.intValue = Math.Max(1, Math.Min((int)v, (int)DefaultSssSampleBudgetForQualityLevel.Max)),
                            overrideable: () => (serialized.IsEnabled(FrameSettingsField.SubsurfaceScattering) ?? false) &&
                            (serialized.sssQualityMode.GetEnumValue <SssQualityMode>() != SssQualityMode.FromQualitySettings),
                            ignoreDependencies: true,
                            hasMixedValues: serialized.sssCustomSampleBudget.hasMultipleDifferentValues
                            );
            area.Draw(withOverride);

            GUI.enabled = isGUIenabled;
        }
        static bool EvaluateBoolWithOverride(FrameSettingsField field, Field forField, FrameSettings defaultFrameSettings, SerializedFrameSettings serializedFrameSettings, bool negative)
        {
            bool value;

            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;

            const int k_IndentPerLevel         = 15;
            const int k_CheckBoxWidth          = 15;
            const int k_CheckboxLabelSeparator = 5;
            const int k_LabelFieldSeparator    = 2;
            float     indentValue = k_IndentPerLevel * EditorGUI.indentLevel;

            Rect lineRect     = GUILayoutUtility.GetRect(1, EditorGUIUtility.singleLineHeight);
            Rect overrideRect = lineRect;

            overrideRect.width = k_CheckBoxWidth;
            Rect labelRect = lineRect;

            labelRect.x    += k_CheckBoxWidth + k_CheckboxLabelSeparator;
            labelRect.width = EditorGUIUtility.labelWidth - indentValue;
            Rect fieldRect = lineRect;

            fieldRect.x      = labelRect.xMax + k_LabelFieldSeparator;
            fieldRect.width -= fieldRect.x - lineRect.x;

            if (withOverride)
            {
                int currentIndent = EditorGUI.indentLevel;
                EditorGUI.indentLevel = 0;

                bool mixedValue    = serializedFrameSettings.HaveMultipleOverride(field.field);
                bool originalValue = serializedFrameSettings.GetOverrides(field.field) && !mixedValue;
                overrideRect.yMin += 4f;

                // MixedValueState is handled by style for small tickbox for strange reason
                //EditorGUI.showMixedValue = mixedValue;
                bool modifiedValue = EditorGUI.Toggle(overrideRect, overrideTooltip, originalValue, mixedValue? CoreEditorStyles.smallMixedTickbox : CoreEditorStyles.smallTickbox);
                //EditorGUI.showMixedValue = false;

                if (originalValue ^ modifiedValue)
                {
                    serializedFrameSettings.SetOverrides(field.field, modifiedValue);
                }

                shouldBeDisabled      = !modifiedValue;
                EditorGUI.indentLevel = currentIndent;
            }

            using (new SerializedFrameSettings.TitleDrawingScope(labelRect, field.label, serializedFrameSettings))
            {
                HDEditorUtils.HandlePrefixLabelWithIndent(lineRect, labelRect, field.label);
            }

            using (new EditorGUI.DisabledScope(shouldBeDisabled))
            {
                EditorGUI.showMixedValue = serializedFrameSettings.HaveMultipleValue(field.field) || field.hasMixedValues;
                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(fieldRect, 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(fieldRect, oldEnumValue);
                                break;

                            case FrameSettingsFieldAttribute.DisplayType.Others:
                                var oldValue = field.customGetter();
                                DrawFieldShape(fieldRect, oldValue);
                                break;

                            default:
                                throw new ArgumentException("Unknown FrameSettingsFieldAttribute");
                            }
                        }
                        else
                        {
                            DrawFieldShape(fieldRect, field.overridedDefaultValue);
                        }
                    }
                    else
                    {
                        switch (attributes[field.field].type)
                        {
                        case FrameSettingsFieldAttribute.DisplayType.BoolAsCheckbox:
                            bool oldBool = serializedFrameSettings.IsEnabled(field.field) ?? false;
                            bool newBool = (bool)DrawFieldShape(fieldRect, 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(fieldRect, 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 = EditorGUI.Popup(fieldRect, -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();
                            EditorGUI.BeginChangeCheck();
                            var newValue = DrawFieldShape(fieldRect, oldValue);
                            // We need an extensive check here, otherwise in some case with boxing or polymorphism
                            // the != operator won't be accurate. (This is the case for enum types).
                            var valuesAreEquals = oldValue == null && newValue == null || oldValue != null && oldValue.Equals(newValue);
                            // If the UI reported a change, we also assign values.
                            // When assigning to a multiple selection, the equals check may fail while there was indeed a change.
                            if (EditorGUI.EndChangeCheck() || !valuesAreEquals)
                            {
                                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;
                }
            }
        }
Exemplo n.º 6
0
        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;
                }
            }
        }
Exemplo n.º 7
0
        static internal void Drawer_SectionRenderingSettings(SerializedFrameSettings serialized, Editor owner, bool withOverride)
        {
            bool          isGUIenabled         = GUI.enabled;
            FrameSettings defaultFrameSettings = GetDefaultFrameSettingsFor(owner);
            var           frameSettingType     = owner is IDefaultFrameSettingsType getType?getType.GetFrameSettingsType() : FrameSettingsRenderType.Camera;

            var area = OverridableFrameSettingsArea.GetGroupContent(0, defaultFrameSettings, serialized);

            var hdrpAsset = GetHDRPAssetFor(owner);

            if (hdrpAsset != null)
            {
                RenderPipelineSettings hdrpSettings = hdrpAsset.currentPlatformRenderPipelineSettings;
                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: () => hdrpSettings.supportedLitShaderMode == RenderPipelineSettings.SupportedLitShaderMode.Both,
                                overridedDefaultValue: defaultShaderLitMode);

                bool hdrpAssetSupportForward         = hdrpSettings.supportedLitShaderMode != RenderPipelineSettings.SupportedLitShaderMode.DeferredOnly;
                bool hdrpAssetSupportDeferred        = hdrpSettings.supportedLitShaderMode != RenderPipelineSettings.SupportedLitShaderMode.ForwardOnly;
                bool hdrpAssetIsForward              = hdrpSettings.supportedLitShaderMode == RenderPipelineSettings.SupportedLitShaderMode.ForwardOnly;
                bool hdrpAssetIsDeferred             = hdrpSettings.supportedLitShaderMode == RenderPipelineSettings.SupportedLitShaderMode.DeferredOnly;
                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 defaultDeferredUsed             = !serialized.GetOverrides(FrameSettingsField.LitShaderMode) && defaultShaderLitMode == LitShaderMode.Deferred;

                // Due to various reasons, MSAA and ray tracing are not compatible, if ray tracing is enabled on the asset. MSAA can not be enabled on the frame settings.
                bool msaaEnablable = hdrpSettings.supportMSAA && ((hdrpAssetSupportForward && (frameSettingsOverrideToForward || defaultForwardUsed)) || hdrpAssetIsForward) && !hdrpSettings.supportRayTracing;
                area.AmmendInfo(FrameSettingsField.MSAA,
                                overrideable: () => msaaEnablable,
                                ignoreDependencies: true,
                                overridedDefaultValue: msaaEnablable && defaultFrameSettings.IsEnabled(FrameSettingsField.MSAA));

                bool msaaIsOff = (msaaEnablable && serialized.GetOverrides(FrameSettingsField.MSAA)) ? !(serialized.IsEnabled(FrameSettingsField.MSAA) ?? false) : !defaultFrameSettings.IsEnabled(FrameSettingsField.MSAA);
                area.AmmendInfo(FrameSettingsField.AlphaToMask,
                                overrideable: () => msaaEnablable && !msaaIsOff,
                                ignoreDependencies: true,
                                overridedDefaultValue: msaaEnablable && defaultFrameSettings.IsEnabled(FrameSettingsField.AlphaToMask) && !msaaIsOff);

                bool depthPrepassEnablable = (hdrpAssetSupportDeferred && (defaultDeferredUsed || frameSettingsOverrideToDeferred)) || (hdrpAssetIsDeferred);
                area.AmmendInfo(FrameSettingsField.DepthPrepassWithDeferredRendering,
                                overrideable: () => depthPrepassEnablable,
                                ignoreDependencies: true,
                                overridedDefaultValue: depthPrepassEnablable && defaultFrameSettings.IsEnabled(FrameSettingsField.DepthPrepassWithDeferredRendering));

                bool clearGBufferEnablable = (hdrpAssetSupportDeferred && (defaultDeferredUsed || frameSettingsOverrideToDeferred)) || (hdrpAssetIsDeferred);
                area.AmmendInfo(FrameSettingsField.ClearGBuffers,
                                overrideable: () => clearGBufferEnablable,
                                ignoreDependencies: true,
                                overridedDefaultValue: clearGBufferEnablable && defaultFrameSettings.IsEnabled(FrameSettingsField.ClearGBuffers));

                area.AmmendInfo(FrameSettingsField.RayTracing, overrideable: () => hdrpSettings.supportRayTracing);
#if !ENABLE_VIRTUALTEXTURES
                area.AmmendInfo(FrameSettingsField.VirtualTexturing, overrideable: () => false);
#endif

                area.AmmendInfo(FrameSettingsField.RayTracing, overrideable: () => hdrpSettings.supportRayTracing);
#if !ENABLE_VIRTUALTEXTURES
                area.AmmendInfo(FrameSettingsField.VirtualTexturing, overrideable: () => false);
#endif
                area.AmmendInfo(FrameSettingsField.MotionVectors, overrideable: () => hdrpSettings.supportMotionVectors);
                area.AmmendInfo(FrameSettingsField.ObjectMotionVectors, overrideable: () => hdrpSettings.supportMotionVectors);
                area.AmmendInfo(FrameSettingsField.TransparentsWriteMotionVector, overrideable: () => hdrpSettings.supportMotionVectors);
                area.AmmendInfo(FrameSettingsField.Decals, overrideable: () => hdrpSettings.supportDecals);
                area.AmmendInfo(FrameSettingsField.DecalLayers, overrideable: () => hdrpSettings.supportDecalLayers);
                area.AmmendInfo(FrameSettingsField.Distortion, overrideable: () => hdrpSettings.supportDistortion);
                area.AmmendInfo(FrameSettingsField.RoughDistortion, overrideable: () => hdrpSettings.supportDistortion);

                area.AmmendInfo(FrameSettingsField.Postprocess, overrideable: () => (frameSettingType != FrameSettingsRenderType.CustomOrBakedReflection &&
                                                                                     frameSettingType != FrameSettingsRenderType.RealtimeReflection));

                area.AmmendInfo(
                    FrameSettingsField.LODBiasMode,
                    overridedDefaultValue: LODBiasMode.FromQualitySettings,
                    customGetter: () => serialized.lodBiasMode.GetEnumValue <LODBiasMode>(),
                    customSetter: v => serialized.lodBiasMode.SetEnumValue((LODBiasMode)v),
                    hasMixedValues: serialized.lodBiasMode.hasMultipleDifferentValues
                    );
                area.AmmendInfo(FrameSettingsField.LODBiasQualityLevel,
                                overridedDefaultValue: ScalableLevel3ForFrameSettingsUIOnly.Low,
                                customGetter: () => (ScalableLevel3ForFrameSettingsUIOnly)serialized.lodBiasQualityLevel.intValue,
                                customSetter: v => serialized.lodBiasQualityLevel.intValue = (int)v,
                                overrideable: () => serialized.lodBiasMode.GetEnumValue <LODBiasMode>() != LODBiasMode.OverrideQualitySettings,
                                ignoreDependencies: true,
                                hasMixedValues: serialized.lodBiasQualityLevel.hasMultipleDifferentValues);

                if (hdrpAsset != null)
                {
                    area.AmmendInfo(FrameSettingsField.LODBias,
                                    overridedDefaultValue: hdrpAsset.currentPlatformRenderPipelineSettings.lodBias[serialized.lodBiasQualityLevel.intValue],
                                    customGetter: () => serialized.lodBias.floatValue,
                                    customSetter: v => serialized.lodBias.floatValue = (float)v,
                                    overrideable: () => serialized.lodBiasMode.GetEnumValue <LODBiasMode>() != LODBiasMode.FromQualitySettings,
                                    ignoreDependencies: true,
                                    labelOverride: serialized.lodBiasMode.GetEnumValue <LODBiasMode>() == LODBiasMode.ScaleQualitySettings ? "Scale Factor" : "LOD Bias",
                                    hasMixedValues: serialized.lodBias.hasMultipleDifferentValues);
                }

                area.AmmendInfo(
                    FrameSettingsField.MaximumLODLevelMode,
                    overridedDefaultValue: MaximumLODLevelMode.FromQualitySettings,
                    customGetter: () => serialized.maximumLODLevelMode.GetEnumValue <MaximumLODLevelMode>(),
                    customSetter: v => serialized.maximumLODLevelMode.SetEnumValue((MaximumLODLevelMode)v),
                    hasMixedValues: serialized.maximumLODLevelMode.hasMultipleDifferentValues
                    );
                area.AmmendInfo(FrameSettingsField.MaximumLODLevelQualityLevel,
                                overridedDefaultValue: ScalableLevel3ForFrameSettingsUIOnly.Low,
                                customGetter: () => (ScalableLevel3ForFrameSettingsUIOnly)serialized.maximumLODLevelQualityLevel.intValue,
                                customSetter: v => serialized.maximumLODLevelQualityLevel.intValue = (int)v,
                                overrideable: () => serialized.maximumLODLevelMode.GetEnumValue <MaximumLODLevelMode>() != MaximumLODLevelMode.OverrideQualitySettings,
                                ignoreDependencies: true,
                                hasMixedValues: serialized.maximumLODLevelQualityLevel.hasMultipleDifferentValues);

                if (hdrpAsset != null)
                {
                    area.AmmendInfo(FrameSettingsField.MaximumLODLevel,
                                    overridedDefaultValue: hdrpAsset.currentPlatformRenderPipelineSettings.maximumLODLevel[serialized.maximumLODLevelQualityLevel.intValue],
                                    customGetter: () => serialized.maximumLODLevel.intValue,
                                    customSetter: v => serialized.maximumLODLevel.intValue = (int)v,
                                    overrideable: () => serialized.maximumLODLevelMode.GetEnumValue <MaximumLODLevelMode>() != MaximumLODLevelMode.FromQualitySettings,
                                    ignoreDependencies: true,
                                    labelOverride: serialized.maximumLODLevelMode.GetEnumValue <MaximumLODLevelMode>() == MaximumLODLevelMode.OffsetQualitySettings ? "Offset Factor" : "Maximum LOD Level",
                                    hasMixedValues: serialized.maximumLODLevel.hasMultipleDifferentValues);
                }

                area.AmmendInfo(FrameSettingsField.MaterialQualityLevel,
                                overridedDefaultValue: defaultFrameSettings.materialQuality.Into(),
                                customGetter: () => ((MaterialQuality)serialized.materialQuality.intValue).Into(),
                                customSetter: v => serialized.materialQuality.intValue = (int)((MaterialQualityMode)v).Into(),
                                hasMixedValues: serialized.materialQuality.hasMultipleDifferentValues
                                );

                area.Draw(withOverride);
            }
            GUI.enabled = isGUIenabled;
        }