From b4d515d6cbbb852499febd965e932d9aa30a2db0 Mon Sep 17 00:00:00 2001 From: Brazza Date: Wed, 12 Aug 2026 16:40:09 -0400 Subject: [PATCH 1/7] edge case of deleting layer --- project.godot | 2 +- tools/dragger.gd | 49 +++++++++++++++++++ tools/dragger.gd.uid | 1 + .../containers/edit_extras/dragger_handler.gd | 3 ++ .../edit_extras/dragger_handler.gd.uid | 1 + .../timeline_manager/timeline_manager.gd | 13 +++-- .../containers/tool_manager/dragger_menu.tscn | 41 ++++++++++++++++ .../containers/tool_manager/tool_manager.tscn | 13 +++-- 8 files changed, 113 insertions(+), 10 deletions(-) create mode 100644 tools/dragger.gd create mode 100644 tools/dragger.gd.uid create mode 100644 views/editor/containers/edit_extras/dragger_handler.gd create mode 100644 views/editor/containers/edit_extras/dragger_handler.gd.uid create mode 100644 views/editor/containers/tool_manager/dragger_menu.tscn diff --git a/project.godot b/project.godot index 6ff1ec3..daaf264 100644 --- a/project.godot +++ b/project.godot @@ -13,7 +13,7 @@ config_version=5 config/name="Sketchpad" config/version="v0.0.2" run/main_scene="uid://bhgj2qy6e3eb5" -config/features=PackedStringArray("4.6") +config/features=PackedStringArray("4.7") boot_splash/bg_color=Color(1, 1, 1, 1) boot_splash/show_image=false boot_splash/use_filter=false diff --git a/tools/dragger.gd b/tools/dragger.gd new file mode 100644 index 0000000..fe1d586 --- /dev/null +++ b/tools/dragger.gd @@ -0,0 +1,49 @@ +class_name Dragger +extends Tool + +@export var title: String = "Dragger" +@export var tolerance: float +@export var color: Color + + +func _init() -> void: + name = "Paint Bucket" + + +func on_pointer_down(_position: Vector2, _canvas: Canvas) -> void: + var project: Project = _canvas._project + var current_page: Page = project.frames[project.current_frame] + var layer: Image = current_page.layers[project.current_layer] + + var directions = [Vector2i.DOWN, Vector2i.UP, Vector2i.LEFT, Vector2i.RIGHT] + + var start_pos = Vector2i(_position) + var initial_color: Color = layer.get_pixelv(start_pos) + var initial_vector: Vector3 = Vector3(initial_color.r, initial_color.g, initial_color.b) + + if initial_color == color: + return + + var visited: Dictionary = {} + var pixels: Array[Vector2i] = [start_pos] + while !pixels.is_empty(): + var pixel = pixels.pop_back() + layer.set_pixelv(pixel, color) + for d in directions: + var new_pixel = pixel + d + + if new_pixel.x < 0 or new_pixel.x >= project.width: + continue + elif new_pixel.y < 0 or new_pixel.y >= project.height: + continue + elif visited.has(new_pixel): + continue + + var new_color: Color = layer.get_pixelv(new_pixel) + if ( + initial_vector.distance_to(Vector3(new_color.r, new_color.g, new_color.b)) + <= tolerance * sqrt(3) + ): + pixels.append(new_pixel) + visited[new_pixel] = true + current_page.set_layer(project.current_layer, layer) diff --git a/tools/dragger.gd.uid b/tools/dragger.gd.uid new file mode 100644 index 0000000..c4b9dae --- /dev/null +++ b/tools/dragger.gd.uid @@ -0,0 +1 @@ +uid://cmoaigxlt61kr diff --git a/views/editor/containers/edit_extras/dragger_handler.gd b/views/editor/containers/edit_extras/dragger_handler.gd new file mode 100644 index 0000000..6539099 --- /dev/null +++ b/views/editor/containers/edit_extras/dragger_handler.gd @@ -0,0 +1,3 @@ +extends PanelContainer + +@export var tool: Tool diff --git a/views/editor/containers/edit_extras/dragger_handler.gd.uid b/views/editor/containers/edit_extras/dragger_handler.gd.uid new file mode 100644 index 0000000..9036cba --- /dev/null +++ b/views/editor/containers/edit_extras/dragger_handler.gd.uid @@ -0,0 +1 @@ +uid://dd6lviar777hv diff --git a/views/editor/containers/timeline_manager/timeline_manager.gd b/views/editor/containers/timeline_manager/timeline_manager.gd index 115ef35..a8f460e 100644 --- a/views/editor/containers/timeline_manager/timeline_manager.gd +++ b/views/editor/containers/timeline_manager/timeline_manager.gd @@ -92,17 +92,20 @@ func _deleting_layers() -> void: deleting_idx.sort() deleting_idx.reverse() - for idx in deleting_idx: - current_list.displayed_page.delete_layer(idx) - var frames := _project.frames + for idx in deleting_idx: + if frames.size() == 1 && deleting_idx.size() == frames[0].layers.size(): + return + else: + current_list.displayed_page.delete_layer(idx) + for frame_index in range(frames.size() - 1, -1, -1): - if frames[frame_index].layers.is_empty(): + if frames[frame_index].layers.is_empty() && frames.size() > 1: _project.delete_frame(frame_index) if _project.current_frame >= frames.size(): - _project.set_frame(max(0, frames.size() - 1)) + _project.set_frame(frames.size() - 1) if _project.current_layer >= frames[_project.current_frame].layers.size(): _project.set_layer(frames[_project.current_frame].layers.size() - 1) diff --git a/views/editor/containers/tool_manager/dragger_menu.tscn b/views/editor/containers/tool_manager/dragger_menu.tscn new file mode 100644 index 0000000..3598b35 --- /dev/null +++ b/views/editor/containers/tool_manager/dragger_menu.tscn @@ -0,0 +1,41 @@ +[gd_scene format=3 uid="uid://cqm4tsb4pn43x"] + +[ext_resource type="Script" uid="uid://dd6lviar777hv" path="res://views/editor/containers/edit_extras/dragger_handler.gd" id="1_h4quk"] + +[node name="Dragger" type="PanelContainer" unique_id=1901649934] +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_h4quk") +metadata/_tab_index = 3 + +[node name="VBoxContainer" type="VBoxContainer" parent="." unique_id=313668476] +layout_mode = 2 + +[node name="HSeparatorTop" type="HSeparator" parent="VBoxContainer" unique_id=1723392298] +layout_mode = 2 +size_flags_vertical = 3 + +[node name="Label1" type="Label" parent="VBoxContainer" unique_id=741098247] +custom_minimum_size = Vector2(600, 0) +layout_mode = 2 +theme_override_font_sizes/font_size = 32 +text = "Tool Selected!" +horizontal_alignment = 1 +vertical_alignment = 1 +autowrap_mode = 3 + +[node name="Label2" type="Label" parent="VBoxContainer" unique_id=1492746256] +custom_minimum_size = Vector2(600, 0) +layout_mode = 2 +theme_override_font_sizes/font_size = 20 +text = "Hold and drag the left mouse button to drag the layer." +horizontal_alignment = 1 +vertical_alignment = 1 +autowrap_mode = 3 + +[node name="HSeparatorBottom" type="HSeparator" parent="VBoxContainer" unique_id=2021852044] +layout_mode = 2 +size_flags_vertical = 3 diff --git a/views/editor/containers/tool_manager/tool_manager.tscn b/views/editor/containers/tool_manager/tool_manager.tscn index 2fc69ab..1ad1ce7 100644 --- a/views/editor/containers/tool_manager/tool_manager.tscn +++ b/views/editor/containers/tool_manager/tool_manager.tscn @@ -4,11 +4,12 @@ [ext_resource type="Script" uid="uid://dmdsa85guxgav" path="res://views/editor/containers/tool_manager/tool_manager.gd" id="1_vjvnp"] [ext_resource type="PackedScene" uid="uid://dpxmvb2d305l5" path="res://views/editor/containers/tool_manager/paint_bucket_menu.tscn" id="2_voh52"] [ext_resource type="PackedScene" uid="uid://d0v3i8vgql1sj" path="res://views/editor/containers/tool_manager/eraser_menu.tscn" id="4_1gcu4"] - -[sub_resource type="ButtonGroup" id="ButtonGroup_1gcu4"] +[ext_resource type="PackedScene" uid="uid://cqm4tsb4pn43x" path="res://views/editor/containers/tool_manager/dragger_menu.tscn" id="5_exmo2"] [sub_resource type="ButtonGroup" id="ButtonGroup_exmo2"] +[sub_resource type="ButtonGroup" id="ButtonGroup_y4lxs"] + [node name="Tools" type="Control" unique_id=1657501930 node_paths=PackedStringArray("tool_tab")] layout_mode = 3 anchors_preset = 15 @@ -31,7 +32,7 @@ tabs_position = 1 [node name="Brush" parent="ToolList" unique_id=1654936513 node_paths=PackedStringArray("tool_manager") instance=ExtResource("1_omk8e")] layout_mode = 2 -button_group = SubResource("ButtonGroup_1gcu4") +button_group = SubResource("ButtonGroup_exmo2") tool_manager = NodePath("../..") [node name="Paint Bucket" parent="ToolList" unique_id=1220713478 instance=ExtResource("2_voh52")] @@ -42,8 +43,12 @@ metadata/_tab_index = 1 [node name="Eraser" parent="ToolList" unique_id=1505104656 node_paths=PackedStringArray("tool_manager") instance=ExtResource("4_1gcu4")] visible = false layout_mode = 2 -button_group = SubResource("ButtonGroup_exmo2") +button_group = SubResource("ButtonGroup_y4lxs") tool_manager = NodePath("../..") metadata/_tab_index = 2 +[node name="Dragger" parent="ToolList" unique_id=1901649934 instance=ExtResource("5_exmo2")] +visible = false +layout_mode = 2 + [connection signal="tab_changed" from="ToolList" to="." method="_on_tool_list_tab_changed"] From 9506a0b9efac949cbf11c026e22d4da9cf3f4308 Mon Sep 17 00:00:00 2001 From: Brazza Date: Wed, 12 Aug 2026 16:43:07 -0400 Subject: [PATCH 2/7] Update timeline_manager.gd --- views/editor/containers/timeline_manager/timeline_manager.gd | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/views/editor/containers/timeline_manager/timeline_manager.gd b/views/editor/containers/timeline_manager/timeline_manager.gd index a8f460e..62a3fe8 100644 --- a/views/editor/containers/timeline_manager/timeline_manager.gd +++ b/views/editor/containers/timeline_manager/timeline_manager.gd @@ -97,8 +97,7 @@ func _deleting_layers() -> void: for idx in deleting_idx: if frames.size() == 1 && deleting_idx.size() == frames[0].layers.size(): return - else: - current_list.displayed_page.delete_layer(idx) + current_list.displayed_page.delete_layer(idx) for frame_index in range(frames.size() - 1, -1, -1): if frames[frame_index].layers.is_empty() && frames.size() > 1: From 632600ab0afbfa49e1a45f3608d54beb43d24d5c Mon Sep 17 00:00:00 2001 From: Brazza Date: Wed, 12 Aug 2026 17:49:39 -0400 Subject: [PATCH 3/7] New Tool Dragger New tool dragger added! --- tools/dragger.gd | 83 +++++++++++-------- .../containers/tool_manager/dragger_menu.tscn | 6 ++ 2 files changed, 55 insertions(+), 34 deletions(-) diff --git a/tools/dragger.gd b/tools/dragger.gd index fe1d586..cd866d5 100644 --- a/tools/dragger.gd +++ b/tools/dragger.gd @@ -2,48 +2,63 @@ class_name Dragger extends Tool @export var title: String = "Dragger" -@export var tolerance: float -@export var color: Color +var _dragging := false +var _start_mouse := Vector2.ZERO +var _drag_sprite: Sprite2D = null +var _layer_image: Image = null func _init() -> void: - name = "Paint Bucket" - + name = "Dragger" func on_pointer_down(_position: Vector2, _canvas: Canvas) -> void: + if not _canvas or not _canvas._project: + return + var project: Project = _canvas._project - var current_page: Page = project.frames[project.current_frame] - var layer: Image = current_page.layers[project.current_layer] + var page: Page = project.frames[project.current_frame] + var layer: Image = page.layers[project.current_layer] + + _dragging = true + _start_mouse = _position + _layer_image = layer.duplicate() + + # Remove the original so the dragged copy is not duplicated. + layer.fill(Color(0, 0, 0, 0)) + page.set_layer(project.current_layer, layer) - var directions = [Vector2i.DOWN, Vector2i.UP, Vector2i.LEFT, Vector2i.RIGHT] + if _drag_sprite: + _drag_sprite.queue_free() + _drag_sprite = null - var start_pos = Vector2i(_position) - var initial_color: Color = layer.get_pixelv(start_pos) - var initial_vector: Vector3 = Vector3(initial_color.r, initial_color.g, initial_color.b) + _drag_sprite = Sprite2D.new() + _drag_sprite.texture = ImageTexture.create_from_image(_layer_image) + _drag_sprite.centered = false + _drag_sprite.position = Vector2.ZERO + _canvas.dynamic_node.add_child(_drag_sprite) - if initial_color == color: +func on_pointer_move(_position: Vector2, _canvas: Canvas) -> void: + if not _dragging or not _drag_sprite: return - var visited: Dictionary = {} - var pixels: Array[Vector2i] = [start_pos] - while !pixels.is_empty(): - var pixel = pixels.pop_back() - layer.set_pixelv(pixel, color) - for d in directions: - var new_pixel = pixel + d - - if new_pixel.x < 0 or new_pixel.x >= project.width: - continue - elif new_pixel.y < 0 or new_pixel.y >= project.height: - continue - elif visited.has(new_pixel): - continue - - var new_color: Color = layer.get_pixelv(new_pixel) - if ( - initial_vector.distance_to(Vector3(new_color.r, new_color.g, new_color.b)) - <= tolerance * sqrt(3) - ): - pixels.append(new_pixel) - visited[new_pixel] = true - current_page.set_layer(project.current_layer, layer) + _drag_sprite.position = _position - _start_mouse + +func on_pointer_up(_position: Vector2, _canvas: Canvas) -> void: + if not _dragging: + return + + _dragging = false + + if _drag_sprite: + _drag_sprite.queue_free() + _drag_sprite = null + + if _layer_image and _canvas and _canvas._project: + var project: Project = _canvas._project + var page: Page = project.frames[project.current_frame] + var layer: Image = page.layers[project.current_layer] + var offset: Vector2 = _position - _start_mouse + var moved := Image.create_empty(layer.get_width(), layer.get_height(), false, Image.FORMAT_RGBA8) + moved.blend_rect(_layer_image, Rect2(Vector2.ZERO, _layer_image.get_size()), offset) + page.set_layer(project.current_layer, moved) + _layer_image = null diff --git a/views/editor/containers/tool_manager/dragger_menu.tscn b/views/editor/containers/tool_manager/dragger_menu.tscn index 3598b35..cfd6d43 100644 --- a/views/editor/containers/tool_manager/dragger_menu.tscn +++ b/views/editor/containers/tool_manager/dragger_menu.tscn @@ -1,6 +1,11 @@ [gd_scene format=3 uid="uid://cqm4tsb4pn43x"] [ext_resource type="Script" uid="uid://dd6lviar777hv" path="res://views/editor/containers/edit_extras/dragger_handler.gd" id="1_h4quk"] +[ext_resource type="Script" uid="uid://cmoaigxlt61kr" path="res://tools/dragger.gd" id="2_b5fda"] + +[sub_resource type="Resource" id="Resource_h4quk"] +script = ExtResource("2_b5fda") +metadata/_custom_type_script = "uid://cmoaigxlt61kr" [node name="Dragger" type="PanelContainer" unique_id=1901649934] anchors_preset = 15 @@ -9,6 +14,7 @@ anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 script = ExtResource("1_h4quk") +tool = SubResource("Resource_h4quk") metadata/_tab_index = 3 [node name="VBoxContainer" type="VBoxContainer" parent="." unique_id=313668476] From 049b54e66f344df504fa7edc732e01404e15493d Mon Sep 17 00:00:00 2001 From: Brazza Date: Wed, 19 Aug 2026 19:13:35 -0400 Subject: [PATCH 4/7] Update dragger --- project.godot | 2 +- tools/dragger.gd | 24 ++++++++++++------------ 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/project.godot b/project.godot index daaf264..6ff1ec3 100644 --- a/project.godot +++ b/project.godot @@ -13,7 +13,7 @@ config_version=5 config/name="Sketchpad" config/version="v0.0.2" run/main_scene="uid://bhgj2qy6e3eb5" -config/features=PackedStringArray("4.7") +config/features=PackedStringArray("4.6") boot_splash/bg_color=Color(1, 1, 1, 1) boot_splash/show_image=false boot_splash/use_filter=false diff --git a/tools/dragger.gd b/tools/dragger.gd index cd866d5..7a1144e 100644 --- a/tools/dragger.gd +++ b/tools/dragger.gd @@ -3,7 +3,7 @@ extends Tool @export var title: String = "Dragger" -var _dragging := false +var dragging := false var _start_mouse := Vector2.ZERO var _drag_sprite: Sprite2D = null var _layer_image: Image = null @@ -19,7 +19,7 @@ func on_pointer_down(_position: Vector2, _canvas: Canvas) -> void: var page: Page = project.frames[project.current_frame] var layer: Image = page.layers[project.current_layer] - _dragging = true + dragging = true _start_mouse = _position _layer_image = layer.duplicate() @@ -29,36 +29,36 @@ func on_pointer_down(_position: Vector2, _canvas: Canvas) -> void: if _drag_sprite: _drag_sprite.queue_free() - _drag_sprite = null _drag_sprite = Sprite2D.new() _drag_sprite.texture = ImageTexture.create_from_image(_layer_image) _drag_sprite.centered = false _drag_sprite.position = Vector2.ZERO + _drag_sprite.texture_filter = CanvasItem.TEXTURE_FILTER_NEAREST _canvas.dynamic_node.add_child(_drag_sprite) func on_pointer_move(_position: Vector2, _canvas: Canvas) -> void: - if not _dragging or not _drag_sprite: + if not dragging or not _drag_sprite: return _drag_sprite.position = _position - _start_mouse -func on_pointer_up(_position: Vector2, _canvas: Canvas) -> void: - if not _dragging: +func on_pointer_up(position: Vector2, canvas: Canvas) -> void: + if not dragging: return - _dragging = false + dragging = false if _drag_sprite: _drag_sprite.queue_free() _drag_sprite = null - if _layer_image and _canvas and _canvas._project: - var project: Project = _canvas._project + if _layer_image and canvas and canvas._project: + var project: Project = canvas._project var page: Page = project.frames[project.current_frame] - var layer: Image = page.layers[project.current_layer] - var offset: Vector2 = _position - _start_mouse - var moved := Image.create_empty(layer.get_width(), layer.get_height(), false, Image.FORMAT_RGBA8) + var layer = page.layers[project.current_layer] + var offset = position - _start_mouse + var moved = Image.create_empty(layer.get_width(), layer.get_height(), false, Image.FORMAT_RGBA8) moved.blend_rect(_layer_image, Rect2(Vector2.ZERO, _layer_image.get_size()), offset) page.set_layer(project.current_layer, moved) _layer_image = null From d43610430cd6da29764604378787a00f6bebef35 Mon Sep 17 00:00:00 2001 From: Brazza Date: Sun, 30 Aug 2026 17:49:25 -0400 Subject: [PATCH 5/7] Optimization A bit of optimization for brush and eraser. Iterating through each pixel can easily cause a performance issue. DrawableTexture2D in 4.7 can probably fix the problem by introducing more features. --- tools/brush/big_circle/big_circle.tres | 2 +- .../big_semi_square/big_semi_square.tres | 2 +- tools/brush/big_square/big_square.tres | 4 +-- tools/brush/brush.gd | 33 ++++++++--------- tools/eraser/big_circle/big_circle.tres | 2 +- .../big_semi_square/big_semi_square.tres | 2 +- tools/eraser/big_square/big_square.tres | 2 +- tools/eraser/eraser.gd | 36 ++++++++++--------- .../containers/edit_extras/brush_handler.gd | 31 ++++++++-------- .../containers/edit_extras/dragger_handler.gd | 2 +- .../containers/edit_extras/eraser_handler.gd | 24 ++++++------- .../edit_extras/paint_bucket_handler.gd | 2 +- 12 files changed, 71 insertions(+), 71 deletions(-) diff --git a/tools/brush/big_circle/big_circle.tres b/tools/brush/big_circle/big_circle.tres index a5439ba..23f5ebc 100644 --- a/tools/brush/big_circle/big_circle.tres +++ b/tools/brush/big_circle/big_circle.tres @@ -6,5 +6,5 @@ [resource] script = ExtResource("1_ipsu6") title = "Big Circle" -stamp = ExtResource("2_1qtbp") +original_stamp = ExtResource("2_1qtbp") metadata/_custom_type_script = "uid://bll2l6cggbn7b" diff --git a/tools/brush/big_semi_square/big_semi_square.tres b/tools/brush/big_semi_square/big_semi_square.tres index 534fff8..e69ec07 100644 --- a/tools/brush/big_semi_square/big_semi_square.tres +++ b/tools/brush/big_semi_square/big_semi_square.tres @@ -6,5 +6,5 @@ [resource] script = ExtResource("1_vlpet") title = "Big Semi-Square" -stamp = ExtResource("2_kemlt") +original_stamp = ExtResource("2_kemlt") metadata/_custom_type_script = "uid://bll2l6cggbn7b" diff --git a/tools/brush/big_square/big_square.tres b/tools/brush/big_square/big_square.tres index df7e6a6..02aaca6 100644 --- a/tools/brush/big_square/big_square.tres +++ b/tools/brush/big_square/big_square.tres @@ -1,10 +1,10 @@ [gd_resource type="Resource" script_class="Brush" format=3 uid="uid://e3thyxwo66gv"] [ext_resource type="Script" uid="uid://bll2l6cggbn7b" path="res://tools/brush/brush.gd" id="1_x2gwn"] -[ext_resource type="Texture2D" uid="uid://bwkygx605tohx" path="res://tools/brush/big_square/brush_template.png" id="2_43bw0"] +[ext_resource type="Texture2D" uid="uid://cn802kqvyqt0m" path="res://tools/brush/big_square/brush_template.png" id="2_43bw0"] [resource] script = ExtResource("1_x2gwn") title = "Big Square" -stamp = ExtResource("2_43bw0") +original_stamp = ExtResource("2_43bw0") metadata/_custom_type_script = "uid://bll2l6cggbn7b" diff --git a/tools/brush/brush.gd b/tools/brush/brush.gd index b378234..7f71f78 100644 --- a/tools/brush/brush.gd +++ b/tools/brush/brush.gd @@ -2,26 +2,24 @@ class_name Brush extends Tool @export var title: String = "Brush" -@export var stamp: Texture2D = PlaceholderTexture2D.new() -@export var width: float -@export var hardness: float -@export var color: Color -@export var scaling_filter: Image.Interpolation +@export var original_stamp: Texture2D = PlaceholderTexture2D.new() +var width: float +var hardness: float +var color: Color +var scaling_filter: Image.Interpolation +var stamp_tex: Texture2D var _stroke_node: Node2D -var _stamp_tex: Texture2D var _last_pos: Vector2 var _has_last = false -func _init() -> void: - name = "Brush" - +func _ready() -> void: + stamp_tex = generate_stamp() func on_pointer_down(_position: Vector2, _canvas: Canvas) -> void: _stroke_node = Node2D.new() _canvas.dynamic_node.add_child(_stroke_node) - _stamp_tex = generate_stamp() _has_last = true _last_pos = _position _place_stamp(_last_pos) @@ -37,10 +35,10 @@ func on_pointer_move(_position: Vector2, _canvas: Canvas) -> void: var t = 0.0 while t <= dist: - if (dir * t).length() > (width / _stamp_tex.get_width() * 10): + if (dir * t).length() > (width / stamp_tex.get_width() * 10): _place_stamp(_last_pos + dir * t) _last_pos = _position - t += (width / _stamp_tex.get_width() * 10) + t += (width / stamp_tex.get_width() * 10) func on_pointer_up(_position: Vector2, _canvas: Canvas) -> void: @@ -49,8 +47,11 @@ func on_pointer_up(_position: Vector2, _canvas: Canvas) -> void: func generate_stamp() -> Texture2D: - var size_px = stamp.get_height() * max(width * 2, 10) - var img = stamp.get_image() + if original_stamp == null or original_stamp.get_image() == null: + return + + var size_px = original_stamp.get_height() * max(width * 2, 10) + var img = original_stamp.get_image() var org_img = img img.resize(size_px, size_px, scaling_filter) var center = Vector2(size_px * 0.5, size_px * 0.5) @@ -80,11 +81,11 @@ func generate_stamp() -> Texture2D: func _place_stamp(_position: Vector2) -> void: var s = Sprite2D.new() - s.texture = _stamp_tex + s.texture = stamp_tex s.position = _position s.modulate = color - var tex_w = float(_stamp_tex.get_width()) + var tex_w = float(stamp_tex.get_width()) var scale_factor = width / tex_w s.scale = Vector2.ONE * scale_factor diff --git a/tools/eraser/big_circle/big_circle.tres b/tools/eraser/big_circle/big_circle.tres index 5a3499f..1da95f1 100644 --- a/tools/eraser/big_circle/big_circle.tres +++ b/tools/eraser/big_circle/big_circle.tres @@ -6,5 +6,5 @@ [resource] script = ExtResource("1_h7n6f") title = "Big Circle" -stamp = ExtResource("2_h7n6f") +original_stamp = ExtResource("2_h7n6f") metadata/_custom_type_script = "uid://bll2l6cggbn7b" diff --git a/tools/eraser/big_semi_square/big_semi_square.tres b/tools/eraser/big_semi_square/big_semi_square.tres index 60b0973..487152e 100644 --- a/tools/eraser/big_semi_square/big_semi_square.tres +++ b/tools/eraser/big_semi_square/big_semi_square.tres @@ -6,5 +6,5 @@ [resource] script = ExtResource("1_y22wk") title = "Big Semi-Square" -stamp = ExtResource("2_m5llq") +original_stamp = ExtResource("2_m5llq") metadata/_custom_type_script = "uid://bll2l6cggbn7b" diff --git a/tools/eraser/big_square/big_square.tres b/tools/eraser/big_square/big_square.tres index eb9efd7..1f88627 100644 --- a/tools/eraser/big_square/big_square.tres +++ b/tools/eraser/big_square/big_square.tres @@ -6,5 +6,5 @@ [resource] script = ExtResource("1_dt1qd") title = "Big Square" -stamp = ExtResource("2_dt1qd") +original_stamp = ExtResource("2_dt1qd") metadata/_custom_type_script = "uid://bll2l6cggbn7b" diff --git a/tools/eraser/eraser.gd b/tools/eraser/eraser.gd index ab0a09c..431d7e4 100644 --- a/tools/eraser/eraser.gd +++ b/tools/eraser/eraser.gd @@ -2,29 +2,28 @@ class_name Eraser extends Tool @export var title: String = "Eraser" -@export var stamp: Texture2D = PlaceholderTexture2D.new() -@export var width: float -@export var hardness: float -@export var scaling_filter: Image.Interpolation +@export var original_stamp: Texture2D = PlaceholderTexture2D.new() +var width: float +var hardness: float +var scaling_filter: Image.Interpolation +var filter: Texture2D -var _filter: Texture2D var _last_pos: Vector2 var _has_last = false -func _init() -> void: - name = "Eraser" +func _ready() -> void: + filter = generate_filter() func on_pointer_down(_position: Vector2, _canvas: Canvas) -> void: - _filter = generate_filter() _has_last = true _last_pos = _position _place_stamp(_last_pos, _canvas) func on_pointer_move(_position: Vector2, _canvas: Canvas) -> void: - if _filter == null or not _canvas._project or not _has_last: + if filter == null or not _canvas._project or not _has_last: return var delta = _last_pos - _position @@ -33,10 +32,10 @@ func on_pointer_move(_position: Vector2, _canvas: Canvas) -> void: var t = 0.0 while t <= dist: - if (dir * t).length() > (width / _filter.get_width() * 10): + if (dir * t).length() > (width / filter.get_width() * 10): _place_stamp(_last_pos + dir * t, _canvas) _last_pos = _position - t += (width / _filter.get_width() * 10) + t += (width / filter.get_width() * 10) func on_pointer_up(_position: Vector2, _canvas: Canvas) -> void: @@ -44,8 +43,11 @@ func on_pointer_up(_position: Vector2, _canvas: Canvas) -> void: func generate_filter() -> Texture2D: - var size_px = stamp.get_height() * max(width * 2, 10) - var img = stamp.get_image() + if original_stamp == null or original_stamp.get_image() == null: + return + + var size_px = original_stamp.get_height() * max(width * 2, 10) + var img = original_stamp.get_image() img.resize(size_px, size_px) var center = Vector2(size_px * 0.5, size_px * 0.5) var radius = size_px * 0.5 * sqrt(2) @@ -73,12 +75,12 @@ func generate_filter() -> Texture2D: func _place_stamp(_position: Vector2, _canvas: Canvas) -> void: - var tex_w = float(_filter.get_width()) + var tex_w = float(filter.get_width()) var scale_factor = width / tex_w - var img = _filter.get_image() + var img = filter.get_image() img.resize( - _filter.get_width() * scale_factor, - _filter.get_height() * scale_factor, + filter.get_width() * scale_factor, + filter.get_height() * scale_factor, Image.INTERPOLATE_LANCZOS ) diff --git a/views/editor/containers/edit_extras/brush_handler.gd b/views/editor/containers/edit_extras/brush_handler.gd index d2ecd29..4bfae16 100644 --- a/views/editor/containers/edit_extras/brush_handler.gd +++ b/views/editor/containers/edit_extras/brush_handler.gd @@ -8,7 +8,10 @@ extends PanelContainer @export var brush_list: ItemList @export var button_group: ButtonGroup @export var tool_manager: ToolManager -@export var tool: Tool +@export var tool: Brush +@export var default_brush_width = 2.5 +@export var default_brush_hardness = 1.0 +@export var default_brush_color = Color.BLACK var brushes = [ load("res://tools/brush/big_circle/big_circle.tres"), @@ -17,9 +20,6 @@ var brushes = [ ] var scale_filter = Image.INTERPOLATE_NEAREST -var brush_width = 2.5 -var brush_hardness = 1.0 -var brush_color = Color.BLACK var editor: Editor @@ -37,32 +37,31 @@ func _ready() -> void: brush_list.select(0) _on_brush_selected(0) - thick_sldr.value = brush_width - hard_sldr.value = brush_hardness - + thick_sldr.value = default_brush_width + hard_sldr.value = default_brush_hardness + color_picker.color = default_brush_color func _on_thickness_changed(value: float) -> void: - brush_width = value thick_label.text = "%dpx" % value - tool.width = brush_width + tool.width = value func _on_hardness_changed(value: float) -> void: - brush_hardness = value hard_label.text = "%d%%" % (value * 100) - tool.hardness = brush_hardness + tool.hardness = value + tool.stamp_tex = tool.generate_stamp() func _on_color_changed(color: Color) -> void: - brush_color = color - tool.color = brush_color + tool.color = color func _on_brush_selected(index: int) -> void: + brushes[index].hardness = tool.hardness + brushes[index].width = tool.width + brushes[index].color = tool.color tool = brushes[index] - tool.hardness = brush_hardness - tool.width = brush_width - tool.color = brush_color + tool.stamp_tex = tool.generate_stamp() editor.current_tool = tool diff --git a/views/editor/containers/edit_extras/dragger_handler.gd b/views/editor/containers/edit_extras/dragger_handler.gd index 6539099..f4a8e21 100644 --- a/views/editor/containers/edit_extras/dragger_handler.gd +++ b/views/editor/containers/edit_extras/dragger_handler.gd @@ -1,3 +1,3 @@ extends PanelContainer -@export var tool: Tool +@export var tool: Dragger diff --git a/views/editor/containers/edit_extras/eraser_handler.gd b/views/editor/containers/edit_extras/eraser_handler.gd index 11eb946..0b7efd0 100644 --- a/views/editor/containers/edit_extras/eraser_handler.gd +++ b/views/editor/containers/edit_extras/eraser_handler.gd @@ -7,7 +7,9 @@ extends PanelContainer @export var eraser_list: ItemList @export var button_group: ButtonGroup @export var tool_manager: ToolManager -@export var tool: Tool +@export var tool: Eraser +@export var default_eraser_width = 2.5 +@export var default_eraser_hardness = 1.0 var erasers = [ load("res://tools/eraser/big_circle/big_circle.tres"), @@ -16,8 +18,6 @@ var erasers = [ ] var scale_filter = Image.INTERPOLATE_NEAREST -var eraser_width = 2.5 -var eraser_hardness = 1.0 var editor: Editor @@ -27,8 +27,8 @@ func _ready() -> void: thick_sldr.value_changed.connect(_on_thickness_changed) hard_sldr.value_changed.connect(_on_hardness_changed) - thick_sldr.value = eraser_width - hard_sldr.value = eraser_hardness + thick_sldr.value = default_eraser_width + hard_sldr.value = default_eraser_hardness for button in button_group.get_buttons(): button.pressed.connect(_on_filter_selected) @@ -37,26 +37,24 @@ func _ready() -> void: eraser_list.select(0) _on_eraser_selected(0) - thick_sldr.value = eraser_width - hard_sldr.value = eraser_hardness func _on_thickness_changed(value: float) -> void: - eraser_width = value thick_label.text = "%dpx" % value - tool.width = eraser_width + tool.width = value func _on_hardness_changed(value: float) -> void: - eraser_hardness = value hard_label.text = "%d%%" % (value * 100) - tool.hardness = eraser_hardness + tool.hardness = value + tool.filter = tool.generate_filter() func _on_eraser_selected(index: int) -> void: + erasers[index].hardness = tool.hardness + erasers[index].width = tool.width tool = erasers[index] - tool.hardness = eraser_hardness - tool.width = eraser_width + tool.filter = tool.generate_filter() editor.current_tool = tool diff --git a/views/editor/containers/edit_extras/paint_bucket_handler.gd b/views/editor/containers/edit_extras/paint_bucket_handler.gd index 0f5f22d..3e73727 100644 --- a/views/editor/containers/edit_extras/paint_bucket_handler.gd +++ b/views/editor/containers/edit_extras/paint_bucket_handler.gd @@ -3,7 +3,7 @@ extends PanelContainer @export var tolerance_sldr: Slider @export var tolerance_label: Label @export var color_picker: ColorPickerButton -@export var tool: Tool +@export var tool: PaintBucket var tolerance: float var fill_color: Color From 7a2cd6e15a03e501249e1b69967ffb18ee22bd9d Mon Sep 17 00:00:00 2001 From: Brazza Date: Sun, 30 Aug 2026 17:50:55 -0400 Subject: [PATCH 6/7] Revert "Optimization" This reverts commit d43610430cd6da29764604378787a00f6bebef35. --- tools/brush/big_circle/big_circle.tres | 2 +- .../big_semi_square/big_semi_square.tres | 2 +- tools/brush/big_square/big_square.tres | 4 +-- tools/brush/brush.gd | 33 +++++++++-------- tools/eraser/big_circle/big_circle.tres | 2 +- .../big_semi_square/big_semi_square.tres | 2 +- tools/eraser/big_square/big_square.tres | 2 +- tools/eraser/eraser.gd | 36 +++++++++---------- .../containers/edit_extras/brush_handler.gd | 31 ++++++++-------- .../containers/edit_extras/dragger_handler.gd | 2 +- .../containers/edit_extras/eraser_handler.gd | 24 +++++++------ .../edit_extras/paint_bucket_handler.gd | 2 +- 12 files changed, 71 insertions(+), 71 deletions(-) diff --git a/tools/brush/big_circle/big_circle.tres b/tools/brush/big_circle/big_circle.tres index 23f5ebc..a5439ba 100644 --- a/tools/brush/big_circle/big_circle.tres +++ b/tools/brush/big_circle/big_circle.tres @@ -6,5 +6,5 @@ [resource] script = ExtResource("1_ipsu6") title = "Big Circle" -original_stamp = ExtResource("2_1qtbp") +stamp = ExtResource("2_1qtbp") metadata/_custom_type_script = "uid://bll2l6cggbn7b" diff --git a/tools/brush/big_semi_square/big_semi_square.tres b/tools/brush/big_semi_square/big_semi_square.tres index e69ec07..534fff8 100644 --- a/tools/brush/big_semi_square/big_semi_square.tres +++ b/tools/brush/big_semi_square/big_semi_square.tres @@ -6,5 +6,5 @@ [resource] script = ExtResource("1_vlpet") title = "Big Semi-Square" -original_stamp = ExtResource("2_kemlt") +stamp = ExtResource("2_kemlt") metadata/_custom_type_script = "uid://bll2l6cggbn7b" diff --git a/tools/brush/big_square/big_square.tres b/tools/brush/big_square/big_square.tres index 02aaca6..df7e6a6 100644 --- a/tools/brush/big_square/big_square.tres +++ b/tools/brush/big_square/big_square.tres @@ -1,10 +1,10 @@ [gd_resource type="Resource" script_class="Brush" format=3 uid="uid://e3thyxwo66gv"] [ext_resource type="Script" uid="uid://bll2l6cggbn7b" path="res://tools/brush/brush.gd" id="1_x2gwn"] -[ext_resource type="Texture2D" uid="uid://cn802kqvyqt0m" path="res://tools/brush/big_square/brush_template.png" id="2_43bw0"] +[ext_resource type="Texture2D" uid="uid://bwkygx605tohx" path="res://tools/brush/big_square/brush_template.png" id="2_43bw0"] [resource] script = ExtResource("1_x2gwn") title = "Big Square" -original_stamp = ExtResource("2_43bw0") +stamp = ExtResource("2_43bw0") metadata/_custom_type_script = "uid://bll2l6cggbn7b" diff --git a/tools/brush/brush.gd b/tools/brush/brush.gd index 7f71f78..b378234 100644 --- a/tools/brush/brush.gd +++ b/tools/brush/brush.gd @@ -2,24 +2,26 @@ class_name Brush extends Tool @export var title: String = "Brush" -@export var original_stamp: Texture2D = PlaceholderTexture2D.new() +@export var stamp: Texture2D = PlaceholderTexture2D.new() +@export var width: float +@export var hardness: float +@export var color: Color +@export var scaling_filter: Image.Interpolation -var width: float -var hardness: float -var color: Color -var scaling_filter: Image.Interpolation -var stamp_tex: Texture2D var _stroke_node: Node2D +var _stamp_tex: Texture2D var _last_pos: Vector2 var _has_last = false -func _ready() -> void: - stamp_tex = generate_stamp() +func _init() -> void: + name = "Brush" + func on_pointer_down(_position: Vector2, _canvas: Canvas) -> void: _stroke_node = Node2D.new() _canvas.dynamic_node.add_child(_stroke_node) + _stamp_tex = generate_stamp() _has_last = true _last_pos = _position _place_stamp(_last_pos) @@ -35,10 +37,10 @@ func on_pointer_move(_position: Vector2, _canvas: Canvas) -> void: var t = 0.0 while t <= dist: - if (dir * t).length() > (width / stamp_tex.get_width() * 10): + if (dir * t).length() > (width / _stamp_tex.get_width() * 10): _place_stamp(_last_pos + dir * t) _last_pos = _position - t += (width / stamp_tex.get_width() * 10) + t += (width / _stamp_tex.get_width() * 10) func on_pointer_up(_position: Vector2, _canvas: Canvas) -> void: @@ -47,11 +49,8 @@ func on_pointer_up(_position: Vector2, _canvas: Canvas) -> void: func generate_stamp() -> Texture2D: - if original_stamp == null or original_stamp.get_image() == null: - return - - var size_px = original_stamp.get_height() * max(width * 2, 10) - var img = original_stamp.get_image() + var size_px = stamp.get_height() * max(width * 2, 10) + var img = stamp.get_image() var org_img = img img.resize(size_px, size_px, scaling_filter) var center = Vector2(size_px * 0.5, size_px * 0.5) @@ -81,11 +80,11 @@ func generate_stamp() -> Texture2D: func _place_stamp(_position: Vector2) -> void: var s = Sprite2D.new() - s.texture = stamp_tex + s.texture = _stamp_tex s.position = _position s.modulate = color - var tex_w = float(stamp_tex.get_width()) + var tex_w = float(_stamp_tex.get_width()) var scale_factor = width / tex_w s.scale = Vector2.ONE * scale_factor diff --git a/tools/eraser/big_circle/big_circle.tres b/tools/eraser/big_circle/big_circle.tres index 1da95f1..5a3499f 100644 --- a/tools/eraser/big_circle/big_circle.tres +++ b/tools/eraser/big_circle/big_circle.tres @@ -6,5 +6,5 @@ [resource] script = ExtResource("1_h7n6f") title = "Big Circle" -original_stamp = ExtResource("2_h7n6f") +stamp = ExtResource("2_h7n6f") metadata/_custom_type_script = "uid://bll2l6cggbn7b" diff --git a/tools/eraser/big_semi_square/big_semi_square.tres b/tools/eraser/big_semi_square/big_semi_square.tres index 487152e..60b0973 100644 --- a/tools/eraser/big_semi_square/big_semi_square.tres +++ b/tools/eraser/big_semi_square/big_semi_square.tres @@ -6,5 +6,5 @@ [resource] script = ExtResource("1_y22wk") title = "Big Semi-Square" -original_stamp = ExtResource("2_m5llq") +stamp = ExtResource("2_m5llq") metadata/_custom_type_script = "uid://bll2l6cggbn7b" diff --git a/tools/eraser/big_square/big_square.tres b/tools/eraser/big_square/big_square.tres index 1f88627..eb9efd7 100644 --- a/tools/eraser/big_square/big_square.tres +++ b/tools/eraser/big_square/big_square.tres @@ -6,5 +6,5 @@ [resource] script = ExtResource("1_dt1qd") title = "Big Square" -original_stamp = ExtResource("2_dt1qd") +stamp = ExtResource("2_dt1qd") metadata/_custom_type_script = "uid://bll2l6cggbn7b" diff --git a/tools/eraser/eraser.gd b/tools/eraser/eraser.gd index 431d7e4..ab0a09c 100644 --- a/tools/eraser/eraser.gd +++ b/tools/eraser/eraser.gd @@ -2,28 +2,29 @@ class_name Eraser extends Tool @export var title: String = "Eraser" -@export var original_stamp: Texture2D = PlaceholderTexture2D.new() -var width: float -var hardness: float -var scaling_filter: Image.Interpolation -var filter: Texture2D +@export var stamp: Texture2D = PlaceholderTexture2D.new() +@export var width: float +@export var hardness: float +@export var scaling_filter: Image.Interpolation +var _filter: Texture2D var _last_pos: Vector2 var _has_last = false -func _ready() -> void: - filter = generate_filter() +func _init() -> void: + name = "Eraser" func on_pointer_down(_position: Vector2, _canvas: Canvas) -> void: + _filter = generate_filter() _has_last = true _last_pos = _position _place_stamp(_last_pos, _canvas) func on_pointer_move(_position: Vector2, _canvas: Canvas) -> void: - if filter == null or not _canvas._project or not _has_last: + if _filter == null or not _canvas._project or not _has_last: return var delta = _last_pos - _position @@ -32,10 +33,10 @@ func on_pointer_move(_position: Vector2, _canvas: Canvas) -> void: var t = 0.0 while t <= dist: - if (dir * t).length() > (width / filter.get_width() * 10): + if (dir * t).length() > (width / _filter.get_width() * 10): _place_stamp(_last_pos + dir * t, _canvas) _last_pos = _position - t += (width / filter.get_width() * 10) + t += (width / _filter.get_width() * 10) func on_pointer_up(_position: Vector2, _canvas: Canvas) -> void: @@ -43,11 +44,8 @@ func on_pointer_up(_position: Vector2, _canvas: Canvas) -> void: func generate_filter() -> Texture2D: - if original_stamp == null or original_stamp.get_image() == null: - return - - var size_px = original_stamp.get_height() * max(width * 2, 10) - var img = original_stamp.get_image() + var size_px = stamp.get_height() * max(width * 2, 10) + var img = stamp.get_image() img.resize(size_px, size_px) var center = Vector2(size_px * 0.5, size_px * 0.5) var radius = size_px * 0.5 * sqrt(2) @@ -75,12 +73,12 @@ func generate_filter() -> Texture2D: func _place_stamp(_position: Vector2, _canvas: Canvas) -> void: - var tex_w = float(filter.get_width()) + var tex_w = float(_filter.get_width()) var scale_factor = width / tex_w - var img = filter.get_image() + var img = _filter.get_image() img.resize( - filter.get_width() * scale_factor, - filter.get_height() * scale_factor, + _filter.get_width() * scale_factor, + _filter.get_height() * scale_factor, Image.INTERPOLATE_LANCZOS ) diff --git a/views/editor/containers/edit_extras/brush_handler.gd b/views/editor/containers/edit_extras/brush_handler.gd index 4bfae16..d2ecd29 100644 --- a/views/editor/containers/edit_extras/brush_handler.gd +++ b/views/editor/containers/edit_extras/brush_handler.gd @@ -8,10 +8,7 @@ extends PanelContainer @export var brush_list: ItemList @export var button_group: ButtonGroup @export var tool_manager: ToolManager -@export var tool: Brush -@export var default_brush_width = 2.5 -@export var default_brush_hardness = 1.0 -@export var default_brush_color = Color.BLACK +@export var tool: Tool var brushes = [ load("res://tools/brush/big_circle/big_circle.tres"), @@ -20,6 +17,9 @@ var brushes = [ ] var scale_filter = Image.INTERPOLATE_NEAREST +var brush_width = 2.5 +var brush_hardness = 1.0 +var brush_color = Color.BLACK var editor: Editor @@ -37,31 +37,32 @@ func _ready() -> void: brush_list.select(0) _on_brush_selected(0) - thick_sldr.value = default_brush_width - hard_sldr.value = default_brush_hardness - color_picker.color = default_brush_color + thick_sldr.value = brush_width + hard_sldr.value = brush_hardness + func _on_thickness_changed(value: float) -> void: + brush_width = value thick_label.text = "%dpx" % value - tool.width = value + tool.width = brush_width func _on_hardness_changed(value: float) -> void: + brush_hardness = value hard_label.text = "%d%%" % (value * 100) - tool.hardness = value - tool.stamp_tex = tool.generate_stamp() + tool.hardness = brush_hardness func _on_color_changed(color: Color) -> void: - tool.color = color + brush_color = color + tool.color = brush_color func _on_brush_selected(index: int) -> void: - brushes[index].hardness = tool.hardness - brushes[index].width = tool.width - brushes[index].color = tool.color tool = brushes[index] - tool.stamp_tex = tool.generate_stamp() + tool.hardness = brush_hardness + tool.width = brush_width + tool.color = brush_color editor.current_tool = tool diff --git a/views/editor/containers/edit_extras/dragger_handler.gd b/views/editor/containers/edit_extras/dragger_handler.gd index f4a8e21..6539099 100644 --- a/views/editor/containers/edit_extras/dragger_handler.gd +++ b/views/editor/containers/edit_extras/dragger_handler.gd @@ -1,3 +1,3 @@ extends PanelContainer -@export var tool: Dragger +@export var tool: Tool diff --git a/views/editor/containers/edit_extras/eraser_handler.gd b/views/editor/containers/edit_extras/eraser_handler.gd index 0b7efd0..11eb946 100644 --- a/views/editor/containers/edit_extras/eraser_handler.gd +++ b/views/editor/containers/edit_extras/eraser_handler.gd @@ -7,9 +7,7 @@ extends PanelContainer @export var eraser_list: ItemList @export var button_group: ButtonGroup @export var tool_manager: ToolManager -@export var tool: Eraser -@export var default_eraser_width = 2.5 -@export var default_eraser_hardness = 1.0 +@export var tool: Tool var erasers = [ load("res://tools/eraser/big_circle/big_circle.tres"), @@ -18,6 +16,8 @@ var erasers = [ ] var scale_filter = Image.INTERPOLATE_NEAREST +var eraser_width = 2.5 +var eraser_hardness = 1.0 var editor: Editor @@ -27,8 +27,8 @@ func _ready() -> void: thick_sldr.value_changed.connect(_on_thickness_changed) hard_sldr.value_changed.connect(_on_hardness_changed) - thick_sldr.value = default_eraser_width - hard_sldr.value = default_eraser_hardness + thick_sldr.value = eraser_width + hard_sldr.value = eraser_hardness for button in button_group.get_buttons(): button.pressed.connect(_on_filter_selected) @@ -37,24 +37,26 @@ func _ready() -> void: eraser_list.select(0) _on_eraser_selected(0) + thick_sldr.value = eraser_width + hard_sldr.value = eraser_hardness func _on_thickness_changed(value: float) -> void: + eraser_width = value thick_label.text = "%dpx" % value - tool.width = value + tool.width = eraser_width func _on_hardness_changed(value: float) -> void: + eraser_hardness = value hard_label.text = "%d%%" % (value * 100) - tool.hardness = value - tool.filter = tool.generate_filter() + tool.hardness = eraser_hardness func _on_eraser_selected(index: int) -> void: - erasers[index].hardness = tool.hardness - erasers[index].width = tool.width tool = erasers[index] - tool.filter = tool.generate_filter() + tool.hardness = eraser_hardness + tool.width = eraser_width editor.current_tool = tool diff --git a/views/editor/containers/edit_extras/paint_bucket_handler.gd b/views/editor/containers/edit_extras/paint_bucket_handler.gd index 3e73727..0f5f22d 100644 --- a/views/editor/containers/edit_extras/paint_bucket_handler.gd +++ b/views/editor/containers/edit_extras/paint_bucket_handler.gd @@ -3,7 +3,7 @@ extends PanelContainer @export var tolerance_sldr: Slider @export var tolerance_label: Label @export var color_picker: ColorPickerButton -@export var tool: PaintBucket +@export var tool: Tool var tolerance: float var fill_color: Color From e50e59004de29823a71851bd43f24832733d178b Mon Sep 17 00:00:00 2001 From: Brazza Date: Sun, 30 Aug 2026 17:52:22 -0400 Subject: [PATCH 7/7] Reapply "Optimization" This reverts commit 7a2cd6e15a03e501249e1b69967ffb18ee22bd9d. --- tools/brush/big_circle/big_circle.tres | 2 +- .../big_semi_square/big_semi_square.tres | 2 +- tools/brush/big_square/big_square.tres | 4 +-- tools/brush/brush.gd | 33 ++++++++--------- tools/eraser/big_circle/big_circle.tres | 2 +- .../big_semi_square/big_semi_square.tres | 2 +- tools/eraser/big_square/big_square.tres | 2 +- tools/eraser/eraser.gd | 36 ++++++++++--------- .../containers/edit_extras/brush_handler.gd | 31 ++++++++-------- .../containers/edit_extras/dragger_handler.gd | 2 +- .../containers/edit_extras/eraser_handler.gd | 24 ++++++------- .../edit_extras/paint_bucket_handler.gd | 2 +- 12 files changed, 71 insertions(+), 71 deletions(-) diff --git a/tools/brush/big_circle/big_circle.tres b/tools/brush/big_circle/big_circle.tres index a5439ba..23f5ebc 100644 --- a/tools/brush/big_circle/big_circle.tres +++ b/tools/brush/big_circle/big_circle.tres @@ -6,5 +6,5 @@ [resource] script = ExtResource("1_ipsu6") title = "Big Circle" -stamp = ExtResource("2_1qtbp") +original_stamp = ExtResource("2_1qtbp") metadata/_custom_type_script = "uid://bll2l6cggbn7b" diff --git a/tools/brush/big_semi_square/big_semi_square.tres b/tools/brush/big_semi_square/big_semi_square.tres index 534fff8..e69ec07 100644 --- a/tools/brush/big_semi_square/big_semi_square.tres +++ b/tools/brush/big_semi_square/big_semi_square.tres @@ -6,5 +6,5 @@ [resource] script = ExtResource("1_vlpet") title = "Big Semi-Square" -stamp = ExtResource("2_kemlt") +original_stamp = ExtResource("2_kemlt") metadata/_custom_type_script = "uid://bll2l6cggbn7b" diff --git a/tools/brush/big_square/big_square.tres b/tools/brush/big_square/big_square.tres index df7e6a6..02aaca6 100644 --- a/tools/brush/big_square/big_square.tres +++ b/tools/brush/big_square/big_square.tres @@ -1,10 +1,10 @@ [gd_resource type="Resource" script_class="Brush" format=3 uid="uid://e3thyxwo66gv"] [ext_resource type="Script" uid="uid://bll2l6cggbn7b" path="res://tools/brush/brush.gd" id="1_x2gwn"] -[ext_resource type="Texture2D" uid="uid://bwkygx605tohx" path="res://tools/brush/big_square/brush_template.png" id="2_43bw0"] +[ext_resource type="Texture2D" uid="uid://cn802kqvyqt0m" path="res://tools/brush/big_square/brush_template.png" id="2_43bw0"] [resource] script = ExtResource("1_x2gwn") title = "Big Square" -stamp = ExtResource("2_43bw0") +original_stamp = ExtResource("2_43bw0") metadata/_custom_type_script = "uid://bll2l6cggbn7b" diff --git a/tools/brush/brush.gd b/tools/brush/brush.gd index b378234..7f71f78 100644 --- a/tools/brush/brush.gd +++ b/tools/brush/brush.gd @@ -2,26 +2,24 @@ class_name Brush extends Tool @export var title: String = "Brush" -@export var stamp: Texture2D = PlaceholderTexture2D.new() -@export var width: float -@export var hardness: float -@export var color: Color -@export var scaling_filter: Image.Interpolation +@export var original_stamp: Texture2D = PlaceholderTexture2D.new() +var width: float +var hardness: float +var color: Color +var scaling_filter: Image.Interpolation +var stamp_tex: Texture2D var _stroke_node: Node2D -var _stamp_tex: Texture2D var _last_pos: Vector2 var _has_last = false -func _init() -> void: - name = "Brush" - +func _ready() -> void: + stamp_tex = generate_stamp() func on_pointer_down(_position: Vector2, _canvas: Canvas) -> void: _stroke_node = Node2D.new() _canvas.dynamic_node.add_child(_stroke_node) - _stamp_tex = generate_stamp() _has_last = true _last_pos = _position _place_stamp(_last_pos) @@ -37,10 +35,10 @@ func on_pointer_move(_position: Vector2, _canvas: Canvas) -> void: var t = 0.0 while t <= dist: - if (dir * t).length() > (width / _stamp_tex.get_width() * 10): + if (dir * t).length() > (width / stamp_tex.get_width() * 10): _place_stamp(_last_pos + dir * t) _last_pos = _position - t += (width / _stamp_tex.get_width() * 10) + t += (width / stamp_tex.get_width() * 10) func on_pointer_up(_position: Vector2, _canvas: Canvas) -> void: @@ -49,8 +47,11 @@ func on_pointer_up(_position: Vector2, _canvas: Canvas) -> void: func generate_stamp() -> Texture2D: - var size_px = stamp.get_height() * max(width * 2, 10) - var img = stamp.get_image() + if original_stamp == null or original_stamp.get_image() == null: + return + + var size_px = original_stamp.get_height() * max(width * 2, 10) + var img = original_stamp.get_image() var org_img = img img.resize(size_px, size_px, scaling_filter) var center = Vector2(size_px * 0.5, size_px * 0.5) @@ -80,11 +81,11 @@ func generate_stamp() -> Texture2D: func _place_stamp(_position: Vector2) -> void: var s = Sprite2D.new() - s.texture = _stamp_tex + s.texture = stamp_tex s.position = _position s.modulate = color - var tex_w = float(_stamp_tex.get_width()) + var tex_w = float(stamp_tex.get_width()) var scale_factor = width / tex_w s.scale = Vector2.ONE * scale_factor diff --git a/tools/eraser/big_circle/big_circle.tres b/tools/eraser/big_circle/big_circle.tres index 5a3499f..1da95f1 100644 --- a/tools/eraser/big_circle/big_circle.tres +++ b/tools/eraser/big_circle/big_circle.tres @@ -6,5 +6,5 @@ [resource] script = ExtResource("1_h7n6f") title = "Big Circle" -stamp = ExtResource("2_h7n6f") +original_stamp = ExtResource("2_h7n6f") metadata/_custom_type_script = "uid://bll2l6cggbn7b" diff --git a/tools/eraser/big_semi_square/big_semi_square.tres b/tools/eraser/big_semi_square/big_semi_square.tres index 60b0973..487152e 100644 --- a/tools/eraser/big_semi_square/big_semi_square.tres +++ b/tools/eraser/big_semi_square/big_semi_square.tres @@ -6,5 +6,5 @@ [resource] script = ExtResource("1_y22wk") title = "Big Semi-Square" -stamp = ExtResource("2_m5llq") +original_stamp = ExtResource("2_m5llq") metadata/_custom_type_script = "uid://bll2l6cggbn7b" diff --git a/tools/eraser/big_square/big_square.tres b/tools/eraser/big_square/big_square.tres index eb9efd7..1f88627 100644 --- a/tools/eraser/big_square/big_square.tres +++ b/tools/eraser/big_square/big_square.tres @@ -6,5 +6,5 @@ [resource] script = ExtResource("1_dt1qd") title = "Big Square" -stamp = ExtResource("2_dt1qd") +original_stamp = ExtResource("2_dt1qd") metadata/_custom_type_script = "uid://bll2l6cggbn7b" diff --git a/tools/eraser/eraser.gd b/tools/eraser/eraser.gd index ab0a09c..431d7e4 100644 --- a/tools/eraser/eraser.gd +++ b/tools/eraser/eraser.gd @@ -2,29 +2,28 @@ class_name Eraser extends Tool @export var title: String = "Eraser" -@export var stamp: Texture2D = PlaceholderTexture2D.new() -@export var width: float -@export var hardness: float -@export var scaling_filter: Image.Interpolation +@export var original_stamp: Texture2D = PlaceholderTexture2D.new() +var width: float +var hardness: float +var scaling_filter: Image.Interpolation +var filter: Texture2D -var _filter: Texture2D var _last_pos: Vector2 var _has_last = false -func _init() -> void: - name = "Eraser" +func _ready() -> void: + filter = generate_filter() func on_pointer_down(_position: Vector2, _canvas: Canvas) -> void: - _filter = generate_filter() _has_last = true _last_pos = _position _place_stamp(_last_pos, _canvas) func on_pointer_move(_position: Vector2, _canvas: Canvas) -> void: - if _filter == null or not _canvas._project or not _has_last: + if filter == null or not _canvas._project or not _has_last: return var delta = _last_pos - _position @@ -33,10 +32,10 @@ func on_pointer_move(_position: Vector2, _canvas: Canvas) -> void: var t = 0.0 while t <= dist: - if (dir * t).length() > (width / _filter.get_width() * 10): + if (dir * t).length() > (width / filter.get_width() * 10): _place_stamp(_last_pos + dir * t, _canvas) _last_pos = _position - t += (width / _filter.get_width() * 10) + t += (width / filter.get_width() * 10) func on_pointer_up(_position: Vector2, _canvas: Canvas) -> void: @@ -44,8 +43,11 @@ func on_pointer_up(_position: Vector2, _canvas: Canvas) -> void: func generate_filter() -> Texture2D: - var size_px = stamp.get_height() * max(width * 2, 10) - var img = stamp.get_image() + if original_stamp == null or original_stamp.get_image() == null: + return + + var size_px = original_stamp.get_height() * max(width * 2, 10) + var img = original_stamp.get_image() img.resize(size_px, size_px) var center = Vector2(size_px * 0.5, size_px * 0.5) var radius = size_px * 0.5 * sqrt(2) @@ -73,12 +75,12 @@ func generate_filter() -> Texture2D: func _place_stamp(_position: Vector2, _canvas: Canvas) -> void: - var tex_w = float(_filter.get_width()) + var tex_w = float(filter.get_width()) var scale_factor = width / tex_w - var img = _filter.get_image() + var img = filter.get_image() img.resize( - _filter.get_width() * scale_factor, - _filter.get_height() * scale_factor, + filter.get_width() * scale_factor, + filter.get_height() * scale_factor, Image.INTERPOLATE_LANCZOS ) diff --git a/views/editor/containers/edit_extras/brush_handler.gd b/views/editor/containers/edit_extras/brush_handler.gd index d2ecd29..4bfae16 100644 --- a/views/editor/containers/edit_extras/brush_handler.gd +++ b/views/editor/containers/edit_extras/brush_handler.gd @@ -8,7 +8,10 @@ extends PanelContainer @export var brush_list: ItemList @export var button_group: ButtonGroup @export var tool_manager: ToolManager -@export var tool: Tool +@export var tool: Brush +@export var default_brush_width = 2.5 +@export var default_brush_hardness = 1.0 +@export var default_brush_color = Color.BLACK var brushes = [ load("res://tools/brush/big_circle/big_circle.tres"), @@ -17,9 +20,6 @@ var brushes = [ ] var scale_filter = Image.INTERPOLATE_NEAREST -var brush_width = 2.5 -var brush_hardness = 1.0 -var brush_color = Color.BLACK var editor: Editor @@ -37,32 +37,31 @@ func _ready() -> void: brush_list.select(0) _on_brush_selected(0) - thick_sldr.value = brush_width - hard_sldr.value = brush_hardness - + thick_sldr.value = default_brush_width + hard_sldr.value = default_brush_hardness + color_picker.color = default_brush_color func _on_thickness_changed(value: float) -> void: - brush_width = value thick_label.text = "%dpx" % value - tool.width = brush_width + tool.width = value func _on_hardness_changed(value: float) -> void: - brush_hardness = value hard_label.text = "%d%%" % (value * 100) - tool.hardness = brush_hardness + tool.hardness = value + tool.stamp_tex = tool.generate_stamp() func _on_color_changed(color: Color) -> void: - brush_color = color - tool.color = brush_color + tool.color = color func _on_brush_selected(index: int) -> void: + brushes[index].hardness = tool.hardness + brushes[index].width = tool.width + brushes[index].color = tool.color tool = brushes[index] - tool.hardness = brush_hardness - tool.width = brush_width - tool.color = brush_color + tool.stamp_tex = tool.generate_stamp() editor.current_tool = tool diff --git a/views/editor/containers/edit_extras/dragger_handler.gd b/views/editor/containers/edit_extras/dragger_handler.gd index 6539099..f4a8e21 100644 --- a/views/editor/containers/edit_extras/dragger_handler.gd +++ b/views/editor/containers/edit_extras/dragger_handler.gd @@ -1,3 +1,3 @@ extends PanelContainer -@export var tool: Tool +@export var tool: Dragger diff --git a/views/editor/containers/edit_extras/eraser_handler.gd b/views/editor/containers/edit_extras/eraser_handler.gd index 11eb946..0b7efd0 100644 --- a/views/editor/containers/edit_extras/eraser_handler.gd +++ b/views/editor/containers/edit_extras/eraser_handler.gd @@ -7,7 +7,9 @@ extends PanelContainer @export var eraser_list: ItemList @export var button_group: ButtonGroup @export var tool_manager: ToolManager -@export var tool: Tool +@export var tool: Eraser +@export var default_eraser_width = 2.5 +@export var default_eraser_hardness = 1.0 var erasers = [ load("res://tools/eraser/big_circle/big_circle.tres"), @@ -16,8 +18,6 @@ var erasers = [ ] var scale_filter = Image.INTERPOLATE_NEAREST -var eraser_width = 2.5 -var eraser_hardness = 1.0 var editor: Editor @@ -27,8 +27,8 @@ func _ready() -> void: thick_sldr.value_changed.connect(_on_thickness_changed) hard_sldr.value_changed.connect(_on_hardness_changed) - thick_sldr.value = eraser_width - hard_sldr.value = eraser_hardness + thick_sldr.value = default_eraser_width + hard_sldr.value = default_eraser_hardness for button in button_group.get_buttons(): button.pressed.connect(_on_filter_selected) @@ -37,26 +37,24 @@ func _ready() -> void: eraser_list.select(0) _on_eraser_selected(0) - thick_sldr.value = eraser_width - hard_sldr.value = eraser_hardness func _on_thickness_changed(value: float) -> void: - eraser_width = value thick_label.text = "%dpx" % value - tool.width = eraser_width + tool.width = value func _on_hardness_changed(value: float) -> void: - eraser_hardness = value hard_label.text = "%d%%" % (value * 100) - tool.hardness = eraser_hardness + tool.hardness = value + tool.filter = tool.generate_filter() func _on_eraser_selected(index: int) -> void: + erasers[index].hardness = tool.hardness + erasers[index].width = tool.width tool = erasers[index] - tool.hardness = eraser_hardness - tool.width = eraser_width + tool.filter = tool.generate_filter() editor.current_tool = tool diff --git a/views/editor/containers/edit_extras/paint_bucket_handler.gd b/views/editor/containers/edit_extras/paint_bucket_handler.gd index 0f5f22d..3e73727 100644 --- a/views/editor/containers/edit_extras/paint_bucket_handler.gd +++ b/views/editor/containers/edit_extras/paint_bucket_handler.gd @@ -3,7 +3,7 @@ extends PanelContainer @export var tolerance_sldr: Slider @export var tolerance_label: Label @export var color_picker: ColorPickerButton -@export var tool: Tool +@export var tool: PaintBucket var tolerance: float var fill_color: Color