Пример #1
0
        /// <summary>
        /// Function run when the OnPreCullEvent is raised on the Aura main component
        /// </summary>
        private void Camera_onPreCull(Camera camera)
        {
#if UNITY_EDITOR
            if (IsActive && (AuraCamera.IsFirstRegisteredCamera(camera) || CameraExtensions.IsSceneViewCamera(camera)))
#else
            if (IsActive && AuraCamera.IsFirstRegisteredCamera(camera))
#endif
            {
                if (this == null)
                {
                    Camera.onPreCull -= Camera_onPreCull;
                    return;
                }

                if (CastsShadows)
                {
                    switch (Type)
                    {
                    case LightType.Point:
                    {
                        _copyShadowmapCommandBuffer.Clear();
                    }
                    break;
                    }
                }

                UpdateBoundingSphere();
            }
        }
Пример #2
0
        /// <summary>
        /// Constructor
        /// </summary>
        public Frustum(FrustumSettings frustumSettings, Camera camera, AuraCamera auraComponent)
        {
            _frustumSettings = frustumSettings;
            _frustumSettings.OnFrustumQualityChanged += _frustumSettings_OnFrustumQualityChanged;

            _cameraComponent     = camera;
            _auraComponent       = auraComponent;
            _volumesManager      = new VolumesManager(_cameraComponent, _frustumSettings);
            _spotLightsManager   = new SpotLightsManager(_cameraComponent, _frustumSettings);
            _pointLightsManager  = new PointLightsManager(_cameraComponent, _frustumSettings);
            _frustumSettingsToId = new FrustumSettingsToId(_frustumSettings, _auraComponent, _volumesManager, _spotLightsManager, _pointLightsManager);

            InitializeResources();

            _computeDataComputeShader.GetKernelThreadGroupSizes(0, out _threadSizeX, out _threadSizeY, out _threadSizeZ);

            SetFrustumGridResolution(_frustumSettings.QualitySettings.frustumGridResolution);

            _previousOcclusionCullingState = _frustumSettingsToId.HasFlags(FrustumParameters.EnableOcclusionCulling);
            _previousLightProbesState      = _frustumSettingsToId.HasFlags(FrustumParameters.EnableLightProbes);

            _cameraRanges = new Vector4();
            _zParameters  = new Vector4();
            _frustumCornersWorldPositionArray          = new float[32];
            _secondaryFrustumCornersWorldPositionArray = new float[32];
            _previousWorldToClipMatrix                = new Matrix4x4();
            _previousWorldToClipMatrixFloats          = new float[16];
            _previousSecondaryWorldToClipMatrix       = new Matrix4x4();
            _previousSecondaryWorldToClipMatrixFloats = new float[16];
        }
Пример #3
0
        /// <summary>
        /// Draws the editor
        /// </summary>
        /// <param name="serializedObject"></param>
        /// <param name="auraComponent"></param>
        public static void DrawCustomEditor(SerializedObject serializedObject, AuraCamera auraComponent)
        {
            serializedObject.Update();

            if (auraComponent == null)
            {
                EditorGUILayout.BeginVertical(GuiStyles.ButtonNoHover);

                //GuiHelpers.DrawHeader(Aura.ResourcesCollection.logoTexture);
                EditorGUILayout.LabelField(new GUIContent(" Aura <b>Base Settings</b>", Aura.ResourcesCollection.baseSettingsPresetIconTexture), new GUIStyle(GuiStyles.LabelCenteredBigBackground)
                {
                    fontSize = 24
                });

                EditorGUILayout.Separator();
            }
            else
            {
                Initialize(serializedObject);
            }

            DisplayBaseSettingsArea();

            if (auraComponent == null)
            {
                EditorGUILayout.Separator();
                GuiHelpers.DisplayHelpToShowHelpBox();
                EditorGUILayout.EndVertical();

                EditorGUILayout.Separator();
                EditorGUILayout.Separator();
            }

            serializedObject.ApplyModifiedProperties();
        }
Пример #4
0
        static void DrawGizmoForAuraCamera(AuraCamera component, GizmoType gizmoType)
        {
            bool isFaded = (int)gizmoType == (int)GizmoType.NonSelected || (int)gizmoType == (int)GizmoType.NotInSelectionHierarchy || (int)gizmoType == (int)GizmoType.NonSelected + (int)GizmoType.NotInSelectionHierarchy;

            if (isFaded && !AuraEditorPrefs.DisplayGizmosWhenUnselected || !isFaded && !AuraEditorPrefs.DisplayGizmosWhenSelected)
            {
                return;
            }

            float opacity = isFaded ? 0.5f : 1.0f;

            Camera    camera = component.GetComponent <Camera>();
            Matrix4x4 tmp    = Gizmos.matrix;

            Gizmos.matrix = camera.transform.localToWorldMatrix;
            Gizmos.color  = CustomGizmo.color * new Color(1.0f, 1.0f, 1.0f, opacity);
            Gizmos.DrawFrustum(Vector3.zero, camera.fieldOfView, component.frustumSettings.qualitySettings.farClipPlaneDistance, 0, camera.aspect);
            Gizmos.matrix = tmp;

            if (!isFaded && AuraEditorPrefs.DisplayCameraSlicesInEdition)
            {
                for (int i = 1; i < component.frustumSettings.qualitySettings.frustumGridResolution.z; ++i)
                {
                    float sliceRatio = (float)i / component.frustumSettings.qualitySettings.frustumGridResolution.z;
                    sliceRatio = 1.0f - Mathf.Pow(1.0f - sliceRatio, component.frustumSettings.qualitySettings.depthBiasCoefficient);
                    float     distance    = sliceRatio * component.frustumSettings.qualitySettings.farClipPlaneDistance;
                    Vector2   frustumSize = camera.GetFrustumSizeAtDistance(distance);
                    Matrix4x4 matrix      = Matrix4x4.TRS(component.transform.position + component.transform.forward * distance, component.transform.rotation * Quaternion.Euler(90, 0, 0), new Vector3(frustumSize.x, 1, frustumSize.y));
                    CustomGizmo.DrawSquare(matrix, CustomGizmo.color * new Color(1.0f, 1.0f, 1.0f, 0.5f), CustomGizmo.pixelWidth);
                }
            }
        }
Пример #5
0
 public FrustumSettingsToId(FrustumSettings settings, AuraCamera auraComponent, VolumesManager volumesManager, SpotLightsManager spotLightsManager, PointLightsManager pointLightsManager)
 {
     _frustumSettings    = settings;
     _auraComponent      = auraComponent;
     _volumesManager     = volumesManager;
     _spotLightsManager  = spotLightsManager;
     _pointLightsManager = pointLightsManager;
 }
        public override void OnInspectorGUI()
        {
            try
            {
                serializedObject.Update();
                _defaultEditor.OnInspectorGUI();
                serializedObject.ApplyModifiedProperties();

                if (AuraEditorPrefs.DisplayAuraGuiInParentComponents)
                {
                    EditorGUILayout.Separator();
                    EditorGUILayout.BeginVertical(GuiStyles.Background);

                    AuraCamera component = _targetObject.gameObject.GetComponent <AuraCamera>();
                    if (component == null)
                    {
                        if (GUILayout.Button(new GUIContent(" Add <b>Aura Camera</b>", Aura.ResourcesCollection.cameraUiIconTexture), new GUIStyle(GuiStyles.ButtonNoBorder)
                        {
                            fontSize = 18
                        }, GUILayout.Height(32)))
                        {
                            Undo.AddComponent <AuraCamera>(_targetObject.gameObject);
                        }
                    }
                    else
                    {
                        EditorGUILayout.BeginHorizontal();
                        if (GUILayout.Button(new GUIContent((component.enabled ? " Disable" : " Enable") + " <b>Aura Camera</b>", Aura.ResourcesCollection.cameraUiIconTexture), new GUIStyle(GuiStyles.ButtonNoBorder)
                        {
                            fontSize = 18
                        }, GUILayout.Height(32)))
                        {
                            component.enabled = !component.enabled;
                        }
                        if (GUILayout.Button(new GUIContent(Aura.ResourcesCollection.removeIconTexture, "Remove Aura Camera"), GuiStyles.ButtonImageOnlyNoBorder, GUILayout.Width(32), GUILayout.Height(32)))
                        {
                            component.Destroy();
                            component = null;
                        }
                        EditorGUILayout.EndHorizontal();
                    }

                    EditorGUILayout.EndVertical();
                    EditorGUILayout.Separator();
                }
            }
            catch {}
        }
Пример #7
0
        /// <summary>
        /// Returns an array with all the aura cameras
        /// </summary>
        /// <param name="minAmount">Creates default Aura cameras to reach the minimum amount</param>
        /// <returns>An array with the aura cameras</returns>
        public static AuraCamera[] GetAuraCameras(int minAmount = 0)
        {
            AuraCamera[] auraCameras = AuraCamera.FindObjectsOfType <AuraCamera>();
            if (minAmount > auraCameras.Length)
            {
                AuraCamera[] newCameras = new AuraCamera[minAmount - auraCameras.Length];
                for (int i = 0; i < newCameras.Length; ++i)
                {
                    newCameras[i] = AuraCamera.CreateGameObject("Aura Camera").GetComponent <AuraCamera>();
                }

                auraCameras = auraCameras.Append(newCameras);
            }

            return(auraCameras);
        }
Пример #8
0
        private void OnEnable()
        {
            _currentAuraComponent = (AuraCamera)serializedObject.targetObject;

            _baseSettingsTabButtonContent = new GUIContent("Base Settings", Aura.ResourcesCollection.injectionIconTexture, "Displays the BASE SETTINGS panel");
            _baseSettingsProperty         = serializedObject.FindProperty("frustumSettings.baseSettings");

            _qualitySettingsTabButtonContent = new GUIContent("Quality Settings", Aura.ResourcesCollection.optionsIconTexture, "Displays the QUALITY SETTINGS panel");
            _qualitySettingsProperty         = serializedObject.FindProperty("frustumSettings.qualitySettings");

            _previousQualitySettings = (AuraQualitySettings)_qualitySettingsProperty.objectReferenceValue;

            PopulateExistingBaseSettingsPresetsList();

            PopulateExistingQualitySettingsPresetsList();
        }
Пример #9
0
        /// <summary>
        /// Draws the inspector
        /// </summary>
        public static void DrawCustomEditor(SerializedObject serializedObject, AuraCamera auraComponent, bool displayHeaderAndHelpBox, bool forceDisplayEditionSettings)
        {
            serializedObject.Update();

            if (displayHeaderAndHelpBox)
            {
                EditorGUILayout.BeginVertical(GuiStyles.ButtonNoHover);

                EditorGUILayout.BeginHorizontal(GuiStyles.BackgroundNoBorder);
                EditorGUILayout.LabelField(new GUIContent(" Aura <b>Quality Settings</b>", Aura.ResourcesCollection.qualitySettingsPresetIconTexture), new GUIStyle(GuiStyles.LabelCenteredBigBackground)
                {
                    fontSize = 24
                });
                EditorGUILayout.EndHorizontal();

                EditorGUILayout.Separator();
            }

            Initialize(serializedObject);

            if (IsEditionQualitySettings && !forceDisplayEditionSettings)
            {
                EditorGUILayout.Separator();
                EditorGUILayout.BeginHorizontal(GuiStyles.Background);
                EditorGUILayout.Separator();
                GUILayout.Label(new GUIContent(" DO NOT DELETE THIS FILE!", Aura.ResourcesCollection.settingsIconTexture), GuiStyles.LabelBoldCenteredBig);
                EditorGUILayout.Separator();
                EditorGUILayout.EndHorizontal();
            }
            else
            {
                DisplaySettingsArea(serializedObject, auraComponent);

                if (displayHeaderAndHelpBox)
                {
                    EditorGUILayout.Separator();
                    GuiHelpers.DisplayHelpToShowHelpBox();
                    EditorGUILayout.EndVertical();

                    EditorGUILayout.Separator();
                    EditorGUILayout.Separator();
                }
            }

            serializedObject.ApplyModifiedProperties();
        }
Пример #10
0
        /// <summary>
        /// Constructor
        /// </summary>
        public Frustum(FrustumSettings frustumSettings, Camera camera, AuraCamera auraComponent)
        {
            _frustumSettings = frustumSettings;
            _frustumSettings.OnFrustumQualityChanged += _frustumSettings_OnFrustumQualityChanged;

            _cameraComponent     = camera;
            _auraComponent       = auraComponent;
            _volumesManager      = new VolumesManager(_cameraComponent, _frustumSettings);
            _spotLightsManager   = new SpotLightsManager(_cameraComponent, _frustumSettings);
            _pointLightsManager  = new PointLightsManager(_cameraComponent, _frustumSettings);
            _frustumSettingsToId = new FrustumSettingsToId(_frustumSettings, _auraComponent, _volumesManager, _spotLightsManager, _pointLightsManager);

            InitializeResources();

            _computeDataComputeShader.GetKernelThreadGroupSizes(0, out _threadSizeX, out _threadSizeY, out _threadSizeZ);

            SetFrustumGridResolution(_frustumSettings.QualitySettings.frustumGridResolution);

            _previousOcclusionCullingState = _frustumSettingsToId.HasFlags(FrustumParameters.EnableOcclusionCulling);
            _previousLightProbesState      = _frustumSettingsToId.HasFlags(FrustumParameters.EnableLightProbes);
        }
Пример #11
0
        /// <summary>
        ///     Called when any camera is a about to render
        /// </summary>
        private void Camera_onPreRender(Camera camera)
        {
#if UNITY_EDITOR
            if (IsActive && ((AuraCamera.IsFirstRegisteredCamera(camera) || CameraExtensions.IsSceneViewCamera(camera)) || Type == LightType.Directional))
#else
            if (IsActive && (AuraCamera.IsFirstRegisteredCamera(camera) || Type == LightType.Directional))
#endif
            {
                if (this == null)
                {
                    Camera.onPreRender -= Camera_onPreRender;
                    return;
                }

                if (CastsCookie)
                {
                    CopyCookieMap();
                }

                PackParameters(camera);
            }
        }
Пример #12
0
        static void HierarchyWindowItemOnGUI(int instanceID, Rect selectionRect)
        {
            if (AuraEditorPrefs.DisplayButtonsInHierarchy)
            {
                GameObject gameObject = (GameObject)EditorUtility.InstanceIDToObject(instanceID);

                if (gameObject != null)
                {
                    float  size = selectionRect.height;
                    Rect   rect = new Rect(selectionRect.x + selectionRect.width, selectionRect.y, size, size);
                    string tooltip;
                    bool   state;


                    //// Cameras

                    Camera     camera     = gameObject.GetComponent <Camera>();
                    AuraCamera auraCamera = gameObject.GetComponent <AuraCamera>();
                    if (camera != null && auraCamera == null)
                    {
                        tooltip = "Add Aura Camera Component";
                        rect.x -= size;

                        if (GUI.Button(rect, new GUIContent(Aura.ResourcesCollection.addIconTexture, tooltip), GuiStyles.ButtonImageOnlyNoBorder))
                        {
                            gameObject.AddComponent <AuraCamera>();
                        }
                    }

                    if (auraCamera != null)
                    {
                        state   = auraCamera.enabled;
                        tooltip = (state ? "Disable" : "Enable") + " Aura Camera";
                        rect.x -= size;

                        if (GUI.Button(rect, new GUIContent(Aura.ResourcesCollection.cameraMiniIconTexture, tooltip), state ? GuiStyles.ButtonPressedImageOnlyNoBorder : GuiStyles.ButtonImageOnlyNoBorder)) // TODO : MAKE THIS A GENERIC HELPER
                        {
                            auraCamera.enabled = !state;
                        }
                    }

                    //// Lights

                    Light     light     = gameObject.GetComponent <Light>();
                    AuraLight auraLight = gameObject.GetComponent <AuraLight>();
                    if (light != null && auraLight == null)
                    {
                        tooltip = "Add Aura Light Component";
                        rect.x -= size;

                        if (GUI.Button(rect, new GUIContent(Aura.ResourcesCollection.addIconTexture, tooltip), GuiStyles.ButtonImageOnlyNoBorder))
                        {
                            gameObject.AddComponent <AuraLight>();
                        }
                    }

                    if (auraLight != null && auraLight.Type != LightType.Area)
                    {
                        state   = auraLight.enabled;
                        tooltip = (state ? "Disable" : "Enable") + " Aura Light";
                        rect.x -= size;
                        Texture2D texture = Aura.ResourcesCollection.pointLightMiniIconTexture;
                        switch (auraLight.Type)
                        {
                        case LightType.Directional:
                        {
                            texture = Aura.ResourcesCollection.directionalLightMiniIconTexture;
                        }
                        break;

                        case LightType.Spot:
                        {
                            texture = Aura.ResourcesCollection.spotLightMiniIconTexture;
                        }
                        break;
                        }

                        if (GUI.Button(rect, new GUIContent(texture, tooltip), state ? GuiStyles.ButtonPressedImageOnlyNoBorder : GuiStyles.ButtonImageOnlyNoBorder)) // TODO : MAKE THIS A GENERIC HELPER
                        {
                            auraLight.enabled = !state;
                        }
                    }

                    //// Volumes

                    AuraVolume auraVolume = gameObject.GetComponent <AuraVolume>();
                    if (auraVolume != null)
                    {
                        state   = auraVolume.enabled;
                        tooltip = (state ? "Disable" : "Enable") + " Aura Volume";
                        rect.x -= size;

                        if (GUI.Button(rect, new GUIContent(Aura.ResourcesCollection.shapeMiniIconTexture, tooltip), state ? GuiStyles.ButtonPressedImageOnlyNoBorder : GuiStyles.ButtonImageOnlyNoBorder)) // TODO : MAKE THIS A GENERIC HELPER
                        {
                            auraVolume.enabled = !state;
                        }
                    }

                    //// Sprites

                    SpriteRenderer spriteRenderer = gameObject.GetComponent <SpriteRenderer>();
                    AuraSprite     auraSprite     = gameObject.GetComponent <AuraSprite>();
                    if (spriteRenderer != null && auraSprite == null)
                    {
                        tooltip = "Add Aura Sprite Component";
                        rect.x -= size;

                        if (GUI.Button(rect, new GUIContent(Aura.ResourcesCollection.addIconTexture, tooltip), GuiStyles.ButtonImageOnlyNoBorder))
                        {
                            gameObject.AddComponent <AuraSprite>();
                        }
                    }

                    if (auraSprite != null)
                    {
                        tooltip = "Aura Sprite";
                        rect.x -= size;
                        GUI.Label(rect, new GUIContent(Aura.ResourcesCollection.spriteMiniIconTexture, tooltip), GuiStyles.ButtonPressedImageOnlyNoBorder);
                    }
                }
            }
        }
Пример #13
0
 /// <summary>
 /// Unregisters the given AuraCamera from the static list
 /// </summary>
 /// <param name="auraCamera">The AuraCamera to unregister</param>
 ///
 private static void Unregister(AuraCamera auraCamera)
 {
     _registeredAuraCamerasList.Remove(auraCamera);
     FireOnRegisteredAuraCamerasListChanged();
 }
Пример #14
0
 /// <summary>
 /// Registers the given AuraCamera to the static list
 /// </summary>
 /// <param name="auraCamera">The AuraCamera to register</param>
 private static void Register(AuraCamera auraCamera)
 {
     _registeredAuraCamerasList.Add(auraCamera);
     FireOnRegisteredAuraCamerasListChanged();
 }
Пример #15
0
        /// <summary>
        /// Displays the content of the settings tab
        /// </summary>
        private static void DisplaySettingsArea(SerializedObject serializedObject, AuraCamera auraComponent)
        {
            EditorGUILayout.BeginVertical(GuiStyles.Background);

            EditorGUILayout.BeginVertical(GuiStyles.ButtonNoHover);

            EditorGUILayout.Separator();
            GUILayout.Label(new GUIContent(" Debug", Aura.ResourcesCollection.debugIconTexture), GuiStyles.LabelBoldCenteredBig);
            EditorGUILayout.Separator();

            GuiHelpers.DrawToggleChecker(ref _debugVolumetricLightingProperty, "Display Volumetric Lighting Only");

            EditorGUILayout.Separator();

            GuiHelpers.DrawToggleChecker(ref _debugOcclusionCullingProperty, "Display Occlusion Miss");

            EditorGUILayout.Separator();
            EditorGUILayout.Separator();

            EditorGUILayout.EndVertical();

            EditorGUILayout.Separator();
            EditorGUILayout.Separator();
            EditorGUILayout.Separator();

            EditorGUILayout.BeginVertical(GuiStyles.ButtonNoHover);

            EditorGUILayout.Separator();
            GUILayout.Label(new GUIContent(" Grid", Aura.ResourcesCollection.gridIconTexture), GuiStyles.LabelBoldCenteredBig);
            EditorGUILayout.Separator();

            GuiHelpers.DrawContextualHelpBox("The \"Grid\" parameters allow you to determine the density of cells used to compute the volumetric lighting.\n\nThis cubic grid will be remapped on the frustum (the volume visible to the camera) and will range from the camera's near clip distance to the \"Range\" distance parameter (for performance saving and because behind a certain distance, changes are barely noticeable).");

            EditorGUILayout.Separator();
            EditorGUILayout.Separator();

            EditorGUILayout.BeginVertical();
            if (!IsEditionQualitySettings)
            {
                _frustumGridResolutionProperty.FindPropertyRelative("x").intValue = Mathf.Max(8, EditorGUILayout.IntField("Horizontal", _frustumGridResolutionProperty.FindPropertyRelative("x").intValue));
                _frustumGridResolutionProperty.FindPropertyRelative("y").intValue = Mathf.Max(8, EditorGUILayout.IntField("Vertical", _frustumGridResolutionProperty.FindPropertyRelative("y").intValue));
                _frustumGridResolutionProperty.FindPropertyRelative("z").intValue = Mathf.Max(8, EditorGUILayout.IntField("Depth", _frustumGridResolutionProperty.FindPropertyRelative("z").intValue));
                EditorGUILayout.Separator();
                if (GUILayout.Button("Set Resolution", GuiStyles.ButtonBold))
                {
                    //if (IsEditionQualitySettings)
                    //{
                    //    SceneViewVisualization.SetSceneViewVisualizationFrustumGridResolution(_frustumGridResolutionProperty.vector3IntValue);
                    //}
                    //else
                    {
                        _current.SetFrustumGridResolution(_frustumGridResolutionProperty.vector3IntValue);
                    }
                }

                EditorGUILayout.Separator();
                EditorGUILayout.Separator();

                GuiHelpers.DrawToggleChecker(ref _enableAutomaticStereoResizingProperty, new GUIContent("Resize Automatically In Stereo Mode", "Enables the automatic horizontal resizing of the frustum grid resolution when the camera is running in stereo mode\n(halved size for MultiPass, doubled size for SinglePass)"));

                EditorGUILayout.Separator();
                EditorGUILayout.Separator();
            }
            else
            {
                GuiHelpers.DrawHelpBox("Custom grid resolution in SceneView is not currently available", HelpBoxType.Experimental);
                EditorGUILayout.Separator();
                EditorGUILayout.Separator();
            }

            GuiHelpers.DrawPositiveOnlyFloatField(ref _gridSettingsFarPlaneProperty, "Range");
            if (auraComponent != null && _gridSettingsFarPlaneProperty.floatValue < auraComponent.CameraComponent.nearClipPlane)
            {
                GuiHelpers.DrawHelpBox("Range must be bigger than 0", HelpBoxType.Warning);
            }

            EditorGUILayout.Separator();

            GuiHelpers.DrawSlider(ref _depthBiasCoefficientProperty, 0, 1, "Depth Bias", true);

            EditorGUILayout.Separator();
            EditorGUILayout.Separator();

            GuiHelpers.DrawContextualHelpBox("The \"Occlusion Culling\" allows to compute the maximum visible depth of the frustum grid.\n\nThis leads to avoid computing cells that are invisible to the camera because hidden behind objects.");
            GuiHelpers.DrawToggleChecker(ref _enableOcclusionCullingProperty, "Enable Occlusion Culling");
            EditorGUI.BeginDisabledGroup(!_enableOcclusionCullingProperty.boolValue);
            EditorGUILayout.BeginVertical(GuiStyles.EmptyMiddleAligned);
            EditorGUILayout.PropertyField(_occlusionCullingAccuracyProperty, new GUIContent("Accuracy"));
            EditorGUILayout.EndVertical();
            EditorGUI.EndDisabledGroup();

            EditorGUILayout.Separator();
            EditorGUILayout.Separator();

            EditorGUILayout.EndVertical();

            EditorGUILayout.EndVertical();

            EditorGUILayout.Separator();
            EditorGUILayout.Separator();
            EditorGUILayout.Separator();

            EditorGUILayout.BeginVertical(GuiStyles.ButtonNoHover);

            EditorGUILayout.Separator();
            GUILayout.Label(new GUIContent(" Filtering", Aura.ResourcesCollection.cameraIconTexture), GuiStyles.LabelBoldCenteredBig);
            EditorGUILayout.Separator();

            GuiHelpers.DrawContextualHelpBox("These parameters allow to configure the filtering of the volumetric data.");

            EditorGUILayout.Separator();
            EditorGUILayout.Separator();

            EditorGUILayout.BeginVertical();
            GuiHelpers.DrawToggleChecker(ref _enableDitheringProperty, "Enable Color Dithering");

            EditorGUILayout.Separator();
            EditorGUILayout.Separator();
            EditorGUILayout.Separator();

            EditorGUILayout.PropertyField(_texture3DFilteringProperty, new GUIContent("Texture3D Filtering"));

            EditorGUILayout.Separator();
            EditorGUILayout.Separator();
            EditorGUILayout.Separator();

            GuiHelpers.DrawContextualHelpBox("The \"Reprojection\" allows to blend the current (jittered) computed frame with the previous one.\n\nThis leads to a smoother volumetric lighting, especially with a low resolution grid.");
            GuiHelpers.DrawToggleChecker(ref _enableTemporalReprojectionProperty, "Enable Reprojection");
            EditorGUI.BeginDisabledGroup(!_enableTemporalReprojectionProperty.boolValue);
            EditorGUILayout.BeginVertical(GuiStyles.EmptyMiddleAligned);
            GuiHelpers.DrawSlider(ref _temporalReprojectionFactorProperty, 0, 1, "Reprojector factor");
            EditorGUILayout.EndVertical();
            EditorGUI.EndDisabledGroup();

            EditorGUILayout.Separator();

            EditorGUILayout.EndVertical();
            EditorGUILayout.EndVertical();

            EditorGUILayout.Separator();
            EditorGUILayout.Separator();
            EditorGUILayout.Separator();

            EditorGUILayout.BeginVertical(GuiStyles.ButtonNoHover);

            EditorGUILayout.Separator();
            GUILayout.Label(new GUIContent(" Options", Aura.ResourcesCollection.optionsIconTexture), GuiStyles.LabelBoldCenteredBig);
            EditorGUILayout.Separator();

            GuiHelpers.DrawContextualHelpBox("These parameters allow you to enable/disable some options.\n\nNote that the existence of the different contributions are handled by the system at runtime.");

            EditorGUILayout.Separator();
            EditorGUILayout.Separator();

            EditorGUILayout.BeginVertical();

            GuiHelpers.DrawToggleChecker(ref _enableAmbientLightingProperty, "Enable Ambient Lighting");

            EditorGUILayout.Separator();
            EditorGUILayout.Separator();

            GuiHelpers.DrawToggleChecker(ref _enableVolumesProperty, "Enable Volumes");
            EditorGUI.BeginDisabledGroup(!_enableVolumesProperty.boolValue);
            EditorGUILayout.BeginVertical(GuiStyles.EmptyMiddleAligned);
            GuiHelpers.DrawToggleChecker(ref _enableVolumesNoiseMaskProperty, "Enable Noise Masks");
            EditorGUILayout.Separator();
            GuiHelpers.DrawToggleChecker(ref _enableVolumesTexture2DMaskProperty, "Enable Texture2D Masks");
            EditorGUILayout.Separator();
            GuiHelpers.DrawToggleChecker(ref _enableVolumesTexture3DMaskProperty, "Enable Texture3D Masks");
            EditorGUILayout.EndVertical();
            EditorGUI.EndDisabledGroup();

            EditorGUILayout.Separator();
            EditorGUILayout.Separator();

            GuiHelpers.DrawToggleChecker(ref _enableDirectionalLightsProperty, "Enable Directional Lights");
            EditorGUI.BeginDisabledGroup(!_enableDirectionalLightsProperty.boolValue);
            EditorGUILayout.BeginVertical(GuiStyles.EmptyMiddleAligned);
            GuiHelpers.DrawToggleChecker(ref _enableDirectionalLightsShadowsProperty, "Enable Shadows");
            EditorGUILayout.EndVertical();
            EditorGUI.EndDisabledGroup();

            EditorGUILayout.Separator();
            EditorGUILayout.Separator();

            GuiHelpers.DrawToggleChecker(ref _enableSpotLightsProperty, "Enable Spot Lights");
            EditorGUI.BeginDisabledGroup(!_enableSpotLightsProperty.boolValue);
            EditorGUILayout.BeginVertical(GuiStyles.EmptyMiddleAligned);
            GuiHelpers.DrawToggleChecker(ref _enableSpotLightsShadowsProperty, "Enable Shadows");
            EditorGUILayout.EndVertical();
            EditorGUI.EndDisabledGroup();

            EditorGUILayout.Separator();
            EditorGUILayout.Separator();

            GuiHelpers.DrawToggleChecker(ref _enablePointLightsProperty, "Enable Point Lights");
            EditorGUI.BeginDisabledGroup(!_enablePointLightsProperty.boolValue);
            EditorGUILayout.BeginVertical(GuiStyles.EmptyMiddleAligned);
            GuiHelpers.DrawToggleChecker(ref _enablePointLightsShadowsProperty, "Enable Shadows");
            EditorGUILayout.EndVertical();
            EditorGUI.EndDisabledGroup();

            EditorGUILayout.Separator();
            EditorGUILayout.Separator();

            EditorGUI.BeginDisabledGroup(!_enableSpotLightsProperty.boolValue && !_enableSpotLightsProperty.boolValue && !_enableDirectionalLightsProperty.boolValue);
            GuiHelpers.DrawToggleChecker(ref _enableLightsCookiesProperty, "Enable Cookies");
            EditorGUI.EndDisabledGroup();

            EditorGUILayout.Separator();

            EditorGUILayout.EndVertical();

            EditorGUILayout.EndVertical();

            EditorGUILayout.Separator();
            EditorGUILayout.Separator();
            EditorGUILayout.Separator();

            EditorGUILayout.BeginVertical(GuiStyles.ButtonNoHover);

            EditorGUILayout.Separator();
            GUILayout.Label(new GUIContent(" Experimental Features", Aura.ResourcesCollection.experimentalIconTexture), GuiStyles.LabelBoldCenteredBig);
            EditorGUILayout.Separator();

            GuiHelpers.DrawHelpBox("These features are still under active development.\nThey might currently lead to visual/performance issues.", HelpBoxType.Experimental);

            EditorGUILayout.Separator();
            EditorGUILayout.Separator();

            GuiHelpers.DrawToggleChecker(ref _enableDenoisingFilterProperty, "Enable Denoising Filter");
            EditorGUI.BeginDisabledGroup(!_enableDenoisingFilterProperty.boolValue);
            EditorGUILayout.BeginVertical(GuiStyles.EmptyMiddleAligned);
            EditorGUILayout.PropertyField(_denoisingFilterRangeProperty, new GUIContent("Range"));
            EditorGUILayout.EndVertical();
            EditorGUI.EndDisabledGroup();

            EditorGUILayout.Separator();
            EditorGUILayout.Separator();

            GuiHelpers.DrawToggleChecker(ref _enableBlurFilterProperty, "Enable Blur Filter");
            EditorGUI.BeginDisabledGroup(!_enableBlurFilterProperty.boolValue);
            EditorGUILayout.BeginVertical(GuiStyles.EmptyMiddleAligned);
            EditorGUILayout.PropertyField(_blurFilterRangeProperty, new GUIContent("Range"));
            EditorGUILayout.PropertyField(_blurFilterTypeProperty, new GUIContent("Type"));
            if ((BlurFilterType)_blurFilterTypeProperty.enumValueIndex == BlurFilterType.Gaussian)
            {
                GuiHelpers.DrawSlider(ref _blurFilterGaussianDeviationProperty, 0.0f, 0.01f, "Lobe Bulge");
            }
            EditorGUILayout.EndVertical();
            EditorGUI.EndDisabledGroup();

            EditorGUILayout.Separator();
            EditorGUILayout.Separator();

            EditorGUILayout.BeginVertical();

            GuiHelpers.DrawContextualHelpBox("The \"Light Probes\" allows to compute the world space light probes' data and inject it as contributing light in the volumetric lighting system.");
            GuiHelpers.DrawToggleChecker(ref _enableLightProbesProperty, "Enable Light Probes");
            //if(!IsEditionQualitySettings)
            //{
            //    EditorGUI.BeginDisabledGroup(!_enableLightProbesProperty.boolValue);
            //    EditorGUILayout.BeginVertical(GuiStyles.EmptyMiddleAligned);
            //    _lightProbesProxyGridResolutionProperty.FindPropertyRelative("x").intValue = Mathf.Max(2, EditorGUILayout.IntField("Horizontal", _lightProbesProxyGridResolutionProperty.FindPropertyRelative("x").intValue));
            //    _lightProbesProxyGridResolutionProperty.FindPropertyRelative("y").intValue = Mathf.Max(2, EditorGUILayout.IntField("Vertical", _lightProbesProxyGridResolutionProperty.FindPropertyRelative("y").intValue));
            //    _lightProbesProxyGridResolutionProperty.FindPropertyRelative("z").intValue = Mathf.Max(2, EditorGUILayout.IntField("Depth", _lightProbesProxyGridResolutionProperty.FindPropertyRelative("z").intValue));
            //    EditorGUILayout.Separator();
            //    if (GUILayout.Button("Set Resolution", GuiStyles.ButtonNoHover))
            //    {
            //        _current.SetLightProbesProxyGridResolution(_lightProbesProxyGridResolutionProperty.vector3IntValue);
            //    }
            //    EditorGUILayout.EndVertical();
            //    EditorGUI.EndDisabledGroup();
            //}
            EditorGUILayout.Separator();
            EditorGUILayout.EndVertical();

            EditorGUILayout.EndVertical();

            EditorGUILayout.EndVertical();
        }