private void Enable()
    {
        if (useNextViewModel != null)
        {
            viewModel        = useNextViewModel;
            inputController  = new GNBlockMapEditorInputController(viewModel);
            useNextViewModel = null;
        }
        else
        {
            viewModel       = GNBlockMapEditorVM.CreateInstance <GNBlockMapEditorVM>();
            inputController = new GNBlockMapEditorInputController(viewModel);
        }

        m_blockMap = (GNBlockMap)target;

        viewModel.Enable(m_blockMap);

        Undo.undoRedoPerformed    += MyUndoCallback;
        viewModel.OnCellZChanged  += OnCellZChanged;
        viewModel.OnCellXYChanged += OnCellXYChanged;
        viewModel.OnPrefabChanged += OnPrefabChanged;
        viewModel.OnGridChanged   += OnGridChanged;
        viewModel.OnToolChanged   += OnToolChanged;

        // clean previous brushes
        for (int i = 0; i < m_blockMap.transform.childCount; i++)
        {
            Transform currentChild = m_blockMap.transform.GetChild(i);
            if (currentChild.name == "_brush")
            {
                GameObject.DestroyImmediate(currentChild.gameObject);
            }
        }

        OnPrefabChanged();
        OnGridChanged();
        FocusSceneView();
        Repaint();
        m_bActive = true;
    }
    public void Enable(GNBlockMap blockMap)
    {
        if (!m_enabled)
        {
            m_prefabNavigation = new GNPrefabNavigation();
            if (m_currentPrefab != null)
            {
                m_prefabNavigation.SetCurrentPrefabPathFromPrefab(m_currentPrefab);
            }

            m_blockMap           = blockMap;
            m_blockMap.m_bLocked = true;
            // Undo.RecordObject(m_blockMap, "Scene Save Enforcement");
            // EditorUtility.SetDirty(m_blockMap);
            // UnityEditor.SceneManagement.EditorSceneManager.MarkSceneDirty();
            m_enabled = true;
            UpdateCurrentCell();
            UpdateVisibleLayers(false);
            ResetSelectedBox();

            Renderer[] renderers = blockMap.GetComponentsInChildren <Renderer>(true);
            foreach (Renderer renderer in renderers)
            {
                EditorUtility.SetSelectedRenderState(renderer, EditorSelectedRenderState.Hidden);
//                EditorUtility.SetSelectedWireframeHidden(renderer, true);
            }
            m_prefabNavigation.OnFolderChanged += LoadCurrentRandomBrushFlags;

            MoveChildrenToCorrectTargetLayers();

            EditorUtility.SetDirty(m_blockMap);

            if (!m_currentPrefab)
            {
                SelectPrefab(m_blockMap.m_prefab);
                m_prefabNavigation.SetCurrentPrefabPathFromPrefab(m_currentPrefab);
            }
        }
    }