diff --git a/src/Classes/SelectionMap.gd b/src/Classes/SelectionMap.gd index abdc3329c..ee9932d55 100644 --- a/src/Classes/SelectionMap.gd +++ b/src/Classes/SelectionMap.gd @@ -77,6 +77,13 @@ func select_pixel(pixel: Vector2i, select := true) -> void: set_pixelv(pixel, Color(0)) +func select_rect(rect: Rect2i, select := true) -> void: + if select: + fill_rect(rect, Color(1, 1, 1, 1)) + else: + fill_rect(rect, Color(0)) + + func select_all() -> void: fill(Color(1, 1, 1, 1)) diff --git a/src/Tools/BaseSelectionTool.gd b/src/Tools/BaseSelectionTool.gd index ce30f0b2f..26cb48d55 100644 --- a/src/Tools/BaseSelectionTool.gd +++ b/src/Tools/BaseSelectionTool.gd @@ -215,6 +215,13 @@ func apply_selection(_position: Vector2i) -> void: _intersect = true +func select_tilemap_cell( + cel: CelTileMap, cell_position: int, selection: SelectionMap, select: bool +) -> void: + var rect := Rect2i(cel.get_cell_coords_in_image(cell_position), cel.tileset.tile_size) + selection.select_rect(rect, select) + + func _on_confirm_button_pressed() -> void: if selection_node.is_moving_content: selection_node.transform_content_confirm() diff --git a/src/Tools/SelectionTools/ColorSelect.gd b/src/Tools/SelectionTools/ColorSelect.gd index 1e172929f..c1606db06 100644 --- a/src/Tools/SelectionTools/ColorSelect.gd +++ b/src/Tools/SelectionTools/ColorSelect.gd @@ -32,23 +32,46 @@ func apply_selection(pos: Vector2i) -> void: if pos.x > project.size.x - 1 or pos.y > project.size.y - 1: return - var cel_image := Image.new() - cel_image.copy_from(_get_draw_image()) - var color := cel_image.get_pixelv(pos) var operation := 0 if _subtract: operation = 1 elif _intersect: operation = 2 - var params := {"color": color, "tolerance": _tolerance, "operation": operation} - if _add or _subtract or _intersect: - var selection_tex := ImageTexture.create_from_image(project.selection_map) - params["selection"] = selection_tex - var gen := ShaderImageEffect.new() - gen.generate_image(cel_image, shader, params, project.size) - cel_image.convert(Image.FORMAT_LA8) + if Tools.is_placing_tiles(): + var prev_selection_map := SelectionMap.new() # Used for intersect + prev_selection_map.copy_from(project.selection_map) + if !_add and !_subtract and !_intersect: + Global.canvas.selection.clear_selection() + if _intersect: + project.selection_map.clear() + for cel in _get_selected_draw_cels(): + if cel is not CelTileMap: + continue + var tilemap_cel := cel as CelTileMap + var tile_index := tilemap_cel.get_cell_index_at_coords(pos) + for i in tilemap_cel.cells.size(): + var cell := tilemap_cel.cells[i] + if cell.index == tile_index: + if _intersect: + var p := (cel as CelTileMap).get_cell_coords_in_image(i) + select_tilemap_cell( + cel, i, project.selection_map, prev_selection_map.is_pixel_selected(p) + ) + else: + select_tilemap_cell(cel, i, project.selection_map, !_subtract) + else: + var cel_image := Image.new() + cel_image.copy_from(_get_draw_image()) + var color := cel_image.get_pixelv(pos) + var params := {"color": color, "tolerance": _tolerance, "operation": operation} + if _add or _subtract or _intersect: + var selection_tex := ImageTexture.create_from_image(project.selection_map) + params["selection"] = selection_tex + var gen := ShaderImageEffect.new() + gen.generate_image(cel_image, shader, params, project.size) + cel_image.convert(Image.FORMAT_LA8) - project.selection_map.copy_from(cel_image) + project.selection_map.copy_from(cel_image) Global.canvas.selection.big_bounding_rectangle = project.selection_map.get_used_rect() Global.canvas.selection.commit_undo("Select", undo_data) diff --git a/src/Tools/SelectionTools/EllipseSelect.gd b/src/Tools/SelectionTools/EllipseSelect.gd index 80539a797..1d4234d4d 100644 --- a/src/Tools/SelectionTools/EllipseSelect.gd +++ b/src/Tools/SelectionTools/EllipseSelect.gd @@ -81,18 +81,36 @@ func apply_selection(_position: Vector2i) -> void: Global.canvas.selection.commit_undo("Select", undo_data) if _rect.size == Vector2i.ZERO: return - set_ellipse(project.selection_map, _rect.position) - # Handle mirroring - var mirror_positions := Tools.get_mirrored_positions(_rect.position, project, 1) - var mirror_ends := Tools.get_mirrored_positions(_rect.end, project, 1) - for i in mirror_positions.size(): - var mirror_rect := Rect2i() - mirror_rect.position = mirror_positions[i] - mirror_rect.end = mirror_ends[i] - set_ellipse(project.selection_map, mirror_rect.abs().position) + if Tools.is_placing_tiles(): + var operation := 0 + if _subtract: + operation = 1 + elif _intersect: + operation = 2 + Global.canvas.selection.select_rect(_rect, operation) + # Handle mirroring + var mirror_positions := Tools.get_mirrored_positions(_rect.position, project, 1) + var mirror_ends := Tools.get_mirrored_positions(_rect.end, project, 1) + for i in mirror_positions.size(): + var mirror_rect := Rect2i() + mirror_rect.position = mirror_positions[i] + mirror_rect.end = mirror_ends[i] + Global.canvas.selection.select_rect(mirror_rect.abs(), operation) - Global.canvas.selection.big_bounding_rectangle = project.selection_map.get_used_rect() - Global.canvas.selection.commit_undo("Select", undo_data) + Global.canvas.selection.commit_undo("Select", undo_data) + else: + set_ellipse(project.selection_map, _rect.position) + # Handle mirroring + var mirror_positions := Tools.get_mirrored_positions(_rect.position, project, 1) + var mirror_ends := Tools.get_mirrored_positions(_rect.end, project, 1) + for i in mirror_positions.size(): + var mirror_rect := Rect2i() + mirror_rect.position = mirror_positions[i] + mirror_rect.end = mirror_ends[i] + set_ellipse(project.selection_map, mirror_rect.abs().position) + + Global.canvas.selection.big_bounding_rectangle = project.selection_map.get_used_rect() + Global.canvas.selection.commit_undo("Select", undo_data) func set_ellipse(selection_map: SelectionMap, pos: Vector2i) -> void: @@ -116,8 +134,12 @@ func set_ellipse(selection_map: SelectionMap, pos: Vector2i) -> void: # Given an origin point and destination point, returns a rect representing # where the shape will be drawn and what is its size func _get_result_rect(origin: Vector2i, dest: Vector2i) -> Rect2i: + if Tools.is_placing_tiles(): + var tileset := (Global.current_project.get_current_cel() as CelTileMap).tileset + var grid_size := tileset.tile_size + origin = Tools.snap_to_rectangular_grid_boundary(origin, grid_size) + dest = Tools.snap_to_rectangular_grid_boundary(dest, grid_size) var rect := Rect2i() - # Center the rect on the mouse if _expand_from_center: var new_size := dest - origin @@ -140,6 +162,7 @@ func _get_result_rect(origin: Vector2i, dest: Vector2i) -> Rect2i: rect.position = Vector2i(mini(origin.x, dest.x), mini(origin.y, dest.y)) rect.size = (origin - dest).abs() - rect.size += Vector2i.ONE + if not Tools.is_placing_tiles(): + rect.size += Vector2i.ONE return rect