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

Finalized Lighten/Darken tool

Lighten/Darken tool now works only once per pixel per mouse press, and it can get mirrored too. Spoiler alert, next commit should be the release of v0.4.
This commit is contained in:
OverloadedOrama 2019-11-12 02:51:47 +02:00
parent e6bd897d1f
commit 17d117a0b1
4 changed files with 35 additions and 35 deletions

View file

@ -29,13 +29,13 @@ rect_min_size = Vector2( 230, 0 )
size_flags_vertical = 3
[node name="Tools" type="VBoxContainer" parent="UI/ToolPanel"]
editor/display_folded = true
anchor_right = 1.0
anchor_bottom = 1.0
size_flags_horizontal = 3
size_flags_vertical = 3
[node name="MenusAndTools" type="VBoxContainer" parent="UI/ToolPanel/Tools"]
editor/display_folded = true
margin_right = 230.0
margin_bottom = 224.0
size_flags_vertical = 3
@ -147,7 +147,6 @@ button_mask = 3
text = "Lighten/Darken"
[node name="SelectionToolsContainer2" type="HBoxContainer" parent="UI/ToolPanel/Tools/MenusAndTools"]
editor/display_folded = true
margin_top = 72.0
margin_right = 230.0
margin_bottom = 92.0
@ -440,7 +439,6 @@ margin_bottom = 600.0
size_flags_horizontal = 3
[node name="HViewportContainer" type="HBoxContainer" parent="UI/CanvasAndTimeline"]
editor/display_folded = true
margin_right = 634.0
margin_bottom = 464.0
size_flags_horizontal = 3
@ -501,6 +499,7 @@ zoom = Vector2( 0.15, 0.15 )
script = ExtResource( 6 )
[node name="AnimationTimeline" type="Panel" parent="UI/CanvasAndTimeline"]
editor/display_folded = true
margin_top = 468.0
margin_right = 634.0
margin_bottom = 600.0
@ -650,7 +649,6 @@ margin_bottom = 600.0
rect_min_size = Vector2( 160, 0 )
[node name="LayersAndMisc" type="VBoxContainer" parent="UI/LayerPanel"]
editor/display_folded = true
anchor_right = 1.0
anchor_bottom = 1.0
custom_constants/separation = 3

View file

@ -14,6 +14,7 @@ var previous_mouse_pos := Vector2.ZERO
var previous_action := "None"
var mouse_inside_canvas := false #used for undo
var sprite_changed_this_frame := false #for optimization purposes
var lighten_darken_pixels := [] #Cleared after mouse release
var is_making_line := false
var is_making_selection := "None"
@ -115,6 +116,7 @@ func _process(delta) -> void:
else:
handle_undo("Draw")
elif (Input.is_action_just_released("left_mouse") && !Input.is_action_pressed("right_mouse")) || (Input.is_action_just_released("right_mouse") && !Input.is_action_pressed("left_mouse")):
lighten_darken_pixels.clear()
if (can_handle || Global.undos == Global.undo_redo.get_version()) && Global.current_frame == frame:
if previous_action != "None" && previous_action != "RectSelect":
handle_redo("Draw")
@ -174,12 +176,11 @@ func _process(delta) -> void:
"LightenDarken":
if mouse_in_canvas && Global.can_draw && Global.has_focus && Global.current_frame == frame:
var pixel_color : Color = layers[current_layer_index][0].get_pixelv(mouse_pos)
var amount := 0.05
var amount := 0.1
var color_changed := pixel_color.lightened(amount)
if Input.is_key_pressed(KEY_CONTROL):
color_changed = pixel_color.darkened(amount)
layers[current_layer_index][0].set_pixelv(mouse_pos, color_changed)
sprite_changed_this_frame = true
pencil_and_eraser(mouse_pos, color_changed, current_mouse_button, current_action)
"RectSelect":
#Check SelectionRectangle.gd for more code on Rectangle Selection
if Global.can_draw && Global.has_focus && Global.current_frame == frame:
@ -414,7 +415,7 @@ func generate_layer_panels() -> void:
layer_container.get_child(0).get_child(1).texture = layers[i][1]
Global.vbox_layer_container.add_child(layer_container)
func pencil_and_eraser(mouse_pos : Vector2, color : Color, current_mouse_button : String) -> void:
func pencil_and_eraser(mouse_pos : Vector2, color : Color, current_mouse_button : String, current_action := "None") -> void:
if Input.is_key_pressed(KEY_SHIFT):
if !is_making_line:
line_2d = Line2D.new()
@ -426,20 +427,20 @@ func pencil_and_eraser(mouse_pos : Vector2, color : Color, current_mouse_button
is_making_line = true
else:
if is_making_line:
fill_gaps(mouse_pos, color, current_mouse_button)
fill_gaps(mouse_pos, color, current_mouse_button, current_action)
is_making_line = false
line_2d.queue_free()
else:
if point_in_rectangle(mouse_pos, location, location + size):
mouse_inside_canvas = true
#Draw
draw_pixel(mouse_pos, color, current_mouse_button)
fill_gaps(mouse_pos, color, current_mouse_button) #Fill the gaps
draw_pixel(mouse_pos, color, current_mouse_button, current_action)
fill_gaps(mouse_pos, color, current_mouse_button, current_action) #Fill the gaps
#If mouse is not inside bounds but it used to be, fill the gaps
elif point_in_rectangle(previous_mouse_pos, location, location + size):
fill_gaps(mouse_pos, color, current_mouse_button)
fill_gaps(mouse_pos, color, current_mouse_button, current_action)
func draw_pixel(pos : Vector2, color : Color, current_mouse_button : String) -> void:
func draw_pixel(pos : Vector2, color : Color, current_mouse_button : String, current_action := "None") -> void:
if Global.can_draw && Global.has_focus && Global.current_frame == frame:
var brush_size := 1
var brush_type = Global.BRUSH_TYPES.PIXEL
@ -486,9 +487,14 @@ func draw_pixel(pos : Vector2, color : Color, current_mouse_button : String) ->
for cur_pos_x in range(start_pos_x, end_pos_x):
for cur_pos_y in range(start_pos_y, end_pos_y):
if point_in_rectangle(Vector2(cur_pos_x, cur_pos_y), Vector2(west_limit - 1, north_limit - 1), Vector2(east_limit, south_limit)):
if layers[current_layer_index][0].get_pixel(cur_pos_x, cur_pos_y) != color: #don't draw the same pixel over and over
var pos_floored := Vector2(cur_pos_x, cur_pos_y).floor()
#Don't draw the same pixel over and over and don't re-lighten/darken it
if layers[current_layer_index][0].get_pixel(cur_pos_x, cur_pos_y) != color && !(pos_floored in lighten_darken_pixels):
layers[current_layer_index][0].set_pixel(cur_pos_x, cur_pos_y, color)
if current_action == "LightenDarken":
lighten_darken_pixels.append(pos_floored)
sprite_changed_this_frame = true
#Handle mirroring
var mirror_x := east_limit + west_limit - cur_pos_x - 1
var mirror_y := south_limit + north_limit - cur_pos_y - 1
@ -511,7 +517,6 @@ func draw_pixel(pos : Vector2, color : Color, current_mouse_button : String) ->
var dst := rectangle_center(pos, custom_brush_size)
var src_rect := Rect2(Vector2.ZERO, custom_brush_size + Vector2.ONE)
#Rectangle with the same size as the brush, but at cursor's position
#var pos_rect_position := rectangle_center(pos, custom_brush_size)
var pos_rect := Rect2(dst, custom_brush_size + Vector2.ONE)
#The selection rectangle
@ -569,7 +574,7 @@ func draw_pixel(pos : Vector2, color : Color, current_mouse_button : String) ->
#Bresenham's Algorithm
#Thanks to https://godotengine.org/qa/35276/tile-based-line-drawing-algorithm-efficiency
func fill_gaps(mouse_pos : Vector2, color : Color, current_mouse_button : String) -> void:
func fill_gaps(mouse_pos : Vector2, color : Color, current_mouse_button : String, current_action := "None") -> void:
var previous_mouse_pos_floored = previous_mouse_pos.floor()
var mouse_pos_floored = mouse_pos.floor()
mouse_pos_floored.x = clamp(mouse_pos_floored.x, location.x - 1, location.x + size.x)
@ -583,7 +588,7 @@ func fill_gaps(mouse_pos : Vector2, color : Color, current_mouse_button : String
var x = previous_mouse_pos_floored.x
var y = previous_mouse_pos_floored.y
while !(x == mouse_pos_floored.x && y == mouse_pos_floored.y):
draw_pixel(Vector2(x, y), color, current_mouse_button)
draw_pixel(Vector2(x, y), color, current_mouse_button, current_action)
e2 = err << 1
if e2 >= dy:
err += dy

View file

@ -293,7 +293,6 @@ func remove_brush_buttons() -> void:
var hbox_container := find_node_by_name(get_tree().get_root(), "CustomBrushHBoxContainer")
for child in hbox_container.get_children():
child.queue_free()
#hbox_container.remove_child(child)
func undo_custom_brush(_brush_button : Button = null) -> void:
undos -= 1

View file

@ -61,11 +61,9 @@ func _process(delta) -> void:
if is_dragging:
if (Global.current_left_tool == "RectSelect" && Input.is_action_pressed("left_mouse")) || (Global.current_right_tool == "RectSelect" && Input.is_action_pressed("right_mouse")):
#Drag
#if orig_x + mouse_pos_floored.x >= Global.canvas.location.x && diff_x + mouse_pos_floored.x <= Global.canvas.size.x:
start_pos.x = orig_x + mouse_pos_floored.x
end_pos.x = diff_x + mouse_pos_floored.x
#if orig_y + mouse_pos_floored.y >= Global.canvas.location.y && diff_y + mouse_pos_floored.y <= Global.canvas.size.y:
start_pos.y = orig_y + mouse_pos_floored.y
end_pos.y = diff_y + mouse_pos_floored.y
polygon[0] = start_pos