124 lines
3.0 KiB
GDScript
124 lines
3.0 KiB
GDScript
extends Node
|
|
class_name GEAction
|
|
|
|
|
|
var action_data = {}
|
|
|
|
|
|
func _init():
|
|
action_data["redo"] = {}
|
|
action_data["undo"] = {}
|
|
action_data["preview"] = {}
|
|
|
|
|
|
func do_action(canvas, data: Array):
|
|
if not "cells" in action_data.redo:
|
|
action_data.redo["cells"] = []
|
|
action_data.redo["colors"] = []
|
|
|
|
if not "cells" in action_data.undo:
|
|
action_data.undo["cells"] = []
|
|
action_data.undo["colors"] = []
|
|
|
|
if not "cells" in action_data.preview:
|
|
action_data.preview["cells"] = []
|
|
action_data.preview["colors"] = []
|
|
|
|
if not "layer" in action_data:
|
|
action_data["layer"] = canvas.active_layer
|
|
|
|
|
|
func commit_action(canvas):
|
|
print("NO IMPL commit_action ")
|
|
return []
|
|
|
|
|
|
func undo_action(canvas):
|
|
print("NO IMPL undo_action ")
|
|
|
|
|
|
func redo_action(canvas):
|
|
print("NO IMPL redo_action ")
|
|
|
|
|
|
func can_commit() -> bool:
|
|
return not action_data.redo.empty()
|
|
|
|
|
|
func get_x_sym_points(canvas_width, pixel):
|
|
var p = int(canvas_width - pixel.x)
|
|
var all_points = [pixel, Vector2(p-1, pixel.y)]
|
|
|
|
var points :Array = []
|
|
for point in all_points:
|
|
if point in points:
|
|
continue
|
|
points.append(point)
|
|
return points
|
|
|
|
|
|
func get_y_sym_points(canvas_height, pixel):
|
|
var p = int(canvas_height - pixel.y)
|
|
var all_points = [pixel, Vector2(pixel.x, p-1)]
|
|
|
|
var points :Array = []
|
|
for point in all_points:
|
|
if point in points:
|
|
continue
|
|
points.append(point)
|
|
return points
|
|
|
|
|
|
func get_xy_sym_points(canvas_width, canvas_height, pixel):
|
|
var all_points = []
|
|
var xpoints = get_x_sym_points(canvas_width, pixel)
|
|
|
|
all_points += get_y_sym_points(canvas_height, xpoints[0])
|
|
all_points += get_y_sym_points(canvas_height, xpoints[1])
|
|
|
|
var points :Array = []
|
|
for point in all_points:
|
|
if point in points:
|
|
continue
|
|
points.append(point)
|
|
|
|
return points
|
|
|
|
|
|
func get_points(canvas, pixel):
|
|
var points = []
|
|
if canvas.symmetry_x and canvas.symmetry_y:
|
|
var sym_points = get_xy_sym_points(canvas.canvas_width, canvas.canvas_height, pixel)
|
|
for point in sym_points:
|
|
if point in action_data.undo.cells or canvas.get_pixel_v(point) == null:
|
|
continue
|
|
if canvas.is_alpha_locked() and canvas.get_pixel_v(pixel) == Color.transparent:
|
|
continue
|
|
points.append(point)
|
|
elif canvas.symmetry_y:
|
|
var sym_points = get_y_sym_points(canvas.canvas_height, pixel)
|
|
for point in sym_points:
|
|
if point in action_data.undo.cells or canvas.get_pixel_v(point) == null:
|
|
continue
|
|
if canvas.is_alpha_locked() and canvas.get_pixel_v(pixel) == Color.transparent:
|
|
continue
|
|
points.append(point)
|
|
elif canvas.symmetry_x:
|
|
var sym_points = get_x_sym_points(canvas.canvas_width, pixel)
|
|
for point in sym_points:
|
|
if point in action_data.undo.cells or canvas.get_pixel_v(point) == null:
|
|
continue
|
|
if canvas.is_alpha_locked() and canvas.get_pixel_v(pixel) == Color.transparent:
|
|
continue
|
|
points.append(point)
|
|
else:
|
|
if pixel in action_data.undo.cells or canvas.get_pixel_v(pixel) == null:
|
|
return []
|
|
if canvas.is_alpha_locked() and canvas.get_pixel_v(pixel) == Color.transparent:
|
|
return []
|
|
points.append(pixel)
|
|
|
|
return points
|
|
|
|
|