From e7890ff3b36af13275294becbe980a5601f94cc9 Mon Sep 17 00:00:00 2001 From: code807 Date: Wed, 10 Jul 2024 15:36:23 -0700 Subject: [PATCH 1/2] add object rotation, profile name --- scenes/LineEditReset.gd | 20 ++++++++++++++ scenes/MicRecord.tscn | 13 +++++++++- scripts/Menu.gd | 56 +++++++++++++++++++++++++++++++++++++--- scripts/screen_object.gd | 7 ++++- 4 files changed, 91 insertions(+), 5 deletions(-) create mode 100644 scenes/LineEditReset.gd diff --git a/scenes/LineEditReset.gd b/scenes/LineEditReset.gd new file mode 100644 index 0000000..8d46731 --- /dev/null +++ b/scenes/LineEditReset.gd @@ -0,0 +1,20 @@ +extends LineEdit + +var lastchange: String = "" + +# Called when the node enters the scene tree for the first time. +func _ready(): + focus_exited.connect(reset_text) + text_submitted.connect(set_reset_text) + pass # Replace with function body. + +func reset_text(): + text = lastchange + +func set_reset_text(value): + lastchange = value + release_focus() + +# Called every frame. 'delta' is the elapsed time since the previous frame. +func _process(delta): + pass diff --git a/scenes/MicRecord.tscn b/scenes/MicRecord.tscn index 39cc967..7199d7a 100644 --- a/scenes/MicRecord.tscn +++ b/scenes/MicRecord.tscn @@ -1,5 +1,6 @@ -[gd_scene load_steps=9 format=3 uid="uid://dvjlkpjvjxn0h"] +[gd_scene load_steps=10 format=3 uid="uid://dvjlkpjvjxn0h"] +[ext_resource type="Script" path="res://scenes/LineEditReset.gd" id="2_4pwma"] [ext_resource type="Texture2D" uid="uid://c5fl4pf7cxwvc" path="res://gizmo.png" id="3_kgjae"] [ext_resource type="Theme" uid="uid://d18y4voshb0um" path="res://Menu Theme.tres" id="3_lar1l"] [ext_resource type="Script" path="res://scripts/gizmo.gd" id="4_6j4ar"] @@ -79,11 +80,20 @@ unique_name_in_owner = true layout_mode = 2 theme_override_constants/separation = 6 +[node name="TitleEdit" type="LineEdit" parent="Menu/PanelContainer/MainMenu"] +unique_name_in_owner = true +layout_mode = 2 +placeholder_text = "[Profile Name]" +alignment = 1 +caret_blink = true +script = ExtResource("2_4pwma") + [node name="DeviceDropdown" type="MenuButton" parent="Menu/PanelContainer/MainMenu"] unique_name_in_owner = true layout_mode = 2 size_flags_horizontal = 4 text = "Input Device" +flat = false item_count = 1 popup/item_0/text = "" popup/item_0/id = 0 @@ -309,6 +319,7 @@ filters = PackedStringArray("*.json") show_hidden_files = true use_native_dialog = true +[connection signal="text_submitted" from="Menu/PanelContainer/MainMenu/TitleEdit" to="." method="_set_profile_name"] [connection signal="value_changed" from="Menu/PanelContainer/MainMenu/HBoxContainer/ThresholdSlider" to="." method="_on_v_slider_drag_ended"] [connection signal="value_changed" from="Menu/PanelContainer/MainMenu/Input Gain/VBoxContainer/InputGainSlider" to="." method="_on_input_gain_change"] [connection signal="pressed" from="Menu/PanelContainer/MainMenu/ScrollContainer/VBoxContainer/Button" to="." method="_create_new_object"] diff --git a/scripts/Menu.gd b/scripts/Menu.gd index 8c4c29c..16c5406 100644 --- a/scripts/Menu.gd +++ b/scripts/Menu.gd @@ -1,8 +1,10 @@ class_name Menu extends Control -const VERSION = 0.3 +const VERSION = 0.4 # Window Management +@onready var titleedit: LineEdit = %TitleEdit +@onready var profilename: String = "GDTuber Avatar" @onready var mainmenu: Control = %MainMenu @onready var settingsmenu: Control = %SettingsMenu @onready var background = %Background @@ -31,8 +33,12 @@ var default_avatar_texture: Texture2D = preload(DEFAULT_IMAGE) var somenuscene = preload("res://scenes/screen_object_menu.tscn") # Screen Object Editing +const SNAP_ANGLE = PI/4 @export var gizmo: Gizmo var drag_target: ScreenObject +var rotating = false +var rotation_center: Vector2 = Vector2() +var starting_rotation: float = 0 # File Management @onready var file_dialog := %ImageOpenDialog @@ -96,6 +102,7 @@ func _save_data(): "version":VERSION, "threshold":threshold, "input_gain":input_gain, + "profile_name":profilename, "objects":[] } for obj in ObjectsRoot.get_children(): @@ -110,6 +117,7 @@ func _save_data(): "reactive": obj.reactive, "talking": obj.talking, "filter": obj.filter, + "rotation": obj.user_rotation, }) savedata = JSON.stringify(savedict) json_save_dialog.popup_centered() @@ -124,6 +132,9 @@ func _validate_save_json(dict, v) -> bool: 0.3:{ "threshold":TYPE_FLOAT, "input_gain":TYPE_FLOAT + }, + 0.4:{ + "profile_name":TYPE_STRING, } } for version in versions: @@ -149,6 +160,9 @@ func _validate_object_json(dict, v) -> bool: }, 0.2:{ "filter":TYPE_BOOL + }, + 0.4:{ + "rotation":TYPE_FLOAT } } for version in versions: @@ -200,6 +214,9 @@ func _load_data(path): if version >= 0.2: newobj.filter = obj["filter"] newobj.update_menu.emit() + # 0.4 + if version >= 0.4: + newobj.user_rotation = obj["rotation"] else: print("ERROR: object does not contain required fields") # Load Program Settings @@ -209,6 +226,10 @@ func _load_data(path): threshold_slider.value = threshold input_gain = save_dict["input_gain"] input_gain_slider.value = input_gain + #0.4 + if version >= 0.4: + titleedit.text = save_dict["profile_name"] + _set_profile_name(save_dict["profile_name"]) else: print("ERROR: Required Fields for Save File Version not Found") else: @@ -259,7 +280,13 @@ func _toggle_transparent(value): func _change_background_color(color): background.color = color +func _set_profile_name(pname: String): + profilename = pname + get_tree().get_root().title = pname + + +# TODO: Duplicate Objects ### Screen Object Management func _create_new_object(): if MenusRoot and ObjectsRoot: @@ -337,17 +364,40 @@ func _on_input_gain_change(_new_input_gain : float): ### Input -func _unhandled_input(event): +func _input(event): + + if event is InputEventMouseMotion and drag_target and rotating: + var rotvector = event.global_position-rotation_center + var rotangle = atan2(rotvector.y, rotvector.x) + var targetrot = rotangle+starting_rotation + if Input.is_key_pressed(KEY_CTRL): + drag_target.user_rotation = round(targetrot/SNAP_ANGLE)*SNAP_ANGLE + else: + drag_target.user_rotation = targetrot + + # Scroll to zoom if event is InputEventMouseButton and drag_target: + print("0") if is_instance_valid(drag_target): match event.button_index: MOUSE_BUTTON_WHEEL_UP: drag_target.user_scale *= SCALE_RATIO MOUSE_BUTTON_WHEEL_DOWN: drag_target.user_scale *= 1 / SCALE_RATIO + MOUSE_BUTTON_RIGHT: + if event.is_pressed(): + if !rotating: + print("start rotating") + rotation_center = drag_target.global_position + var rotvector = event.global_position-rotation_center + var rotangle = atan2(rotvector.y, rotvector.x) + starting_rotation = drag_target.global_rotation - rotangle + rotating = true + else: + print("stop rotating") + rotating = false # Toggle Menu if event is InputEventKey or event is InputEventMouse: if event.is_pressed(): menu_shown = true - diff --git a/scripts/screen_object.gd b/scripts/screen_object.gd index 32a55d1..ea3234b 100644 --- a/scripts/screen_object.gd +++ b/scripts/screen_object.gd @@ -10,7 +10,12 @@ var filter: bool = true: set(value): sprite.texture_filter = TEXTURE_FILTER_LINEAR if value else TEXTURE_FILTER_NEAREST filter = value - + +var user_rotation: float = 0: + set(value): + global_rotation = value + user_rotation = value + var id: String @export var blinking := true: set(value): From 664674caee54d00d6f93949bc17b852ba87aeeec Mon Sep 17 00:00:00 2001 From: code807 Date: Wed, 10 Jul 2024 16:34:50 -0700 Subject: [PATCH 2/2] add duplication --- dupeicon.png | Bin 0 -> 1922 bytes dupeicon.png.import | 34 ++++++++++++++++++++ scenes/MicRecord.tscn | 4 +++ scenes/screen_object_menu.tscn | 18 ++++++++--- scripts/Menu.gd | 56 ++++++++++++++++++++++----------- scripts/gizmo.gd | 4 +-- scripts/screen_object_menu.gd | 10 ++++-- 7 files changed, 100 insertions(+), 26 deletions(-) create mode 100644 dupeicon.png create mode 100644 dupeicon.png.import diff --git a/dupeicon.png b/dupeicon.png new file mode 100644 index 0000000000000000000000000000000000000000..4aae6942db11ccc92a8065b21a9087e29abe1a47 GIT binary patch literal 1922 zcmeHI`BPI@6uwzxQCWhricsMZnV=D6WKBRtglE{)Iz>SYvP2~sNMd75ga}%21AL)I z3IWEIDGCY-Mo^&+=+g$OV}Ych0$Y?ws#_-*=9O zhXxwWwV4Y5FoJ{DZw3IP+hTx$o-RbOOA>U!Fezvo2LN2(^uj#2rA^i)t+@da+%2pG zE-!{14|qHtdC&etPHaq4JekF2(_pJuwbw&vgA@crtv+4yRo3&ITv~C zJl|(it|cMlw|ZmlH_K04ym->#j=@~g9p|Iu^w5Z&fS_En4OVNzj~*jzGUfJ)f}GdQ zUy|VYJkHy@Nxf@u|M}$0KHdl{{E)%!J$=0c{?E?8dsZeWi9c3eKj!t5DhTNiYe{G< zr;pp_F(f$>ji_j_lG?v!Z(B)oqko2||rbSD7~ZTK#vzrj|oCZ$l-4yEQ(<04NR z)CrJI3%@Y>;`<@&tw?WW2J^xtUb`hx7GLL;M9Qd;-He+{_e7n+?$A+gq}O>vNg_%O2R=G72?aDbrY37kM` zDEq|#;p)pX3Y_O^$=~pN0XJrOty#|C=qPgvmq)O(;u_cBMYkroV<1%SG!xsE%~FKP2Jlhg+fXIHdICz7(VC~Zb;s)Q(`qS@lw zl~ZM20*RB%7p1~wcKqv$UU?TvR6JO@N?;KA>Lt@I+}F2%4aQ27#+*76?W#-e*@-N2 zds80(8YiL<7hQX$Qi-ZVL1|m&o0&`w9)7EEEE&>5_S+9-f>WbeP*@Q)&Bi|JkO-VQ zuzL*rTuYp{bBhCr-Qg|(TaAhQMg)haU&U4Ghxc_OVHW=&%?wmNWUUdj@(_xr0AG5W zjB*mPgYfhfHA~PQg=0j+yNW<;x7jS(F)$Gw<}lfY+p+_;Tg%7 zaxIb#!SDa3>Wo+a$>IMCv+$jz_YOZnT^WlwJ~2RGyx9R~g(-)QL#@Heq|4E(1>j26 zci5qR1#U{euh}j~bpm1)Qqwp^v@ibma>Kf&>*h%bov-yG%|sc~+WXL|z*Wf+U~654 z4b}8OfsE`ncN%u+NsLSPND4s$9_TJ<#GM{{4GJ2sRq8V@IAJ{VRG&8acf*}|sw#zJ z)zfEJFszW_bb^2P!l^T=2MS8JYuht00FCcPeDs({K93|JCXg3JXAm~;*A=G{`H@ID zkuR*{=P=bH8HkoSmb1^j|3}eMMCgvv#6m~3NKZgs zgW10MUz}?Z`kS8RCnA<|yLu8ikJ|kLPuF}J9>6gDzG5!1RGsz?WUUyF!&tpLqQI4~ z9Z-Lov8m|Bl|gDEX}RNtR&TI{z`NUyXh-F7%&7{oDiQXrnCNT3)2a7Ehle4L zIL=)?nwE$zLWD$g!3E>4>Pj~VqR7%=Wv=QmWVuvESKBrb0>zzTc{+MGQHar*DjD