From a7dfbac5eaffebdfec15e2410a18473f86d9e3a6 Mon Sep 17 00:00:00 2001 From: Manolis Papadeas <35376950+OverloadedOrama@users.noreply.github.com> Date: Wed, 3 Mar 2021 03:48:07 +0200 Subject: [PATCH] Move tool works again Buggy and messy, of course. --- src/Tools/RectSelect.gd | 3 ++ src/UI/Canvas/Selection.gd | 79 ++++++++++++++++++++++++++------------ 2 files changed, 58 insertions(+), 24 deletions(-) diff --git a/src/Tools/RectSelect.gd b/src/Tools/RectSelect.gd index 3dda7fb..4e257b8 100644 --- a/src/Tools/RectSelect.gd +++ b/src/Tools/RectSelect.gd @@ -10,12 +10,15 @@ var _move := false func draw_start(position : Vector2) -> void: + Global.canvas.selection.move_content_end() for selection in Global.canvas.selection.polygons: if selection.rect_outline.has_point(position): current_selection = selection if !current_selection: if !Tools.shift and !Tools.control: + for p in Global.canvas.selection.polygons: + p.selected_pixels = [] Global.canvas.selection.polygons.clear() _start = Rect2(position, Vector2.ZERO) var new_selection = Global.canvas.selection.SelectionPolygon.new(_start) diff --git a/src/UI/Canvas/Selection.gd b/src/UI/Canvas/Selection.gd index ec36da8..f90eabb 100644 --- a/src/UI/Canvas/Selection.gd +++ b/src/UI/Canvas/Selection.gd @@ -3,11 +3,12 @@ extends Node2D class SelectionPolygon: # var project : Project - var border := PoolVector2Array() + var border := [] var rect_outline : Rect2 # var rects := [] # Array of Rect2s var selected_pixels := [] setget _selected_pixels_changed # Array of Vector2s - the selected pixels - + var image := Image.new() setget _image_changed + var image_texture := ImageTexture.new() func _init(rect : Rect2) -> void: rect_outline = rect @@ -39,6 +40,12 @@ class SelectionPolygon: Global.current_project.selected_pixels.append(pixel) + func _image_changed(value : Image) -> void: + image = value + image_texture = ImageTexture.new() + image_texture.create_from_image(image, 0) + + var polygons := [] # Array of SelectionPolygon(s) var tween : Tween var line_offset := Vector2.ZERO setget _offset_changed @@ -158,28 +165,28 @@ func merge_multiple_selections(polygon : SelectionPolygon, merge := true) -> voi func move_content_start() -> void: move_borders_start() - for shape in get_children(): - if !shape.local_image.is_empty(): + for p in polygons: + if !p.image.is_empty(): return - shape.local_image = shape.get_image() - shape.local_image_texture.create_from_image(shape.local_image, 0) + p.image = get_image_from_polygon(p) var project : Project = Global.current_project var cel_image : Image = project.frames[project.current_frame].cels[project.current_layer].image - shape._clear_image.resize(shape._selected_rect.size.x, shape._selected_rect.size.y, Image.INTERPOLATE_NEAREST) - cel_image.blit_rect_mask(shape._clear_image, shape.local_image, Rect2(Vector2.ZERO, shape._selected_rect.size), shape._selected_rect.position) +# shape._clear_image.resize(shape._selected_rect.size.x, shape._selected_rect.size.y, Image.INTERPOLATE_NEAREST) + var clear_image := Image.new() + clear_image.create(p.image.get_width(), p.image.get_height(), false, Image.FORMAT_RGBA8) + cel_image.blit_rect_mask(clear_image, p.image, Rect2(Vector2.ZERO, p.rect_outline.size), p.rect_outline.position) Global.canvas.update_texture(project.current_layer) func move_content_end() -> void: - for shape in get_children(): - if shape.local_image.is_empty(): + for p in polygons: + if p.image.is_empty(): return var project : Project = Global.current_project var cel_image : Image = project.frames[project.current_frame].cels[project.current_layer].image - cel_image.blit_rect_mask(shape.local_image, shape.local_image, Rect2(Vector2.ZERO, shape._selected_rect.size), shape._selected_rect.position) + cel_image.blit_rect_mask(p.image, p.image, Rect2(Vector2.ZERO, p.rect_outline.size), p.rect_outline.position) Global.canvas.update_texture(project.current_layer) - shape.local_image = Image.new() - shape.local_image_texture = ImageTexture.new() + p.image = Image.new() func commit_undo(action : String, undo_data : Dictionary) -> void: @@ -231,8 +238,8 @@ func _get_undo_data(undo_image : bool) -> Dictionary: func _draw() -> void: - for polygon in polygons: - var points : PoolVector2Array = polygon.border + for p in polygons: + var points : Array = p.border # print(polygon) for i in range(1, points.size() + 1): var point0 = points[i - 1] @@ -250,9 +257,11 @@ func _draw() -> void: var end := Vector2(end_x, end_y) draw_dashed_line(start, end, Color.white, Color.black, 1.0, 1.0, false) + if !p.image.is_empty(): + draw_texture(p.image_texture, p.rect_outline.position, Color(1, 1, 1, 1)) + # if !polygon.selected_pixels: # return - # draw_polygon(Global.current_project.get_selection_polygon(), [Color(1, 1, 1, 0.5)]) # var rect_pos := _selected_rect.position # var rect_end := _selected_rect.end # draw_circle(rect_pos, 1, Color.gray) @@ -265,8 +274,6 @@ func _draw() -> void: # draw_circle(Vector2(rect_pos.x, rect_end.y), 1, Color.gray) # draw_circle(Vector2(rect_pos.x, (rect_end.y + rect_pos.y) / 2), 1, Color.gray) -# if !local_image.is_empty(): -# draw_texture(local_image_texture, _selected_rect.position, Color(1, 1, 1, 0.5)) # if _move_pixel: # draw_texture(_move_texture, _clipped_rect.position, Color(1, 1, 1, 0.5)) @@ -329,13 +336,13 @@ func draw_dashed_line(from : Vector2, to : Vector2, color : Color, color2 : Colo draw_line(segment_start, to, color, width, antialiased) -func get_bounding_rectangle(polygon : PoolVector2Array) -> Rect2: +func get_bounding_rectangle(borders : PoolVector2Array) -> Rect2: var rect := Rect2() - var xmin = polygon[0].x - var xmax = polygon[0].x - var ymin = polygon[0].y - var ymax = polygon[0].y - for edge in polygon: + var xmin = borders[0].x + var xmax = borders[0].x + var ymin = borders[0].y + var ymax = borders[0].y + for edge in borders: if edge.x < xmin: xmin = edge.x if edge.x > xmax: @@ -349,6 +356,30 @@ func get_bounding_rectangle(polygon : PoolVector2Array) -> Rect2: return rect +func get_image_from_polygon(polygon : SelectionPolygon) -> Image: + var rect : Rect2 = polygon.rect_outline + var project : Project = Global.current_project + var cel_image : Image = project.frames[project.current_frame].cels[project.current_layer].image + var image := Image.new() + image = cel_image.get_rect(rect) + if polygon.border.size() > 4: + image.lock() + var image_pixel := Vector2.ZERO + for x in range(rect.position.x, rect.end.x): + image_pixel.y = 0 + for y in range(rect.position.y, rect.end.y): + var pos := Vector2(x, y) + if not pos in polygon.selected_pixels: + image.set_pixelv(image_pixel, Color(0, 0, 0, 0)) + image_pixel.y += 1 + image_pixel.x += 1 + + image.unlock() +# image.create(_selected_rect.size.x, _selected_rect.size.y, false, Image.FORMAT_RGBA8) + + return image + + func generate_rect(pixels : Array) -> Rect2: if !pixels: return Rect2()