Exemplo n.º 1
0
 void LoadScenesInBakingSet(ProbeVolumeSceneData.BakingSet set)
 {
     if (!EditorSceneManager.SaveCurrentModifiedScenesIfUserWantsTo())
     {
         return;
     }
     LoadScenes(GetCurrentBakingSet().sceneGUIDs.Select(sceneGUID => m_ScenesInProject.FirstOrDefault(s => s.guid == sceneGUID).GetPath()));
 }
Exemplo n.º 2
0
        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);
                }
            }
        }