private void CreateSceneEditObject() { MeshHideAsset source = target as MeshHideAsset; if (source.asset == null) { return; } if (GeometrySelectorWindow.IsOpen) { return; } if (GeometrySelectorExists()) { GameObject.DestroyImmediate(GameObject.Find("GeometrySelector").gameObject); } int saveChoice = EditorUtility.DisplayDialogComplex("Open Mesh Hide Editor", "Opening the Mesh Hide Editor will close all scenes and create a new blank scene. Any current scene changes will be lost unless saved.", "Save and Continue", "Continue without saving", "Cancel"); switch (saveChoice) { case 0: // Save and continue { if (!EditorSceneManager.SaveOpenScenes()) { return; } break; } case 1: // don't save and continue break; case 2: // cancel return; } SceneView sceneView = SceneView.lastActiveSceneView; if (sceneView == null) { EditorUtility.DisplayDialog("Error", "A Scene View must be open and active", "OK"); return; } SceneView.lastActiveSceneView.Focus(); List <GeometrySelector.SceneInfo> currentscenes = new List <GeometrySelector.SceneInfo>(); for (int i = 0; i < EditorSceneManager.sceneCount; i++) { Scene sc = EditorSceneManager.GetSceneAt(i); GeometrySelector.SceneInfo si = new GeometrySelector.SceneInfo(); si.path = sc.path; si.name = sc.name; if (i == 0) { // first scene should clear the temp scene. si.mode = OpenSceneMode.Single; } else { si.mode = sc.isLoaded ? OpenSceneMode.Additive : OpenSceneMode.AdditiveWithoutLoading; } currentscenes.Add(si); } Scene s = EditorSceneManager.NewScene(NewSceneSetup.DefaultGameObjects, NewSceneMode.Single); EditorSceneManager.SetActiveScene(s); GameObject obj = EditorUtility.CreateGameObjectWithHideFlags("GeometrySelector", HideFlags.DontSaveInEditor); GeometrySelector geometry = obj.AddComponent <GeometrySelector>(); if (geometry != null) { Selection.activeGameObject = obj; SceneView.lastActiveSceneView.FrameSelected(true); geometry.meshAsset = source; geometry.restoreScenes = currentscenes; geometry.InitializeFromMeshData(source.asset.meshData); //temporary, only works on submesh 0 geometry.selectedTriangles = new BitArray(source.triangleFlags[0]); geometry.UpdateSelectionMesh(); SceneView.FrameLastActiveSceneView(); SceneView.lastActiveSceneView.FrameSelected(); } }
private void CreateSceneEditObject() { bool focusObject = true; MeshHideAsset source = target as MeshHideAsset; if (source.asset == null) { return; } if (GeometrySelectorWindow.IsOpen) { return; } if (GeometrySelectorExists()) { GameObject.DestroyImmediate(GameObject.Find("GeometrySelector").gameObject); } bool hasDirtyScenes = false; for (int i = 0; i < EditorSceneManager.sceneCount; i++) { Scene sc = EditorSceneManager.GetSceneAt(i); if (sc.isDirty) { hasDirtyScenes = true; } } if (hasDirtyScenes) { int saveChoice = EditorUtility.DisplayDialogComplex("Modified scenes detected", "Opening the Mesh Hide Editor will close all scenes and create a new blank scene. Any current scene changes will be lost unless saved.", "Save and Continue", "Continue without saving", "Cancel"); switch (saveChoice) { case 0: // Save and continue { if (!EditorSceneManager.SaveOpenScenes()) { return; } break; } case 1: // don't save and continue break; case 2: // cancel return; } } SceneView sceneView = SceneView.lastActiveSceneView; if (sceneView == null) { EditorUtility.DisplayDialog("Error", "A Scene View must be open and active", "OK"); return; } SceneView.lastActiveSceneView.Focus(); List <GeometrySelector.SceneInfo> currentscenes = new List <GeometrySelector.SceneInfo>(); for (int i = 0; i < EditorSceneManager.sceneCount; i++) { Scene sc = EditorSceneManager.GetSceneAt(i); GeometrySelector.SceneInfo si = new GeometrySelector.SceneInfo(); si.path = sc.path; si.name = sc.name; if (i == 0) { // first scene should clear the temp scene. si.mode = OpenSceneMode.Single; } else { si.mode = sc.isLoaded ? OpenSceneMode.Additive : OpenSceneMode.AdditiveWithoutLoading; } currentscenes.Add(si); } #if UNITY_2019_1_OR_NEWER Scene s = EditorSceneManager.NewScene(NewSceneSetup.EmptyScene, NewSceneMode.Single); #else Scene s = EditorSceneManager.NewScene(NewSceneSetup.DefaultGameObjects, NewSceneMode.Single); #endif EditorSceneManager.SetActiveScene(s); GameObject obj = EditorUtility.CreateGameObjectWithHideFlags("GeometrySelector", HideFlags.DontSaveInEditor); GeometrySelector geometry = obj.AddComponent <GeometrySelector>(); // Restore the camera position. string CamKey = source.name + "_MHA_Cam"; if (EditorPrefs.HasKey(CamKey)) { string xform = EditorPrefs.GetString(CamKey); CamSaver cs = CamSaver.FromString(xform); sceneView.camera.transform.position = cs.position; sceneView.camera.transform.localRotation = cs.rotation; focusObject = false; } if (geometry != null) { Selection.activeGameObject = obj; if (focusObject) { SceneView.lastActiveSceneView.FrameSelected(true); } // sceneView.camera.transform; geometry.meshAsset = source; geometry.restoreScenes = currentscenes; geometry.currentSceneView = sceneView; #if UNITY_2019_1_OR_NEWER geometry.SceneviewLightingState = sceneView.sceneLighting; sceneView.sceneLighting = false; #else geometry.SceneviewLightingState = sceneView.m_SceneLighting; sceneView.m_SceneLighting = false; #endif geometry.InitializeFromMeshData(source.asset.meshData); geometry.selectedTriangles = new BitArray(source.triangleFlags[source.asset.subMeshIndex]); geometry.UpdateSelectionMesh(); if (focusObject) { SceneView.FrameLastActiveSceneView(); SceneView.lastActiveSceneView.FrameSelected(); } } }