diff --git a/project.godot b/project.godot index 1a241a6c4..d04047e3f 100644 --- a/project.godot +++ b/project.godot @@ -14,6 +14,11 @@ _global_script_classes=[ { "language": "GDScript", "path": "res://src/Canvas.gd" }, { +"base": "Reference", +"class": "Cel", +"language": "GDScript", +"path": "res://src/Cel.gd" +}, { "base": "Line2D", "class": "Guide", "language": "GDScript", @@ -41,6 +46,7 @@ _global_script_classes=[ { } ] _global_script_class_icons={ "Canvas": "", +"Cel": "", "Guide": "", "Layer": "", "LayerButton": "", diff --git a/src/Autoload/Global.gd b/src/Autoload/Global.gd index 5f8a39bcc..3a63ff062 100644 --- a/src/Autoload/Global.gd +++ b/src/Autoload/Global.gd @@ -499,7 +499,7 @@ func canvases_changed(value : Array) -> void: var cel_button = load("res://src/UI/Timeline/CelButton.tscn").instance() cel_button.frame = j cel_button.layer = i - cel_button.get_child(0).texture = Global.canvases[j].layers[i][1] + cel_button.get_child(0).texture = Global.canvases[j].layers[i].image_texture layers[i].frame_container.add_child(cel_button) @@ -566,7 +566,7 @@ func layers_changed(value : Array) -> void: var cel_button = load("res://src/UI/Timeline/CelButton.tscn").instance() cel_button.frame = j cel_button.layer = i - cel_button.get_child(0).texture = Global.canvases[j].layers[i][1] + cel_button.get_child(0).texture = Global.canvases[j].layers[i].image_texture layers[i].frame_container.add_child(cel_button) @@ -621,8 +621,8 @@ func frame_changed(value : int) -> void: func layer_changed(value : int) -> void: current_layer = value - layer_opacity_slider.value = canvas.layers[current_layer][2] * 100 - layer_opacity_spinbox.value = canvas.layers[current_layer][2] * 100 + layer_opacity_slider.value = canvas.layers[current_layer].opacity * 100 + layer_opacity_spinbox.value = canvas.layers[current_layer].opacity * 100 for container in layers_container.get_children(): container.pressed = false diff --git a/src/Autoload/OpenSave.gd b/src/Autoload/OpenSave.gd index daab39fb4..51aec6041 100644 --- a/src/Autoload/OpenSave.gd +++ b/src/Autoload/OpenSave.gd @@ -87,9 +87,7 @@ func open_pxo_file(path : String, untitled_backup : bool = false) -> void: var image := Image.new() image.create_from_data(width, height, false, Image.FORMAT_RGBA8, buffer) image.lock() - var tex := ImageTexture.new() - tex.create_from_image(image, 0) - canvas.layers.append([image, tex, layer_transparency]) + canvas.layers.append(Cel.new(image, layer_transparency)) if file_major_version >= 0 and file_minor_version >= 7: if frame in linked_cels[layer_i]: Global.layers[layer_i].linked_cels.append(canvas) @@ -201,8 +199,8 @@ func save_pxo_file(path : String, autosave : bool) -> void: file.store_16(canvas.size.y) for layer in canvas.layers: # Store canvas layers file.store_line("-") - file.store_buffer(layer[0].get_data()) - file.store_float(layer[2]) # Layer transparency + file.store_buffer(layer.image.get_data()) + file.store_float(layer.opacity) file.store_line("END_LAYERS") # Store guides diff --git a/src/Canvas.gd b/src/Canvas.gd index 3ae589470..9f825d4dc 100644 --- a/src/Canvas.gd +++ b/src/Canvas.gd @@ -47,17 +47,13 @@ func _ready() -> void: sprite.fill(fill_color) sprite.lock() - var tex := ImageTexture.new() - tex.create_from_image(sprite, 0) - - # Store [Image, ImageTexture, Opacity] - layers.append([sprite, tex, 1]) + layers.append(Cel.new(sprite, 1.0)) if self in l.linked_cels: # If the linked button is pressed, set as the Image & ImageTexture # to be the same as the first linked cel - layers[layer_i][0] = l.linked_cels[0].layers[layer_i][0] - layers[layer_i][1] = l.linked_cels[0].layers[layer_i][1] + layers[layer_i].image = l.linked_cels[0].layers[layer_i].image + layers[layer_i].image_texture = l.linked_cels[0].layers[layer_i].image_texture layer_i += 1 @@ -79,19 +75,19 @@ func _draw() -> void: # Draw current frame layers for i in range(layers.size()): - var modulate_color := Color(1, 1, 1, layers[i][2]) + var modulate_color := Color(1, 1, 1, layers[i].opacity) if Global.layers[i].visible: # if it's visible - draw_texture(layers[i][1], location, modulate_color) + draw_texture(layers[i].image_texture, location, modulate_color) if Global.tile_mode: - draw_texture(layers[i][1], Vector2(location.x, location.y + size.y), modulate_color) # Down - draw_texture(layers[i][1], Vector2(location.x - size.x, location.y + size.y), modulate_color) # Down Left - draw_texture(layers[i][1], Vector2(location.x - size.x, location.y), modulate_color) # Left - draw_texture(layers[i][1], location - size, modulate_color) # Up left - draw_texture(layers[i][1], Vector2(location.x, location.y - size.y), modulate_color) # Up - draw_texture(layers[i][1], Vector2(location.x + size.x, location.y - size.y), modulate_color) # Up right - draw_texture(layers[i][1], Vector2(location.x + size.x, location.y), modulate_color) # Right - draw_texture(layers[i][1], location + size, modulate_color) # Down right + draw_texture(layers[i].image_texture, Vector2(location.x, location.y + size.y), modulate_color) # Down + draw_texture(layers[i].image_texture, Vector2(location.x - size.x, location.y + size.y), modulate_color) # Down Left + draw_texture(layers[i].image_texture, Vector2(location.x - size.x, location.y), modulate_color) # Left + draw_texture(layers[i].image_texture, location - size, modulate_color) # Up left + draw_texture(layers[i].image_texture, Vector2(location.x, location.y - size.y), modulate_color) # Up + draw_texture(layers[i].image_texture, Vector2(location.x + size.x, location.y - size.y), modulate_color) # Up right + draw_texture(layers[i].image_texture, Vector2(location.x + size.x, location.y), modulate_color) # Right + draw_texture(layers[i].image_texture, location + size, modulate_color) # Down right if Global.draw_grid: draw_grid(Global.grid_type) @@ -295,7 +291,7 @@ func camera_zoom() -> void: func handle_tools(current_mouse_button : int, current_action : int, mouse_pos : Vector2, can_handle : bool) -> void: - var sprite : Image = layers[Global.current_layer][0] + var sprite : Image = layers[Global.current_layer].image var mouse_pos_floored := mouse_pos.floor() var mouse_pos_ceiled := mouse_pos.ceil() @@ -444,10 +440,10 @@ func handle_undo(action : String) -> void: for c in canvases: # I'm not sure why I have to unlock it, but... # ...if I don't, it doesn't work properly - c.layers[Global.current_layer][0].unlock() - var data = c.layers[Global.current_layer][0].data - c.layers[Global.current_layer][0].lock() - Global.undo_redo.add_undo_property(c.layers[Global.current_layer][0], "data", data) + c.layers[Global.current_layer].image.unlock() + var data = c.layers[Global.current_layer].image.data + c.layers[Global.current_layer].image.lock() + Global.undo_redo.add_undo_property(c.layers[Global.current_layer].image, "data", data) if action == "Rectangle Select": var selected_pixels = Global.selected_pixels.duplicate() Global.undo_redo.add_undo_property(Global.selection_rectangle, "polygon", Global.selection_rectangle.polygon) @@ -470,7 +466,7 @@ func handle_redo(action : String) -> void: else: canvases = Global.canvases for c in canvases: - Global.undo_redo.add_do_property(c.layers[Global.current_layer][0], "data", c.layers[Global.current_layer][0].data) + Global.undo_redo.add_do_property(c.layers[Global.current_layer].image, "data", c.layers[Global.current_layer].image.data) if action == "Rectangle Select": Global.undo_redo.add_do_property(Global.selection_rectangle, "polygon", Global.selection_rectangle.polygon) Global.undo_redo.add_do_property(Global, "selected_pixels", Global.selected_pixels) @@ -479,11 +475,11 @@ func handle_redo(action : String) -> void: func update_texture(layer_index : int) -> void: - layers[layer_index][1].create_from_image(layers[layer_index][0], 0) + layers[layer_index].image_texture.create_from_image(layers[layer_index].image, 0) var frame_texture_rect : TextureRect frame_texture_rect = Global.find_node_by_name(Global.layers[layer_index].frame_container.get_child(frame), "CelTexture") - frame_texture_rect.texture = layers[layer_index][1] + frame_texture_rect.texture = layers[layer_index].image_texture func onion_skinning() -> void: @@ -500,7 +496,7 @@ func onion_skinning() -> void: for layer in Global.canvases[Global.current_frame - i].layers: if Global.layers[layer_i].visible: color.a = 0.6 / i - draw_texture(layer[1], location, color) + draw_texture(layer.image_texture, location, color) layer_i += 1 # Future @@ -516,7 +512,7 @@ func onion_skinning() -> void: for layer in Global.canvases[Global.current_frame + i].layers: if Global.layers[layer_i].visible: color.a = 0.6 / i - draw_texture(layer[1], location, color) + draw_texture(layer.image_texture, location, color) layer_i += 1 diff --git a/src/Cel.gd b/src/Cel.gd new file mode 100644 index 000000000..ba0162f63 --- /dev/null +++ b/src/Cel.gd @@ -0,0 +1,19 @@ +class_name Cel +extends Reference +# A class for cel properties + + +var image : Image setget image_changed +var image_texture : ImageTexture +var opacity : float + + +func _init(_image := Image.new(), _opacity := 1.0) -> void: + self.image = _image + opacity = _opacity + + +func image_changed(value : Image) -> void: + image = value + image_texture = ImageTexture.new() + image_texture.create_from_image(image, 0) diff --git a/src/Layer.gd b/src/Layer.gd index b6af188af..d5cf9df10 100644 --- a/src/Layer.gd +++ b/src/Layer.gd @@ -1,5 +1,6 @@ class_name Layer extends Reference +# A class for layer properties var name := "" @@ -7,12 +8,13 @@ var visible := true var locked := false var frame_container : HBoxContainer var new_cels_linked := false -var linked_cels := [] +var linked_cels := [] # Array of Canvases + func _init(_name := tr("Layer") + " 0", _visible := true, _locked := false, _frame_container := HBoxContainer.new(), _new_cels_linked := false, _linked_cels := []) -> void: - self.name = _name - self.visible = _visible - self.locked = _locked - self.frame_container = _frame_container - self.new_cels_linked = _new_cels_linked - self.linked_cels = _linked_cels + name = _name + visible = _visible + locked = _locked + frame_container = _frame_container + new_cels_linked = _new_cels_linked + linked_cels = _linked_cels diff --git a/src/Main.gd b/src/Main.gd index 0b4a42098..0fa25adb3 100644 --- a/src/Main.gd +++ b/src/Main.gd @@ -400,7 +400,7 @@ func show_scale_image_popup() -> void: func crop_image() -> void: # Use first cel as a starting rectangle - var used_rect : Rect2 = Global.canvases[0].layers[0][0].get_used_rect() + var used_rect : Rect2 = Global.canvases[0].layers[0].image.get_used_rect() for c in Global.canvases: # However, if first cel is empty, loop through all cels until we find one that isn't @@ -409,12 +409,12 @@ func crop_image() -> void: break else: if layer[0].get_used_rect() != Rect2(0, 0, 0, 0): - used_rect = layer[0].get_used_rect() + used_rect = layer.image.get_used_rect() # Merge all layers with content for layer in c.layers: - if layer[0].get_used_rect() != Rect2(0, 0, 0, 0): - used_rect = used_rect.merge(layer[0].get_used_rect()) + if layer.image.get_used_rect() != Rect2(0, 0, 0, 0): + used_rect = used_rect.merge(layer.image.get_used_rect()) # If no layer has any content, just return if used_rect == Rect2(0, 0, 0, 0): @@ -428,9 +428,9 @@ func crop_image() -> void: Global.undo_redo.add_do_property(c, "size", Vector2(width, height).floor()) # Loop through all the layers to crop them for j in range(Global.canvas.layers.size() - 1, -1, -1): - var sprite : Image = c.layers[j][0].get_rect(used_rect) - Global.undo_redo.add_do_property(c.layers[j][0], "data", sprite.data) - Global.undo_redo.add_undo_property(c.layers[j][0], "data", c.layers[j][0].data) + var sprite : Image = c.layers[j].image.get_rect(used_rect) + Global.undo_redo.add_do_property(c.layers[j].image, "data", sprite.data) + Global.undo_redo.add_undo_property(c.layers[j].image, "data", c.layers[j].image.data) Global.undo_redo.add_undo_property(c, "size", c.size) Global.undo_redo.add_undo_method(Global, "undo", Global.canvases) @@ -441,30 +441,30 @@ func crop_image() -> void: func flip_image_horizontal() -> void: var canvas : Canvas = Global.canvas canvas.handle_undo("Draw") - canvas.layers[Global.current_layer][0].unlock() - canvas.layers[Global.current_layer][0].flip_x() - canvas.layers[Global.current_layer][0].lock() + canvas.layers[Global.current_layer].image.unlock() + canvas.layers[Global.current_layer].image.flip_x() + canvas.layers[Global.current_layer].image.lock() canvas.handle_redo("Draw") func flip_image_vertical() -> void: var canvas : Canvas = Global.canvas canvas.handle_undo("Draw") - canvas.layers[Global.current_layer][0].unlock() - canvas.layers[Global.current_layer][0].flip_y() - canvas.layers[Global.current_layer][0].lock() + canvas.layers[Global.current_layer].image.unlock() + canvas.layers[Global.current_layer].image.flip_y() + canvas.layers[Global.current_layer].image.lock() canvas.handle_redo("Draw") func show_rotate_image_popup() -> void: - var image : Image = Global.canvas.layers[Global.current_layer][0] + var image : Image = Global.canvas.layers[Global.current_layer].image $RotateImage.set_sprite(image) $RotateImage.popup_centered() Global.dialog_open(true) func invert_image_colors() -> void: - var image : Image = Global.canvas.layers[Global.current_layer][0] + var image : Image = Global.canvas.layers[Global.current_layer].image Global.canvas.handle_undo("Draw") for xx in image.get_size().x: for yy in image.get_size().y: @@ -476,7 +476,7 @@ func invert_image_colors() -> void: func desaturate_image() -> void: - var image : Image = Global.canvas.layers[Global.current_layer][0] + var image : Image = Global.canvas.layers[Global.current_layer].image Global.canvas.handle_undo("Draw") for xx in image.get_size().x: for yy in image.get_size().y: diff --git a/src/SelectionRectangle.gd b/src/SelectionRectangle.gd index 5a4f898c7..09d907bf8 100644 --- a/src/SelectionRectangle.gd +++ b/src/SelectionRectangle.gd @@ -27,7 +27,7 @@ func _process(_delta : float) -> void: var start_pos := polygon[0] var end_pos := polygon[2] var current_layer_index : int = Global.current_layer - var layer : Image = Global.canvas.layers[current_layer_index][0] + var layer : Image = Global.canvas.layers[current_layer_index].image if end_pos == start_pos: visible = false diff --git a/src/UI/Dialogs/CreateNewImage.gd b/src/UI/Dialogs/CreateNewImage.gd index 2612a9e3e..61272127f 100644 --- a/src/UI/Dialogs/CreateNewImage.gd +++ b/src/UI/Dialogs/CreateNewImage.gd @@ -87,8 +87,8 @@ func _on_CreateNewImage_confirmed() -> void: Global.layers = Global.layers # To trigger Global.layers_changed() Global.project_has_changed = false if fill_color.a > 0: - Global.canvas.layers[0][0].fill(fill_color) - Global.canvas.layers[0][0].lock() + Global.canvas.layers[0].image.fill(fill_color) + Global.canvas.layers[0].image.lock() Global.canvas.update_texture(0) diff --git a/src/UI/Dialogs/ExportDialog.gd b/src/UI/Dialogs/ExportDialog.gd index d7d305770..1ee012584 100644 --- a/src/UI/Dialogs/ExportDialog.gd +++ b/src/UI/Dialogs/ExportDialog.gd @@ -367,13 +367,13 @@ func blend_layers(image: Image, canvas: Canvas, origin: Vector2 = Vector2(0, 0)) for layer in canvas.layers: if Global.layers[layer_i].visible: var layer_image := Image.new() - layer_image.copy_from(layer[0]) + layer_image.copy_from(layer.image) layer_image.lock() - if layer[2] < 1: # If we have layer transparency + if layer.opacity < 1: # If we have layer transparency for xx in layer_image.get_size().x: for yy in layer_image.get_size().y: var pixel_color := layer_image.get_pixel(xx, yy) - var alpha : float = pixel_color.a * layer[2] + var alpha : float = pixel_color.a * layer.opacity layer_image.set_pixel(xx, yy, Color(pixel_color.r, pixel_color.g, pixel_color.b, alpha)) DrawingAlgos.blend_rect(image, layer_image, Rect2(canvas.position, canvas.size), origin) layer_i += 1 diff --git a/src/UI/Dialogs/HSVDialog.gd b/src/UI/Dialogs/HSVDialog.gd index 4b03a263f..000d716b7 100644 --- a/src/UI/Dialogs/HSVDialog.gd +++ b/src/UI/Dialogs/HSVDialog.gd @@ -23,7 +23,7 @@ func _ready() -> void: func _on_HSVDialog_about_to_show() -> void: - current_layer = Global.canvas.layers[Global.current_layer][0] + current_layer = Global.canvas.layers[Global.current_layer].image preview_image.copy_from(current_layer) update_preview() diff --git a/src/UI/Dialogs/ImportSprites.gd b/src/UI/Dialogs/ImportSprites.gd index 4f8285c00..389f97931 100644 --- a/src/UI/Dialogs/ImportSprites.gd +++ b/src/UI/Dialogs/ImportSprites.gd @@ -64,22 +64,14 @@ func _on_ImportSprites_files_selected(paths : PoolStringArray) -> void: canvas.size = image.get_size() image.convert(Image.FORMAT_RGBA8) image.lock() - var tex := ImageTexture.new() - tex.create_from_image(image, 0) - # Store [Image, ImageTexture, Opacity] - canvas.layers.append([image, tex, 1]) + canvas.layers.append(Cel.new(image, 1)) for _i in range(1, Global.layers.size()): var empty_sprite := Image.new() empty_sprite.create(canvas.size.x, canvas.size.y, false, Image.FORMAT_RGBA8) empty_sprite.fill(Color(0, 0, 0, 0)) empty_sprite.lock() - - var empty_tex := ImageTexture.new() - empty_tex.create_from_image(empty_sprite, 0) - - # Store [Image, ImageTexture, Opacity] - canvas.layers.append([empty_sprite, empty_tex, 1]) + canvas.layers.append(Cel.new(empty_sprite, 1)) canvas.frame = i Global.canvases.append(canvas) @@ -119,21 +111,14 @@ func _on_ImportSprites_files_selected(paths : PoolStringArray) -> void: canvas.size = cropped_image.get_size() cropped_image.convert(Image.FORMAT_RGBA8) cropped_image.lock() - var tex := ImageTexture.new() - tex.create_from_image(cropped_image, 0) - # Store [Image, ImageTexture, Opacity] - canvas.layers.append([cropped_image, tex, 1]) + canvas.layers.append(Cel.new(cropped_image, 1)) + for _i in range(1, Global.layers.size()): var empty_sprite := Image.new() empty_sprite.create(canvas.size.x, canvas.size.y, false, Image.FORMAT_RGBA8) empty_sprite.fill(Color(0, 0, 0, 0)) empty_sprite.lock() - - var empty_tex := ImageTexture.new() - empty_tex.create_from_image(empty_sprite, 0) - - # Store [Image, ImageTexture, Opacity] - canvas.layers.append([empty_sprite, empty_tex, 1]) + canvas.layers.append(Cel.new(empty_sprite, 1)) canvas.frame = i Global.canvases.append(canvas) diff --git a/src/UI/Dialogs/OutlineDialog.gd b/src/UI/Dialogs/OutlineDialog.gd index edc16bdb6..2bf74ffc3 100644 --- a/src/UI/Dialogs/OutlineDialog.gd +++ b/src/UI/Dialogs/OutlineDialog.gd @@ -10,7 +10,7 @@ func _on_OutlineDialog_confirmed() -> void: var diagonal : bool = $OptionsContainer/DiagonalCheckBox.pressed var inside_image : bool = $OptionsContainer/InsideImageCheckBox.pressed - var image : Image = Global.canvas.layers[Global.current_layer][0] + var image : Image = Global.canvas.layers[Global.current_layer].image if image.is_invisible(): return var new_image := Image.new() diff --git a/src/UI/Dialogs/ScaleImage.gd b/src/UI/Dialogs/ScaleImage.gd index de4cbfd62..dc308a5fc 100644 --- a/src/UI/Dialogs/ScaleImage.gd +++ b/src/UI/Dialogs/ScaleImage.gd @@ -12,10 +12,10 @@ func _on_ScaleImage_confirmed() -> void: Global.undo_redo.add_do_property(c, "size", Vector2(width, height).floor()) for i in range(c.layers.size() - 1, -1, -1): var sprite := Image.new() - sprite.copy_from(c.layers[i][0]) + sprite.copy_from(c.layers[i].image) sprite.resize(width, height, interpolation) - Global.undo_redo.add_do_property(c.layers[i][0], "data", sprite.data) - Global.undo_redo.add_undo_property(c.layers[i][0], "data", c.layers[i][0].data) + Global.undo_redo.add_do_property(c.layers[i].image, "data", sprite.data) + Global.undo_redo.add_undo_property(c.layers[i].image, "data", c.layers[i].image.data) Global.undo_redo.add_undo_property(c, "size", c.size) Global.undo_redo.add_undo_method(Global, "undo", Global.canvases) diff --git a/src/UI/Timeline/AnimationTimeline.gd b/src/UI/Timeline/AnimationTimeline.gd index 88b05e649..edc56690a 100644 --- a/src/UI/Timeline/AnimationTimeline.gd +++ b/src/UI/Timeline/AnimationTimeline.gd @@ -130,11 +130,9 @@ func _on_CopyFrame_pressed(frame := -1) -> void: for layer in canvas.layers: # Copy every layer var sprite := Image.new() - sprite.copy_from(layer[0]) + sprite.copy_from(layer.image) sprite.lock() - var tex := ImageTexture.new() - tex.create_from_image(sprite, 0) - new_canvas.layers.append([sprite, tex, layer[2]]) + new_canvas.layers.append(Cel.new(sprite, layer.opacity)) var new_animation_tags := Global.animation_tags.duplicate(true) # Loop through the tags to see if the frame is in one @@ -350,15 +348,12 @@ func add_layer(is_new := true) -> void: if is_new: new_layer.create(c.size.x, c.size.y, false, Image.FORMAT_RGBA8) else: # Clone layer - new_layer.copy_from(c.layers[Global.current_layer][0]) + new_layer.copy_from(c.layers[Global.current_layer].image) new_layer.lock() - var new_layer_tex := ImageTexture.new() - new_layer_tex.create_from_image(new_layer, 0) var new_canvas_layers : Array = c.layers.duplicate() - # Store [Image, ImageTexture, Opacity] - new_canvas_layers.append([new_layer, new_layer_tex, 1]) + new_canvas_layers.append(Cel.new(new_layer, 1)) Global.undo_redo.add_do_property(c, "layers", new_canvas_layers) Global.undo_redo.add_undo_property(c, "layers", c.layers) @@ -430,30 +425,27 @@ func _on_MergeDownLayer_pressed() -> void: for c in Global.canvases: var new_layers_canvas : Array = c.layers.duplicate(true) var selected_layer := Image.new() - selected_layer.copy_from(new_layers_canvas[Global.current_layer][0]) + selected_layer.copy_from(new_layers_canvas[Global.current_layer].image) selected_layer.lock() - if c.layers[Global.current_layer][2] < 1: # If we have layer transparency + if c.layers[Global.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 * c.layers[Global.current_layer][2] + var alpha : float = pixel_color.a * c.layers[Global.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(c.layers[Global.current_layer - 1][0]) + new_layer.copy_from(c.layers[Global.current_layer - 1].image) new_layer.lock() DrawingAlgos.blend_rect(new_layer, selected_layer, Rect2(c.position, c.size), Vector2.ZERO) new_layers_canvas.remove(Global.current_layer) if !selected_layer.is_invisible() and Global.layers[Global.current_layer - 1].linked_cels.size() > 1 and (c in Global.layers[Global.current_layer - 1].linked_cels): new_layers[Global.current_layer - 1].linked_cels.erase(c) - var tex := ImageTexture.new() - tex.create_from_image(new_layer, 0) - new_layers_canvas[Global.current_layer - 1][0] = new_layer - new_layers_canvas[Global.current_layer - 1][1] = tex + new_layers_canvas[Global.current_layer - 1].image = new_layer else: - Global.undo_redo.add_do_property(c.layers[Global.current_layer - 1][0], "data", new_layer.data) - Global.undo_redo.add_undo_property(c.layers[Global.current_layer - 1][0], "data", c.layers[Global.current_layer - 1][0].data) + Global.undo_redo.add_do_property(c.layers[Global.current_layer - 1].image, "data", new_layer.data) + Global.undo_redo.add_undo_property(c.layers[Global.current_layer - 1].image, "data", c.layers[Global.current_layer - 1].image.data) Global.undo_redo.add_do_property(c, "layers", new_layers_canvas) Global.undo_redo.add_undo_property(c, "layers", c.layers) @@ -470,7 +462,7 @@ func _on_MergeDownLayer_pressed() -> void: func _on_OpacitySlider_value_changed(value) -> void: - Global.canvas.layers[Global.current_layer][2] = value / 100 + Global.canvas.layers[Global.current_layer].opacity = value / 100 Global.layer_opacity_slider.value = value Global.layer_opacity_slider.value = value Global.layer_opacity_spinbox.value = value