//********************************** Banshee Engine (www.banshee3d.com) **************************************************// //**************** Copyright (c) 2019 Marko Pintera (marko.pintera@gmail.com). All rights reserved. **********************// using System; using bs; namespace bs.Editor { /** @addtogroup Windows * @{ */ /// /// Displays settings for the scene camera. /// internal class SceneCameraSettingsWindow : EditorWindow { private const string ExpandStatesKey = "SceneCamera0_ExpandStates"; private InspectorFieldDrawer guiViewSettings; private InspectorFieldDrawer guiMovementSettings; private InspectorFieldDrawer guiRenderSettings; private SceneCameraViewSettings viewSettings; private SceneCameraMoveSettings moveSettings; private RenderSettings renderSettings; private SerializableProperties expandStates; /// /// Opens the options window. /// public static void Open() { OpenWindow(); } /// protected override LocString GetDisplayName() { return new LocEdString("Scene Camera Settings"); } private void OnInitialize() { EditorApplication.OnProjectSave += SaveSettings; SceneWindow sceneWindow = SceneWindow.GetWindow(); if (sceneWindow != null) { viewSettings = sceneWindow.Camera.ViewSettings; moveSettings = sceneWindow.Camera.MoveSettings; renderSettings = sceneWindow.Camera.RenderSettings; } else { viewSettings = ProjectSettings.GetObject(SceneCamera.ViewSettingsKey); moveSettings = ProjectSettings.GetObject(SceneCamera.MoveSettingsKey); renderSettings = ProjectSettings.GetObject(SceneCamera.RenderSettingsKey); } expandStates = ProjectSettings.GetObject(ExpandStatesKey); InspectableContext inspectableContext = new InspectableContext(expandStates); GUILayout mainLayout = GUI.AddLayoutY(); GUIScrollArea scrollArea = new GUIScrollArea(ScrollBarType.ShowIfDoesntFit, ScrollBarType.NeverShow); mainLayout.AddElement(scrollArea); GUILayoutX horzPadLayout = scrollArea.Layout.AddLayoutX(GUIOption.FlexibleWidth(100, 400)); horzPadLayout.AddSpace(5); GUILayout vertLayout = horzPadLayout.AddLayoutY(); horzPadLayout.AddSpace(5); vertLayout.AddSpace(5); vertLayout.AddElement(new GUILabel(new LocEdString("View Settings"), EditorStyles.LabelBold)); GUILayoutY viewSettingsLayout = vertLayout.AddLayoutY(); vertLayout.AddSpace(10); vertLayout.AddElement(new GUILabel(new LocEdString("Move Settings"), EditorStyles.LabelBold)); GUILayoutY moveSettingsLayout = vertLayout.AddLayoutY(); vertLayout.AddSpace(10); vertLayout.AddElement(new GUILabel(new LocEdString("Render Settings"), EditorStyles.LabelBold)); GUILayoutY renderSettingsLayout = vertLayout.AddLayoutY(); guiViewSettings = new InspectorFieldDrawer(inspectableContext, viewSettingsLayout); guiMovementSettings = new InspectorFieldDrawer(inspectableContext, moveSettingsLayout); guiRenderSettings = new InspectorFieldDrawer(inspectableContext, renderSettingsLayout); guiViewSettings.AddDefault(viewSettings); guiMovementSettings.AddDefault(moveSettings); guiRenderSettings.AddDefault(renderSettings); mainLayout.AddSpace(5); GUILayout buttonCenterLayout = mainLayout.AddLayoutX(); mainLayout.AddSpace(5); GUIButton resetToDefaultBtn = new GUIButton(new LocEdString("Reset to defaults")); resetToDefaultBtn.OnClick += () => ConfirmResetToDefault(ResetToDefault, null); buttonCenterLayout.AddFlexibleSpace(); buttonCenterLayout.AddElement(resetToDefaultBtn); buttonCenterLayout.AddFlexibleSpace(); } private void OnEditorUpdate() { InspectableState viewOptionsState = guiViewSettings.Refresh(); if (viewOptionsState != InspectableState.NotModified) { SceneWindow sceneWindow = SceneWindow.GetWindow(); if (sceneWindow != null) sceneWindow.Camera.ViewSettings = viewSettings; ProjectSettings.SetObject(SceneCamera.ViewSettingsKey, viewSettings); } InspectableState moveOptionsState = guiMovementSettings.Refresh(); if (moveOptionsState != InspectableState.NotModified) { SceneWindow sceneWindow = SceneWindow.GetWindow(); if (sceneWindow != null) sceneWindow.Camera.MoveSettings = moveSettings; ProjectSettings.SetObject(SceneCamera.MoveSettingsKey, moveSettings); } InspectableState renderOptionsState = guiRenderSettings.Refresh(); if (renderOptionsState != InspectableState.NotModified) { SceneWindow sceneWindow = SceneWindow.GetWindow(); if (sceneWindow != null) sceneWindow.Camera.RenderSettings = renderSettings; ProjectSettings.SetObject(SceneCamera.RenderSettingsKey, renderSettings); } } private void OnDestroy() { EditorApplication.OnProjectSave -= SaveSettings; } private void SaveSettings() { ProjectSettings.SetObject(ExpandStatesKey, expandStates); } /// /// Resets all scene camera settings to default values. /// private void ResetToDefault() { viewSettings = new SceneCameraViewSettings(); moveSettings = new SceneCameraMoveSettings(); renderSettings = new RenderSettings(); SceneWindow sceneWindow = SceneWindow.GetWindow(); if (sceneWindow != null) { sceneWindow.Camera.ViewSettings = viewSettings; sceneWindow.Camera.MoveSettings = moveSettings; sceneWindow.Camera.RenderSettings = renderSettings; } ProjectSettings.SetObject(SceneCamera.ViewSettingsKey, viewSettings); ProjectSettings.SetObject(SceneCamera.MoveSettingsKey, moveSettings); ProjectSettings.SetObject(SceneCamera.RenderSettingsKey, renderSettings); } /// /// Opens a dialog asking the user whether he wants to reset camera settings to defaults. /// private void ConfirmResetToDefault(Action confirm, Action cancel) { DialogBox.Open("Confirm", "Are you sure you want to reset all scene camera settings to default?", DialogBox.Type.OKCancel, x => { if (x == DialogBox.ResultType.OK) confirm?.Invoke(); else cancel?.Invoke(); }); } } /** @} */ }