1
0
Fork 0
mirror of https://github.com/Orama-Interactive/Pixelorama.git synced 2025-01-18 09:09:47 +00:00

Add tolerance to the magic wand, rename "similarity" to "tolerance" in the select by color tool and make it work the inverse way

Continuation of b0a284583b for the selection tools.
This commit is contained in:
Emmanouil Papadeas 2024-08-10 18:43:04 +03:00
parent 54d9e021c1
commit 1678738d75
5 changed files with 80 additions and 20 deletions

View file

@ -3,18 +3,26 @@ render_mode unshaded;
uniform sampler2D selection : filter_nearest, hint_default_black;
uniform vec4 color;
uniform float similarity_percent : hint_range(0.0, 100.0);
uniform float tolerance : hint_range(0.0, 1.0);
uniform int operation = 0; // 0 = add, 1 = subtract, 2 = intersect
bool similar_colors(vec4 c1, vec4 c2, float tol) {
return (
abs(c1.r - c2.r) <= tol
&& abs(c1.g - c2.g) <= tol
&& abs(c1.b - c2.b) <= tol
&& abs(c1.a - c2.a) <= tol
);
}
void fragment() {
vec4 original_color = texture(TEXTURE, UV);
float diff = distance(original_color, color);
float similarity = abs(2.0 - ((similarity_percent/100.0) * 2.0));
vec4 col = texture(selection, UV);
if (col.rgb == vec3(0.0))
col.a = 0.0;
if (diff <= similarity)
if (similar_colors(original_color, color, tolerance))
{
if (operation == 0)
col = vec4(1.0);

View file

@ -1,25 +1,25 @@
extends BaseSelectionTool
var shader := preload("res://src/Shaders/ColorSelect.gdshader")
var _similarity := 100
var _tolerance := 0.003
func get_config() -> Dictionary:
var config := super.get_config()
config["similarity"] = _similarity
config["tolerance"] = _tolerance
return config
func set_config(config: Dictionary) -> void:
_similarity = config.get("similarity", _similarity)
_tolerance = config.get("tolerance", _tolerance)
func update_config() -> void:
$SimilaritySlider.value = _similarity
$ToleranceSlider.value = _tolerance * 255.0
func _on_Similarity_value_changed(value: float) -> void:
_similarity = value
func _on_tolerance_slider_value_changed(value: float) -> void:
_tolerance = value / 255.0
update_config()
save_config()
@ -41,7 +41,7 @@ func apply_selection(pos: Vector2i) -> void:
elif _intersect:
operation = 2
var params := {"color": color, "similarity_percent": _similarity, "operation": operation}
var params := {"color": color, "tolerance": _tolerance, "operation": operation}
if _add or _subtract or _intersect:
var selection_tex := ImageTexture.create_from_image(project.selection_map)
params["selection"] = selection_tex

View file

@ -2,16 +2,24 @@
[ext_resource type="PackedScene" uid="uid://bd62qfjn380wf" path="res://src/Tools/BaseSelectionTool.tscn" id="1"]
[ext_resource type="Script" path="res://src/Tools/SelectionTools/ColorSelect.gd" id="2"]
[ext_resource type="PackedScene" uid="uid://yjhp0ssng2mp" path="res://src/UI/Nodes/ValueSlider.tscn" id="3"]
[ext_resource type="Script" path="res://src/UI/Nodes/ValueSlider.gd" id="3_44rxy"]
[node name="ToolOptions" instance=ExtResource("1")]
script = ExtResource("2")
[node name="SimilaritySlider" parent="." index="9" instance=ExtResource("3")]
[node name="ToleranceSlider" type="TextureProgressBar" parent="." index="8"]
custom_minimum_size = Vector2(32, 24)
layout_mode = 2
focus_mode = 2
mouse_default_cursor_shape = 2
theme_type_variation = &"ValueSlider"
value = 100.0
prefix = "Similarity:"
max_value = 255.0
nine_patch_stretch = true
stretch_margin_left = 3
stretch_margin_top = 3
stretch_margin_right = 3
stretch_margin_bottom = 3
script = ExtResource("3_44rxy")
prefix = "Tolerance:"
[connection signal="value_changed" from="SimilaritySlider" to="." method="_on_Similarity_value_changed"]
[connection signal="value_changed" from="ToleranceSlider" to="." method="_on_tolerance_slider_value_changed"]

View file

@ -4,6 +4,7 @@ extends BaseSelectionTool
var _allegro_flood_segments: Array[Segment]
## Results array per image while flooding
var _allegro_image_segments: Array[Segment]
var _tolerance := 0.003
class Segment:
@ -42,6 +43,22 @@ func apply_selection(pos: Vector2i) -> void:
Global.canvas.selection.commit_undo("Select", undo_data)
func get_config() -> Dictionary:
var config := super.get_config()
config["tolerance"] = _tolerance
return config
func set_config(config: Dictionary) -> void:
super.set_config(config)
_tolerance = config.get("tolerance", _tolerance)
func update_config() -> void:
super.update_config()
$ToleranceSlider.value = _tolerance * 255.0
# Add a new segment to the array
func _add_new_segment(y := 0) -> void:
_allegro_flood_segments.append(Segment.new(y))
@ -55,13 +72,16 @@ func _flood_line_around_point(
) -> int:
# this method is called by `_flood_fill` after the required data structures
# have been initialized
if not image.get_pixelv(pos).is_equal_approx(src_color):
if not DrawingAlgos.similar_colors(image.get_pixelv(pos), src_color, _tolerance):
return pos.x + 1
var west := pos
var east := pos
while west.x >= 0 && image.get_pixelv(west).is_equal_approx(src_color):
while west.x >= 0 && DrawingAlgos.similar_colors(image.get_pixelv(west), src_color, _tolerance):
west += Vector2i.LEFT
while east.x < project.size.x && image.get_pixelv(east).is_equal_approx(src_color):
while (
east.x < project.size.x
&& DrawingAlgos.similar_colors(image.get_pixelv(east), src_color, _tolerance)
):
east += Vector2i.RIGHT
# Make a note of the stuff we processed
var c := pos.y
@ -179,3 +199,9 @@ func _set_bit(p: Vector2i, selection_map: SelectionMap, prev_selection_map: Sele
selection_map.select_pixel(p, prev_selection_map.is_pixel_selected(p))
else:
selection_map.select_pixel(p, !_subtract)
func _on_tolerance_slider_value_changed(value: float) -> void:
_tolerance = value / 255.0
update_config()
save_config()

View file

@ -1,7 +1,25 @@
[gd_scene load_steps=3 format=3 uid="uid://blt8u6nvg1k3g"]
[gd_scene load_steps=4 format=3 uid="uid://blt8u6nvg1k3g"]
[ext_resource type="PackedScene" uid="uid://bd62qfjn380wf" path="res://src/Tools/BaseSelectionTool.tscn" id="1"]
[ext_resource type="Script" path="res://src/Tools/SelectionTools/MagicWand.gd" id="2"]
[ext_resource type="Script" path="res://src/UI/Nodes/ValueSlider.gd" id="3_4ed6a"]
[node name="ToolOptions" instance=ExtResource("1")]
script = ExtResource("2")
[node name="ToleranceSlider" type="TextureProgressBar" parent="." index="8"]
custom_minimum_size = Vector2(32, 24)
layout_mode = 2
focus_mode = 2
mouse_default_cursor_shape = 2
theme_type_variation = &"ValueSlider"
max_value = 255.0
nine_patch_stretch = true
stretch_margin_left = 3
stretch_margin_top = 3
stretch_margin_right = 3
stretch_margin_bottom = 3
script = ExtResource("3_4ed6a")
prefix = "Tolerance:"
[connection signal="value_changed" from="ToleranceSlider" to="." method="_on_tolerance_slider_value_changed"]