Exemplo n.º 1
0
        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();
            }
        }
Exemplo n.º 2
0
        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();
                }
            }
        }