From c8d8c7ec2561d5db221d41edb78f3301090235e9 Mon Sep 17 00:00:00 2001 From: Minimata Date: Tue, 27 May 2025 19:20:46 +0200 Subject: [PATCH] gd: added input addon --- addons/guide/LICENSE.md | 19 + addons/guide/debugger/guide_debugger.gd | 104 +++++ addons/guide/debugger/guide_debugger.gd.uid | 1 + addons/guide/debugger/guide_debugger.tscn | 50 +++ .../action_mapping_editor.gd | 140 +++++++ .../action_mapping_editor.gd.uid | 1 + .../action_mapping_editor.tscn | 43 ++ .../guide/editor/action_slot/action_slot.gd | 70 ++++ .../editor/action_slot/action_slot.gd.uid | 1 + .../guide/editor/action_slot/action_slot.tscn | 29 ++ .../action_slot/action_slot_line_edit.gd | 24 ++ .../action_slot/action_slot_line_edit.gd.uid | 1 + .../action_slot/action_value_type_axis1d.svg | 25 ++ .../action_value_type_axis1d.svg.import | 38 ++ .../action_slot/action_value_type_axis2d.svg | 25 ++ .../action_value_type_axis2d.svg.import | 38 ++ .../action_slot/action_value_type_axis3d.svg | 25 ++ .../action_value_type_axis3d.svg.import | 38 ++ .../action_slot/action_value_type_bool.svg | 22 + .../action_value_type_bool.svg.import | 38 ++ .../editor/action_slot/missing_action.svg | 17 + .../action_slot/missing_action.svg.import | 37 ++ addons/guide/editor/array_edit/array_edit.gd | 113 +++++ .../guide/editor/array_edit/array_edit.gd.uid | 1 + .../guide/editor/array_edit/array_edit.tscn | 88 ++++ .../editor/array_edit/array_edit_item.gd | 84 ++++ .../editor/array_edit/array_edit_item.gd.uid | 1 + .../editor/array_edit/array_edit_item.tscn | 83 ++++ addons/guide/editor/array_edit/dragger.gd | 8 + addons/guide/editor/array_edit/dragger.gd.uid | 1 + .../editor/binding_dialog/binding_dialog.gd | 148 +++++++ .../binding_dialog/binding_dialog.gd.uid | 1 + .../editor/binding_dialog/binding_dialog.tscn | 216 ++++++++++ addons/guide/editor/class_scanner.gd | 91 ++++ addons/guide/editor/class_scanner.gd.uid | 1 + .../editor/input_display/input_display.gd | 39 ++ .../editor/input_display/input_display.gd.uid | 1 + .../editor/input_display/input_display.tscn | 18 + .../input_mapping_editor.gd | 299 ++++++++++++++ .../input_mapping_editor.gd.uid | 1 + .../input_mapping_editor.tscn | 140 +++++++ addons/guide/editor/logo_editor_small.svg | 24 ++ .../guide/editor/logo_editor_small.svg.import | 38 ++ .../mapping_context_editor.gd | 159 +++++++ .../mapping_context_editor.gd.uid | 1 + .../mapping_context_editor.tscn | 58 +++ .../editor/modifier_slot/modifier_slot.gd | 14 + .../editor/modifier_slot/modifier_slot.gd.uid | 1 + .../editor/modifier_slot/modifier_slot.tscn | 18 + .../editor/resource_slot/resource_slot.gd | 106 +++++ .../editor/resource_slot/resource_slot.gd.uid | 1 + .../guide/editor/trigger_slot/trigger_slot.gd | 14 + .../editor/trigger_slot/trigger_slot.gd.uid | 1 + .../editor/trigger_slot/trigger_slot.tscn | 20 + addons/guide/editor/utils.gd | 22 + addons/guide/editor/utils.gd.uid | 1 + addons/guide/guide.gd | 387 ++++++++++++++++++ addons/guide/guide.gd.uid | 1 + addons/guide/guide_action.gd | 254 ++++++++++++ addons/guide/guide_action.gd.uid | 1 + addons/guide/guide_action.svg | 7 + addons/guide/guide_action.svg.import | 38 ++ addons/guide/guide_action_mapping.gd | 21 + addons/guide/guide_action_mapping.gd.uid | 1 + addons/guide/guide_input_mapping.gd | 177 ++++++++ addons/guide/guide_input_mapping.gd.uid | 1 + addons/guide/guide_input_tracker.gd | 26 ++ addons/guide/guide_input_tracker.gd.uid | 1 + addons/guide/guide_internal.svg | 12 + addons/guide/guide_internal.svg.import | 38 ++ addons/guide/guide_mapping_context.gd | 30 ++ addons/guide/guide_mapping_context.gd.uid | 1 + addons/guide/guide_mapping_context.svg | 9 + addons/guide/guide_mapping_context.svg.import | 38 ++ addons/guide/guide_reset.gd | 15 + addons/guide/guide_reset.gd.uid | 1 + addons/guide/guide_set.gd | 40 ++ addons/guide/guide_set.gd.uid | 1 + addons/guide/inputs/guide_input.gd | 49 +++ addons/guide/inputs/guide_input.gd.uid | 1 + addons/guide/inputs/guide_input.svg | 12 + addons/guide/inputs/guide_input.svg.import | 38 ++ addons/guide/inputs/guide_input_action.gd | 59 +++ addons/guide/inputs/guide_input_action.gd.uid | 1 + addons/guide/inputs/guide_input_any.gd | 150 +++++++ addons/guide/inputs/guide_input_any.gd.uid | 1 + .../guide/inputs/guide_input_joy_axis_1d.gd | 40 ++ .../inputs/guide_input_joy_axis_1d.gd.uid | 1 + .../guide/inputs/guide_input_joy_axis_2d.gd | 53 +++ .../inputs/guide_input_joy_axis_2d.gd.uid | 1 + addons/guide/inputs/guide_input_joy_base.gd | 13 + .../guide/inputs/guide_input_joy_base.gd.uid | 1 + addons/guide/inputs/guide_input_joy_button.gd | 41 ++ .../inputs/guide_input_joy_button.gd.uid | 1 + addons/guide/inputs/guide_input_key.gd | 126 ++++++ addons/guide/inputs/guide_input_key.gd.uid | 1 + .../guide/inputs/guide_input_mouse_axis_1d.gd | 57 +++ .../inputs/guide_input_mouse_axis_1d.gd.uid | 1 + .../guide/inputs/guide_input_mouse_axis_2d.gd | 42 ++ .../inputs/guide_input_mouse_axis_2d.gd.uid | 1 + .../guide/inputs/guide_input_mouse_button.gd | 74 ++++ .../inputs/guide_input_mouse_button.gd.uid | 1 + .../inputs/guide_input_mouse_position.gd | 39 ++ .../inputs/guide_input_mouse_position.gd.uid | 1 + addons/guide/inputs/guide_input_state.gd | 327 +++++++++++++++ addons/guide/inputs/guide_input_state.gd.uid | 1 + .../guide/inputs/guide_input_touch_angle.gd | 91 ++++ .../inputs/guide_input_touch_angle.gd.uid | 1 + .../guide/inputs/guide_input_touch_axis_1d.gd | 44 ++ .../inputs/guide_input_touch_axis_1d.gd.uid | 1 + .../guide/inputs/guide_input_touch_axis_2d.gd | 27 ++ .../inputs/guide_input_touch_axis_2d.gd.uid | 1 + .../inputs/guide_input_touch_axis_base.gd | 49 +++ .../inputs/guide_input_touch_axis_base.gd.uid | 1 + addons/guide/inputs/guide_input_touch_base.gd | 22 + .../inputs/guide_input_touch_base.gd.uid | 1 + .../inputs/guide_input_touch_distance.gd | 76 ++++ .../inputs/guide_input_touch_distance.gd.uid | 1 + .../inputs/guide_input_touch_position.gd | 45 ++ .../inputs/guide_input_touch_position.gd.uid | 1 + addons/guide/inputs/guide_touch_state.gd.uid | 1 + addons/guide/modifiers/guide_modifier.gd | 23 ++ addons/guide/modifiers/guide_modifier.gd.uid | 1 + addons/guide/modifiers/guide_modifier.svg | 12 + .../guide/modifiers/guide_modifier.svg.import | 38 ++ .../guide_modifier_3d_coordinates.gd | 53 +++ .../guide_modifier_3d_coordinates.gd.uid | 1 + .../guide_modifier_8_way_direction.gd | 47 +++ .../guide_modifier_8_way_direction.gd.uid | 1 + .../guide_modifier_canvas_coordinates.gd | 35 ++ .../guide_modifier_canvas_coordinates.gd.uid | 1 + .../guide/modifiers/guide_modifier_curve.gd | 51 +++ .../modifiers/guide_modifier_curve.gd.uid | 1 + .../modifiers/guide_modifier_deadzone.gd | 63 +++ .../modifiers/guide_modifier_deadzone.gd.uid | 1 + .../modifiers/guide_modifier_input_swizzle.gd | 43 ++ .../guide_modifier_input_swizzle.gd.uid | 1 + .../modifiers/guide_modifier_map_range.gd | 67 +++ .../modifiers/guide_modifier_map_range.gd.uid | 1 + .../guide/modifiers/guide_modifier_negate.gd | 52 +++ .../modifiers/guide_modifier_negate.gd.uid | 1 + .../modifiers/guide_modifier_normalize.gd | 17 + .../modifiers/guide_modifier_normalize.gd.uid | 1 + .../guide_modifier_positive_negative.gd | 65 +++ .../guide_modifier_positive_negative.gd.uid | 1 + .../guide/modifiers/guide_modifier_scale.gd | 35 ++ .../modifiers/guide_modifier_scale.gd.uid | 1 + .../guide_modifier_virtual_cursor.gd | 105 +++++ .../guide_modifier_virtual_cursor.gd.uid | 1 + .../guide_modifier_window_relative.gd | 26 ++ .../guide_modifier_window_relative.gd.uid | 1 + addons/guide/plugin.cfg | 7 + addons/guide/plugin.gd | 45 ++ addons/guide/plugin.gd.uid | 1 + .../guide/remapping/guide_input_detector.gd | 376 +++++++++++++++++ .../remapping/guide_input_detector.gd.uid | 1 + addons/guide/remapping/guide_remapper.gd | 307 ++++++++++++++ addons/guide/remapping/guide_remapper.gd.uid | 1 + .../guide/remapping/guide_remapping_config.gd | 85 ++++ .../remapping/guide_remapping_config.gd.uid | 1 + addons/guide/triggers/guide_trigger.gd | 65 +++ addons/guide/triggers/guide_trigger.gd.uid | 1 + addons/guide/triggers/guide_trigger.svg | 12 + .../guide/triggers/guide_trigger.svg.import | 38 ++ .../triggers/guide_trigger_chorded_action.gd | 28 ++ .../guide_trigger_chorded_action.gd.uid | 1 + addons/guide/triggers/guide_trigger_combo.gd | 117 ++++++ .../guide/triggers/guide_trigger_combo.gd.uid | 1 + .../guide_trigger_combo_cancel_action.gd | 27 ++ .../guide_trigger_combo_cancel_action.gd.uid | 1 + .../triggers/guide_trigger_combo_step.gd | 29 ++ .../triggers/guide_trigger_combo_step.gd.uid | 1 + addons/guide/triggers/guide_trigger_down.gd | 20 + .../guide/triggers/guide_trigger_down.gd.uid | 1 + addons/guide/triggers/guide_trigger_hold.gd | 43 ++ .../guide/triggers/guide_trigger_hold.gd.uid | 1 + .../guide/triggers/guide_trigger_pressed.gd | 22 + .../triggers/guide_trigger_pressed.gd.uid | 1 + addons/guide/triggers/guide_trigger_pulse.gd | 86 ++++ .../guide/triggers/guide_trigger_pulse.gd.uid | 1 + .../guide/triggers/guide_trigger_released.gd | 21 + .../triggers/guide_trigger_released.gd.uid | 1 + .../guide/triggers/guide_trigger_stability.gd | 72 ++++ .../triggers/guide_trigger_stability.gd.uid | 1 + addons/guide/triggers/guide_trigger_tap.gd | 48 +++ .../guide/triggers/guide_trigger_tap.gd.uid | 1 + addons/guide/ui/guide_icon_renderer.gd | 30 ++ addons/guide/ui/guide_icon_renderer.gd.uid | 1 + addons/guide/ui/guide_input_formatter.gd | 358 ++++++++++++++++ addons/guide/ui/guide_input_formatter.gd.uid | 1 + addons/guide/ui/guide_text_provider.gd | 22 + addons/guide/ui/guide_text_provider.gd.uid | 1 + addons/guide/ui/icon_maker/icon_maker.gd | 103 +++++ addons/guide/ui/icon_maker/icon_maker.gd.uid | 1 + addons/guide/ui/icon_maker/icon_maker.tscn | 24 ++ .../controllers/controller_renderer.gd | 171 ++++++++ .../controllers/controller_renderer.gd.uid | 1 + .../controllers/controller_renderer.tscn | 135 ++++++ .../playstation/icons/PS5_Circle.png | Bin 0 -> 5361 bytes .../playstation/icons/PS5_Circle.png.import | 34 ++ .../playstation/icons/PS5_Cross.png | Bin 0 -> 4539 bytes .../playstation/icons/PS5_Cross.png.import | 34 ++ .../playstation/icons/PS5_Dpad.png | Bin 0 -> 6137 bytes .../playstation/icons/PS5_Dpad.png.import | 34 ++ .../playstation/icons/PS5_Dpad_Down.png | Bin 0 -> 6180 bytes .../icons/PS5_Dpad_Down.png.import | 34 ++ .../playstation/icons/PS5_Dpad_Left.png | Bin 0 -> 5902 bytes .../icons/PS5_Dpad_Left.png.import | 34 ++ .../playstation/icons/PS5_Dpad_Right.png | Bin 0 -> 5943 bytes .../icons/PS5_Dpad_Right.png.import | 34 ++ .../playstation/icons/PS5_Dpad_Up.png | Bin 0 -> 5979 bytes .../playstation/icons/PS5_Dpad_Up.png.import | 34 ++ .../controllers/playstation/icons/PS5_L1.png | Bin 0 -> 2758 bytes .../playstation/icons/PS5_L1.png.import | 34 ++ .../controllers/playstation/icons/PS5_L2.png | Bin 0 -> 2968 bytes .../playstation/icons/PS5_L2.png.import | 34 ++ .../playstation/icons/PS5_Left_Stick.png | Bin 0 -> 5125 bytes .../icons/PS5_Left_Stick.png.import | 34 ++ .../icons/PS5_Left_Stick_Click.png | Bin 0 -> 3046 bytes .../icons/PS5_Left_Stick_Click.png.import | 34 ++ .../playstation/icons/PS5_Microphone.png | Bin 0 -> 1654 bytes .../icons/PS5_Microphone.png.import | 34 ++ .../playstation/icons/PS5_Options.png | Bin 0 -> 2858 bytes .../playstation/icons/PS5_Options.png.import | 34 ++ .../playstation/icons/PS5_Options_Alt.png | Bin 0 -> 3224 bytes .../icons/PS5_Options_Alt.png.import | 34 ++ .../controllers/playstation/icons/PS5_R1.png | Bin 0 -> 2947 bytes .../playstation/icons/PS5_R1.png.import | 34 ++ .../controllers/playstation/icons/PS5_R2.png | Bin 0 -> 3156 bytes .../playstation/icons/PS5_R2.png.import | 34 ++ .../playstation/icons/PS5_Right_Stick.png | Bin 0 -> 5432 bytes .../icons/PS5_Right_Stick.png.import | 34 ++ .../icons/PS5_Right_Stick_Click.png | Bin 0 -> 3360 bytes .../icons/PS5_Right_Stick_Click.png.import | 34 ++ .../playstation/icons/PS5_Share.png | Bin 0 -> 3114 bytes .../playstation/icons/PS5_Share.png.import | 34 ++ .../playstation/icons/PS5_Share_Alt.png | Bin 0 -> 3071 bytes .../icons/PS5_Share_Alt.png.import | 34 ++ .../playstation/icons/PS5_Square.png | Bin 0 -> 4315 bytes .../playstation/icons/PS5_Square.png.import | 34 ++ .../playstation/icons/PS5_Touch_Pad.png | Bin 0 -> 1422 bytes .../icons/PS5_Touch_Pad.png.import | 34 ++ .../playstation/icons/PS5_Triangle.png | Bin 0 -> 4722 bytes .../playstation/icons/PS5_Triangle.png.import | 34 ++ .../playstation_controller_renderer.tscn | 101 +++++ .../controllers/switch/icons/Switch_A.png | Bin 0 -> 3780 bytes .../switch/icons/Switch_A.png.import | 34 ++ .../controllers/switch/icons/Switch_B.png | Bin 0 -> 3788 bytes .../switch/icons/Switch_B.png.import | 34 ++ .../switch/icons/Switch_Controller_Left.png | Bin 0 -> 1496 bytes .../icons/Switch_Controller_Left.png.import | 34 ++ .../switch/icons/Switch_Controller_Right.png | Bin 0 -> 1190 bytes .../icons/Switch_Controller_Right.png.import | 34 ++ .../switch/icons/Switch_Controllers.png | Bin 0 -> 1836 bytes .../icons/Switch_Controllers.png.import | 34 ++ .../icons/Switch_Controllers_Separate.png | Bin 0 -> 2069 bytes .../Switch_Controllers_Separate.png.import | 34 ++ .../controllers/switch/icons/Switch_Down.png | Bin 0 -> 3578 bytes .../switch/icons/Switch_Down.png.import | 34 ++ .../controllers/switch/icons/Switch_Dpad.png | Bin 0 -> 2082 bytes .../switch/icons/Switch_Dpad.png.import | 34 ++ .../switch/icons/Switch_Dpad_Down.png | Bin 0 -> 2379 bytes .../switch/icons/Switch_Dpad_Down.png.import | 34 ++ .../switch/icons/Switch_Dpad_Left.png | Bin 0 -> 2408 bytes .../switch/icons/Switch_Dpad_Left.png.import | 34 ++ .../switch/icons/Switch_Dpad_Right.png | Bin 0 -> 2397 bytes .../switch/icons/Switch_Dpad_Right.png.import | 34 ++ .../switch/icons/Switch_Dpad_Up.png | Bin 0 -> 2418 bytes .../switch/icons/Switch_Dpad_Up.png.import | 34 ++ .../controllers/switch/icons/Switch_Home.png | Bin 0 -> 4631 bytes .../switch/icons/Switch_Home.png.import | 34 ++ .../controllers/switch/icons/Switch_LB.png | Bin 0 -> 2799 bytes .../switch/icons/Switch_LB.png.import | 34 ++ .../controllers/switch/icons/Switch_LT.png | Bin 0 -> 2808 bytes .../switch/icons/Switch_LT.png.import | 34 ++ .../controllers/switch/icons/Switch_Left.png | Bin 0 -> 3586 bytes .../switch/icons/Switch_Left.png.import | 34 ++ .../switch/icons/Switch_Left_Stick.png | Bin 0 -> 4299 bytes .../switch/icons/Switch_Left_Stick.png.import | 34 ++ .../switch/icons/Switch_Left_Stick_Click.png | Bin 0 -> 3046 bytes .../icons/Switch_Left_Stick_Click.png.import | 34 ++ .../controllers/switch/icons/Switch_Minus.png | Bin 0 -> 356 bytes .../switch/icons/Switch_Minus.png.import | 34 ++ .../controllers/switch/icons/Switch_Plus.png | Bin 0 -> 764 bytes .../switch/icons/Switch_Plus.png.import | 34 ++ .../controllers/switch/icons/Switch_RB.png | Bin 0 -> 3306 bytes .../switch/icons/Switch_RB.png.import | 34 ++ .../controllers/switch/icons/Switch_RT.png | Bin 0 -> 3066 bytes .../switch/icons/Switch_RT.png.import | 34 ++ .../controllers/switch/icons/Switch_Right.png | Bin 0 -> 3495 bytes .../switch/icons/Switch_Right.png.import | 34 ++ .../switch/icons/Switch_Right_Stick.png | Bin 0 -> 4578 bytes .../icons/Switch_Right_Stick.png.import | 34 ++ .../switch/icons/Switch_Right_Stick_Click.png | Bin 0 -> 3360 bytes .../icons/Switch_Right_Stick_Click.png.import | 34 ++ .../switch/icons/Switch_Square.png | Bin 0 -> 1891 bytes .../switch/icons/Switch_Square.png.import | 34 ++ .../controllers/switch/icons/Switch_Up.png | Bin 0 -> 3422 bytes .../switch/icons/Switch_Up.png.import | 34 ++ .../controllers/switch/icons/Switch_X.png | Bin 0 -> 4011 bytes .../switch/icons/Switch_X.png.import | 34 ++ .../controllers/switch/icons/Switch_Y.png | Bin 0 -> 3736 bytes .../switch/icons/Switch_Y.png.import | 34 ++ .../switch/switch_controller_renderer.tscn | 101 +++++ .../controllers/xbox/icons/XboxSeriesX_A.png | Bin 0 -> 3912 bytes .../xbox/icons/XboxSeriesX_A.png.import | 34 ++ .../controllers/xbox/icons/XboxSeriesX_B.png | Bin 0 -> 3840 bytes .../xbox/icons/XboxSeriesX_B.png.import | 34 ++ .../xbox/icons/XboxSeriesX_Dpad.png | Bin 0 -> 3226 bytes .../xbox/icons/XboxSeriesX_Dpad.png.import | 34 ++ .../xbox/icons/XboxSeriesX_Dpad_Down.png | Bin 0 -> 3539 bytes .../icons/XboxSeriesX_Dpad_Down.png.import | 34 ++ .../xbox/icons/XboxSeriesX_Dpad_Left.png | Bin 0 -> 3466 bytes .../icons/XboxSeriesX_Dpad_Left.png.import | 34 ++ .../xbox/icons/XboxSeriesX_Dpad_Right.png | Bin 0 -> 3417 bytes .../icons/XboxSeriesX_Dpad_Right.png.import | 34 ++ .../xbox/icons/XboxSeriesX_Dpad_Up.png | Bin 0 -> 3584 bytes .../xbox/icons/XboxSeriesX_Dpad_Up.png.import | 34 ++ .../controllers/xbox/icons/XboxSeriesX_LB.png | Bin 0 -> 2923 bytes .../xbox/icons/XboxSeriesX_LB.png.import | 34 ++ .../controllers/xbox/icons/XboxSeriesX_LT.png | Bin 0 -> 2584 bytes .../xbox/icons/XboxSeriesX_LT.png.import | 34 ++ .../xbox/icons/XboxSeriesX_Left_Stick.png | Bin 0 -> 5196 bytes .../icons/XboxSeriesX_Left_Stick.png.import | 34 ++ .../icons/XboxSeriesX_Left_Stick_Click.png | Bin 0 -> 3006 bytes .../XboxSeriesX_Left_Stick_Click.png.import | 34 ++ .../xbox/icons/XboxSeriesX_Menu.png | Bin 0 -> 3349 bytes .../xbox/icons/XboxSeriesX_Menu.png.import | 34 ++ .../controllers/xbox/icons/XboxSeriesX_RB.png | Bin 0 -> 2779 bytes .../xbox/icons/XboxSeriesX_RB.png.import | 34 ++ .../controllers/xbox/icons/XboxSeriesX_RT.png | Bin 0 -> 2933 bytes .../xbox/icons/XboxSeriesX_RT.png.import | 34 ++ .../xbox/icons/XboxSeriesX_Right_Stick.png | Bin 0 -> 5506 bytes .../icons/XboxSeriesX_Right_Stick.png.import | 34 ++ .../icons/XboxSeriesX_Right_Stick_Click.png | Bin 0 -> 3314 bytes .../XboxSeriesX_Right_Stick_Click.png.import | 34 ++ .../xbox/icons/XboxSeriesX_Share.png | Bin 0 -> 2812 bytes .../xbox/icons/XboxSeriesX_Share.png.import | 34 ++ .../xbox/icons/XboxSeriesX_View.png | Bin 0 -> 3382 bytes .../xbox/icons/XboxSeriesX_View.png.import | 34 ++ .../controllers/xbox/icons/XboxSeriesX_X.png | Bin 0 -> 4065 bytes .../xbox/icons/XboxSeriesX_X.png.import | 34 ++ .../controllers/xbox/icons/XboxSeriesX_Y.png | Bin 0 -> 3819 bytes .../xbox/icons/XboxSeriesX_Y.png.import | 34 ++ .../xbox/xbox_controller_renderer.tscn | 101 +++++ .../ui/renderers/joy/icons/button_empty.png | Bin 0 -> 5164 bytes .../joy/icons/button_empty.png.import | 34 ++ .../ui/renderers/joy/icons/stick_empty.png | Bin 0 -> 6710 bytes .../joy/icons/stick_empty.png.import | 34 ++ addons/guide/ui/renderers/joy/joy_renderer.gd | 69 ++++ .../ui/renderers/joy/joy_renderer.gd.uid | 1 + .../guide/ui/renderers/joy/joy_renderer.tscn | 63 +++ .../ui/renderers/keyboard/Lato-Black.ttf | Bin 0 -> 69500 bytes .../renderers/keyboard/Lato-Black.ttf.import | 35 ++ .../keyboard/icons/Blank_White_Normal.png | Bin 0 -> 1160 bytes .../icons/Blank_White_Normal.png.import | 34 ++ .../ui/renderers/keyboard/key_renderer.gd | 17 + .../ui/renderers/keyboard/key_renderer.gd.uid | 1 + .../ui/renderers/keyboard/key_renderer.tscn | 36 ++ .../ui/renderers/misc/action_renderer.gd | 11 + .../ui/renderers/misc/action_renderer.gd.uid | 1 + .../ui/renderers/misc/action_renderer.tscn | 16 + .../ui/renderers/misc/fallback_renderer.gd | 11 + .../renderers/misc/fallback_renderer.gd.uid | 1 + .../ui/renderers/misc/fallback_renderer.tscn | 20 + .../ui/renderers/mouse/icons/Mouse_Cursor.png | Bin 0 -> 4728 bytes .../mouse/icons/Mouse_Cursor.png.import | 34 ++ .../mouse/icons/Mouse_Left_Key_Light.png | Bin 0 -> 3362 bytes .../icons/Mouse_Left_Key_Light.png.import | 34 ++ .../mouse/icons/Mouse_Middle_Key_Light.png | Bin 0 -> 3242 bytes .../icons/Mouse_Middle_Key_Light.png.import | 34 ++ .../mouse/icons/Mouse_Right_Key_Light.png | Bin 0 -> 3340 bytes .../icons/Mouse_Right_Key_Light.png.import | 34 ++ .../mouse/icons/Mouse_Side_Key_1_Light.png | Bin 0 -> 5584 bytes .../icons/Mouse_Side_Key_1_Light.png.import | 34 ++ .../mouse/icons/Mouse_Side_Key_2_Light.png | Bin 0 -> 5635 bytes .../icons/Mouse_Side_Key_2_Light.png.import | 34 ++ .../mouse/icons/Mouse_Simple_Key_Light.png | Bin 0 -> 3252 bytes .../icons/Mouse_Simple_Key_Light.png.import | 34 ++ .../ui/renderers/mouse/mouse_renderer.gd | 87 ++++ .../ui/renderers/mouse/mouse_renderer.gd.uid | 1 + .../ui/renderers/mouse/mouse_renderer.tscn | 125 ++++++ addons/guide/ui/renderers/textures/action.svg | 10 + .../ui/renderers/textures/action.svg.import | 37 ++ .../textures/arrow_all_directions.svg | 8 + .../textures/arrow_all_directions.svg.import | 37 ++ .../ui/renderers/textures/arrow_down.svg | 8 + .../renderers/textures/arrow_down.svg.import | 37 ++ .../renderers/textures/arrow_horizontal.svg | 8 + .../textures/arrow_horizontal.svg.import | 37 ++ .../ui/renderers/textures/arrow_left.svg | 8 + .../renderers/textures/arrow_left.svg.import | 37 ++ .../ui/renderers/textures/arrow_right.svg | 8 + .../renderers/textures/arrow_right.svg.import | 37 ++ .../guide/ui/renderers/textures/arrow_up.svg | 8 + .../ui/renderers/textures/arrow_up.svg.import | 37 ++ .../ui/renderers/textures/arrow_vertical.svg | 8 + .../textures/arrow_vertical.svg.import | 37 ++ .../renderers/touch/icons/touch_1_finger.png | Bin 0 -> 5698 bytes .../touch/icons/touch_1_finger.png.import | 34 ++ .../renderers/touch/icons/touch_2_fingers.png | Bin 0 -> 6395 bytes .../touch/icons/touch_2_fingers.png.import | 34 ++ .../renderers/touch/icons/touch_3_fingers.png | Bin 0 -> 6746 bytes .../touch/icons/touch_3_fingers.png.import | 34 ++ .../renderers/touch/icons/touch_4_fingers.png | Bin 0 -> 7210 bytes .../touch/icons/touch_4_fingers.png.import | 34 ++ .../ui/renderers/touch/icons/touch_rotate.png | Bin 0 -> 5245 bytes .../touch/icons/touch_rotate.png.import | 34 ++ .../ui/renderers/touch/icons/touch_zoom.png | Bin 0 -> 5053 bytes .../touch/icons/touch_zoom.png.import | 34 ++ .../ui/renderers/touch/touch_renderer.gd | 73 ++++ .../ui/renderers/touch/touch_renderer.gd.uid | 1 + .../ui/renderers/touch/touch_renderer.tscn | 93 +++++ .../controllers/controller_text_provider.gd | 115 ++++++ .../controller_text_provider.gd.uid | 1 + .../playstation_controller_text_provider.gd | 37 ++ ...laystation_controller_text_provider.gd.uid | 1 + .../switch/switch_controller_text_provider.gd | 37 ++ .../switch_controller_text_provider.gd.uid | 1 + .../xbox/xbox_controller_text_provider.gd | 37 ++ .../xbox/xbox_controller_text_provider.gd.uid | 1 + .../text_providers/default_text_provider.gd | 141 +++++++ .../default_text_provider.gd.uid | 1 + .../2d_axis_mapping/2d_axis_mapping.gd | 6 + .../2d_axis_mapping/2d_axis_mapping.gd.uid | 1 + .../2d_axis_mapping/2d_axis_mapping.tscn | 42 ++ .../mapping_contexts/2d_axis_mapping.tres | 115 ++++++ .../mapping_contexts/move.tres | 12 + guide_examples/2d_axis_mapping/player.gd | 10 + guide_examples/2d_axis_mapping/player.gd.uid | 1 + .../action_priority/action_priority.gd | 14 + .../action_priority/action_priority.gd.uid | 1 + .../action_priority/action_priority.tscn | 125 ++++++ .../dpad_spells/dpad_spells.gd | 52 +++ .../dpad_spells/dpad_spells.gd.uid | 1 + .../dpad_spells/dpad_spells.tscn | 56 +++ .../action_priority/icons/enchant-acid-3.png | Bin 0 -> 78361 bytes .../icons/enchant-acid-3.png.import | 34 ++ .../action_priority/icons/enchant-blue-3.png | Bin 0 -> 78298 bytes .../icons/enchant-blue-3.png.import | 34 ++ .../action_priority/icons/enchant-jade-3.png | Bin 0 -> 80121 bytes .../icons/enchant-jade-3.png.import | 34 ++ .../action_priority/icons/enchant-red-3.png | Bin 0 -> 78173 bytes .../icons/enchant-red-3.png.import | 34 ++ .../action_priority/icons/fireball-acid-3.png | Bin 0 -> 88799 bytes .../icons/fireball-acid-3.png.import | 34 ++ .../action_priority/icons/fireball-sky-3.png | Bin 0 -> 91276 bytes .../icons/fireball-sky-3.png.import | 34 ++ .../action_priority/icons/heal-royal-3.png | Bin 0 -> 75737 bytes .../icons/heal-royal-3.png.import | 34 ++ .../action_priority/icons/protect-blue-2.png | Bin 0 -> 96600 bytes .../icons/protect-blue-2.png.import | 34 ++ .../mapping_contexts/action_priority.tres | 263 ++++++++++++ .../mapping_contexts/actions/acid_bolt.tres | 12 + .../actions/acid_enchantment.tres | 13 + .../actions/fire_enchantment.tres | 13 + .../mapping_contexts/actions/heal.tres | 12 + .../actions/healing_enchantment.tres | 12 + .../mapping_contexts/actions/mana_bolt.tres | 12 + .../actions/mana_enchantment.tres | 12 + .../mapping_contexts/actions/shield.tres | 12 + .../actions/spell_toggle.tres | 13 + .../spell_indicator/spell_indicator.gd | 11 + .../spell_indicator/spell_indicator.gd.uid | 1 + .../spell_indicator/spell_indicator.tscn | 79 ++++ guide_examples/combos/combos.gd | 7 + guide_examples/combos/combos.gd.uid | 1 + guide_examples/combos/combos.tscn | 87 ++++ .../mapping_contexts/basic_actions/fire.tres | 13 + .../basic_actions/move_horizontal.tres | 12 + .../basic_actions/move_left.tres | 12 + .../basic_actions/move_right.tres | 12 + .../combo_actions/dash_left.tres | 12 + .../combo_actions/dash_right.tres | 12 + .../combo_actions/fireball_left.tres | 12 + .../combo_actions/fireball_right.tres | 12 + .../combos/mapping_contexts/combos.tres | 299 ++++++++++++++ guide_examples/combos/player.gd | 50 +++ guide_examples/combos/player.gd.uid | 1 + guide_examples/input_contexts/boat.gd | 58 +++ guide_examples/input_contexts/boat.gd.uid | 1 + guide_examples/input_contexts/boat.svg | 10 + guide_examples/input_contexts/boat.svg.import | 37 ++ .../input_contexts/input_contexts.gd | 6 + .../input_contexts/input_contexts.gd.uid | 1 + .../input_contexts/input_contexts.tscn | 194 +++++++++ .../boat_actions/accelerate.tres | 12 + .../mapping_contexts/boat_actions/leave.tres | 12 + .../mapping_contexts/boat_actions/turn.tres | 12 + .../mapping_contexts/boat_context.tres | 142 +++++++ .../mapping_contexts/player_actions/move.tres | 12 + .../mapping_contexts/player_actions/use.tres | 12 + .../mapping_contexts/player_context.tres | 145 +++++++ guide_examples/input_contexts/player.gd | 42 ++ guide_examples/input_contexts/player.gd.uid | 1 + .../input_scheme_switching.gd | 21 + .../input_scheme_switching.gd.uid | 1 + .../input_scheme_switching.tscn | 60 +++ .../mapping_contexts/actions/move.tres | 12 + .../mapping_contexts/actions/shoot.tres | 12 + .../actions/switch_to_joystick.tres | 12 + .../actions/switch_to_keyboard.tres | 13 + .../mapping_contexts/joystick_scheme.tres | 97 +++++ .../mapping_contexts/keyboard_scheme.tres | 175 ++++++++ .../input_scheme_switching/player.gd | 27 ++ .../input_scheme_switching/player.gd.uid | 1 + .../mouse_position_2d/background.gd | 16 + .../mouse_position_2d/background.gd.uid | 1 + .../mouse_position_2d/background.svg | 152 +++++++ .../mouse_position_2d/background.svg.import | 37 ++ guide_examples/mouse_position_2d/camera_2d.gd | 19 + .../mouse_position_2d/camera_2d.gd.uid | 1 + .../mouse_position_2d/godot_head.gd | 15 + .../mouse_position_2d/godot_head.gd.uid | 1 + .../mouse_position_2d/godot_head.tscn | 10 + .../actions/camera_movement.tres | 13 + .../mapping_contexts/actions/camera_zoom.tres | 13 + .../mapping_contexts/actions/cursor.tres | 13 + .../mapping_contexts/actions/spawn.tres | 13 + .../modifiers/zoom_sensitivity.tres | 8 + .../mapping_contexts/mouse_position.tres | 207 ++++++++++ .../mouse_position_2d/mouse_position.gd | 26 ++ .../mouse_position_2d/mouse_position.gd.uid | 1 + .../mouse_position_2d/mouse_position.tscn | 79 ++++ .../mouse_position_3d/camera_control.gd | 42 ++ .../mouse_position_3d/camera_control.gd.uid | 1 + .../mapping_context/actions/camera_move.tres | 13 + .../mapping_context/actions/camera_pitch.tres | 13 + .../actions/camera_toggle.tres | 13 + .../mapping_context/actions/camera_yaw.tres | 13 + .../mapping_context/actions/cursor_3d.tres | 13 + .../mapping_context/actions/select.tres | 13 + .../mapping_context/mouse_position_3d.tres | 270 ++++++++++++ guide_examples/mouse_position_3d/mou4D8E.tmp | 128 ++++++ .../mouse_position_3d/mouse_indicator.gd | 13 + .../mouse_position_3d/mouse_indicator.gd.uid | 1 + .../mouse_position_3d/mouse_position_3d.gd | 7 + .../mouse_position_3d.gd.uid | 1 + .../mouse_position_3d/mouse_position_3d.tscn | 148 +++++++ guide_examples/mouse_position_3d/player.gd | 30 ++ .../mouse_position_3d/player.gd.uid | 1 + guide_examples/quick_start/game.gd | 7 + guide_examples/quick_start/game.gd.uid | 1 + .../mapping_contexts/actions/move.tres | 13 + .../mapping_contexts/actions/say_hi.tres | 13 + .../mapping_contexts/quickstart.tres | 145 +++++++ guide_examples/quick_start/player.gd | 22 + guide_examples/quick_start/player.gd.uid | 1 + guide_examples/quick_start/quick_start.tscn | 32 ++ .../mapping_contexts/binding_controller.tres | 147 +++++++ .../mapping_contexts/binding_keyboard.tres | 76 ++++ .../mapping_contexts/controller.tres | 127 ++++++ .../controller_actions/next_tab.tres | 13 + .../player_movement_stick_invert.tres | 9 + .../controller_actions/previous_tab.tres | 13 + .../switch_to_keyboard.tres | 13 + .../controller_actions/ui_accept.tres | 13 + .../remapping/mapping_contexts/keyboard.tres | 208 ++++++++++ .../switch_to_controller.tres | 13 + .../shared_actions/close_menu.tres | 13 + .../mapping_contexts/shared_actions/fire.tres | 13 + .../shared_actions/open_menu.tres | 13 + .../shared_actions/player_movement_2d.tres | 13 + guide_examples/remapping/player.gd | 24 ++ guide_examples/remapping/player.gd.uid | 1 + guide_examples/remapping/remapping.gd | 57 +++ guide_examples/remapping/remapping.gd.uid | 1 + guide_examples/remapping/remapping.tscn | 67 +++ guide_examples/remapping/ui/binding_row.gd | 29 ++ .../remapping/ui/binding_row.gd.uid | 1 + guide_examples/remapping/ui/binding_row.tscn | 32 ++ .../remapping/ui/binding_section.gd | 18 + .../remapping/ui/binding_section.gd.uid | 1 + .../remapping/ui/binding_section.tscn | 36 ++ .../remapping/ui/remapping_dialog.gd | 198 +++++++++ .../remapping/ui/remapping_dialog.gd.uid | 1 + .../remapping/ui/remapping_dialog.tscn | 224 ++++++++++ guide_examples/remapping/utils.gd | 18 + guide_examples/remapping/utils.gd.uid | 1 + guide_examples/shared/fireball/fireball.gd | 13 + .../shared/fireball/fireball.gd.uid | 1 + guide_examples/shared/fireball/fireball.svg | 7 + .../shared/fireball/fireball.svg.import | 37 ++ guide_examples/shared/fireball/fireball.tscn | 10 + guide_examples/shared/godot_logo.svg | 1 + guide_examples/shared/godot_logo.svg.import | 37 ++ guide_examples/shared/instructions_label.gd | 52 +++ .../shared/instructions_label.gd.uid | 1 + guide_examples/shared/ui_theme.tres | 5 + .../mapping_contexts/move_down.tres | 9 + .../mapping_contexts/move_left.tres | 9 + .../mapping_contexts/move_right.tres | 9 + .../mapping_contexts/move_up.tres | 9 + .../mapping_contexts/simple_input.tres | 111 +++++ guide_examples/simple_input/player.gd | 32 ++ guide_examples/simple_input/player.gd.uid | 1 + guide_examples/simple_input/simple_input.gd | 6 + .../simple_input/simple_input.gd.uid | 1 + guide_examples/simple_input/simple_input.tscn | 53 +++ .../tap_and_hold/mapping_contexts/jump.tres | 11 + .../mapping_contexts/somersault.tres | 9 + .../mapping_contexts/tap_and_hold.tres | 74 ++++ guide_examples/tap_and_hold/player.gd | 30 ++ guide_examples/tap_and_hold/player.gd.uid | 1 + guide_examples/tap_and_hold/tap_and_hold.gd | 6 + .../tap_and_hold/tap_and_hold.gd.uid | 1 + guide_examples/tap_and_hold/tap_and_hold.tscn | 154 +++++++ guide_examples/top_down_shooter/bolt/bolt.gd | 10 + .../top_down_shooter/bolt/bolt.gd.uid | 1 + guide_examples/top_down_shooter/bolt/bolt.png | Bin 0 -> 2550 bytes .../top_down_shooter/bolt/bolt.png.import | 34 ++ .../top_down_shooter/bolt/bolt.tscn | 10 + .../mapping_contexts/controller.tres | 123 ++++++ .../mapping_contexts/fire.tres | 13 + .../mapping_contexts/keyboard_and_mouse.tres | 196 +++++++++ .../mapping_contexts/look_absolute.tres | 13 + .../mapping_contexts/look_relative.tres | 13 + .../mapping_contexts/move.tres | 13 + .../switch_to_controller.tres | 13 + .../switch_to_keyboard_and_mouse.tres | 13 + .../top_down_shooter/player/mrg0000.png | Bin 0 -> 40175 bytes .../player/mrg0000.png.import | 34 ++ .../top_down_shooter/player/player.gd | 46 +++ .../top_down_shooter/player/player.gd.uid | 1 + .../top_down_shooter/top_down_shooter.gd | 20 + .../top_down_shooter/top_down_shooter.gd.uid | 1 + .../top_down_shooter/top_down_shooter.tscn | 138 +++++++ guide_examples/touch/background.gd | 16 + guide_examples/touch/background.gd.uid | 1 + guide_examples/touch/background.svg | 152 +++++++ guide_examples/touch/background.svg.import | 37 ++ guide_examples/touch/camera_2d.gd | 42 ++ guide_examples/touch/camera_2d.gd.uid | 1 + guide_examples/touch/godot_head.gd | 15 + guide_examples/touch/godot_head.gd.uid | 1 + guide_examples/touch/godot_head.tscn | 10 + .../actions/camera_movement.tres | 13 + .../actions/camera_reset.tres | 13 + .../actions/camera_rotation.tres | 13 + .../mapping_contexts/actions/camera_zoom.tres | 13 + .../touch/mapping_contexts/actions/spawn.tres | 13 + .../modifiers/zoom_sensitivity.tres | 8 + .../touch/mapping_contexts/touch.tres | 157 +++++++ .../placement_indicator.gd | 26 ++ .../placement_indicator.gd.uid | 1 + .../placement_indicator.tscn | 27 ++ .../placement_indicator/radial_progress.png | Bin 0 -> 7034 bytes .../radial_progress.png.import | 34 ++ guide_examples/touch/touch.gd | 24 ++ guide_examples/touch/touch.gd.uid | 1 + guide_examples/touch/touch.tscn | 88 ++++ .../actions/player_one_move.tres | 12 + .../actions/player_two_move.tres | 12 + .../modifiers/joystick_deadzone.tres | 8 + guide_examples/two_joysticks/player.gd | 12 + guide_examples/two_joysticks/player.gd.uid | 1 + guide_examples/two_joysticks/two_joysticks.gd | 6 + .../two_joysticks/two_joysticks.gd.uid | 1 + .../two_joysticks/two_joysticks.tres | 56 +++ .../two_joysticks/two_joysticks.tscn | 39 ++ .../mapping_contexts/actions/click.tres | 13 + .../mapping_contexts/actions/cursor_2d.tres | 13 + .../mapping_contexts/virtual_cursor.tres | 80 ++++ .../virtual_cursor/pointable/pointable.gd | 15 + .../virtual_cursor/pointable/pointable.gd.uid | 1 + .../virtual_cursor/pointable/pointable.tscn | 17 + guide_examples/virtual_cursor/pointer.gd | 17 + guide_examples/virtual_cursor/pointer.gd.uid | 1 + guide_examples/virtual_cursor/pointer.svg | 10 + .../virtual_cursor/pointer.svg.import | 37 ++ .../virtual_cursor/virtual_cursor.gd | 7 + .../virtual_cursor/virtual_cursor.gd.uid | 1 + .../virtual_cursor/virtual_cursor.tscn | 80 ++++ main.tscn | 7 +- player_controller/PlayerController.tscn | 12 +- player_controller/Scripts/Mouse.cs | 2 + project.godot | 8 + systems/inputs/input_system.gd | 12 + systems/inputs/input_system.gd.uid | 1 + systems/inputs/walk_mode/move.tres | 14 + .../inputs/walk_mode/rotate_floorplane.tres | 14 + systems/inputs/walk_mode/rotate_y.tres | 14 + systems/inputs/walk_mode/walk_mode.tres | 242 +++++++++++ 683 files changed, 21608 insertions(+), 2 deletions(-) create mode 100644 addons/guide/LICENSE.md create mode 100644 addons/guide/debugger/guide_debugger.gd create mode 100644 addons/guide/debugger/guide_debugger.gd.uid create mode 100644 addons/guide/debugger/guide_debugger.tscn create mode 100644 addons/guide/editor/action_mapping_editor/action_mapping_editor.gd create mode 100644 addons/guide/editor/action_mapping_editor/action_mapping_editor.gd.uid create mode 100644 addons/guide/editor/action_mapping_editor/action_mapping_editor.tscn create mode 100644 addons/guide/editor/action_slot/action_slot.gd create mode 100644 addons/guide/editor/action_slot/action_slot.gd.uid create mode 100644 addons/guide/editor/action_slot/action_slot.tscn create mode 100644 addons/guide/editor/action_slot/action_slot_line_edit.gd create mode 100644 addons/guide/editor/action_slot/action_slot_line_edit.gd.uid create mode 100644 addons/guide/editor/action_slot/action_value_type_axis1d.svg create mode 100644 addons/guide/editor/action_slot/action_value_type_axis1d.svg.import create mode 100644 addons/guide/editor/action_slot/action_value_type_axis2d.svg create mode 100644 addons/guide/editor/action_slot/action_value_type_axis2d.svg.import create mode 100644 addons/guide/editor/action_slot/action_value_type_axis3d.svg create mode 100644 addons/guide/editor/action_slot/action_value_type_axis3d.svg.import create mode 100644 addons/guide/editor/action_slot/action_value_type_bool.svg create mode 100644 addons/guide/editor/action_slot/action_value_type_bool.svg.import create mode 100644 addons/guide/editor/action_slot/missing_action.svg create mode 100644 addons/guide/editor/action_slot/missing_action.svg.import create mode 100644 addons/guide/editor/array_edit/array_edit.gd create mode 100644 addons/guide/editor/array_edit/array_edit.gd.uid create mode 100644 addons/guide/editor/array_edit/array_edit.tscn create mode 100644 addons/guide/editor/array_edit/array_edit_item.gd create mode 100644 addons/guide/editor/array_edit/array_edit_item.gd.uid create mode 100644 addons/guide/editor/array_edit/array_edit_item.tscn create mode 100644 addons/guide/editor/array_edit/dragger.gd create mode 100644 addons/guide/editor/array_edit/dragger.gd.uid create mode 100644 addons/guide/editor/binding_dialog/binding_dialog.gd create mode 100644 addons/guide/editor/binding_dialog/binding_dialog.gd.uid create mode 100644 addons/guide/editor/binding_dialog/binding_dialog.tscn create mode 100644 addons/guide/editor/class_scanner.gd create mode 100644 addons/guide/editor/class_scanner.gd.uid create mode 100644 addons/guide/editor/input_display/input_display.gd create mode 100644 addons/guide/editor/input_display/input_display.gd.uid create mode 100644 addons/guide/editor/input_display/input_display.tscn create mode 100644 addons/guide/editor/input_mapping_editor/input_mapping_editor.gd create mode 100644 addons/guide/editor/input_mapping_editor/input_mapping_editor.gd.uid create mode 100644 addons/guide/editor/input_mapping_editor/input_mapping_editor.tscn create mode 100644 addons/guide/editor/logo_editor_small.svg create mode 100644 addons/guide/editor/logo_editor_small.svg.import create mode 100644 addons/guide/editor/mapping_context_editor/mapping_context_editor.gd create mode 100644 addons/guide/editor/mapping_context_editor/mapping_context_editor.gd.uid create mode 100644 addons/guide/editor/mapping_context_editor/mapping_context_editor.tscn create mode 100644 addons/guide/editor/modifier_slot/modifier_slot.gd create mode 100644 addons/guide/editor/modifier_slot/modifier_slot.gd.uid create mode 100644 addons/guide/editor/modifier_slot/modifier_slot.tscn create mode 100644 addons/guide/editor/resource_slot/resource_slot.gd create mode 100644 addons/guide/editor/resource_slot/resource_slot.gd.uid create mode 100644 addons/guide/editor/trigger_slot/trigger_slot.gd create mode 100644 addons/guide/editor/trigger_slot/trigger_slot.gd.uid create mode 100644 addons/guide/editor/trigger_slot/trigger_slot.tscn create mode 100644 addons/guide/editor/utils.gd create mode 100644 addons/guide/editor/utils.gd.uid create mode 100644 addons/guide/guide.gd create mode 100644 addons/guide/guide.gd.uid create mode 100644 addons/guide/guide_action.gd create mode 100644 addons/guide/guide_action.gd.uid create mode 100644 addons/guide/guide_action.svg create mode 100644 addons/guide/guide_action.svg.import create mode 100644 addons/guide/guide_action_mapping.gd create mode 100644 addons/guide/guide_action_mapping.gd.uid create mode 100644 addons/guide/guide_input_mapping.gd create mode 100644 addons/guide/guide_input_mapping.gd.uid create mode 100644 addons/guide/guide_input_tracker.gd create mode 100644 addons/guide/guide_input_tracker.gd.uid create mode 100644 addons/guide/guide_internal.svg create mode 100644 addons/guide/guide_internal.svg.import create mode 100644 addons/guide/guide_mapping_context.gd create mode 100644 addons/guide/guide_mapping_context.gd.uid create mode 100644 addons/guide/guide_mapping_context.svg create mode 100644 addons/guide/guide_mapping_context.svg.import create mode 100644 addons/guide/guide_reset.gd create mode 100644 addons/guide/guide_reset.gd.uid create mode 100644 addons/guide/guide_set.gd create mode 100644 addons/guide/guide_set.gd.uid create mode 100644 addons/guide/inputs/guide_input.gd create mode 100644 addons/guide/inputs/guide_input.gd.uid create mode 100644 addons/guide/inputs/guide_input.svg create mode 100644 addons/guide/inputs/guide_input.svg.import create mode 100644 addons/guide/inputs/guide_input_action.gd create mode 100644 addons/guide/inputs/guide_input_action.gd.uid create mode 100644 addons/guide/inputs/guide_input_any.gd create mode 100644 addons/guide/inputs/guide_input_any.gd.uid create mode 100644 addons/guide/inputs/guide_input_joy_axis_1d.gd create mode 100644 addons/guide/inputs/guide_input_joy_axis_1d.gd.uid create mode 100644 addons/guide/inputs/guide_input_joy_axis_2d.gd create mode 100644 addons/guide/inputs/guide_input_joy_axis_2d.gd.uid create mode 100644 addons/guide/inputs/guide_input_joy_base.gd create mode 100644 addons/guide/inputs/guide_input_joy_base.gd.uid create mode 100644 addons/guide/inputs/guide_input_joy_button.gd create mode 100644 addons/guide/inputs/guide_input_joy_button.gd.uid create mode 100644 addons/guide/inputs/guide_input_key.gd create mode 100644 addons/guide/inputs/guide_input_key.gd.uid create mode 100644 addons/guide/inputs/guide_input_mouse_axis_1d.gd create mode 100644 addons/guide/inputs/guide_input_mouse_axis_1d.gd.uid create mode 100644 addons/guide/inputs/guide_input_mouse_axis_2d.gd create mode 100644 addons/guide/inputs/guide_input_mouse_axis_2d.gd.uid create mode 100644 addons/guide/inputs/guide_input_mouse_button.gd create mode 100644 addons/guide/inputs/guide_input_mouse_button.gd.uid create mode 100644 addons/guide/inputs/guide_input_mouse_position.gd create mode 100644 addons/guide/inputs/guide_input_mouse_position.gd.uid create mode 100644 addons/guide/inputs/guide_input_state.gd create mode 100644 addons/guide/inputs/guide_input_state.gd.uid create mode 100644 addons/guide/inputs/guide_input_touch_angle.gd create mode 100644 addons/guide/inputs/guide_input_touch_angle.gd.uid create mode 100644 addons/guide/inputs/guide_input_touch_axis_1d.gd create mode 100644 addons/guide/inputs/guide_input_touch_axis_1d.gd.uid create mode 100644 addons/guide/inputs/guide_input_touch_axis_2d.gd create mode 100644 addons/guide/inputs/guide_input_touch_axis_2d.gd.uid create mode 100644 addons/guide/inputs/guide_input_touch_axis_base.gd create mode 100644 addons/guide/inputs/guide_input_touch_axis_base.gd.uid create mode 100644 addons/guide/inputs/guide_input_touch_base.gd create mode 100644 addons/guide/inputs/guide_input_touch_base.gd.uid create mode 100644 addons/guide/inputs/guide_input_touch_distance.gd create mode 100644 addons/guide/inputs/guide_input_touch_distance.gd.uid create mode 100644 addons/guide/inputs/guide_input_touch_position.gd create mode 100644 addons/guide/inputs/guide_input_touch_position.gd.uid create mode 100644 addons/guide/inputs/guide_touch_state.gd.uid create mode 100644 addons/guide/modifiers/guide_modifier.gd create mode 100644 addons/guide/modifiers/guide_modifier.gd.uid create mode 100644 addons/guide/modifiers/guide_modifier.svg create mode 100644 addons/guide/modifiers/guide_modifier.svg.import create mode 100644 addons/guide/modifiers/guide_modifier_3d_coordinates.gd create mode 100644 addons/guide/modifiers/guide_modifier_3d_coordinates.gd.uid create mode 100644 addons/guide/modifiers/guide_modifier_8_way_direction.gd create mode 100644 addons/guide/modifiers/guide_modifier_8_way_direction.gd.uid create mode 100644 addons/guide/modifiers/guide_modifier_canvas_coordinates.gd create mode 100644 addons/guide/modifiers/guide_modifier_canvas_coordinates.gd.uid create mode 100644 addons/guide/modifiers/guide_modifier_curve.gd create mode 100644 addons/guide/modifiers/guide_modifier_curve.gd.uid create mode 100644 addons/guide/modifiers/guide_modifier_deadzone.gd create mode 100644 addons/guide/modifiers/guide_modifier_deadzone.gd.uid create mode 100644 addons/guide/modifiers/guide_modifier_input_swizzle.gd create mode 100644 addons/guide/modifiers/guide_modifier_input_swizzle.gd.uid create mode 100644 addons/guide/modifiers/guide_modifier_map_range.gd create mode 100644 addons/guide/modifiers/guide_modifier_map_range.gd.uid create mode 100644 addons/guide/modifiers/guide_modifier_negate.gd create mode 100644 addons/guide/modifiers/guide_modifier_negate.gd.uid create mode 100644 addons/guide/modifiers/guide_modifier_normalize.gd create mode 100644 addons/guide/modifiers/guide_modifier_normalize.gd.uid create mode 100644 addons/guide/modifiers/guide_modifier_positive_negative.gd create mode 100644 addons/guide/modifiers/guide_modifier_positive_negative.gd.uid create mode 100644 addons/guide/modifiers/guide_modifier_scale.gd create mode 100644 addons/guide/modifiers/guide_modifier_scale.gd.uid create mode 100644 addons/guide/modifiers/guide_modifier_virtual_cursor.gd create mode 100644 addons/guide/modifiers/guide_modifier_virtual_cursor.gd.uid create mode 100644 addons/guide/modifiers/guide_modifier_window_relative.gd create mode 100644 addons/guide/modifiers/guide_modifier_window_relative.gd.uid create mode 100644 addons/guide/plugin.cfg create mode 100644 addons/guide/plugin.gd create mode 100644 addons/guide/plugin.gd.uid create mode 100644 addons/guide/remapping/guide_input_detector.gd create mode 100644 addons/guide/remapping/guide_input_detector.gd.uid create mode 100644 addons/guide/remapping/guide_remapper.gd create mode 100644 addons/guide/remapping/guide_remapper.gd.uid create mode 100644 addons/guide/remapping/guide_remapping_config.gd create mode 100644 addons/guide/remapping/guide_remapping_config.gd.uid create mode 100644 addons/guide/triggers/guide_trigger.gd create mode 100644 addons/guide/triggers/guide_trigger.gd.uid create mode 100644 addons/guide/triggers/guide_trigger.svg create mode 100644 addons/guide/triggers/guide_trigger.svg.import create mode 100644 addons/guide/triggers/guide_trigger_chorded_action.gd create mode 100644 addons/guide/triggers/guide_trigger_chorded_action.gd.uid create mode 100644 addons/guide/triggers/guide_trigger_combo.gd create mode 100644 addons/guide/triggers/guide_trigger_combo.gd.uid create mode 100644 addons/guide/triggers/guide_trigger_combo_cancel_action.gd create mode 100644 addons/guide/triggers/guide_trigger_combo_cancel_action.gd.uid create mode 100644 addons/guide/triggers/guide_trigger_combo_step.gd create mode 100644 addons/guide/triggers/guide_trigger_combo_step.gd.uid create mode 100644 addons/guide/triggers/guide_trigger_down.gd create mode 100644 addons/guide/triggers/guide_trigger_down.gd.uid create mode 100644 addons/guide/triggers/guide_trigger_hold.gd create mode 100644 addons/guide/triggers/guide_trigger_hold.gd.uid create mode 100644 addons/guide/triggers/guide_trigger_pressed.gd create mode 100644 addons/guide/triggers/guide_trigger_pressed.gd.uid create mode 100644 addons/guide/triggers/guide_trigger_pulse.gd create mode 100644 addons/guide/triggers/guide_trigger_pulse.gd.uid create mode 100644 addons/guide/triggers/guide_trigger_released.gd create mode 100644 addons/guide/triggers/guide_trigger_released.gd.uid create mode 100644 addons/guide/triggers/guide_trigger_stability.gd create mode 100644 addons/guide/triggers/guide_trigger_stability.gd.uid create mode 100644 addons/guide/triggers/guide_trigger_tap.gd create mode 100644 addons/guide/triggers/guide_trigger_tap.gd.uid create mode 100644 addons/guide/ui/guide_icon_renderer.gd create mode 100644 addons/guide/ui/guide_icon_renderer.gd.uid create mode 100644 addons/guide/ui/guide_input_formatter.gd create mode 100644 addons/guide/ui/guide_input_formatter.gd.uid create mode 100644 addons/guide/ui/guide_text_provider.gd create mode 100644 addons/guide/ui/guide_text_provider.gd.uid create mode 100644 addons/guide/ui/icon_maker/icon_maker.gd create mode 100644 addons/guide/ui/icon_maker/icon_maker.gd.uid create mode 100644 addons/guide/ui/icon_maker/icon_maker.tscn create mode 100644 addons/guide/ui/renderers/controllers/controller_renderer.gd create mode 100644 addons/guide/ui/renderers/controllers/controller_renderer.gd.uid create mode 100644 addons/guide/ui/renderers/controllers/controller_renderer.tscn create mode 100644 addons/guide/ui/renderers/controllers/playstation/icons/PS5_Circle.png create mode 100644 addons/guide/ui/renderers/controllers/playstation/icons/PS5_Circle.png.import create mode 100644 addons/guide/ui/renderers/controllers/playstation/icons/PS5_Cross.png create mode 100644 addons/guide/ui/renderers/controllers/playstation/icons/PS5_Cross.png.import create mode 100644 addons/guide/ui/renderers/controllers/playstation/icons/PS5_Dpad.png create mode 100644 addons/guide/ui/renderers/controllers/playstation/icons/PS5_Dpad.png.import create mode 100644 addons/guide/ui/renderers/controllers/playstation/icons/PS5_Dpad_Down.png create mode 100644 addons/guide/ui/renderers/controllers/playstation/icons/PS5_Dpad_Down.png.import create mode 100644 addons/guide/ui/renderers/controllers/playstation/icons/PS5_Dpad_Left.png create mode 100644 addons/guide/ui/renderers/controllers/playstation/icons/PS5_Dpad_Left.png.import create mode 100644 addons/guide/ui/renderers/controllers/playstation/icons/PS5_Dpad_Right.png create mode 100644 addons/guide/ui/renderers/controllers/playstation/icons/PS5_Dpad_Right.png.import create mode 100644 addons/guide/ui/renderers/controllers/playstation/icons/PS5_Dpad_Up.png create mode 100644 addons/guide/ui/renderers/controllers/playstation/icons/PS5_Dpad_Up.png.import create mode 100644 addons/guide/ui/renderers/controllers/playstation/icons/PS5_L1.png create mode 100644 addons/guide/ui/renderers/controllers/playstation/icons/PS5_L1.png.import create mode 100644 addons/guide/ui/renderers/controllers/playstation/icons/PS5_L2.png create mode 100644 addons/guide/ui/renderers/controllers/playstation/icons/PS5_L2.png.import create mode 100644 addons/guide/ui/renderers/controllers/playstation/icons/PS5_Left_Stick.png create mode 100644 addons/guide/ui/renderers/controllers/playstation/icons/PS5_Left_Stick.png.import create mode 100644 addons/guide/ui/renderers/controllers/playstation/icons/PS5_Left_Stick_Click.png create mode 100644 addons/guide/ui/renderers/controllers/playstation/icons/PS5_Left_Stick_Click.png.import create mode 100644 addons/guide/ui/renderers/controllers/playstation/icons/PS5_Microphone.png create mode 100644 addons/guide/ui/renderers/controllers/playstation/icons/PS5_Microphone.png.import create mode 100644 addons/guide/ui/renderers/controllers/playstation/icons/PS5_Options.png create mode 100644 addons/guide/ui/renderers/controllers/playstation/icons/PS5_Options.png.import create mode 100644 addons/guide/ui/renderers/controllers/playstation/icons/PS5_Options_Alt.png create mode 100644 addons/guide/ui/renderers/controllers/playstation/icons/PS5_Options_Alt.png.import create mode 100644 addons/guide/ui/renderers/controllers/playstation/icons/PS5_R1.png create mode 100644 addons/guide/ui/renderers/controllers/playstation/icons/PS5_R1.png.import create mode 100644 addons/guide/ui/renderers/controllers/playstation/icons/PS5_R2.png create mode 100644 addons/guide/ui/renderers/controllers/playstation/icons/PS5_R2.png.import create mode 100644 addons/guide/ui/renderers/controllers/playstation/icons/PS5_Right_Stick.png create mode 100644 addons/guide/ui/renderers/controllers/playstation/icons/PS5_Right_Stick.png.import create mode 100644 addons/guide/ui/renderers/controllers/playstation/icons/PS5_Right_Stick_Click.png create mode 100644 addons/guide/ui/renderers/controllers/playstation/icons/PS5_Right_Stick_Click.png.import create mode 100644 addons/guide/ui/renderers/controllers/playstation/icons/PS5_Share.png create mode 100644 addons/guide/ui/renderers/controllers/playstation/icons/PS5_Share.png.import create mode 100644 addons/guide/ui/renderers/controllers/playstation/icons/PS5_Share_Alt.png create mode 100644 addons/guide/ui/renderers/controllers/playstation/icons/PS5_Share_Alt.png.import create mode 100644 addons/guide/ui/renderers/controllers/playstation/icons/PS5_Square.png create mode 100644 addons/guide/ui/renderers/controllers/playstation/icons/PS5_Square.png.import create mode 100644 addons/guide/ui/renderers/controllers/playstation/icons/PS5_Touch_Pad.png create mode 100644 addons/guide/ui/renderers/controllers/playstation/icons/PS5_Touch_Pad.png.import create mode 100644 addons/guide/ui/renderers/controllers/playstation/icons/PS5_Triangle.png create mode 100644 addons/guide/ui/renderers/controllers/playstation/icons/PS5_Triangle.png.import create mode 100644 addons/guide/ui/renderers/controllers/playstation/playstation_controller_renderer.tscn create mode 100644 addons/guide/ui/renderers/controllers/switch/icons/Switch_A.png create mode 100644 addons/guide/ui/renderers/controllers/switch/icons/Switch_A.png.import create mode 100644 addons/guide/ui/renderers/controllers/switch/icons/Switch_B.png create mode 100644 addons/guide/ui/renderers/controllers/switch/icons/Switch_B.png.import create mode 100644 addons/guide/ui/renderers/controllers/switch/icons/Switch_Controller_Left.png create mode 100644 addons/guide/ui/renderers/controllers/switch/icons/Switch_Controller_Left.png.import create mode 100644 addons/guide/ui/renderers/controllers/switch/icons/Switch_Controller_Right.png create mode 100644 addons/guide/ui/renderers/controllers/switch/icons/Switch_Controller_Right.png.import create mode 100644 addons/guide/ui/renderers/controllers/switch/icons/Switch_Controllers.png create mode 100644 addons/guide/ui/renderers/controllers/switch/icons/Switch_Controllers.png.import create mode 100644 addons/guide/ui/renderers/controllers/switch/icons/Switch_Controllers_Separate.png create mode 100644 addons/guide/ui/renderers/controllers/switch/icons/Switch_Controllers_Separate.png.import create mode 100644 addons/guide/ui/renderers/controllers/switch/icons/Switch_Down.png create mode 100644 addons/guide/ui/renderers/controllers/switch/icons/Switch_Down.png.import create mode 100644 addons/guide/ui/renderers/controllers/switch/icons/Switch_Dpad.png create mode 100644 addons/guide/ui/renderers/controllers/switch/icons/Switch_Dpad.png.import create mode 100644 addons/guide/ui/renderers/controllers/switch/icons/Switch_Dpad_Down.png create mode 100644 addons/guide/ui/renderers/controllers/switch/icons/Switch_Dpad_Down.png.import create mode 100644 addons/guide/ui/renderers/controllers/switch/icons/Switch_Dpad_Left.png create mode 100644 addons/guide/ui/renderers/controllers/switch/icons/Switch_Dpad_Left.png.import create mode 100644 addons/guide/ui/renderers/controllers/switch/icons/Switch_Dpad_Right.png create mode 100644 addons/guide/ui/renderers/controllers/switch/icons/Switch_Dpad_Right.png.import create mode 100644 addons/guide/ui/renderers/controllers/switch/icons/Switch_Dpad_Up.png create mode 100644 addons/guide/ui/renderers/controllers/switch/icons/Switch_Dpad_Up.png.import create mode 100644 addons/guide/ui/renderers/controllers/switch/icons/Switch_Home.png create mode 100644 addons/guide/ui/renderers/controllers/switch/icons/Switch_Home.png.import create mode 100644 addons/guide/ui/renderers/controllers/switch/icons/Switch_LB.png create mode 100644 addons/guide/ui/renderers/controllers/switch/icons/Switch_LB.png.import create mode 100644 addons/guide/ui/renderers/controllers/switch/icons/Switch_LT.png create mode 100644 addons/guide/ui/renderers/controllers/switch/icons/Switch_LT.png.import create mode 100644 addons/guide/ui/renderers/controllers/switch/icons/Switch_Left.png create mode 100644 addons/guide/ui/renderers/controllers/switch/icons/Switch_Left.png.import create mode 100644 addons/guide/ui/renderers/controllers/switch/icons/Switch_Left_Stick.png create mode 100644 addons/guide/ui/renderers/controllers/switch/icons/Switch_Left_Stick.png.import create mode 100644 addons/guide/ui/renderers/controllers/switch/icons/Switch_Left_Stick_Click.png create mode 100644 addons/guide/ui/renderers/controllers/switch/icons/Switch_Left_Stick_Click.png.import create mode 100644 addons/guide/ui/renderers/controllers/switch/icons/Switch_Minus.png create mode 100644 addons/guide/ui/renderers/controllers/switch/icons/Switch_Minus.png.import create mode 100644 addons/guide/ui/renderers/controllers/switch/icons/Switch_Plus.png create mode 100644 addons/guide/ui/renderers/controllers/switch/icons/Switch_Plus.png.import create mode 100644 addons/guide/ui/renderers/controllers/switch/icons/Switch_RB.png create mode 100644 addons/guide/ui/renderers/controllers/switch/icons/Switch_RB.png.import create mode 100644 addons/guide/ui/renderers/controllers/switch/icons/Switch_RT.png create mode 100644 addons/guide/ui/renderers/controllers/switch/icons/Switch_RT.png.import create mode 100644 addons/guide/ui/renderers/controllers/switch/icons/Switch_Right.png create mode 100644 addons/guide/ui/renderers/controllers/switch/icons/Switch_Right.png.import create mode 100644 addons/guide/ui/renderers/controllers/switch/icons/Switch_Right_Stick.png create mode 100644 addons/guide/ui/renderers/controllers/switch/icons/Switch_Right_Stick.png.import create mode 100644 addons/guide/ui/renderers/controllers/switch/icons/Switch_Right_Stick_Click.png create mode 100644 addons/guide/ui/renderers/controllers/switch/icons/Switch_Right_Stick_Click.png.import create mode 100644 addons/guide/ui/renderers/controllers/switch/icons/Switch_Square.png create mode 100644 addons/guide/ui/renderers/controllers/switch/icons/Switch_Square.png.import create mode 100644 addons/guide/ui/renderers/controllers/switch/icons/Switch_Up.png create mode 100644 addons/guide/ui/renderers/controllers/switch/icons/Switch_Up.png.import create mode 100644 addons/guide/ui/renderers/controllers/switch/icons/Switch_X.png create mode 100644 addons/guide/ui/renderers/controllers/switch/icons/Switch_X.png.import create mode 100644 addons/guide/ui/renderers/controllers/switch/icons/Switch_Y.png create mode 100644 addons/guide/ui/renderers/controllers/switch/icons/Switch_Y.png.import create mode 100644 addons/guide/ui/renderers/controllers/switch/switch_controller_renderer.tscn create mode 100644 addons/guide/ui/renderers/controllers/xbox/icons/XboxSeriesX_A.png create mode 100644 addons/guide/ui/renderers/controllers/xbox/icons/XboxSeriesX_A.png.import create mode 100644 addons/guide/ui/renderers/controllers/xbox/icons/XboxSeriesX_B.png create mode 100644 addons/guide/ui/renderers/controllers/xbox/icons/XboxSeriesX_B.png.import create mode 100644 addons/guide/ui/renderers/controllers/xbox/icons/XboxSeriesX_Dpad.png create mode 100644 addons/guide/ui/renderers/controllers/xbox/icons/XboxSeriesX_Dpad.png.import create mode 100644 addons/guide/ui/renderers/controllers/xbox/icons/XboxSeriesX_Dpad_Down.png create mode 100644 addons/guide/ui/renderers/controllers/xbox/icons/XboxSeriesX_Dpad_Down.png.import create mode 100644 addons/guide/ui/renderers/controllers/xbox/icons/XboxSeriesX_Dpad_Left.png create mode 100644 addons/guide/ui/renderers/controllers/xbox/icons/XboxSeriesX_Dpad_Left.png.import create mode 100644 addons/guide/ui/renderers/controllers/xbox/icons/XboxSeriesX_Dpad_Right.png create mode 100644 addons/guide/ui/renderers/controllers/xbox/icons/XboxSeriesX_Dpad_Right.png.import create mode 100644 addons/guide/ui/renderers/controllers/xbox/icons/XboxSeriesX_Dpad_Up.png create mode 100644 addons/guide/ui/renderers/controllers/xbox/icons/XboxSeriesX_Dpad_Up.png.import create mode 100644 addons/guide/ui/renderers/controllers/xbox/icons/XboxSeriesX_LB.png create mode 100644 addons/guide/ui/renderers/controllers/xbox/icons/XboxSeriesX_LB.png.import create mode 100644 addons/guide/ui/renderers/controllers/xbox/icons/XboxSeriesX_LT.png create mode 100644 addons/guide/ui/renderers/controllers/xbox/icons/XboxSeriesX_LT.png.import create mode 100644 addons/guide/ui/renderers/controllers/xbox/icons/XboxSeriesX_Left_Stick.png create mode 100644 addons/guide/ui/renderers/controllers/xbox/icons/XboxSeriesX_Left_Stick.png.import create mode 100644 addons/guide/ui/renderers/controllers/xbox/icons/XboxSeriesX_Left_Stick_Click.png create mode 100644 addons/guide/ui/renderers/controllers/xbox/icons/XboxSeriesX_Left_Stick_Click.png.import create mode 100644 addons/guide/ui/renderers/controllers/xbox/icons/XboxSeriesX_Menu.png create mode 100644 addons/guide/ui/renderers/controllers/xbox/icons/XboxSeriesX_Menu.png.import create mode 100644 addons/guide/ui/renderers/controllers/xbox/icons/XboxSeriesX_RB.png create mode 100644 addons/guide/ui/renderers/controllers/xbox/icons/XboxSeriesX_RB.png.import create mode 100644 addons/guide/ui/renderers/controllers/xbox/icons/XboxSeriesX_RT.png create mode 100644 addons/guide/ui/renderers/controllers/xbox/icons/XboxSeriesX_RT.png.import create mode 100644 addons/guide/ui/renderers/controllers/xbox/icons/XboxSeriesX_Right_Stick.png create mode 100644 addons/guide/ui/renderers/controllers/xbox/icons/XboxSeriesX_Right_Stick.png.import create mode 100644 addons/guide/ui/renderers/controllers/xbox/icons/XboxSeriesX_Right_Stick_Click.png create mode 100644 addons/guide/ui/renderers/controllers/xbox/icons/XboxSeriesX_Right_Stick_Click.png.import create mode 100644 addons/guide/ui/renderers/controllers/xbox/icons/XboxSeriesX_Share.png create mode 100644 addons/guide/ui/renderers/controllers/xbox/icons/XboxSeriesX_Share.png.import create mode 100644 addons/guide/ui/renderers/controllers/xbox/icons/XboxSeriesX_View.png create mode 100644 addons/guide/ui/renderers/controllers/xbox/icons/XboxSeriesX_View.png.import create mode 100644 addons/guide/ui/renderers/controllers/xbox/icons/XboxSeriesX_X.png create mode 100644 addons/guide/ui/renderers/controllers/xbox/icons/XboxSeriesX_X.png.import create mode 100644 addons/guide/ui/renderers/controllers/xbox/icons/XboxSeriesX_Y.png create mode 100644 addons/guide/ui/renderers/controllers/xbox/icons/XboxSeriesX_Y.png.import create mode 100644 addons/guide/ui/renderers/controllers/xbox/xbox_controller_renderer.tscn create mode 100644 addons/guide/ui/renderers/joy/icons/button_empty.png create mode 100644 addons/guide/ui/renderers/joy/icons/button_empty.png.import create mode 100644 addons/guide/ui/renderers/joy/icons/stick_empty.png create mode 100644 addons/guide/ui/renderers/joy/icons/stick_empty.png.import create mode 100644 addons/guide/ui/renderers/joy/joy_renderer.gd create mode 100644 addons/guide/ui/renderers/joy/joy_renderer.gd.uid create mode 100644 addons/guide/ui/renderers/joy/joy_renderer.tscn create mode 100644 addons/guide/ui/renderers/keyboard/Lato-Black.ttf create mode 100644 addons/guide/ui/renderers/keyboard/Lato-Black.ttf.import create mode 100644 addons/guide/ui/renderers/keyboard/icons/Blank_White_Normal.png create mode 100644 addons/guide/ui/renderers/keyboard/icons/Blank_White_Normal.png.import create mode 100644 addons/guide/ui/renderers/keyboard/key_renderer.gd create mode 100644 addons/guide/ui/renderers/keyboard/key_renderer.gd.uid create mode 100644 addons/guide/ui/renderers/keyboard/key_renderer.tscn create mode 100644 addons/guide/ui/renderers/misc/action_renderer.gd create mode 100644 addons/guide/ui/renderers/misc/action_renderer.gd.uid create mode 100644 addons/guide/ui/renderers/misc/action_renderer.tscn create mode 100644 addons/guide/ui/renderers/misc/fallback_renderer.gd create mode 100644 addons/guide/ui/renderers/misc/fallback_renderer.gd.uid create mode 100644 addons/guide/ui/renderers/misc/fallback_renderer.tscn create mode 100644 addons/guide/ui/renderers/mouse/icons/Mouse_Cursor.png create mode 100644 addons/guide/ui/renderers/mouse/icons/Mouse_Cursor.png.import create mode 100644 addons/guide/ui/renderers/mouse/icons/Mouse_Left_Key_Light.png create mode 100644 addons/guide/ui/renderers/mouse/icons/Mouse_Left_Key_Light.png.import create mode 100644 addons/guide/ui/renderers/mouse/icons/Mouse_Middle_Key_Light.png create mode 100644 addons/guide/ui/renderers/mouse/icons/Mouse_Middle_Key_Light.png.import create mode 100644 addons/guide/ui/renderers/mouse/icons/Mouse_Right_Key_Light.png create mode 100644 addons/guide/ui/renderers/mouse/icons/Mouse_Right_Key_Light.png.import create mode 100644 addons/guide/ui/renderers/mouse/icons/Mouse_Side_Key_1_Light.png create mode 100644 addons/guide/ui/renderers/mouse/icons/Mouse_Side_Key_1_Light.png.import create mode 100644 addons/guide/ui/renderers/mouse/icons/Mouse_Side_Key_2_Light.png create mode 100644 addons/guide/ui/renderers/mouse/icons/Mouse_Side_Key_2_Light.png.import create mode 100644 addons/guide/ui/renderers/mouse/icons/Mouse_Simple_Key_Light.png create mode 100644 addons/guide/ui/renderers/mouse/icons/Mouse_Simple_Key_Light.png.import create mode 100644 addons/guide/ui/renderers/mouse/mouse_renderer.gd create mode 100644 addons/guide/ui/renderers/mouse/mouse_renderer.gd.uid create mode 100644 addons/guide/ui/renderers/mouse/mouse_renderer.tscn create mode 100644 addons/guide/ui/renderers/textures/action.svg create mode 100644 addons/guide/ui/renderers/textures/action.svg.import create mode 100644 addons/guide/ui/renderers/textures/arrow_all_directions.svg create mode 100644 addons/guide/ui/renderers/textures/arrow_all_directions.svg.import create mode 100644 addons/guide/ui/renderers/textures/arrow_down.svg create mode 100644 addons/guide/ui/renderers/textures/arrow_down.svg.import create mode 100644 addons/guide/ui/renderers/textures/arrow_horizontal.svg create mode 100644 addons/guide/ui/renderers/textures/arrow_horizontal.svg.import create mode 100644 addons/guide/ui/renderers/textures/arrow_left.svg create mode 100644 addons/guide/ui/renderers/textures/arrow_left.svg.import create mode 100644 addons/guide/ui/renderers/textures/arrow_right.svg create mode 100644 addons/guide/ui/renderers/textures/arrow_right.svg.import create mode 100644 addons/guide/ui/renderers/textures/arrow_up.svg create mode 100644 addons/guide/ui/renderers/textures/arrow_up.svg.import create mode 100644 addons/guide/ui/renderers/textures/arrow_vertical.svg create mode 100644 addons/guide/ui/renderers/textures/arrow_vertical.svg.import create mode 100644 addons/guide/ui/renderers/touch/icons/touch_1_finger.png create mode 100644 addons/guide/ui/renderers/touch/icons/touch_1_finger.png.import create mode 100644 addons/guide/ui/renderers/touch/icons/touch_2_fingers.png create mode 100644 addons/guide/ui/renderers/touch/icons/touch_2_fingers.png.import create mode 100644 addons/guide/ui/renderers/touch/icons/touch_3_fingers.png create mode 100644 addons/guide/ui/renderers/touch/icons/touch_3_fingers.png.import create mode 100644 addons/guide/ui/renderers/touch/icons/touch_4_fingers.png create mode 100644 addons/guide/ui/renderers/touch/icons/touch_4_fingers.png.import create mode 100644 addons/guide/ui/renderers/touch/icons/touch_rotate.png create mode 100644 addons/guide/ui/renderers/touch/icons/touch_rotate.png.import create mode 100644 addons/guide/ui/renderers/touch/icons/touch_zoom.png create mode 100644 addons/guide/ui/renderers/touch/icons/touch_zoom.png.import create mode 100644 addons/guide/ui/renderers/touch/touch_renderer.gd create mode 100644 addons/guide/ui/renderers/touch/touch_renderer.gd.uid create mode 100644 addons/guide/ui/renderers/touch/touch_renderer.tscn create mode 100644 addons/guide/ui/text_providers/controllers/controller_text_provider.gd create mode 100644 addons/guide/ui/text_providers/controllers/controller_text_provider.gd.uid create mode 100644 addons/guide/ui/text_providers/controllers/playstation/playstation_controller_text_provider.gd create mode 100644 addons/guide/ui/text_providers/controllers/playstation/playstation_controller_text_provider.gd.uid create mode 100644 addons/guide/ui/text_providers/controllers/switch/switch_controller_text_provider.gd create mode 100644 addons/guide/ui/text_providers/controllers/switch/switch_controller_text_provider.gd.uid create mode 100644 addons/guide/ui/text_providers/controllers/xbox/xbox_controller_text_provider.gd create mode 100644 addons/guide/ui/text_providers/controllers/xbox/xbox_controller_text_provider.gd.uid create mode 100644 addons/guide/ui/text_providers/default_text_provider.gd create mode 100644 addons/guide/ui/text_providers/default_text_provider.gd.uid create mode 100644 guide_examples/2d_axis_mapping/2d_axis_mapping.gd create mode 100644 guide_examples/2d_axis_mapping/2d_axis_mapping.gd.uid create mode 100644 guide_examples/2d_axis_mapping/2d_axis_mapping.tscn create mode 100644 guide_examples/2d_axis_mapping/mapping_contexts/2d_axis_mapping.tres create mode 100644 guide_examples/2d_axis_mapping/mapping_contexts/move.tres create mode 100644 guide_examples/2d_axis_mapping/player.gd create mode 100644 guide_examples/2d_axis_mapping/player.gd.uid create mode 100644 guide_examples/action_priority/action_priority.gd create mode 100644 guide_examples/action_priority/action_priority.gd.uid create mode 100644 guide_examples/action_priority/action_priority.tscn create mode 100644 guide_examples/action_priority/dpad_spells/dpad_spells.gd create mode 100644 guide_examples/action_priority/dpad_spells/dpad_spells.gd.uid create mode 100644 guide_examples/action_priority/dpad_spells/dpad_spells.tscn create mode 100644 guide_examples/action_priority/icons/enchant-acid-3.png create mode 100644 guide_examples/action_priority/icons/enchant-acid-3.png.import create mode 100644 guide_examples/action_priority/icons/enchant-blue-3.png create mode 100644 guide_examples/action_priority/icons/enchant-blue-3.png.import create mode 100644 guide_examples/action_priority/icons/enchant-jade-3.png create mode 100644 guide_examples/action_priority/icons/enchant-jade-3.png.import create mode 100644 guide_examples/action_priority/icons/enchant-red-3.png create mode 100644 guide_examples/action_priority/icons/enchant-red-3.png.import create mode 100644 guide_examples/action_priority/icons/fireball-acid-3.png create mode 100644 guide_examples/action_priority/icons/fireball-acid-3.png.import create mode 100644 guide_examples/action_priority/icons/fireball-sky-3.png create mode 100644 guide_examples/action_priority/icons/fireball-sky-3.png.import create mode 100644 guide_examples/action_priority/icons/heal-royal-3.png create mode 100644 guide_examples/action_priority/icons/heal-royal-3.png.import create mode 100644 guide_examples/action_priority/icons/protect-blue-2.png create mode 100644 guide_examples/action_priority/icons/protect-blue-2.png.import create mode 100644 guide_examples/action_priority/mapping_contexts/action_priority.tres create mode 100644 guide_examples/action_priority/mapping_contexts/actions/acid_bolt.tres create mode 100644 guide_examples/action_priority/mapping_contexts/actions/acid_enchantment.tres create mode 100644 guide_examples/action_priority/mapping_contexts/actions/fire_enchantment.tres create mode 100644 guide_examples/action_priority/mapping_contexts/actions/heal.tres create mode 100644 guide_examples/action_priority/mapping_contexts/actions/healing_enchantment.tres create mode 100644 guide_examples/action_priority/mapping_contexts/actions/mana_bolt.tres create mode 100644 guide_examples/action_priority/mapping_contexts/actions/mana_enchantment.tres create mode 100644 guide_examples/action_priority/mapping_contexts/actions/shield.tres create mode 100644 guide_examples/action_priority/mapping_contexts/actions/spell_toggle.tres create mode 100644 guide_examples/action_priority/spell_indicator/spell_indicator.gd create mode 100644 guide_examples/action_priority/spell_indicator/spell_indicator.gd.uid create mode 100644 guide_examples/action_priority/spell_indicator/spell_indicator.tscn create mode 100644 guide_examples/combos/combos.gd create mode 100644 guide_examples/combos/combos.gd.uid create mode 100644 guide_examples/combos/combos.tscn create mode 100644 guide_examples/combos/mapping_contexts/basic_actions/fire.tres create mode 100644 guide_examples/combos/mapping_contexts/basic_actions/move_horizontal.tres create mode 100644 guide_examples/combos/mapping_contexts/basic_actions/move_left.tres create mode 100644 guide_examples/combos/mapping_contexts/basic_actions/move_right.tres create mode 100644 guide_examples/combos/mapping_contexts/combo_actions/dash_left.tres create mode 100644 guide_examples/combos/mapping_contexts/combo_actions/dash_right.tres create mode 100644 guide_examples/combos/mapping_contexts/combo_actions/fireball_left.tres create mode 100644 guide_examples/combos/mapping_contexts/combo_actions/fireball_right.tres create mode 100644 guide_examples/combos/mapping_contexts/combos.tres create mode 100644 guide_examples/combos/player.gd create mode 100644 guide_examples/combos/player.gd.uid create mode 100644 guide_examples/input_contexts/boat.gd create mode 100644 guide_examples/input_contexts/boat.gd.uid create mode 100644 guide_examples/input_contexts/boat.svg create mode 100644 guide_examples/input_contexts/boat.svg.import create mode 100644 guide_examples/input_contexts/input_contexts.gd create mode 100644 guide_examples/input_contexts/input_contexts.gd.uid create mode 100644 guide_examples/input_contexts/input_contexts.tscn create mode 100644 guide_examples/input_contexts/mapping_contexts/boat_actions/accelerate.tres create mode 100644 guide_examples/input_contexts/mapping_contexts/boat_actions/leave.tres create mode 100644 guide_examples/input_contexts/mapping_contexts/boat_actions/turn.tres create mode 100644 guide_examples/input_contexts/mapping_contexts/boat_context.tres create mode 100644 guide_examples/input_contexts/mapping_contexts/player_actions/move.tres create mode 100644 guide_examples/input_contexts/mapping_contexts/player_actions/use.tres create mode 100644 guide_examples/input_contexts/mapping_contexts/player_context.tres create mode 100644 guide_examples/input_contexts/player.gd create mode 100644 guide_examples/input_contexts/player.gd.uid create mode 100644 guide_examples/input_scheme_switching/input_scheme_switching.gd create mode 100644 guide_examples/input_scheme_switching/input_scheme_switching.gd.uid create mode 100644 guide_examples/input_scheme_switching/input_scheme_switching.tscn create mode 100644 guide_examples/input_scheme_switching/mapping_contexts/actions/move.tres create mode 100644 guide_examples/input_scheme_switching/mapping_contexts/actions/shoot.tres create mode 100644 guide_examples/input_scheme_switching/mapping_contexts/actions/switch_to_joystick.tres create mode 100644 guide_examples/input_scheme_switching/mapping_contexts/actions/switch_to_keyboard.tres create mode 100644 guide_examples/input_scheme_switching/mapping_contexts/joystick_scheme.tres create mode 100644 guide_examples/input_scheme_switching/mapping_contexts/keyboard_scheme.tres create mode 100644 guide_examples/input_scheme_switching/player.gd create mode 100644 guide_examples/input_scheme_switching/player.gd.uid create mode 100644 guide_examples/mouse_position_2d/background.gd create mode 100644 guide_examples/mouse_position_2d/background.gd.uid create mode 100644 guide_examples/mouse_position_2d/background.svg create mode 100644 guide_examples/mouse_position_2d/background.svg.import create mode 100644 guide_examples/mouse_position_2d/camera_2d.gd create mode 100644 guide_examples/mouse_position_2d/camera_2d.gd.uid create mode 100644 guide_examples/mouse_position_2d/godot_head.gd create mode 100644 guide_examples/mouse_position_2d/godot_head.gd.uid create mode 100644 guide_examples/mouse_position_2d/godot_head.tscn create mode 100644 guide_examples/mouse_position_2d/mapping_contexts/actions/camera_movement.tres create mode 100644 guide_examples/mouse_position_2d/mapping_contexts/actions/camera_zoom.tres create mode 100644 guide_examples/mouse_position_2d/mapping_contexts/actions/cursor.tres create mode 100644 guide_examples/mouse_position_2d/mapping_contexts/actions/spawn.tres create mode 100644 guide_examples/mouse_position_2d/mapping_contexts/modifiers/zoom_sensitivity.tres create mode 100644 guide_examples/mouse_position_2d/mapping_contexts/mouse_position.tres create mode 100644 guide_examples/mouse_position_2d/mouse_position.gd create mode 100644 guide_examples/mouse_position_2d/mouse_position.gd.uid create mode 100644 guide_examples/mouse_position_2d/mouse_position.tscn create mode 100644 guide_examples/mouse_position_3d/camera_control.gd create mode 100644 guide_examples/mouse_position_3d/camera_control.gd.uid create mode 100644 guide_examples/mouse_position_3d/mapping_context/actions/camera_move.tres create mode 100644 guide_examples/mouse_position_3d/mapping_context/actions/camera_pitch.tres create mode 100644 guide_examples/mouse_position_3d/mapping_context/actions/camera_toggle.tres create mode 100644 guide_examples/mouse_position_3d/mapping_context/actions/camera_yaw.tres create mode 100644 guide_examples/mouse_position_3d/mapping_context/actions/cursor_3d.tres create mode 100644 guide_examples/mouse_position_3d/mapping_context/actions/select.tres create mode 100644 guide_examples/mouse_position_3d/mapping_context/mouse_position_3d.tres create mode 100644 guide_examples/mouse_position_3d/mou4D8E.tmp create mode 100644 guide_examples/mouse_position_3d/mouse_indicator.gd create mode 100644 guide_examples/mouse_position_3d/mouse_indicator.gd.uid create mode 100644 guide_examples/mouse_position_3d/mouse_position_3d.gd create mode 100644 guide_examples/mouse_position_3d/mouse_position_3d.gd.uid create mode 100644 guide_examples/mouse_position_3d/mouse_position_3d.tscn create mode 100644 guide_examples/mouse_position_3d/player.gd create mode 100644 guide_examples/mouse_position_3d/player.gd.uid create mode 100644 guide_examples/quick_start/game.gd create mode 100644 guide_examples/quick_start/game.gd.uid create mode 100644 guide_examples/quick_start/mapping_contexts/actions/move.tres create mode 100644 guide_examples/quick_start/mapping_contexts/actions/say_hi.tres create mode 100644 guide_examples/quick_start/mapping_contexts/quickstart.tres create mode 100644 guide_examples/quick_start/player.gd create mode 100644 guide_examples/quick_start/player.gd.uid create mode 100644 guide_examples/quick_start/quick_start.tscn create mode 100644 guide_examples/remapping/mapping_contexts/binding_controller.tres create mode 100644 guide_examples/remapping/mapping_contexts/binding_keyboard.tres create mode 100644 guide_examples/remapping/mapping_contexts/controller.tres create mode 100644 guide_examples/remapping/mapping_contexts/controller_actions/next_tab.tres create mode 100644 guide_examples/remapping/mapping_contexts/controller_actions/player_movement_stick_invert.tres create mode 100644 guide_examples/remapping/mapping_contexts/controller_actions/previous_tab.tres create mode 100644 guide_examples/remapping/mapping_contexts/controller_actions/switch_to_keyboard.tres create mode 100644 guide_examples/remapping/mapping_contexts/controller_actions/ui_accept.tres create mode 100644 guide_examples/remapping/mapping_contexts/keyboard.tres create mode 100644 guide_examples/remapping/mapping_contexts/keyboard_actions/switch_to_controller.tres create mode 100644 guide_examples/remapping/mapping_contexts/shared_actions/close_menu.tres create mode 100644 guide_examples/remapping/mapping_contexts/shared_actions/fire.tres create mode 100644 guide_examples/remapping/mapping_contexts/shared_actions/open_menu.tres create mode 100644 guide_examples/remapping/mapping_contexts/shared_actions/player_movement_2d.tres create mode 100644 guide_examples/remapping/player.gd create mode 100644 guide_examples/remapping/player.gd.uid create mode 100644 guide_examples/remapping/remapping.gd create mode 100644 guide_examples/remapping/remapping.gd.uid create mode 100644 guide_examples/remapping/remapping.tscn create mode 100644 guide_examples/remapping/ui/binding_row.gd create mode 100644 guide_examples/remapping/ui/binding_row.gd.uid create mode 100644 guide_examples/remapping/ui/binding_row.tscn create mode 100644 guide_examples/remapping/ui/binding_section.gd create mode 100644 guide_examples/remapping/ui/binding_section.gd.uid create mode 100644 guide_examples/remapping/ui/binding_section.tscn create mode 100644 guide_examples/remapping/ui/remapping_dialog.gd create mode 100644 guide_examples/remapping/ui/remapping_dialog.gd.uid create mode 100644 guide_examples/remapping/ui/remapping_dialog.tscn create mode 100644 guide_examples/remapping/utils.gd create mode 100644 guide_examples/remapping/utils.gd.uid create mode 100644 guide_examples/shared/fireball/fireball.gd create mode 100644 guide_examples/shared/fireball/fireball.gd.uid create mode 100644 guide_examples/shared/fireball/fireball.svg create mode 100644 guide_examples/shared/fireball/fireball.svg.import create mode 100644 guide_examples/shared/fireball/fireball.tscn create mode 100644 guide_examples/shared/godot_logo.svg create mode 100644 guide_examples/shared/godot_logo.svg.import create mode 100644 guide_examples/shared/instructions_label.gd create mode 100644 guide_examples/shared/instructions_label.gd.uid create mode 100644 guide_examples/shared/ui_theme.tres create mode 100644 guide_examples/simple_input/mapping_contexts/move_down.tres create mode 100644 guide_examples/simple_input/mapping_contexts/move_left.tres create mode 100644 guide_examples/simple_input/mapping_contexts/move_right.tres create mode 100644 guide_examples/simple_input/mapping_contexts/move_up.tres create mode 100644 guide_examples/simple_input/mapping_contexts/simple_input.tres create mode 100644 guide_examples/simple_input/player.gd create mode 100644 guide_examples/simple_input/player.gd.uid create mode 100644 guide_examples/simple_input/simple_input.gd create mode 100644 guide_examples/simple_input/simple_input.gd.uid create mode 100644 guide_examples/simple_input/simple_input.tscn create mode 100644 guide_examples/tap_and_hold/mapping_contexts/jump.tres create mode 100644 guide_examples/tap_and_hold/mapping_contexts/somersault.tres create mode 100644 guide_examples/tap_and_hold/mapping_contexts/tap_and_hold.tres create mode 100644 guide_examples/tap_and_hold/player.gd create mode 100644 guide_examples/tap_and_hold/player.gd.uid create mode 100644 guide_examples/tap_and_hold/tap_and_hold.gd create mode 100644 guide_examples/tap_and_hold/tap_and_hold.gd.uid create mode 100644 guide_examples/tap_and_hold/tap_and_hold.tscn create mode 100644 guide_examples/top_down_shooter/bolt/bolt.gd create mode 100644 guide_examples/top_down_shooter/bolt/bolt.gd.uid create mode 100644 guide_examples/top_down_shooter/bolt/bolt.png create mode 100644 guide_examples/top_down_shooter/bolt/bolt.png.import create mode 100644 guide_examples/top_down_shooter/bolt/bolt.tscn create mode 100644 guide_examples/top_down_shooter/mapping_contexts/controller.tres create mode 100644 guide_examples/top_down_shooter/mapping_contexts/fire.tres create mode 100644 guide_examples/top_down_shooter/mapping_contexts/keyboard_and_mouse.tres create mode 100644 guide_examples/top_down_shooter/mapping_contexts/look_absolute.tres create mode 100644 guide_examples/top_down_shooter/mapping_contexts/look_relative.tres create mode 100644 guide_examples/top_down_shooter/mapping_contexts/move.tres create mode 100644 guide_examples/top_down_shooter/mapping_contexts/switch_to_controller.tres create mode 100644 guide_examples/top_down_shooter/mapping_contexts/switch_to_keyboard_and_mouse.tres create mode 100644 guide_examples/top_down_shooter/player/mrg0000.png create mode 100644 guide_examples/top_down_shooter/player/mrg0000.png.import create mode 100644 guide_examples/top_down_shooter/player/player.gd create mode 100644 guide_examples/top_down_shooter/player/player.gd.uid create mode 100644 guide_examples/top_down_shooter/top_down_shooter.gd create mode 100644 guide_examples/top_down_shooter/top_down_shooter.gd.uid create mode 100644 guide_examples/top_down_shooter/top_down_shooter.tscn create mode 100644 guide_examples/touch/background.gd create mode 100644 guide_examples/touch/background.gd.uid create mode 100644 guide_examples/touch/background.svg create mode 100644 guide_examples/touch/background.svg.import create mode 100644 guide_examples/touch/camera_2d.gd create mode 100644 guide_examples/touch/camera_2d.gd.uid create mode 100644 guide_examples/touch/godot_head.gd create mode 100644 guide_examples/touch/godot_head.gd.uid create mode 100644 guide_examples/touch/godot_head.tscn create mode 100644 guide_examples/touch/mapping_contexts/actions/camera_movement.tres create mode 100644 guide_examples/touch/mapping_contexts/actions/camera_reset.tres create mode 100644 guide_examples/touch/mapping_contexts/actions/camera_rotation.tres create mode 100644 guide_examples/touch/mapping_contexts/actions/camera_zoom.tres create mode 100644 guide_examples/touch/mapping_contexts/actions/spawn.tres create mode 100644 guide_examples/touch/mapping_contexts/modifiers/zoom_sensitivity.tres create mode 100644 guide_examples/touch/mapping_contexts/touch.tres create mode 100644 guide_examples/touch/placement_indicator/placement_indicator.gd create mode 100644 guide_examples/touch/placement_indicator/placement_indicator.gd.uid create mode 100644 guide_examples/touch/placement_indicator/placement_indicator.tscn create mode 100644 guide_examples/touch/placement_indicator/radial_progress.png create mode 100644 guide_examples/touch/placement_indicator/radial_progress.png.import create mode 100644 guide_examples/touch/touch.gd create mode 100644 guide_examples/touch/touch.gd.uid create mode 100644 guide_examples/touch/touch.tscn create mode 100644 guide_examples/two_joysticks/actions/player_one_move.tres create mode 100644 guide_examples/two_joysticks/actions/player_two_move.tres create mode 100644 guide_examples/two_joysticks/modifiers/joystick_deadzone.tres create mode 100644 guide_examples/two_joysticks/player.gd create mode 100644 guide_examples/two_joysticks/player.gd.uid create mode 100644 guide_examples/two_joysticks/two_joysticks.gd create mode 100644 guide_examples/two_joysticks/two_joysticks.gd.uid create mode 100644 guide_examples/two_joysticks/two_joysticks.tres create mode 100644 guide_examples/two_joysticks/two_joysticks.tscn create mode 100644 guide_examples/virtual_cursor/mapping_contexts/actions/click.tres create mode 100644 guide_examples/virtual_cursor/mapping_contexts/actions/cursor_2d.tres create mode 100644 guide_examples/virtual_cursor/mapping_contexts/virtual_cursor.tres create mode 100644 guide_examples/virtual_cursor/pointable/pointable.gd create mode 100644 guide_examples/virtual_cursor/pointable/pointable.gd.uid create mode 100644 guide_examples/virtual_cursor/pointable/pointable.tscn create mode 100644 guide_examples/virtual_cursor/pointer.gd create mode 100644 guide_examples/virtual_cursor/pointer.gd.uid create mode 100644 guide_examples/virtual_cursor/pointer.svg create mode 100644 guide_examples/virtual_cursor/pointer.svg.import create mode 100644 guide_examples/virtual_cursor/virtual_cursor.gd create mode 100644 guide_examples/virtual_cursor/virtual_cursor.gd.uid create mode 100644 guide_examples/virtual_cursor/virtual_cursor.tscn create mode 100644 systems/inputs/input_system.gd create mode 100644 systems/inputs/input_system.gd.uid create mode 100644 systems/inputs/walk_mode/move.tres create mode 100644 systems/inputs/walk_mode/rotate_floorplane.tres create mode 100644 systems/inputs/walk_mode/rotate_y.tres create mode 100644 systems/inputs/walk_mode/walk_mode.tres diff --git a/addons/guide/LICENSE.md b/addons/guide/LICENSE.md new file mode 100644 index 0000000..7510144 --- /dev/null +++ b/addons/guide/LICENSE.md @@ -0,0 +1,19 @@ +Copyright (c) 2024-present Jan Thomä + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/addons/guide/debugger/guide_debugger.gd b/addons/guide/debugger/guide_debugger.gd new file mode 100644 index 0000000..346a5d1 --- /dev/null +++ b/addons/guide/debugger/guide_debugger.gd @@ -0,0 +1,104 @@ +extends MarginContainer + +@onready var _actions:Container = %Actions +@onready var _inputs:Container = %Inputs +@onready var _priorities:Container = %Priorities +@onready var _formatter:GUIDEInputFormatter = GUIDEInputFormatter.for_active_contexts() + + +func _ready(): + process_mode = Node.PROCESS_MODE_ALWAYS + GUIDE.input_mappings_changed.connect(_update_priorities) + _update_priorities() + +func _process(delta): + if not is_visible_in_tree(): + return + + var index:int = 0 + for mapping in GUIDE._active_action_mappings: + var action:GUIDEAction = mapping.action + + var action_name:String = action.name + if action_name == "": + action_name = action._editor_name() + + var action_state:String = "" + match(action._last_state): + GUIDEAction.GUIDEActionState.COMPLETED: + action_state = "Completed" + GUIDEAction.GUIDEActionState.ONGOING: + action_state = "Ongoing" + GUIDEAction.GUIDEActionState.TRIGGERED: + action_state = "Triggered" + + var action_value:String = "" + match(action.action_value_type): + GUIDEAction.GUIDEActionValueType.BOOL: + action_value = str(action.value_bool) + GUIDEAction.GUIDEActionValueType.AXIS_1D: + action_value = str(action.value_axis_1d) + GUIDEAction.GUIDEActionValueType.AXIS_2D: + action_value = str(action.value_axis_2d) + GUIDEAction.GUIDEActionValueType.AXIS_3D: + action_value = str(action.value_axis_3d) + + + + + var label := _get_label(_actions, index) + label.text = "[%s] %s - %s" % [action_name, action_state, action_value] + + index += 1 + + # Clean out all labels we don't need anymore + _cleanup(_actions, index) + + index = 0 + for input in GUIDE._active_inputs: + var input_label = _formatter.input_as_text(input, false) + var input_value:String = str(input._value) + + var label := _get_label(_inputs, index) + label.text = "%s - %s" % [input_label, input_value] + index += 1 + + _cleanup(_inputs, index) + + +func _get_label(container:Container, index:int) -> Label: + var label:Label = null + if container.get_child_count() > index: + # reuse existing label + label = container.get_child(index) + else: + # make a new one + label = Label.new() + label.mouse_filter = Control.MOUSE_FILTER_IGNORE + container.add_child(label) + return label + +func _cleanup(container:Container, index:int) -> void: + while container.get_child_count() > index: + var to_free = container.get_child(index) + container.remove_child(to_free) + to_free.queue_free() + +func _update_priorities(): + # since we don't update these per frame, we can just clear them out and + # rebuild them when mapping contexts change + _cleanup(_priorities, 0) + + for mapping:GUIDEActionMapping in GUIDE._active_action_mappings: + var action := mapping.action + if GUIDE._actions_sharing_input.has(action): + var label := Label.new() + var names = ", ".join(GUIDE._actions_sharing_input[action].map(func(it): return it._editor_name())) + label.text = "[%s] > [%s]" % [action._editor_name(), names] + _priorities.add_child(label) + + + if _priorities.get_child_count() == 0: + var label := Label.new() + label.text = "" + _priorities.add_child(label) diff --git a/addons/guide/debugger/guide_debugger.gd.uid b/addons/guide/debugger/guide_debugger.gd.uid new file mode 100644 index 0000000..3a878a2 --- /dev/null +++ b/addons/guide/debugger/guide_debugger.gd.uid @@ -0,0 +1 @@ +uid://cqfnsis3hhdrv diff --git a/addons/guide/debugger/guide_debugger.tscn b/addons/guide/debugger/guide_debugger.tscn new file mode 100644 index 0000000..0e7caf4 --- /dev/null +++ b/addons/guide/debugger/guide_debugger.tscn @@ -0,0 +1,50 @@ +[gd_scene load_steps=2 format=3 uid="uid://dkr80d2pi0d41"] + +[ext_resource type="Script" path="res://addons/guide/debugger/guide_debugger.gd" id="1_ckdvj"] + +[node name="GuideDebugger" type="MarginContainer"] +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +script = ExtResource("1_ckdvj") + +[node name="VBoxContainer" type="VBoxContainer" parent="."] +layout_mode = 2 +mouse_filter = 2 + +[node name="Label" type="Label" parent="VBoxContainer"] +layout_mode = 2 +text = "G.U.I.D.E - Debugger" + +[node name="Label2" type="Label" parent="VBoxContainer"] +layout_mode = 2 +text = "Actions" + +[node name="Actions" type="VFlowContainer" parent="VBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +size_flags_vertical = 3 +mouse_filter = 2 + +[node name="Label3" type="Label" parent="VBoxContainer"] +layout_mode = 2 +text = "Inputs" + +[node name="Inputs" type="VFlowContainer" parent="VBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +size_flags_vertical = 3 +mouse_filter = 2 + +[node name="Label4" type="Label" parent="VBoxContainer"] +layout_mode = 2 +text = "Action Priority" + +[node name="Priorities" type="VFlowContainer" parent="VBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +size_flags_vertical = 3 +mouse_filter = 2 diff --git a/addons/guide/editor/action_mapping_editor/action_mapping_editor.gd b/addons/guide/editor/action_mapping_editor/action_mapping_editor.gd new file mode 100644 index 0000000..4d8a267 --- /dev/null +++ b/addons/guide/editor/action_mapping_editor/action_mapping_editor.gd @@ -0,0 +1,140 @@ +@tool +extends MarginContainer + +const ActionSlot = preload("../action_slot/action_slot.gd") +const Utils = preload("../utils.gd") +const ArrayEdit = preload("../array_edit/array_edit.gd") + +signal delete_requested() +signal duplicate_requested() + +@export var input_mapping_editor_scene:PackedScene +@onready var _action_slot:ActionSlot = %ActionSlot +@onready var _input_mappings:ArrayEdit = %InputMappings + +const ClassScanner = preload("../class_scanner.gd") + +var _plugin:EditorPlugin +var _scanner:ClassScanner +var _undo_redo:EditorUndoRedoManager + +var _mapping:GUIDEActionMapping + +func _ready(): + _action_slot.action_changed.connect(_on_action_changed) + _input_mappings.delete_requested.connect(_on_input_mapping_delete_requested) + _input_mappings.add_requested.connect(_on_input_mappings_add_requested) + _input_mappings.move_requested.connect(_on_input_mappings_move_requested) + _input_mappings.clear_requested.connect(_on_input_mappings_clear_requested) + _input_mappings.duplicate_requested.connect(_on_input_mappings_duplicate_requested) + _input_mappings.collapse_state_changed.connect(_on_input_mappings_collapse_state_changed) + +func initialize(plugin:EditorPlugin, scanner:ClassScanner): + _plugin = plugin + _scanner = scanner + _undo_redo = _plugin.get_undo_redo() + + +func edit(mapping:GUIDEActionMapping): + assert(_mapping == null) + _mapping = mapping + + _mapping.changed.connect(_update) + + _update() + + +func _update(): + _input_mappings.clear() + + _action_slot.action = _mapping.action + + for i in _mapping.input_mappings.size(): + var input_mapping = _mapping.input_mappings[i] + var input_mapping_editor = input_mapping_editor_scene.instantiate() + _input_mappings.add_item(input_mapping_editor) + + input_mapping_editor.initialize(_plugin, _scanner) + input_mapping_editor.edit(input_mapping) + + _input_mappings.collapsed = _mapping.get_meta("_guide_input_mappings_collapsed", false) + + +func _on_action_changed(): + _undo_redo.create_action("Change action") + _undo_redo.add_do_property(_mapping, "action", _action_slot.action) + _undo_redo.add_undo_property(_mapping, "action", _mapping.action) + _undo_redo.commit_action() + + +func _on_input_mappings_add_requested(): + var values = _mapping.input_mappings.duplicate() + var new_mapping = GUIDEInputMapping.new() + values.append(new_mapping) + + _undo_redo.create_action("Add input mapping") + + _undo_redo.add_do_property(_mapping, "input_mappings", values) + _undo_redo.add_undo_property(_mapping, "input_mappings", _mapping.input_mappings) + + _undo_redo.commit_action() + + +func _on_input_mapping_delete_requested(index:int): + var values = _mapping.input_mappings.duplicate() + values.remove_at(index) + + _undo_redo.create_action("Delete input mapping") + _undo_redo.add_do_property(_mapping, "input_mappings", values) + _undo_redo.add_undo_property(_mapping, "input_mappings", _mapping.input_mappings) + + _undo_redo.commit_action() + + +func _on_input_mappings_move_requested(from:int, to:int): + var values = _mapping.input_mappings.duplicate() + var mapping = values[from] + values.remove_at(from) + if from < to: + to -= 1 + values.insert(to, mapping) + + _undo_redo.create_action("Move input mapping") + _undo_redo.add_do_property(_mapping, "input_mappings", values) + _undo_redo.add_undo_property(_mapping, "input_mappings", _mapping.input_mappings) + + _undo_redo.commit_action() + + +func _on_input_mappings_clear_requested(): + var values:Array[GUIDEInputMapping] = [] + _undo_redo.create_action("Clear input mappings") + _undo_redo.add_do_property(_mapping, "input_mappings", values) + _undo_redo.add_undo_property(_mapping, "input_mappings", _mapping.input_mappings) + + _undo_redo.commit_action() + +func _on_input_mappings_duplicate_requested(index:int): + var values = _mapping.input_mappings.duplicate() + var copy:GUIDEInputMapping = values[index].duplicate() + copy.input = Utils.duplicate_if_inline(copy.input) + + for i in copy.modifiers.size(): + copy.modifiers[i] = Utils.duplicate_if_inline(copy.modifiers[i]) + + for i in copy.triggers.size(): + copy.triggers[i] = Utils.duplicate_if_inline(copy.triggers[i]) + + # insert copy after original + values.insert(index+1, copy) + + _undo_redo.create_action("Duplicate input mapping") + _undo_redo.add_do_property(_mapping, "input_mappings", values) + _undo_redo.add_undo_property(_mapping, "input_mappings", _mapping.input_mappings) + + _undo_redo.commit_action() + + +func _on_input_mappings_collapse_state_changed(new_state:bool): + _mapping.set_meta("_guide_input_mappings_collapsed", new_state) + diff --git a/addons/guide/editor/action_mapping_editor/action_mapping_editor.gd.uid b/addons/guide/editor/action_mapping_editor/action_mapping_editor.gd.uid new file mode 100644 index 0000000..8817bef --- /dev/null +++ b/addons/guide/editor/action_mapping_editor/action_mapping_editor.gd.uid @@ -0,0 +1 @@ +uid://dp8xv83uhxpjo diff --git a/addons/guide/editor/action_mapping_editor/action_mapping_editor.tscn b/addons/guide/editor/action_mapping_editor/action_mapping_editor.tscn new file mode 100644 index 0000000..3730f92 --- /dev/null +++ b/addons/guide/editor/action_mapping_editor/action_mapping_editor.tscn @@ -0,0 +1,43 @@ +[gd_scene load_steps=5 format=3 uid="uid://361aipcef24h"] + +[ext_resource type="Script" path="res://addons/guide/editor/action_mapping_editor/action_mapping_editor.gd" id="1_2k0pi"] +[ext_resource type="PackedScene" uid="uid://du4x7ng6ntuk4" path="res://addons/guide/editor/action_slot/action_slot.tscn" id="1_hguf2"] +[ext_resource type="PackedScene" uid="uid://c323mdijdhktg" path="res://addons/guide/editor/input_mapping_editor/input_mapping_editor.tscn" id="2_a8nbp"] +[ext_resource type="PackedScene" uid="uid://cly0ff32fvpb2" path="res://addons/guide/editor/array_edit/array_edit.tscn" id="4_ehr5j"] + +[node name="ActionMappingEditor" type="MarginContainer"] +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +size_flags_vertical = 0 +theme_override_constants/margin_bottom = 5 +script = ExtResource("1_2k0pi") +input_mapping_editor_scene = ExtResource("2_a8nbp") + +[node name="HBoxContainer" type="HBoxContainer" parent="."] +layout_mode = 2 +size_flags_vertical = 0 + +[node name="HBoxContainer" type="HBoxContainer" parent="HBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 0 + +[node name="ActionSlot" parent="HBoxContainer/HBoxContainer" instance=ExtResource("1_hguf2")] +unique_name_in_owner = true +layout_mode = 2 + +[node name="VBoxContainer" type="VBoxContainer" parent="HBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 0 +size_flags_stretch_ratio = 4.0 + +[node name="InputMappings" parent="HBoxContainer/VBoxContainer" instance=ExtResource("4_ehr5j")] +unique_name_in_owner = true +layout_mode = 2 +title = "Input mappings" +add_tooltip = "Add input mapping" +clear_tooltip = "Clear input mappings" diff --git a/addons/guide/editor/action_slot/action_slot.gd b/addons/guide/editor/action_slot/action_slot.gd new file mode 100644 index 0000000..9c46041 --- /dev/null +++ b/addons/guide/editor/action_slot/action_slot.gd @@ -0,0 +1,70 @@ +@tool +extends Control + +signal action_changed() + +@onready var _line_edit:LineEdit = %LineEdit +@onready var _type_icon:TextureRect = %TypeIcon + +var index:int + +var action:GUIDEAction: + set(value): + if is_instance_valid(action): + action.changed.disconnect(_refresh) + + action = value + + if is_instance_valid(action): + action.changed.connect(_refresh) + + # action_changed can only be emitted by + # dragging an action into this, not when setting + # the property + _refresh() + + +func _refresh(): + if not is_instance_valid(action): + _line_edit.text = "" + _line_edit.tooltip_text = "" + _type_icon.texture = preload("missing_action.svg") + _type_icon.tooltip_text = "Missing action" + else: + _line_edit.text = action._editor_name() + _line_edit.tooltip_text = action.resource_path + ## Update the icon to reflect the given value type. + match action.action_value_type: + GUIDEAction.GUIDEActionValueType.AXIS_1D: + _type_icon.texture = preload("action_value_type_axis1d.svg") + _type_icon.tooltip_text = "Axis1D" + GUIDEAction.GUIDEActionValueType.AXIS_2D: + _type_icon.texture = preload("action_value_type_axis2d.svg") + _type_icon.tooltip_text = "Axis2D" + GUIDEAction.GUIDEActionValueType.AXIS_3D: + _type_icon.texture = preload("action_value_type_axis3d.svg") + _type_icon.tooltip_text = "Axis3D" + _: + # fallback is bool + _type_icon.texture = preload("action_value_type_bool.svg") + _type_icon.tooltip_text = "Boolean" + + + + +func _gui_input(event): + if event is InputEventMouseButton: + if event.pressed and event.button_index == MOUSE_BUTTON_LEFT: + if is_instance_valid(action): + EditorInterface.edit_resource(action) + + + +func _on_line_edit_action_dropped(new_action:GUIDEAction): + action = new_action + action_changed.emit() + + +func _on_line_edit_focus_entered(): + if is_instance_valid(action): + EditorInterface.edit_resource(action) diff --git a/addons/guide/editor/action_slot/action_slot.gd.uid b/addons/guide/editor/action_slot/action_slot.gd.uid new file mode 100644 index 0000000..f84919b --- /dev/null +++ b/addons/guide/editor/action_slot/action_slot.gd.uid @@ -0,0 +1 @@ +uid://ysrbdsqui5cn diff --git a/addons/guide/editor/action_slot/action_slot.tscn b/addons/guide/editor/action_slot/action_slot.tscn new file mode 100644 index 0000000..f48cc53 --- /dev/null +++ b/addons/guide/editor/action_slot/action_slot.tscn @@ -0,0 +1,29 @@ +[gd_scene load_steps=3 format=3 uid="uid://du4x7ng6ntuk4"] + +[ext_resource type="Script" path="res://addons/guide/editor/action_slot/action_slot.gd" id="1_w5nxd"] +[ext_resource type="Script" path="res://addons/guide/editor/action_slot/action_slot_line_edit.gd" id="2_ram7b"] + +[node name="ActionSlot" type="HBoxContainer"] +offset_right = 40.0 +offset_bottom = 40.0 +size_flags_horizontal = 3 +script = ExtResource("1_w5nxd") + +[node name="TypeIcon" type="TextureRect" parent="."] +unique_name_in_owner = true +layout_mode = 2 +expand_mode = 3 +stretch_mode = 4 + +[node name="LineEdit" type="LineEdit" parent="."] +unique_name_in_owner = true +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 0 +text = "Name" +editable = false +selecting_enabled = false +script = ExtResource("2_ram7b") + +[connection signal="action_dropped" from="LineEdit" to="." method="_on_line_edit_action_dropped"] +[connection signal="focus_entered" from="LineEdit" to="." method="_on_line_edit_focus_entered"] diff --git a/addons/guide/editor/action_slot/action_slot_line_edit.gd b/addons/guide/editor/action_slot/action_slot_line_edit.gd new file mode 100644 index 0000000..ee8e8d8 --- /dev/null +++ b/addons/guide/editor/action_slot/action_slot_line_edit.gd @@ -0,0 +1,24 @@ +@tool +extends LineEdit + +signal action_dropped(action:GUIDEAction) + + +func _can_drop_data(at_position, data) -> bool: + if not data is Dictionary: + return false + + if data.has("files"): + for file in data["files"]: + if ResourceLoader.load(file) is GUIDEAction: + return true + + return false + + +func _drop_data(at_position, data) -> void: + for file in data["files"]: + var item = ResourceLoader.load(file) + if item is GUIDEAction: + action_dropped.emit(item) + diff --git a/addons/guide/editor/action_slot/action_slot_line_edit.gd.uid b/addons/guide/editor/action_slot/action_slot_line_edit.gd.uid new file mode 100644 index 0000000..0a59dc6 --- /dev/null +++ b/addons/guide/editor/action_slot/action_slot_line_edit.gd.uid @@ -0,0 +1 @@ +uid://b12uq0dpsgj7u diff --git a/addons/guide/editor/action_slot/action_value_type_axis1d.svg b/addons/guide/editor/action_slot/action_value_type_axis1d.svg new file mode 100644 index 0000000..09c5f34 --- /dev/null +++ b/addons/guide/editor/action_slot/action_value_type_axis1d.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/addons/guide/editor/action_slot/action_value_type_axis1d.svg.import b/addons/guide/editor/action_slot/action_value_type_axis1d.svg.import new file mode 100644 index 0000000..c6339d9 --- /dev/null +++ b/addons/guide/editor/action_slot/action_value_type_axis1d.svg.import @@ -0,0 +1,38 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://du55fdegui0t0" +path="res://.godot/imported/action_value_type_axis1d.svg-47cde6e873b547282e811542e4ee320d.ctex" +metadata={ +"has_editor_variant": true, +"vram_texture": false +} + +[deps] + +source_file="res://addons/guide/editor/action_slot/action_value_type_axis1d.svg" +dest_files=["res://.godot/imported/action_value_type_axis1d.svg-47cde6e873b547282e811542e4ee320d.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=true +editor/convert_colors_with_editor_theme=false diff --git a/addons/guide/editor/action_slot/action_value_type_axis2d.svg b/addons/guide/editor/action_slot/action_value_type_axis2d.svg new file mode 100644 index 0000000..4232027 --- /dev/null +++ b/addons/guide/editor/action_slot/action_value_type_axis2d.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/addons/guide/editor/action_slot/action_value_type_axis2d.svg.import b/addons/guide/editor/action_slot/action_value_type_axis2d.svg.import new file mode 100644 index 0000000..74457aa --- /dev/null +++ b/addons/guide/editor/action_slot/action_value_type_axis2d.svg.import @@ -0,0 +1,38 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bw3r81rgkbeic" +path="res://.godot/imported/action_value_type_axis2d.svg-82a12ec01234cc4464e5fb9b94ba28f0.ctex" +metadata={ +"has_editor_variant": true, +"vram_texture": false +} + +[deps] + +source_file="res://addons/guide/editor/action_slot/action_value_type_axis2d.svg" +dest_files=["res://.godot/imported/action_value_type_axis2d.svg-82a12ec01234cc4464e5fb9b94ba28f0.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=true +editor/convert_colors_with_editor_theme=false diff --git a/addons/guide/editor/action_slot/action_value_type_axis3d.svg b/addons/guide/editor/action_slot/action_value_type_axis3d.svg new file mode 100644 index 0000000..32fe1e3 --- /dev/null +++ b/addons/guide/editor/action_slot/action_value_type_axis3d.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/addons/guide/editor/action_slot/action_value_type_axis3d.svg.import b/addons/guide/editor/action_slot/action_value_type_axis3d.svg.import new file mode 100644 index 0000000..8bfdc6b --- /dev/null +++ b/addons/guide/editor/action_slot/action_value_type_axis3d.svg.import @@ -0,0 +1,38 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dcsfko8g6vjor" +path="res://.godot/imported/action_value_type_axis3d.svg-6c96e9bad6748ae9f491c37a99292ee2.ctex" +metadata={ +"has_editor_variant": true, +"vram_texture": false +} + +[deps] + +source_file="res://addons/guide/editor/action_slot/action_value_type_axis3d.svg" +dest_files=["res://.godot/imported/action_value_type_axis3d.svg-6c96e9bad6748ae9f491c37a99292ee2.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=true +editor/convert_colors_with_editor_theme=false diff --git a/addons/guide/editor/action_slot/action_value_type_bool.svg b/addons/guide/editor/action_slot/action_value_type_bool.svg new file mode 100644 index 0000000..69226b0 --- /dev/null +++ b/addons/guide/editor/action_slot/action_value_type_bool.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/addons/guide/editor/action_slot/action_value_type_bool.svg.import b/addons/guide/editor/action_slot/action_value_type_bool.svg.import new file mode 100644 index 0000000..14ea23e --- /dev/null +++ b/addons/guide/editor/action_slot/action_value_type_bool.svg.import @@ -0,0 +1,38 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bla3yu6pdqyt5" +path="res://.godot/imported/action_value_type_bool.svg-552c954344c23690bcca901351d04f59.ctex" +metadata={ +"has_editor_variant": true, +"vram_texture": false +} + +[deps] + +source_file="res://addons/guide/editor/action_slot/action_value_type_bool.svg" +dest_files=["res://.godot/imported/action_value_type_bool.svg-552c954344c23690bcca901351d04f59.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=true +editor/convert_colors_with_editor_theme=false diff --git a/addons/guide/editor/action_slot/missing_action.svg b/addons/guide/editor/action_slot/missing_action.svg new file mode 100644 index 0000000..8880f50 --- /dev/null +++ b/addons/guide/editor/action_slot/missing_action.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/addons/guide/editor/action_slot/missing_action.svg.import b/addons/guide/editor/action_slot/missing_action.svg.import new file mode 100644 index 0000000..505cec8 --- /dev/null +++ b/addons/guide/editor/action_slot/missing_action.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cdi5eoc1e8ha0" +path="res://.godot/imported/missing_action.svg-31774fd8d1b787aab90de376faa436ea.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/guide/editor/action_slot/missing_action.svg" +dest_files=["res://.godot/imported/missing_action.svg-31774fd8d1b787aab90de376faa436ea.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/guide/editor/array_edit/array_edit.gd b/addons/guide/editor/array_edit/array_edit.gd new file mode 100644 index 0000000..0c5bfaa --- /dev/null +++ b/addons/guide/editor/array_edit/array_edit.gd @@ -0,0 +1,113 @@ +@tool +extends Container +const Utils = preload("../utils.gd") + +@export var item_scene:PackedScene + +@export var title:String = "": + set(value): + title = value + _refresh() + +@export var add_tooltip:String: + set(value): + add_tooltip = value + _refresh() + +@export var clear_tooltip:String: + set(value): + clear_tooltip = value + _refresh() + +@export var item_separation:int = 8: + set(value): + item_separation = value + _refresh() + + +@export var collapsed:bool = false: + set(value): + collapsed = value + _refresh() + +signal add_requested() +signal delete_requested(index:int) +signal move_requested(from:int, to:int) +signal insert_requested(index:int) +signal duplicate_requested(index:int) +signal clear_requested() +signal collapse_state_changed(collapsed:bool) + +@onready var _add_button:Button = %AddButton +@onready var _clear_button:Button = %ClearButton +@onready var _contents:Container = %Contents +@onready var _title_label:Label = %TitleLabel +@onready var _collapse_button:Button = %CollapseButton +@onready var _expand_button:Button = %ExpandButton +@onready var _count_label:Label = %CountLabel + +func _ready(): + _add_button.icon = get_theme_icon("Add", "EditorIcons") + _add_button.pressed.connect(func(): add_requested.emit()) + + _clear_button.icon = get_theme_icon("Clear", "EditorIcons") + _clear_button.pressed.connect(func(): clear_requested.emit()) + + _collapse_button.icon = get_theme_icon("Collapse", "EditorIcons") + _collapse_button.pressed.connect(_on_collapse_pressed) + + _expand_button.icon = get_theme_icon("Forward", "EditorIcons") + _expand_button.pressed.connect(_on_expand_pressed) + + + _refresh() + + +func _refresh(): + if is_instance_valid(_add_button): + _add_button.tooltip_text = add_tooltip + if is_instance_valid(_clear_button): + _clear_button.tooltip_text = clear_tooltip + _clear_button.visible = _contents.get_child_count() > 0 + + if is_instance_valid(_contents): + _contents.add_theme_constant_override("separation", item_separation) + _contents.visible = not collapsed + + if is_instance_valid(_collapse_button): + _collapse_button.visible = not collapsed + + if is_instance_valid(_expand_button): + _expand_button.visible = collapsed + + if is_instance_valid(_title_label): + _title_label.text = title + + if is_instance_valid(_count_label): + _count_label.text = "(%s)" % [_contents.get_child_count()] + + +func clear(): + Utils.clear(_contents) + _refresh() + + +func add_item(new_item:Control): + var item_wrapper = item_scene.instantiate() + _contents.add_child(item_wrapper) + item_wrapper.initialize(new_item) + item_wrapper.move_requested.connect(func(from:int, to:int): move_requested.emit(from, to)) + item_wrapper.delete_requested.connect(func(idx:int): delete_requested.emit(idx) ) + item_wrapper.duplicate_requested.connect(func(idx:int): duplicate_requested.emit(idx) ) + _refresh() + + +func _on_collapse_pressed(): + collapsed = true + collapse_state_changed.emit(true) + + +func _on_expand_pressed(): + collapsed = false + collapse_state_changed.emit(false) + diff --git a/addons/guide/editor/array_edit/array_edit.gd.uid b/addons/guide/editor/array_edit/array_edit.gd.uid new file mode 100644 index 0000000..6b5d747 --- /dev/null +++ b/addons/guide/editor/array_edit/array_edit.gd.uid @@ -0,0 +1 @@ +uid://whm2ksw6nc4h diff --git a/addons/guide/editor/array_edit/array_edit.tscn b/addons/guide/editor/array_edit/array_edit.tscn new file mode 100644 index 0000000..c6c7408 --- /dev/null +++ b/addons/guide/editor/array_edit/array_edit.tscn @@ -0,0 +1,88 @@ +[gd_scene load_steps=5 format=3 uid="uid://cly0ff32fvpb2"] + +[ext_resource type="Script" path="res://addons/guide/editor/array_edit/array_edit.gd" id="1_y3qyt"] +[ext_resource type="PackedScene" uid="uid://cjabwsa4gmlpp" path="res://addons/guide/editor/array_edit/array_edit_item.tscn" id="2_n3ncl"] + +[sub_resource type="Image" id="Image_efj5n"] +data = { +"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 93, 93, 255, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 231, 255, 94, 94, 54, 255, 94, 94, 57, 255, 93, 93, 233, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 231, 255, 94, 94, 54, 255, 94, 94, 57, 255, 93, 93, 233, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 97, 97, 42, 255, 255, 255, 0, 255, 255, 255, 0, 255, 97, 97, 42, 255, 93, 93, 233, 255, 93, 93, 232, 255, 93, 93, 41, 255, 255, 255, 0, 255, 255, 255, 0, 255, 97, 97, 42, 255, 93, 93, 233, 255, 93, 93, 232, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 44, 255, 255, 255, 0, 255, 97, 97, 42, 255, 97, 97, 42, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 44, 255, 255, 255, 0, 255, 97, 97, 42, 255, 97, 97, 42, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 235, 255, 94, 94, 234, 255, 95, 95, 43, 255, 255, 255, 0, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 235, 255, 94, 94, 234, 255, 95, 95, 43, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 235, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 233, 255, 95, 95, 59, 255, 96, 96, 61, 255, 93, 93, 235, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 233, 255, 95, 95, 59, 255, 96, 96, 61, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0), +"format": "RGBA8", +"height": 16, +"mipmaps": false, +"width": 16 +} + +[sub_resource type="ImageTexture" id="ImageTexture_uapko"] +image = SubResource("Image_efj5n") + +[node name="Array" type="MarginContainer"] +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_y3qyt") +item_scene = ExtResource("2_n3ncl") +item_separation = 10 + +[node name="VBoxContainer" type="VBoxContainer" parent="."] +layout_mode = 2 + +[node name="MarginContainer" type="MarginContainer" parent="VBoxContainer"] +layout_mode = 2 + +[node name="Panel" type="Panel" parent="VBoxContainer/MarginContainer"] +layout_mode = 2 + +[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer/MarginContainer"] +layout_mode = 2 + +[node name="CollapseButton" type="Button" parent="VBoxContainer/MarginContainer/HBoxContainer"] +unique_name_in_owner = true +custom_minimum_size = Vector2(32, 0) +layout_mode = 2 +size_flags_horizontal = 0 +tooltip_text = "Collapse" +icon = SubResource("ImageTexture_uapko") + +[node name="ExpandButton" type="Button" parent="VBoxContainer/MarginContainer/HBoxContainer"] +unique_name_in_owner = true +visible = false +custom_minimum_size = Vector2(48, 0) +layout_mode = 2 +size_flags_horizontal = 0 +tooltip_text = "Expand" +icon = SubResource("ImageTexture_uapko") + +[node name="AddButton" type="Button" parent="VBoxContainer/MarginContainer/HBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +size_flags_horizontal = 0 +icon = SubResource("ImageTexture_uapko") + +[node name="ClearButton" type="Button" parent="VBoxContainer/MarginContainer/HBoxContainer"] +unique_name_in_owner = true +visible = false +layout_mode = 2 +size_flags_horizontal = 0 +icon = SubResource("ImageTexture_uapko") + +[node name="MarginContainer" type="MarginContainer" parent="VBoxContainer/MarginContainer/HBoxContainer"] +layout_mode = 2 + +[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer/MarginContainer/HBoxContainer/MarginContainer"] +layout_mode = 2 + +[node name="TitleLabel" type="Label" parent="VBoxContainer/MarginContainer/HBoxContainer/MarginContainer/HBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 + +[node name="CountLabel" type="Label" parent="VBoxContainer/MarginContainer/HBoxContainer/MarginContainer/HBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +text = "(0)" + +[node name="Contents" type="VBoxContainer" parent="VBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +theme_override_constants/separation = 10 diff --git a/addons/guide/editor/array_edit/array_edit_item.gd b/addons/guide/editor/array_edit/array_edit_item.gd new file mode 100644 index 0000000..13c8a03 --- /dev/null +++ b/addons/guide/editor/array_edit/array_edit_item.gd @@ -0,0 +1,84 @@ +@tool +extends Container +const Utils = preload("../utils.gd") +const Dragger = preload("dragger.gd") + +signal move_requested(from:int, to:int) +signal delete_requested(index:int) +signal duplicate_requested(index:int) + +@onready var _dragger:Dragger = %Dragger +@onready var _content:Container = %Content +@onready var _before_indicator:ColorRect = %BeforeIndicator +@onready var _after_indicator:ColorRect = %AfterIndicator +@onready var _popup_menu:PopupMenu = %PopupMenu + + +const ID_DELETE = 2 +const ID_DUPLICATE = 3 + +func _ready(): + _dragger.icon = get_theme_icon("GuiSpinboxUpdown", "EditorIcons") + _before_indicator.color = get_theme_color("box_selection_stroke_color", "Editor") + _after_indicator.color = get_theme_color("box_selection_stroke_color", "Editor") + _before_indicator.visible = false + _after_indicator.visible = false + _dragger._parent_array = get_parent() + _dragger._index = get_index() + _dragger.pressed.connect(_show_popup_menu) + + _popup_menu.clear() + _popup_menu.add_icon_item(get_theme_icon("Duplicate", "EditorIcons"), "Duplicate", ID_DUPLICATE) + _popup_menu.add_icon_item(get_theme_icon("Remove", "EditorIcons"), "Delete", ID_DELETE) + _popup_menu.id_pressed.connect(_on_popup_menu_id_pressed) + +func initialize(content:Control): + Utils.clear(_content) + _content.add_child(content) + + +func _can_drop_data(at_position:Vector2, data) -> bool: + if data is Dictionary and data.has("parent_array") and data.parent_array == get_parent() and data.index != get_index(): + var height = size.y + + var is_before = not _is_last_child() or (at_position.y < height/2.0) + if is_before and data.index == get_index() - 1: + # don't allow the previous child to be inserted at its + # own position + return false + + _before_indicator.visible = is_before + _after_indicator.visible = not is_before + return true + + return false + + +func _drop_data(at_position, data): + var height = size.y + var is_before = not _is_last_child() or (at_position.y < height/2.0) + var from = data.index + var to = get_index() if is_before else get_index() + 1 + move_requested.emit(data.index, to) + _before_indicator.visible = false + _after_indicator.visible = false + +func _is_last_child() -> bool: + return get_index() == get_parent().get_child_count() - 1 + + +func _on_mouse_exited(): + _before_indicator.visible = false + _after_indicator.visible = false + + +func _show_popup_menu(): + _popup_menu.popup(Rect2(get_global_mouse_position(), Vector2.ZERO)) + + +func _on_popup_menu_id_pressed(id:int): + match id: + ID_DELETE: + delete_requested.emit(get_index()) + ID_DUPLICATE: + duplicate_requested.emit(get_index()) diff --git a/addons/guide/editor/array_edit/array_edit_item.gd.uid b/addons/guide/editor/array_edit/array_edit_item.gd.uid new file mode 100644 index 0000000..1de2ee1 --- /dev/null +++ b/addons/guide/editor/array_edit/array_edit_item.gd.uid @@ -0,0 +1 @@ +uid://dhqhut5enoj43 diff --git a/addons/guide/editor/array_edit/array_edit_item.tscn b/addons/guide/editor/array_edit/array_edit_item.tscn new file mode 100644 index 0000000..be3b43b --- /dev/null +++ b/addons/guide/editor/array_edit/array_edit_item.tscn @@ -0,0 +1,83 @@ +[gd_scene load_steps=5 format=3 uid="uid://cjabwsa4gmlpp"] + +[ext_resource type="Script" path="res://addons/guide/editor/array_edit/array_edit_item.gd" id="1_ujx05"] +[ext_resource type="Script" path="res://addons/guide/editor/array_edit/dragger.gd" id="2_53e2r"] + +[sub_resource type="Image" id="Image_efj5n"] +data = { +"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 93, 93, 255, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 231, 255, 94, 94, 54, 255, 94, 94, 57, 255, 93, 93, 233, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 231, 255, 94, 94, 54, 255, 94, 94, 57, 255, 93, 93, 233, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 97, 97, 42, 255, 255, 255, 0, 255, 255, 255, 0, 255, 97, 97, 42, 255, 93, 93, 233, 255, 93, 93, 232, 255, 93, 93, 41, 255, 255, 255, 0, 255, 255, 255, 0, 255, 97, 97, 42, 255, 93, 93, 233, 255, 93, 93, 232, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 44, 255, 255, 255, 0, 255, 97, 97, 42, 255, 97, 97, 42, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 44, 255, 255, 255, 0, 255, 97, 97, 42, 255, 97, 97, 42, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 235, 255, 94, 94, 234, 255, 95, 95, 43, 255, 255, 255, 0, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 235, 255, 94, 94, 234, 255, 95, 95, 43, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 235, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 233, 255, 95, 95, 59, 255, 96, 96, 61, 255, 93, 93, 235, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 233, 255, 95, 95, 59, 255, 96, 96, 61, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0), +"format": "RGBA8", +"height": 16, +"mipmaps": false, +"width": 16 +} + +[sub_resource type="ImageTexture" id="ImageTexture_uapko"] +image = SubResource("Image_efj5n") + +[node name="ArrayEditItem" type="MarginContainer"] +anchors_preset = 10 +anchor_right = 1.0 +offset_bottom = 8.0 +grow_horizontal = 2 +script = ExtResource("1_ujx05") + +[node name="MarginContainer" type="MarginContainer" parent="."] +layout_mode = 2 +theme_override_constants/margin_top = 2 +theme_override_constants/margin_bottom = 2 + +[node name="HBoxContainer" type="HBoxContainer" parent="MarginContainer"] +layout_mode = 2 + +[node name="Dragger" type="Button" parent="MarginContainer/HBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +size_flags_horizontal = 0 +tooltip_text = "Drag to reorder, click for options." +focus_mode = 0 +mouse_filter = 1 +icon = SubResource("ImageTexture_uapko") +script = ExtResource("2_53e2r") + +[node name="Content" type="MarginContainer" parent="MarginContainer/HBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="VBoxContainer" type="VBoxContainer" parent="."] +layout_mode = 2 +mouse_filter = 2 + +[node name="BeforeIndicator" type="ColorRect" parent="VBoxContainer"] +unique_name_in_owner = true +visible = false +custom_minimum_size = Vector2(0, 2) +layout_mode = 2 +mouse_filter = 2 +color = Color(0, 0, 0, 1) + +[node name="Control" type="Control" parent="VBoxContainer"] +layout_mode = 2 +size_flags_vertical = 3 +mouse_filter = 2 + +[node name="AfterIndicator" type="ColorRect" parent="VBoxContainer"] +unique_name_in_owner = true +visible = false +custom_minimum_size = Vector2(0, 2) +layout_mode = 2 +mouse_filter = 2 +color = Color(0, 0, 0, 1) + +[node name="PopupMenu" type="PopupMenu" parent="."] +unique_name_in_owner = true +item_count = 2 +item_0/text = "Duplicate" +item_0/icon = SubResource("ImageTexture_uapko") +item_0/id = 3 +item_1/text = "Delete" +item_1/icon = SubResource("ImageTexture_uapko") +item_1/id = 2 + +[connection signal="mouse_exited" from="." to="." method="_on_mouse_exited"] diff --git a/addons/guide/editor/array_edit/dragger.gd b/addons/guide/editor/array_edit/dragger.gd new file mode 100644 index 0000000..629283e --- /dev/null +++ b/addons/guide/editor/array_edit/dragger.gd @@ -0,0 +1,8 @@ +@tool +extends Button + +var _parent_array:Variant +var _index:int + +func _get_drag_data(at_position): + return { "parent_array" : _parent_array, "index" : _index } diff --git a/addons/guide/editor/array_edit/dragger.gd.uid b/addons/guide/editor/array_edit/dragger.gd.uid new file mode 100644 index 0000000..7abf211 --- /dev/null +++ b/addons/guide/editor/array_edit/dragger.gd.uid @@ -0,0 +1 @@ +uid://d3cob8fbf0xk8 diff --git a/addons/guide/editor/binding_dialog/binding_dialog.gd b/addons/guide/editor/binding_dialog/binding_dialog.gd new file mode 100644 index 0000000..96a1b02 --- /dev/null +++ b/addons/guide/editor/binding_dialog/binding_dialog.gd @@ -0,0 +1,148 @@ +@tool +extends Window + +const ClassScanner = preload("../class_scanner.gd") +const Utils = preload("../utils.gd") + +signal input_selected(input:GUIDEInput) + +@onready var _input_display = %InputDisplay +@onready var _available_types:Container = %AvailableTypes +@onready var _none_available:Control = %NoneAvailable +@onready var _some_available:Control = %SomeAvailable +@onready var _select_bool_button:Button = %SelectBoolButton +@onready var _select_1d_button:Button = %Select1DButton +@onready var _select_2d_button:Button = %Select2DButton +@onready var _select_3d_button:Button = %Select3DButton +@onready var _instructions_label:Label = %InstructionsLabel +@onready var _accept_detection_button:Button = %AcceptDetectionButton +@onready var _input_detector:GUIDEInputDetector = %InputDetector +@onready var _detect_bool_button:Button = %DetectBoolButton +@onready var _detect_1d_button:Button = %Detect1DButton +@onready var _detect_2d_button:Button = %Detect2DButton +@onready var _detect_3d_button:Button = %Detect3DButton + +var _scanner:ClassScanner +var _last_detected_input:GUIDEInput + + +func initialize(scanner:ClassScanner): + _scanner = scanner + _setup_dialog() + +func _setup_dialog(): + # we need to bind this here. if we bind it in the editor, the editor + # will crash when opening the scene because it will delete the node it + # just tries to edit. + focus_exited.connect(_on_close_requested) + + _show_inputs_of_value_type(GUIDEAction.GUIDEActionValueType.BOOL) + _instructions_label.text = tr("Press one of the buttons above to detect an input.") + _accept_detection_button.visible = false + + +func _on_close_requested(): + hide() + queue_free() + + +func _show_inputs_of_value_type(type:GUIDEAction.GUIDEActionValueType) -> void: + var items:Array[GUIDEInput] = [] + + _select_bool_button.set_pressed_no_signal(type == GUIDEAction.GUIDEActionValueType.BOOL) + _select_1d_button.set_pressed_no_signal(type == GUIDEAction.GUIDEActionValueType.AXIS_1D) + _select_2d_button.set_pressed_no_signal(type == GUIDEAction.GUIDEActionValueType.AXIS_2D) + _select_3d_button.set_pressed_no_signal(type == GUIDEAction.GUIDEActionValueType.AXIS_3D) + + var all_inputs = _scanner.find_inheritors("GUIDEInput") + for script in all_inputs.values(): + var dummy:GUIDEInput = script.new() + if dummy._native_value_type() == type: + items.append(dummy) + + _some_available.visible = not items.is_empty() + _none_available.visible = items.is_empty() + + if items.is_empty(): + return + + items.sort_custom(func(a,b): return a._editor_name().nocasecmp_to(b._editor_name()) < 0) + Utils.clear(_available_types) + + for item in items: + var button = Button.new() + button.text = item._editor_name() + button.tooltip_text = item._editor_description() + button.pressed.connect(_deliver.bind(item)) + button.size_flags_horizontal = Control.SIZE_EXPAND_FILL + + _available_types.add_child(button) + + +func _deliver(input:GUIDEInput): + input_selected.emit(input) + hide() + queue_free() + + +func _on_select_bool_button_pressed(): + _show_inputs_of_value_type(GUIDEAction.GUIDEActionValueType.BOOL) + + +func _on_select_1d_button_pressed(): + _show_inputs_of_value_type(GUIDEAction.GUIDEActionValueType.AXIS_1D) + + +func _on_select_2d_button_pressed(): + _show_inputs_of_value_type(GUIDEAction.GUIDEActionValueType.AXIS_2D) + + +func _on_select_3d_button_pressed(): + _show_inputs_of_value_type(GUIDEAction.GUIDEActionValueType.AXIS_3D) + + +func _on_input_detector_detection_started(): + _instructions_label.text = tr("Actuate the input now...") + + +func _on_input_detector_input_detected(input:GUIDEInput): + _instructions_label.visible = false + _input_display.visible = true + _input_display.input = input + _accept_detection_button.visible = true + _last_detected_input = input + + +func _begin_detect_input(type:GUIDEAction.GUIDEActionValueType): + _last_detected_input = null + _instructions_label.visible = true + _instructions_label.text = tr("Get ready...") + _accept_detection_button.visible = false + _input_display.visible = false + _input_detector.detect(type) + + +func _on_detect_bool_button_pressed(): + _detect_bool_button.release_focus() + _begin_detect_input(GUIDEAction.GUIDEActionValueType.BOOL) + + +func _on_detect_1d_button_pressed(): + _detect_1d_button.release_focus() + _begin_detect_input(GUIDEAction.GUIDEActionValueType.AXIS_1D) + + +func _on_detect_2d_button_pressed(): + _detect_2d_button.release_focus() + _begin_detect_input(GUIDEAction.GUIDEActionValueType.AXIS_2D) + + +func _on_detect_3d_button_pressed(): + _detect_3d_button.release_focus() + _begin_detect_input(GUIDEAction.GUIDEActionValueType.AXIS_3D) + + +func _on_accept_detection_button_pressed(): + input_selected.emit(_last_detected_input) + hide() + queue_free diff --git a/addons/guide/editor/binding_dialog/binding_dialog.gd.uid b/addons/guide/editor/binding_dialog/binding_dialog.gd.uid new file mode 100644 index 0000000..7355c4b --- /dev/null +++ b/addons/guide/editor/binding_dialog/binding_dialog.gd.uid @@ -0,0 +1 @@ +uid://dfuj0dl8ob6r6 diff --git a/addons/guide/editor/binding_dialog/binding_dialog.tscn b/addons/guide/editor/binding_dialog/binding_dialog.tscn new file mode 100644 index 0000000..056fdac --- /dev/null +++ b/addons/guide/editor/binding_dialog/binding_dialog.tscn @@ -0,0 +1,216 @@ +[gd_scene load_steps=5 format=3 uid="uid://dic27bm4pfw3q"] + +[ext_resource type="Script" path="res://addons/guide/editor/binding_dialog/binding_dialog.gd" id="1_tknjd"] +[ext_resource type="PackedScene" uid="uid://dsv7s6tfmnsrs" path="res://addons/guide/editor/input_display/input_display.tscn" id="2_83ieu"] +[ext_resource type="Script" path="res://addons/guide/remapping/guide_input_detector.gd" id="3_c6q6r"] + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_3e874"] +content_margin_left = 4.0 +content_margin_top = 4.0 +content_margin_right = 4.0 +content_margin_bottom = 4.0 +bg_color = Color(1, 0.365, 0.365, 1) +draw_center = false +border_width_left = 2 +border_width_top = 2 +border_width_right = 2 +border_width_bottom = 2 +corner_detail = 1 + +[node name="BindingDialog" type="Window"] +title = "Input Configuration" +initial_position = 4 +size = Vector2i(1200, 600) +popup_window = true +min_size = Vector2i(1200, 600) +script = ExtResource("1_tknjd") + +[node name="MarginContainer" type="MarginContainer" parent="."] +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme_override_constants/margin_bottom = 5 + +[node name="BGPanel" type="Panel" parent="MarginContainer"] +unique_name_in_owner = true +layout_mode = 2 +theme_override_styles/panel = SubResource("StyleBoxFlat_3e874") + +[node name="MarginContainer" type="MarginContainer" parent="MarginContainer"] +layout_mode = 2 +theme_override_constants/margin_left = 5 +theme_override_constants/margin_top = 5 +theme_override_constants/margin_right = 5 +theme_override_constants/margin_bottom = 5 + +[node name="HBoxContainer" type="HBoxContainer" parent="MarginContainer/MarginContainer"] +layout_mode = 2 + +[node name="MarginContainer" type="MarginContainer" parent="MarginContainer/MarginContainer/HBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="LeftPanel" type="Panel" parent="MarginContainer/MarginContainer/HBoxContainer/MarginContainer"] +unique_name_in_owner = true +layout_mode = 2 + +[node name="MarginContainer" type="MarginContainer" parent="MarginContainer/MarginContainer/HBoxContainer/MarginContainer"] +layout_mode = 2 +theme_override_constants/margin_left = 5 +theme_override_constants/margin_top = 5 +theme_override_constants/margin_right = 5 +theme_override_constants/margin_bottom = 5 + +[node name="VBoxContainer" type="VBoxContainer" parent="MarginContainer/MarginContainer/HBoxContainer/MarginContainer/MarginContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 10 + +[node name="Label" type="Label" parent="MarginContainer/MarginContainer/HBoxContainer/MarginContainer/MarginContainer/VBoxContainer"] +layout_mode = 2 +text = "Detect Input" +horizontal_alignment = 1 + +[node name="HBoxContainer" type="HBoxContainer" parent="MarginContainer/MarginContainer/HBoxContainer/MarginContainer/MarginContainer/VBoxContainer"] +layout_mode = 2 + +[node name="DetectBoolButton" type="Button" parent="MarginContainer/MarginContainer/HBoxContainer/MarginContainer/MarginContainer/VBoxContainer/HBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +size_flags_horizontal = 3 +text = "Boolean" + +[node name="Detect1DButton" type="Button" parent="MarginContainer/MarginContainer/HBoxContainer/MarginContainer/MarginContainer/VBoxContainer/HBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +size_flags_horizontal = 3 +text = "1D" + +[node name="Detect2DButton" type="Button" parent="MarginContainer/MarginContainer/HBoxContainer/MarginContainer/MarginContainer/VBoxContainer/HBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +size_flags_horizontal = 3 +text = "2D" + +[node name="Detect3DButton" type="Button" parent="MarginContainer/MarginContainer/HBoxContainer/MarginContainer/MarginContainer/VBoxContainer/HBoxContainer"] +unique_name_in_owner = true +custom_minimum_size = Vector2(80, 0) +layout_mode = 2 +size_flags_horizontal = 3 +text = "3D" + +[node name="InstructionsLabel" type="Label" parent="MarginContainer/MarginContainer/HBoxContainer/MarginContainer/MarginContainer/VBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +size_flags_vertical = 6 +text = "3..2..1.." +horizontal_alignment = 1 +vertical_alignment = 1 +autowrap_mode = 2 + +[node name="InputDisplay" parent="MarginContainer/MarginContainer/HBoxContainer/MarginContainer/MarginContainer/VBoxContainer" instance=ExtResource("2_83ieu")] +unique_name_in_owner = true +layout_mode = 2 +size_flags_vertical = 6 + +[node name="AcceptDetectionButton" type="Button" parent="MarginContainer/MarginContainer/HBoxContainer/MarginContainer/MarginContainer/VBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +size_flags_horizontal = 4 +text = "Accept" + +[node name="MarginContainer2" type="MarginContainer" parent="MarginContainer/MarginContainer/HBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="RightPanel" type="Panel" parent="MarginContainer/MarginContainer/HBoxContainer/MarginContainer2"] +unique_name_in_owner = true +layout_mode = 2 + +[node name="MarginContainer" type="MarginContainer" parent="MarginContainer/MarginContainer/HBoxContainer/MarginContainer2"] +layout_mode = 2 +theme_override_constants/margin_left = 5 +theme_override_constants/margin_top = 5 +theme_override_constants/margin_right = 5 +theme_override_constants/margin_bottom = 5 + +[node name="VBoxContainer" type="VBoxContainer" parent="MarginContainer/MarginContainer/HBoxContainer/MarginContainer2/MarginContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 10 + +[node name="Label" type="Label" parent="MarginContainer/MarginContainer/HBoxContainer/MarginContainer2/MarginContainer/VBoxContainer"] +layout_mode = 2 +text = "Select Input" +horizontal_alignment = 1 + +[node name="HBoxContainer" type="HBoxContainer" parent="MarginContainer/MarginContainer/HBoxContainer/MarginContainer2/MarginContainer/VBoxContainer"] +layout_mode = 2 + +[node name="SelectBoolButton" type="Button" parent="MarginContainer/MarginContainer/HBoxContainer/MarginContainer2/MarginContainer/VBoxContainer/HBoxContainer"] +unique_name_in_owner = true +custom_minimum_size = Vector2(80, 0) +layout_mode = 2 +size_flags_horizontal = 3 +toggle_mode = true +text = "Boolean" + +[node name="Select1DButton" type="Button" parent="MarginContainer/MarginContainer/HBoxContainer/MarginContainer2/MarginContainer/VBoxContainer/HBoxContainer"] +unique_name_in_owner = true +custom_minimum_size = Vector2(80, 0) +layout_mode = 2 +size_flags_horizontal = 3 +toggle_mode = true +text = "1D" + +[node name="Select2DButton" type="Button" parent="MarginContainer/MarginContainer/HBoxContainer/MarginContainer2/MarginContainer/VBoxContainer/HBoxContainer"] +unique_name_in_owner = true +custom_minimum_size = Vector2(80, 0) +layout_mode = 2 +size_flags_horizontal = 3 +toggle_mode = true +text = "2D" + +[node name="Select3DButton" type="Button" parent="MarginContainer/MarginContainer/HBoxContainer/MarginContainer2/MarginContainer/VBoxContainer/HBoxContainer"] +unique_name_in_owner = true +custom_minimum_size = Vector2(80, 0) +layout_mode = 2 +size_flags_horizontal = 3 +toggle_mode = true +text = "3D" + +[node name="NoneAvailable" type="Label" parent="MarginContainer/MarginContainer/HBoxContainer/MarginContainer2/MarginContainer/VBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +size_flags_horizontal = 6 +size_flags_vertical = 6 +text = "No matching inputs available." + +[node name="SomeAvailable" type="ScrollContainer" parent="MarginContainer/MarginContainer/HBoxContainer/MarginContainer2/MarginContainer/VBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +size_flags_vertical = 3 + +[node name="AvailableTypes" type="VBoxContainer" parent="MarginContainer/MarginContainer/HBoxContainer/MarginContainer2/MarginContainer/VBoxContainer/SomeAvailable"] +unique_name_in_owner = true +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="InputDetector" type="Node" parent="."] +unique_name_in_owner = true +script = ExtResource("3_c6q6r") + +[connection signal="close_requested" from="." to="." method="_on_close_requested"] +[connection signal="pressed" from="MarginContainer/MarginContainer/HBoxContainer/MarginContainer/MarginContainer/VBoxContainer/HBoxContainer/DetectBoolButton" to="." method="_on_detect_bool_button_pressed"] +[connection signal="pressed" from="MarginContainer/MarginContainer/HBoxContainer/MarginContainer/MarginContainer/VBoxContainer/HBoxContainer/Detect1DButton" to="." method="_on_detect_1d_button_pressed"] +[connection signal="pressed" from="MarginContainer/MarginContainer/HBoxContainer/MarginContainer/MarginContainer/VBoxContainer/HBoxContainer/Detect2DButton" to="." method="_on_detect_2d_button_pressed"] +[connection signal="pressed" from="MarginContainer/MarginContainer/HBoxContainer/MarginContainer/MarginContainer/VBoxContainer/HBoxContainer/Detect3DButton" to="." method="_on_detect_3d_button_pressed"] +[connection signal="pressed" from="MarginContainer/MarginContainer/HBoxContainer/MarginContainer/MarginContainer/VBoxContainer/AcceptDetectionButton" to="." method="_on_accept_detection_button_pressed"] +[connection signal="pressed" from="MarginContainer/MarginContainer/HBoxContainer/MarginContainer2/MarginContainer/VBoxContainer/HBoxContainer/SelectBoolButton" to="." method="_on_select_bool_button_pressed"] +[connection signal="pressed" from="MarginContainer/MarginContainer/HBoxContainer/MarginContainer2/MarginContainer/VBoxContainer/HBoxContainer/Select1DButton" to="." method="_on_select_1d_button_pressed"] +[connection signal="pressed" from="MarginContainer/MarginContainer/HBoxContainer/MarginContainer2/MarginContainer/VBoxContainer/HBoxContainer/Select2DButton" to="." method="_on_select_2d_button_pressed"] +[connection signal="pressed" from="MarginContainer/MarginContainer/HBoxContainer/MarginContainer2/MarginContainer/VBoxContainer/HBoxContainer/Select3DButton" to="." method="_on_select_3d_button_pressed"] +[connection signal="detection_started" from="InputDetector" to="." method="_on_input_detector_detection_started"] +[connection signal="input_detected" from="InputDetector" to="." method="_on_input_detector_input_detected"] diff --git a/addons/guide/editor/class_scanner.gd b/addons/guide/editor/class_scanner.gd new file mode 100644 index 0000000..d37e3da --- /dev/null +++ b/addons/guide/editor/class_scanner.gd @@ -0,0 +1,91 @@ +## Scanner to find inheriting classes. Used to detect inheritors of +## modifiers and triggers. Ideally this would be built into the editor +## but sometimes one has to hack their way around the limitations. +## This only scans to the extent needed to drive the UI, it's not a general +## purpose implementation. +@tool + +const GUIDESet = preload("../guide_set.gd") + +var _dirty:bool = true + +# looks like we only get very limited access to the script's inheritance tree, +# so we need to do a little caching ourselves +var _script_lut:Dictionary = {} + +func _init(): + EditorInterface.get_resource_filesystem().script_classes_updated.connect(_mark_dirty) + + +func _mark_dirty(): + _dirty = true + +## Returns all classes that directly or indirectly inherit from the +## given class. Only works for scripts in the project, e.g. doesn't +## scan the whole class_db. Key is class name, value is the Script instance +func find_inheritors(clazz_name:StringName) -> Dictionary: + var result:Dictionary = {} + + var root := EditorInterface.get_resource_filesystem().get_filesystem() + + # rebuild the LUT when needed + if _dirty: + _script_lut.clear() + _scan(root) + _dirty = false + + + var open_set:GUIDESet = GUIDESet.new() + # a closed set just to avoid infinite loops, we'll never + # look at the same class more than once. + var closed_set:GUIDESet = GUIDESet.new() + + open_set.add(clazz_name) + + while not open_set.is_empty(): + var next = open_set.pull() + closed_set.add(next) + if not _script_lut.has(next): + # we don't know this script, ignore, move on + continue + + # now find all scripts that extend the one we + # are looking at + for item:ScriptInfo in _script_lut.values(): + if item.extendz == next: + # put them into the result + result[item.clazz_name] = item.clazz_script + # and put their class in the open set + # unless we already looked at it. + if not closed_set.has(item.clazz_name): + open_set.add(item.clazz_name) + + return result + + +func _scan(folder:EditorFileSystemDirectory): + for i in folder.get_file_count(): + var script_clazz = folder.get_file_script_class_name(i) + if script_clazz != "": + var info := _script_lut.get(script_clazz) + if info == null: + info = ScriptInfo.new() + info.clazz_name = script_clazz + info.clazz_script = ResourceLoader.load(folder.get_file_path(i)) + _script_lut[script_clazz] = info + + var script_extendz = folder.get_file_script_class_extends(i) + info.extendz = script_extendz + + for i in folder.get_subdir_count(): + _scan(folder.get_subdir(i)) + + +class ScriptInfo: + var clazz_name:StringName + var extendz:StringName + var clazz_script:Script + + func _to_string() -> String: + return clazz_name + ":" + extendz + diff --git a/addons/guide/editor/class_scanner.gd.uid b/addons/guide/editor/class_scanner.gd.uid new file mode 100644 index 0000000..940c514 --- /dev/null +++ b/addons/guide/editor/class_scanner.gd.uid @@ -0,0 +1 @@ +uid://b1trdjs8ofe7c diff --git a/addons/guide/editor/input_display/input_display.gd b/addons/guide/editor/input_display/input_display.gd new file mode 100644 index 0000000..eb21aef --- /dev/null +++ b/addons/guide/editor/input_display/input_display.gd @@ -0,0 +1,39 @@ +@tool +extends RichTextLabel +signal clicked() + +var _formatter:GUIDEInputFormatter = GUIDEInputFormatter.new(64) + +var input:GUIDEInput: + set(value): + if value == input: + return + + if is_instance_valid(input): + input.changed.disconnect(_refresh) + + input = value + + if is_instance_valid(input): + input.changed.connect(_refresh) + + _refresh() + +func _refresh(): + if not is_instance_valid(input): + parse_bbcode("[center][i][/i][/center]") + tooltip_text = "" + return + + var text := await _formatter.input_as_richtext_async(input, false) + parse_bbcode("[center]" + text + "[/center]") + tooltip_text = _formatter.input_as_text(input) + + +func _gui_input(event): + if event is InputEventMouseButton: + if event.pressed and event.button_index == MOUSE_BUTTON_LEFT: + clicked.emit() + + + diff --git a/addons/guide/editor/input_display/input_display.gd.uid b/addons/guide/editor/input_display/input_display.gd.uid new file mode 100644 index 0000000..1b4dfcf --- /dev/null +++ b/addons/guide/editor/input_display/input_display.gd.uid @@ -0,0 +1 @@ +uid://cgf2qrodwja32 diff --git a/addons/guide/editor/input_display/input_display.tscn b/addons/guide/editor/input_display/input_display.tscn new file mode 100644 index 0000000..4cd79a3 --- /dev/null +++ b/addons/guide/editor/input_display/input_display.tscn @@ -0,0 +1,18 @@ +[gd_scene load_steps=3 format=3 uid="uid://dsv7s6tfmnsrs"] + +[ext_resource type="Script" path="res://addons/guide/editor/input_display/input_display.gd" id="1_ne6sd"] + +[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_0bp65"] + +[node name="InputDisplay" type="RichTextLabel"] +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +theme_override_styles/normal = SubResource("StyleBoxEmpty_0bp65") +bbcode_enabled = true +fit_content = true +script = ExtResource("1_ne6sd") diff --git a/addons/guide/editor/input_mapping_editor/input_mapping_editor.gd b/addons/guide/editor/input_mapping_editor/input_mapping_editor.gd new file mode 100644 index 0000000..e4c428c --- /dev/null +++ b/addons/guide/editor/input_mapping_editor/input_mapping_editor.gd @@ -0,0 +1,299 @@ +@tool +extends MarginContainer + +const ArrayEdit = preload("../array_edit/array_edit.gd") +const ClassScanner = preload("../class_scanner.gd") +const Utils = preload("../utils.gd") + +@export var modifier_slot_scene:PackedScene +@export var trigger_slot_scene:PackedScene +@export var binding_dialog_scene:PackedScene + +@onready var _edit_input_mapping_button:Button = %EditInputMappingButton +@onready var _input_display = %InputDisplay +@onready var _edit_input_button:Button = %EditInputButton +@onready var _clear_input_button:Button = %ClearInputButton + +@onready var _modifiers:ArrayEdit = %Modifiers +@onready var _add_modifier_popup:PopupMenu = %AddModifierPopup + +@onready var _triggers:ArrayEdit = %Triggers +@onready var _add_trigger_popup:PopupMenu = %AddTriggerPopup + +var _plugin:EditorPlugin +var _scanner:ClassScanner +var _undo_redo:EditorUndoRedoManager + +var _mapping:GUIDEInputMapping + +func _ready(): + _edit_input_button.icon = get_theme_icon("Edit", "EditorIcons") + _clear_input_button.icon = get_theme_icon("Remove", "EditorIcons") + _edit_input_mapping_button.icon = get_theme_icon("Tools", "EditorIcons") + + _modifiers.add_requested.connect(_on_modifiers_add_requested) + _modifiers.delete_requested.connect(_on_modifier_delete_requested) + _modifiers.duplicate_requested.connect(_on_modifier_duplicate_requested) + _modifiers.move_requested.connect(_on_modifier_move_requested) + _modifiers.clear_requested.connect(_on_modifiers_clear_requested) + _modifiers.collapse_state_changed.connect(_on_modifiers_collapse_state_changed) + + _triggers.add_requested.connect(_on_triggers_add_requested) + _triggers.delete_requested.connect(_on_trigger_delete_requested) + _triggers.duplicate_requested.connect(_on_trigger_duplicate_requested) + _triggers.move_requested.connect(_on_trigger_move_requested) + _triggers.clear_requested.connect(_on_triggers_clear_requested) + _triggers.collapse_state_changed.connect(_on_triggers_collapse_state_changed) + + +func initialize(plugin:EditorPlugin, scanner:ClassScanner) -> void: + _plugin = plugin + _scanner = scanner + _undo_redo = plugin.get_undo_redo() + _input_display.clicked.connect(_on_input_display_clicked) + + +func edit(mapping:GUIDEInputMapping) -> void: + assert(_mapping == null) + _mapping = mapping + _mapping.changed.connect(_update) + _update() + + +func _update(): + _modifiers.clear() + _triggers.clear() + + _input_display.input = _mapping.input + for i in _mapping.modifiers.size(): + var modifier_slot = modifier_slot_scene.instantiate() + _modifiers.add_item(modifier_slot) + + modifier_slot.modifier = _mapping.modifiers[i] + modifier_slot.changed.connect(_on_modifier_changed.bind(i, modifier_slot)) + + for i in _mapping.triggers.size(): + var trigger_slot = trigger_slot_scene.instantiate() + _triggers.add_item(trigger_slot) + + trigger_slot.trigger = _mapping.triggers[i] + trigger_slot.changed.connect(_on_trigger_changed.bind(i, trigger_slot)) + + _modifiers.collapsed = _mapping.get_meta("_guide_modifiers_collapsed", false) + _triggers.collapsed = _mapping.get_meta("_guide_triggers_collapsed", false) + + +func _on_modifiers_add_requested(): + _fill_popup(_add_modifier_popup, "GUIDEModifier") + _add_modifier_popup.popup(Rect2(get_global_mouse_position(), Vector2.ZERO)) + + +func _on_triggers_add_requested(): + _fill_popup(_add_trigger_popup, "GUIDETrigger") + _add_trigger_popup.popup(Rect2(get_global_mouse_position(), Vector2.ZERO)) + + +func _fill_popup(popup:PopupMenu, base_clazz:StringName): + popup.clear(true) + + var inheritors := _scanner.find_inheritors(base_clazz) + for type in inheritors.keys(): + var class_script:Script = inheritors[type] + var dummy = class_script.new() + popup.add_item(dummy._editor_name()) + popup.set_item_tooltip(popup.item_count -1, dummy._editor_description()) + popup.set_item_metadata(popup.item_count - 1, class_script) + +func _on_input_display_clicked(): + if is_instance_valid(_mapping.input): + EditorInterface.edit_resource(_mapping.input) + + +func _on_input_changed(input:GUIDEInput): + _undo_redo.create_action("Change input") + + _undo_redo.add_do_property(_mapping, "input", input) + _undo_redo.add_undo_property(_mapping, "input", _mapping.input) + + _undo_redo.commit_action() + + if is_instance_valid(input): + EditorInterface.edit_resource(input) + + +func _on_edit_input_button_pressed(): + var dialog:Window = binding_dialog_scene.instantiate() + EditorInterface.popup_dialog_centered(dialog) + dialog.initialize(_scanner) + dialog.input_selected.connect(_on_input_changed) + + +func _on_clear_input_button_pressed(): + _undo_redo.create_action("Delete bound input") + + _undo_redo.add_do_property(_mapping, "input", null) + _undo_redo.add_undo_property(_mapping, "triggers", _mapping.input) + + _undo_redo.commit_action() + + +func _on_add_modifier_popup_index_pressed(index:int) -> void: + var script = _add_modifier_popup.get_item_metadata(index) + var new_modifier = script.new() + + _undo_redo.create_action("Add " + new_modifier._editor_name() + " modifier") + var modifiers = _mapping.modifiers.duplicate() + modifiers.append(new_modifier) + + _undo_redo.add_do_property(_mapping, "modifiers", modifiers) + _undo_redo.add_undo_property(_mapping, "modifiers", _mapping.modifiers) + + _undo_redo.commit_action() + + +func _on_add_trigger_popup_index_pressed(index): + var script = _add_trigger_popup.get_item_metadata(index) + var new_trigger = script.new() + + _undo_redo.create_action("Add " + new_trigger._editor_name() + " trigger") + var triggers = _mapping.triggers.duplicate() + triggers.append(new_trigger) + + _undo_redo.add_do_property(_mapping, "triggers", triggers) + _undo_redo.add_undo_property(_mapping, "triggers", _mapping.triggers) + + _undo_redo.commit_action() + + +func _on_modifier_changed(index:int, slot) -> void: + var new_modifier = slot.modifier + + _undo_redo.create_action("Replace modifier") + var modifiers = _mapping.modifiers.duplicate() + modifiers[index] = new_modifier + + _undo_redo.add_do_property(_mapping, "modifiers", modifiers) + _undo_redo.add_undo_property(_mapping, "modifiers", _mapping.modifiers) + + _undo_redo.commit_action() + + +func _on_trigger_changed(index:int, slot) -> void: + var new_trigger = slot.trigger + + _undo_redo.create_action("Replace trigger") + var triggers = _mapping.triggers.duplicate() + triggers[index] = new_trigger + + _undo_redo.add_do_property(_mapping, "triggers", triggers) + _undo_redo.add_undo_property(_mapping, "triggers", _mapping.triggers) + + _undo_redo.commit_action() + + +func _on_modifier_move_requested(from:int, to:int) -> void: + _undo_redo.create_action("Move modifier") + var modifiers = _mapping.modifiers.duplicate() + var modifier = modifiers[from] + modifiers.remove_at(from) + if from < to: + to -= 1 + modifiers.insert(to, modifier) + + _undo_redo.add_do_property(_mapping, "modifiers", modifiers) + _undo_redo.add_undo_property(_mapping, "modifiers", _mapping.modifiers) + + _undo_redo.commit_action() + + +func _on_trigger_move_requested(from:int, to:int) -> void: + _undo_redo.create_action("Move trigger") + var triggers = _mapping.triggers.duplicate() + var trigger = triggers[from] + triggers.remove_at(from) + if from < to: + to -= 1 + triggers.insert(to, trigger) + + _undo_redo.add_do_property(_mapping, "triggers", triggers) + _undo_redo.add_undo_property(_mapping, "triggers", _mapping.triggers) + + _undo_redo.commit_action() + +func _on_modifier_duplicate_requested(index:int) -> void: + _undo_redo.create_action("Duplicate modifier") + var modifiers = _mapping.modifiers.duplicate() + var copy = Utils.duplicate_if_inline(modifiers[index]) + modifiers.insert(index+1, copy) + + _undo_redo.add_do_property(_mapping, "modifiers", modifiers) + _undo_redo.add_undo_property(_mapping, "modifiers", _mapping.modifiers) + + _undo_redo.commit_action() + +func _on_trigger_duplicate_requested(index:int) -> void: + _undo_redo.create_action("Duplicate trigger") + var triggers = _mapping.triggers.duplicate() + var copy = Utils.duplicate_if_inline(triggers[index]) + triggers.insert(index+1, copy) + + _undo_redo.add_do_property(_mapping, "triggers", triggers) + _undo_redo.add_undo_property(_mapping, "triggers", _mapping.triggers) + + _undo_redo.commit_action() + + + +func _on_modifier_delete_requested(index:int) -> void: + _undo_redo.create_action("Delete modifier") + var modifiers = _mapping.modifiers.duplicate() + modifiers.remove_at(index) + + _undo_redo.add_do_property(_mapping, "modifiers", modifiers) + _undo_redo.add_undo_property(_mapping, "modifiers", _mapping.modifiers) + + _undo_redo.commit_action() + + +func _on_trigger_delete_requested(index:int) -> void: + _undo_redo.create_action("Delete trigger") + var triggers = _mapping.triggers.duplicate() + triggers.remove_at(index) + + _undo_redo.add_do_property(_mapping, "triggers", triggers) + _undo_redo.add_undo_property(_mapping, "triggers", _mapping.triggers) + + _undo_redo.commit_action() + + +func _on_modifiers_clear_requested() -> void: + _undo_redo.create_action("Clear modifiers") + # if this is inlined into the do_property, then it doesn't work + # so lets keep it a local variable + var value:Array[GUIDEModifier] = [] + _undo_redo.add_do_property(_mapping, "modifiers", value) + _undo_redo.add_undo_property(_mapping, "modifiers", _mapping.modifiers) + + _undo_redo.commit_action() + + +func _on_triggers_clear_requested() -> void: + _undo_redo.create_action("Clear triggers") + # if this is inlined into the do_property, then it doesn't work + # so lets keep it a local variable + var value:Array[GUIDETrigger] = [] + _undo_redo.add_do_property(_mapping, "triggers", value) + _undo_redo.add_undo_property(_mapping, "triggers", _mapping.triggers) + + _undo_redo.commit_action() + + +func _on_modifiers_collapse_state_changed(new_state:bool): + _mapping.set_meta("_guide_modifiers_collapsed", new_state) + +func _on_triggers_collapse_state_changed(new_state:bool): + _mapping.set_meta("_guide_triggers_collapsed", new_state) + + +func _on_edit_input_mapping_button_pressed(): + EditorInterface.edit_resource(_mapping) diff --git a/addons/guide/editor/input_mapping_editor/input_mapping_editor.gd.uid b/addons/guide/editor/input_mapping_editor/input_mapping_editor.gd.uid new file mode 100644 index 0000000..2effa94 --- /dev/null +++ b/addons/guide/editor/input_mapping_editor/input_mapping_editor.gd.uid @@ -0,0 +1 @@ +uid://dsw33iehbw8q6 diff --git a/addons/guide/editor/input_mapping_editor/input_mapping_editor.tscn b/addons/guide/editor/input_mapping_editor/input_mapping_editor.tscn new file mode 100644 index 0000000..a70f142 --- /dev/null +++ b/addons/guide/editor/input_mapping_editor/input_mapping_editor.tscn @@ -0,0 +1,140 @@ +[gd_scene load_steps=9 format=3 uid="uid://c323mdijdhktg"] + +[ext_resource type="PackedScene" uid="uid://dsv7s6tfmnsrs" path="res://addons/guide/editor/input_display/input_display.tscn" id="1_pg8n3"] +[ext_resource type="Script" path="res://addons/guide/editor/input_mapping_editor/input_mapping_editor.gd" id="1_xsluc"] +[ext_resource type="PackedScene" uid="uid://ck5a30syo6bpo" path="res://addons/guide/editor/modifier_slot/modifier_slot.tscn" id="2_uhbrq"] +[ext_resource type="PackedScene" uid="uid://tk30wnstb0ku" path="res://addons/guide/editor/trigger_slot/trigger_slot.tscn" id="3_e0jys"] +[ext_resource type="PackedScene" uid="uid://dic27bm4pfw3q" path="res://addons/guide/editor/binding_dialog/binding_dialog.tscn" id="4_oepf3"] +[ext_resource type="PackedScene" uid="uid://cly0ff32fvpb2" path="res://addons/guide/editor/array_edit/array_edit.tscn" id="6_jekhk"] + +[sub_resource type="Image" id="Image_m1w1j"] +data = { +"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 93, 93, 255, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 231, 255, 94, 94, 54, 255, 94, 94, 57, 255, 93, 93, 233, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 231, 255, 94, 94, 54, 255, 94, 94, 57, 255, 93, 93, 233, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 97, 97, 42, 255, 255, 255, 0, 255, 255, 255, 0, 255, 97, 97, 42, 255, 93, 93, 233, 255, 93, 93, 232, 255, 93, 93, 41, 255, 255, 255, 0, 255, 255, 255, 0, 255, 97, 97, 42, 255, 93, 93, 233, 255, 93, 93, 232, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 44, 255, 255, 255, 0, 255, 97, 97, 42, 255, 97, 97, 42, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 44, 255, 255, 255, 0, 255, 97, 97, 42, 255, 97, 97, 42, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 235, 255, 94, 94, 234, 255, 95, 95, 43, 255, 255, 255, 0, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 235, 255, 94, 94, 234, 255, 95, 95, 43, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 235, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 233, 255, 95, 95, 59, 255, 96, 96, 61, 255, 93, 93, 235, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 233, 255, 95, 95, 59, 255, 96, 96, 61, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0), +"format": "RGBA8", +"height": 16, +"mipmaps": false, +"width": 16 +} + +[sub_resource type="ImageTexture" id="ImageTexture_y0eyy"] +image = SubResource("Image_m1w1j") + +[node name="InputMappingEditor" type="MarginContainer"] +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +size_flags_vertical = 0 +script = ExtResource("1_xsluc") +modifier_slot_scene = ExtResource("2_uhbrq") +trigger_slot_scene = ExtResource("3_e0jys") +binding_dialog_scene = ExtResource("4_oepf3") + +[node name="HBoxContainer" type="HBoxContainer" parent="."] +layout_mode = 2 +size_flags_vertical = 0 +theme_override_constants/separation = 8 + +[node name="MarginContainer" type="MarginContainer" parent="HBoxContainer"] +layout_mode = 2 +size_flags_vertical = 0 + +[node name="Panel" type="Panel" parent="HBoxContainer/MarginContainer"] +visible = false +layout_mode = 2 + +[node name="EditInputMappingButton" type="Button" parent="HBoxContainer/MarginContainer"] +unique_name_in_owner = true +layout_mode = 2 +tooltip_text = "Open input mapping in inspector" +icon = SubResource("ImageTexture_y0eyy") +flat = true + +[node name="MarginContainer1" type="MarginContainer" parent="HBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="Panel" type="Panel" parent="HBoxContainer/MarginContainer1"] +visible = false +layout_mode = 2 + +[node name="HBoxContainer" type="HBoxContainer" parent="HBoxContainer/MarginContainer1"] +layout_mode = 2 + +[node name="InputDisplay" parent="HBoxContainer/MarginContainer1/HBoxContainer" instance=ExtResource("1_pg8n3")] +unique_name_in_owner = true +layout_mode = 2 +scroll_active = false + +[node name="EditInputButton" type="Button" parent="HBoxContainer/MarginContainer1/HBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +size_flags_vertical = 0 +tooltip_text = "Edit bound input..." +icon = SubResource("ImageTexture_y0eyy") +flat = true + +[node name="ClearInputButton" type="Button" parent="HBoxContainer/MarginContainer1/HBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +size_flags_vertical = 0 +tooltip_text = "Delete bound input" +icon = SubResource("ImageTexture_y0eyy") +flat = true + +[node name="MarginContainer2" type="MarginContainer" parent="HBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_stretch_ratio = 2.0 + +[node name="Panel" type="Panel" parent="HBoxContainer/MarginContainer2"] +visible = false +layout_mode = 2 + +[node name="VBoxContainer" type="VBoxContainer" parent="HBoxContainer/MarginContainer2"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 0 +size_flags_stretch_ratio = 2.0 + +[node name="Modifiers" parent="HBoxContainer/MarginContainer2/VBoxContainer" instance=ExtResource("6_jekhk")] +unique_name_in_owner = true +layout_mode = 2 +title = "Modifiers" +add_tooltip = "Add modifier..." +clear_tooltip = "Clear modifiers" + +[node name="AddModifierPopup" type="PopupMenu" parent="HBoxContainer/MarginContainer2/VBoxContainer"] +unique_name_in_owner = true + +[node name="MarginContainer3" type="MarginContainer" parent="HBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_stretch_ratio = 2.0 + +[node name="Panel" type="Panel" parent="HBoxContainer/MarginContainer3"] +visible = false +layout_mode = 2 + +[node name="VBoxContainer2" type="VBoxContainer" parent="HBoxContainer/MarginContainer3"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 0 +size_flags_stretch_ratio = 2.0 + +[node name="Triggers" parent="HBoxContainer/MarginContainer3/VBoxContainer2" instance=ExtResource("6_jekhk")] +unique_name_in_owner = true +layout_mode = 2 +title = "Triggers" +add_tooltip = "Add trigger..." +clear_tooltip = "Clear triggers" + +[node name="AddTriggerPopup" type="PopupMenu" parent="HBoxContainer/MarginContainer3/VBoxContainer2"] +unique_name_in_owner = true + +[connection signal="pressed" from="HBoxContainer/MarginContainer/EditInputMappingButton" to="." method="_on_edit_input_mapping_button_pressed"] +[connection signal="pressed" from="HBoxContainer/MarginContainer1/HBoxContainer/EditInputButton" to="." method="_on_edit_input_button_pressed"] +[connection signal="pressed" from="HBoxContainer/MarginContainer1/HBoxContainer/ClearInputButton" to="." method="_on_clear_input_button_pressed"] +[connection signal="index_pressed" from="HBoxContainer/MarginContainer2/VBoxContainer/AddModifierPopup" to="." method="_on_add_modifier_popup_index_pressed"] +[connection signal="index_pressed" from="HBoxContainer/MarginContainer3/VBoxContainer2/AddTriggerPopup" to="." method="_on_add_trigger_popup_index_pressed"] diff --git a/addons/guide/editor/logo_editor_small.svg b/addons/guide/editor/logo_editor_small.svg new file mode 100644 index 0000000..38b6805 --- /dev/null +++ b/addons/guide/editor/logo_editor_small.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/addons/guide/editor/logo_editor_small.svg.import b/addons/guide/editor/logo_editor_small.svg.import new file mode 100644 index 0000000..50a40ea --- /dev/null +++ b/addons/guide/editor/logo_editor_small.svg.import @@ -0,0 +1,38 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cap7e0f05pj8j" +path="res://.godot/imported/logo_editor_small.svg-a18f1eaff840dcdf5215ef26c289caf9.ctex" +metadata={ +"has_editor_variant": true, +"vram_texture": false +} + +[deps] + +source_file="res://addons/guide/editor/logo_editor_small.svg" +dest_files=["res://.godot/imported/logo_editor_small.svg-a18f1eaff840dcdf5215ef26c289caf9.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=0.5 +editor/scale_with_editor_scale=true +editor/convert_colors_with_editor_theme=false diff --git a/addons/guide/editor/mapping_context_editor/mapping_context_editor.gd b/addons/guide/editor/mapping_context_editor/mapping_context_editor.gd new file mode 100644 index 0000000..8f7882c --- /dev/null +++ b/addons/guide/editor/mapping_context_editor/mapping_context_editor.gd @@ -0,0 +1,159 @@ +@tool +extends MarginContainer + +const ClassScanner = preload("../class_scanner.gd") +const Utils = preload("../utils.gd") +const ArrayEdit = preload("../array_edit/array_edit.gd") + +@export var action_mapping_editor_scene:PackedScene + +@onready var _title_label:Label = %TitleLabel +@onready var _action_mappings:ArrayEdit = %ActionMappings +@onready var _editing_view:Control = %EditingView +@onready var _empty_view = %EmptyView + +var _plugin:EditorPlugin +var _current_context:GUIDEMappingContext +var _undo_redo:EditorUndoRedoManager +var _scanner:ClassScanner + + +func _ready(): + _title_label.add_theme_font_override("font", get_theme_font("title", "EditorFonts")) + _scanner = ClassScanner.new() + + _editing_view.visible = false + _empty_view.visible = true + + _action_mappings.add_requested.connect(_on_action_mappings_add_requested) + _action_mappings.move_requested.connect(_on_action_mappings_move_requested) + _action_mappings.delete_requested.connect(_on_action_mapping_delete_requested) + _action_mappings.clear_requested.connect(_on_action_mappings_clear_requested) + _action_mappings.duplicate_requested.connect(_on_action_mapping_duplicate_requested) + _action_mappings.collapse_state_changed.connect(_on_action_mappings_collapse_state_changed) + +func initialize(plugin:EditorPlugin) -> void: + _plugin = plugin + _undo_redo = plugin.get_undo_redo() + + +func edit(context:GUIDEMappingContext) -> void: + if is_instance_valid(_current_context): + _current_context.changed.disconnect(_refresh) + + _current_context = context + + if is_instance_valid(_current_context): + _current_context.changed.connect(_refresh) + + _refresh() + + +func _refresh(): + _editing_view.visible = is_instance_valid(_current_context) + _empty_view.visible = not is_instance_valid(_current_context) + + if not is_instance_valid(_current_context): + return + + _title_label.text = _current_context._editor_name() + _title_label.tooltip_text = _current_context.resource_path + + _action_mappings.clear() + + for i in _current_context.mappings.size(): + var mapping = _current_context.mappings[i] + + var mapping_editor = action_mapping_editor_scene.instantiate() + mapping_editor.initialize(_plugin, _scanner) + + _action_mappings.add_item(mapping_editor) + + mapping_editor.edit(mapping) + + _action_mappings.collapsed = _current_context.get_meta("_guide_action_mappings_collapsed", false) + +func _on_action_mappings_add_requested(): + var mappings = _current_context.mappings.duplicate() + var new_mapping := GUIDEActionMapping.new() + # don't set an action because they should come from the file system + mappings.append(new_mapping) + + _undo_redo.create_action("Add action mapping") + + _undo_redo.add_do_property(_current_context, "mappings", mappings) + _undo_redo.add_undo_property(_current_context, "mappings", _current_context.mappings) + + _undo_redo.commit_action() + + +func _on_action_mappings_move_requested(from:int, to:int): + var mappings = _current_context.mappings.duplicate() + var mapping = mappings[from] + mappings.remove_at(from) + if from < to: + to -= 1 + mappings.insert(to, mapping) + + _undo_redo.create_action("Move action mapping") + + _undo_redo.add_do_property(_current_context, "mappings", mappings) + _undo_redo.add_undo_property(_current_context, "mappings", _current_context.mappings) + + _undo_redo.commit_action() + + +func _on_action_mapping_delete_requested(index:int): + var mappings = _current_context.mappings.duplicate() + mappings.remove_at(index) + + _undo_redo.create_action("Delete action mapping") + + _undo_redo.add_do_property(_current_context, "mappings", mappings) + _undo_redo.add_undo_property(_current_context, "mappings", _current_context.mappings) + + _undo_redo.commit_action() + + +func _on_action_mappings_clear_requested(): + var mappings:Array[GUIDEActionMapping] = [] + + _undo_redo.create_action("Clear action mappings") + + _undo_redo.add_do_property(_current_context, "mappings", mappings) + _undo_redo.add_undo_property(_current_context, "mappings", _current_context.mappings) + + _undo_redo.commit_action() + +func _on_action_mapping_duplicate_requested(index:int): + var mappings = _current_context.mappings.duplicate() + var to_duplicate:GUIDEActionMapping = mappings[index] + + var copy = GUIDEActionMapping.new() + # don't set the action, because each mapping should have a unique mapping + for input_mapping:GUIDEInputMapping in to_duplicate.input_mappings: + var copied_input_mapping := GUIDEInputMapping.new() + copied_input_mapping.input = Utils.duplicate_if_inline(input_mapping.input) + for modifier in input_mapping.modifiers: + copied_input_mapping.modifiers.append(Utils.duplicate_if_inline(modifier)) + + for trigger in input_mapping.triggers: + copied_input_mapping.triggers.append(Utils.duplicate_if_inline(trigger)) + + copy.input_mappings.append(copied_input_mapping) + + # insert the copy after the copied mapping + mappings.insert(index+1, copy) + + + _undo_redo.create_action("Duplicate action mapping") + + _undo_redo.add_do_property(_current_context, "mappings", mappings) + _undo_redo.add_undo_property(_current_context, "mappings", _current_context.mappings) + + _undo_redo.commit_action() + +func _on_action_mappings_collapse_state_changed(new_state:bool): + _current_context.set_meta("_guide_action_mappings_collapsed", new_state) + + diff --git a/addons/guide/editor/mapping_context_editor/mapping_context_editor.gd.uid b/addons/guide/editor/mapping_context_editor/mapping_context_editor.gd.uid new file mode 100644 index 0000000..fc98c0d --- /dev/null +++ b/addons/guide/editor/mapping_context_editor/mapping_context_editor.gd.uid @@ -0,0 +1 @@ +uid://bpemf1ch2011g diff --git a/addons/guide/editor/mapping_context_editor/mapping_context_editor.tscn b/addons/guide/editor/mapping_context_editor/mapping_context_editor.tscn new file mode 100644 index 0000000..f28a17f --- /dev/null +++ b/addons/guide/editor/mapping_context_editor/mapping_context_editor.tscn @@ -0,0 +1,58 @@ +[gd_scene load_steps=4 format=3 uid="uid://dm3hott3tfvwe"] + +[ext_resource type="Script" path="res://addons/guide/editor/mapping_context_editor/mapping_context_editor.gd" id="1_vytdu"] +[ext_resource type="PackedScene" uid="uid://361aipcef24h" path="res://addons/guide/editor/action_mapping_editor/action_mapping_editor.tscn" id="2_qb3p8"] +[ext_resource type="PackedScene" uid="uid://cly0ff32fvpb2" path="res://addons/guide/editor/array_edit/array_edit.tscn" id="3_x7h5x"] + +[node name="MappingContextEditor" type="MarginContainer"] +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +theme_override_constants/margin_left = 5 +theme_override_constants/margin_top = 5 +theme_override_constants/margin_right = 5 +theme_override_constants/margin_bottom = 5 +script = ExtResource("1_vytdu") +action_mapping_editor_scene = ExtResource("2_qb3p8") + +[node name="EditingView" type="VBoxContainer" parent="."] +unique_name_in_owner = true +layout_mode = 2 + +[node name="HBoxContainer" type="HBoxContainer" parent="EditingView"] +layout_mode = 2 + +[node name="TitleLabel" type="Label" parent="EditingView/HBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +size_flags_horizontal = 6 +text = "narf.tres" +horizontal_alignment = 1 + +[node name="MarginContainer" type="MarginContainer" parent="EditingView"] +layout_mode = 2 +theme_override_constants/margin_bottom = 5 + +[node name="ScrollContainer" type="ScrollContainer" parent="EditingView"] +layout_mode = 2 +size_flags_vertical = 3 + +[node name="ActionMappings" parent="EditingView/ScrollContainer" instance=ExtResource("3_x7h5x")] +unique_name_in_owner = true +layout_mode = 2 +size_flags_horizontal = 3 +title = "Action mappings" +add_tooltip = "Add action mapping" +clear_tooltip = "Clear action mappings" + +[node name="EmptyView" type="CenterContainer" parent="."] +unique_name_in_owner = true +layout_mode = 2 + +[node name="Label" type="Label" parent="EmptyView"] +layout_mode = 2 +text = "Create and open a GUIDEMappingContext to get started." diff --git a/addons/guide/editor/modifier_slot/modifier_slot.gd b/addons/guide/editor/modifier_slot/modifier_slot.gd new file mode 100644 index 0000000..30dc53d --- /dev/null +++ b/addons/guide/editor/modifier_slot/modifier_slot.gd @@ -0,0 +1,14 @@ +@tool +extends "../resource_slot/resource_slot.gd" + +var modifier:GUIDEModifier: + set(value): + _value = value + get: + return _value + +func _accepts_drop_data(data:Resource) -> bool: + return data is GUIDEModifier + + + diff --git a/addons/guide/editor/modifier_slot/modifier_slot.gd.uid b/addons/guide/editor/modifier_slot/modifier_slot.gd.uid new file mode 100644 index 0000000..a575576 --- /dev/null +++ b/addons/guide/editor/modifier_slot/modifier_slot.gd.uid @@ -0,0 +1 @@ +uid://cmvfuu8u5ubkk diff --git a/addons/guide/editor/modifier_slot/modifier_slot.tscn b/addons/guide/editor/modifier_slot/modifier_slot.tscn new file mode 100644 index 0000000..6b2f91e --- /dev/null +++ b/addons/guide/editor/modifier_slot/modifier_slot.tscn @@ -0,0 +1,18 @@ +[gd_scene load_steps=2 format=3 uid="uid://ck5a30syo6bpo"] + +[ext_resource type="Script" path="res://addons/guide/editor/modifier_slot/modifier_slot.gd" id="1_273m5"] + +[node name="LineEdit" type="LineEdit"] +offset_right = 1920.0 +offset_bottom = 31.0 +size_flags_horizontal = 3 +size_flags_vertical = 0 +text = "Name" +editable = false +context_menu_enabled = false +virtual_keyboard_enabled = false +shortcut_keys_enabled = false +middle_mouse_paste_enabled = false +selecting_enabled = false +drag_and_drop_selection_enabled = false +script = ExtResource("1_273m5") diff --git a/addons/guide/editor/resource_slot/resource_slot.gd b/addons/guide/editor/resource_slot/resource_slot.gd new file mode 100644 index 0000000..d54ec95 --- /dev/null +++ b/addons/guide/editor/resource_slot/resource_slot.gd @@ -0,0 +1,106 @@ +@tool +extends LineEdit + +signal changed() +const Utils = preload("../utils.gd") + +func _ready(): + editable = false + context_menu_enabled = false + virtual_keyboard_enabled = false + shortcut_keys_enabled = false + selecting_enabled = false + drag_and_drop_selection_enabled = false + middle_mouse_paste_enabled = false + +## The underlying resource. This is opened for editing when the user clicks on the control. Its also +## used when dragging from the control. +var _value:Resource = null: + set(value): + if _value == value: + return + + # stop tracking changes to the old resource (if any) + if is_instance_valid(_value): + _value.changed.disconnect(_update_from_value) + + _value = value + + # track changes to the resource itself + if is_instance_valid(_value): + _value.changed.connect(_update_from_value) + + _update_from_value() + changed.emit() + +func _update_from_value(): + if not is_instance_valid(_value): + text = "" + tooltip_text = "" + remove_theme_color_override("font_uneditable_color") + else: + text = _value._editor_name() + tooltip_text = _value.resource_path + # if the value is shared, we override the font color to indicate that + if not Utils.is_inline(_value): + add_theme_color_override("font_uneditable_color", get_theme_color("accent_color", "Editor")) + queue_redraw() + else: + remove_theme_color_override("font_uneditable_color") + +## Can be overridden to handle the drop data. This method is called when the user drops something on the control. +## If the value should be updated ,this method should set the _value property. +func _do_drop_data(data:Resource): + _value = data + + +## Whether this control can accept drop data. This method is called when the user drags something over the control. +func _accepts_drop_data(data:Resource) -> bool: + return false + +func _can_drop_data(at_position, data) -> bool: + if data is Resource: + return _accepts_drop_data(data) + + if not data is Dictionary: + return false + + if data.has("files"): + for file in data["files"]: + if _accepts_drop_data(ResourceLoader.load(file)): + return true + + return false + + +func _drop_data(at_position, data) -> void: + if data is Resource: + _do_drop_data(data) + return + + for file in data["files"]: + var item := ResourceLoader.load(file) + _do_drop_data(item) + + +func _get_drag_data(at_position: Vector2) -> Variant: + if is_instance_valid(_value): + var _preview := TextureRect.new() + _preview.texture = get_theme_icon("File", "EditorIcons") + set_drag_preview(_preview) + # if the value is shared, we just hand out the resource path + if not Utils.is_inline(_value): + return {"files": [_value.resource_path]} + else: + # otherwise we hand out a shallow copy + return _value.duplicate() + else: + return null + +func _gui_input(event): + if event is InputEventMouseButton: + if event.pressed and event.button_index == MOUSE_BUTTON_LEFT: + if is_instance_valid(_value): + EditorInterface.edit_resource(_value) + + diff --git a/addons/guide/editor/resource_slot/resource_slot.gd.uid b/addons/guide/editor/resource_slot/resource_slot.gd.uid new file mode 100644 index 0000000..d11247d --- /dev/null +++ b/addons/guide/editor/resource_slot/resource_slot.gd.uid @@ -0,0 +1 @@ +uid://b7cctlhen71jw diff --git a/addons/guide/editor/trigger_slot/trigger_slot.gd b/addons/guide/editor/trigger_slot/trigger_slot.gd new file mode 100644 index 0000000..70cb053 --- /dev/null +++ b/addons/guide/editor/trigger_slot/trigger_slot.gd @@ -0,0 +1,14 @@ +@tool +extends "../resource_slot/resource_slot.gd" + +var trigger:GUIDETrigger: + set(value): + _value = value + get: + return _value + +func _accepts_drop_data(data:Resource) -> bool: + return data is GUIDETrigger + + + diff --git a/addons/guide/editor/trigger_slot/trigger_slot.gd.uid b/addons/guide/editor/trigger_slot/trigger_slot.gd.uid new file mode 100644 index 0000000..4575b7f --- /dev/null +++ b/addons/guide/editor/trigger_slot/trigger_slot.gd.uid @@ -0,0 +1 @@ +uid://dk2lv53ohhes2 diff --git a/addons/guide/editor/trigger_slot/trigger_slot.tscn b/addons/guide/editor/trigger_slot/trigger_slot.tscn new file mode 100644 index 0000000..3d5e6d8 --- /dev/null +++ b/addons/guide/editor/trigger_slot/trigger_slot.tscn @@ -0,0 +1,20 @@ +[gd_scene load_steps=2 format=3 uid="uid://tk30wnstb0ku"] + +[ext_resource type="Script" path="res://addons/guide/editor/trigger_slot/trigger_slot.gd" id="1_wxafc"] + +[node name="LineEdit" type="LineEdit"] +unique_name_in_owner = true +offset_right = 1920.0 +offset_bottom = 31.0 +size_flags_horizontal = 3 +size_flags_vertical = 0 +tooltip_text = "Delete trigger" +text = "Name" +editable = false +context_menu_enabled = false +virtual_keyboard_enabled = false +shortcut_keys_enabled = false +middle_mouse_paste_enabled = false +selecting_enabled = false +drag_and_drop_selection_enabled = false +script = ExtResource("1_wxafc") diff --git a/addons/guide/editor/utils.gd b/addons/guide/editor/utils.gd new file mode 100644 index 0000000..f3549af --- /dev/null +++ b/addons/guide/editor/utils.gd @@ -0,0 +1,22 @@ +## Removes and frees all children of a node. +static func clear(node:Node): + if not is_instance_valid(node): + return + for child in node.get_children(): + node.remove_child(child) + child.queue_free() + + +## Checks if the given resource is an inline resource. If so, returns a shallow copy, +## otherwise returns the resource. If the resource is null, returns null. +static func duplicate_if_inline(resource:Resource) -> Resource: + if is_inline(resource): + return resource.duplicate() + return resource + + +## Checks if the given resource is an inline resource. +static func is_inline(resource:Resource) -> bool: + if resource == null: + return false + return resource.resource_path.contains("::") or resource.resource_path == "" \ No newline at end of file diff --git a/addons/guide/editor/utils.gd.uid b/addons/guide/editor/utils.gd.uid new file mode 100644 index 0000000..db0f31f --- /dev/null +++ b/addons/guide/editor/utils.gd.uid @@ -0,0 +1 @@ +uid://c2jwjge0gqr1l diff --git a/addons/guide/guide.gd b/addons/guide/guide.gd new file mode 100644 index 0000000..c9aa8f1 --- /dev/null +++ b/addons/guide/guide.gd @@ -0,0 +1,387 @@ +extends Node + +const GUIDESet = preload("guide_set.gd") +const GUIDEReset = preload("guide_reset.gd") +const GUIDEInputTracker = preload("guide_input_tracker.gd") + +## This is emitted whenever input mappings change (either due to mapping +## contexts being enabled/disabled or remapping configs being re-applied or +## joystick devices being connected/disconnected). +## This is useful for updating UI prompts. +signal input_mappings_changed() + +## The currently active contexts. Key is the context, value is the priority +var _active_contexts:Dictionary = {} +## The currently active action mappings. +var _active_action_mappings:Array[GUIDEActionMapping] = [] + +## The currently active remapping config. +var _active_remapping_config:GUIDERemappingConfig + +## All currently active inputs as collected from the active input mappings +var _active_inputs:Array[GUIDEInput] = [] + +## A dictionary of actions sharing input. Key is the action, value +## is an array of lower-priority actions that share input with the +## key action. +var _actions_sharing_input:Dictionary = {} + +## A reference to the reset node which resets inputs that need a reset per frame +## This is an extra node because the reset should run at the end of the frame +## before new input is processed at the beginning of the frame. +var _reset_node:GUIDEReset + +## The current input state. This is used to track the state of the inputs +## and serves as a basis for the GUIDEInputs. +var _input_state:GUIDEInputState + + +func _ready(): + process_mode = Node.PROCESS_MODE_ALWAYS + _reset_node = GUIDEReset.new() + _input_state = GUIDEInputState.new() + add_child(_reset_node) + # attach to the current viewport to get input events + GUIDEInputTracker._instrument.call_deferred(get_viewport()) + + get_tree().node_added.connect(_on_node_added) + + # Emit a change of input mappings whenever a joystick was connected + # or disconnected. + Input.joy_connection_changed.connect(func(ig, ig2): input_mappings_changed.emit()) + + +## Called when a node is added to the tree. If the node is a window +## GUIDE will instrument it to get events when the window is focused. +func _on_node_added(node:Node) -> void: + if not node is Window: + return + + GUIDEInputTracker._instrument(node) + + +## Injects input into GUIDE. GUIDE will call this automatically but +## can also be used to manually inject input for GUIDE to handle +func inject_input(event:InputEvent) -> void: + if event is InputEventAction: + return # we don't react to Godot's built-in events + + # The input state is the sole consumer of input events. It will notify + # GUIDEInputs when relevant input events happen. This way we don't need + # to process input events multiple times and at the same time always have + # the full picture of the input state. + _input_state._input(event) + + +## Applies an input remapping config. This will override all input bindings in the +## currently loaded mapping contexts with the bindings from the configuration. +## Note that GUIDE will not track changes to the remapping config. If your remapping +## config changes, you will need to call this method again. +func set_remapping_config(config:GUIDERemappingConfig) -> void: + _active_remapping_config = config + _update_caches() + + +## Enables the given context with the given priority. Lower numbers have higher priority. If +## disable_others is set to true, all other currently enabled mapping contexts will be disabled. +func enable_mapping_context(context:GUIDEMappingContext, disable_others:bool = false, priority:int = 0): + if not is_instance_valid(context): + push_error("Null context given. Ignoring.") + return + + if disable_others: + _active_contexts.clear() + + _active_contexts[context] = priority + _update_caches() + + +## Disables the given mapping context. +func disable_mapping_context(context:GUIDEMappingContext): + if not is_instance_valid(context): + push_error("Null context given. Ignoring.") + return + + _active_contexts.erase(context) + _update_caches() + + +## Checks whether the given mapping context is currently enabled. +func is_mapping_context_enabled(context:GUIDEMappingContext) -> bool: + return _active_contexts.has(context) + + +## Returns the currently enabled mapping contexts +func get_enabled_mapping_contexts() -> Array[GUIDEMappingContext]: + var result:Array[GUIDEMappingContext] = [] + for key in _active_contexts.keys(): + result.append(key) + return result + + +## Processes all currently active actions +func _process(delta:float) -> void: + var blocked_actions:GUIDESet = GUIDESet.new() + + for action_mapping:GUIDEActionMapping in _active_action_mappings: + + var action:GUIDEAction = action_mapping.action + + # Walk over all input mappings for this action and consolidate state + # and result value. + var consolidated_value:Vector3 = Vector3.ZERO + var consolidated_trigger_state:GUIDETrigger.GUIDETriggerState + + for input_mapping:GUIDEInputMapping in action_mapping.input_mappings: + input_mapping._update_state(delta, action.action_value_type) + consolidated_value += input_mapping._value + consolidated_trigger_state = max(consolidated_trigger_state, input_mapping._state) + + # we do the blocking check only here because triggers may need to run anyways + # (e.g. to collect hold times). + if blocked_actions.has(action): + consolidated_trigger_state = GUIDETrigger.GUIDETriggerState.NONE + + if action.block_lower_priority_actions and \ + consolidated_trigger_state == GUIDETrigger.GUIDETriggerState.TRIGGERED and \ + _actions_sharing_input.has(action): + for blocked_action in _actions_sharing_input[action]: + blocked_actions.add(blocked_action) + + + # Now state change events. + match(action._last_state): + GUIDEAction.GUIDEActionState.TRIGGERED: + match(consolidated_trigger_state): + GUIDETrigger.GUIDETriggerState.NONE: + action._completed(consolidated_value) + GUIDETrigger.GUIDETriggerState.ONGOING: + action._ongoing(consolidated_value, delta) + GUIDETrigger.GUIDETriggerState.TRIGGERED: + action._triggered(consolidated_value, delta) + + GUIDEAction.GUIDEActionState.ONGOING: + match(consolidated_trigger_state): + GUIDETrigger.GUIDETriggerState.NONE: + action._cancelled(consolidated_value) + GUIDETrigger.GUIDETriggerState.ONGOING: + action._ongoing(consolidated_value, delta) + GUIDETrigger.GUIDETriggerState.TRIGGERED: + action._triggered(consolidated_value, delta) + + GUIDEAction.GUIDEActionState.COMPLETED: + match(consolidated_trigger_state): + GUIDETrigger.GUIDETriggerState.NONE: + # make sure the value updated but don't emit any other events + action._update_value(consolidated_value) + GUIDETrigger.GUIDETriggerState.ONGOING: + action._started(consolidated_value) + GUIDETrigger.GUIDETriggerState.TRIGGERED: + action._triggered(consolidated_value, delta) + +func _update_caches(): + # Notify existing inputs that they aren no longer required + for input:GUIDEInput in _active_inputs: + input._reset() + input._end_usage() + + # Cancel all actions, so they don't remain in weird states. + for mapping:GUIDEActionMapping in _active_action_mappings: + match mapping.action._last_state: + GUIDEAction.GUIDEActionState.ONGOING: + mapping.action._cancelled(Vector3.ZERO) + GUIDEAction.GUIDEActionState.TRIGGERED: + mapping.action._completed(Vector3.ZERO) + # notify all modifiers they are no longer in use + for input_mapping in mapping.input_mappings: + for modifier in input_mapping.modifiers: + modifier._end_usage() + + _active_inputs.clear() + _active_action_mappings.clear() + _actions_sharing_input.clear() + + var sorted_contexts:Array[Dictionary] = [] + + for context:GUIDEMappingContext in _active_contexts.keys(): + sorted_contexts.append({"context": context, "priority": _active_contexts[context]}) + + sorted_contexts.sort_custom( func(a,b): return a.priority < b.priority ) + + # The actions we already have processed. Same action may appear in different + # contexts, so if we find the same action twice, only the first instance wins. + var processed_actions:GUIDESet = GUIDESet.new() + var consolidated_inputs:GUIDESet = GUIDESet.new() + + for entry:Dictionary in sorted_contexts: + var context:GUIDEMappingContext = entry.context + var position:int = 0 + for action_mapping:GUIDEActionMapping in context.mappings: + position += 1 + var action := action_mapping.action + + # Mapping may be misconfigured, so we need to handle the case + # that the action is missing. + if action == null: + push_warning("Mapping at position %s in context %s has no action set. This mapping will be ignored." % [position, context.resource_path]) + continue + + # If the action was already configured in a higher priority context, + # we'll skip it. + if processed_actions.has(action): + # skip + continue + + processed_actions.add(action) + + # We consolidate the inputs here, so we'll internally build a new + # action mapping that uses consolidated inputs rather than the + # original ones. This achieves multiple things: + # - if two actions check for the same input, we only need to + # process the input once instead of twice. + # - it allows us to prioritize input, if two actions check for + # the same input. This way the first action can consume the + # input and not have it affect further actions. + # - we make sure nobody shares triggers as they are stateful and + # should not be shared. + + var effective_mapping = GUIDEActionMapping.new() + effective_mapping.action = action + + # now update the input mappings + for index in action_mapping.input_mappings.size(): + var bound_input:GUIDEInput = action_mapping.input_mappings[index].input + + # if the mapping has an override for the input, apply it. + if _active_remapping_config != null and \ + _active_remapping_config._has(context, action, index): + bound_input = _active_remapping_config._get_bound_input_or_null(context, action, index) + + # make a new input mapping + var new_input_mapping := GUIDEInputMapping.new() + + # can be null for combo mappings, so check that + if bound_input != null: + # check if we already have this kind of input + var existing = consolidated_inputs.first_match(func(it:GUIDEInput): return it.is_same_as(bound_input)) + if existing != null: + # if we have this already, use the instance we have + bound_input = existing + else: + # otherwise register this input into the consolidated input + consolidated_inputs.add(bound_input) + + new_input_mapping.input = bound_input + # modifiers cannot be re-bound so we can just use the one + # from the original configuration. this is also needed for shared + # modifiers to work. + new_input_mapping.modifiers = action_mapping.input_mappings[index].modifiers + # triggers also cannot be re-bound but we still make a copy + # to ensure that no shared triggers exist. + new_input_mapping.triggers = [] + + for trigger in action_mapping.input_mappings[index].triggers: + new_input_mapping.triggers.append(trigger.duplicate()) + + new_input_mapping._initialize() + + # and add it to the new mapping + effective_mapping.input_mappings.append(new_input_mapping) + + + # if any binding remains, add the mapping to the list of active + # action mappings + if not effective_mapping.input_mappings.is_empty(): + _active_action_mappings.append(effective_mapping) + + # INVARIANT: all _active_action_mappings now have actions. + + # now we have a new set of active inputs + for input:GUIDEInput in consolidated_inputs.values(): + _active_inputs.append(input) + + # prepare the action input share lookup table + for i:int in _active_action_mappings.size(): + + var mapping = _active_action_mappings[i] + + if mapping.action.block_lower_priority_actions: + # first find out if the action uses any chorded actions and + # collect all inputs that this action uses + var chorded_actions:GUIDESet = GUIDESet.new() + var inputs:GUIDESet = GUIDESet.new() + var blocked_actions:GUIDESet = GUIDESet.new() + for input_mapping:GUIDEInputMapping in mapping.input_mappings: + if input_mapping.input != null: + inputs.add(input_mapping.input) + + for trigger:GUIDETrigger in input_mapping.triggers: + if trigger is GUIDETriggerChordedAction and trigger.action != null: + chorded_actions.add(trigger.action) + + # Now the action that has a chorded action (A) needs to make sure that + # the chorded action it depends upon (B) is not blocked (otherwise A would + # never trigger) and if that chorded action (B) in turn depends on chorded actions. So + # if chorded actions build a chain, we need to keep the full + # chain unblocked. In addition we need to add the inputs of all + # these chorded actions to the list of blocked inputs. + for j:int in range(i+1, _active_action_mappings.size()): + var inner_mapping = _active_action_mappings[j] + # this is a chorded action that is used by one other action + # in the chain. + if chorded_actions.has(inner_mapping.action): + for input_mapping:GUIDEInputMapping in inner_mapping.input_mappings: + # put all of its inputs into the list of blocked inputs + if input_mapping.input != null: + inputs.add(input_mapping.input) + + # also if this mapping in turn again depends on a chorded + # action, ad this one to the list of chorded actions + for trigger:GUIDETrigger in input_mapping.triggers: + if trigger is GUIDETriggerChordedAction and trigger.action != null: + chorded_actions.add(trigger.action) + + # now find lower priority actions that share input + for j:int in range(i+1, _active_action_mappings.size()): + var inner_mapping = _active_action_mappings[j] + if chorded_actions.has(inner_mapping.action): + continue + + for input_mapping:GUIDEInputMapping in inner_mapping.input_mappings: + if input_mapping.input == null: + continue + + # because we consolidated input, we can now do an == comparison + # to find equal input. + if inputs.has(input_mapping.input): + blocked_actions.add(inner_mapping.action) + # we can continue to the next action + break + + if not blocked_actions.is_empty(): + _actions_sharing_input[mapping.action] = blocked_actions.values() + + _reset_node._inputs_to_reset.clear() + for input:GUIDEInput in _active_inputs: + # finally collect which inputs we need to reset per frame + if input._needs_reset(): + _reset_node._inputs_to_reset.append(input) + + # Give the state to the input + input._state = _input_state + # Notify inputs that GUIDE is about to use them + input._begin_usage() + + for mapping in _active_action_mappings: + for input_mapping in mapping.input_mappings: + # notify modifiers they will be used. + for modifier in input_mapping.modifiers: + modifier._begin_usage() + + # and copy over the hold time threshold from the mapping + mapping.action._trigger_hold_threshold = input_mapping._trigger_hold_threshold + + # and notify interested parties that the input mappings have changed + input_mappings_changed.emit() + + diff --git a/addons/guide/guide.gd.uid b/addons/guide/guide.gd.uid new file mode 100644 index 0000000..6e0cdad --- /dev/null +++ b/addons/guide/guide.gd.uid @@ -0,0 +1 @@ +uid://p2jwrgjcbexr diff --git a/addons/guide/guide_action.gd b/addons/guide/guide_action.gd new file mode 100644 index 0000000..a92ef64 --- /dev/null +++ b/addons/guide/guide_action.gd @@ -0,0 +1,254 @@ +@tool +@icon("res://addons/guide/guide_action.svg") +class_name GUIDEAction +extends Resource + +enum GUIDEActionValueType { + BOOL = 0, + AXIS_1D = 1, + AXIS_2D = 2, + AXIS_3D = 3 +} + +enum GUIDEActionState { + TRIGGERED, + ONGOING, + COMPLETED +} + +## The name of this action. Required when this action should be used as +## Godot action. Also displayed in the debugger. +@export var name:StringName: + set(value): + if name == value: + return + name = value + emit_changed() + + +## The action value type. +@export var action_value_type: GUIDEActionValueType = GUIDEActionValueType.BOOL: + set(value): + if action_value_type == value: + return + action_value_type = value + emit_changed() + +## If this action triggers, lower-priority actions cannot trigger +## if they share input with this action unless these actions are +## chorded with this action. +@export var block_lower_priority_actions:bool = true: + set(value): + if block_lower_priority_actions == value: + return + block_lower_priority_actions = value + emit_changed() + + +@export_category("Godot Actions") +## If true, then this action will be emitted into Godot's +## built-in action system. This can be helpful to interact with +## code using this system, like Godot's UI system. Actions +## will be emitted on trigger and completion (e.g. button down +## and button up). +@export var emit_as_godot_actions:bool = false: + set(value): + if emit_as_godot_actions == value: + return + emit_as_godot_actions = value + emit_changed() + + +@export_category("Action Remapping") + +## If true, players can remap this action. To be remappable, make sure +## that a name and the action type are properly set. +@export var is_remappable:bool: + set(value): + if is_remappable == value: + return + is_remappable = value + emit_changed() + +## The display name of the action shown to the player. +@export var display_name:String: + set(value): + if display_name == value: + return + display_name = value + emit_changed() + +## The display category of the action shown to the player. +@export var display_category:String: + set(value): + if display_category == value: + return + display_category = value + emit_changed() + +## Emitted every frame while the action is triggered. +signal triggered() + +## Emitted when the action started evaluating. +signal started() + +## Emitted every frame while the action is still evaluating. +signal ongoing() + +## Emitted when the action finished evaluating. +signal completed() + +## Emitted when the action was cancelled. +signal cancelled() + +var _last_state:GUIDEActionState = GUIDEActionState.COMPLETED + +var _value_bool:bool +## Returns the value of this action as bool. +var value_bool:bool: + get: return _value_bool + +## Returns the value of this action as float. +var value_axis_1d:float: + get: return _value.x + +var _value_axis_2d:Vector2 = Vector2.ZERO +## Returns the value of this action as Vector2. +var value_axis_2d:Vector2: + get: return _value_axis_2d + +var _value:Vector3 = Vector3.ZERO +## Returns the value of this action as Vector3. +var value_axis_3d:Vector3: + get: return _value + + +var _elapsed_seconds:float +## The amount of seconds elapsed since the action started evaluating. +var elapsed_seconds:float: + get: return _elapsed_seconds + +var _elapsed_ratio:float +## The ratio of the elapsed time to the hold time. This is a percentage +## of the hold time that has passed. If the action has no hold time, this will +## be 0 when the action is not triggered and 1 when the action is triggered. +## Otherwise, this will be a value between 0 and 1. +var elapsed_ratio:float: + get: return _elapsed_ratio + +var _triggered_seconds:float +## The amount of seconds elapsed since the action triggered. +var triggered_seconds:float: + get: return _triggered_seconds + + +## This is a hint for how long the input must remain actuated (in seconds) before the action triggers. +## It depends on the mapping in which this action is used. If the mapping has no hold trigger it will be -1. +## In general, you should not access this variable directly, but rather the `elapsed_ratio` property of the action +## which is a percentage of the hold time that has passed. +var _trigger_hold_threshold:float = -1.0 + +func _triggered(value:Vector3, delta:float) -> void: + _triggered_seconds += delta + _elapsed_ratio = 1.0 + _update_value(value) + _last_state = GUIDEActionState.TRIGGERED + triggered.emit() + _emit_godot_action_maybe(true) + +func _started(value:Vector3) -> void: + _elapsed_ratio = 0.0 + _update_value(value) + _last_state = GUIDEActionState.ONGOING + started.emit() + ongoing.emit() + +func _ongoing(value:Vector3, delta:float) -> void: + _elapsed_seconds += delta + if _trigger_hold_threshold > 0: + _elapsed_ratio = _elapsed_seconds / _trigger_hold_threshold + _update_value(value) + var was_triggered:bool = _last_state == GUIDEActionState.TRIGGERED + _last_state = GUIDEActionState.ONGOING + ongoing.emit() + # if the action reverts from triggered to ongoing, this counts as + # releasing the action for the godot action system. + if was_triggered: + _emit_godot_action_maybe(false) + + +func _cancelled(value:Vector3) -> void: + _elapsed_seconds = 0 + _elapsed_ratio = 0 + _update_value(value) + _last_state = GUIDEActionState.COMPLETED + cancelled.emit() + completed.emit() + +func _completed(value:Vector3) -> void: + _elapsed_seconds = 0 + _elapsed_ratio = 0 + _triggered_seconds = 0 + _update_value(value) + _last_state = GUIDEActionState.COMPLETED + completed.emit() + _emit_godot_action_maybe(false) + +func _emit_godot_action_maybe(pressed:bool) -> void: + if not emit_as_godot_actions: + return + + if name.is_empty(): + push_error("Cannot emit action into Godot's system because name is empty.") + return + + var godot_action = InputEventAction.new() + godot_action.action = name + godot_action.strength = _value.x + godot_action.pressed = pressed + Input.parse_input_event(godot_action) + +func _update_value(value:Vector3): + match action_value_type: + GUIDEActionValueType.BOOL, GUIDEActionValueType.AXIS_1D: + _value_bool = abs(value.x) > 0 + _value_axis_2d = Vector2(abs(value.x), 0) + _value = Vector3(value.x, 0, 0) + GUIDEActionValueType.AXIS_2D: + _value_bool = abs(value.x) > 0 + _value_axis_2d = Vector2(value.x, value.y) + _value = Vector3(value.x, value.y, 0) + GUIDEActionValueType.AXIS_3D: + _value_bool = abs(value.x) > 0 + _value_axis_2d = Vector2(value.x, value.y) + _value = value + +## Returns whether the action is currently triggered. Can be used for a +## polling style input. +func is_triggered() -> bool: + return _last_state == GUIDEActionState.TRIGGERED + + +## Returns whether the action is currently completed. Can be used for a +## polling style input. +func is_completed() -> bool: + return _last_state == GUIDEActionState.COMPLETED + + +## Returns whether the action is currently completed. Can be used for a +## polling style input. +func is_ongoing() -> bool: + return _last_state == GUIDEActionState.ONGOING + + +func _editor_name() -> String: + # Try to give the most user friendly name + if display_name != "": + return display_name + + if name != "": + return name + + return resource_path.get_file().replace(".tres", "") + + diff --git a/addons/guide/guide_action.gd.uid b/addons/guide/guide_action.gd.uid new file mode 100644 index 0000000..6a4397c --- /dev/null +++ b/addons/guide/guide_action.gd.uid @@ -0,0 +1 @@ +uid://cluhc11vixkf1 diff --git a/addons/guide/guide_action.svg b/addons/guide/guide_action.svg new file mode 100644 index 0000000..b39120c --- /dev/null +++ b/addons/guide/guide_action.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/addons/guide/guide_action.svg.import b/addons/guide/guide_action.svg.import new file mode 100644 index 0000000..a55db27 --- /dev/null +++ b/addons/guide/guide_action.svg.import @@ -0,0 +1,38 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bei7cw115tks0" +path="res://.godot/imported/guide_action.svg-4d1dfb47183d95c4796078798ce2d0ab.ctex" +metadata={ +"has_editor_variant": true, +"vram_texture": false +} + +[deps] + +source_file="res://addons/guide/guide_action.svg" +dest_files=["res://.godot/imported/guide_action.svg-4d1dfb47183d95c4796078798ce2d0ab.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=0.5 +editor/scale_with_editor_scale=true +editor/convert_colors_with_editor_theme=false diff --git a/addons/guide/guide_action_mapping.gd b/addons/guide/guide_action_mapping.gd new file mode 100644 index 0000000..f965b9f --- /dev/null +++ b/addons/guide/guide_action_mapping.gd @@ -0,0 +1,21 @@ +@icon("res://addons/guide/guide_internal.svg") +@tool +## An action to input mapping +class_name GUIDEActionMapping +extends Resource + +## The action to be mapped +@export var action:GUIDEAction: + set(value): + if value == action: + return + action = value + emit_changed() + +## A set of input mappings that can trigger the action +@export var input_mappings:Array[GUIDEInputMapping] = []: + set(value): + if value == input_mappings: + return + input_mappings = value + emit_changed() diff --git a/addons/guide/guide_action_mapping.gd.uid b/addons/guide/guide_action_mapping.gd.uid new file mode 100644 index 0000000..d0c1f54 --- /dev/null +++ b/addons/guide/guide_action_mapping.gd.uid @@ -0,0 +1 @@ +uid://cpplm41b5bt6m diff --git a/addons/guide/guide_input_mapping.gd b/addons/guide/guide_input_mapping.gd new file mode 100644 index 0000000..62d4dd9 --- /dev/null +++ b/addons/guide/guide_input_mapping.gd @@ -0,0 +1,177 @@ +@icon("res://addons/guide/guide_internal.svg") +@tool +## A mapping from actuated input to a trigger result +class_name GUIDEInputMapping +extends Resource + +## Whether the remapping configuration in this input mapping +## should override the configuration of the bound action. Enable +## this, to give a key a custom name or category for remapping. +@export var override_action_settings:bool = false: + set(value): + if override_action_settings == value: + return + override_action_settings = value + emit_changed() + +## If true, players can remap this input mapping. Note that the +## action to which this input is bound also needs to be remappable +## for this setting to have an effect. +@export var is_remappable:bool = false: + set(value): + if is_remappable == value: + return + is_remappable = value + emit_changed() + +## The display name of the input mapping shown to the player. If empty, +## the display name of the action is used. +@export var display_name:String = "": + set(value): + if display_name == value: + return + display_name = value + emit_changed() + +## The display category of the input mapping. If empty, the display name of the +## action is used. +@export var display_category:String = "": + set(value): + if display_category == value: + return + display_category = value + emit_changed() + + +@export_group("Mappings") +## The input to be actuated +@export var input:GUIDEInput: + set(value): + if value == input: + return + input = value + emit_changed() + + +## A list of modifiers that preprocess the actuated input before +## it is fed to the triggers. +@export var modifiers:Array[GUIDEModifier] = []: + set(value): + if value == modifiers: + return + modifiers = value + emit_changed() + + +## A list of triggers that could trigger the mapped action. +@export var triggers:Array[GUIDETrigger] = []: + set(value): + if value == triggers: + return + triggers = value + emit_changed() + +## Hint for how long the input must remain actuated (in seconds) before the mapping triggers. +## If the mapping has no hold trigger it will be -1. If it has multiple hold triggers +## the shortest hold time will be used. +var _trigger_hold_threshold:float = -1.0 + +var _state:GUIDETrigger.GUIDETriggerState = GUIDETrigger.GUIDETriggerState.NONE +var _value:Vector3 = Vector3.ZERO + +var _trigger_list:Array[GUIDETrigger] = [] +var _implicit_count:int = 0 +var _explicit_count:int = 0 + +## Called when the mapping is started to be used by GUIDE. Calculates +## the number of implicit and explicit triggers so we don't need to do this +## per frame. Also creates a default trigger when none is set. +func _initialize() -> void : + _trigger_list.clear() + + _implicit_count = 0 + _explicit_count = 0 + _trigger_hold_threshold = -1.0 + + if triggers.is_empty(): + # make a default trigger and use that + var default_trigger = GUIDETriggerDown.new() + default_trigger.actuation_threshold = 0 + _explicit_count = 1 + _trigger_list.append(default_trigger) + return + + for trigger in triggers: + match trigger._get_trigger_type(): + GUIDETrigger.GUIDETriggerType.EXPLICIT: + _explicit_count += 1 + GUIDETrigger.GUIDETriggerType.IMPLICIT: + _implicit_count += 1 + _trigger_list.append(trigger) + + # collect the hold threshold for hinting the UI about how long + # the input must be held down. This is only relevant for hold triggers + if trigger is GUIDETriggerHold: + if _trigger_hold_threshold == -1: + _trigger_hold_threshold = trigger.hold_treshold + else: + _trigger_hold_threshold = min(_trigger_hold_threshold, trigger.hold_treshold) + + + +func _update_state(delta:float, value_type:GUIDEAction.GUIDEActionValueType): + # Collect the current input value + var input_value:Vector3 = input._value if input != null else Vector3.ZERO + + # Run it through all modifiers + for modifier:GUIDEModifier in modifiers: + input_value = modifier._modify_input(input_value, delta, value_type) + + _value = input_value + + var triggered_implicits:int = 0 + var triggered_explicits:int = 0 + var triggered_blocked:int = 0 + + # Run over all triggers + var result:int = GUIDETrigger.GUIDETriggerState.NONE + for trigger:GUIDETrigger in _trigger_list: + var trigger_result:GUIDETrigger.GUIDETriggerState = trigger._update_state(_value, delta, value_type) + trigger._last_value = _value + + var trigger_type = trigger._get_trigger_type() + if trigger_result == GUIDETrigger.GUIDETriggerState.TRIGGERED: + match trigger_type: + GUIDETrigger.GUIDETriggerType.EXPLICIT: + triggered_explicits += 1 + GUIDETrigger.GUIDETriggerType.IMPLICIT: + triggered_implicits += 1 + GUIDETrigger.GUIDETriggerType.BLOCKING: + triggered_blocked += 1 + + # we only care about the nuances of explicit triggers. implicits and blocking + # can only really return yes or no, so they have no nuance + if trigger_type == GUIDETrigger.GUIDETriggerType.EXPLICIT: + # Higher value results take precedence over lower value results + result = max(result, trigger_result) + + # final collection + if triggered_blocked > 0: + # some blocker triggered which means that this cannot succeed + _state = GUIDETrigger.GUIDETriggerState.NONE + return + + if triggered_implicits < _implicit_count: + # not all implicits triggered, which also fails this binding + _state = GUIDETrigger.GUIDETriggerState.NONE + return + + if _explicit_count == 0 and _implicit_count > 0: + # if no explicits exist, its enough when all implicits trigger + _state = GUIDETrigger.GUIDETriggerState.TRIGGERED + return + + # return the best result + _state = result + + diff --git a/addons/guide/guide_input_mapping.gd.uid b/addons/guide/guide_input_mapping.gd.uid new file mode 100644 index 0000000..647d216 --- /dev/null +++ b/addons/guide/guide_input_mapping.gd.uid @@ -0,0 +1 @@ +uid://mtx1unc2aqn7 diff --git a/addons/guide/guide_input_tracker.gd b/addons/guide/guide_input_tracker.gd new file mode 100644 index 0000000..6dd7ef1 --- /dev/null +++ b/addons/guide/guide_input_tracker.gd @@ -0,0 +1,26 @@ +## Tracker that tracks input for a window and injects it into GUIDE. +## Will automatically keep track of sub-windows. +extends Node + +## Instruments a sub-window so it forwards input events to GUIDE. +static func _instrument(viewport:Viewport): + if viewport.has_meta("x-guide-instrumented"): + return + + var tracker = preload("guide_input_tracker.gd").new() + tracker.process_mode = Node.PROCESS_MODE_ALWAYS + viewport.add_child(tracker, false, Node.INTERNAL_MODE_BACK) + viewport.gui_focus_changed.connect(tracker._control_focused) + +## Catches unhandled input and forwards it to GUIDE +func _unhandled_input(event:InputEvent): + GUIDE.inject_input(event) + +## Some ... creative code ... to catch events from popup windows +## that are spawned by Godot's control nodes. +func _control_focused(control:Control): + if control is OptionButton or control is ColorPickerButton \ + or control is MenuButton or control is TabContainer: + _instrument(control.get_popup()) + + diff --git a/addons/guide/guide_input_tracker.gd.uid b/addons/guide/guide_input_tracker.gd.uid new file mode 100644 index 0000000..e8cd90d --- /dev/null +++ b/addons/guide/guide_input_tracker.gd.uid @@ -0,0 +1 @@ +uid://d2elu0augsms diff --git a/addons/guide/guide_internal.svg b/addons/guide/guide_internal.svg new file mode 100644 index 0000000..78d42de --- /dev/null +++ b/addons/guide/guide_internal.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/addons/guide/guide_internal.svg.import b/addons/guide/guide_internal.svg.import new file mode 100644 index 0000000..f235301 --- /dev/null +++ b/addons/guide/guide_internal.svg.import @@ -0,0 +1,38 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ddkj7kntb4fit" +path="res://.godot/imported/guide_internal.svg-560a143a1e289215e72d8844f5173844.ctex" +metadata={ +"has_editor_variant": true, +"vram_texture": false +} + +[deps] + +source_file="res://addons/guide/guide_internal.svg" +dest_files=["res://.godot/imported/guide_internal.svg-560a143a1e289215e72d8844f5173844.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=0.5 +editor/scale_with_editor_scale=true +editor/convert_colors_with_editor_theme=false diff --git a/addons/guide/guide_mapping_context.gd b/addons/guide/guide_mapping_context.gd new file mode 100644 index 0000000..097205b --- /dev/null +++ b/addons/guide/guide_mapping_context.gd @@ -0,0 +1,30 @@ +@tool +@icon("res://addons/guide/guide_mapping_context.svg") +class_name GUIDEMappingContext +extends Resource + +const GUIDESet = preload("guide_set.gd") + +## The display name for this mapping context during action remapping +@export var display_name:String: + set(value): + if value == display_name: + return + display_name = value + emit_changed() + +## The mappings. Do yourself a favour and use the G.U.I.D.E panel +## to edit these. +@export var mappings:Array[GUIDEActionMapping] = []: + set(value): + if value == mappings: + return + mappings = value + emit_changed() + + +func _editor_name() -> String: + if display_name.is_empty(): + return resource_path.get_file() + else: + return display_name diff --git a/addons/guide/guide_mapping_context.gd.uid b/addons/guide/guide_mapping_context.gd.uid new file mode 100644 index 0000000..8b58985 --- /dev/null +++ b/addons/guide/guide_mapping_context.gd.uid @@ -0,0 +1 @@ +uid://dsa1dnifd6w32 diff --git a/addons/guide/guide_mapping_context.svg b/addons/guide/guide_mapping_context.svg new file mode 100644 index 0000000..eaa1abf --- /dev/null +++ b/addons/guide/guide_mapping_context.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/addons/guide/guide_mapping_context.svg.import b/addons/guide/guide_mapping_context.svg.import new file mode 100644 index 0000000..6f740b7 --- /dev/null +++ b/addons/guide/guide_mapping_context.svg.import @@ -0,0 +1,38 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bcwpqc8016n7b" +path="res://.godot/imported/guide_mapping_context.svg-025f10fbbdb2bb11a96754ab9b725bea.ctex" +metadata={ +"has_editor_variant": true, +"vram_texture": false +} + +[deps] + +source_file="res://addons/guide/guide_mapping_context.svg" +dest_files=["res://.godot/imported/guide_mapping_context.svg-025f10fbbdb2bb11a96754ab9b725bea.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=0.5 +editor/scale_with_editor_scale=true +editor/convert_colors_with_editor_theme=false diff --git a/addons/guide/guide_reset.gd b/addons/guide/guide_reset.gd new file mode 100644 index 0000000..de09896 --- /dev/null +++ b/addons/guide/guide_reset.gd @@ -0,0 +1,15 @@ +extends Node + + +var _inputs_to_reset:Array[GUIDEInput] = [] + +func _enter_tree() -> void: + # this should run at the end of the frame, so we put in a low priority (= high number) + process_priority = 10000000 + +# Called every frame. 'delta' is the elapsed time since the previous frame. +func _process(delta: float) -> void: + for input:GUIDEInput in _inputs_to_reset: + input._reset() + + GUIDE._input_state._reset() diff --git a/addons/guide/guide_reset.gd.uid b/addons/guide/guide_reset.gd.uid new file mode 100644 index 0000000..62ba7f9 --- /dev/null +++ b/addons/guide/guide_reset.gd.uid @@ -0,0 +1 @@ +uid://cgr8gmw4k8j5x diff --git a/addons/guide/guide_set.gd b/addons/guide/guide_set.gd new file mode 100644 index 0000000..d439c91 --- /dev/null +++ b/addons/guide/guide_set.gd @@ -0,0 +1,40 @@ +## Helper class for modelling sets +var _values:Dictionary = {} + +func add(value:Variant) -> void: + _values[value] = value + + +func remove(value:Variant) -> void: + _values.erase(value) + + +func clear() -> void: + _values.clear() + +func is_empty() -> bool: + return _values.is_empty() + + +func pull() -> Variant: + if is_empty(): + return null + + var key = _values.keys()[0] + remove(key) + return key + + +func has(value:Variant) -> bool: + return _values.has(value) + +## Returns the first item for which the given matcher function returns +## a true value. +func first_match(matcher:Callable) -> Variant: + for key in _values.keys(): + if matcher.call(key): + return key + return null + +func values() -> Array: + return _values.keys() diff --git a/addons/guide/guide_set.gd.uid b/addons/guide/guide_set.gd.uid new file mode 100644 index 0000000..3c66856 --- /dev/null +++ b/addons/guide/guide_set.gd.uid @@ -0,0 +1 @@ +uid://ctvyc3kv17qad diff --git a/addons/guide/inputs/guide_input.gd b/addons/guide/inputs/guide_input.gd new file mode 100644 index 0000000..49877cc --- /dev/null +++ b/addons/guide/inputs/guide_input.gd @@ -0,0 +1,49 @@ +@tool +@icon("res://addons/guide/inputs/guide_input.svg") +## A class representing some actuated input. +class_name GUIDEInput +extends Resource + +## The current valueo f this input. Depending on the input type only parts of the +## returned vector may be relevant. +var _value:Vector3 = Vector3.ZERO + +## The current input state. This will be set by GUIDE when the input is used. +var _state:GUIDEInputState = null + +## Whether this input needs a reset per frame. _input is only called when +## there is input happening, but some GUIDE inputs may need to be reset +## in the absence of input. +func _needs_reset() -> bool: + return false + +## Resets the input value to the default value. Is called once per frame if +## _needs_reset returns true. +func _reset() -> void: + _value = Vector3.ZERO + +## Returns whether this input is the same input as the other input. +func is_same_as(other:GUIDEInput) -> bool: + return false + +## Called when the input is started to be used by GUIDE. Can be used to perform +## initializations. The state object can be used to subscribe to input events +## and to get the current input state. +func _begin_usage() -> void : + pass + +## Called, when the input is no longer used by GUIDE. Can be used to perform +## cleanup. +func _end_usage() -> void: + pass + + +func _editor_name() -> String: + return "" + +func _editor_description() -> String: + return "" + + +func _native_value_type() -> GUIDEAction.GUIDEActionValueType: + return -1 diff --git a/addons/guide/inputs/guide_input.gd.uid b/addons/guide/inputs/guide_input.gd.uid new file mode 100644 index 0000000..b40cfd9 --- /dev/null +++ b/addons/guide/inputs/guide_input.gd.uid @@ -0,0 +1 @@ +uid://ccvqqvfooyvn0 diff --git a/addons/guide/inputs/guide_input.svg b/addons/guide/inputs/guide_input.svg new file mode 100644 index 0000000..7e2314f --- /dev/null +++ b/addons/guide/inputs/guide_input.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/addons/guide/inputs/guide_input.svg.import b/addons/guide/inputs/guide_input.svg.import new file mode 100644 index 0000000..458a207 --- /dev/null +++ b/addons/guide/inputs/guide_input.svg.import @@ -0,0 +1,38 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://oku7f5t0ox3r" +path="res://.godot/imported/guide_input.svg-d7e8ae255db039e6a02cccc3f844cc0e.ctex" +metadata={ +"has_editor_variant": true, +"vram_texture": false +} + +[deps] + +source_file="res://addons/guide/inputs/guide_input.svg" +dest_files=["res://.godot/imported/guide_input.svg-d7e8ae255db039e6a02cccc3f844cc0e.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=0.5 +editor/scale_with_editor_scale=true +editor/convert_colors_with_editor_theme=false diff --git a/addons/guide/inputs/guide_input_action.gd b/addons/guide/inputs/guide_input_action.gd new file mode 100644 index 0000000..3c677a0 --- /dev/null +++ b/addons/guide/inputs/guide_input_action.gd @@ -0,0 +1,59 @@ +## An input that mirrors the action's value while the action is triggered. +@tool +class_name GUIDEInputAction +extends GUIDEInput + +## The action that this input should mirror. This is live tracked, so any change in +## the action will update the input. +@export var action:GUIDEAction: + set(value): + if value == action: + return + action = value + emit_changed() + +func _begin_usage(): + if is_instance_valid(action): + action.triggered.connect(_on) + action.completed.connect(_off) + action.ongoing.connect(_off) + if action.is_triggered(): + _on() + return + # not triggered or no action. + _off() + + +func _end_usage(): + if is_instance_valid(action): + action.triggered.disconnect(_on) + action.completed.disconnect(_off) + action.ongoing.disconnect(_off) + + +func _on() -> void: + # on is only called when the action is actually existing, so this is + # always not-null here + _value = action.value_axis_3d + +func _off() -> void: + _value = Vector3.ZERO + + +func is_same_as(other:GUIDEInput) -> bool: + return other is GUIDEInputAction and other.action == action + + +func _to_string(): + return "(GUIDEInputAction: " + str(action) + ")" + +func _editor_name() -> String: + return "Action" + + +func _editor_description() -> String: + return "An input that mirrors the action's value while the action is triggered." + + +func _native_value_type() -> GUIDEAction.GUIDEActionValueType: + return GUIDEAction.GUIDEActionValueType.AXIS_3D diff --git a/addons/guide/inputs/guide_input_action.gd.uid b/addons/guide/inputs/guide_input_action.gd.uid new file mode 100644 index 0000000..279176d --- /dev/null +++ b/addons/guide/inputs/guide_input_action.gd.uid @@ -0,0 +1 @@ +uid://mc0mxjvhanrx diff --git a/addons/guide/inputs/guide_input_any.gd b/addons/guide/inputs/guide_input_any.gd new file mode 100644 index 0000000..fed74ee --- /dev/null +++ b/addons/guide/inputs/guide_input_any.gd @@ -0,0 +1,150 @@ +## Input that triggers if any input from the given device class +## is given. +@tool +class_name GUIDEInputAny +extends GUIDEInput + + +## Should input from mouse buttons be considered? Deprecated, use +## mouse_buttons instead. +## @deprecated +var mouse:bool: + get: return mouse_buttons + set(value): mouse_buttons = value + +## Should input from joy buttons be considered. Deprecated, use +## joy_buttons instead. +## @deprecated +var joy:bool: + get: return joy_buttons + set(value): joy_buttons = value + +## Should input from mouse buttons be considered? +@export var mouse_buttons:bool = false + +## Should input from mouse movement be considered? +@export var mouse_movement:bool = false + +## Minimum movement distance of the mouse before it is considered +## moving. +@export var minimum_mouse_movement_distance:float = 1.0 + +## Should input from gamepad/joystick buttons be considered? +@export var joy_buttons:bool = false + +## Should input from gamepad/joystick axes be considered? +@export var joy_axes:bool = false + +## Minimum strength of a single joy axis actuation before it is considered +## as actuated. +@export var minimum_joy_axis_actuation_strength:float = 0.2 + +## Should input from the keyboard be considered? +@export var keyboard:bool = false + +## Should input from touch be considered? +@export var touch:bool = false + + +func _needs_reset() -> bool: + # Needs reset because we cannot detect the absence of input. + return true + +func _begin_usage() -> void: + # subscribe to relevant input events + if mouse_movement: + _state.mouse_position_changed.connect(_refresh) + if mouse_buttons: + _state.mouse_button_state_changed.connect(_refresh) + if keyboard: + _state.keyboard_state_changed.connect(_refresh) + if joy_buttons: + _state.joy_button_state_changed.connect(_refresh) + if joy_axes: + _state.joy_axis_state_changed.connect(_refresh) + if touch: + _state.touch_state_changed.connect(_refresh) + + _refresh() + +func _end_usage() -> void: + # unsubscribe from input events + if mouse_movement: + _state.mouse_position_changed.disconnect(_refresh) + if mouse_buttons: + _state.mouse_button_state_changed.disconnect(_refresh) + if keyboard: + _state.keyboard_state_changed.disconnect(_refresh) + if joy_buttons: + _state.joy_button_state_changed.disconnect(_refresh) + if joy_axes: + _state.joy_axis_state_changed.disconnect(_refresh) + if touch: + _state.touch_state_changed.disconnect(_refresh) + +func _refresh() -> void: + # if the input was already actuated this frame, remain + # actuated, even if more input events come in. Input will + # reset at the end of the frame. + if not _value.is_zero_approx(): + return + + if keyboard and _state.is_any_key_pressed(): + _value = Vector3.RIGHT + return + + if mouse_buttons and _state.is_any_mouse_button_pressed(): + _value = Vector3.RIGHT + return + + if mouse_movement and _state.get_mouse_delta_since_last_frame().length() >= minimum_mouse_movement_distance: + _value = Vector3.RIGHT + return + + if joy_buttons and _state.is_any_joy_button_pressed(): + _value = Vector3.RIGHT + return + + if joy_axes and _state.is_any_joy_axis_actuated(minimum_joy_axis_actuation_strength): + _value = Vector3.RIGHT + return + + if touch and _state.is_any_finger_down(): + _value = Vector3.RIGHT + return + + _value = Vector3.ZERO + + +func is_same_as(other:GUIDEInput) -> bool: + return other is GUIDEInputAny and \ + other.mouse == mouse and \ + other.joy == joy and \ + other.keyboard == keyboard + +func _editor_name() -> String: + return "Any Input" + + +func _editor_description() -> String: + return "Input that triggers if any input from the given device class is given." + + +func _native_value_type() -> GUIDEAction.GUIDEActionValueType: + return GUIDEAction.GUIDEActionValueType.BOOL + +# support for legacy properties +func _get_property_list(): + return [ + { + "name": "mouse", + "type": TYPE_BOOL, + "usage": PROPERTY_USAGE_NO_EDITOR + }, + { + "name": "joy", + "type": TYPE_BOOL, + "usage": PROPERTY_USAGE_NO_EDITOR + } + ] + diff --git a/addons/guide/inputs/guide_input_any.gd.uid b/addons/guide/inputs/guide_input_any.gd.uid new file mode 100644 index 0000000..8842c0e --- /dev/null +++ b/addons/guide/inputs/guide_input_any.gd.uid @@ -0,0 +1 @@ +uid://w3fbpe7r01n8 diff --git a/addons/guide/inputs/guide_input_joy_axis_1d.gd b/addons/guide/inputs/guide_input_joy_axis_1d.gd new file mode 100644 index 0000000..16ff7fc --- /dev/null +++ b/addons/guide/inputs/guide_input_joy_axis_1d.gd @@ -0,0 +1,40 @@ +## Input from a single joy axis. +@tool +class_name GUIDEInputJoyAxis1D +extends GUIDEInputJoyBase + +## The joy axis to sample +@export var axis:JoyAxis = JOY_AXIS_LEFT_X: + set(value): + if value == axis: + return + axis = value + emit_changed() + +func _begin_usage() -> void: + _state.joy_axis_state_changed.connect(_refresh) + +func _end_usage() -> void: + _state.joy_axis_state_changed.disconnect(_refresh) + +func _refresh() -> void: + _value.x = _state.get_joy_axis_value(joy_index, axis) + + +func is_same_as(other:GUIDEInput) -> bool: + return other is GUIDEInputJoyAxis1D and \ + other.axis == axis and \ + other.joy_index == joy_index + +func _to_string(): + return "(GUIDEInputJoyAxis1D: axis=" + str(axis) + ", joy_index=" + str(joy_index) + ")" + +func _editor_name() -> String: + return "Joy Axis 1D" + +func _editor_description() -> String: + return "The input from a single joy axis." + + +func _native_value_type() -> GUIDEAction.GUIDEActionValueType: + return GUIDEAction.GUIDEActionValueType.AXIS_1D diff --git a/addons/guide/inputs/guide_input_joy_axis_1d.gd.uid b/addons/guide/inputs/guide_input_joy_axis_1d.gd.uid new file mode 100644 index 0000000..60f719e --- /dev/null +++ b/addons/guide/inputs/guide_input_joy_axis_1d.gd.uid @@ -0,0 +1 @@ +uid://bbhoxsiqwo07l diff --git a/addons/guide/inputs/guide_input_joy_axis_2d.gd b/addons/guide/inputs/guide_input_joy_axis_2d.gd new file mode 100644 index 0000000..c8b0099 --- /dev/null +++ b/addons/guide/inputs/guide_input_joy_axis_2d.gd @@ -0,0 +1,53 @@ +## Input from two joy axes. +class_name GUIDEInputJoyAxis2D +extends GUIDEInputJoyBase + +## The joy axis to sample for x input. +@export var x:JoyAxis = JOY_AXIS_LEFT_X: + set(value): + if value == x: + return + x = value + emit_changed() + + +## The joy axis to sample for y input. +@export var y:JoyAxis = JOY_AXIS_LEFT_Y: + set(value): + if value == y: + return + y = value + emit_changed() + +func _begin_usage() -> void: + _state.joy_axis_state_changed.connect(_refresh) + _refresh() + +func _end_usage() -> void: + _state.joy_axis_state_changed.disconnect(_refresh) + + +func _refresh(): + _value.x = _state.get_joy_axis_value(joy_index, x) + _value.y = _state.get_joy_axis_value(joy_index, y) + + +func is_same_as(other:GUIDEInput) -> bool: + return other is GUIDEInputJoyAxis2D and \ + other.x == x and \ + other.y == y and \ + other.joy_index == joy_index + +func _to_string(): + return "(GUIDEInputJoyAxis2D: x=" + str(x) + ", y=" + str(y) + ", joy_index=" + str(joy_index) + ")" + + +func _editor_name() -> String: + return "Joy Axis 2D" + +func _editor_description() -> String: + return "The input from two Joy axes. Usually from a stick." + + +func _native_value_type() -> GUIDEAction.GUIDEActionValueType: + return GUIDEAction.GUIDEActionValueType.AXIS_2D diff --git a/addons/guide/inputs/guide_input_joy_axis_2d.gd.uid b/addons/guide/inputs/guide_input_joy_axis_2d.gd.uid new file mode 100644 index 0000000..e88d711 --- /dev/null +++ b/addons/guide/inputs/guide_input_joy_axis_2d.gd.uid @@ -0,0 +1 @@ +uid://doauobik3xyea diff --git a/addons/guide/inputs/guide_input_joy_base.gd b/addons/guide/inputs/guide_input_joy_base.gd new file mode 100644 index 0000000..5f1eddc --- /dev/null +++ b/addons/guide/inputs/guide_input_joy_base.gd @@ -0,0 +1,13 @@ +## Base class for joystick inputs. +@tool +class_name GUIDEInputJoyBase +extends GUIDEInput + +## The index of the connected joy pad to check. If -1 checks all joypads. +@export var joy_index:int = -1: + set(value): + if value == joy_index: + return + joy_index = value + emit_changed() + diff --git a/addons/guide/inputs/guide_input_joy_base.gd.uid b/addons/guide/inputs/guide_input_joy_base.gd.uid new file mode 100644 index 0000000..e66454d --- /dev/null +++ b/addons/guide/inputs/guide_input_joy_base.gd.uid @@ -0,0 +1 @@ +uid://cnqnbdsw3lw12 diff --git a/addons/guide/inputs/guide_input_joy_button.gd b/addons/guide/inputs/guide_input_joy_button.gd new file mode 100644 index 0000000..c74a9d6 --- /dev/null +++ b/addons/guide/inputs/guide_input_joy_button.gd @@ -0,0 +1,41 @@ +@tool +class_name GUIDEInputJoyButton +extends GUIDEInputJoyBase + +@export var button:JoyButton = JOY_BUTTON_A: + set(value): + if value == button: + return + button = value + emit_changed() + +func _begin_usage() -> void: + _state.joy_button_state_changed.connect(_refresh) + _refresh() + +func _end_usage() -> void: + _state.joy_button_state_changed.disconnect(_refresh) + +func _refresh(): + _value.x = 1.0 if _state.is_joy_button_pressed(joy_index, button) else 0.0 + + +func is_same_as(other:GUIDEInput) -> bool: + return other is GUIDEInputJoyButton and \ + other.button == button and \ + other.joy_index == joy_index + + +func _to_string(): + return "(GUIDEInputJoyButton: button=" + str(button) + ", joy_index=" + str(joy_index) + ")" + + +func _editor_name() -> String: + return "Joy Button" + +func _editor_description() -> String: + return "A button press from a joy button." + + +func _native_value_type() -> GUIDEAction.GUIDEActionValueType: + return GUIDEAction.GUIDEActionValueType.BOOL diff --git a/addons/guide/inputs/guide_input_joy_button.gd.uid b/addons/guide/inputs/guide_input_joy_button.gd.uid new file mode 100644 index 0000000..b52b7fe --- /dev/null +++ b/addons/guide/inputs/guide_input_joy_button.gd.uid @@ -0,0 +1 @@ +uid://rvttn472ix6v diff --git a/addons/guide/inputs/guide_input_key.gd b/addons/guide/inputs/guide_input_key.gd new file mode 100644 index 0000000..36d73e5 --- /dev/null +++ b/addons/guide/inputs/guide_input_key.gd @@ -0,0 +1,126 @@ +@tool +class_name GUIDEInputKey +extends GUIDEInput + +## The physical keycode of the key. +@export var key:Key: + set(value): + if value == key: + return + key = value + emit_changed() + + +@export_group("Modifiers") +## Whether shift must be pressed. +@export var shift:bool = false: + set(value): + if value == shift: + return + shift = value + emit_changed() + +## Whether control must be pressed. +@export var control:bool = false: + set(value): + if value == control: + return + control = value + emit_changed() + +## Whether alt must be pressed. +@export var alt:bool = false: + set(value): + if value == alt: + return + alt = value + emit_changed() + + +## Whether meta/win/cmd must be pressed. +@export var meta:bool = false: + set(value): + if value == meta: + return + meta = value + emit_changed() + +## Whether this input should fire if additional +## modifier keys are currently pressed. +@export var allow_additional_modifiers:bool = true: + set(value): + if value == allow_additional_modifiers: + return + allow_additional_modifiers = value + emit_changed() + +## Helper array. All keys that must be pressed for this input to considered actuated. +var _must_be_pressed:Array[Key] = [] +## Helper array. All keys that must not be pressed for this input to considered actuated. +var _must_not_be_pressed:Array[Key] = [] + +func _begin_usage() -> void: + _must_be_pressed = [key] + + # also add the modifiers to the list of keys that must be pressed + if shift: + _must_be_pressed.append(KEY_SHIFT) + if control: + _must_be_pressed.append(KEY_CTRL) + if alt: + _must_be_pressed.append(KEY_ALT) + if meta: + _must_be_pressed.append(KEY_META) + + _must_not_be_pressed = [] + # now unless additional modifiers are allowed, add all modifiers + # that are not required to the list of keys that must not be pressed + # except if the bound key is actually the modifier itself + if not allow_additional_modifiers: + if not shift and key != KEY_SHIFT: + _must_not_be_pressed.append(KEY_SHIFT) + if not control and key != KEY_CTRL: + _must_not_be_pressed.append(KEY_CTRL) + if not alt and key != KEY_ALT: + _must_not_be_pressed.append(KEY_ALT) + if not meta and key != KEY_META: + _must_not_be_pressed.append(KEY_META) + + # subscribe to input events + _state.keyboard_state_changed.connect(_refresh) + _refresh() + +func _end_usage() -> void: + # unsubscribe from input events + _state.keyboard_state_changed.disconnect(_refresh) + + +func _refresh(): + # We are actuated if all keys that must be pressed are pressed and none of the keys that must not be pressed + # are pressed. + var is_actuated:bool = _state.are_all_keys_pressed(_must_be_pressed) and not _state.is_at_least_one_key_pressed(_must_not_be_pressed) + _value.x = 1.0 if is_actuated else 0.0 + + +func is_same_as(other:GUIDEInput) -> bool: + return other is GUIDEInputKey \ + and other.key == key \ + and other.shift == shift \ + and other.control == control \ + and other.alt == alt \ + and other.meta == meta \ + and other.allow_additional_modifiers == allow_additional_modifiers + +func _to_string(): + return "(GUIDEInputKey: key=" + str(key) + ", shift=" + str(shift) + ", alt=" + str(alt) + ", control=" + str(control) + ", meta="+ str(meta) + ")" + + +func _editor_name() -> String: + return "Key" + +func _editor_description() -> String: + return "A button press on the keyboard." + + +func _native_value_type() -> GUIDEAction.GUIDEActionValueType: + return GUIDEAction.GUIDEActionValueType.BOOL diff --git a/addons/guide/inputs/guide_input_key.gd.uid b/addons/guide/inputs/guide_input_key.gd.uid new file mode 100644 index 0000000..584ef99 --- /dev/null +++ b/addons/guide/inputs/guide_input_key.gd.uid @@ -0,0 +1 @@ +uid://cw71o87tvdx3q diff --git a/addons/guide/inputs/guide_input_mouse_axis_1d.gd b/addons/guide/inputs/guide_input_mouse_axis_1d.gd new file mode 100644 index 0000000..cd437d7 --- /dev/null +++ b/addons/guide/inputs/guide_input_mouse_axis_1d.gd @@ -0,0 +1,57 @@ +@tool +class_name GUIDEInputMouseAxis1D +extends GUIDEInput + +enum GUIDEInputMouseAxis { + X, + Y +} + +@export var axis:GUIDEInputMouseAxis: + set(value): + if value == axis: + return + axis = value + emit_changed() + +# we don't get mouse updates when the mouse is not moving, so this needs to be +# reset every frame +func _needs_reset() -> bool: + return true + + +func _begin_usage() -> void: + # subscribe to mouse movement events + _state.mouse_position_changed.connect(_refresh) + _refresh() + +func _end_usage() -> void: + # unsubscribe from mouse movement events + _state.mouse_position_changed.disconnect(_refresh) + +func _refresh() -> void: + var delta:Vector2 = _state.get_mouse_delta_since_last_frame() + match axis: + GUIDEInputMouseAxis.X: + _value.x = delta.x + GUIDEInputMouseAxis.Y: + _value.x = delta.y + + +func is_same_as(other:GUIDEInput): + return other is GUIDEInputMouseAxis1D and other.axis == axis + +func _to_string(): + return "(GUIDEInputMouseAxis1D: axis=" + str(axis) + ")" + + +func _editor_name() -> String: + return "Mouse Axis 1D" + + +func _editor_description() -> String: + return "Relative mouse movement on a single axis." + + +func _native_value_type() -> GUIDEAction.GUIDEActionValueType: + return GUIDEAction.GUIDEActionValueType.AXIS_1D diff --git a/addons/guide/inputs/guide_input_mouse_axis_1d.gd.uid b/addons/guide/inputs/guide_input_mouse_axis_1d.gd.uid new file mode 100644 index 0000000..8dd27d8 --- /dev/null +++ b/addons/guide/inputs/guide_input_mouse_axis_1d.gd.uid @@ -0,0 +1 @@ +uid://b6bwb7ie85kl1 diff --git a/addons/guide/inputs/guide_input_mouse_axis_2d.gd b/addons/guide/inputs/guide_input_mouse_axis_2d.gd new file mode 100644 index 0000000..718ebf4 --- /dev/null +++ b/addons/guide/inputs/guide_input_mouse_axis_2d.gd @@ -0,0 +1,42 @@ +@tool +class_name GUIDEInputMouseAxis2D +extends GUIDEInput + + +# we don't get mouse updates when the mouse is not moving, so this needs to be +# reset every frame +func _needs_reset() -> bool: + return true + +func _begin_usage() -> void: + # subscribe to mouse movement events + _state.mouse_position_changed.connect(_refresh) + _refresh() + +func _end_usage() -> void: + # unsubscribe from mouse movement events + _state.mouse_position_changed.disconnect(_refresh) + +func _refresh() -> void: + var delta:Vector2 = _state.get_mouse_delta_since_last_frame() + _value.x = delta.x + _value.y = delta.y + +func is_same_as(other:GUIDEInput): + return other is GUIDEInputMouseAxis2D + + +func _to_string(): + return "(GUIDEInputMouseAxis2D)" + + +func _editor_name() -> String: + return "Mouse Axis 2D" + + +func _editor_description() -> String: + return "Relative mouse movement on 2 axes." + + +func _native_value_type() -> GUIDEAction.GUIDEActionValueType: + return GUIDEAction.GUIDEActionValueType.AXIS_2D diff --git a/addons/guide/inputs/guide_input_mouse_axis_2d.gd.uid b/addons/guide/inputs/guide_input_mouse_axis_2d.gd.uid new file mode 100644 index 0000000..0ef3f26 --- /dev/null +++ b/addons/guide/inputs/guide_input_mouse_axis_2d.gd.uid @@ -0,0 +1 @@ +uid://dh0hf08e0yit5 diff --git a/addons/guide/inputs/guide_input_mouse_button.gd b/addons/guide/inputs/guide_input_mouse_button.gd new file mode 100644 index 0000000..9fe0540 --- /dev/null +++ b/addons/guide/inputs/guide_input_mouse_button.gd @@ -0,0 +1,74 @@ +@tool +class_name GUIDEInputMouseButton +extends GUIDEInput + +@export var button: MouseButton = MOUSE_BUTTON_LEFT: + set(value): + if value == button: + return + button = value + emit_changed() + +# The value that this input will be reset to at the end of the frame. +var _reset_to: Vector3 +var _was_pressed_this_frame: bool + + +func _needs_reset() -> bool: + # mouse wheel up and down can potentially send multiple inputs within a single frame + # so we need to smooth this out a bit. + return button == MOUSE_BUTTON_WHEEL_UP or button == MOUSE_BUTTON_WHEEL_DOWN + + +func _reset() -> void: + _was_pressed_this_frame = false + _value = _reset_to + + +func _begin_usage() -> void: + # subscribe to mouse button events + _state.mouse_button_state_changed.connect(_refresh) + _refresh() + + +func _end_usage() -> void: + # unsubscribe from mouse button events + _state.mouse_button_state_changed.disconnect(_refresh) + + +func _refresh() -> void: + var is_pressed: bool = _state.is_mouse_button_pressed(button) + + if _needs_reset(): + # we always reset to the last event we received in a frame + # so after the frame is over we're still in sync. + _reset_to.x = 1.0 if is_pressed else 0.0 + + if is_pressed: + _was_pressed_this_frame = true + + if not is_pressed and _was_pressed_this_frame: + # keep pressed state for this frame + return + + _value.x = 1.0 if is_pressed else 0.0 + + +func is_same_as(other: GUIDEInput) -> bool: + return other is GUIDEInputMouseButton and other.button == button + + +func _to_string(): + return "(GUIDEInputMouseButton: button=" + str(button) + ")" + + +func _editor_name() -> String: + return "Mouse Button" + + +func _editor_description() -> String: + return "A press of a mouse button. The mouse wheel is also a button." + + +func _native_value_type() -> GUIDEAction.GUIDEActionValueType: + return GUIDEAction.GUIDEActionValueType.BOOL diff --git a/addons/guide/inputs/guide_input_mouse_button.gd.uid b/addons/guide/inputs/guide_input_mouse_button.gd.uid new file mode 100644 index 0000000..f21212d --- /dev/null +++ b/addons/guide/inputs/guide_input_mouse_button.gd.uid @@ -0,0 +1 @@ +uid://vgjlx6p007lp diff --git a/addons/guide/inputs/guide_input_mouse_position.gd b/addons/guide/inputs/guide_input_mouse_position.gd new file mode 100644 index 0000000..8b21d61 --- /dev/null +++ b/addons/guide/inputs/guide_input_mouse_position.gd @@ -0,0 +1,39 @@ +@tool +class_name GUIDEInputMousePosition +extends GUIDEInput + + +func _begin_usage() -> void : + # subscribe to mouse movement events + _state.mouse_position_changed.connect(_refresh) + _refresh() + +func _end_usage() -> void: + # unsubscribe from mouse movement events + _state.mouse_position_changed.disconnect(_refresh) + +func _refresh(): + var position:Vector2 = _state.get_mouse_position() + + _value.x = position.x + _value.y = position.y + + +func is_same_as(other:GUIDEInput): + return other is GUIDEInputMousePosition + + +func _to_string(): + return "(GUIDEInputMousePosition)" + + +func _editor_name() -> String: + return "Mouse Position" + + +func _editor_description() -> String: + return "Position of the mouse in the main viewport." + + +func _native_value_type() -> GUIDEAction.GUIDEActionValueType: + return GUIDEAction.GUIDEActionValueType.AXIS_2D diff --git a/addons/guide/inputs/guide_input_mouse_position.gd.uid b/addons/guide/inputs/guide_input_mouse_position.gd.uid new file mode 100644 index 0000000..d03116b --- /dev/null +++ b/addons/guide/inputs/guide_input_mouse_position.gd.uid @@ -0,0 +1 @@ +uid://deeru16npi81q diff --git a/addons/guide/inputs/guide_input_state.gd b/addons/guide/inputs/guide_input_state.gd new file mode 100644 index 0000000..7b6ba6a --- /dev/null +++ b/addons/guide/inputs/guide_input_state.gd @@ -0,0 +1,327 @@ +## The GUIDEInputState holds the current state of all input. It is basically a wrapper around Godot's Input +## class that provides some additional functionality like getting the information if any key or mouse button +## is currently pressed. It also is the single entry point for all input events from Godot, so we don't have +## process them in every GUIDEInput object and duplicate input handling code everywere. This also improves performance. +## +class_name GUIDEInputState + +## Device ID for a virtual joystick that means "any joystick". +## This relies on the fact that Godot's device IDs for joysticks are always >= 0. +## https://github.com/godotengine/godot/blob/80a3d205f1ad22e779a64921fb56d62b893881ae/core/input/input.cpp#L1821 +const ANY_JOY_DEVICE_ID: int = -1 + +## Signalled, when the keyboard state has changed. +signal keyboard_state_changed() +## Signalled, when the mouse motion state has changed. +signal mouse_position_changed() +## Signalled, when the mouse button state has changed. +signal mouse_button_state_changed() +## Signalled, when the joy button state has changed. +signal joy_button_state_changed() +## Signalled, when the joy axis state has changed. +signal joy_axis_state_changed() +## Signalled, when the touch state has changed. +signal touch_state_changed() + +# Keys that are currently pressed. Key is the key index, value is not important. The presence of a key in the dictionary +# indicates that the key is currently pressed. +var _keys: Dictionary = {} +# Fingers that are currently touching the screen. Key is the finger index, value is the position (Vector2). +var _finger_positions: Dictionary = {} +# The mouse movement since the last frame. +var _mouse_movement: Vector2 = Vector2.ZERO +# Mouse buttons that are currently pressed. Key is the button index, value is not important. The presence of a key +# in the dictionary indicates that the button is currently pressed. +var _mouse_buttons: Dictionary = {} +# Joy buttons that are currently pressed. Key is device id, value is a dictionary with the button index as key. The +# value of the inner dictionary is not important. The presence of a key in the inner dictionary indicates that the button +# is currently pressed. +var _joy_buttons: Dictionary = {} +# Current values of joy axes. Key is device id, value is a dictionary with the axis index as key. +# The value of the inner dictionary is the axis value. Once an axis is actuated, it will be added to the dictionary. +# We will not remove it anymore after that. +var _joy_axes: Dictionary = {} + +# The current mapping of joy index to device id. This is used to map the joy index to the device id. A joy index +# if -1 means "any device id". +var _joy_index_to_device_id: Dictionary = {} + +func _init(): + Input.joy_connection_changed.connect(_refresh_joy_device_ids) + _clear() + +# Used by the automated tests to make sure we don't have any leftovers from the +# last test. +func _clear(): + _keys.clear() + _finger_positions.clear() + _mouse_movement = Vector2.ZERO + _mouse_buttons.clear() + _joy_buttons.clear() + _joy_axes.clear() + + _refresh_joy_device_ids(0, 0) + + # ensure we have an entry for the virtual "any device id" + _joy_buttons[ANY_JOY_DEVICE_ID] = {} + _joy_axes[ANY_JOY_DEVICE_ID] = {} + + +# Called when any joy device is connected or disconnected. This will refresh the joy device ids and clear out any +# joy state which is not valid anymore. Will also notify relevant inputs. +func _refresh_joy_device_ids(_ignore1, _ignore2): + # refresh the joy device ids + _joy_index_to_device_id.clear() + var connected_joys:Array[int] = Input.get_connected_joypads() + for i in connected_joys.size(): + var device_id:int = connected_joys[i] + _joy_index_to_device_id[i] = device_id + # ensure we have an inner dictionary for the device id + # by setting this here, we don't need to check for the device id + # on every input event + if not _joy_buttons.has(device_id): + _joy_buttons[device_id] = {} + if not _joy_axes.has(device_id): + _joy_axes[device_id] = {} + + # add a virtual device id for the "any device id" case + _joy_index_to_device_id[-1] = ANY_JOY_DEVICE_ID + + var dirty: bool = false + + # clear out any joy state which is not valid anymore + for device_id in _joy_buttons.keys(): + if device_id != ANY_JOY_DEVICE_ID and not connected_joys.has(device_id): + dirty = true + _joy_buttons.erase(device_id) + + if dirty: + # notify all inputs that the joy state has changed + joy_button_state_changed.emit() + + dirty = false + for device_id in _joy_axes.keys(): + if device_id != ANY_JOY_DEVICE_ID and not connected_joys.has(device_id): + dirty = true + _joy_axes.erase(device_id) + + if dirty: + # notify all inputs that the joy state has changed + joy_axis_state_changed.emit() + +## Called at the end of the frame to reset the state before the next frame. +func _reset() -> void: + _mouse_movement = Vector2.ZERO + + +## Processes an input event and updates the state. +func _input(event: InputEvent) -> void: + # ----------------------- KEYBOARD ----------------------------- + if event is InputEventKey: + var index: int = event.physical_keycode + + if event.pressed: + _keys[index] = true + else: + _keys.erase(index) + + # Emit the keyboard state changed signal + keyboard_state_changed.emit() + return + + # ----------------------- MOUSE MOVEMENT ----------------------- + if event is InputEventMouseMotion: + # Emit the mouse moved signal with the distance moved + _mouse_movement += event.relative + mouse_position_changed.emit() + return + + # ----------------------- MOUSE BUTTONS ----------------------- + if event is InputEventMouseButton: + var index: int = event.button_index + + if event.pressed: + _mouse_buttons[index] = true + else: + _mouse_buttons.erase(index) + + # Emit the mouse button state changed signal + mouse_button_state_changed.emit() + return + + # ----------------------- JOYSTICK BUTTONS ----------------------- + if event is InputEventJoypadButton: + var device_id: int = event.device + var button: int = event.button_index + + if event.pressed: + # _refresh_joy_device_ids ensures we have an inner dictionary for the device id + # so we don't need to check for it here + _joy_buttons[device_id][button] = true + else: + _joy_buttons[device_id].erase(button) + + # finally set the ANY_JOY_DEVICE_ID state based on what we know + var any_value: bool = false + for inner in _joy_buttons.keys(): + if inner != ANY_JOY_DEVICE_ID and _joy_buttons[inner].has(button): + any_value = true + break + + if any_value: + _joy_buttons[ANY_JOY_DEVICE_ID][button] = true + else: + _joy_buttons[ANY_JOY_DEVICE_ID].erase(button) + + # Emit the joy button state changed signal + joy_button_state_changed.emit() + return + + # ----------------------- JOYSTICK AXES ----------------------- + if event is InputEventJoypadMotion: + var device_id: int = event.device + var axis: int = event.axis + + # update the axis value + _joy_axes[device_id][axis] = event.axis_value + + # for the ANY_JOY_DEVICE_ID, we apply the maximum actuation of all devices (in any direction) + var any_value: float = 0.0 + var maximum_actuation: float = 0.0 + for inner in _joy_axes.keys(): + if inner != ANY_JOY_DEVICE_ID and _joy_axes[inner].has(axis): + var strength: float = abs(_joy_axes[inner][axis]) + if strength > maximum_actuation: + maximum_actuation = strength + any_value = _joy_axes[inner][axis] + + _joy_axes[ANY_JOY_DEVICE_ID][axis] = any_value + + # Emit the joy axis state changed signal + joy_axis_state_changed.emit() + return + + # ----------------------- TOUCH INPUT ----------------------- + + if event is InputEventScreenTouch: + if event.pressed: + _finger_positions[event.index] = event.position + else: + _finger_positions.erase(event.index) + + touch_state_changed.emit() + return + + + if event is InputEventScreenDrag: + _finger_positions[event.index] = event.position + + touch_state_changed.emit() + return + + +## Returns true if the key with the given index is currently pressed. +func is_key_pressed(key: Key) -> bool: + return _keys.has(key) + +# Returns true if at least one key in the given array is currently pressed. +func is_at_least_one_key_pressed(keys:Array[Key]) -> bool: + for key in keys: + if _keys.has(key): + return true + return false + +# Returns true if all keys in the given array are currently pressed. +func are_all_keys_pressed(keys:Array[Key]) -> bool: + return _keys.has_all(keys) + +## Returns true if currently any key is pressed. +func is_any_key_pressed() -> bool: + return not _keys.is_empty() + +## Gets the mouse movement since the last frame. +## If no movement has been detected, returns Vector2.ZERO. +func get_mouse_delta_since_last_frame() -> Vector2: + return _mouse_movement + +## Returns the current mouse position in the root viewport. +func get_mouse_position() -> Vector2: + return Engine.get_main_loop().root.get_mouse_position() + + +## Returns true if the mouse button with the given index is currently pressed. +func is_mouse_button_pressed(button_index: MouseButton) -> bool: + return _mouse_buttons.has(button_index) + +## Returns true if currently any mouse button is pressed. +func is_any_mouse_button_pressed() -> bool: + return not _mouse_buttons.is_empty() + +## Returns the current value of the given joy axis on the device with the given index. If no +## such device or axis exists, returns 0.0. +func get_joy_axis_value(index:int, axis:JoyAxis) -> float: + var device_id: int = _joy_index_to_device_id.get(index, -9999) + # unknown device + if device_id == -9999: + return 0.0 + if _joy_axes.has(device_id): + var inner = _joy_axes[device_id] + return inner.get(axis, 0.0) + return 0.0 + +## Returns true, if the given joy button is currentely pressed on the device with the given index. +func is_joy_button_pressed(index:int, button:JoyButton) -> bool: + var device_id: int = _joy_index_to_device_id.get(index, -9999) + # unknown device + if device_id == -9999: + return false + if _joy_buttons.has(device_id): + return _joy_buttons[device_id].has(button) + return false + +## Returns true, if currently any joy button is pressed on any device. +func is_any_joy_button_pressed() -> bool: + for inner in _joy_buttons.values(): + if not inner.is_empty(): + return true + return false + +## Returns true if currently any joy axis is actuated with at least the given strength. +func is_any_joy_axis_actuated(minimum_strength: float) -> bool: + for inner in _joy_axes.values(): + for value in inner.values(): + if abs(value) >= minimum_strength: + return true + return false + +## Gets the finger position of the finger at the given index. +## If finger_index is < 0, returns the average of all finger positions. +## Will only return a position if the amount of fingers +## currently touching matches finger_count. +## +## If no finger position can be determined, returns Vector2.INF. +func get_finger_position(finger_index: int, finger_count: int) -> Vector2: + # if we have no finger positions right now, we can cut it short here + if _finger_positions.is_empty(): + return Vector2.INF + + # If the finger count doesn't match we have no position right now + if _finger_positions.size() != finger_count: + return Vector2.INF + + # if a finger index is set, use this fingers position, if available + if finger_index > -1: + return _finger_positions.get(finger_index, Vector2.INF) + + var result: Vector2 = Vector2.ZERO + for value in _finger_positions.values(): + result += value + + result /= float(finger_count) + return result + +## Returns true, if currently any finger is touching the screen. +func is_any_finger_down() -> bool: + return not _finger_positions.is_empty() + + diff --git a/addons/guide/inputs/guide_input_state.gd.uid b/addons/guide/inputs/guide_input_state.gd.uid new file mode 100644 index 0000000..09e5386 --- /dev/null +++ b/addons/guide/inputs/guide_input_state.gd.uid @@ -0,0 +1 @@ +uid://c11q8ft87iu87 diff --git a/addons/guide/inputs/guide_input_touch_angle.gd b/addons/guide/inputs/guide_input_touch_angle.gd new file mode 100644 index 0000000..dfcbf99 --- /dev/null +++ b/addons/guide/inputs/guide_input_touch_angle.gd @@ -0,0 +1,91 @@ +## Input representing angle changes between two fingers. +@tool +class_name GUIDEInputTouchAngle +extends GUIDEInput + +## Unit in which the angle should be provided +enum AngleUnit { + ## Angle is provided in radians + RADIANS = 0, + ## Angle is provided in degrees. + DEGREES = 1 +} + +## The unit in which the angle should be provided +@export var unit:AngleUnit = AngleUnit.RADIANS + +var _initial_angle:float = INF + +# We use the reset call to calculate the angle for this frame +# so it can serve as reference for the next frame +func _needs_reset() -> bool: + return true + +func _reset(): + var angle = _calculate_angle() + # update initial angle when input is actuated or stops being actuated + if is_finite(_initial_angle) != is_finite(angle): + _initial_angle = angle + +func _begin_usage() -> void: + # subscribe to relevant input events + _state.touch_state_changed.connect(_refresh) + _refresh() + +func _end_usage() -> void: + # unsubscribe from input events + _state.touch_state_changed.disconnect(_refresh) + +func _refresh(): + var angle := _calculate_angle() + # if either current angle or initial angle is not set, + # we are zero + if not is_finite(angle) or not is_finite(_initial_angle): + _value = Vector3.ZERO + return + + # we assume that _initial_distance is never 0 because + # you cannot have two fingers physically at the same place + # on a touch screen (unless you're a ghost, which raises + # the question how you are using a touch screen in the first place) + var final_angle:float = angle - _initial_angle + if unit == AngleUnit.DEGREES: + final_angle = rad_to_deg(final_angle) + + _value = Vector3(final_angle, 0, 0) + + +func _calculate_angle() -> float: + var pos1:Vector2 = _state.get_finger_position(0, 2) + # if we have no position for first finger, we can immediately abort + if not pos1.is_finite(): + return INF + + var pos2:Vector2 = _state.get_finger_position(1, 2) + # if there is no second finger, we can abort as well + if not pos2.is_finite(): + return INF + + # calculate distance for the fingers + return -pos1.angle_to_point(pos2) + + +func is_same_as(other:GUIDEInput): + return other is GUIDEInputTouchAngle and \ + other.unit == unit + + +func _to_string(): + return "(GUIDEInputTouchAngle unit=" + ("radians" if unit == AngleUnit.RADIANS else "degrees") + ")" + + +func _editor_name() -> String: + return "Touch Angle" + + +func _editor_description() -> String: + return "Angle changes of two touching fingers." + + +func _native_value_type() -> GUIDEAction.GUIDEActionValueType: + return GUIDEAction.GUIDEActionValueType.AXIS_1D diff --git a/addons/guide/inputs/guide_input_touch_angle.gd.uid b/addons/guide/inputs/guide_input_touch_angle.gd.uid new file mode 100644 index 0000000..7599a31 --- /dev/null +++ b/addons/guide/inputs/guide_input_touch_angle.gd.uid @@ -0,0 +1 @@ +uid://b3sxmqknm7ljs diff --git a/addons/guide/inputs/guide_input_touch_axis_1d.gd b/addons/guide/inputs/guide_input_touch_axis_1d.gd new file mode 100644 index 0000000..3615efa --- /dev/null +++ b/addons/guide/inputs/guide_input_touch_axis_1d.gd @@ -0,0 +1,44 @@ +@tool +class_name GUIDEInputTouchAxis1D +extends GUIDEInputTouchAxisBase + +enum GUIDEInputTouchAxis { + X, + Y +} + +@export var axis:GUIDEInputTouchAxis: + set(value): + if value == axis: + return + axis = value + emit_changed() + +func is_same_as(other:GUIDEInput): + return other is GUIDEInputTouchAxis1D and \ + other.finger_count == finger_count and \ + other.finger_index == finger_index and \ + other.axis == axis + +func _apply_value(value:Vector2): + match axis: + GUIDEInputTouchAxis.X: + _value = Vector3(value.x, 0, 0) + GUIDEInputTouchAxis.Y: + _value = Vector3(value.y, 0, 0) + +func _to_string(): + return "(GUIDEInputTouchAxis1D finger_count=" + str(finger_count) + \ + " finger_index=" + str(finger_index) +" axis=" + ("X" if axis == GUIDEInputTouchAxis.X else "Y") + ")" + + +func _editor_name() -> String: + return "Touch Axis1D" + + +func _editor_description() -> String: + return "Relative movement of a touching finger on a single axis." + + +func _native_value_type() -> GUIDEAction.GUIDEActionValueType: + return GUIDEAction.GUIDEActionValueType.AXIS_1D diff --git a/addons/guide/inputs/guide_input_touch_axis_1d.gd.uid b/addons/guide/inputs/guide_input_touch_axis_1d.gd.uid new file mode 100644 index 0000000..e925cd0 --- /dev/null +++ b/addons/guide/inputs/guide_input_touch_axis_1d.gd.uid @@ -0,0 +1 @@ +uid://idi72xetfe0s diff --git a/addons/guide/inputs/guide_input_touch_axis_2d.gd b/addons/guide/inputs/guide_input_touch_axis_2d.gd new file mode 100644 index 0000000..13b79d7 --- /dev/null +++ b/addons/guide/inputs/guide_input_touch_axis_2d.gd @@ -0,0 +1,27 @@ +@tool +class_name GUIDEInputTouchAxis2D +extends GUIDEInputTouchAxisBase + +func _apply_value(value:Vector2): + _value = Vector3(value.x, value.y, 0) + +func is_same_as(other:GUIDEInput): + return other is GUIDEInputTouchAxis2D and \ + other.finger_count == finger_count and \ + other.finger_index == finger_index + + +func _to_string(): + return "(GUIDEInputTouchAxis2D finger_count=" + str(finger_count) + \ + " finger_index=" + str(finger_index) +")" + + +func _editor_name() -> String: + return "Touch Axis2D" + + +func _editor_description() -> String: + return "2D relative movement of a touching finger." + +func _native_value_type() -> GUIDEAction.GUIDEActionValueType: + return GUIDEAction.GUIDEActionValueType.AXIS_2D diff --git a/addons/guide/inputs/guide_input_touch_axis_2d.gd.uid b/addons/guide/inputs/guide_input_touch_axis_2d.gd.uid new file mode 100644 index 0000000..d3e9254 --- /dev/null +++ b/addons/guide/inputs/guide_input_touch_axis_2d.gd.uid @@ -0,0 +1 @@ +uid://83ggp3br4dqv diff --git a/addons/guide/inputs/guide_input_touch_axis_base.gd b/addons/guide/inputs/guide_input_touch_axis_base.gd new file mode 100644 index 0000000..638abad --- /dev/null +++ b/addons/guide/inputs/guide_input_touch_axis_base.gd @@ -0,0 +1,49 @@ +## Base class for axis-like touch input. +@tool +class_name GUIDEInputTouchAxisBase +extends GUIDEInputTouchBase + +var _last_position:Vector2 = Vector2.INF + +# We use the reset call to calculate the position for this frame +# so it can serve as reference for the next frame +func _needs_reset() -> bool: + return true + +func _reset() -> void: + _last_position = _state.get_finger_position(finger_index, finger_count) + _apply_value(_calculate_value(_last_position)) + +func _begin_usage() -> void: + # subscribe to relevant input events + _state.touch_state_changed.connect(_refresh) + _refresh() + +func _end_usage() -> void: + # unsubscribe from input events + _state.touch_state_changed.disconnect(_refresh) + +func _refresh() -> void: + # calculate live position from the cache + var new_position:Vector2 = _state.get_finger_position(finger_index, finger_count) + + _apply_value(_calculate_value(new_position)) + +func _apply_value(value:Vector2): + pass + +func _calculate_value(new_position:Vector2) -> Vector2: + # if we cannot calculate a delta because old or new position + # are undefined, we say the delta is zero + if not _last_position.is_finite() or not new_position.is_finite(): + return Vector2.ZERO + + return new_position - _last_position + + +func is_same_as(other:GUIDEInput): + return other is GUIDEInputTouchAxis2D and \ + other.finger_count == finger_count and \ + other.finger_index == finger_index + + diff --git a/addons/guide/inputs/guide_input_touch_axis_base.gd.uid b/addons/guide/inputs/guide_input_touch_axis_base.gd.uid new file mode 100644 index 0000000..682ab7b --- /dev/null +++ b/addons/guide/inputs/guide_input_touch_axis_base.gd.uid @@ -0,0 +1 @@ +uid://c32np6tk2l12 diff --git a/addons/guide/inputs/guide_input_touch_base.gd b/addons/guide/inputs/guide_input_touch_base.gd new file mode 100644 index 0000000..7f9aa0b --- /dev/null +++ b/addons/guide/inputs/guide_input_touch_base.gd @@ -0,0 +1,22 @@ +## Base class for generic touch input +@tool +class_name GUIDEInputTouchBase +extends GUIDEInput + +## The number of fingers to be tracked. +@export_range(1, 5, 1, "or_greater") var finger_count:int = 1: + set(value): + if value < 1: + value = 1 + finger_count = value + emit_changed() + +## The index of the finger for which the position/delta should be reported +## (0 = first finger, 1 = second finger, etc.). If -1, reports the average position/delta for +## all fingers currently touching. +@export_range(-1, 4, 1, "or_greater") var finger_index:int = 0: + set(value): + if value < -1: + value = -1 + finger_index = value + emit_changed() diff --git a/addons/guide/inputs/guide_input_touch_base.gd.uid b/addons/guide/inputs/guide_input_touch_base.gd.uid new file mode 100644 index 0000000..05c2aba --- /dev/null +++ b/addons/guide/inputs/guide_input_touch_base.gd.uid @@ -0,0 +1 @@ +uid://dfmq3cijb3ju3 diff --git a/addons/guide/inputs/guide_input_touch_distance.gd b/addons/guide/inputs/guide_input_touch_distance.gd new file mode 100644 index 0000000..c14fb1d --- /dev/null +++ b/addons/guide/inputs/guide_input_touch_distance.gd @@ -0,0 +1,76 @@ +## Input representing the distance changes between two fingers. +@tool +class_name GUIDEInputTouchDistance +extends GUIDEInput + +var _initial_distance:float = INF + +# We use the reset call to calculate the distance for this frame +# so it can serve as reference for the next frame +func _needs_reset() -> bool: + return true + +func _reset(): + var distance = _calculate_distance() + # update initial distance when input is actuated or stops being actuated + if is_finite(_initial_distance) != is_finite(distance): + _initial_distance = distance + + +func _begin_usage() -> void: + # subscribe to relevant input events + _state.touch_state_changed.connect(_refresh) + _refresh() + +func _end_usage() -> void: + # unsubscribe from input events + _state.touch_state_changed.disconnect(_refresh) + + +func _refresh() -> void: + var distance := _calculate_distance() + # if either current distance or initial distance is not set, + # we are zero + if not is_finite(distance) or not is_finite(_initial_distance): + _value = Vector3.ZERO + return + + # we assume that _initial_distance is never 0 because + # you cannot have two fingers physically at the same place + # on a touch screen + _value = Vector3(distance / _initial_distance, 0, 0) + + +func _calculate_distance() -> float: + var pos1:Vector2 = _state.get_finger_position(0, 2) + # if we have no position for first finger, we can immediately abort + if not pos1.is_finite(): + return INF + + var pos2:Vector2 = _state.get_finger_position(1, 2) + # if there is no second finger, we can abort as well + if not pos2.is_finite(): + return INF + + # calculate distance for the fingers + return pos1.distance_to(pos2) + + +func is_same_as(other:GUIDEInput): + return other is GUIDEInputTouchDistance + + +func _to_string(): + return "(GUIDEInputTouchDistance)" + + +func _editor_name() -> String: + return "Touch Distance" + + +func _editor_description() -> String: + return "Distance of two touching fingers." + + +func _native_value_type() -> GUIDEAction.GUIDEActionValueType: + return GUIDEAction.GUIDEActionValueType.AXIS_1D diff --git a/addons/guide/inputs/guide_input_touch_distance.gd.uid b/addons/guide/inputs/guide_input_touch_distance.gd.uid new file mode 100644 index 0000000..a8b80d6 --- /dev/null +++ b/addons/guide/inputs/guide_input_touch_distance.gd.uid @@ -0,0 +1 @@ +uid://hjbdbq1wud8h diff --git a/addons/guide/inputs/guide_input_touch_position.gd b/addons/guide/inputs/guide_input_touch_position.gd new file mode 100644 index 0000000..5b62e89 --- /dev/null +++ b/addons/guide/inputs/guide_input_touch_position.gd @@ -0,0 +1,45 @@ +@tool +class_name GUIDEInputTouchPosition +extends GUIDEInputTouchBase + + +func _begin_usage(): + # subscribe to touch events + _state.touch_state_changed.connect(_refresh) + _refresh() + +func _end_usage(): + # unsubscribe from touch events + _state.touch_state_changed.disconnect(_refresh) + +func _refresh() -> void: + # update finger position + var position:Vector2 = _state.get_finger_position(finger_index, finger_count) + if not position.is_finite(): + _value = Vector3.INF + return + + _value = Vector3(position.x, position.y, 0) + + +func is_same_as(other:GUIDEInput): + return other is GUIDEInputTouchPosition and \ + other.finger_count == finger_count and \ + other.finger_index == finger_index + + +func _to_string(): + return "(GUIDEInputTouchPosition finger_count=" + str(finger_count) + \ + " finger_index=" + str(finger_index) +")" + + +func _editor_name() -> String: + return "Touch Position" + + +func _editor_description() -> String: + return "Position of a touching finger." + + +func _native_value_type() -> GUIDEAction.GUIDEActionValueType: + return GUIDEAction.GUIDEActionValueType.AXIS_2D diff --git a/addons/guide/inputs/guide_input_touch_position.gd.uid b/addons/guide/inputs/guide_input_touch_position.gd.uid new file mode 100644 index 0000000..2324ae9 --- /dev/null +++ b/addons/guide/inputs/guide_input_touch_position.gd.uid @@ -0,0 +1 @@ +uid://c2bvqibcqlmv5 diff --git a/addons/guide/inputs/guide_touch_state.gd.uid b/addons/guide/inputs/guide_touch_state.gd.uid new file mode 100644 index 0000000..2dd6e7e --- /dev/null +++ b/addons/guide/inputs/guide_touch_state.gd.uid @@ -0,0 +1 @@ +uid://duw4xaip8onca diff --git a/addons/guide/modifiers/guide_modifier.gd b/addons/guide/modifiers/guide_modifier.gd new file mode 100644 index 0000000..6253480 --- /dev/null +++ b/addons/guide/modifiers/guide_modifier.gd @@ -0,0 +1,23 @@ +@tool +@icon("res://addons/guide/modifiers/guide_modifier.svg") +class_name GUIDEModifier +extends Resource + +## Called when the modifier is started to be used by GUIDE. Can be used to perform +## initializations. +func _begin_usage() -> void : + pass + +## Called, when the modifier is no longer used by GUIDE. Can be used to perform +## cleanup. +func _end_usage() -> void: + pass + +func _modify_input(input:Vector3, delta:float, value_type:GUIDEAction.GUIDEActionValueType) -> Vector3: + return input + +func _editor_name() -> String: + return "" + +func _editor_description() -> String: + return "" diff --git a/addons/guide/modifiers/guide_modifier.gd.uid b/addons/guide/modifiers/guide_modifier.gd.uid new file mode 100644 index 0000000..97af6a3 --- /dev/null +++ b/addons/guide/modifiers/guide_modifier.gd.uid @@ -0,0 +1 @@ +uid://bl8rjl4oaldje diff --git a/addons/guide/modifiers/guide_modifier.svg b/addons/guide/modifiers/guide_modifier.svg new file mode 100644 index 0000000..e51d736 --- /dev/null +++ b/addons/guide/modifiers/guide_modifier.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/addons/guide/modifiers/guide_modifier.svg.import b/addons/guide/modifiers/guide_modifier.svg.import new file mode 100644 index 0000000..3d85142 --- /dev/null +++ b/addons/guide/modifiers/guide_modifier.svg.import @@ -0,0 +1,38 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://j64d8n4am2uh" +path="res://.godot/imported/guide_modifier.svg-8cf939ca3244410aba00f7b558561d72.ctex" +metadata={ +"has_editor_variant": true, +"vram_texture": false +} + +[deps] + +source_file="res://addons/guide/modifiers/guide_modifier.svg" +dest_files=["res://.godot/imported/guide_modifier.svg-8cf939ca3244410aba00f7b558561d72.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=0.5 +editor/scale_with_editor_scale=true +editor/convert_colors_with_editor_theme=false diff --git a/addons/guide/modifiers/guide_modifier_3d_coordinates.gd b/addons/guide/modifiers/guide_modifier_3d_coordinates.gd new file mode 100644 index 0000000..21abb90 --- /dev/null +++ b/addons/guide/modifiers/guide_modifier_3d_coordinates.gd @@ -0,0 +1,53 @@ +## Converts a position input in viewport coordinates (e.g. from the mouse position input) +## into 3D coordinates (e.g. 3D world coordinates). Useful to get a 3D 'world' position. +## Returns a Vector3.INF if no 3D world coordinates can be determined. +@tool +class_name GUIDEModifier3DCoordinates +extends GUIDEModifier + +## The maximum depth of the ray cast used to detect the 3D position. +@export var max_depth:float = 1000.0 + +## Whether the rays cast should collide with areas. +@export var collide_with_areas:bool = false + +## Collision mask to use for the ray cast. +@export_flags_3d_physics var collision_mask:int + + +func _modify_input(input:Vector3, delta:float, value_type:GUIDEAction.GUIDEActionValueType) -> Vector3: + # if we collide with nothing, no need to even try + if collision_mask == 0: + return Vector3.INF + + if not input.is_finite(): + return Vector3.INF + + var viewport = Engine.get_main_loop().root + var camera:Camera3D = viewport.get_camera_3d() + if camera == null: + return Vector3.INF + + + var input_position:Vector2 = Vector2(input.x, input.y) + + var from:Vector3 = camera.project_ray_origin(input_position) + var to:Vector3 = from + camera.project_ray_normal(input_position) * max_depth + var query:= PhysicsRayQueryParameters3D.create(from, to, collision_mask) + query.collide_with_areas = collide_with_areas + + var result = viewport.world_3d.direct_space_state.intersect_ray(query) + if result.has("position"): + return result.position + + return Vector3.INF + + + +func _editor_name() -> String: + return "3D coordinates" + + +func _editor_description() -> String: + return "Converts a position input in viewport coordinates (e.g. from the mouse position input)\n" + \ + "into 3D coordinates (e.g. 3D world coordinates). Useful to get a 3D 'world' position." diff --git a/addons/guide/modifiers/guide_modifier_3d_coordinates.gd.uid b/addons/guide/modifiers/guide_modifier_3d_coordinates.gd.uid new file mode 100644 index 0000000..211fd4a --- /dev/null +++ b/addons/guide/modifiers/guide_modifier_3d_coordinates.gd.uid @@ -0,0 +1 @@ +uid://cw8qjwdktercg diff --git a/addons/guide/modifiers/guide_modifier_8_way_direction.gd b/addons/guide/modifiers/guide_modifier_8_way_direction.gd new file mode 100644 index 0000000..8ae2954 --- /dev/null +++ b/addons/guide/modifiers/guide_modifier_8_way_direction.gd @@ -0,0 +1,47 @@ +@tool +## A filter that converts a 2D input into a boolean that is true when the +## input direction matches the selected direction. Note, that north is negative Y, +## because in Godot negative Y is up. +class_name GUIDEModifier8WayDirection +extends GUIDEModifier + +enum GUIDEDirection { + EAST = 0, + NORTH_EAST = 1, + NORTH = 2, + NORTH_WEST = 3, + WEST = 4, + SOUTH_WEST = 5, + SOUTH = 6, + SOUTH_EAST = 7 +} + +## The direction in which the input should point. +@export var direction:GUIDEDirection = GUIDEDirection.EAST + +func _modify_input(input:Vector3, delta:float, value_type:GUIDEAction.GUIDEActionValueType) -> Vector3: + if not input.is_finite(): + return Vector3.INF + + if input.is_zero_approx(): + return Vector3.ZERO + + + + # get the angle in which the direction is pointing in radians. + var angle_radians = atan2( -input.y, input.x ); + var octant = roundi( 8 * angle_radians / TAU + 8 ) % 8; + if octant == direction: + return Vector3.RIGHT # (1, 0, 0) indicating boolean true + else: + return Vector3.ZERO + + +func _editor_name() -> String: + return "8-way direction" + + +func _editor_description() -> String: + return "Converts a 2D input into a boolean that is true when the\n" + \ + "input direction matches the selected direction. Note, that north is negative Y,\n" + \ + "because in Godot negative Y is up." diff --git a/addons/guide/modifiers/guide_modifier_8_way_direction.gd.uid b/addons/guide/modifiers/guide_modifier_8_way_direction.gd.uid new file mode 100644 index 0000000..3e3dc98 --- /dev/null +++ b/addons/guide/modifiers/guide_modifier_8_way_direction.gd.uid @@ -0,0 +1 @@ +uid://cmjelxqb3e7n6 diff --git a/addons/guide/modifiers/guide_modifier_canvas_coordinates.gd b/addons/guide/modifiers/guide_modifier_canvas_coordinates.gd new file mode 100644 index 0000000..23a5938 --- /dev/null +++ b/addons/guide/modifiers/guide_modifier_canvas_coordinates.gd @@ -0,0 +1,35 @@ +## Converts a position input in viewport coordinates (e.g. from the mouse position input) +## into canvas coordinates (e.g. 2D world coordinates). Useful to get a 2D 'world' position. +@tool +class_name GUIDEModifierCanvasCoordinates +extends GUIDEModifier + +## If checked, the input will be treated as relative input (position change) +## rather than absolute input (position). +@export var relative_input:bool: + set(value): + relative_input = value + emit_changed() + +func _modify_input(input:Vector3, delta:float, value_type:GUIDEAction.GUIDEActionValueType) -> Vector3: + if not input.is_finite(): + return Vector3.INF + + var viewport = Engine.get_main_loop().root + var transform = viewport.canvas_transform.affine_inverse() + var coordinates = transform * Vector2(input.x, input.y) + + if relative_input: + var origin = transform * Vector2.ZERO + coordinates -= origin + + return Vector3(coordinates.x, coordinates.y, input.z) + + +func _editor_name() -> String: + return "Canvas coordinates" + + +func _editor_description() -> String: + return "Converts a position input in viewport coordinates (e.g. from the mouse position input)\n" + \ + "into canvas coordinates (e.g. 2D world coordinates). Useful to get a 2D 'world' position." diff --git a/addons/guide/modifiers/guide_modifier_canvas_coordinates.gd.uid b/addons/guide/modifiers/guide_modifier_canvas_coordinates.gd.uid new file mode 100644 index 0000000..e93e75c --- /dev/null +++ b/addons/guide/modifiers/guide_modifier_canvas_coordinates.gd.uid @@ -0,0 +1 @@ +uid://vho2v7ax07ef diff --git a/addons/guide/modifiers/guide_modifier_curve.gd b/addons/guide/modifiers/guide_modifier_curve.gd new file mode 100644 index 0000000..bb55b11 --- /dev/null +++ b/addons/guide/modifiers/guide_modifier_curve.gd @@ -0,0 +1,51 @@ +@tool +## Applies a separate curve to each input axis. +class_name GUIDEModifierCurve +extends GUIDEModifier + + +## The curve to apply to the x axis +@export var curve: Curve = default_curve() + +## Apply modifier to X axis +@export var x: bool = true + +## Apply modifier to Y axis +@export var y: bool = true + +## Apply modifier to Z axis +@export var z: bool = true + + +## Create default curve resource with a smoothstep, 0.0 - 1.0 input/output range +static func default_curve() -> Curve: + var curve = Curve.new() + curve.add_point(Vector2(0.0, 0.0)) + curve.add_point(Vector2(1.0, 1.0)) + + return curve + + +func _modify_input(input: Vector3, delta: float, value_type: GUIDEAction.GUIDEActionValueType) -> Vector3: + # Curve should never be null + if curve == null: + push_error("No curve added to Curve modifier.") + return input + + if not input.is_finite(): + return Vector3.INF + + # Return vector with enabled axes modified, others remain unchanged. + return Vector3( + curve.sample(input.x) if x else input.x, + curve.sample(input.y) if y else input.y, + curve.sample(input.z) if z else input.z + ) + + +func _editor_name() -> String: + return "Curve" + + +func _editor_description() -> String: + return "Applies a curve to each input axis." diff --git a/addons/guide/modifiers/guide_modifier_curve.gd.uid b/addons/guide/modifiers/guide_modifier_curve.gd.uid new file mode 100644 index 0000000..8b18651 --- /dev/null +++ b/addons/guide/modifiers/guide_modifier_curve.gd.uid @@ -0,0 +1 @@ +uid://trjb6t778n84 diff --git a/addons/guide/modifiers/guide_modifier_deadzone.gd b/addons/guide/modifiers/guide_modifier_deadzone.gd new file mode 100644 index 0000000..b40a00c --- /dev/null +++ b/addons/guide/modifiers/guide_modifier_deadzone.gd @@ -0,0 +1,63 @@ +@tool +## Inputs between the lower and upper threshold are mapped 0 -> 1. +## Values outside the thresholds are clamped. +class_name GUIDEModifierDeadzone +extends GUIDEModifier + +## Lower threshold for the deadzone. +@export_range(0,1) var lower_threshold:float = 0.2: + set(value): + if value > upper_threshold: + lower_threshold = upper_threshold + else: + lower_threshold = value + emit_changed() + + +## Upper threshold for the deadzone. +@export_range(0,1) var upper_threshold:float = 1.0: + set(value): + if value < lower_threshold: + upper_threshold = lower_threshold + else: + upper_threshold = value + emit_changed() + + +func _rescale(value:float) -> float: + return min(1.0, (max(0.0, abs(value) - lower_threshold) / (upper_threshold - lower_threshold))) * sign(value) + + +func _modify_input(input:Vector3, delta:float, value_type:GUIDEAction.GUIDEActionValueType) -> Vector3: + if upper_threshold <= lower_threshold: + return input + + if not input.is_finite(): + return Vector3.INF + + match value_type: + GUIDEAction.GUIDEActionValueType.BOOL, GUIDEAction.GUIDEActionValueType.AXIS_1D: + return Vector3(_rescale(input.x), input.y, input.z) + + GUIDEAction.GUIDEActionValueType.AXIS_2D: + var v2d = Vector2(input.x, input.y) + if v2d.is_zero_approx(): + return Vector3(0, 0, input.z) + v2d = v2d.normalized() * _rescale(v2d.length()) + return Vector3(v2d.x, v2d.y, input.z) + + GUIDEAction.GUIDEActionValueType.AXIS_3D: + if input.is_zero_approx(): + return Vector3.ZERO + return input.normalized() * _rescale(input.length()) + _: + push_error("Unsupported value type. This is a bug. Please report it.") + return input + + +func _editor_name() -> String: + return "Deadzone" + +func _editor_description() -> String: + return "Inputs between the lower and upper threshold are mapped 0 -> 1.\n" + \ + "Values outside the thresholds are clamped." diff --git a/addons/guide/modifiers/guide_modifier_deadzone.gd.uid b/addons/guide/modifiers/guide_modifier_deadzone.gd.uid new file mode 100644 index 0000000..152bb06 --- /dev/null +++ b/addons/guide/modifiers/guide_modifier_deadzone.gd.uid @@ -0,0 +1 @@ +uid://c47lkb48itd6l diff --git a/addons/guide/modifiers/guide_modifier_input_swizzle.gd b/addons/guide/modifiers/guide_modifier_input_swizzle.gd new file mode 100644 index 0000000..115a50f --- /dev/null +++ b/addons/guide/modifiers/guide_modifier_input_swizzle.gd @@ -0,0 +1,43 @@ +## Swizzle the input vector components. Useful to map 1D input to 2D or vice versa. +@tool +class_name GUIDEModifierInputSwizzle +extends GUIDEModifier + +enum GUIDEInputSwizzleOperation { + ## Swap X and Y axes. + YXZ, + ## Swap X and Z axes. + ZYX, + ## Swap Y and Z axes. + XZY, + ## Y to X, Z to Y, X to Z. + YZX, + ## Y to Z, Z to X, X to Y. + ZXY +} + +## The new order into which the input should be brought. +@export var order:GUIDEInputSwizzleOperation = GUIDEInputSwizzleOperation.YXZ + + +func _modify_input(input:Vector3, delta:float, value_type:GUIDEAction.GUIDEActionValueType) -> Vector3: + match order: + GUIDEInputSwizzleOperation.YXZ: + return Vector3(input.y, input.x, input.z) + GUIDEInputSwizzleOperation.ZYX: + return Vector3(input.z, input.y, input.x) + GUIDEInputSwizzleOperation.XZY: + return Vector3(input.x, input.z, input.y) + GUIDEInputSwizzleOperation.YZX: + return Vector3(input.y, input.z, input.x) + GUIDEInputSwizzleOperation.ZXY: + return Vector3(input.z, input.x, input.y) + _: + push_error("Unknown order ", order , " this is most likely a bug, please report it.") + return input + +func _editor_name() -> String: + return "Input Swizzle" + +func _editor_description() -> String: + return "Swizzle the input vector components. Useful to map 1D input to 2D or vice versa." diff --git a/addons/guide/modifiers/guide_modifier_input_swizzle.gd.uid b/addons/guide/modifiers/guide_modifier_input_swizzle.gd.uid new file mode 100644 index 0000000..71f872d --- /dev/null +++ b/addons/guide/modifiers/guide_modifier_input_swizzle.gd.uid @@ -0,0 +1 @@ +uid://bm5gjgadon6hb diff --git a/addons/guide/modifiers/guide_modifier_map_range.gd b/addons/guide/modifiers/guide_modifier_map_range.gd new file mode 100644 index 0000000..65f2275 --- /dev/null +++ b/addons/guide/modifiers/guide_modifier_map_range.gd @@ -0,0 +1,67 @@ +@tool +## Maps an input range to an output range and optionally clamps the output. +class_name GUIDEModifierMapRange +extends GUIDEModifier + +## Should the output be clamped to the range? +@export var apply_clamp:bool = true + +## The minimum input value +@export var input_min:float = 0.0 + +## The maximum input value +@export var input_max:float = 1.0 + +## The minimum output value +@export var output_min:float = 0.0 + +## The maximum output value +@export var output_max:float = 1.0 + +## Apply modifier to X axis +@export var x:bool = true + +## Apply modifier to Y axis +@export var y:bool = true + +## Apply modifier to Z axis +@export var z:bool = true + +var _omin:float +var _omax:float + +func _begin_usage(): + # we calculate the min and max of the output range here, so we can use them later and don't have to + # recalculate them every time the modifier is used + _omin = min(output_min, output_max) + _omax = max(output_min, output_max) + +func _modify_input(input:Vector3, delta:float, value_type:GUIDEAction.GUIDEActionValueType) -> Vector3: + if not input.is_finite(): + return Vector3.INF + + var x_value:float = remap(input.x, input_min, input_max, output_min, output_max) + var y_value:float = remap(input.y, input_min, input_max, output_min, output_max) + var z_value:float = remap(input.z, input_min, input_max, output_min, output_max) + + if apply_clamp: + # clamp doesn't handle reverse ranges, so we need to use our calculated normalized output range + # to clamp the output values + x_value = clamp(x_value, _omin, _omax) + y_value = clamp(y_value, _omin, _omax) + z_value = clamp(z_value, _omin, _omax) + + # Return vector with enabled axes set, others unchanged + return Vector3( + x_value if x else input.x, + y_value if y else input.y, + z_value if z else input.z, + ) + + +func _editor_name() -> String: + return "Map Range" + + +func _editor_description() -> String: + return "Maps an input range to an output range and optionally clamps the output" diff --git a/addons/guide/modifiers/guide_modifier_map_range.gd.uid b/addons/guide/modifiers/guide_modifier_map_range.gd.uid new file mode 100644 index 0000000..9cdcf40 --- /dev/null +++ b/addons/guide/modifiers/guide_modifier_map_range.gd.uid @@ -0,0 +1 @@ +uid://cs70d8i3sqe7p diff --git a/addons/guide/modifiers/guide_modifier_negate.gd b/addons/guide/modifiers/guide_modifier_negate.gd new file mode 100644 index 0000000..895d1ef --- /dev/null +++ b/addons/guide/modifiers/guide_modifier_negate.gd @@ -0,0 +1,52 @@ +## Inverts input per axis. +@tool +class_name GUIDEModifierNegate +extends GUIDEModifier + +## Whether the X axis should be inverted. +@export var x:bool = true: + set(value): + if x == value: + return + x = value + _update_caches() + emit_changed() + +## Whether the Y axis should be inverted. +@export var y:bool = true: + set(value): + if y == value: + return + y = value + _update_caches() + emit_changed() + +## Whether the Z axis should be inverted. +@export var z:bool = true: + set(value): + if z == value: + return + z = value + _update_caches() + emit_changed() + +var _multiplier:Vector3 = Vector3.ONE * -1 + +func _update_caches(): + _multiplier.x = -1 if x else 1 + _multiplier.y = -1 if y else 1 + _multiplier.z = -1 if z else 1 + + +func _modify_input(input:Vector3, delta:float, value_type:GUIDEAction.GUIDEActionValueType) -> Vector3: + if not input.is_finite(): + return Vector3.INF + + return input * _multiplier + +func _editor_name() -> String: + return "Negate" + + +func _editor_description() -> String: + return "Inverts input per axis." diff --git a/addons/guide/modifiers/guide_modifier_negate.gd.uid b/addons/guide/modifiers/guide_modifier_negate.gd.uid new file mode 100644 index 0000000..5aefba2 --- /dev/null +++ b/addons/guide/modifiers/guide_modifier_negate.gd.uid @@ -0,0 +1 @@ +uid://ckggy40lm0vjc diff --git a/addons/guide/modifiers/guide_modifier_normalize.gd b/addons/guide/modifiers/guide_modifier_normalize.gd new file mode 100644 index 0000000..7b10f52 --- /dev/null +++ b/addons/guide/modifiers/guide_modifier_normalize.gd @@ -0,0 +1,17 @@ +## Normalizes the input vector. +@tool +class_name GUIDEModifierNormalize +extends GUIDEModifier + +func _modify_input(input:Vector3, delta:float, value_type:GUIDEAction.GUIDEActionValueType) -> Vector3: + if not input.is_finite(): + return Vector3.INF + + return input.normalized() + +func _editor_name() -> String: + return "Normalize" + + +func _editor_description() -> String: + return "Normalizes the input vector." diff --git a/addons/guide/modifiers/guide_modifier_normalize.gd.uid b/addons/guide/modifiers/guide_modifier_normalize.gd.uid new file mode 100644 index 0000000..e6762fd --- /dev/null +++ b/addons/guide/modifiers/guide_modifier_normalize.gd.uid @@ -0,0 +1 @@ +uid://bs86pentlbwbi diff --git a/addons/guide/modifiers/guide_modifier_positive_negative.gd b/addons/guide/modifiers/guide_modifier_positive_negative.gd new file mode 100644 index 0000000..1f0ce35 --- /dev/null +++ b/addons/guide/modifiers/guide_modifier_positive_negative.gd @@ -0,0 +1,65 @@ +## Limits inputs to positive or negative values. +@tool +class_name GUIDEModifierPositiveNegative +extends GUIDEModifier + +enum LimitRange { + POSITIVE = 1, + NEGATIVE = 2 +} + +## The range of numbers to which the input should be limited +@export var range:LimitRange = LimitRange.POSITIVE + +## Whether the X axis should be affected. +@export var x:bool = true: + set(value): + if x == value: + return + x = value + emit_changed() + +## Whether the Y axis should be affected. +@export var y:bool = true: + set(value): + if y == value: + return + y = value + emit_changed() + +## Whether the Z axis should be affected. +@export var z:bool = true: + set(value): + if z == value: + return + z = value + emit_changed() + + + +func _modify_input(input:Vector3, delta:float, value_type:GUIDEAction.GUIDEActionValueType) -> Vector3: + if not input.is_finite(): + return Vector3.INF + + match range: + LimitRange.POSITIVE: + return Vector3( + max(0, input.x) if x else input.x, \ + max(0, input.y) if y else input.y, \ + max(0, input.z) if z else input.z \ + ) + LimitRange.NEGATIVE: + return Vector3( + min(0, input.x) if x else input.x, \ + min(0, input.y) if y else input.y, \ + min(0, input.z) if z else input.z \ + ) + # should never happen + return input + +func _editor_name() -> String: + return "Positive/Negative" + + +func _editor_description() -> String: + return "Clamps the input to positive or negative values." diff --git a/addons/guide/modifiers/guide_modifier_positive_negative.gd.uid b/addons/guide/modifiers/guide_modifier_positive_negative.gd.uid new file mode 100644 index 0000000..d145bf8 --- /dev/null +++ b/addons/guide/modifiers/guide_modifier_positive_negative.gd.uid @@ -0,0 +1 @@ +uid://cbe2gpphnd1fg diff --git a/addons/guide/modifiers/guide_modifier_scale.gd b/addons/guide/modifiers/guide_modifier_scale.gd new file mode 100644 index 0000000..68e0564 --- /dev/null +++ b/addons/guide/modifiers/guide_modifier_scale.gd @@ -0,0 +1,35 @@ +@tool +## Scales the input by the given value and optionally, delta time. +class_name GUIDEModifierScale +extends GUIDEModifier + +## The scale by which the input should be scaled. +@export var scale:Vector3 = Vector3.ONE: + set(value): + scale = value + emit_changed() + + +## If true, delta time will be multiplied in addition to the scale. +@export var apply_delta_time:bool = false: + set(value): + apply_delta_time = value + emit_changed() + + +func _modify_input(input:Vector3, delta:float, value_type:GUIDEAction.GUIDEActionValueType) -> Vector3: + if not input.is_finite(): + return Vector3.INF + + if apply_delta_time: + return input * scale * delta + else: + return input * scale + + +func _editor_name() -> String: + return "Scale" + + +func _editor_description() -> String: + return "Scales the input by the given value and optionally, delta time." diff --git a/addons/guide/modifiers/guide_modifier_scale.gd.uid b/addons/guide/modifiers/guide_modifier_scale.gd.uid new file mode 100644 index 0000000..d15aa20 --- /dev/null +++ b/addons/guide/modifiers/guide_modifier_scale.gd.uid @@ -0,0 +1 @@ +uid://bjm4myqxg4phm diff --git a/addons/guide/modifiers/guide_modifier_virtual_cursor.gd b/addons/guide/modifiers/guide_modifier_virtual_cursor.gd new file mode 100644 index 0000000..79ada82 --- /dev/null +++ b/addons/guide/modifiers/guide_modifier_virtual_cursor.gd @@ -0,0 +1,105 @@ +## Stateful modifier which provides a virtual "mouse" cursor driven by input. The modifier +## returns the current cursor position in pixels releative to the origin of the currently +## active window. +@tool +class_name GUIDEModifierVirtualCursor +extends GUIDEModifier + +enum ScreenScale { + ## Input is not scaled with input screen size. This means that the cursor will + ## visually move slower on higher resolutions. + NONE = 0, + ## Input is scaled with the longer axis of the screen size (e.g. width in + ## landscape mode, height in portrait mode). The cursor will move with + ## the same visual speed on all resolutions. + LONGER_AXIS = 1, + ## Input is scaled with the shorter axis of the screen size (e.g. height in + ## landscape mode, width in portrait mode). The cursor will move with the + ## same visual speed on all resolutions. + SHORTER_AXIS = 2 +} + +## The initial position of the virtual cursor (given in screen relative coordinates) +@export var initial_position:Vector2 = Vector2(0.5, 0.5): + set(value): + initial_position = value.clamp(Vector2.ZERO, Vector2.ONE) + +## The cursor movement speed in pixels. +@export var speed:Vector3 = Vector3.ONE + +## Screen scaling to be applied to the cursor movement. This controls +## whether the cursor movement speed is resolution dependent or not. +## If set to anything but [code]None[/code] then the input value will +## be multiplied with the window width/height depending on the setting. +@export var screen_scale:ScreenScale = ScreenScale.LONGER_AXIS + +## The scale by which the input should be scaled. +## @deprecated: use [member speed] instead. +var scale:Vector3: + get: return speed + set(value): speed = value + +## If true, the cursor movement speed is in pixels per second, otherwise it is in pixels +## per frame. +@export var apply_delta_time:bool = true + + +## Cursor offset in pixels. +var _offset:Vector3 = Vector3.ZERO + +## Returns the scaled screen size. This takes Godot's scaling factor for windows into account. +func _get_scaled_screen_size(): + # Get window size, including scaling factor + var window = Engine.get_main_loop().get_root() + return window.get_screen_transform().affine_inverse() * Vector2(window.size) + +func _begin_usage(): + var window_size = _get_scaled_screen_size() + _offset = Vector3(window_size.x * initial_position.x, window_size.y * initial_position.y, 0) + + +func _modify_input(input:Vector3, delta:float, value_type:GUIDEAction.GUIDEActionValueType) -> Vector3: + if not input.is_finite(): + # input is invalid, so just return current cursor position + return _offset + + var window_size = _get_scaled_screen_size() + input *= speed + + if apply_delta_time: + input *= delta + + var screen_scale_factor:float = 1.0 + match screen_scale: + ScreenScale.LONGER_AXIS: + screen_scale_factor = max(window_size.x, window_size.y) + ScreenScale.SHORTER_AXIS: + screen_scale_factor = min(window_size.x, window_size.y) + + input *= screen_scale_factor + + # apply input and clamp to window size + _offset = (_offset + input).clamp(Vector3.ZERO, Vector3(window_size.x, window_size.y, 0)) + + return _offset + +func _editor_name() -> String: + return "Virtual Cursor" + + +func _editor_description() -> String: + return "Stateful modifier which provides a virtual \"mouse\" cursor driven by input. The modifier\n" + \ + "returns the current cursor position in pixels releative to the origin of the currently \n" + \ + "active window." + + +# support for legacy properties +func _get_property_list(): + return [ + { + "name": "scale", + "type": TYPE_VECTOR3, + "usage": PROPERTY_USAGE_NO_EDITOR + } + ] + diff --git a/addons/guide/modifiers/guide_modifier_virtual_cursor.gd.uid b/addons/guide/modifiers/guide_modifier_virtual_cursor.gd.uid new file mode 100644 index 0000000..6692a53 --- /dev/null +++ b/addons/guide/modifiers/guide_modifier_virtual_cursor.gd.uid @@ -0,0 +1 @@ +uid://0ubnfkes0d4r diff --git a/addons/guide/modifiers/guide_modifier_window_relative.gd b/addons/guide/modifiers/guide_modifier_window_relative.gd new file mode 100644 index 0000000..66c88d7 --- /dev/null +++ b/addons/guide/modifiers/guide_modifier_window_relative.gd @@ -0,0 +1,26 @@ +## Converts the value of the input into window-relative units between 0 and 1. +## E.g. if a mouse cursor moves half a screen to the right and down, then +## this modifier will return (0.5, 0.5). +@tool +class_name GUIDEModifierWindowRelative +extends GUIDEModifier + + +func _modify_input(input:Vector3, delta:float, value_type:GUIDEAction.GUIDEActionValueType) -> Vector3: + if not input.is_finite(): + return Vector3.INF + + var window = Engine.get_main_loop().get_root() + # We want real pixels, so we need to factor in any scaling that the window does. + var window_size:Vector2 = window.get_screen_transform().affine_inverse() * Vector2(window.size) + return Vector3(input.x / window_size.x, input.y / window_size.y, input.z) + + +func _editor_name() -> String: + return "Window relative" + + +func _editor_description() -> String: + return "Converts the value of the input into window-relative units between 0 and 1.\n" + \ + "E.g. if a mouse cursor moves half a screen to the right and down, then \n" + \ + "this modifier will return (0.5, 0.5)." diff --git a/addons/guide/modifiers/guide_modifier_window_relative.gd.uid b/addons/guide/modifiers/guide_modifier_window_relative.gd.uid new file mode 100644 index 0000000..19646a7 --- /dev/null +++ b/addons/guide/modifiers/guide_modifier_window_relative.gd.uid @@ -0,0 +1 @@ +uid://cgy4anjdob2tp diff --git a/addons/guide/plugin.cfg b/addons/guide/plugin.cfg new file mode 100644 index 0000000..ae7473d --- /dev/null +++ b/addons/guide/plugin.cfg @@ -0,0 +1,7 @@ +[plugin] + +name="Godot Unified Input Detection Engine (G.U.I.D.E)" +description="" +author="Jan Thomä" +version="0.6.3" +script="plugin.gd" diff --git a/addons/guide/plugin.gd b/addons/guide/plugin.gd new file mode 100644 index 0000000..cb5410b --- /dev/null +++ b/addons/guide/plugin.gd @@ -0,0 +1,45 @@ +@tool +extends EditorPlugin +const MainPanel = preload("editor/mapping_context_editor/mapping_context_editor.tscn") + +var _main_panel:Control + + +func _enable_plugin(): + add_autoload_singleton("GUIDE", "res://addons/guide/guide.gd") + +func _enter_tree() -> void: + _main_panel = MainPanel.instantiate() + _main_panel.initialize(self) + EditorInterface.get_editor_main_screen().add_child(_main_panel) + # Hide the main panel. Very much required. + _make_visible(false) + +func _exit_tree() -> void: + if is_instance_valid(_main_panel): + _main_panel.queue_free() + GUIDEInputFormatter.cleanup() + +func _disable_plugin(): + remove_autoload_singleton("GUIDE") + + +func _edit(object): + if object is GUIDEMappingContext: + _main_panel.edit(object) + +func _get_plugin_name() -> String: + return "G.U.I.D.E" + +func _get_plugin_icon() -> Texture2D: + return preload("res://addons/guide/editor/logo_editor_small.svg") + +func _has_main_screen() -> bool: + return true + +func _handles(object:Variant) -> bool: + return object is GUIDEMappingContext + +func _make_visible(visible): + if is_instance_valid(_main_panel): + _main_panel.visible = visible diff --git a/addons/guide/plugin.gd.uid b/addons/guide/plugin.gd.uid new file mode 100644 index 0000000..d144701 --- /dev/null +++ b/addons/guide/plugin.gd.uid @@ -0,0 +1 @@ +uid://wstfxvdc0ol0 diff --git a/addons/guide/remapping/guide_input_detector.gd b/addons/guide/remapping/guide_input_detector.gd new file mode 100644 index 0000000..9276cbe --- /dev/null +++ b/addons/guide/remapping/guide_input_detector.gd @@ -0,0 +1,376 @@ +@tool +## Helper node for detecting inputs. Detects the next input matching a specification and +## emits a signal with the detected input. +class_name GUIDEInputDetector +extends Node + +## The device type for which the input should be filtered. +enum DeviceType { + ## Only detect input from keyboard. + KEYBOARD = 1, + ## Only detect input from the mouse. + MOUSE = 2, + ## Only detect input from joysticks/gamepads. + JOY = 4 + # touch doesn't make a lot of sense as this is usually + # not remappable. +} + +## Which joy index should be used for detected joy events +enum JoyIndex { + # Use -1, so the detected input will match any joystick + ANY = 0, + # Use the actual index of the detected joystick. + DETECTED = 1 +} + +enum DetectionState { + # The detector is currently idle. + IDLE = 0, + # The detector is currently counting down before starting the detection. + COUNTDOWN = 3, + # The detector is currently detecting input. + DETECTING = 1, + # The detector has finished detecting but is waiting for input to be released. + WAITING_FOR_INPUT_CLEAR = 2, +} + +## A countdown between initiating a dection and the actual start of the +## detection. This is useful because when the user clicks a button to +## start a detection, we want to make sure that the player is actually +## ready (and not accidentally moves anything). If set to 0, no countdown +## will be started. +@export_range(0, 2, 0.1, "or_greater") var detection_countdown_seconds:float = 0.5 + +## Minimum amplitude to detect any axis. +@export_range(0, 1, 0.1, "or_greater") var minimum_axis_amplitude:float = 0.2 + +## If any of these inputs is encountered, the detector will +## treat this as "abort detection". +@export var abort_detection_on:Array[GUIDEInput] = [] + +## Which joy index should be returned for detected joy events. +@export var use_joy_index:JoyIndex = JoyIndex.ANY + +## Whether trigger buttons on controllers should be detected when +## then action value type is limited to boolean. +@export var allow_triggers_for_boolean_actions:bool = true + +## Emitted when the detection has started (e.g. countdown has elapsed). +## Can be used to signal this to the player. +signal detection_started() + +## Emitted when the input detector detects an input of the given type. +## If detection was aborted the given input is null. +signal input_detected(input:GUIDEInput) + +# The timer for the detection countdown. +var _timer:Timer + +# Our copy of the input state +var _input_state:GUIDEInputState +# The current state of the detection. +var _status:DetectionState = DetectionState.IDLE +# Mapping contexts that were active when the detection started. We need to restore these once the detection is +# finished or aborted. +var _saved_mapping_contexts:Array[GUIDEMappingContext] = [] + +# The last detected input. +var _last_detected_input:GUIDEInput = null + +func _ready(): + # don't run the process function if we are not detecting to not waste resources + set_process(false) + _timer = Timer.new() + _input_state = GUIDEInputState.new() + _timer.one_shot = true + add_child(_timer, false, Node.INTERNAL_MODE_FRONT) + _timer.timeout.connect(_begin_detection) + + +## Whether the input detector is currently detecting input. +var is_detecting:bool: + get: return _status != DetectionState.IDLE + +var _value_type:GUIDEAction.GUIDEActionValueType +var _device_types:Array[DeviceType] = [] + +## Detects a boolean input type. +func detect_bool(device_types:Array[DeviceType] = []) -> void: + detect(GUIDEAction.GUIDEActionValueType.BOOL, device_types) + + +## Detects a 1D axis input type. +func detect_axis_1d(device_types:Array[DeviceType] = []) -> void: + detect(GUIDEAction.GUIDEActionValueType.AXIS_1D, device_types) + + +## Detects a 2D axis input type. +func detect_axis_2d(device_types:Array[DeviceType] = []) -> void: + detect(GUIDEAction.GUIDEActionValueType.AXIS_2D, device_types) + + +## Detects a 3D axis input type. +func detect_axis_3d(device_types:Array[DeviceType] = []) -> void: + detect(GUIDEAction.GUIDEActionValueType.AXIS_3D, device_types) + + +## Detects the given input type. If device types are given +## will only detect inputs from the given device types. +## Otherwise will detect inputs from all supported device types. +func detect(value_type:GUIDEAction.GUIDEActionValueType, + device_types:Array[DeviceType] = []) -> void: + if device_types == null: + push_error("Device types must not be null. Supply an empty array if you want to detect input from all devices.") + return + + + # If we are already detecting, abort this. + if _status == DetectionState.DETECTING or _status == DetectionState.WAITING_FOR_INPUT_CLEAR: + for input in abort_detection_on: + input._end_usage() + + # and start a new detection. + _status = DetectionState.COUNTDOWN + + _value_type = value_type + _device_types = device_types + _timer.stop() + _timer.start(detection_countdown_seconds) + +## This is called by the timer when the countdown has elapsed. +func _begin_detection(): + # set status to detecting + _status = DetectionState.DETECTING + # reset and clear the input state + _input_state._clear() + _input_state._reset() + + # enable all abort detection inputs + for input in abort_detection_on: + input._state = _input_state + input._begin_usage() + + # we also use this inside the editor where the GUIDE + # singleton is not active. Here we don't need to enable + # and disable the mapping contexts. + if not Engine.is_editor_hint(): + # save currently active mapping contexts + _saved_mapping_contexts = GUIDE.get_enabled_mapping_contexts() + + # disable all mapping contexts + for context in _saved_mapping_contexts: + GUIDE.disable_mapping_context(context) + + detection_started.emit() + + +## Aborts a running detection. If no detection currently runs +## does nothing. +func abort_detection() -> void: + _timer.stop() + # if we are currently detecting, deliver the null result + # which will gracefully shut down everything + if _status == DetectionState.DETECTING: + _deliver(null) + + # in any other state we don't need to do anything + +## This is called while we are waiting for input to be released. +func _process(delta: float) -> void: + # if we are not detecting, we don't need to do anything + if _status != DetectionState.WAITING_FOR_INPUT_CLEAR: + set_process(false) + return + + # check if the input is still actuated. We do this to avoid the problem + # of this input accidentally triggering something in the mapping contexts + # when we enable them again. + for input in abort_detection_on: + if input._value.is_finite() and input._value.length() > 0: + # we still have input, so we are still waiting + # retry next frame + return + + # if we are here, the input is no longer actuated + + # tear down the inputs + for input in abort_detection_on: + input._end_usage() + + # restore the mapping contexts + # but only when not running in the editor + if not Engine.is_editor_hint(): + for context in _saved_mapping_contexts: + GUIDE.enable_mapping_context(context) + + # set status to idle + _status = DetectionState.IDLE + # and deliver the detected input + input_detected.emit(_last_detected_input) + +## This is called in any state when input is received. +func _input(event:InputEvent) -> void: + if _status == DetectionState.IDLE: + return + + # feed the event into the state + _input_state._input(event) + + # while detecting, we're the only ones consuming input and we eat this input + # to not accidentally trigger built-in Godot mappings (e.g. UI stuff) + get_viewport().set_input_as_handled() + # but we still feed it into GUIDE's global state so this state stays + # up to date. This should have no effect because we disabled all mapping + # contexts. + if not Engine.is_editor_hint(): + GUIDE.inject_input(event) + + if _status == DetectionState.DETECTING: + # check if any abort input will trigger + for input in abort_detection_on: + # if it triggers, we abort + if input._value.is_finite() and input._value.length() > 0: + abort_detection() + return + + # check if the event matches the device type we are + # looking for + if not _matches_device_types(event): + return + + # then check if it can be mapped to the desired + # value type + match _value_type: + GUIDEAction.GUIDEActionValueType.BOOL: + _try_detect_bool(event) + GUIDEAction.GUIDEActionValueType.AXIS_1D: + _try_detect_axis_1d(event) + GUIDEAction.GUIDEActionValueType.AXIS_2D: + _try_detect_axis_2d(event) + GUIDEAction.GUIDEActionValueType.AXIS_3D: + _try_detect_axis_3d(event) + + +func _matches_device_types(event:InputEvent) -> bool: + if _device_types.is_empty(): + return true + + if event is InputEventKey: + return _device_types.has(DeviceType.KEYBOARD) + + if event is InputEventMouse: + return _device_types.has(DeviceType.MOUSE) + + if event is InputEventJoypadButton or event is InputEventJoypadMotion: + return _device_types.has(DeviceType.JOY) + + return false + + +func _try_detect_bool(event:InputEvent) -> void: + if event is InputEventKey and event.is_released(): + var result := GUIDEInputKey.new() + result.key = event.physical_keycode + result.shift = event.shift_pressed + result.control = event.ctrl_pressed + result.meta = event.meta_pressed + result.alt = event.alt_pressed + _deliver(result) + return + + if event is InputEventMouseButton and event.is_released(): + var result := GUIDEInputMouseButton.new() + result.button = event.button_index + _deliver(result) + return + + if event is InputEventJoypadButton and event.is_released(): + var result := GUIDEInputJoyButton.new() + result.button = event.button_index + result.joy_index = _find_joy_index(event.device) + _deliver(result) + + if allow_triggers_for_boolean_actions: + # only allow joypad trigger buttons + if not (event is InputEventJoypadMotion): + return + if event.axis != JOY_AXIS_TRIGGER_LEFT and \ + event.axis != JOY_AXIS_TRIGGER_RIGHT: + return + + var result := GUIDEInputJoyAxis1D.new() + result.axis = event.axis + result.joy_index = _find_joy_index(event.device) + _deliver(result) + + + +func _try_detect_axis_1d(event:InputEvent) -> void: + if event is InputEventMouseMotion: + var result := GUIDEInputMouseAxis1D.new() + # Pick the direction in which the mouse was moved more. + if abs(event.relative.x) > abs(event.relative.y): + result.axis = GUIDEInputMouseAxis1D.GUIDEInputMouseAxis.X + else: + result.axis = GUIDEInputMouseAxis1D.GUIDEInputMouseAxis.Y + _deliver(result) + return + + if event is InputEventJoypadMotion: + if abs(event.axis_value) < minimum_axis_amplitude: + return + + var result := GUIDEInputJoyAxis1D.new() + result.axis = event.axis + result.joy_index = _find_joy_index(event.device) + _deliver(result) + + +func _try_detect_axis_2d(event:InputEvent) -> void: + if event is InputEventMouseMotion: + var result := GUIDEInputMouseAxis2D.new() + _deliver(result) + return + + if event is InputEventJoypadMotion: + if event.axis_value < minimum_axis_amplitude: + return + + var result := GUIDEInputJoyAxis2D.new() + match event.axis: + JOY_AXIS_LEFT_X, JOY_AXIS_LEFT_Y: + result.x = JOY_AXIS_LEFT_X + result.y = JOY_AXIS_LEFT_Y + JOY_AXIS_RIGHT_X, JOY_AXIS_RIGHT_Y: + result.x = JOY_AXIS_RIGHT_X + result.y = JOY_AXIS_RIGHT_Y + _: + # not supported for detection + return + result.joy_index = _find_joy_index(event.device) + _deliver(result) + return + + +func _try_detect_axis_3d(event:InputEvent) -> void: + # currently no input for 3D + pass + + +func _find_joy_index(device_id:int) -> int: + if use_joy_index == JoyIndex.ANY: + return -1 + + var pads := Input.get_connected_joypads() + for i in pads.size(): + if pads[i] == device_id: + return i + + return -1 + +func _deliver(input:GUIDEInput) -> void: + _last_detected_input = input + _status = DetectionState.WAITING_FOR_INPUT_CLEAR + # enable processing so we can check if the input is released before we re-enable GUIDE's mapping contexts + set_process(true) diff --git a/addons/guide/remapping/guide_input_detector.gd.uid b/addons/guide/remapping/guide_input_detector.gd.uid new file mode 100644 index 0000000..d6ed3bf --- /dev/null +++ b/addons/guide/remapping/guide_input_detector.gd.uid @@ -0,0 +1 @@ +uid://db27ccgomq455 diff --git a/addons/guide/remapping/guide_remapper.gd b/addons/guide/remapping/guide_remapper.gd new file mode 100644 index 0000000..4037819 --- /dev/null +++ b/addons/guide/remapping/guide_remapper.gd @@ -0,0 +1,307 @@ +class_name GUIDERemapper + +## Emitted when the bound input of an item changes. +signal item_changed(item:ConfigItem, input:GUIDEInput) + +var _remapping_config:GUIDERemappingConfig = GUIDERemappingConfig.new() +var _mapping_contexts:Array[GUIDEMappingContext] = [] + +const GUIDESet = preload("../guide_set.gd") + +## Loads the default bindings as they are currently configured in the mapping contexts and a mapping +## config for editing. Note that the given mapping config will not be modified, so editing can be +## cancelled. Call get_mapping_config to get the modified mapping config. +func initialize(mapping_contexts:Array[GUIDEMappingContext], remapping_config:GUIDERemappingConfig): + _remapping_config = remapping_config.duplicate() if remapping_config != null else GUIDERemappingConfig.new() + + _mapping_contexts.clear() + + for mapping_context in mapping_contexts: + if not is_instance_valid(mapping_context): + push_error("Cannot add null mapping context. Ignoring.") + return + _mapping_contexts.append(mapping_context) + + +## Returns the mapping config with all modifications applied. +func get_mapping_config() -> GUIDERemappingConfig: + return _remapping_config.duplicate() + + +func set_custom_data(key:Variant, value:Variant): + _remapping_config.custom_data[key] = value + + +func get_custom_data(key:Variant, default:Variant = null) -> Variant: + return _remapping_config.custom_data.get(key, default) + + +func remove_custom_data(key:Variant) -> void: + _remapping_config.custom_data.erase(key) + + +## Returns all remappable items. Can be filtered by context, display category or +## action. +func get_remappable_items(context:GUIDEMappingContext = null, + display_category:String = "", + action:GUIDEAction = null) -> Array[ConfigItem]: + + if action != null and not action.is_remappable: + push_warning("Action filter was set but filtered action is not remappable.") + return [] + + + var result:Array[ConfigItem] = [] + for a_context:GUIDEMappingContext in _mapping_contexts: + if context != null and context != a_context: + continue + for action_mapping:GUIDEActionMapping in a_context.mappings: + var mapped_action:GUIDEAction = action_mapping.action + # filter non-remappable actions + if not mapped_action.is_remappable: + continue + + # if action filter is set, only pick mappings for this action + if action != null and action != mapped_action: + continue + + # make config items + for index:int in action_mapping.input_mappings.size(): + var input_mapping:GUIDEInputMapping = action_mapping.input_mappings[index] + if input_mapping.override_action_settings and not input_mapping.is_remappable: + # skip non-remappable items + continue + + # Calculate effective display category + var effective_display_category:String = \ + _get_effective_display_category(mapped_action, input_mapping) + + # if display category filter is set, only pick mappings + # in this category + if display_category.length() > 0 and effective_display_category != display_category: + continue + + var item = ConfigItem.new(a_context, action_mapping.action, index, input_mapping) + item_changed.connect(item._item_changed) + result.append(item) + + return result + + +static func _get_effective_display_category(action:GUIDEAction, input_mapping:GUIDEInputMapping) -> String: + var result:String = "" + if input_mapping.override_action_settings: + result = input_mapping.display_category + + if result.is_empty(): + result = action.display_category + + return result + + +static func _get_effective_display_name(action:GUIDEAction, input_mapping:GUIDEInputMapping) -> String: + var result:String = "" + if input_mapping.override_action_settings: + result = input_mapping.display_name + + if result.is_empty(): + result = action.display_name + + return result + +static func _is_effectively_remappable(action:GUIDEAction, input_mapping:GUIDEInputMapping) -> bool: + return action.is_remappable and ((not input_mapping.override_action_settings) or input_mapping.is_remappable) + + +static func _get_effective_value_type(action:GUIDEAction, input_mapping:GUIDEInputMapping) -> GUIDEAction.GUIDEActionValueType: + if input_mapping.override_action_settings and input_mapping.input != null: + return input_mapping.input._native_value_type() + + return action.action_value_type + + +## Returns a list of all collisions in all contexts when this new input would be applied to the config item. +func get_input_collisions(item:ConfigItem, input:GUIDEInput) -> Array[ConfigItem]: + if not _check_item(item): + return [] + var result:Array[ConfigItem] = [] + + if input == null: + # no item collides with absent input + return result + + # walk over all known contexts and find any mappings. + for context:GUIDEMappingContext in _mapping_contexts: + for action_mapping:GUIDEActionMapping in context.mappings: + for index:int in action_mapping.input_mappings.size(): + var action := action_mapping.action + if context == item.context and action == item.action and index == item.index: + # collisions with self are allowed + continue + + var input_mapping:GUIDEInputMapping = action_mapping.input_mappings[index] + var bound_input:GUIDEInput = input_mapping.input + # check if this is currently overridden + if _remapping_config._has(context, action, index): + bound_input = _remapping_config._get_bound_input_or_null(context, action, index) + + # We have a collision + if bound_input != null and bound_input.is_same_as(input): + var collision_item := ConfigItem.new(context, action, index, input_mapping) + item_changed.connect(collision_item._item_changed) + result.append(collision_item) + + return result + + +## Gets the input currently bound to the action in the given context. Can be null if the input +## is currently not bound. +func get_bound_input_or_null(item:ConfigItem) -> GUIDEInput: + if not _check_item(item): + return null + + # If the remapping config has a binding for this, this binding wins. + if _remapping_config._has(item.context, item.action, item.index): + return _remapping_config._get_bound_input_or_null(item.context, item.action, item.index) + + # otherwise return the default binding for this action in the context + for action_mapping:GUIDEActionMapping in item.context.mappings: + if action_mapping.action == item.action: + if action_mapping.input_mappings.size() > item.index: + return action_mapping.input_mappings[item.index].input + else: + push_error("Action mapping does not have an index of ", item.index , ".") + + return null + +## Sets the bound input to the new value for the given config item. Ignores collisions +## because collision resolution is highly game specific. Use get_input_collisions to find +## potential collisions and then resolve them in a way that suits the game. Note that +## bound input can be set to null, which deliberately unbinds the input. If you want +## to restore the defaults, call restore_default instead. +func set_bound_input(item:ConfigItem, input:GUIDEInput) -> void: + if not _check_item(item): + return + + # first remove any custom binding we have + _remapping_config._clear(item.context, item.action, item.index) + + # Now check if the input is the same as the default + var bound_input:GUIDEInput = get_bound_input_or_null(item) + + if bound_input == null and input == null: + item_changed.emit(item, input) + return # nothing to do + + if bound_input == null: + _remapping_config._bind(item.context, item.action, input, item.index) + item_changed.emit(item, input) + return + + if bound_input != null and input != null and bound_input.is_same_as(input): + item_changed.emit(item, input) + return # nothing to do + + _remapping_config._bind(item.context, item.action, input, item.index) + item_changed.emit(item, input) + + +## Returns the default binding for the given config item. +func get_default_input(item:ConfigItem) -> GUIDEInput: + if not _check_item(item): + return null + + for mapping:GUIDEActionMapping in item.context.mappings: + if mapping.action == item.action: + # _check_item verifies the index exists, so no need to check here. + return mapping.input_mappings[item.index].input + + return null + + +## Restores the default binding for the given config item. Note that this may +## introduce a conflict if other bindings have bound conflicting input. You can +## call get_default_input for the given item to get the default input and then +## call get_input_collisions for that to find out whether you would get a collision. +func restore_default_for(item:ConfigItem) -> void: + if not _check_item(item): + return + + _remapping_config._clear(item.context, item.action, item.index) + item_changed.emit(item, get_bound_input_or_null(item)) + + + +## Verifies that the given item is valid. +func _check_item(item:ConfigItem) -> bool: + if not _mapping_contexts.has(item.context): + push_error("Given context is not known to this mapper. Did you call initialize()?") + return false + + var action_found := false + var size_ok := false + for mapping in item.context.mappings: + if mapping.action == item.action: + action_found = true + if mapping.input_mappings.size() > item.index and item.index >= 0: + size_ok = true + break + + if not action_found: + push_error("Given action does not belong to the given context.") + return false + + if not size_ok: + push_error("Given index does not exist for the given action's input binding.") + + + if not item.action.is_remappable: + push_error("Given action is not remappable.") + return false + + return true + + +class ConfigItem: + ## Emitted when the input to this item has changed. + signal changed(input:GUIDEInput) + + var _input_mapping:GUIDEInputMapping + + ## The display category for this config item + var display_category:String: + get: return GUIDERemapper._get_effective_display_category(action, _input_mapping) + + ## The display name for this config item. + var display_name:String: + get: return GUIDERemapper._get_effective_display_name(action, _input_mapping) + + ## Whether this item is remappable. + var is_remappable:bool: + get: return GUIDERemapper._is_effectively_remappable(action, _input_mapping) + + ## The value type for this config item. + var value_type:GUIDEAction.GUIDEActionValueType: + get: return GUIDERemapper._get_effective_value_type(action, _input_mapping) + + var context:GUIDEMappingContext + var action:GUIDEAction + var index:int + + func _init(context:GUIDEMappingContext, action:GUIDEAction, index:int, input_mapping:GUIDEInputMapping): + self.context = context + self.action = action + self.index = index + _input_mapping = input_mapping + + ## Checks whether this config item is the same as some other + ## e.g. refers to the same input mapping. + func is_same_as(other:ConfigItem) -> bool: + return context == other.context and \ + action == other.action and \ + index == other.index + + func _item_changed(item:ConfigItem, input:GUIDEInput): + if item.is_same_as(self): + changed.emit(input) + diff --git a/addons/guide/remapping/guide_remapper.gd.uid b/addons/guide/remapping/guide_remapper.gd.uid new file mode 100644 index 0000000..ff84866 --- /dev/null +++ b/addons/guide/remapping/guide_remapper.gd.uid @@ -0,0 +1 @@ +uid://nh78h8tprhwn diff --git a/addons/guide/remapping/guide_remapping_config.gd b/addons/guide/remapping/guide_remapping_config.gd new file mode 100644 index 0000000..7bd6453 --- /dev/null +++ b/addons/guide/remapping/guide_remapping_config.gd @@ -0,0 +1,85 @@ +@icon("res://addons/guide/guide_internal.svg") +## A remapping configuration. This only holds changes to the context mapping, +## so to get the full input map you need to apply this on top of one or more +## mapping contexts. The settings from this config take precedence over the +## settings from the mapping contexts. +class_name GUIDERemappingConfig +extends Resource + +## Dictionary with remapped inputs. Structure is: +## { +## mapping_context : { +## action : { +## index : bound input +## ... +## }, ... +## } +## The bound input can be NULL which means that this was deliberately unbound. +@export var remapped_inputs:Dictionary = {} + +## Dictionary for additional custom data to store (e.g. modifier settings, etc.) +## Note that this data is completely under application control and it's the responsibility +## of the application to ensure that this data is serializable and gets applied at +## the necessary point in time. +@export var custom_data:Dictionary = {} + +## Binds the given input to the given action. Index can be given to have +## alternative bindings for the same action. +func _bind(mapping_context:GUIDEMappingContext, action:GUIDEAction, input:GUIDEInput, index:int = 0) -> void: + if not remapped_inputs.has(mapping_context): + remapped_inputs[mapping_context] = {} + + if not remapped_inputs[mapping_context].has(action): + remapped_inputs[mapping_context][action] = {} + + remapped_inputs[mapping_context][action][index] = input + + +## Unbinds the given input from the given action. This is a deliberate unbind +## which means that the action should not be triggerable by the input anymore. It +## its not the same as _clear. +func _unbind(mapping_context:GUIDEMappingContext, action:GUIDEAction, index:int = 0) -> void: + _bind(mapping_context, action, null, index) + + +## Removes the given input action binding from this configuration. The action will +## now have the default input that it has in the mapping_context. This is not the +## same as _unbind. +func _clear(mapping_context:GUIDEMappingContext, action:GUIDEAction, index:int = 0) -> void: + if not remapped_inputs.has(mapping_context): + return + + if not remapped_inputs[mapping_context].has(action): + return + + remapped_inputs[mapping_context][action].erase(index) + + if remapped_inputs[mapping_context][action].is_empty(): + remapped_inputs[mapping_context].erase(action) + + if remapped_inputs[mapping_context].is_empty(): + remapped_inputs.erase(mapping_context) + + +## Returns the bound input for the given action name and index. Returns null +## if there is matching binding. +func _get_bound_input_or_null(mapping_context:GUIDEMappingContext, action:GUIDEAction, index:int = 0) -> GUIDEInput: + if not remapped_inputs.has(mapping_context): + return null + + if not remapped_inputs[mapping_context].has(action): + return null + + return remapped_inputs[mapping_context][action].get(index, null) + + +## Returns whether or not this mapping has a configuration for the given combination (even if the +## combination is set to null). +func _has(mapping_context:GUIDEMappingContext, action:GUIDEAction, index:int = 0) -> bool: + if not remapped_inputs.has(mapping_context): + return false + + if not remapped_inputs[mapping_context].has(action): + return false + + return remapped_inputs[mapping_context][action].has(index) diff --git a/addons/guide/remapping/guide_remapping_config.gd.uid b/addons/guide/remapping/guide_remapping_config.gd.uid new file mode 100644 index 0000000..137332f --- /dev/null +++ b/addons/guide/remapping/guide_remapping_config.gd.uid @@ -0,0 +1 @@ +uid://bjnghv2v2qu6w diff --git a/addons/guide/triggers/guide_trigger.gd b/addons/guide/triggers/guide_trigger.gd new file mode 100644 index 0000000..d158ece --- /dev/null +++ b/addons/guide/triggers/guide_trigger.gd @@ -0,0 +1,65 @@ +@tool +@icon("res://addons/guide/triggers/guide_trigger.svg") +class_name GUIDETrigger +extends Resource + +enum GUIDETriggerState { + ## The trigger did not fire. + NONE, + ## The trigger's conditions are partially met + ONGOING, + ## The trigger has fired. + TRIGGERED +} + +enum GUIDETriggerType { + # If there are more than one explicit triggers at least one must trigger + # for the action to trigger. + EXPLICIT = 1, + # All implicit triggers must trigger for the action to trigger. + IMPLICIT = 2, + # All blocking triggers prevent the action from triggering. + BLOCKING = 3 +} + + +@export var actuation_threshold:float = 0.5 +var _last_value:Vector3 + +## Returns the trigger type of this trigger. +func _get_trigger_type() -> GUIDETriggerType: + return GUIDETriggerType.EXPLICIT + + +func _update_state(input:Vector3, delta:float, value_type:GUIDEAction.GUIDEActionValueType) -> GUIDETriggerState: + return GUIDETriggerState.NONE + + +func _is_actuated(input:Vector3, value_type:GUIDEAction.GUIDEActionValueType) -> bool: + match value_type: + GUIDEAction.GUIDEActionValueType.AXIS_1D, GUIDEAction.GUIDEActionValueType.BOOL: + return _is_axis1d_actuated(input) + GUIDEAction.GUIDEActionValueType.AXIS_2D: + return _is_axis2d_actuated(input) + GUIDEAction.GUIDEActionValueType.AXIS_3D: + return _is_axis3d_actuated(input) + + return false + +## Checks if a 1D input is actuated. +func _is_axis1d_actuated(input:Vector3) -> bool: + return is_finite(input.x) and abs(input.x) > actuation_threshold + +## Checks if a 2D input is actuated. +func _is_axis2d_actuated(input:Vector3) -> bool: + return is_finite(input.x) and is_finite(input.y) and Vector2(input.x, input.y).length_squared() > actuation_threshold * actuation_threshold + +## Checks if a 3D input is actuated. +func _is_axis3d_actuated(input:Vector3) -> bool: + return input.is_finite() and input.length_squared() > actuation_threshold * actuation_threshold + +func _editor_name() -> String: + return "GUIDETrigger" + +func _editor_description() -> String: + return "" diff --git a/addons/guide/triggers/guide_trigger.gd.uid b/addons/guide/triggers/guide_trigger.gd.uid new file mode 100644 index 0000000..eed577d --- /dev/null +++ b/addons/guide/triggers/guide_trigger.gd.uid @@ -0,0 +1 @@ +uid://x74mnwgr08a7 diff --git a/addons/guide/triggers/guide_trigger.svg b/addons/guide/triggers/guide_trigger.svg new file mode 100644 index 0000000..48f8822 --- /dev/null +++ b/addons/guide/triggers/guide_trigger.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/addons/guide/triggers/guide_trigger.svg.import b/addons/guide/triggers/guide_trigger.svg.import new file mode 100644 index 0000000..e63657a --- /dev/null +++ b/addons/guide/triggers/guide_trigger.svg.import @@ -0,0 +1,38 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ca1eiagyinhl7" +path="res://.godot/imported/guide_trigger.svg-cd87acbd491929cf49a255f8481b0b63.ctex" +metadata={ +"has_editor_variant": true, +"vram_texture": false +} + +[deps] + +source_file="res://addons/guide/triggers/guide_trigger.svg" +dest_files=["res://.godot/imported/guide_trigger.svg-cd87acbd491929cf49a255f8481b0b63.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=0.5 +editor/scale_with_editor_scale=true +editor/convert_colors_with_editor_theme=false diff --git a/addons/guide/triggers/guide_trigger_chorded_action.gd b/addons/guide/triggers/guide_trigger_chorded_action.gd new file mode 100644 index 0000000..2b06f8c --- /dev/null +++ b/addons/guide/triggers/guide_trigger_chorded_action.gd @@ -0,0 +1,28 @@ +## Fires, when the given action is currently triggering. This trigger is implicit, +## so it will prevent the action from triggering even if other triggers are successful. +@tool +class_name GUIDETriggerChordedAction +extends GUIDETrigger + +@export var action:GUIDEAction + + +func _get_trigger_type() -> GUIDETriggerType: + return GUIDETriggerType.IMPLICIT + +func _update_state(input:Vector3, delta:float, value_type:GUIDEAction.GUIDEActionValueType) -> GUIDETriggerState: + if action == null: + push_warning("Chorded trigger without action will never trigger.") + return GUIDETriggerState.NONE + + if action.is_triggered(): + return GUIDETriggerState.TRIGGERED + return GUIDETriggerState.NONE + + +func _editor_name() -> String: + return "Chorded Action" + +func _editor_description() -> String: + return "Fires, when the given action is currently triggering. This trigger is implicit,\n" + \ + "so it will prevent the action from triggering even if other triggers are successful." diff --git a/addons/guide/triggers/guide_trigger_chorded_action.gd.uid b/addons/guide/triggers/guide_trigger_chorded_action.gd.uid new file mode 100644 index 0000000..b9ba49b --- /dev/null +++ b/addons/guide/triggers/guide_trigger_chorded_action.gd.uid @@ -0,0 +1 @@ +uid://brsxcrai2te83 diff --git a/addons/guide/triggers/guide_trigger_combo.gd b/addons/guide/triggers/guide_trigger_combo.gd new file mode 100644 index 0000000..2464e65 --- /dev/null +++ b/addons/guide/triggers/guide_trigger_combo.gd @@ -0,0 +1,117 @@ +@tool +class_name GUIDETriggerCombo +extends GUIDETrigger + +enum ActionEventType { + TRIGGERED = 1, + STARTED = 2, + ONGOING = 4, + CANCELLED = 8, + COMPLETED = 16 +} + +## If set to true, the combo trigger will print information +## about state changes to the debug log. +@export var enable_debug_print:bool = false +@export var steps:Array[GUIDETriggerComboStep] = [] +@export var cancellation_actions:Array[GUIDETriggerComboCancelAction] = [] + +var _current_step:int = -1 +var _remaining_time:float = 0 + +func _update_state(input:Vector3, delta:float, value_type:GUIDEAction.GUIDEActionValueType) -> GUIDETriggerState: + if steps.is_empty(): + push_warning("Combo with no steps will never fire.") + return GUIDETriggerState.NONE + + # initial setup + if _current_step == -1: + for step in steps: + step._prepare() + for action in cancellation_actions: + action._prepare() + _reset() + + + var current_action := steps[_current_step].action + if current_action == null: + push_warning("Step ", _current_step , " has no action ", resource_path) + return GUIDETriggerState.NONE + + # check if any of our cancellation actions fired + for action in cancellation_actions: + # if the action is the current action we don't count its firing as cancellation + if action.action == current_action: + continue + + if action._has_fired: + if enable_debug_print: + print("Combo cancelled by action '", action.action._editor_name(), "'.") + _reset() + return GUIDETriggerState.NONE + + # check if any of the steps has fired out of order + for step in steps: + if step.action == current_action: + continue + + if step._has_fired: + if enable_debug_print: + print("Combo out of order step by action '", step.action._editor_name(), "'.") + _reset() + return GUIDETriggerState.NONE + + # check if we took too long (unless we're in the first step) + if _current_step > 0: + _remaining_time -= delta + if _remaining_time <= 0.0: + if enable_debug_print: + print("Step time for step ", _current_step , " exceeded.") + _reset() + return GUIDETriggerState.NONE + + # if the current action was fired, if so advance to the next + if steps[_current_step]._has_fired: + # reset this step, so it will not count as misfired next round + steps[_current_step]._has_fired = false + if _current_step + 1 >= steps.size(): + # we finished the combo + if enable_debug_print: + print("Combo fired.") + _reset() + return GUIDETriggerState.TRIGGERED + + # otherwise, pick the next step + _current_step += 1 + if enable_debug_print: + print("Combo advanced to step " , _current_step, ".") + _remaining_time = steps[_current_step].time_to_actuate + + # Reset all steps and cancellation actions to "not fired" in + # case they were triggered by this action. Otherwise a double-tap + # would immediately fire for both taps once the first is through + for step in steps: + step._has_fired = false + for action in cancellation_actions: + action._has_fired = false + + # and in any case we're still processing. + return GUIDETriggerState.ONGOING + + +func _reset(): + if enable_debug_print: + print("Combo reset.") + _current_step = 0 + _remaining_time = steps[0].time_to_actuate + for step in steps: + step._has_fired = false + for action in cancellation_actions: + action._has_fired = false + +func _editor_name() -> String: + return "Combo" + +func _editor_description() -> String: + return "Fires, when the input exceeds the actuation threshold." + diff --git a/addons/guide/triggers/guide_trigger_combo.gd.uid b/addons/guide/triggers/guide_trigger_combo.gd.uid new file mode 100644 index 0000000..6a9db7e --- /dev/null +++ b/addons/guide/triggers/guide_trigger_combo.gd.uid @@ -0,0 +1 @@ +uid://biioody2ca0e7 diff --git a/addons/guide/triggers/guide_trigger_combo_cancel_action.gd b/addons/guide/triggers/guide_trigger_combo_cancel_action.gd new file mode 100644 index 0000000..10a0e83 --- /dev/null +++ b/addons/guide/triggers/guide_trigger_combo_cancel_action.gd @@ -0,0 +1,27 @@ +@icon("res://addons/guide/guide_internal.svg") +class_name GUIDETriggerComboCancelAction +extends Resource + +@export var action:GUIDEAction +@export_flags("Triggered:1", "Started:2", "Ongoing:4", "Cancelled:8","Completed:16") +var completion_events:int = GUIDETriggerCombo.ActionEventType.TRIGGERED + +var _has_fired:bool = false + +func _prepare(): + if completion_events & GUIDETriggerCombo.ActionEventType.TRIGGERED: + action.triggered.connect(_fired) + if completion_events & GUIDETriggerCombo.ActionEventType.STARTED: + action.started.connect(_fired) + if completion_events & GUIDETriggerCombo.ActionEventType.ONGOING: + action.ongoing.connect(_fired) + if completion_events & GUIDETriggerCombo.ActionEventType.CANCELLED: + action.cancelled.connect(_fired) + if completion_events & GUIDETriggerCombo.ActionEventType.COMPLETED: + action.completed.connect(_fired) + _has_fired = false + + +func _fired(): + _has_fired = true + diff --git a/addons/guide/triggers/guide_trigger_combo_cancel_action.gd.uid b/addons/guide/triggers/guide_trigger_combo_cancel_action.gd.uid new file mode 100644 index 0000000..9bbbdc5 --- /dev/null +++ b/addons/guide/triggers/guide_trigger_combo_cancel_action.gd.uid @@ -0,0 +1 @@ +uid://ddgp5tashyo8o diff --git a/addons/guide/triggers/guide_trigger_combo_step.gd b/addons/guide/triggers/guide_trigger_combo_step.gd new file mode 100644 index 0000000..4e22bf7 --- /dev/null +++ b/addons/guide/triggers/guide_trigger_combo_step.gd @@ -0,0 +1,29 @@ +@icon("res://addons/guide/guide_internal.svg") +class_name GUIDETriggerComboStep +extends Resource + +@export var action:GUIDEAction +@export_flags("Triggered:1", "Started:2", "Ongoing:4", "Cancelled:8","Completed:16") +var completion_events:int = GUIDETriggerCombo.ActionEventType.TRIGGERED +@export var time_to_actuate:float = 0.5 + + +var _has_fired:bool = false + +func _prepare(): + if completion_events & GUIDETriggerCombo.ActionEventType.TRIGGERED: + action.triggered.connect(_fired) + if completion_events & GUIDETriggerCombo.ActionEventType.STARTED: + action.started.connect(_fired) + if completion_events & GUIDETriggerCombo.ActionEventType.ONGOING: + action.ongoing.connect(_fired) + if completion_events & GUIDETriggerCombo.ActionEventType.CANCELLED: + action.cancelled.connect(_fired) + if completion_events & GUIDETriggerCombo.ActionEventType.COMPLETED: + action.completed.connect(_fired) + _has_fired = false + + +func _fired(): + _has_fired = true + diff --git a/addons/guide/triggers/guide_trigger_combo_step.gd.uid b/addons/guide/triggers/guide_trigger_combo_step.gd.uid new file mode 100644 index 0000000..a864287 --- /dev/null +++ b/addons/guide/triggers/guide_trigger_combo_step.gd.uid @@ -0,0 +1 @@ +uid://be47edmg8hwpo diff --git a/addons/guide/triggers/guide_trigger_down.gd b/addons/guide/triggers/guide_trigger_down.gd new file mode 100644 index 0000000..5327d62 --- /dev/null +++ b/addons/guide/triggers/guide_trigger_down.gd @@ -0,0 +1,20 @@ +## Fires, when the input exceeds the actuation threshold. This is +## the default trigger when no trigger is specified. +@tool +class_name GUIDETriggerDown +extends GUIDETrigger + +func _update_state(input:Vector3, delta:float, value_type:GUIDEAction.GUIDEActionValueType) -> GUIDETriggerState: + # if the input is actuated, then the trigger is triggered. + if _is_actuated(input, value_type): + return GUIDETriggerState.TRIGGERED + # otherwise, the trigger is not triggered. + return GUIDETriggerState.NONE + + +func _editor_name() -> String: + return "Down" + +func _editor_description() -> String: + return "Fires, when the input exceeds the actuation threshold. This is\n" +\ + "the default trigger when no trigger is specified." diff --git a/addons/guide/triggers/guide_trigger_down.gd.uid b/addons/guide/triggers/guide_trigger_down.gd.uid new file mode 100644 index 0000000..fd07aaf --- /dev/null +++ b/addons/guide/triggers/guide_trigger_down.gd.uid @@ -0,0 +1 @@ +uid://b4cdrn4paoj3i diff --git a/addons/guide/triggers/guide_trigger_hold.gd b/addons/guide/triggers/guide_trigger_hold.gd new file mode 100644 index 0000000..8ad5bb2 --- /dev/null +++ b/addons/guide/triggers/guide_trigger_hold.gd @@ -0,0 +1,43 @@ +@tool +## A trigger that activates when the input is held down for a certain amount of time. +class_name GUIDETriggerHold +extends GUIDETrigger + +## The time for how long the input must be held. +@export var hold_treshold:float = 1.0 +## If true, the trigger will only fire once until the input is released. Otherwise the trigger will fire every frame. +@export var is_one_shot:bool = false + +var _accumulated_time:float = 0 +var _did_shoot:bool = false + +func _update_state(input:Vector3, delta:float, value_type:GUIDEAction.GUIDEActionValueType) -> GUIDETriggerState: + # if the input is actuated, accumulate time and check if the hold threshold has been reached + if _is_actuated(input, value_type): + _accumulated_time += delta + + if _accumulated_time >= hold_treshold: + # if the trigger is one shot and we already shot, then we will not trigger again. + if is_one_shot and _did_shoot: + return GUIDETriggerState.NONE + else: + # otherwise, we will just trigger. + _did_shoot = true + return GUIDETriggerState.TRIGGERED + else: + # if the hold threshold has not been reached, then the trigger is ongoing. + return GUIDETriggerState.ONGOING + else: + # if the input is not actuated, then the trigger is not triggered and we reset the accumulated time. + # and our one shot flag. + _accumulated_time = 0 + _did_shoot = false + return GUIDETriggerState.NONE + + +func _editor_name() -> String: + return "Hold" + +func _editor_description() -> String: + return "Fires, once the input has remained actuated for hold_threshold seconds.\n" + \ + "My fire once or repeatedly." diff --git a/addons/guide/triggers/guide_trigger_hold.gd.uid b/addons/guide/triggers/guide_trigger_hold.gd.uid new file mode 100644 index 0000000..d835396 --- /dev/null +++ b/addons/guide/triggers/guide_trigger_hold.gd.uid @@ -0,0 +1 @@ +uid://cfvgpvihp74si diff --git a/addons/guide/triggers/guide_trigger_pressed.gd b/addons/guide/triggers/guide_trigger_pressed.gd new file mode 100644 index 0000000..97fd0e1 --- /dev/null +++ b/addons/guide/triggers/guide_trigger_pressed.gd @@ -0,0 +1,22 @@ +@tool +## A trigger that activates when the input is pushed down. Will only emit a +## trigger event once. Holding the input will not trigger further events. +class_name GUIDETriggerPressed +extends GUIDETrigger + + +func _update_state(input:Vector3, delta:float, value_type:GUIDEAction.GUIDEActionValueType) -> GUIDETriggerState: + if _is_actuated(input, value_type): + if not _is_actuated(_last_value, value_type): + return GUIDETriggerState.TRIGGERED + + return GUIDETriggerState.NONE + + +func _editor_name() -> String: + return "Pressed" + + +func _editor_description() -> String: + return "Fires once, when the input exceeds actuation threshold. Holding the input\n" + \ + "will not fire additional triggers." diff --git a/addons/guide/triggers/guide_trigger_pressed.gd.uid b/addons/guide/triggers/guide_trigger_pressed.gd.uid new file mode 100644 index 0000000..9148235 --- /dev/null +++ b/addons/guide/triggers/guide_trigger_pressed.gd.uid @@ -0,0 +1 @@ +uid://b52rqq28tuqpg diff --git a/addons/guide/triggers/guide_trigger_pulse.gd b/addons/guide/triggers/guide_trigger_pulse.gd new file mode 100644 index 0000000..61ee88c --- /dev/null +++ b/addons/guide/triggers/guide_trigger_pulse.gd @@ -0,0 +1,86 @@ +@tool +## A trigger that activates when the input is pushed down and then repeatedly sends trigger events at a fixed interval. +## Note: the trigger will be either triggering or ongoing until the input is released. +## Note: at most one pulse will be emitted per frame. +class_name GUIDETriggerPulse +extends GUIDETrigger + +## If true, the trigger will trigger immediately when the input is actuated. Otherwise, the trigger will wait for the initial delay. +@export var trigger_on_start:bool = true +## The delay after the initial actuation before pulsing begins. +@export var initial_delay:float = 0.3: + set(value): + initial_delay = max(0, value) + +## The interval between pulses. Set to 0 to pulse every frame. +@export var pulse_interval:float = 0.1: + set(value): + pulse_interval = max(0, value) + +## Maximum number of pulses. If <= 0, the trigger will pulse indefinitely. +@export var max_pulses:int = 0 + +var _delay_until_next_pulse:float = 0 +var _emitted_pulses:int = 0 + +func _update_state(input:Vector3, delta:float, value_type:GUIDEAction.GUIDEActionValueType) -> GUIDETriggerState: + if _is_actuated(input, value_type): + if not _is_actuated(_last_value, value_type): + # we went from "not actuated" to actuated, pulsing starts + _delay_until_next_pulse = initial_delay + if trigger_on_start: + return GUIDETriggerState.TRIGGERED + else: + return GUIDETriggerState.ONGOING + + # if we already are pulsing and have exceeded the maximum number of pulses, we will not pulse anymore. + if max_pulses > 0 and _emitted_pulses >= max_pulses: + return GUIDETriggerState.NONE + + # subtract the delta from the delay until the next pulse + _delay_until_next_pulse -= delta + + if _delay_until_next_pulse > 0: + # we are still waiting for the next pulse, nothing to do. + return GUIDETriggerState.ONGOING + + # now delta could be larger than our pulse, in which case we loose a few pulses. + # as we can pulse at most once per frame. + + # in case someone sets the pulse interval to 0, we will pulse every frame. + if is_equal_approx(pulse_interval, 0): + _delay_until_next_pulse = 0 + if max_pulses > 0: + _emitted_pulses += 1 + return GUIDETriggerState.TRIGGERED + + # Now add the delay until the next pulse + _delay_until_next_pulse += pulse_interval + + # If the interval is really small, we can potentially have skipped some pulses + if _delay_until_next_pulse <= 0: + # we have skipped some pulses + var skipped_pulses:int = int(-_delay_until_next_pulse / pulse_interval) + _delay_until_next_pulse += skipped_pulses * pulse_interval + if max_pulses > 0: + _emitted_pulses += skipped_pulses + if _emitted_pulses >= max_pulses: + return GUIDETriggerState.NONE + + # Record a pulse and return triggered + if max_pulses > 0: + _emitted_pulses += 1 + return GUIDETriggerState.TRIGGERED + + # if the input is not actuated, then the trigger is not triggered. + _emitted_pulses = 0 + _delay_until_next_pulse = 0 + return GUIDETriggerState.NONE + + +func _editor_name() -> String: + return "Pulse" + + +func _editor_description() -> String: + return "Fires at an interval while the input is actuated." diff --git a/addons/guide/triggers/guide_trigger_pulse.gd.uid b/addons/guide/triggers/guide_trigger_pulse.gd.uid new file mode 100644 index 0000000..77b958f --- /dev/null +++ b/addons/guide/triggers/guide_trigger_pulse.gd.uid @@ -0,0 +1 @@ +uid://dna8tkcuk528v diff --git a/addons/guide/triggers/guide_trigger_released.gd b/addons/guide/triggers/guide_trigger_released.gd new file mode 100644 index 0000000..d1509e9 --- /dev/null +++ b/addons/guide/triggers/guide_trigger_released.gd @@ -0,0 +1,21 @@ +@tool +## A trigger that activates when the input is released down. Will only emit a +## trigger event once. +class_name GUIDETriggerReleased +extends GUIDETrigger + + +func _update_state(input:Vector3, delta:float, value_type:GUIDEAction.GUIDEActionValueType) -> GUIDETriggerState: + if not _is_actuated(input, value_type): + if _is_actuated(_last_value, value_type): + return GUIDETriggerState.TRIGGERED + + return GUIDETriggerState.NONE + + +func _editor_name() -> String: + return "Released" + + +func _editor_description() -> String: + return "Fires once, when the input goes from actuated to not actuated. The opposite of the Pressed trigger." diff --git a/addons/guide/triggers/guide_trigger_released.gd.uid b/addons/guide/triggers/guide_trigger_released.gd.uid new file mode 100644 index 0000000..168b74b --- /dev/null +++ b/addons/guide/triggers/guide_trigger_released.gd.uid @@ -0,0 +1 @@ +uid://biiggjw6tv4uq diff --git a/addons/guide/triggers/guide_trigger_stability.gd b/addons/guide/triggers/guide_trigger_stability.gd new file mode 100644 index 0000000..cfe01f9 --- /dev/null +++ b/addons/guide/triggers/guide_trigger_stability.gd @@ -0,0 +1,72 @@ +@tool +## Triggers depending on whether the input changes while actuated. This trigger is +## is implicit, so it must succeed for all other triggers to succeed. +class_name GUIDETriggerStability +extends GUIDETrigger + +enum TriggerWhen { + ## Input must be stable + INPUT_IS_STABLE, + ## Input must change + INPUT_CHANGES +} + + +## The maximum amount that the input can change after actuation before it is +## considered "changed". +@export var max_deviation:float = 1 + +## When should the trigger trigger? +@export var trigger_when:TriggerWhen = TriggerWhen.INPUT_IS_STABLE + + +var _initial_value:Vector3 +var _deviated:bool = false + + +func _get_trigger_type() -> GUIDETriggerType: + return GUIDETriggerType.IMPLICIT + + +func _update_state(input:Vector3, delta:float, value_type:GUIDEAction.GUIDEActionValueType) -> GUIDETriggerState: + if _is_actuated(input, value_type): + if _deviated: + if trigger_when == TriggerWhen.INPUT_IS_STABLE: + return GUIDETriggerState.NONE + return GUIDETriggerState.TRIGGERED + + + if not _is_actuated(_last_value, value_type): + # we went from "not actuated" to actuated, start + _initial_value = input + if trigger_when == TriggerWhen.INPUT_IS_STABLE: + return GUIDETriggerState.TRIGGERED + else: + return GUIDETriggerState.ONGOING + + # calculate how far the input is from the initial value + if _initial_value.distance_squared_to(input) > (max_deviation * max_deviation): + _deviated = true + if trigger_when == TriggerWhen.INPUT_IS_STABLE: + return GUIDETriggerState.NONE + return GUIDETriggerState.TRIGGERED + + if trigger_when == TriggerWhen.INPUT_IS_STABLE: + return GUIDETriggerState.TRIGGERED + + return GUIDETriggerState.ONGOING + + # if the input is not actuated + _deviated = false + return GUIDETriggerState.NONE + + + + +func _editor_name() -> String: + return "Stability" + + +func _editor_description() -> String: + return "Triggers depending on whether the input changes while actuated. This trigger\n" +\ + "is implicit, so it must succeed for all other triggers to succeed." diff --git a/addons/guide/triggers/guide_trigger_stability.gd.uid b/addons/guide/triggers/guide_trigger_stability.gd.uid new file mode 100644 index 0000000..41a665d --- /dev/null +++ b/addons/guide/triggers/guide_trigger_stability.gd.uid @@ -0,0 +1 @@ +uid://deoksgw6vfo5v diff --git a/addons/guide/triggers/guide_trigger_tap.gd b/addons/guide/triggers/guide_trigger_tap.gd new file mode 100644 index 0000000..a0d0c26 --- /dev/null +++ b/addons/guide/triggers/guide_trigger_tap.gd @@ -0,0 +1,48 @@ +@tool +## A trigger that activates when the input is tapped and released before the time threshold is reached. +class_name GUIDETriggerTap +extends GUIDETrigger + +## The time threshold for the tap to be considered a tap. +@export var tap_threshold: float = 0.2 + +var _accumulated_time: float = 0 + + +func _update_state(input: Vector3, delta: float, value_type:GUIDEAction.GUIDEActionValueType) -> GUIDETriggerState: + if _is_actuated(input, value_type): + # if the input was actuated before, and the tap threshold has been exceeded, the trigger is locked down + # until the input is released and we can exit out early + if _is_actuated(_last_value, value_type) and _accumulated_time > tap_threshold: + return GUIDETriggerState.NONE + + # accumulate time + _accumulated_time += delta + + if _accumulated_time < tap_threshold: + return GUIDETriggerState.ONGOING + else: + # we have exceeded the tap threshold, so the tap is not triggered. + return GUIDETriggerState.NONE + + else: # not actuated right now + # if the input was actuated before... + if _is_actuated(_last_value, value_type): + # ... and the accumulated time is less than the threshold, then the tap is triggered. + if _accumulated_time < tap_threshold: + _accumulated_time = 0 + return GUIDETriggerState.TRIGGERED + + # Otherwise, the tap is not triggered, but we reset the accumulated time + # so the trigger is now again ready to be triggered. + _accumulated_time = 0 + + # in either case, the trigger is not triggered. + return GUIDETriggerState.NONE + +func _editor_name() -> String: + return "Tap" + + +func _editor_description() -> String: + return "Fires when the input is actuated and released within the given timeframe." diff --git a/addons/guide/triggers/guide_trigger_tap.gd.uid b/addons/guide/triggers/guide_trigger_tap.gd.uid new file mode 100644 index 0000000..9b92bed --- /dev/null +++ b/addons/guide/triggers/guide_trigger_tap.gd.uid @@ -0,0 +1 @@ +uid://c76fmncyucwqc diff --git a/addons/guide/ui/guide_icon_renderer.gd b/addons/guide/ui/guide_icon_renderer.gd new file mode 100644 index 0000000..558303e --- /dev/null +++ b/addons/guide/ui/guide_icon_renderer.gd @@ -0,0 +1,30 @@ +## Base class for icon renderers. Note that all icon renderers must be tool +## scripts. +@tool +class_name GUIDEIconRenderer +extends Control + +## The priority of this icon renderer. Built-in renderers use priority 0. Built-in +## fallback renderer uses priority 100. The smaller the number the higher the priority. +@export var priority:int = 0 + +## Whether or not this renderer can render an icon for this input. +func supports(input:GUIDEInput) -> bool: + return false + +## Set up the scene so that the given input can be rendered. This will +## only be called for input where `supports` has returned true. +func render(input:GUIDEInput) -> void: + pass + + +## A cache key for the given input. This should be unique for this renderer +## and the given input. The same input should yield the same cache key for +## each renderer. +func cache_key(input:GUIDEInput) -> String: + push_error("Custom renderers must override the cache_key function to ensure proper caching.") + return "i-forgot-the-cache-key" + +func _ready(): + process_mode = Node.PROCESS_MODE_ALWAYS + diff --git a/addons/guide/ui/guide_icon_renderer.gd.uid b/addons/guide/ui/guide_icon_renderer.gd.uid new file mode 100644 index 0000000..388cb65 --- /dev/null +++ b/addons/guide/ui/guide_icon_renderer.gd.uid @@ -0,0 +1 @@ +uid://c25x75clb4fgl diff --git a/addons/guide/ui/guide_input_formatter.gd b/addons/guide/ui/guide_input_formatter.gd new file mode 100644 index 0000000..1fd670c --- /dev/null +++ b/addons/guide/ui/guide_input_formatter.gd @@ -0,0 +1,358 @@ +@tool +## Helper class for formatting GUIDE input for the UI. +class_name GUIDEInputFormatter + +const IconMaker = preload("icon_maker/icon_maker.gd") +const KeyRenderer = preload("renderers/keyboard/key_renderer.tscn") +const MouseRenderer = preload("renderers/mouse/mouse_renderer.tscn") +const TouchRenderer = preload("renderers/touch/touch_renderer.tscn") +const JoyRenderer = preload("renderers/joy/joy_renderer.tscn") +const XboxRenderer = preload("renderers/controllers/xbox/xbox_controller_renderer.tscn") +const PlayStationRenderer = preload("renderers/controllers/playstation/playstation_controller_renderer.tscn") +const SwitchRenderer = preload("renderers/controllers/switch/switch_controller_renderer.tscn") +const ActionRenderer = preload("renderers/misc/action_renderer.tscn") +const FallbackRenderer = preload("renderers/misc/fallback_renderer.tscn") +const DefaultTextProvider = preload("text_providers/default_text_provider.gd") +const XboxTextProvider = preload("text_providers/controllers/xbox/xbox_controller_text_provider.gd") +const PlayStationTextProvider = preload("text_providers/controllers/playstation/playstation_controller_text_provider.gd") +const SwitchTextProvider = preload("text_providers/controllers/switch/switch_controller_text_provider.gd") + +# These are shared across all instances +static var _icon_maker:IconMaker +static var _icon_renderers:Array[GUIDEIconRenderer] = [] +static var _text_providers:Array[GUIDETextProvider] = [] +static var _is_ready:bool = false + +## Separator to separate mixed input. +static var mixed_input_separator:String = ", " +## Separator to separate chorded input. +static var chorded_input_separator:String = " + " +## Separator to separate combo input. +static var combo_input_separator:String = " > " + +# These are per-instance +var _action_resolver:Callable +var _icon_size:int + +static func _ensure_readiness(): + if _is_ready: + return + + # reconnect to an icon maker that might be there + var root = Engine.get_main_loop().root + for child in root.get_children(): + if child is IconMaker: + _icon_maker = child + + if _icon_maker == null: + _icon_maker = preload("icon_maker/icon_maker.tscn").instantiate() + root.add_child.call_deferred(_icon_maker) + + add_icon_renderer(KeyRenderer.instantiate()) + add_icon_renderer(MouseRenderer.instantiate()) + add_icon_renderer(TouchRenderer.instantiate()) + add_icon_renderer(ActionRenderer.instantiate()) + add_icon_renderer(JoyRenderer.instantiate()) + add_icon_renderer(XboxRenderer.instantiate()) + add_icon_renderer(PlayStationRenderer.instantiate()) + add_icon_renderer(SwitchRenderer.instantiate()) + add_icon_renderer(FallbackRenderer.instantiate()) + + add_text_provider(DefaultTextProvider.new()) + add_text_provider(XboxTextProvider.new()) + add_text_provider(PlayStationTextProvider.new()) + add_text_provider(SwitchTextProvider.new()) + + _is_ready = true + + +## This will clean up the rendering infrastructure used for generating +## icons. Note that in a normal game you will have no need to call this +## as the infrastructure is needed throughout the run of your game. +## It might be useful in tests though, to get rid of spurious warnings +## about orphaned nodes. +static func cleanup(): + _is_ready = false + + # free all the nodes to avoid memory leaks + for renderer in _icon_renderers: + renderer.queue_free() + + _icon_renderers.clear() + + _text_providers.clear() + if is_instance_valid(_icon_maker): + _icon_maker.queue_free() + + +func _init(icon_size:int = 32, resolver:Callable = func(action) -> GUIDEActionMapping: return null ): + _icon_size = icon_size + _action_resolver = resolver + + +## Adds an icon renderer for rendering icons. +static func add_icon_renderer(renderer:GUIDEIconRenderer) -> void: + _icon_renderers.append(renderer) + _icon_renderers.sort_custom(func(r1, r2): return r1.priority < r2.priority) + +## Removes an icon renderer. +static func remove_icon_renderer(renderer:GUIDEIconRenderer) -> void: + _icon_renderers.erase(renderer) + +## Adds a text provider for rendering text. +static func add_text_provider(provider:GUIDETextProvider) -> void: + _text_providers.append(provider) + _text_providers.sort_custom(func(r1, r2): return r1.priority < r2.priority) + + +## Removes a text provider +static func remove_text_provider(provider:GUIDETextProvider) -> void: + _text_providers.erase(provider) + + +## Returns an input formatter that can format actions using the currently active inputs. +static func for_active_contexts(icon_size:int = 32) -> GUIDEInputFormatter: + var resolver = func(action:GUIDEAction) -> GUIDEActionMapping: + for mapping in GUIDE._active_action_mappings: + if mapping.action == action: + return mapping + return null + return GUIDEInputFormatter.new(icon_size, resolver) + + +## Returns an input formatter that can format actions using the given context. +static func for_context(context:GUIDEMappingContext, icon_size:int = 32) -> GUIDEInputFormatter: + var resolver:Callable = func(action:GUIDEAction) -> GUIDEActionMapping: + for mapping in context.mappings: + if mapping.action == action: + return mapping + return null + + return GUIDEInputFormatter.new(icon_size, resolver) + + +## Formats the action input as richtext with icons suitable for a RichTextLabel. This function +## is async as icons may need to be rendered in the background which can take a few frames, so +## you will need to await on it. +func action_as_richtext_async(action:GUIDEAction) -> String: + return await _materialized_as_richtext_async(_materialize_action_input(action)) + + +## Formats the action input as plain text which can be used in any UI component. This is a bit +## more light-weight than formatting as icons and returns immediately. +func action_as_text(action:GUIDEAction) -> String: + return _materialized_as_text(_materialize_action_input(action)) + +## Formats the input as richtext with icons suitable for a RichTextLabel. This function +## is async as icons may need to be rendered in the background which can take a few frames, so +## you will need to await on it. +func input_as_richtext_async(input:GUIDEInput, materialize_actions:bool = true) -> String: + return await _materialized_as_richtext_async(_materialize_input(input, materialize_actions)) + + +## Formats the input as plain text which can be used in any UI component. This is a bit +## more light-weight than formatting as icons and returns immediately. +func input_as_text(input:GUIDEInput, materialize_actions:bool = true) -> String: + return _materialized_as_text(_materialize_input(input, materialize_actions)) + + +## Renders materialized input as text. +func _materialized_as_text(input:MaterializedInput) -> String: + _ensure_readiness() + if input is MaterializedSimpleInput: + var text:String = "" + for provider in _text_providers: + if provider.supports(input.input): + text = provider.get_text(input.input) + # first provider wins + break + if text == "": + pass + ## push_warning("No formatter found for input ", input) + return text + + var separator = _separator_for_input(input) + if separator == "" or input.parts.is_empty(): + return "" + + var parts:Array[String] = [] + for part in input.parts: + parts.append(_materialized_as_text(part)) + + return separator.join(parts) + +## Renders materialized input as rich text. +func _materialized_as_richtext_async(input:MaterializedInput) -> String: + _ensure_readiness() + if input is MaterializedSimpleInput: + var icon:Texture2D = null + for renderer in _icon_renderers: + if renderer.supports(input.input): + icon = await _icon_maker.make_icon(input.input, renderer, _icon_size) + # first renderer wins + break + if icon == null: + push_warning("No renderer found for input ", input) + return "" + + return "[img]%s[/img]" % [icon.resource_path] + + + var separator = _separator_for_input(input) + if separator == "" or input.parts.is_empty(): + return "" + + var parts:Array[String] = [] + for part in input.parts: + parts.append(await _materialized_as_richtext_async(part)) + + return separator.join(parts) + + +func _separator_for_input(input:MaterializedInput) -> String: + if input is MaterializedMixedInput: + return mixed_input_separator + elif input is MaterializedComboInput: + return combo_input_separator + elif input is MaterializedChordedInput: + return chorded_input_separator + + push_error("Unknown materialized input type") + return "" + + +## Materializes action input. +func _materialize_action_input(action:GUIDEAction) -> MaterializedInput: + var result := MaterializedMixedInput.new() + if action == null: + push_warning("Trying to get inputs for a null action.") + return result + + # get the mapping for this action + var mapping:GUIDEActionMapping = _action_resolver.call(action) + + # if we have no mapping, well that's it, return an empty mixed input + if mapping == null: + return result + + # collect input mappings + for input_mapping in mapping.input_mappings: + var chorded_actions:Array[MaterializedInput] = [] + var combos:Array[MaterializedInput] = [] + + for trigger in input_mapping.triggers: + # if we have a combo trigger, materialize its input. + if trigger is GUIDETriggerCombo: + var combo := MaterializedComboInput.new() + for step:GUIDETriggerComboStep in trigger.steps: + combo.parts.append(_materialize_action_input(step.action)) + combos.append(combo) + + # if we have a chorded action, materialize its input + if trigger is GUIDETriggerChordedAction: + chorded_actions.append(_materialize_action_input(trigger.action)) + + if not chorded_actions.is_empty(): + # if we have chorded action then the whole mapping is chorded. + var chord := MaterializedChordedInput.new() + for chorded_action in chorded_actions: + chord.parts.append(chorded_action) + for combo in combos: + chord.parts.append(combo) + if combos.is_empty(): + if input_mapping.input != null: + chord.parts.append(_materialize_input(input_mapping.input)) + result.parts.append(chord) + else: + for combo in combos: + result.parts.append(combo) + if combos.is_empty(): + if input_mapping.input != null: + result.parts.append(_materialize_input(input_mapping.input)) + return result + +## Materializes direct input. +func _materialize_input(input:GUIDEInput, materialize_actions:bool = true) -> MaterializedInput: + if input == null: + push_warning("Trying to materialize a null input.") + return MaterializedMixedInput.new() + + # if its an action input, get its parts + if input is GUIDEInputAction: + if materialize_actions: + return _materialize_action_input(input.action) + else: + return MaterializedSimpleInput.new(input) + + # if its a key input, split out the modifiers + if input is GUIDEInputKey: + var chord := MaterializedChordedInput.new() + if input.control: + var ctrl = GUIDEInputKey.new() + ctrl.key = KEY_CTRL + chord.parts.append(MaterializedSimpleInput.new(ctrl)) + if input.alt: + var alt = GUIDEInputKey.new() + alt.key = KEY_ALT + chord.parts.append(MaterializedSimpleInput.new(alt)) + if input.shift: + var shift = GUIDEInputKey.new() + shift.key = KEY_SHIFT + chord.parts.append(MaterializedSimpleInput.new(shift)) + if input.meta: + var meta = GUIDEInputKey.new() + meta.key = KEY_META + chord.parts.append(MaterializedSimpleInput.new(meta)) + + # got no modifiers? + if chord.parts.is_empty(): + return MaterializedSimpleInput.new(input) + + chord.parts.append(MaterializedSimpleInput.new(input)) + return chord + + # everything else is just a simple input + return MaterializedSimpleInput.new(input) + +class MaterializedInput: + pass + +class MaterializedSimpleInput: + extends MaterializedInput + var input:GUIDEInput + + func _init(input:GUIDEInput): + self.input = input + +class MaterializedMixedInput: + extends MaterializedInput + var parts:Array[MaterializedInput] = [] + +class MaterializedChordedInput: + extends MaterializedInput + var parts:Array[MaterializedInput] = [] + +class MaterializedComboInput: + extends MaterializedInput + var parts:Array[MaterializedInput] = [] + + +## Returns the name of the associated joystick/pad of the given input. +## If the input is no joy input or the device name cannot be determined +## returns an empty string. +static func _joy_name_for_input(input:GUIDEInput) -> String: + if not input is GUIDEInputJoyBase: + return "" + + var joypads:Array[int] = Input.get_connected_joypads() + var joy_index = input.joy_index + if joy_index < 0: + # pick the first one + joy_index = 0 + + # We don't have such a controller, so bail out. + if joypads.size() <= joy_index: + return "" + + var id = joypads[joy_index] + return Input.get_joy_name(id) diff --git a/addons/guide/ui/guide_input_formatter.gd.uid b/addons/guide/ui/guide_input_formatter.gd.uid new file mode 100644 index 0000000..0ffe62a --- /dev/null +++ b/addons/guide/ui/guide_input_formatter.gd.uid @@ -0,0 +1 @@ +uid://duisgvlqywtbn diff --git a/addons/guide/ui/guide_text_provider.gd b/addons/guide/ui/guide_text_provider.gd new file mode 100644 index 0000000..2f84075 --- /dev/null +++ b/addons/guide/ui/guide_text_provider.gd @@ -0,0 +1,22 @@ +## Base class for text providers. A text provider provides a textual representation +## of an input which is displayed to the user. +## scripts. +@tool +class_name GUIDETextProvider + +## The priority of this text provider. The built-in text provider uses priority 0. +## The smaller the number the higher the priority. +@export var priority:int = 0 + +## Whether or not this provider can provide a text for this input. +func supports(input:GUIDEInput) -> bool: + return false + +## Provides the text for the given input. Will only be called when the +## input is supported by this text provider. Note that for key input +## this is not supposed to look at the modifiers. This function will +## be called separately for each modifier. +func get_text(input:GUIDEInput) -> String: + return "not implemented" + + diff --git a/addons/guide/ui/guide_text_provider.gd.uid b/addons/guide/ui/guide_text_provider.gd.uid new file mode 100644 index 0000000..1e9c968 --- /dev/null +++ b/addons/guide/ui/guide_text_provider.gd.uid @@ -0,0 +1 @@ +uid://di8xw2ysyq483 diff --git a/addons/guide/ui/icon_maker/icon_maker.gd b/addons/guide/ui/icon_maker/icon_maker.gd new file mode 100644 index 0000000..1a03a0d --- /dev/null +++ b/addons/guide/ui/icon_maker/icon_maker.gd @@ -0,0 +1,103 @@ +@tool +extends Node + +const CACHE_DIR:String = "user://_guide_cache" + +@onready var _sub_viewport:SubViewport = %SubViewport +@onready var _root:Node2D = %Root +@onready var _scene_holder = %SceneHolder + +var _pending_requests:Array[Job] = [] +var _current_request:Job = null +var _fetch_image:bool = false + +func _ready(): + # keep working when game is paused + process_mode = Node.PROCESS_MODE_ALWAYS + # don't needlessly eat performance + if _pending_requests.is_empty(): + set_process(false) + + +func clear_cache(): + var files = DirAccess.get_files_at(CACHE_DIR) + for file in files: + DirAccess.remove_absolute(CACHE_DIR + "/" + file) + +## Makes an icon for the given input and returns a Texture2D with the icon. Icons +## are cached on disk so subsequent calls for the same input will be faster. +func make_icon(input:GUIDEInput, renderer:GUIDEIconRenderer, height_px:int) -> Texture2D: + DirAccess.make_dir_recursive_absolute(CACHE_DIR) + var cache_key = (str(height_px) + renderer.cache_key(input)).sha256_text() + var cache_path = "user://_guide_cache/" + cache_key + ".res" + if ResourceLoader.exists(cache_path): + return ResourceLoader.load(cache_path, "Texture2D") + + var job = Job.new() + job.height = height_px + job.input = input + job.renderer = renderer + _pending_requests.append(job) + set_process(true) + + await job.done + + var image_texture = ImageTexture.create_from_image(job.result) + ResourceSaver.save(image_texture, cache_path) + image_texture.take_over_path(cache_path) + + return image_texture + + + +func _process(delta): + if _current_request == null and _pending_requests.is_empty(): + # nothing more to do.. + set_process(false) + return + + # nothing in progress, so pick the next request + if _current_request == null: + _current_request = _pending_requests.pop_front() + var renderer = _current_request.renderer + _root.add_child(renderer) + + renderer.render(_current_request.input) + await get_tree().process_frame + + var actual_size = renderer.get_rect().size + var scale = float(_current_request.height) / float(actual_size.y) + _root.scale = Vector2.ONE * scale + _sub_viewport.size = actual_size * scale + + _sub_viewport.render_target_update_mode = SubViewport.UPDATE_ALWAYS + + # give the renderer some time to update itself. 3 frames seem + # to work nicely and keep things speedy. + await get_tree().process_frame + await get_tree().process_frame + await get_tree().process_frame + + _fetch_image = true + return + + # fetch the image after the renderer is done + if _fetch_image: + # we're done. make a copy of the viewport texture + var image:Image = _scene_holder.texture.get_image() + _current_request.result = image + _current_request.done.emit() + _current_request = null + # remove the renderer + _root.remove_child(_root.get_child(0)) + _sub_viewport.render_target_update_mode = SubViewport.UPDATE_DISABLED + _fetch_image = false + +class Job: + signal done() + var height:int + var input:GUIDEInput + var renderer:GUIDEIconRenderer + var result:Image + + diff --git a/addons/guide/ui/icon_maker/icon_maker.gd.uid b/addons/guide/ui/icon_maker/icon_maker.gd.uid new file mode 100644 index 0000000..bd0b53d --- /dev/null +++ b/addons/guide/ui/icon_maker/icon_maker.gd.uid @@ -0,0 +1 @@ +uid://dq6cdbdturmel diff --git a/addons/guide/ui/icon_maker/icon_maker.tscn b/addons/guide/ui/icon_maker/icon_maker.tscn new file mode 100644 index 0000000..662d2ce --- /dev/null +++ b/addons/guide/ui/icon_maker/icon_maker.tscn @@ -0,0 +1,24 @@ +[gd_scene load_steps=3 format=3 uid="uid://8thurteeibtu"] + +[ext_resource type="Script" path="res://addons/guide/ui/icon_maker/icon_maker.gd" id="1_hdbjk"] + +[sub_resource type="ViewportTexture" id="ViewportTexture_kra7t"] +viewport_path = NodePath("SubViewport") + +[node name="GUIDEIconMaker" type="Node2D"] +script = ExtResource("1_hdbjk") + +[node name="SubViewport" type="SubViewport" parent="."] +unique_name_in_owner = true +transparent_bg = true +gui_disable_input = true +gui_snap_controls_to_pixels = false + +[node name="Root" type="Node2D" parent="SubViewport"] +unique_name_in_owner = true +scale = Vector2(0.1, 0.1) + +[node name="SceneHolder" type="Sprite2D" parent="."] +unique_name_in_owner = true +visible = false +texture = SubResource("ViewportTexture_kra7t") diff --git a/addons/guide/ui/renderers/controllers/controller_renderer.gd b/addons/guide/ui/renderers/controllers/controller_renderer.gd new file mode 100644 index 0000000..96b6fdc --- /dev/null +++ b/addons/guide/ui/renderers/controllers/controller_renderer.gd @@ -0,0 +1,171 @@ +@tool +extends GUIDEIconRenderer + +@export var controller_name_matches:Array[String] = [] +@export var a_button:Texture2D +@export var b_button:Texture2D +@export var x_button:Texture2D +@export var y_button:Texture2D +@export var left_stick:Texture2D +@export var left_stick_click:Texture2D +@export var right_stick:Texture2D +@export var right_stick_click:Texture2D +@export var left_bumper:Texture2D +@export var right_bumper:Texture2D +@export var left_trigger:Texture2D +@export var right_trigger:Texture2D +@export var dpad_up:Texture2D +@export var dpad_left:Texture2D +@export var dpad_right:Texture2D +@export var dpad_down:Texture2D +@export var start:Texture2D +@export var misc1:Texture2D +@export var back:Texture2D + + +@onready var _a_button:TextureRect = %AButton +@onready var _b_button:TextureRect = %BButton +@onready var _x_button:TextureRect = %XButton +@onready var _y_button:TextureRect = %YButton +@onready var _left_stick:TextureRect = %LeftStick +@onready var _left_stick_click:TextureRect = %LeftStickClick +@onready var _right_stick:TextureRect = %RightStick +@onready var _right_stick_click:TextureRect = %RightStickClick +@onready var _left_bumper:Control = %LeftBumper +@onready var _right_bumper:Control = %RightBumper +@onready var _left_trigger:Control = %LeftTrigger +@onready var _right_trigger:TextureRect = %RightTrigger +@onready var _dpad_up:TextureRect = %DpadUp +@onready var _dpad_left:TextureRect = %DpadLeft +@onready var _dpad_right:TextureRect = %DpadRight +@onready var _dpad_down:TextureRect = %DpadDown +@onready var _start:TextureRect = %Start +@onready var _misc1:TextureRect = %Misc1 +@onready var _back:TextureRect = %Back +@onready var _left_right:Control = %LeftRight +@onready var _up_down:Control = %UpDown +@onready var _controls:Control = %Controls +@onready var _directions:Control = %Directions + + +func _ready(): + super() + _a_button.texture = a_button + _b_button.texture = b_button + _x_button.texture = x_button + _y_button.texture = y_button + _left_stick.texture = left_stick + _left_stick_click.texture = left_stick_click + _right_stick.texture = right_stick + _right_stick_click.texture = right_stick_click + _left_bumper.texture = left_bumper + _right_bumper.texture = right_bumper + _left_trigger.texture = left_trigger + _right_trigger.texture = right_trigger + _dpad_up.texture = dpad_up + _dpad_left.texture = dpad_left + _dpad_right.texture = dpad_right + _dpad_down.texture = dpad_down + _start.texture = start + _misc1.texture = misc1 + _back.texture = back + +func supports(input:GUIDEInput) -> bool: + var joy_name = GUIDEInputFormatter._joy_name_for_input(input) + if joy_name == "": + return false + + # Look if the controller name matches one of the supported ones + var haystack = joy_name.to_lower() + for needle in controller_name_matches: + if haystack.contains(needle.to_lower()): + return true + + return false + +func render(input:GUIDEInput) -> void: + for control in _controls.get_children(): + control.visible = false + for direction in _directions.get_children(): + direction.visible = false + _directions.visible = false + + + if input is GUIDEInputJoyAxis1D: + match input.axis: + JOY_AXIS_LEFT_X: + _left_stick.visible = true + _show_left_right() + JOY_AXIS_LEFT_Y: + _left_stick.visible = true + _show_up_down() + JOY_AXIS_RIGHT_X: + _right_stick.visible = true + _show_left_right() + JOY_AXIS_RIGHT_Y: + _right_stick.visible = true + _show_up_down() + JOY_AXIS_TRIGGER_LEFT: + _left_trigger.visible = true + JOY_AXIS_TRIGGER_RIGHT: + _right_trigger.visible = true + + if input is GUIDEInputJoyAxis2D: + # We assume that there is no input mixing horizontal and vertical + # from different sticks into a 2D axis as this would confuse the + # players. + match input.x: + JOY_AXIS_LEFT_X, JOY_AXIS_LEFT_Y: + _left_stick.visible = true + JOY_AXIS_RIGHT_X, JOY_AXIS_RIGHT_Y: + _right_stick.visible = true + + if input is GUIDEInputJoyButton: + match input.button: + JOY_BUTTON_A: + _a_button.visible = true + JOY_BUTTON_B: + _b_button.visible = true + JOY_BUTTON_X: + _x_button.visible = true + JOY_BUTTON_Y: + _y_button.visible = true + JOY_BUTTON_DPAD_LEFT: + _dpad_left.visible = true + JOY_BUTTON_DPAD_RIGHT: + _dpad_right.visible = true + JOY_BUTTON_DPAD_UP: + _dpad_up.visible = true + JOY_BUTTON_DPAD_DOWN: + _dpad_down.visible = true + JOY_BUTTON_LEFT_SHOULDER: + _left_bumper.visible = true + JOY_BUTTON_RIGHT_SHOULDER: + _right_bumper.visible = true + JOY_BUTTON_LEFT_STICK: + _left_stick_click.visible = true + JOY_BUTTON_RIGHT_STICK: + _right_stick_click.visible = true + JOY_BUTTON_RIGHT_STICK: + _right_stick_click.visible = true + JOY_BUTTON_START: + _start.visible = true + JOY_BUTTON_BACK: + _back.visible = true + JOY_BUTTON_MISC1: + _misc1.visible = true + + call("queue_sort") + + +func _show_left_right(): + _directions.visible = true + _left_right.visible = true + +func _show_up_down(): + _directions.visible = true + _up_down.visible = true + + +func cache_key(input:GUIDEInput) -> String: + return "7581f483-bc68-411f-98ad-dc246fd2593a" + input.to_string() + GUIDEInputFormatter._joy_name_for_input(input) diff --git a/addons/guide/ui/renderers/controllers/controller_renderer.gd.uid b/addons/guide/ui/renderers/controllers/controller_renderer.gd.uid new file mode 100644 index 0000000..0b051f6 --- /dev/null +++ b/addons/guide/ui/renderers/controllers/controller_renderer.gd.uid @@ -0,0 +1 @@ +uid://cj5qd3pot17v3 diff --git a/addons/guide/ui/renderers/controllers/controller_renderer.tscn b/addons/guide/ui/renderers/controllers/controller_renderer.tscn new file mode 100644 index 0000000..9ab0538 --- /dev/null +++ b/addons/guide/ui/renderers/controllers/controller_renderer.tscn @@ -0,0 +1,135 @@ +[gd_scene load_steps=4 format=3 uid="uid://bsaylcb5ixjxk"] + +[ext_resource type="Script" path="res://addons/guide/ui/renderers/controllers/controller_renderer.gd" id="1_yt13e"] +[ext_resource type="Texture2D" uid="uid://bmgxqbypegjxh" path="res://addons/guide/ui/renderers/textures/arrow_horizontal.svg" id="2_nv2ob"] +[ext_resource type="Texture2D" uid="uid://bu5nlug6uf03w" path="res://addons/guide/ui/renderers/textures/arrow_vertical.svg" id="3_ejti1"] + +[node name="ControllerRenderer" type="MarginContainer"] +offset_right = 100.0 +offset_bottom = 100.0 +size_flags_horizontal = 0 +script = ExtResource("1_yt13e") +priority = -1 + +[node name="HBoxContainer" type="HBoxContainer" parent="."] +layout_mode = 2 +size_flags_horizontal = 0 + +[node name="Controls" type="MarginContainer" parent="HBoxContainer"] +unique_name_in_owner = true +custom_minimum_size = Vector2(100, 100) +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="AButton" type="TextureRect" parent="HBoxContainer/Controls"] +unique_name_in_owner = true +layout_mode = 2 +stretch_mode = 5 + +[node name="BButton" type="TextureRect" parent="HBoxContainer/Controls"] +unique_name_in_owner = true +layout_mode = 2 +stretch_mode = 5 + +[node name="XButton" type="TextureRect" parent="HBoxContainer/Controls"] +unique_name_in_owner = true +layout_mode = 2 +stretch_mode = 5 + +[node name="YButton" type="TextureRect" parent="HBoxContainer/Controls"] +unique_name_in_owner = true +layout_mode = 2 +stretch_mode = 5 + +[node name="LeftStick" type="TextureRect" parent="HBoxContainer/Controls"] +unique_name_in_owner = true +layout_mode = 2 +stretch_mode = 5 + +[node name="LeftStickClick" type="TextureRect" parent="HBoxContainer/Controls"] +unique_name_in_owner = true +layout_mode = 2 +stretch_mode = 5 + +[node name="RightStick" type="TextureRect" parent="HBoxContainer/Controls"] +unique_name_in_owner = true +layout_mode = 2 +stretch_mode = 5 + +[node name="RightStickClick" type="TextureRect" parent="HBoxContainer/Controls"] +unique_name_in_owner = true +layout_mode = 2 +stretch_mode = 5 + +[node name="LeftBumper" type="TextureRect" parent="HBoxContainer/Controls"] +unique_name_in_owner = true +layout_mode = 2 +stretch_mode = 5 + +[node name="RightBumper" type="TextureRect" parent="HBoxContainer/Controls"] +unique_name_in_owner = true +layout_mode = 2 +stretch_mode = 5 + +[node name="LeftTrigger" type="TextureRect" parent="HBoxContainer/Controls"] +unique_name_in_owner = true +layout_mode = 2 +stretch_mode = 5 + +[node name="RightTrigger" type="TextureRect" parent="HBoxContainer/Controls"] +unique_name_in_owner = true +layout_mode = 2 +stretch_mode = 5 + +[node name="DpadUp" type="TextureRect" parent="HBoxContainer/Controls"] +unique_name_in_owner = true +layout_mode = 2 +stretch_mode = 5 + +[node name="DpadLeft" type="TextureRect" parent="HBoxContainer/Controls"] +unique_name_in_owner = true +layout_mode = 2 +stretch_mode = 5 + +[node name="DpadRight" type="TextureRect" parent="HBoxContainer/Controls"] +unique_name_in_owner = true +layout_mode = 2 +stretch_mode = 5 + +[node name="DpadDown" type="TextureRect" parent="HBoxContainer/Controls"] +unique_name_in_owner = true +layout_mode = 2 +stretch_mode = 5 + +[node name="Start" type="TextureRect" parent="HBoxContainer/Controls"] +unique_name_in_owner = true +layout_mode = 2 +stretch_mode = 5 + +[node name="Misc1" type="TextureRect" parent="HBoxContainer/Controls"] +unique_name_in_owner = true +layout_mode = 2 +stretch_mode = 5 + +[node name="Back" type="TextureRect" parent="HBoxContainer/Controls"] +unique_name_in_owner = true +layout_mode = 2 +stretch_mode = 5 + +[node name="Directions" type="MarginContainer" parent="HBoxContainer"] +unique_name_in_owner = true +visible = false +custom_minimum_size = Vector2(100, 100) +layout_mode = 2 + +[node name="LeftRight" type="TextureRect" parent="HBoxContainer/Directions"] +unique_name_in_owner = true +layout_mode = 2 +texture = ExtResource("2_nv2ob") +stretch_mode = 5 + +[node name="UpDown" type="TextureRect" parent="HBoxContainer/Directions"] +unique_name_in_owner = true +layout_mode = 2 +texture = ExtResource("3_ejti1") +stretch_mode = 5 diff --git a/addons/guide/ui/renderers/controllers/playstation/icons/PS5_Circle.png b/addons/guide/ui/renderers/controllers/playstation/icons/PS5_Circle.png new file mode 100644 index 0000000000000000000000000000000000000000..05a89a9bb583d5f7de480f924e2b10e73a48a273 GIT binary patch literal 5361 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 P00000NkvXXu0mjf3VuaP literal 0 HcmV?d00001 diff --git a/addons/guide/ui/renderers/controllers/playstation/icons/PS5_Circle.png.import b/addons/guide/ui/renderers/controllers/playstation/icons/PS5_Circle.png.import new file mode 100644 index 0000000..9aa8906 --- /dev/null +++ b/addons/guide/ui/renderers/controllers/playstation/icons/PS5_Circle.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://civpcnwgbu5ky" +path="res://.godot/imported/PS5_Circle.png-991ec3d8ff387e8a1997f29928333c68.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/guide/ui/renderers/controllers/playstation/icons/PS5_Circle.png" +dest_files=["res://.godot/imported/PS5_Circle.png-991ec3d8ff387e8a1997f29928333c68.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/addons/guide/ui/renderers/controllers/playstation/icons/PS5_Cross.png b/addons/guide/ui/renderers/controllers/playstation/icons/PS5_Cross.png new file mode 100644 index 0000000000000000000000000000000000000000..395a898da7efa6fbe84f17ba0526540893bf8339 GIT binary patch literal 4539 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 literal 0 HcmV?d00001 diff --git a/addons/guide/ui/renderers/controllers/playstation/icons/PS5_Dpad.png.import b/addons/guide/ui/renderers/controllers/playstation/icons/PS5_Dpad.png.import new file mode 100644 index 0000000..ed99363 --- /dev/null +++ b/addons/guide/ui/renderers/controllers/playstation/icons/PS5_Dpad.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ubnurptd6ee2" +path="res://.godot/imported/PS5_Dpad.png-ef26d9f78f150d4ab2b9e6bbe325f986.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/guide/ui/renderers/controllers/playstation/icons/PS5_Dpad.png" +dest_files=["res://.godot/imported/PS5_Dpad.png-ef26d9f78f150d4ab2b9e6bbe325f986.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/addons/guide/ui/renderers/controllers/playstation/icons/PS5_Dpad_Down.png b/addons/guide/ui/renderers/controllers/playstation/icons/PS5_Dpad_Down.png new file mode 100644 index 0000000000000000000000000000000000000000..a8f893a18836d5c611505722ed92641fb096642d GIT binary patch literal 6180 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 literal 0 HcmV?d00001 diff --git a/addons/guide/ui/renderers/controllers/playstation/icons/PS5_Dpad_Down.png.import b/addons/guide/ui/renderers/controllers/playstation/icons/PS5_Dpad_Down.png.import new file mode 100644 index 0000000..26ef580 --- /dev/null +++ b/addons/guide/ui/renderers/controllers/playstation/icons/PS5_Dpad_Down.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://vk1vje3280tk" +path="res://.godot/imported/PS5_Dpad_Down.png-ba21ca6e311100c142d2b003152ea1d2.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/guide/ui/renderers/controllers/playstation/icons/PS5_Dpad_Down.png" +dest_files=["res://.godot/imported/PS5_Dpad_Down.png-ba21ca6e311100c142d2b003152ea1d2.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/addons/guide/ui/renderers/controllers/playstation/icons/PS5_Dpad_Left.png b/addons/guide/ui/renderers/controllers/playstation/icons/PS5_Dpad_Left.png new file mode 100644 index 0000000000000000000000000000000000000000..2bdc0481d3c90d991eeb9203fc289fd1d8308807 GIT binary patch literal 5902 zcmV+p7xCzcP)mVRzaE!*--%UE`>4Oq&{kOT;d*9<%0fc4^;%v2?Ksk=R%l?94f5DPp zu+G<=*&VW}$}nT=1;#MNK(G>+B!&dpU<}wYNVe6M)K=g9(7NsJR_o0#QSTH_l?&YJ zzPH_{&pG#;^PDT-C0^nsUgG}^NTY9{7Wn=C355djaU8t>kdeKag~nu=T(H?_d}?Ycy*G1g50()~C=?Q885am4=Z&B7 zJP*Ou2>|Hs?x}0s<>e&+KsxmTk|dRUPAR>}akyX=!B|2de!u@XA+{JH#03C?;6h*j z0StJ&Xl-rX)wwd64Cdz&SbV&IbUFn9pp>R4EsR*fq}dyN0|3Br_6YzkL2zN{rzhbm zYD2BC+j#)M=4Pn|7}46=inos(#oI@YB9(f9TYtTQbUNiC#6AJw-MVjnm(g$y2?m27 z0o;Vs*^1!kFW_)E001p5PIS55a5|lEI-O{7Iu+9;2z8C0PNyMB5;jB;V)17snZ(A1 z2mr|E^9WD=5u%s@AdiQ`;ZJw_Z>$Fv&=4{P0B;>RstTj4%MIV)Ae>I;jz>2WpeTxn z-@c8Nl_VSv2i`hz6kp!F!S1D@0^u4tc@ZuEXmxJ+iro@MIXIn8oEjchf7i_I+OtV( zgcSr*f_jBfC=^gA6!z$Deq30cyi1qb#q|<5Lm|B6bx!Jum5)BuK88!@W?{4@L;~2&{tb&FMgi;a%%r&G|B$G*8 z{=*;Yy2e~XlzV9;8ZHns7zI*IL#|(&#@t*2iNu4l=NQL$=|jpO8lAiX07;F8)MHL& zzxxi0i;K!wkqC0RTus+$=U{WQdub#ZE)X-6YKVD0E0@dR+O=u*_k2E&Xe45Ku5pZ) z8d4E71^~-T%A3m48r2YuM3B$tb;qiiE(SISo0Hu`qhZN71OOyS0?+g6?@dijI&-wP zx{7>0hrYhPl51zbn}yf=s_t6j*j9xl1VSldgkWTOc?sP;O1&eUPQ&eXtLJdV_<^Cl zqXQqF8>?x2JGQA2F#?5wZW4gj5Q3l#cf+oUO{&4p^XPJS z>yBy1)XbHt^IrE177_@(1OVUPpH-vp`0d-eGi){+`uh*mJYs+UffDUtW9IXDe1Csd zH@6kA{k7ySBauja<@LTcF3Ykjm(8ND{{S{OB}kHlo>yK`&$HX@;5Zw^Os3*^-94|M zy}ey`?CzaAs#eT=c?-{~bjKb&e2Bz@9{?!6V}3rNo6{<&%FBvG{(M{}7$M+PMh1nP z;;1bS6jFh}d%Mc^3kE~K2gn%D^9YW!*zG({4G))4deZ3>o<4b^JJulx=1k|kO2}j~2v1%vuC(Z-aCqw1yLtbN7|wC9>b91xSza<6$6o}g> zcd3$~{C@v&jdq|`3V8Hz9+D*C)z@AxapE(#Z)4$+ zV)AbN^@eJyWO>t9>23A=gQYDR?50 z$h`LRQh`LT{f2^GXlZFtBjdJKC-!xAsORKzc@$(BlC-(?Q@iQH=H@0+sg$Zc6o_*& z84Cta&l}HWPTt+!gR>(6_4vTSMl4oO`W_XNxFcNnTTS%Q6h|BF!&Lr0TgXb%rTPPHeUR}rX zN(!$RsugxSkHc@iiGzm@RrR5@KoA6Ub-A&!l0`-z z@(=s9*Jz#mnX>`arrYgXJtOIKT5Z~?=EQ@+P?S0D*WdUF-gy#RpTSKM$3`V_=&VR_{Rk}F$z zJy8^qPNzXB1%Mcl$+*_9lv{ZjvG{laf4Q#s5Tl(g#yJ-W!8p(Jc*i%W8)yIiUibzF zx1|+I)6W*gsHv%0m%h<1H2(L}e-}ds{qoyjvTQCu*4+%x?;Q`KyQ>q;O%5zRO+uDs z)fpy}Nl;2hC@04wkw1^HY(O|1{xlF69U%ncU*5a{F_XdDM~>>o%w#h7Dn0`MpcE5Y zVfg+2Q{}bwPSM`h3h#ge3yVw0er3Ha9n2 zGNG|Z=R z1i__q-W?qRP7M#22t$(cm`gm^wlDyc&|0;YhrLAFd>2q9+sko3UNYEbv+0DwaU9%k zH(FZQ5}RJs3MCw#{DkA+k!3nYDZRjcWEmsj@Z=}#Jk7Ee0|Q>1842i|w|14rkWQyC zmq^si6RroWW4P?++FvM?gc;M2dd*cLF^|ODJOchRbzR3`v)S^nO< zVYl0{zP|3Fluk@WuBAo;r#}OLVlL>j;!g?u{?IvqOgJ1oUVr1T>TlSR*34gIv)Pgi zaydjJVR*b=9ZS+|yyoVun!X?iSXoKJ$2KXEn8$B__ZepIeZSM8bYLcof#-P;LI4mK z<>aa*0YYqJEFG?0Ntu}_0C@6bv1ZLMVs>^Gzx(Zf)kN~HhHbBDbGaO@UB9vGg3!Wd zv!SikiS>-KtmJtf`FtMQVp%y*N?n8y-NSEbaheKaF7aT;{(@=C;lqb<>hy34!Mj#$ zTSJVJYHDXk(L}g_6~+l zoY;{tfL-t*O-)T0KJ}0I@Pl8Xt7~8N3u;86P{91cQ&mIO*4BzC6`HE0EF6taUZIqx zBuTDlIu*Raq3pb**NMYlRUEj{YmhDOp?NScJgCapaPcs#g$+ zOnwZ=;{fpG%^SFXZ&p1&@!$u{+`e7fvDMs+gNFvt*4DP|zpGMjV>#xf-ege{qlD^& zkj>@GmTY$ec}Y?;y@2vEtgfyio6WLQ#t+qP4XZ3y&URC7HyDlP7f+ufLiBz)kr5p;RL+R(6zB4;%Y2v zS`%q*Zbox+a|u_N!C07L|F*U1&(}WJt>yTpj(K0TgzN5dp}VX8zKm)xRtwYVw5Ehh zFNOT?=?DqhjWXYQ`)EmF$_Nd!!*qj7#%2MO5-uZ801Ef(=&@tFQcKrj_Pg(JZ}z*2 zCEOApLV-B2B~4Mx8c*2~@{)uH^N&?w$g+&3r6p}WeZnY=P$(oYVGIm-b&0|=BYu2v zZVVrs8^f6qKRP-TlQZXAkBn~0UNxpnOkEW(3h#OgT)2~`#qyrTSvdZPs(t&ch9G*Xa z&T8m@!Cx>GYv3+-caLhOT3VbXi9$h8>Kly9duAkntFZ{u>6D97Isrf@=tyMp<6tlt z1GtHFI)%$$e2$-;dQV*%UyVgo`cH?T{97;mM~jseMIf5q_!5DbnXHchOgJ14HE=ST zt!y^8MU>OD#1vQE4PEHmezVD7Ae-#OW80b0#R7+*%Yw5R8j^5vjhMp=w|czGE~yv6r*h& z^~a3gYlQXzEH5qL>J?>E8Z)*apl721N@m%}NZAc&sicHZmyvK?hHO3kp8&>LZM&X= zm62p!fpk4bDLK!oe?};zXC;b#=lHvL<0pp!D1PIt-*0wF39dw=Dt+_*z1iZ*3y@`u zlxu_b`$OjlAs3A?PC1fwJ)GZsKF>^Okr6Xl(z#W(9f8<4<^bZd*=%TUZ`b({)`qa% zwgdtalQ)|#nrQ`~RQmuf&YU>&8|7-?bH&1tS#QYo>1i`gZ3>WmMxrxAk$8PxDX(s? z4Z+xskP$QZ_HTC~iWyK!Qyd3R&Fu()%7TvprO|K|#FT-z-?$SDj?Mt^Y5j)X&f~1# zU*br$4LfGtQ=%y1N;HbiO-c8L0*HshlQnNGUanE6-fwWA6mvjfq}ENi*uol5?s5wKJjF2^Z3s@}eSRTv!|0*)R# zraP}1JLJ*Bhg#Ac0O07cV`|Xo@p#eO*RPw?DzJ<|ib+Es01TZ_oVeZ2mk^&NDUYRR z&#I2M^z50g2*mTsSd6H~<^bT+W`-LL%Lqi9S7HI#;WytbX$g3|uuxONQV`7hr8Wm#U8nTFK+9lLu4O9%wTI6$i*)xHs@ufHF;YtvdHor<9$J?Xj9 zH}+`ew1kFO#ANAXkZOH+4E{i{Tg5uDNW%qU7K0f3 zG_u+9`KzX;CY(Bbx~i!%j-j2yO0h`8ow`{JQjdlJN?U-t%UmmyylQ?xm4vxP}lS#{h2p`}_AW;PJxYaNz0FC%6)gqRZ`8 z3CtaWuV%C{uk)7(pAVF7`VOR|hPQOtP0j?ds7-@9-) z9N5?pRUQ?Cc7MfMq1}hkhN48^?>N9tjo*AE(_6fsIk%t|y;z=8rXgYs<&oR3oCt2cO~6mddmT$bgy kRkYwGUg9NQ;_n3i2lR$N`N8Ekvj6}907*qoM6N<$f>6dZ{{R30 literal 0 HcmV?d00001 diff --git a/addons/guide/ui/renderers/controllers/playstation/icons/PS5_Dpad_Left.png.import b/addons/guide/ui/renderers/controllers/playstation/icons/PS5_Dpad_Left.png.import new file mode 100644 index 0000000..9a31227 --- /dev/null +++ b/addons/guide/ui/renderers/controllers/playstation/icons/PS5_Dpad_Left.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bkpw61ctv0fbg" +path="res://.godot/imported/PS5_Dpad_Left.png-bd78cf7c0092facc48bbf8fd7816f7a2.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/guide/ui/renderers/controllers/playstation/icons/PS5_Dpad_Left.png" +dest_files=["res://.godot/imported/PS5_Dpad_Left.png-bd78cf7c0092facc48bbf8fd7816f7a2.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/addons/guide/ui/renderers/controllers/playstation/icons/PS5_Dpad_Right.png b/addons/guide/ui/renderers/controllers/playstation/icons/PS5_Dpad_Right.png new file mode 100644 index 0000000000000000000000000000000000000000..b7cd56832ce2f613aae03e5946f261a33b318573 GIT binary patch literal 5943 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 F{|~8VJ3RmZ literal 0 HcmV?d00001 diff --git a/addons/guide/ui/renderers/controllers/playstation/icons/PS5_Dpad_Right.png.import b/addons/guide/ui/renderers/controllers/playstation/icons/PS5_Dpad_Right.png.import new file mode 100644 index 0000000..257b99c --- /dev/null +++ b/addons/guide/ui/renderers/controllers/playstation/icons/PS5_Dpad_Right.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dybnayy8y7rxe" +path="res://.godot/imported/PS5_Dpad_Right.png-064b9c5c42d22a9c2be3902ca2e33638.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/guide/ui/renderers/controllers/playstation/icons/PS5_Dpad_Right.png" +dest_files=["res://.godot/imported/PS5_Dpad_Right.png-064b9c5c42d22a9c2be3902ca2e33638.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/addons/guide/ui/renderers/controllers/playstation/icons/PS5_Dpad_Up.png b/addons/guide/ui/renderers/controllers/playstation/icons/PS5_Dpad_Up.png new file mode 100644 index 0000000000000000000000000000000000000000..99180d27e4f4623b956ddade2b867baecf0b5768 GIT binary patch literal 5979 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 G6Zt=W5@`DX literal 0 HcmV?d00001 diff --git a/addons/guide/ui/renderers/controllers/playstation/icons/PS5_Dpad_Up.png.import b/addons/guide/ui/renderers/controllers/playstation/icons/PS5_Dpad_Up.png.import new file mode 100644 index 0000000..bfa2c71 --- /dev/null +++ b/addons/guide/ui/renderers/controllers/playstation/icons/PS5_Dpad_Up.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bvbd876sy2430" +path="res://.godot/imported/PS5_Dpad_Up.png-b8fc9319fe2231915e5e8e21174b1c1c.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/guide/ui/renderers/controllers/playstation/icons/PS5_Dpad_Up.png" +dest_files=["res://.godot/imported/PS5_Dpad_Up.png-b8fc9319fe2231915e5e8e21174b1c1c.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/addons/guide/ui/renderers/controllers/playstation/icons/PS5_L1.png b/addons/guide/ui/renderers/controllers/playstation/icons/PS5_L1.png new file mode 100644 index 0000000000000000000000000000000000000000..07e505a76a04f772c10f5f14d825255890a99734 GIT binary patch literal 2758 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 M07*qoM6N<$f+)l^Q2+n{ literal 0 HcmV?d00001 diff --git a/addons/guide/ui/renderers/controllers/playstation/icons/PS5_L1.png.import b/addons/guide/ui/renderers/controllers/playstation/icons/PS5_L1.png.import new file mode 100644 index 0000000..dd46c43 --- /dev/null +++ b/addons/guide/ui/renderers/controllers/playstation/icons/PS5_L1.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cqgpumb0tf5xr" +path="res://.godot/imported/PS5_L1.png-daedbc1549c79d92cbcf68661193a3b8.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/guide/ui/renderers/controllers/playstation/icons/PS5_L1.png" +dest_files=["res://.godot/imported/PS5_L1.png-daedbc1549c79d92cbcf68661193a3b8.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/addons/guide/ui/renderers/controllers/playstation/icons/PS5_L2.png b/addons/guide/ui/renderers/controllers/playstation/icons/PS5_L2.png new file mode 100644 index 0000000000000000000000000000000000000000..05f3dd27dd0e6a8251dab28818ddcb6f1b3154b6 GIT binary patch literal 2968 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 literal 0 HcmV?d00001 diff --git a/addons/guide/ui/renderers/controllers/playstation/icons/PS5_Left_Stick.png.import b/addons/guide/ui/renderers/controllers/playstation/icons/PS5_Left_Stick.png.import new file mode 100644 index 0000000..55a4f30 --- /dev/null +++ b/addons/guide/ui/renderers/controllers/playstation/icons/PS5_Left_Stick.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c3qet180o0dn6" +path="res://.godot/imported/PS5_Left_Stick.png-472622a0a1752a811747d3e6c02f5438.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/guide/ui/renderers/controllers/playstation/icons/PS5_Left_Stick.png" +dest_files=["res://.godot/imported/PS5_Left_Stick.png-472622a0a1752a811747d3e6c02f5438.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/addons/guide/ui/renderers/controllers/playstation/icons/PS5_Left_Stick_Click.png b/addons/guide/ui/renderers/controllers/playstation/icons/PS5_Left_Stick_Click.png new file mode 100644 index 0000000000000000000000000000000000000000..66e5271ff5c62f11369b48b40bb2dc8675ac7128 GIT binary patch literal 3046 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 literal 0 HcmV?d00001 diff --git a/addons/guide/ui/renderers/controllers/playstation/icons/PS5_Left_Stick_Click.png.import b/addons/guide/ui/renderers/controllers/playstation/icons/PS5_Left_Stick_Click.png.import new file mode 100644 index 0000000..84fe65f --- /dev/null +++ b/addons/guide/ui/renderers/controllers/playstation/icons/PS5_Left_Stick_Click.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c0b1sdadfcnbk" +path="res://.godot/imported/PS5_Left_Stick_Click.png-f837f37222a7c945cd4b672d0d7e3ba1.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/guide/ui/renderers/controllers/playstation/icons/PS5_Left_Stick_Click.png" +dest_files=["res://.godot/imported/PS5_Left_Stick_Click.png-f837f37222a7c945cd4b672d0d7e3ba1.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/addons/guide/ui/renderers/controllers/playstation/icons/PS5_Microphone.png b/addons/guide/ui/renderers/controllers/playstation/icons/PS5_Microphone.png new file mode 100644 index 0000000000000000000000000000000000000000..bb0f331314f4ea94f8465c33c94dad93f075c6dd GIT binary patch literal 1654 zcmV-+28sEJP)x)bvEhu8k2l@V`JlkfKV3Z zmvL=(AyoyO>gnm}*H;Cyxw*L`UiQUi1A|f&J(ZJ_lW#9xLj;Un|A2roSmcf4d-ZY= zLMbYf$vE&^Uk?utc9axmM2L(XKQdO8p=O#)6!z{bX?AvYs*S$8y9)|B69v8dIzVlT z7~S-x1%$e&#l^*%DBh*MHf?5xiGAHI&FXYI-R=JVURCT5#Xd`?3)8A0OG`_iR4^76 z7Fa%?PdyA0c|cx}Cw*7F@QyrumIx^n3hzZ4I#fl*>gwuKijqa?YnnxAN+n8N?RHxk zDPmvAb=`j_8W;-0D+=OlWo4xY#@yT-TV7sHU9?b|y12Mtx3{-XwUoSRHk*{HR9^l* zQG|$M-jWM>Hk<8k;b>W3Ur%+)YBU->QE_>B+1=yQ*^MmN1Xra_a zP|_@dL8&T;3QAoBNg-=k$2H1DOMZh=Q#e&oiXteY-%d3U@_@X!y1IHwUF21e$|O(6 z10rab=s;n~;|noROg)US7qV9}5b|`QqCQF#q5$%InivRRyfF|N08Jqb8jGY&^7P3# z7wgQ312}SClm|R?P`Td*5Vco7j5sp{NDBTwW_~{e33Wgk&c&Zxm|#UQPzYPg`Zx_(SYt=jZ33;ETKh=1b))b8Hf&IINj(}nz79!1L)H2BX<*u3TL6Lt4SAnFQ?ZLhfr)&M$E(>++gA`Y;&d%&Q`0O{ni~ zW0y0dL}{n*>Nc1aF$I(WWC9(#tq;Lf&AHe9{$I=9`X%>`r9|;dS%&u%0hF4&2hR~u zb^zp!l$|rGBJtM-LE(&50pt~x&*#sw3x+)i%Dcka-ZVprWtWv^D6wsOhe0_yZGD_p zD6t-g41!{C?|@q4X@nB{fuRb@V{tdC(+DLIBXxqZU0nNBHa-kR{Q3z%URkPW2%u~i z*8VV9{~BZfc|#~$h4sIZ4kgw=j@%z#j_ZxTX}UdlZ&2H-1BIq#j@`yTw8izDV|zd3 zae|SRsja$a9zCDZT|MrPMQDC&PXMFI!?Fa05fpl*-+Q5XRf8F&0BjuR$YL8I+&8Y< z>aw2?+m9L`4vUoV%rE!!r|=OWBNT$76)8zlV*g_dLE)ZP6NZa@yH>H$Rsfsmk8-#tRvU79x!Xi5e^G!=chPxz!B z;rWXtswya`ArVDauW9hgm?>`9Sford001(Ex+zMe9l3~4Gn7QET%`0R7xABG;90`` z&=bL?9o`+R>r$n!IIe0;M3?0kU!`%!F8vo^!dp9hKj`S>nvw+Z$`20b~NH(~f@Eg^~KR4-i@TH9rR+ql`5& z`>**q2*M+600IFBfIt8OAP|562m~N$*Z%?x00OyaVBQ$>MF0Q*07*qoM6N<$f<55w Avj6}9 literal 0 HcmV?d00001 diff --git a/addons/guide/ui/renderers/controllers/playstation/icons/PS5_Microphone.png.import b/addons/guide/ui/renderers/controllers/playstation/icons/PS5_Microphone.png.import new file mode 100644 index 0000000..6199d2d --- /dev/null +++ b/addons/guide/ui/renderers/controllers/playstation/icons/PS5_Microphone.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://eljpu2rrb3k4" +path="res://.godot/imported/PS5_Microphone.png-3a2db423599523aa5c1b828df7d224bc.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/guide/ui/renderers/controllers/playstation/icons/PS5_Microphone.png" +dest_files=["res://.godot/imported/PS5_Microphone.png-3a2db423599523aa5c1b828df7d224bc.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/addons/guide/ui/renderers/controllers/playstation/icons/PS5_Options.png b/addons/guide/ui/renderers/controllers/playstation/icons/PS5_Options.png new file mode 100644 index 0000000000000000000000000000000000000000..3e56fe2ecab9b729eced41a914b5eeabbc03b891 GIT binary patch literal 2858 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 IM6N<$g6yDl&Hw-a literal 0 HcmV?d00001 diff --git a/addons/guide/ui/renderers/controllers/playstation/icons/PS5_Options.png.import b/addons/guide/ui/renderers/controllers/playstation/icons/PS5_Options.png.import new file mode 100644 index 0000000..b464245 --- /dev/null +++ b/addons/guide/ui/renderers/controllers/playstation/icons/PS5_Options.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bkttgyeuecjw" +path="res://.godot/imported/PS5_Options.png-4bd9928e2e3aca6fb17663799d26e7a5.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/guide/ui/renderers/controllers/playstation/icons/PS5_Options.png" +dest_files=["res://.godot/imported/PS5_Options.png-4bd9928e2e3aca6fb17663799d26e7a5.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/addons/guide/ui/renderers/controllers/playstation/icons/PS5_Options_Alt.png b/addons/guide/ui/renderers/controllers/playstation/icons/PS5_Options_Alt.png new file mode 100644 index 0000000000000000000000000000000000000000..ca28364afc5b0b8f746300ed67b631d0b6e62926 GIT binary patch literal 3224 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 KMNUMnLSTXwA3gj4 literal 0 HcmV?d00001 diff --git a/addons/guide/ui/renderers/controllers/playstation/icons/PS5_Options_Alt.png.import b/addons/guide/ui/renderers/controllers/playstation/icons/PS5_Options_Alt.png.import new file mode 100644 index 0000000..cb2f529 --- /dev/null +++ b/addons/guide/ui/renderers/controllers/playstation/icons/PS5_Options_Alt.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://byed3fsjbp82u" +path="res://.godot/imported/PS5_Options_Alt.png-4b64997ac577d658c383b1e727319cf5.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/guide/ui/renderers/controllers/playstation/icons/PS5_Options_Alt.png" +dest_files=["res://.godot/imported/PS5_Options_Alt.png-4b64997ac577d658c383b1e727319cf5.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/addons/guide/ui/renderers/controllers/playstation/icons/PS5_R1.png b/addons/guide/ui/renderers/controllers/playstation/icons/PS5_R1.png new file mode 100644 index 0000000000000000000000000000000000000000..2cff97af0ed49642c61eda14a04937624cc28a5a GIT binary patch literal 2947 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

TY7&WwOPEP)jQZkjVSC~v~c>lv| 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 literal 0 HcmV?d00001 diff --git a/addons/guide/ui/renderers/controllers/playstation/icons/PS5_Touch_Pad.png.import b/addons/guide/ui/renderers/controllers/playstation/icons/PS5_Touch_Pad.png.import new file mode 100644 index 0000000..025c11c --- /dev/null +++ b/addons/guide/ui/renderers/controllers/playstation/icons/PS5_Touch_Pad.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bxxkjsl2u83mp" +path="res://.godot/imported/PS5_Touch_Pad.png-b3baca99700ac1cd505b545f684de924.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/guide/ui/renderers/controllers/playstation/icons/PS5_Touch_Pad.png" +dest_files=["res://.godot/imported/PS5_Touch_Pad.png-b3baca99700ac1cd505b545f684de924.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/addons/guide/ui/renderers/controllers/playstation/icons/PS5_Triangle.png b/addons/guide/ui/renderers/controllers/playstation/icons/PS5_Triangle.png new file mode 100644 index 0000000000000000000000000000000000000000..4950d17a6d7b923450f577adc103af8d2a3037b3 GIT binary patch literal 4722 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 Ar2qf` literal 0 HcmV?d00001 diff --git a/addons/guide/ui/renderers/controllers/playstation/icons/PS5_Triangle.png.import b/addons/guide/ui/renderers/controllers/playstation/icons/PS5_Triangle.png.import new file mode 100644 index 0000000..0aa199d --- /dev/null +++ b/addons/guide/ui/renderers/controllers/playstation/icons/PS5_Triangle.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bjjj12v4g82g4" +path="res://.godot/imported/PS5_Triangle.png-6cfcb99a3dd2daba1763b52afa5e6f91.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/guide/ui/renderers/controllers/playstation/icons/PS5_Triangle.png" +dest_files=["res://.godot/imported/PS5_Triangle.png-6cfcb99a3dd2daba1763b52afa5e6f91.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/addons/guide/ui/renderers/controllers/playstation/playstation_controller_renderer.tscn b/addons/guide/ui/renderers/controllers/playstation/playstation_controller_renderer.tscn new file mode 100644 index 0000000..d4809e0 --- /dev/null +++ b/addons/guide/ui/renderers/controllers/playstation/playstation_controller_renderer.tscn @@ -0,0 +1,101 @@ +[gd_scene load_steps=21 format=3 uid="uid://bwv1638hcrfni"] + +[ext_resource type="PackedScene" uid="uid://bsaylcb5ixjxk" path="res://addons/guide/ui/renderers/controllers/controller_renderer.tscn" id="1_bq6gh"] +[ext_resource type="Texture2D" uid="uid://cfy1rx4d4wjdh" path="res://addons/guide/ui/renderers/controllers/playstation/icons/PS5_Cross.png" id="2_oqi6t"] +[ext_resource type="Texture2D" uid="uid://civpcnwgbu5ky" path="res://addons/guide/ui/renderers/controllers/playstation/icons/PS5_Circle.png" id="3_m332j"] +[ext_resource type="Texture2D" uid="uid://dm6vfcwtodame" path="res://addons/guide/ui/renderers/controllers/playstation/icons/PS5_Square.png" id="4_dqhg4"] +[ext_resource type="Texture2D" uid="uid://bjjj12v4g82g4" path="res://addons/guide/ui/renderers/controllers/playstation/icons/PS5_Triangle.png" id="5_42ocy"] +[ext_resource type="Texture2D" uid="uid://c3qet180o0dn6" path="res://addons/guide/ui/renderers/controllers/playstation/icons/PS5_Left_Stick.png" id="6_wwoxb"] +[ext_resource type="Texture2D" uid="uid://c0b1sdadfcnbk" path="res://addons/guide/ui/renderers/controllers/playstation/icons/PS5_Left_Stick_Click.png" id="7_gethe"] +[ext_resource type="Texture2D" uid="uid://bukgaq1m26bw3" path="res://addons/guide/ui/renderers/controllers/playstation/icons/PS5_Right_Stick.png" id="8_u2725"] +[ext_resource type="Texture2D" uid="uid://c4krmros0va1i" path="res://addons/guide/ui/renderers/controllers/playstation/icons/PS5_Right_Stick_Click.png" id="9_wfckm"] +[ext_resource type="Texture2D" uid="uid://cqgpumb0tf5xr" path="res://addons/guide/ui/renderers/controllers/playstation/icons/PS5_L1.png" id="10_34ib6"] +[ext_resource type="Texture2D" uid="uid://rwgkfm18pk3l" path="res://addons/guide/ui/renderers/controllers/playstation/icons/PS5_R1.png" id="11_53ury"] +[ext_resource type="Texture2D" uid="uid://bhoi6nfung5ye" path="res://addons/guide/ui/renderers/controllers/playstation/icons/PS5_L2.png" id="12_tyubh"] +[ext_resource type="Texture2D" uid="uid://u6ba23igjbj5" path="res://addons/guide/ui/renderers/controllers/playstation/icons/PS5_R2.png" id="13_pr5lk"] +[ext_resource type="Texture2D" uid="uid://bvbd876sy2430" path="res://addons/guide/ui/renderers/controllers/playstation/icons/PS5_Dpad_Up.png" id="14_h0miw"] +[ext_resource type="Texture2D" uid="uid://bkpw61ctv0fbg" path="res://addons/guide/ui/renderers/controllers/playstation/icons/PS5_Dpad_Left.png" id="15_q5yu5"] +[ext_resource type="Texture2D" uid="uid://dybnayy8y7rxe" path="res://addons/guide/ui/renderers/controllers/playstation/icons/PS5_Dpad_Right.png" id="16_ulk14"] +[ext_resource type="Texture2D" uid="uid://vk1vje3280tk" path="res://addons/guide/ui/renderers/controllers/playstation/icons/PS5_Dpad_Down.png" id="17_wm4fj"] +[ext_resource type="Texture2D" uid="uid://bkttgyeuecjw" path="res://addons/guide/ui/renderers/controllers/playstation/icons/PS5_Options.png" id="18_eabm3"] +[ext_resource type="Texture2D" uid="uid://eljpu2rrb3k4" path="res://addons/guide/ui/renderers/controllers/playstation/icons/PS5_Microphone.png" id="19_oj5w7"] +[ext_resource type="Texture2D" uid="uid://bw2h7xxdtp31i" path="res://addons/guide/ui/renderers/controllers/playstation/icons/PS5_Share.png" id="20_p3s2m"] + +[node name="ControllerRenderer" instance=ExtResource("1_bq6gh")] +controller_name_matches = Array[String](["DualSense", "DualShock", "PlayStation", "PS3", "PS4", "PS5"]) +a_button = ExtResource("2_oqi6t") +b_button = ExtResource("3_m332j") +x_button = ExtResource("4_dqhg4") +y_button = ExtResource("5_42ocy") +left_stick = ExtResource("6_wwoxb") +left_stick_click = ExtResource("7_gethe") +right_stick = ExtResource("8_u2725") +right_stick_click = ExtResource("9_wfckm") +left_bumper = ExtResource("10_34ib6") +right_bumper = ExtResource("11_53ury") +left_trigger = ExtResource("12_tyubh") +right_trigger = ExtResource("13_pr5lk") +dpad_up = ExtResource("14_h0miw") +dpad_left = ExtResource("15_q5yu5") +dpad_right = ExtResource("16_ulk14") +dpad_down = ExtResource("17_wm4fj") +start = ExtResource("18_eabm3") +misc1 = ExtResource("19_oj5w7") +back = ExtResource("20_p3s2m") + +[node name="AButton" parent="HBoxContainer/Controls" index="0"] +texture = ExtResource("2_oqi6t") + +[node name="BButton" parent="HBoxContainer/Controls" index="1"] +texture = ExtResource("3_m332j") + +[node name="XButton" parent="HBoxContainer/Controls" index="2"] +texture = ExtResource("4_dqhg4") + +[node name="YButton" parent="HBoxContainer/Controls" index="3"] +texture = ExtResource("5_42ocy") + +[node name="LeftStick" parent="HBoxContainer/Controls" index="4"] +texture = ExtResource("6_wwoxb") + +[node name="LeftStickClick" parent="HBoxContainer/Controls" index="5"] +texture = ExtResource("7_gethe") + +[node name="RightStick" parent="HBoxContainer/Controls" index="6"] +texture = ExtResource("8_u2725") + +[node name="RightStickClick" parent="HBoxContainer/Controls" index="7"] +texture = ExtResource("9_wfckm") + +[node name="LeftBumper" parent="HBoxContainer/Controls" index="8"] +texture = ExtResource("10_34ib6") + +[node name="RightBumper" parent="HBoxContainer/Controls" index="9"] +texture = ExtResource("11_53ury") + +[node name="LeftTrigger" parent="HBoxContainer/Controls" index="10"] +texture = ExtResource("12_tyubh") + +[node name="RightTrigger" parent="HBoxContainer/Controls" index="11"] +texture = ExtResource("13_pr5lk") + +[node name="DpadUp" parent="HBoxContainer/Controls" index="12"] +texture = ExtResource("14_h0miw") + +[node name="DpadLeft" parent="HBoxContainer/Controls" index="13"] +texture = ExtResource("15_q5yu5") + +[node name="DpadRight" parent="HBoxContainer/Controls" index="14"] +texture = ExtResource("16_ulk14") + +[node name="DpadDown" parent="HBoxContainer/Controls" index="15"] +texture = ExtResource("17_wm4fj") + +[node name="Start" parent="HBoxContainer/Controls" index="16"] +texture = ExtResource("18_eabm3") + +[node name="Misc1" parent="HBoxContainer/Controls" index="17"] +texture = ExtResource("19_oj5w7") + +[node name="Back" parent="HBoxContainer/Controls" index="18"] +texture = ExtResource("20_p3s2m") diff --git a/addons/guide/ui/renderers/controllers/switch/icons/Switch_A.png b/addons/guide/ui/renderers/controllers/switch/icons/Switch_A.png new file mode 100644 index 0000000000000000000000000000000000000000..df756ef0fe0b1a6a1c277b6106aaaa1b6db36201 GIT binary patch literal 3780 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 literal 0 HcmV?d00001 diff --git a/addons/guide/ui/renderers/controllers/switch/icons/Switch_B.png.import b/addons/guide/ui/renderers/controllers/switch/icons/Switch_B.png.import new file mode 100644 index 0000000..a6de4c9 --- /dev/null +++ b/addons/guide/ui/renderers/controllers/switch/icons/Switch_B.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bptn4jygg3p8q" +path="res://.godot/imported/Switch_B.png-fbb8f305e166298807aa18fab0c22a62.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/guide/ui/renderers/controllers/switch/icons/Switch_B.png" +dest_files=["res://.godot/imported/Switch_B.png-fbb8f305e166298807aa18fab0c22a62.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/addons/guide/ui/renderers/controllers/switch/icons/Switch_Controller_Left.png b/addons/guide/ui/renderers/controllers/switch/icons/Switch_Controller_Left.png new file mode 100644 index 0000000000000000000000000000000000000000..f90a2441298fb8cabefe5166b3f8e948a2244002 GIT binary patch literal 1496 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 a6!;&L(y=T#MT&a>0000 z?|Ixd493AOV0Qwi6T}-_IzikC>`dTnaNWSk1m{d(cLKQ+Trz>23C^A1*ALW1>V=f} z2bAdRz0cz>aYTXy`2qw$TI7TiPVmE&XcRaTk#{0;Ir870MdYh7=35CF{`UYbfHlw% zj}36K^cao;z!`9xpad5lfNSgyJ0TX`Jv9Xs;X;e0!V{&r z0KBElt_Z==Q(Balg{6=u5jig+O*mde0F6;hEh4)H8ju209{LdPg% zE92*i8t_#_?u{{@mlh-yK?(uxMC7AVpO0cE?n&%!yAqKbrM8E-7m+7p%$EXfF9%?y zXq269EY^!Eg|=&dHTT>V0ebFjGtp10)X%64RPI8LQWkbae@$rjMMVA_eEUX3&d0bN z*hm@b^5I^rz4?2_KJ!2tm9!}<5PQa00$XfUpnggtjYif9{hTRIa1L5*T&})@C+WsK zWp}&ZIh-#*U1`SYrQoSiAQVWzuIewQSTTf0n~1W2GcC*pN$X z|7XNa+?K!{*|n|ZUeBWxMS&r~eZ;QxQ0x->Xq3iRRw?M82Sz8014<)4H=jz0vAb{# z*C{fD3aVACFexlOHSVx0Hg#j{JucO0@-Cf3kvL5;e83NCg7 zz3P56@F*gm4*u;%@&k$I#+ZL{8bCMc_O584vRgs7%o7%mhSC@tMUhl?$uGWN7-PO0 zV?G;WeiOTj?!|`HYrxae0yuDkLQvAHkRgmQ-;6OIj4{88rJBdwjx$kfZvQ5?f#hOq ztY>j0HrM_pSC9l`*^q8EYw!3cW6bZ$ZN>u|KHo5J`22mQ%-Syg9(CnXuz|@rvVU#P z;3?;<)R}o?9xpA)vmq`#6N~wy!Lgt$r9~-)ywpMn>Q~4Rl%ceS397)xuhz=_y6})Q zKSi#zg@7_%+P(C(zI$AD{angCb;((t)?x}70-MkHD0bp%E9Q>Hy)ouP>c>F`!_uhm z;F*KxoR6ze$PmVuFUFWZ#M0PD$sFJU$U1DQQWo}Ha48}$ns+r`8Ksqt`i27Q+O`94 zqs5*>RFgN%ckoPt=2)}9_yJJ;ZXk802eMpVH4t9hw!iMI8eU+TSegr2@ijG&UM0Wg zcqnbBIgTulPa6%dpVFdh(24+m82gs^LWVu1scwDdp|m<~W#OLm&EWSJSZZn`2iRhx zvaf;Cwwf{~1Ak$ibA@ATu{Ol7)Gc*WTDfAm7~l?Nw*lXsb>B7#gWpgerPYxo#J%;S zj2rosrg~?CcuK40?BS!UoEucBD|L(V-9W-Ats1&oyCz1l{cF;U?*sEuT2*Hc*D6+D zEuT`20tJSqH+-3j*x|NPP=m_plFi4Ca_ z!|5;5Jxntd!p73ljl>s)@88)vo=0hL+mF$=Oa|Yc5q9PJA!J3 zr|F{tsgzb{Y3LBROEISuk{fBw=6bAWbVpiLU`?%*hI_SpLkQ^HeOJvlU@2{rAV))O zl!iN~=%p2ON;reOxP-CfQrhxqTl@z@-;LXKnhyShA__T>^MZ{?v0muq-<35l!Osr}u%iW9#>MQ;6y~dM^+=l{uXOdu- zn#yuFE&*MF`F6=Bau7pghq))(zfEYbn%vD$C||{i_AUvYFziG%2j907?dQ_rHR(|S zT}Qw(Smyvqvn9bf2Q1&aE#P5MP4Ka2lZ9Ly>v0FJhhD4fsy?-9646nF+x+Ssx{{AOx zrIP=mX|b~oZhJdfGL_TeYGj}f%y3X*d|`y5$hiT9lBtwVuSW*D!%|97#gM;C)Hxl$ zhgrUaXhJD_#oSRayg+||t3@I6(v?Gi6=Bp-EU!&^xTb{1)jIl_x4@40cidHja-_wc zbk77bYFn4dr*xCtMoh}y4b6>RZKful-q5xslrbX5@&$IJCxPxrJCm$N+MOkokNOt*Z7oC$F=Fwpf3%Ljqs{od&Am1pA2oOMNl{dPX*S5tznEZVv@lH75gcD9UVG{oWd8ne*npt6?00000NkvXXu0mjf^YrPK literal 0 HcmV?d00001 diff --git a/addons/guide/ui/renderers/controllers/switch/icons/Switch_Controllers_Separate.png.import b/addons/guide/ui/renderers/controllers/switch/icons/Switch_Controllers_Separate.png.import new file mode 100644 index 0000000..88af5e1 --- /dev/null +++ b/addons/guide/ui/renderers/controllers/switch/icons/Switch_Controllers_Separate.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://8lsr71y25n8q" +path="res://.godot/imported/Switch_Controllers_Separate.png-8b202bd393de46b2f97712ac19581121.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/guide/ui/renderers/controllers/switch/icons/Switch_Controllers_Separate.png" +dest_files=["res://.godot/imported/Switch_Controllers_Separate.png-8b202bd393de46b2f97712ac19581121.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/addons/guide/ui/renderers/controllers/switch/icons/Switch_Down.png b/addons/guide/ui/renderers/controllers/switch/icons/Switch_Down.png new file mode 100644 index 0000000000000000000000000000000000000000..7b7b2b297c22ac0f49fc7c3696e194f397f9747f GIT binary patch literal 3578 zcmVCxSF9v8OLx$~uSmrLg^moDj)Uy%C=$}fo0B~_FzsiKtW zf2u^#PnwN>5$aJ-fZV9b{O|OtE!@v|6oS0C-6Vc?qDF$1@mXX8=wJAt&3W zrmY}ke}DfeA>2Qlsz@=JOfVXaz!($$pHh0b3ALzsKcLlW{c%P{ zY4JKC1g2@CTCJi`DCAv@2T>>#U>F7nA;NKn5b~{MSpBd>fMFQWbsf5{Fa6)LEC7J-``#uJP0eZb2 zMx#-z@7T62D|>3&_RBo1u*?ZrMMkYwd$4=bbsddH1C2%_7b^<@T-Qaf*TePoHG&{m zS#~;|qTlaF#umodNw?emW!81eln@yinx>&ztwL4hLzb$lXf~VpsKQgv3#*Vw)?ys|~Po{*l+wFgXa{y|ZhFYz*a=h5v+e5S2gr;dL?;lR? z7-Pcz9k^FwcppvEpsMQ17Xi5M&Mq%6aeaL)EfWL*27^KFq+~|O%$j<&baO(`Xf&h^ zqU$=IKYxyLxh%b}<2dkrAFi9;upxxZ4FTR5Sj2ER#JhLzqy|6`1nBj8BGdR)r_=dU z>IyE_HH(|H+wETgI9|H(17k*`(LlT17OEl$0=TXV$8n_dg0vun%sm037sdB|ynFW! zgMoOwmW?Sv5WKj&y!_YN^;`D_vo(uTaFf1zy)Gr=;NSosee_Y}dg#`eOeUEVAwsEC zf?*iK?)2*F3Y|_z_`T_Lird>;{&L^8?Pu#+UTaSbEz9~l?=rV6OKKs>$nbq1cXxM* z<_qh>_kDPtHy>*j5t`;AvsYDBD2l?@wWMjRXlm}BvSvkZ{MQV>qW{- z%;B}VuGDT-Lda|Wnq^r+G7Q5Ik}(>MwuTJgy~~70yWJK#KNUrpyKELvGYsP}Z5>i6 zq}gnKqpIrZ;3Q<+{_2Oqjh}3=l{Q2__iVWbs@%h2LSS;e;;6PYD^b#*Z)Pux9VnX)! z_n(5Bjhm(^9XEJMPp8wZCL=^>elMa{tD#!0M#?IR5>XT(_edi+od$W!kO- z{sq!B4SRcg!m@l@%ogSnArT?va(QX<8X-hD0aR5r;Du1jo=_#l zVv!$9YO{@hv5|-n#@LcNip8RE>}WQdOP@tQ>O+F#I7^!#WGYb~@H{L58c3TTCV6EM5e;IchQEY`Mit=Ldv&@srn}wd|#a2hF z)rwo4%#h@n{F;o&1O}pQ!*}(o5StJ}$cx3#vhGSmNL*N!C2~dN23^F3+!0 z$_Np(jWnKxN0KolvQEy!FpNldC0lBhVUsFJ`mE`68X4S0b1=Sb_?LMVVi8iW*Q?+b zphR63KU;lhM~4WTQb|&Egy2ng5g~%MsmIlBy%bCRCF48F2^! zqHVM)3~v#soQty948C${3CUX}Y1IKlf0K+5SsOisScLEvmP{f1>~)>FN1iHK=idBp zlI^JB+lX&N8B!@kw#SO!&XZ;g36Ymd)=>u#{Y|nhOldX#J8agu?Pu*VCiOY=NDNi1X%A4&r%(6f0JM{_IaG|#Ueyi z)joG~VL5)6#zXNQNsv}0S&tq3ZxU@Y1)^=lx1kKN2;mo3WHH^mt369XfOKzq)?)|n zIFu2>w^8N`RI?;4bBNYC_|0Wm6OvRVd01BbxF{loA3ylETZJT6*6FH;0{4|$^oA;m zl6eezk~cmNbu79>!Vqj8g0?w}`-~(CS-Ppr(&E>cSA~$JL0pyOp$`7#l0{hwwmW4{ zh@vQ`i=SmnvwXLu>w2cv77*{v&srU#O&u~q__cRR>1o{O#3rQE>3q-kg(A83dc8=u zm36%NLn_Hb9sC}&FcATd>2%7Qy!|Axhe`Kkoh*KqMaJ^MEu~UvqbkWm9sEL+D1Zk* zWXls{>_k{lf~2mK!ym&=*CQbLH7khMBQFVoG!i<2Ovvr+?SN-q77=xQeI42LZWu2!X+PJPy%shOsE%6DC^>q6Ic;Y853 zZFruCT5UOn?_zlMrqp5>hA_7YaG&2q)=g1LW$Br|UN?p8+Jwvo_)BoXjlS=TqEZ38 zPg*QW67)ebX`ZY*%W4*%M<;6ADvETWh~^1+`XBniOtmg>Nt+8Y1*GP zO>6R`tQzQn_i0#ry&hCm&D`h3qu=l2{QUgEWXh|Q(d~ABn{~Z%%l$6OR0`Z%HgVR( zRaHf!(Ll9Y&1?s}ZQFCw<3tA!heMe+JF~Q~JaRp*LPko`Wc;eC!Zb~ora4c@A7_hE z*r21)2&2&`w(pEmioswY^C09#2C#wiLu90cv*WzGrlhcK8{_dT7Sf{mZjHtWKUAUPCF)3o{GP}XbkA;Pn#T-ROY4d??n z%)5)?@o2~9DT;CkU}eU&(7zQPowp7=&%<;&U3mc50*)x9M~`vPZiq49KAX_QtvQL(#R~Z4JUkt*a|{I)a&(XsZ@HUD9THuI~h6& zPAR1)j^i9})9KM$MaUvTa%NUpczkzi%r^L)GRDrfjf6#PEg?L@gY8vSea0Aj7Uw&J zkn zzjxY77RSFM1eVYN^P?~Z`z$U@L1D68QpNip_&v?0Dwp& zf>bI6Nm|@>w^+Q!cR}1xRh6rKNsuj z$z+hpWc&_;3C}{1QmKSespNMUObEOnJ3BkbX0ymIzp^SAK`Vg+TU@=S(PwV1$AQMkt72 zgn|gh%CoFOp-`ceo)AKg8OQK~vAs=rQ79BXurx?1{dilldb!HypRCI&6bf%BrSAwK z#Z7}-l~gK)SS$tr*xK4+b{F^Cw{IAYMgV~Ec#KY`!^G|?P)h5Bkathj5SKxD)5k<{6{Juoyzxs6RaGC{G@K1xEVyqg z8jbpPzl#uZS|}9WxNUPy>Xg#AZfB4z%h=l5a=pvS0z$}w?L;EM%>Hdb^@INvMFFLh znUDL}wvEwfsPFFX{za0c`h2^hC`cxgj6z+FL?VH7I?dFkuImp( z@dCpzFdPmS+8xI!&KGwt3|W-Y;(Qw+#B(uHsT6ZD03e-CBbDOzVwNk(WYRTfxgG13 zu0!0Oz!5^2j_>zTHG zguT5zRI63o+}tqt!Bmh;CWCUhjP31hmS%+`9*?6^si0Ua;`;g;?RJ})Z6<=Ks)|ab z!gXFRBHP>Bc=hTPTCEl?FE3$P*2XrOB=u}I>-nt}kw_+!%uYroJ>=%*2F+&kK@$HN zux*=pl4q7fCX>lsqB}f1#Qy$1E7L;q`SWK~t5qh$)P0!GvMkHO)zua1^*YMs^0Uh; ztyT-y*Vix%gNuD`*CB>s;Qag?nM?+iN`;pj&oE6BmzS4JXH;%*zw~Uk+xYN-X=RNs zc(o7Vy)3~91rdz31R0OVtmAlgtUC=}D~EJC9SjBorVptkNkS|Z10e*8qHukL3;cOf z4TnQeN--XfA6sc|ZTsu6k|4Hi!*QGk0<7|U_(!=vr{_^|GQ;c26UT8@K3)r__-Hh` zaQk4t-`_B-AEVdnaq-#j_dPEITDBi<$9kcM=(^rjRkc1}&pR9rF_}!DX&RR@Ot&Jr zcDoHlQJ6g#noK6H*AcdDb19ailwvR#EGv|&yR8-Mx~GJYcL3hcw@)S$bh~`l8`d-p znx@_T-|O|54PEm+V>}+C-|usK*z_2;$9MtPtlVfcex;PU4qdz%3y*-WtE`&6()8ul(BC(X z%!S)``i^+uT-PV~uH=E5+h9z6(MK`8eNZ+cvj%_#DT9VHmD8S#Gg- zjqg8j4*-QiL5E8z5X&F8pYh0#+;>dVEIw8< zO;6ie8pr>~c2eThAum*`IInO!A zk8Qxl#>U3RrauU42ioED`G#-YxG_bu%(JtzO<9(|(kzoEmJ=ix49;>Kmn4Kd1mHEu zOit6ZRaI4=A08gQHpoU_SW1v^IQ$!cpG`LV`@zA%zfHE;5}vgKmxMy06++0r7?}R6 zBuUXiq3{O-+f7(PkWeV}H$up-tn3p)rf%N6nfvzb+kaX4Q1yki0{{>Tg?0%cQN3dv z$ARbRoHyli8LFzbI-EN=IPg(1bOo3TQfVEljr*NWCnQOtCdMV@av6m}0q5uEO~*7% zdzi^&n08$pOXC%qhP4id175F}x)=b!^E|v>FB}d>SH75yB?S>h(Qu7{F z%M`pa4l8t7Z4m@|=M2rVjKcDQ{AgSYLHvF{{C+=cH>hwe1c}Gvh{xls-Jrt23o<%7 zia;QMKp=q8(NWg!T$zCvWMX1M_wPYvpaqFWqjeKJQ4|r4M%g(;fq@l75Cq-05s$|Q zVtCt%ffZzYd|Y=u%HeQee0-dNM|2oSL0m3Z+fh|K9*4{2GSMS?45T2jSd7YdtjIui zw%gm=*xue|?S>%?WDB{@*n(ILTM&z33t};BK`chsqpaJvZ~ukkxH(PJ=31rf^a=Cp z*fmUr!{Ierg=w0$M+ix&s+#)z`Sbs}`AtVbg2CV{&-2Rw<^cU`(botsD*q=9Ds`3Q zI1b@(I8`o}mpkPWx9zgR;qY%f&!=cQ`2#b@^L(n3zuc0Rf`me$6_}s+4B*^r8c-+uDV4-r_)KT?Ao%NPG_rRIm01@B!j`=tllx*7*dHDO>i6s zQ4|eZ-X?@JRgxr0)XJA6357zTy6yA%bW=)cadB}0MNxF~i7R#dpmBdw-{AB4hDA}# zHSTvho$z|i%_EZ}2|gd){AXE~>qIewTrQ_8yrL-H#=E(ix-7k0$Os|ucsx{{?1b0r zr7i~Wy;YcfVtG6s-MFY%*Io5Jf*>@daS}qP_V2Z}BuO%)>`Ocz4~B+@P$(2|adAPt z{PXj3Xqr~t<~R<5AfQw#b^L8#!NBcy!{_t$ooj0aoK7c|6xCMb^LgZQO+9}{`l?a4 z+da@?m_ffS+^$uNVGCk03>QQY1WZm&8g0gKCMPFNNiQkRre@UgKm z1cO2B?(SlDch`{78DNkgkw^rwSj?1L)6B%-a3CI!BNB-qolawaf1kPys)G3aeoRbE zV0d_#X0et-6h$Nw2}Gk&?Ck8|`1qJw*;E8^xm-vj5{8cJt;q23Fz(&Ehio>Bt*tE- zi^VIKNhPQU0s+&PR;+}_qQ zY>ZaXmgLi?Pe`ZJRJy5JsE@LW#Ui%1x3Rakhlz=aYZq6t*(`Q;c975K4JqHSc}PB= z$J@7W;rIKINFWE4Y!>69d$H!P(qn262472_Rdo9ai*n(J$z63Ec zG2pt;?=ZNp7?R87aB^}&^&%C=ad0}FAcSCOXvok@xWM<5>h$y!nx^6W{Jh&t6ErC zKqix+Qg*MD%jG$}OnBX>e0X^HTGOjKqmoubANxoY2;%jmUy%Vt2?F|?HV=o z?FHt7=six{41owCmdsCPE(pu}39Wc9qa_4kRWXe%#O|`tTq%HgT~?zVE3_Eqg7niu zo;-PickkY{{m$LHck%M&%eLRKVhdp&)p(u<$8mL^P6910Ep;rn(|0a|dhN%E_m%Vt zb3ra!NbRQ+Gcz-opPz4ee13i&Gcz-W*fttV2-0|_cEi)BPy0GnORp`{444aYSrNUS zsgXzoi;Ig*`xh4%5s5@P{$9_f73L+(J?OWE0N>+8?UNoPN$M)TTw=En9j?-kdpsT_ zlga9KGMVh@GP4~+bm(W4Rm;-S62jpy!r^dFt;4FLEavkN;OY~yUW908*9!9x=7P{z zTzvHCQO|a*62u!}E{MIjSdS$Hu@@Kr4|72}EiRs&ok3BQD|auds^aYItj>nLxTu3( z#nh&K>TT2D=;%mKWah~n%%d8|ajC|+!20^S;da;8*Y)NgDZ>qSzzTw_HqHmq=`>bW zR-h;fb$g1UU}a?m>2z9e9+IMNut(T;ngH(KzrPD0+PMGnb$B$%X0ymVAXE|pnPZ6-0swP!b1MLnjLfg5QmMZ)vRw!B z7;;G}mHH=u=L}453WAViU{@FRt7$dt?d|;$jYjuiPI_q$z^|!P>K`9Jemv{=ZIiG} xm(|FF2M-c3P?WW`wYG05u(7eRv9TF6{sc@ruBKk`h#LR^002ovPDHLkV1h|hjq?Bi literal 0 HcmV?d00001 diff --git a/addons/guide/ui/renderers/controllers/switch/icons/Switch_Dpad_Down.png.import b/addons/guide/ui/renderers/controllers/switch/icons/Switch_Dpad_Down.png.import new file mode 100644 index 0000000..8a8f63f --- /dev/null +++ b/addons/guide/ui/renderers/controllers/switch/icons/Switch_Dpad_Down.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dq2ypo4cx3ucs" +path="res://.godot/imported/Switch_Dpad_Down.png-fda4a0d96c9c1d604adf4addc863361f.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/guide/ui/renderers/controllers/switch/icons/Switch_Dpad_Down.png" +dest_files=["res://.godot/imported/Switch_Dpad_Down.png-fda4a0d96c9c1d604adf4addc863361f.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/addons/guide/ui/renderers/controllers/switch/icons/Switch_Dpad_Left.png b/addons/guide/ui/renderers/controllers/switch/icons/Switch_Dpad_Left.png new file mode 100644 index 0000000000000000000000000000000000000000..8efd7a403545b86e491ef32ebef806f36d2dc5b2 GIT binary patch literal 2408 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 ag8UEvgmg}>CL)CZ0000 z%}*2E9>>3D`T{Ku_C*7<5X*ulU?L4^Ua&L?f=e8xvjW6E{9Pch8d$*ZM5o zC@$O)>D9!b(FD2x0~olbG&N#dI?$HB%()9Fm$uVV+A}>fIG+u}nVIwZb-r_6=A7Tm z0SpWb3=9nFgYb5s8cwJ4cuPym5X(Hbx3_0wvDgO7JXxYSK{`7-FAIV&P6)XUz@d_v zIHhz_mgVP>NaQ~%*{BOm3F7s7{{nEY$!7mvTU)!|WSbQ+@phnq$K!cM2>CY$)5D@D z`Xotu&B1mVnh?a}@mwQ>JmF=Z5HfV^*s=KL=H^FUKJ59z+W`RZcswhF5TDXMK@eav zvAJ*Z`8;GU`VrP**7?1v8@{#%O!2ZjN4c6MGinM{uXjMV!p z4~xU$fYoXR0JOBUFdN1F@#6=!x3>WRnM?-pc)aYG(hI)-uTomAe*pvtA&=j`e_u70 zxN4Q<@pzt@Or`*uD8^BR5HcbNLSSTM0VvvTl>K>GEEcr4w=>K8kc^LvjNDS%q1dQXO7AJ%L4qK_ZnvvCyj_~N zD2mMT7DW+~Bmn^W`}=YK{(XG=_D%8F{lCAkt&~=6|M&0TF*P-XSS+Sw;vRs1%IuaV zbai!|5(HtjG~H^o!r^Fc9GNJJa5~w>KgVJ*NRos*ckbZw<;zU-uEf))Pcb()x7WxQ z5Cp;Z_U+rE-d9j`y}$z(t&-TU8ex1*=02g}RL2cBD3 zW6;*t2B*_mcdRXM&YnFBtJR8=Cr_$oBauibKIa@nU01ZNtxdOLoH%i!DS;66mT-Mu z)do0q>J)Dms`A?jqV+H#)dew|%{X)BjM`>uroX?xuJax|cz{GA!PuK}R1?H(Hlwev z4_B^SK~GPQT4tKYt5>fuIy#Dpi3wGOQALpM?rvPVbP0aHztX#W+-M}+RFWi2OibX~ zwQG3!@+CvB{tr_@TrL+bUc89G!NI1yC&-JnwKY6^_z+jGUd6|cY+r3>B8bgq!|?Dh zE?l^P8#fRNg_z{YL=d;z&2!|GI|~a7`1I)$lf0M=+lE3R zL?RLN_V!kcxjl-AqKNVFaooCfi`fmyY#cq8%VBA0387F3eSLjLqGwf&v9U4Sy?Ynk z-Q7&{Wj?WyN~I7C2C=%jih+RvCa*NJWPX0Wp`O;cbLa5r(WAPbXAVNOnWjV{fti^Z zxLhs_4i2hirfGP+UOaj71n1A6SJjT{!Pe1e6w}kwYMZHN=UPQ!*4g1_4DUX z-Y!(-w-aQ3exA1rRjEr5rEg8?h4uCIrj(LgE?3uiWo?Kc2nR+o#N%;nZEZ1~q!I)H zR;v|+5VW?osyc=H`SWLtj*b>ZF|wY@t?{NUyVf-|>e*}-vMd(~kj-XmcCJ=Zsnp)K z8WAT2-n@B()2C0XlD87cWD<*ui#6TAWk;k^sesafo12@Bdv*vUNm9k;=H@15XJ?z* zmb`fJLNR?eOt*-#5)zBWHf%QA*_n46nZ3SFI?nwl#6!gi%!`W(RZ(!@+A zqk4nh+S*z)E+k13v#P5QwFvA85)1~hxVTt!jEd3krFNbx`KVZ_g~Q?3lv2eL)Fz!y z7qw3;Z-D)IWwY5bF`CHp>FH_3ub)HrUjS4&u1Om4!?X24D?~3vm zz~Ljl3`&VpN*`Af1E`_f8xDv6bUK}X+wJ!2l+uw(U!ZP)A*iLpyJ1&4xmuQJxO` zc4Jvu#}Gtg7=maFLlBK&2%<4``Ms>+;o$>=Cw~3T}~-pEs|DZUsrDQdn78DNA2jSt*)%)El}L1lVaO z_7Bx_9#Ut5t_8{Eaz&+NWo4!AXb-KRYe4{DX=w?`WD?0_5=%=zY*E~d_l+LD7sq5)-7%i^Lf=oi9{k*S1B+sFfcGM&>Q~)%q#wXn*ey( P00000NkvXXu0mjfbmokO literal 0 HcmV?d00001 diff --git a/addons/guide/ui/renderers/controllers/switch/icons/Switch_Dpad_Right.png.import b/addons/guide/ui/renderers/controllers/switch/icons/Switch_Dpad_Right.png.import new file mode 100644 index 0000000..41f76e4 --- /dev/null +++ b/addons/guide/ui/renderers/controllers/switch/icons/Switch_Dpad_Right.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dubah62ttpnc0" +path="res://.godot/imported/Switch_Dpad_Right.png-74599bcfe029ca89e967999e956aa664.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/guide/ui/renderers/controllers/switch/icons/Switch_Dpad_Right.png" +dest_files=["res://.godot/imported/Switch_Dpad_Right.png-74599bcfe029ca89e967999e956aa664.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/addons/guide/ui/renderers/controllers/switch/icons/Switch_Dpad_Up.png b/addons/guide/ui/renderers/controllers/switch/icons/Switch_Dpad_Up.png new file mode 100644 index 0000000000000000000000000000000000000000..700a8ba7577f641049d71c37275e3b9e104cc1cf GIT binary patch literal 2418 zcmV-&361uNP) zO-LKv8pr=XB0G1jFfcY!UQU`T}V^x{uT<|zI}HWH@A0pm%f{VtGD2$ch$Hp zl-qY#uwX83tXNPN!fh6b)T9B;hlwUJlbLfDHIhswnvZiblXiX}IA>&5c&GIKEiU~Fs*%gf8~dc9EFrIa%5Vz-0tf+&jOQ4|H$ ze@jbC-0dzcEkSKpmgN9D#5W%)WyQIwAJWsUBFD2f8Lhg1t>v9K$m z#bUV@MC(E@Jp{LV2v1B8(SU^*pFe*F0NlTSzw5SHqq`uoEZ^8#Nt4q)2a#&wqzx8}An?~pc>n=z;9&&tqtmz#U*4EZ=e0+Rs zKBk9g(2jT9Bt|R87%_(QNrGqLCmR>T67oWw#h|an3IbQFg>Ie zLkRLK+HQpIg0PreY=@o?>XVa`GlUR7AtV5R$zp&jA^dt(goa)J)YQ}_!}9D=N<);= zz3<<@A2oBrt%6KUOgs`raRor2!@|{}_Z6vOe;90kXMhm$k`My7+Z~c+c_ooZ+_;wb z#(|;B<$5cMVu*1ee^mmaD27}v*V~&8YAA@y<$6m9dBMC`zc_@D7dMHbDTv$c{!K42 z?%cTppU-!_ZM9mN0D>UEZnraC38F@p zWxRRw2G5>7!}$0(Y&ILSylplca=9E%PEPRt{d=69ond&G*CQxExm-p*pVu7kP)c6{ zsGF9qtM$pr$r(WqqUv<3)ylQ-S}ZIqU~zE~_wL<;$K&ZJuV^%iFJHc3YikR;ySr=( z*d&=u2BlJ|E?rR+kGl6&C&*Q=DpYe2A#ggKZLb_`hvDI23=R%nZ;y?QVPRnbI>OP>5l&7{u)Dj9)6>)I{n>05nM{WJZ>XRs3X;iWU9V1- z<$$`^)l}PKu~_QFAcQb&->Yp63=GueeR_I|j~_oWu`xI}i2nY5c&Hzq=OifL}>-E+>3DxWL_4VQI-Mg5YnnE}nZfdDft1uO0baWJRb8{FP z8e*BP;jr87@cDf3csw{fJVYv$VwN`(L2Nb~d_Eu7e!USH8XCgGhYyiVCb7T2k3yl) zah^LNfPrQ&n$+N%jN4p=kyZ&C?@0ISssLJ0c%`?=g6uBKEfp;#<}Qi@Wk#C#=uGZ(E^ zT{jifB}sy!C^Z5!bAPy1s{8Z<0|OWt8DVY%0MhBS<^!X=P!y%<`l`Fc3xz^R>%jB# z^Ug}uBDq|Si_P=%^R9|fv8jbtUDtU?I-NeV*=!#OAy2E*i^U=oMd3E3P6(-+a!I99 z=BuV17@H?N+Yc^k$(huo$y6z3zjecnmKi(`|L#b5a9?<*x`f8f0 zTrS6~=~8<}qXleTBB+(98I|Ml_+OM#%@cSdNm5OF%d*0%^O7V z-K2Ot{<~hHbn6K!J-8C%_eT3~?6+QtvVtEkuQ%z845f7CCNY2}y1nsu{Ev~5k=J&+ z{VAn1KnU@$D&ZA=@cRlvt7HIZzG1mtD5X(CNGPArYX)&OO?6+=>GWATonD8=^7&42 zyWN{G&J$XDu~_V}o&_-HvJ8ePh`}%gF&L&G2E!D@VCep8jdpnO;K8knCz8n|wzs#t zR3ditq=$U{`jyEsMx-YNNu^RqBoYnxClU$nt3!CvlY#)i;o)Ih`;1P{3Q{N(5Q#+U z(j$=w^VNjiq-O;Ie#D9Dsd`D0dNy`c=xIU9<#LUe@O-kVTlBOb01ys`ki zhxIN_$MoblM9t42M1`M15FXF^=|#^sSw9=5AO^$mP1fb*CGz=v$IDg~MZx9eC8JXD zLw7+ar5W|x>(rkfs(#lMD~#}YBQ11qvM8k?by~4lbr2Hi1)hX8=f<@%3$#eKK9ZFy%m(LIJ#C=?1WD5YHwszwq6 z0N6Ir9Z)P5FLSxvzXt{eKnU>z=;vwgYKiB|cs%|GPdlw*m?lfj#KgoSUU`e6n2E(= k`@HfuF)=YQG0}tn1NSQWFE(xm*Z=?k07*qoM6N<$f&ny(4*&oF literal 0 HcmV?d00001 diff --git a/addons/guide/ui/renderers/controllers/switch/icons/Switch_Dpad_Up.png.import b/addons/guide/ui/renderers/controllers/switch/icons/Switch_Dpad_Up.png.import new file mode 100644 index 0000000..5609977 --- /dev/null +++ b/addons/guide/ui/renderers/controllers/switch/icons/Switch_Dpad_Up.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://u6uclokrrbaq" +path="res://.godot/imported/Switch_Dpad_Up.png-38cc365cd950cad00eb7342f63b614a5.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/guide/ui/renderers/controllers/switch/icons/Switch_Dpad_Up.png" +dest_files=["res://.godot/imported/Switch_Dpad_Up.png-38cc365cd950cad00eb7342f63b614a5.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/addons/guide/ui/renderers/controllers/switch/icons/Switch_Home.png b/addons/guide/ui/renderers/controllers/switch/icons/Switch_Home.png new file mode 100644 index 0000000000000000000000000000000000000000..9b6733c0b8908e6e84bd4a32d82331af019e0a16 GIT binary patch literal 4631 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 literal 0 HcmV?d00001 diff --git a/addons/guide/ui/renderers/controllers/switch/icons/Switch_LB.png.import b/addons/guide/ui/renderers/controllers/switch/icons/Switch_LB.png.import new file mode 100644 index 0000000..f004694 --- /dev/null +++ b/addons/guide/ui/renderers/controllers/switch/icons/Switch_LB.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cb6gvej03avm3" +path="res://.godot/imported/Switch_LB.png-fc77289764fd409ac6c0408486b0c16b.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/guide/ui/renderers/controllers/switch/icons/Switch_LB.png" +dest_files=["res://.godot/imported/Switch_LB.png-fc77289764fd409ac6c0408486b0c16b.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/addons/guide/ui/renderers/controllers/switch/icons/Switch_LT.png b/addons/guide/ui/renderers/controllers/switch/icons/Switch_LT.png new file mode 100644 index 0000000000000000000000000000000000000000..6942e1f9b1f22dd09130ed8d939de93c56a3f63e GIT binary patch literal 2808 zcmZ8jdpr}|8y~rhTt;}wrO{|HDuhrjxlWi>b4kf8DG@JX^}65hm*m=V3)yTgW9BlK zu%#uj@S@43uok7;D!1SI{rR5HbI$pk&*yxe=Q+>wJ>Ta^N4VHaiXRjQ005GX4mL>s zj`=fzBK$RE>A?j6K)lb<#_B@U!*$#!a>@H3WA8{@_}a?c%`?^Pt^iysp{OW+6pnKho6_oYP$L{yDtAoEuCKiqa4~Mb7&SH;KQ0%<}Cv-a7<* zB;R6;@$1=ve#U>tDi&1269!o772i7~o*WVz`?i$V{z6%waKN#k?d;JV!G!~Hu1R?( zm#;%>Qvn%ebq`1+(ykdH@Djva9#S#3mk&Z#7RLCB9hZdP$VYm~3RQ)NhHkQVbiB>Y zW&T_czdD@*^hdy%0C-YfLEVj7CX>0>Imy#lECY{V^z|~9+^Mi6rNW7`)(+`NFFcB{ z_v80Jq z(v*rKB;V=I=1Xd-XnpbPiD7K;#%K$;(|dyk23{lcii?W!Mlg8}5Rg=A=kJfyR6=GZ+B@`$B8JWB#(mNv@0iU!-2nkw5_ktbwu$t za4b^i+8>*zB5p@zSqx)qr>$H~CB3*tiV_+sQinmn%DHvxix)Ti1{aS%T|8b?Tr2>{ zsFoOR;mpe>5tXoFo!5z9{#IwNh`n$bSzke9g?wrkYrKecN#lA#>l3FMTDCQFA@OVIYiO1Te zeTQ24X1yiwDB!1-BQg`|Rb5yFkYk73&hblwIPM7`qGlD6ft5dDcdXa>=T ze6h!&NmT4*?`3XjH@L~Ck4|uJvYXx5*m%Wx5uJto=KeU!NEEp-?CUVG_*L zzu8_E7%iG;1-b9Y7XXFD6^bi>IKHVik%bg9X_0@M_e*_1!635fSEHjeZ3{$gDK)|Q7f~uij9}?fULTf2aN6SYw%0~sG zwkN`w`PXLJUq~vtHkFTRc@Y&bo@!e#b&PYtV+$W|@9i+Jz8oPLA@vheRl`j=pnWS+cb1u zKGTbAs6;k^6*AQyz}0as(!@ktQ=A%BHFLNUnn5Tc_w;1(p?rZbng3$|5T>0Yq@I-J znZ}9>US)RDXv6F4>z|8D;k9|A{`v4)P%gtccW!ppny;dZ0x5O5 zQtp$f5R7^iBA{_J+b6JQynkdwjJF!m;onw?U2p)Q5FKc~@?0k(wbAibP*AofI#$6zuHC9IaG7qwOc)c>9lw#2B+5s2$76%~j7> zLR8+Esv&oEW$-}@&CvJ$(cbzkQ1+D*YFCt*(A+o}yd7fDt&jFUZQd8NOiwQ_SAKo7 zy@8a|KI5yG;Gq<2F8^+Kcm4w>Xz)4Z5gj~*E_E?ivo}|(fTs24W?JP>2BhE=m%O%1 z7#lZ=VOvp|bnyCv_ zA=ZXH88b6VOj9pB-i3J6SEK{n_;d3fC5K;w_!QJ~hi~S-S;Td%XHKm-`~p>B5u4L~ z9?rz$XT?`cy%QvsQi+$fl0YzBT^f}81V!*Czut2B3*DY$ciKFigDQa z%0dOgDMgaN7OEw}l{zGTrF}K*|bQtGi5#8)M72tbM;r?d`QAq72wki|vYl z3a}qD?>yYm+)V45n<*KzZvi$2aYPi}*)6O39hXxLUE^&b|j?!9dMyp(V6)7WLuq$pSM#>cS3P|Q_L+(@xQ z4)78Eqv*U~$denh^VOI3WtN&V5PZsZW{D@|J*~8Z5BL`AZc`@r5Ue)++HcJ)j*8wF zR#;TYOroZzLqXf1_E!u91oY?%o%nAL$v>|~GWG;grFijKjbTpwjuzl(>taK)zMAkq D3j=lN literal 0 HcmV?d00001 diff --git a/addons/guide/ui/renderers/controllers/switch/icons/Switch_LT.png.import b/addons/guide/ui/renderers/controllers/switch/icons/Switch_LT.png.import new file mode 100644 index 0000000..3badb9f --- /dev/null +++ b/addons/guide/ui/renderers/controllers/switch/icons/Switch_LT.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://savy2mhybmun" +path="res://.godot/imported/Switch_LT.png-b154a02af7bcd266253a208d8d610852.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/guide/ui/renderers/controllers/switch/icons/Switch_LT.png" +dest_files=["res://.godot/imported/Switch_LT.png-b154a02af7bcd266253a208d8d610852.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/addons/guide/ui/renderers/controllers/switch/icons/Switch_Left.png b/addons/guide/ui/renderers/controllers/switch/icons/Switch_Left.png new file mode 100644 index 0000000000000000000000000000000000000000..fd58439ef6489094a2031991d1ac307bba61c58f GIT binary patch literal 3586 zcmY*ccQ_kd7muPsRb!W0@x~6SFKVP(DJu3>8hl2~MpbK95kX3=h+UhgS)ul-JG=;>AcFpgx#1eLpkJx7ksNk3*TM>ka+@Tr_c;qUxQOg}8~FiQDK15b?5|vd=wgEO5x(IN5GCNb95;DVCjAeK_!NTc;6w5j`^y0E6U z_NfAR<;qu#B7%o=;8r`*Kq>oPyLvf092nRx!Vz~4g21eW6%!h#_ONL;1(Ni0h$lsF zPYFTHUS3{NMZOkE7kM#dWq0vf(YT%B}|GG?U*Y zC!b9&K`P1Q<=NQA)o*+V60NR=+fG#+jL=jV7rsx8M^i7Sj*zGv7(i^_t#ZIV6VkJJ z(F=~lal(O&lcc1ixOIf&_KsNIHD}n756V=s;j&<>lby>Mt-@?SgyT!!B#qEvWdtB4)T}VxX%XRxS zJN6oPKB(fI^j1CNTnz6qvE(C=QKOA_6VgyZ2jQaPQNJF}IXNai?M*#BjX3U6uBDyo zoR8J@C_~6~`!_pAA)0Ph@kmORSye%ul+Db{EMCo&$c|4QnM-HnO277v74*HISXxUk z0(iGlzdzRM|HGym{j|48Q?82J>eWmy0oC5V69~7cnZn{rs^trBM6}pY0!7#g*ZP9y zlYdtF2=nRd>J$l1lb{!lj*c48`KM6}M;|v1LjA^*UOy*Pfda$Bf7;;7ue{yrv9A+q zcD$Hu5Uar7vpo?!2|IYi3xa!Q0X`-KhJ++IzZ&^nM@)6^IkY<2WbiJO9jg>Yc`!atn(*YDZ!T@DhNnZM%FUl$-{6 zw&kajO^$TUTQ#trF~GhkD2UVthBbevc_J3?8n7|rtM;O>&|qA2B*rH%*O>JZ!K$tP z0s=2d@hY*%K`S||1Zp1lOepOM#=Gt(3@k;>Y)u$o`I3gBc;TKK@ujk|nMTM6n>xDz zN~QT<-^xB3w&DDFGsaj5lQ`C5hKr<7FfrxJ((GUt*~GnMnuebb*e~C<^87&3NuwKS zv>-Le=}y^49N|*JfQIx=UEf0y&V&KOu(FTQ^&9Dd2)qSU;PY}~{l+WFOm{a$_J2Wc zYun3ul>$ypNokX>fRc|_GR!4i3TYYaw7zRTu(!3?&-7Y0w}5(>g|8$5QQ`mFvceSvO!L%PY4@^V_I0~-G}EVp@SQ#pSSVuz>MA2z;oxw`5V19=1W6Cp`=+BT9WyJt-;4QbACVf;G6~ zKe1m`2S2Q=VT7vm6g2v5Qrb-{g{D`It$esktXrQQ>fhrn(QKGTrb}gSt%SnfBejq- z`ZZHV1=uhPBNee!LG|8mfw_K9I8Eij5JU$Hh^#7p4-N!p)1#7z3SwXfu<^6SnBR&p zcBVGUH0q1Gn=vq&m3>JRy51p{TkrOBQo3Iqf=L+jz(@c+6Q7sLeh9kZcFt`i-YT5C zH5p<(-ESObEzqfpT-9jc3f3Ql!SC4v#lV}h5Oxwy4Mj@Aj|#;|K@`_#4?n%;+;`xcz|IIK`_8#Ll5pJHZ784qvz!&~ z+muA(QOua#iu+Ip9pZHRFc$}6tkr(?A!jmaS!yP)adJ4})?iD6HJnRNk5phG#biSH zRs8-=OH6^$=+U*rRw2v5XJ)>2ULAgMyzg$IB1e zMaWgO(xd3p+|w5yIRL3zvutk5pnjqJr{#D6;t+gYL6{MmE)+`PAr;b6^jUrt*UNC= z1l^4rE{7gQyQATHN;hf=9=e7&H19wmOJaYGru(CTnvvW0;TQ>T#-$QZ+_lFv_svDA zlJSwPI8gBYS<=1uS*(d*#b=~!A{I4}z}jP!D`D(5o1-^DZ^L3AO4AK_B63Ev)J%8O zm?yerp05|OO=!c6J#;xEKvEnWs1dAaldYjI5{Upt8+Nrq5XJ-PO>oD-9m!yQm95Pj z5S)h_Z>X$hN)M{C>F7rmbD3xCMT%EfD~Ws^ZG6kWhAy^{T^!4hv9RUOLM<^mq#`M7 z@m;8rVQ4E=zgK+915Hh-6~A=pQk3E3%;0K>9g99m3?|3T8tZ?dWDvr1<#ahrj3I47 zpGn08XPGUU7PjlfA8p{d`Z^z&SlPV4GC?kpN1OM9&MnI8QJb0d$8Db6>c_kQj6|E+ zoTnRnZtGB#3{$q?30(-AJ}2U7IU6FI$dm3(ZrnLO9<7@Yie1&p6`j^n@u(Q2!(7|? ze*cd2C?go0)j+}IKuE_lW3V9=<&eJc{q&67JmVI83=0X7`Sh}XGY}fO9*`l) z&rI1bOl9SzSATjM@4EQ8$*Z5mGlk|Mz`^+N_fBA~TNe2|RePm2QHF9gNclVAM4vMo z`AmP6)m&Ngi z3C>Jb-z^Uw)^akJ2lN2R7>Q^!wO=jHD$&370>fDAJ!{-^WBn^*4`D8=MVTm}JmS08 zn$D%y7Q1a;J1TxzSh%oo#WS5|GW5=_CUexenX`&I7*;hzTiLX=+A4?b)hWOZ!f zMgbpQqfd`~)?y|$KjE?m1Vf`f3?P2;$3V$1r+j6z$)q3urUHLY(vD4YiDN--qmnU! zIFr;}y>f`@urm1?=RmaUri z%L%>7@}JH9$2xBj`G~JDeRJ;TMu(C?S^6lJauoR|O!yhz-c{lHCL`0$aJ{^6?qvg0 zx$EAF1$k^TH7Oy$h}S7XPp-R!;2f+~P=^Gy9Ne2DTF)u~l~}F$P%Rl|RDLx*Z}tGE zkX*|qbGgXO>3C(O;9ztigBRR&C2~>N;_cVan4NJLwI$mLaDK6S0Z_5;D=29C)I!iW zp7^tk;+T^UiSg-OXFMNtEx+XE&{PdY;h=u9A*-I*XgvtTGSdl>9CQZplrl0}`pGXw zVpQn$dDYL_Z)iP|OS7fE1%K?8jOr)M#Z2GE!pl0z-ODh7kWG{FA)y?*cY>({^? z?r?`Y+~E#)_$WYb`UU1iv)O!T7{(R=oSvTk{f1v>Zrln&TCG+?*Yziiu`NQ#7JwZ> zNE5)5tlu%l4gmB491=qMjIl#X=~2Jme|zOGJtLNqkoEQTUlBs~7-PHRj$b4W0USnA zbPz?+ey`UXEV%u-ur!1;o6X0DVeAn?b^&Z%*K-+T`;4*uWg+KA328Q)4@;%eE`Vp4 zg9O7c005NId0*)zW9;Qk&P6vu$ol&FuK+w7OM?=0T?ZiqrBVr+ra{v*=(-L~(@?Ee z0RR^l7nA$LFhmqZ2*VJJF$6(?D2fn8QSP(GbI-E4GOTCv60$tZpDwSYa*5nz$r9?^Y z-_kT~&$jIq*LAN&TCQ9|#_DN5%~~=|6Dun#la48hR;z`3_wE4ze*E!A^m@IS+6jUH zuIoyP8RIAjg57?<|F4-Ipol9aWPN@84}_5CvhPZz5^URst``?l%d%kGHY%0M)F@|+ zfe-@6aR6LS@~-Q`ah$AMF0j7FoxGq}~22G8?w zc6Ns2<72q4n|dFmG)uY;$0}^06aGR8X*QdW$7F1Y-|-QihIYG+&CN}$tgI+KD~civ z27`oZA%vjOXyjUE9D~6CCnqO3IXOwa$8j9^zAyV~;iN2-kaoNM9RxB6A*fU;FilhX zn^voZ?d|Qtle+Kwlet1f9{DnOo`<8Oqg10{G#bHioWuZNjP=7X+**|ST8P=(Y&IX) zYPG)s_(lA>rfI0vYSQ__vMg+GZ{xv(2g;*44%c;4ojk@^VL}YU!20?+07&N;ZZ3-| zk`S_@Y1&iMH1|Evo12um32C)j4cVN*J!sj;uh;AN^2;wLlXg*rVVFAM0+;H{G|ica zZZsNLU0ucb`FX-|)HDsIX(9*$QBsj z{q)nBI*VgC94eWyX=+mCclYn#hwuA|NuN8g5=q&rR4QAp>;847hmJ89A?@zWCycnN(C5h6sWHK@fmani(3Afd?cF z!$7H2nu#FCaq#NZtAtcWQH1mJ^ThQa2%gO9(a%K4*t|WAU(6<`X@rj z)Vxuv)e@?pC>c={;o{-~!{P8sh!DZoNPORiVHiqAMj9!arhyPLWt9;^eo?7Z`mXE# zv&efDB4oVQ{a^8G<#Jgn{-1sJ8CtEDQoCF#7OkFCz!;m1?!5RK@Y6ggdiI84fKoc; z8!^UyX`1H$7V%FC5n|i+)OrSY{6uVSZcY}B^5Faa)Joq?fl`Vv43$h}9^Mfh$VI3w zWoKY*ZSA*W^j4;h>h(GvJb0kgW>)y)CNLU}(qdK#Jb3T`^?H5knx<)qJ|Tqcj@N{g zpiGFSY0u-I`SNNUx~}8Vqen{Z4Tr;}B7?(m93?*oxO8&GxzjXFnW6Ap_4!JKtgWs6 z7DCXlTrMZ>+uq(*iq`VUds#6Y4wcmC%F2pV8;E^F2-#7U5+y=3O?wvqY?@|bWYp_* ztgf!+wly3M6JdvC#Aq~98Z;Xl8?bGA>KgZT1Uy%HZZ08XW~X9RGU?dd+{}Gg)+*dG zLUr(LZEYp4iIyiJWT)9|KFn(?mk>h8Ui@>KbjZB)IKnW@T%B81IF6H>%hhN!5)(WR z*Ti8M#+0U!A(s%w*i({QfeF&d2)CLPNFo~WG#F`&w`^o46XX}?b;L`;g7t+a`z zo`}5c^4o~K|4BAT#lcJnN!^NK5WK`)NL5)<6Di9I;7B7R z48ua}3bzq_ABilC1mq9aEJ!6p*YzjD=iG;mMkAb`pJOl>U^pCpRMwRU?(7Z*gGoY0 z95O=0K1>V8E2Uh>wv}0yH6;xnGXYuPIb%F|E-l3sMqVc8-rv}CZt?0qtR%fTCL8Np80bC--vqe-aTAgTwpL5D3hbQVhG!|XWkR| zbA_(!s8*|}R;$X%WGP-JA$eq|%pbVyTPadi7Gvxv{#mv#ljnWT6ZKqHQT&>yetNxL zu0`=NNl9L2KczHLnnR+pGt1QGnL-Bu_V|Y&2ofUO?RGPhMbW;dX?q!s`qouNbIvH ziuSYG$W-v1PUo+26D^9Ogo<)qH#dQ7*199h0z!y%3q~Bg23H)CO`!cwr;}NFLuEU{ z6r-}v7t<#b4~dm>y^W|;D!Btn)(2u=iG3+UE+L|b1woKV?>RX+$(0hrFmgxPG9qO+ z)D%3=OQw zs~^Pi=FOY@2afl0FY_eN3nHit9NGWu`+lMrO{ddQDsEP!SEfoa$%=@%u8Z%!`!2U3 zUQ=rsB}LbDrHZHk@b2BaggKv5?e2wmAq~oegkkssg6A&tEk1nspyVs?QMgQDdc!bK ztJRdG*Kr)_+#%_cqjBFUL3xOJp68d#+4FRjaPe{rDEK?AcUY+t0~tDrj+8>2&^Bj7>_j#!-|MUY(7rv8y14he3F;W!0Qp;L@U!#j700NraRb zV^4d%UZLV;z>HN%hr{9PN~N-e*ggl|dE#D(qND)R#OS(?D2nD%WjtSspG{IKl?o9- zDaAM6e1lG>llX2p9LijPm#3$v|1s0M&hjJRau11N7zdElL6L<>Y}>~6_V&!hlYyVY zHmZ^1a=9!maZv<(&X7HmCszwNq?GQ=T6%o0+VA6IDUQS~T83drz1&$Vl!}m5ofe^T zN>kMa8TYbo(*WKc?X<~=E4Zdcj!ydTQt^1lK6I!+3&`YAJs&(6-^I8I>; zXY$gzo*7-1mD*E<=XrSj`Za#|;fKU`Q53;(9O+;fPvUc*Q?;<;D#i!796)khMV3dt zxw(mrjg7*@$VMqgUS?q$-o1N=p`i$2ihpm#-7W{N$?b*d6Mbc z?e?VLOSjw2Jlrb_oQSL(GRD}8)6>)6&-}6qxbhVu*LD9n_Eql3qr|{ZrZGR3f-yEJ zY_E#ZXfz?@{rmTYv+d)DPiACc9x}$Bo}QlmccI2-z_lJuytcOX8%@(*Am^y=QmHig zQ?ZtK_Pc6!`)D+pZ1~S2aJ(hsIi>XFb)B_-?Zv!z0*in# zwoeE-xK4=>aifHAjD449jImu6saY_N7-RdC(wA3#60{1If{-}I^UN+TcW-T7#WNUV z2e=HAF9iv4EFB?nG@H%GhGFdD(!p#3`DIq)7|#WKgXJM(>>v!o!>jTk7J;QEBn@Mt tGF2O;w7+bl{| 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 literal 0 HcmV?d00001 diff --git a/addons/guide/ui/renderers/controllers/switch/icons/Switch_Left_Stick_Click.png.import b/addons/guide/ui/renderers/controllers/switch/icons/Switch_Left_Stick_Click.png.import new file mode 100644 index 0000000..fc56eb6 --- /dev/null +++ b/addons/guide/ui/renderers/controllers/switch/icons/Switch_Left_Stick_Click.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://by1vmleujtq1i" +path="res://.godot/imported/Switch_Left_Stick_Click.png-7992de9526c87e19b6a04a21954e96af.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/guide/ui/renderers/controllers/switch/icons/Switch_Left_Stick_Click.png" +dest_files=["res://.godot/imported/Switch_Left_Stick_Click.png-7992de9526c87e19b6a04a21954e96af.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/addons/guide/ui/renderers/controllers/switch/icons/Switch_Minus.png b/addons/guide/ui/renderers/controllers/switch/icons/Switch_Minus.png new file mode 100644 index 0000000000000000000000000000000000000000..d32608e165c263de3d42c0ca69d627a528c61c17 GIT binary patch literal 356 zcmeAS@N?(olHy`uVBq!ia0vp^DImaSW-L^Y+%p+(Ql`4G(u) z2$eKm$~(lNDWRdf!O@6mb;{%=Ul=Yt;yAh1nCa8gMK%w9|N5TubNbym!AwA75a7Z6 zr;`?bt@^tqMlZhj-0nG_m%Y=C-K)6ti>2@7e-$=$XJqxbE|uPmKKFBP%C|nA#};{h z%P)VQv#@=V_R~4#s>S7LTO)Mhp7DvYdTOradcI?U2}k{tjn@{vEsM^+8v5$D-Q4rf zsb(bvqLcfJ@2R$xeo4=;OtC=VC{UbM1U*q4FQ`v5+ z2I}3E=WAcT)7jPj)Y2(Ix3`_YY?ABsJU{ZXiL)mU!fQa*gSx*AcR~y|x+X3w21$6j L`njxgN@xNAN;Z(U literal 0 HcmV?d00001 diff --git a/addons/guide/ui/renderers/controllers/switch/icons/Switch_Minus.png.import b/addons/guide/ui/renderers/controllers/switch/icons/Switch_Minus.png.import new file mode 100644 index 0000000..9a4233c --- /dev/null +++ b/addons/guide/ui/renderers/controllers/switch/icons/Switch_Minus.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bdydqv6vi48ix" +path="res://.godot/imported/Switch_Minus.png-b6cd3147393308196e49ab3a608d1c8a.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/guide/ui/renderers/controllers/switch/icons/Switch_Minus.png" +dest_files=["res://.godot/imported/Switch_Minus.png-b6cd3147393308196e49ab3a608d1c8a.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/addons/guide/ui/renderers/controllers/switch/icons/Switch_Plus.png b/addons/guide/ui/renderers/controllers/switch/icons/Switch_Plus.png new file mode 100644 index 0000000000000000000000000000000000000000..f1b0dc48740bd29c729e36b04ec0b4cc176ca570 GIT binary patch literal 764 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 literal 0 HcmV?d00001 diff --git a/addons/guide/ui/renderers/controllers/switch/icons/Switch_RB.png.import b/addons/guide/ui/renderers/controllers/switch/icons/Switch_RB.png.import new file mode 100644 index 0000000..1c7a578 --- /dev/null +++ b/addons/guide/ui/renderers/controllers/switch/icons/Switch_RB.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://s2xm61tj0mfy" +path="res://.godot/imported/Switch_RB.png-3d9fbc66dcc67aee9a5716cef6ece679.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/guide/ui/renderers/controllers/switch/icons/Switch_RB.png" +dest_files=["res://.godot/imported/Switch_RB.png-3d9fbc66dcc67aee9a5716cef6ece679.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/addons/guide/ui/renderers/controllers/switch/icons/Switch_RT.png b/addons/guide/ui/renderers/controllers/switch/icons/Switch_RT.png new file mode 100644 index 0000000000000000000000000000000000000000..6aef3cb37574ecc2440454fc3881018c353ad933 GIT binary patch literal 3066 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 IM6N<$f|`2id;kCd literal 0 HcmV?d00001 diff --git a/addons/guide/ui/renderers/controllers/switch/icons/Switch_RT.png.import b/addons/guide/ui/renderers/controllers/switch/icons/Switch_RT.png.import new file mode 100644 index 0000000..2109b91 --- /dev/null +++ b/addons/guide/ui/renderers/controllers/switch/icons/Switch_RT.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cccvjq78xw3n4" +path="res://.godot/imported/Switch_RT.png-521dbc557ae52cbe19429b25fbf68d18.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/guide/ui/renderers/controllers/switch/icons/Switch_RT.png" +dest_files=["res://.godot/imported/Switch_RT.png-521dbc557ae52cbe19429b25fbf68d18.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/addons/guide/ui/renderers/controllers/switch/icons/Switch_Right.png b/addons/guide/ui/renderers/controllers/switch/icons/Switch_Right.png new file mode 100644 index 0000000000000000000000000000000000000000..f524c6c9cc970afcfc15259e3c141bf766bc1162 GIT binary patch literal 3495 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 VAzf^Fh^YVo002ovPDHLkV1fWRpz8nt literal 0 HcmV?d00001 diff --git a/addons/guide/ui/renderers/controllers/switch/icons/Switch_Right.png.import b/addons/guide/ui/renderers/controllers/switch/icons/Switch_Right.png.import new file mode 100644 index 0000000..094f135 --- /dev/null +++ b/addons/guide/ui/renderers/controllers/switch/icons/Switch_Right.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b3os8st4cai36" +path="res://.godot/imported/Switch_Right.png-cd6972267e466e454282edcdee867c3a.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/guide/ui/renderers/controllers/switch/icons/Switch_Right.png" +dest_files=["res://.godot/imported/Switch_Right.png-cd6972267e466e454282edcdee867c3a.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/addons/guide/ui/renderers/controllers/switch/icons/Switch_Right_Stick.png b/addons/guide/ui/renderers/controllers/switch/icons/Switch_Right_Stick.png new file mode 100644 index 0000000000000000000000000000000000000000..f2c605b76afeec719c2515e0716ce350f99986dc GIT binary patch literal 4578 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 literal 0 HcmV?d00001 diff --git a/addons/guide/ui/renderers/controllers/switch/icons/Switch_Right_Stick.png.import b/addons/guide/ui/renderers/controllers/switch/icons/Switch_Right_Stick.png.import new file mode 100644 index 0000000..5b96fa4 --- /dev/null +++ b/addons/guide/ui/renderers/controllers/switch/icons/Switch_Right_Stick.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://d1jqxuup5llkb" +path="res://.godot/imported/Switch_Right_Stick.png-9a091e8f8aab1b8517e0e63458ce9648.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/guide/ui/renderers/controllers/switch/icons/Switch_Right_Stick.png" +dest_files=["res://.godot/imported/Switch_Right_Stick.png-9a091e8f8aab1b8517e0e63458ce9648.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/addons/guide/ui/renderers/controllers/switch/icons/Switch_Right_Stick_Click.png b/addons/guide/ui/renderers/controllers/switch/icons/Switch_Right_Stick_Click.png new file mode 100644 index 0000000000000000000000000000000000000000..eecd4e8b13fc3b85af278294295d4d053d0e812e GIT binary patch literal 3360 zcmXw63p|tSAAcP}H8t0R+)YU%Wk*EGm{<&RYm4Nd8iwUM_am3NCNU00X>^)!$bH1g zWsZfTkr*0FBO%SD()hpU|Ns1-&*%L;@B4l}&+qa)-|zQ%o(w0@Dx1jkCZP67l zbc5yfh3sSU0I`1E?=aGPnJ8dZ!b$8C7p^CfwK(4mU8Cy)0W%! zT9TZk*oebLN+Aj|y+rvZf`0KbzGkKtx>9Cv;mfPjia59J)w5VElo4@tM$*bx#?51R2cYxl06sn=ll z>K3BkPEKZYmYU`Y7|*zGLyxSdDBWT1w#xPzLK^Y<8!?@&Eyome?rPBK309J1d2{Lr zpR~6dpLk*Gnxc4xu8sI2BZW|62oZfes;iY-Mfl3QV=-@iX)Ipn-wZpg2JQ>Luuf`w z-P4c+gV|+v7=fu|+dR(jZLfVidNTz@xJ-=*jgMF5q?mt*d|!)-kTc)n{v|4xh1w&x zdG@ca8kpo}5r?Cc?D8Md^=`G@5BZ&>B4G)AIa37Tc7ZOc7W!T>Gf%yITYyV)2C1N;iLI5R7}?AC?%%7r5`SV@(*oowlmgcWLx~RqX<$G zW|yoXxm*9|f}+4n6~v97dz;a|b@K)_^O1|ngFw3wm6_Kp(SK@d>Vb1Jt!A4AN#0Yk>IfPY8j?J}NE9TR^seg*znsqqu zm>1)em(X>X)9ms6OET5gNwXmN;{U5p}o;Ph6r3HYdET+{RO9jZ_Y;Z>?~i=61o}Hs`ok zr(&Mmd%q!Gxl!qlJI3l4e=@J`A-ABU`CivULzW0hRIF^$4Q&QdZo;0YDkRDJ)>uWy|KCP_i z6R(3@fu#3X4`1N=R=2jc7Ei7?qZuiAiN#gqw@cx>XO(ki4cywGfmbYVX}jg>R;H7D z9V)SZ@yip-T02@5UI!VUQaL2#n~(5zg*){xH)GEI_#qg{sNDoV33KK^=tq-b76Naj zVib?7=9Z8xM8007E*vu-DcAZ_1tgOU%6Pb9GRS6i{!GX$m&*lWV`F8RCkhXUSyHSi zDWeE|Om;h=|V#caX~M!xa%;X;B-fV@a&sQr8L&TiN958<-thE zHLGNxdvh~lq5PZ*9%Fi|Io)9<%lmY8H&UTW|;BoY!frHE3H2e%OwRlkvLAp#InB5fbrYtgOiA%>#}v;U9&O8 z&e-544N!@y2%z>+>|!G#QoR$tExeJOBUSGs3qD9qtr&}0cDKAsFk3I7)1fGm{`JkX zZL+=tHxbC^li4bX8;hd~0ne4AkWe6c$M_@1#Z8{UU|jiQ=u41iUMLWSw-400qi!M2 z)SobtMdrG?2_NBWf`eMxbN<~51^Ak+6G`_XytIeY`vm4{76~0ecQ2;o{S0TlxZD(M zhhu2eLe~`2O#5Wa&cl=aarJ_nRwbbp6qy^?G-ZZzE~~?K!JaulK_dP^|Ni(y?{0go z?1xXE;BRgez682P3|~E^(=CQs$@tVJNid+%8NWrs*QSUYZVrJuh3I|WaqE3Z|Gx1; z=$8Ust4C&q`IYv3BinejfA{GYH~Vfwh?phNV;H7wJWnZgv=_{lJ$TR;>6}@?1(}mk zhl4B3nP6awrBE$dGze7}{@X?cBS&n@}=-xy0u2 zsd|{FUf~bFveBDzjHyKv484N(#^0@a{D7w4%Ve#ThnL|PTI-CvnB|4~%h}<+DS7u0 zL-S)|b0!82UM^2v+g(UqZJq}Cu^7p_rn#4f3LG7v=p}1=s%~bz>}m8;ub}aZ1Y5(d zS&m7PzIgrX^E#wna;v6A!m>sR?2x+Z9VVzgSLFK*AqeH1-lf1fl{h5j8U5oK!kEAQ z>@04sf>hUp*KgzyLD|fS3`_HQ$X)`WZiAir;LmS>GZZFv`)AhRtp5Isrn$FStV^C( zuYMPqBJ2y07>!UBCcN9T$RX-zS87rGaWmW*#M-d5m`EeWgl2enc#L|!sjR4hC! zD1?$7!is$P6!GbDjH4V%Of|Cr3m&V=__7%<4YRwJF^`-s7!--J8g}E-e2P<1^CpKN zJsRaB+C{8yBGR*~e`HO=)z8OKD3-_LN0-8}St*V)n`epJ*bvbL4yATk_IxdHkSJ1` zGG?|q7y9+2UH+CdKKrx-yM?Zp*0x?+N_OX_A6BngS{gbI3}~7vH}r3#LVu$A z3p*PX{-)uNffF0ltPm*>yBy8@NPD(voO5X`!?pW?G+#hAgghq&vN#LD=4w5NA)FR) z#CCepw(Ai{gft&a-nHWsM{ag{)w2}_o^#=>62?SqQX0>Mxs3Kb*f5$q9nr0N^7{!h zNYB@*kEf%LZX_$ zO>)~d7=~Yv6h(9NL)#gRG|o)C$fCRY2F($2gZc>V4YKSp+8cP=osW?0wQw_|*ptK( zB~cXr(M3WhmOxpML=ckk%xK|{Ch&nT@c|$K5Kt%-3WY+UP$(1%g+ifF6hL;7$no)U z+qUhu04~1&axMTkyU0T#TmbL$KPaU)l+yPAu5NE{|Jye4tpw@ydano}?+786+d6U} zTm$%HFc^H;G=Yr;IXgT19l+n4o`2w64hDmNHaT%4L6jIz;sSWHNloDvq}%QOrtA7O z?|IJ+O6kpfKED`^Mq{4y4Bm`%U4K_}%yAqzj)Qu=4gfehI)Y(vXCXC7l3+fcKm0wN zPB9vd9@zkZ5OQwY_Pfz&^e0dHTs7qE?Ce+k)WgUzO%tzQzlLqwJjopt{eB;=>n@sI z-}ldXYKg{~@8zOF*Y#&F1^}F&pR>%)_u;_W@CtIVXgEDRefDAifMFOoJw08rQ%Xw} z_HbcE$hh+w5Cj3*?Y0!{OXY$jNrLfsys}m#NdnLFHVS2V zXlgVXh2bepQ;bF?sqI=-q*kSxnEnM{~sWLXB!^WeHJvMk$Ko_Q^E90!d?V<|*YN->#CDh*$i1e;b;FAE`p2_96e37buS$kcwMbDzE~>{RL=aYkEu$DY zEZ;?V&Gc3 zAgqDlz6v7ZO=cw_YhML9h>*oXrm;s6Rry%`OJv0(lpvC!1d)u=1tDa4)m+sxJJx~a zBdaXCrgTAA1>09aMEI?0NCD5PhFF$WcD7r?^6?;Q2y2$PVHi@^k|O^^%$OI_%VHIz z(P)UsdLvlAiCVrOL=e+7mu&kc2&)WbP?;cxVMr-T(WLBy5=7T^W`PRUbyo_@C(|^A zO~4j5QfDoSF$_a0QHo~9i(JqnOptuxM_)OB5owd$2Wa?RuQs*M9o(|p*u zE(n5$-zqH2diXtsEMfo>2m*W)<@op*K@dDS=Xc$Uye^GKL#p>PQV5b`Sr!b#D0TCh z9JTq(niz(GR;z_D3=ssu&SwkOYBgAv^|0BqY)B_aPQ6}7yjb{^Tnuc1f zwii2X%k3S$)tG#@&m>76e(P-Um%oaYU4)<6A5S6wyZBvDeLqj}2qnl4*~Nk$E2!*Izt1}4`o6z(%~rwne$w;2akJUHAcXw#vpom` z+~40r)3k>{*mJ=5ecayO;^W7U%m$rO`q!5)U;gDulY2UMuh)B}Y1$3%dC!eaKMKa( z?fw2W%S+z#o*6D7Oac|*bF%;d002ovPDHLkV1mDufeZiu literal 0 HcmV?d00001 diff --git a/addons/guide/ui/renderers/controllers/switch/icons/Switch_Square.png.import b/addons/guide/ui/renderers/controllers/switch/icons/Switch_Square.png.import new file mode 100644 index 0000000..1da9b49 --- /dev/null +++ b/addons/guide/ui/renderers/controllers/switch/icons/Switch_Square.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cl0owijnhu5pc" +path="res://.godot/imported/Switch_Square.png-e3ed4021db85fe9e3827c68afd31c3ac.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/guide/ui/renderers/controllers/switch/icons/Switch_Square.png" +dest_files=["res://.godot/imported/Switch_Square.png-e3ed4021db85fe9e3827c68afd31c3ac.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/addons/guide/ui/renderers/controllers/switch/icons/Switch_Up.png b/addons/guide/ui/renderers/controllers/switch/icons/Switch_Up.png new file mode 100644 index 0000000000000000000000000000000000000000..352f890b17692c8504ad22270ee6f19c11968b6d GIT binary patch literal 3422 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 AQ~&?~ literal 0 HcmV?d00001 diff --git a/addons/guide/ui/renderers/controllers/switch/icons/Switch_X.png.import b/addons/guide/ui/renderers/controllers/switch/icons/Switch_X.png.import new file mode 100644 index 0000000..eeee651 --- /dev/null +++ b/addons/guide/ui/renderers/controllers/switch/icons/Switch_X.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://7c6ie8ef23ox" +path="res://.godot/imported/Switch_X.png-8ff15c2bb86e671b78d91e2041718b60.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/guide/ui/renderers/controllers/switch/icons/Switch_X.png" +dest_files=["res://.godot/imported/Switch_X.png-8ff15c2bb86e671b78d91e2041718b60.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/addons/guide/ui/renderers/controllers/switch/icons/Switch_Y.png b/addons/guide/ui/renderers/controllers/switch/icons/Switch_Y.png new file mode 100644 index 0000000000000000000000000000000000000000..46ac2160d8df6dfe7a3283935cf3daca3a8cbed8 GIT binary patch literal 3736 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 literal 0 HcmV?d00001 diff --git a/addons/guide/ui/renderers/controllers/switch/icons/Switch_Y.png.import b/addons/guide/ui/renderers/controllers/switch/icons/Switch_Y.png.import new file mode 100644 index 0000000..0ace6f9 --- /dev/null +++ b/addons/guide/ui/renderers/controllers/switch/icons/Switch_Y.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bru7lpc778npo" +path="res://.godot/imported/Switch_Y.png-f47eae5d6991151df29244754a422398.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/guide/ui/renderers/controllers/switch/icons/Switch_Y.png" +dest_files=["res://.godot/imported/Switch_Y.png-f47eae5d6991151df29244754a422398.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/addons/guide/ui/renderers/controllers/switch/switch_controller_renderer.tscn b/addons/guide/ui/renderers/controllers/switch/switch_controller_renderer.tscn new file mode 100644 index 0000000..98bc510 --- /dev/null +++ b/addons/guide/ui/renderers/controllers/switch/switch_controller_renderer.tscn @@ -0,0 +1,101 @@ +[gd_scene load_steps=21 format=3 uid="uid://dlhmh4o43l7pp"] + +[ext_resource type="PackedScene" uid="uid://bsaylcb5ixjxk" path="res://addons/guide/ui/renderers/controllers/controller_renderer.tscn" id="1_mxg2g"] +[ext_resource type="Texture2D" uid="uid://bptn4jygg3p8q" path="res://addons/guide/ui/renderers/controllers/switch/icons/Switch_B.png" id="2_hj4a5"] +[ext_resource type="Texture2D" uid="uid://cl75ptbm7sfi5" path="res://addons/guide/ui/renderers/controllers/switch/icons/Switch_A.png" id="3_0hjly"] +[ext_resource type="Texture2D" uid="uid://bru7lpc778npo" path="res://addons/guide/ui/renderers/controllers/switch/icons/Switch_Y.png" id="4_b8ldp"] +[ext_resource type="Texture2D" uid="uid://7c6ie8ef23ox" path="res://addons/guide/ui/renderers/controllers/switch/icons/Switch_X.png" id="5_qpo6l"] +[ext_resource type="Texture2D" uid="uid://cha2jimmsyrsg" path="res://addons/guide/ui/renderers/controllers/switch/icons/Switch_Left_Stick.png" id="6_o36fw"] +[ext_resource type="Texture2D" uid="uid://by1vmleujtq1i" path="res://addons/guide/ui/renderers/controllers/switch/icons/Switch_Left_Stick_Click.png" id="7_tn44v"] +[ext_resource type="Texture2D" uid="uid://d1jqxuup5llkb" path="res://addons/guide/ui/renderers/controllers/switch/icons/Switch_Right_Stick.png" id="8_gfspk"] +[ext_resource type="Texture2D" uid="uid://denpxaxemjpg3" path="res://addons/guide/ui/renderers/controllers/switch/icons/Switch_Right_Stick_Click.png" id="9_ktbic"] +[ext_resource type="Texture2D" uid="uid://cb6gvej03avm3" path="res://addons/guide/ui/renderers/controllers/switch/icons/Switch_LB.png" id="10_6uo88"] +[ext_resource type="Texture2D" uid="uid://s2xm61tj0mfy" path="res://addons/guide/ui/renderers/controllers/switch/icons/Switch_RB.png" id="11_xm8m7"] +[ext_resource type="Texture2D" uid="uid://savy2mhybmun" path="res://addons/guide/ui/renderers/controllers/switch/icons/Switch_LT.png" id="12_y225d"] +[ext_resource type="Texture2D" uid="uid://cccvjq78xw3n4" path="res://addons/guide/ui/renderers/controllers/switch/icons/Switch_RT.png" id="13_xpnov"] +[ext_resource type="Texture2D" uid="uid://dxmy0dvee663b" path="res://addons/guide/ui/renderers/controllers/switch/icons/Switch_Up.png" id="14_ujug8"] +[ext_resource type="Texture2D" uid="uid://cyjwul8mif4s2" path="res://addons/guide/ui/renderers/controllers/switch/icons/Switch_Left.png" id="15_2efb3"] +[ext_resource type="Texture2D" uid="uid://b3os8st4cai36" path="res://addons/guide/ui/renderers/controllers/switch/icons/Switch_Right.png" id="16_yqxw1"] +[ext_resource type="Texture2D" uid="uid://qt8r1byskjmu" path="res://addons/guide/ui/renderers/controllers/switch/icons/Switch_Down.png" id="17_gfqch"] +[ext_resource type="Texture2D" uid="uid://j3wpcxyxsy2r" path="res://addons/guide/ui/renderers/controllers/switch/icons/Switch_Plus.png" id="18_s5cn6"] +[ext_resource type="Texture2D" uid="uid://cl0owijnhu5pc" path="res://addons/guide/ui/renderers/controllers/switch/icons/Switch_Square.png" id="19_iegd6"] +[ext_resource type="Texture2D" uid="uid://bdydqv6vi48ix" path="res://addons/guide/ui/renderers/controllers/switch/icons/Switch_Minus.png" id="20_kalbc"] + +[node name="ControllerRenderer" instance=ExtResource("1_mxg2g")] +controller_name_matches = Array[String](["Nintendo Switch"]) +a_button = ExtResource("2_hj4a5") +b_button = ExtResource("3_0hjly") +x_button = ExtResource("4_b8ldp") +y_button = ExtResource("5_qpo6l") +left_stick = ExtResource("6_o36fw") +left_stick_click = ExtResource("7_tn44v") +right_stick = ExtResource("8_gfspk") +right_stick_click = ExtResource("9_ktbic") +left_bumper = ExtResource("10_6uo88") +right_bumper = ExtResource("11_xm8m7") +left_trigger = ExtResource("12_y225d") +right_trigger = ExtResource("13_xpnov") +dpad_up = ExtResource("14_ujug8") +dpad_left = ExtResource("15_2efb3") +dpad_right = ExtResource("16_yqxw1") +dpad_down = ExtResource("17_gfqch") +start = ExtResource("18_s5cn6") +misc1 = ExtResource("19_iegd6") +back = ExtResource("20_kalbc") + +[node name="AButton" parent="HBoxContainer/Controls" index="0"] +texture = ExtResource("2_hj4a5") + +[node name="BButton" parent="HBoxContainer/Controls" index="1"] +texture = ExtResource("3_0hjly") + +[node name="XButton" parent="HBoxContainer/Controls" index="2"] +texture = ExtResource("4_b8ldp") + +[node name="YButton" parent="HBoxContainer/Controls" index="3"] +texture = ExtResource("5_qpo6l") + +[node name="LeftStick" parent="HBoxContainer/Controls" index="4"] +texture = ExtResource("6_o36fw") + +[node name="LeftStickClick" parent="HBoxContainer/Controls" index="5"] +texture = ExtResource("7_tn44v") + +[node name="RightStick" parent="HBoxContainer/Controls" index="6"] +texture = ExtResource("8_gfspk") + +[node name="RightStickClick" parent="HBoxContainer/Controls" index="7"] +texture = ExtResource("9_ktbic") + +[node name="LeftBumper" parent="HBoxContainer/Controls" index="8"] +texture = ExtResource("10_6uo88") + +[node name="RightBumper" parent="HBoxContainer/Controls" index="9"] +texture = ExtResource("11_xm8m7") + +[node name="LeftTrigger" parent="HBoxContainer/Controls" index="10"] +texture = ExtResource("12_y225d") + +[node name="RightTrigger" parent="HBoxContainer/Controls" index="11"] +texture = ExtResource("13_xpnov") + +[node name="DpadUp" parent="HBoxContainer/Controls" index="12"] +texture = ExtResource("14_ujug8") + +[node name="DpadLeft" parent="HBoxContainer/Controls" index="13"] +texture = ExtResource("15_2efb3") + +[node name="DpadRight" parent="HBoxContainer/Controls" index="14"] +texture = ExtResource("16_yqxw1") + +[node name="DpadDown" parent="HBoxContainer/Controls" index="15"] +texture = ExtResource("17_gfqch") + +[node name="Start" parent="HBoxContainer/Controls" index="16"] +texture = ExtResource("18_s5cn6") + +[node name="Misc1" parent="HBoxContainer/Controls" index="17"] +texture = ExtResource("19_iegd6") + +[node name="Back" parent="HBoxContainer/Controls" index="18"] +texture = ExtResource("20_kalbc") diff --git a/addons/guide/ui/renderers/controllers/xbox/icons/XboxSeriesX_A.png b/addons/guide/ui/renderers/controllers/xbox/icons/XboxSeriesX_A.png new file mode 100644 index 0000000000000000000000000000000000000000..e22bb29af148f3d046d4a5147428cc7d25f6270c GIT binary patch literal 3912 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 M07*qoM6N<$g21vE%>V!Z literal 0 HcmV?d00001 diff --git a/addons/guide/ui/renderers/controllers/xbox/icons/XboxSeriesX_Dpad.png.import b/addons/guide/ui/renderers/controllers/xbox/icons/XboxSeriesX_Dpad.png.import new file mode 100644 index 0000000..177a232 --- /dev/null +++ b/addons/guide/ui/renderers/controllers/xbox/icons/XboxSeriesX_Dpad.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://j5kp5tnwtysq" +path="res://.godot/imported/XboxSeriesX_Dpad.png-4bf4aa5e92bab139204438b5ac2b303d.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/guide/ui/renderers/controllers/xbox/icons/XboxSeriesX_Dpad.png" +dest_files=["res://.godot/imported/XboxSeriesX_Dpad.png-4bf4aa5e92bab139204438b5ac2b303d.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/addons/guide/ui/renderers/controllers/xbox/icons/XboxSeriesX_Dpad_Down.png b/addons/guide/ui/renderers/controllers/xbox/icons/XboxSeriesX_Dpad_Down.png new file mode 100644 index 0000000000000000000000000000000000000000..93478eed7af23c0fc098a8dc928a91fc75f43b57 GIT binary patch literal 3539 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 N002ovPDHLkV1hC_;xGUJ literal 0 HcmV?d00001 diff --git a/addons/guide/ui/renderers/controllers/xbox/icons/XboxSeriesX_Dpad_Down.png.import b/addons/guide/ui/renderers/controllers/xbox/icons/XboxSeriesX_Dpad_Down.png.import new file mode 100644 index 0000000..33030ff --- /dev/null +++ b/addons/guide/ui/renderers/controllers/xbox/icons/XboxSeriesX_Dpad_Down.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://d1fgf8ia7q4vo" +path="res://.godot/imported/XboxSeriesX_Dpad_Down.png-04b87c5546afa2b93f9116f73733624b.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/guide/ui/renderers/controllers/xbox/icons/XboxSeriesX_Dpad_Down.png" +dest_files=["res://.godot/imported/XboxSeriesX_Dpad_Down.png-04b87c5546afa2b93f9116f73733624b.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/addons/guide/ui/renderers/controllers/xbox/icons/XboxSeriesX_Dpad_Left.png b/addons/guide/ui/renderers/controllers/xbox/icons/XboxSeriesX_Dpad_Left.png new file mode 100644 index 0000000000000000000000000000000000000000..e1e3dfd12ad8e1a76e541b59c314d67807d7cc89 GIT binary patch literal 3466 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 literal 0 HcmV?d00001 diff --git a/addons/guide/ui/renderers/controllers/xbox/icons/XboxSeriesX_Dpad_Right.png.import b/addons/guide/ui/renderers/controllers/xbox/icons/XboxSeriesX_Dpad_Right.png.import new file mode 100644 index 0000000..4dc009f --- /dev/null +++ b/addons/guide/ui/renderers/controllers/xbox/icons/XboxSeriesX_Dpad_Right.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://gsilbr1bntic" +path="res://.godot/imported/XboxSeriesX_Dpad_Right.png-e6fc74a1f6107eff3516a80369cf5807.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/guide/ui/renderers/controllers/xbox/icons/XboxSeriesX_Dpad_Right.png" +dest_files=["res://.godot/imported/XboxSeriesX_Dpad_Right.png-e6fc74a1f6107eff3516a80369cf5807.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/addons/guide/ui/renderers/controllers/xbox/icons/XboxSeriesX_Dpad_Up.png b/addons/guide/ui/renderers/controllers/xbox/icons/XboxSeriesX_Dpad_Up.png new file mode 100644 index 0000000000000000000000000000000000000000..a466badd66e900031ae8720b7fee87cbc974a9c5 GIT binary patch literal 3584 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 literal 0 HcmV?d00001 diff --git a/addons/guide/ui/renderers/controllers/xbox/icons/XboxSeriesX_Left_Stick.png.import b/addons/guide/ui/renderers/controllers/xbox/icons/XboxSeriesX_Left_Stick.png.import new file mode 100644 index 0000000..66a1fbd --- /dev/null +++ b/addons/guide/ui/renderers/controllers/xbox/icons/XboxSeriesX_Left_Stick.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://wol4p4f32lfr" +path="res://.godot/imported/XboxSeriesX_Left_Stick.png-c81470e6e08de714ca5029e194422ef3.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/guide/ui/renderers/controllers/xbox/icons/XboxSeriesX_Left_Stick.png" +dest_files=["res://.godot/imported/XboxSeriesX_Left_Stick.png-c81470e6e08de714ca5029e194422ef3.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/addons/guide/ui/renderers/controllers/xbox/icons/XboxSeriesX_Left_Stick_Click.png b/addons/guide/ui/renderers/controllers/xbox/icons/XboxSeriesX_Left_Stick_Click.png new file mode 100644 index 0000000000000000000000000000000000000000..ad0428f559f87dbb212a0cca438e3f0044559ba9 GIT binary patch literal 3006 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 literal 0 HcmV?d00001 diff --git a/addons/guide/ui/renderers/controllers/xbox/icons/XboxSeriesX_Menu.png.import b/addons/guide/ui/renderers/controllers/xbox/icons/XboxSeriesX_Menu.png.import new file mode 100644 index 0000000..6ff0007 --- /dev/null +++ b/addons/guide/ui/renderers/controllers/xbox/icons/XboxSeriesX_Menu.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://y70m84f40jkk" +path="res://.godot/imported/XboxSeriesX_Menu.png-b5260eb2af6d939947fd11289117ab1c.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/guide/ui/renderers/controllers/xbox/icons/XboxSeriesX_Menu.png" +dest_files=["res://.godot/imported/XboxSeriesX_Menu.png-b5260eb2af6d939947fd11289117ab1c.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/addons/guide/ui/renderers/controllers/xbox/icons/XboxSeriesX_RB.png b/addons/guide/ui/renderers/controllers/xbox/icons/XboxSeriesX_RB.png new file mode 100644 index 0000000000000000000000000000000000000000..5dcfc6d79703bb8649f52a79123e2fc2e644b636 GIT binary patch literal 2779 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 a9`c4)NPj(B&N5?*Rsd;gYf@|Mj{65tf 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 u literal 0 HcmV?d00001 diff --git a/addons/guide/ui/renderers/controllers/xbox/icons/XboxSeriesX_Right_Stick_Click.png.import b/addons/guide/ui/renderers/controllers/xbox/icons/XboxSeriesX_Right_Stick_Click.png.import new file mode 100644 index 0000000..cf66afe --- /dev/null +++ b/addons/guide/ui/renderers/controllers/xbox/icons/XboxSeriesX_Right_Stick_Click.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://pmymadotp1l0" +path="res://.godot/imported/XboxSeriesX_Right_Stick_Click.png-7cd7984c348fb4db2998472d7b950c6a.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/guide/ui/renderers/controllers/xbox/icons/XboxSeriesX_Right_Stick_Click.png" +dest_files=["res://.godot/imported/XboxSeriesX_Right_Stick_Click.png-7cd7984c348fb4db2998472d7b950c6a.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/addons/guide/ui/renderers/controllers/xbox/icons/XboxSeriesX_Share.png b/addons/guide/ui/renderers/controllers/xbox/icons/XboxSeriesX_Share.png new file mode 100644 index 0000000000000000000000000000000000000000..66d9f95021f23efe68b9f368fa49ef5278431339 GIT binary patch literal 2812 zcmZ`*c{~&RAD<|9<|ykSjg-+sNRgw-a?TaY+>^&mI5}>M=8h*+-YGm%Is+88|!86{oiFmiOet6LP>!)6j~SGR~T+!~K%@6+$?x zK756s?SStBt4^e@*fniedg<0y*w>6_nmsXveFq*3Ug(I9Do%C;wbF0sJ?1ytsP17l zMon)VCUQ9I!axDOV}ITR|F82F8^EmEjXjLYRm|hjle?5?DiG6}w)6rockH^XS_Z+# zJ%5q4wY60jVKC&x=d1Nc5;)~=2=TJf;J1~oR+No78$#p&ej3E@1^@jauE8>UeSMuj zS5cpLQ|e}n0~>V>KhA43XiW{=NZ9|kwqP9Pb8A20mpIo`k>*X&}EZBFz&EtIMcXz-=|*omnj2_Yu5r#3SdI0ky7 z*rgar!j>ZrA}l-}pxyNX&+>*Naur|LK)~grw{k0OU!y@>gf?>42Q5T#zEg>x}Eve8y-4e)ouV6bpmu#JDx9P-|#< zb~c&3nyn~URQ1BCfq<-IsE9}N!5&&wV_&^`l>_8HY;A2_aI;p{50P0*-j!zA`?ZvhbxNj!U-6mw9x^sYQmw#0UKw~&y6p7v{@|1OTC6iOs}zT9&+GSznrD!QnJz>-&^_cqb*da>Y} zUGtAt+ccFNuZf#0CxahuaBQS5Y#EC7Jj9?L69h=4&>l}CQwv+XD=ngUty9ZAy~TFR+}@>q7;t3UYwkj<)zDZwX@GLao>no_`#R|T(tR;l=IkLBPNKf{nT4A?Br{tmwI|P>@^b#|0s~T6@bc#*!I5 zh2>r;=w~{|+MrVK?vas^8nGeIQUV_=I~XyH-3*oH+ROTSV9P=>fczRtyw%Dgrk|^H?PJ-~R3@B6)Z*R4}Sf$~!&l6-#_B z>zv`p+}nH%apX>Ydi3(>Y^HQo7(F(>I5<}ZKx=tQ>D>1tR3z^F_&6&A1axv(Z_-B9 z+&f)b$&hq%Gs(MRr;e*EHj5#XFk=1_`F>9`plG-o-o5`iAM8uEY`m^1_^xR)`cVW8 ziHBmNjr(Q;rgAbarzfvJ)!gMtT|&xpM){cNvTHdRHKexu z7k_Cb9{pN+!nk2Icds$BQ0b~^TnGExabKju+!Up^q8GXfsDAQiI84GKar!zUel6*a zaODGqE$Z?vIXBp?Q+sanFAs0nbUgo?_ch61i-_~OO;Dxw<8d)Ds-?iD(Yi;MOr_vy z8Op>>J+aOWrT(K-u<5XfQ~vRJwuwv6wDiKh1Y*MOZu&fY`&Yc@JJ!KLyw}JSqrQhtNj!Qj$P#Z^BMI(6&kx^oIzV5q4z5C|XZfxHP;+*6PFvK60TPOTMD6Ri#41N zGvs_Ol!Dv3LDIK*<-G`#STN|aNoQ7oSb^pZR#dlgVwY?>DsgFKWipNW>1Pf7k++qBQ0F` zTtiO8$osv{hy~KE`bj@^#13+#yrjImVqzuJ2sO`srTf4GcIBbJtbykGW6=egWn?@P z2fwriC@MAu;euuPvE3dD4r-p`rDeH5)4{FMn zXpsbeG_@_s`eatA7jz*1EQIUWS@`j#s8614wo>|0u2F2Htfb8SAYMZcwby;e3(XY5`_& LD`T>eNAiCFy}NM` literal 0 HcmV?d00001 diff --git a/addons/guide/ui/renderers/controllers/xbox/icons/XboxSeriesX_Share.png.import b/addons/guide/ui/renderers/controllers/xbox/icons/XboxSeriesX_Share.png.import new file mode 100644 index 0000000..cf906c6 --- /dev/null +++ b/addons/guide/ui/renderers/controllers/xbox/icons/XboxSeriesX_Share.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b8b2oomlnf5tt" +path="res://.godot/imported/XboxSeriesX_Share.png-39f960085afed02792af365e2b9c52a6.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/guide/ui/renderers/controllers/xbox/icons/XboxSeriesX_Share.png" +dest_files=["res://.godot/imported/XboxSeriesX_Share.png-39f960085afed02792af365e2b9c52a6.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/addons/guide/ui/renderers/controllers/xbox/icons/XboxSeriesX_View.png b/addons/guide/ui/renderers/controllers/xbox/icons/XboxSeriesX_View.png new file mode 100644 index 0000000000000000000000000000000000000000..066086aeaeff1c00490a1747a44cbe7f7d62e4af GIT binary patch literal 3382 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 HbkhF-`TcFN literal 0 HcmV?d00001 diff --git a/addons/guide/ui/renderers/controllers/xbox/icons/XboxSeriesX_View.png.import b/addons/guide/ui/renderers/controllers/xbox/icons/XboxSeriesX_View.png.import new file mode 100644 index 0000000..b2f81ab --- /dev/null +++ b/addons/guide/ui/renderers/controllers/xbox/icons/XboxSeriesX_View.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b5wc83dex8igr" +path="res://.godot/imported/XboxSeriesX_View.png-4584623e9f69c92b5f7aa502e1647455.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/guide/ui/renderers/controllers/xbox/icons/XboxSeriesX_View.png" +dest_files=["res://.godot/imported/XboxSeriesX_View.png-4584623e9f69c92b5f7aa502e1647455.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/addons/guide/ui/renderers/controllers/xbox/icons/XboxSeriesX_X.png b/addons/guide/ui/renderers/controllers/xbox/icons/XboxSeriesX_X.png new file mode 100644 index 0000000000000000000000000000000000000000..e944b3e2e8bb90806a4f548b07f5570d3d5ed0c3 GIT binary patch literal 4065 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 z ^!`ZJxLo(hd)+qOgMDro_<#J&x_T7#k}xOOe@Qkc6MCn;={q;Q7fZ% zcXvaEQX2KIripAe8%lulJP*6OyTa=&%L;wtIMM-(Nr*^FI-QPGl%GF;9y-3Xv~=Zl z7DX@&Lzs>D{P}aKYVLG~XK|AhWggr6S1Ofu01Q=e@H|i0$${lsEEb232fm?sSspDb z#(8*n7@9Q(5Ue*mw{82=ah5~_6A)sW=8IynIF#8W+sI@xp>=pcapYOn zIN=c#CdVA~cp|h3pPW=`T)BPR1_PG;v68b#?V?e*HtGQjuo#)$4U(y%W## zV47yEb%<#~Q4|!5MPV@Q@bFM-0QP!4oS%ncPTS39^B*T^&&1V$N~O~Of>T|N;|Q%= z;I*XmdOcJs!zFwNmsih9S`5QLsZrS*oSdAXSS*Id97R!($z(3?rIb#bxE=V@0wP3GVObWw`|dkw zXhBwYky82~ts3#E7QqyihgB2><#IVPP}OKOP^;Ae-`;V7jg=lZ;dgE2m0GQ~~8tHG4Ce3>uAwP>oF!r>CblIy#E1-y2c8H}!(b zsn_l8ld{7v-DJ<6Nd;Ol8na(2M7P0cDtrh**a=#3d1l$2BHW-h3j&; zoLa$t(=>5$ae-E=6>IH^X_~_D0%L5;w(SSg*zjel#rQ?)3rJp!UsY8sEiGNTTjCHJ zWQ5qZjdr_@cDo&W0Z~-x!D-fg2d2DTMW2){QF)0sal49XlL5?VLzn(GN5ZveL5$?8 zy}yp*pwsEdY@eBJe>Af#kLvaMCyJtM$<}P^x{h2fH**iLZQJN}yHW=yV{C^p_Svkq zJW9ndjDvQ&y{~E7magkL0C)KFfg$NQ4k)FU#fql^-}f)a7QU#=0L~d>zqW1rrza;T zFQ(EE0j^}*yhfw(ea6_y>US*{`;?8MpLA z;HrQ za`y=#52m#-ae)5r(VN|Fck3#4^ps()2pL4bKJZ<}*j=Qsb9AsnG$CZ0Qo2148xe~z zw}kKrHnvw)b%Qas5$7I4$e!=}dyeDm%##!>u)qQfEU>@=3oNj}0t+m#fE51+VlKr& T0VOy)00000NkvXXu0mjfe2dIy literal 0 HcmV?d00001 diff --git a/addons/guide/ui/renderers/controllers/xbox/icons/XboxSeriesX_X.png.import b/addons/guide/ui/renderers/controllers/xbox/icons/XboxSeriesX_X.png.import new file mode 100644 index 0000000..b461388 --- /dev/null +++ b/addons/guide/ui/renderers/controllers/xbox/icons/XboxSeriesX_X.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dqnryo1s6qi45" +path="res://.godot/imported/XboxSeriesX_X.png-5f1df66dbbce24929b4c3ab5307e19e3.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/guide/ui/renderers/controllers/xbox/icons/XboxSeriesX_X.png" +dest_files=["res://.godot/imported/XboxSeriesX_X.png-5f1df66dbbce24929b4c3ab5307e19e3.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/addons/guide/ui/renderers/controllers/xbox/icons/XboxSeriesX_Y.png b/addons/guide/ui/renderers/controllers/xbox/icons/XboxSeriesX_Y.png new file mode 100644 index 0000000000000000000000000000000000000000..cf4a997212fa6a076ff2b46bd4a3cd137b64328e GIT binary patch literal 3819 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 literal 0 HcmV?d00001 diff --git a/addons/guide/ui/renderers/joy/icons/button_empty.png.import b/addons/guide/ui/renderers/joy/icons/button_empty.png.import new file mode 100644 index 0000000..e2bc208 --- /dev/null +++ b/addons/guide/ui/renderers/joy/icons/button_empty.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://veqjcwokdukw" +path="res://.godot/imported/button_empty.png-123d9e156dcc9c2e5ff33e4ffbcd7884.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/guide/ui/renderers/joy/icons/button_empty.png" +dest_files=["res://.godot/imported/button_empty.png-123d9e156dcc9c2e5ff33e4ffbcd7884.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/addons/guide/ui/renderers/joy/icons/stick_empty.png b/addons/guide/ui/renderers/joy/icons/stick_empty.png new file mode 100644 index 0000000000000000000000000000000000000000..ae363d2bcde98a55c747196af68c07e19651366d GIT binary patch literal 6710 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 literal 0 HcmV?d00001 diff --git a/addons/guide/ui/renderers/joy/icons/stick_empty.png.import b/addons/guide/ui/renderers/joy/icons/stick_empty.png.import new file mode 100644 index 0000000..8d805df --- /dev/null +++ b/addons/guide/ui/renderers/joy/icons/stick_empty.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://do001o6aysaxo" +path="res://.godot/imported/stick_empty.png-10fa96eb31f6946670d6998f8648c1db.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/guide/ui/renderers/joy/icons/stick_empty.png" +dest_files=["res://.godot/imported/stick_empty.png-10fa96eb31f6946670d6998f8648c1db.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/addons/guide/ui/renderers/joy/joy_renderer.gd b/addons/guide/ui/renderers/joy/joy_renderer.gd new file mode 100644 index 0000000..92bdec1 --- /dev/null +++ b/addons/guide/ui/renderers/joy/joy_renderer.gd @@ -0,0 +1,69 @@ +@tool +extends GUIDEIconRenderer + +@onready var _stick:Control = %Stick +@onready var _button:Control = %Button +@onready var _text:Control = %Text +@onready var _directions:Control = %Directions +@onready var _horizontal:Control = %Horizontal +@onready var _vertical:Control = %Vertical + + + +func supports(input:GUIDEInput) -> bool: + return input is GUIDEInputJoyBase + +func render(input:GUIDEInput) -> void: + _stick.visible = false + _button.visible = false + _directions.visible = false + _horizontal.visible = false + _vertical.visible = false + _text.text = "" + + + if input is GUIDEInputJoyAxis1D: + _stick.visible = true + match input.axis: + JOY_AXIS_LEFT_X: + _directions.visible = true + _text.text = "1" + _horizontal.visible = true + JOY_AXIS_RIGHT_X: + _directions.visible = true + _text.text = "2" + _horizontal.visible = true + JOY_AXIS_LEFT_Y: + _directions.visible = true + _text.text = "1" + _vertical.visible = true + JOY_AXIS_RIGHT_Y: + _directions.visible = true + _text.text = "2" + _vertical.visible = true + JOY_AXIS_TRIGGER_LEFT: + _text.text = "3" + JOY_AXIS_TRIGGER_RIGHT: + _text.text = "4" + + + + if input is GUIDEInputJoyAxis2D: + _stick.visible = true + match input.x: + JOY_AXIS_LEFT_X, JOY_AXIS_LEFT_Y: + _text.text = "1" + JOY_AXIS_RIGHT_X, JOY_AXIS_RIGHT_Y: + _text.text = "2" + _: + # well we don't know really what this is but what can we do. + _text.text = str(input.x + input.y) + + if input is GUIDEInputJoyButton: + _button.visible = true + _text.text = str(input.button) + + call("queue_sort") + +func cache_key(input:GUIDEInput) -> String: + return "a9ced629-de65-4c31-9de0-8e4cbf88a2e0" + input.to_string() diff --git a/addons/guide/ui/renderers/joy/joy_renderer.gd.uid b/addons/guide/ui/renderers/joy/joy_renderer.gd.uid new file mode 100644 index 0000000..a0ab334 --- /dev/null +++ b/addons/guide/ui/renderers/joy/joy_renderer.gd.uid @@ -0,0 +1 @@ +uid://bnk4uahoa45vc diff --git a/addons/guide/ui/renderers/joy/joy_renderer.tscn b/addons/guide/ui/renderers/joy/joy_renderer.tscn new file mode 100644 index 0000000..a1dd98e --- /dev/null +++ b/addons/guide/ui/renderers/joy/joy_renderer.tscn @@ -0,0 +1,63 @@ +[gd_scene load_steps=7 format=3 uid="uid://c6sqf8rur1wss"] + +[ext_resource type="Script" path="res://addons/guide/ui/renderers/joy/joy_renderer.gd" id="1_u7brn"] +[ext_resource type="Texture2D" uid="uid://do001o6aysaxo" path="res://addons/guide/ui/renderers/joy/icons/stick_empty.png" id="2_23u2k"] +[ext_resource type="Texture2D" uid="uid://veqjcwokdukw" path="res://addons/guide/ui/renderers/joy/icons/button_empty.png" id="3_7qfbp"] +[ext_resource type="FontFile" uid="uid://cu8bvod6tnnwr" path="res://addons/guide/ui/renderers/keyboard/Lato-Black.ttf" id="4_otp86"] +[ext_resource type="Texture2D" uid="uid://bmgxqbypegjxh" path="res://addons/guide/ui/renderers/textures/arrow_horizontal.svg" id="5_81uyo"] +[ext_resource type="Texture2D" uid="uid://bu5nlug6uf03w" path="res://addons/guide/ui/renderers/textures/arrow_vertical.svg" id="6_syx8c"] + +[node name="JoyRenderer" type="MarginContainer"] +offset_right = 100.0 +offset_bottom = 100.0 +size_flags_horizontal = 0 +script = ExtResource("1_u7brn") + +[node name="HBoxContainer" type="HBoxContainer" parent="."] +layout_mode = 2 + +[node name="Controls" type="MarginContainer" parent="HBoxContainer"] +unique_name_in_owner = true +custom_minimum_size = Vector2(100, 100) +layout_mode = 2 + +[node name="Stick" type="TextureRect" parent="HBoxContainer/Controls"] +unique_name_in_owner = true +layout_mode = 2 +texture = ExtResource("2_23u2k") +stretch_mode = 4 + +[node name="Button" type="TextureRect" parent="HBoxContainer/Controls"] +unique_name_in_owner = true +layout_mode = 2 +texture = ExtResource("3_7qfbp") +stretch_mode = 4 + +[node name="Text" type="Label" parent="HBoxContainer/Controls"] +unique_name_in_owner = true +layout_mode = 2 +size_flags_horizontal = 4 +theme_override_colors/font_color = Color(0.843137, 0.843137, 0.843137, 1) +theme_override_fonts/font = ExtResource("4_otp86") +theme_override_font_sizes/font_size = 50 +text = "1" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="Directions" type="MarginContainer" parent="HBoxContainer"] +unique_name_in_owner = true +visible = false +custom_minimum_size = Vector2(100, 100) +layout_mode = 2 + +[node name="Horizontal" type="TextureRect" parent="HBoxContainer/Directions"] +unique_name_in_owner = true +layout_mode = 2 +texture = ExtResource("5_81uyo") +stretch_mode = 4 + +[node name="Vertical" type="TextureRect" parent="HBoxContainer/Directions"] +unique_name_in_owner = true +layout_mode = 2 +texture = ExtResource("6_syx8c") +stretch_mode = 4 diff --git a/addons/guide/ui/renderers/keyboard/Lato-Black.ttf b/addons/guide/ui/renderers/keyboard/Lato-Black.ttf new file mode 100644 index 0000000000000000000000000000000000000000..4340502d93c09da91560c862cabf3f6055704149 GIT binary patch literal 69500 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 X)1d#|GoGS{N^72R6+cvrokIHmv=>@H literal 0 HcmV?d00001 diff --git a/addons/guide/ui/renderers/keyboard/Lato-Black.ttf.import b/addons/guide/ui/renderers/keyboard/Lato-Black.ttf.import new file mode 100644 index 0000000..c7bb2da --- /dev/null +++ b/addons/guide/ui/renderers/keyboard/Lato-Black.ttf.import @@ -0,0 +1,35 @@ +[remap] + +importer="font_data_dynamic" +type="FontFile" +uid="uid://cu8bvod6tnnwr" +path="res://.godot/imported/Lato-Black.ttf-dd70fb4540a062e6fd25f6b3cb73f785.fontdata" + +[deps] + +source_file="res://addons/guide/ui/renderers/keyboard/Lato-Black.ttf" +dest_files=["res://.godot/imported/Lato-Black.ttf-dd70fb4540a062e6fd25f6b3cb73f785.fontdata"] + +[params] + +Rendering=null +antialiasing=1 +generate_mipmaps=false +disable_embedded_bitmaps=true +multichannel_signed_distance_field=false +msdf_pixel_range=8 +msdf_size=48 +allow_system_fallback=true +force_autohinter=false +hinting=1 +subpixel_positioning=1 +keep_rounding_remainders=true +oversampling=0.0 +Fallbacks=null +fallbacks=[] +Compress=null +compress=true +preload=[] +language_support={} +script_support={} +opentype_features={} diff --git a/addons/guide/ui/renderers/keyboard/icons/Blank_White_Normal.png b/addons/guide/ui/renderers/keyboard/icons/Blank_White_Normal.png new file mode 100644 index 0000000000000000000000000000000000000000..beee975a9ec4eeb7f30e28321b45a7ba87b23259 GIT binary patch literal 1160 zcmeAS@N?(olHy`uVBq!ia0vp^DImmswh!rV zm|aw!xGrHXS()*EUGq7{U$>k7{m}Rw_^zsJZxi3dk_)o8mp!TwbShF=%myt{0PQeC;s^V3QPJD4-gX4|WJUSj*;8RhP}S7Yg) zu+?9EKP9=}%9^ASf6!o4jnvuR4h@0(-|L;fUhi-wH-^~%*N=d7_j zF>CeviR%=LS6-^zC1 zJ!8H4?c3a(oE(nX6ANR_r(aNi4b-_ej^E$kf93kuWxFHw_fOrT8G9wTH??$C+L?LK%y` z=Brn)7T)~*^um>@pc9Mu{_MWs78nvzytCu6M4`;#(z{p8r)#?DM^2ukqPc2ikhYG% z(xRW+H=LTx_Gyv0NMV28YRzQ-vln%iG~Ri^%FoX)KkxNiomWyhP4~)cbAH`$4=Oh4 zKBO0EBF&a0iHsIEzS!R07rgJ!SG(E&YFF17hZOQ0F+xEq?7{!yqYCr)YcIW36}kNK z#E?+V@87?#G+HWhzivGf#I!&K&q*db71-U&q-s5<%0-FsWNZsk9Jy5jV2zxTWC%%tzV^)+2q z?scCn>{;xNs{3Cz-W1@FJd}IUSYy-sV@#ZfKO{T%1)rL`W8Ldz+f?@K-7A@W{>DYA zLw7iLc%-n`5bIl@cX&;(XP?ckl9^iQC!PDRDGi znH8k=x2`@*;=q-S%b#V4waT0qVPR}i&{(wc(&P7v(@yG6(0tCP*J^Wo-tA0>@bGZ% zvZZ^L^~7$Gb==i<$02&lx%1~48LF$R4{4oVdHH3}@pXc%N>%;~Zsz>kbs{}Qhk5Ch z=fHgQ{LcExW-osKix;?eOSf@$+3vsHPg) bool: + return input is GUIDEInputKey + +func render(input:GUIDEInput) -> void: + var key:Key = input.key + var label_key:Key = DisplayServer.keyboard_get_label_from_physical(key) + _label.text = OS.get_keycode_string(label_key).strip_edges() + size = Vector2.ZERO + call("queue_sort") + +func cache_key(input:GUIDEInput) -> String: + return "ed6923d5-4115-44bd-b35e-2c4102ffc83e" + input.to_string() diff --git a/addons/guide/ui/renderers/keyboard/key_renderer.gd.uid b/addons/guide/ui/renderers/keyboard/key_renderer.gd.uid new file mode 100644 index 0000000..65ec674 --- /dev/null +++ b/addons/guide/ui/renderers/keyboard/key_renderer.gd.uid @@ -0,0 +1 @@ +uid://cd4r6x5q0mkhp diff --git a/addons/guide/ui/renderers/keyboard/key_renderer.tscn b/addons/guide/ui/renderers/keyboard/key_renderer.tscn new file mode 100644 index 0000000..eacb5b9 --- /dev/null +++ b/addons/guide/ui/renderers/keyboard/key_renderer.tscn @@ -0,0 +1,36 @@ +[gd_scene load_steps=4 format=3 uid="uid://toty2e3yx26l"] + +[ext_resource type="Script" path="res://addons/guide/ui/renderers/keyboard/key_renderer.gd" id="1_tm2sd"] +[ext_resource type="Texture2D" uid="uid://b3x586os8uuwb" path="res://addons/guide/ui/renderers/keyboard/icons/Blank_White_Normal.png" id="2_myc15"] +[ext_resource type="FontFile" uid="uid://cu8bvod6tnnwr" path="res://addons/guide/ui/renderers/keyboard/Lato-Black.ttf" id="3_d3uds"] + +[node name="KeyRenderer" type="MarginContainer"] +custom_minimum_size = Vector2(100, 100) +offset_right = 267.0 +offset_bottom = 100.0 +size_flags_horizontal = 0 +size_flags_vertical = 0 +script = ExtResource("1_tm2sd") + +[node name="NinePatchRect" type="NinePatchRect" parent="."] +layout_mode = 2 +texture = ExtResource("2_myc15") +region_rect = Rect2(10, 10, 80, 80) +patch_margin_left = 29 +patch_margin_top = 30 +patch_margin_right = 29 +patch_margin_bottom = 29 + +[node name="MarginContainer" type="MarginContainer" parent="."] +layout_mode = 2 +theme_override_constants/margin_left = 30 +theme_override_constants/margin_right = 30 + +[node name="Label" type="Label" parent="MarginContainer"] +unique_name_in_owner = true +layout_mode = 2 +theme_override_colors/font_color = Color(0.25098, 0.25098, 0.25098, 1) +theme_override_fonts/font = ExtResource("3_d3uds") +theme_override_font_sizes/font_size = 45 +text = "Long Long Long" +horizontal_alignment = 1 diff --git a/addons/guide/ui/renderers/misc/action_renderer.gd b/addons/guide/ui/renderers/misc/action_renderer.gd new file mode 100644 index 0000000..c39f8a6 --- /dev/null +++ b/addons/guide/ui/renderers/misc/action_renderer.gd @@ -0,0 +1,11 @@ +@tool +extends GUIDEIconRenderer + +func supports(input:GUIDEInput) -> bool: + return input is GUIDEInputAction + +func render(input:GUIDEInput) -> void: + pass + +func cache_key(input:GUIDEInput) -> String: + return "0ecd6608-ba3c-4fc2-83f7-ad61736f1106" # we only have one output, so same cache key diff --git a/addons/guide/ui/renderers/misc/action_renderer.gd.uid b/addons/guide/ui/renderers/misc/action_renderer.gd.uid new file mode 100644 index 0000000..baefc8a --- /dev/null +++ b/addons/guide/ui/renderers/misc/action_renderer.gd.uid @@ -0,0 +1 @@ +uid://bdrygt8mymguu diff --git a/addons/guide/ui/renderers/misc/action_renderer.tscn b/addons/guide/ui/renderers/misc/action_renderer.tscn new file mode 100644 index 0000000..88cb452 --- /dev/null +++ b/addons/guide/ui/renderers/misc/action_renderer.tscn @@ -0,0 +1,16 @@ +[gd_scene load_steps=3 format=3 uid="uid://ortn6jb3wljf"] + +[ext_resource type="Script" path="res://addons/guide/ui/renderers/misc/action_renderer.gd" id="1_140q4"] +[ext_resource type="Texture2D" uid="uid://diwkvjkss2ie" path="res://addons/guide/ui/renderers/textures/action.svg" id="2_uqvia"] + +[node name="ActionRenderer" type="MarginContainer"] +offset_right = 512.0 +offset_bottom = 512.0 +size_flags_horizontal = 0 +script = ExtResource("1_140q4") + +[node name="Action" type="TextureRect" parent="."] +unique_name_in_owner = true +layout_mode = 2 +texture = ExtResource("2_uqvia") +stretch_mode = 4 diff --git a/addons/guide/ui/renderers/misc/fallback_renderer.gd b/addons/guide/ui/renderers/misc/fallback_renderer.gd new file mode 100644 index 0000000..4fa78e1 --- /dev/null +++ b/addons/guide/ui/renderers/misc/fallback_renderer.gd @@ -0,0 +1,11 @@ +@tool +extends GUIDEIconRenderer + +func supports(input:GUIDEInput) -> bool: + return true + +func render(input:GUIDEInput) -> void: + pass + +func cache_key(input:GUIDEInput) -> String: + return "2e130e8b-d5b3-478c-af65-53415adfd6bb" # we only have one output, so same cache key diff --git a/addons/guide/ui/renderers/misc/fallback_renderer.gd.uid b/addons/guide/ui/renderers/misc/fallback_renderer.gd.uid new file mode 100644 index 0000000..36a7db9 --- /dev/null +++ b/addons/guide/ui/renderers/misc/fallback_renderer.gd.uid @@ -0,0 +1 @@ +uid://dah64oq8ican diff --git a/addons/guide/ui/renderers/misc/fallback_renderer.tscn b/addons/guide/ui/renderers/misc/fallback_renderer.tscn new file mode 100644 index 0000000..106c8d8 --- /dev/null +++ b/addons/guide/ui/renderers/misc/fallback_renderer.tscn @@ -0,0 +1,20 @@ +[gd_scene load_steps=3 format=3 uid="uid://bqf4yoind3a82"] + +[ext_resource type="Script" path="res://addons/guide/ui/renderers/misc/fallback_renderer.gd" id="1_mgm3k"] +[ext_resource type="FontFile" uid="uid://cu8bvod6tnnwr" path="res://addons/guide/ui/renderers/keyboard/Lato-Black.ttf" id="2_5hk8u"] + +[node name="FallbackRenderer" type="MarginContainer"] +offset_right = 512.0 +offset_bottom = 512.0 +size_flags_horizontal = 0 +script = ExtResource("1_mgm3k") +priority = 100 + +[node name="Label" type="Label" parent="."] +custom_minimum_size = Vector2(512, 512) +layout_mode = 2 +theme_override_fonts/font = ExtResource("2_5hk8u") +theme_override_font_sizes/font_size = 350 +text = "?" +horizontal_alignment = 1 +vertical_alignment = 1 diff --git a/addons/guide/ui/renderers/mouse/icons/Mouse_Cursor.png b/addons/guide/ui/renderers/mouse/icons/Mouse_Cursor.png new file mode 100644 index 0000000000000000000000000000000000000000..8d52353d16644fa6116b429106155ec4f859fa0b GIT binary patch literal 4728 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 literal 0 HcmV?d00001 diff --git a/addons/guide/ui/renderers/mouse/icons/Mouse_Left_Key_Light.png.import b/addons/guide/ui/renderers/mouse/icons/Mouse_Left_Key_Light.png.import new file mode 100644 index 0000000..e6fb06e --- /dev/null +++ b/addons/guide/ui/renderers/mouse/icons/Mouse_Left_Key_Light.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://vvgpheda22ew" +path="res://.godot/imported/Mouse_Left_Key_Light.png-8c9c47fe23d850a53ee5b259032ff1e7.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/guide/ui/renderers/mouse/icons/Mouse_Left_Key_Light.png" +dest_files=["res://.godot/imported/Mouse_Left_Key_Light.png-8c9c47fe23d850a53ee5b259032ff1e7.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/addons/guide/ui/renderers/mouse/icons/Mouse_Middle_Key_Light.png b/addons/guide/ui/renderers/mouse/icons/Mouse_Middle_Key_Light.png new file mode 100644 index 0000000000000000000000000000000000000000..d3298c1a6b686add3d26df5b605973ff0a5bf9aa GIT binary patch literal 3242 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 literal 0 HcmV?d00001 diff --git a/addons/guide/ui/renderers/mouse/icons/Mouse_Middle_Key_Light.png.import b/addons/guide/ui/renderers/mouse/icons/Mouse_Middle_Key_Light.png.import new file mode 100644 index 0000000..74951c7 --- /dev/null +++ b/addons/guide/ui/renderers/mouse/icons/Mouse_Middle_Key_Light.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bmj244x0jn7v2" +path="res://.godot/imported/Mouse_Middle_Key_Light.png-d1b621d65964bf35e881bf5a749d0470.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/guide/ui/renderers/mouse/icons/Mouse_Middle_Key_Light.png" +dest_files=["res://.godot/imported/Mouse_Middle_Key_Light.png-d1b621d65964bf35e881bf5a749d0470.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/addons/guide/ui/renderers/mouse/icons/Mouse_Right_Key_Light.png b/addons/guide/ui/renderers/mouse/icons/Mouse_Right_Key_Light.png new file mode 100644 index 0000000000000000000000000000000000000000..8106df7e14ca4091af41ed961a6cfc320bd34784 GIT binary patch literal 3340 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 literal 0 HcmV?d00001 diff --git a/addons/guide/ui/renderers/mouse/icons/Mouse_Side_Key_1_Light.png.import b/addons/guide/ui/renderers/mouse/icons/Mouse_Side_Key_1_Light.png.import new file mode 100644 index 0000000..b41bb91 --- /dev/null +++ b/addons/guide/ui/renderers/mouse/icons/Mouse_Side_Key_1_Light.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://je8rm7jk2nxd" +path="res://.godot/imported/Mouse_Side_Key_1_Light.png-1e0810994bec8c12ac686f4c33006236.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/guide/ui/renderers/mouse/icons/Mouse_Side_Key_1_Light.png" +dest_files=["res://.godot/imported/Mouse_Side_Key_1_Light.png-1e0810994bec8c12ac686f4c33006236.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/addons/guide/ui/renderers/mouse/icons/Mouse_Side_Key_2_Light.png b/addons/guide/ui/renderers/mouse/icons/Mouse_Side_Key_2_Light.png new file mode 100644 index 0000000000000000000000000000000000000000..2011ef00b7949a9a1fecf248d01d75df500e6da1 GIT binary patch literal 5635 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 IVV5KS1^U0mmjD0& literal 0 HcmV?d00001 diff --git a/addons/guide/ui/renderers/mouse/icons/Mouse_Side_Key_2_Light.png.import b/addons/guide/ui/renderers/mouse/icons/Mouse_Side_Key_2_Light.png.import new file mode 100644 index 0000000..8696fa5 --- /dev/null +++ b/addons/guide/ui/renderers/mouse/icons/Mouse_Side_Key_2_Light.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bqxly0g8pftxa" +path="res://.godot/imported/Mouse_Side_Key_2_Light.png-3a47028a83b486166e55c8b465b98934.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/guide/ui/renderers/mouse/icons/Mouse_Side_Key_2_Light.png" +dest_files=["res://.godot/imported/Mouse_Side_Key_2_Light.png-3a47028a83b486166e55c8b465b98934.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/addons/guide/ui/renderers/mouse/icons/Mouse_Simple_Key_Light.png b/addons/guide/ui/renderers/mouse/icons/Mouse_Simple_Key_Light.png new file mode 100644 index 0000000000000000000000000000000000000000..7891ea406e004a90f83a3a5a32de625e91546c6a GIT binary patch literal 3252 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 bool: + return input is GUIDEInputMouseButton or \ + input is GUIDEInputMouseAxis1D or \ + input is GUIDEInputMouseAxis2D or \ + input is GUIDEInputMousePosition + + +func render(input:GUIDEInput) -> void: + for child in _controls.get_children(): + child.visible = false + for child in _directions.get_children(): + child.visible = false + + _directions.visible = false + + if input is GUIDEInputMouseButton: + match input.button: + MOUSE_BUTTON_LEFT: + _mouse_left.visible = true + MOUSE_BUTTON_RIGHT: + _mouse_right.visible = true + MOUSE_BUTTON_MIDDLE: + _mouse_middle.visible = true + MOUSE_BUTTON_WHEEL_UP: + _directions.visible = true + _up.visible = true + _mouse_middle.visible = true + MOUSE_BUTTON_WHEEL_DOWN: + _directions.visible = true + _down.visible = true + _mouse_middle.visible = true + MOUSE_BUTTON_WHEEL_LEFT: + _directions.visible = true + _left.visible = true + _mouse_middle.visible = true + MOUSE_BUTTON_WHEEL_RIGHT: + _directions.visible = true + _right.visible = true + _mouse_middle.visible = true + MOUSE_BUTTON_XBUTTON1: + _mouse_side_a.visible = true + MOUSE_BUTTON_XBUTTON2: + _mouse_side_b.visible = true + + if input is GUIDEInputMouseAxis1D: + if input.axis == GUIDEInputMouseAxis1D.GUIDEInputMouseAxis.X: + _mouse_blank.visible = true + _directions.visible = true + _horizontal.visible = true + else: + _mouse_blank.visible = true + _directions.visible = true + _vertical.visible = true + + if input is GUIDEInputMouseAxis2D: + _mouse_blank.visible = true + + if input is GUIDEInputMousePosition: + _mouse_cursor.visible = true + + call("queue_sort") + +func cache_key(input:GUIDEInput) -> String: + return "7e27520a-b6d8-4451-858d-e94330c82e85" + input.to_string() diff --git a/addons/guide/ui/renderers/mouse/mouse_renderer.gd.uid b/addons/guide/ui/renderers/mouse/mouse_renderer.gd.uid new file mode 100644 index 0000000..26c3497 --- /dev/null +++ b/addons/guide/ui/renderers/mouse/mouse_renderer.gd.uid @@ -0,0 +1 @@ +uid://dh2deng2bk2eo diff --git a/addons/guide/ui/renderers/mouse/mouse_renderer.tscn b/addons/guide/ui/renderers/mouse/mouse_renderer.tscn new file mode 100644 index 0000000..01d8eb9 --- /dev/null +++ b/addons/guide/ui/renderers/mouse/mouse_renderer.tscn @@ -0,0 +1,125 @@ +[gd_scene load_steps=15 format=3 uid="uid://bfl6dbw21xqs1"] + +[ext_resource type="Script" path="res://addons/guide/ui/renderers/mouse/mouse_renderer.gd" id="1_amutf"] +[ext_resource type="Texture2D" uid="uid://vvgpheda22ew" path="res://addons/guide/ui/renderers/mouse/icons/Mouse_Left_Key_Light.png" id="2_6vk7n"] +[ext_resource type="Texture2D" uid="uid://b8bsyguf4qw6f" path="res://addons/guide/ui/renderers/mouse/icons/Mouse_Right_Key_Light.png" id="3_aaqrj"] +[ext_resource type="Texture2D" uid="uid://bmj244x0jn7v2" path="res://addons/guide/ui/renderers/mouse/icons/Mouse_Middle_Key_Light.png" id="4_gprek"] +[ext_resource type="Texture2D" uid="uid://bqxly0g8pftxa" path="res://addons/guide/ui/renderers/mouse/icons/Mouse_Side_Key_2_Light.png" id="6_adi64"] +[ext_resource type="Texture2D" uid="uid://1swh072gtbb4" path="res://addons/guide/ui/renderers/textures/arrow_left.svg" id="6_fo4h0"] +[ext_resource type="Texture2D" uid="uid://je8rm7jk2nxd" path="res://addons/guide/ui/renderers/mouse/icons/Mouse_Side_Key_1_Light.png" id="7_bbgo7"] +[ext_resource type="Texture2D" uid="uid://cjvs04qsrj8ap" path="res://addons/guide/ui/renderers/textures/arrow_right.svg" id="7_t242p"] +[ext_resource type="Texture2D" uid="uid://ni6lsbx1d2hf" path="res://addons/guide/ui/renderers/textures/arrow_up.svg" id="8_a7prs"] +[ext_resource type="Texture2D" uid="uid://ci7icm3q4l1sg" path="res://addons/guide/ui/renderers/mouse/icons/Mouse_Cursor.png" id="8_g4vq6"] +[ext_resource type="Texture2D" uid="uid://oq2vvwgbdsh7" path="res://addons/guide/ui/renderers/textures/arrow_down.svg" id="9_dfyjd"] +[ext_resource type="Texture2D" uid="uid://bmgxqbypegjxh" path="res://addons/guide/ui/renderers/textures/arrow_horizontal.svg" id="12_xdqh7"] +[ext_resource type="Texture2D" uid="uid://b3uxk5agbpmab" path="res://addons/guide/ui/renderers/mouse/icons/Mouse_Simple_Key_Light.png" id="13_1bw2l"] +[ext_resource type="Texture2D" uid="uid://bu5nlug6uf03w" path="res://addons/guide/ui/renderers/textures/arrow_vertical.svg" id="13_yoogt"] + +[node name="MouseRenderer" type="MarginContainer"] +process_mode = 3 +offset_right = 100.0 +offset_bottom = 100.0 +size_flags_horizontal = 0 +script = ExtResource("1_amutf") + +[node name="HBoxContainer" type="HBoxContainer" parent="."] +layout_mode = 2 +size_flags_horizontal = 0 + +[node name="Controls" type="MarginContainer" parent="HBoxContainer"] +unique_name_in_owner = true +custom_minimum_size = Vector2(100, 100) +layout_mode = 2 + +[node name="MouseBlank" type="TextureRect" parent="HBoxContainer/Controls"] +unique_name_in_owner = true +visible = false +layout_mode = 2 +texture = ExtResource("13_1bw2l") +stretch_mode = 4 + +[node name="MouseLeft" type="TextureRect" parent="HBoxContainer/Controls"] +unique_name_in_owner = true +visible = false +layout_mode = 2 +texture = ExtResource("2_6vk7n") +stretch_mode = 4 + +[node name="MouseRight" type="TextureRect" parent="HBoxContainer/Controls"] +unique_name_in_owner = true +visible = false +layout_mode = 2 +texture = ExtResource("3_aaqrj") +stretch_mode = 4 + +[node name="MouseMiddle" type="TextureRect" parent="HBoxContainer/Controls"] +unique_name_in_owner = true +visible = false +layout_mode = 2 +texture = ExtResource("4_gprek") +stretch_mode = 4 + +[node name="MouseSideA" type="TextureRect" parent="HBoxContainer/Controls"] +unique_name_in_owner = true +visible = false +layout_mode = 2 +texture = ExtResource("7_bbgo7") +stretch_mode = 4 + +[node name="MouseSideB" type="TextureRect" parent="HBoxContainer/Controls"] +unique_name_in_owner = true +visible = false +layout_mode = 2 +texture = ExtResource("6_adi64") +stretch_mode = 4 + +[node name="MouseCursor" type="TextureRect" parent="HBoxContainer/Controls"] +unique_name_in_owner = true +visible = false +layout_mode = 2 +texture = ExtResource("8_g4vq6") +stretch_mode = 4 + +[node name="Directions" type="MarginContainer" parent="HBoxContainer"] +unique_name_in_owner = true +visible = false +custom_minimum_size = Vector2(100, 100) +layout_mode = 2 + +[node name="Left" type="TextureRect" parent="HBoxContainer/Directions"] +unique_name_in_owner = true +visible = false +layout_mode = 2 +texture = ExtResource("6_fo4h0") +stretch_mode = 4 + +[node name="Right" type="TextureRect" parent="HBoxContainer/Directions"] +unique_name_in_owner = true +visible = false +layout_mode = 2 +texture = ExtResource("7_t242p") +stretch_mode = 4 + +[node name="Up" type="TextureRect" parent="HBoxContainer/Directions"] +unique_name_in_owner = true +layout_mode = 2 +texture = ExtResource("8_a7prs") +stretch_mode = 4 + +[node name="Down" type="TextureRect" parent="HBoxContainer/Directions"] +unique_name_in_owner = true +layout_mode = 2 +texture = ExtResource("9_dfyjd") +stretch_mode = 4 + +[node name="Horizontal" type="TextureRect" parent="HBoxContainer/Directions"] +unique_name_in_owner = true +layout_mode = 2 +texture = ExtResource("12_xdqh7") +stretch_mode = 4 + +[node name="Vertical" type="TextureRect" parent="HBoxContainer/Directions"] +unique_name_in_owner = true +layout_mode = 2 +texture = ExtResource("13_yoogt") +stretch_mode = 4 diff --git a/addons/guide/ui/renderers/textures/action.svg b/addons/guide/ui/renderers/textures/action.svg new file mode 100644 index 0000000..1da724c --- /dev/null +++ b/addons/guide/ui/renderers/textures/action.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/addons/guide/ui/renderers/textures/action.svg.import b/addons/guide/ui/renderers/textures/action.svg.import new file mode 100644 index 0000000..7c0aa8d --- /dev/null +++ b/addons/guide/ui/renderers/textures/action.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://diwkvjkss2ie" +path="res://.godot/imported/action.svg-6100da2ab8ea5d289c6e91ccdfb53aca.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/guide/ui/renderers/textures/action.svg" +dest_files=["res://.godot/imported/action.svg-6100da2ab8ea5d289c6e91ccdfb53aca.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/guide/ui/renderers/textures/arrow_all_directions.svg b/addons/guide/ui/renderers/textures/arrow_all_directions.svg new file mode 100644 index 0000000..c0053b6 --- /dev/null +++ b/addons/guide/ui/renderers/textures/arrow_all_directions.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/addons/guide/ui/renderers/textures/arrow_all_directions.svg.import b/addons/guide/ui/renderers/textures/arrow_all_directions.svg.import new file mode 100644 index 0000000..20bd950 --- /dev/null +++ b/addons/guide/ui/renderers/textures/arrow_all_directions.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dwb1h8sfsccyy" +path="res://.godot/imported/arrow_all_directions.svg-c87a4938e66e69435ad57c677b38771f.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/guide/ui/renderers/textures/arrow_all_directions.svg" +dest_files=["res://.godot/imported/arrow_all_directions.svg-c87a4938e66e69435ad57c677b38771f.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/guide/ui/renderers/textures/arrow_down.svg b/addons/guide/ui/renderers/textures/arrow_down.svg new file mode 100644 index 0000000..b1a193a --- /dev/null +++ b/addons/guide/ui/renderers/textures/arrow_down.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/addons/guide/ui/renderers/textures/arrow_down.svg.import b/addons/guide/ui/renderers/textures/arrow_down.svg.import new file mode 100644 index 0000000..f624ed8 --- /dev/null +++ b/addons/guide/ui/renderers/textures/arrow_down.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://oq2vvwgbdsh7" +path="res://.godot/imported/arrow_down.svg-88a3b47c68c37638cef21944ad9cda50.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/guide/ui/renderers/textures/arrow_down.svg" +dest_files=["res://.godot/imported/arrow_down.svg-88a3b47c68c37638cef21944ad9cda50.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/guide/ui/renderers/textures/arrow_horizontal.svg b/addons/guide/ui/renderers/textures/arrow_horizontal.svg new file mode 100644 index 0000000..ae0146f --- /dev/null +++ b/addons/guide/ui/renderers/textures/arrow_horizontal.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/addons/guide/ui/renderers/textures/arrow_horizontal.svg.import b/addons/guide/ui/renderers/textures/arrow_horizontal.svg.import new file mode 100644 index 0000000..8975345 --- /dev/null +++ b/addons/guide/ui/renderers/textures/arrow_horizontal.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bmgxqbypegjxh" +path="res://.godot/imported/arrow_horizontal.svg-5fd469f78a3e46cba20723a7b243bca1.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/guide/ui/renderers/textures/arrow_horizontal.svg" +dest_files=["res://.godot/imported/arrow_horizontal.svg-5fd469f78a3e46cba20723a7b243bca1.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/guide/ui/renderers/textures/arrow_left.svg b/addons/guide/ui/renderers/textures/arrow_left.svg new file mode 100644 index 0000000..9f94969 --- /dev/null +++ b/addons/guide/ui/renderers/textures/arrow_left.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/addons/guide/ui/renderers/textures/arrow_left.svg.import b/addons/guide/ui/renderers/textures/arrow_left.svg.import new file mode 100644 index 0000000..2b22128 --- /dev/null +++ b/addons/guide/ui/renderers/textures/arrow_left.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://1swh072gtbb4" +path="res://.godot/imported/arrow_left.svg-2a189e6eec3713a64220cf9427e1f45c.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/guide/ui/renderers/textures/arrow_left.svg" +dest_files=["res://.godot/imported/arrow_left.svg-2a189e6eec3713a64220cf9427e1f45c.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/guide/ui/renderers/textures/arrow_right.svg b/addons/guide/ui/renderers/textures/arrow_right.svg new file mode 100644 index 0000000..7516511 --- /dev/null +++ b/addons/guide/ui/renderers/textures/arrow_right.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/addons/guide/ui/renderers/textures/arrow_right.svg.import b/addons/guide/ui/renderers/textures/arrow_right.svg.import new file mode 100644 index 0000000..2b784e3 --- /dev/null +++ b/addons/guide/ui/renderers/textures/arrow_right.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cjvs04qsrj8ap" +path="res://.godot/imported/arrow_right.svg-83b2fe427227f253ed212a8b1c56acb4.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/guide/ui/renderers/textures/arrow_right.svg" +dest_files=["res://.godot/imported/arrow_right.svg-83b2fe427227f253ed212a8b1c56acb4.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/guide/ui/renderers/textures/arrow_up.svg b/addons/guide/ui/renderers/textures/arrow_up.svg new file mode 100644 index 0000000..8b37520 --- /dev/null +++ b/addons/guide/ui/renderers/textures/arrow_up.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/addons/guide/ui/renderers/textures/arrow_up.svg.import b/addons/guide/ui/renderers/textures/arrow_up.svg.import new file mode 100644 index 0000000..83e63ee --- /dev/null +++ b/addons/guide/ui/renderers/textures/arrow_up.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ni6lsbx1d2hf" +path="res://.godot/imported/arrow_up.svg-56e16fd95d307eb9666c8ac4e78e2b97.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/guide/ui/renderers/textures/arrow_up.svg" +dest_files=["res://.godot/imported/arrow_up.svg-56e16fd95d307eb9666c8ac4e78e2b97.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/guide/ui/renderers/textures/arrow_vertical.svg b/addons/guide/ui/renderers/textures/arrow_vertical.svg new file mode 100644 index 0000000..2bf3493 --- /dev/null +++ b/addons/guide/ui/renderers/textures/arrow_vertical.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/addons/guide/ui/renderers/textures/arrow_vertical.svg.import b/addons/guide/ui/renderers/textures/arrow_vertical.svg.import new file mode 100644 index 0000000..7d87170 --- /dev/null +++ b/addons/guide/ui/renderers/textures/arrow_vertical.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bu5nlug6uf03w" +path="res://.godot/imported/arrow_vertical.svg-17983361d36ac9313b8d80f7240cf6aa.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/guide/ui/renderers/textures/arrow_vertical.svg" +dest_files=["res://.godot/imported/arrow_vertical.svg-17983361d36ac9313b8d80f7240cf6aa.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/guide/ui/renderers/touch/icons/touch_1_finger.png b/addons/guide/ui/renderers/touch/icons/touch_1_finger.png new file mode 100644 index 0000000000000000000000000000000000000000..86ef0be84e46d9a3074fd7cc74393b920f444372 GIT binary patch literal 5698 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 C|N8a- literal 0 HcmV?d00001 diff --git a/addons/guide/ui/renderers/touch/icons/touch_1_finger.png.import b/addons/guide/ui/renderers/touch/icons/touch_1_finger.png.import new file mode 100644 index 0000000..15f71ab --- /dev/null +++ b/addons/guide/ui/renderers/touch/icons/touch_1_finger.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c5nwnp5cjny7m" +path="res://.godot/imported/touch_1_finger.png-c21ed1a6c694f6c9460ef451efcf36e2.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/guide/ui/renderers/touch/icons/touch_1_finger.png" +dest_files=["res://.godot/imported/touch_1_finger.png-c21ed1a6c694f6c9460ef451efcf36e2.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/addons/guide/ui/renderers/touch/icons/touch_2_fingers.png b/addons/guide/ui/renderers/touch/icons/touch_2_fingers.png new file mode 100644 index 0000000000000000000000000000000000000000..354ff8dcd97728ddbe1bc7ef8c14bc97596bd17e GIT binary patch literal 6395 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 O2#L^oT&isT{(k`DElJV< literal 0 HcmV?d00001 diff --git a/addons/guide/ui/renderers/touch/icons/touch_2_fingers.png.import b/addons/guide/ui/renderers/touch/icons/touch_2_fingers.png.import new file mode 100644 index 0000000..5e7dfd6 --- /dev/null +++ b/addons/guide/ui/renderers/touch/icons/touch_2_fingers.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bllhe78a1yo6" +path="res://.godot/imported/touch_2_fingers.png-f5e5340b938b807b9249837228cb3c96.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/guide/ui/renderers/touch/icons/touch_2_fingers.png" +dest_files=["res://.godot/imported/touch_2_fingers.png-f5e5340b938b807b9249837228cb3c96.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/addons/guide/ui/renderers/touch/icons/touch_3_fingers.png b/addons/guide/ui/renderers/touch/icons/touch_3_fingers.png new file mode 100644 index 0000000000000000000000000000000000000000..09a07d90a405860b0e64a501c2f2cde4ece33408 GIT binary patch literal 6746 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

upJ?Am&Qq|Tb!@$5`VPSceIWaz7 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 Nqy$lytC2B}_#fGk<&ppZ literal 0 HcmV?d00001 diff --git a/addons/guide/ui/renderers/touch/icons/touch_4_fingers.png.import b/addons/guide/ui/renderers/touch/icons/touch_4_fingers.png.import new file mode 100644 index 0000000..02e6cd4 --- /dev/null +++ b/addons/guide/ui/renderers/touch/icons/touch_4_fingers.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cjw5m42gufghr" +path="res://.godot/imported/touch_4_fingers.png-feb0257c01dc7e2234eb7bd7feabd57d.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/guide/ui/renderers/touch/icons/touch_4_fingers.png" +dest_files=["res://.godot/imported/touch_4_fingers.png-feb0257c01dc7e2234eb7bd7feabd57d.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/addons/guide/ui/renderers/touch/icons/touch_rotate.png b/addons/guide/ui/renderers/touch/icons/touch_rotate.png new file mode 100644 index 0000000000000000000000000000000000000000..6c1af5b3b6fd3cd1a3b1d17fcc7d46d8a22962b2 GIT binary patch literal 5245 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 DSwAUU literal 0 HcmV?d00001 diff --git a/addons/guide/ui/renderers/touch/icons/touch_rotate.png.import b/addons/guide/ui/renderers/touch/icons/touch_rotate.png.import new file mode 100644 index 0000000..0975cd0 --- /dev/null +++ b/addons/guide/ui/renderers/touch/icons/touch_rotate.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bxj4t5vjx7o3w" +path="res://.godot/imported/touch_rotate.png-22fc9d2b74759b3c29981107fa4d935b.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/guide/ui/renderers/touch/icons/touch_rotate.png" +dest_files=["res://.godot/imported/touch_rotate.png-22fc9d2b74759b3c29981107fa4d935b.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/addons/guide/ui/renderers/touch/icons/touch_zoom.png b/addons/guide/ui/renderers/touch/icons/touch_zoom.png new file mode 100644 index 0000000000000000000000000000000000000000..37e0cb8a2903e44f1ebfad7d2e6a534a6a8efc03 GIT binary patch literal 5053 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 bool: + return input is GUIDEInputTouchAxis1D or \ + input is GUIDEInputTouchAxis2D or \ + input is GUIDEInputTouchPosition or \ + input is GUIDEInputTouchAngle or \ + input is GUIDEInputTouchDistance + + + +func render(input:GUIDEInput) -> void: + for child in _controls.get_children(): + child.visible = false + for child in _directions.get_children(): + child.visible = false + + _directions.visible = false + + if input is GUIDEInputTouchBase: + match input.finger_count: + 2: + _2_finger.visible = true + 3: + _3_finger.visible = true + 4: + _4_finger.visible = true + _: + # we have no icons for more than 4 fingers, so everything else gets + # the 1 finger icon + _1_finger.visible = true + + if input is GUIDEInputTouchAxis2D: + _directions.visible = true + _axis2d.visible = true + + if input is GUIDEInputTouchAxis1D: + _directions.visible = true + match input.axis: + GUIDEInputTouchAxis1D.GUIDEInputTouchAxis.X: + _horizontal.visible = true + GUIDEInputTouchAxis1D.GUIDEInputTouchAxis.X: + _vertical.visible = true + + if input is GUIDEInputTouchDistance: + _zoom.visible = true + + if input is GUIDEInputTouchAngle: + _rotate.visible = true + + call("queue_sort") + +func cache_key(input:GUIDEInput) -> String: + return "1f4c5082-d419-465f-aba8-f889caaff335" + input.to_string() diff --git a/addons/guide/ui/renderers/touch/touch_renderer.gd.uid b/addons/guide/ui/renderers/touch/touch_renderer.gd.uid new file mode 100644 index 0000000..b3ee4a7 --- /dev/null +++ b/addons/guide/ui/renderers/touch/touch_renderer.gd.uid @@ -0,0 +1 @@ +uid://birg7gy0a8mom diff --git a/addons/guide/ui/renderers/touch/touch_renderer.tscn b/addons/guide/ui/renderers/touch/touch_renderer.tscn new file mode 100644 index 0000000..b54a0e8 --- /dev/null +++ b/addons/guide/ui/renderers/touch/touch_renderer.tscn @@ -0,0 +1,93 @@ +[gd_scene load_steps=11 format=3 uid="uid://ykuou1deo5ub"] + +[ext_resource type="Script" path="res://addons/guide/ui/renderers/touch/touch_renderer.gd" id="1_heixj"] +[ext_resource type="Texture2D" uid="uid://c5nwnp5cjny7m" path="res://addons/guide/ui/renderers/touch/icons/touch_1_finger.png" id="2_4mplc"] +[ext_resource type="Texture2D" uid="uid://bllhe78a1yo6" path="res://addons/guide/ui/renderers/touch/icons/touch_2_fingers.png" id="3_0dcqu"] +[ext_resource type="Texture2D" uid="uid://bwhqf2nmm5q1w" path="res://addons/guide/ui/renderers/touch/icons/touch_3_fingers.png" id="4_mgq0v"] +[ext_resource type="Texture2D" uid="uid://cjw5m42gufghr" path="res://addons/guide/ui/renderers/touch/icons/touch_4_fingers.png" id="5_qoicp"] +[ext_resource type="Texture2D" uid="uid://bxj4t5vjx7o3w" path="res://addons/guide/ui/renderers/touch/icons/touch_rotate.png" id="6_4jaqi"] +[ext_resource type="Texture2D" uid="uid://cutplj0nhphk" path="res://addons/guide/ui/renderers/touch/icons/touch_zoom.png" id="7_gvy7l"] +[ext_resource type="Texture2D" uid="uid://bmgxqbypegjxh" path="res://addons/guide/ui/renderers/textures/arrow_horizontal.svg" id="8_m5om5"] +[ext_resource type="Texture2D" uid="uid://dwb1h8sfsccyy" path="res://addons/guide/ui/renderers/textures/arrow_all_directions.svg" id="9_5gr2q"] +[ext_resource type="Texture2D" uid="uid://bu5nlug6uf03w" path="res://addons/guide/ui/renderers/textures/arrow_vertical.svg" id="10_4vghq"] + +[node name="TouchRenderer" type="MarginContainer"] +offset_right = 100.0 +offset_bottom = 100.0 +size_flags_horizontal = 0 +script = ExtResource("1_heixj") + +[node name="HBoxContainer" type="HBoxContainer" parent="."] +layout_mode = 2 +size_flags_horizontal = 0 + +[node name="Controls" type="MarginContainer" parent="HBoxContainer"] +unique_name_in_owner = true +custom_minimum_size = Vector2(100, 100) +layout_mode = 2 + +[node name="T1Finger" type="TextureRect" parent="HBoxContainer/Controls"] +unique_name_in_owner = true +visible = false +layout_mode = 2 +texture = ExtResource("2_4mplc") +stretch_mode = 4 + +[node name="T2Fingers" type="TextureRect" parent="HBoxContainer/Controls"] +unique_name_in_owner = true +visible = false +layout_mode = 2 +texture = ExtResource("3_0dcqu") +stretch_mode = 4 + +[node name="T3Fingers" type="TextureRect" parent="HBoxContainer/Controls"] +unique_name_in_owner = true +visible = false +layout_mode = 2 +texture = ExtResource("4_mgq0v") +stretch_mode = 4 + +[node name="T4Fingers" type="TextureRect" parent="HBoxContainer/Controls"] +unique_name_in_owner = true +visible = false +layout_mode = 2 +texture = ExtResource("5_qoicp") +stretch_mode = 4 + +[node name="Rotate" type="TextureRect" parent="HBoxContainer/Controls"] +unique_name_in_owner = true +visible = false +layout_mode = 2 +texture = ExtResource("6_4jaqi") +stretch_mode = 4 + +[node name="Zoom" type="TextureRect" parent="HBoxContainer/Controls"] +unique_name_in_owner = true +visible = false +layout_mode = 2 +texture = ExtResource("7_gvy7l") +stretch_mode = 4 + +[node name="Directions" type="MarginContainer" parent="HBoxContainer"] +unique_name_in_owner = true +visible = false +custom_minimum_size = Vector2(100, 100) +layout_mode = 2 + +[node name="Horizontal" type="TextureRect" parent="HBoxContainer/Directions"] +unique_name_in_owner = true +layout_mode = 2 +texture = ExtResource("8_m5om5") +stretch_mode = 4 + +[node name="Vertical" type="TextureRect" parent="HBoxContainer/Directions"] +unique_name_in_owner = true +layout_mode = 2 +texture = ExtResource("10_4vghq") +stretch_mode = 4 + +[node name="Axis2D" type="TextureRect" parent="HBoxContainer/Directions"] +unique_name_in_owner = true +layout_mode = 2 +texture = ExtResource("9_5gr2q") +stretch_mode = 4 diff --git a/addons/guide/ui/text_providers/controllers/controller_text_provider.gd b/addons/guide/ui/text_providers/controllers/controller_text_provider.gd new file mode 100644 index 0000000..3a569ee --- /dev/null +++ b/addons/guide/ui/text_providers/controllers/controller_text_provider.gd @@ -0,0 +1,115 @@ +extends GUIDETextProvider + +func _init(): + priority = -1 + +func _controller_names() -> Array[String]: + return [] + +func _a_button_name() -> String: + return "A" + +func _b_button_name() -> String: + return "B" + +func _x_button_name() -> String: + return "X" + +func _y_button_name() -> String: + return "Y" + +func _left_bumper_name() -> String: + return "LB" + +func _right_bumper_name() -> String: + return "RB" + +func _left_trigger_name() -> String: + return "LT" + +func _right_trigger_name() -> String: + return "RT" + +func _back_button_name() -> String: + return "Back" + +func _misc_1_button_name() -> String: + return "Misc 1" + +func _start_button_name() -> String: + return "Start" + + +func supports(input:GUIDEInput) -> bool: + var controller_name = GUIDEInputFormatter._joy_name_for_input(input) + if controller_name == "": + return false + + var haystack = controller_name.to_lower() + for needle in _controller_names(): + if haystack.contains(needle.to_lower()): + return true + + return false + +func _format(input:String) -> String: + return "[%s]" % [input] + + +func get_text(input:GUIDEInput) -> String: + if input is GUIDEInputJoyAxis1D: + match input.axis: + JOY_AXIS_LEFT_X: + return _format(tr("Left Stick Horizontal")) + JOY_AXIS_LEFT_Y: + return _format(tr("Left Stick Vertical")) + JOY_AXIS_RIGHT_X: + return _format(tr("Right Stick Horizontal")) + JOY_AXIS_RIGHT_Y: + return _format(tr("Right Stick Vertical")) + JOY_AXIS_TRIGGER_LEFT: + return _format(tr(_left_trigger_name())) + JOY_AXIS_TRIGGER_RIGHT: + return _format(tr(_right_trigger_name())) + + if input is GUIDEInputJoyAxis2D: + match input.x: + JOY_AXIS_LEFT_X, JOY_AXIS_LEFT_Y: + return _format(tr("Left Stick")) + JOY_AXIS_RIGHT_X, JOY_AXIS_RIGHT_Y: + return _format(tr("Right Stick")) + + if input is GUIDEInputJoyButton: + match input.button: + JOY_BUTTON_A: + return _format(tr(_a_button_name())) + JOY_BUTTON_B: + return _format(tr(_b_button_name())) + JOY_BUTTON_X: + return _format(tr(_x_button_name())) + JOY_BUTTON_Y: + return _format(tr(_y_button_name())) + JOY_BUTTON_DPAD_LEFT: + return _format(tr("DPAD Left")) + JOY_BUTTON_DPAD_RIGHT: + return _format(tr("DPAD Right")) + JOY_BUTTON_DPAD_UP: + return _format(tr("DPAD Up")) + JOY_BUTTON_DPAD_DOWN: + return _format(tr("DPAD Down")) + JOY_BUTTON_LEFT_SHOULDER: + return _format(tr(_left_bumper_name())) + JOY_BUTTON_RIGHT_SHOULDER: + return _format(tr(_right_bumper_name())) + JOY_BUTTON_LEFT_STICK: + return _format(tr("Left Stick")) + JOY_BUTTON_RIGHT_STICK: + return _format(tr("Right Stick")) + JOY_BUTTON_BACK: + return _format(tr(_back_button_name())) + JOY_BUTTON_MISC1: + return _format(tr(_misc_1_button_name())) + JOY_BUTTON_START: + return _format(tr(_start_button_name())) + + return _format("??") diff --git a/addons/guide/ui/text_providers/controllers/controller_text_provider.gd.uid b/addons/guide/ui/text_providers/controllers/controller_text_provider.gd.uid new file mode 100644 index 0000000..1088756 --- /dev/null +++ b/addons/guide/ui/text_providers/controllers/controller_text_provider.gd.uid @@ -0,0 +1 @@ +uid://drnn2tb5xp5li diff --git a/addons/guide/ui/text_providers/controllers/playstation/playstation_controller_text_provider.gd b/addons/guide/ui/text_providers/controllers/playstation/playstation_controller_text_provider.gd new file mode 100644 index 0000000..786f145 --- /dev/null +++ b/addons/guide/ui/text_providers/controllers/playstation/playstation_controller_text_provider.gd @@ -0,0 +1,37 @@ +extends "res://addons/guide/ui/text_providers/controllers/controller_text_provider.gd" + +func _controller_names() -> Array[String]: + return ["DualSense", "DualShock", "Playstation", "PS3", "PS4", "PS5"] + +func _a_button_name() -> String: + return "Cross" + +func _b_button_name() -> String: + return "Circle" + +func _x_button_name() -> String: + return "Square" + +func _y_button_name() -> String: + return "Triangle" + +func _left_bumper_name() -> String: + return "L1" + +func _right_bumper_name() -> String: + return "R1" + +func _left_trigger_name() -> String: + return "L2" + +func _right_trigger_name() -> String: + return "R2" + +func _back_button_name() -> String: + return "Share" + +func _misc_1_button_name() -> String: + return "Microphone" + +func _start_button_name() -> String: + return "Options" diff --git a/addons/guide/ui/text_providers/controllers/playstation/playstation_controller_text_provider.gd.uid b/addons/guide/ui/text_providers/controllers/playstation/playstation_controller_text_provider.gd.uid new file mode 100644 index 0000000..35984e4 --- /dev/null +++ b/addons/guide/ui/text_providers/controllers/playstation/playstation_controller_text_provider.gd.uid @@ -0,0 +1 @@ +uid://cbsxonq3kwsx3 diff --git a/addons/guide/ui/text_providers/controllers/switch/switch_controller_text_provider.gd b/addons/guide/ui/text_providers/controllers/switch/switch_controller_text_provider.gd new file mode 100644 index 0000000..97fbe5d --- /dev/null +++ b/addons/guide/ui/text_providers/controllers/switch/switch_controller_text_provider.gd @@ -0,0 +1,37 @@ +extends "res://addons/guide/ui/text_providers/controllers/controller_text_provider.gd" + +func _controller_names() -> Array[String]: + return ["Nintendo Switch"] + +func _a_button_name() -> String: + return "B" + +func _b_button_name() -> String: + return "A" + +func _x_button_name() -> String: + return "Y" + +func _y_button_name() -> String: + return "X" + +func _left_bumper_name() -> String: + return "L" + +func _right_bumper_name() -> String: + return "R" + +func _left_trigger_name() -> String: + return "ZL" + +func _right_trigger_name() -> String: + return "ZR" + +func _back_button_name() -> String: + return "-" + +func _misc_1_button_name() -> String: + return "Square" + +func _start_button_name() -> String: + return "+" diff --git a/addons/guide/ui/text_providers/controllers/switch/switch_controller_text_provider.gd.uid b/addons/guide/ui/text_providers/controllers/switch/switch_controller_text_provider.gd.uid new file mode 100644 index 0000000..24fa650 --- /dev/null +++ b/addons/guide/ui/text_providers/controllers/switch/switch_controller_text_provider.gd.uid @@ -0,0 +1 @@ +uid://cjlop0xk86bnt diff --git a/addons/guide/ui/text_providers/controllers/xbox/xbox_controller_text_provider.gd b/addons/guide/ui/text_providers/controllers/xbox/xbox_controller_text_provider.gd new file mode 100644 index 0000000..1d044d7 --- /dev/null +++ b/addons/guide/ui/text_providers/controllers/xbox/xbox_controller_text_provider.gd @@ -0,0 +1,37 @@ +extends "res://addons/guide/ui/text_providers/controllers/controller_text_provider.gd" + +func _controller_names() -> Array[String]: + return ["XInput", "XBox"] + +func _a_button_name() -> String: + return "A" + +func _b_button_name() -> String: + return "B" + +func _x_button_name() -> String: + return "X" + +func _y_button_name() -> String: + return "Y" + +func _left_bumper_name() -> String: + return "LB" + +func _right_bumper_name() -> String: + return "RB" + +func _left_trigger_name() -> String: + return "LT" + +func _right_trigger_name() -> String: + return "RT" + +func _back_button_name() -> String: + return "View" + +func _misc_1_button_name() -> String: + return "Share" + +func _start_button_name() -> String: + return "Menu" diff --git a/addons/guide/ui/text_providers/controllers/xbox/xbox_controller_text_provider.gd.uid b/addons/guide/ui/text_providers/controllers/xbox/xbox_controller_text_provider.gd.uid new file mode 100644 index 0000000..0df0965 --- /dev/null +++ b/addons/guide/ui/text_providers/controllers/xbox/xbox_controller_text_provider.gd.uid @@ -0,0 +1 @@ +uid://d04a556ciqq35 diff --git a/addons/guide/ui/text_providers/default_text_provider.gd b/addons/guide/ui/text_providers/default_text_provider.gd new file mode 100644 index 0000000..c9ce6af --- /dev/null +++ b/addons/guide/ui/text_providers/default_text_provider.gd @@ -0,0 +1,141 @@ +extends GUIDETextProvider + +var _is_on_desktop:bool = false + +func _init(): + priority = 0 + _is_on_desktop = OS.has_feature("linuxbsd") or OS.has_feature("macos") or OS.has_feature("windows") + +func supports(input:GUIDEInput) -> bool: + return true + + +func _format(input:String) -> String: + return "[%s]" % [input] + + +func get_text(input:GUIDEInput) -> String: + if input is GUIDEInputKey: + var result:PackedStringArray = [] + if input.control: + var ctrl = GUIDEInputKey.new() + ctrl.key = KEY_CTRL + result.append(get_text(ctrl)) + if input.alt: + var alt = GUIDEInputKey.new() + alt.key = KEY_ALT + result.append(get_text(alt)) + if input.shift: + var shift = GUIDEInputKey.new() + shift.key = KEY_SHIFT + result.append(get_text(shift)) + if input.meta: + var meta = GUIDEInputKey.new() + meta.key = KEY_META + result.append(get_text(meta)) + + var the_key = input.key + + # if we are on desktop, translate the physical keycode into the actual label + # this is not supported on mobile, so we have to check + if _is_on_desktop: + the_key = DisplayServer.keyboard_get_label_from_physical(input.key) + + + result.append(_format(OS.get_keycode_string(the_key))) + return "+".join(result) + + if input is GUIDEInputMouseAxis1D: + match input.axis: + GUIDEInputMouseAxis1D.GUIDEInputMouseAxis.X: + return _format(tr("Mouse Left/Right")) + GUIDEInputMouseAxis1D.GUIDEInputMouseAxis.Y: + return _format(tr("Mouse Up/Down")) + + if input is GUIDEInputMouseAxis2D: + return _format(tr("Mouse")) + + if input is GUIDEInputMouseButton: + match input.button: + MOUSE_BUTTON_LEFT: + return _format(tr("Left Mouse Button")) + MOUSE_BUTTON_RIGHT: + return _format(tr("Right Mouse Button")) + MOUSE_BUTTON_MIDDLE: + return _format(tr("Middle Mouse Button")) + MOUSE_BUTTON_WHEEL_UP: + return _format(tr("Mouse Wheel Up")) + MOUSE_BUTTON_WHEEL_DOWN: + return _format(tr("Mouse Wheel Down")) + MOUSE_BUTTON_WHEEL_LEFT: + return _format(tr("Mouse Wheel Left")) + MOUSE_BUTTON_WHEEL_RIGHT: + return _format(tr("Mouse Wheel Right")) + MOUSE_BUTTON_XBUTTON1: + return _format(tr("Mouse Side 1")) + MOUSE_BUTTON_XBUTTON2: + return _format(tr("Mouse Side 2")) + + if input is GUIDEInputJoyAxis1D: + match input.axis: + JOY_AXIS_LEFT_X: + return _format(tr("Stick 1 Horizontal")) + JOY_AXIS_LEFT_Y: + return _format(tr("Stick 1 Vertical")) + JOY_AXIS_RIGHT_X: + return _format(tr("Stick 2 Horizontal")) + JOY_AXIS_RIGHT_Y: + return _format(tr("Stick 2 Vertical")) + JOY_AXIS_TRIGGER_LEFT: + return _format(tr("Axis 3")) + JOY_AXIS_TRIGGER_RIGHT: + return _format(tr("Axis 4")) + + if input is GUIDEInputJoyAxis2D: + match input.x: + JOY_AXIS_LEFT_X, JOY_AXIS_LEFT_Y: + return _format(tr("Stick 1")) + JOY_AXIS_RIGHT_X, JOY_AXIS_RIGHT_Y: + return _format(tr("Stick 2")) + + if input is GUIDEInputJoyButton: + return _format(tr("Joy %s") % [input.button]) + + + if input is GUIDEInputAction: + return _format(tr("Action %s") % ["?" if input.action == null else input.action._editor_name()]) + + if input is GUIDEInputAny: + var parts:Array[String] = [] + if input.joy: + parts.append(tr("Joy Button")) + if input.mouse: + parts.append(tr("Mouse Button")) + if input.keyboard: + parts.append(tr("Key")) + + return _format(tr("Any %s") % [ "/".join(parts) ] ) + + if input is GUIDEInputMousePosition: + return _format(tr("Mouse Position")) + + if input is GUIDEInputTouchPosition: + return _format(tr("Touch Position %s") % [input.finger_index if input.finger_index >= 0 else "Average"]) + + if input is GUIDEInputTouchAngle: + return _format(tr("Touch Angle")) + + if input is GUIDEInputTouchDistance: + return _format(tr("Touch Distance")) + + if input is GUIDEInputTouchAxis1D: + match input.axis: + GUIDEInputTouchAxis1D.GUIDEInputTouchAxis.X: + _format(tr("Touch Left/Right %s") % [input.finger_index if input.finger_index >= 0 else "Average"]) + GUIDEInputTouchAxis1D.GUIDEInputTouchAxis.Y: + _format(tr("Touch Up/Down %s") % [input.finger_index if input.finger_index >= 0 else "Average"]) + + if input is GUIDEInputTouchAxis2D: + return _format(tr("Touch Axis 2D %s") % [input.finger_index if input.finger_index >= 0 else "Average"]) + + return _format("??") diff --git a/addons/guide/ui/text_providers/default_text_provider.gd.uid b/addons/guide/ui/text_providers/default_text_provider.gd.uid new file mode 100644 index 0000000..ab6759d --- /dev/null +++ b/addons/guide/ui/text_providers/default_text_provider.gd.uid @@ -0,0 +1 @@ +uid://cpsrogavf5hy7 diff --git a/guide_examples/2d_axis_mapping/2d_axis_mapping.gd b/guide_examples/2d_axis_mapping/2d_axis_mapping.gd new file mode 100644 index 0000000..40a6fba --- /dev/null +++ b/guide_examples/2d_axis_mapping/2d_axis_mapping.gd @@ -0,0 +1,6 @@ +extends Node + +@export var mapping_context:GUIDEMappingContext + +func _ready(): + GUIDE.enable_mapping_context(mapping_context) diff --git a/guide_examples/2d_axis_mapping/2d_axis_mapping.gd.uid b/guide_examples/2d_axis_mapping/2d_axis_mapping.gd.uid new file mode 100644 index 0000000..d9aef0e --- /dev/null +++ b/guide_examples/2d_axis_mapping/2d_axis_mapping.gd.uid @@ -0,0 +1 @@ +uid://cl57fk6xess4f diff --git a/guide_examples/2d_axis_mapping/2d_axis_mapping.tscn b/guide_examples/2d_axis_mapping/2d_axis_mapping.tscn new file mode 100644 index 0000000..bd60dd3 --- /dev/null +++ b/guide_examples/2d_axis_mapping/2d_axis_mapping.tscn @@ -0,0 +1,42 @@ +[gd_scene load_steps=9 format=3 uid="uid://dvbxt8jyo8okq"] + +[ext_resource type="Texture2D" uid="uid://byjxtsekdl8t2" path="res://guide_examples/shared/godot_logo.svg" id="1_4tef3"] +[ext_resource type="Script" path="res://guide_examples/2d_axis_mapping/2d_axis_mapping.gd" id="1_vdstu"] +[ext_resource type="Script" path="res://guide_examples/2d_axis_mapping/player.gd" id="2_54pxx"] +[ext_resource type="Resource" uid="uid://2hl7iqpondhi" path="res://guide_examples/input_scheme_switching/mapping_contexts/keyboard_scheme.tres" id="2_jtcd0"] +[ext_resource type="PackedScene" uid="uid://dkr80d2pi0d41" path="res://addons/guide/debugger/guide_debugger.tscn" id="5_ewox0"] +[ext_resource type="Script" path="res://guide_examples/shared/instructions_label.gd" id="5_h0lne"] +[ext_resource type="Resource" uid="uid://cxn2ibe1mn3sb" path="res://guide_examples/input_scheme_switching/mapping_contexts/actions/move.tres" id="8_581qd"] +[ext_resource type="Theme" uid="uid://dot0gi1yoqmrl" path="res://guide_examples/shared/ui_theme.tres" id="8_p4vbo"] + +[node name="2DAxisMapping" type="Node"] +script = ExtResource("1_vdstu") +mapping_context = ExtResource("2_jtcd0") + +[node name="Player" type="Sprite2D" parent="."] +position = Vector2(546, 317) +texture = ExtResource("1_4tef3") +script = ExtResource("2_54pxx") +move_action = ExtResource("8_581qd") + +[node name="UI Layer" type="CanvasLayer" parent="."] + +[node name="Instructions Label" type="RichTextLabel" parent="UI Layer"] +anchors_preset = 1 +anchor_left = 1.0 +anchor_right = 1.0 +offset_left = -286.0 +offset_top = 24.0 +offset_right = -39.0 +offset_bottom = 47.0 +grow_horizontal = 0 +theme = ExtResource("8_p4vbo") +script = ExtResource("5_h0lne") +instructions_text = "Use %s to move the player." +actions = Array[Resource("res://addons/guide/guide_action.gd")]([ExtResource("8_581qd")]) + +[node name="Debug Layer" type="CanvasLayer" parent="."] + +[node name="GuideDebugger" parent="Debug Layer" instance=ExtResource("5_ewox0")] +theme = ExtResource("8_p4vbo") +metadata/_edit_lock_ = true diff --git a/guide_examples/2d_axis_mapping/mapping_contexts/2d_axis_mapping.tres b/guide_examples/2d_axis_mapping/mapping_contexts/2d_axis_mapping.tres new file mode 100644 index 0000000..c4830a2 --- /dev/null +++ b/guide_examples/2d_axis_mapping/mapping_contexts/2d_axis_mapping.tres @@ -0,0 +1,115 @@ +[gd_resource type="Resource" script_class="GUIDEMappingContext" load_steps=21 format=3 uid="uid://2hl7iqpondhj"] + +[ext_resource type="Resource" uid="uid://cxn2ibe1mn3sb" path="res://guide_examples/input_scheme_switching/mapping_contexts/actions/move.tres" id="1_5vw7l"] +[ext_resource type="Script" path="res://addons/guide/inputs/guide_input_key.gd" id="2_0yrlp"] +[ext_resource type="Script" path="res://addons/guide/guide_input_mapping.gd" id="3_ad6sj"] +[ext_resource type="Script" path="res://addons/guide/modifiers/guide_modifier_negate.gd" id="3_nlxx1"] +[ext_resource type="Script" path="res://addons/guide/guide_action_mapping.gd" id="4_16vkk"] +[ext_resource type="Script" path="res://addons/guide/modifiers/guide_modifier_input_swizzle.gd" id="5_qr6a5"] +[ext_resource type="Script" path="res://addons/guide/guide_mapping_context.gd" id="8_r1avn"] + +[sub_resource type="Resource" id="Resource_t51n6"] +script = ExtResource("2_0yrlp") +key = 87 +shift = false +control = false +alt = false +meta = false +allow_additional_modifiers = true + +[sub_resource type="Resource" id="Resource_ct0te"] +script = ExtResource("3_nlxx1") +x = true +y = true +z = true + +[sub_resource type="Resource" id="Resource_qm6gq"] +script = ExtResource("5_qr6a5") +order = 0 + +[sub_resource type="Resource" id="Resource_yewp7"] +script = ExtResource("3_ad6sj") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_t51n6") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([SubResource("Resource_ct0te"), SubResource("Resource_qm6gq")]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([]) + +[sub_resource type="Resource" id="Resource_c40re"] +script = ExtResource("2_0yrlp") +key = 65 +shift = false +control = false +alt = false +meta = false +allow_additional_modifiers = true + +[sub_resource type="Resource" id="Resource_rkxfa"] +script = ExtResource("3_nlxx1") +x = true +y = true +z = true + +[sub_resource type="Resource" id="Resource_6qgwf"] +script = ExtResource("3_ad6sj") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_c40re") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([SubResource("Resource_rkxfa")]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([]) + +[sub_resource type="Resource" id="Resource_2t3ts"] +script = ExtResource("2_0yrlp") +key = 83 +shift = false +control = false +alt = false +meta = false +allow_additional_modifiers = true + +[sub_resource type="Resource" id="Resource_eoiu5"] +script = ExtResource("5_qr6a5") +order = 0 + +[sub_resource type="Resource" id="Resource_bilhe"] +script = ExtResource("3_ad6sj") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_2t3ts") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([SubResource("Resource_eoiu5")]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([]) + +[sub_resource type="Resource" id="Resource_lften"] +script = ExtResource("2_0yrlp") +key = 68 +shift = false +control = false +alt = false +meta = false +allow_additional_modifiers = true + +[sub_resource type="Resource" id="Resource_v2qov"] +script = ExtResource("3_ad6sj") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_lften") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([]) + +[sub_resource type="Resource" id="Resource_u0xy6"] +script = ExtResource("4_16vkk") +action = ExtResource("1_5vw7l") +input_mappings = Array[ExtResource("3_ad6sj")]([SubResource("Resource_yewp7"), SubResource("Resource_6qgwf"), SubResource("Resource_bilhe"), SubResource("Resource_v2qov")]) + +[resource] +script = ExtResource("8_r1avn") +display_name = "" +mappings = Array[ExtResource("4_16vkk")]([SubResource("Resource_u0xy6")]) diff --git a/guide_examples/2d_axis_mapping/mapping_contexts/move.tres b/guide_examples/2d_axis_mapping/mapping_contexts/move.tres new file mode 100644 index 0000000..e7a9540 --- /dev/null +++ b/guide_examples/2d_axis_mapping/mapping_contexts/move.tres @@ -0,0 +1,12 @@ +[gd_resource type="Resource" script_class="GUIDEAction" load_steps=2 format=3 uid="uid://cxn2ibe1mn3sa"] + +[ext_resource type="Script" path="res://addons/guide/guide_action.gd" id="1_anxy1"] + +[resource] +script = ExtResource("1_anxy1") +name = &"" +action_value_type = 2 +emit_as_godot_actions = false +is_remappable = false +display_name = "" +display_category = "" diff --git a/guide_examples/2d_axis_mapping/player.gd b/guide_examples/2d_axis_mapping/player.gd new file mode 100644 index 0000000..36e5569 --- /dev/null +++ b/guide_examples/2d_axis_mapping/player.gd @@ -0,0 +1,10 @@ +## A very simple player script for a player who can only move. +extends Node2D + +@export var speed:float = 300 +@export var move_action:GUIDEAction + +func _process(delta:float) -> void: + # GUIDE already gives us a full 2D axis. We don't need to build it + # ourselves using Input.get_vector. + position += move_action.value_axis_2d.normalized() * speed * delta diff --git a/guide_examples/2d_axis_mapping/player.gd.uid b/guide_examples/2d_axis_mapping/player.gd.uid new file mode 100644 index 0000000..7895c7b --- /dev/null +++ b/guide_examples/2d_axis_mapping/player.gd.uid @@ -0,0 +1 @@ +uid://b3l3w1askqxgo diff --git a/guide_examples/action_priority/action_priority.gd b/guide_examples/action_priority/action_priority.gd new file mode 100644 index 0000000..b862bf4 --- /dev/null +++ b/guide_examples/action_priority/action_priority.gd @@ -0,0 +1,14 @@ +extends Node2D + + +@export var mapping_context:GUIDEMappingContext +@export var spell_toggle:GUIDEAction + +@onready var _layer_1:Control = %Layer1 +@onready var _layer_2:Control = %Layer2 + + +func _ready(): + GUIDE.enable_mapping_context(mapping_context) + spell_toggle.triggered.connect(func(): _layer_1.hide(); _layer_2.show()) + spell_toggle.completed.connect(func(): _layer_1.show(); _layer_2.hide()) diff --git a/guide_examples/action_priority/action_priority.gd.uid b/guide_examples/action_priority/action_priority.gd.uid new file mode 100644 index 0000000..11f1293 --- /dev/null +++ b/guide_examples/action_priority/action_priority.gd.uid @@ -0,0 +1 @@ +uid://cycxhrywjuggp diff --git a/guide_examples/action_priority/action_priority.tscn b/guide_examples/action_priority/action_priority.tscn new file mode 100644 index 0000000..30a7120 --- /dev/null +++ b/guide_examples/action_priority/action_priority.tscn @@ -0,0 +1,125 @@ +[gd_scene load_steps=25 format=3 uid="uid://c03o20jchp7kb"] + +[ext_resource type="Script" path="res://guide_examples/action_priority/action_priority.gd" id="1_segid"] +[ext_resource type="Resource" uid="uid://ragqbe7yjfwe" path="res://guide_examples/action_priority/mapping_contexts/action_priority.tres" id="2_spx2e"] +[ext_resource type="Resource" uid="uid://c5eq1avod0lu8" path="res://guide_examples/action_priority/mapping_contexts/actions/spell_toggle.tres" id="3_k38f6"] +[ext_resource type="PackedScene" uid="uid://dkr80d2pi0d41" path="res://addons/guide/debugger/guide_debugger.tscn" id="3_ocaq1"] +[ext_resource type="Theme" uid="uid://dot0gi1yoqmrl" path="res://guide_examples/shared/ui_theme.tres" id="4_ur8xb"] +[ext_resource type="Script" path="res://guide_examples/shared/instructions_label.gd" id="4_v7mqo"] +[ext_resource type="Resource" uid="uid://esf4ilpf0inv" path="res://guide_examples/action_priority/mapping_contexts/actions/acid_bolt.tres" id="5_oqj0p"] +[ext_resource type="Resource" uid="uid://bhq3gby2yiibf" path="res://guide_examples/action_priority/mapping_contexts/actions/acid_enchantment.tres" id="6_ue1ny"] +[ext_resource type="PackedScene" uid="uid://bsv0uwfyqbbbw" path="res://guide_examples/action_priority/dpad_spells/dpad_spells.tscn" id="7_48cit"] +[ext_resource type="Resource" uid="uid://cdhpb7yuq5pkb" path="res://guide_examples/action_priority/mapping_contexts/actions/mana_bolt.tres" id="7_ruu3d"] +[ext_resource type="Texture2D" uid="uid://emjksgvvx8kr" path="res://guide_examples/action_priority/icons/fireball-acid-3.png" id="8_pbht4"] +[ext_resource type="Resource" uid="uid://dsp8h1ycwd6tt" path="res://guide_examples/action_priority/mapping_contexts/actions/heal.tres" id="8_tl0ch"] +[ext_resource type="Texture2D" uid="uid://do0b76wher5pk" path="res://guide_examples/action_priority/icons/fireball-sky-3.png" id="9_6ehip"] +[ext_resource type="Resource" uid="uid://b5plj56pss47x" path="res://guide_examples/action_priority/mapping_contexts/actions/shield.tres" id="9_rbwtd"] +[ext_resource type="Texture2D" uid="uid://bb2whckygsgvj" path="res://guide_examples/action_priority/icons/heal-royal-3.png" id="10_vp0as"] +[ext_resource type="Resource" uid="uid://do3hivxhwoqvi" path="res://guide_examples/action_priority/mapping_contexts/actions/mana_enchantment.tres" id="11_223o5"] +[ext_resource type="Texture2D" uid="uid://dvy7bcy022rqq" path="res://guide_examples/action_priority/icons/protect-blue-2.png" id="11_t3r7p"] +[ext_resource type="Texture2D" uid="uid://dbwgq8udtj2hp" path="res://guide_examples/action_priority/icons/enchant-acid-3.png" id="12_2ht6b"] +[ext_resource type="Resource" uid="uid://dtr3jy86gc3rk" path="res://guide_examples/action_priority/mapping_contexts/actions/healing_enchantment.tres" id="12_4o7kv"] +[ext_resource type="Resource" uid="uid://bfskfiw1k8574" path="res://guide_examples/action_priority/mapping_contexts/actions/fire_enchantment.tres" id="13_6g6j5"] +[ext_resource type="Texture2D" uid="uid://b3j6yx4455rj0" path="res://guide_examples/action_priority/icons/enchant-blue-3.png" id="13_yufl8"] +[ext_resource type="Texture2D" uid="uid://djexj402ii0qp" path="res://guide_examples/action_priority/icons/enchant-jade-3.png" id="14_dpiqo"] +[ext_resource type="PackedScene" uid="uid://cx8f0hljh5dhs" path="res://guide_examples/action_priority/spell_indicator/spell_indicator.tscn" id="14_gmycm"] +[ext_resource type="Texture2D" uid="uid://bcls6cfcyhf0t" path="res://guide_examples/action_priority/icons/enchant-red-3.png" id="15_xjepw"] + +[node name="ActionPriority" type="Node2D"] +script = ExtResource("1_segid") +mapping_context = ExtResource("2_spx2e") +spell_toggle = ExtResource("3_k38f6") + +[node name="UILayer" type="CanvasLayer" parent="."] + +[node name="Instructions Label" type="RichTextLabel" parent="UILayer"] +anchors_preset = 1 +anchor_left = 1.0 +anchor_right = 1.0 +offset_left = -78.0 +offset_top = 19.0 +offset_right = -38.0 +offset_bottom = 42.0 +grow_horizontal = 0 +theme = ExtResource("4_ur8xb") +script = ExtResource("4_v7mqo") +instructions_text = "%s - acid bolt +%s - mana bolt +%s - heal +%s - shield +%s - acid enchantment +%s - mana enchantment +%s - healing enchantment +%s - fire enchantment" +actions = Array[Resource("res://addons/guide/guide_action.gd")]([ExtResource("5_oqj0p"), ExtResource("7_ruu3d"), ExtResource("8_tl0ch"), ExtResource("9_rbwtd"), ExtResource("6_ue1ny"), ExtResource("11_223o5"), ExtResource("12_4o7kv"), ExtResource("13_6g6j5")]) + +[node name="SpellIndicators" type="Node2D" parent="UILayer"] +position = Vector2(1149, 781) + +[node name="AcidBolt" parent="UILayer/SpellIndicators" instance=ExtResource("14_gmycm")] +action = ExtResource("5_oqj0p") +texture = ExtResource("8_pbht4") + +[node name="ManaBolt" parent="UILayer/SpellIndicators" instance=ExtResource("14_gmycm")] +action = ExtResource("7_ruu3d") +texture = ExtResource("9_6ehip") + +[node name="Heal" parent="UILayer/SpellIndicators" instance=ExtResource("14_gmycm")] +action = ExtResource("8_tl0ch") +texture = ExtResource("10_vp0as") + +[node name="Shield" parent="UILayer/SpellIndicators" instance=ExtResource("14_gmycm")] +action = ExtResource("9_rbwtd") +texture = ExtResource("11_t3r7p") + +[node name="AcidEnchant" parent="UILayer/SpellIndicators" instance=ExtResource("14_gmycm")] +action = ExtResource("6_ue1ny") +texture = ExtResource("12_2ht6b") + +[node name="ManaEnchant" parent="UILayer/SpellIndicators" instance=ExtResource("14_gmycm")] +action = ExtResource("11_223o5") +texture = ExtResource("13_yufl8") + +[node name="HealingEnchant" parent="UILayer/SpellIndicators" instance=ExtResource("14_gmycm")] +action = ExtResource("12_4o7kv") +texture = ExtResource("14_dpiqo") + +[node name="FireEnchant" parent="UILayer/SpellIndicators" instance=ExtResource("14_gmycm")] +action = ExtResource("13_6g6j5") +texture = ExtResource("15_xjepw") + +[node name="Spells" type="MarginContainer" parent="UILayer"] +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -529.0 +offset_top = 5.0 +offset_right = -85.0 +offset_bottom = 455.0 +grow_horizontal = 2 +grow_vertical = 2 +pivot_offset = Vector2(171, 194) + +[node name="Layer1" parent="UILayer/Spells" instance=ExtResource("7_48cit")] +unique_name_in_owner = true +layout_mode = 2 +up = ExtResource("8_pbht4") +left = ExtResource("9_6ehip") +right = ExtResource("10_vp0as") +down = ExtResource("11_t3r7p") + +[node name="Layer2" parent="UILayer/Spells" instance=ExtResource("7_48cit")] +unique_name_in_owner = true +visible = false +layout_mode = 2 +up = ExtResource("12_2ht6b") +left = ExtResource("13_yufl8") +right = ExtResource("14_dpiqo") +down = ExtResource("15_xjepw") + +[node name="DebugLayer" type="CanvasLayer" parent="."] + +[node name="GuideDebugger" parent="DebugLayer" instance=ExtResource("3_ocaq1")] +theme = ExtResource("4_ur8xb") diff --git a/guide_examples/action_priority/dpad_spells/dpad_spells.gd b/guide_examples/action_priority/dpad_spells/dpad_spells.gd new file mode 100644 index 0000000..3b29af5 --- /dev/null +++ b/guide_examples/action_priority/dpad_spells/dpad_spells.gd @@ -0,0 +1,52 @@ +@tool +extends GridContainer + +@onready var _up:TextureRect = %Up +@onready var _left:TextureRect = %Left +@onready var _right:TextureRect = %Right +@onready var _down:TextureRect = %Down + + +@export var up:Texture2D: + set(value): + if value == up: + return + up = value + _refresh() + + +@export var left:Texture2D: + set(value): + if value == left: + return + left = value + _refresh() + + +@export var right:Texture2D: + set(value): + if value == right: + return + right= value + _refresh() + +@export var down:Texture2D: + set(value): + if value == down: + return + down = value + _refresh() + + +func _ready(): + _refresh() + + +func _refresh(): + if not is_node_ready(): + return + + _up.texture = up + _down.texture = down + _left.texture = left + _right.texture = right diff --git a/guide_examples/action_priority/dpad_spells/dpad_spells.gd.uid b/guide_examples/action_priority/dpad_spells/dpad_spells.gd.uid new file mode 100644 index 0000000..5e3e073 --- /dev/null +++ b/guide_examples/action_priority/dpad_spells/dpad_spells.gd.uid @@ -0,0 +1 @@ +uid://wsbm3iwylkto diff --git a/guide_examples/action_priority/dpad_spells/dpad_spells.tscn b/guide_examples/action_priority/dpad_spells/dpad_spells.tscn new file mode 100644 index 0000000..a126355 --- /dev/null +++ b/guide_examples/action_priority/dpad_spells/dpad_spells.tscn @@ -0,0 +1,56 @@ +[gd_scene load_steps=2 format=3 uid="uid://bsv0uwfyqbbbw"] + +[ext_resource type="Script" path="res://guide_examples/action_priority/dpad_spells/dpad_spells.gd" id="1_pl5jh"] + +[node name="DpadSpells" type="GridContainer"] +offset_right = 323.0 +offset_bottom = 329.0 +columns = 3 +script = ExtResource("1_pl5jh") + +[node name="Spacer" type="Control" parent="."] +layout_mode = 2 + +[node name="Up" type="TextureRect" parent="."] +unique_name_in_owner = true +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +expand_mode = 1 +stretch_mode = 5 + +[node name="Spacer2" type="Control" parent="."] +layout_mode = 2 + +[node name="Left" type="TextureRect" parent="."] +unique_name_in_owner = true +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +expand_mode = 1 +stretch_mode = 5 + +[node name="Spacer3" type="Control" parent="."] +layout_mode = 2 + +[node name="Right" type="TextureRect" parent="."] +unique_name_in_owner = true +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +expand_mode = 1 +stretch_mode = 5 + +[node name="Spacer4" type="Control" parent="."] +layout_mode = 2 + +[node name="Down" type="TextureRect" parent="."] +unique_name_in_owner = true +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +expand_mode = 1 +stretch_mode = 5 + +[node name="Spacer5" type="Control" parent="."] +layout_mode = 2 diff --git a/guide_examples/action_priority/icons/enchant-acid-3.png b/guide_examples/action_priority/icons/enchant-acid-3.png new file mode 100644 index 0000000000000000000000000000000000000000..f4bc7941c6c3114638026026f431546d7962e9a6 GIT binary patch literal 78361 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

=lV5I6Ec@# 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

sY1C;{T0s|O;BMHAh_GyNv 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 Db(n2M literal 0 HcmV?d00001 diff --git a/guide_examples/action_priority/icons/enchant-blue-3.png.import b/guide_examples/action_priority/icons/enchant-blue-3.png.import new file mode 100644 index 0000000..922c12b --- /dev/null +++ b/guide_examples/action_priority/icons/enchant-blue-3.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b3j6yx4455rj0" +path="res://.godot/imported/enchant-blue-3.png-7fbde34e03a870571687bd67f54ff1a7.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://guide_examples/action_priority/icons/enchant-blue-3.png" +dest_files=["res://.godot/imported/enchant-blue-3.png-7fbde34e03a870571687bd67f54ff1a7.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/guide_examples/action_priority/icons/enchant-jade-3.png b/guide_examples/action_priority/icons/enchant-jade-3.png new file mode 100644 index 0000000000000000000000000000000000000000..1cd28c4871563f100d74e895a17446d726779cd3 GIT binary patch literal 80121 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

G6m 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 i+o2orN zzKaTcw&Ce22a00QN{h@DXXHZ51QZR@$AyKR|S_%}6(2`HqG9mdlSd zE$dzIKyED1T2z{%mO=XSbZkgqQzBg`pkt_3xLz zcav21Nd&sd4f)Dkr=N5C*^I`;{x!GBc=oM+jqU4^qq8uVb%_xEqf_KdJh^j%o}a3| zB%V>%66qnHFZ?{pf-(F@1VCXB006ZrIlamvpsM~-0f>@dD*D-117JZGF&8PoO8jZA zVEpRswcXcPiUtG(;)c*zJZP2C!t!R|?!s0e-2lXprP8(%O%>?r%R&b%{%Q2UG=jxI zDh+29d_&%dz;<&H_EVe@M$UYTDFm5>I!Ht<0)~N^NC}sZ`a{FjJ`0en3$P}D zbO7x^icMsZfEKaV%Ov4uktTmyY5*_#>uw48Y5dz|>PWQ$AMT&B$5h5#q{1?L<4Z_}eW06kNIsI;e)-#=XP{@kKOVAv{)IW|hw|2Aov z-ssnf0v_hkVfX-7)>~qlb(w>}Mxp;+lWG8{&8UYi5Ps~a*sPB4!e~i6Lll7LE$;oZ z=m8NRekLM7L<1BCiIIgpFWeA>=Lo=|T>t_A*LUZf0L;vsBI>@23K24CzjT;szh8HW z@>?kas4sE-iy)Bm1cV8ga)~Zs7L~V%bXQyfmh$+eg(;@K0tP+Vwh}%3ysDy>I|-}_ zz>ujD#C9Gx1W}rqn^+ij>9{e0fXfz^!fw4@kl6_oX7>9x3uMR=)0j3G;6*_4{uWkyerJ zLg*hCb{ZiIJp2f#Ys|J^+OK0Ar0je|Hc}@7VeS08o%d7je>XNjr~efPF7l z&jI+kEhtw00W8h}#MjcXum+&(zRKJe=K2JPygs(Dq7CILK;5#{r@0T|Cl~qnSEo^q zMFXkWpqqd?DtQ0yY%qaFs+|D+WAl~aJ$soPOk#!%^>dZe1%+sVX$3DN2^Q1=phpLC z!^p`j)bC*g!O23tGW6qqb{!y!WFgiCpkwH3$T>xbQ~-w{zpC~&YecZ~@?6A&>d}*y%Bc!A-t!8f@3m=<)pEkiY|Az}Lh=u`iy11K=PL ze>NA_k_ODhpwt57bEpvjxd5z#5d>8JTg5==fOEU+-HXm&eW~aF??9j~y%s5kZ8BTj zck3@hlj7ils*@J=$;u2T&JpxgJ?SZc0Jomz1fpdbGmw2&vaFOtK$Kx=IKJwxqTZHfe00H)h$sB~IVo@*_2EY8zygRVgtJ~|`5bkh;ey}tt z_@u~O-zyw~dt~PQRuL$5O7=3R#~?3gs9x!Bh!WV zN)F91`X)&!HV6RRCba`%=>qW z;cu74oDWM~;0XZ;_WbY4^$9s#lSN6Z^7UK*O{(|+P;p&J(MH`R+b+FEn3wC)&p`@+ zuZsZStGsb9;mKjFl$B?-UMaiEMr8*H22I6Zrk#u?X#5lf)d+yV!eKV8{Hr>!a%J#b zt6ETT?7pb?U$m{Z3iRJH1F)t72xLXTj=e1W%-Md*QQrHwVrORf8oKZgr)MwH9lQJR z3lccw=>;bZaWTs)lxY0CaGGbSz5oY~n496IFcqNS2yPxgfJ;d^X&Bo)TuJWp1BeDt zX-0PdAi#%{=|IL9l(ZmY4bpqvAoBuS#h|u}!RwYHR?Ke_#oL=Dr`E_otK@eH`G^BZ zkS+i2ZAS93mfubG`ts`u0A9887mos-7lz`qGK;^xw03)&00HUEJ4+k|{w+7S=f5~# z4UcQXh$*H|zNQ<-jHn9NmFhiIaf(Y{xcK#Ip91`HngT?Xz92d8tGsY8VX#!}#r+;r z{qC&#&z2o`_c7(v*0IXcvy;HQAI}o&3V55sxVjRI&WX_~Q-Yj8w>0aLX;HxbC8Qt?-Kn0GUM)+m1TE{#{GKtb~=1?qg2vwDuKa9S&L5c5u zb^*Fd-hGb$(6ZimXN3u+j)FvZ@pElixRQ*&tMtcr7JhHvuqT0#qM{a4xIhM(buZlwq_i*Es7tW0@oE?bs1KuH^k_;ut$rAt&pa?|}AXk8V0X(EpeVFa6 zb){{|x~ot>M$f-aa_Du!GgvP?`kP975O0;X;CAWNlY8)IH~N1#2rvbBwzM%>nRlB@ zM4m13dT(jaXG3YQ=Zci))5}wp7sg91etZmR6^g95wz$Tm_EN|NAV69+cll+*Io|hY zp3X`=>ALjXZ2vJ;%oTj|@pV2QDp^nFAPpYI&u58kMWz>c&KL>sxufU}e`i@aI9~_0 zK$L*Wwy1mmT0AA_tSACnIT~;Ps6_8AiV<`c^7!JUU|VT)xJ}qfZ6!KmS-ZSLcm?wd z9S8oyx(}W7NaY#uZC)@MJZl3wf=po0R-tMUvM|I4gF6i1IXFoe8HtDnyfDc1XRHvj zOF-5j9!fsgQJMDaL?4cx>tcxnt}ksNx>NG^E&l#`$)7KmsySO|*URMGwW3jQqfF9m zlX}A+-OyqDe|O{mi+_x|1f=jXkKZiBqm89G{*AIzaZ_;xeEc6T%hh_>vj>j?V2Nv` z2gVK0k8qxCH}>^WjN_ypIT?6GbP(BpPR~W;2G7sMF)RX7GzRyZhOB*im9OKW(bAyl z;T0V8^8^9z$l&J*A_ND50A<6}`18e|3kvJM^E#W_VXJ6%R*DAd_EH-#0MJ~!h&1K! zzO%xn(H8l9YobSffso0Ik0iZlf07GZGz$kz>RQ1^a z3>?`cs?#Ij1_1zO)PE{WtGyr-7r_IRwFwaoh_DEO01qtkRfMW|h*=~g5KwwLs|#E# zn~10^bgL{UrEtau_nvD*4jz}faglX+t?W3|J%=0IXtxRl`9(MQzc~QBD#gD&rDCK~ zcsG@VJ9K>aMgg6h{q5`A_*duaxB!6g-T+7#FI%f1-B7TTjJvF*hpIj`9z6}?bw^~7 z$$R1JAl2nVKLh~MfLRA%C{JV5y?uGHE-%8F^vRD@YXJD;JjNK$2Rm1ID{A*T)Vtes2|M-;x27J9n(u|F6 zzz@5DzvSNkZxZ_dUMl_DB?8$Z5y_p>e^>I(Rico@7T=Y{oqUwrMwbNF0p6aIdkpho z)ZFEeE#iPtqb=(id|WM;wQ2n@->1wMI{JpUFfqbmD{0q8D zVTKxdYiR+&a8VHMD#;YJ$oJ@$;kJ_0QKuXK{6e^2u21Cb!i9w?DvFil+Jq`hlFu4Y zt(YJ{#HJ`II|LjPC1-%+#FQM1Z6Q*VnHIn^SqO@U7@iAh0iprw&Qok;q>L74BgJcF z9oc$G1#T6_+vPb&J}W5dmg6fzu4H?qjL}{%9futb053ZLyz1vqBCtW(uFbLr?QYq; zbCVnY6|!xYEj=C)Q)RWEtUj*Y;y8B<+kM457s*EMg#jvOJvhU!`ydI(u{CGLkGDzA zVH7|R&|x5L-y!8w4L|nk%dAvZ>enh~ak>R*flZ zu*^gx7!*g57e(V%dUAO}QPo%o0;CzUFhgW#{>D}gi9;MIW|1&5%b+}L4__uV1~28p z6L@$Ln!@n8ri^Vvb`6m0qJR|(gVY+lMp}fomP9gqNCw6f>j*1Dk#VRXaFxu{uM+^+ zE&!mp{~x{Jw@r$DTjXpK?|-AL+Lm@6{w7XFQa_OcJpeiwKY)+9KfHe&{rBr~Q*HK{IM*{wvf5)cDJ+qrUP(Da6P*$c=qA z38_j+`rL3y7dlE?hC2!cNB+ZkMYFRcOxl&vi}i+ZH$h?-&My#%ICiNFEb;_!gK(pG z6O|Im;tg&dS%XAyJa{Y&@&RORAX`_CK_xFuu`it?R&+_i@&2w)h8YFt!PLv?mtVyF*rFhHR3(|D=%$krb30d@Md zearBl>6>ow#6VE7hL40ZMm5P~(B$PcVsEk_HC+nbh%TA&@fxxc7MhaH;3s`8Hlv?xpcDH6X8F zm*246tTiTOpYnOq+5t5&bu6C7uF*(7Ahe**^3Y;R&{?52&`~T97Ez?TRMl^B!>wfe z17*KhS&>A6p;gw6HOsz%e6(1{B>OU-I)z@Gw=4-1`OPWPiP<{TS^(<-4EI&7mH8Yi zyIktPG=PId$`w$hA$lV`TycoRJy)hVkM~)nc3lH%9CGHIe1S+GUM->g)o#RVbE+%= zfQm$9(8Xu~sl+PD%h_tY*^PRq1HcOo0xxlcv9$W`lGlxH{5SaDu{K}5h2O0kc(`zr zULJ>rPdYFDUlvK(uV{D!{!APATo%=W779ByXVex!pm#64osN>Ec)Jwp z+Y|uQ*y#C(WN#NMiA_!=RKkHWj+h!W%jcUU8tBT5m?0BGs=lL-eT|=71$zHHCz>N@ zxv<0*T#{8-HP_<}qa?Xjgt_Ha*@G+$azvRFVnzgbXz9@i2$VF>l!v@lK>2Adsif=} zx&(#!_bc3^`<{Dv-2pCFPL?6lf{b#!N&sM;_vi@#Ps^0wbFy7$vv_<}>b*W!>0!jd zu%DivL>#0wctwGa;;Pi>=U%?3;zTfXEyqg6t!v=8_d$tTd}SntL*wV_?kFecn|$#; z`5gEi-14w1`sLFsFUw$l3GA_X8bfZ<~~IM z1f>}F$Ph$lhJcl{3W|zEiwaQy2|>EMfP)%jgyCiYok`auUqH17v{*HX-O(Pg(up$qGR1N@*iTQW22;JLz=V5=* z_&HfrBhf)wez;x$Agvn1Kg;!C`KO(DXq$3#^dp#?@l6Fx3I@`|{S# zk}TXJAwvg=l)p`0IP*o4J(waezhhp?mF65UV)2P7LM(Rqemd14L?l2VN*G!U?Jt&* z;x%bS71v(@EI5FqDMThzdbxY?yGsj7cFI7HuIXZ~&*I~nka>I>J#u>dPW+7=*1_Km z184h_I{f(G0CMc_d43OdqtIN zQGqGgci&(o3bD2dn>h@m#@|+w9BLF%!NwA^sHSB6jTMwf>oV|2(M0M^YVl3yrSmR8 zcVS*YBZ4Brb(VAqdIUA|X+pMda+Xz2_RtmP{9EV|_&FN9_IMcuuyBZn5S|AQ7*hm_ zOp=4nf>l;5^!_&tLsf?mHgj2NX3SpUCzB39LFz1-hEbe^bYnySSGYI7TNH`6mA3Qf zdM?%GTa)Mdh)CGRqe3oexG;Y1-Gk9b14np|93O}E4{wh~zJ#yU#&y6eC+d_jM{s2= zhI99f4D=9i0T5Jv=Bz#!fAD>cE^yz-7~LEHzAvS{vqGzlBkv2v`OGgY($Rvn5`8$y znhK9S1pyvy_vv)5j_T*2HAgxJ3ku!6zG;3tBLGz!Z7;1BZWNDRHhvWwsPnJyS7G%~ zT^2zw1*q?Lbf3+^`Owe80tX;B_PnQ=Qyq0}S#KYm0?n6HdWqcz-t^-3mSu(FAOHZy zKGGf(7Hm|uoV{KgJbdt2>>{ve$lR3=Dn7>favBOfBn3y1OLJv;R^;<207XDV6aYPq}k87gEJ#y!jXHU>2qYhuIdmjk2x(9+v(u~GfN8o@Lr}!uaqGP#vxZNcq z?!EHN>2s%xI`U<@nl_ZDTZ>fo`2~?3RpHLJau@YB@}hT7AAL?n2|7Phxk#9UK)=3W zzj}Te|G*N9sGoTL#tOz?2?SCE&{tJ>u?#@u-oGz$0RX0zz@S66rFQmFG17LS?q%0D zAqR+X(O}q|DWEbji-Q~|)>URq8*u2Mm{an>Wi&u#VtgJCeqn1d+JwHC1jYoTf?;zy zj+=-moB`wJ=qtbiZ8aQn3jhvLIR^m10^nxh^=}d}(OX4agp%B=QyXnjVmI&oqob7XYB6 zyNohO0cJ6d_r2Iw>n#njb(d(j?Ip%*a|sN(N?)trtF3MQSi3*>8ddl{ zizNkNQNG`ItT^Z1^vjLErLl19 zt+e_h~0ojyiS>h%?5an0F6D@R&diy8?PSD=Tx)FGLhf zb#-Sa336I2ENgr8>+AWOq^jRkA?)ubQ9-|dbMiDHzYw~Fw6lP0%(IGrWOLR!EDja5 zmvjk=j6nhb$rLJ6&Q}_~a=pt1L#+ugCE!Xk)(Bwm)Rxz6$L#s?A;yD;2a|=tNMD7w zG`>5#0r09YGSY?FOXoHsybUj}IX4S!00Be-_?`>^uJrK!PVxFT3d`_1p%1(9v&*2% zFgVW;g)w!_wlCda=Y#!wD)4e08*_9O&ZJS|P}*J7DpIpm7&*S4^YNTU#K#at03bMM6hr#;rJ*9~1+0@<{k5s!hX?~t7UuxRsw z_o9LW(^>=TYg$Ca>6fn=s@sd_uiHzd|KAyZP2lSBzVzY70wCo7uzK?$QdrRq##(S` zEunKqp=i@rwmeTUbncotl!}rv0w}LFXMs>T1bpap*a$$tAtS9D;9*qeTFjYUVho)C zrU6tLqMiUi0G0P_C%xy~*&q$_Z;vF9pW|!64~UGyb<)f@X~$vpTw zII@esFKXiB_xchQu2>^A7sk)RCjfziFD&rUbCY7tkQ}K2P8l>w6k{aDkFhvQuwdGy zhakd8L5-i$ULGO-zt+xfwUH|b!lNh>0wF|^bal@e$+B}H{IhFG9#8k_uCA(nZXoN3Ny>f; z$$EOSyKcb8hwGF8HVF@i2>@wvbT7WIqz&Ck;8lY21|TZwt~MnNkpvKusL;p~z)wH? z(cg58Hd#7=7V+V|k$KcXl2 zE@mR%k7z$O+!p-m#>4W}e$|$Z_t54S`mVjM^6H^S+eyyv$PyOq@6|m=O*QOipvS5@ zjtW2pHyZTXc7e+%K11t3C8tX`RAl3Pn7g!xFF&q?DXT)bvEXN1zC7dGud%UAc)?8r z7`zYc*SN9Us{zHnXm|O#%P0Ra$Y&oY`8z@U$AW({zy^+0g3FA(BG`oGhA{zXJFrPo z<9(GD50TGfd*EcF2N4xTuC?pJ-I>L|b`AkNZU7iuis>(v?13^&$w56E&X$jq`8lAT zwE}kXG7+E*XA?3Sc;v3VK}n$*LnyLf?xn_mi8@fV`hWXW!7u|GAzJW5*|q1f_tH~$ zndcX2E`%mlY=gEdMH&JReRvLf_2aXLJr}*X?$ZN%;pFx<>@Ae_XiC6o)ZkOeK2cY{ zuL7H>R=sY3ck5J*s`_;~68Mu8Bd0d_w74@_hObFrXshpJIIU)1(yq?uTK#tZqWmIr zd4rb*KW#!M!8;$h5S;*ooc6OS8uA`$k;Fy%N6;j&mGVDIB-K%s3lP_t{VK~zo@7hw zYbdD{B(#r^NR;RS-55~^Y(u+A?Pj+V(aPiMDpX8FdN8l7A*0uZAxQbnMp_GgmA3LZ z5?Fg4dk(`83_GZ#pyIn@Iz79~wnb4?nPh7wK8gL!AzKa&y&ONzl1i#YZSA(iF z_Wh@VzmwRQz9R`x9bY9=omdHE-V672RK>moH*JzYH|+VRg7Pmu5&S$RCxTyFj(Or9 z%!Piu3?R!e38?YGZ94IHp*n~_NM2|55c(%X7K~UlyV}h}De64%*Xm5nje0aGIf{+! z=0`cm2oN9-Z$S&*e!cY}_^1k?4EO7(%a{#-4ZVSVj_`=*u~XcPH>?#fUI4DdcnM(O zVeCOpe)#&(cl(pyY|n}V60An$qr&OMBD-K7TPZO8(eb| zfNtB({jUmq+B1Ef-M50j1@x_i{+>7VPR_*4Vq}ZYBvk?PR28oVMju`YJSM>VsZIw- ziqT}`t6>1^1W?S*kbBMre{vidy$}--4NdCl-_C-o1SYOTUc5=O*FIB+hC67Y?nzBAGHU&T6w1HVjARt-o?Zgg2rj9}E8VGat zVu^*F6`BIImV*8Y)fM+#`+2J-EVvmb+IWwVqEdSeU$B$Er}GvsgI=*%a0VUe>Gm57 zYz=%p-EqdjW08IzBp-wyp$y-nO~{*{^tvj8)UG?pARFB1-#LD7n?Sy+eA_ z!6jRE>*qg4-~D$bfpZB!lfbo91krB4wV^v7T6z0W7YqU~F8QbFXS5IM&IJEeD)n0o z!l_)KSqOe7O>E?X?9x~;IuJ#C;5N7sYY(NTMxG?#Mr=2%;t2d4H!1z5U2qUCThXCZ{x1h&h5_KZXH?|wG3Af*kcX&PvZUjacb+FyozHfcMC5lSv zJ+vn5M+B^-(qMki2v3PNxu2)3X9TD+Sb`mp&qu7^>hCn%1ob75T6B{X9F8I9J-30k z0{C4I62S3Z+KQ2l2LEhms#z04m%iU!@R*MPgVT{}_&SK|GzsYF8$7FRllP(tV17aH zcS-Jh{NAx#(voKU=e+D6dtKEKBeQVV&=c(IauU~o+yDD5ITJg( z&~9EWyGRtr8_{(R5Kb&uwErgouwaBSTUFC>@)su?E4`IIi;cOu7O}?4g16VeTM{@t zk8Utx&%IRz7W{S0$7>!=e!xY04yp=wNd7Zy!GQ#YpejEY+u3_l(@O{Vz6EfPn==}8 zcmja3t2Z@&BUjVy8=I^0PK&$bcd2Z=jmY5_Czfl>(#X3@W5DhcmB3{5-goW+@AoeF z0Y-w*b0P|T3GHd;S?;}Wv{fx+bC7evKRa>q>o46(2+m1R0><$V_OnnkuSMjf&Zzq| zQn{-qg6gPs^Rdz|k#0u2@`ozEP+|%FKV%d(&GrBws=2an5Ls}KxR;aPdVYf60ukx4 zy2_}JAzXN7^LBc(zrad+b{4=kw1=Vnwc;q|n|bl2uDoV+$NU|7Ex}H}>*$R=d#=3u z7Pjx`mRznMlwh6N4_mV5prDJ3X}66&UjzQWwgE$oX;JPKJ=Dg=dztq#`(!2X*(9Lt z!1I6sd&CFay{LQto18SVT_+dq)GwTae(zc`gxD#PTGJR_?t%0ziqf&dyntZ_(g-j(>k!G63B}S0l`a?z%mh# zR_TD-ruOtX`DA>B2k;T3zZ*gP$6E#`7|lmc|H+x)?-Dm*QmMvz>Z|`Cph+}Fyh_-> zzO)GsA_UnBP_&b!B}cF+_LvSR`f2rC%YV4*sMBz#?a4gm2cQnZMH&p#&Q4;CD^(H-~uc1z+2@;xarGl zFltp}48CvIkk@b=<}v8vvrU|mz#^M3Gy2wo8QrAQKc3*;8cffC+O1aLBUM1xAkUpj z0@s0~;P>p!027Fb^NA_IM}vQvN~G=t(dX(+@OO_)(OG>Fqp~`_oEN^D+6Q74k=`fOAP;GH3@p0j%Y4@+6>B zECsx~j|KlUu?A0-GmC#C(757-}-d z#{n5CEr>pSzv|~X-SJd#+pCwlrAb|w_+8w%Vo2BlOW~x#CNBEg?F64ukG{Nr@@_Qn z<0v_A(v9W5A9Rxsw8-=SDG78Vl|Y*(6WiWxb7EzW{{Z!|p>M9D9Gw6F002ovPDHLk FV1oQ9q~QPn literal 0 HcmV?d00001 diff --git a/guide_examples/action_priority/icons/protect-blue-2.png.import b/guide_examples/action_priority/icons/protect-blue-2.png.import new file mode 100644 index 0000000..f81a95f --- /dev/null +++ b/guide_examples/action_priority/icons/protect-blue-2.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dvy7bcy022rqq" +path="res://.godot/imported/protect-blue-2.png-abb9ef1d1e06e180429074d0e9b24edb.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://guide_examples/action_priority/icons/protect-blue-2.png" +dest_files=["res://.godot/imported/protect-blue-2.png-abb9ef1d1e06e180429074d0e9b24edb.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/guide_examples/action_priority/mapping_contexts/action_priority.tres b/guide_examples/action_priority/mapping_contexts/action_priority.tres new file mode 100644 index 0000000..3f94190 --- /dev/null +++ b/guide_examples/action_priority/mapping_contexts/action_priority.tres @@ -0,0 +1,263 @@ +[gd_resource type="Resource" script_class="GUIDEMappingContext" load_steps=56 format=3 uid="uid://ragqbe7yjfwe"] + +[ext_resource type="Script" path="res://addons/guide/guide_mapping_context.gd" id="1_asqiw"] +[ext_resource type="Resource" uid="uid://bhq3gby2yiibf" path="res://guide_examples/action_priority/mapping_contexts/actions/acid_enchantment.tres" id="1_pwefn"] +[ext_resource type="Resource" uid="uid://c5eq1avod0lu8" path="res://guide_examples/action_priority/mapping_contexts/actions/spell_toggle.tres" id="2_swo1r"] +[ext_resource type="Script" path="res://addons/guide/guide_input_mapping.gd" id="4_6rx1x"] +[ext_resource type="Script" path="res://addons/guide/triggers/guide_trigger_pressed.gd" id="4_n7mmu"] +[ext_resource type="Script" path="res://addons/guide/inputs/guide_input_joy_button.gd" id="5_cxbyx"] +[ext_resource type="Script" path="res://addons/guide/triggers/guide_trigger_chorded_action.gd" id="5_w86oe"] +[ext_resource type="Script" path="res://addons/guide/guide_action_mapping.gd" id="6_4koxr"] +[ext_resource type="Resource" uid="uid://esf4ilpf0inv" path="res://guide_examples/action_priority/mapping_contexts/actions/acid_bolt.tres" id="7_35imv"] +[ext_resource type="Script" path="res://addons/guide/inputs/guide_input_joy_axis_1d.gd" id="8_avuuj"] +[ext_resource type="Resource" uid="uid://do3hivxhwoqvi" path="res://guide_examples/action_priority/mapping_contexts/actions/mana_enchantment.tres" id="8_lmhmq"] +[ext_resource type="Resource" uid="uid://dtr3jy86gc3rk" path="res://guide_examples/action_priority/mapping_contexts/actions/healing_enchantment.tres" id="9_xfl3h"] +[ext_resource type="Resource" uid="uid://cdhpb7yuq5pkb" path="res://guide_examples/action_priority/mapping_contexts/actions/mana_bolt.tres" id="10_krd45"] +[ext_resource type="Resource" uid="uid://bfskfiw1k8574" path="res://guide_examples/action_priority/mapping_contexts/actions/fire_enchantment.tres" id="10_m3nrn"] +[ext_resource type="Resource" uid="uid://dsp8h1ycwd6tt" path="res://guide_examples/action_priority/mapping_contexts/actions/heal.tres" id="12_w4t7r"] +[ext_resource type="Resource" uid="uid://b5plj56pss47x" path="res://guide_examples/action_priority/mapping_contexts/actions/shield.tres" id="14_qai3i"] + +[sub_resource type="Resource" id="Resource_2fxes"] +script = ExtResource("5_cxbyx") +button = 11 +joy_index = -1 + +[sub_resource type="Resource" id="Resource_jhb3c"] +script = ExtResource("5_w86oe") +action = ExtResource("2_swo1r") +actuation_threshold = 0.5 + +[sub_resource type="Resource" id="Resource_i54ow"] +script = ExtResource("4_n7mmu") +actuation_threshold = 0.5 + +[sub_resource type="Resource" id="Resource_fjuhd"] +script = ExtResource("4_6rx1x") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_2fxes") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([SubResource("Resource_jhb3c"), SubResource("Resource_i54ow")]) + +[sub_resource type="Resource" id="Resource_ai5ps"] +script = ExtResource("6_4koxr") +action = ExtResource("1_pwefn") +input_mappings = Array[ExtResource("4_6rx1x")]([SubResource("Resource_fjuhd")]) +metadata/_guide_input_mappings_collapsed = true + +[sub_resource type="Resource" id="Resource_w2qty"] +script = ExtResource("5_cxbyx") +button = 13 +joy_index = -1 + +[sub_resource type="Resource" id="Resource_rl1q7"] +script = ExtResource("5_w86oe") +action = ExtResource("2_swo1r") +actuation_threshold = 0.5 + +[sub_resource type="Resource" id="Resource_4y1rh"] +script = ExtResource("4_n7mmu") +actuation_threshold = 0.5 + +[sub_resource type="Resource" id="Resource_d8nq3"] +script = ExtResource("4_6rx1x") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_w2qty") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([SubResource("Resource_rl1q7"), SubResource("Resource_4y1rh")]) + +[sub_resource type="Resource" id="Resource_jwd6q"] +script = ExtResource("6_4koxr") +action = ExtResource("8_lmhmq") +input_mappings = Array[ExtResource("4_6rx1x")]([SubResource("Resource_d8nq3")]) +metadata/_guide_input_mappings_collapsed = true + +[sub_resource type="Resource" id="Resource_mxqg0"] +script = ExtResource("5_cxbyx") +button = 14 +joy_index = -1 + +[sub_resource type="Resource" id="Resource_ip7ia"] +script = ExtResource("5_w86oe") +action = ExtResource("2_swo1r") +actuation_threshold = 0.5 + +[sub_resource type="Resource" id="Resource_i6wfw"] +script = ExtResource("4_n7mmu") +actuation_threshold = 0.5 + +[sub_resource type="Resource" id="Resource_m8ya7"] +script = ExtResource("4_6rx1x") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_mxqg0") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([SubResource("Resource_ip7ia"), SubResource("Resource_i6wfw")]) + +[sub_resource type="Resource" id="Resource_22c0i"] +script = ExtResource("6_4koxr") +action = ExtResource("9_xfl3h") +input_mappings = Array[ExtResource("4_6rx1x")]([SubResource("Resource_m8ya7")]) +metadata/_guide_input_mappings_collapsed = true + +[sub_resource type="Resource" id="Resource_u2m40"] +script = ExtResource("5_cxbyx") +button = 12 +joy_index = -1 + +[sub_resource type="Resource" id="Resource_7owy8"] +script = ExtResource("5_w86oe") +action = ExtResource("2_swo1r") +actuation_threshold = 0.5 + +[sub_resource type="Resource" id="Resource_tchgu"] +script = ExtResource("4_n7mmu") +actuation_threshold = 0.5 + +[sub_resource type="Resource" id="Resource_2q1gn"] +script = ExtResource("4_6rx1x") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_u2m40") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([SubResource("Resource_7owy8"), SubResource("Resource_tchgu")]) + +[sub_resource type="Resource" id="Resource_4acdf"] +script = ExtResource("6_4koxr") +action = ExtResource("10_m3nrn") +input_mappings = Array[ExtResource("4_6rx1x")]([SubResource("Resource_2q1gn")]) +metadata/_guide_input_mappings_collapsed = true + +[sub_resource type="Resource" id="Resource_5sjq4"] +script = ExtResource("5_cxbyx") +button = 11 +joy_index = -1 + +[sub_resource type="Resource" id="Resource_fkk8p"] +script = ExtResource("4_n7mmu") +actuation_threshold = 0.5 + +[sub_resource type="Resource" id="Resource_vswh4"] +script = ExtResource("4_6rx1x") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_5sjq4") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([SubResource("Resource_fkk8p")]) + +[sub_resource type="Resource" id="Resource_8wvmf"] +script = ExtResource("6_4koxr") +action = ExtResource("7_35imv") +input_mappings = Array[ExtResource("4_6rx1x")]([SubResource("Resource_vswh4")]) +metadata/_guide_input_mappings_collapsed = true + +[sub_resource type="Resource" id="Resource_mbfh8"] +script = ExtResource("5_cxbyx") +button = 13 +joy_index = -1 + +[sub_resource type="Resource" id="Resource_umt5k"] +script = ExtResource("4_n7mmu") +actuation_threshold = 0.5 + +[sub_resource type="Resource" id="Resource_b8our"] +script = ExtResource("4_6rx1x") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_mbfh8") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([SubResource("Resource_umt5k")]) + +[sub_resource type="Resource" id="Resource_8p32p"] +script = ExtResource("6_4koxr") +action = ExtResource("10_krd45") +input_mappings = Array[ExtResource("4_6rx1x")]([SubResource("Resource_b8our")]) +metadata/_guide_input_mappings_collapsed = true + +[sub_resource type="Resource" id="Resource_utha0"] +script = ExtResource("5_cxbyx") +button = 14 +joy_index = -1 + +[sub_resource type="Resource" id="Resource_sm46b"] +script = ExtResource("4_n7mmu") +actuation_threshold = 0.5 + +[sub_resource type="Resource" id="Resource_1f76r"] +script = ExtResource("4_6rx1x") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_utha0") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([SubResource("Resource_sm46b")]) + +[sub_resource type="Resource" id="Resource_73ywc"] +script = ExtResource("6_4koxr") +action = ExtResource("12_w4t7r") +input_mappings = Array[ExtResource("4_6rx1x")]([SubResource("Resource_1f76r")]) +metadata/_guide_input_mappings_collapsed = true + +[sub_resource type="Resource" id="Resource_ov80l"] +script = ExtResource("5_cxbyx") +button = 12 +joy_index = -1 + +[sub_resource type="Resource" id="Resource_wu6o8"] +script = ExtResource("4_n7mmu") +actuation_threshold = 0.5 + +[sub_resource type="Resource" id="Resource_ggg1r"] +script = ExtResource("4_6rx1x") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_ov80l") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([SubResource("Resource_wu6o8")]) + +[sub_resource type="Resource" id="Resource_rleu1"] +script = ExtResource("6_4koxr") +action = ExtResource("14_qai3i") +input_mappings = Array[ExtResource("4_6rx1x")]([SubResource("Resource_ggg1r")]) +metadata/_guide_input_mappings_collapsed = true + +[sub_resource type="Resource" id="Resource_m51uq"] +script = ExtResource("8_avuuj") +axis = 4 +joy_index = -1 + +[sub_resource type="Resource" id="Resource_2hg0t"] +script = ExtResource("4_6rx1x") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_m51uq") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([]) + +[sub_resource type="Resource" id="Resource_uj8l6"] +script = ExtResource("6_4koxr") +action = ExtResource("2_swo1r") +input_mappings = Array[ExtResource("4_6rx1x")]([SubResource("Resource_2hg0t")]) + +[resource] +script = ExtResource("1_asqiw") +display_name = "" +mappings = Array[ExtResource("6_4koxr")]([SubResource("Resource_ai5ps"), SubResource("Resource_jwd6q"), SubResource("Resource_22c0i"), SubResource("Resource_4acdf"), SubResource("Resource_8wvmf"), SubResource("Resource_8p32p"), SubResource("Resource_73ywc"), SubResource("Resource_rleu1"), SubResource("Resource_uj8l6")]) diff --git a/guide_examples/action_priority/mapping_contexts/actions/acid_bolt.tres b/guide_examples/action_priority/mapping_contexts/actions/acid_bolt.tres new file mode 100644 index 0000000..49322f2 --- /dev/null +++ b/guide_examples/action_priority/mapping_contexts/actions/acid_bolt.tres @@ -0,0 +1,12 @@ +[gd_resource type="Resource" script_class="GUIDEAction" load_steps=2 format=3 uid="uid://esf4ilpf0inv"] + +[ext_resource type="Script" path="res://addons/guide/guide_action.gd" id="1_867co"] + +[resource] +script = ExtResource("1_867co") +name = &"" +action_value_type = 0 +emit_as_godot_actions = false +is_remappable = false +display_name = "" +display_category = "" diff --git a/guide_examples/action_priority/mapping_contexts/actions/acid_enchantment.tres b/guide_examples/action_priority/mapping_contexts/actions/acid_enchantment.tres new file mode 100644 index 0000000..4fb98c0 --- /dev/null +++ b/guide_examples/action_priority/mapping_contexts/actions/acid_enchantment.tres @@ -0,0 +1,13 @@ +[gd_resource type="Resource" script_class="GUIDEAction" load_steps=2 format=3 uid="uid://bhq3gby2yiibf"] + +[ext_resource type="Script" path="res://addons/guide/guide_action.gd" id="1_w7kln"] + +[resource] +script = ExtResource("1_w7kln") +name = &"" +action_value_type = 0 +block_lower_priority_actions = true +emit_as_godot_actions = false +is_remappable = false +display_name = "" +display_category = "" diff --git a/guide_examples/action_priority/mapping_contexts/actions/fire_enchantment.tres b/guide_examples/action_priority/mapping_contexts/actions/fire_enchantment.tres new file mode 100644 index 0000000..22369ed --- /dev/null +++ b/guide_examples/action_priority/mapping_contexts/actions/fire_enchantment.tres @@ -0,0 +1,13 @@ +[gd_resource type="Resource" script_class="GUIDEAction" load_steps=2 format=3 uid="uid://bfskfiw1k8574"] + +[ext_resource type="Script" path="res://addons/guide/guide_action.gd" id="1_rlep8"] + +[resource] +script = ExtResource("1_rlep8") +name = &"" +action_value_type = 0 +block_lower_priority_actions = true +emit_as_godot_actions = false +is_remappable = false +display_name = "" +display_category = "" diff --git a/guide_examples/action_priority/mapping_contexts/actions/heal.tres b/guide_examples/action_priority/mapping_contexts/actions/heal.tres new file mode 100644 index 0000000..c3c16fa --- /dev/null +++ b/guide_examples/action_priority/mapping_contexts/actions/heal.tres @@ -0,0 +1,12 @@ +[gd_resource type="Resource" script_class="GUIDEAction" load_steps=2 format=3 uid="uid://dsp8h1ycwd6tt"] + +[ext_resource type="Script" path="res://addons/guide/guide_action.gd" id="1_o3iqb"] + +[resource] +script = ExtResource("1_o3iqb") +name = &"" +action_value_type = 0 +emit_as_godot_actions = false +is_remappable = false +display_name = "" +display_category = "" diff --git a/guide_examples/action_priority/mapping_contexts/actions/healing_enchantment.tres b/guide_examples/action_priority/mapping_contexts/actions/healing_enchantment.tres new file mode 100644 index 0000000..c234cb0 --- /dev/null +++ b/guide_examples/action_priority/mapping_contexts/actions/healing_enchantment.tres @@ -0,0 +1,12 @@ +[gd_resource type="Resource" script_class="GUIDEAction" load_steps=2 format=3 uid="uid://dtr3jy86gc3rk"] + +[ext_resource type="Script" path="res://addons/guide/guide_action.gd" id="1_0fh74"] + +[resource] +script = ExtResource("1_0fh74") +name = &"" +action_value_type = 0 +emit_as_godot_actions = false +is_remappable = false +display_name = "" +display_category = "" diff --git a/guide_examples/action_priority/mapping_contexts/actions/mana_bolt.tres b/guide_examples/action_priority/mapping_contexts/actions/mana_bolt.tres new file mode 100644 index 0000000..23e46c5 --- /dev/null +++ b/guide_examples/action_priority/mapping_contexts/actions/mana_bolt.tres @@ -0,0 +1,12 @@ +[gd_resource type="Resource" script_class="GUIDEAction" load_steps=2 format=3 uid="uid://cdhpb7yuq5pkb"] + +[ext_resource type="Script" path="res://addons/guide/guide_action.gd" id="1_ka3gg"] + +[resource] +script = ExtResource("1_ka3gg") +name = &"" +action_value_type = 0 +emit_as_godot_actions = false +is_remappable = false +display_name = "" +display_category = "" diff --git a/guide_examples/action_priority/mapping_contexts/actions/mana_enchantment.tres b/guide_examples/action_priority/mapping_contexts/actions/mana_enchantment.tres new file mode 100644 index 0000000..acedcd7 --- /dev/null +++ b/guide_examples/action_priority/mapping_contexts/actions/mana_enchantment.tres @@ -0,0 +1,12 @@ +[gd_resource type="Resource" script_class="GUIDEAction" load_steps=2 format=3 uid="uid://do3hivxhwoqvi"] + +[ext_resource type="Script" path="res://addons/guide/guide_action.gd" id="1_4c7tt"] + +[resource] +script = ExtResource("1_4c7tt") +name = &"" +action_value_type = 0 +emit_as_godot_actions = false +is_remappable = false +display_name = "" +display_category = "" diff --git a/guide_examples/action_priority/mapping_contexts/actions/shield.tres b/guide_examples/action_priority/mapping_contexts/actions/shield.tres new file mode 100644 index 0000000..de94f8b --- /dev/null +++ b/guide_examples/action_priority/mapping_contexts/actions/shield.tres @@ -0,0 +1,12 @@ +[gd_resource type="Resource" script_class="GUIDEAction" load_steps=2 format=3 uid="uid://b5plj56pss47x"] + +[ext_resource type="Script" path="res://addons/guide/guide_action.gd" id="1_kmjgp"] + +[resource] +script = ExtResource("1_kmjgp") +name = &"" +action_value_type = 0 +emit_as_godot_actions = false +is_remappable = false +display_name = "" +display_category = "" diff --git a/guide_examples/action_priority/mapping_contexts/actions/spell_toggle.tres b/guide_examples/action_priority/mapping_contexts/actions/spell_toggle.tres new file mode 100644 index 0000000..863790a --- /dev/null +++ b/guide_examples/action_priority/mapping_contexts/actions/spell_toggle.tres @@ -0,0 +1,13 @@ +[gd_resource type="Resource" script_class="GUIDEAction" load_steps=2 format=3 uid="uid://c5eq1avod0lu8"] + +[ext_resource type="Script" path="res://addons/guide/guide_action.gd" id="1_m4tof"] + +[resource] +script = ExtResource("1_m4tof") +name = &"" +action_value_type = 0 +block_lower_priority_actions = false +emit_as_godot_actions = false +is_remappable = false +display_name = "" +display_category = "" diff --git a/guide_examples/action_priority/spell_indicator/spell_indicator.gd b/guide_examples/action_priority/spell_indicator/spell_indicator.gd new file mode 100644 index 0000000..875748a --- /dev/null +++ b/guide_examples/action_priority/spell_indicator/spell_indicator.gd @@ -0,0 +1,11 @@ +extends Node2D + +@export var action:GUIDEAction +@export var texture:Texture2D + +@onready var _animation_player:AnimationPlayer = %AnimationPlayer +@onready var _sprite_2d:Sprite2D = %Sprite2D + +func _ready(): + _sprite_2d.texture = texture + action.triggered.connect(_animation_player.play.bind("run")) diff --git a/guide_examples/action_priority/spell_indicator/spell_indicator.gd.uid b/guide_examples/action_priority/spell_indicator/spell_indicator.gd.uid new file mode 100644 index 0000000..a06abbc --- /dev/null +++ b/guide_examples/action_priority/spell_indicator/spell_indicator.gd.uid @@ -0,0 +1 @@ +uid://b3h0rac24v3l0 diff --git a/guide_examples/action_priority/spell_indicator/spell_indicator.tscn b/guide_examples/action_priority/spell_indicator/spell_indicator.tscn new file mode 100644 index 0000000..26ea533 --- /dev/null +++ b/guide_examples/action_priority/spell_indicator/spell_indicator.tscn @@ -0,0 +1,79 @@ +[gd_scene load_steps=6 format=3 uid="uid://cx8f0hljh5dhs"] + +[ext_resource type="Texture2D" uid="uid://dbwgq8udtj2hp" path="res://guide_examples/action_priority/icons/enchant-acid-3.png" id="1_7l2hh"] +[ext_resource type="Script" path="res://guide_examples/action_priority/spell_indicator/spell_indicator.gd" id="1_hpegm"] + +[sub_resource type="Animation" id="Animation_j3vtt"] +length = 0.001 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Sprite2D:position") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(0, 0)] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Sprite2D:modulate") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Color(1, 1, 1, 0)] +} + +[sub_resource type="Animation" id="Animation_4iqo1"] +resource_name = "run" +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Sprite2D:position") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 1), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [Vector2(0, 0), Vector2(0, -346)] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Sprite2D:modulate") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0, 1), +"transitions": PackedFloat32Array(1, 0.176777), +"update": 0, +"values": [Color(1, 1, 1, 1), Color(1, 1, 1, 0)] +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_h1go0"] +_data = { +"RESET": SubResource("Animation_j3vtt"), +"run": SubResource("Animation_4iqo1") +} + +[node name="SpellIndicator" type="Node2D"] +script = ExtResource("1_hpegm") + +[node name="Sprite2D" type="Sprite2D" parent="."] +unique_name_in_owner = true +modulate = Color(1, 1, 1, 0) +scale = Vector2(0.5, 0.5) +texture = ExtResource("1_7l2hh") + +[node name="AnimationPlayer" type="AnimationPlayer" parent="."] +unique_name_in_owner = true +libraries = { +"": SubResource("AnimationLibrary_h1go0") +} diff --git a/guide_examples/combos/combos.gd b/guide_examples/combos/combos.gd new file mode 100644 index 0000000..22d974a --- /dev/null +++ b/guide_examples/combos/combos.gd @@ -0,0 +1,7 @@ +extends Node2D + +@export var mapping_context:GUIDEMappingContext + +func _ready(): + GUIDE.enable_mapping_context(mapping_context) + diff --git a/guide_examples/combos/combos.gd.uid b/guide_examples/combos/combos.gd.uid new file mode 100644 index 0000000..3c330ff --- /dev/null +++ b/guide_examples/combos/combos.gd.uid @@ -0,0 +1 @@ +uid://dk0t3b28kxhf8 diff --git a/guide_examples/combos/combos.tscn b/guide_examples/combos/combos.tscn new file mode 100644 index 0000000..e13af57 --- /dev/null +++ b/guide_examples/combos/combos.tscn @@ -0,0 +1,87 @@ +[gd_scene load_steps=18 format=3 uid="uid://b12bmbtmbuame"] + +[ext_resource type="PackedScene" uid="uid://dkr80d2pi0d41" path="res://addons/guide/debugger/guide_debugger.tscn" id="1_eyn1y"] +[ext_resource type="Script" path="res://guide_examples/combos/combos.gd" id="1_kdeb4"] +[ext_resource type="Resource" uid="uid://c7uloa16ajj5p" path="res://guide_examples/combos/mapping_contexts/combos.tres" id="2_ahmv3"] +[ext_resource type="Script" path="res://guide_examples/combos/player.gd" id="3_kulxp"] +[ext_resource type="Resource" uid="uid://b2wemrcnxfbmo" path="res://guide_examples/combos/mapping_contexts/basic_actions/move_horizontal.tres" id="4_7328w"] +[ext_resource type="Texture2D" uid="uid://byjxtsekdl8t2" path="res://guide_examples/shared/godot_logo.svg" id="4_uej32"] +[ext_resource type="Resource" uid="uid://b0761600n8fnb" path="res://guide_examples/combos/mapping_contexts/combo_actions/fireball_left.tres" id="4_uvwd5"] +[ext_resource type="Resource" uid="uid://dj83uxjdx6r2c" path="res://guide_examples/combos/mapping_contexts/combo_actions/dash_left.tres" id="5_s5wpr"] +[ext_resource type="Resource" uid="uid://5ve3hevhhgnw" path="res://guide_examples/combos/mapping_contexts/combo_actions/dash_right.tres" id="6_vd0bg"] +[ext_resource type="Theme" uid="uid://dot0gi1yoqmrl" path="res://guide_examples/shared/ui_theme.tres" id="11_i5q2v"] +[ext_resource type="Resource" uid="uid://wdh7cg7kjul0" path="res://guide_examples/combos/mapping_contexts/combo_actions/fireball_right.tres" id="11_n707x"] +[ext_resource type="Script" path="res://guide_examples/shared/instructions_label.gd" id="11_obfhv"] +[ext_resource type="Resource" uid="uid://bqiryilvj5mqv" path="res://guide_examples/combos/mapping_contexts/basic_actions/move_left.tres" id="12_0mhlm"] +[ext_resource type="PackedScene" uid="uid://c36cnvgv2ur60" path="res://guide_examples/shared/fireball/fireball.tscn" id="12_fl88r"] +[ext_resource type="Resource" uid="uid://bk54ofxos3xxg" path="res://guide_examples/combos/mapping_contexts/basic_actions/move_right.tres" id="13_xn6qb"] + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_8kkfa"] +size = Vector2(137, 138) + +[sub_resource type="WorldBoundaryShape2D" id="WorldBoundaryShape2D_0s5wn"] + +[node name="Combos" type="Node2D"] +script = ExtResource("1_kdeb4") +mapping_context = ExtResource("2_ahmv3") + +[node name="Player" type="CharacterBody2D" parent="."] +position = Vector2(902, 841) +script = ExtResource("3_kulxp") +dash_speed_bonus = 400.0 +horizontal_movement = ExtResource("4_7328w") +dash_left = ExtResource("5_s5wpr") +dash_right = ExtResource("6_vd0bg") +fireball_left = ExtResource("4_uvwd5") +fireball_right = ExtResource("11_n707x") +fireball_scene = ExtResource("12_fl88r") + +[node name="Sprite" type="Sprite2D" parent="Player"] +texture = ExtResource("4_uej32") + +[node name="CollisionShape2D" type="CollisionShape2D" parent="Player"] +position = Vector2(1.5, 1) +shape = SubResource("RectangleShape2D_8kkfa") + +[node name="Ground" type="StaticBody2D" parent="."] +position = Vector2(-44, 954) + +[node name="ColorRect" type="ColorRect" parent="Ground"] +offset_left = -427.0 +offset_right = 2555.0 +offset_bottom = 150.0 +color = Color(0.285871, 0.0915713, 0.0208481, 1) + +[node name="CollisionShape2D" type="CollisionShape2D" parent="Ground"] +position = Vector2(869, 1) +shape = SubResource("WorldBoundaryShape2D_0s5wn") + +[node name="UILayer" type="CanvasLayer" parent="."] + +[node name="InstructionsLabel" type="RichTextLabel" parent="UILayer"] +anchors_preset = 1 +anchor_left = 1.0 +anchor_right = 1.0 +offset_left = -482.0 +offset_top = 21.0 +offset_bottom = 205.0 +grow_horizontal = 0 +theme = ExtResource("11_i5q2v") +bbcode_enabled = true +text = "Lore, ipsum dolor sit amet." +fit_content = true +scroll_active = false +script = ExtResource("11_obfhv") +instructions_text = "Press %s to move left. +Press %s to move right. +Press %s to dash left. +Press %s to dash right. +Press %s shoot a fireball to the left. +Press %s to shoot a fireball to the right." +actions = Array[Resource("res://addons/guide/guide_action.gd")]([ExtResource("12_0mhlm"), ExtResource("13_xn6qb"), ExtResource("5_s5wpr"), ExtResource("6_vd0bg"), ExtResource("4_uvwd5"), ExtResource("11_n707x")]) + +[node name="DebuggerLayer" type="CanvasLayer" parent="."] + +[node name="GuideDebugger" parent="DebuggerLayer" instance=ExtResource("1_eyn1y")] +theme = ExtResource("11_i5q2v") +metadata/_edit_lock_ = true diff --git a/guide_examples/combos/mapping_contexts/basic_actions/fire.tres b/guide_examples/combos/mapping_contexts/basic_actions/fire.tres new file mode 100644 index 0000000..c2ba86c --- /dev/null +++ b/guide_examples/combos/mapping_contexts/basic_actions/fire.tres @@ -0,0 +1,13 @@ +[gd_resource type="Resource" script_class="GUIDEAction" load_steps=2 format=3 uid="uid://cgr4iegvrkebx"] + +[ext_resource type="Script" path="res://addons/guide/guide_action.gd" id="1_pxjqb"] + +[resource] +script = ExtResource("1_pxjqb") +name = &"" +action_value_type = 0 +block_lower_priority_actions = true +emit_as_godot_actions = false +is_remappable = false +display_name = "" +display_category = "Player Controls" diff --git a/guide_examples/combos/mapping_contexts/basic_actions/move_horizontal.tres b/guide_examples/combos/mapping_contexts/basic_actions/move_horizontal.tres new file mode 100644 index 0000000..f8f3013 --- /dev/null +++ b/guide_examples/combos/mapping_contexts/basic_actions/move_horizontal.tres @@ -0,0 +1,12 @@ +[gd_resource type="Resource" script_class="GUIDEAction" load_steps=2 format=3 uid="uid://b2wemrcnxfbmo"] + +[ext_resource type="Script" path="res://addons/guide/guide_action.gd" id="1_bg42k"] + +[resource] +script = ExtResource("1_bg42k") +name = &"" +action_value_type = 0 +emit_as_godot_actions = false +is_remappable = false +display_name = "" +display_category = "" diff --git a/guide_examples/combos/mapping_contexts/basic_actions/move_left.tres b/guide_examples/combos/mapping_contexts/basic_actions/move_left.tres new file mode 100644 index 0000000..795c18f --- /dev/null +++ b/guide_examples/combos/mapping_contexts/basic_actions/move_left.tres @@ -0,0 +1,12 @@ +[gd_resource type="Resource" script_class="GUIDEAction" load_steps=2 format=3 uid="uid://bqiryilvj5mqv"] + +[ext_resource type="Script" path="res://addons/guide/guide_action.gd" id="1_pxjqb"] + +[resource] +script = ExtResource("1_pxjqb") +name = &"" +action_value_type = 0 +emit_as_godot_actions = false +is_remappable = false +display_name = "" +display_category = "" diff --git a/guide_examples/combos/mapping_contexts/basic_actions/move_right.tres b/guide_examples/combos/mapping_contexts/basic_actions/move_right.tres new file mode 100644 index 0000000..5c2d0d6 --- /dev/null +++ b/guide_examples/combos/mapping_contexts/basic_actions/move_right.tres @@ -0,0 +1,12 @@ +[gd_resource type="Resource" script_class="GUIDEAction" load_steps=2 format=3 uid="uid://bk54ofxos3xxg"] + +[ext_resource type="Script" path="res://addons/guide/guide_action.gd" id="1_ppgom"] + +[resource] +script = ExtResource("1_ppgom") +name = &"" +action_value_type = 0 +emit_as_godot_actions = false +is_remappable = false +display_name = "" +display_category = "" diff --git a/guide_examples/combos/mapping_contexts/combo_actions/dash_left.tres b/guide_examples/combos/mapping_contexts/combo_actions/dash_left.tres new file mode 100644 index 0000000..13b6b54 --- /dev/null +++ b/guide_examples/combos/mapping_contexts/combo_actions/dash_left.tres @@ -0,0 +1,12 @@ +[gd_resource type="Resource" script_class="GUIDEAction" load_steps=2 format=3 uid="uid://dj83uxjdx6r2c"] + +[ext_resource type="Script" path="res://addons/guide/guide_action.gd" id="1_hxh8l"] + +[resource] +script = ExtResource("1_hxh8l") +name = &"" +action_value_type = 0 +emit_as_godot_actions = false +is_remappable = false +display_name = "" +display_category = "" diff --git a/guide_examples/combos/mapping_contexts/combo_actions/dash_right.tres b/guide_examples/combos/mapping_contexts/combo_actions/dash_right.tres new file mode 100644 index 0000000..d18a91b --- /dev/null +++ b/guide_examples/combos/mapping_contexts/combo_actions/dash_right.tres @@ -0,0 +1,12 @@ +[gd_resource type="Resource" script_class="GUIDEAction" load_steps=2 format=3 uid="uid://5ve3hevhhgnw"] + +[ext_resource type="Script" path="res://addons/guide/guide_action.gd" id="1_cbjx7"] + +[resource] +script = ExtResource("1_cbjx7") +name = &"" +action_value_type = 0 +emit_as_godot_actions = false +is_remappable = false +display_name = "" +display_category = "" diff --git a/guide_examples/combos/mapping_contexts/combo_actions/fireball_left.tres b/guide_examples/combos/mapping_contexts/combo_actions/fireball_left.tres new file mode 100644 index 0000000..60e1d6e --- /dev/null +++ b/guide_examples/combos/mapping_contexts/combo_actions/fireball_left.tres @@ -0,0 +1,12 @@ +[gd_resource type="Resource" script_class="GUIDEAction" load_steps=2 format=3 uid="uid://b0761600n8fnb"] + +[ext_resource type="Script" path="res://addons/guide/guide_action.gd" id="1_exrdu"] + +[resource] +script = ExtResource("1_exrdu") +name = &"" +action_value_type = 0 +emit_as_godot_actions = false +is_remappable = false +display_name = "" +display_category = "" diff --git a/guide_examples/combos/mapping_contexts/combo_actions/fireball_right.tres b/guide_examples/combos/mapping_contexts/combo_actions/fireball_right.tres new file mode 100644 index 0000000..beb8e47 --- /dev/null +++ b/guide_examples/combos/mapping_contexts/combo_actions/fireball_right.tres @@ -0,0 +1,12 @@ +[gd_resource type="Resource" script_class="GUIDEAction" load_steps=2 format=3 uid="uid://wdh7cg7kjul0"] + +[ext_resource type="Script" path="res://addons/guide/guide_action.gd" id="1_clys2"] + +[resource] +script = ExtResource("1_clys2") +name = &"" +action_value_type = 0 +emit_as_godot_actions = false +is_remappable = false +display_name = "" +display_category = "" diff --git a/guide_examples/combos/mapping_contexts/combos.tres b/guide_examples/combos/mapping_contexts/combos.tres new file mode 100644 index 0000000..173fae3 --- /dev/null +++ b/guide_examples/combos/mapping_contexts/combos.tres @@ -0,0 +1,299 @@ +[gd_resource type="Resource" script_class="GUIDEMappingContext" load_steps=57 format=3 uid="uid://c7uloa16ajj5p"] + +[ext_resource type="Script" path="res://addons/guide/guide_mapping_context.gd" id="1_bycs2"] +[ext_resource type="Resource" uid="uid://bqiryilvj5mqv" path="res://guide_examples/combos/mapping_contexts/basic_actions/move_left.tres" id="1_pb347"] +[ext_resource type="Script" path="res://addons/guide/guide_action_mapping.gd" id="2_o8ffe"] +[ext_resource type="Script" path="res://addons/guide/inputs/guide_input_key.gd" id="2_wsx31"] +[ext_resource type="Script" path="res://addons/guide/guide_input_mapping.gd" id="3_dnh2v"] +[ext_resource type="Script" path="res://addons/guide/modifiers/guide_modifier_negate.gd" id="3_ji605"] +[ext_resource type="Resource" uid="uid://bk54ofxos3xxg" path="res://guide_examples/combos/mapping_contexts/basic_actions/move_right.tres" id="5_jksbs"] +[ext_resource type="Script" path="res://addons/guide/inputs/guide_input_action.gd" id="8_04uuh"] +[ext_resource type="Script" path="res://addons/guide/triggers/guide_trigger_combo_cancel_action.gd" id="8_ewrgg"] +[ext_resource type="Resource" uid="uid://5ve3hevhhgnw" path="res://guide_examples/combos/mapping_contexts/combo_actions/dash_right.tres" id="9_ciqk8"] +[ext_resource type="Resource" uid="uid://b0761600n8fnb" path="res://guide_examples/combos/mapping_contexts/combo_actions/fireball_left.tres" id="9_lvx6c"] +[ext_resource type="Resource" uid="uid://wdh7cg7kjul0" path="res://guide_examples/combos/mapping_contexts/combo_actions/fireball_right.tres" id="12_icm8e"] +[ext_resource type="Resource" uid="uid://b2wemrcnxfbmo" path="res://guide_examples/combos/mapping_contexts/basic_actions/move_horizontal.tres" id="13_u4d84"] +[ext_resource type="Resource" uid="uid://cgr4iegvrkebx" path="res://guide_examples/combos/mapping_contexts/basic_actions/fire.tres" id="17_yw71c"] +[ext_resource type="Script" path="res://addons/guide/triggers/guide_trigger_combo.gd" id="19_kw0e0"] +[ext_resource type="Script" path="res://addons/guide/triggers/guide_trigger_combo_step.gd" id="20_226av"] +[ext_resource type="Resource" uid="uid://dj83uxjdx6r2c" path="res://guide_examples/combos/mapping_contexts/combo_actions/dash_left.tres" id="21_wfbjl"] + +[sub_resource type="Resource" id="Resource_le3gd"] +script = ExtResource("2_wsx31") +key = 65 +shift = false +control = false +alt = false +meta = false +allow_additional_modifiers = true + +[sub_resource type="Resource" id="Resource_jphf8"] +script = ExtResource("3_dnh2v") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_le3gd") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([]) +metadata/_guide_modifiers_collapsed = true + +[sub_resource type="Resource" id="Resource_ohm7l"] +script = ExtResource("2_o8ffe") +action = ExtResource("1_pb347") +input_mappings = Array[ExtResource("3_dnh2v")]([SubResource("Resource_jphf8")]) +metadata/_guide_input_mappings_collapsed = false + +[sub_resource type="Resource" id="Resource_bf80h"] +script = ExtResource("2_wsx31") +key = 68 +shift = false +control = false +alt = false +meta = false +allow_additional_modifiers = true + +[sub_resource type="Resource" id="Resource_o2rir"] +script = ExtResource("3_dnh2v") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_bf80h") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([]) + +[sub_resource type="Resource" id="Resource_3ojw4"] +script = ExtResource("2_o8ffe") +action = ExtResource("5_jksbs") +input_mappings = Array[ExtResource("3_dnh2v")]([SubResource("Resource_o2rir")]) +metadata/_guide_input_mappings_collapsed = false + +[sub_resource type="Resource" id="Resource_xe8bg"] +script = ExtResource("8_04uuh") +action = ExtResource("1_pb347") + +[sub_resource type="Resource" id="Resource_tisnm"] +script = ExtResource("3_ji605") +x = true +y = true +z = true + +[sub_resource type="Resource" id="Resource_6q14n"] +script = ExtResource("3_dnh2v") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_xe8bg") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([SubResource("Resource_tisnm")]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([]) + +[sub_resource type="Resource" id="Resource_p31qj"] +script = ExtResource("8_04uuh") +action = ExtResource("5_jksbs") + +[sub_resource type="Resource" id="Resource_m3jub"] +script = ExtResource("3_dnh2v") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_p31qj") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([]) + +[sub_resource type="Resource" id="Resource_nypfm"] +script = ExtResource("2_o8ffe") +action = ExtResource("13_u4d84") +input_mappings = Array[ExtResource("3_dnh2v")]([SubResource("Resource_6q14n"), SubResource("Resource_m3jub")]) +metadata/_guide_input_mappings_collapsed = false + +[sub_resource type="Resource" id="Resource_rgf84"] +script = ExtResource("2_wsx31") +key = 32 +shift = false +control = false +alt = false +meta = false +allow_additional_modifiers = true + +[sub_resource type="Resource" id="Resource_wf4jl"] +script = ExtResource("3_dnh2v") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_rgf84") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([]) + +[sub_resource type="Resource" id="Resource_qxroc"] +script = ExtResource("2_o8ffe") +action = ExtResource("17_yw71c") +input_mappings = Array[ExtResource("3_dnh2v")]([SubResource("Resource_wf4jl")]) +metadata/_guide_input_mappings_collapsed = false + +[sub_resource type="Resource" id="Resource_ai4v6"] +script = ExtResource("8_ewrgg") +action = ExtResource("5_jksbs") +completion_events = 1 + +[sub_resource type="Resource" id="Resource_22wmg"] +script = ExtResource("20_226av") +action = ExtResource("1_pb347") +completion_events = 16 +time_to_actuate = 0.5 + +[sub_resource type="Resource" id="Resource_m5xce"] +script = ExtResource("20_226av") +action = ExtResource("1_pb347") +completion_events = 16 +time_to_actuate = 0.5 + +[sub_resource type="Resource" id="Resource_bc2sa"] +script = ExtResource("19_kw0e0") +enable_debug_print = false +steps = Array[ExtResource("20_226av")]([SubResource("Resource_22wmg"), SubResource("Resource_m5xce")]) +cancellation_actions = Array[ExtResource("8_ewrgg")]([SubResource("Resource_ai4v6")]) +actuation_threshold = 0.5 + +[sub_resource type="Resource" id="Resource_00r0g"] +script = ExtResource("3_dnh2v") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([SubResource("Resource_bc2sa")]) + +[sub_resource type="Resource" id="Resource_abarl"] +script = ExtResource("2_o8ffe") +action = ExtResource("21_wfbjl") +input_mappings = Array[ExtResource("3_dnh2v")]([SubResource("Resource_00r0g")]) +metadata/_guide_input_mappings_collapsed = false + +[sub_resource type="Resource" id="Resource_w3it8"] +script = ExtResource("8_ewrgg") +action = ExtResource("1_pb347") +completion_events = 1 + +[sub_resource type="Resource" id="Resource_o1r17"] +script = ExtResource("20_226av") +action = ExtResource("5_jksbs") +completion_events = 16 +time_to_actuate = 0.5 + +[sub_resource type="Resource" id="Resource_y7323"] +script = ExtResource("20_226av") +action = ExtResource("5_jksbs") +completion_events = 16 +time_to_actuate = 0.5 + +[sub_resource type="Resource" id="Resource_0x6c4"] +script = ExtResource("19_kw0e0") +enable_debug_print = false +steps = Array[ExtResource("20_226av")]([SubResource("Resource_o1r17"), SubResource("Resource_y7323")]) +cancellation_actions = Array[ExtResource("8_ewrgg")]([SubResource("Resource_w3it8")]) +actuation_threshold = 0.5 + +[sub_resource type="Resource" id="Resource_wnc21"] +script = ExtResource("3_dnh2v") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([SubResource("Resource_0x6c4")]) + +[sub_resource type="Resource" id="Resource_1vsh7"] +script = ExtResource("2_o8ffe") +action = ExtResource("9_ciqk8") +input_mappings = Array[ExtResource("3_dnh2v")]([SubResource("Resource_wnc21")]) +metadata/_guide_input_mappings_collapsed = false + +[sub_resource type="Resource" id="Resource_cbc1w"] +script = ExtResource("20_226av") +action = ExtResource("5_jksbs") +completion_events = 16 +time_to_actuate = 0.5 + +[sub_resource type="Resource" id="Resource_k4x1t"] +script = ExtResource("20_226av") +action = ExtResource("1_pb347") +completion_events = 16 +time_to_actuate = 0.5 + +[sub_resource type="Resource" id="Resource_ryygs"] +script = ExtResource("20_226av") +action = ExtResource("17_yw71c") +completion_events = 16 +time_to_actuate = 0.5 + +[sub_resource type="Resource" id="Resource_wocqt"] +script = ExtResource("19_kw0e0") +enable_debug_print = false +steps = Array[ExtResource("20_226av")]([SubResource("Resource_cbc1w"), SubResource("Resource_k4x1t"), SubResource("Resource_ryygs")]) +cancellation_actions = Array[ExtResource("8_ewrgg")]([]) +actuation_threshold = 0.5 + +[sub_resource type="Resource" id="Resource_v7om3"] +script = ExtResource("3_dnh2v") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([SubResource("Resource_wocqt")]) + +[sub_resource type="Resource" id="Resource_40qct"] +script = ExtResource("2_o8ffe") +action = ExtResource("9_lvx6c") +input_mappings = Array[ExtResource("3_dnh2v")]([SubResource("Resource_v7om3")]) +metadata/_guide_input_mappings_collapsed = false + +[sub_resource type="Resource" id="Resource_2ivmb"] +script = ExtResource("20_226av") +action = ExtResource("1_pb347") +completion_events = 16 +time_to_actuate = 0.5 + +[sub_resource type="Resource" id="Resource_o88yx"] +script = ExtResource("20_226av") +action = ExtResource("5_jksbs") +completion_events = 16 +time_to_actuate = 0.5 + +[sub_resource type="Resource" id="Resource_j6a01"] +script = ExtResource("20_226av") +action = ExtResource("17_yw71c") +completion_events = 16 +time_to_actuate = 0.5 + +[sub_resource type="Resource" id="Resource_lonke"] +script = ExtResource("19_kw0e0") +enable_debug_print = false +steps = Array[ExtResource("20_226av")]([SubResource("Resource_2ivmb"), SubResource("Resource_o88yx"), SubResource("Resource_j6a01")]) +cancellation_actions = Array[ExtResource("8_ewrgg")]([]) +actuation_threshold = 0.5 + +[sub_resource type="Resource" id="Resource_do51u"] +script = ExtResource("3_dnh2v") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([SubResource("Resource_lonke")]) + +[sub_resource type="Resource" id="Resource_pn365"] +script = ExtResource("2_o8ffe") +action = ExtResource("12_icm8e") +input_mappings = Array[ExtResource("3_dnh2v")]([SubResource("Resource_do51u")]) +metadata/_guide_input_mappings_collapsed = false + +[resource] +script = ExtResource("1_bycs2") +display_name = "" +mappings = Array[ExtResource("2_o8ffe")]([SubResource("Resource_ohm7l"), SubResource("Resource_3ojw4"), SubResource("Resource_nypfm"), SubResource("Resource_qxroc"), SubResource("Resource_abarl"), SubResource("Resource_1vsh7"), SubResource("Resource_40qct"), SubResource("Resource_pn365")]) +metadata/_guide_action_mappings_collapsed = false diff --git a/guide_examples/combos/player.gd b/guide_examples/combos/player.gd new file mode 100644 index 0000000..6153761 --- /dev/null +++ b/guide_examples/combos/player.gd @@ -0,0 +1,50 @@ +## This is a somewhat more complex player example. Note how all the combos +## are completely handled by GUIDE, the player doesn't need to know which +## inputs trigger them. +extends CharacterBody2D + +@export var speed:float = 150 +@export var dash_speed_bonus:float = 250 + +@export var horizontal_movement:GUIDEAction +@export var dash_left:GUIDEAction +@export var dash_right:GUIDEAction +@export var fireball_left:GUIDEAction +@export var fireball_right:GUIDEAction + +@export var fireball_scene:PackedScene + +var _dash_bonus:float + +func _ready(): + # We can use the event system to get notified whenever + # the combo actions trigger. This way we don't need to check them + # in _physics_process every frame. + dash_left.triggered.connect(func(): _dash_bonus = -1) + dash_right.triggered.connect(func(): _dash_bonus = 1) + fireball_left.triggered.connect(_spawn_fireball.bind(Vector2.LEFT)) + fireball_right.triggered.connect(_spawn_fireball.bind(Vector2.RIGHT)) + + +func _physics_process(delta): + # Get current left-right input + var movement:float = horizontal_movement.value_axis_1d + + # Move any dash bonus towards zero + _dash_bonus = move_toward(_dash_bonus, 0, delta) + + # Calculate new velocity + velocity.x = movement * speed + _dash_bonus * dash_speed_bonus + velocity.y = 980 + move_and_slide() + + +func _spawn_fireball(direction:Vector2) -> void: + # spawn a new fireball + var fireball:Node2D = fireball_scene.instantiate() + # add it to the tree + get_parent().add_child(fireball) + # start at our position/orientation + fireball.global_transform = global_transform + # fly into the given direction + fireball.direction = direction diff --git a/guide_examples/combos/player.gd.uid b/guide_examples/combos/player.gd.uid new file mode 100644 index 0000000..1bf5ea7 --- /dev/null +++ b/guide_examples/combos/player.gd.uid @@ -0,0 +1 @@ +uid://bd1xrcr5qu5yd diff --git a/guide_examples/input_contexts/boat.gd b/guide_examples/input_contexts/boat.gd new file mode 100644 index 0000000..428af07 --- /dev/null +++ b/guide_examples/input_contexts/boat.gd @@ -0,0 +1,58 @@ +extends CharacterBody2D + +signal exited() +@export var speed:float = 300 +@export var turn_speed_degrees:float = 180 + +@export var context:GUIDEMappingContext +@export var accelerate:GUIDEAction +@export var turn:GUIDEAction +@export var leave:GUIDEAction + + +@onready var _player_spot:Node2D = %PlayerSpot +@onready var _exit_spot:Node2D = %ExitSpot + +var _player:Node2D + +func _ready(): + leave.triggered.connect(_on_leave) + + +func _physics_process(delta): + # rotate by our turn axis + rotate(turn.value_axis_1d * deg_to_rad(turn_speed_degrees) * delta) + # accelerate by our acceleration axis + velocity = transform.x * accelerate.value_axis_1d * speed + move_and_slide() + + +func enter(player:Node2D): + # Move the player to the player spot + _player = player + player.reparent(_player_spot, false) + _player.position = Vector2.ZERO + + # And enable the boat controls + GUIDE.enable_mapping_context(context) + + +func _on_leave(): + # Disable boat controls + GUIDE.disable_mapping_context(context) + + # put player back in the world + _player.reparent(get_parent(), false) + _player.global_position = _exit_spot.global_position + + # this is to prevent the physics engine from going crazy when moving + # the player's body + await get_tree().physics_frame + + # notify any interested parties that the player has exited + exited.emit() + + + + + diff --git a/guide_examples/input_contexts/boat.gd.uid b/guide_examples/input_contexts/boat.gd.uid new file mode 100644 index 0000000..fe289b9 --- /dev/null +++ b/guide_examples/input_contexts/boat.gd.uid @@ -0,0 +1 @@ +uid://bkggahcvec2hd diff --git a/guide_examples/input_contexts/boat.svg b/guide_examples/input_contexts/boat.svg new file mode 100644 index 0000000..e3c2d18 --- /dev/null +++ b/guide_examples/input_contexts/boat.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/guide_examples/input_contexts/boat.svg.import b/guide_examples/input_contexts/boat.svg.import new file mode 100644 index 0000000..d4bcdff --- /dev/null +++ b/guide_examples/input_contexts/boat.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cyqlk5nkvswx7" +path="res://.godot/imported/boat.svg-547042152e7d4e4afdfc306682d6e571.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://guide_examples/input_contexts/boat.svg" +dest_files=["res://.godot/imported/boat.svg-547042152e7d4e4afdfc306682d6e571.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/guide_examples/input_contexts/input_contexts.gd b/guide_examples/input_contexts/input_contexts.gd new file mode 100644 index 0000000..bcd9c3d --- /dev/null +++ b/guide_examples/input_contexts/input_contexts.gd @@ -0,0 +1,6 @@ +extends Node2D + +@export var starting_context:GUIDEMappingContext + +func _ready(): + GUIDE.enable_mapping_context(starting_context) diff --git a/guide_examples/input_contexts/input_contexts.gd.uid b/guide_examples/input_contexts/input_contexts.gd.uid new file mode 100644 index 0000000..bf71e30 --- /dev/null +++ b/guide_examples/input_contexts/input_contexts.gd.uid @@ -0,0 +1 @@ +uid://cnf3xx5jxiu8q diff --git a/guide_examples/input_contexts/input_contexts.tscn b/guide_examples/input_contexts/input_contexts.tscn new file mode 100644 index 0000000..217aa8d --- /dev/null +++ b/guide_examples/input_contexts/input_contexts.tscn @@ -0,0 +1,194 @@ +[gd_scene load_steps=25 format=3 uid="uid://b6h4wnjfjs70m"] + +[ext_resource type="Script" path="res://guide_examples/input_contexts/boat.gd" id="1_61cdj"] +[ext_resource type="Script" path="res://guide_examples/input_contexts/input_contexts.gd" id="1_386pq"] +[ext_resource type="Texture2D" uid="uid://byjxtsekdl8t2" path="res://guide_examples/shared/godot_logo.svg" id="1_x61i0"] +[ext_resource type="Texture2D" uid="uid://cyqlk5nkvswx7" path="res://guide_examples/input_contexts/boat.svg" id="1_yfaid"] +[ext_resource type="Resource" uid="uid://bv3t73wg3atf7" path="res://guide_examples/input_contexts/mapping_contexts/boat_context.tres" id="2_ha2ml"] +[ext_resource type="Resource" uid="uid://5jercxe6t3go" path="res://guide_examples/input_contexts/mapping_contexts/boat_actions/accelerate.tres" id="3_8s4br"] +[ext_resource type="Script" path="res://guide_examples/input_contexts/player.gd" id="3_kn2qk"] +[ext_resource type="Resource" uid="uid://cplpvxhus6bwb" path="res://guide_examples/input_contexts/mapping_contexts/player_context.tres" id="4_3xwjv"] +[ext_resource type="Resource" uid="uid://qsysw0ljlj0l" path="res://guide_examples/input_contexts/mapping_contexts/boat_actions/turn.tres" id="4_w1gps"] +[ext_resource type="Resource" uid="uid://cnaj42xnfcibo" path="res://guide_examples/input_contexts/mapping_contexts/player_actions/move.tres" id="5_70jqj"] +[ext_resource type="Resource" uid="uid://bk2j1ww7iwqd0" path="res://guide_examples/input_contexts/mapping_contexts/boat_actions/leave.tres" id="5_typxl"] +[ext_resource type="Resource" uid="uid://crjkk2edn8g8k" path="res://guide_examples/input_contexts/mapping_contexts/player_actions/use.tres" id="6_aiqns"] +[ext_resource type="PackedScene" uid="uid://dkr80d2pi0d41" path="res://addons/guide/debugger/guide_debugger.tscn" id="12_jcoq7"] +[ext_resource type="Theme" uid="uid://dot0gi1yoqmrl" path="res://guide_examples/shared/ui_theme.tres" id="12_u0g3a"] +[ext_resource type="Script" path="res://guide_examples/shared/instructions_label.gd" id="14_ui0u7"] + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_w57h4"] +size = Vector2(1972, 59) + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_r5hqg"] +size = Vector2(59, 1161) + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_ifvju"] +size = Vector2(2030.5, 60.5) + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_qarqo"] +size = Vector2(102, 1160.5) + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_la1oy"] +size = Vector2(446.5, 1141) + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_3q8sb"] +size = Vector2(368, 148) + +[sub_resource type="CapsuleShape2D" id="CapsuleShape2D_54ta5"] +radius = 75.0 +height = 252.0 + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_3lf7l"] +size = Vector2(126, 130) + +[sub_resource type="CircleShape2D" id="CircleShape2D_dt2nf"] +radius = 141.891 + +[node name="InputContexts" type="Node2D"] +script = ExtResource("1_386pq") +starting_context = ExtResource("4_3xwjv") + +[node name="World" type="Node2D" parent="."] + +[node name="Sea" type="ColorRect" parent="World"] +offset_right = 2009.0 +offset_bottom = 1129.0 +color = Color(0.0440738, 0.000205037, 0.549847, 1) +metadata/_edit_lock_ = true + +[node name="Land" type="Polygon2D" parent="World"] +color = Color(0.336331, 0.394587, 0.063959, 1) +polygon = PackedVector2Array(55, -51, 259, -24, 398, 124, 356, 225, 279, 461, 394, 656, 412, 865, 342, 1085, -15, 1119, -22, -67) +metadata/_edit_lock_ = true + +[node name="Jetty" type="ColorRect" parent="World/Land"] +offset_left = 283.0 +offset_top = 144.0 +offset_right = 641.0 +offset_bottom = 280.0 +color = Color(0.243329, 0.15798, 7.21961e-08, 1) + +[node name="World Boundaries" type="StaticBody2D" parent="World"] + +[node name="CollisionShape2D" type="CollisionShape2D" parent="World/World Boundaries"] +position = Vector2(976, -19.5) +shape = SubResource("RectangleShape2D_w57h4") + +[node name="CollisionShape2D2" type="CollisionShape2D" parent="World/World Boundaries"] +position = Vector2(-10, 532) +shape = SubResource("RectangleShape2D_r5hqg") + +[node name="CollisionShape2D3" type="CollisionShape2D" parent="World/World Boundaries"] +position = Vector2(975.75, 1082.25) +shape = SubResource("RectangleShape2D_ifvju") + +[node name="CollisionShape2D4" type="CollisionShape2D" parent="World/World Boundaries"] +position = Vector2(1940, 532.25) +shape = SubResource("RectangleShape2D_qarqo") + +[node name="NoBoatZone" type="StaticBody2D" parent="World"] +collision_layer = 2 +collision_mask = 0 + +[node name="CollisionShape2D" type="CollisionShape2D" parent="World/NoBoatZone"] +position = Vector2(210.75, 556.5) +shape = SubResource("RectangleShape2D_la1oy") + +[node name="CollisionShape2D2" type="CollisionShape2D" parent="World/NoBoatZone"] +position = Vector2(454, 211) +shape = SubResource("RectangleShape2D_3q8sb") + +[node name="Boat" type="CharacterBody2D" parent="."] +position = Vector2(744, 269) +rotation = -1.44336 +collision_layer = 5 +collision_mask = 3 +script = ExtResource("1_61cdj") +speed = 500.0 +context = ExtResource("2_ha2ml") +accelerate = ExtResource("3_8s4br") +turn = ExtResource("4_w1gps") +leave = ExtResource("5_typxl") + +[node name="Boat" type="Sprite2D" parent="Boat"] +texture = ExtResource("1_yfaid") + +[node name="CollisionShape2D" type="CollisionShape2D" parent="Boat"] +position = Vector2(-13, 0) +rotation = -1.57573 +shape = SubResource("CapsuleShape2D_54ta5") + +[node name="PlayerSpot" type="Node2D" parent="Boat"] +unique_name_in_owner = true +rotation = 1.5708 +scale = Vector2(0.8, 0.8) + +[node name="ExitSpot" type="Marker2D" parent="Boat"] +unique_name_in_owner = true +position = Vector2(-11.0732, -212.314) + +[node name="Player" type="CharacterBody2D" parent="."] +position = Vector2(205, 212) +script = ExtResource("3_kn2qk") +context = ExtResource("4_3xwjv") +move = ExtResource("5_70jqj") +use = ExtResource("6_aiqns") + +[node name="Icon" type="Sprite2D" parent="Player"] +texture = ExtResource("1_x61i0") + +[node name="CollisionShape" type="CollisionShape2D" parent="Player"] +unique_name_in_owner = true +position = Vector2(-1, 1) +shape = SubResource("RectangleShape2D_3lf7l") + +[node name="DetectionArea" type="Area2D" parent="Player"] +unique_name_in_owner = true +collision_layer = 0 +collision_mask = 4 + +[node name="CollisionShape2D" type="CollisionShape2D" parent="Player/DetectionArea"] +shape = SubResource("CircleShape2D_dt2nf") + +[node name="UILayer" type="CanvasLayer" parent="."] + +[node name="Label" type="Label" parent="UILayer"] +offset_left = 894.0 +offset_top = 24.0 +offset_right = 1872.0 +offset_bottom = 132.0 +theme = ExtResource("12_u0g3a") +text = "This demonstrates the use of multiple mapping contexts. We have one for the player +and one for the boat. When the player enters the boat, the boat mappings will +become active and will become inactive once the player leaves. " + +[node name="BoatInstructions" type="RichTextLabel" parent="UILayer"] +offset_left = 1316.0 +offset_top = 772.0 +offset_right = 1356.0 +offset_bottom = 812.0 +theme = ExtResource("12_u0g3a") +script = ExtResource("14_ui0u7") +instructions_text = "%s to accelerate/break. +%s to turn the boat. +%s to leave the boat." +actions = Array[Resource("res://addons/guide/guide_action.gd")]([ExtResource("3_8s4br"), ExtResource("4_w1gps"), ExtResource("5_typxl")]) +limit_to_context = ExtResource("2_ha2ml") + +[node name="PlayerInstructions" type="RichTextLabel" parent="UILayer"] +offset_left = 1316.0 +offset_top = 772.0 +offset_right = 1356.0 +offset_bottom = 812.0 +theme = ExtResource("12_u0g3a") +script = ExtResource("14_ui0u7") +instructions_text = "%s to move. +%s to enter the boat. +" +actions = Array[Resource("res://addons/guide/guide_action.gd")]([ExtResource("5_70jqj"), ExtResource("6_aiqns")]) +limit_to_context = ExtResource("4_3xwjv") + +[node name="DebugLayer" type="CanvasLayer" parent="."] + +[node name="GuideDebugger" parent="DebugLayer" instance=ExtResource("12_jcoq7")] +theme = ExtResource("12_u0g3a") diff --git a/guide_examples/input_contexts/mapping_contexts/boat_actions/accelerate.tres b/guide_examples/input_contexts/mapping_contexts/boat_actions/accelerate.tres new file mode 100644 index 0000000..42879f6 --- /dev/null +++ b/guide_examples/input_contexts/mapping_contexts/boat_actions/accelerate.tres @@ -0,0 +1,12 @@ +[gd_resource type="Resource" script_class="GUIDEAction" load_steps=2 format=3 uid="uid://5jercxe6t3go"] + +[ext_resource type="Script" path="res://addons/guide/guide_action.gd" id="1_tkn2p"] + +[resource] +script = ExtResource("1_tkn2p") +name = &"" +action_value_type = 1 +emit_as_godot_actions = false +is_remappable = false +display_name = "" +display_category = "" diff --git a/guide_examples/input_contexts/mapping_contexts/boat_actions/leave.tres b/guide_examples/input_contexts/mapping_contexts/boat_actions/leave.tres new file mode 100644 index 0000000..39c22eb --- /dev/null +++ b/guide_examples/input_contexts/mapping_contexts/boat_actions/leave.tres @@ -0,0 +1,12 @@ +[gd_resource type="Resource" script_class="GUIDEAction" load_steps=2 format=3 uid="uid://bk2j1ww7iwqd0"] + +[ext_resource type="Script" path="res://addons/guide/guide_action.gd" id="1_3d3m7"] + +[resource] +script = ExtResource("1_3d3m7") +name = &"" +action_value_type = 0 +emit_as_godot_actions = false +is_remappable = false +display_name = "" +display_category = "" diff --git a/guide_examples/input_contexts/mapping_contexts/boat_actions/turn.tres b/guide_examples/input_contexts/mapping_contexts/boat_actions/turn.tres new file mode 100644 index 0000000..d33c369 --- /dev/null +++ b/guide_examples/input_contexts/mapping_contexts/boat_actions/turn.tres @@ -0,0 +1,12 @@ +[gd_resource type="Resource" script_class="GUIDEAction" load_steps=2 format=3 uid="uid://qsysw0ljlj0l"] + +[ext_resource type="Script" path="res://addons/guide/guide_action.gd" id="1_4gxp2"] + +[resource] +script = ExtResource("1_4gxp2") +name = &"" +action_value_type = 1 +emit_as_godot_actions = false +is_remappable = false +display_name = "" +display_category = "" diff --git a/guide_examples/input_contexts/mapping_contexts/boat_context.tres b/guide_examples/input_contexts/mapping_contexts/boat_context.tres new file mode 100644 index 0000000..1133364 --- /dev/null +++ b/guide_examples/input_contexts/mapping_contexts/boat_context.tres @@ -0,0 +1,142 @@ +[gd_resource type="Resource" script_class="GUIDEMappingContext" load_steps=26 format=3 uid="uid://bv3t73wg3atf7"] + +[ext_resource type="Resource" uid="uid://qsysw0ljlj0l" path="res://guide_examples/input_contexts/mapping_contexts/boat_actions/turn.tres" id="1_ovglr"] +[ext_resource type="Script" path="res://addons/guide/inputs/guide_input_key.gd" id="2_0hduu"] +[ext_resource type="Script" path="res://addons/guide/modifiers/guide_modifier_negate.gd" id="3_jicb2"] +[ext_resource type="Script" path="res://addons/guide/guide_input_mapping.gd" id="4_ymfat"] +[ext_resource type="Script" path="res://addons/guide/guide_action_mapping.gd" id="5_3quxn"] +[ext_resource type="Resource" uid="uid://5jercxe6t3go" path="res://guide_examples/input_contexts/mapping_contexts/boat_actions/accelerate.tres" id="6_pocgd"] +[ext_resource type="Script" path="res://addons/guide/guide_mapping_context.gd" id="7_1yt57"] +[ext_resource type="Resource" uid="uid://bk2j1ww7iwqd0" path="res://guide_examples/input_contexts/mapping_contexts/boat_actions/leave.tres" id="7_t38lc"] +[ext_resource type="Script" path="res://addons/guide/triggers/guide_trigger_released.gd" id="8_f0mvl"] + +[sub_resource type="Resource" id="Resource_2l73a"] +script = ExtResource("2_0hduu") +key = 87 +shift = false +control = false +alt = false +meta = false +allow_additional_modifiers = true + +[sub_resource type="Resource" id="Resource_p26ag"] +script = ExtResource("4_ymfat") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_2l73a") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([]) + +[sub_resource type="Resource" id="Resource_fndx2"] +script = ExtResource("2_0hduu") +key = 83 +shift = false +control = false +alt = false +meta = false +allow_additional_modifiers = true + +[sub_resource type="Resource" id="Resource_8c6p8"] +script = ExtResource("3_jicb2") +x = true +y = true +z = true + +[sub_resource type="Resource" id="Resource_7ubh7"] +script = ExtResource("4_ymfat") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_fndx2") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([SubResource("Resource_8c6p8")]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([]) + +[sub_resource type="Resource" id="Resource_yd1l1"] +script = ExtResource("5_3quxn") +action = ExtResource("6_pocgd") +input_mappings = Array[ExtResource("4_ymfat")]([SubResource("Resource_p26ag"), SubResource("Resource_7ubh7")]) + +[sub_resource type="Resource" id="Resource_bw7vh"] +script = ExtResource("2_0hduu") +key = 65 +shift = false +control = false +alt = false +meta = false +allow_additional_modifiers = true + +[sub_resource type="Resource" id="Resource_55txo"] +script = ExtResource("3_jicb2") +x = true +y = true +z = true + +[sub_resource type="Resource" id="Resource_4pm2b"] +script = ExtResource("4_ymfat") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_bw7vh") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([SubResource("Resource_55txo")]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([]) + +[sub_resource type="Resource" id="Resource_mathf"] +script = ExtResource("2_0hduu") +key = 68 +shift = false +control = false +alt = false +meta = false +allow_additional_modifiers = true + +[sub_resource type="Resource" id="Resource_j5i1b"] +script = ExtResource("4_ymfat") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_mathf") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([]) + +[sub_resource type="Resource" id="Resource_siw8f"] +script = ExtResource("5_3quxn") +action = ExtResource("1_ovglr") +input_mappings = Array[ExtResource("4_ymfat")]([SubResource("Resource_4pm2b"), SubResource("Resource_j5i1b")]) + +[sub_resource type="Resource" id="Resource_xiqqo"] +script = ExtResource("2_0hduu") +key = 69 +shift = false +control = false +alt = false +meta = false +allow_additional_modifiers = true + +[sub_resource type="Resource" id="Resource_ooy6b"] +script = ExtResource("8_f0mvl") +actuation_threshold = 0.5 + +[sub_resource type="Resource" id="Resource_8047g"] +script = ExtResource("4_ymfat") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_xiqqo") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([SubResource("Resource_ooy6b")]) + +[sub_resource type="Resource" id="Resource_npqbc"] +script = ExtResource("5_3quxn") +action = ExtResource("7_t38lc") +input_mappings = Array[ExtResource("4_ymfat")]([SubResource("Resource_8047g")]) + +[resource] +script = ExtResource("7_1yt57") +display_name = "" +mappings = Array[ExtResource("5_3quxn")]([SubResource("Resource_yd1l1"), SubResource("Resource_siw8f"), SubResource("Resource_npqbc")]) diff --git a/guide_examples/input_contexts/mapping_contexts/player_actions/move.tres b/guide_examples/input_contexts/mapping_contexts/player_actions/move.tres new file mode 100644 index 0000000..0728e9a --- /dev/null +++ b/guide_examples/input_contexts/mapping_contexts/player_actions/move.tres @@ -0,0 +1,12 @@ +[gd_resource type="Resource" script_class="GUIDEAction" load_steps=2 format=3 uid="uid://cnaj42xnfcibo"] + +[ext_resource type="Script" path="res://addons/guide/guide_action.gd" id="1_amhrr"] + +[resource] +script = ExtResource("1_amhrr") +name = &"" +action_value_type = 2 +emit_as_godot_actions = false +is_remappable = false +display_name = "" +display_category = "" diff --git a/guide_examples/input_contexts/mapping_contexts/player_actions/use.tres b/guide_examples/input_contexts/mapping_contexts/player_actions/use.tres new file mode 100644 index 0000000..0d12a51 --- /dev/null +++ b/guide_examples/input_contexts/mapping_contexts/player_actions/use.tres @@ -0,0 +1,12 @@ +[gd_resource type="Resource" script_class="GUIDEAction" load_steps=2 format=3 uid="uid://crjkk2edn8g8k"] + +[ext_resource type="Script" path="res://addons/guide/guide_action.gd" id="1_7lwep"] + +[resource] +script = ExtResource("1_7lwep") +name = &"" +action_value_type = 0 +emit_as_godot_actions = false +is_remappable = false +display_name = "" +display_category = "" diff --git a/guide_examples/input_contexts/mapping_contexts/player_context.tres b/guide_examples/input_contexts/mapping_contexts/player_context.tres new file mode 100644 index 0000000..eba76aa --- /dev/null +++ b/guide_examples/input_contexts/mapping_contexts/player_context.tres @@ -0,0 +1,145 @@ +[gd_resource type="Resource" script_class="GUIDEMappingContext" load_steps=27 format=3 uid="uid://cplpvxhus6bwb"] + +[ext_resource type="Script" path="res://addons/guide/guide_mapping_context.gd" id="1_126cd"] +[ext_resource type="Resource" uid="uid://cnaj42xnfcibo" path="res://guide_examples/input_contexts/mapping_contexts/player_actions/move.tres" id="1_hm3wk"] +[ext_resource type="Script" path="res://addons/guide/inputs/guide_input_key.gd" id="2_xomf3"] +[ext_resource type="Script" path="res://addons/guide/modifiers/guide_modifier_input_swizzle.gd" id="3_0ask7"] +[ext_resource type="Script" path="res://addons/guide/modifiers/guide_modifier_negate.gd" id="4_07e03"] +[ext_resource type="Script" path="res://addons/guide/guide_input_mapping.gd" id="5_1myws"] +[ext_resource type="Script" path="res://addons/guide/guide_action_mapping.gd" id="6_h3mfx"] +[ext_resource type="Resource" uid="uid://crjkk2edn8g8k" path="res://guide_examples/input_contexts/mapping_contexts/player_actions/use.tres" id="7_dx1om"] +[ext_resource type="Script" path="res://addons/guide/triggers/guide_trigger_released.gd" id="8_hlvtj"] + +[sub_resource type="Resource" id="Resource_5yf1p"] +script = ExtResource("2_xomf3") +key = 87 +shift = false +control = false +alt = false +meta = false +allow_additional_modifiers = false + +[sub_resource type="Resource" id="Resource_vo6fb"] +script = ExtResource("3_0ask7") +order = 0 + +[sub_resource type="Resource" id="Resource_ixhgx"] +script = ExtResource("4_07e03") +x = true +y = true +z = true + +[sub_resource type="Resource" id="Resource_pia7e"] +script = ExtResource("5_1myws") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_5yf1p") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([SubResource("Resource_vo6fb"), SubResource("Resource_ixhgx")]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([]) + +[sub_resource type="Resource" id="Resource_a11mt"] +script = ExtResource("2_xomf3") +key = 83 +shift = false +control = false +alt = false +meta = false +allow_additional_modifiers = false + +[sub_resource type="Resource" id="Resource_6ecpg"] +script = ExtResource("3_0ask7") +order = 0 + +[sub_resource type="Resource" id="Resource_s1oiy"] +script = ExtResource("5_1myws") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_a11mt") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([SubResource("Resource_6ecpg")]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([]) + +[sub_resource type="Resource" id="Resource_m84eo"] +script = ExtResource("2_xomf3") +key = 65 +shift = false +control = false +alt = false +meta = false +allow_additional_modifiers = false + +[sub_resource type="Resource" id="Resource_qn63o"] +script = ExtResource("4_07e03") +x = true +y = true +z = true + +[sub_resource type="Resource" id="Resource_4dh7v"] +script = ExtResource("5_1myws") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_m84eo") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([SubResource("Resource_qn63o")]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([]) + +[sub_resource type="Resource" id="Resource_njvt5"] +script = ExtResource("2_xomf3") +key = 68 +shift = false +control = false +alt = false +meta = false +allow_additional_modifiers = false + +[sub_resource type="Resource" id="Resource_hvhr4"] +script = ExtResource("5_1myws") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_njvt5") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([]) + +[sub_resource type="Resource" id="Resource_o0rtq"] +script = ExtResource("6_h3mfx") +action = ExtResource("1_hm3wk") +input_mappings = Array[ExtResource("5_1myws")]([SubResource("Resource_pia7e"), SubResource("Resource_s1oiy"), SubResource("Resource_4dh7v"), SubResource("Resource_hvhr4")]) + +[sub_resource type="Resource" id="Resource_t3oa4"] +script = ExtResource("2_xomf3") +key = 69 +shift = false +control = false +alt = false +meta = false +allow_additional_modifiers = false + +[sub_resource type="Resource" id="Resource_ocal3"] +script = ExtResource("8_hlvtj") +actuation_threshold = 0.5 + +[sub_resource type="Resource" id="Resource_o528y"] +script = ExtResource("5_1myws") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_t3oa4") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([SubResource("Resource_ocal3")]) + +[sub_resource type="Resource" id="Resource_0a33p"] +script = ExtResource("6_h3mfx") +action = ExtResource("7_dx1om") +input_mappings = Array[ExtResource("5_1myws")]([SubResource("Resource_o528y")]) + +[resource] +script = ExtResource("1_126cd") +display_name = "" +mappings = Array[ExtResource("6_h3mfx")]([SubResource("Resource_o0rtq"), SubResource("Resource_0a33p")]) diff --git a/guide_examples/input_contexts/player.gd b/guide_examples/input_contexts/player.gd new file mode 100644 index 0000000..8c1aaaa --- /dev/null +++ b/guide_examples/input_contexts/player.gd @@ -0,0 +1,42 @@ +extends CharacterBody2D + +@export var context:GUIDEMappingContext +@export var move:GUIDEAction +@export var use:GUIDEAction + +@export var speed:float = 300 + +@onready var _detection_area:Area2D = %DetectionArea +@onready var _collision_shape:CollisionShape2D = %CollisionShape + +func _ready(): + use.triggered.connect(_enter_boat) + +func _physics_process(_delta): + velocity = move.value_axis_2d.normalized() * speed + move_and_slide() + + +func _enter_boat(): + var boats := _detection_area.get_overlapping_bodies() + if boats.is_empty(): + return + + # Disable player input while in the boat + GUIDE.disable_mapping_context(context) + + # disable our own collisions while in the boat + _collision_shape.set_deferred("disabled", true) + + # enter the boat + boats[0].enter(self) + boats[0].exited.connect(_boat_exited, CONNECT_ONE_SHOT) + + +func _boat_exited(): + # re-enable our own mapping context + GUIDE.enable_mapping_context(context) + + # and re-enable our collisions + _collision_shape.set_deferred("disabled", false) + diff --git a/guide_examples/input_contexts/player.gd.uid b/guide_examples/input_contexts/player.gd.uid new file mode 100644 index 0000000..e67bdcc --- /dev/null +++ b/guide_examples/input_contexts/player.gd.uid @@ -0,0 +1 @@ +uid://bc00xf6yb6mw0 diff --git a/guide_examples/input_scheme_switching/input_scheme_switching.gd b/guide_examples/input_scheme_switching/input_scheme_switching.gd new file mode 100644 index 0000000..0053d01 --- /dev/null +++ b/guide_examples/input_scheme_switching/input_scheme_switching.gd @@ -0,0 +1,21 @@ +## This example shows how to switch the input scheme on the fly. +extends Node + +@export var joystick_scheme:GUIDEMappingContext +@export var keyboard_scheme:GUIDEMappingContext +@export var switch_to_keyboard:GUIDEAction +@export var switch_to_joystick:GUIDEAction + +func _ready(): + # When we get a command to switch the input scheme, we + # switch. + switch_to_keyboard.triggered.connect(_switch_input_scheme.bind(keyboard_scheme)) + switch_to_joystick.triggered.connect(_switch_input_scheme.bind(joystick_scheme)) + + # And switch now to enable keyboard + _switch_input_scheme(keyboard_scheme) + + +func _switch_input_scheme(context:GUIDEMappingContext): + GUIDE.enable_mapping_context(context, true) + diff --git a/guide_examples/input_scheme_switching/input_scheme_switching.gd.uid b/guide_examples/input_scheme_switching/input_scheme_switching.gd.uid new file mode 100644 index 0000000..e326345 --- /dev/null +++ b/guide_examples/input_scheme_switching/input_scheme_switching.gd.uid @@ -0,0 +1 @@ +uid://fhw2j8umfqty diff --git a/guide_examples/input_scheme_switching/input_scheme_switching.tscn b/guide_examples/input_scheme_switching/input_scheme_switching.tscn new file mode 100644 index 0000000..764d4ee --- /dev/null +++ b/guide_examples/input_scheme_switching/input_scheme_switching.tscn @@ -0,0 +1,60 @@ +[gd_scene load_steps=14 format=3 uid="uid://dvbxt8jyo8okp"] + +[ext_resource type="Script" path="res://guide_examples/input_scheme_switching/input_scheme_switching.gd" id="1_7l2n1"] +[ext_resource type="Texture2D" uid="uid://byjxtsekdl8t2" path="res://guide_examples/shared/godot_logo.svg" id="1_t4jeg"] +[ext_resource type="Resource" uid="uid://x33fk5wo7l2r" path="res://guide_examples/input_scheme_switching/mapping_contexts/joystick_scheme.tres" id="2_fx1v6"] +[ext_resource type="Resource" uid="uid://2hl7iqpondhi" path="res://guide_examples/input_scheme_switching/mapping_contexts/keyboard_scheme.tres" id="3_pvyn2"] +[ext_resource type="Resource" uid="uid://cxn2ibe1mn3sb" path="res://guide_examples/input_scheme_switching/mapping_contexts/actions/move.tres" id="4_3bnea"] +[ext_resource type="Resource" uid="uid://b11rcmd3hse58" path="res://guide_examples/input_scheme_switching/mapping_contexts/actions/switch_to_keyboard.tres" id="4_tts5j"] +[ext_resource type="Resource" uid="uid://c7htf8h44vbwi" path="res://guide_examples/input_scheme_switching/mapping_contexts/actions/shoot.tres" id="5_4yg1b"] +[ext_resource type="Resource" uid="uid://vctiwgvnl0ba" path="res://guide_examples/input_scheme_switching/mapping_contexts/actions/switch_to_joystick.tres" id="6_b05vw"] +[ext_resource type="Script" path="res://guide_examples/input_scheme_switching/player.gd" id="7_2r4ev"] +[ext_resource type="PackedScene" uid="uid://dkr80d2pi0d41" path="res://addons/guide/debugger/guide_debugger.tscn" id="8_nv6u5"] +[ext_resource type="PackedScene" uid="uid://c36cnvgv2ur60" path="res://guide_examples/shared/fireball/fireball.tscn" id="8_t3npb"] +[ext_resource type="Theme" uid="uid://dot0gi1yoqmrl" path="res://guide_examples/shared/ui_theme.tres" id="10_vp4t3"] +[ext_resource type="Script" path="res://guide_examples/shared/instructions_label.gd" id="11_qdni4"] + +[node name="InputSchemeSwitching" type="Node2D"] +script = ExtResource("1_7l2n1") +joystick_scheme = ExtResource("2_fx1v6") +keyboard_scheme = ExtResource("3_pvyn2") +switch_to_keyboard = ExtResource("4_tts5j") +switch_to_joystick = ExtResource("6_b05vw") + +[node name="Player" type="Node2D" parent="."] +position = Vector2(929, 695) +script = ExtResource("7_2r4ev") +speed = 300.0 +move_action = ExtResource("4_3bnea") +shoot_action = ExtResource("5_4yg1b") +fireball_scene = ExtResource("8_t3npb") + +[node name="GodotLogo" type="Sprite2D" parent="Player"] +texture = ExtResource("1_t4jeg") + +[node name="UI" type="CanvasLayer" parent="."] + +[node name="InstructionsLabel" type="RichTextLabel" parent="UI"] +unique_name_in_owner = true +custom_minimum_size = Vector2(500, 0) +anchors_preset = 1 +anchor_left = 1.0 +anchor_right = 1.0 +offset_left = -552.0 +offset_top = 85.0 +offset_right = -52.0 +offset_bottom = 125.0 +grow_horizontal = 0 +theme = ExtResource("10_vp4t3") +bbcode_enabled = true +text = "Lorem Ipsum Dolor" +fit_content = true +script = ExtResource("11_qdni4") +instructions_text = "%s to move. +%s to shoot a fireball." +actions = Array[Resource("res://addons/guide/guide_action.gd")]([ExtResource("4_3bnea"), ExtResource("5_4yg1b")]) + +[node name="Debugger" type="CanvasLayer" parent="."] + +[node name="GuideDebugger" parent="Debugger" instance=ExtResource("8_nv6u5")] +theme = ExtResource("10_vp4t3") diff --git a/guide_examples/input_scheme_switching/mapping_contexts/actions/move.tres b/guide_examples/input_scheme_switching/mapping_contexts/actions/move.tres new file mode 100644 index 0000000..ab4db08 --- /dev/null +++ b/guide_examples/input_scheme_switching/mapping_contexts/actions/move.tres @@ -0,0 +1,12 @@ +[gd_resource type="Resource" script_class="GUIDEAction" load_steps=2 format=3 uid="uid://cxn2ibe1mn3sb"] + +[ext_resource type="Script" path="res://addons/guide/guide_action.gd" id="1_anxy1"] + +[resource] +script = ExtResource("1_anxy1") +name = &"" +action_value_type = 2 +emit_as_godot_actions = false +is_remappable = false +display_name = "" +display_category = "" diff --git a/guide_examples/input_scheme_switching/mapping_contexts/actions/shoot.tres b/guide_examples/input_scheme_switching/mapping_contexts/actions/shoot.tres new file mode 100644 index 0000000..7702a43 --- /dev/null +++ b/guide_examples/input_scheme_switching/mapping_contexts/actions/shoot.tres @@ -0,0 +1,12 @@ +[gd_resource type="Resource" script_class="GUIDEAction" load_steps=2 format=3 uid="uid://c7htf8h44vbwi"] + +[ext_resource type="Script" path="res://addons/guide/guide_action.gd" id="1_bkoj8"] + +[resource] +script = ExtResource("1_bkoj8") +name = &"" +action_value_type = 0 +emit_as_godot_actions = false +is_remappable = false +display_name = "" +display_category = "" diff --git a/guide_examples/input_scheme_switching/mapping_contexts/actions/switch_to_joystick.tres b/guide_examples/input_scheme_switching/mapping_contexts/actions/switch_to_joystick.tres new file mode 100644 index 0000000..ef381e4 --- /dev/null +++ b/guide_examples/input_scheme_switching/mapping_contexts/actions/switch_to_joystick.tres @@ -0,0 +1,12 @@ +[gd_resource type="Resource" script_class="GUIDEAction" load_steps=2 format=3 uid="uid://vctiwgvnl0ba"] + +[ext_resource type="Script" path="res://addons/guide/guide_action.gd" id="1_8q327"] + +[resource] +script = ExtResource("1_8q327") +name = &"" +action_value_type = 0 +emit_as_godot_actions = false +is_remappable = false +display_name = "" +display_category = "" diff --git a/guide_examples/input_scheme_switching/mapping_contexts/actions/switch_to_keyboard.tres b/guide_examples/input_scheme_switching/mapping_contexts/actions/switch_to_keyboard.tres new file mode 100644 index 0000000..aedd67c --- /dev/null +++ b/guide_examples/input_scheme_switching/mapping_contexts/actions/switch_to_keyboard.tres @@ -0,0 +1,13 @@ +[gd_resource type="Resource" script_class="GUIDEAction" load_steps=2 format=3 uid="uid://b11rcmd3hse58"] + +[ext_resource type="Script" path="res://addons/guide/guide_action.gd" id="1_4oh0y"] + +[resource] +script = ExtResource("1_4oh0y") +name = &"" +action_value_type = 0 +block_lower_priority_actions = true +emit_as_godot_actions = false +is_remappable = false +display_name = "" +display_category = "" diff --git a/guide_examples/input_scheme_switching/mapping_contexts/joystick_scheme.tres b/guide_examples/input_scheme_switching/mapping_contexts/joystick_scheme.tres new file mode 100644 index 0000000..9cd9be0 --- /dev/null +++ b/guide_examples/input_scheme_switching/mapping_contexts/joystick_scheme.tres @@ -0,0 +1,97 @@ +[gd_resource type="Resource" script_class="GUIDEMappingContext" load_steps=23 format=3 uid="uid://x33fk5wo7l2r"] + +[ext_resource type="Resource" uid="uid://cxn2ibe1mn3sb" path="res://guide_examples/input_scheme_switching/mapping_contexts/actions/move.tres" id="1_hupae"] +[ext_resource type="Script" path="res://addons/guide/inputs/guide_input_joy_axis_2d.gd" id="2_t6p7a"] +[ext_resource type="Script" path="res://addons/guide/guide_input_mapping.gd" id="3_6jy3p"] +[ext_resource type="Script" path="res://addons/guide/modifiers/guide_modifier_deadzone.gd" id="3_c1g58"] +[ext_resource type="Script" path="res://addons/guide/guide_action_mapping.gd" id="4_ssubt"] +[ext_resource type="Resource" uid="uid://c7htf8h44vbwi" path="res://guide_examples/input_scheme_switching/mapping_contexts/actions/shoot.tres" id="5_pd4bb"] +[ext_resource type="Script" path="res://addons/guide/inputs/guide_input_joy_button.gd" id="6_eieuy"] +[ext_resource type="Script" path="res://addons/guide/triggers/guide_trigger_pressed.gd" id="7_0nn3e"] +[ext_resource type="Resource" uid="uid://b11rcmd3hse58" path="res://guide_examples/input_scheme_switching/mapping_contexts/actions/switch_to_keyboard.tres" id="8_7nlt6"] +[ext_resource type="Script" path="res://addons/guide/inputs/guide_input_any.gd" id="8_hdd7g"] +[ext_resource type="Script" path="res://addons/guide/guide_mapping_context.gd" id="9_1vdw8"] + +[sub_resource type="Resource" id="Resource_7qyuq"] +script = ExtResource("2_t6p7a") +x = 0 +y = 1 +joy_index = -1 + +[sub_resource type="Resource" id="Resource_8pjab"] +script = ExtResource("3_c1g58") +lower_threshold = 0.2 +upper_threshold = 1.0 + +[sub_resource type="Resource" id="Resource_wxd67"] +script = ExtResource("3_6jy3p") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_7qyuq") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([SubResource("Resource_8pjab")]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([]) + +[sub_resource type="Resource" id="Resource_lomew"] +script = ExtResource("4_ssubt") +action = ExtResource("1_hupae") +input_mappings = Array[ExtResource("3_6jy3p")]([SubResource("Resource_wxd67")]) +metadata/_guide_input_mappings_collapsed = false + +[sub_resource type="Resource" id="Resource_guotu"] +script = ExtResource("6_eieuy") +button = 0 +joy_index = -1 + +[sub_resource type="Resource" id="Resource_ws3e0"] +script = ExtResource("7_0nn3e") +actuation_threshold = 0.5 + +[sub_resource type="Resource" id="Resource_b21ub"] +script = ExtResource("3_6jy3p") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_guotu") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([SubResource("Resource_ws3e0")]) + +[sub_resource type="Resource" id="Resource_tmt5r"] +script = ExtResource("4_ssubt") +action = ExtResource("5_pd4bb") +input_mappings = Array[ExtResource("3_6jy3p")]([SubResource("Resource_b21ub")]) + +[sub_resource type="Resource" id="Resource_41j1i"] +script = ExtResource("8_hdd7g") +mouse_buttons = false +mouse_movement = false +minimum_mouse_movement_distance = 1.0 +joy_buttons = false +joy_axes = false +minimum_joy_axis_actuation_strength = 0.2 +keyboard = true +touch = false +mouse = false +joy = false + +[sub_resource type="Resource" id="Resource_ncpby"] +script = ExtResource("3_6jy3p") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_41j1i") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([]) + +[sub_resource type="Resource" id="Resource_28cwt"] +script = ExtResource("4_ssubt") +action = ExtResource("8_7nlt6") +input_mappings = Array[ExtResource("3_6jy3p")]([SubResource("Resource_ncpby")]) + +[resource] +script = ExtResource("9_1vdw8") +display_name = "" +mappings = Array[ExtResource("4_ssubt")]([SubResource("Resource_lomew"), SubResource("Resource_tmt5r"), SubResource("Resource_28cwt")]) diff --git a/guide_examples/input_scheme_switching/mapping_contexts/keyboard_scheme.tres b/guide_examples/input_scheme_switching/mapping_contexts/keyboard_scheme.tres new file mode 100644 index 0000000..f4d3952 --- /dev/null +++ b/guide_examples/input_scheme_switching/mapping_contexts/keyboard_scheme.tres @@ -0,0 +1,175 @@ +[gd_resource type="Resource" script_class="GUIDEMappingContext" load_steps=32 format=3 uid="uid://2hl7iqpondhi"] + +[ext_resource type="Resource" uid="uid://cxn2ibe1mn3sb" path="res://guide_examples/input_scheme_switching/mapping_contexts/actions/move.tres" id="1_wyjhr"] +[ext_resource type="Script" path="res://addons/guide/inputs/guide_input_key.gd" id="2_10ro5"] +[ext_resource type="Script" path="res://addons/guide/modifiers/guide_modifier_input_swizzle.gd" id="3_uaw8o"] +[ext_resource type="Script" path="res://addons/guide/modifiers/guide_modifier_negate.gd" id="4_hv31f"] +[ext_resource type="Script" path="res://addons/guide/guide_input_mapping.gd" id="5_v5abd"] +[ext_resource type="Script" path="res://addons/guide/guide_action_mapping.gd" id="6_5qe2r"] +[ext_resource type="Resource" uid="uid://c7htf8h44vbwi" path="res://guide_examples/input_scheme_switching/mapping_contexts/actions/shoot.tres" id="7_diyqh"] +[ext_resource type="Script" path="res://addons/guide/triggers/guide_trigger_pressed.gd" id="8_enquy"] +[ext_resource type="Script" path="res://addons/guide/inputs/guide_input_any.gd" id="9_j1ko4"] +[ext_resource type="Resource" uid="uid://vctiwgvnl0ba" path="res://guide_examples/input_scheme_switching/mapping_contexts/actions/switch_to_joystick.tres" id="9_p8ck7"] +[ext_resource type="Script" path="res://addons/guide/guide_mapping_context.gd" id="11_rkw8m"] + +[sub_resource type="Resource" id="Resource_ckatg"] +script = ExtResource("2_10ro5") +key = 87 +shift = false +control = false +alt = false +meta = false +allow_additional_modifiers = true + +[sub_resource type="Resource" id="Resource_8rr5k"] +script = ExtResource("3_uaw8o") +order = 0 + +[sub_resource type="Resource" id="Resource_4c38v"] +script = ExtResource("4_hv31f") +x = true +y = true +z = true + +[sub_resource type="Resource" id="Resource_xot0n"] +script = ExtResource("5_v5abd") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_ckatg") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([SubResource("Resource_8rr5k"), SubResource("Resource_4c38v")]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([]) + +[sub_resource type="Resource" id="Resource_v2una"] +script = ExtResource("2_10ro5") +key = 65 +shift = false +control = false +alt = false +meta = false +allow_additional_modifiers = true + +[sub_resource type="Resource" id="Resource_tu604"] +script = ExtResource("4_hv31f") +x = true +y = true +z = true + +[sub_resource type="Resource" id="Resource_vh7xg"] +script = ExtResource("5_v5abd") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_v2una") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([SubResource("Resource_tu604")]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([]) + +[sub_resource type="Resource" id="Resource_sko3c"] +script = ExtResource("2_10ro5") +key = 83 +shift = false +control = false +alt = false +meta = false +allow_additional_modifiers = true + +[sub_resource type="Resource" id="Resource_x4ewt"] +script = ExtResource("3_uaw8o") +order = 0 + +[sub_resource type="Resource" id="Resource_1bv7n"] +script = ExtResource("5_v5abd") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_sko3c") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([SubResource("Resource_x4ewt")]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([]) + +[sub_resource type="Resource" id="Resource_o6q2e"] +script = ExtResource("2_10ro5") +key = 68 +shift = false +control = false +alt = false +meta = false +allow_additional_modifiers = true + +[sub_resource type="Resource" id="Resource_ggp85"] +script = ExtResource("5_v5abd") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_o6q2e") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([]) + +[sub_resource type="Resource" id="Resource_lomew"] +script = ExtResource("6_5qe2r") +action = ExtResource("1_wyjhr") +input_mappings = Array[ExtResource("5_v5abd")]([SubResource("Resource_xot0n"), SubResource("Resource_vh7xg"), SubResource("Resource_1bv7n"), SubResource("Resource_ggp85")]) + +[sub_resource type="Resource" id="Resource_wxbv3"] +script = ExtResource("2_10ro5") +key = 32 +shift = false +control = false +alt = false +meta = false +allow_additional_modifiers = true + +[sub_resource type="Resource" id="Resource_a515r"] +script = ExtResource("8_enquy") +actuation_threshold = 0.5 + +[sub_resource type="Resource" id="Resource_u0geb"] +script = ExtResource("5_v5abd") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_wxbv3") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([SubResource("Resource_a515r")]) + +[sub_resource type="Resource" id="Resource_f8tqv"] +script = ExtResource("6_5qe2r") +action = ExtResource("7_diyqh") +input_mappings = Array[ExtResource("5_v5abd")]([SubResource("Resource_u0geb")]) + +[sub_resource type="Resource" id="Resource_1wnrb"] +script = ExtResource("9_j1ko4") +mouse_buttons = false +mouse_movement = false +minimum_mouse_movement_distance = 1.0 +joy_buttons = true +joy_axes = false +minimum_joy_axis_actuation_strength = 0.2 +keyboard = false +touch = false +mouse = false +joy = true + +[sub_resource type="Resource" id="Resource_i18os"] +script = ExtResource("5_v5abd") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_1wnrb") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([]) + +[sub_resource type="Resource" id="Resource_im7a2"] +script = ExtResource("6_5qe2r") +action = ExtResource("9_p8ck7") +input_mappings = Array[ExtResource("5_v5abd")]([SubResource("Resource_i18os")]) + +[resource] +script = ExtResource("11_rkw8m") +display_name = "" +mappings = Array[ExtResource("6_5qe2r")]([SubResource("Resource_lomew"), SubResource("Resource_f8tqv"), SubResource("Resource_im7a2")]) diff --git a/guide_examples/input_scheme_switching/player.gd b/guide_examples/input_scheme_switching/player.gd new file mode 100644 index 0000000..366cfbd --- /dev/null +++ b/guide_examples/input_scheme_switching/player.gd @@ -0,0 +1,27 @@ +## Our player. The player has no knowledge about input schemes, it just +## reacts to actions triggering. +extends Node2D + +@export var speed:float = 200 + +@export var move_action:GUIDEAction +@export var shoot_action:GUIDEAction +@export var fireball_scene:PackedScene + + +func _ready(): + shoot_action.triggered.connect(_shoot_fireball) + + +func _process(delta:float) -> void: + position += move_action.value_axis_2d.normalized() * speed * delta + + +func _shoot_fireball(): + var fireball = fireball_scene.instantiate() + fireball.direction = Vector2.UP + get_parent().add_child(fireball) + + fireball.global_transform = global_transform + + diff --git a/guide_examples/input_scheme_switching/player.gd.uid b/guide_examples/input_scheme_switching/player.gd.uid new file mode 100644 index 0000000..7ebe989 --- /dev/null +++ b/guide_examples/input_scheme_switching/player.gd.uid @@ -0,0 +1 @@ +uid://csjgtlek7infj diff --git a/guide_examples/mouse_position_2d/background.gd b/guide_examples/mouse_position_2d/background.gd new file mode 100644 index 0000000..681b9a5 --- /dev/null +++ b/guide_examples/mouse_position_2d/background.gd @@ -0,0 +1,16 @@ +## This just keeps the sprite endlessly scrolling. It's not related to input. +extends Sprite2D + + +func _process(delta): + # get rect of visible screen in world coordinates + var rect = get_viewport().canvas_transform.affine_inverse() * get_viewport_rect() + # fit the bg into the viewport + global_position = rect.position + global_scale = rect.size / texture.get_size() + + # update scaling so the texture scales according to zoom level + material.set_shader_parameter("scale", global_scale) + var offset = rect.position / texture.get_size() + # and offset so we pick a texture offset relative to the movement of the camera + material.set_shader_parameter("offset", offset) diff --git a/guide_examples/mouse_position_2d/background.gd.uid b/guide_examples/mouse_position_2d/background.gd.uid new file mode 100644 index 0000000..a20ffdb --- /dev/null +++ b/guide_examples/mouse_position_2d/background.gd.uid @@ -0,0 +1 @@ +uid://by6w26jgvaitm diff --git a/guide_examples/mouse_position_2d/background.svg b/guide_examples/mouse_position_2d/background.svg new file mode 100644 index 0000000..e649b9e --- /dev/null +++ b/guide_examples/mouse_position_2d/background.svg @@ -0,0 +1,152 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/guide_examples/mouse_position_2d/background.svg.import b/guide_examples/mouse_position_2d/background.svg.import new file mode 100644 index 0000000..b71c4de --- /dev/null +++ b/guide_examples/mouse_position_2d/background.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://slnmn5k0drdb" +path="res://.godot/imported/background.svg-2c00776905f8df1964b7da3b2242aa3e.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://guide_examples/mouse_position_2d/background.svg" +dest_files=["res://.godot/imported/background.svg-2c00776905f8df1964b7da3b2242aa3e.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/guide_examples/mouse_position_2d/camera_2d.gd b/guide_examples/mouse_position_2d/camera_2d.gd new file mode 100644 index 0000000..ae66c34 --- /dev/null +++ b/guide_examples/mouse_position_2d/camera_2d.gd @@ -0,0 +1,19 @@ +## Camera control. We listen to GUIDE's actions to move and zoom the camera. Note how we can +## mix event-based and polling based input handling, depending on what works better for the +## use case. +extends Camera2D + + +@export var camera_movement:GUIDEAction +@export var camera_zoom:GUIDEAction +@export var speed:float = 300 + + +func _ready(): + camera_zoom.triggered.connect(_zoom_camera) + +func _process(delta): + position += camera_movement.value_axis_2d * speed * delta + +func _zoom_camera(): + zoom = clamp( zoom + Vector2.ONE * camera_zoom.value_axis_1d, Vector2(0.1, 0.1), Vector2(3, 3)) diff --git a/guide_examples/mouse_position_2d/camera_2d.gd.uid b/guide_examples/mouse_position_2d/camera_2d.gd.uid new file mode 100644 index 0000000..a4f760f --- /dev/null +++ b/guide_examples/mouse_position_2d/camera_2d.gd.uid @@ -0,0 +1 @@ +uid://cndto72qu3boe diff --git a/guide_examples/mouse_position_2d/godot_head.gd b/guide_examples/mouse_position_2d/godot_head.gd new file mode 100644 index 0000000..2ca46aa --- /dev/null +++ b/guide_examples/mouse_position_2d/godot_head.gd @@ -0,0 +1,15 @@ +extends Node2D + +@export var lifetime_seconds:float = 5.0 +var _remaining_time_seconds:float = 0 + +func _ready(): + _remaining_time_seconds = lifetime_seconds + +func _process(delta:float) -> void: + _remaining_time_seconds -= delta + if _remaining_time_seconds <= 0: + queue_free() + return + + modulate.a = _remaining_time_seconds / lifetime_seconds diff --git a/guide_examples/mouse_position_2d/godot_head.gd.uid b/guide_examples/mouse_position_2d/godot_head.gd.uid new file mode 100644 index 0000000..2358c67 --- /dev/null +++ b/guide_examples/mouse_position_2d/godot_head.gd.uid @@ -0,0 +1 @@ +uid://c5wpkmya4n248 diff --git a/guide_examples/mouse_position_2d/godot_head.tscn b/guide_examples/mouse_position_2d/godot_head.tscn new file mode 100644 index 0000000..6680112 --- /dev/null +++ b/guide_examples/mouse_position_2d/godot_head.tscn @@ -0,0 +1,10 @@ +[gd_scene load_steps=3 format=3 uid="uid://cj8m2n32yjxka"] + +[ext_resource type="Script" path="res://guide_examples/mouse_position_2d/godot_head.gd" id="1_7od3t"] +[ext_resource type="Texture2D" uid="uid://byjxtsekdl8t2" path="res://guide_examples/shared/godot_logo.svg" id="1_1168h"] + +[node name="GodotHead" type="Node2D"] +script = ExtResource("1_7od3t") + +[node name="Sprite2D" type="Sprite2D" parent="."] +texture = ExtResource("1_1168h") diff --git a/guide_examples/mouse_position_2d/mapping_contexts/actions/camera_movement.tres b/guide_examples/mouse_position_2d/mapping_contexts/actions/camera_movement.tres new file mode 100644 index 0000000..42e0558 --- /dev/null +++ b/guide_examples/mouse_position_2d/mapping_contexts/actions/camera_movement.tres @@ -0,0 +1,13 @@ +[gd_resource type="Resource" script_class="GUIDEAction" load_steps=2 format=3 uid="uid://ehdejslyo58y"] + +[ext_resource type="Script" path="res://addons/guide/guide_action.gd" id="1_clx3u"] + +[resource] +script = ExtResource("1_clx3u") +name = &"" +action_value_type = 2 +block_lower_priority_actions = true +emit_as_godot_actions = false +is_remappable = false +display_name = "" +display_category = "" diff --git a/guide_examples/mouse_position_2d/mapping_contexts/actions/camera_zoom.tres b/guide_examples/mouse_position_2d/mapping_contexts/actions/camera_zoom.tres new file mode 100644 index 0000000..ab27451 --- /dev/null +++ b/guide_examples/mouse_position_2d/mapping_contexts/actions/camera_zoom.tres @@ -0,0 +1,13 @@ +[gd_resource type="Resource" script_class="GUIDEAction" load_steps=2 format=3 uid="uid://6dm5j1sdhdp2"] + +[ext_resource type="Script" path="res://addons/guide/guide_action.gd" id="1_u52q5"] + +[resource] +script = ExtResource("1_u52q5") +name = &"" +action_value_type = 1 +block_lower_priority_actions = true +emit_as_godot_actions = false +is_remappable = false +display_name = "" +display_category = "" diff --git a/guide_examples/mouse_position_2d/mapping_contexts/actions/cursor.tres b/guide_examples/mouse_position_2d/mapping_contexts/actions/cursor.tres new file mode 100644 index 0000000..99d9051 --- /dev/null +++ b/guide_examples/mouse_position_2d/mapping_contexts/actions/cursor.tres @@ -0,0 +1,13 @@ +[gd_resource type="Resource" script_class="GUIDEAction" load_steps=2 format=3 uid="uid://y7q516rtjlt8"] + +[ext_resource type="Script" path="res://addons/guide/guide_action.gd" id="1_casem"] + +[resource] +script = ExtResource("1_casem") +name = &"" +action_value_type = 2 +block_lower_priority_actions = true +emit_as_godot_actions = false +is_remappable = false +display_name = "" +display_category = "" diff --git a/guide_examples/mouse_position_2d/mapping_contexts/actions/spawn.tres b/guide_examples/mouse_position_2d/mapping_contexts/actions/spawn.tres new file mode 100644 index 0000000..4a9ca29 --- /dev/null +++ b/guide_examples/mouse_position_2d/mapping_contexts/actions/spawn.tres @@ -0,0 +1,13 @@ +[gd_resource type="Resource" script_class="GUIDEAction" load_steps=2 format=3 uid="uid://cap7r63x8tait"] + +[ext_resource type="Script" path="res://addons/guide/guide_action.gd" id="1_y7wt7"] + +[resource] +script = ExtResource("1_y7wt7") +name = &"" +action_value_type = 0 +block_lower_priority_actions = true +emit_as_godot_actions = false +is_remappable = false +display_name = "" +display_category = "" diff --git a/guide_examples/mouse_position_2d/mapping_contexts/modifiers/zoom_sensitivity.tres b/guide_examples/mouse_position_2d/mapping_contexts/modifiers/zoom_sensitivity.tres new file mode 100644 index 0000000..4462ffc --- /dev/null +++ b/guide_examples/mouse_position_2d/mapping_contexts/modifiers/zoom_sensitivity.tres @@ -0,0 +1,8 @@ +[gd_resource type="Resource" script_class="GUIDEModifierScale" load_steps=2 format=3 uid="uid://d0brjke26hsk8"] + +[ext_resource type="Script" path="res://addons/guide/modifiers/guide_modifier_scale.gd" id="1_vqbea"] + +[resource] +script = ExtResource("1_vqbea") +scale = Vector3(0.1, 1, 1) +apply_delta_time = false diff --git a/guide_examples/mouse_position_2d/mapping_contexts/mouse_position.tres b/guide_examples/mouse_position_2d/mapping_contexts/mouse_position.tres new file mode 100644 index 0000000..d750d67 --- /dev/null +++ b/guide_examples/mouse_position_2d/mapping_contexts/mouse_position.tres @@ -0,0 +1,207 @@ +[gd_resource type="Resource" script_class="GUIDEMappingContext" load_steps=43 format=3 uid="uid://cfbk5croqnocs"] + +[ext_resource type="Script" path="res://addons/guide/guide_mapping_context.gd" id="1_ru5nv"] +[ext_resource type="Resource" uid="uid://y7q516rtjlt8" path="res://guide_examples/mouse_position_2d/mapping_contexts/actions/cursor.tres" id="1_ybilq"] +[ext_resource type="Script" path="res://addons/guide/inputs/guide_input_mouse_position.gd" id="2_xu301"] +[ext_resource type="Script" path="res://addons/guide/guide_input_mapping.gd" id="3_vy8se"] +[ext_resource type="Script" path="res://addons/guide/guide_action_mapping.gd" id="4_pisoh"] +[ext_resource type="Resource" uid="uid://ehdejslyo58y" path="res://guide_examples/mouse_position_2d/mapping_contexts/actions/camera_movement.tres" id="6_qfh27"] +[ext_resource type="Script" path="res://addons/guide/inputs/guide_input_key.gd" id="6_u43ni"] +[ext_resource type="Script" path="res://addons/guide/modifiers/guide_modifier_negate.gd" id="7_668rf"] +[ext_resource type="Script" path="res://addons/guide/modifiers/guide_modifier_input_swizzle.gd" id="8_o7tqa"] +[ext_resource type="Script" path="res://addons/guide/inputs/guide_input_mouse_button.gd" id="10_g5tce"] +[ext_resource type="Resource" uid="uid://cap7r63x8tait" path="res://guide_examples/mouse_position_2d/mapping_contexts/actions/spawn.tres" id="10_ohwve"] +[ext_resource type="Script" path="res://addons/guide/triggers/guide_trigger_pressed.gd" id="11_5ifuu"] +[ext_resource type="Script" path="res://addons/guide/modifiers/guide_modifier_canvas_coordinates.gd" id="11_j8wbm"] +[ext_resource type="Resource" uid="uid://6dm5j1sdhdp2" path="res://guide_examples/mouse_position_2d/mapping_contexts/actions/camera_zoom.tres" id="13_htiyk"] +[ext_resource type="Resource" uid="uid://d0brjke26hsk8" path="res://guide_examples/mouse_position_2d/mapping_contexts/modifiers/zoom_sensitivity.tres" id="14_0gubt"] + +[sub_resource type="Resource" id="Resource_420bm"] +script = ExtResource("2_xu301") + +[sub_resource type="Resource" id="Resource_hqwk3"] +script = ExtResource("11_j8wbm") +relative_input = false + +[sub_resource type="Resource" id="Resource_wsyf2"] +script = ExtResource("3_vy8se") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_420bm") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([SubResource("Resource_hqwk3")]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([]) + +[sub_resource type="Resource" id="Resource_4f0pb"] +script = ExtResource("4_pisoh") +action = ExtResource("1_ybilq") +input_mappings = Array[ExtResource("3_vy8se")]([SubResource("Resource_wsyf2")]) + +[sub_resource type="Resource" id="Resource_jlr8l"] +script = ExtResource("6_u43ni") +key = 87 +shift = false +control = false +alt = false +meta = false +allow_additional_modifiers = true + +[sub_resource type="Resource" id="Resource_o78ws"] +script = ExtResource("7_668rf") +x = true +y = true +z = true + +[sub_resource type="Resource" id="Resource_8gssa"] +script = ExtResource("8_o7tqa") +order = 0 + +[sub_resource type="Resource" id="Resource_qmv1n"] +script = ExtResource("3_vy8se") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_jlr8l") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([SubResource("Resource_o78ws"), SubResource("Resource_8gssa")]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([]) + +[sub_resource type="Resource" id="Resource_7q6a3"] +script = ExtResource("6_u43ni") +key = 83 +shift = false +control = false +alt = false +meta = false +allow_additional_modifiers = true + +[sub_resource type="Resource" id="Resource_l8svn"] +script = ExtResource("8_o7tqa") +order = 0 + +[sub_resource type="Resource" id="Resource_j8u0l"] +script = ExtResource("3_vy8se") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_7q6a3") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([SubResource("Resource_l8svn")]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([]) + +[sub_resource type="Resource" id="Resource_asguk"] +script = ExtResource("6_u43ni") +key = 65 +shift = false +control = false +alt = false +meta = false +allow_additional_modifiers = true + +[sub_resource type="Resource" id="Resource_ly8fj"] +script = ExtResource("7_668rf") +x = true +y = true +z = true + +[sub_resource type="Resource" id="Resource_6m3qh"] +script = ExtResource("3_vy8se") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_asguk") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([SubResource("Resource_ly8fj")]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([]) + +[sub_resource type="Resource" id="Resource_vbr6o"] +script = ExtResource("6_u43ni") +key = 68 +shift = false +control = false +alt = false +meta = false +allow_additional_modifiers = true + +[sub_resource type="Resource" id="Resource_xiclq"] +script = ExtResource("3_vy8se") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_vbr6o") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([]) + +[sub_resource type="Resource" id="Resource_hvdyr"] +script = ExtResource("4_pisoh") +action = ExtResource("6_qfh27") +input_mappings = Array[ExtResource("3_vy8se")]([SubResource("Resource_qmv1n"), SubResource("Resource_j8u0l"), SubResource("Resource_6m3qh"), SubResource("Resource_xiclq")]) + +[sub_resource type="Resource" id="Resource_3v4no"] +script = ExtResource("10_g5tce") +button = 4 + +[sub_resource type="Resource" id="Resource_l152p"] +script = ExtResource("3_vy8se") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_3v4no") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([ExtResource("14_0gubt")]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([]) + +[sub_resource type="Resource" id="Resource_wlhft"] +script = ExtResource("10_g5tce") +button = 5 + +[sub_resource type="Resource" id="Resource_b581m"] +script = ExtResource("7_668rf") +x = true +y = true +z = true + +[sub_resource type="Resource" id="Resource_xrajm"] +script = ExtResource("3_vy8se") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_wlhft") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([SubResource("Resource_b581m"), ExtResource("14_0gubt")]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([]) + +[sub_resource type="Resource" id="Resource_otc05"] +script = ExtResource("4_pisoh") +action = ExtResource("13_htiyk") +input_mappings = Array[ExtResource("3_vy8se")]([SubResource("Resource_l152p"), SubResource("Resource_xrajm")]) + +[sub_resource type="Resource" id="Resource_w5sbr"] +script = ExtResource("10_g5tce") +button = 1 + +[sub_resource type="Resource" id="Resource_omxoi"] +script = ExtResource("11_5ifuu") +actuation_threshold = 0.5 + +[sub_resource type="Resource" id="Resource_8n6aa"] +script = ExtResource("3_vy8se") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_w5sbr") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([SubResource("Resource_omxoi")]) + +[sub_resource type="Resource" id="Resource_iivaa"] +script = ExtResource("4_pisoh") +action = ExtResource("10_ohwve") +input_mappings = Array[ExtResource("3_vy8se")]([SubResource("Resource_8n6aa")]) + +[resource] +script = ExtResource("1_ru5nv") +display_name = "" +mappings = Array[ExtResource("4_pisoh")]([SubResource("Resource_4f0pb"), SubResource("Resource_hvdyr"), SubResource("Resource_otc05"), SubResource("Resource_iivaa")]) diff --git a/guide_examples/mouse_position_2d/mouse_position.gd b/guide_examples/mouse_position_2d/mouse_position.gd new file mode 100644 index 0000000..f939942 --- /dev/null +++ b/guide_examples/mouse_position_2d/mouse_position.gd @@ -0,0 +1,26 @@ +## This example shows how to get access to the mouse cursor without being +## specific about where the input comes from. +extends Node2D + + +@export var mapping_context:GUIDEMappingContext +@export var spawn:GUIDEAction +@export var cursor:GUIDEAction + +@export var godot_head_scene:PackedScene + +func _ready(): + GUIDE.enable_mapping_context(mapping_context) + spawn.triggered.connect(_spawn_godot_head) + + +func _spawn_godot_head(): + # Gets the mouse cursor from G.U.I.D.E. Note how the Canvas Coordinates + # modifier automatically gives us mouse coordinates in canvas space + # which means we don't need to take into acount the camera panning and + # zoom level and can just use the coordinates we get to directly place + # a Godot head at the cursor position. + var head = godot_head_scene.instantiate() + add_child(head) + + head.global_position = cursor.value_axis_2d diff --git a/guide_examples/mouse_position_2d/mouse_position.gd.uid b/guide_examples/mouse_position_2d/mouse_position.gd.uid new file mode 100644 index 0000000..ba92ac7 --- /dev/null +++ b/guide_examples/mouse_position_2d/mouse_position.gd.uid @@ -0,0 +1 @@ +uid://cvoeomxm2dwyr diff --git a/guide_examples/mouse_position_2d/mouse_position.tscn b/guide_examples/mouse_position_2d/mouse_position.tscn new file mode 100644 index 0000000..7f1abea --- /dev/null +++ b/guide_examples/mouse_position_2d/mouse_position.tscn @@ -0,0 +1,79 @@ +[gd_scene load_steps=16 format=3 uid="uid://c4de28wapdqtp"] + +[ext_resource type="Script" path="res://guide_examples/mouse_position_2d/mouse_position.gd" id="1_rkyn8"] +[ext_resource type="Resource" uid="uid://cfbk5croqnocs" path="res://guide_examples/mouse_position_2d/mapping_contexts/mouse_position.tres" id="2_f4xly"] +[ext_resource type="PackedScene" uid="uid://dkr80d2pi0d41" path="res://addons/guide/debugger/guide_debugger.tscn" id="2_yylue"] +[ext_resource type="Resource" uid="uid://y7q516rtjlt8" path="res://guide_examples/mouse_position_2d/mapping_contexts/actions/cursor.tres" id="3_e2cui"] +[ext_resource type="Resource" uid="uid://cap7r63x8tait" path="res://guide_examples/mouse_position_2d/mapping_contexts/actions/spawn.tres" id="3_e16oi"] +[ext_resource type="Theme" uid="uid://dot0gi1yoqmrl" path="res://guide_examples/shared/ui_theme.tres" id="3_xcjwc"] +[ext_resource type="Script" path="res://guide_examples/mouse_position_2d/camera_2d.gd" id="3_xpjlw"] +[ext_resource type="PackedScene" uid="uid://cj8m2n32yjxka" path="res://guide_examples/mouse_position_2d/godot_head.tscn" id="5_6xobh"] +[ext_resource type="Resource" uid="uid://ehdejslyo58y" path="res://guide_examples/mouse_position_2d/mapping_contexts/actions/camera_movement.tres" id="5_snwnm"] +[ext_resource type="Texture2D" uid="uid://slnmn5k0drdb" path="res://guide_examples/mouse_position_2d/background.svg" id="6_1tobk"] +[ext_resource type="Script" path="res://guide_examples/mouse_position_2d/background.gd" id="7_4oihe"] +[ext_resource type="Resource" uid="uid://6dm5j1sdhdp2" path="res://guide_examples/mouse_position_2d/mapping_contexts/actions/camera_zoom.tres" id="8_6tg1h"] +[ext_resource type="Script" path="res://guide_examples/shared/instructions_label.gd" id="9_y8piq"] + +[sub_resource type="Shader" id="Shader_v4pj1"] +code = "shader_type canvas_item; + +uniform vec2 scale; +uniform vec2 offset; + +void vertex() { + UV = UV * scale + offset; +} + + +//void light() { + // Called for every pixel for every light affecting the CanvasItem. + // Uncomment to replace the default light processing function with this one. +//} +" + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_1sa2x"] +shader = SubResource("Shader_v4pj1") +shader_parameter/scale = Vector2(1, 1) +shader_parameter/offset = Vector2(0, 0) + +[node name="MousePosition" type="Node2D"] +script = ExtResource("1_rkyn8") +mapping_context = ExtResource("2_f4xly") +spawn = ExtResource("3_e16oi") +cursor = ExtResource("3_e2cui") +godot_head_scene = ExtResource("5_6xobh") + +[node name="Camera2D" type="Camera2D" parent="."] +script = ExtResource("3_xpjlw") +camera_movement = ExtResource("5_snwnm") +camera_zoom = ExtResource("8_6tg1h") + +[node name="BG" type="Sprite2D" parent="."] +texture_repeat = 2 +material = SubResource("ShaderMaterial_1sa2x") +texture = ExtResource("6_1tobk") +centered = false +script = ExtResource("7_4oihe") + +[node name="UILayer" type="CanvasLayer" parent="."] + +[node name="RichTextLabel" type="RichTextLabel" parent="UILayer"] +anchors_preset = 1 +anchor_left = 1.0 +anchor_right = 1.0 +offset_left = -107.0 +offset_top = 41.0 +offset_right = -67.0 +offset_bottom = 81.0 +grow_horizontal = 0 +theme = ExtResource("3_xcjwc") +script = ExtResource("9_y8piq") +instructions_text = "%s to move the camera. +%s to zoom the camera. +%s to place a Godot head." +actions = Array[Resource("res://addons/guide/guide_action.gd")]([ExtResource("5_snwnm"), ExtResource("8_6tg1h"), ExtResource("3_e16oi")]) + +[node name="DebuggerLayer" type="CanvasLayer" parent="."] + +[node name="GuideDebugger" parent="DebuggerLayer" instance=ExtResource("2_yylue")] +theme = ExtResource("3_xcjwc") diff --git a/guide_examples/mouse_position_3d/camera_control.gd b/guide_examples/mouse_position_3d/camera_control.gd new file mode 100644 index 0000000..565d738 --- /dev/null +++ b/guide_examples/mouse_position_3d/camera_control.gd @@ -0,0 +1,42 @@ +## GUIDE makes controlling a camera pretty easy. By using the +## window-relative and scale modifiers we can translate mouse input +## directly into a format suitable for rotation. GUIDE also takes +## care of only sending yaw and pitch input when the camera toggle +## is pressed, so we don't need to have any complex input code in +## our camera control script. +extends Node3D + +@export var camera_pitch:GUIDEAction +@export var camera_yaw:GUIDEAction +@export var camera_toggle:GUIDEAction +@export var camera_move:GUIDEAction + +@export var movement_speed:float = 1 +@onready var _camera_yaw:Node3D = %CameraYaw +@onready var _camera_pitch:SpringArm3D = %CameraPitch + +func _ready(): + camera_toggle.triggered.connect(_hide_mouse) + camera_toggle.completed.connect(_show_mouse) + camera_yaw.triggered.connect(_yaw) + camera_pitch.triggered.connect(_pitch) + +func _hide_mouse(): + Input.mouse_mode = Input.MOUSE_MODE_CAPTURED + +func _show_mouse(): + Input.mouse_mode = Input.MOUSE_MODE_VISIBLE + +func _yaw(): + _camera_yaw.rotate_y(camera_yaw.value_axis_1d) + +func _pitch(): + _camera_pitch.rotate_x(camera_pitch.value_axis_1d) + _camera_pitch.rotation_degrees.x = clamp(_camera_pitch.rotation_degrees.x, -75.0, 0.0) + + +func _process(delta): + # we already used the input-swizzle modifier to get forward as -z, backward as z + # left as -x and right as x, so we can use this immediately + position += basis * camera_move.value_axis_3d * movement_speed * delta + diff --git a/guide_examples/mouse_position_3d/camera_control.gd.uid b/guide_examples/mouse_position_3d/camera_control.gd.uid new file mode 100644 index 0000000..c8c1a58 --- /dev/null +++ b/guide_examples/mouse_position_3d/camera_control.gd.uid @@ -0,0 +1 @@ +uid://c560cjrqx328f diff --git a/guide_examples/mouse_position_3d/mapping_context/actions/camera_move.tres b/guide_examples/mouse_position_3d/mapping_context/actions/camera_move.tres new file mode 100644 index 0000000..34dc17b --- /dev/null +++ b/guide_examples/mouse_position_3d/mapping_context/actions/camera_move.tres @@ -0,0 +1,13 @@ +[gd_resource type="Resource" script_class="GUIDEAction" load_steps=2 format=3 uid="uid://ceti1avx1l1qw"] + +[ext_resource type="Script" path="res://addons/guide/guide_action.gd" id="1_ehoni"] + +[resource] +script = ExtResource("1_ehoni") +name = &"" +action_value_type = 3 +block_lower_priority_actions = true +emit_as_godot_actions = false +is_remappable = false +display_name = "" +display_category = "" diff --git a/guide_examples/mouse_position_3d/mapping_context/actions/camera_pitch.tres b/guide_examples/mouse_position_3d/mapping_context/actions/camera_pitch.tres new file mode 100644 index 0000000..d085bd7 --- /dev/null +++ b/guide_examples/mouse_position_3d/mapping_context/actions/camera_pitch.tres @@ -0,0 +1,13 @@ +[gd_resource type="Resource" script_class="GUIDEAction" load_steps=2 format=3 uid="uid://bago2pmgvpepb"] + +[ext_resource type="Script" path="res://addons/guide/guide_action.gd" id="1_uluq2"] + +[resource] +script = ExtResource("1_uluq2") +name = &"" +action_value_type = 1 +block_lower_priority_actions = true +emit_as_godot_actions = false +is_remappable = false +display_name = "" +display_category = "" diff --git a/guide_examples/mouse_position_3d/mapping_context/actions/camera_toggle.tres b/guide_examples/mouse_position_3d/mapping_context/actions/camera_toggle.tres new file mode 100644 index 0000000..ff04e54 --- /dev/null +++ b/guide_examples/mouse_position_3d/mapping_context/actions/camera_toggle.tres @@ -0,0 +1,13 @@ +[gd_resource type="Resource" script_class="GUIDEAction" load_steps=2 format=3 uid="uid://cpljlaavuq515"] + +[ext_resource type="Script" path="res://addons/guide/guide_action.gd" id="1_gal8q"] + +[resource] +script = ExtResource("1_gal8q") +name = &"" +action_value_type = 0 +block_lower_priority_actions = true +emit_as_godot_actions = false +is_remappable = false +display_name = "" +display_category = "" diff --git a/guide_examples/mouse_position_3d/mapping_context/actions/camera_yaw.tres b/guide_examples/mouse_position_3d/mapping_context/actions/camera_yaw.tres new file mode 100644 index 0000000..eb84c7b --- /dev/null +++ b/guide_examples/mouse_position_3d/mapping_context/actions/camera_yaw.tres @@ -0,0 +1,13 @@ +[gd_resource type="Resource" script_class="GUIDEAction" load_steps=2 format=3 uid="uid://bltmi1lr7umq0"] + +[ext_resource type="Script" path="res://addons/guide/guide_action.gd" id="1_273ub"] + +[resource] +script = ExtResource("1_273ub") +name = &"" +action_value_type = 1 +block_lower_priority_actions = true +emit_as_godot_actions = false +is_remappable = false +display_name = "" +display_category = "" diff --git a/guide_examples/mouse_position_3d/mapping_context/actions/cursor_3d.tres b/guide_examples/mouse_position_3d/mapping_context/actions/cursor_3d.tres new file mode 100644 index 0000000..d62f1c6 --- /dev/null +++ b/guide_examples/mouse_position_3d/mapping_context/actions/cursor_3d.tres @@ -0,0 +1,13 @@ +[gd_resource type="Resource" script_class="GUIDEAction" load_steps=2 format=3 uid="uid://2b0ncq7ogvv0"] + +[ext_resource type="Script" path="res://addons/guide/guide_action.gd" id="1_3to1y"] + +[resource] +script = ExtResource("1_3to1y") +name = &"" +action_value_type = 3 +block_lower_priority_actions = true +emit_as_godot_actions = false +is_remappable = false +display_name = "" +display_category = "" diff --git a/guide_examples/mouse_position_3d/mapping_context/actions/select.tres b/guide_examples/mouse_position_3d/mapping_context/actions/select.tres new file mode 100644 index 0000000..12a38c2 --- /dev/null +++ b/guide_examples/mouse_position_3d/mapping_context/actions/select.tres @@ -0,0 +1,13 @@ +[gd_resource type="Resource" script_class="GUIDEAction" load_steps=2 format=3 uid="uid://b2jb27062t2mh"] + +[ext_resource type="Script" path="res://addons/guide/guide_action.gd" id="1_nysth"] + +[resource] +script = ExtResource("1_nysth") +name = &"" +action_value_type = 0 +block_lower_priority_actions = true +emit_as_godot_actions = false +is_remappable = false +display_name = "" +display_category = "" diff --git a/guide_examples/mouse_position_3d/mapping_context/mouse_position_3d.tres b/guide_examples/mouse_position_3d/mapping_context/mouse_position_3d.tres new file mode 100644 index 0000000..8b0e88a --- /dev/null +++ b/guide_examples/mouse_position_3d/mapping_context/mouse_position_3d.tres @@ -0,0 +1,270 @@ +[gd_resource type="Resource" script_class="GUIDEMappingContext" load_steps=59 format=3 uid="uid://bpatu7vi2kj4l"] + +[ext_resource type="Resource" uid="uid://bltmi1lr7umq0" path="res://guide_examples/mouse_position_3d/mapping_context/actions/camera_yaw.tres" id="1_8aom2"] +[ext_resource type="Script" path="res://addons/guide/guide_mapping_context.gd" id="1_rde8c"] +[ext_resource type="Script" path="res://addons/guide/inputs/guide_input_mouse_position.gd" id="2_nomn0"] +[ext_resource type="Script" path="res://addons/guide/inputs/guide_input_mouse_axis_1d.gd" id="2_qlocd"] +[ext_resource type="Script" path="res://addons/guide/modifiers/guide_modifier_window_relative.gd" id="3_p61vs"] +[ext_resource type="Script" path="res://addons/guide/modifiers/guide_modifier_3d_coordinates.gd" id="3_uds3g"] +[ext_resource type="Script" path="res://addons/guide/guide_input_mapping.gd" id="4_6a0qh"] +[ext_resource type="Resource" uid="uid://cpljlaavuq515" path="res://guide_examples/mouse_position_3d/mapping_context/actions/camera_toggle.tres" id="4_jyoym"] +[ext_resource type="Script" path="res://addons/guide/modifiers/guide_modifier_negate.gd" id="4_mho8x"] +[ext_resource type="Script" path="res://addons/guide/guide_action_mapping.gd" id="5_4hkur"] +[ext_resource type="Script" path="res://addons/guide/modifiers/guide_modifier_scale.gd" id="5_b42iu"] +[ext_resource type="Script" path="res://addons/guide/triggers/guide_trigger_chorded_action.gd" id="5_qvvu8"] +[ext_resource type="Script" path="res://addons/guide/inputs/guide_input_mouse_button.gd" id="7_7w5i6"] +[ext_resource type="Resource" uid="uid://bago2pmgvpepb" path="res://guide_examples/mouse_position_3d/mapping_context/actions/camera_pitch.tres" id="7_swef3"] +[ext_resource type="Script" path="res://addons/guide/triggers/guide_trigger_pressed.gd" id="8_5glyu"] +[ext_resource type="Resource" uid="uid://2b0ncq7ogvv0" path="res://guide_examples/mouse_position_3d/mapping_context/actions/cursor_3d.tres" id="9_rxgkr"] +[ext_resource type="Resource" uid="uid://ceti1avx1l1qw" path="res://guide_examples/mouse_position_3d/mapping_context/actions/camera_move.tres" id="12_v8r8p"] +[ext_resource type="Resource" uid="uid://b2jb27062t2mh" path="res://guide_examples/mouse_position_3d/mapping_context/actions/select.tres" id="12_wmpes"] +[ext_resource type="Script" path="res://addons/guide/inputs/guide_input_key.gd" id="13_x2lbs"] +[ext_resource type="Script" path="res://addons/guide/modifiers/guide_modifier_input_swizzle.gd" id="14_2r6td"] + +[sub_resource type="Resource" id="Resource_46a3k"] +script = ExtResource("2_qlocd") +axis = 0 + +[sub_resource type="Resource" id="Resource_0uhrt"] +script = ExtResource("3_p61vs") + +[sub_resource type="Resource" id="Resource_eipue"] +script = ExtResource("4_mho8x") +x = true +y = true +z = true + +[sub_resource type="Resource" id="Resource_66vbo"] +script = ExtResource("5_b42iu") +scale = Vector3(6.28, 1, 1) +apply_delta_time = false + +[sub_resource type="Resource" id="Resource_wvbgw"] +script = ExtResource("5_qvvu8") +action = ExtResource("4_jyoym") +actuation_threshold = 0.5 + +[sub_resource type="Resource" id="Resource_aqfvw"] +script = ExtResource("4_6a0qh") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_46a3k") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([SubResource("Resource_0uhrt"), SubResource("Resource_eipue"), SubResource("Resource_66vbo")]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([SubResource("Resource_wvbgw")]) + +[sub_resource type="Resource" id="Resource_g62j8"] +script = ExtResource("5_4hkur") +action = ExtResource("1_8aom2") +input_mappings = Array[ExtResource("4_6a0qh")]([SubResource("Resource_aqfvw")]) + +[sub_resource type="Resource" id="Resource_jyaeo"] +script = ExtResource("2_qlocd") +axis = 1 + +[sub_resource type="Resource" id="Resource_lo1xm"] +script = ExtResource("3_p61vs") + +[sub_resource type="Resource" id="Resource_f41et"] +script = ExtResource("4_mho8x") +x = true +y = true +z = true + +[sub_resource type="Resource" id="Resource_os02k"] +script = ExtResource("5_b42iu") +scale = Vector3(6.28, 1, 1) +apply_delta_time = false + +[sub_resource type="Resource" id="Resource_t4dub"] +script = ExtResource("5_qvvu8") +action = ExtResource("4_jyoym") +actuation_threshold = 0.5 + +[sub_resource type="Resource" id="Resource_jsmry"] +script = ExtResource("4_6a0qh") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_jyaeo") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([SubResource("Resource_lo1xm"), SubResource("Resource_f41et"), SubResource("Resource_os02k")]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([SubResource("Resource_t4dub")]) + +[sub_resource type="Resource" id="Resource_4sqcw"] +script = ExtResource("5_4hkur") +action = ExtResource("7_swef3") +input_mappings = Array[ExtResource("4_6a0qh")]([SubResource("Resource_jsmry")]) + +[sub_resource type="Resource" id="Resource_ki4s5"] +script = ExtResource("7_7w5i6") +button = 2 + +[sub_resource type="Resource" id="Resource_djtqh"] +script = ExtResource("4_6a0qh") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_ki4s5") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([]) + +[sub_resource type="Resource" id="Resource_nyq6u"] +script = ExtResource("5_4hkur") +action = ExtResource("4_jyoym") +input_mappings = Array[ExtResource("4_6a0qh")]([SubResource("Resource_djtqh")]) + +[sub_resource type="Resource" id="Resource_20kay"] +script = ExtResource("13_x2lbs") +key = 87 +shift = false +control = false +alt = false +meta = false +allow_additional_modifiers = true + +[sub_resource type="Resource" id="Resource_0syad"] +script = ExtResource("14_2r6td") +order = 1 + +[sub_resource type="Resource" id="Resource_0bn66"] +script = ExtResource("4_mho8x") +x = true +y = true +z = true + +[sub_resource type="Resource" id="Resource_7gp34"] +script = ExtResource("4_6a0qh") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_20kay") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([SubResource("Resource_0syad"), SubResource("Resource_0bn66")]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([]) + +[sub_resource type="Resource" id="Resource_v2uh1"] +script = ExtResource("13_x2lbs") +key = 83 +shift = false +control = false +alt = false +meta = false +allow_additional_modifiers = true + +[sub_resource type="Resource" id="Resource_axfl8"] +script = ExtResource("14_2r6td") +order = 1 + +[sub_resource type="Resource" id="Resource_vij8n"] +script = ExtResource("4_6a0qh") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_v2uh1") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([SubResource("Resource_axfl8")]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([]) + +[sub_resource type="Resource" id="Resource_rauax"] +script = ExtResource("13_x2lbs") +key = 65 +shift = false +control = false +alt = false +meta = false +allow_additional_modifiers = true + +[sub_resource type="Resource" id="Resource_8xh6c"] +script = ExtResource("4_mho8x") +x = true +y = true +z = true + +[sub_resource type="Resource" id="Resource_8urnd"] +script = ExtResource("4_6a0qh") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_rauax") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([SubResource("Resource_8xh6c")]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([]) + +[sub_resource type="Resource" id="Resource_utvoa"] +script = ExtResource("13_x2lbs") +key = 68 +shift = false +control = false +alt = false +meta = false +allow_additional_modifiers = true + +[sub_resource type="Resource" id="Resource_tj7qw"] +script = ExtResource("4_6a0qh") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_utvoa") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([]) + +[sub_resource type="Resource" id="Resource_mlu0g"] +script = ExtResource("5_4hkur") +action = ExtResource("12_v8r8p") +input_mappings = Array[ExtResource("4_6a0qh")]([SubResource("Resource_7gp34"), SubResource("Resource_vij8n"), SubResource("Resource_8urnd"), SubResource("Resource_tj7qw")]) + +[sub_resource type="Resource" id="Resource_hh3gq"] +script = ExtResource("2_nomn0") + +[sub_resource type="Resource" id="Resource_nkih0"] +script = ExtResource("3_uds3g") +max_depth = 1000.0 +collide_with_areas = false +collision_mask = 1 + +[sub_resource type="Resource" id="Resource_wvei4"] +script = ExtResource("4_6a0qh") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_hh3gq") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([SubResource("Resource_nkih0")]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([]) + +[sub_resource type="Resource" id="Resource_6b6vt"] +script = ExtResource("5_4hkur") +action = ExtResource("9_rxgkr") +input_mappings = Array[ExtResource("4_6a0qh")]([SubResource("Resource_wvei4")]) + +[sub_resource type="Resource" id="Resource_lawue"] +script = ExtResource("7_7w5i6") +button = 1 + +[sub_resource type="Resource" id="Resource_tvue7"] +script = ExtResource("8_5glyu") +actuation_threshold = 0.5 + +[sub_resource type="Resource" id="Resource_m30sl"] +script = ExtResource("4_6a0qh") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_lawue") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([SubResource("Resource_tvue7")]) + +[sub_resource type="Resource" id="Resource_8y4cb"] +script = ExtResource("5_4hkur") +action = ExtResource("12_wmpes") +input_mappings = Array[ExtResource("4_6a0qh")]([SubResource("Resource_m30sl")]) + +[resource] +script = ExtResource("1_rde8c") +display_name = "" +mappings = Array[ExtResource("5_4hkur")]([SubResource("Resource_g62j8"), SubResource("Resource_4sqcw"), SubResource("Resource_nyq6u"), SubResource("Resource_mlu0g"), SubResource("Resource_6b6vt"), SubResource("Resource_8y4cb")]) diff --git a/guide_examples/mouse_position_3d/mou4D8E.tmp b/guide_examples/mouse_position_3d/mou4D8E.tmp new file mode 100644 index 0000000..972edf3 --- /dev/null +++ b/guide_examples/mouse_position_3d/mou4D8E.tmp @@ -0,0 +1,128 @@ +[gd_scene load_steps=21 format=3 uid="uid://dmpv0dh2nk5j"] + +[ext_resource type="Script" path="res://guide_examples/mouse_position_3d/mouse_position_3d.gd" id="1_8oqik"] +[ext_resource type="Resource" uid="uid://bpatu7vi2kj4l" path="res://guide_examples/mouse_position_3d/mapping_context/mouse_position_3d.tres" id="2_bb21n"] +[ext_resource type="Script" path="res://guide_examples/mouse_position_3d/camera_control.gd" id="3_4etic"] +[ext_resource type="PackedScene" uid="uid://dkr80d2pi0d41" path="res://addons/guide/debugger/guide_debugger.tscn" id="3_m2gj2"] +[ext_resource type="Script" path="res://guide_examples/mouse_position_3d/mouse_indicator.gd" id="3_tunsg"] +[ext_resource type="Resource" uid="uid://2b0ncq7ogvv0" path="res://guide_examples/mouse_position_3d/mapping_context/actions/cursor_3d.tres" id="4_dla1l"] +[ext_resource type="Resource" uid="uid://bago2pmgvpepb" path="res://guide_examples/mouse_position_3d/mapping_context/actions/camera_pitch.tres" id="4_xr1vq"] +[ext_resource type="Script" path="res://guide_examples/mouse_position_3d/player.gd" id="5_8nflt"] +[ext_resource type="Resource" uid="uid://bltmi1lr7umq0" path="res://guide_examples/mouse_position_3d/mapping_context/actions/camera_yaw.tres" id="5_mnyiu"] +[ext_resource type="Resource" uid="uid://cpljlaavuq515" path="res://guide_examples/mouse_position_3d/mapping_context/actions/camera_toggle.tres" id="6_51csy"] +[ext_resource type="Theme" uid="uid://dot0gi1yoqmrl" path="res://guide_examples/shared/ui_theme.tres" id="6_lyxvk"] +[ext_resource type="Resource" uid="uid://b2jb27062t2mh" path="res://guide_examples/mouse_position_3d/mapping_context/actions/select.tres" id="6_uviri"] +[ext_resource type="Resource" uid="uid://ceti1avx1l1qw" path="res://guide_examples/mouse_position_3d/mapping_context/actions/camera_move.tres" id="7_1vbs8"] + +[sub_resource type="NavigationMesh" id="NavigationMesh_sfop5"] +vertices = PackedVector3Array(2.25, 2.656, -7, 2.25, 2.656, -3.5, 4.25, 1.156, -3.5, 4.25, 1.156, -7, 4.25, 1.156, -7, 4.25, 1.156, -3.5, 4.75, 0.905995, -2.5, 9, 0.905995, -2.5, 9, 0.905995, -9, 4.75, 0.905995, -8.5, 9, 0.905995, -9, 4.25, 0.905995, -9, 4.75, 0.905995, -8.5, -3.5, 3.656, -3.5, 2.25, 2.656, -3.5, 2.25, 2.656, -7, -7.5, 3.656, -7, 0.8125, 3.656, -3.5, 0.857143, 3.656, -7, -7.5, 3.656, 5.25, -4.25, 3.656, 5.25, -4.25, 3.656, -2.75, -7.5, 3.656, -7, -4.25, 3.656, -2.75, -3.5, 3.656, -3.5, -7.5, 3.656, -7, 9, 0.905995, -2.5, 4.75, 0.905995, -2.5, 4.25, 0.905995, -1.5, -3, 0.905995, 7.25, -9, 0.905995, 7, -9, 0.905995, 9, 9, 0.905995, 9, 4.25, 0.905995, -1.5, -2.25, 0.905995, -1.5, -2.25, 0.905995, 6.5, 9, 0.905995, 9, 9, 0.905995, -2.5, 4.25, 0.905995, -1.5, -2.25, 0.905995, 6.5, -2.25, 0.905995, 6.5, -3, 0.905995, 7.25, 9, 0.905995, 9) +polygons = [PackedInt32Array(3, 2, 0), PackedInt32Array(0, 2, 1), PackedInt32Array(5, 4, 6), PackedInt32Array(6, 4, 9), PackedInt32Array(6, 9, 7), PackedInt32Array(7, 9, 8), PackedInt32Array(10, 12, 11), PackedInt32Array(15, 14, 18), PackedInt32Array(18, 14, 17), PackedInt32Array(18, 17, 13), PackedInt32Array(18, 13, 16), PackedInt32Array(20, 19, 21), PackedInt32Array(21, 19, 22), PackedInt32Array(25, 24, 23), PackedInt32Array(28, 27, 26), PackedInt32Array(30, 29, 31), PackedInt32Array(31, 29, 32), PackedInt32Array(35, 34, 33), PackedInt32Array(37, 36, 38), PackedInt32Array(38, 36, 39), PackedInt32Array(42, 41, 40)] +agent_radius = 1.0 + +[sub_resource type="ProceduralSkyMaterial" id="ProceduralSkyMaterial_taqbr"] + +[sub_resource type="Sky" id="Sky_qlesy"] +sky_material = SubResource("ProceduralSkyMaterial_taqbr") + +[sub_resource type="Environment" id="Environment_wd3mo"] +background_mode = 2 +sky = SubResource("Sky_qlesy") + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_q83ll"] +transparency = 1 +albedo_color = Color(0.890196, 0.176471, 0.133333, 0.678431) + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_ubo0r"] +albedo_color = Color(1.15514e-06, 0.522721, 0.747218, 1) + +[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_3a636"] +radius = 0.6 +height = 2.3 + +[node name="MousePosition3d" type="Node3D"] +script = ExtResource("1_8oqik") +mapping_context = ExtResource("2_bb21n") + +[node name="CameraYaw" type="Node3D" parent="."] +unique_name_in_owner = true +transform = Transform3D(0.435231, 0, 0.900319, 0, 1, 0, -0.900319, 0, 0.435231, 6.62904, 4.72731, 0) +script = ExtResource("3_4etic") +camera_pitch = ExtResource("4_xr1vq") +camera_yaw = ExtResource("5_mnyiu") +camera_toggle = ExtResource("6_51csy") +camera_move = ExtResource("7_1vbs8") +movement_speed = 8.0 + +[node name="CameraPitch" type="SpringArm3D" parent="CameraYaw"] +unique_name_in_owner = true +transform = Transform3D(1, 0, 0, 0, 0.984808, 0.173648, 0, -0.173648, 0.984808, 0, 0, 0) +spring_length = 8.0 + +[node name="Camera3D" type="Camera3D" parent="CameraYaw/CameraPitch"] + +[node name="World" type="Node3D" parent="."] + +[node name="NavigationRegion3D" type="NavigationRegion3D" parent="World"] +navigation_mesh = SubResource("NavigationMesh_sfop5") + +[node name="CSGBox3D" type="CSGBox3D" parent="World/NavigationRegion3D"] +use_collision = true +size = Vector3(20, 1, 20) + +[node name="CSGBox3D2" type="CSGBox3D" parent="World/NavigationRegion3D"] +transform = Transform3D(0.80368, 0.595061, 0, -0.595061, 0.80368, 0, 0, 0, 1, 2.07477, 0.832275, -5.22408) +use_collision = true +size = Vector3(5.14954, 2.2251, 5.07178) + +[node name="CSGBox3D3" type="CSGBox3D" parent="World/NavigationRegion3D"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.8367, 2.1428, -5.22408) +use_collision = true +size = Vector3(9.01666, 2.2251, 5.07178) + +[node name="CSGBox3D4" type="CSGBox3D" parent="World/NavigationRegion3D"] +transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, -5.81752, 2.1428, 1.66142) +use_collision = true +size = Vector3(9.01666, 2.2251, 5.07178) + +[node name="WorldEnvironment" type="WorldEnvironment" parent="World"] +environment = SubResource("Environment_wd3mo") + +[node name="DirectionalLight3D" type="DirectionalLight3D" parent="World"] +transform = Transform3D(1, 0, 0, 0, 0.780496, 0.625161, 0, -0.625161, 0.780496, 0, 4.93937, 0) +shadow_enabled = true + +[node name="MouseIndicator" type="CSGSphere3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.84397, 1.04571, 0) +material = SubResource("StandardMaterial3D_q83ll") +script = ExtResource("3_tunsg") +cursor = ExtResource("4_dla1l") +camera_toggle = ExtResource("6_51csy") + +[node name="CharacterBody3D" type="CharacterBody3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.26495, 0) +collision_layer = 2 +input_ray_pickable = false +floor_constant_speed = true +script = ExtResource("5_8nflt") +select = ExtResource("6_uviri") +cursor = ExtResource("4_dla1l") + +[node name="CSGCylinder3D" type="CSGCylinder3D" parent="CharacterBody3D"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.28249, 0) +material = SubResource("StandardMaterial3D_ubo0r") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="CharacterBody3D"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.26098, 0) +shape = SubResource("CapsuleShape3D_3a636") + +[node name="NavigationAgent3D" type="NavigationAgent3D" parent="CharacterBody3D"] +unique_name_in_owner = true +debug_enabled = true +debug_use_custom = true +debug_path_custom_color = Color(0.886095, 0.359614, 0.933159, 1) +debug_path_custom_point_size = 7.17 + +[node name="CanvasLayer" type="CanvasLayer" parent="."] + +[node name="GuideDebugger" parent="CanvasLayer" instance=ExtResource("3_m2gj2")] +theme = ExtResource("6_lyxvk") diff --git a/guide_examples/mouse_position_3d/mouse_indicator.gd b/guide_examples/mouse_position_3d/mouse_indicator.gd new file mode 100644 index 0000000..08f7a3d --- /dev/null +++ b/guide_examples/mouse_position_3d/mouse_indicator.gd @@ -0,0 +1,13 @@ +extends CSGSphere3D + +@export var cursor:GUIDEAction +@export var camera_toggle:GUIDEAction + +func _process(delta): + var new_pos = cursor.value_axis_3d + if not new_pos.is_finite() or camera_toggle.is_triggered(): + visible = false + return + + visible = true + global_position = new_pos diff --git a/guide_examples/mouse_position_3d/mouse_indicator.gd.uid b/guide_examples/mouse_position_3d/mouse_indicator.gd.uid new file mode 100644 index 0000000..a98002b --- /dev/null +++ b/guide_examples/mouse_position_3d/mouse_indicator.gd.uid @@ -0,0 +1 @@ +uid://mj7s4e2n6fpm diff --git a/guide_examples/mouse_position_3d/mouse_position_3d.gd b/guide_examples/mouse_position_3d/mouse_position_3d.gd new file mode 100644 index 0000000..82d18d0 --- /dev/null +++ b/guide_examples/mouse_position_3d/mouse_position_3d.gd @@ -0,0 +1,7 @@ +extends Node3D + + +@export var mapping_context:GUIDEMappingContext + +func _ready(): + GUIDE.enable_mapping_context(mapping_context) diff --git a/guide_examples/mouse_position_3d/mouse_position_3d.gd.uid b/guide_examples/mouse_position_3d/mouse_position_3d.gd.uid new file mode 100644 index 0000000..051380a --- /dev/null +++ b/guide_examples/mouse_position_3d/mouse_position_3d.gd.uid @@ -0,0 +1 @@ +uid://5x7dcnegcvlb diff --git a/guide_examples/mouse_position_3d/mouse_position_3d.tscn b/guide_examples/mouse_position_3d/mouse_position_3d.tscn new file mode 100644 index 0000000..77a2388 --- /dev/null +++ b/guide_examples/mouse_position_3d/mouse_position_3d.tscn @@ -0,0 +1,148 @@ +[gd_scene load_steps=22 format=3 uid="uid://dmpv0dh2nk5j"] + +[ext_resource type="Script" path="res://guide_examples/mouse_position_3d/mouse_position_3d.gd" id="1_8oqik"] +[ext_resource type="Resource" uid="uid://bpatu7vi2kj4l" path="res://guide_examples/mouse_position_3d/mapping_context/mouse_position_3d.tres" id="2_bb21n"] +[ext_resource type="Script" path="res://guide_examples/mouse_position_3d/camera_control.gd" id="3_4etic"] +[ext_resource type="PackedScene" uid="uid://dkr80d2pi0d41" path="res://addons/guide/debugger/guide_debugger.tscn" id="3_m2gj2"] +[ext_resource type="Script" path="res://guide_examples/mouse_position_3d/mouse_indicator.gd" id="3_tunsg"] +[ext_resource type="Resource" uid="uid://2b0ncq7ogvv0" path="res://guide_examples/mouse_position_3d/mapping_context/actions/cursor_3d.tres" id="4_dla1l"] +[ext_resource type="Resource" uid="uid://bago2pmgvpepb" path="res://guide_examples/mouse_position_3d/mapping_context/actions/camera_pitch.tres" id="4_xr1vq"] +[ext_resource type="Script" path="res://guide_examples/mouse_position_3d/player.gd" id="5_8nflt"] +[ext_resource type="Resource" uid="uid://bltmi1lr7umq0" path="res://guide_examples/mouse_position_3d/mapping_context/actions/camera_yaw.tres" id="5_mnyiu"] +[ext_resource type="Resource" uid="uid://cpljlaavuq515" path="res://guide_examples/mouse_position_3d/mapping_context/actions/camera_toggle.tres" id="6_51csy"] +[ext_resource type="Theme" uid="uid://dot0gi1yoqmrl" path="res://guide_examples/shared/ui_theme.tres" id="6_lyxvk"] +[ext_resource type="Resource" uid="uid://b2jb27062t2mh" path="res://guide_examples/mouse_position_3d/mapping_context/actions/select.tres" id="6_uviri"] +[ext_resource type="Resource" uid="uid://ceti1avx1l1qw" path="res://guide_examples/mouse_position_3d/mapping_context/actions/camera_move.tres" id="7_1vbs8"] +[ext_resource type="Script" path="res://guide_examples/shared/instructions_label.gd" id="12_c4bk3"] + +[sub_resource type="NavigationMesh" id="NavigationMesh_sfop5"] +vertices = PackedVector3Array(2.25, 2.656, -7, 2.25, 2.656, -3.5, 4.25, 1.156, -3.5, 4.25, 1.156, -7, 4.25, 1.156, -7, 4.25, 1.156, -3.5, 4.75, 0.905995, -2.5, 9, 0.905995, -2.5, 9, 0.905995, -9, 4.75, 0.905995, -8.5, 9, 0.905995, -9, 4.25, 0.905995, -9, 4.75, 0.905995, -8.5, -3.5, 3.656, -3.5, 2.25, 2.656, -3.5, 2.25, 2.656, -7, -7.5, 3.656, -7, 0.8125, 3.656, -3.5, 0.857143, 3.656, -7, -7.5, 3.656, 5.25, -4.25, 3.656, 5.25, -4.25, 3.656, -2.75, -7.5, 3.656, -7, -4.25, 3.656, -2.75, -3.5, 3.656, -3.5, -7.5, 3.656, -7, 9, 0.905995, -2.5, 4.75, 0.905995, -2.5, 4.25, 0.905995, -1.5, -3, 0.905995, 7.25, -9, 0.905995, 7, -9, 0.905995, 9, 9, 0.905995, 9, 4.25, 0.905995, -1.5, -2.25, 0.905995, -1.5, -2.25, 0.905995, 6.5, 9, 0.905995, 9, 9, 0.905995, -2.5, 4.25, 0.905995, -1.5, -2.25, 0.905995, 6.5, -2.25, 0.905995, 6.5, -3, 0.905995, 7.25, 9, 0.905995, 9) +polygons = [PackedInt32Array(3, 2, 0), PackedInt32Array(0, 2, 1), PackedInt32Array(5, 4, 6), PackedInt32Array(6, 4, 9), PackedInt32Array(6, 9, 7), PackedInt32Array(7, 9, 8), PackedInt32Array(10, 12, 11), PackedInt32Array(15, 14, 18), PackedInt32Array(18, 14, 17), PackedInt32Array(18, 17, 13), PackedInt32Array(18, 13, 16), PackedInt32Array(20, 19, 21), PackedInt32Array(21, 19, 22), PackedInt32Array(25, 24, 23), PackedInt32Array(28, 27, 26), PackedInt32Array(30, 29, 31), PackedInt32Array(31, 29, 32), PackedInt32Array(35, 34, 33), PackedInt32Array(37, 36, 38), PackedInt32Array(38, 36, 39), PackedInt32Array(42, 41, 40)] +agent_radius = 1.0 + +[sub_resource type="ProceduralSkyMaterial" id="ProceduralSkyMaterial_taqbr"] + +[sub_resource type="Sky" id="Sky_qlesy"] +sky_material = SubResource("ProceduralSkyMaterial_taqbr") + +[sub_resource type="Environment" id="Environment_wd3mo"] +background_mode = 2 +sky = SubResource("Sky_qlesy") + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_q83ll"] +transparency = 1 +albedo_color = Color(0.890196, 0.176471, 0.133333, 0.678431) + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_ubo0r"] +albedo_color = Color(1.15514e-06, 0.522721, 0.747218, 1) + +[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_3a636"] +radius = 0.6 +height = 2.3 + +[node name="MousePosition3d" type="Node3D"] +script = ExtResource("1_8oqik") +mapping_context = ExtResource("2_bb21n") + +[node name="CameraYaw" type="Node3D" parent="."] +unique_name_in_owner = true +transform = Transform3D(0.435231, 0, 0.900319, 0, 1, 0, -0.900319, 0, 0.435231, 6.62904, 4.72731, 0) +script = ExtResource("3_4etic") +camera_pitch = ExtResource("4_xr1vq") +camera_yaw = ExtResource("5_mnyiu") +camera_toggle = ExtResource("6_51csy") +camera_move = ExtResource("7_1vbs8") +movement_speed = 8.0 + +[node name="CameraPitch" type="SpringArm3D" parent="CameraYaw"] +unique_name_in_owner = true +transform = Transform3D(1, 0, 0, 0, 0.984808, 0.173648, 0, -0.173648, 0.984808, 0, 0, 0) +spring_length = 8.0 + +[node name="Camera3D" type="Camera3D" parent="CameraYaw/CameraPitch"] + +[node name="World" type="Node3D" parent="."] + +[node name="NavigationRegion3D" type="NavigationRegion3D" parent="World"] +navigation_mesh = SubResource("NavigationMesh_sfop5") + +[node name="CSGBox3D" type="CSGBox3D" parent="World/NavigationRegion3D"] +use_collision = true +size = Vector3(20, 1, 20) + +[node name="CSGBox3D2" type="CSGBox3D" parent="World/NavigationRegion3D"] +transform = Transform3D(0.80368, 0.595061, 0, -0.595061, 0.80368, 0, 0, 0, 1, 2.07477, 0.832275, -5.22408) +use_collision = true +size = Vector3(5.14954, 2.2251, 5.07178) + +[node name="CSGBox3D3" type="CSGBox3D" parent="World/NavigationRegion3D"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.8367, 2.1428, -5.22408) +use_collision = true +size = Vector3(9.01666, 2.2251, 5.07178) + +[node name="CSGBox3D4" type="CSGBox3D" parent="World/NavigationRegion3D"] +transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, -5.81752, 2.1428, 1.66142) +use_collision = true +size = Vector3(9.01666, 2.2251, 5.07178) + +[node name="WorldEnvironment" type="WorldEnvironment" parent="World"] +environment = SubResource("Environment_wd3mo") + +[node name="DirectionalLight3D" type="DirectionalLight3D" parent="World"] +transform = Transform3D(1, 0, 0, 0, 0.780496, 0.625161, 0, -0.625161, 0.780496, 0, 4.93937, 0) +shadow_enabled = true + +[node name="MouseIndicator" type="CSGSphere3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.84397, 1.04571, 0) +material = SubResource("StandardMaterial3D_q83ll") +script = ExtResource("3_tunsg") +cursor = ExtResource("4_dla1l") +camera_toggle = ExtResource("6_51csy") + +[node name="CharacterBody3D" type="CharacterBody3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.26495, 0) +collision_layer = 2 +input_ray_pickable = false +floor_constant_speed = true +script = ExtResource("5_8nflt") +select = ExtResource("6_uviri") +cursor = ExtResource("4_dla1l") + +[node name="CSGCylinder3D" type="CSGCylinder3D" parent="CharacterBody3D"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.28249, 0) +material = SubResource("StandardMaterial3D_ubo0r") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="CharacterBody3D"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.26098, 0) +shape = SubResource("CapsuleShape3D_3a636") + +[node name="NavigationAgent3D" type="NavigationAgent3D" parent="CharacterBody3D"] +unique_name_in_owner = true +debug_enabled = true +debug_use_custom = true +debug_path_custom_color = Color(0.886095, 0.359614, 0.933159, 1) +debug_path_custom_point_size = 7.17 + +[node name="UILayer" type="CanvasLayer" parent="."] + +[node name="RichTextLabel" type="RichTextLabel" parent="UILayer"] +anchors_preset = 1 +anchor_left = 1.0 +anchor_right = 1.0 +offset_left = -104.0 +offset_top = 56.0 +offset_right = -64.0 +offset_bottom = 96.0 +grow_horizontal = 0 +theme = ExtResource("6_lyxvk") +script = ExtResource("12_c4bk3") +instructions_text = "%s to send the agent somewhere. +%s to move the camera. +%s to rotate the camera. +%s to tilt the camera." +actions = Array[Resource("res://addons/guide/guide_action.gd")]([ExtResource("6_uviri"), ExtResource("7_1vbs8"), ExtResource("5_mnyiu"), ExtResource("4_xr1vq")]) + +[node name="DebuggerLayer" type="CanvasLayer" parent="."] + +[node name="GuideDebugger" parent="DebuggerLayer" instance=ExtResource("3_m2gj2")] +theme = ExtResource("6_lyxvk") diff --git a/guide_examples/mouse_position_3d/player.gd b/guide_examples/mouse_position_3d/player.gd new file mode 100644 index 0000000..d2cc190 --- /dev/null +++ b/guide_examples/mouse_position_3d/player.gd @@ -0,0 +1,30 @@ +extends CharacterBody3D + +@export var select:GUIDEAction +@export var cursor:GUIDEAction +@export var speed:float = 5.0 + +@onready var _navigation_agent_3d:NavigationAgent3D = %NavigationAgent3D + +func _ready(): + select.triggered.connect(_new_destination) + +func _physics_process(delta): + if not _navigation_agent_3d.is_navigation_finished(): + var next_pos = _navigation_agent_3d.get_next_path_position() + velocity = global_position.direction_to(next_pos) * speed + else: + velocity = Vector3.ZERO + + if not is_on_floor(): + velocity.y = -9.18 + + move_and_slide() + +func _new_destination(): + var destination = cursor.value_axis_3d + if not destination.is_finite(): + return + _navigation_agent_3d.target_position = destination + + diff --git a/guide_examples/mouse_position_3d/player.gd.uid b/guide_examples/mouse_position_3d/player.gd.uid new file mode 100644 index 0000000..a890acc --- /dev/null +++ b/guide_examples/mouse_position_3d/player.gd.uid @@ -0,0 +1 @@ +uid://kp2vh24w5jih diff --git a/guide_examples/quick_start/game.gd b/guide_examples/quick_start/game.gd new file mode 100644 index 0000000..9412cc8 --- /dev/null +++ b/guide_examples/quick_start/game.gd @@ -0,0 +1,7 @@ +extends Node2D + +## The mapping context that we use +@export var mapping_context:GUIDEMappingContext + +func _ready(): + GUIDE.enable_mapping_context(mapping_context) diff --git a/guide_examples/quick_start/game.gd.uid b/guide_examples/quick_start/game.gd.uid new file mode 100644 index 0000000..94008d1 --- /dev/null +++ b/guide_examples/quick_start/game.gd.uid @@ -0,0 +1 @@ +uid://ceq2p7x1uhe8x diff --git a/guide_examples/quick_start/mapping_contexts/actions/move.tres b/guide_examples/quick_start/mapping_contexts/actions/move.tres new file mode 100644 index 0000000..360a345 --- /dev/null +++ b/guide_examples/quick_start/mapping_contexts/actions/move.tres @@ -0,0 +1,13 @@ +[gd_resource type="Resource" script_class="GUIDEAction" load_steps=2 format=3 uid="uid://uscuhd84vv0i"] + +[ext_resource type="Script" path="res://addons/guide/guide_action.gd" id="1_mqwm6"] + +[resource] +script = ExtResource("1_mqwm6") +name = &"" +action_value_type = 2 +block_lower_priority_actions = true +emit_as_godot_actions = false +is_remappable = false +display_name = "" +display_category = "" diff --git a/guide_examples/quick_start/mapping_contexts/actions/say_hi.tres b/guide_examples/quick_start/mapping_contexts/actions/say_hi.tres new file mode 100644 index 0000000..05af31a --- /dev/null +++ b/guide_examples/quick_start/mapping_contexts/actions/say_hi.tres @@ -0,0 +1,13 @@ +[gd_resource type="Resource" script_class="GUIDEAction" load_steps=2 format=3 uid="uid://d0dmecppsgpo6"] + +[ext_resource type="Script" path="res://addons/guide/guide_action.gd" id="1_ocdl4"] + +[resource] +script = ExtResource("1_ocdl4") +name = &"" +action_value_type = 0 +block_lower_priority_actions = true +emit_as_godot_actions = false +is_remappable = false +display_name = "" +display_category = "" diff --git a/guide_examples/quick_start/mapping_contexts/quickstart.tres b/guide_examples/quick_start/mapping_contexts/quickstart.tres new file mode 100644 index 0000000..6f36a6f --- /dev/null +++ b/guide_examples/quick_start/mapping_contexts/quickstart.tres @@ -0,0 +1,145 @@ +[gd_resource type="Resource" script_class="GUIDEMappingContext" load_steps=27 format=3 uid="uid://b2becclfhsxec"] + +[ext_resource type="Script" path="res://addons/guide/guide_mapping_context.gd" id="1_1hcuh"] +[ext_resource type="Resource" uid="uid://uscuhd84vv0i" path="res://guide_examples/quick_start/mapping_contexts/actions/move.tres" id="1_5uqll"] +[ext_resource type="Script" path="res://addons/guide/inputs/guide_input_key.gd" id="2_xl7hk"] +[ext_resource type="Script" path="res://addons/guide/modifiers/guide_modifier_negate.gd" id="3_mr5va"] +[ext_resource type="Script" path="res://addons/guide/modifiers/guide_modifier_input_swizzle.gd" id="4_4a1ev"] +[ext_resource type="Script" path="res://addons/guide/guide_input_mapping.gd" id="5_1m2pq"] +[ext_resource type="Script" path="res://addons/guide/guide_action_mapping.gd" id="6_ydpah"] +[ext_resource type="Resource" uid="uid://d0dmecppsgpo6" path="res://guide_examples/quick_start/mapping_contexts/actions/say_hi.tres" id="7_wuqd4"] +[ext_resource type="Script" path="res://addons/guide/triggers/guide_trigger_pressed.gd" id="8_khp4m"] + +[sub_resource type="Resource" id="Resource_f0kb3"] +script = ExtResource("2_xl7hk") +key = 87 +shift = false +control = false +alt = false +meta = false +allow_additional_modifiers = true + +[sub_resource type="Resource" id="Resource_fvwu2"] +script = ExtResource("3_mr5va") +x = true +y = true +z = true + +[sub_resource type="Resource" id="Resource_xg24o"] +script = ExtResource("4_4a1ev") +order = 0 + +[sub_resource type="Resource" id="Resource_cgtrg"] +script = ExtResource("5_1m2pq") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_f0kb3") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([SubResource("Resource_fvwu2"), SubResource("Resource_xg24o")]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([]) + +[sub_resource type="Resource" id="Resource_i7s5n"] +script = ExtResource("2_xl7hk") +key = 83 +shift = false +control = false +alt = false +meta = false +allow_additional_modifiers = true + +[sub_resource type="Resource" id="Resource_6l7af"] +script = ExtResource("4_4a1ev") +order = 0 + +[sub_resource type="Resource" id="Resource_o72ru"] +script = ExtResource("5_1m2pq") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_i7s5n") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([SubResource("Resource_6l7af")]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([]) + +[sub_resource type="Resource" id="Resource_4kbei"] +script = ExtResource("2_xl7hk") +key = 65 +shift = false +control = false +alt = false +meta = false +allow_additional_modifiers = true + +[sub_resource type="Resource" id="Resource_t12km"] +script = ExtResource("3_mr5va") +x = true +y = true +z = true + +[sub_resource type="Resource" id="Resource_3xdyg"] +script = ExtResource("5_1m2pq") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_4kbei") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([SubResource("Resource_t12km")]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([]) + +[sub_resource type="Resource" id="Resource_uld1v"] +script = ExtResource("2_xl7hk") +key = 68 +shift = false +control = false +alt = false +meta = false +allow_additional_modifiers = true + +[sub_resource type="Resource" id="Resource_fhxmh"] +script = ExtResource("5_1m2pq") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_uld1v") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([]) + +[sub_resource type="Resource" id="Resource_y44kn"] +script = ExtResource("6_ydpah") +action = ExtResource("1_5uqll") +input_mappings = Array[ExtResource("5_1m2pq")]([SubResource("Resource_cgtrg"), SubResource("Resource_o72ru"), SubResource("Resource_3xdyg"), SubResource("Resource_fhxmh")]) + +[sub_resource type="Resource" id="Resource_cl30n"] +script = ExtResource("2_xl7hk") +key = 32 +shift = false +control = false +alt = false +meta = false +allow_additional_modifiers = true + +[sub_resource type="Resource" id="Resource_31mjc"] +script = ExtResource("8_khp4m") +actuation_threshold = 0.5 + +[sub_resource type="Resource" id="Resource_dq2sf"] +script = ExtResource("5_1m2pq") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_cl30n") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([SubResource("Resource_31mjc")]) + +[sub_resource type="Resource" id="Resource_7p43t"] +script = ExtResource("6_ydpah") +action = ExtResource("7_wuqd4") +input_mappings = Array[ExtResource("5_1m2pq")]([SubResource("Resource_dq2sf")]) + +[resource] +script = ExtResource("1_1hcuh") +display_name = "" +mappings = Array[ExtResource("6_ydpah")]([SubResource("Resource_y44kn"), SubResource("Resource_7p43t")]) diff --git a/guide_examples/quick_start/player.gd b/guide_examples/quick_start/player.gd new file mode 100644 index 0000000..1d50b4c --- /dev/null +++ b/guide_examples/quick_start/player.gd @@ -0,0 +1,22 @@ +extends Sprite2D + +## The speed at which the player moves. +@export var speed:float = 300 +## The action that moves the player. +@export var move_action:GUIDEAction +## The action that says hi. +@export var say_hi_action:GUIDEAction + +func _ready(): + # Call the `say_hi` function whenever the say_hi_action is triggered. + say_hi_action.triggered.connect(_say_hi) + +func _say_hi(): + # Quickly show and hide message panel + %MessagePanel.visible = true + await get_tree().create_timer(0.5).timeout + %MessagePanel.visible = false + +func _process(delta:float): + # Get the input value from the action and move the player. + position += move_action.value_axis_2d * speed * delta diff --git a/guide_examples/quick_start/player.gd.uid b/guide_examples/quick_start/player.gd.uid new file mode 100644 index 0000000..9d06d51 --- /dev/null +++ b/guide_examples/quick_start/player.gd.uid @@ -0,0 +1 @@ +uid://c0b6whgglitqe diff --git a/guide_examples/quick_start/quick_start.tscn b/guide_examples/quick_start/quick_start.tscn new file mode 100644 index 0000000..a0b2bea --- /dev/null +++ b/guide_examples/quick_start/quick_start.tscn @@ -0,0 +1,32 @@ +[gd_scene load_steps=7 format=3 uid="uid://cye0mxa62e7lh"] + +[ext_resource type="Script" path="res://guide_examples/quick_start/game.gd" id="1_eetgd"] +[ext_resource type="Texture2D" uid="uid://byjxtsekdl8t2" path="res://guide_examples/shared/godot_logo.svg" id="1_twtcc"] +[ext_resource type="Script" path="res://guide_examples/quick_start/player.gd" id="2_75sqh"] +[ext_resource type="Resource" uid="uid://b2becclfhsxec" path="res://guide_examples/quick_start/mapping_contexts/quickstart.tres" id="2_enypg"] +[ext_resource type="Resource" uid="uid://uscuhd84vv0i" path="res://guide_examples/quick_start/mapping_contexts/actions/move.tres" id="3_nwedj"] +[ext_resource type="Resource" uid="uid://d0dmecppsgpo6" path="res://guide_examples/quick_start/mapping_contexts/actions/say_hi.tres" id="6_xqef5"] + +[node name="QuickStart" type="Node2D"] +script = ExtResource("1_eetgd") +mapping_context = ExtResource("2_enypg") + +[node name="Player" type="Sprite2D" parent="."] +position = Vector2(979, 544) +texture = ExtResource("1_twtcc") +script = ExtResource("2_75sqh") +move_action = ExtResource("3_nwedj") +say_hi_action = ExtResource("6_xqef5") + +[node name="MessagePanel" type="PanelContainer" parent="Player"] +unique_name_in_owner = true +visible = false +offset_left = 38.0 +offset_top = -161.0 +offset_right = 122.0 +offset_bottom = -73.0 + +[node name="Label" type="Label" parent="Player/MessagePanel"] +layout_mode = 2 +theme_override_font_sizes/font_size = 64 +text = "Hi!" diff --git a/guide_examples/remapping/mapping_contexts/binding_controller.tres b/guide_examples/remapping/mapping_contexts/binding_controller.tres new file mode 100644 index 0000000..59b95d1 --- /dev/null +++ b/guide_examples/remapping/mapping_contexts/binding_controller.tres @@ -0,0 +1,147 @@ +[gd_resource type="Resource" script_class="GUIDEMappingContext" load_steps=33 format=3 uid="uid://dubuepcs1w17f"] + +[ext_resource type="Resource" uid="uid://bohjda85owgnc" path="res://guide_examples/remapping/mapping_contexts/controller_actions/ui_accept.tres" id="1_rokdq"] +[ext_resource type="Script" path="res://addons/guide/inputs/guide_input_joy_button.gd" id="2_30snk"] +[ext_resource type="Script" path="res://addons/guide/guide_input_mapping.gd" id="3_ifcmr"] +[ext_resource type="Script" path="res://addons/guide/triggers/guide_trigger_pressed.gd" id="4_bn4su"] +[ext_resource type="Script" path="res://addons/guide/guide_action_mapping.gd" id="5_wtinc"] +[ext_resource type="Resource" uid="uid://bcum2m26we6ct" path="res://guide_examples/remapping/mapping_contexts/shared_actions/close_menu.tres" id="6_mbh1l"] +[ext_resource type="Resource" uid="uid://ce3ytxn2tcxxe" path="res://guide_examples/remapping/mapping_contexts/controller_actions/switch_to_keyboard.tres" id="7_e2y7c"] +[ext_resource type="Script" path="res://addons/guide/triggers/guide_trigger_released.gd" id="7_ofh8l"] +[ext_resource type="Script" path="res://addons/guide/inputs/guide_input_any.gd" id="8_qiw4m"] +[ext_resource type="Script" path="res://addons/guide/guide_mapping_context.gd" id="9_rcbwk"] +[ext_resource type="Resource" uid="uid://dg1or0do0s1ad" path="res://guide_examples/remapping/mapping_contexts/controller_actions/next_tab.tres" id="10_5tveu"] +[ext_resource type="Resource" uid="uid://cfrx54l1vmjey" path="res://guide_examples/remapping/mapping_contexts/controller_actions/previous_tab.tres" id="11_iu0wm"] + +[sub_resource type="Resource" id="Resource_uri0r"] +script = ExtResource("2_30snk") +button = 0 +joy_index = 0 + +[sub_resource type="Resource" id="Resource_i518v"] +script = ExtResource("7_ofh8l") +actuation_threshold = 0.5 + +[sub_resource type="Resource" id="Resource_kpld2"] +script = ExtResource("3_ifcmr") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_uri0r") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([SubResource("Resource_i518v")]) + +[sub_resource type="Resource" id="Resource_33xax"] +script = ExtResource("5_wtinc") +action = ExtResource("1_rokdq") +input_mappings = Array[ExtResource("3_ifcmr")]([SubResource("Resource_kpld2")]) + +[sub_resource type="Resource" id="Resource_lu1fr"] +script = ExtResource("2_30snk") +button = 6 +joy_index = 0 + +[sub_resource type="Resource" id="Resource_oikmn"] +script = ExtResource("7_ofh8l") +actuation_threshold = 0.5 + +[sub_resource type="Resource" id="Resource_lju6e"] +script = ExtResource("3_ifcmr") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_lu1fr") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([SubResource("Resource_oikmn")]) + +[sub_resource type="Resource" id="Resource_djru6"] +script = ExtResource("5_wtinc") +action = ExtResource("6_mbh1l") +input_mappings = Array[ExtResource("3_ifcmr")]([SubResource("Resource_lju6e")]) + +[sub_resource type="Resource" id="Resource_mc0ue"] +script = ExtResource("8_qiw4m") +mouse_buttons = true +mouse_movement = false +minimum_mouse_movement_distance = 1.0 +joy_buttons = false +joy_axes = false +minimum_joy_axis_actuation_strength = 0.2 +keyboard = true +touch = false +mouse = true +joy = false + +[sub_resource type="Resource" id="Resource_vsgae"] +script = ExtResource("4_bn4su") +actuation_threshold = 0.5 + +[sub_resource type="Resource" id="Resource_vwjgy"] +script = ExtResource("3_ifcmr") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_mc0ue") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([SubResource("Resource_vsgae")]) + +[sub_resource type="Resource" id="Resource_38x5y"] +script = ExtResource("5_wtinc") +action = ExtResource("7_e2y7c") +input_mappings = Array[ExtResource("3_ifcmr")]([SubResource("Resource_vwjgy")]) + +[sub_resource type="Resource" id="Resource_sudy1"] +script = ExtResource("2_30snk") +button = 10 +joy_index = 0 + +[sub_resource type="Resource" id="Resource_4j53a"] +script = ExtResource("4_bn4su") +actuation_threshold = 0.5 + +[sub_resource type="Resource" id="Resource_1g85d"] +script = ExtResource("3_ifcmr") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_sudy1") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([SubResource("Resource_4j53a")]) + +[sub_resource type="Resource" id="Resource_qsusb"] +script = ExtResource("5_wtinc") +action = ExtResource("10_5tveu") +input_mappings = Array[ExtResource("3_ifcmr")]([SubResource("Resource_1g85d")]) + +[sub_resource type="Resource" id="Resource_dkk46"] +script = ExtResource("2_30snk") +button = 9 +joy_index = 0 + +[sub_resource type="Resource" id="Resource_taj0d"] +script = ExtResource("4_bn4su") +actuation_threshold = 0.5 + +[sub_resource type="Resource" id="Resource_35h1x"] +script = ExtResource("3_ifcmr") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_dkk46") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([SubResource("Resource_taj0d")]) + +[sub_resource type="Resource" id="Resource_rl360"] +script = ExtResource("5_wtinc") +action = ExtResource("11_iu0wm") +input_mappings = Array[ExtResource("3_ifcmr")]([SubResource("Resource_35h1x")]) + +[resource] +script = ExtResource("9_rcbwk") +display_name = "" +mappings = Array[ExtResource("5_wtinc")]([SubResource("Resource_33xax"), SubResource("Resource_djru6"), SubResource("Resource_38x5y"), SubResource("Resource_qsusb"), SubResource("Resource_rl360")]) diff --git a/guide_examples/remapping/mapping_contexts/binding_keyboard.tres b/guide_examples/remapping/mapping_contexts/binding_keyboard.tres new file mode 100644 index 0000000..9dbaef0 --- /dev/null +++ b/guide_examples/remapping/mapping_contexts/binding_keyboard.tres @@ -0,0 +1,76 @@ +[gd_resource type="Resource" script_class="GUIDEMappingContext" load_steps=18 format=3 uid="uid://bqd45wwsetlyg"] + +[ext_resource type="Resource" uid="uid://bcum2m26we6ct" path="res://guide_examples/remapping/mapping_contexts/shared_actions/close_menu.tres" id="1_j25bp"] +[ext_resource type="Script" path="res://addons/guide/inputs/guide_input_key.gd" id="2_a3vaw"] +[ext_resource type="Script" path="res://addons/guide/guide_input_mapping.gd" id="3_n037t"] +[ext_resource type="Script" path="res://addons/guide/triggers/guide_trigger_released.gd" id="4_008yb"] +[ext_resource type="Script" path="res://addons/guide/triggers/guide_trigger_pressed.gd" id="4_t70fr"] +[ext_resource type="Script" path="res://addons/guide/guide_action_mapping.gd" id="5_xuekb"] +[ext_resource type="Resource" uid="uid://3vqfs786vcsa" path="res://guide_examples/remapping/mapping_contexts/keyboard_actions/switch_to_controller.tres" id="6_lkk3b"] +[ext_resource type="Script" path="res://addons/guide/guide_mapping_context.gd" id="6_rsvyd"] +[ext_resource type="Script" path="res://addons/guide/inputs/guide_input_any.gd" id="7_b4hkn"] + +[sub_resource type="Resource" id="Resource_rqm6k"] +script = ExtResource("2_a3vaw") +key = 4194305 +shift = false +control = false +alt = false +meta = false +allow_additional_modifiers = true + +[sub_resource type="Resource" id="Resource_yfr8v"] +script = ExtResource("4_008yb") +actuation_threshold = 0.5 + +[sub_resource type="Resource" id="Resource_lju6e"] +script = ExtResource("3_n037t") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_rqm6k") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([SubResource("Resource_yfr8v")]) + +[sub_resource type="Resource" id="Resource_djru6"] +script = ExtResource("5_xuekb") +action = ExtResource("1_j25bp") +input_mappings = Array[ExtResource("3_n037t")]([SubResource("Resource_lju6e")]) + +[sub_resource type="Resource" id="Resource_mpqi8"] +script = ExtResource("7_b4hkn") +mouse_buttons = false +mouse_movement = false +minimum_mouse_movement_distance = 1.0 +joy_buttons = true +joy_axes = false +minimum_joy_axis_actuation_strength = 0.2 +keyboard = false +touch = false +mouse = false +joy = true + +[sub_resource type="Resource" id="Resource_4apa3"] +script = ExtResource("4_t70fr") +actuation_threshold = 0.5 + +[sub_resource type="Resource" id="Resource_0hgmj"] +script = ExtResource("3_n037t") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_mpqi8") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([SubResource("Resource_4apa3")]) + +[sub_resource type="Resource" id="Resource_2neno"] +script = ExtResource("5_xuekb") +action = ExtResource("6_lkk3b") +input_mappings = Array[ExtResource("3_n037t")]([SubResource("Resource_0hgmj")]) + +[resource] +script = ExtResource("6_rsvyd") +display_name = "" +mappings = Array[ExtResource("5_xuekb")]([SubResource("Resource_djru6"), SubResource("Resource_2neno")]) diff --git a/guide_examples/remapping/mapping_contexts/controller.tres b/guide_examples/remapping/mapping_contexts/controller.tres new file mode 100644 index 0000000..e30704b --- /dev/null +++ b/guide_examples/remapping/mapping_contexts/controller.tres @@ -0,0 +1,127 @@ +[gd_resource type="Resource" script_class="GUIDEMappingContext" load_steps=31 format=3 uid="uid://bexjevffjsh3i"] + +[ext_resource type="Resource" uid="uid://chhw5umkd1j2p" path="res://guide_examples/remapping/mapping_contexts/shared_actions/player_movement_2d.tres" id="1_78yyx"] +[ext_resource type="Script" path="res://addons/guide/guide_mapping_context.gd" id="1_l4253"] +[ext_resource type="Script" path="res://addons/guide/modifiers/guide_modifier_deadzone.gd" id="3_rbwxh"] +[ext_resource type="Script" path="res://addons/guide/guide_input_mapping.gd" id="4_m37gr"] +[ext_resource type="Resource" uid="uid://qikyr1rgxw2l" path="res://guide_examples/remapping/mapping_contexts/controller_actions/player_movement_stick_invert.tres" id="4_qbgwt"] +[ext_resource type="Script" path="res://addons/guide/guide_action_mapping.gd" id="5_167oa"] +[ext_resource type="Script" path="res://addons/guide/inputs/guide_input_joy_axis_2d.gd" id="6_y041f"] +[ext_resource type="Resource" uid="uid://ce3ytxn2tcxxe" path="res://guide_examples/remapping/mapping_contexts/controller_actions/switch_to_keyboard.tres" id="8_4d4ov"] +[ext_resource type="Script" path="res://addons/guide/inputs/guide_input_any.gd" id="9_0d1uf"] +[ext_resource type="Script" path="res://addons/guide/triggers/guide_trigger_released.gd" id="9_eexjp"] +[ext_resource type="Resource" uid="uid://c65tsmp268vdq" path="res://guide_examples/remapping/mapping_contexts/shared_actions/open_menu.tres" id="9_l4c4j"] +[ext_resource type="Resource" uid="uid://b1iaet1m2gi2e" path="res://guide_examples/remapping/mapping_contexts/shared_actions/fire.tres" id="9_tkveh"] +[ext_resource type="Script" path="res://addons/guide/inputs/guide_input_joy_button.gd" id="10_a30o8"] +[ext_resource type="Script" path="res://addons/guide/triggers/guide_trigger_pressed.gd" id="11_avbpy"] + +[sub_resource type="Resource" id="Resource_nr3w6"] +script = ExtResource("6_y041f") +x = 0 +y = 1 +joy_index = -1 + +[sub_resource type="Resource" id="Resource_towa1"] +script = ExtResource("3_rbwxh") +lower_threshold = 0.2 +upper_threshold = 1.0 + +[sub_resource type="Resource" id="Resource_gpn8l"] +script = ExtResource("4_m37gr") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_nr3w6") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([SubResource("Resource_towa1"), ExtResource("4_qbgwt")]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([]) + +[sub_resource type="Resource" id="Resource_6h1my"] +script = ExtResource("5_167oa") +action = ExtResource("1_78yyx") +input_mappings = Array[ExtResource("4_m37gr")]([SubResource("Resource_gpn8l")]) + +[sub_resource type="Resource" id="Resource_p73kx"] +script = ExtResource("10_a30o8") +button = 6 +joy_index = -1 + +[sub_resource type="Resource" id="Resource_uov21"] +script = ExtResource("9_eexjp") +actuation_threshold = 0.5 + +[sub_resource type="Resource" id="Resource_f4p62"] +script = ExtResource("4_m37gr") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_p73kx") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([SubResource("Resource_uov21")]) + +[sub_resource type="Resource" id="Resource_wa31m"] +script = ExtResource("5_167oa") +action = ExtResource("9_l4c4j") +input_mappings = Array[ExtResource("4_m37gr")]([SubResource("Resource_f4p62")]) + +[sub_resource type="Resource" id="Resource_iwnk1"] +script = ExtResource("9_0d1uf") +mouse_buttons = false +mouse_movement = false +minimum_mouse_movement_distance = 1.0 +joy_buttons = false +joy_axes = false +minimum_joy_axis_actuation_strength = 0.2 +keyboard = true +touch = false +mouse = false +joy = false + +[sub_resource type="Resource" id="Resource_jwpon"] +script = ExtResource("11_avbpy") +actuation_threshold = 0.5 + +[sub_resource type="Resource" id="Resource_limxc"] +script = ExtResource("4_m37gr") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_iwnk1") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([SubResource("Resource_jwpon")]) + +[sub_resource type="Resource" id="Resource_rtwk8"] +script = ExtResource("5_167oa") +action = ExtResource("8_4d4ov") +input_mappings = Array[ExtResource("4_m37gr")]([SubResource("Resource_limxc")]) + +[sub_resource type="Resource" id="Resource_tsvy3"] +script = ExtResource("10_a30o8") +button = 0 +joy_index = -1 + +[sub_resource type="Resource" id="Resource_qvmci"] +script = ExtResource("11_avbpy") +actuation_threshold = 0.5 + +[sub_resource type="Resource" id="Resource_hf22v"] +script = ExtResource("4_m37gr") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_tsvy3") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([SubResource("Resource_qvmci")]) + +[sub_resource type="Resource" id="Resource_t70e5"] +script = ExtResource("5_167oa") +action = ExtResource("9_tkveh") +input_mappings = Array[ExtResource("4_m37gr")]([SubResource("Resource_hf22v")]) + +[resource] +script = ExtResource("1_l4253") +display_name = "" +mappings = Array[ExtResource("5_167oa")]([SubResource("Resource_6h1my"), SubResource("Resource_wa31m"), SubResource("Resource_rtwk8"), SubResource("Resource_t70e5")]) diff --git a/guide_examples/remapping/mapping_contexts/controller_actions/next_tab.tres b/guide_examples/remapping/mapping_contexts/controller_actions/next_tab.tres new file mode 100644 index 0000000..bcb3748 --- /dev/null +++ b/guide_examples/remapping/mapping_contexts/controller_actions/next_tab.tres @@ -0,0 +1,13 @@ +[gd_resource type="Resource" script_class="GUIDEAction" load_steps=2 format=3 uid="uid://dg1or0do0s1ad"] + +[ext_resource type="Script" path="res://addons/guide/guide_action.gd" id="1_432ak"] + +[resource] +script = ExtResource("1_432ak") +name = &"" +action_value_type = 0 +block_lower_priority_actions = true +emit_as_godot_actions = false +is_remappable = false +display_name = "" +display_category = "" diff --git a/guide_examples/remapping/mapping_contexts/controller_actions/player_movement_stick_invert.tres b/guide_examples/remapping/mapping_contexts/controller_actions/player_movement_stick_invert.tres new file mode 100644 index 0000000..a583d40 --- /dev/null +++ b/guide_examples/remapping/mapping_contexts/controller_actions/player_movement_stick_invert.tres @@ -0,0 +1,9 @@ +[gd_resource type="Resource" script_class="GUIDEModifierNegate" load_steps=2 format=3 uid="uid://qikyr1rgxw2l"] + +[ext_resource type="Script" path="res://addons/guide/modifiers/guide_modifier_negate.gd" id="1_geiqh"] + +[resource] +script = ExtResource("1_geiqh") +x = false +y = false +z = false diff --git a/guide_examples/remapping/mapping_contexts/controller_actions/previous_tab.tres b/guide_examples/remapping/mapping_contexts/controller_actions/previous_tab.tres new file mode 100644 index 0000000..be266f8 --- /dev/null +++ b/guide_examples/remapping/mapping_contexts/controller_actions/previous_tab.tres @@ -0,0 +1,13 @@ +[gd_resource type="Resource" script_class="GUIDEAction" load_steps=2 format=3 uid="uid://cfrx54l1vmjey"] + +[ext_resource type="Script" path="res://addons/guide/guide_action.gd" id="1_mbx72"] + +[resource] +script = ExtResource("1_mbx72") +name = &"" +action_value_type = 0 +block_lower_priority_actions = true +emit_as_godot_actions = false +is_remappable = false +display_name = "" +display_category = "" diff --git a/guide_examples/remapping/mapping_contexts/controller_actions/switch_to_keyboard.tres b/guide_examples/remapping/mapping_contexts/controller_actions/switch_to_keyboard.tres new file mode 100644 index 0000000..49d5db2 --- /dev/null +++ b/guide_examples/remapping/mapping_contexts/controller_actions/switch_to_keyboard.tres @@ -0,0 +1,13 @@ +[gd_resource type="Resource" script_class="GUIDEAction" load_steps=2 format=3 uid="uid://ce3ytxn2tcxxe"] + +[ext_resource type="Script" path="res://addons/guide/guide_action.gd" id="1_gwq63"] + +[resource] +script = ExtResource("1_gwq63") +name = &"" +action_value_type = 0 +block_lower_priority_actions = true +emit_as_godot_actions = false +is_remappable = false +display_name = "" +display_category = "" diff --git a/guide_examples/remapping/mapping_contexts/controller_actions/ui_accept.tres b/guide_examples/remapping/mapping_contexts/controller_actions/ui_accept.tres new file mode 100644 index 0000000..ccbc3ba --- /dev/null +++ b/guide_examples/remapping/mapping_contexts/controller_actions/ui_accept.tres @@ -0,0 +1,13 @@ +[gd_resource type="Resource" script_class="GUIDEAction" load_steps=2 format=3 uid="uid://bohjda85owgnc"] + +[ext_resource type="Script" path="res://addons/guide/guide_action.gd" id="1_laec0"] + +[resource] +script = ExtResource("1_laec0") +name = &"ui_accept" +action_value_type = 0 +block_lower_priority_actions = true +emit_as_godot_actions = true +is_remappable = false +display_name = "" +display_category = "" diff --git a/guide_examples/remapping/mapping_contexts/keyboard.tres b/guide_examples/remapping/mapping_contexts/keyboard.tres new file mode 100644 index 0000000..6d51f3c --- /dev/null +++ b/guide_examples/remapping/mapping_contexts/keyboard.tres @@ -0,0 +1,208 @@ +[gd_resource type="Resource" script_class="GUIDEMappingContext" load_steps=38 format=3 uid="uid://cu0dhstc00cj5"] + +[ext_resource type="Resource" uid="uid://chhw5umkd1j2p" path="res://guide_examples/remapping/mapping_contexts/shared_actions/player_movement_2d.tres" id="1_uy1j0"] +[ext_resource type="Script" path="res://addons/guide/modifiers/guide_modifier_negate.gd" id="4_5oaiq"] +[ext_resource type="Script" path="res://addons/guide/guide_input_mapping.gd" id="5_d2nln"] +[ext_resource type="Script" path="res://addons/guide/modifiers/guide_modifier_input_swizzle.gd" id="8_vp516"] +[ext_resource type="Script" path="res://addons/guide/guide_action_mapping.gd" id="10_xpxg7"] +[ext_resource type="Script" path="res://addons/guide/inputs/guide_input_key.gd" id="12_msrvd"] +[ext_resource type="Script" path="res://addons/guide/triggers/guide_trigger_released.gd" id="13_11jxi"] +[ext_resource type="Resource" uid="uid://c65tsmp268vdq" path="res://guide_examples/remapping/mapping_contexts/shared_actions/open_menu.tres" id="13_m7li8"] +[ext_resource type="Resource" uid="uid://3vqfs786vcsa" path="res://guide_examples/remapping/mapping_contexts/keyboard_actions/switch_to_controller.tres" id="14_57mry"] +[ext_resource type="Script" path="res://addons/guide/triggers/guide_trigger_pressed.gd" id="14_gcar0"] +[ext_resource type="Resource" uid="uid://b1iaet1m2gi2e" path="res://guide_examples/remapping/mapping_contexts/shared_actions/fire.tres" id="15_7eor3"] +[ext_resource type="Script" path="res://addons/guide/inputs/guide_input_any.gd" id="15_51tw7"] +[ext_resource type="Script" path="res://addons/guide/guide_mapping_context.gd" id="15_qjsfb"] + +[sub_resource type="Resource" id="Resource_d5vxv"] +script = ExtResource("12_msrvd") +key = 87 +shift = false +control = false +alt = false +meta = false +allow_additional_modifiers = true + +[sub_resource type="Resource" id="Resource_d5crb"] +script = ExtResource("8_vp516") +order = 0 + +[sub_resource type="Resource" id="Resource_cwfnu"] +script = ExtResource("4_5oaiq") +x = true +y = true +z = true + +[sub_resource type="Resource" id="Resource_u7h55"] +script = ExtResource("5_d2nln") +override_action_settings = true +is_remappable = true +display_name = "Up" +display_category = "" +input = SubResource("Resource_d5vxv") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([SubResource("Resource_d5crb"), SubResource("Resource_cwfnu")]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([]) + +[sub_resource type="Resource" id="Resource_syl0m"] +script = ExtResource("12_msrvd") +key = 83 +shift = false +control = false +alt = false +meta = false +allow_additional_modifiers = true + +[sub_resource type="Resource" id="Resource_8rcpo"] +script = ExtResource("8_vp516") +order = 0 + +[sub_resource type="Resource" id="Resource_te6bu"] +script = ExtResource("5_d2nln") +override_action_settings = true +is_remappable = true +display_name = "Down" +display_category = "" +input = SubResource("Resource_syl0m") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([SubResource("Resource_8rcpo")]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([]) + +[sub_resource type="Resource" id="Resource_erj62"] +script = ExtResource("12_msrvd") +key = 65 +shift = false +control = false +alt = false +meta = false +allow_additional_modifiers = true + +[sub_resource type="Resource" id="Resource_84clu"] +script = ExtResource("4_5oaiq") +x = true +y = true +z = true + +[sub_resource type="Resource" id="Resource_ho2kd"] +script = ExtResource("5_d2nln") +override_action_settings = true +is_remappable = true +display_name = "Left" +display_category = "" +input = SubResource("Resource_erj62") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([SubResource("Resource_84clu")]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([]) + +[sub_resource type="Resource" id="Resource_ybtim"] +script = ExtResource("12_msrvd") +key = 68 +shift = false +control = false +alt = false +meta = false +allow_additional_modifiers = true + +[sub_resource type="Resource" id="Resource_bnk54"] +script = ExtResource("5_d2nln") +override_action_settings = true +is_remappable = true +display_name = "Right" +display_category = "" +input = SubResource("Resource_ybtim") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([]) + +[sub_resource type="Resource" id="Resource_358t4"] +script = ExtResource("10_xpxg7") +action = ExtResource("1_uy1j0") +input_mappings = Array[ExtResource("5_d2nln")]([SubResource("Resource_u7h55"), SubResource("Resource_te6bu"), SubResource("Resource_ho2kd"), SubResource("Resource_bnk54")]) +metadata/_guide_input_mappings_collapsed = false + +[sub_resource type="Resource" id="Resource_la24a"] +script = ExtResource("12_msrvd") +key = 4194305 +shift = false +control = false +alt = false +meta = false +allow_additional_modifiers = true + +[sub_resource type="Resource" id="Resource_dbmrn"] +script = ExtResource("13_11jxi") +actuation_threshold = 0.5 + +[sub_resource type="Resource" id="Resource_wr8lq"] +script = ExtResource("5_d2nln") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_la24a") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([SubResource("Resource_dbmrn")]) + +[sub_resource type="Resource" id="Resource_iwmfr"] +script = ExtResource("10_xpxg7") +action = ExtResource("13_m7li8") +input_mappings = Array[ExtResource("5_d2nln")]([SubResource("Resource_wr8lq")]) +metadata/_guide_input_mappings_collapsed = false + +[sub_resource type="Resource" id="Resource_ke2lc"] +script = ExtResource("15_51tw7") +mouse_buttons = false +mouse_movement = false +minimum_mouse_movement_distance = 1.0 +joy_buttons = true +joy_axes = false +minimum_joy_axis_actuation_strength = 0.2 +keyboard = false +touch = false +mouse = false +joy = true + +[sub_resource type="Resource" id="Resource_oh8td"] +script = ExtResource("5_d2nln") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_ke2lc") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([]) + +[sub_resource type="Resource" id="Resource_unkjf"] +script = ExtResource("10_xpxg7") +action = ExtResource("14_57mry") +input_mappings = Array[ExtResource("5_d2nln")]([SubResource("Resource_oh8td")]) + +[sub_resource type="Resource" id="Resource_h3p6j"] +script = ExtResource("12_msrvd") +key = 32 +shift = false +control = false +alt = false +meta = false +allow_additional_modifiers = true + +[sub_resource type="Resource" id="Resource_saax4"] +script = ExtResource("14_gcar0") +actuation_threshold = 0.5 + +[sub_resource type="Resource" id="Resource_nm3w5"] +script = ExtResource("5_d2nln") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_h3p6j") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([SubResource("Resource_saax4")]) + +[sub_resource type="Resource" id="Resource_cv74y"] +script = ExtResource("10_xpxg7") +action = ExtResource("15_7eor3") +input_mappings = Array[ExtResource("5_d2nln")]([SubResource("Resource_nm3w5")]) +metadata/_guide_input_mappings_collapsed = false + +[resource] +script = ExtResource("15_qjsfb") +display_name = "Keyboard and Mouse" +mappings = Array[ExtResource("10_xpxg7")]([SubResource("Resource_358t4"), SubResource("Resource_iwmfr"), SubResource("Resource_unkjf"), SubResource("Resource_cv74y")]) diff --git a/guide_examples/remapping/mapping_contexts/keyboard_actions/switch_to_controller.tres b/guide_examples/remapping/mapping_contexts/keyboard_actions/switch_to_controller.tres new file mode 100644 index 0000000..627ddc4 --- /dev/null +++ b/guide_examples/remapping/mapping_contexts/keyboard_actions/switch_to_controller.tres @@ -0,0 +1,13 @@ +[gd_resource type="Resource" script_class="GUIDEAction" load_steps=2 format=3 uid="uid://3vqfs786vcsa"] + +[ext_resource type="Script" path="res://addons/guide/guide_action.gd" id="1_ahfs1"] + +[resource] +script = ExtResource("1_ahfs1") +name = &"" +action_value_type = 0 +block_lower_priority_actions = true +emit_as_godot_actions = false +is_remappable = false +display_name = "" +display_category = "" diff --git a/guide_examples/remapping/mapping_contexts/shared_actions/close_menu.tres b/guide_examples/remapping/mapping_contexts/shared_actions/close_menu.tres new file mode 100644 index 0000000..2b2371e --- /dev/null +++ b/guide_examples/remapping/mapping_contexts/shared_actions/close_menu.tres @@ -0,0 +1,13 @@ +[gd_resource type="Resource" script_class="GUIDEAction" load_steps=2 format=3 uid="uid://bcum2m26we6ct"] + +[ext_resource type="Script" path="res://addons/guide/guide_action.gd" id="1_q87d1"] + +[resource] +script = ExtResource("1_q87d1") +name = &"" +action_value_type = 0 +block_lower_priority_actions = true +emit_as_godot_actions = false +is_remappable = false +display_name = "" +display_category = "" diff --git a/guide_examples/remapping/mapping_contexts/shared_actions/fire.tres b/guide_examples/remapping/mapping_contexts/shared_actions/fire.tres new file mode 100644 index 0000000..394fd79 --- /dev/null +++ b/guide_examples/remapping/mapping_contexts/shared_actions/fire.tres @@ -0,0 +1,13 @@ +[gd_resource type="Resource" script_class="GUIDEAction" load_steps=2 format=3 uid="uid://b1iaet1m2gi2e"] + +[ext_resource type="Script" path="res://addons/guide/guide_action.gd" id="1_d1iw0"] + +[resource] +script = ExtResource("1_d1iw0") +name = &"" +action_value_type = 0 +block_lower_priority_actions = true +emit_as_godot_actions = false +is_remappable = true +display_name = "Fire" +display_category = "Player Actions" diff --git a/guide_examples/remapping/mapping_contexts/shared_actions/open_menu.tres b/guide_examples/remapping/mapping_contexts/shared_actions/open_menu.tres new file mode 100644 index 0000000..8a17ab3 --- /dev/null +++ b/guide_examples/remapping/mapping_contexts/shared_actions/open_menu.tres @@ -0,0 +1,13 @@ +[gd_resource type="Resource" script_class="GUIDEAction" load_steps=2 format=3 uid="uid://c65tsmp268vdq"] + +[ext_resource type="Script" path="res://addons/guide/guide_action.gd" id="1_rdx5a"] + +[resource] +script = ExtResource("1_rdx5a") +name = &"" +action_value_type = 0 +block_lower_priority_actions = true +emit_as_godot_actions = false +is_remappable = false +display_name = "" +display_category = "" diff --git a/guide_examples/remapping/mapping_contexts/shared_actions/player_movement_2d.tres b/guide_examples/remapping/mapping_contexts/shared_actions/player_movement_2d.tres new file mode 100644 index 0000000..c61263f --- /dev/null +++ b/guide_examples/remapping/mapping_contexts/shared_actions/player_movement_2d.tres @@ -0,0 +1,13 @@ +[gd_resource type="Resource" script_class="GUIDEAction" load_steps=2 format=3 uid="uid://chhw5umkd1j2p"] + +[ext_resource type="Script" path="res://addons/guide/guide_action.gd" id="1_ecpj4"] + +[resource] +script = ExtResource("1_ecpj4") +name = &"" +action_value_type = 2 +block_lower_priority_actions = true +emit_as_godot_actions = false +is_remappable = true +display_name = "" +display_category = "Player Actions" diff --git a/guide_examples/remapping/player.gd b/guide_examples/remapping/player.gd new file mode 100644 index 0000000..72cec67 --- /dev/null +++ b/guide_examples/remapping/player.gd @@ -0,0 +1,24 @@ +## This is the player script. Note how it has no clue about controllers, axis inversion +## etc. This is all handled by GUIDE and the remapping dialog. +extends Node2D + +@export var speed:float = 300 +@export var move_action:GUIDEAction +@export var fire_action:GUIDEAction + +@export var fireball_scene:PackedScene + +func _ready(): + fire_action.triggered.connect(_shoot_fireball) + + +func _process(delta:float) -> void: + position += move_action.value_axis_2d.normalized() * speed * delta + + +func _shoot_fireball(): + var fireball = fireball_scene.instantiate() + fireball.direction = Vector2.UP + get_parent().add_child(fireball) + + fireball.global_transform = global_transform diff --git a/guide_examples/remapping/player.gd.uid b/guide_examples/remapping/player.gd.uid new file mode 100644 index 0000000..76fa85f --- /dev/null +++ b/guide_examples/remapping/player.gd.uid @@ -0,0 +1 @@ +uid://bhn2nskt2cgym diff --git a/guide_examples/remapping/remapping.gd b/guide_examples/remapping/remapping.gd new file mode 100644 index 0000000..3b99891 --- /dev/null +++ b/guide_examples/remapping/remapping.gd @@ -0,0 +1,57 @@ +## This is the main game controller. It enables a control scheme at the start and is +## responsible for controlling the remapping dialog. +extends Node + +const Utils = preload("utils.gd") + +@export_group("Context & Modifiers") +@export var keyboard:GUIDEMappingContext +@export var controller:GUIDEMappingContext +@export var controller_axis_invert_modifier:GUIDEModifierNegate + +@export_group("Actions") +@export var switch_to_keyboard:GUIDEAction +@export var switch_to_controller:GUIDEAction +@export var open_menu:GUIDEAction + + +@onready var _remapping_dialog:Control = %RemappingDialog + +func _ready(): + # React when the open menu action is triggered. + open_menu.triggered.connect(_open_menu) + + # and switching to controller / keyboard ... + switch_to_controller.triggered.connect(_switch.bind(controller)) + switch_to_keyboard.triggered.connect(_switch.bind(keyboard)) + + # Also listen to when the remapping dialog closes and re-apply the changed + # mapping config + _remapping_dialog.closed.connect(_load_remapping_config) + + # Start with the keyboard scheme + GUIDE.enable_mapping_context(keyboard) + + # finally enable all controls with the last saved remapping configuration + _load_remapping_config(Utils.load_remapping_config()) + + +func _open_menu() -> void: + # and show the remapping dialog + _remapping_dialog.open() + + +func _load_remapping_config(config:GUIDERemappingConfig): + GUIDE.set_remapping_config(config) + + # also apply changes to our modifiers + controller_axis_invert_modifier.x = config.custom_data.get(Utils.CUSTOM_DATA_INVERT_HORIZONTAL, false) + controller_axis_invert_modifier.y = config.custom_data.get(Utils.CUSTOM_DATA_INVERT_VERTICAL, false) + + +func _switch(context:GUIDEMappingContext): + # ignore while remapping is active, remapping will take care of it + if _remapping_dialog.visible: + return + + GUIDE.enable_mapping_context(context, true) diff --git a/guide_examples/remapping/remapping.gd.uid b/guide_examples/remapping/remapping.gd.uid new file mode 100644 index 0000000..f7e0634 --- /dev/null +++ b/guide_examples/remapping/remapping.gd.uid @@ -0,0 +1 @@ +uid://ba5134rplb4y diff --git a/guide_examples/remapping/remapping.tscn b/guide_examples/remapping/remapping.tscn new file mode 100644 index 0000000..5016c47 --- /dev/null +++ b/guide_examples/remapping/remapping.tscn @@ -0,0 +1,67 @@ +[gd_scene load_steps=17 format=3 uid="uid://gjweqc0stfqh"] + +[ext_resource type="Script" path="res://guide_examples/remapping/remapping.gd" id="1_3d1tp"] +[ext_resource type="Texture2D" uid="uid://byjxtsekdl8t2" path="res://guide_examples/shared/godot_logo.svg" id="1_gkmxq"] +[ext_resource type="Resource" uid="uid://qikyr1rgxw2l" path="res://guide_examples/remapping/mapping_contexts/controller_actions/player_movement_stick_invert.tres" id="2_3dav4"] +[ext_resource type="Resource" uid="uid://cu0dhstc00cj5" path="res://guide_examples/remapping/mapping_contexts/keyboard.tres" id="2_issuo"] +[ext_resource type="Script" path="res://guide_examples/remapping/player.gd" id="2_n3drv"] +[ext_resource type="Resource" uid="uid://bexjevffjsh3i" path="res://guide_examples/remapping/mapping_contexts/controller.tres" id="3_apwxt"] +[ext_resource type="Resource" uid="uid://c65tsmp268vdq" path="res://guide_examples/remapping/mapping_contexts/shared_actions/open_menu.tres" id="3_g1dlj"] +[ext_resource type="Resource" uid="uid://chhw5umkd1j2p" path="res://guide_examples/remapping/mapping_contexts/shared_actions/player_movement_2d.tres" id="4_07jn1"] +[ext_resource type="Resource" uid="uid://ce3ytxn2tcxxe" path="res://guide_examples/remapping/mapping_contexts/controller_actions/switch_to_keyboard.tres" id="5_aqwgr"] +[ext_resource type="PackedScene" uid="uid://dkr80d2pi0d41" path="res://addons/guide/debugger/guide_debugger.tscn" id="5_kdgir"] +[ext_resource type="Resource" uid="uid://b1iaet1m2gi2e" path="res://guide_examples/remapping/mapping_contexts/shared_actions/fire.tres" id="6_esnhm"] +[ext_resource type="Resource" uid="uid://3vqfs786vcsa" path="res://guide_examples/remapping/mapping_contexts/keyboard_actions/switch_to_controller.tres" id="6_jncg0"] +[ext_resource type="Theme" uid="uid://dot0gi1yoqmrl" path="res://guide_examples/shared/ui_theme.tres" id="7_8t2l7"] +[ext_resource type="PackedScene" uid="uid://bq0w7uaotgfct" path="res://guide_examples/remapping/ui/remapping_dialog.tscn" id="7_g0vxv"] +[ext_resource type="PackedScene" uid="uid://c36cnvgv2ur60" path="res://guide_examples/shared/fireball/fireball.tscn" id="7_w2y2e"] +[ext_resource type="Script" path="res://guide_examples/shared/instructions_label.gd" id="14_e0a18"] + +[node name="Remapping" type="Node"] +script = ExtResource("1_3d1tp") +keyboard = ExtResource("2_issuo") +controller = ExtResource("3_apwxt") +controller_axis_invert_modifier = ExtResource("2_3dav4") +switch_to_keyboard = ExtResource("5_aqwgr") +switch_to_controller = ExtResource("6_jncg0") +open_menu = ExtResource("3_g1dlj") + +[node name="Player" type="Sprite2D" parent="."] +position = Vector2(546, 317) +texture = ExtResource("1_gkmxq") +script = ExtResource("2_n3drv") +move_action = ExtResource("4_07jn1") +fire_action = ExtResource("6_esnhm") +fireball_scene = ExtResource("7_w2y2e") + +[node name="HUD Layer" type="CanvasLayer" parent="."] + +[node name="Label" type="RichTextLabel" parent="HUD Layer"] +anchors_preset = 1 +anchor_left = 1.0 +anchor_right = 1.0 +offset_left = -16.0 +offset_top = 12.0 +offset_right = -15.0 +offset_bottom = 12.0 +grow_horizontal = 0 +theme = ExtResource("7_8t2l7") +bbcode_enabled = true +fit_content = true +autowrap_mode = 0 +script = ExtResource("14_e0a18") +instructions_text = "Use %s to move. +Press %s to fire a fireball. +Press %s to change input mappings." +actions = Array[Resource("res://addons/guide/guide_action.gd")]([ExtResource("4_07jn1"), ExtResource("6_esnhm"), ExtResource("3_g1dlj")]) + +[node name="UI Layer" type="CanvasLayer" parent="."] + +[node name="RemappingDialog" parent="UI Layer" instance=ExtResource("7_g0vxv")] +unique_name_in_owner = true +visible = false + +[node name="DebugLayer" type="CanvasLayer" parent="."] + +[node name="GuideDebugger" parent="DebugLayer" instance=ExtResource("5_kdgir")] +theme = ExtResource("7_8t2l7") diff --git a/guide_examples/remapping/ui/binding_row.gd b/guide_examples/remapping/ui/binding_row.gd new file mode 100644 index 0000000..c8d3597 --- /dev/null +++ b/guide_examples/remapping/ui/binding_row.gd @@ -0,0 +1,29 @@ +extends HBoxContainer + + +signal rebind(item:GUIDERemapper.ConfigItem) + +@onready var _action_name:Button = %ActionName +@onready var _action_binding:RichTextLabel = %ActionBinding + +var _formatter:GUIDEInputFormatter = GUIDEInputFormatter.new(48) +var _item:GUIDERemapper.ConfigItem + +func initialize(item:GUIDERemapper.ConfigItem, input:GUIDEInput): + _item = item + _action_name.text = item.display_name + _item.changed.connect(_show_input) + _show_input(input) + + +func _on_action_name_pressed(): + if _item != null: + rebind.emit(_item) + + +func _show_input(input:GUIDEInput): + if input != null: + var text = await _formatter.input_as_richtext_async(input) + _action_binding.parse_bbcode(text) + else: + _action_binding.parse_bbcode("") diff --git a/guide_examples/remapping/ui/binding_row.gd.uid b/guide_examples/remapping/ui/binding_row.gd.uid new file mode 100644 index 0000000..25b19c9 --- /dev/null +++ b/guide_examples/remapping/ui/binding_row.gd.uid @@ -0,0 +1 @@ +uid://cfukq2iogf0k4 diff --git a/guide_examples/remapping/ui/binding_row.tscn b/guide_examples/remapping/ui/binding_row.tscn new file mode 100644 index 0000000..e2670f9 --- /dev/null +++ b/guide_examples/remapping/ui/binding_row.tscn @@ -0,0 +1,32 @@ +[gd_scene load_steps=2 format=3 uid="uid://bme1y0ikthda7"] + +[ext_resource type="Script" path="res://guide_examples/remapping/ui/binding_row.gd" id="1_mc50g"] + +[node name="BindingRow" type="HBoxContainer"] +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme_override_constants/separation = 10 +script = ExtResource("1_mc50g") + +[node name="ActionName" type="Button" parent="."] +unique_name_in_owner = true +layout_mode = 2 +size_flags_horizontal = 10 +text = "Lorem ipsum" +flat = true + +[node name="ActionBinding" type="RichTextLabel" parent="."] +unique_name_in_owner = true +layout_mode = 2 +size_flags_horizontal = 2 +size_flags_vertical = 4 +bbcode_enabled = true +fit_content = true +scroll_active = false +autowrap_mode = 0 +shortcut_keys_enabled = false + +[connection signal="pressed" from="ActionName" to="." method="_on_action_name_pressed"] diff --git a/guide_examples/remapping/ui/binding_section.gd b/guide_examples/remapping/ui/binding_section.gd new file mode 100644 index 0000000..7e9f41d --- /dev/null +++ b/guide_examples/remapping/ui/binding_section.gd @@ -0,0 +1,18 @@ +@tool +extends MarginContainer + +@onready var _label:Label = %Label + +@export var text:String: + set(value): + text = value + _refresh() + + +func _ready(): + _refresh() + +func _refresh(): + if _label != null: + _label.text = text + diff --git a/guide_examples/remapping/ui/binding_section.gd.uid b/guide_examples/remapping/ui/binding_section.gd.uid new file mode 100644 index 0000000..b1402ff --- /dev/null +++ b/guide_examples/remapping/ui/binding_section.gd.uid @@ -0,0 +1 @@ +uid://dt4gdj0rt5mnw diff --git a/guide_examples/remapping/ui/binding_section.tscn b/guide_examples/remapping/ui/binding_section.tscn new file mode 100644 index 0000000..539eaf7 --- /dev/null +++ b/guide_examples/remapping/ui/binding_section.tscn @@ -0,0 +1,36 @@ +[gd_scene load_steps=3 format=3 uid="uid://cj1h0wxamje4s"] + +[ext_resource type="Script" path="res://guide_examples/remapping/ui/binding_section.gd" id="1_hoxsv"] + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_h8l7u"] +bg_color = Color(0.355314, 0.355314, 0.355313, 1) +corner_radius_top_left = 10 +corner_radius_top_right = 10 +corner_radius_bottom_right = 10 +corner_radius_bottom_left = 10 + +[node name="MarginContainer" type="MarginContainer"] +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme_override_constants/margin_top = 10 +theme_override_constants/margin_bottom = 10 +script = ExtResource("1_hoxsv") + +[node name="Panel" type="Panel" parent="."] +layout_mode = 2 +theme_override_styles/panel = SubResource("StyleBoxFlat_h8l7u") + +[node name="BindingSection" type="MarginContainer" parent="."] +layout_mode = 2 +theme_override_constants/margin_left = 5 +theme_override_constants/margin_top = 5 +theme_override_constants/margin_right = 5 +theme_override_constants/margin_bottom = 5 + +[node name="Label" type="Label" parent="BindingSection"] +unique_name_in_owner = true +layout_mode = 2 +theme_override_font_sizes/font_size = 22 diff --git a/guide_examples/remapping/ui/remapping_dialog.gd b/guide_examples/remapping/ui/remapping_dialog.gd new file mode 100644 index 0000000..04cb0d8 --- /dev/null +++ b/guide_examples/remapping/ui/remapping_dialog.gd @@ -0,0 +1,198 @@ +## The remapping dialog. +extends MarginContainer + +signal closed(applied_config:GUIDERemappingConfig) + +const Utils = preload("../utils.gd") + +# Input +@export var keyboard_context:GUIDEMappingContext +@export var controller_context:GUIDEMappingContext +@export var binding_keyboard_context:GUIDEMappingContext +@export var binding_controller_context:GUIDEMappingContext +@export var close_dialog:GUIDEAction +@export var switch_to_controller:GUIDEAction +@export var switch_to_keyboard:GUIDEAction +@export var previous_tab:GUIDEAction +@export var next_tab:GUIDEAction + +# UI +@export var binding_row_scene:PackedScene +@export var binding_section_scene:PackedScene + +@onready var _keyboard_bindings:Container = %KeyboardBindings +@onready var _controller_bindings:Container = %ControllerBindings +@onready var _press_prompt:Control = %PressPrompt +@onready var _controller_invert_horizontal:CheckBox = %ControllerInvertHorizontal +@onready var _controller_invert_vertical:CheckBox = %ControllerInvertVertical +@onready var _tab_container:TabContainer = %TabContainer + +## The input detector for detecting new input +@onready var _input_detector:GUIDEInputDetector = %GUIDEInputDetector + +## The remapper, helps us quickly remap inputs. +var _remapper:GUIDERemapper = GUIDERemapper.new() + +## The config we're currently working on +var _remapping_config:GUIDERemappingConfig + +## The last control that was focused when we started input detection. +## Used to restore focus afterwards. +var _focused_control:Control = null + +func _ready(): + # connect the actions that the remapping dialog uses + close_dialog.triggered.connect(_on_close_dialog) + switch_to_controller.triggered.connect(_switch.bind(binding_controller_context)) + switch_to_keyboard.triggered.connect(_switch.bind(binding_keyboard_context)) + previous_tab.triggered.connect(_switch_tab.bind(-1)) + next_tab.triggered.connect(_switch_tab.bind(1)) + + +func open(): + # switch the tab to the scheme that is currently enabled + # to make life a bit easier for the player, and also + # enable the correct mapping context for the binding dialog + if GUIDE.is_mapping_context_enabled(controller_context): + _tab_container.current_tab = 1 + GUIDE.enable_mapping_context(binding_controller_context, true) + else: + _tab_container.current_tab = 0 + GUIDE.enable_mapping_context(binding_keyboard_context, true) + + # todo provide specific actions for the tab bar controller + _tab_container.get_tab_bar().grab_focus() + + # Open the user's last edited remapping config, if it exists + _remapping_config = Utils.load_remapping_config() + + # And initialize the remapper + _remapper.initialize([keyboard_context, controller_context], _remapping_config) + + _clear(_keyboard_bindings) + _clear(_controller_bindings) + + # fill the keyboard section + _fill_remappable_items(keyboard_context, _keyboard_bindings) + + # fill the controller section + _fill_remappable_items(controller_context, _controller_bindings) + + _controller_invert_horizontal.button_pressed = _remapper.get_custom_data("invert_horizontal", false) + _controller_invert_vertical.button_pressed = _remapper.get_custom_data("invert_vertical", false) + + + visible = true + + +## Fills remappable items and sub-sections into the given container +func _fill_remappable_items(context:GUIDEMappingContext, root:Container): + var items := _remapper.get_remappable_items(context) + var section_name = "" + for item in items: + if item.display_category != section_name: + section_name = item.display_category + var section = binding_section_scene.instantiate() + root.add_child(section) + section.text = section_name + + var instance = binding_row_scene.instantiate() + root.add_child(instance) + + # Show the current binding. + instance.initialize(item, _remapper.get_bound_input_or_null(item)) + instance.rebind.connect(_rebind_item) + + + +func _rebind_item(item:GUIDERemapper.ConfigItem): + _focused_control = get_viewport().gui_get_focus_owner() + _focused_control.release_focus() + + _press_prompt.visible = true + + # Limit the devices that we can detect based on which + # mapping context we're currently working on. So + # for keyboard only keys can be bound and for controller + # only controller buttons can be bound. + var device := GUIDEInputDetector.DeviceType.KEYBOARD + if item.context == controller_context: + device = GUIDEInputDetector.DeviceType.JOY + + # detect a new input + _input_detector.detect(item.value_type, [device]) + var input = await _input_detector.input_detected + + _press_prompt.visible = false + + _focused_control.grab_focus() + + # check if the detection was aborted. + if input == null: + return + + # check for collisions + var collisions := _remapper.get_input_collisions(item, input) + + # if any collision is from a non-bindable mapping, we cannot use this input + if collisions.any(func(it:GUIDERemapper.ConfigItem): return not it.is_remappable): + return + + # unbind the colliding entries. + for collision in collisions: + _remapper.set_bound_input(collision, null) + + # now bind the new input + _remapper.set_bound_input(item, input) + + + +func _clear(root:Container): + for child in root.get_children(): + root.remove_child(child) + child.queue_free() + + +func _on_abort_detection(): + _input_detector.abort_detection() + +func _on_close_dialog(): + if _input_detector.is_detecting: + return + # same as pressing return to game + _on_return_to_game_pressed() + +func _on_controller_invert_horizontal_toggled(toggled_on:bool): + _remapper.set_custom_data(Utils.CUSTOM_DATA_INVERT_HORIZONTAL, toggled_on) + + +func _on_controller_invert_vertical_toggled(toggled_on:bool): + _remapper.set_custom_data(Utils.CUSTOM_DATA_INVERT_VERTICAL, toggled_on) + + +func _on_return_to_game_pressed(): + # get the modified config + var final_config := _remapper.get_mapping_config() + # store it + Utils.save_remapping_config(final_config) + + # restore main mapping context based on what is currently active + if GUIDE.is_mapping_context_enabled(binding_keyboard_context): + GUIDE.enable_mapping_context(keyboard_context, true) + else: + GUIDE.enable_mapping_context(controller_context, true) + + # and close the dialog + visible = false + closed.emit(final_config) + + +func _switch_tab(index:int): + _tab_container.current_tab = posmod(_tab_container.current_tab + index, 2) + +func _switch(context:GUIDEMappingContext): + # only do this when the dialog is visible + if not visible: + return + + GUIDE.enable_mapping_context(context, true) diff --git a/guide_examples/remapping/ui/remapping_dialog.gd.uid b/guide_examples/remapping/ui/remapping_dialog.gd.uid new file mode 100644 index 0000000..dcd820e --- /dev/null +++ b/guide_examples/remapping/ui/remapping_dialog.gd.uid @@ -0,0 +1 @@ +uid://5crxnd8ysf6 diff --git a/guide_examples/remapping/ui/remapping_dialog.tscn b/guide_examples/remapping/ui/remapping_dialog.tscn new file mode 100644 index 0000000..00bde01 --- /dev/null +++ b/guide_examples/remapping/ui/remapping_dialog.tscn @@ -0,0 +1,224 @@ +[gd_scene load_steps=21 format=3 uid="uid://bq0w7uaotgfct"] + +[ext_resource type="Script" path="res://guide_examples/remapping/ui/remapping_dialog.gd" id="1_6hgqj"] +[ext_resource type="Theme" uid="uid://dot0gi1yoqmrl" path="res://guide_examples/shared/ui_theme.tres" id="1_uhsj0"] +[ext_resource type="Resource" uid="uid://cu0dhstc00cj5" path="res://guide_examples/remapping/mapping_contexts/keyboard.tres" id="2_cgour"] +[ext_resource type="Script" path="res://addons/guide/remapping/guide_input_detector.gd" id="3_o0nvn"] +[ext_resource type="Resource" uid="uid://bexjevffjsh3i" path="res://guide_examples/remapping/mapping_contexts/controller.tres" id="3_tgkdx"] +[ext_resource type="PackedScene" uid="uid://bme1y0ikthda7" path="res://guide_examples/remapping/ui/binding_row.tscn" id="4_iojgu"] +[ext_resource type="PackedScene" uid="uid://cj1h0wxamje4s" path="res://guide_examples/remapping/ui/binding_section.tscn" id="5_8v80s"] +[ext_resource type="Resource" uid="uid://bqd45wwsetlyg" path="res://guide_examples/remapping/mapping_contexts/binding_keyboard.tres" id="5_tw3jw"] +[ext_resource type="Resource" uid="uid://dubuepcs1w17f" path="res://guide_examples/remapping/mapping_contexts/binding_controller.tres" id="6_gdrkn"] +[ext_resource type="Resource" uid="uid://bcum2m26we6ct" path="res://guide_examples/remapping/mapping_contexts/shared_actions/close_menu.tres" id="7_djty7"] +[ext_resource type="Resource" uid="uid://3vqfs786vcsa" path="res://guide_examples/remapping/mapping_contexts/keyboard_actions/switch_to_controller.tres" id="8_lj8gw"] +[ext_resource type="Resource" uid="uid://ce3ytxn2tcxxe" path="res://guide_examples/remapping/mapping_contexts/controller_actions/switch_to_keyboard.tres" id="9_brmt1"] +[ext_resource type="Script" path="res://guide_examples/shared/instructions_label.gd" id="10_xsw70"] +[ext_resource type="Script" path="res://addons/guide/inputs/guide_input_key.gd" id="11_e078a"] +[ext_resource type="Resource" uid="uid://cfrx54l1vmjey" path="res://guide_examples/remapping/mapping_contexts/controller_actions/previous_tab.tres" id="11_uxwof"] +[ext_resource type="Resource" uid="uid://dg1or0do0s1ad" path="res://guide_examples/remapping/mapping_contexts/controller_actions/next_tab.tres" id="12_byojv"] +[ext_resource type="Script" path="res://addons/guide/inputs/guide_input_joy_button.gd" id="12_hftpv"] + +[sub_resource type="Resource" id="Resource_f3bao"] +script = ExtResource("11_e078a") +key = 4194305 +shift = false +control = false +alt = false +meta = false +allow_additional_modifiers = false + +[sub_resource type="Resource" id="Resource_twrga"] +script = ExtResource("12_hftpv") +button = 4 +joy_index = -1 + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_bagfg"] +bg_color = Color(0.266575, 0.266575, 0.266575, 1) + +[node name="RemappingDialog" type="MarginContainer"] +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme = ExtResource("1_uhsj0") +script = ExtResource("1_6hgqj") +keyboard_context = ExtResource("2_cgour") +controller_context = ExtResource("3_tgkdx") +binding_keyboard_context = ExtResource("5_tw3jw") +binding_controller_context = ExtResource("6_gdrkn") +close_dialog = ExtResource("7_djty7") +switch_to_controller = ExtResource("8_lj8gw") +switch_to_keyboard = ExtResource("9_brmt1") +previous_tab = ExtResource("11_uxwof") +next_tab = ExtResource("12_byojv") +binding_row_scene = ExtResource("4_iojgu") +binding_section_scene = ExtResource("5_8v80s") + +[node name="Blocker" type="ColorRect" parent="."] +layout_mode = 2 +color = Color(8.66354e-07, 0.331199, 0.634906, 0.352941) + +[node name="CenterContainer" type="CenterContainer" parent="."] +layout_mode = 2 + +[node name="PanelContainer" type="PanelContainer" parent="CenterContainer"] +layout_mode = 2 + +[node name="MarginContainer" type="MarginContainer" parent="CenterContainer/PanelContainer"] +layout_mode = 2 +theme_override_constants/margin_left = 20 +theme_override_constants/margin_top = 20 +theme_override_constants/margin_right = 20 +theme_override_constants/margin_bottom = 20 + +[node name="VBoxContainer" type="VBoxContainer" parent="CenterContainer/PanelContainer/MarginContainer"] +custom_minimum_size = Vector2(800, 600) +layout_mode = 2 +theme_override_constants/separation = 20 + +[node name="Label" type="Label" parent="CenterContainer/PanelContainer/MarginContainer/VBoxContainer"] +layout_mode = 2 +theme_type_variation = &"HeaderLarge" +text = "Input Rebinding" +horizontal_alignment = 1 + +[node name="MarginContainer" type="MarginContainer" parent="CenterContainer/PanelContainer/MarginContainer/VBoxContainer"] +layout_mode = 2 +size_flags_vertical = 3 + +[node name="TabContainer" type="TabContainer" parent="CenterContainer/PanelContainer/MarginContainer/VBoxContainer/MarginContainer"] +unique_name_in_owner = true +layout_mode = 2 +size_flags_vertical = 3 +tab_alignment = 1 +current_tab = 1 +clip_tabs = false + +[node name="Keyboard" type="PanelContainer" parent="CenterContainer/PanelContainer/MarginContainer/VBoxContainer/MarginContainer/TabContainer"] +visible = false +layout_mode = 2 + +[node name="MarginContainer" type="MarginContainer" parent="CenterContainer/PanelContainer/MarginContainer/VBoxContainer/MarginContainer/TabContainer/Keyboard"] +layout_mode = 2 +theme_override_constants/margin_left = 10 +theme_override_constants/margin_top = 10 +theme_override_constants/margin_right = 10 +theme_override_constants/margin_bottom = 10 + +[node name="ScrollContainer" type="ScrollContainer" parent="CenterContainer/PanelContainer/MarginContainer/VBoxContainer/MarginContainer/TabContainer/Keyboard/MarginContainer"] +layout_mode = 2 + +[node name="KeyboardBindings" type="VBoxContainer" parent="CenterContainer/PanelContainer/MarginContainer/VBoxContainer/MarginContainer/TabContainer/Keyboard/MarginContainer/ScrollContainer"] +unique_name_in_owner = true +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="Controller" type="PanelContainer" parent="CenterContainer/PanelContainer/MarginContainer/VBoxContainer/MarginContainer/TabContainer"] +layout_mode = 2 + +[node name="MarginContainer" type="MarginContainer" parent="CenterContainer/PanelContainer/MarginContainer/VBoxContainer/MarginContainer/TabContainer/Controller"] +layout_mode = 2 +theme_override_constants/margin_left = 10 +theme_override_constants/margin_top = 10 +theme_override_constants/margin_right = 10 +theme_override_constants/margin_bottom = 10 + +[node name="ScrollContainer" type="ScrollContainer" parent="CenterContainer/PanelContainer/MarginContainer/VBoxContainer/MarginContainer/TabContainer/Controller/MarginContainer"] +layout_mode = 2 + +[node name="VBoxContainer" type="VBoxContainer" parent="CenterContainer/PanelContainer/MarginContainer/VBoxContainer/MarginContainer/TabContainer/Controller/MarginContainer/ScrollContainer"] +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="ControllerBindings" type="VBoxContainer" parent="CenterContainer/PanelContainer/MarginContainer/VBoxContainer/MarginContainer/TabContainer/Controller/MarginContainer/ScrollContainer/VBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="Section" parent="CenterContainer/PanelContainer/MarginContainer/VBoxContainer/MarginContainer/TabContainer/Controller/MarginContainer/ScrollContainer/VBoxContainer" instance=ExtResource("5_8v80s")] +layout_mode = 2 +text = "Miscellaneous" + +[node name="ControllerInvertHorizontal" type="CheckBox" parent="CenterContainer/PanelContainer/MarginContainer/VBoxContainer/MarginContainer/TabContainer/Controller/MarginContainer/ScrollContainer/VBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +text = "Invert horizontal movement" + +[node name="ControllerInvertVertical" type="CheckBox" parent="CenterContainer/PanelContainer/MarginContainer/VBoxContainer/MarginContainer/TabContainer/Controller/MarginContainer/ScrollContainer/VBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +text = "Invert vertical movement" + +[node name="HBoxContainer" type="HBoxContainer" parent="CenterContainer/PanelContainer/MarginContainer/VBoxContainer/MarginContainer"] +layout_mode = 2 +mouse_filter = 2 + +[node name="RichTextLabel" type="RichTextLabel" parent="CenterContainer/PanelContainer/MarginContainer/VBoxContainer/MarginContainer/HBoxContainer"] +layout_mode = 2 +mouse_filter = 2 +fit_content = true +scroll_active = false +autowrap_mode = 0 +script = ExtResource("10_xsw70") +instructions_text = "%s" +actions = Array[Resource("res://addons/guide/guide_action.gd")]([ExtResource("11_uxwof")]) + +[node name="Control" type="Control" parent="CenterContainer/PanelContainer/MarginContainer/VBoxContainer/MarginContainer/HBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +mouse_filter = 2 + +[node name="RichTextLabel2" type="RichTextLabel" parent="CenterContainer/PanelContainer/MarginContainer/VBoxContainer/MarginContainer/HBoxContainer"] +layout_mode = 2 +mouse_filter = 2 +fit_content = true +scroll_active = false +autowrap_mode = 0 +script = ExtResource("10_xsw70") +instructions_text = "%s" +actions = Array[Resource("res://addons/guide/guide_action.gd")]([ExtResource("12_byojv")]) + +[node name="HBoxContainer" type="HBoxContainer" parent="CenterContainer/PanelContainer/MarginContainer/VBoxContainer"] +layout_mode = 2 +alignment = 1 + +[node name="ReturnToGame" type="Button" parent="CenterContainer/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +text = "Return to game" + +[node name="GUIDEInputDetector" type="Node" parent="."] +unique_name_in_owner = true +editor_description = "This node has two inputs specified which count as abort for detection (Escape and Controller back button)." +script = ExtResource("3_o0nvn") +detection_countdown_seconds = 0.1 +abort_detection_on = Array[Resource("res://addons/guide/inputs/guide_input.gd")]([SubResource("Resource_f3bao"), SubResource("Resource_twrga")]) + +[node name="PressPrompt" type="MarginContainer" parent="."] +unique_name_in_owner = true +visible = false +layout_mode = 2 +mouse_filter = 0 + +[node name="CenterContainer" type="CenterContainer" parent="PressPrompt"] +layout_mode = 2 + +[node name="Panel" type="PanelContainer" parent="PressPrompt/CenterContainer"] +layout_mode = 2 +theme_override_styles/panel = SubResource("StyleBoxFlat_bagfg") + +[node name="MarginContainer" type="MarginContainer" parent="PressPrompt/CenterContainer/Panel"] +layout_mode = 2 +theme_override_constants/margin_left = 20 +theme_override_constants/margin_top = 20 +theme_override_constants/margin_right = 20 +theme_override_constants/margin_bottom = 20 + +[node name="Label" type="Label" parent="PressPrompt/CenterContainer/Panel/MarginContainer"] +layout_mode = 2 +text = "Press new input..." + +[connection signal="toggled" from="CenterContainer/PanelContainer/MarginContainer/VBoxContainer/MarginContainer/TabContainer/Controller/MarginContainer/ScrollContainer/VBoxContainer/ControllerInvertHorizontal" to="." method="_on_controller_invert_horizontal_toggled"] +[connection signal="toggled" from="CenterContainer/PanelContainer/MarginContainer/VBoxContainer/MarginContainer/TabContainer/Controller/MarginContainer/ScrollContainer/VBoxContainer/ControllerInvertVertical" to="." method="_on_controller_invert_vertical_toggled"] +[connection signal="pressed" from="CenterContainer/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer/ReturnToGame" to="." method="_on_return_to_game_pressed"] diff --git a/guide_examples/remapping/utils.gd b/guide_examples/remapping/utils.gd new file mode 100644 index 0000000..613ae32 --- /dev/null +++ b/guide_examples/remapping/utils.gd @@ -0,0 +1,18 @@ +const REMAPPING_CONFIG_PATH = "user://remapping_config.tres" + +# Constants for custom data that we store in the remapping config. +const CUSTOM_DATA_INVERT_HORIZONTAL = "invert_horizontal" +const CUSTOM_DATA_INVERT_VERTICAL = "invert_vertical" + +## Loads the saved remapping config if it exists, or an empty remapping +## config if none exists. +static func load_remapping_config() -> GUIDERemappingConfig: + if ResourceLoader.exists(REMAPPING_CONFIG_PATH): + return ResourceLoader.load(REMAPPING_CONFIG_PATH) + else: + return GUIDERemappingConfig.new() + +## Saves the given remapping config to the user folder +static func save_remapping_config(config:GUIDERemappingConfig) -> void: + ResourceSaver.save(config, REMAPPING_CONFIG_PATH) + config.take_over_path(REMAPPING_CONFIG_PATH) diff --git a/guide_examples/remapping/utils.gd.uid b/guide_examples/remapping/utils.gd.uid new file mode 100644 index 0000000..a6e948d --- /dev/null +++ b/guide_examples/remapping/utils.gd.uid @@ -0,0 +1 @@ +uid://chnxcg46gaypy diff --git a/guide_examples/shared/fireball/fireball.gd b/guide_examples/shared/fireball/fireball.gd new file mode 100644 index 0000000..ff6f835 --- /dev/null +++ b/guide_examples/shared/fireball/fireball.gd @@ -0,0 +1,13 @@ +extends Node2D + +@export var speed:float = 600 +var direction:Vector2 = Vector2.ZERO + + +func _ready(): + await get_tree().create_timer(5).timeout + queue_free() + + +func _process(delta): + position += speed * direction * delta diff --git a/guide_examples/shared/fireball/fireball.gd.uid b/guide_examples/shared/fireball/fireball.gd.uid new file mode 100644 index 0000000..8e47ec1 --- /dev/null +++ b/guide_examples/shared/fireball/fireball.gd.uid @@ -0,0 +1 @@ +uid://bvlq6u3twn6x2 diff --git a/guide_examples/shared/fireball/fireball.svg b/guide_examples/shared/fireball/fireball.svg new file mode 100644 index 0000000..3a7079b --- /dev/null +++ b/guide_examples/shared/fireball/fireball.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/guide_examples/shared/fireball/fireball.svg.import b/guide_examples/shared/fireball/fireball.svg.import new file mode 100644 index 0000000..787001d --- /dev/null +++ b/guide_examples/shared/fireball/fireball.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://buu21kg4kkhiw" +path="res://.godot/imported/fireball.svg-da8480a7a8e47ac511e0971f6fa164bd.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://guide_examples/shared/fireball/fireball.svg" +dest_files=["res://.godot/imported/fireball.svg-da8480a7a8e47ac511e0971f6fa164bd.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/guide_examples/shared/fireball/fireball.tscn b/guide_examples/shared/fireball/fireball.tscn new file mode 100644 index 0000000..4b288ef --- /dev/null +++ b/guide_examples/shared/fireball/fireball.tscn @@ -0,0 +1,10 @@ +[gd_scene load_steps=3 format=3 uid="uid://c36cnvgv2ur60"] + +[ext_resource type="Script" path="res://guide_examples/shared/fireball/fireball.gd" id="1_jxcno"] +[ext_resource type="Texture2D" uid="uid://buu21kg4kkhiw" path="res://guide_examples/shared/fireball/fireball.svg" id="2_5ckxn"] + +[node name="Fireball" type="Node2D"] +script = ExtResource("1_jxcno") + +[node name="Fireball" type="Sprite2D" parent="."] +texture = ExtResource("2_5ckxn") diff --git a/guide_examples/shared/godot_logo.svg b/guide_examples/shared/godot_logo.svg new file mode 100644 index 0000000..3fe4f4a --- /dev/null +++ b/guide_examples/shared/godot_logo.svg @@ -0,0 +1 @@ + diff --git a/guide_examples/shared/godot_logo.svg.import b/guide_examples/shared/godot_logo.svg.import new file mode 100644 index 0000000..6dbb436 --- /dev/null +++ b/guide_examples/shared/godot_logo.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://byjxtsekdl8t2" +path="res://.godot/imported/godot_logo.svg-ce7d52346b74cfa0766735b0b77afab9.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://guide_examples/shared/godot_logo.svg" +dest_files=["res://.godot/imported/godot_logo.svg-ce7d52346b74cfa0766735b0b77afab9.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/guide_examples/shared/instructions_label.gd b/guide_examples/shared/instructions_label.gd new file mode 100644 index 0000000..06799f3 --- /dev/null +++ b/guide_examples/shared/instructions_label.gd @@ -0,0 +1,52 @@ +## This is an example for how input prompts can be shown to the player. +extends RichTextLabel + +## The instructions text. Should contain %s where the action text should go. +@export_multiline var instructions_text:String +## The actions which should be used for rendering the instructions. One action for +## each %s in the text. +@export var actions:Array[GUIDEAction] = [] +## The icon size to be used for rendering. +@export var icon_size:int = 48 + +## If set, the label will only show when the given mapping context is active. +@export var limit_to_context:GUIDEMappingContext + +# The formatter. This will do the actual work of formatting action inputs into prompts. +var _formatter:GUIDEInputFormatter + +func _ready(): + bbcode_enabled = true + fit_content = true + scroll_active = false + autowrap_mode = TextServer.AUTOWRAP_OFF + + # Subscribe to the input mappings change so we can update the prompts or hide the label + # when any inputs change. This way the label can automatically update itself if we switch + # from keyboard to controller input or rebind some keys. + GUIDE.input_mappings_changed.connect(_update_instructions) + _formatter = GUIDEInputFormatter.for_active_contexts(icon_size) + + +func _update_instructions(): + # If we only show for a certain context, hide if that context isn't active right now. + if limit_to_context != null and not GUIDE.is_mapping_context_enabled(limit_to_context): + visible = false + return + + # if no mapping context is active, we'll not be able to show instructions, so bail out here. + if GUIDE.get_enabled_mapping_contexts().is_empty(): + visible = false + return + + visible = true + + # Update the prompts. + var replacements:Array[String] = [] + for action in actions: + replacements.append(await _formatter.action_as_richtext_async(action)) + + parse_bbcode(instructions_text % replacements) + + + diff --git a/guide_examples/shared/instructions_label.gd.uid b/guide_examples/shared/instructions_label.gd.uid new file mode 100644 index 0000000..f935ab6 --- /dev/null +++ b/guide_examples/shared/instructions_label.gd.uid @@ -0,0 +1 @@ +uid://w8q1xlqw60qh diff --git a/guide_examples/shared/ui_theme.tres b/guide_examples/shared/ui_theme.tres new file mode 100644 index 0000000..ba66776 --- /dev/null +++ b/guide_examples/shared/ui_theme.tres @@ -0,0 +1,5 @@ +[gd_resource type="Theme" format=3 uid="uid://dot0gi1yoqmrl"] + +[resource] +default_font_size = 24 +HeaderLarge/font_sizes/font_size = 30 diff --git a/guide_examples/simple_input/mapping_contexts/move_down.tres b/guide_examples/simple_input/mapping_contexts/move_down.tres new file mode 100644 index 0000000..489c421 --- /dev/null +++ b/guide_examples/simple_input/mapping_contexts/move_down.tres @@ -0,0 +1,9 @@ +[gd_resource type="Resource" script_class="GUIDEAction" load_steps=2 format=3 uid="uid://cjfdsja54wtus"] + +[ext_resource type="Script" path="res://addons/guide/guide_action.gd" id="1_yaxge"] + +[resource] +script = ExtResource("1_yaxge") +name = "" +display_name = "" +display_category = "" diff --git a/guide_examples/simple_input/mapping_contexts/move_left.tres b/guide_examples/simple_input/mapping_contexts/move_left.tres new file mode 100644 index 0000000..1039eda --- /dev/null +++ b/guide_examples/simple_input/mapping_contexts/move_left.tres @@ -0,0 +1,9 @@ +[gd_resource type="Resource" script_class="GUIDEAction" load_steps=2 format=3 uid="uid://b7rcj2usvx7iu"] + +[ext_resource type="Script" path="res://addons/guide/guide_action.gd" id="1_2lu1r"] + +[resource] +script = ExtResource("1_2lu1r") +name = "" +display_name = "" +display_category = "" diff --git a/guide_examples/simple_input/mapping_contexts/move_right.tres b/guide_examples/simple_input/mapping_contexts/move_right.tres new file mode 100644 index 0000000..8768587 --- /dev/null +++ b/guide_examples/simple_input/mapping_contexts/move_right.tres @@ -0,0 +1,9 @@ +[gd_resource type="Resource" script_class="GUIDEAction" load_steps=2 format=3 uid="uid://cn4nypfrnusrn"] + +[ext_resource type="Script" path="res://addons/guide/guide_action.gd" id="1_o2mf7"] + +[resource] +script = ExtResource("1_o2mf7") +name = "" +display_name = "" +display_category = "" diff --git a/guide_examples/simple_input/mapping_contexts/move_up.tres b/guide_examples/simple_input/mapping_contexts/move_up.tres new file mode 100644 index 0000000..6e9e71e --- /dev/null +++ b/guide_examples/simple_input/mapping_contexts/move_up.tres @@ -0,0 +1,9 @@ +[gd_resource type="Resource" script_class="GUIDEAction" load_steps=2 format=3 uid="uid://cjohgt5cdoxvd"] + +[ext_resource type="Script" path="res://addons/guide/guide_action.gd" id="1_1p8w8"] + +[resource] +script = ExtResource("1_1p8w8") +name = "" +display_name = "" +display_category = "" diff --git a/guide_examples/simple_input/mapping_contexts/simple_input.tres b/guide_examples/simple_input/mapping_contexts/simple_input.tres new file mode 100644 index 0000000..5c00af1 --- /dev/null +++ b/guide_examples/simple_input/mapping_contexts/simple_input.tres @@ -0,0 +1,111 @@ +[gd_resource type="Resource" script_class="GUIDEMappingContext" load_steps=21 format=3 uid="uid://c161ru5ubsvm5"] + +[ext_resource type="Script" path="res://addons/guide/guide_mapping_context.gd" id="1_1q401"] +[ext_resource type="Resource" uid="uid://cjohgt5cdoxvd" path="res://guide_examples/simple_input/mapping_contexts/move_up.tres" id="1_p6dvd"] +[ext_resource type="Script" path="res://addons/guide/inputs/guide_input_key.gd" id="2_dmcv6"] +[ext_resource type="Script" path="res://addons/guide/guide_input_mapping.gd" id="3_j3d4x"] +[ext_resource type="Script" path="res://addons/guide/guide_action_mapping.gd" id="4_5ymhe"] +[ext_resource type="Resource" uid="uid://cjfdsja54wtus" path="res://guide_examples/simple_input/mapping_contexts/move_down.tres" id="5_x3j1d"] +[ext_resource type="Resource" uid="uid://b7rcj2usvx7iu" path="res://guide_examples/simple_input/mapping_contexts/move_left.tres" id="6_3n2n7"] +[ext_resource type="Resource" uid="uid://cn4nypfrnusrn" path="res://guide_examples/simple_input/mapping_contexts/move_right.tres" id="7_mgx2j"] + +[sub_resource type="Resource" id="Resource_x4hy0"] +script = ExtResource("2_dmcv6") +key = 87 +shift = false +control = false +alt = false +meta = false +allow_additional_modifiers = true + +[sub_resource type="Resource" id="Resource_skv88"] +script = ExtResource("3_j3d4x") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_x4hy0") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([]) + +[sub_resource type="Resource" id="Resource_13yll"] +script = ExtResource("4_5ymhe") +action = ExtResource("1_p6dvd") +input_mappings = Array[ExtResource("3_j3d4x")]([SubResource("Resource_skv88")]) + +[sub_resource type="Resource" id="Resource_kjfiu"] +script = ExtResource("2_dmcv6") +key = 83 +shift = false +control = false +alt = false +meta = false +allow_additional_modifiers = true + +[sub_resource type="Resource" id="Resource_11cob"] +script = ExtResource("3_j3d4x") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_kjfiu") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([]) + +[sub_resource type="Resource" id="Resource_olvia"] +script = ExtResource("4_5ymhe") +action = ExtResource("5_x3j1d") +input_mappings = Array[ExtResource("3_j3d4x")]([SubResource("Resource_11cob")]) + +[sub_resource type="Resource" id="Resource_rkxlb"] +script = ExtResource("2_dmcv6") +key = 65 +shift = false +control = false +alt = false +meta = false +allow_additional_modifiers = true + +[sub_resource type="Resource" id="Resource_j7qak"] +script = ExtResource("3_j3d4x") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_rkxlb") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([]) + +[sub_resource type="Resource" id="Resource_gs5ov"] +script = ExtResource("4_5ymhe") +action = ExtResource("6_3n2n7") +input_mappings = Array[ExtResource("3_j3d4x")]([SubResource("Resource_j7qak")]) + +[sub_resource type="Resource" id="Resource_jek7t"] +script = ExtResource("2_dmcv6") +key = 68 +shift = false +control = false +alt = false +meta = false +allow_additional_modifiers = true + +[sub_resource type="Resource" id="Resource_m4m5w"] +script = ExtResource("3_j3d4x") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_jek7t") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([]) + +[sub_resource type="Resource" id="Resource_hk2n5"] +script = ExtResource("4_5ymhe") +action = ExtResource("7_mgx2j") +input_mappings = Array[ExtResource("3_j3d4x")]([SubResource("Resource_m4m5w")]) + +[resource] +script = ExtResource("1_1q401") +display_name = "" +mappings = Array[ExtResource("4_5ymhe")]([SubResource("Resource_13yll"), SubResource("Resource_olvia"), SubResource("Resource_gs5ov"), SubResource("Resource_hk2n5")]) diff --git a/guide_examples/simple_input/player.gd b/guide_examples/simple_input/player.gd new file mode 100644 index 0000000..5e8c28f --- /dev/null +++ b/guide_examples/simple_input/player.gd @@ -0,0 +1,32 @@ +extends Node2D + +@export var speed:float = 100 + +@export var left_action:GUIDEAction +@export var right_action:GUIDEAction +@export var up_action:GUIDEAction +@export var down_action:GUIDEAction + +func _process(delta:float) -> void: + # This is close to how input would be handled with Godot's built-in + # input. GUIDE can actually combine the input into a 2D axis for you + # (similar to Godot's Input.get_vector). Because this is + # done in the mapping context, the script doesn't need to know about + # it. Look at the 2d_axis_mapping example to see how to streamline + # this code quite a bit. + + var offset:Vector2 = Vector2.ZERO + + if left_action.is_triggered(): + offset.x = -1 + + if right_action.is_triggered(): + offset.x = 1 + + if up_action.is_triggered(): + offset.y = -1 + + if down_action.is_triggered(): + offset.y = 1 + + position += offset * speed * delta diff --git a/guide_examples/simple_input/player.gd.uid b/guide_examples/simple_input/player.gd.uid new file mode 100644 index 0000000..c3dc1c6 --- /dev/null +++ b/guide_examples/simple_input/player.gd.uid @@ -0,0 +1 @@ +uid://dhpub7a1ixyxj diff --git a/guide_examples/simple_input/simple_input.gd b/guide_examples/simple_input/simple_input.gd new file mode 100644 index 0000000..40a6fba --- /dev/null +++ b/guide_examples/simple_input/simple_input.gd @@ -0,0 +1,6 @@ +extends Node + +@export var mapping_context:GUIDEMappingContext + +func _ready(): + GUIDE.enable_mapping_context(mapping_context) diff --git a/guide_examples/simple_input/simple_input.gd.uid b/guide_examples/simple_input/simple_input.gd.uid new file mode 100644 index 0000000..0c13831 --- /dev/null +++ b/guide_examples/simple_input/simple_input.gd.uid @@ -0,0 +1 @@ +uid://dej0g6ye7nfxi diff --git a/guide_examples/simple_input/simple_input.tscn b/guide_examples/simple_input/simple_input.tscn new file mode 100644 index 0000000..1769dd5 --- /dev/null +++ b/guide_examples/simple_input/simple_input.tscn @@ -0,0 +1,53 @@ +[gd_scene load_steps=12 format=3 uid="uid://cchyatnt0wl5x"] + +[ext_resource type="Script" path="res://guide_examples/simple_input/simple_input.gd" id="1_cgpw0"] +[ext_resource type="Texture2D" uid="uid://byjxtsekdl8t2" path="res://guide_examples/shared/godot_logo.svg" id="1_t8vwd"] +[ext_resource type="Script" path="res://guide_examples/simple_input/player.gd" id="2_o6vg3"] +[ext_resource type="Resource" uid="uid://c161ru5ubsvm5" path="res://guide_examples/simple_input/mapping_contexts/simple_input.tres" id="3_2b24x"] +[ext_resource type="Resource" uid="uid://b7rcj2usvx7iu" path="res://guide_examples/simple_input/mapping_contexts/move_left.tres" id="4_50on6"] +[ext_resource type="Resource" uid="uid://cn4nypfrnusrn" path="res://guide_examples/simple_input/mapping_contexts/move_right.tres" id="5_47yin"] +[ext_resource type="Resource" uid="uid://cjohgt5cdoxvd" path="res://guide_examples/simple_input/mapping_contexts/move_up.tres" id="6_b7h5t"] +[ext_resource type="Resource" uid="uid://cjfdsja54wtus" path="res://guide_examples/simple_input/mapping_contexts/move_down.tres" id="7_4pdc5"] +[ext_resource type="Theme" uid="uid://dot0gi1yoqmrl" path="res://guide_examples/shared/ui_theme.tres" id="8_tko8y"] +[ext_resource type="Script" path="res://guide_examples/shared/instructions_label.gd" id="9_hqrkx"] +[ext_resource type="PackedScene" uid="uid://dkr80d2pi0d41" path="res://addons/guide/debugger/guide_debugger.tscn" id="10_3ap6u"] + +[node name="SimpleInput" type="Node"] +script = ExtResource("1_cgpw0") +mapping_context = ExtResource("3_2b24x") + +[node name="Player" type="Sprite2D" parent="."] +position = Vector2(546, 317) +texture = ExtResource("1_t8vwd") +script = ExtResource("2_o6vg3") +speed = 300.0 +left_action = ExtResource("4_50on6") +right_action = ExtResource("5_47yin") +up_action = ExtResource("6_b7h5t") +down_action = ExtResource("7_4pdc5") + +[node name="UI Layer" type="CanvasLayer" parent="."] + +[node name="Instructions Label" type="RichTextLabel" parent="UI Layer"] +anchors_preset = 1 +anchor_left = 1.0 +anchor_right = 1.0 +offset_left = -286.0 +offset_top = 24.0 +offset_right = -39.0 +offset_bottom = 47.0 +grow_horizontal = 0 +theme = ExtResource("8_tko8y") +script = ExtResource("9_hqrkx") +instructions_text = "%s to move left. +%s to move right. +%s to move up. +%s to move down." +actions = Array[Resource("res://addons/guide/guide_action.gd")]([ExtResource("4_50on6"), ExtResource("5_47yin"), ExtResource("6_b7h5t"), ExtResource("7_4pdc5")]) +metadata/_edit_use_anchors_ = true + +[node name="Debug Layer" type="CanvasLayer" parent="."] + +[node name="GuideDebugger" parent="Debug Layer" instance=ExtResource("10_3ap6u")] +theme = ExtResource("8_tko8y") +metadata/_edit_lock_ = true diff --git a/guide_examples/tap_and_hold/mapping_contexts/jump.tres b/guide_examples/tap_and_hold/mapping_contexts/jump.tres new file mode 100644 index 0000000..e7cf095 --- /dev/null +++ b/guide_examples/tap_and_hold/mapping_contexts/jump.tres @@ -0,0 +1,11 @@ +[gd_resource type="Resource" script_class="GUIDEAction" load_steps=2 format=3 uid="uid://djow080f02fos"] + +[ext_resource type="Script" path="res://addons/guide/guide_action.gd" id="1_dxeu7"] + +[resource] +script = ExtResource("1_dxeu7") +name = &"" +emit_as_godot_actions = false +is_remappable = false +display_name = "" +display_category = "" diff --git a/guide_examples/tap_and_hold/mapping_contexts/somersault.tres b/guide_examples/tap_and_hold/mapping_contexts/somersault.tres new file mode 100644 index 0000000..da1b5d9 --- /dev/null +++ b/guide_examples/tap_and_hold/mapping_contexts/somersault.tres @@ -0,0 +1,9 @@ +[gd_resource type="Resource" script_class="GUIDEAction" load_steps=2 format=3 uid="uid://dcdlaiw50k4t3"] + +[ext_resource type="Script" path="res://addons/guide/guide_action.gd" id="1_mgxtb"] + +[resource] +script = ExtResource("1_mgxtb") +name = "" +display_name = "" +display_category = "" diff --git a/guide_examples/tap_and_hold/mapping_contexts/tap_and_hold.tres b/guide_examples/tap_and_hold/mapping_contexts/tap_and_hold.tres new file mode 100644 index 0000000..cb12516 --- /dev/null +++ b/guide_examples/tap_and_hold/mapping_contexts/tap_and_hold.tres @@ -0,0 +1,74 @@ +[gd_resource type="Resource" script_class="GUIDEMappingContext" load_steps=17 format=3 uid="uid://dkorp45s6fjqk"] + +[ext_resource type="Resource" uid="uid://djow080f02fos" path="res://guide_examples/tap_and_hold/mapping_contexts/jump.tres" id="1_pwkn3"] +[ext_resource type="Script" path="res://addons/guide/inputs/guide_input_key.gd" id="2_6utl5"] +[ext_resource type="Script" path="res://addons/guide/guide_input_mapping.gd" id="3_sfabf"] +[ext_resource type="Script" path="res://addons/guide/triggers/guide_trigger_tap.gd" id="4_0qfc2"] +[ext_resource type="Script" path="res://addons/guide/guide_action_mapping.gd" id="4_nrdxn"] +[ext_resource type="Resource" uid="uid://dcdlaiw50k4t3" path="res://guide_examples/tap_and_hold/mapping_contexts/somersault.tres" id="6_5qh27"] +[ext_resource type="Script" path="res://addons/guide/triggers/guide_trigger_hold.gd" id="7_sj5n7"] +[ext_resource type="Script" path="res://addons/guide/guide_mapping_context.gd" id="8_q4q7m"] + +[sub_resource type="Resource" id="Resource_fvatf"] +script = ExtResource("2_6utl5") +key = 32 +shift = false +control = false +alt = false +meta = false +allow_additional_modifiers = true + +[sub_resource type="Resource" id="Resource_k188c"] +script = ExtResource("4_0qfc2") +tap_threshold = 0.2 +actuation_threshold = 0.5 + +[sub_resource type="Resource" id="Resource_tg2ja"] +script = ExtResource("3_sfabf") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_fvatf") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([SubResource("Resource_k188c")]) + +[sub_resource type="Resource" id="Resource_ghgfq"] +script = ExtResource("4_nrdxn") +action = ExtResource("1_pwkn3") +input_mappings = Array[ExtResource("3_sfabf")]([SubResource("Resource_tg2ja")]) + +[sub_resource type="Resource" id="Resource_75xxu"] +script = ExtResource("2_6utl5") +key = 32 +shift = false +control = false +alt = false +meta = false +allow_additional_modifiers = true + +[sub_resource type="Resource" id="Resource_dum1i"] +script = ExtResource("7_sj5n7") +hold_treshold = 0.5 +is_one_shot = true +actuation_threshold = 0.5 + +[sub_resource type="Resource" id="Resource_tbykh"] +script = ExtResource("3_sfabf") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_75xxu") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([SubResource("Resource_dum1i")]) + +[sub_resource type="Resource" id="Resource_5u3vu"] +script = ExtResource("4_nrdxn") +action = ExtResource("6_5qh27") +input_mappings = Array[ExtResource("3_sfabf")]([SubResource("Resource_tbykh")]) + +[resource] +script = ExtResource("8_q4q7m") +display_name = "" +mappings = Array[ExtResource("4_nrdxn")]([SubResource("Resource_ghgfq"), SubResource("Resource_5u3vu")]) diff --git a/guide_examples/tap_and_hold/player.gd b/guide_examples/tap_and_hold/player.gd new file mode 100644 index 0000000..c957649 --- /dev/null +++ b/guide_examples/tap_and_hold/player.gd @@ -0,0 +1,30 @@ +extends Node2D + + +@onready var _animation_player:AnimationPlayer = %AnimationPlayer +@onready var _progress_bar:ProgressBar = %ProgressBar + +@export var jump_action:GUIDEAction +@export var somersault_action:GUIDEAction + +func _ready(): + jump_action.triggered.connect(_play.bind("jump")) + somersault_action.triggered.connect(_play.bind("somersault")) + somersault_action.ongoing.connect(_update_progress_bar) + somersault_action.triggered.connect(_hide_progress_bar) + somersault_action.cancelled.connect(_hide_progress_bar) + +func _play(animation:String): + if _animation_player.is_playing(): + return + + _animation_player.play(animation) + +func _update_progress_bar(): + # exceeds tap time + if somersault_action.elapsed_seconds > 0.1: + _progress_bar.value = somersault_action.elapsed_ratio + _progress_bar.visible = true + +func _hide_progress_bar(): + _progress_bar.visible = false diff --git a/guide_examples/tap_and_hold/player.gd.uid b/guide_examples/tap_and_hold/player.gd.uid new file mode 100644 index 0000000..ab83abb --- /dev/null +++ b/guide_examples/tap_and_hold/player.gd.uid @@ -0,0 +1 @@ +uid://brd1oa6q1qsl3 diff --git a/guide_examples/tap_and_hold/tap_and_hold.gd b/guide_examples/tap_and_hold/tap_and_hold.gd new file mode 100644 index 0000000..40a6fba --- /dev/null +++ b/guide_examples/tap_and_hold/tap_and_hold.gd @@ -0,0 +1,6 @@ +extends Node + +@export var mapping_context:GUIDEMappingContext + +func _ready(): + GUIDE.enable_mapping_context(mapping_context) diff --git a/guide_examples/tap_and_hold/tap_and_hold.gd.uid b/guide_examples/tap_and_hold/tap_and_hold.gd.uid new file mode 100644 index 0000000..576b9e2 --- /dev/null +++ b/guide_examples/tap_and_hold/tap_and_hold.gd.uid @@ -0,0 +1 @@ +uid://dpkjsi6bk64ly diff --git a/guide_examples/tap_and_hold/tap_and_hold.tscn b/guide_examples/tap_and_hold/tap_and_hold.tscn new file mode 100644 index 0000000..ea5317d --- /dev/null +++ b/guide_examples/tap_and_hold/tap_and_hold.tscn @@ -0,0 +1,154 @@ +[gd_scene load_steps=14 format=3 uid="uid://bq1y86drsbsgc"] + +[ext_resource type="Script" path="res://guide_examples/tap_and_hold/tap_and_hold.gd" id="1_ek3h7"] +[ext_resource type="Texture2D" uid="uid://byjxtsekdl8t2" path="res://guide_examples/shared/godot_logo.svg" id="1_segxn"] +[ext_resource type="Script" path="res://guide_examples/tap_and_hold/player.gd" id="2_gpfh8"] +[ext_resource type="Resource" uid="uid://dkorp45s6fjqk" path="res://guide_examples/tap_and_hold/mapping_contexts/tap_and_hold.tres" id="3_u8e88"] +[ext_resource type="Resource" uid="uid://djow080f02fos" path="res://guide_examples/tap_and_hold/mapping_contexts/jump.tres" id="4_8qeav"] +[ext_resource type="Resource" uid="uid://dcdlaiw50k4t3" path="res://guide_examples/tap_and_hold/mapping_contexts/somersault.tres" id="5_wp1cr"] +[ext_resource type="Theme" uid="uid://dot0gi1yoqmrl" path="res://guide_examples/shared/ui_theme.tres" id="6_r6oud"] +[ext_resource type="PackedScene" uid="uid://dkr80d2pi0d41" path="res://addons/guide/debugger/guide_debugger.tscn" id="6_vjlt4"] +[ext_resource type="Script" path="res://guide_examples/shared/instructions_label.gd" id="7_304xo"] + +[sub_resource type="Animation" id="Animation_j3lvc"] +length = 0.001 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Player:position") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(546, 317)] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Player:rotation") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} + +[sub_resource type="Animation" id="Animation_a86xu"] +resource_name = "jump" +length = 0.5 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Player:position") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.2, 0.5), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(546, 317), Vector2(546, 260), Vector2(546, 317)] +} + +[sub_resource type="Animation" id="Animation_fir1a"] +resource_name = "somersault" +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Player:position") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.5, 1), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(546, 317), Vector2(546, 200), Vector2(546, 317)] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Player:rotation") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0, 0.3, 0.5, 0.7), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 0, +"values": [0.0, 0.0, -3.14159, -6.28319] +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_8sm1c"] +_data = { +"RESET": SubResource("Animation_j3lvc"), +"jump": SubResource("Animation_a86xu"), +"somersault": SubResource("Animation_fir1a") +} + +[node name="TapAndHold" type="Node"] +script = ExtResource("1_ek3h7") +mapping_context = ExtResource("3_u8e88") + +[node name="Player" type="Sprite2D" parent="."] +position = Vector2(546, 317) +texture = ExtResource("1_segxn") +script = ExtResource("2_gpfh8") +jump_action = ExtResource("4_8qeav") +somersault_action = ExtResource("5_wp1cr") + +[node name="ProgressBar" type="ProgressBar" parent="Player"] +unique_name_in_owner = true +visible = false +offset_left = -58.0 +offset_top = 64.0 +offset_right = 57.0 +offset_bottom = 91.0 +max_value = 1.0 +show_percentage = false + +[node name="AnimationPlayer" type="AnimationPlayer" parent="."] +unique_name_in_owner = true +libraries = { +"": SubResource("AnimationLibrary_8sm1c") +} + +[node name="UI Layer" type="CanvasLayer" parent="."] + +[node name="Instructions Label" type="RichTextLabel" parent="UI Layer"] +anchors_preset = 1 +anchor_left = 1.0 +anchor_right = 1.0 +offset_left = -473.0 +offset_top = 527.0 +offset_right = -226.0 +offset_bottom = 550.0 +grow_horizontal = 0 +theme = ExtResource("6_r6oud") +script = ExtResource("7_304xo") +instructions_text = "Tap %s to jump. +Hold %s to somersault." +actions = Array[Resource("res://addons/guide/guide_action.gd")]([ExtResource("4_8qeav"), ExtResource("5_wp1cr")]) +metadata/_edit_use_anchors_ = true + +[node name="Label" type="Label" parent="UI Layer"] +visible = false +anchors_preset = 1 +anchor_left = 1.0 +anchor_right = 1.0 +offset_left = -660.0 +offset_top = 71.0 +offset_right = -57.0 +offset_bottom = 223.0 +grow_horizontal = 0 +theme = ExtResource("6_r6oud") +text = "This demonstrates using the hold and tap triggers to bind multiple actions to the same key. This also uses the hold action's elapsed_ratio property to drive a hold progress bar to indicate how long the key needs to be held." +autowrap_mode = 2 + +[node name="Debug Layer" type="CanvasLayer" parent="."] +visible = false + +[node name="GuideDebugger" parent="Debug Layer" instance=ExtResource("6_vjlt4")] +theme = ExtResource("6_r6oud") +metadata/_edit_lock_ = true diff --git a/guide_examples/top_down_shooter/bolt/bolt.gd b/guide_examples/top_down_shooter/bolt/bolt.gd new file mode 100644 index 0000000..6b1902b --- /dev/null +++ b/guide_examples/top_down_shooter/bolt/bolt.gd @@ -0,0 +1,10 @@ +extends Sprite2D + +@export var speed:float = 500 +@export var lifetime:float = 1.0 + +func _process(delta: float) -> void: + position += transform.x * delta * speed + lifetime -= delta + if lifetime <= 0: + queue_free() diff --git a/guide_examples/top_down_shooter/bolt/bolt.gd.uid b/guide_examples/top_down_shooter/bolt/bolt.gd.uid new file mode 100644 index 0000000..89604a8 --- /dev/null +++ b/guide_examples/top_down_shooter/bolt/bolt.gd.uid @@ -0,0 +1 @@ +uid://w7nan374op8 diff --git a/guide_examples/top_down_shooter/bolt/bolt.png b/guide_examples/top_down_shooter/bolt/bolt.png new file mode 100644 index 0000000000000000000000000000000000000000..73bf0ba2d6ef8d3ae45f6d55f87aeeab7fc36692 GIT binary patch literal 2550 zcma)8d010d77q=SO%V{P^FOY)H9g)9)zs(=WT zMFkgBs3TxmL_ks%VH8j(I#B4s1SnK!wbDWh*6NHbUzwMnfKvO-ANRf7`}>{so^xJu zLPG-Anrt*dp-^iXbZR*A#%Pz(+sIR%n)(!lGO&hNYz3PcOya>}JeLp0fq0czir^>| zd522MdD7{Fq56vbW&mdy;s1i&&7D6f73OF)uw6OP7>O-MerL$mf%%_ zpbA=!;T1DlWEEWj3En{0BCF^~u9?igjzTPcB@nrSmV_kYMN(gJ=w;k;R*Dn^!a+H# zl<`1X5-3sF>2iTsBL&Dnt^%YYi-IK*h;GgVFK41Bi{L?WCz4z|w-bm2!V;MY^C3aX zpOQUDL@k-Ll8uxHpR3^hKm4VHleFwbr;yV8OOKXi0^kH#hB$}B;Hqk{DvH5Zndv6{00w%jdzMMEE+Oy`Kc7w!kAK5OSl7_H{DsWsHLLBmyhUa8^Ou zmcfv9g+!u5as@0)(H$-J(M~XNaksclfOHLn!RX3}#N}!2Q?ODQ%vbV2zAgobx5ovt)SEZ6gAfoZLi(FAHzzgpHZCk%| zj|{8|fUF~|m;;F1;u$hukU<43O)6xwH0wYKQbjUkl2upiIDtaxr9ntNtf~VPYU^?3 z@sEq>)Cfj z+u5e+Wkzx0%c62w?-}3pVvb;Zcyww_i+XI0F@$}ILrsr>$U4N1pAC>q` zh`Q|TY_JF$%$aNI;&u)1X^EVXFGPvm1T|w-mYX7!c6Q`#205HxYLEQBhLK<9`oUZIkYZ#9y}FsF9Ouu<2Lx0=x<1+ei8Jnn96)woM-RV zvT$%NK0Y90W=(!H}?$d zYv_y~JsN#vW;)x(u!0^YG2$B&e(N+!v)wmd-m=Hc)kf34*|PBjdM;?ovpm6UbzOCe zY0|e)`-YH$LxIp3>#U}AsH-_`6J?1Z$C_<=6w zqlQE}J}So{C(=B_WqV!<)a@j581l=Gif$MP3$H45At+r8-*>n&QPS6_!u{>kU@~;P zBT%WSNiy@!>ZQ3J+L)!;Y^u*UW>~cs2X6h)Zlk@hKJk`Q>9pyCEY-PfMO7M3aX3D*<{Tx5P?5(uS&(-{DcK4#^z}KVa`)h$o`}fp?fm5Siy%M1ly94*J zQjk>2cIWg(4UFeca*C81ukMh;6&Gqb3UnwuD?p8Yb63wu6S(H1VvI4`=|UJTkL;{k zyL-yOW=mobpE((n|GQfb_)d|7H`7DIQJCTH5=#E~!zBBAFTe3)N3I$h)}b{WH`D8q zBpxhmY#R6 z=|)B99}a+|_)@9aLB4+o}=w>LFEI2`>*KE5zot1dRFu@_`lZ&=SL!aZWt zHs3ca&^J9TVBm&(8rQ31<1dNcEs6yk4My{NKIv-v(fjiAO^zc^BOad5$u~He`>)R0 z`eFwTj+A(!1M6#pt`Ab5?{1@U=LHQ1vN@0Ib5eG!3v#u}AHLnBr|~7a9&CV~7d*Ts n{_cAE7j7d^Wogpv*sQ7PldWeyOU$5Y|E@7;A=Enm*!2Gawi(Yo literal 0 HcmV?d00001 diff --git a/guide_examples/top_down_shooter/bolt/bolt.png.import b/guide_examples/top_down_shooter/bolt/bolt.png.import new file mode 100644 index 0000000..2da19d9 --- /dev/null +++ b/guide_examples/top_down_shooter/bolt/bolt.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dfpdumvnepffe" +path="res://.godot/imported/bolt.png-d2b4175f016737de6380cafdf09c07c0.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://guide_examples/top_down_shooter/bolt/bolt.png" +dest_files=["res://.godot/imported/bolt.png-d2b4175f016737de6380cafdf09c07c0.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/guide_examples/top_down_shooter/bolt/bolt.tscn b/guide_examples/top_down_shooter/bolt/bolt.tscn new file mode 100644 index 0000000..221ee13 --- /dev/null +++ b/guide_examples/top_down_shooter/bolt/bolt.tscn @@ -0,0 +1,10 @@ +[gd_scene load_steps=3 format=3 uid="uid://c0fqv8e3tljmp"] + +[ext_resource type="Texture2D" uid="uid://dfpdumvnepffe" path="res://guide_examples/top_down_shooter/bolt/bolt.png" id="1_b5s4m"] +[ext_resource type="Script" path="res://guide_examples/top_down_shooter/bolt/bolt.gd" id="2_o61jt"] + +[node name="Bolt" type="Sprite2D"] +texture = ExtResource("1_b5s4m") +script = ExtResource("2_o61jt") +speed = 1000.0 +lifetime = 2.0 diff --git a/guide_examples/top_down_shooter/mapping_contexts/controller.tres b/guide_examples/top_down_shooter/mapping_contexts/controller.tres new file mode 100644 index 0000000..15af017 --- /dev/null +++ b/guide_examples/top_down_shooter/mapping_contexts/controller.tres @@ -0,0 +1,123 @@ +[gd_resource type="Resource" script_class="GUIDEMappingContext" load_steps=28 format=3 uid="uid://dysrgn1ubf15g"] + +[ext_resource type="Script" path="res://addons/guide/guide_mapping_context.gd" id="1_3vbsc"] +[ext_resource type="Resource" uid="uid://ch070wegl722t" path="res://guide_examples/top_down_shooter/mapping_contexts/move.tres" id="1_epjja"] +[ext_resource type="Script" path="res://addons/guide/inputs/guide_input_joy_axis_2d.gd" id="2_bwpvf"] +[ext_resource type="Script" path="res://addons/guide/guide_input_mapping.gd" id="2_skach"] +[ext_resource type="Script" path="res://addons/guide/modifiers/guide_modifier_deadzone.gd" id="3_872fr"] +[ext_resource type="Script" path="res://addons/guide/guide_action_mapping.gd" id="3_e36mu"] +[ext_resource type="Resource" uid="uid://vpsh1myp67ws" path="res://guide_examples/top_down_shooter/mapping_contexts/look_relative.tres" id="6_5clnx"] +[ext_resource type="Resource" uid="uid://coktqyup12g3w" path="res://guide_examples/top_down_shooter/mapping_contexts/fire.tres" id="7_pfi7b"] +[ext_resource type="Script" path="res://addons/guide/inputs/guide_input_joy_axis_1d.gd" id="8_gtkor"] +[ext_resource type="Script" path="res://addons/guide/triggers/guide_trigger_pressed.gd" id="9_i3uls"] +[ext_resource type="Resource" uid="uid://bnd2jguy7tfti" path="res://guide_examples/top_down_shooter/mapping_contexts/switch_to_keyboard_and_mouse.tres" id="10_m7sth"] +[ext_resource type="Script" path="res://addons/guide/inputs/guide_input_any.gd" id="11_jpwmq"] + +[sub_resource type="Resource" id="Resource_uwau4"] +script = ExtResource("2_bwpvf") +x = 0 +y = 1 +joy_index = -1 + +[sub_resource type="Resource" id="Resource_i1fx3"] +script = ExtResource("3_872fr") +lower_threshold = 0.2 +upper_threshold = 1.0 + +[sub_resource type="Resource" id="Resource_7mv4j"] +script = ExtResource("2_skach") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_uwau4") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([SubResource("Resource_i1fx3")]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([]) + +[sub_resource type="Resource" id="Resource_x8yon"] +script = ExtResource("3_e36mu") +action = ExtResource("1_epjja") +input_mappings = Array[ExtResource("2_skach")]([SubResource("Resource_7mv4j")]) + +[sub_resource type="Resource" id="Resource_2nugj"] +script = ExtResource("2_bwpvf") +x = 2 +y = 3 +joy_index = -1 + +[sub_resource type="Resource" id="Resource_iln10"] +script = ExtResource("3_872fr") +lower_threshold = 0.607 +upper_threshold = 1.0 + +[sub_resource type="Resource" id="Resource_yxygj"] +script = ExtResource("2_skach") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_2nugj") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([SubResource("Resource_iln10")]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([]) + +[sub_resource type="Resource" id="Resource_ropdf"] +script = ExtResource("3_e36mu") +action = ExtResource("6_5clnx") +input_mappings = Array[ExtResource("2_skach")]([SubResource("Resource_yxygj")]) + +[sub_resource type="Resource" id="Resource_mnoq7"] +script = ExtResource("8_gtkor") +axis = 5 +joy_index = -1 + +[sub_resource type="Resource" id="Resource_7u5im"] +script = ExtResource("9_i3uls") +actuation_threshold = 0.5 + +[sub_resource type="Resource" id="Resource_ssica"] +script = ExtResource("2_skach") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_mnoq7") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([SubResource("Resource_7u5im")]) + +[sub_resource type="Resource" id="Resource_a7lt0"] +script = ExtResource("3_e36mu") +action = ExtResource("7_pfi7b") +input_mappings = Array[ExtResource("2_skach")]([SubResource("Resource_ssica")]) + +[sub_resource type="Resource" id="Resource_konxq"] +script = ExtResource("11_jpwmq") +mouse_buttons = true +mouse_movement = true +minimum_mouse_movement_distance = 1.0 +joy_buttons = false +joy_axes = false +minimum_joy_axis_actuation_strength = 0.2 +keyboard = true +touch = false +mouse = true +joy = false + +[sub_resource type="Resource" id="Resource_lid0f"] +script = ExtResource("2_skach") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_konxq") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([]) + +[sub_resource type="Resource" id="Resource_6hier"] +script = ExtResource("3_e36mu") +action = ExtResource("10_m7sth") +input_mappings = Array[ExtResource("2_skach")]([SubResource("Resource_lid0f")]) + +[resource] +script = ExtResource("1_3vbsc") +display_name = "" +mappings = Array[ExtResource("3_e36mu")]([SubResource("Resource_x8yon"), SubResource("Resource_ropdf"), SubResource("Resource_a7lt0"), SubResource("Resource_6hier")]) diff --git a/guide_examples/top_down_shooter/mapping_contexts/fire.tres b/guide_examples/top_down_shooter/mapping_contexts/fire.tres new file mode 100644 index 0000000..09f9093 --- /dev/null +++ b/guide_examples/top_down_shooter/mapping_contexts/fire.tres @@ -0,0 +1,13 @@ +[gd_resource type="Resource" script_class="GUIDEAction" load_steps=2 format=3 uid="uid://coktqyup12g3w"] + +[ext_resource type="Script" path="res://addons/guide/guide_action.gd" id="1_jmn08"] + +[resource] +script = ExtResource("1_jmn08") +name = &"" +action_value_type = 0 +block_lower_priority_actions = true +emit_as_godot_actions = false +is_remappable = false +display_name = "" +display_category = "" diff --git a/guide_examples/top_down_shooter/mapping_contexts/keyboard_and_mouse.tres b/guide_examples/top_down_shooter/mapping_contexts/keyboard_and_mouse.tres new file mode 100644 index 0000000..3beb79f --- /dev/null +++ b/guide_examples/top_down_shooter/mapping_contexts/keyboard_and_mouse.tres @@ -0,0 +1,196 @@ +[gd_resource type="Resource" script_class="GUIDEMappingContext" load_steps=40 format=3 uid="uid://dhp7nup127wxw"] + +[ext_resource type="Resource" uid="uid://ch070wegl722t" path="res://guide_examples/top_down_shooter/mapping_contexts/move.tres" id="1_o40br"] +[ext_resource type="Script" path="res://addons/guide/inputs/guide_input_key.gd" id="2_r8xkm"] +[ext_resource type="Script" path="res://addons/guide/modifiers/guide_modifier_negate.gd" id="3_mxuhd"] +[ext_resource type="Script" path="res://addons/guide/guide_input_mapping.gd" id="4_nld8w"] +[ext_resource type="Script" path="res://addons/guide/modifiers/guide_modifier_input_swizzle.gd" id="4_sdo77"] +[ext_resource type="Script" path="res://addons/guide/guide_action_mapping.gd" id="5_wiw4m"] +[ext_resource type="Resource" uid="uid://c4tpipfhludsi" path="res://guide_examples/top_down_shooter/mapping_contexts/look_absolute.tres" id="7_4uvlp"] +[ext_resource type="Script" path="res://addons/guide/guide_mapping_context.gd" id="7_dx1p2"] +[ext_resource type="Script" path="res://addons/guide/inputs/guide_input_mouse_position.gd" id="8_hys4n"] +[ext_resource type="Script" path="res://addons/guide/modifiers/guide_modifier_canvas_coordinates.gd" id="9_5f66x"] +[ext_resource type="Resource" uid="uid://coktqyup12g3w" path="res://guide_examples/top_down_shooter/mapping_contexts/fire.tres" id="10_he1ky"] +[ext_resource type="Script" path="res://addons/guide/inputs/guide_input_mouse_button.gd" id="11_btbxh"] +[ext_resource type="Script" path="res://addons/guide/triggers/guide_trigger_pressed.gd" id="12_ce85k"] +[ext_resource type="Resource" uid="uid://byu565ktximg2" path="res://guide_examples/top_down_shooter/mapping_contexts/switch_to_controller.tres" id="13_0evsu"] +[ext_resource type="Script" path="res://addons/guide/inputs/guide_input_any.gd" id="14_ulkgf"] + +[sub_resource type="Resource" id="Resource_rqldx"] +script = ExtResource("2_r8xkm") +key = 87 +shift = false +control = false +alt = false +meta = false +allow_additional_modifiers = true + +[sub_resource type="Resource" id="Resource_fedub"] +script = ExtResource("4_sdo77") +order = 0 + +[sub_resource type="Resource" id="Resource_sithj"] +script = ExtResource("3_mxuhd") +x = true +y = true +z = true + +[sub_resource type="Resource" id="Resource_gvylm"] +script = ExtResource("4_nld8w") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_rqldx") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([SubResource("Resource_fedub"), SubResource("Resource_sithj")]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([]) + +[sub_resource type="Resource" id="Resource_2grck"] +script = ExtResource("2_r8xkm") +key = 83 +shift = false +control = false +alt = false +meta = false +allow_additional_modifiers = true + +[sub_resource type="Resource" id="Resource_e6ufd"] +script = ExtResource("4_sdo77") +order = 0 + +[sub_resource type="Resource" id="Resource_hclrp"] +script = ExtResource("4_nld8w") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_2grck") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([SubResource("Resource_e6ufd")]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([]) + +[sub_resource type="Resource" id="Resource_0e6tb"] +script = ExtResource("2_r8xkm") +key = 65 +shift = false +control = false +alt = false +meta = false +allow_additional_modifiers = true + +[sub_resource type="Resource" id="Resource_o7bio"] +script = ExtResource("3_mxuhd") +x = true +y = true +z = true + +[sub_resource type="Resource" id="Resource_085kd"] +script = ExtResource("4_nld8w") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_0e6tb") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([SubResource("Resource_o7bio")]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([]) + +[sub_resource type="Resource" id="Resource_h42bk"] +script = ExtResource("2_r8xkm") +key = 68 +shift = false +control = false +alt = false +meta = false +allow_additional_modifiers = true + +[sub_resource type="Resource" id="Resource_vnoud"] +script = ExtResource("4_nld8w") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_h42bk") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([]) + +[sub_resource type="Resource" id="Resource_x8yon"] +script = ExtResource("5_wiw4m") +action = ExtResource("1_o40br") +input_mappings = Array[ExtResource("4_nld8w")]([SubResource("Resource_gvylm"), SubResource("Resource_hclrp"), SubResource("Resource_085kd"), SubResource("Resource_vnoud")]) + +[sub_resource type="Resource" id="Resource_dgqq1"] +script = ExtResource("8_hys4n") + +[sub_resource type="Resource" id="Resource_qegvf"] +script = ExtResource("9_5f66x") +relative_input = false + +[sub_resource type="Resource" id="Resource_yxygj"] +script = ExtResource("4_nld8w") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_dgqq1") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([SubResource("Resource_qegvf")]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([]) + +[sub_resource type="Resource" id="Resource_ropdf"] +script = ExtResource("5_wiw4m") +action = ExtResource("7_4uvlp") +input_mappings = Array[ExtResource("4_nld8w")]([SubResource("Resource_yxygj")]) + +[sub_resource type="Resource" id="Resource_omwno"] +script = ExtResource("11_btbxh") +button = 1 + +[sub_resource type="Resource" id="Resource_7jcut"] +script = ExtResource("12_ce85k") +actuation_threshold = 0.5 + +[sub_resource type="Resource" id="Resource_4uxij"] +script = ExtResource("4_nld8w") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_omwno") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([SubResource("Resource_7jcut")]) + +[sub_resource type="Resource" id="Resource_8w3dk"] +script = ExtResource("5_wiw4m") +action = ExtResource("10_he1ky") +input_mappings = Array[ExtResource("4_nld8w")]([SubResource("Resource_4uxij")]) + +[sub_resource type="Resource" id="Resource_nqj7r"] +script = ExtResource("14_ulkgf") +mouse_buttons = false +mouse_movement = false +minimum_mouse_movement_distance = 1.0 +joy_buttons = true +joy_axes = true +minimum_joy_axis_actuation_strength = 0.5 +keyboard = false +touch = false +mouse = false +joy = true + +[sub_resource type="Resource" id="Resource_bk656"] +script = ExtResource("4_nld8w") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_nqj7r") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([]) + +[sub_resource type="Resource" id="Resource_ewfkl"] +script = ExtResource("5_wiw4m") +action = ExtResource("13_0evsu") +input_mappings = Array[ExtResource("4_nld8w")]([SubResource("Resource_bk656")]) + +[resource] +script = ExtResource("7_dx1p2") +display_name = "" +mappings = Array[ExtResource("5_wiw4m")]([SubResource("Resource_x8yon"), SubResource("Resource_ropdf"), SubResource("Resource_8w3dk"), SubResource("Resource_ewfkl")]) diff --git a/guide_examples/top_down_shooter/mapping_contexts/look_absolute.tres b/guide_examples/top_down_shooter/mapping_contexts/look_absolute.tres new file mode 100644 index 0000000..cf4ee01 --- /dev/null +++ b/guide_examples/top_down_shooter/mapping_contexts/look_absolute.tres @@ -0,0 +1,13 @@ +[gd_resource type="Resource" script_class="GUIDEAction" load_steps=2 format=3 uid="uid://c4tpipfhludsi"] + +[ext_resource type="Script" path="res://addons/guide/guide_action.gd" id="1_ujbw2"] + +[resource] +script = ExtResource("1_ujbw2") +name = &"" +action_value_type = 2 +block_lower_priority_actions = true +emit_as_godot_actions = false +is_remappable = false +display_name = "" +display_category = "" diff --git a/guide_examples/top_down_shooter/mapping_contexts/look_relative.tres b/guide_examples/top_down_shooter/mapping_contexts/look_relative.tres new file mode 100644 index 0000000..1baf03f --- /dev/null +++ b/guide_examples/top_down_shooter/mapping_contexts/look_relative.tres @@ -0,0 +1,13 @@ +[gd_resource type="Resource" script_class="GUIDEAction" load_steps=2 format=3 uid="uid://vpsh1myp67ws"] + +[ext_resource type="Script" path="res://addons/guide/guide_action.gd" id="1_upkuf"] + +[resource] +script = ExtResource("1_upkuf") +name = &"" +action_value_type = 2 +block_lower_priority_actions = true +emit_as_godot_actions = false +is_remappable = false +display_name = "" +display_category = "" diff --git a/guide_examples/top_down_shooter/mapping_contexts/move.tres b/guide_examples/top_down_shooter/mapping_contexts/move.tres new file mode 100644 index 0000000..ceb54f0 --- /dev/null +++ b/guide_examples/top_down_shooter/mapping_contexts/move.tres @@ -0,0 +1,13 @@ +[gd_resource type="Resource" script_class="GUIDEAction" load_steps=2 format=3 uid="uid://ch070wegl722t"] + +[ext_resource type="Script" path="res://addons/guide/guide_action.gd" id="1_w0ans"] + +[resource] +script = ExtResource("1_w0ans") +name = &"" +action_value_type = 2 +block_lower_priority_actions = true +emit_as_godot_actions = false +is_remappable = false +display_name = "" +display_category = "" diff --git a/guide_examples/top_down_shooter/mapping_contexts/switch_to_controller.tres b/guide_examples/top_down_shooter/mapping_contexts/switch_to_controller.tres new file mode 100644 index 0000000..7f6758f --- /dev/null +++ b/guide_examples/top_down_shooter/mapping_contexts/switch_to_controller.tres @@ -0,0 +1,13 @@ +[gd_resource type="Resource" script_class="GUIDEAction" load_steps=2 format=3 uid="uid://byu565ktximg2"] + +[ext_resource type="Script" path="res://addons/guide/guide_action.gd" id="1_ghtdg"] + +[resource] +script = ExtResource("1_ghtdg") +name = &"" +action_value_type = 2 +block_lower_priority_actions = true +emit_as_godot_actions = false +is_remappable = false +display_name = "" +display_category = "" diff --git a/guide_examples/top_down_shooter/mapping_contexts/switch_to_keyboard_and_mouse.tres b/guide_examples/top_down_shooter/mapping_contexts/switch_to_keyboard_and_mouse.tres new file mode 100644 index 0000000..5b0a1e0 --- /dev/null +++ b/guide_examples/top_down_shooter/mapping_contexts/switch_to_keyboard_and_mouse.tres @@ -0,0 +1,13 @@ +[gd_resource type="Resource" script_class="GUIDEAction" load_steps=2 format=3 uid="uid://bnd2jguy7tfti"] + +[ext_resource type="Script" path="res://addons/guide/guide_action.gd" id="1_gxqso"] + +[resource] +script = ExtResource("1_gxqso") +name = &"" +action_value_type = 0 +block_lower_priority_actions = true +emit_as_godot_actions = false +is_remappable = false +display_name = "" +display_category = "" diff --git a/guide_examples/top_down_shooter/player/mrg0000.png b/guide_examples/top_down_shooter/player/mrg0000.png new file mode 100644 index 0000000000000000000000000000000000000000..6b6a9af053e65b13a78761848d2928ddc5481f17 GIT binary patch literal 40175 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 literal 0 HcmV?d00001 diff --git a/guide_examples/top_down_shooter/player/mrg0000.png.import b/guide_examples/top_down_shooter/player/mrg0000.png.import new file mode 100644 index 0000000..7dd9fe6 --- /dev/null +++ b/guide_examples/top_down_shooter/player/mrg0000.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c22k1y6rbntlw" +path="res://.godot/imported/mrg0000.png-2c8ef2c24386191b7c1a03703c595faf.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://guide_examples/top_down_shooter/player/mrg0000.png" +dest_files=["res://.godot/imported/mrg0000.png-2c8ef2c24386191b7c1a03703c595faf.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/guide_examples/top_down_shooter/player/player.gd b/guide_examples/top_down_shooter/player/player.gd new file mode 100644 index 0000000..abb340b --- /dev/null +++ b/guide_examples/top_down_shooter/player/player.gd @@ -0,0 +1,46 @@ +extends CharacterBody2D + + +@export var speed:float = 300 +@export var look_relative:GUIDEAction +@export var look_absolute:GUIDEAction +@export var move:GUIDEAction +@export var fire:GUIDEAction + +@export var bolt:PackedScene + +@onready var left_hand:Node2D = %LeftHand +@onready var right_hand:Node2D = %RightHand + + +func _ready(): + # fire some bolts when the fire action triggers + fire.triggered.connect(_fire) + +func _physics_process(delta): + var target = Vector2.INF + + # Looking at absolute coordinates. This is the case when we use a mouse. + if look_absolute.is_triggered(): + target = look_absolute.value_axis_2d + # Looking at relative coordinates. This is the case when we use a controller + elif look_relative.is_triggered(): + target = global_position + look_relative.value_axis_2d + + # If we have a target, rotate towards it + if target.is_finite(): + var target_orientation = Transform2D()\ + .translated(transform.origin)\ + .looking_at(target) + transform = transform.interpolate_with(target_orientation, 5 * delta) + + # and move according to the input. + velocity = speed * move.value_axis_2d + move_and_slide() + +func _fire(): + # for each hand of the player, spawn a bolt + for hand in [left_hand, right_hand]: + var a_bolt:Node2D = bolt.instantiate() + get_parent().add_child(a_bolt) + a_bolt.global_transform = hand.global_transform diff --git a/guide_examples/top_down_shooter/player/player.gd.uid b/guide_examples/top_down_shooter/player/player.gd.uid new file mode 100644 index 0000000..728668e --- /dev/null +++ b/guide_examples/top_down_shooter/player/player.gd.uid @@ -0,0 +1 @@ +uid://blx1seoclt48w diff --git a/guide_examples/top_down_shooter/top_down_shooter.gd b/guide_examples/top_down_shooter/top_down_shooter.gd new file mode 100644 index 0000000..f19478c --- /dev/null +++ b/guide_examples/top_down_shooter/top_down_shooter.gd @@ -0,0 +1,20 @@ +extends Node2D + +@export var keyboard_and_mouse:GUIDEMappingContext +@export var controller:GUIDEMappingContext + +@export var switch_to_controller:GUIDEAction +@export var switch_to_keyboard_and_mouse:GUIDEAction + +func _ready(): + # enable controller at the start + GUIDE.enable_mapping_context(controller) + + # Switch the control scheme depending on the input. + switch_to_controller.triggered \ + .connect(func(): GUIDE.enable_mapping_context(controller, true)) + switch_to_keyboard_and_mouse.triggered \ + .connect(func(): GUIDE.enable_mapping_context(keyboard_and_mouse, true)) + + + diff --git a/guide_examples/top_down_shooter/top_down_shooter.gd.uid b/guide_examples/top_down_shooter/top_down_shooter.gd.uid new file mode 100644 index 0000000..a1ed5fa --- /dev/null +++ b/guide_examples/top_down_shooter/top_down_shooter.gd.uid @@ -0,0 +1 @@ +uid://sh4xv5urdau8 diff --git a/guide_examples/top_down_shooter/top_down_shooter.tscn b/guide_examples/top_down_shooter/top_down_shooter.tscn new file mode 100644 index 0000000..2d1c2a4 --- /dev/null +++ b/guide_examples/top_down_shooter/top_down_shooter.tscn @@ -0,0 +1,138 @@ +[gd_scene load_steps=18 format=3 uid="uid://kmamxwy5rcyc"] + +[ext_resource type="Script" path="res://guide_examples/top_down_shooter/top_down_shooter.gd" id="1_gvlv5"] +[ext_resource type="Script" path="res://guide_examples/top_down_shooter/player/player.gd" id="1_pm1t3"] +[ext_resource type="Resource" uid="uid://dhp7nup127wxw" path="res://guide_examples/top_down_shooter/mapping_contexts/keyboard_and_mouse.tres" id="2_bl5ot"] +[ext_resource type="Texture2D" uid="uid://c22k1y6rbntlw" path="res://guide_examples/top_down_shooter/player/mrg0000.png" id="2_rc4yh"] +[ext_resource type="Resource" uid="uid://dysrgn1ubf15g" path="res://guide_examples/top_down_shooter/mapping_contexts/controller.tres" id="3_tldv6"] +[ext_resource type="Resource" uid="uid://byu565ktximg2" path="res://guide_examples/top_down_shooter/mapping_contexts/switch_to_controller.tres" id="4_rfvaw"] +[ext_resource type="Resource" uid="uid://vpsh1myp67ws" path="res://guide_examples/top_down_shooter/mapping_contexts/look_relative.tres" id="5_hxqcn"] +[ext_resource type="Resource" uid="uid://bnd2jguy7tfti" path="res://guide_examples/top_down_shooter/mapping_contexts/switch_to_keyboard_and_mouse.tres" id="5_usevy"] +[ext_resource type="Resource" uid="uid://c4tpipfhludsi" path="res://guide_examples/top_down_shooter/mapping_contexts/look_absolute.tres" id="6_viqho"] +[ext_resource type="Resource" uid="uid://ch070wegl722t" path="res://guide_examples/top_down_shooter/mapping_contexts/move.tres" id="7_gtewy"] +[ext_resource type="Resource" uid="uid://coktqyup12g3w" path="res://guide_examples/top_down_shooter/mapping_contexts/fire.tres" id="8_kmeb0"] +[ext_resource type="PackedScene" uid="uid://dkr80d2pi0d41" path="res://addons/guide/debugger/guide_debugger.tscn" id="9_kqgcv"] +[ext_resource type="PackedScene" uid="uid://c0fqv8e3tljmp" path="res://guide_examples/top_down_shooter/bolt/bolt.tscn" id="9_ybbsa"] +[ext_resource type="Theme" uid="uid://dot0gi1yoqmrl" path="res://guide_examples/shared/ui_theme.tres" id="14_ipln3"] +[ext_resource type="Script" path="res://guide_examples/shared/instructions_label.gd" id="15_d8ctw"] + +[sub_resource type="CircleShape2D" id="CircleShape2D_jh0ar"] +radius = 118.54 + +[sub_resource type="WorldBoundaryShape2D" id="WorldBoundaryShape2D_duktp"] + +[node name="TopDownShooter" type="Node2D"] +script = ExtResource("1_gvlv5") +keyboard_and_mouse = ExtResource("2_bl5ot") +controller = ExtResource("3_tldv6") +switch_to_controller = ExtResource("4_rfvaw") +switch_to_keyboard_and_mouse = ExtResource("5_usevy") + +[node name="Player" type="CharacterBody2D" parent="."] +position = Vector2(911, 479) +motion_mode = 1 +script = ExtResource("1_pm1t3") +look_relative = ExtResource("5_hxqcn") +look_absolute = ExtResource("6_viqho") +move = ExtResource("7_gtewy") +fire = ExtResource("8_kmeb0") +bolt = ExtResource("9_ybbsa") + +[node name="Mrg0000" type="Sprite2D" parent="Player"] +texture = ExtResource("2_rc4yh") +metadata/_edit_lock_ = true + +[node name="CollisionShape2D" type="CollisionShape2D" parent="Player"] +shape = SubResource("CircleShape2D_jh0ar") +metadata/_edit_lock_ = true + +[node name="LeftHand" type="Marker2D" parent="Player"] +unique_name_in_owner = true +position = Vector2(41, -105) +metadata/_edit_lock_ = true + +[node name="RightHand" type="Marker2D" parent="Player"] +unique_name_in_owner = true +position = Vector2(41, 109) +metadata/_edit_lock_ = true + +[node name="Boundary" type="StaticBody2D" parent="."] + +[node name="CollisionShape2D" type="CollisionShape2D" parent="Boundary"] +position = Vector2(831, 1077) +shape = SubResource("WorldBoundaryShape2D_duktp") + +[node name="CollisionShape2D2" type="CollisionShape2D" parent="Boundary"] +position = Vector2(950, 1) +rotation = 3.14159 +shape = SubResource("WorldBoundaryShape2D_duktp") + +[node name="CollisionShape2D3" type="CollisionShape2D" parent="Boundary"] +position = Vector2(1919, 523) +rotation = 4.71239 +shape = SubResource("WorldBoundaryShape2D_duktp") + +[node name="CollisionShape2D4" type="CollisionShape2D" parent="Boundary"] +position = Vector2(-1, 530) +rotation = 1.5708 +shape = SubResource("WorldBoundaryShape2D_duktp") + +[node name="CanvasLayer" type="CanvasLayer" parent="."] + +[node name="GuideDebugger" parent="CanvasLayer" instance=ExtResource("9_kqgcv")] +theme = ExtResource("14_ipln3") + +[node name="BG" type="CanvasLayer" parent="."] +layer = -1 + +[node name="ColorRect" type="ColorRect" parent="BG"] +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +color = Color(0.0869374, 0.147497, 0.00609748, 1) + +[node name="UI Layer" type="CanvasLayer" parent="."] + +[node name="Instructions Label Controller" type="RichTextLabel" parent="UI Layer"] +anchors_preset = 1 +anchor_left = 1.0 +anchor_right = 1.0 +offset_left = -352.0 +offset_top = 15.0 +offset_right = -105.0 +offset_bottom = 38.0 +grow_horizontal = 0 +theme = ExtResource("14_ipln3") +script = ExtResource("15_d8ctw") +instructions_text = "Look around with %s. +Move with %s. +Fire with %s. + +Press any key or move the mouse to switch to +keyboard and mouse." +actions = Array[Resource("res://addons/guide/guide_action.gd")]([ExtResource("5_hxqcn"), ExtResource("7_gtewy"), ExtResource("8_kmeb0")]) +limit_to_context = ExtResource("3_tldv6") +metadata/_edit_use_anchors_ = true + +[node name="Instructions Label Keyboard and Mouse" type="RichTextLabel" parent="UI Layer"] +anchors_preset = 1 +anchor_left = 1.0 +anchor_right = 1.0 +offset_left = -352.0 +offset_top = 15.0 +offset_right = -105.0 +offset_bottom = 38.0 +grow_horizontal = 0 +theme = ExtResource("14_ipln3") +script = ExtResource("15_d8ctw") +instructions_text = "Look around with %s. +Move with %s. +Fire with %s. + +Use any controller input to switch to controller." +actions = Array[Resource("res://addons/guide/guide_action.gd")]([ExtResource("6_viqho"), ExtResource("7_gtewy"), ExtResource("8_kmeb0")]) +limit_to_context = ExtResource("2_bl5ot") +metadata/_edit_use_anchors_ = true diff --git a/guide_examples/touch/background.gd b/guide_examples/touch/background.gd new file mode 100644 index 0000000..681b9a5 --- /dev/null +++ b/guide_examples/touch/background.gd @@ -0,0 +1,16 @@ +## This just keeps the sprite endlessly scrolling. It's not related to input. +extends Sprite2D + + +func _process(delta): + # get rect of visible screen in world coordinates + var rect = get_viewport().canvas_transform.affine_inverse() * get_viewport_rect() + # fit the bg into the viewport + global_position = rect.position + global_scale = rect.size / texture.get_size() + + # update scaling so the texture scales according to zoom level + material.set_shader_parameter("scale", global_scale) + var offset = rect.position / texture.get_size() + # and offset so we pick a texture offset relative to the movement of the camera + material.set_shader_parameter("offset", offset) diff --git a/guide_examples/touch/background.gd.uid b/guide_examples/touch/background.gd.uid new file mode 100644 index 0000000..6fef513 --- /dev/null +++ b/guide_examples/touch/background.gd.uid @@ -0,0 +1 @@ +uid://o678yabwitsl diff --git a/guide_examples/touch/background.svg b/guide_examples/touch/background.svg new file mode 100644 index 0000000..e649b9e --- /dev/null +++ b/guide_examples/touch/background.svg @@ -0,0 +1,152 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/guide_examples/touch/background.svg.import b/guide_examples/touch/background.svg.import new file mode 100644 index 0000000..272297b --- /dev/null +++ b/guide_examples/touch/background.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://jveia1jgm1x5" +path="res://.godot/imported/background.svg-fba6babf7434090927a142c997b03f8a.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://guide_examples/touch/background.svg" +dest_files=["res://.godot/imported/background.svg-fba6babf7434090927a142c997b03f8a.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/guide_examples/touch/camera_2d.gd b/guide_examples/touch/camera_2d.gd new file mode 100644 index 0000000..23a5c44 --- /dev/null +++ b/guide_examples/touch/camera_2d.gd @@ -0,0 +1,42 @@ +## Camera control. We listen to GUIDE's actions to move and zoom the camera. Note how we can +## mix event-based and polling based input handling, depending on what works better for the +## use case. +extends Camera2D + + +@export var camera_movement:GUIDEAction +@export var camera_zoom:GUIDEAction +@export var camera_rotation:GUIDEAction +@export var camera_reset:GUIDEAction + + +@onready var _reference_zoom:Vector2 = zoom +@onready var _reference_rotation:float = rotation + +func _ready(): + camera_zoom.triggered.connect(_zoom_camera) + camera_rotation.triggered.connect(_rotate_camera) + camera_reset.triggered.connect(_reset_camera) + # whenever zooming completes, we store the new reference zoom + camera_zoom.completed.connect(func(): _reference_zoom = zoom) + # whenever rotation completes, we store the new reference rotation + camera_rotation.completed.connect(func(): _reference_rotation = rotation) + + + +func _process(delta): + position += camera_movement.value_axis_2d + + +func _zoom_camera(): + zoom = clamp( _reference_zoom * camera_zoom.value_axis_1d, Vector2(0.1, 0.1), Vector2(3, 3)) + +func _rotate_camera(): + rotation = fmod(_reference_rotation + camera_rotation.value_axis_1d, TAU) + + +func _reset_camera(): + zoom = Vector2.ONE + rotation = 0 + _reference_zoom = zoom + _reference_rotation = rotation diff --git a/guide_examples/touch/camera_2d.gd.uid b/guide_examples/touch/camera_2d.gd.uid new file mode 100644 index 0000000..f02c5ed --- /dev/null +++ b/guide_examples/touch/camera_2d.gd.uid @@ -0,0 +1 @@ +uid://bcr7lx14f4a7o diff --git a/guide_examples/touch/godot_head.gd b/guide_examples/touch/godot_head.gd new file mode 100644 index 0000000..2ca46aa --- /dev/null +++ b/guide_examples/touch/godot_head.gd @@ -0,0 +1,15 @@ +extends Node2D + +@export var lifetime_seconds:float = 5.0 +var _remaining_time_seconds:float = 0 + +func _ready(): + _remaining_time_seconds = lifetime_seconds + +func _process(delta:float) -> void: + _remaining_time_seconds -= delta + if _remaining_time_seconds <= 0: + queue_free() + return + + modulate.a = _remaining_time_seconds / lifetime_seconds diff --git a/guide_examples/touch/godot_head.gd.uid b/guide_examples/touch/godot_head.gd.uid new file mode 100644 index 0000000..0d2f810 --- /dev/null +++ b/guide_examples/touch/godot_head.gd.uid @@ -0,0 +1 @@ +uid://cpb72t1olm3ug diff --git a/guide_examples/touch/godot_head.tscn b/guide_examples/touch/godot_head.tscn new file mode 100644 index 0000000..f342585 --- /dev/null +++ b/guide_examples/touch/godot_head.tscn @@ -0,0 +1,10 @@ +[gd_scene load_steps=3 format=3 uid="uid://c3kfkmt7p66c2"] + +[ext_resource type="Script" path="res://guide_examples/mouse_position_2d/godot_head.gd" id="1_1ibdt"] +[ext_resource type="Texture2D" uid="uid://byjxtsekdl8t2" path="res://guide_examples/shared/godot_logo.svg" id="2_8cdku"] + +[node name="GodotHead" type="Node2D"] +script = ExtResource("1_1ibdt") + +[node name="Sprite2D" type="Sprite2D" parent="."] +texture = ExtResource("2_8cdku") diff --git a/guide_examples/touch/mapping_contexts/actions/camera_movement.tres b/guide_examples/touch/mapping_contexts/actions/camera_movement.tres new file mode 100644 index 0000000..45d1b4c --- /dev/null +++ b/guide_examples/touch/mapping_contexts/actions/camera_movement.tres @@ -0,0 +1,13 @@ +[gd_resource type="Resource" script_class="GUIDEAction" load_steps=2 format=3 uid="uid://brsk1axa7e3h"] + +[ext_resource type="Script" path="res://addons/guide/guide_action.gd" id="1_j5nuk"] + +[resource] +script = ExtResource("1_j5nuk") +name = &"" +action_value_type = 2 +block_lower_priority_actions = true +emit_as_godot_actions = false +is_remappable = false +display_name = "" +display_category = "" diff --git a/guide_examples/touch/mapping_contexts/actions/camera_reset.tres b/guide_examples/touch/mapping_contexts/actions/camera_reset.tres new file mode 100644 index 0000000..32dbfc5 --- /dev/null +++ b/guide_examples/touch/mapping_contexts/actions/camera_reset.tres @@ -0,0 +1,13 @@ +[gd_resource type="Resource" script_class="GUIDEAction" load_steps=2 format=3 uid="uid://dhtj0p55ylhcu"] + +[ext_resource type="Script" path="res://addons/guide/guide_action.gd" id="1_x2v6j"] + +[resource] +script = ExtResource("1_x2v6j") +name = &"" +action_value_type = 0 +block_lower_priority_actions = true +emit_as_godot_actions = false +is_remappable = false +display_name = "" +display_category = "" diff --git a/guide_examples/touch/mapping_contexts/actions/camera_rotation.tres b/guide_examples/touch/mapping_contexts/actions/camera_rotation.tres new file mode 100644 index 0000000..b302edf --- /dev/null +++ b/guide_examples/touch/mapping_contexts/actions/camera_rotation.tres @@ -0,0 +1,13 @@ +[gd_resource type="Resource" script_class="GUIDEAction" load_steps=2 format=3 uid="uid://dpu1f4xeigqdr"] + +[ext_resource type="Script" path="res://addons/guide/guide_action.gd" id="1_a2xs0"] + +[resource] +script = ExtResource("1_a2xs0") +name = &"" +action_value_type = 0 +block_lower_priority_actions = true +emit_as_godot_actions = false +is_remappable = false +display_name = "" +display_category = "" diff --git a/guide_examples/touch/mapping_contexts/actions/camera_zoom.tres b/guide_examples/touch/mapping_contexts/actions/camera_zoom.tres new file mode 100644 index 0000000..50c61e5 --- /dev/null +++ b/guide_examples/touch/mapping_contexts/actions/camera_zoom.tres @@ -0,0 +1,13 @@ +[gd_resource type="Resource" script_class="GUIDEAction" load_steps=2 format=3 uid="uid://b2xbr2rqob6gw"] + +[ext_resource type="Script" path="res://addons/guide/guide_action.gd" id="1_s4uaa"] + +[resource] +script = ExtResource("1_s4uaa") +name = &"" +action_value_type = 1 +block_lower_priority_actions = true +emit_as_godot_actions = false +is_remappable = false +display_name = "" +display_category = "" diff --git a/guide_examples/touch/mapping_contexts/actions/spawn.tres b/guide_examples/touch/mapping_contexts/actions/spawn.tres new file mode 100644 index 0000000..cff8473 --- /dev/null +++ b/guide_examples/touch/mapping_contexts/actions/spawn.tres @@ -0,0 +1,13 @@ +[gd_resource type="Resource" script_class="GUIDEAction" load_steps=2 format=3 uid="uid://iilpc2tjr5mx"] + +[ext_resource type="Script" path="res://addons/guide/guide_action.gd" id="1_4jgns"] + +[resource] +script = ExtResource("1_4jgns") +name = &"" +action_value_type = 2 +block_lower_priority_actions = false +emit_as_godot_actions = false +is_remappable = false +display_name = "" +display_category = "" diff --git a/guide_examples/touch/mapping_contexts/modifiers/zoom_sensitivity.tres b/guide_examples/touch/mapping_contexts/modifiers/zoom_sensitivity.tres new file mode 100644 index 0000000..dc6ecf2 --- /dev/null +++ b/guide_examples/touch/mapping_contexts/modifiers/zoom_sensitivity.tres @@ -0,0 +1,8 @@ +[gd_resource type="Resource" script_class="GUIDEModifierScale" load_steps=2 format=3 uid="uid://x0g11r4xtmcv"] + +[ext_resource type="Script" path="res://addons/guide/modifiers/guide_modifier_scale.gd" id="1_42gxx"] + +[resource] +script = ExtResource("1_42gxx") +scale = Vector3(0.1, 1, 1) +apply_delta_time = false diff --git a/guide_examples/touch/mapping_contexts/touch.tres b/guide_examples/touch/mapping_contexts/touch.tres new file mode 100644 index 0000000..23d5e8a --- /dev/null +++ b/guide_examples/touch/mapping_contexts/touch.tres @@ -0,0 +1,157 @@ +[gd_resource type="Resource" script_class="GUIDEMappingContext" load_steps=41 format=3 uid="uid://bcepjnqawyxeb"] + +[ext_resource type="Script" path="res://addons/guide/inputs/guide_input_touch_position.gd" id="2_r7fg4"] +[ext_resource type="Script" path="res://addons/guide/modifiers/guide_modifier_canvas_coordinates.gd" id="3_br0pk"] +[ext_resource type="Script" path="res://addons/guide/guide_input_mapping.gd" id="4_ni8em"] +[ext_resource type="Script" path="res://addons/guide/guide_action_mapping.gd" id="5_jvujq"] +[ext_resource type="Resource" uid="uid://brsk1axa7e3h" path="res://guide_examples/touch/mapping_contexts/actions/camera_movement.tres" id="6_5nijj"] +[ext_resource type="Script" path="res://addons/guide/inputs/guide_input_touch_axis_2d.gd" id="7_1c4fi"] +[ext_resource type="Script" path="res://addons/guide/modifiers/guide_modifier_negate.gd" id="8_kce4k"] +[ext_resource type="Resource" uid="uid://b2xbr2rqob6gw" path="res://guide_examples/touch/mapping_contexts/actions/camera_zoom.tres" id="10_s0k2q"] +[ext_resource type="Script" path="res://addons/guide/inputs/guide_input_touch_distance.gd" id="10_xxwru"] +[ext_resource type="Script" path="res://addons/guide/triggers/guide_trigger_down.gd" id="11_q5ylu"] +[ext_resource type="Resource" uid="uid://iilpc2tjr5mx" path="res://guide_examples/touch/mapping_contexts/actions/spawn.tres" id="13_6meol"] +[ext_resource type="Script" path="res://addons/guide/triggers/guide_trigger_stability.gd" id="14_iw0b0"] +[ext_resource type="Script" path="res://addons/guide/guide_mapping_context.gd" id="15_1y05x"] +[ext_resource type="Resource" uid="uid://dpu1f4xeigqdr" path="res://guide_examples/touch/mapping_contexts/actions/camera_rotation.tres" id="15_2s3pg"] +[ext_resource type="Script" path="res://addons/guide/triggers/guide_trigger_hold.gd" id="15_qneu5"] +[ext_resource type="Resource" uid="uid://dhtj0p55ylhcu" path="res://guide_examples/touch/mapping_contexts/actions/camera_reset.tres" id="16_r67n2"] +[ext_resource type="Script" path="res://addons/guide/inputs/guide_input_touch_angle.gd" id="16_xv1hs"] +[ext_resource type="Script" path="res://addons/guide/triggers/guide_trigger_tap.gd" id="17_h6kd2"] + +[sub_resource type="Resource" id="Resource_pajkc"] +script = ExtResource("7_1c4fi") +finger_count = 1 +finger_index = 0 + +[sub_resource type="Resource" id="Resource_citsh"] +script = ExtResource("8_kce4k") +x = true +y = true +z = true + +[sub_resource type="Resource" id="Resource_ojjbt"] +script = ExtResource("3_br0pk") +relative_input = true + +[sub_resource type="Resource" id="Resource_fagqu"] +script = ExtResource("4_ni8em") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_pajkc") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([SubResource("Resource_citsh"), SubResource("Resource_ojjbt")]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([]) + +[sub_resource type="Resource" id="Resource_hvdyr"] +script = ExtResource("5_jvujq") +action = ExtResource("6_5nijj") +input_mappings = Array[ExtResource("4_ni8em")]([SubResource("Resource_fagqu")]) + +[sub_resource type="Resource" id="Resource_6jr42"] +script = ExtResource("10_xxwru") + +[sub_resource type="Resource" id="Resource_oysb7"] +script = ExtResource("11_q5ylu") +actuation_threshold = 0.0 + +[sub_resource type="Resource" id="Resource_drjxq"] +script = ExtResource("4_ni8em") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_6jr42") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([SubResource("Resource_oysb7")]) + +[sub_resource type="Resource" id="Resource_otc05"] +script = ExtResource("5_jvujq") +action = ExtResource("10_s0k2q") +input_mappings = Array[ExtResource("4_ni8em")]([SubResource("Resource_drjxq")]) + +[sub_resource type="Resource" id="Resource_7c46x"] +script = ExtResource("2_r7fg4") +finger_count = 1 +finger_index = 0 + +[sub_resource type="Resource" id="Resource_l3wvc"] +script = ExtResource("3_br0pk") +relative_input = false + +[sub_resource type="Resource" id="Resource_o1rij"] +script = ExtResource("14_iw0b0") +max_deviation = 1.0 +trigger_when = 0 +actuation_threshold = 0.5 + +[sub_resource type="Resource" id="Resource_i8pe1"] +script = ExtResource("15_qneu5") +hold_treshold = 1.0 +is_one_shot = true +actuation_threshold = 0.5 + +[sub_resource type="Resource" id="Resource_8n6aa"] +script = ExtResource("4_ni8em") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_7c46x") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([SubResource("Resource_l3wvc")]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([SubResource("Resource_o1rij"), SubResource("Resource_i8pe1")]) + +[sub_resource type="Resource" id="Resource_iivaa"] +script = ExtResource("5_jvujq") +action = ExtResource("13_6meol") +input_mappings = Array[ExtResource("4_ni8em")]([SubResource("Resource_8n6aa")]) + +[sub_resource type="Resource" id="Resource_p0nkc"] +script = ExtResource("16_xv1hs") +unit = 0 + +[sub_resource type="Resource" id="Resource_6twam"] +script = ExtResource("4_ni8em") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_p0nkc") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([]) + +[sub_resource type="Resource" id="Resource_tt5mo"] +script = ExtResource("5_jvujq") +action = ExtResource("15_2s3pg") +input_mappings = Array[ExtResource("4_ni8em")]([SubResource("Resource_6twam")]) + +[sub_resource type="Resource" id="Resource_4nu5w"] +script = ExtResource("2_r7fg4") +finger_count = 3 +finger_index = 0 + +[sub_resource type="Resource" id="Resource_rvgtf"] +script = ExtResource("17_h6kd2") +tap_threshold = 0.2 +actuation_threshold = 0.5 + +[sub_resource type="Resource" id="Resource_lpakr"] +script = ExtResource("4_ni8em") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_4nu5w") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([SubResource("Resource_rvgtf")]) + +[sub_resource type="Resource" id="Resource_vikxq"] +script = ExtResource("5_jvujq") +action = ExtResource("16_r67n2") +input_mappings = Array[ExtResource("4_ni8em")]([SubResource("Resource_lpakr")]) + +[resource] +script = ExtResource("15_1y05x") +display_name = "" +mappings = Array[ExtResource("5_jvujq")]([SubResource("Resource_hvdyr"), SubResource("Resource_otc05"), SubResource("Resource_iivaa"), SubResource("Resource_tt5mo"), SubResource("Resource_vikxq")]) diff --git a/guide_examples/touch/placement_indicator/placement_indicator.gd b/guide_examples/touch/placement_indicator/placement_indicator.gd new file mode 100644 index 0000000..0978d56 --- /dev/null +++ b/guide_examples/touch/placement_indicator/placement_indicator.gd @@ -0,0 +1,26 @@ +# This component shows a progress bar for the hold time, indicating to the player +# that they must keep touching the screen until something is placed. +extends Node2D + +@export var spawn:GUIDEAction +@onready var texture_progress_bar:TextureProgressBar = %TextureProgressBar + +func _ready(): + visible = false + # While the hold trigger is evaluating show the progress bar + spawn.ongoing.connect(_show) + # Once it is done, hide it again + spawn.triggered.connect(_hide) + # Same when it was cancelled + spawn.cancelled.connect(_hide) + +func _show(): + # show the indicator + visible = true + # move it to where we would spawn + global_position = spawn.value_axis_2d + # and update the progress bar + texture_progress_bar.value = spawn.elapsed_seconds + +func _hide(): + visible = false diff --git a/guide_examples/touch/placement_indicator/placement_indicator.gd.uid b/guide_examples/touch/placement_indicator/placement_indicator.gd.uid new file mode 100644 index 0000000..66465f2 --- /dev/null +++ b/guide_examples/touch/placement_indicator/placement_indicator.gd.uid @@ -0,0 +1 @@ +uid://cnb3sumemposh diff --git a/guide_examples/touch/placement_indicator/placement_indicator.tscn b/guide_examples/touch/placement_indicator/placement_indicator.tscn new file mode 100644 index 0000000..8c2cf2f --- /dev/null +++ b/guide_examples/touch/placement_indicator/placement_indicator.tscn @@ -0,0 +1,27 @@ +[gd_scene load_steps=4 format=3 uid="uid://c1ht6xduduxri"] + +[ext_resource type="Script" path="res://guide_examples/touch/placement_indicator/placement_indicator.gd" id="1_gnpc8"] +[ext_resource type="Resource" uid="uid://iilpc2tjr5mx" path="res://guide_examples/touch/mapping_contexts/actions/spawn.tres" id="2_grp35"] +[ext_resource type="Texture2D" uid="uid://geq3rs2fxqs4" path="res://guide_examples/touch/placement_indicator/radial_progress.png" id="2_slqs6"] + +[node name="PlacementIndicator" type="Node2D"] +script = ExtResource("1_gnpc8") +spawn = ExtResource("2_grp35") + +[node name="TextureProgressBar" type="TextureProgressBar" parent="."] +unique_name_in_owner = true +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -96.0 +offset_top = -96.0 +offset_right = 96.0 +offset_bottom = 96.0 +grow_horizontal = 2 +grow_vertical = 2 +max_value = 1.0 +step = 0.0 +fill_mode = 4 +texture_progress = ExtResource("2_slqs6") diff --git a/guide_examples/touch/placement_indicator/radial_progress.png b/guide_examples/touch/placement_indicator/radial_progress.png new file mode 100644 index 0000000000000000000000000000000000000000..9ed97eff41683be8028217631dee5af2f0a7a0a3 GIT binary patch literal 7034 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 void: + position += move_action.value_axis_2d.normalized() * speed * delta + diff --git a/guide_examples/two_joysticks/player.gd.uid b/guide_examples/two_joysticks/player.gd.uid new file mode 100644 index 0000000..7248a5c --- /dev/null +++ b/guide_examples/two_joysticks/player.gd.uid @@ -0,0 +1 @@ +uid://c73evv6t30of diff --git a/guide_examples/two_joysticks/two_joysticks.gd b/guide_examples/two_joysticks/two_joysticks.gd new file mode 100644 index 0000000..aa233b6 --- /dev/null +++ b/guide_examples/two_joysticks/two_joysticks.gd @@ -0,0 +1,6 @@ +extends Node2D + +@export var mapping_context:GUIDEMappingContext + +func _ready(): + GUIDE.enable_mapping_context(mapping_context) diff --git a/guide_examples/two_joysticks/two_joysticks.gd.uid b/guide_examples/two_joysticks/two_joysticks.gd.uid new file mode 100644 index 0000000..0528c60 --- /dev/null +++ b/guide_examples/two_joysticks/two_joysticks.gd.uid @@ -0,0 +1 @@ +uid://byg4578fnips6 diff --git a/guide_examples/two_joysticks/two_joysticks.tres b/guide_examples/two_joysticks/two_joysticks.tres new file mode 100644 index 0000000..66c8efa --- /dev/null +++ b/guide_examples/two_joysticks/two_joysticks.tres @@ -0,0 +1,56 @@ +[gd_resource type="Resource" script_class="GUIDEMappingContext" load_steps=14 format=3 uid="uid://chr8ugns0fh70"] + +[ext_resource type="Resource" uid="uid://d31d5dpoavou1" path="res://guide_examples/two_joysticks/actions/player_one_move.tres" id="1_d7e45"] +[ext_resource type="Script" path="res://addons/guide/guide_mapping_context.gd" id="1_sp28b"] +[ext_resource type="Script" path="res://addons/guide/inputs/guide_input_joy_axis_2d.gd" id="2_exwu1"] +[ext_resource type="Script" path="res://addons/guide/guide_input_mapping.gd" id="3_ga6gt"] +[ext_resource type="Resource" uid="uid://cxd3gqa1bof30" path="res://guide_examples/two_joysticks/modifiers/joystick_deadzone.tres" id="3_xy1jy"] +[ext_resource type="Script" path="res://addons/guide/guide_action_mapping.gd" id="4_mvoug"] +[ext_resource type="Resource" uid="uid://7g78pa31v44m" path="res://guide_examples/two_joysticks/actions/player_two_move.tres" id="5_aeoun"] + +[sub_resource type="Resource" id="Resource_jkkrr"] +script = ExtResource("2_exwu1") +x = 0 +y = 1 +joy_index = 0 + +[sub_resource type="Resource" id="Resource_6efv4"] +script = ExtResource("3_ga6gt") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_jkkrr") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([ExtResource("3_xy1jy")]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([]) + +[sub_resource type="Resource" id="Resource_kv6y3"] +script = ExtResource("4_mvoug") +action = ExtResource("1_d7e45") +input_mappings = Array[ExtResource("3_ga6gt")]([SubResource("Resource_6efv4")]) + +[sub_resource type="Resource" id="Resource_660yw"] +script = ExtResource("2_exwu1") +x = 0 +y = 1 +joy_index = 1 + +[sub_resource type="Resource" id="Resource_kg721"] +script = ExtResource("3_ga6gt") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_660yw") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([ExtResource("3_xy1jy")]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([]) + +[sub_resource type="Resource" id="Resource_6ruab"] +script = ExtResource("4_mvoug") +action = ExtResource("5_aeoun") +input_mappings = Array[ExtResource("3_ga6gt")]([SubResource("Resource_kg721")]) + +[resource] +script = ExtResource("1_sp28b") +display_name = "Player Input" +mappings = Array[ExtResource("4_mvoug")]([SubResource("Resource_kv6y3"), SubResource("Resource_6ruab")]) diff --git a/guide_examples/two_joysticks/two_joysticks.tscn b/guide_examples/two_joysticks/two_joysticks.tscn new file mode 100644 index 0000000..aee6f0a --- /dev/null +++ b/guide_examples/two_joysticks/two_joysticks.tscn @@ -0,0 +1,39 @@ +[gd_scene load_steps=8 format=3 uid="uid://b2uycqcjf0hth"] + +[ext_resource type="Script" path="res://guide_examples/two_joysticks/two_joysticks.gd" id="1_1dy65"] +[ext_resource type="Resource" uid="uid://chr8ugns0fh70" path="res://guide_examples/two_joysticks/two_joysticks.tres" id="2_3p2l3"] +[ext_resource type="Texture2D" uid="uid://byjxtsekdl8t2" path="res://guide_examples/shared/godot_logo.svg" id="2_c65ah"] +[ext_resource type="Script" path="res://guide_examples/two_joysticks/player.gd" id="3_3ycuu"] +[ext_resource type="Resource" uid="uid://d31d5dpoavou1" path="res://guide_examples/two_joysticks/actions/player_one_move.tres" id="4_f356y"] +[ext_resource type="Resource" uid="uid://7g78pa31v44m" path="res://guide_examples/two_joysticks/actions/player_two_move.tres" id="5_700m5"] +[ext_resource type="PackedScene" uid="uid://dkr80d2pi0d41" path="res://addons/guide/debugger/guide_debugger.tscn" id="7_ojfv8"] + +[node name="TwoJoysticks" type="Node2D"] +script = ExtResource("1_1dy65") +mapping_context = ExtResource("2_3p2l3") + +[node name="Label" type="Label" parent="."] +offset_left = 1359.0 +offset_top = 13.0 +offset_right = 1909.0 +offset_bottom = 135.0 +text = "This demonstrates how to consume different actions in the same script. We have two players each one controlled by a joystick. Both players share a single script and just listen to different actions which are given as export parameters." +autowrap_mode = 2 + +[node name="Player1" type="Sprite2D" parent="."] +position = Vector2(509, 509) +texture = ExtResource("2_c65ah") +script = ExtResource("3_3ycuu") +move_action = ExtResource("4_f356y") + +[node name="Player2" type="Sprite2D" parent="."] +modulate = Color(1, 0.533333, 1, 1) +position = Vector2(1315, 505) +texture = ExtResource("2_c65ah") +script = ExtResource("3_3ycuu") +move_action = ExtResource("5_700m5") + +[node name="CanvasLayer" type="CanvasLayer" parent="."] + +[node name="GuideDebugger" parent="CanvasLayer" instance=ExtResource("7_ojfv8")] +metadata/_edit_lock_ = true diff --git a/guide_examples/virtual_cursor/mapping_contexts/actions/click.tres b/guide_examples/virtual_cursor/mapping_contexts/actions/click.tres new file mode 100644 index 0000000..8e28007 --- /dev/null +++ b/guide_examples/virtual_cursor/mapping_contexts/actions/click.tres @@ -0,0 +1,13 @@ +[gd_resource type="Resource" script_class="GUIDEAction" load_steps=2 format=3 uid="uid://cwtdxy3gy7kud"] + +[ext_resource type="Script" path="res://addons/guide/guide_action.gd" id="1_jeypp"] + +[resource] +script = ExtResource("1_jeypp") +name = &"" +action_value_type = 0 +block_lower_priority_actions = true +emit_as_godot_actions = false +is_remappable = false +display_name = "" +display_category = "" diff --git a/guide_examples/virtual_cursor/mapping_contexts/actions/cursor_2d.tres b/guide_examples/virtual_cursor/mapping_contexts/actions/cursor_2d.tres new file mode 100644 index 0000000..98fe976 --- /dev/null +++ b/guide_examples/virtual_cursor/mapping_contexts/actions/cursor_2d.tres @@ -0,0 +1,13 @@ +[gd_resource type="Resource" script_class="GUIDEAction" load_steps=2 format=3 uid="uid://bcumfh8j6k1ln"] + +[ext_resource type="Script" path="res://addons/guide/guide_action.gd" id="1_25sbb"] + +[resource] +script = ExtResource("1_25sbb") +name = &"" +action_value_type = 2 +block_lower_priority_actions = true +emit_as_godot_actions = false +is_remappable = false +display_name = "" +display_category = "" diff --git a/guide_examples/virtual_cursor/mapping_contexts/virtual_cursor.tres b/guide_examples/virtual_cursor/mapping_contexts/virtual_cursor.tres new file mode 100644 index 0000000..41782d1 --- /dev/null +++ b/guide_examples/virtual_cursor/mapping_contexts/virtual_cursor.tres @@ -0,0 +1,80 @@ +[gd_resource type="Resource" script_class="GUIDEMappingContext" load_steps=22 format=3 uid="uid://b4tn11iq7uvr7"] + +[ext_resource type="Resource" uid="uid://bcumfh8j6k1ln" path="res://guide_examples/virtual_cursor/mapping_contexts/actions/cursor_2d.tres" id="1_0amnw"] +[ext_resource type="Script" path="res://addons/guide/guide_action_mapping.gd" id="1_0ixy4"] +[ext_resource type="Script" path="res://addons/guide/guide_mapping_context.gd" id="1_hs8l5"] +[ext_resource type="Script" path="res://addons/guide/inputs/guide_input_joy_axis_2d.gd" id="2_6ps54"] +[ext_resource type="Script" path="res://addons/guide/modifiers/guide_modifier_deadzone.gd" id="3_jknka"] +[ext_resource type="Script" path="res://addons/guide/modifiers/guide_modifier_virtual_cursor.gd" id="3_smvwl"] +[ext_resource type="Script" path="res://addons/guide/modifiers/guide_modifier_canvas_coordinates.gd" id="4_w4o86"] +[ext_resource type="Script" path="res://addons/guide/guide_input_mapping.gd" id="5_ucwra"] +[ext_resource type="Resource" uid="uid://cwtdxy3gy7kud" path="res://guide_examples/virtual_cursor/mapping_contexts/actions/click.tres" id="8_2fjde"] +[ext_resource type="Script" path="res://addons/guide/inputs/guide_input_joy_button.gd" id="9_15a8y"] +[ext_resource type="Script" path="res://addons/guide/triggers/guide_trigger_pressed.gd" id="10_caax3"] + +[sub_resource type="Resource" id="Resource_51lnp"] +script = ExtResource("2_6ps54") +x = 0 +y = 1 +joy_index = 0 + +[sub_resource type="Resource" id="Resource_vtltt"] +script = ExtResource("3_jknka") +lower_threshold = 0.2 +upper_threshold = 1.0 + +[sub_resource type="Resource" id="Resource_tn5ov"] +script = ExtResource("3_smvwl") +initial_position = Vector2(0.5, 0.5) +speed = Vector3(1, 1, 1) +screen_scale = 1 +apply_delta_time = true +scale = Vector3(1, 1, 1) + +[sub_resource type="Resource" id="Resource_r6xcs"] +script = ExtResource("4_w4o86") +relative_input = false + +[sub_resource type="Resource" id="Resource_jede7"] +script = ExtResource("5_ucwra") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_51lnp") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([SubResource("Resource_vtltt"), SubResource("Resource_tn5ov"), SubResource("Resource_r6xcs")]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([]) + +[sub_resource type="Resource" id="Resource_phyr3"] +script = ExtResource("1_0ixy4") +action = ExtResource("1_0amnw") +input_mappings = Array[ExtResource("5_ucwra")]([SubResource("Resource_jede7")]) + +[sub_resource type="Resource" id="Resource_5fidk"] +script = ExtResource("9_15a8y") +button = 0 +joy_index = 0 + +[sub_resource type="Resource" id="Resource_m13js"] +script = ExtResource("10_caax3") +actuation_threshold = 0.5 + +[sub_resource type="Resource" id="Resource_mnbnv"] +script = ExtResource("5_ucwra") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_5fidk") +modifiers = Array[Resource("res://addons/guide/modifiers/guide_modifier.gd")]([]) +triggers = Array[Resource("res://addons/guide/triggers/guide_trigger.gd")]([SubResource("Resource_m13js")]) + +[sub_resource type="Resource" id="Resource_7601p"] +script = ExtResource("1_0ixy4") +action = ExtResource("8_2fjde") +input_mappings = Array[ExtResource("5_ucwra")]([SubResource("Resource_mnbnv")]) + +[resource] +script = ExtResource("1_hs8l5") +display_name = "" +mappings = Array[ExtResource("1_0ixy4")]([SubResource("Resource_phyr3"), SubResource("Resource_7601p")]) diff --git a/guide_examples/virtual_cursor/pointable/pointable.gd b/guide_examples/virtual_cursor/pointable/pointable.gd new file mode 100644 index 0000000..f79a0d8 --- /dev/null +++ b/guide_examples/virtual_cursor/pointable/pointable.gd @@ -0,0 +1,15 @@ +extends Area2D + + +var _is_spinning:bool = false + +func spin(): + if _is_spinning: + return + _is_spinning = true + var tween := create_tween() + tween.tween_property(self, "rotation_degrees", 360, 0.5) + await tween.finished + + rotation_degrees = 0 + _is_spinning = false diff --git a/guide_examples/virtual_cursor/pointable/pointable.gd.uid b/guide_examples/virtual_cursor/pointable/pointable.gd.uid new file mode 100644 index 0000000..031ac6a --- /dev/null +++ b/guide_examples/virtual_cursor/pointable/pointable.gd.uid @@ -0,0 +1 @@ +uid://dghhpx6mxb4lr diff --git a/guide_examples/virtual_cursor/pointable/pointable.tscn b/guide_examples/virtual_cursor/pointable/pointable.tscn new file mode 100644 index 0000000..bbb270d --- /dev/null +++ b/guide_examples/virtual_cursor/pointable/pointable.tscn @@ -0,0 +1,17 @@ +[gd_scene load_steps=4 format=3 uid="uid://ca51sup6v0qr1"] + +[ext_resource type="Script" path="res://guide_examples/virtual_cursor/pointable/pointable.gd" id="1_ujxlw"] +[ext_resource type="Texture2D" uid="uid://byjxtsekdl8t2" path="res://guide_examples/shared/godot_logo.svg" id="2_i12oa"] + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_cccqq"] +size = Vector2(128, 128) + +[node name="Pointable" type="Area2D"] +monitoring = false +script = ExtResource("1_ujxlw") + +[node name="GodotLogo" type="Sprite2D" parent="."] +texture = ExtResource("2_i12oa") + +[node name="CollisionShape2D" type="CollisionShape2D" parent="."] +shape = SubResource("RectangleShape2D_cccqq") diff --git a/guide_examples/virtual_cursor/pointer.gd b/guide_examples/virtual_cursor/pointer.gd new file mode 100644 index 0000000..8b53ed7 --- /dev/null +++ b/guide_examples/virtual_cursor/pointer.gd @@ -0,0 +1,17 @@ +extends Area2D + +@export var cursor_2d:GUIDEAction +@export var click:GUIDEAction + + +func _ready(): + click.triggered.connect(_click) + +func _process(delta): + global_position = cursor_2d.value_axis_2d + + +func _click(): + for clickable in get_overlapping_areas(): + if clickable.has_method("spin"): + clickable.spin() diff --git a/guide_examples/virtual_cursor/pointer.gd.uid b/guide_examples/virtual_cursor/pointer.gd.uid new file mode 100644 index 0000000..ee9f4c4 --- /dev/null +++ b/guide_examples/virtual_cursor/pointer.gd.uid @@ -0,0 +1 @@ +uid://cyhgr4oiher4l diff --git a/guide_examples/virtual_cursor/pointer.svg b/guide_examples/virtual_cursor/pointer.svg new file mode 100644 index 0000000..fc2721f --- /dev/null +++ b/guide_examples/virtual_cursor/pointer.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/guide_examples/virtual_cursor/pointer.svg.import b/guide_examples/virtual_cursor/pointer.svg.import new file mode 100644 index 0000000..a1b1d58 --- /dev/null +++ b/guide_examples/virtual_cursor/pointer.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ntkhw87eedc0" +path="res://.godot/imported/pointer.svg-2068835178847b731dd1d6754048fd27.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://guide_examples/virtual_cursor/pointer.svg" +dest_files=["res://.godot/imported/pointer.svg-2068835178847b731dd1d6754048fd27.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/guide_examples/virtual_cursor/virtual_cursor.gd b/guide_examples/virtual_cursor/virtual_cursor.gd new file mode 100644 index 0000000..a11d284 --- /dev/null +++ b/guide_examples/virtual_cursor/virtual_cursor.gd @@ -0,0 +1,7 @@ +extends Node2D + +@export var mapping_context:GUIDEMappingContext + + +func _ready(): + GUIDE.enable_mapping_context(mapping_context) diff --git a/guide_examples/virtual_cursor/virtual_cursor.gd.uid b/guide_examples/virtual_cursor/virtual_cursor.gd.uid new file mode 100644 index 0000000..98b6068 --- /dev/null +++ b/guide_examples/virtual_cursor/virtual_cursor.gd.uid @@ -0,0 +1 @@ +uid://dvv04npvyv3mh diff --git a/guide_examples/virtual_cursor/virtual_cursor.tscn b/guide_examples/virtual_cursor/virtual_cursor.tscn new file mode 100644 index 0000000..1ba8b37 --- /dev/null +++ b/guide_examples/virtual_cursor/virtual_cursor.tscn @@ -0,0 +1,80 @@ +[gd_scene load_steps=12 format=3 uid="uid://b1f0bnaomla7u"] + +[ext_resource type="Script" path="res://guide_examples/virtual_cursor/virtual_cursor.gd" id="1_g0bre"] +[ext_resource type="Resource" uid="uid://b4tn11iq7uvr7" path="res://guide_examples/virtual_cursor/mapping_contexts/virtual_cursor.tres" id="2_4xju7"] +[ext_resource type="Texture2D" uid="uid://ntkhw87eedc0" path="res://guide_examples/virtual_cursor/pointer.svg" id="2_mxnae"] +[ext_resource type="Script" path="res://guide_examples/virtual_cursor/pointer.gd" id="3_dw1p5"] +[ext_resource type="PackedScene" uid="uid://ca51sup6v0qr1" path="res://guide_examples/virtual_cursor/pointable/pointable.tscn" id="3_uy61q"] +[ext_resource type="Resource" uid="uid://bcumfh8j6k1ln" path="res://guide_examples/virtual_cursor/mapping_contexts/actions/cursor_2d.tres" id="5_tj3fv"] +[ext_resource type="Resource" uid="uid://cwtdxy3gy7kud" path="res://guide_examples/virtual_cursor/mapping_contexts/actions/click.tres" id="6_1ffq2"] +[ext_resource type="PackedScene" uid="uid://dkr80d2pi0d41" path="res://addons/guide/debugger/guide_debugger.tscn" id="6_hfxka"] +[ext_resource type="Theme" uid="uid://dot0gi1yoqmrl" path="res://guide_examples/shared/ui_theme.tres" id="7_bh7yl"] +[ext_resource type="Script" path="res://guide_examples/shared/instructions_label.gd" id="7_udsq5"] + +[sub_resource type="CircleShape2D" id="CircleShape2D_ltt1b"] +radius = 32.95 + +[node name="VirtualCursor" type="Node2D"] +script = ExtResource("1_g0bre") +mapping_context = ExtResource("2_4xju7") + +[node name="Pointable" parent="." instance=ExtResource("3_uy61q")] +position = Vector2(358, 282) + +[node name="Pointable2" parent="." instance=ExtResource("3_uy61q")] +position = Vector2(915, 209) + +[node name="Pointable3" parent="." instance=ExtResource("3_uy61q")] +position = Vector2(1177, 621) + +[node name="Pointable4" parent="." instance=ExtResource("3_uy61q")] +position = Vector2(338, 859) + +[node name="Pointable5" parent="." instance=ExtResource("3_uy61q")] +position = Vector2(1476, 274) + +[node name="Pointable6" parent="." instance=ExtResource("3_uy61q")] +position = Vector2(791, 808) + +[node name="Pointable7" parent="." instance=ExtResource("3_uy61q")] +position = Vector2(605, 499) + +[node name="Pointable8" parent="." instance=ExtResource("3_uy61q")] +position = Vector2(1515, 845) + +[node name="Pointer" type="Area2D" parent="."] +position = Vector2(813, 485) +script = ExtResource("3_dw1p5") +cursor_2d = ExtResource("5_tj3fv") +click = ExtResource("6_1ffq2") + +[node name="PointerVisual" type="Sprite2D" parent="Pointer"] +texture = ExtResource("2_mxnae") +centered = false + +[node name="CollisionShape2D" type="CollisionShape2D" parent="Pointer"] +shape = SubResource("CircleShape2D_ltt1b") + +[node name="CanvasLayer" type="CanvasLayer" parent="."] + +[node name="GuideDebugger" parent="CanvasLayer" instance=ExtResource("6_hfxka")] +theme = ExtResource("7_bh7yl") + +[node name="UILayer" type="CanvasLayer" parent="."] + +[node name="RichTextLabel" type="RichTextLabel" parent="UILayer"] +anchors_preset = 1 +anchor_left = 1.0 +anchor_right = 1.0 +offset_left = -104.0 +offset_top = 56.0 +offset_right = -64.0 +offset_bottom = 96.0 +grow_horizontal = 0 +theme = ExtResource("7_bh7yl") +script = ExtResource("7_udsq5") +instructions_text = "This shows how to use a controller stick to control a virtual cursor. + +%s to move the the cursor +%s to \"click\"" +actions = Array[Resource("res://addons/guide/guide_action.gd")]([ExtResource("5_tj3fv"), ExtResource("6_1ffq2")]) diff --git a/main.tscn b/main.tscn index 5c9c62c..0a47101 100644 --- a/main.tscn +++ b/main.tscn @@ -1,6 +1,7 @@ -[gd_scene load_steps=5 format=3 uid="uid://cxbskue0lj2gv"] +[gd_scene load_steps=6 format=3 uid="uid://cxbskue0lj2gv"] [ext_resource type="PackedScene" uid="uid://bei4nhkf8lwdo" path="res://player_controller/PlayerController.tscn" id="1_ig7tw"] +[ext_resource type="PackedScene" uid="uid://dkr80d2pi0d41" path="res://addons/guide/debugger/guide_debugger.tscn" id="2_0xm2m"] [sub_resource type="ProceduralSkyMaterial" id="ProceduralSkyMaterial_0xm2m"] sky_horizon_color = Color(0.662243, 0.671743, 0.686743, 1) @@ -171,3 +172,7 @@ size = Vector3(1.10791, 1.71436, 23.4043) [node name="Player" parent="." instance=ExtResource("1_ig7tw")] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 30.2019, 12.6118, 13.3006) + +[node name="DebugLayer" type="CanvasLayer" parent="."] + +[node name="GuideDebugger" parent="DebugLayer" instance=ExtResource("2_0xm2m")] diff --git a/player_controller/PlayerController.tscn b/player_controller/PlayerController.tscn index 00a737d..2c4ac51 100644 --- a/player_controller/PlayerController.tscn +++ b/player_controller/PlayerController.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=26 format=3 uid="uid://bei4nhkf8lwdo"] +[gd_scene load_steps=30 format=3 uid="uid://bei4nhkf8lwdo"] [ext_resource type="Script" uid="uid://bbbrf5ckydfna" path="res://player_controller/Scripts/PlayerController.cs" id="1_poq2x"] [ext_resource type="Material" uid="uid://dtq8i1ka1f2pn" path="res://player_controller/Assets/Materials/Health/CameraVignette.tres" id="2_6hee7"] @@ -15,6 +15,10 @@ [ext_resource type="Script" uid="uid://c6bx47wr7fbdm" path="res://player_controller/Scripts/Mouse.cs" id="11_huhen"] [ext_resource type="Script" uid="uid://b6k73aj5povgv" path="res://player_controller/Scripts/FieldOfView.cs" id="12_m2mxi"] [ext_resource type="Script" uid="uid://bt8flen3mi28r" path="res://player_controller/Scripts/AnimationPlayer.cs" id="13_vnh4e"] +[ext_resource type="Script" uid="uid://b5nk6ntlps3x0" path="res://systems/inputs/input_system.gd" id="16_v31n3"] +[ext_resource type="Resource" uid="uid://htqvokm8mufq" path="res://systems/inputs/walk_mode/move.tres" id="17_h6vvl"] +[ext_resource type="Resource" uid="uid://dijkqkltwkrfe" path="res://systems/inputs/walk_mode/walk_mode.tres" id="18_sik0q"] +[ext_resource type="Resource" uid="uid://cpdaw41ah5gic" path="res://systems/inputs/walk_mode/rotate_y.tres" id="18_yvnfg"] [sub_resource type="CapsuleMesh" id="CapsuleMesh_xc2g5"] @@ -249,3 +253,9 @@ target_position = Vector3(0, 1, 0) [node name="HeadCollisionDetector3" type="RayCast3D" parent="HeadCollisionDetectors"] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.296, 1.4, 0) target_position = Vector3(0, 1, 0) + +[node name="InputController" type="Node3D" parent="."] +script = ExtResource("16_v31n3") +move = ExtResource("17_h6vvl") +rotate_player = ExtResource("18_yvnfg") +walk_mode = ExtResource("18_sik0q") diff --git a/player_controller/Scripts/Mouse.cs b/player_controller/Scripts/Mouse.cs index 95aa045..a0526bd 100644 --- a/player_controller/Scripts/Mouse.cs +++ b/player_controller/Scripts/Mouse.cs @@ -8,6 +8,8 @@ public partial class Mouse : Node3D [Export(PropertyHint.Range, "0,0.1,0.001,or_greater")] public float Sensitivity { get; set; } = 0.004f; + + private Node3D _head; private Camera3D _camera; diff --git a/project.godot b/project.godot index 8d2f904..1c3c6c5 100644 --- a/project.godot +++ b/project.godot @@ -15,10 +15,18 @@ run/main_scene="uid://cxbskue0lj2gv" config/features=PackedStringArray("4.4", "C#", "Forward Plus") config/icon="res://icon.svg" +[autoload] + +GUIDE="*res://addons/guide/guide.gd" + [dotnet] project/assembly_name="Movement tests" +[editor_plugins] + +enabled=PackedStringArray("res://addons/guide/plugin.cfg") + [input] up={ diff --git a/systems/inputs/input_system.gd b/systems/inputs/input_system.gd new file mode 100644 index 0000000..994ec2b --- /dev/null +++ b/systems/inputs/input_system.gd @@ -0,0 +1,12 @@ +extends Node3D + +@export var move:GUIDEAction +@export var rotate_player:GUIDEAction +@export var walk_mode:GUIDEMappingContext + +func _ready() -> void: + GUIDE.enable_mapping_context(walk_mode) + +func _process(delta: float) -> void: + # print(move.value_axis_3d) + pass diff --git a/systems/inputs/input_system.gd.uid b/systems/inputs/input_system.gd.uid new file mode 100644 index 0000000..a52c722 --- /dev/null +++ b/systems/inputs/input_system.gd.uid @@ -0,0 +1 @@ +uid://b5nk6ntlps3x0 diff --git a/systems/inputs/walk_mode/move.tres b/systems/inputs/walk_mode/move.tres new file mode 100644 index 0000000..eefd145 --- /dev/null +++ b/systems/inputs/walk_mode/move.tres @@ -0,0 +1,14 @@ +[gd_resource type="Resource" script_class="GUIDEAction" load_steps=2 format=3 uid="uid://htqvokm8mufq"] + +[ext_resource type="Script" uid="uid://cluhc11vixkf1" path="res://addons/guide/guide_action.gd" id="1_xhsni"] + +[resource] +script = ExtResource("1_xhsni") +name = &"" +action_value_type = 3 +block_lower_priority_actions = true +emit_as_godot_actions = false +is_remappable = false +display_name = "" +display_category = "" +metadata/_custom_type_script = "uid://cluhc11vixkf1" diff --git a/systems/inputs/walk_mode/rotate_floorplane.tres b/systems/inputs/walk_mode/rotate_floorplane.tres new file mode 100644 index 0000000..e95676e --- /dev/null +++ b/systems/inputs/walk_mode/rotate_floorplane.tres @@ -0,0 +1,14 @@ +[gd_resource type="Resource" script_class="GUIDEAction" load_steps=2 format=3 uid="uid://ccrb5xsnphc8"] + +[ext_resource type="Script" uid="uid://cluhc11vixkf1" path="res://addons/guide/guide_action.gd" id="1_glvw1"] + +[resource] +script = ExtResource("1_glvw1") +name = &"" +action_value_type = 1 +block_lower_priority_actions = true +emit_as_godot_actions = false +is_remappable = false +display_name = "" +display_category = "" +metadata/_custom_type_script = "uid://cluhc11vixkf1" diff --git a/systems/inputs/walk_mode/rotate_y.tres b/systems/inputs/walk_mode/rotate_y.tres new file mode 100644 index 0000000..3db2d94 --- /dev/null +++ b/systems/inputs/walk_mode/rotate_y.tres @@ -0,0 +1,14 @@ +[gd_resource type="Resource" script_class="GUIDEAction" load_steps=2 format=3 uid="uid://cpdaw41ah5gic"] + +[ext_resource type="Script" uid="uid://cluhc11vixkf1" path="res://addons/guide/guide_action.gd" id="1_3jk50"] + +[resource] +script = ExtResource("1_3jk50") +name = &"" +action_value_type = 1 +block_lower_priority_actions = true +emit_as_godot_actions = false +is_remappable = false +display_name = "" +display_category = "" +metadata/_custom_type_script = "uid://cluhc11vixkf1" diff --git a/systems/inputs/walk_mode/walk_mode.tres b/systems/inputs/walk_mode/walk_mode.tres new file mode 100644 index 0000000..90f9fb4 --- /dev/null +++ b/systems/inputs/walk_mode/walk_mode.tres @@ -0,0 +1,242 @@ +[gd_resource type="Resource" script_class="GUIDEMappingContext" load_steps=49 format=3 uid="uid://dijkqkltwkrfe"] + +[ext_resource type="Script" uid="uid://cpplm41b5bt6m" path="res://addons/guide/guide_action_mapping.gd" id="1_gh445"] +[ext_resource type="Resource" uid="uid://htqvokm8mufq" path="res://systems/inputs/walk_mode/move.tres" id="2_h1oqo"] +[ext_resource type="Script" uid="uid://dsa1dnifd6w32" path="res://addons/guide/guide_mapping_context.gd" id="2_vcm25"] +[ext_resource type="Script" uid="uid://mtx1unc2aqn7" path="res://addons/guide/guide_input_mapping.gd" id="3_pgmnb"] +[ext_resource type="Script" uid="uid://cw71o87tvdx3q" path="res://addons/guide/inputs/guide_input_key.gd" id="4_t5475"] +[ext_resource type="Script" uid="uid://bl8rjl4oaldje" path="res://addons/guide/modifiers/guide_modifier.gd" id="5_dts0n"] +[ext_resource type="Script" uid="uid://ckggy40lm0vjc" path="res://addons/guide/modifiers/guide_modifier_negate.gd" id="6_1advh"] +[ext_resource type="Script" uid="uid://bm5gjgadon6hb" path="res://addons/guide/modifiers/guide_modifier_input_swizzle.gd" id="7_54nr4"] +[ext_resource type="Script" uid="uid://x74mnwgr08a7" path="res://addons/guide/triggers/guide_trigger.gd" id="8_tlno4"] +[ext_resource type="Script" uid="uid://doauobik3xyea" path="res://addons/guide/inputs/guide_input_joy_axis_2d.gd" id="9_xnlyn"] +[ext_resource type="Resource" uid="uid://cpdaw41ah5gic" path="res://systems/inputs/walk_mode/rotate_y.tres" id="10_tlno4"] +[ext_resource type="Script" uid="uid://b6bwb7ie85kl1" path="res://addons/guide/inputs/guide_input_mouse_axis_1d.gd" id="11_tlno4"] +[ext_resource type="Script" uid="uid://cgy4anjdob2tp" path="res://addons/guide/modifiers/guide_modifier_window_relative.gd" id="12_xnlyn"] +[ext_resource type="Script" uid="uid://bjm4myqxg4phm" path="res://addons/guide/modifiers/guide_modifier_scale.gd" id="13_dlt74"] +[ext_resource type="Script" uid="uid://bbhoxsiqwo07l" path="res://addons/guide/inputs/guide_input_joy_axis_1d.gd" id="14_74dxk"] +[ext_resource type="Resource" uid="uid://ccrb5xsnphc8" path="res://systems/inputs/walk_mode/rotate_floorplane.tres" id="15_xnlyn"] + +[sub_resource type="Resource" id="Resource_dlt74"] +script = ExtResource("4_t5475") +key = 87 +shift = false +control = false +alt = false +meta = false +allow_additional_modifiers = true + +[sub_resource type="Resource" id="Resource_74dxk"] +script = ExtResource("6_1advh") +x = true +y = true +z = true + +[sub_resource type="Resource" id="Resource_4g7it"] +script = ExtResource("7_54nr4") +order = 1 + +[sub_resource type="Resource" id="Resource_vagbc"] +script = ExtResource("3_pgmnb") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_dlt74") +modifiers = Array[ExtResource("5_dts0n")]([SubResource("Resource_74dxk"), SubResource("Resource_4g7it")]) +triggers = Array[ExtResource("8_tlno4")]([]) + +[sub_resource type="Resource" id="Resource_mp7q7"] +script = ExtResource("4_t5475") +key = 83 +shift = false +control = false +alt = false +meta = false +allow_additional_modifiers = true + +[sub_resource type="Resource" id="Resource_h1oqo"] +script = ExtResource("7_54nr4") +order = 1 + +[sub_resource type="Resource" id="Resource_nt051"] +script = ExtResource("3_pgmnb") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_mp7q7") +modifiers = Array[ExtResource("5_dts0n")]([SubResource("Resource_h1oqo")]) +triggers = Array[ExtResource("8_tlno4")]([]) +metadata/_guide_modifiers_collapsed = false + +[sub_resource type="Resource" id="Resource_4ypl0"] +script = ExtResource("4_t5475") +key = 65 +shift = false +control = false +alt = false +meta = false +allow_additional_modifiers = true + +[sub_resource type="Resource" id="Resource_pgmnb"] +script = ExtResource("6_1advh") +x = true +y = true +z = true + +[sub_resource type="Resource" id="Resource_1g8ta"] +script = ExtResource("3_pgmnb") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_4ypl0") +modifiers = Array[ExtResource("5_dts0n")]([SubResource("Resource_pgmnb")]) +triggers = Array[ExtResource("8_tlno4")]([]) + +[sub_resource type="Resource" id="Resource_jgclc"] +script = ExtResource("4_t5475") +key = 68 +shift = false +control = false +alt = false +meta = false +allow_additional_modifiers = true + +[sub_resource type="Resource" id="Resource_0avlp"] +script = ExtResource("3_pgmnb") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_jgclc") +modifiers = Array[ExtResource("5_dts0n")]([]) +triggers = Array[ExtResource("8_tlno4")]([]) + +[sub_resource type="Resource" id="Resource_r2gek"] +script = ExtResource("9_xnlyn") +x = 0 +y = 1 +joy_index = -1 + +[sub_resource type="Resource" id="Resource_t5475"] +script = ExtResource("7_54nr4") +order = 2 + +[sub_resource type="Resource" id="Resource_5sx4a"] +script = ExtResource("3_pgmnb") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_r2gek") +modifiers = Array[ExtResource("5_dts0n")]([SubResource("Resource_t5475")]) +triggers = Array[ExtResource("8_tlno4")]([]) + +[sub_resource type="Resource" id="Resource_nd8wu"] +script = ExtResource("1_gh445") +action = ExtResource("2_h1oqo") +input_mappings = Array[ExtResource("3_pgmnb")]([SubResource("Resource_vagbc"), SubResource("Resource_nt051"), SubResource("Resource_1g8ta"), SubResource("Resource_0avlp"), SubResource("Resource_5sx4a")]) + +[sub_resource type="Resource" id="Resource_7dbe7"] +script = ExtResource("11_tlno4") +axis = 0 + +[sub_resource type="Resource" id="Resource_jiipn"] +script = ExtResource("12_xnlyn") + +[sub_resource type="Resource" id="Resource_sl76j"] +script = ExtResource("13_dlt74") +scale = Vector3(360, 1, 1) +apply_delta_time = false + +[sub_resource type="Resource" id="Resource_54nr4"] +script = ExtResource("6_1advh") +x = true +y = true +z = true + +[sub_resource type="Resource" id="Resource_lhbic"] +script = ExtResource("3_pgmnb") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_7dbe7") +modifiers = Array[ExtResource("5_dts0n")]([SubResource("Resource_jiipn"), SubResource("Resource_sl76j"), SubResource("Resource_54nr4")]) +triggers = Array[ExtResource("8_tlno4")]([]) + +[sub_resource type="Resource" id="Resource_agr80"] +script = ExtResource("14_74dxk") +axis = 2 +joy_index = -1 + +[sub_resource type="Resource" id="Resource_a5vma"] +script = ExtResource("3_pgmnb") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_agr80") +modifiers = Array[ExtResource("5_dts0n")]([]) +triggers = Array[ExtResource("8_tlno4")]([]) + +[sub_resource type="Resource" id="Resource_fnf72"] +script = ExtResource("1_gh445") +action = ExtResource("10_tlno4") +input_mappings = Array[ExtResource("3_pgmnb")]([SubResource("Resource_lhbic"), SubResource("Resource_a5vma")]) + +[sub_resource type="Resource" id="Resource_q3p6c"] +script = ExtResource("11_tlno4") +axis = 1 + +[sub_resource type="Resource" id="Resource_33awn"] +script = ExtResource("12_xnlyn") + +[sub_resource type="Resource" id="Resource_01l3v"] +script = ExtResource("13_dlt74") +scale = Vector3(360, 1, 1) +apply_delta_time = false + +[sub_resource type="Resource" id="Resource_xrlwl"] +script = ExtResource("6_1advh") +x = true +y = true +z = true + +[sub_resource type="Resource" id="Resource_kyrsw"] +script = ExtResource("3_pgmnb") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_q3p6c") +modifiers = Array[ExtResource("5_dts0n")]([SubResource("Resource_33awn"), SubResource("Resource_01l3v"), SubResource("Resource_xrlwl")]) +triggers = Array[ExtResource("8_tlno4")]([]) + +[sub_resource type="Resource" id="Resource_oov4j"] +script = ExtResource("14_74dxk") +axis = 3 +joy_index = -1 + +[sub_resource type="Resource" id="Resource_1hcnu"] +script = ExtResource("3_pgmnb") +override_action_settings = false +is_remappable = false +display_name = "" +display_category = "" +input = SubResource("Resource_oov4j") +modifiers = Array[ExtResource("5_dts0n")]([]) +triggers = Array[ExtResource("8_tlno4")]([]) + +[sub_resource type="Resource" id="Resource_der0j"] +script = ExtResource("1_gh445") +action = ExtResource("15_xnlyn") +input_mappings = Array[ExtResource("3_pgmnb")]([SubResource("Resource_kyrsw"), SubResource("Resource_1hcnu")]) + +[resource] +script = ExtResource("2_vcm25") +display_name = "" +mappings = Array[ExtResource("1_gh445")]([SubResource("Resource_nd8wu"), SubResource("Resource_fnf72"), SubResource("Resource_der0j")]) +metadata/_custom_type_script = "uid://dsa1dnifd6w32"

;ZX(`@L$AK?N3@%F(`|6T3 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%0Dg~|1xkF(S3@!9+z`!MpZAQHHy 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 Q%K!iX07*qoM6N<$f(AyAV*mgE literal 0 HcmV?d00001 diff --git a/guide_examples/action_priority/icons/enchant-red-3.png.import b/guide_examples/action_priority/icons/enchant-red-3.png.import new file mode 100644 index 0000000..2bad14d --- /dev/null +++ b/guide_examples/action_priority/icons/enchant-red-3.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bcls6cfcyhf0t" +path="res://.godot/imported/enchant-red-3.png-82aa47d9224cc61c8bdf354866612b90.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://guide_examples/action_priority/icons/enchant-red-3.png" +dest_files=["res://.godot/imported/enchant-red-3.png-82aa47d9224cc61c8bdf354866612b90.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/guide_examples/action_priority/icons/fireball-acid-3.png b/guide_examples/action_priority/icons/fireball-acid-3.png new file mode 100644 index 0000000000000000000000000000000000000000..364d7aab00805860326c10898bc00936247836c7 GIT binary patch literal 88799 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 z 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�y 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