1
0
Fork 0
mirror of https://github.com/Orama-Interactive/Pixelorama.git synced 2025-02-13 01:03:07 +00:00

Compare commits

..

6 commits

Author SHA1 Message Date
Emmanouil Papadeas 5e54a9cdd5
Merge 2d0cccc3a5 into aa1731b701 2024-11-21 07:44:23 +00:00
Emmanouil Papadeas 2d0cccc3a5 New translations translations.pot (Romanian) 2024-11-21 09:44:20 +02:00
Emmanouil Papadeas aa1731b701 Initial work on diagonal symmetry guides
Still no buttons yet, and they cannot be moved yet.
2024-11-21 04:00:40 +02:00
Emmanouil Papadeas 558140b309 Add partial logic for diagonal mirroring
Still WIP, no buttons and guides exposed yet.
2024-11-21 03:25:41 +02:00
Emmanouil Papadeas 849b815562 Further simplify mirror_array() 2024-11-21 02:21:11 +02:00
Emmanouil Papadeas 3615ce087c Reduce duplicated code by calling mirror_array by tools less times 2024-11-21 02:15:50 +02:00
15 changed files with 173 additions and 185 deletions

View file

@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Romanian\n" "Language-Team: Romanian\n"
"Language: ro_RO\n" "Language: ro_RO\n"
"PO-Revision-Date: 2024-11-20 12:58\n" "PO-Revision-Date: 2024-11-21 07:44\n"
msgid "OK" msgid "OK"
msgstr "OK" msgstr "OK"
@ -169,15 +169,15 @@ msgstr "Procentaj"
#. Found in the create new image dialog. Allows users to change the color mode of the new project, such as RGBA or indexed mode. #. Found in the create new image dialog. Allows users to change the color mode of the new project, such as RGBA or indexed mode.
msgid "Color mode:" msgid "Color mode:"
msgstr "" msgstr "Mod culoare:"
#. Found in the image menu. A submenu that allows users to change the color mode of the project, such as RGBA or indexed mode. #. Found in the image menu. A submenu that allows users to change the color mode of the project, such as RGBA or indexed mode.
msgid "Color Mode" msgid "Color Mode"
msgstr "" msgstr "Mod culoare"
#. Found in the image menu, under the "Color Mode" submenu. Refers to the indexed color mode. See this wikipedia page for more information: https://en.wikipedia.org/wiki/Indexed_color #. Found in the image menu, under the "Color Mode" submenu. Refers to the indexed color mode. See this wikipedia page for more information: https://en.wikipedia.org/wiki/Indexed_color
msgid "Indexed" msgid "Indexed"
msgstr "" msgstr "Indexat"
#. Found in the image menu. Sets the size of the project to be the same as the size of the active selection. #. Found in the image menu. Sets the size of the project to be the same as the size of the active selection.
msgid "Crop to Selection" msgid "Crop to Selection"

View file

@ -179,10 +179,14 @@ var can_draw := true
var move_guides_on_canvas := true var move_guides_on_canvas := true
var play_only_tags := true ## If [code]true[/code], animation plays only on frames of the same tag. var play_only_tags := true ## If [code]true[/code], animation plays only on frames of the same tag.
## (Intended to be used as getter only) Tells if the x-symmetry guide ( -- ) is visible. ## If true, the x symmetry guide ( -- ) is visible.
var show_x_symmetry_axis := false var show_x_symmetry_axis := false
## (Intended to be used as getter only) Tells if the y-symmetry guide ( | ) is visible. ## If true, the y symmetry guide ( | ) is visible.
var show_y_symmetry_axis := false var show_y_symmetry_axis := false
## If true, the x=y symmetry guide ( / ) is visible.
var show_x_y_symmetry_axis := false
## If true, the x==y symmetry guide ( \ ) is visible.
var show_x_minus_y_symmetry_axis := false
# Preferences # Preferences
## Found in Preferences. If [code]true[/code], the last saved project will open on startup. ## Found in Preferences. If [code]true[/code], the last saved project will open on startup.

View file

@ -9,9 +9,14 @@ signal options_reset
enum Dynamics { NONE, PRESSURE, VELOCITY } enum Dynamics { NONE, PRESSURE, VELOCITY }
const XY_LINE := Vector2(-0.707107, 0.707107)
const X_MINUS_Y_LINE := Vector2(0.707107, 0.707107)
var picking_color_for := MOUSE_BUTTON_LEFT var picking_color_for := MOUSE_BUTTON_LEFT
var horizontal_mirror := false var horizontal_mirror := false
var vertical_mirror := false var vertical_mirror := false
var diagonal_mirror := false
var diagonal_opposite_mirror := false
var pixel_perfect := false var pixel_perfect := false
var alpha_locked := false var alpha_locked := false
@ -524,20 +529,48 @@ func get_mirrored_positions(
) -> Array[Vector2i]: ) -> Array[Vector2i]:
var positions: Array[Vector2i] = [] var positions: Array[Vector2i] = []
if horizontal_mirror: if horizontal_mirror:
var mirror_x := pos var mirror_x := calculate_mirror_horizontal(pos, project, offset)
mirror_x.x = project.x_symmetry_point - pos.x + offset
positions.append(mirror_x) positions.append(mirror_x)
if vertical_mirror: if vertical_mirror:
var mirror_xy := mirror_x positions.append(calculate_mirror_vertical(mirror_x, project, offset))
mirror_xy.y = project.y_symmetry_point - pos.y + offset else:
positions.append(mirror_xy) if diagonal_mirror:
positions.append(calculate_mirror_xy(mirror_x, project))
if diagonal_opposite_mirror:
positions.append(calculate_mirror_x_minus_y(mirror_x, project))
if vertical_mirror: if vertical_mirror:
var mirror_y := pos var mirror_y := calculate_mirror_vertical(pos, project, offset)
mirror_y.y = project.y_symmetry_point - pos.y + offset
positions.append(mirror_y) positions.append(mirror_y)
if diagonal_mirror:
positions.append(calculate_mirror_xy(mirror_y, project))
if diagonal_opposite_mirror:
positions.append(calculate_mirror_x_minus_y(mirror_y, project))
if diagonal_mirror:
var mirror_diagonal := calculate_mirror_xy(pos, project)
positions.append(mirror_diagonal)
if not horizontal_mirror and not vertical_mirror:
positions.append(calculate_mirror_x_minus_y(mirror_diagonal, project))
if diagonal_opposite_mirror:
positions.append(calculate_mirror_x_minus_y(pos, project))
return positions return positions
func calculate_mirror_horizontal(pos: Vector2i, project: Project, offset := 0) -> Vector2i:
return Vector2i(project.x_symmetry_point - pos.x + offset, pos.y)
func calculate_mirror_vertical(pos: Vector2i, project: Project, offset := 0) -> Vector2i:
return Vector2i(pos.x, project.y_symmetry_point - pos.y + offset)
func calculate_mirror_xy(pos: Vector2i, project: Project) -> Vector2i:
return Vector2i(Vector2(pos).reflect(XY_LINE).round()) + project.size - Vector2i.ONE
func calculate_mirror_x_minus_y(pos: Vector2i, _project: Project) -> Vector2i:
return Vector2i(Vector2(pos).reflect(X_MINUS_Y_LINE).round())
func set_button_size(button_size: int) -> void: func set_button_size(button_size: int) -> void:
var size := Vector2(24, 24) if button_size == Global.ButtonSize.SMALL else Vector2(32, 32) var size := Vector2(24, 24) if button_size == Global.ButtonSize.SMALL else Vector2(32, 32)
if not is_instance_valid(_tool_buttons): if not is_instance_valid(_tool_buttons):

View file

@ -1,22 +1,19 @@
class_name Drawer class_name Drawer
const NUMBER_OF_DRAWERS := 8
var pixel_perfect := false: var pixel_perfect := false:
set(value): set(value):
pixel_perfect = value pixel_perfect = value
if pixel_perfect: if pixel_perfect:
drawers = pixel_perfect_drawers.duplicate() drawers = pixel_perfect_drawers.duplicate()
else: else:
drawers = [simple_drawer, simple_drawer, simple_drawer, simple_drawer] _create_simple_drawers()
var color_op := ColorOp.new() var color_op := ColorOp.new()
var simple_drawer := SimpleDrawer.new() var simple_drawer := SimpleDrawer.new()
var pixel_perfect_drawers: Array[PixelPerfectDrawer] = [ var pixel_perfect_drawers: Array[PixelPerfectDrawer] = []
PixelPerfectDrawer.new(), var drawers := []
PixelPerfectDrawer.new(),
PixelPerfectDrawer.new(),
PixelPerfectDrawer.new()
]
var drawers := [simple_drawer, simple_drawer, simple_drawer, simple_drawer]
class ColorOp: class ColorOp:
@ -60,6 +57,21 @@ class PixelPerfectDrawer:
last_pixels[0] = corner last_pixels[0] = corner
func _init() -> void:
drawers.resize(NUMBER_OF_DRAWERS)
pixel_perfect_drawers.resize(NUMBER_OF_DRAWERS)
for i in NUMBER_OF_DRAWERS:
drawers[i] = simple_drawer
pixel_perfect_drawers[i] = PixelPerfectDrawer.new()
func _create_simple_drawers() -> void:
drawers = []
drawers.resize(NUMBER_OF_DRAWERS)
for i in NUMBER_OF_DRAWERS:
drawers[i] = simple_drawer
func reset() -> void: func reset() -> void:
for drawer in pixel_perfect_drawers: for drawer in pixel_perfect_drawers:
drawer.reset() drawer.reset()
@ -72,7 +84,12 @@ func set_pixel(image: Image, position: Vector2i, color: Color, ignore_mirroring
SteamManager.set_achievement("ACH_FIRST_PIXEL") SteamManager.set_achievement("ACH_FIRST_PIXEL")
if ignore_mirroring: if ignore_mirroring:
return return
if not Tools.horizontal_mirror and not Tools.vertical_mirror: if (
not Tools.horizontal_mirror
and not Tools.vertical_mirror
and not Tools.diagonal_mirror
and not Tools.diagonal_opposite_mirror
):
return return
# Handle mirroring # Handle mirroring
var mirrored_positions := Tools.get_mirrored_positions(position, project) var mirrored_positions := Tools.get_mirrored_positions(position, project)

View file

@ -71,6 +71,8 @@ var x_symmetry_point: float
var y_symmetry_point: float var y_symmetry_point: float
var x_symmetry_axis := SymmetryGuide.new() var x_symmetry_axis := SymmetryGuide.new()
var y_symmetry_axis := SymmetryGuide.new() var y_symmetry_axis := SymmetryGuide.new()
var diagonal_xy_symmetry_axis := SymmetryGuide.new()
var diagonal_x_minus_y_symmetry_axis := SymmetryGuide.new()
var selection_map := SelectionMap.new() var selection_map := SelectionMap.new()
## This is useful for when the selection is outside of the canvas boundaries, ## This is useful for when the selection is outside of the canvas boundaries,
@ -111,17 +113,30 @@ func _init(_frames: Array[Frame] = [], _name := tr("untitled"), _size := Vector2
x_symmetry_point = size.x - 1 x_symmetry_point = size.x - 1
y_symmetry_point = size.y - 1 y_symmetry_point = size.y - 1
x_symmetry_axis.type = x_symmetry_axis.Types.HORIZONTAL x_symmetry_axis.type = Guide.Types.HORIZONTAL
x_symmetry_axis.project = self x_symmetry_axis.project = self
x_symmetry_axis.add_point(Vector2(-19999, y_symmetry_point / 2 + 0.5)) x_symmetry_axis.add_point(Vector2(-19999, y_symmetry_point / 2 + 0.5))
x_symmetry_axis.add_point(Vector2(19999, y_symmetry_point / 2 + 0.5)) x_symmetry_axis.add_point(Vector2(19999, y_symmetry_point / 2 + 0.5))
Global.canvas.add_child(x_symmetry_axis) Global.canvas.add_child(x_symmetry_axis)
y_symmetry_axis.type = y_symmetry_axis.Types.VERTICAL
y_symmetry_axis.type = Guide.Types.VERTICAL
y_symmetry_axis.project = self y_symmetry_axis.project = self
y_symmetry_axis.add_point(Vector2(x_symmetry_point / 2 + 0.5, -19999)) y_symmetry_axis.add_point(Vector2(x_symmetry_point / 2 + 0.5, -19999))
y_symmetry_axis.add_point(Vector2(x_symmetry_point / 2 + 0.5, 19999)) y_symmetry_axis.add_point(Vector2(x_symmetry_point / 2 + 0.5, 19999))
Global.canvas.add_child(y_symmetry_axis) Global.canvas.add_child(y_symmetry_axis)
diagonal_xy_symmetry_axis.type = Guide.Types.XY
diagonal_xy_symmetry_axis.project = self
diagonal_xy_symmetry_axis.add_point(Vector2(19999, -19999))
diagonal_xy_symmetry_axis.add_point(Vector2i(-19999, 19999) + size)
Global.canvas.add_child(diagonal_xy_symmetry_axis)
diagonal_x_minus_y_symmetry_axis.type = Guide.Types.X_MINUS_Y
diagonal_x_minus_y_symmetry_axis.project = self
diagonal_x_minus_y_symmetry_axis.add_point(Vector2(-19999, -19999))
diagonal_x_minus_y_symmetry_axis.add_point(Vector2(19999, 19999))
Global.canvas.add_child(diagonal_x_minus_y_symmetry_axis)
if OS.get_name() == "Web": if OS.get_name() == "Web":
export_directory_path = "user://" export_directory_path = "user://"
else: else:

View file

@ -168,16 +168,7 @@ func draw_preview() -> void:
if Rect2i(Vector2i.ZERO, image.get_size()).has_point(points[i]): if Rect2i(Vector2i.ZERO, image.get_size()).has_point(points[i]):
image.set_pixelv(points[i], Color.WHITE) image.set_pixelv(points[i], Color.WHITE)
# Handle mirroring # Handle mirroring
if Tools.horizontal_mirror: for point in mirror_array(points):
for point in mirror_array(points, true, false):
if Rect2i(Vector2i.ZERO, image.get_size()).has_point(point):
image.set_pixelv(point, Color.WHITE)
if Tools.vertical_mirror:
for point in mirror_array(points, true, true):
if Rect2i(Vector2i.ZERO, image.get_size()).has_point(point):
image.set_pixelv(point, Color.WHITE)
if Tools.vertical_mirror:
for point in mirror_array(points, false, true):
if Rect2i(Vector2i.ZERO, image.get_size()).has_point(point): if Rect2i(Vector2i.ZERO, image.get_size()).has_point(point):
image.set_pixelv(point, Color.WHITE) image.set_pixelv(point, Color.WHITE)
var texture := ImageTexture.create_from_image(image) var texture := ImageTexture.create_from_image(image)

View file

@ -205,18 +205,33 @@ func snap_position(pos: Vector2) -> Vector2:
return pos return pos
func mirror_array(array: Array[Vector2i], h: bool, v: bool) -> Array[Vector2i]: ## Returns an array that mirrors each point of the [param array].
## An optional [param callable] can be passed, which gets called for each type of symmetry.
func mirror_array(array: Array[Vector2i], callable := func(_array): pass) -> Array[Vector2i]:
var new_array: Array[Vector2i] = [] var new_array: Array[Vector2i] = []
var project := Global.current_project var project := Global.current_project
if Tools.horizontal_mirror and Tools.vertical_mirror:
var hv_array: Array[Vector2i] = []
for point in array: for point in array:
if h and v: var mirror_x := Tools.calculate_mirror_horizontal(point, project)
new_array.append( hv_array.append(Tools.calculate_mirror_vertical(mirror_x, project))
Vector2i(project.x_symmetry_point - point.x, project.y_symmetry_point - point.y) if callable.is_valid():
) callable.call(hv_array)
elif h: new_array += hv_array
new_array.append(Vector2i(project.x_symmetry_point - point.x, point.y)) if Tools.horizontal_mirror:
elif v: var h_array: Array[Vector2i] = []
new_array.append(Vector2i(point.x, project.y_symmetry_point - point.y)) for point in array:
h_array.append(Tools.calculate_mirror_horizontal(point, project))
if callable.is_valid():
callable.call(h_array)
new_array += h_array
if Tools.vertical_mirror:
var v_array: Array[Vector2i] = []
for point in array:
v_array.append(Tools.calculate_mirror_vertical(point, project))
if callable.is_valid():
callable.call(v_array)
new_array += v_array
return new_array return new_array

View file

@ -141,16 +141,7 @@ func draw_preview() -> void:
image.set_pixelv(points[i], Color.WHITE) image.set_pixelv(points[i], Color.WHITE)
# Handle mirroring # Handle mirroring
if Tools.horizontal_mirror: for point in mirror_array(points):
for point in mirror_array(points, true, false):
if Rect2i(Vector2i.ZERO, image.get_size()).has_point(point):
image.set_pixelv(point, Color.WHITE)
if Tools.vertical_mirror:
for point in mirror_array(points, true, true):
if Rect2i(Vector2i.ZERO, image.get_size()).has_point(point):
image.set_pixelv(point, Color.WHITE)
if Tools.vertical_mirror:
for point in mirror_array(points, false, true):
if Rect2i(Vector2i.ZERO, image.get_size()).has_point(point): if Rect2i(Vector2i.ZERO, image.get_size()).has_point(point):
image.set_pixelv(point, Color.WHITE) image.set_pixelv(point, Color.WHITE)
var texture := ImageTexture.create_from_image(image) var texture := ImageTexture.create_from_image(image)

View file

@ -157,16 +157,7 @@ func draw_preview() -> void:
if Rect2i(Vector2i.ZERO, image.get_size()).has_point(point): if Rect2i(Vector2i.ZERO, image.get_size()).has_point(point):
image.set_pixelv(point, Color.WHITE) image.set_pixelv(point, Color.WHITE)
# Handle mirroring # Handle mirroring
if Tools.horizontal_mirror: for point in mirror_array(points):
for point in mirror_array(points, true, false):
if Rect2i(Vector2i.ZERO, image.get_size()).has_point(point):
image.set_pixelv(point, Color.WHITE)
if Tools.vertical_mirror:
for point in mirror_array(points, true, true):
if Rect2i(Vector2i.ZERO, image.get_size()).has_point(point):
image.set_pixelv(point, Color.WHITE)
if Tools.vertical_mirror:
for point in mirror_array(points, false, true):
if Rect2i(Vector2i.ZERO, image.get_size()).has_point(point): if Rect2i(Vector2i.ZERO, image.get_size()).has_point(point):
image.set_pixelv(point, Color.WHITE) image.set_pixelv(point, Color.WHITE)
var texture := ImageTexture.create_from_image(image) var texture := ImageTexture.create_from_image(image)

View file

@ -63,16 +63,7 @@ func draw_preview() -> void:
if Rect2i(Vector2i.ZERO, image.get_size()).has_point(points[i]): if Rect2i(Vector2i.ZERO, image.get_size()).has_point(points[i]):
image.set_pixelv(points[i], Color.WHITE) image.set_pixelv(points[i], Color.WHITE)
# Handle mirroring # Handle mirroring
if Tools.horizontal_mirror: for point in mirror_array(points):
for point in mirror_array(points, true, false):
if Rect2i(Vector2i.ZERO, image.get_size()).has_point(point):
image.set_pixelv(point, Color.WHITE)
if Tools.vertical_mirror:
for point in mirror_array(points, true, true):
if Rect2i(Vector2i.ZERO, image.get_size()).has_point(point):
image.set_pixelv(point, Color.WHITE)
if Tools.vertical_mirror:
for point in mirror_array(points, false, true):
if Rect2i(Vector2i.ZERO, image.get_size()).has_point(point): if Rect2i(Vector2i.ZERO, image.get_size()).has_point(point):
image.set_pixelv(point, Color.WHITE) image.set_pixelv(point, Color.WHITE)
var texture := ImageTexture.create_from_image(image) var texture := ImageTexture.create_from_image(image)

View file

@ -46,22 +46,7 @@ func draw_preview() -> void:
image.set_pixelv(draw_point, Color.WHITE) image.set_pixelv(draw_point, Color.WHITE)
# Handle mirroring # Handle mirroring
if Tools.horizontal_mirror: for point in mirror_array(_draw_points):
for point in mirror_array(_draw_points, true, false):
var draw_point := point
if Global.mirror_view: # This fixes previewing in mirror mode
draw_point.x = image.get_width() - draw_point.x - 1
if Rect2i(Vector2i.ZERO, image.get_size()).has_point(draw_point):
image.set_pixelv(draw_point, Color.WHITE)
if Tools.vertical_mirror:
for point in mirror_array(_draw_points, true, true):
var draw_point := point
if Global.mirror_view: # This fixes previewing in mirror mode
draw_point.x = image.get_width() - draw_point.x - 1
if Rect2i(Vector2i.ZERO, image.get_size()).has_point(draw_point):
image.set_pixelv(draw_point, Color.WHITE)
if Tools.vertical_mirror:
for point in mirror_array(_draw_points, false, true):
var draw_point := point var draw_point := point
if Global.mirror_view: # This fixes previewing in mirror mode if Global.mirror_view: # This fixes previewing in mirror mode
draw_point.x = image.get_width() - draw_point.x - 1 draw_point.x = image.get_width() - draw_point.x - 1
@ -85,19 +70,10 @@ func apply_selection(_position) -> void:
if _draw_points.size() > 3: if _draw_points.size() > 3:
if _intersect: if _intersect:
project.selection_map.clear() project.selection_map.clear()
lasso_selection(project.selection_map, previous_selection_map, _draw_points) lasso_selection(_draw_points, project.selection_map, previous_selection_map)
# Handle mirroring # Handle mirroring
if Tools.horizontal_mirror: var callable := lasso_selection.bind(project.selection_map, previous_selection_map)
var mirror_x := mirror_array(_draw_points, true, false) mirror_array(_draw_points, callable)
lasso_selection(project.selection_map, previous_selection_map, mirror_x)
if Tools.vertical_mirror:
var mirror_xy := mirror_array(_draw_points, true, true)
lasso_selection(project.selection_map, previous_selection_map, mirror_xy)
if Tools.vertical_mirror:
var mirror_y := mirror_array(_draw_points, false, true)
lasso_selection(project.selection_map, previous_selection_map, mirror_y)
Global.canvas.selection.big_bounding_rectangle = project.selection_map.get_used_rect() Global.canvas.selection.big_bounding_rectangle = project.selection_map.get_used_rect()
else: else:
if !cleared: if !cleared:
@ -109,7 +85,7 @@ func apply_selection(_position) -> void:
func lasso_selection( func lasso_selection(
selection_map: SelectionMap, previous_selection_map: SelectionMap, points: Array[Vector2i] points: Array[Vector2i], selection_map: SelectionMap, previous_selection_map: SelectionMap
) -> void: ) -> void:
var selection_size := selection_map.get_size() var selection_size := selection_map.get_size()
var bounding_rect := Rect2i(points[0], Vector2i.ZERO) var bounding_rect := Rect2i(points[0], Vector2i.ZERO)

View file

@ -74,22 +74,7 @@ func draw_preview() -> void:
image.set_pixelv(draw_point, Color.WHITE) image.set_pixelv(draw_point, Color.WHITE)
# Handle mirroring # Handle mirroring
if Tools.horizontal_mirror: for point in mirror_array(_draw_points):
for point in mirror_array(_draw_points, true, false):
var draw_point := point
if Global.mirror_view: # This fixes previewing in mirror mode
draw_point.x = image.get_width() - draw_point.x - 1
if Rect2i(Vector2i.ZERO, image.get_size()).has_point(draw_point):
image.set_pixelv(draw_point, Color.WHITE)
if Tools.vertical_mirror:
for point in mirror_array(_draw_points, true, true):
var draw_point := point
if Global.mirror_view: # This fixes previewing in mirror mode
draw_point.x = image.get_width() - draw_point.x - 1
if Rect2i(Vector2i.ZERO, image.get_size()).has_point(draw_point):
image.set_pixelv(draw_point, Color.WHITE)
if Tools.vertical_mirror:
for point in mirror_array(_draw_points, false, true):
var draw_point := point var draw_point := point
if Global.mirror_view: # This fixes previewing in mirror mode if Global.mirror_view: # This fixes previewing in mirror mode
draw_point.x = image.get_width() - draw_point.x - 1 draw_point.x = image.get_width() - draw_point.x - 1
@ -115,18 +100,9 @@ func apply_selection(pos: Vector2i) -> void:
if _intersect: if _intersect:
project.selection_map.clear() project.selection_map.clear()
paint_selection(project.selection_map, previous_selection_map, _draw_points) paint_selection(project.selection_map, previous_selection_map, _draw_points)
# Handle mirroring # Handle mirroring
if Tools.horizontal_mirror: var mirror := mirror_array(_draw_points)
var mirror_x := mirror_array(_draw_points, true, false) paint_selection(project.selection_map, previous_selection_map, mirror)
paint_selection(project.selection_map, previous_selection_map, mirror_x)
if Tools.vertical_mirror:
var mirror_xy := mirror_array(_draw_points, true, true)
paint_selection(project.selection_map, previous_selection_map, mirror_xy)
if Tools.vertical_mirror:
var mirror_y := mirror_array(_draw_points, false, true)
paint_selection(project.selection_map, previous_selection_map, mirror_y)
Global.canvas.selection.big_bounding_rectangle = project.selection_map.get_used_rect() Global.canvas.selection.big_bounding_rectangle = project.selection_map.get_used_rect()
else: else:
if !cleared: if !cleared:

View file

@ -81,22 +81,7 @@ func draw_preview() -> void:
) )
# Handle mirroring # Handle mirroring
if Tools.horizontal_mirror: for point in mirror_array(preview_draw_points):
for point in mirror_array(preview_draw_points, true, false):
var draw_point := point
if Global.mirror_view: # This fixes previewing in mirror mode
draw_point.x = image.get_width() - draw_point.x - 1
if Rect2i(Vector2i.ZERO, image.get_size()).has_point(draw_point):
image.set_pixelv(draw_point, Color.WHITE)
if Tools.vertical_mirror:
for point in mirror_array(preview_draw_points, true, true):
var draw_point := point
if Global.mirror_view: # This fixes previewing in mirror mode
draw_point.x = image.get_width() - draw_point.x - 1
if Rect2i(Vector2i.ZERO, image.get_size()).has_point(draw_point):
image.set_pixelv(draw_point, Color.WHITE)
if Tools.vertical_mirror:
for point in mirror_array(preview_draw_points, false, true):
var draw_point := point var draw_point := point
if Global.mirror_view: # This fixes previewing in mirror mode if Global.mirror_view: # This fixes previewing in mirror mode
draw_point.x = image.get_width() - draw_point.x - 1 draw_point.x = image.get_width() - draw_point.x - 1
@ -122,19 +107,10 @@ func apply_selection(pos: Vector2i) -> void:
if _draw_points.size() > 3: if _draw_points.size() > 3:
if _intersect: if _intersect:
project.selection_map.clear() project.selection_map.clear()
lasso_selection(project.selection_map, previous_selection_map, _draw_points) lasso_selection(_draw_points, project.selection_map, previous_selection_map)
# Handle mirroring # Handle mirroring
if Tools.horizontal_mirror: var callable := lasso_selection.bind(project.selection_map, previous_selection_map)
var mirror_x := mirror_array(_draw_points, true, false) mirror_array(_draw_points, callable)
lasso_selection(project.selection_map, previous_selection_map, mirror_x)
if Tools.vertical_mirror:
var mirror_xy := mirror_array(_draw_points, true, true)
lasso_selection(project.selection_map, previous_selection_map, mirror_xy)
if Tools.vertical_mirror:
var mirror_y := mirror_array(_draw_points, false, true)
lasso_selection(project.selection_map, previous_selection_map, mirror_y)
Global.canvas.selection.big_bounding_rectangle = project.selection_map.get_used_rect() Global.canvas.selection.big_bounding_rectangle = project.selection_map.get_used_rect()
else: else:
if !cleared: if !cleared:
@ -152,7 +128,7 @@ func _clear() -> void:
func lasso_selection( func lasso_selection(
selection_map: SelectionMap, previous_selection_map: SelectionMap, points: Array[Vector2i] points: Array[Vector2i], selection_map: SelectionMap, previous_selection_map: SelectionMap
) -> void: ) -> void:
var selection_size := selection_map.get_size() var selection_size := selection_map.get_size()
var bounding_rect := Rect2i(points[0], Vector2i.ZERO) var bounding_rect := Rect2i(points[0], Vector2i.ZERO)

View file

@ -1,7 +1,7 @@
class_name Guide class_name Guide
extends Line2D extends Line2D
enum Types { HORIZONTAL, VERTICAL } enum Types { HORIZONTAL, VERTICAL, XY, X_MINUS_Y }
const INPUT_WIDTH := 4 const INPUT_WIDTH := 4
@ -221,14 +221,22 @@ func set_color(color: Color) -> void:
default_color = color default_color = color
func get_direction() -> Vector2:
return points[0].direction_to(points[1])
func _project_switched() -> void: func _project_switched() -> void:
if self in Global.current_project.guides: if self in Global.current_project.guides:
visible = Global.show_guides visible = Global.show_guides
if self is SymmetryGuide: if self is SymmetryGuide:
if type == Types.HORIZONTAL: if type == Types.HORIZONTAL:
visible = Global.show_x_symmetry_axis and Global.show_guides visible = Global.show_x_symmetry_axis and Global.show_guides
else: elif type == Types.VERTICAL:
visible = Global.show_y_symmetry_axis and Global.show_guides visible = Global.show_y_symmetry_axis and Global.show_guides
elif type == Types.XY:
visible = Global.show_x_y_symmetry_axis and Global.show_guides
elif type == Types.X_MINUS_Y:
visible = Global.show_x_minus_y_symmetry_axis and Global.show_guides
else: else:
visible = false visible = false

View file

@ -835,8 +835,12 @@ func _toggle_show_guides() -> void:
if guide is SymmetryGuide: if guide is SymmetryGuide:
if guide.type == Guide.Types.HORIZONTAL: if guide.type == Guide.Types.HORIZONTAL:
guide.visible = Global.show_x_symmetry_axis and Global.show_guides guide.visible = Global.show_x_symmetry_axis and Global.show_guides
else: elif guide.type == Guide.Types.VERTICAL:
guide.visible = Global.show_y_symmetry_axis and Global.show_guides guide.visible = Global.show_y_symmetry_axis and Global.show_guides
elif guide.type == Guide.Types.XY:
guide.visible = Global.show_x_y_symmetry_axis and Global.show_guides
elif guide.type == Guide.Types.X_MINUS_Y:
guide.visible = Global.show_x_minus_y_symmetry_axis and Global.show_guides
func _toggle_show_mouse_guides() -> void: func _toggle_show_mouse_guides() -> void: