void OnGUI() { m_TimeSinceLastRepaint = 0; CompositionManager compositor = CompositionManager.GetInstance(); bool enableCompositor = false; if (compositor) { enableCompositor = compositor.enabled; } bool enableCompositorCached = enableCompositor; enableCompositor = EditorGUILayout.Toggle(Styles.enableCompositor, enableCompositor); // Track if the user changed the compositor enable state and mark the scene dirty if necessary if (enableCompositorCached != enableCompositor && compositor != null) { EditorUtility.SetDirty(compositor); } if (compositor == null && enableCompositor) { Debug.Log("The scene does not have a compositor. Creating a new one with the default configuration."); GameObject go = new GameObject("HDRP Compositor") { hideFlags = HideFlags.HideInHierarchy }; compositor = go.AddComponent <CompositionManager>(); // Mark as dirty, so if the user closes the scene right away, the change will be saved. EditorUtility.SetDirty(compositor); // Now add the default configuration CompositionUtils.LoadDefaultCompositionGraph(compositor); CompositionUtils.LoadOrCreateCompositionProfileAsset(compositor); compositor.SetupCompositionMaterial(); CompositionUtils.SetDefaultCamera(compositor); CompositionUtils.SetDefaultLayers(compositor); Undo.RegisterCreatedObjectUndo(compositor.outputCamera.gameObject, "Create Compositor"); Undo.RegisterCreatedObjectUndo(go, "Create Compositor"); } else if (compositor && (compositor.enabled != enableCompositor)) { string message = enableCompositor ? "Enable Compositor" : "Disable Compositor"; Undo.RecordObject(compositor, message); compositor.enabled = enableCompositor; } else if (!compositor) { return; } if (compositor && !compositor.enabled) { if (GUILayout.Button(new GUIContent(Styles.removeCompositor))) { if (compositor.outputCamera) { if (compositor.outputCamera.name == CompositionUtils.k_DefaultCameraName) { var cameraData = compositor.outputCamera.GetComponent <HDAdditionalCameraData>(); if (cameraData != null) { CoreUtils.Destroy(cameraData); } CoreUtils.Destroy(compositor.outputCamera.gameObject); CoreUtils.Destroy(compositor.outputCamera); EditorSceneManager.MarkSceneDirty(EditorSceneManager.GetActiveScene()); } } CoreUtils.Destroy(compositor); return; } } // keep track of shader graph changes: when the user saves a graph, we should load/reflect any new shader properties GraphData.onSaveGraph += MarkShaderAsDirty; if (compositor.profile == null) { // The compositor was loaded, but there was no profile (someone deleted the asset from disk?), so create a new one CompositionUtils.LoadOrCreateCompositionProfileAsset(compositor); compositor.SetupCompositionMaterial(); m_RequiresRedraw = true; } if (m_Editor == null || m_Editor.target == null || m_Editor.isDirty || m_RequiresRedraw) { if (m_Editor != null) { // Remember the previously selected layer when recreating the Editor s_SelectionIndex = m_Editor.selectionIndex; } m_Editor = (CompositionManagerEditor)Editor.CreateEditor(compositor); m_RequiresRedraw = false; m_Editor.defaultSelection = s_SelectionIndex; } m_ScrollPosition = GUILayout.BeginScrollView(m_ScrollPosition); using (new EditorGUI.DisabledScope(!compositor.enabled)) { if (m_Editor) { m_Editor.OnInspectorGUI(); // Remember which layer was selected / drawn in the last draw call s_SelectionIndex = m_Editor.selectionIndex; } } GUILayout.EndScrollView(); }