Replaced the _min and _max Project variables with Project.selected_pixels

This will allow us to create more selection tools in the future, that aren't necessarily rectangular (See #129) and even enhance the current rectangle selection tool (See #56)

Current issues spotted so far:
Drawing is slower for large images, and bucket filling is also considerably slower even on a 64x64 image. Optimizations are required.
This commit is contained in:
OverloadedOrama 2020-07-20 22:15:34 +03:00
parent 8c965c1858
commit 0f82be765e
10 changed files with 108 additions and 80 deletions

View file

@ -71,8 +71,14 @@ func set_pixel(image: Image, position: Vector2, color: Color) -> void:
var mirror_x = project.x_symmetry_point - position.x
var mirror_y = project.y_symmetry_point - position.y
var mirror_x_inside : bool = mirror_x >= project.x_min and mirror_x <= project.x_max - 1
var mirror_y_inside : bool = mirror_y >= project.y_min and mirror_y <= project.y_max - 1
var selected_pixels_x := []
var selected_pixels_y := []
for i in project.selected_pixels:
selected_pixels_x.append(i.x)
selected_pixels_y.append(i.y)
var mirror_x_inside : bool = mirror_x in selected_pixels_x
var mirror_y_inside : bool = mirror_y in selected_pixels_y
drawers[0].set_pixel(image, position, color, color_op)
if horizontal_mirror and mirror_x_inside:

View file

@ -3,7 +3,7 @@ class_name Project extends Reference
var name := "" setget name_changed
var size := Vector2(64, 64)
var size : Vector2 setget size_changed
var undo_redo : UndoRedo
var undos := 0 # The number of times we added undo properties
var has_changed := false setget has_changed_changed
@ -16,15 +16,12 @@ var guides := [] # Array of Guides
var brushes := [] # Array of Images
var x_symmetry_point := size.x / 2 + 1
var y_symmetry_point := size.y / 2 + 1
var x_symmetry_point
var y_symmetry_point
var x_symmetry_axis : SymmetryGuide
var y_symmetry_axis : SymmetryGuide
var x_min := 0
var x_max := 64
var y_min := 0
var y_max := 64
var selected_pixels := []
var selected_rect := Rect2(0, 0, 0, 0) setget _set_selected_rect
# For every camera (currently there are 3)
@ -32,17 +29,21 @@ var cameras_zoom := [Vector2(0.15, 0.15), Vector2(0.15, 0.15), Vector2(0.15, 0.1
var cameras_offset := [Vector2.ZERO, Vector2.ZERO, Vector2.ZERO] # Array of Vector2
func _init(_frames := [], _name := tr("untitled")) -> void:
func _init(_frames := [], _name := tr("untitled"), _size := Vector2(64, 64)) -> void:
frames = _frames
name = _name
x_max = size.x
y_max = size.y
size = _size
select_all_pixels()
undo_redo = UndoRedo.new()
Global.tabs.add_tab(name)
OpenSave.current_save_paths.append("")
OpenSave.backup_save_paths.append("")
x_symmetry_point = size.x / 2 + 1
y_symmetry_point = size.y / 2 + 1
if !x_symmetry_axis:
x_symmetry_axis = SymmetryGuide.new()
x_symmetry_axis.type = x_symmetry_axis.Types.HORIZONTAL
@ -60,6 +61,17 @@ func _init(_frames := [], _name := tr("untitled")) -> void:
Global.canvas.add_child(y_symmetry_axis)
func select_all_pixels() -> void:
clear_selection()
for x in size.x:
for y in size.y:
selected_pixels.append(Vector2(x, y))
func clear_selection() -> void:
selected_pixels.clear()
func _set_selected_rect(value : Rect2) -> void:
selected_rect = value
Global.selection_rectangle.set_rect(value)
@ -290,6 +302,12 @@ func name_changed(value : String) -> void:
Global.tabs.set_tab_title(Global.tabs.current_tab, name)
func size_changed(value : Vector2) -> void:
size = value
if Global.selection_rectangle._selected_rect.has_no_area():
select_all_pixels()
func frames_changed(value : Array) -> void:
frames = value
remove_cel_buttons()