mirror of
https://github.com/Orama-Interactive/Pixelorama.git
synced 2025-01-19 01:29:49 +00:00
[Targeted for 0.11.0][Bug FIX] Mirror preview fix (#860)
* fix mirror previews * Fix incorredt selection resizing of selection in mirror mode * Fix mirror previews (selection tools) * typo
This commit is contained in:
parent
fb4b26a060
commit
67a94ccc10
|
@ -221,6 +221,10 @@ func commit_undo() -> void:
|
||||||
|
|
||||||
|
|
||||||
func draw_tool(position: Vector2) -> void:
|
func draw_tool(position: Vector2) -> void:
|
||||||
|
if Global.mirror_view:
|
||||||
|
# Even brushes are not perfectly centred and are offseted by 1 px so we add it
|
||||||
|
if int(_stroke_dimensions.x) % 2 == 0:
|
||||||
|
position.x += 1
|
||||||
_prepare_tool()
|
_prepare_tool()
|
||||||
var coords_to_draw := _draw_tool(position)
|
var coords_to_draw := _draw_tool(position)
|
||||||
for coord in coords_to_draw:
|
for coord in coords_to_draw:
|
||||||
|
@ -313,6 +317,11 @@ func _draw_tool(position: Vector2) -> PoolVector2Array:
|
||||||
# Bresenham's Algorithm
|
# Bresenham's Algorithm
|
||||||
# Thanks to https://godotengine.org/qa/35276/tile-based-line-drawing-algorithm-efficiency
|
# Thanks to https://godotengine.org/qa/35276/tile-based-line-drawing-algorithm-efficiency
|
||||||
func draw_fill_gap(start: Vector2, end: Vector2) -> void:
|
func draw_fill_gap(start: Vector2, end: Vector2) -> void:
|
||||||
|
if Global.mirror_view:
|
||||||
|
# Even brushes are not perfectly centred and are offseted by 1 px so we add it
|
||||||
|
if int(_stroke_dimensions.x) % 2 == 0:
|
||||||
|
start.x += 1
|
||||||
|
end.x += 1
|
||||||
var dx := int(abs(end.x - start.x))
|
var dx := int(abs(end.x - start.x))
|
||||||
var dy := int(-abs(end.y - start.y))
|
var dy := int(-abs(end.y - start.y))
|
||||||
var err := dx + dy
|
var err := dx + dy
|
||||||
|
|
|
@ -53,6 +53,9 @@ func draw_start(position: Vector2) -> void:
|
||||||
|
|
||||||
_draw_line = Input.is_action_pressed("draw_create_line")
|
_draw_line = Input.is_action_pressed("draw_create_line")
|
||||||
if _draw_line:
|
if _draw_line:
|
||||||
|
if Global.mirror_view:
|
||||||
|
# mirroring position is ONLY required by "Preview"
|
||||||
|
position.x = (Global.current_project.size.x - 1) - position.x
|
||||||
_line_start = position
|
_line_start = position
|
||||||
_line_end = position
|
_line_end = position
|
||||||
update_line_polylines(_line_start, _line_end)
|
update_line_polylines(_line_start, _line_end)
|
||||||
|
@ -72,6 +75,9 @@ func draw_move(position: Vector2) -> void:
|
||||||
return
|
return
|
||||||
|
|
||||||
if _draw_line:
|
if _draw_line:
|
||||||
|
if Global.mirror_view:
|
||||||
|
# mirroring position is ONLY required by "Preview"
|
||||||
|
position.x = (Global.current_project.size.x - 1) - position.x
|
||||||
var d := _line_angle_constraint(_line_start, position)
|
var d := _line_angle_constraint(_line_start, position)
|
||||||
_line_end = d.position
|
_line_end = d.position
|
||||||
cursor_text = d.text
|
cursor_text = d.text
|
||||||
|
@ -90,6 +96,10 @@ func draw_end(position: Vector2) -> void:
|
||||||
return
|
return
|
||||||
|
|
||||||
if _draw_line:
|
if _draw_line:
|
||||||
|
if Global.mirror_view:
|
||||||
|
# now we revert back the coordinates from their mirror form so that line can be drawn
|
||||||
|
_line_start.x = (Global.current_project.size.x - 1) - _line_start.x
|
||||||
|
_line_end.x = (Global.current_project.size.x - 1) - _line_end.x
|
||||||
draw_tool(_line_start)
|
draw_tool(_line_start)
|
||||||
draw_fill_gap(_line_start, _line_end)
|
draw_fill_gap(_line_start, _line_end)
|
||||||
_draw_line = false
|
_draw_line = false
|
||||||
|
|
|
@ -78,6 +78,9 @@ func draw_start(position: Vector2) -> void:
|
||||||
Global.canvas.selection.transform_content_confirm()
|
Global.canvas.selection.transform_content_confirm()
|
||||||
update_mask()
|
update_mask()
|
||||||
|
|
||||||
|
if Global.mirror_view:
|
||||||
|
# mirroring position is ONLY required by "Preview"
|
||||||
|
position.x = Global.current_project.size.x - position.x - 1
|
||||||
_original_pos = position
|
_original_pos = position
|
||||||
_start = position
|
_start = position
|
||||||
_offset = position
|
_offset = position
|
||||||
|
@ -94,6 +97,9 @@ func draw_move(position: Vector2) -> void:
|
||||||
return
|
return
|
||||||
|
|
||||||
if _drawing:
|
if _drawing:
|
||||||
|
if Global.mirror_view:
|
||||||
|
# mirroring position is ONLY required by "Preview"
|
||||||
|
position.x = Global.current_project.size.x - position.x - 1
|
||||||
if _displace_origin:
|
if _displace_origin:
|
||||||
_original_pos += position - _offset
|
_original_pos += position - _offset
|
||||||
var d := _line_angle_constraint(_original_pos, position)
|
var d := _line_angle_constraint(_original_pos, position)
|
||||||
|
@ -114,6 +120,17 @@ func draw_end(position: Vector2) -> void:
|
||||||
return
|
return
|
||||||
|
|
||||||
if _drawing:
|
if _drawing:
|
||||||
|
if Global.mirror_view:
|
||||||
|
# now we revert back the coordinates from their mirror form so that line can be drawn
|
||||||
|
_original_pos.x = (Global.current_project.size.x - 1) - _original_pos.x
|
||||||
|
_start.x = (Global.current_project.size.x - 1) - _start.x
|
||||||
|
_offset.x = (Global.current_project.size.x - 1) - _offset.x
|
||||||
|
_dest.x = (Global.current_project.size.x - 1) - _dest.x
|
||||||
|
if _thickness % 2 == 0:
|
||||||
|
_original_pos.x += 1
|
||||||
|
_start.x += 1
|
||||||
|
_offset.x += 1
|
||||||
|
_dest.x += 1
|
||||||
_draw_shape()
|
_draw_shape()
|
||||||
|
|
||||||
_original_pos = Vector2.ZERO
|
_original_pos = Vector2.ZERO
|
||||||
|
|
|
@ -116,6 +116,9 @@ func draw_start(position: Vector2) -> void:
|
||||||
_draw_line = Input.is_action_pressed("draw_create_line")
|
_draw_line = Input.is_action_pressed("draw_create_line")
|
||||||
if _draw_line:
|
if _draw_line:
|
||||||
_spacing_mode = false # spacing mode is disabled during line mode
|
_spacing_mode = false # spacing mode is disabled during line mode
|
||||||
|
if Global.mirror_view:
|
||||||
|
# mirroring position is ONLY required by "Preview"
|
||||||
|
position.x = (Global.current_project.size.x - 1) - position.x
|
||||||
_line_start = position
|
_line_start = position
|
||||||
_line_end = position
|
_line_end = position
|
||||||
update_line_polylines(_line_start, _line_end)
|
update_line_polylines(_line_start, _line_end)
|
||||||
|
@ -138,6 +141,9 @@ func draw_move(position: Vector2) -> void:
|
||||||
|
|
||||||
if _draw_line:
|
if _draw_line:
|
||||||
_spacing_mode = false # spacing mode is disabled during line mode
|
_spacing_mode = false # spacing mode is disabled during line mode
|
||||||
|
if Global.mirror_view:
|
||||||
|
# mirroring position is ONLY required by "Preview"
|
||||||
|
position.x = (Global.current_project.size.x - 1) - position.x
|
||||||
var d := _line_angle_constraint(_line_start, position)
|
var d := _line_angle_constraint(_line_start, position)
|
||||||
_line_end = d.position
|
_line_end = d.position
|
||||||
cursor_text = d.text
|
cursor_text = d.text
|
||||||
|
@ -159,6 +165,10 @@ func draw_end(position: Vector2) -> void:
|
||||||
|
|
||||||
if _draw_line:
|
if _draw_line:
|
||||||
_spacing_mode = false # spacing mode is disabled during line mode
|
_spacing_mode = false # spacing mode is disabled during line mode
|
||||||
|
if Global.mirror_view:
|
||||||
|
# now we revert back the coordinates from their mirror form so that line can be drawn
|
||||||
|
_line_start.x = (Global.current_project.size.x - 1) - _line_start.x
|
||||||
|
_line_end.x = (Global.current_project.size.x - 1) - _line_end.x
|
||||||
draw_tool(_line_start)
|
draw_tool(_line_start)
|
||||||
draw_fill_gap(_line_start, _line_end)
|
draw_fill_gap(_line_start, _line_end)
|
||||||
_draw_line = false
|
_draw_line = false
|
||||||
|
|
|
@ -52,14 +52,16 @@ func draw_preview() -> void:
|
||||||
var canvas: Node2D = Global.canvas.previews
|
var canvas: Node2D = Global.canvas.previews
|
||||||
var position := canvas.position
|
var position := canvas.position
|
||||||
var scale := canvas.scale
|
var scale := canvas.scale
|
||||||
|
var temp_rect = _rect
|
||||||
if Global.mirror_view:
|
if Global.mirror_view:
|
||||||
position.x = position.x + Global.current_project.size.x
|
position.x = position.x + Global.current_project.size.x
|
||||||
|
temp_rect.position.x = Global.current_project.size.x - temp_rect.position.x
|
||||||
scale.x = -1
|
scale.x = -1
|
||||||
|
|
||||||
var border := _get_shape_points_filled(_rect.size)
|
var border := _get_shape_points_filled(temp_rect.size)
|
||||||
var indicator := _fill_bitmap_with_points(border, _rect.size)
|
var indicator := _fill_bitmap_with_points(border, temp_rect.size)
|
||||||
|
|
||||||
canvas.draw_set_transform(_rect.position, canvas.rotation, scale)
|
canvas.draw_set_transform(temp_rect.position, canvas.rotation, scale)
|
||||||
for line in _create_polylines(indicator):
|
for line in _create_polylines(indicator):
|
||||||
canvas.draw_polyline(PoolVector2Array(line), Color.black)
|
canvas.draw_polyline(PoolVector2Array(line), Color.black)
|
||||||
|
|
||||||
|
|
|
@ -10,6 +10,8 @@ func _input(event: InputEvent) -> void:
|
||||||
return
|
return
|
||||||
if event is InputEventMouseMotion:
|
if event is InputEventMouseMotion:
|
||||||
_last_position = Global.canvas.current_pixel.floor()
|
_last_position = Global.canvas.current_pixel.floor()
|
||||||
|
if Global.mirror_view:
|
||||||
|
_last_position.x = (Global.current_project.size.x - 1) - _last_position.x
|
||||||
elif event is InputEventMouseButton:
|
elif event is InputEventMouseButton:
|
||||||
if event.doubleclick and event.button_index == tool_slot.button and _draw_points:
|
if event.doubleclick and event.button_index == tool_slot.button and _draw_points:
|
||||||
$DoubleClickTimer.start()
|
$DoubleClickTimer.start()
|
||||||
|
|
|
@ -224,6 +224,9 @@ func draw_start(position: Vector2) -> void:
|
||||||
|
|
||||||
_draw_line = Input.is_action_pressed("draw_create_line")
|
_draw_line = Input.is_action_pressed("draw_create_line")
|
||||||
if _draw_line:
|
if _draw_line:
|
||||||
|
if Global.mirror_view:
|
||||||
|
# mirroring position is ONLY required by "Preview"
|
||||||
|
position.x = (Global.current_project.size.x - 1) - position.x
|
||||||
_line_start = position
|
_line_start = position
|
||||||
_line_end = position
|
_line_end = position
|
||||||
update_line_polylines(_line_start, _line_end)
|
update_line_polylines(_line_start, _line_end)
|
||||||
|
@ -243,6 +246,9 @@ func draw_move(position: Vector2) -> void:
|
||||||
return
|
return
|
||||||
|
|
||||||
if _draw_line:
|
if _draw_line:
|
||||||
|
if Global.mirror_view:
|
||||||
|
# mirroring position is ONLY required by "Preview"
|
||||||
|
position.x = (Global.current_project.size.x - 1) - position.x
|
||||||
var d := _line_angle_constraint(_line_start, position)
|
var d := _line_angle_constraint(_line_start, position)
|
||||||
_line_end = d.position
|
_line_end = d.position
|
||||||
cursor_text = d.text
|
cursor_text = d.text
|
||||||
|
@ -261,6 +267,10 @@ func draw_end(position: Vector2) -> void:
|
||||||
return
|
return
|
||||||
|
|
||||||
if _draw_line:
|
if _draw_line:
|
||||||
|
if Global.mirror_view:
|
||||||
|
# now we revert back the coordinates from their mirror form so that line can be drawn
|
||||||
|
_line_start.x = (Global.current_project.size.x - 1) - _line_start.x
|
||||||
|
_line_end.x = (Global.current_project.size.x - 1) - _line_end.x
|
||||||
draw_tool(_line_start)
|
draw_tool(_line_start)
|
||||||
draw_fill_gap(_line_start, _line_end)
|
draw_fill_gap(_line_start, _line_end)
|
||||||
_draw_line = false
|
_draw_line = false
|
||||||
|
|
|
@ -93,6 +93,9 @@ func draw_start(position: Vector2) -> void:
|
||||||
Global.canvas.selection.transform_content_confirm()
|
Global.canvas.selection.transform_content_confirm()
|
||||||
update_mask()
|
update_mask()
|
||||||
|
|
||||||
|
if Global.mirror_view:
|
||||||
|
# mirroring position is ONLY required by "Preview"
|
||||||
|
position.x = Global.current_project.size.x - position.x - 1
|
||||||
_start = position
|
_start = position
|
||||||
_offset = position
|
_offset = position
|
||||||
_dest = position
|
_dest = position
|
||||||
|
@ -108,6 +111,9 @@ func draw_move(position: Vector2) -> void:
|
||||||
return
|
return
|
||||||
|
|
||||||
if _drawing:
|
if _drawing:
|
||||||
|
if Global.mirror_view:
|
||||||
|
# mirroring position is ONLY required by "Preview"
|
||||||
|
position.x = Global.current_project.size.x - position.x - 1
|
||||||
if _displace_origin:
|
if _displace_origin:
|
||||||
_start += position - _offset
|
_start += position - _offset
|
||||||
_dest = position
|
_dest = position
|
||||||
|
@ -122,6 +128,16 @@ func draw_end(position: Vector2) -> void:
|
||||||
return
|
return
|
||||||
|
|
||||||
if _drawing:
|
if _drawing:
|
||||||
|
if Global.mirror_view:
|
||||||
|
# now we revert back the coordinates from their mirror form so that shape can be drawn
|
||||||
|
_start.x = (Global.current_project.size.x - 1) - _start.x
|
||||||
|
_offset.x = (Global.current_project.size.x - 1) - _offset.x
|
||||||
|
_dest.x = (Global.current_project.size.x - 1) - _dest.x
|
||||||
|
if _thickness % 2 == 0:
|
||||||
|
_start.x += 1
|
||||||
|
_offset.x += 1
|
||||||
|
_dest.x += 1
|
||||||
|
position.x += 1
|
||||||
_draw_shape(_start, position)
|
_draw_shape(_start, position)
|
||||||
|
|
||||||
_start = Vector2.ZERO
|
_start = Vector2.ZERO
|
||||||
|
|
|
@ -11,6 +11,7 @@ var is_moving_content := false
|
||||||
var arrow_key_move := false
|
var arrow_key_move := false
|
||||||
var is_pasting := false
|
var is_pasting := false
|
||||||
var big_bounding_rectangle := Rect2() setget _big_bounding_rectangle_changed
|
var big_bounding_rectangle := Rect2() setget _big_bounding_rectangle_changed
|
||||||
|
var image_current_pixel := Vector2.ZERO # The ACTUAL pixel coordinate of image
|
||||||
|
|
||||||
var temp_rect := Rect2()
|
var temp_rect := Rect2()
|
||||||
var rect_aspect_ratio := 0.0
|
var rect_aspect_ratio := 0.0
|
||||||
|
@ -51,8 +52,14 @@ class Gizmo:
|
||||||
if direction == Vector2.ZERO:
|
if direction == Vector2.ZERO:
|
||||||
return Input.CURSOR_POINTING_HAND
|
return Input.CURSOR_POINTING_HAND
|
||||||
elif direction == Vector2(-1, -1) or direction == Vector2(1, 1): # Top left or bottom right
|
elif direction == Vector2(-1, -1) or direction == Vector2(1, 1): # Top left or bottom right
|
||||||
|
if Global.mirror_view:
|
||||||
|
cursor = Input.CURSOR_BDIAGSIZE
|
||||||
|
else:
|
||||||
cursor = Input.CURSOR_FDIAGSIZE
|
cursor = Input.CURSOR_FDIAGSIZE
|
||||||
elif direction == Vector2(1, -1) or direction == Vector2(-1, 1): # Top right or bottom left
|
elif direction == Vector2(1, -1) or direction == Vector2(-1, 1): # Top right or bottom left
|
||||||
|
if Global.mirror_view:
|
||||||
|
cursor = Input.CURSOR_FDIAGSIZE
|
||||||
|
else:
|
||||||
cursor = Input.CURSOR_BDIAGSIZE
|
cursor = Input.CURSOR_BDIAGSIZE
|
||||||
elif direction == Vector2(0, -1) or direction == Vector2(0, 1): # Center top or center bottom
|
elif direction == Vector2(0, -1) or direction == Vector2(0, 1): # Center top or center bottom
|
||||||
cursor = Input.CURSOR_VSIZE
|
cursor = Input.CURSOR_VSIZE
|
||||||
|
@ -77,6 +84,9 @@ func _ready() -> void:
|
||||||
|
|
||||||
|
|
||||||
func _input(event: InputEvent) -> void:
|
func _input(event: InputEvent) -> void:
|
||||||
|
image_current_pixel = canvas.current_pixel
|
||||||
|
if Global.mirror_view:
|
||||||
|
image_current_pixel.x = Global.current_project.size.x - image_current_pixel.x
|
||||||
if not Global.can_draw:
|
if not Global.can_draw:
|
||||||
return
|
return
|
||||||
if is_moving_content:
|
if is_moving_content:
|
||||||
|
@ -96,7 +106,7 @@ func _input(event: InputEvent) -> void:
|
||||||
var gizmo_hover: Gizmo
|
var gizmo_hover: Gizmo
|
||||||
if big_bounding_rectangle.size != Vector2.ZERO:
|
if big_bounding_rectangle.size != Vector2.ZERO:
|
||||||
for g in gizmos:
|
for g in gizmos:
|
||||||
if g.rect.has_point(canvas.current_pixel):
|
if g.rect.has_point(image_current_pixel):
|
||||||
gizmo_hover = Gizmo.new(g.type, g.direction)
|
gizmo_hover = Gizmo.new(g.type, g.direction)
|
||||||
break
|
break
|
||||||
|
|
||||||
|
@ -104,7 +114,7 @@ func _input(event: InputEvent) -> void:
|
||||||
if event.pressed:
|
if event.pressed:
|
||||||
if gizmo_hover and not dragged_gizmo: # Select a gizmo
|
if gizmo_hover and not dragged_gizmo: # Select a gizmo
|
||||||
Global.has_focus = false
|
Global.has_focus = false
|
||||||
mouse_pos_on_gizmo_drag = canvas.current_pixel
|
mouse_pos_on_gizmo_drag = image_current_pixel
|
||||||
dragged_gizmo = gizmo_hover
|
dragged_gizmo = gizmo_hover
|
||||||
if Input.is_action_pressed("transform_move_selection_only"):
|
if Input.is_action_pressed("transform_move_selection_only"):
|
||||||
transform_content_confirm()
|
transform_content_confirm()
|
||||||
|
@ -304,14 +314,14 @@ func _gizmo_resize() -> void:
|
||||||
if Input.is_action_pressed("shape_center"):
|
if Input.is_action_pressed("shape_center"):
|
||||||
# Code inspired from https://github.com/GDQuest/godot-open-rpg
|
# Code inspired from https://github.com/GDQuest/godot-open-rpg
|
||||||
if dir.x != 0 and dir.y != 0: # Border gizmos
|
if dir.x != 0 and dir.y != 0: # Border gizmos
|
||||||
temp_rect.size = ((canvas.current_pixel - temp_rect_pivot) * 2.0 * dir)
|
temp_rect.size = ((image_current_pixel - temp_rect_pivot) * 2.0 * dir)
|
||||||
elif dir.y == 0: # Center left and right gizmos
|
elif dir.y == 0: # Center left and right gizmos
|
||||||
temp_rect.size.x = (canvas.current_pixel.x - temp_rect_pivot.x) * 2.0 * dir.x
|
temp_rect.size.x = (image_current_pixel.x - temp_rect_pivot.x) * 2.0 * dir.x
|
||||||
elif dir.x == 0: # Center top and bottom gizmos
|
elif dir.x == 0: # Center top and bottom gizmos
|
||||||
temp_rect.size.y = (canvas.current_pixel.y - temp_rect_pivot.y) * 2.0 * dir.y
|
temp_rect.size.y = (image_current_pixel.y - temp_rect_pivot.y) * 2.0 * dir.y
|
||||||
temp_rect = Rect2(-1.0 * temp_rect.size / 2 + temp_rect_pivot, temp_rect.size)
|
temp_rect = Rect2(-1.0 * temp_rect.size / 2 + temp_rect_pivot, temp_rect.size)
|
||||||
else:
|
else:
|
||||||
_resize_rect(canvas.current_pixel, dir)
|
_resize_rect(image_current_pixel, dir)
|
||||||
|
|
||||||
if Input.is_action_pressed("shape_perfect") or resize_keep_ratio: # Maintain aspect ratio
|
if Input.is_action_pressed("shape_perfect") or resize_keep_ratio: # Maintain aspect ratio
|
||||||
var end_y := temp_rect.end.y
|
var end_y := temp_rect.end.y
|
||||||
|
@ -389,7 +399,7 @@ func resize_selection() -> void:
|
||||||
|
|
||||||
|
|
||||||
func _gizmo_rotate() -> void: # Does not work properly yet
|
func _gizmo_rotate() -> void: # Does not work properly yet
|
||||||
var angle := canvas.current_pixel.angle_to_point(mouse_pos_on_gizmo_drag)
|
var angle := image_current_pixel.angle_to_point(mouse_pos_on_gizmo_drag)
|
||||||
angle = deg2rad(floor(rad2deg(angle)))
|
angle = deg2rad(floor(rad2deg(angle)))
|
||||||
if angle == prev_angle:
|
if angle == prev_angle:
|
||||||
return
|
return
|
||||||
|
|
Loading…
Reference in a new issue