void LoadScenesInBakingSet(ProbeVolumeSceneData.BakingSet set) { if (!EditorSceneManager.SaveCurrentModifiedScenesIfUserWantsTo()) { return; } LoadScenes(GetCurrentBakingSet().sceneGUIDs.Select(sceneGUID => m_ScenesInProject.FirstOrDefault(s => s.guid == sceneGUID).GetPath())); }
internal string GetFirstProbeVolumeSceneGUID(ProbeVolumeSceneData.BakingSet set) { foreach (var guid in set.sceneGUIDs) { if (sceneBakingSettings.ContainsKey(guid) && sceneProfiles.ContainsKey(guid)) { return(guid); } } return(null); }
void BakeLightingForSet(ProbeVolumeSceneData.BakingSet set) { var loadedScenes = new List <string>(); for (int i = 0; i < SceneManager.sceneCount; i++) { var scene = SceneManager.GetSceneAt(i); if (scene.isLoaded) { loadedScenes.Add(scene.path); } } List <int> scenesToUnload = null; List <string> scenesToRestore = null; bool sceneSetChanged = loadedScenes.Count != set.sceneGUIDs.Count || loadedScenes.Any(scene => !set.sceneGUIDs.Contains(AssetDatabase.AssetPathToGUID(scene))); if (sceneSetChanged) { // Save current scenes: if (!EditorSceneManager.SaveCurrentModifiedScenesIfUserWantsTo()) { Debug.LogError("Can't bake while a scene is dirty!"); return; } scenesToUnload = new List <int>(); scenesToRestore = new List <string>(); for (int i = 0; i < SceneManager.sceneCount; i++) { var scene = SceneManager.GetSceneAt(i); scenesToRestore.Add(scene.path); if (!scene.isLoaded) { scenesToUnload.Add(i); } } // Load all the scenes LoadScenesInBakingSet(set); } // Then we wait 1 frame for HDRP to render and bake bool skipFirstFrame = true; EditorApplication.update += WaitRenderAndBake; void WaitRenderAndBake() { if (skipFirstFrame) { skipFirstFrame = false; return; } EditorApplication.update -= WaitRenderAndBake; UnityEditor.Lightmapping.BakeAsync(); // Enqueue scene restore operation after bake is finished if (sceneSetChanged) { EditorApplication.update += RestoreScenesAfterBake; } } void RestoreScenesAfterBake() { if (Lightmapping.isRunning) { return; } EditorApplication.update -= RestoreScenesAfterBake; if (!EditorSceneManager.SaveCurrentModifiedScenesIfUserWantsTo()) { return; } LoadScenes(scenesToRestore); foreach (var sceneIndex in scenesToUnload) { EditorSceneManager.CloseScene(SceneManager.GetSceneAt(sceneIndex), false); } } }