mirror of
https://github.com/Orama-Interactive/Pixelorama.git
synced 2025-02-07 10:59:49 +00:00
add follow canvas movement and scale option to transparent checker (#311)
This commit is contained in:
parent
b998c87bcc
commit
39808082b6
|
@ -57,6 +57,8 @@ var guide_color := Color.purple
|
||||||
var checker_size := 10
|
var checker_size := 10
|
||||||
var checker_color_1 := Color(0.47, 0.47, 0.47, 1)
|
var checker_color_1 := Color(0.47, 0.47, 0.47, 1)
|
||||||
var checker_color_2 := Color(0.34, 0.35, 0.34, 1)
|
var checker_color_2 := Color(0.34, 0.35, 0.34, 1)
|
||||||
|
var checker_follow_movement := false
|
||||||
|
var checker_follow_scale := false
|
||||||
|
|
||||||
var autosave_interval := 1.0
|
var autosave_interval := 1.0
|
||||||
var enable_autosave := true
|
var enable_autosave := true
|
||||||
|
|
|
@ -5,17 +5,26 @@ var tween : Tween
|
||||||
var zoom_min := Vector2(0.005, 0.005)
|
var zoom_min := Vector2(0.005, 0.005)
|
||||||
var zoom_max := Vector2.ONE
|
var zoom_max := Vector2.ONE
|
||||||
var viewport_container : ViewportContainer
|
var viewport_container : ViewportContainer
|
||||||
|
var transparent_checker : ColorRect
|
||||||
var mouse_pos := Vector2.ZERO
|
var mouse_pos := Vector2.ZERO
|
||||||
var drag := false
|
var drag := false
|
||||||
|
|
||||||
|
|
||||||
func _ready() -> void:
|
func _ready() -> void:
|
||||||
viewport_container = get_parent().get_parent()
|
viewport_container = get_parent().get_parent()
|
||||||
|
transparent_checker = get_parent().get_node("TransparentChecker")
|
||||||
tween = Tween.new()
|
tween = Tween.new()
|
||||||
add_child(tween)
|
add_child(tween)
|
||||||
tween.connect("tween_step", self, "_on_tween_step")
|
tween.connect("tween_step", self, "_on_tween_step")
|
||||||
|
update_transparent_checker_offset()
|
||||||
|
|
||||||
|
|
||||||
|
func update_transparent_checker_offset() -> void:
|
||||||
|
var o = get_global_transform_with_canvas().get_origin()
|
||||||
|
var s = get_global_transform_with_canvas().get_scale()
|
||||||
|
o.y = get_viewport_rect().size.y - o.y
|
||||||
|
transparent_checker.update_offset(o, s)
|
||||||
|
|
||||||
# Get the speed multiplier for when you've pressed
|
# Get the speed multiplier for when you've pressed
|
||||||
# a movement key for the given amount of time
|
# a movement key for the given amount of time
|
||||||
func dir_move_zoom_multiplier(press_time : float) -> float:
|
func dir_move_zoom_multiplier(press_time : float) -> float:
|
||||||
|
@ -92,6 +101,7 @@ func process_direction_action_pressed(event: InputEvent) -> void:
|
||||||
var this_direction_press_time : float = Global.key_move_press_time[dir]
|
var this_direction_press_time : float = Global.key_move_press_time[dir]
|
||||||
var move_speed := dir_move_zoom_multiplier(this_direction_press_time)
|
var move_speed := dir_move_zoom_multiplier(this_direction_press_time)
|
||||||
offset = offset + move_speed * increment * directional_sign_multipliers[dir] * zoom
|
offset = offset + move_speed * increment * directional_sign_multipliers[dir] * zoom
|
||||||
|
update_transparent_checker_offset()
|
||||||
|
|
||||||
|
|
||||||
# Process an action for a release direction action
|
# Process an action for a release direction action
|
||||||
|
@ -117,6 +127,7 @@ func _input(event : InputEvent) -> void:
|
||||||
zoom_camera(1)
|
zoom_camera(1)
|
||||||
elif event is InputEventMouseMotion && drag:
|
elif event is InputEventMouseMotion && drag:
|
||||||
offset = offset - event.relative * zoom
|
offset = offset - event.relative * zoom
|
||||||
|
update_transparent_checker_offset()
|
||||||
elif is_action_direction_pressed(event):
|
elif is_action_direction_pressed(event):
|
||||||
process_direction_action_pressed(event)
|
process_direction_action_pressed(event)
|
||||||
elif is_action_direction_released(event):
|
elif is_action_direction_released(event):
|
||||||
|
@ -154,6 +165,7 @@ func zoom_camera(dir : int) -> void:
|
||||||
zoom = zoom_max
|
zoom = zoom_max
|
||||||
|
|
||||||
offset = offset + (-0.5 * viewport_size + mouse_pos) * (prev_zoom - zoom)
|
offset = offset + (-0.5 * viewport_size + mouse_pos) * (prev_zoom - zoom)
|
||||||
|
update_transparent_checker_offset()
|
||||||
if name == "Camera2D":
|
if name == "Camera2D":
|
||||||
Global.zoom_level_label.text = str(round(100 / Global.camera.zoom.x)) + " %"
|
Global.zoom_level_label.text = str(round(100 / Global.camera.zoom.x)) + " %"
|
||||||
elif name == "CameraPreview":
|
elif name == "CameraPreview":
|
||||||
|
@ -163,6 +175,16 @@ func zoom_camera(dir : int) -> void:
|
||||||
func _on_tween_step(_object: Object, _key: NodePath, _elapsed: float, _value: Object) -> void:
|
func _on_tween_step(_object: Object, _key: NodePath, _elapsed: float, _value: Object) -> void:
|
||||||
Global.horizontal_ruler.update()
|
Global.horizontal_ruler.update()
|
||||||
Global.vertical_ruler.update()
|
Global.vertical_ruler.update()
|
||||||
|
update_transparent_checker_offset()
|
||||||
|
|
||||||
|
|
||||||
|
func zoom_100():
|
||||||
|
zoom = Vector2.ONE
|
||||||
|
offset = Global.current_project.size / 2
|
||||||
|
update_transparent_checker_offset()
|
||||||
|
Global.zoom_level_label.text = str(round(100 / zoom.x)) + " %"
|
||||||
|
Global.horizontal_ruler.update()
|
||||||
|
Global.vertical_ruler.update()
|
||||||
|
|
||||||
|
|
||||||
func fit_to_frame(size : Vector2) -> void:
|
func fit_to_frame(size : Vector2) -> void:
|
||||||
|
@ -185,6 +207,7 @@ func fit_to_frame(size : Vector2) -> void:
|
||||||
|
|
||||||
zoom = Vector2(1 / ratio, 1 / ratio)
|
zoom = Vector2(1 / ratio, 1 / ratio)
|
||||||
offset = size / 2
|
offset = size / 2
|
||||||
|
update_transparent_checker_offset()
|
||||||
if name == "Camera2D":
|
if name == "Camera2D":
|
||||||
Global.zoom_level_label.text = str(round(100 / Global.camera.zoom.x)) + " %"
|
Global.zoom_level_label.text = str(round(100 / Global.camera.zoom.x)) + " %"
|
||||||
Global.horizontal_ruler.update()
|
Global.horizontal_ruler.update()
|
||||||
|
|
|
@ -23,6 +23,8 @@ var preferences = [
|
||||||
["checker_size", "Canvas/CheckerOptions/CheckerSizeValue", "value", Global.checker_size],
|
["checker_size", "Canvas/CheckerOptions/CheckerSizeValue", "value", Global.checker_size],
|
||||||
["checker_color_1", "Canvas/CheckerOptions/CheckerColor1", "color", Global.checker_color_1],
|
["checker_color_1", "Canvas/CheckerOptions/CheckerColor1", "color", Global.checker_color_1],
|
||||||
["checker_color_2", "Canvas/CheckerOptions/CheckerColor2", "color", Global.checker_color_2],
|
["checker_color_2", "Canvas/CheckerOptions/CheckerColor2", "color", Global.checker_color_2],
|
||||||
|
["checker_follow_movement", "Canvas/CheckerOptions/CheckerFollowMovement", "pressed", Global.checker_follow_movement],
|
||||||
|
["checker_follow_scale", "Canvas/CheckerOptions/CheckerFollowScale", "pressed", Global.checker_follow_scale],
|
||||||
]
|
]
|
||||||
|
|
||||||
var selected_item := 0
|
var selected_item := 0
|
||||||
|
@ -116,7 +118,7 @@ func preference_update(prop : String) -> void:
|
||||||
if prop in ["grid_width", "grid_height", "grid_color"]:
|
if prop in ["grid_width", "grid_height", "grid_color"]:
|
||||||
Global.canvas.update()
|
Global.canvas.update()
|
||||||
|
|
||||||
if prop in ["checker_size", "checker_color_1", "checker_color_2"]:
|
if prop in ["checker_size", "checker_color_1", "checker_color_2", "checker_follow_movement", "checker_follow_scale"]:
|
||||||
Global.transparent_checker._ready()
|
Global.transparent_checker._ready()
|
||||||
|
|
||||||
if prop in ["guide_color"]:
|
if prop in ["guide_color"]:
|
||||||
|
|
|
@ -356,6 +356,38 @@ hint_tooltip = "Second color of the transparent checker background"
|
||||||
mouse_default_cursor_shape = 2
|
mouse_default_cursor_shape = 2
|
||||||
color = Color( 0.341176, 0.34902, 0.341176, 1 )
|
color = Color( 0.341176, 0.34902, 0.341176, 1 )
|
||||||
|
|
||||||
|
[node name="Label" type="Label" parent="HSplitContainer/ScrollContainer/VBoxContainer/Canvas/CheckerOptions"]
|
||||||
|
margin_top = -181.0
|
||||||
|
margin_right = 110.0
|
||||||
|
margin_bottom = -167.0
|
||||||
|
rect_min_size = Vector2( 110, 0 )
|
||||||
|
text = "Follow Canvas Movement"
|
||||||
|
|
||||||
|
[node name="CheckerFollowMovement" type="CheckBox" parent="HSplitContainer/ScrollContainer/VBoxContainer/Canvas/CheckerOptions"]
|
||||||
|
margin_left = 114.0
|
||||||
|
margin_top = -186.0
|
||||||
|
margin_right = 161.0
|
||||||
|
margin_bottom = -162.0
|
||||||
|
hint_tooltip = "The transparent checker follow the movement of canvas "
|
||||||
|
mouse_default_cursor_shape = 2
|
||||||
|
text = "On"
|
||||||
|
|
||||||
|
[node name="Label2" type="Label" parent="HSplitContainer/ScrollContainer/VBoxContainer/Canvas/CheckerOptions"]
|
||||||
|
margin_top = -181.0
|
||||||
|
margin_right = 110.0
|
||||||
|
margin_bottom = -167.0
|
||||||
|
rect_min_size = Vector2( 110, 0 )
|
||||||
|
text = "Follow Canvas Zoom Level"
|
||||||
|
|
||||||
|
[node name="CheckerFollowScale" type="CheckBox" parent="HSplitContainer/ScrollContainer/VBoxContainer/Canvas/CheckerOptions"]
|
||||||
|
margin_left = 114.0
|
||||||
|
margin_top = -186.0
|
||||||
|
margin_right = 161.0
|
||||||
|
margin_bottom = -162.0
|
||||||
|
hint_tooltip = "The transparent checker follow the zoom level of canvas "
|
||||||
|
mouse_default_cursor_shape = 2
|
||||||
|
text = "On"
|
||||||
|
|
||||||
[node name="Image" type="VBoxContainer" parent="HSplitContainer/ScrollContainer/VBoxContainer"]
|
[node name="Image" type="VBoxContainer" parent="HSplitContainer/ScrollContainer/VBoxContainer"]
|
||||||
visible = false
|
visible = false
|
||||||
margin_top = 240.0
|
margin_top = 240.0
|
||||||
|
|
|
@ -4,9 +4,24 @@ render_mode unshaded;
|
||||||
uniform float size = 10.0;
|
uniform float size = 10.0;
|
||||||
uniform vec4 color1 : hint_color = vec4(0.7, 0.7, 0.7, 1.0);
|
uniform vec4 color1 : hint_color = vec4(0.7, 0.7, 0.7, 1.0);
|
||||||
uniform vec4 color2 : hint_color = vec4(1.0);
|
uniform vec4 color2 : hint_color = vec4(1.0);
|
||||||
|
uniform vec2 offset = vec2(0.0);
|
||||||
|
uniform vec2 scale = vec2(0.0);
|
||||||
|
uniform vec2 rect_size = vec2(0.0);
|
||||||
|
uniform bool follow_movement = false;
|
||||||
|
uniform bool follow_scale = false;
|
||||||
|
|
||||||
void fragment() {
|
void fragment() {
|
||||||
vec2 pos = mod(FRAGCOORD.xy, size * 2.0);
|
vec2 ref_pos = FRAGCOORD.xy;
|
||||||
|
if (follow_scale) {
|
||||||
|
if (!follow_movement)
|
||||||
|
ref_pos /= scale;
|
||||||
|
else
|
||||||
|
ref_pos = UV * rect_size;
|
||||||
|
}
|
||||||
|
else if (follow_movement)
|
||||||
|
ref_pos -= mod(offset, size * 2.0);
|
||||||
|
|
||||||
|
vec2 pos = mod(ref_pos, size * 2.0);
|
||||||
bool c1 = any(lessThan(pos, vec2(size)));
|
bool c1 = any(lessThan(pos, vec2(size)));
|
||||||
bool c2 = any(greaterThanEqual(pos, vec2(size)));
|
bool c2 = any(greaterThanEqual(pos, vec2(size)));
|
||||||
float c = c1 && c2 ? 1.0: 0.0;
|
float c = c1 && c2 ? 1.0: 0.0;
|
||||||
|
|
|
@ -15,11 +15,7 @@ func _on_FitToFrame_pressed():
|
||||||
|
|
||||||
|
|
||||||
func _on_100_pressed():
|
func _on_100_pressed():
|
||||||
Global.camera.zoom = Vector2.ONE
|
Global.camera.zoom_100()
|
||||||
Global.camera.offset = Global.current_project.size / 2
|
|
||||||
Global.zoom_level_label.text = str(round(100 / Global.camera.zoom.x)) + " %"
|
|
||||||
Global.horizontal_ruler.update()
|
|
||||||
Global.vertical_ruler.update()
|
|
||||||
|
|
||||||
|
|
||||||
func get_config() -> Dictionary:
|
func get_config() -> Dictionary:
|
||||||
|
|
|
@ -9,6 +9,7 @@ onready var play_button : Button = $SettingsContainer/VBoxContainer/PlayButton
|
||||||
func _on_PreviewZoomSlider_value_changed(value : float) -> void:
|
func _on_PreviewZoomSlider_value_changed(value : float) -> void:
|
||||||
camera.zoom = -Vector2(value, value)
|
camera.zoom = -Vector2(value, value)
|
||||||
camera.save_values_to_project()
|
camera.save_values_to_project()
|
||||||
|
camera.update_transparent_checker_offset()
|
||||||
|
|
||||||
|
|
||||||
func _on_PlayButton_toggled(button_pressed : bool) -> void:
|
func _on_PlayButton_toggled(button_pressed : bool) -> void:
|
||||||
|
|
|
@ -9,3 +9,14 @@ func _ready() -> void:
|
||||||
material.set_shader_param("size", Global.checker_size)
|
material.set_shader_param("size", Global.checker_size)
|
||||||
material.set_shader_param("color1", Global.checker_color_1)
|
material.set_shader_param("color1", Global.checker_color_1)
|
||||||
material.set_shader_param("color2", Global.checker_color_2)
|
material.set_shader_param("color2", Global.checker_color_2)
|
||||||
|
material.set_shader_param("follow_movement", Global.checker_follow_movement)
|
||||||
|
material.set_shader_param("follow_scale", Global.checker_follow_scale)
|
||||||
|
|
||||||
|
|
||||||
|
func update_offset(offset : Vector2, scale : Vector2) -> void:
|
||||||
|
material.set_shader_param("offset", offset)
|
||||||
|
material.set_shader_param("scale", scale)
|
||||||
|
|
||||||
|
|
||||||
|
func _on_TransparentChecker_resized():
|
||||||
|
material.set_shader_param("rect_size", rect_size)
|
||||||
|
|
|
@ -15,3 +15,7 @@ margin_right = 40.0
|
||||||
margin_bottom = 40.0
|
margin_bottom = 40.0
|
||||||
mouse_filter = 2
|
mouse_filter = 2
|
||||||
script = ExtResource( 2 )
|
script = ExtResource( 2 )
|
||||||
|
__meta__ = {
|
||||||
|
"_edit_use_anchors_": false
|
||||||
|
}
|
||||||
|
[connection signal="resized" from="." to="." method="_on_TransparentChecker_resized"]
|
||||||
|
|
Loading…
Reference in a new issue