Move tool works again

Buggy and messy, of course.
This commit is contained in:
Manolis Papadeas 2021-03-03 03:48:07 +02:00
parent fcccf8a5dc
commit a7dfbac5ea
2 changed files with 58 additions and 24 deletions

View file

@ -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)

View file

@ -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()