public override void OnInspectorGUI()
    {
        if (!tool)
        {
            tool = (target as AshTerrainPainter);
        }
        DrawDefaultInspector();

        GUILayout.Space(15);
        GUI.color = new Color(0.5f, 0.6f, 1.0f, 1);
        if (GUILayout.Button("Init SpatialMap"))
        {
            tool.Init_SpatialMap();
        }
        GUILayout.Space(15);
        GUI.color = new Color(0.5f, 1.0f, 0.5f, 1);
        GUILayout.BeginHorizontal();
        if (GUILayout.Button("Import SpatialMap"))
        {
            Import_SpatialMap();
        }
        GUILayout.Space(10);
        if (GUILayout.Button("Export SpatialMap"))
        {
            Export_SpatialMap();
        }
        GUILayout.EndHorizontal();

        PainterWindow(0);
    }
 void OnSceneGUI()
 {
     if (!tool)
     {
         tool = (target as AshTerrainPainter);
     }
     if (!hooked)
     {
         hooked = true;
         SceneView.duringSceneGui -= HandleEvents;
         SceneView.duringSceneGui += HandleEvents;
     }
 }
    void HandleEvents(SceneView view)
    {
        if (!tool)
        {
            tool = (target as AshTerrainPainter);
        }
        if (!tool && hooked)
        {
            hooked = false;
            SceneView.duringSceneGui -= HandleEvents;
            return;
        }
        if (selected_Tex > 0 && stroke_Channel == Vector4.zero)
        {
            Select_Texure(selected_Tex);
        }

        var e = Event.current;

        if (e.control || e.alt || e.shift)
        {
            return;
        }

        if (brushMode && e.isMouse && e.button == 0)
        {
            var mp = e.mousePosition;
            switch (e.type)
            {
            case EventType.MouseDown:
            case EventType.MouseDrag:
                var        ray = HandleUtility.GUIPointToWorldRay(mp);
                RaycastHit rHit;
                if (Physics.Raycast(ray, out rHit))
                {
                    tool.ApplyStroke(rHit.textureCoord, stroke_Channel, stroke_Opacity, stroke_Size);
                    GUIUtility.hotControl = GUIUtility.GetControlID(FocusType.Passive);
                    Event.current.Use();
                }
                break;
            }
        }

        if (e.type == EventType.KeyDown && e.isKey)
        {
            switch (e.keyCode)
            {
            case KeyCode.BackQuote:
                Selection.activeGameObject = tool.gameObject;
                EditorUtility.SetDirty(target);
                Event.current.Use();
                break;

            case KeyCode.B:
                brushMode = !brushMode;
                EditorUtility.SetDirty(target);
                Event.current.Use();
                break;

            case KeyCode.Q:
                if (!brushMode)
                {
                    break;
                }
                stroke_Size = Mathf.Clamp(stroke_Size - 1, 1f, 500f);
                EditorUtility.SetDirty(target);
                Event.current.Use();
                break;

            case KeyCode.E:
                if (!brushMode)
                {
                    break;
                }
                stroke_Size = Mathf.Clamp(stroke_Size + 1, 1f, 500f);
                EditorUtility.SetDirty(target);
                Event.current.Use();
                break;

            case KeyCode.F:
                if (!brushMode)
                {
                    break;
                }
                stroke_Opacity = Mathf.Clamp(stroke_Opacity - 0.05f, 0.1f, 1f);
                EditorUtility.SetDirty(target);
                Event.current.Use();
                break;

            case KeyCode.R:
                if (!brushMode)
                {
                    break;
                }
                stroke_Opacity = Mathf.Clamp(stroke_Opacity + 0.05f, 0.1f, 1f);
                EditorUtility.SetDirty(target);
                Event.current.Use();
                break;

            case KeyCode.G:
                if (!brushMode)
                {
                    break;
                }
                Select_Texure(0);
                Event.current.Use();
                break;

            case KeyCode.Z:
                if (!brushMode)
                {
                    break;
                }
                Select_Texure(1);
                Event.current.Use();
                break;

            case KeyCode.X:
                if (!brushMode)
                {
                    break;
                }
                Select_Texure(2);
                Event.current.Use();
                break;

            case KeyCode.C:
                if (!brushMode)
                {
                    break;
                }
                Select_Texure(3);
                Event.current.Use();
                break;

            case KeyCode.V:
                if (!brushMode)
                {
                    break;
                }
                Select_Texure(4);
                Event.current.Use();
                break;
            }
        }
    }