1
0
Fork 0
mirror of https://github.com/Orama-Interactive/Pixelorama.git synced 2025-01-18 17:19:50 +00:00

Create a get_mirrored_positions() method in Tools

Reduces some code replication across tools
This commit is contained in:
Emmanouil Papadeas 2024-02-13 02:31:48 +02:00
parent 47fc659170
commit f56d536b36
7 changed files with 62 additions and 104 deletions

View file

@ -437,6 +437,25 @@ func get_assigned_color(button: int) -> Color:
return _slots[button].color
func get_mirrored_positions(
pos: Vector2i, project := Global.current_project, offset := 0
) -> Array[Vector2i]:
var positions: Array[Vector2i] = []
if horizontal_mirror:
var mirror_x := pos
mirror_x.x = project.x_symmetry_point - pos.x + offset
positions.append(mirror_x)
if vertical_mirror:
var mirror_xy := mirror_x
mirror_xy.y = project.y_symmetry_point - pos.y + offset
positions.append(mirror_xy)
if vertical_mirror:
var mirror_y := pos
mirror_y.y = project.y_symmetry_point - pos.y + offset
positions.append(mirror_y)
return positions
func set_button_size(button_size: int) -> void:
var size := Vector2(24, 24) if button_size == Global.ButtonSize.SMALL else Vector2(32, 32)
for t in _tool_buttons.get_children():

View file

@ -7,8 +7,6 @@ var pixel_perfect := false:
drawers = pixel_perfect_drawers.duplicate()
else:
drawers = [simple_drawer, simple_drawer, simple_drawer, simple_drawer]
var horizontal_mirror := false
var vertical_mirror := false
var color_op := ColorOp.new()
var simple_drawer := SimpleDrawer.new()
@ -72,14 +70,9 @@ func set_pixel(image: Image, position: Vector2i, color: Color, ignore_mirroring
drawers[0].set_pixel(image, position, color, color_op)
if ignore_mirroring:
return
# Handle Mirroring
var mirror_x := project.x_symmetry_point - position.x
var mirror_y := project.y_symmetry_point - position.y
if horizontal_mirror and project.can_pixel_get_drawn(Vector2i(mirror_x, position.y)):
drawers[1].set_pixel(image, Vector2i(mirror_x, position.y), color, color_op)
if vertical_mirror and project.can_pixel_get_drawn(Vector2i(position.x, mirror_y)):
drawers[2].set_pixel(image, Vector2i(mirror_x, mirror_y), color, color_op)
if vertical_mirror and project.can_pixel_get_drawn(Vector2i(position.x, mirror_y)):
drawers[3].set_pixel(image, Vector2i(position.x, mirror_y), color, color_op)
# Handle mirroring
var i := 1
for mirror_pos in Tools.get_mirrored_positions(position, project):
if project.can_pixel_get_drawn(mirror_pos):
drawers[i].set_pixel(image, mirror_pos, color, color_op)
i += 1

View file

@ -262,8 +262,6 @@ func _prepare_tool() -> void:
lerpf(Tools.brush_size_min, Tools.brush_size_max, Tools.mouse_velocity)
)
_drawer.pixel_perfect = Tools.pixel_perfect if _brush_size == 1 else false
_drawer.horizontal_mirror = Tools.horizontal_mirror
_drawer.vertical_mirror = Tools.vertical_mirror
_drawer.color_op.strength = strength
_indicator = _create_brush_indicator()
_polylines = _create_polylines(_indicator)

View file

@ -231,19 +231,10 @@ func fill_in_color(pos: Vector2i) -> void:
func fill_in_area(pos: Vector2i) -> void:
var project := Global.current_project
_flood_fill(pos)
# Handle Mirroring
var mirror_x := project.x_symmetry_point - pos.x
var mirror_y := project.y_symmetry_point - pos.y
var mirror_x_inside := project.can_pixel_get_drawn(Vector2i(mirror_x, pos.y))
var mirror_y_inside := project.can_pixel_get_drawn(Vector2i(pos.x, mirror_y))
if Tools.horizontal_mirror and mirror_x_inside:
_flood_fill(Vector2i(mirror_x, pos.y))
if Tools.vertical_mirror and mirror_y_inside:
_flood_fill(Vector2i(mirror_x, mirror_y))
if Tools.vertical_mirror and mirror_y_inside:
_flood_fill(Vector2i(pos.x, mirror_y))
# Handle mirroring
for mirror_pos in Tools.get_mirrored_positions(pos, project):
if project.can_pixel_get_drawn(mirror_pos):
_flood_fill(mirror_pos)
func fill_in_selection() -> void:

View file

@ -75,35 +75,20 @@ func apply_selection(_position: Vector2i) -> void:
Global.canvas.selection.clear_selection()
if _rect.size == Vector2i.ZERO and Global.current_project.has_selection:
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 _rect.size != Vector2i.ZERO:
set_ellipse(project.selection_map, _rect.position)
# Handle mirroring
if Tools.horizontal_mirror:
var mirror_x_rect := _rect
mirror_x_rect.position.x = (
Global.current_project.x_symmetry_point - _rect.position.x + 1
)
mirror_x_rect.end.x = Global.current_project.x_symmetry_point - _rect.end.x + 1
set_ellipse(project.selection_map, mirror_x_rect.abs().position)
if Tools.vertical_mirror:
var mirror_xy_rect := mirror_x_rect
mirror_xy_rect.position.y = (
Global.current_project.y_symmetry_point - _rect.position.y + 1
)
mirror_xy_rect.end.y = Global.current_project.y_symmetry_point - _rect.end.y + 1
set_ellipse(project.selection_map, mirror_xy_rect.abs().position)
if Tools.vertical_mirror:
var mirror_y_rect := _rect
mirror_y_rect.position.y = (
Global.current_project.y_symmetry_point - _rect.position.y + 1
)
mirror_y_rect.end.y = Global.current_project.y_symmetry_point - _rect.end.y + 1
set_ellipse(project.selection_map, mirror_y_rect.abs().position)
Global.canvas.selection.big_bounding_rectangle = project.selection_map.get_used_rect()
Global.canvas.selection.commit_undo("Select", undo_data)
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:

View file

@ -33,20 +33,10 @@ func apply_selection(pos: Vector2i) -> void:
var cel_image := Image.new()
cel_image.copy_from(_get_draw_image())
_flood_fill(pos, cel_image, project.selection_map)
# Handle mirroring
if Tools.horizontal_mirror:
var mirror_x := pos
mirror_x.x = Global.current_project.x_symmetry_point - pos.x
_flood_fill(mirror_x, cel_image, project.selection_map)
if Tools.vertical_mirror:
var mirror_xy := mirror_x
mirror_xy.y = Global.current_project.y_symmetry_point - pos.y
_flood_fill(mirror_xy, cel_image, project.selection_map)
if Tools.vertical_mirror:
var mirror_y := pos
mirror_y.y = Global.current_project.y_symmetry_point - pos.y
_flood_fill(mirror_y, cel_image, project.selection_map)
for mirror_pos in Tools.get_mirrored_positions(pos):
_flood_fill(mirror_pos, cel_image, project.selection_map)
Global.canvas.selection.big_bounding_rectangle = project.selection_map.get_used_rect()
Global.canvas.selection.commit_undo("Select", undo_data)

View file

@ -50,33 +50,24 @@ func draw_end(pos: Vector2i) -> void:
func draw_preview() -> void:
if _move:
return
var project := Global.current_project
var canvas: Node2D = Global.canvas.previews
var pos := canvas.position
var canvas_scale := canvas.scale
if Global.mirror_view:
pos.x = pos.x + Global.current_project.size.x
pos.x = pos.x + project.size.x
canvas_scale.x = -1
canvas.draw_set_transform(pos, canvas.rotation, canvas_scale)
canvas.draw_rect(_rect, Color.BLACK, false)
# Handle mirroring
if Tools.horizontal_mirror:
var mirror_x_rect := _rect
mirror_x_rect.position.x = Global.current_project.x_symmetry_point - _rect.position.x + 1
mirror_x_rect.end.x = Global.current_project.x_symmetry_point - _rect.end.x + 1
canvas.draw_rect(mirror_x_rect, Color.BLACK, false)
if Tools.vertical_mirror:
var mirror_xy_rect := mirror_x_rect
mirror_xy_rect.position.y = (
Global.current_project.y_symmetry_point - _rect.position.y + 1
)
mirror_xy_rect.end.y = Global.current_project.y_symmetry_point - _rect.end.y + 1
canvas.draw_rect(mirror_xy_rect, Color.BLACK, false)
if Tools.vertical_mirror:
var mirror_y_rect := _rect
mirror_y_rect.position.y = Global.current_project.y_symmetry_point - _rect.position.y + 1
mirror_y_rect.end.y = Global.current_project.y_symmetry_point - _rect.end.y + 1
canvas.draw_rect(mirror_y_rect, Color.BLACK, false)
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]
canvas.draw_rect(mirror_rect, Color.BLACK, false)
canvas.draw_set_transform(canvas.position, canvas.rotation, canvas.scale)
@ -95,23 +86,14 @@ func apply_selection(pos: Vector2i) -> void:
elif _intersect:
operation = 2
Global.canvas.selection.select_rect(_rect, operation)
# Handle mirroring
if Tools.horizontal_mirror:
var mirror_x_rect := _rect
mirror_x_rect.position.x = project.x_symmetry_point - _rect.position.x + 1
mirror_x_rect.end.x = project.x_symmetry_point - _rect.end.x + 1
Global.canvas.selection.select_rect(mirror_x_rect.abs(), operation)
if Tools.vertical_mirror:
var mirror_xy_rect := mirror_x_rect
mirror_xy_rect.position.y = project.y_symmetry_point - _rect.position.y + 1
mirror_xy_rect.end.y = project.y_symmetry_point - _rect.end.y + 1
Global.canvas.selection.select_rect(mirror_xy_rect.abs(), operation)
if Tools.vertical_mirror:
var mirror_y_rect := _rect
mirror_y_rect.position.y = project.y_symmetry_point - _rect.position.y + 1
mirror_y_rect.end.y = project.y_symmetry_point - _rect.end.y + 1
Global.canvas.selection.select_rect(mirror_y_rect.abs(), operation)
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.commit_undo("Select", undo_data)