The frames variable in Project is not an array anymore.

This commit is contained in:
Relintai 2020-11-30 13:57:07 +01:00
parent ee640b65a1
commit 548c78d023
10 changed files with 134 additions and 155 deletions

View File

@ -308,14 +308,14 @@ func undo(_frame_index := -1, _layer_index := -1, project : Project = current_pr
func redo(_frame_index := -1, _layer_index := -1, project : Project = current_project) -> void:
general_redo(project)
var action_name : String = project.undo_redo.get_current_action_name()
if action_name == "Draw" or action_name == "Rectangle Select" or action_name == "Scale" or action_name == "Merge Layer" or action_name == "Link Cel" or action_name == "Unlink Cel":
if _layer_index > -1 and _frame_index > -1:
canvas.update_texture(_layer_index, _frame_index, project)
else:
for i in project.frames.size():
for j in project.layers.size():
canvas.update_texture(j, i, project)
for j in project.layers.size():
canvas.update_texture(j, 0, project)
if action_name == "Scale":
canvas.camera_zoom()

View File

@ -67,16 +67,7 @@ func open_pxo_file(path : String, untitled_backup : bool = false) -> void:
file.close()
return
var empty_project : bool = DrawGD.current_project.frames.size() == 1 and DrawGD.current_project.layers.size() == 1 and DrawGD.current_project.frames[0].cels[0].image.is_invisible() and DrawGD.current_project.animation_tags.size() == 0
var new_project : Project
if empty_project:
new_project = DrawGD.current_project
new_project.frames = []
new_project.layers = []
new_project.animation_tags.clear()
new_project.name = path.get_file()
else:
new_project = Project.new(DrawGD, [], path.get_file())
var new_project = Project.new(DrawGD, null, path.get_file())
var first_line := file.get_line()
var dict := JSON.parse(first_line)
@ -106,12 +97,9 @@ func open_pxo_file(path : String, untitled_backup : bool = false) -> void:
Brushes.add_project_brush(DrawGD, image)
file.close()
if !empty_project:
DrawGD.projects.append(new_project)
DrawGD.tabs.current_tab = DrawGD.tabs.get_tab_count() - 1
else:
new_project.frames = new_project.frames # Just to call frames_changed
new_project.layers = new_project.layers # Just to call layers_changed
DrawGD.projects.append(new_project)
DrawGD.tabs.current_tab = DrawGD.tabs.get_tab_count() - 1
DrawGD.canvas.camera_zoom()
if not untitled_backup:

View File

@ -12,9 +12,8 @@ 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
var frames := []
var frames = null
var layers := [] setget layers_changed # Array of Layers
var current_frame := 0 setget frame_changed
var current_layer := 0 setget layer_changed
var guides := [] # Array of Guides
@ -38,8 +37,16 @@ var file_name := "untitled"
var file_format : int = Export.FileFormat.PNG
func _init(pDrawGD, _frames := [], _name := tr("untitled"), _size := Vector2(64, 64)) -> void:
frames = _frames
func _init(pDrawGD, _frames = null, _name := tr("untitled"), _size := Vector2(64, 64)) -> void:
if !_frames:
frames = Frame.new()
else:
frames = _frames
if _frames is Array:
print("dadad")
name = _name
size = _size
select_all_pixels()
@ -109,7 +116,8 @@ func change_project() -> void:
layer_container.label.text = layers[i].name
layer_container.line_edit.text = layers[i].name
layer_container.cel_button.texture = frames[0].cels[0].image_texture
if frames && frames.cels.size() > 0:
layer_container.cel_button.texture = frames.cels[0].image_texture
var layer_button = DrawGD.layers_container.get_child(DrawGD.layers_container.get_child_count() - 1 - current_layer)
layer_button.pressed = true
@ -179,16 +187,10 @@ func change_project() -> void:
func serialize() -> Dictionary:
var layer_data := []
for layer in layers:
var linked_cels := []
for cel in layer.linked_cels:
linked_cels.append(frames.find(cel))
layer_data.append({
"name" : layer.name,
"visible" : layer.visible,
"locked" : layer.locked,
"new_cels_linked" : layer.new_cels_linked,
"linked_cels" : linked_cels,
})
var guide_data := []
@ -204,16 +206,16 @@ func serialize() -> Dictionary:
guide_data.append({"type" : guide.type, "pos" : coords})
var frame_data := []
for frame in frames:
var cel_data := []
for cel in frame.cels:
cel_data.append({
"opacity" : cel.opacity,
# "image_data" : cel.image.get_data()
})
frame_data.append({
"cels" : cel_data
var cel_data := []
for cel in frames.cels:
cel_data.append({
"opacity" : cel.opacity,
# "image_data" : cel.image.get_data()
})
frame_data.append({
"cels" : cel_data
})
var brush_data := []
for brush in brushes:
brush_data.append({
@ -249,23 +251,23 @@ func deserialize(dict : Dictionary) -> void:
select_all_pixels()
if dict.has("save_path"):
DrawGD.opensave.current_save_paths[DrawGD.projects.find(self)] = dict.save_path
if dict.has("frames"):
for frame in dict.frames:
var cels := []
for cel in frame.cels:
cels.append(Cel.new(Image.new(), cel.opacity))
frames.append(Frame.new(cels))
var frame = dict.frames
var cels := []
for cel in frame.cels:
cels.append(Cel.new(Image.new(), cel.opacity))
frames = Frame.new(cels)
if dict.has("layers"):
var layer_i := 0
for saved_layer in dict.layers:
var linked_cels := []
for linked_cel_number in saved_layer.linked_cels:
linked_cels.append(frames[linked_cel_number])
frames[linked_cel_number].cels[layer_i].image = linked_cels[0].cels[layer_i].image
frames[linked_cel_number].cels[layer_i].image_texture = linked_cels[0].cels[layer_i].image_texture
var layer := Layer.new(saved_layer.name, saved_layer.visible, saved_layer.locked, HBoxContainer.new(), saved_layer.new_cels_linked, linked_cels)
var layer := Layer.new(saved_layer.name, saved_layer.visible, saved_layer.locked, HBoxContainer.new())
layers.append(layer)
layer_i += 1
if dict.has("guides"):
for g in dict.guides:
var guide := Guide.new()
@ -279,6 +281,7 @@ func deserialize(dict : Dictionary) -> void:
guide.has_focus = false
DrawGD.canvas.add_child(guide)
guides.append(guide)
if dict.has("symmetry_points"):
x_symmetry_point = dict.symmetry_points[0]
y_symmetry_point = dict.symmetry_points[1]
@ -286,6 +289,7 @@ func deserialize(dict : Dictionary) -> void:
x_symmetry_axis.points[1].y = floor(y_symmetry_point / 2 + 1)
y_symmetry_axis.points[0].x = floor(x_symmetry_point / 2 + 1)
y_symmetry_axis.points[1].x = floor(x_symmetry_point / 2 + 1)
if dict.has("export_directory_path"):
directory_path = dict.export_directory_path
if dict.has("export_file_name"):
@ -326,40 +330,39 @@ func layers_changed(value : Array) -> void:
layer_container.label.text = layers[i].name
layer_container.line_edit.text = layers[i].name
if frames.size() > 0:
layer_container.cel_button.texture = frames[0].cels[0].image_texture
var layer_button = DrawGD.layers_container.get_child(DrawGD.layers_container.get_child_count() - 1 - current_layer)
layer_button.pressed = true
self.current_frame = current_frame # Call frame_changed to update UI
toggle_layer_buttons_layers()
func frame_changed(value : int) -> void:
current_frame = value
for i in frames.size():
var text_color := Color.white
if DrawGD.theme_type == DrawGD.Theme_Types.CARAMEL || DrawGD.theme_type == DrawGD.Theme_Types.LIGHT:
text_color = Color.black
if frames && frames.cels.size() > 0:
layer_container.cel_button.texture = frames.cels[0].image_texture
for layer in layers: # De-select all the other frames
if i < layer.frame_container.get_child_count():
layer.frame_container.get_child(i).pressed = false
# Select the new frame
if layers and current_frame < layers[current_layer].frame_container.get_child_count():
layers[current_layer].frame_container.get_child(current_frame).pressed = true
DrawGD.canvas.update()
DrawGD.transparent_checker._ready() # To update the rect size
var layer_button = DrawGD.layers_container.get_child(DrawGD.layers_container.get_child_count() - 1 - current_layer)
layer_button.pressed = true
toggle_layer_buttons_layers()
#func frame_changed(value : int) -> void:
# var text_color := Color.white
# if DrawGD.theme_type == DrawGD.Theme_Types.CARAMEL || DrawGD.theme_type == DrawGD.Theme_Types.LIGHT:
# text_color = Color.black
#
# for layer in layers: # De-select all the other frames
# if 0 < layer.frame_container.get_child_count():
# layer.frame_container.get_child(0).pressed = false
#
# # Select the new frame
# if layers and current_frame < layers[current_layer].frame_container.get_child_count():
# layers[current_layer].frame_container.get_child(current_frame).pressed = true
#
# DrawGD.canvas.update()
# DrawGD.transparent_checker._ready() # To update the rect size
func layer_changed(value : int) -> void:
current_layer = value
if current_frame < frames.size():
DrawGD.layer_opacity_slider.value = frames[current_frame].cels[current_layer].opacity * 100
DrawGD.layer_opacity_spinbox.value = frames[current_frame].cels[current_layer].opacity * 100
DrawGD.layer_opacity_slider.value = frames.cels[current_layer].opacity * 100
DrawGD.layer_opacity_spinbox.value = frames.cels[current_layer].opacity * 100
for container in DrawGD.layers_container.get_children():
container.pressed = false
@ -371,7 +374,6 @@ func layer_changed(value : int) -> void:
toggle_layer_buttons_current_layer()
yield(DrawGD.get_tree().create_timer(0.01), "timeout")
self.current_frame = current_frame # Call frame_changed to update UI
func toggle_layer_buttons_layers() -> void:

View File

@ -95,7 +95,7 @@ func _get_tile_mode_rect() -> Rect2:
func _get_draw_image() -> Image:
var project : Project = DrawGD.current_project
return project.frames[project.current_frame].cels[project.current_layer].image
return project.frames.cels[project.current_layer].image
func _flip_rect(rect : Rect2, size : Vector2, horizontal : bool, vertical : bool) -> Rect2:

View File

@ -158,10 +158,8 @@ func prepare_undo() -> void:
func commit_undo(action : String) -> void:
var redo_data = _get_undo_data()
var project : Project = DrawGD.current_project
var frame := -1
var layer := -1
frame = project.current_frame
layer = project.current_layer
project.undos += 1
@ -170,8 +168,8 @@ func commit_undo(action : String) -> void:
project.undo_redo.add_do_property(image, "data", redo_data[image])
for image in _undo_data:
project.undo_redo.add_undo_property(image, "data", _undo_data[image])
project.undo_redo.add_do_method(DrawGD, "redo", frame, layer)
project.undo_redo.add_undo_method(DrawGD, "undo", frame, layer)
project.undo_redo.add_do_method(DrawGD, "redo", 0, layer)
project.undo_redo.add_undo_method(DrawGD, "undo", 0, layer)
project.undo_redo.commit_action()
_undo_data.clear()
@ -510,13 +508,10 @@ func _line_angle_constraint(start : Vector2, end : Vector2) -> Dictionary:
func _get_undo_data() -> Dictionary:
var data = {}
var project : Project = DrawGD.current_project
var frames := project.frames
var frame = project.frames
frames = [project.frames[project.current_frame]]
for frame in frames:
var image : Image = frame.cels[project.current_layer].image
image.unlock()
data[image] = image.data
image.lock()
var image : Image = frame.cels[project.current_layer].image
image.unlock()
data[image] = image.data
image.lock()
return data

View File

@ -2,7 +2,6 @@ tool
class_name Canvas
extends Node2D
var location := Vector2.ZERO
var fill_color := Color(0, 0, 0, 0)
var current_pixel := Vector2.ZERO # pretty much same as mouse_pos, but can be accessed externally
@ -16,7 +15,6 @@ onready var indicators = $Indicators
var DrawGD : Node = null
# Called when the node enters the scene tree for the first time.
func _enter_tree() -> void:
var n : Node = get_parent()
@ -27,16 +25,15 @@ func _enter_tree() -> void:
n = n.get_parent()
var frame : Frame = new_empty_frame(true)
DrawGD.current_project.frames.append(frame)
DrawGD.current_project.frames = frame
yield(get_tree().create_timer(0.2), "timeout")
camera_zoom()
func _draw() -> void:
DrawGD.second_viewport.get_child(0).get_node("CanvasPreview").update()
DrawGD.small_preview_viewport.get_child(0).get_node("CanvasPreview").update()
var current_cels : Array = DrawGD.current_project.frames[DrawGD.current_project.current_frame].cels
var current_cels : Array = DrawGD.current_project.frames.cels
# Draw current frame layers
for i in range(DrawGD.current_project.layers.size()):
@ -46,7 +43,6 @@ func _draw() -> void:
tile_mode.update()
func _input(event : InputEvent) -> void:
# Don't process anything below if the input isn't a mouse event, or Shift/Ctrl.
# This decreases CPU/GPU usage slightly.
@ -196,9 +192,7 @@ func handle_redo(_action : String, project : Project = DrawGD.current_project, l
func update_texture(layer_index : int, frame_index := -1, project : Project = DrawGD.current_project) -> void:
if frame_index == -1:
frame_index = project.current_frame
var current_cel : Cel = project.frames[frame_index].cels[layer_index]
var current_cel : Cel = project.frames.cels[layer_index]
current_cel.image_texture.create_from_image(current_cel.image, 0)
if project == DrawGD.current_project:

View File

@ -17,11 +17,8 @@ func _enter_tree():
func _draw() -> void:
var current_project : Project = DrawGD.current_project
if frame >= current_project.frames.size():
frame = current_project.current_frame
var current_cels : Array = current_project.frames[frame].cels
var current_cels : Array = current_project.frames.cels
# Draw current frame layers
for i in range(current_cels.size()):

View File

@ -15,7 +15,7 @@ func _enter_tree():
n = n.get_parent()
func _draw() -> void:
var current_cels : Array = DrawGD.current_project.frames[DrawGD.current_project.current_frame].cels
var current_cels : Array = DrawGD.current_project.frames.cels
var size : Vector2 = DrawGD.current_project.size
var positions := [
Vector2(location.x, location.y + size.y), # Down

View File

@ -99,7 +99,7 @@ func _on_CreateNewImage_confirmed() -> void:
DrawGD.canvas.fill_color = fill_color
var frame : Frame = DrawGD.canvas.new_empty_frame(false, true, Vector2(width, height))
var new_project := Project.new(DrawGD, [frame], tr("untitled"), Vector2(width, height).floor())
var new_project := Project.new(DrawGD, frame, tr("untitled"), Vector2(width, height).floor())
new_project.layers.append(Layer.new())
DrawGD.projects.append(new_project)
DrawGD.tabs.current_tab = DrawGD.tabs.get_tab_count() - 1

View File

@ -21,19 +21,20 @@ func add_layer(is_new := true) -> void:
DrawGD.current_project.undos += 1
DrawGD.current_project.undo_redo.create_action("Add Layer")
for f in DrawGD.current_project.frames:
var new_layer := Image.new()
if is_new:
new_layer.create(DrawGD.current_project.size.x, DrawGD.current_project.size.y, false, Image.FORMAT_RGBA8)
else: # Clone layer
new_layer.copy_from(f.cels[DrawGD.current_project.current_layer].image)
var f = DrawGD.current_project.frames
var new_layer := Image.new()
if is_new:
new_layer.create(DrawGD.current_project.size.x, DrawGD.current_project.size.y, false, Image.FORMAT_RGBA8)
else: # Clone layer
new_layer.copy_from(f.cels[DrawGD.current_project.current_layer].image)
new_layer.lock()
new_layer.lock()
var new_cels : Array = f.cels.duplicate()
new_cels.append(Cel.new(new_layer, 1))
DrawGD.current_project.undo_redo.add_do_property(f, "cels", new_cels)
DrawGD.current_project.undo_redo.add_undo_property(f, "cels", f.cels)
var new_cels : Array = f.cels.duplicate()
new_cels.append(Cel.new(new_layer, 1))
DrawGD.current_project.undo_redo.add_do_property(f, "cels", new_cels)
DrawGD.current_project.undo_redo.add_undo_property(f, "cels", f.cels)
DrawGD.current_project.undo_redo.add_do_property(DrawGD.current_project, "current_layer", DrawGD.current_project.current_layer + 1)
DrawGD.current_project.undo_redo.add_do_property(DrawGD.current_project, "layers", new_layers)
@ -57,11 +58,11 @@ func _on_RemoveLayer_pressed() -> void:
else:
DrawGD.current_project.undo_redo.add_do_property(DrawGD.current_project, "current_layer", DrawGD.current_project.current_layer)
for f in DrawGD.current_project.frames:
var new_cels : Array = f.cels.duplicate()
new_cels.remove(DrawGD.current_project.current_layer)
DrawGD.current_project.undo_redo.add_do_property(f, "cels", new_cels)
DrawGD.current_project.undo_redo.add_undo_property(f, "cels", f.cels)
var f = DrawGD.current_project.frames
var new_cels : Array = f.cels.duplicate()
new_cels.remove(DrawGD.current_project.current_layer)
DrawGD.current_project.undo_redo.add_do_property(f, "cels", new_cels)
DrawGD.current_project.undo_redo.add_undo_property(f, "cels", f.cels)
DrawGD.current_project.undo_redo.add_do_property(DrawGD.current_project, "layers", new_layers)
DrawGD.current_project.undo_redo.add_undo_property(DrawGD.current_project, "current_layer", DrawGD.current_project.current_layer)
@ -79,13 +80,14 @@ func change_layer_order(rate : int) -> void:
new_layers[DrawGD.current_project.current_layer] = new_layers[change]
new_layers[change] = temp
DrawGD.current_project.undo_redo.create_action("Change Layer Order")
for f in DrawGD.current_project.frames:
var new_cels : Array = f.cels.duplicate()
var temp_canvas = new_cels[DrawGD.current_project.current_layer]
new_cels[DrawGD.current_project.current_layer] = new_cels[change]
new_cels[change] = temp_canvas
DrawGD.current_project.undo_redo.add_do_property(f, "cels", new_cels)
DrawGD.current_project.undo_redo.add_undo_property(f, "cels", f.cels)
var f = DrawGD.current_project.frames
var new_cels : Array = f.cels.duplicate()
var temp_canvas = new_cels[DrawGD.current_project.current_layer]
new_cels[DrawGD.current_project.current_layer] = new_cels[change]
new_cels[change] = temp_canvas
DrawGD.current_project.undo_redo.add_do_property(f, "cels", new_cels)
DrawGD.current_project.undo_redo.add_undo_property(f, "cels", f.cels)
DrawGD.current_project.undo_redo.add_do_property(DrawGD.current_project, "current_layer", change)
DrawGD.current_project.undo_redo.add_do_property(DrawGD.current_project, "layers", new_layers)
@ -107,35 +109,36 @@ func _on_MergeDownLayer_pressed() -> void:
DrawGD.current_project.undos += 1
DrawGD.current_project.undo_redo.create_action("Merge Layer")
for f in DrawGD.current_project.frames:
var new_cels : Array = f.cels.duplicate()
for i in new_cels.size():
new_cels[i] = Cel.new(new_cels[i].image, new_cels[i].opacity)
var selected_layer := Image.new()
selected_layer.copy_from(new_cels[DrawGD.current_project.current_layer].image)
selected_layer.lock()
var f = DrawGD.current_project.frames
var new_cels : Array = f.cels.duplicate()
for i in new_cels.size():
new_cels[i] = Cel.new(new_cels[i].image, new_cels[i].opacity)
var selected_layer := Image.new()
selected_layer.copy_from(new_cels[DrawGD.current_project.current_layer].image)
selected_layer.lock()
if f.cels[DrawGD.current_project.current_layer].opacity < 1: # If we have layer transparency
for xx in selected_layer.get_size().x:
for yy in selected_layer.get_size().y:
var pixel_color : Color = selected_layer.get_pixel(xx, yy)
var alpha : float = pixel_color.a * f.cels[DrawGD.current_project.current_layer].opacity
selected_layer.set_pixel(xx, yy, Color(pixel_color.r, pixel_color.g, pixel_color.b, alpha))
if f.cels[DrawGD.current_project.current_layer].opacity < 1: # If we have layer transparency
for xx in selected_layer.get_size().x:
for yy in selected_layer.get_size().y:
var pixel_color : Color = selected_layer.get_pixel(xx, yy)
var alpha : float = pixel_color.a * f.cels[DrawGD.current_project.current_layer].opacity
selected_layer.set_pixel(xx, yy, Color(pixel_color.r, pixel_color.g, pixel_color.b, alpha))
var new_layer := Image.new()
new_layer.copy_from(f.cels[DrawGD.current_project.current_layer - 1].image)
new_layer.lock()
new_layer.blend_rect(selected_layer, Rect2(DrawGD.canvas.location, DrawGD.current_project.size), Vector2.ZERO)
new_cels.remove(DrawGD.current_project.current_layer)
if !selected_layer.is_invisible() and DrawGD.current_project.layers[DrawGD.current_project.current_layer - 1].linked_cels.size() > 1 and (f in DrawGD.current_project.layers[DrawGD.current_project.current_layer - 1].linked_cels):
new_layers[DrawGD.current_project.current_layer - 1].linked_cels.erase(f)
new_cels[DrawGD.current_project.current_layer - 1].image = new_layer
else:
DrawGD.current_project.undo_redo.add_do_property(f.cels[DrawGD.current_project.current_layer - 1].image, "data", new_layer.data)
DrawGD.current_project.undo_redo.add_undo_property(f.cels[DrawGD.current_project.current_layer - 1].image, "data", f.cels[DrawGD.current_project.current_layer - 1].image.data)
var new_layer := Image.new()
new_layer.copy_from(f.cels[DrawGD.current_project.current_layer - 1].image)
new_layer.lock()
new_layer.blend_rect(selected_layer, Rect2(DrawGD.canvas.location, DrawGD.current_project.size), Vector2.ZERO)
new_cels.remove(DrawGD.current_project.current_layer)
if !selected_layer.is_invisible() and DrawGD.current_project.layers[DrawGD.current_project.current_layer - 1].linked_cels.size() > 1 and (f in DrawGD.current_project.layers[DrawGD.current_project.current_layer - 1].linked_cels):
new_layers[DrawGD.current_project.current_layer - 1].linked_cels.erase(f)
new_cels[DrawGD.current_project.current_layer - 1].image = new_layer
else:
DrawGD.current_project.undo_redo.add_do_property(f.cels[DrawGD.current_project.current_layer - 1].image, "data", new_layer.data)
DrawGD.current_project.undo_redo.add_undo_property(f.cels[DrawGD.current_project.current_layer - 1].image, "data", f.cels[DrawGD.current_project.current_layer - 1].image.data)
DrawGD.current_project.undo_redo.add_do_property(f, "cels", new_cels)
DrawGD.current_project.undo_redo.add_undo_property(f, "cels", f.cels)
DrawGD.current_project.undo_redo.add_do_property(f, "cels", new_cels)
DrawGD.current_project.undo_redo.add_undo_property(f, "cels", f.cels)
new_layers.remove(DrawGD.current_project.current_layer)
DrawGD.current_project.undo_redo.add_do_property(DrawGD.current_project, "current_layer", DrawGD.current_project.current_layer - 1)