From 76c6696eadf11c1ce4f92d2a09ed8889d26c1f0e Mon Sep 17 00:00:00 2001 From: Chandler Cox Date: Fri, 21 Apr 2023 08:36:56 -0500 Subject: [PATCH 1/5] Add saving and re-opening all active scenes between editor sessions. --- Source/Editor/Editor.cs | 53 +++++++++++++++++++++++++++++++---------- 1 file changed, 40 insertions(+), 13 deletions(-) diff --git a/Source/Editor/Editor.cs b/Source/Editor/Editor.cs index 4d2cf4346..bf51dd323 100644 --- a/Source/Editor/Editor.cs +++ b/Source/Editor/Editor.cs @@ -323,8 +323,16 @@ namespace FlaxEditor } case GeneralOptions.StartupSceneModes.LastOpened: { - if (ProjectCache.TryGetCustomData(ProjectDataLastScene, out var lastSceneIdName) && Guid.TryParse(lastSceneIdName, out var lastSceneId)) - Internal_LoadAsset(ref lastSceneId); + if (ProjectCache.TryGetCustomData(ProjectDataLastScene, out var lastSceneIdName)) + { + var lastSceneList = JsonSerializer.Deserialize>(lastSceneIdName); + + foreach (var scene in lastSceneList) + { + var lastScene = scene; + Internal_LoadAsset(ref lastScene); + } + } break; } } @@ -438,18 +446,25 @@ namespace FlaxEditor } case GeneralOptions.StartupSceneModes.LastOpened: { - if (ProjectCache.TryGetCustomData(ProjectDataLastScene, out var lastSceneIdName) && Guid.TryParse(lastSceneIdName, out var lastSceneId)) + if (ProjectCache.TryGetCustomData(ProjectDataLastScene, out var lastSceneIdName)) { - var lastScene = ContentDatabase.Find(lastSceneId); - if (lastScene is SceneItem) - { - Editor.Log("Loading last opened scene"); - Scene.OpenScene(lastSceneId); + var lastSceneList = JsonSerializer.Deserialize>(lastSceneIdName); - // Restore view - if (ProjectCache.TryGetCustomData(ProjectDataLastSceneSpawn, out var lastSceneSpawnName)) - Windows.EditWin.Viewport.ViewRay = JsonSerializer.Deserialize(lastSceneSpawnName); + foreach (var sceneId in lastSceneList) + { + var lastScene = ContentDatabase.Find(sceneId); + if (!(lastScene is SceneItem)) + continue; + + Editor.Log($"Loading last opened scene: {lastScene.ShortName}"); + if (sceneId == lastSceneList[0]) + Scene.OpenScene(sceneId); + else + Level.LoadSceneAsync(sceneId); } + // Restore view + if (ProjectCache.TryGetCustomData(ProjectDataLastSceneSpawn, out var lastSceneSpawnName)) + Windows.EditWin.Viewport.ViewRay = JsonSerializer.Deserialize(lastSceneSpawnName); } break; } @@ -664,9 +679,21 @@ namespace FlaxEditor // Cache last opened scene { - var lastSceneId = Level.ScenesCount > 0 ? Level.Scenes[0].ID : Guid.Empty; + List lastSceneIds = new List(); + if (Level.ScenesCount > 0) + { + foreach (var scene in Level.Scenes) + { + lastSceneIds.Add(scene.ID); + } + } + else + { + lastSceneIds.Add(Guid.Empty); + } + //var lastSceneId = Level.ScenesCount > 0 ? Level.Scenes[0].ID : Guid.Empty; var lastSceneSpawn = Windows.EditWin.Viewport.ViewRay; - ProjectCache.SetCustomData(ProjectDataLastScene, lastSceneId.ToString()); + ProjectCache.SetCustomData(ProjectDataLastScene, JsonSerializer.Serialize(lastSceneIds)); ProjectCache.SetCustomData(ProjectDataLastSceneSpawn, JsonSerializer.Serialize(lastSceneSpawn)); } From c93b41a88d839aac31876c791f23dafe281dc983 Mon Sep 17 00:00:00 2001 From: Chandler Cox Date: Fri, 21 Apr 2023 10:34:40 -0500 Subject: [PATCH 2/5] Small Cleanup --- Source/Editor/Editor.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/Source/Editor/Editor.cs b/Source/Editor/Editor.cs index bf51dd323..1f4725ef7 100644 --- a/Source/Editor/Editor.cs +++ b/Source/Editor/Editor.cs @@ -691,7 +691,6 @@ namespace FlaxEditor { lastSceneIds.Add(Guid.Empty); } - //var lastSceneId = Level.ScenesCount > 0 ? Level.Scenes[0].ID : Guid.Empty; var lastSceneSpawn = Windows.EditWin.Viewport.ViewRay; ProjectCache.SetCustomData(ProjectDataLastScene, JsonSerializer.Serialize(lastSceneIds)); ProjectCache.SetCustomData(ProjectDataLastSceneSpawn, JsonSerializer.Serialize(lastSceneSpawn)); From 918140bc6dbc19c7b881ea100eb88018339b983f Mon Sep 17 00:00:00 2001 From: Chandler Cox Date: Sat, 22 Apr 2023 12:04:57 -0500 Subject: [PATCH 3/5] Change List to Guid[] when deserializing. --- Source/Editor/Editor.cs | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/Source/Editor/Editor.cs b/Source/Editor/Editor.cs index 1f4725ef7..11e16f1ef 100644 --- a/Source/Editor/Editor.cs +++ b/Source/Editor/Editor.cs @@ -325,8 +325,7 @@ namespace FlaxEditor { if (ProjectCache.TryGetCustomData(ProjectDataLastScene, out var lastSceneIdName)) { - var lastSceneList = JsonSerializer.Deserialize>(lastSceneIdName); - + var lastSceneList = JsonSerializer.Deserialize(lastSceneIdName); foreach (var scene in lastSceneList) { var lastScene = scene; @@ -448,8 +447,7 @@ namespace FlaxEditor { if (ProjectCache.TryGetCustomData(ProjectDataLastScene, out var lastSceneIdName)) { - var lastSceneList = JsonSerializer.Deserialize>(lastSceneIdName); - + var lastSceneList = JsonSerializer.Deserialize(lastSceneIdName); foreach (var sceneId in lastSceneList) { var lastScene = ContentDatabase.Find(sceneId); @@ -677,7 +675,7 @@ namespace FlaxEditor // Start exit StateMachine.GoToState(); - // Cache last opened scene + // Cache last opened scenes { List lastSceneIds = new List(); if (Level.ScenesCount > 0) From 6fd636b421856c04c7c2a1d025d946aec2e29baa Mon Sep 17 00:00:00 2001 From: Chandler Cox Date: Fri, 28 Apr 2023 09:33:24 -0500 Subject: [PATCH 4/5] Change to serialize list as array --- Source/Editor/Editor.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Editor/Editor.cs b/Source/Editor/Editor.cs index 11e16f1ef..498c8cbd9 100644 --- a/Source/Editor/Editor.cs +++ b/Source/Editor/Editor.cs @@ -690,7 +690,7 @@ namespace FlaxEditor lastSceneIds.Add(Guid.Empty); } var lastSceneSpawn = Windows.EditWin.Viewport.ViewRay; - ProjectCache.SetCustomData(ProjectDataLastScene, JsonSerializer.Serialize(lastSceneIds)); + ProjectCache.SetCustomData(ProjectDataLastScene, JsonSerializer.Serialize(lastSceneIds.ToArray())); ProjectCache.SetCustomData(ProjectDataLastSceneSpawn, JsonSerializer.Serialize(lastSceneSpawn)); } From 404340b02eaec549441f2d6858a904f1114fe778 Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Fri, 5 May 2023 15:58:18 +0200 Subject: [PATCH 5/5] Improve #1025 --- Source/Editor/Editor.cs | 136 ++++++++++++++++++++-------------------- 1 file changed, 69 insertions(+), 67 deletions(-) diff --git a/Source/Editor/Editor.cs b/Source/Editor/Editor.cs index 498c8cbd9..2bf2a6922 100644 --- a/Source/Editor/Editor.cs +++ b/Source/Editor/Editor.cs @@ -307,6 +307,7 @@ namespace FlaxEditor _areModulesInited = true; // Preload initial scene asset + try { var startupSceneMode = Options.Options.General.StartupSceneMode; if (startupSceneMode == GeneralOptions.StartupSceneModes.LastOpened && !ProjectCache.HasCustomData(ProjectDataLastScene)) @@ -325,8 +326,8 @@ namespace FlaxEditor { if (ProjectCache.TryGetCustomData(ProjectDataLastScene, out var lastSceneIdName)) { - var lastSceneList = JsonSerializer.Deserialize(lastSceneIdName); - foreach (var scene in lastSceneList) + var lastScenes = JsonSerializer.Deserialize(lastSceneIdName); + foreach (var scene in lastScenes) { var lastScene = scene; Internal_LoadAsset(ref lastScene); @@ -336,6 +337,10 @@ namespace FlaxEditor } } } + catch (Exception ex) + { + // Ignore errors + } InitializationStart?.Invoke(); @@ -408,64 +413,69 @@ namespace FlaxEditor } // Load scene - - // scene cmd line argument - var scene = ContentDatabase.Find(_startupSceneCmdLine); - if (scene is SceneItem) + try { - Editor.Log("Loading scene specified in command line"); - Scene.OpenScene(_startupSceneCmdLine); - return; - } - - // if no scene cmd line argument is provided - var startupSceneMode = Options.Options.General.StartupSceneMode; - if (startupSceneMode == GeneralOptions.StartupSceneModes.LastOpened && !ProjectCache.HasCustomData(ProjectDataLastScene)) - { - // Fallback to default project scene if nothing saved in the cache - startupSceneMode = GeneralOptions.StartupSceneModes.ProjectDefault; - } - switch (startupSceneMode) - { - case GeneralOptions.StartupSceneModes.ProjectDefault: - { - if (string.IsNullOrEmpty(GameProject.DefaultScene)) - break; - JsonSerializer.ParseID(GameProject.DefaultScene, out var defaultSceneId); - var defaultScene = ContentDatabase.Find(defaultSceneId); - if (defaultScene is SceneItem) + // Scene cmd line argument + var scene = ContentDatabase.Find(_startupSceneCmdLine); + if (scene is SceneItem) { - Editor.Log("Loading default project scene"); - Scene.OpenScene(defaultSceneId); - - // Use spawn point - Windows.EditWin.Viewport.ViewRay = GameProject.DefaultSceneSpawn; + Editor.Log("Loading scene specified in command line"); + Scene.OpenScene(_startupSceneCmdLine); + return; } - break; - } - case GeneralOptions.StartupSceneModes.LastOpened: - { - if (ProjectCache.TryGetCustomData(ProjectDataLastScene, out var lastSceneIdName)) + var startupSceneMode = Options.Options.General.StartupSceneMode; + if (startupSceneMode == GeneralOptions.StartupSceneModes.LastOpened && !ProjectCache.HasCustomData(ProjectDataLastScene)) { - var lastSceneList = JsonSerializer.Deserialize(lastSceneIdName); - foreach (var sceneId in lastSceneList) + // Fallback to default project scene if nothing saved in the cache + startupSceneMode = GeneralOptions.StartupSceneModes.ProjectDefault; + } + switch (startupSceneMode) + { + case GeneralOptions.StartupSceneModes.ProjectDefault: + { + if (string.IsNullOrEmpty(GameProject.DefaultScene)) + break; + JsonSerializer.ParseID(GameProject.DefaultScene, out var defaultSceneId); + var defaultScene = ContentDatabase.Find(defaultSceneId); + if (defaultScene is SceneItem) { - var lastScene = ContentDatabase.Find(sceneId); - if (!(lastScene is SceneItem)) - continue; - - Editor.Log($"Loading last opened scene: {lastScene.ShortName}"); - if (sceneId == lastSceneList[0]) - Scene.OpenScene(sceneId); - else - Level.LoadSceneAsync(sceneId); + Editor.Log("Loading default project scene"); + Scene.OpenScene(defaultSceneId); + + // Use spawn point + Windows.EditWin.Viewport.ViewRay = GameProject.DefaultSceneSpawn; } - // Restore view - if (ProjectCache.TryGetCustomData(ProjectDataLastSceneSpawn, out var lastSceneSpawnName)) - Windows.EditWin.Viewport.ViewRay = JsonSerializer.Deserialize(lastSceneSpawnName); + break; + } + case GeneralOptions.StartupSceneModes.LastOpened: + { + if (ProjectCache.TryGetCustomData(ProjectDataLastScene, out var lastSceneIdName)) + { + var lastScenes = JsonSerializer.Deserialize(lastSceneIdName); + foreach (var sceneId in lastScenes) + { + var lastScene = ContentDatabase.Find(sceneId); + if (!(lastScene is SceneItem)) + continue; + + Editor.Log($"Loading last opened scene: {lastScene.ShortName}"); + if (sceneId == lastScenes[0]) + Scene.OpenScene(sceneId); + else + Level.LoadSceneAsync(sceneId); + } + + // Restore view + if (ProjectCache.TryGetCustomData(ProjectDataLastSceneSpawn, out var lastSceneSpawnName)) + Windows.EditWin.Viewport.ViewRay = JsonSerializer.Deserialize(lastSceneSpawnName); + } + break; + } } - break; } + catch (Exception ex) + { + // Ignore errors } } @@ -594,8 +604,8 @@ namespace FlaxEditor UI.UpdateStatusBar(); } - if (UI?.StatusBar?.Text != null && !UI.StatusBar.Text.Contains("Auto") && - _saveNowButton != null && _cancelSaveButton != null && + if (UI?.StatusBar?.Text != null && !UI.StatusBar.Text.Contains("Auto") && + _saveNowButton != null && _cancelSaveButton != null && (_saveNowButton.Visible || _cancelSaveButton.Visible)) { _saveNowButton.Visible = false; @@ -677,20 +687,12 @@ namespace FlaxEditor // Cache last opened scenes { - List lastSceneIds = new List(); - if (Level.ScenesCount > 0) - { - foreach (var scene in Level.Scenes) - { - lastSceneIds.Add(scene.ID); - } - } - else - { - lastSceneIds.Add(Guid.Empty); - } + var lastScenes = Level.Scenes; + var lastSceneIds = new Guid[lastScenes.Length]; + for (int i = 0; i < lastScenes.Length; i++) + lastSceneIds[i] = lastScenes[i].ID; var lastSceneSpawn = Windows.EditWin.Viewport.ViewRay; - ProjectCache.SetCustomData(ProjectDataLastScene, JsonSerializer.Serialize(lastSceneIds.ToArray())); + ProjectCache.SetCustomData(ProjectDataLastScene, JsonSerializer.Serialize(lastSceneIds)); ProjectCache.SetCustomData(ProjectDataLastSceneSpawn, JsonSerializer.Serialize(lastSceneSpawn)); }