Exemplo n.º 1
0
        static void Drawer_SectionAsyncComputeSettings(SerializedFrameSettings serialized, Editor owner, bool withOverride)
        {
            var area = GetFrameSettingSectionContent(2, serialized, owner);

            area.Draw(withOverride);
        }
Exemplo n.º 2
0
        static void Drawer_SectionLightLoopSettings(SerializedFrameSettings serialized, Editor owner, bool withOverride)
        {
            var area = GetFrameSettingSectionContent(3, serialized, owner);

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

            FrameSettings?defaultFrameSettings = GetDefaultFrameSettingsFor(owner);
            var           area = OverridableFrameSettingsArea.GetGroupContent(0, defaultFrameSettings, serialized);

            area.AmmendInfo(FrameSettingsField.DepthPrepassWithDeferredRendering, ignoreDependencies: true);
            area.AmmendInfo(FrameSettingsField.ClearGBuffers, ignoreDependencies: true);

            area.AmmendInfo(FrameSettingsField.MSAAMode, ignoreDependencies: true);
            area.AmmendInfo(
                FrameSettingsField.MSAAMode,
                overridedDefaultValue: defaultFrameSettings?.msaaMode ?? MSAAMode.FromHDRPAsset,
                customGetter: () => serialized.msaaMode.GetEnumValue <MSAAMode>(),
                customSetter: v => serialized.msaaMode.SetEnumValue((MSAAMode)v),
                hasMixedValues: serialized.msaaMode.hasMultipleDifferentValues
                );

            area.AmmendInfo(FrameSettingsField.AlphaToMask, ignoreDependencies: true);
            area.AmmendInfo(FrameSettingsField.DecalLayers, ignoreDependencies: true);
            area.AmmendInfo(FrameSettingsField.ObjectMotionVectors, ignoreDependencies: true);
            area.AmmendInfo(FrameSettingsField.TransparentsWriteMotionVector, ignoreDependencies: true);

            var isEditingCamera = owner is HDCameraEditor;

            area.AmmendInfo(FrameSettingsField.Postprocess, overrideable: () => isEditingCamera);

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

            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);

            area.AmmendInfo(FrameSettingsField.LODBias,
                            overridedDefaultValue: hdrpAsset ? qualityLevelSettings.lodBias[serialized.lodBiasQualityLevel.intValue] : 0,
                            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);

            area.AmmendInfo(FrameSettingsField.MaximumLODLevel,
                            overridedDefaultValue: hdrpAsset ? qualityLevelSettings.maximumLODLevel[serialized.maximumLODLevelQualityLevel.intValue] : 0,
                            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() ?? MaterialQualityMode.Medium,
                            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;
        }
Exemplo n.º 4
0
        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);

            var frameSettingType = owner is IDefaultFrameSettingsType getType?getType.GetFrameSettingsType() : FrameSettingsRenderType.Camera;

            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 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         = 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.RayTracing, overrideable: () => hdrpSettings.supportRayTracing);
            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.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,
                            customOverrideable: () => serialized.lodBiasMode.GetEnumValue <LODBiasMode>() != LODBiasMode.OverrideQualitySettings,
                            hasMixedValues: serialized.lodBiasQualityLevel.hasMultipleDifferentValues);

            area.AmmendInfo(FrameSettingsField.LODBias,
                            overridedDefaultValue: QualitySettings.lodBias,
                            customGetter: () => serialized.lodBias.floatValue,
                            customSetter: v => serialized.lodBias.floatValue = (float)v,
                            customOverrideable: () => serialized.lodBiasMode.GetEnumValue <LODBiasMode>() != LODBiasMode.FromQualitySettings,
                            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,
                            customOverrideable: () => serialized.maximumLODLevelMode.GetEnumValue <MaximumLODLevelMode>() != MaximumLODLevelMode.OverrideQualitySettings,
                            hasMixedValues: serialized.maximumLODLevelQualityLevel.hasMultipleDifferentValues);

            area.AmmendInfo(FrameSettingsField.MaximumLODLevel,
                            overridedDefaultValue: QualitySettings.maximumLODLevel,
                            customGetter: () => serialized.maximumLODLevel.intValue,
                            customSetter: v => serialized.maximumLODLevel.intValue = (int)v,
                            customOverrideable: () => serialized.maximumLODLevelMode.GetEnumValue <MaximumLODLevelMode>() != MaximumLODLevelMode.FromQualitySettings,
                            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);
        }
        public static OverridableFrameSettingsArea GetGroupContent(int groupIndex, FrameSettings defaultFrameSettings, SerializedFrameSettings serializedFrameSettings)
        {
            if (!attributesGroup.ContainsKey(groupIndex) || attributesGroup[groupIndex] == null)
            {
                attributesGroup[groupIndex] = attributes?.Where(pair => pair.Value?.group == groupIndex)?.OrderBy(pair => pair.Value.orderInGroup);
            }
            if (!attributesGroup.ContainsKey(groupIndex))
            {
                throw new ArgumentException("Unknown groupIndex");
            }

            var area = new OverridableFrameSettingsArea(attributesGroup[groupIndex].Count(), defaultFrameSettings, serializedFrameSettings);

            foreach (var field in attributesGroup[groupIndex])
            {
                area.Add(field.Key);
            }
            return(area);
        }
 public OverridableFrameSettingsArea(int capacity, FrameSettings defaultFrameSettings, SerializedFrameSettings serializedFrameSettings)
 {
     fields = new List <Field>(capacity);
     this.defaultFrameSettings    = defaultFrameSettings;
     this.serializedFrameSettings = serializedFrameSettings;
 }
        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);
        }
Exemplo n.º 8
0
        public SerializedHDCamera(SerializedObject serializedObject)
        {
            this.serializedObject = serializedObject;

            projectionMatrixMode = serializedObject.FindProperty("m_projectionMatrixMode");

            var additionals = CoreEditorUtils.GetAdditionalData <HDAdditionalCameraData>(serializedObject.targetObjects, HDAdditionalCameraData.InitDefaultHDAdditionalCameraData);

            serializedAdditionalDataObject = new SerializedObject(additionals);

            var hideFlags = serializedAdditionalDataObject.FindProperty("m_ObjectHideFlags");

            // We don't hide additional camera data anymore on UX team request. To be compatible with already author scene we force to be visible
            if ((hideFlags.intValue & (int)HideFlags.HideInInspector) > 0)
            {
                hideFlags.intValue = (int)HideFlags.None;
            }
            serializedAdditionalDataObject.ApplyModifiedProperties();

            // Common properties
            dithering = serializedAdditionalDataObject.Find((HDAdditionalCameraData d) => d.dithering);
            stopNaNs  = serializedAdditionalDataObject.Find((HDAdditionalCameraData d) => d.stopNaNs);
            allowDynamicResolution = serializedAdditionalDataObject.Find((HDAdditionalCameraData d) => d.allowDynamicResolution);
            volumeLayerMask        = serializedAdditionalDataObject.Find((HDAdditionalCameraData d) => d.volumeLayerMask);
            clearDepth             = serializedAdditionalDataObject.Find((HDAdditionalCameraData d) => d.clearDepth);
            antialiasing           = serializedAdditionalDataObject.Find((HDAdditionalCameraData d) => d.antialiasing);

            // HDRP specific properties
            iso            = serializedAdditionalDataObject.FindProperty("physicalParameters.m_Iso");
            shutterSpeed   = serializedAdditionalDataObject.FindProperty("physicalParameters.m_ShutterSpeed");
            aperture       = serializedAdditionalDataObject.FindProperty("physicalParameters.m_Aperture");
            bladeCount     = serializedAdditionalDataObject.FindProperty("physicalParameters.m_BladeCount");
            curvature      = serializedAdditionalDataObject.FindProperty("physicalParameters.m_Curvature");
            barrelClipping = serializedAdditionalDataObject.FindProperty("physicalParameters.m_BarrelClipping");
            anamorphism    = serializedAdditionalDataObject.FindProperty("physicalParameters.m_Anamorphism");

            exposureTarget = serializedAdditionalDataObject.Find((HDAdditionalCameraData d) => d.exposureTarget);

            SMAAQuality              = serializedAdditionalDataObject.Find((HDAdditionalCameraData d) => d.SMAAQuality);
            taaSharpenStrength       = serializedAdditionalDataObject.Find((HDAdditionalCameraData d) => d.taaSharpenStrength);
            taaQualityLevel          = serializedAdditionalDataObject.Find((HDAdditionalCameraData d) => d.TAAQuality);
            taaHistorySharpening     = serializedAdditionalDataObject.Find((HDAdditionalCameraData d) => d.taaHistorySharpening);
            taaAntiFlicker           = serializedAdditionalDataObject.Find((HDAdditionalCameraData d) => d.taaAntiFlicker);
            taaMotionVectorRejection = serializedAdditionalDataObject.Find((HDAdditionalCameraData d) => d.taaMotionVectorRejection);
            taaAntiRinging           = serializedAdditionalDataObject.Find((HDAdditionalCameraData d) => d.taaAntiHistoryRinging);
            taaQualityLevel          = serializedAdditionalDataObject.Find((HDAdditionalCameraData d) => d.TAAQuality);

            clearColorMode          = serializedAdditionalDataObject.Find((HDAdditionalCameraData d) => d.clearColorMode);
            backgroundColorHDR      = serializedAdditionalDataObject.Find((HDAdditionalCameraData d) => d.backgroundColorHDR);
            xrRendering             = serializedAdditionalDataObject.Find((HDAdditionalCameraData d) => d.xrRendering);
            passThrough             = serializedAdditionalDataObject.Find((HDAdditionalCameraData d) => d.fullscreenPassthrough);
            customRenderingSettings = serializedAdditionalDataObject.Find((HDAdditionalCameraData d) => d.customRenderingSettings);
            volumeAnchorOverride    = serializedAdditionalDataObject.Find((HDAdditionalCameraData d) => d.volumeAnchorOverride);
            probeLayerMask          = serializedAdditionalDataObject.Find((HDAdditionalCameraData d) => d.probeLayerMask);
            frameSettings           = new SerializedFrameSettings(
                serializedAdditionalDataObject.FindProperty("m_RenderingPathCustomFrameSettings"),
                serializedAdditionalDataObject.Find((HDAdditionalCameraData d) => d.renderingPathCustomFrameSettingsOverrideMask)
                );

            baseCameraSettings = new CameraEditor.Settings(serializedObject);
            baseCameraSettings.OnEnable();
        }
Exemplo n.º 9
0
        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: () => 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         = 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.RayTracing, overrideable: () => hdrpSettings.supportRayTracing);
            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.LODBiasQualityLevel,
                            overridedDefaultValue: ScalableSetting.Level.Low,
                            customGetter: () => (ScalableSetting.Level)serialized.lodBiasQualityLevel.enumValueIndex,
                            customSetter: v => serialized.lodBiasQualityLevel.enumValueIndex = (int)v,
                            customOverrideable: () => serialized.lodBiasMode.enumValueIndex != (int)LODBiasMode.OverrideQualitySettings);

            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,
                            labelOverride: serialized.lodBiasMode.enumValueIndex == (int)LODBiasMode.ScaleQualitySettings ? "Scale Factor" : "LOD Bias");

            area.AmmendInfo(
                FrameSettingsField.MaximumLODLevelMode,
                overridedDefaultValue: MaximumLODLevelMode.FromQualitySettings,
                customGetter: () => (MaximumLODLevelMode)serialized.maximumLODLevelMode.enumValueIndex,
                customSetter: v => serialized.maximumLODLevelMode.enumValueIndex = (int)v
                );
            area.AmmendInfo(FrameSettingsField.MaximumLODLevelQualityLevel,
                            overridedDefaultValue: ScalableSetting.Level.Low,
                            customGetter: () => (ScalableSetting.Level)serialized.maximumLODLevelQualityLevel.enumValueIndex,
                            customSetter: v => serialized.maximumLODLevelQualityLevel.enumValueIndex = (int)v,
                            customOverrideable: () => serialized.maximumLODLevelMode.enumValueIndex != (int)MaximumLODLevelMode.OverrideQualitySettings);

            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,
                            labelOverride: serialized.maximumLODLevelMode.enumValueIndex == (int)MaximumLODLevelMode.OffsetQualitySettings ? "Offset Factor" : "Maximum LOD Level");

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

            area.Draw(withOverride);
        }