void DrawOverlayData(GridDungeonConfig config, GridDungeonModel model, bool mode2D)
        {
            var mode                 = target as DungeonPaintModeGrid;
            var opacity              = mode.overlayOpacity;
            var gridSize             = config.GridCellSize;
            var cellColorProcedural  = Color.blue;
            var cellColorUserDefined = Color.cyan;

            // Visualize the user defined cells defined by the paint tool
            foreach (var cell in model.Cells)
            {
                var size     = Vector3.Scale(DMathUtils.ToVector3(cell.Bounds.Size), gridSize);
                var location = Vector3.Scale(DMathUtils.ToVector3(cell.Bounds.Location), gridSize);
                var color    = cell.UserDefined ? cellColorUserDefined : cellColorProcedural;
                DrawRect(location, size, color, opacity, 0.3f, mode2D);
            }
        }
        void DrawRect(Vector3 position, Vector3 size, Color color, float faceOpacity, float outlineOpacity, bool mode2D)
        {
            var verts = new Vector3[] {
                position,
                position + new Vector3(size.x, 0, 0),
                position + new Vector3(size.x, 0, size.z),
                position + new Vector3(0, 0, size.z)
            };

            if (mode2D)
            {
                for (int i = 0; i < verts.Length; i++)
                {
                    verts[i] = DMathUtils.FlipYZ(verts[i]);
                }
            }
            Color faceColor    = new Color(color.r, color.g, color.b, faceOpacity);
            Color outlineColor = new Color(color.r, color.g, color.b, outlineOpacity);

            Handles.DrawSolidRectangleWithOutline(verts, faceColor, outlineColor);
        }
        void UpdateCursorPosition(DungeonPaintModeGrid mode)
        {
            float distance;
            var   e = Event.current;
            Plane plane;

            if (mode.mode2D)
            {
                var planePoint = Vector3.zero;
                plane = new Plane(new Vector3(0, 0, 1), planePoint);
            }
            else
            {
                var cursorHeight = mode.GetCursorHeight();
                var planePoint   = new Vector3(0, cursorHeight, 0);
                plane = new Plane(Vector3.up, planePoint);
            }

            var ray = HandleUtility.GUIPointToWorldRay(e.mousePosition);

            if (plane.Raycast(ray, out distance))
            {
                var hitpoint = ray.GetPoint(distance);
                if (mode.mode2D)
                {
                    hitpoint = DMathUtils.FlipYZ(hitpoint);
                }
                hitpoint       = SnapToGrid(hitpoint);
                cursorPosition = hitpoint;

                if (!mode.mode2D)
                {
                    if (e.type == EventType.ScrollWheel)
                    {
                        var delta = (int)Mathf.Sign(e.delta.y);
                        mode.SetElevationDelta(delta);
                    }
                }
            }
        }