From 0aa68f598c09138117f5b4c59504d0fac5654238 Mon Sep 17 00:00:00 2001 From: Jamie Greunbaum Date: Sun, 23 Aug 2026 17:46:11 -0400 Subject: [PATCH] Fixed signal/function name confusion when adding and removing input resources. --- src/liborng/resources/input_resource.cpp | 18 +++--- src/liborng/resources/input_resource.h | 2 + src/liborng/singletons/input_handler.cpp | 77 +++++++++++++++--------- 3 files changed, 59 insertions(+), 38 deletions(-) diff --git a/src/liborng/resources/input_resource.cpp b/src/liborng/resources/input_resource.cpp index daf1183..66e28f0 100644 --- a/src/liborng/resources/input_resource.cpp +++ b/src/liborng/resources/input_resource.cpp @@ -26,8 +26,8 @@ void InputResource::update_buttons(const Ref event, const float delt if (event->is_action_pressed(action->get_action_name()) && action_strength >= action_deadzone) { action->set_active(true); - const StringName pressed_callback = StringName("_on_") + action->get_action_name() + INPUTACTION_SUFFIX_PRESSED; - if (this->has_signal(pressed_callback)) this->emit_signal(pressed_callback); + const StringName &pressed_signal = StringName("_on_") + action->get_action_name() + INPUTACTION_SUFFIX_PRESSED + INPUTHANDLER_SUFFIX_SIGNAL; + if (this->has_signal(pressed_signal)) this->emit_signal(pressed_signal); } } else @@ -35,8 +35,8 @@ void InputResource::update_buttons(const Ref event, const float delt if (event->is_action_released(action->get_action_name()) || (event->is_action_pressed(action->get_action_name()) && action_strength < action_deadzone)) { action->set_active(false); - const StringName released_callback = StringName("_on_") + action->get_action_name() + INPUTACTION_SUFFIX_RELEASED; - if (this->has_signal(released_callback)) this->emit_signal(released_callback); + const StringName &released_signal = StringName("_on_") + action->get_action_name() + INPUTACTION_SUFFIX_RELEASED + INPUTHANDLER_SUFFIX_SIGNAL; + if (this->has_signal(released_signal)) this->emit_signal(released_signal); } } } @@ -49,13 +49,13 @@ void InputResource::update_axes(const float delta) const InputAxis *axis = cast_to(this->input_axes[i]); const StringName prefix = StringName("_on_") + axis->get_axis_name(); - const StringName signal_1d = prefix + INPUTAXIS_ONE_DIMENSIONAL_SUFFIX; + const StringName &signal_1d = prefix + INPUTAXIS_ONE_DIMENSIONAL_SUFFIX + INPUTHANDLER_SUFFIX_SIGNAL; if (this->has_signal(signal_1d)) this->emit_signal(signal_1d, delta, axis->get_x_axis()); - const StringName signal_2d = prefix + INPUTAXIS_TWO_DIMENSIONAL_SUFFIX; + const StringName &signal_2d = prefix + INPUTAXIS_TWO_DIMENSIONAL_SUFFIX + INPUTHANDLER_SUFFIX_SIGNAL; if (this->has_signal(signal_2d)) this->emit_signal(signal_2d, delta, axis->get_lateral_vector()); - const StringName signal_3d = prefix + INPUTAXIS_THREE_DIMENSIONAL_SUFFIX; + const StringName &signal_3d = prefix + INPUTAXIS_THREE_DIMENSIONAL_SUFFIX + INPUTHANDLER_SUFFIX_SIGNAL; if (this->has_signal(signal_3d)) this->emit_signal(signal_3d, delta, axis->get_spherical_vector()); } } @@ -65,10 +65,10 @@ void InputResource::update_axes_mouse_event(const Ref eve for (uint8_t i = 0; i < this->input_axes.size(); i++) { const InputAxis *axis = cast_to(this->input_axes[i]); - const StringName signal = StringName("_on_") + axis->get_axis_name() + INPUTAXIS_TWO_DIMENSIONAL_SUFFIX; + const StringName signal = StringName("_on_") + axis->get_axis_name() + INPUTAXIS_TWO_DIMENSIONAL_SUFFIX + INPUTHANDLER_SUFFIX_SIGNAL; if (axis->get_include_mouse() && this->has_signal(signal)) { - this->emit_signal(signal, delta, event->get_relative() * 0.000001f / delta); + this->emit_signal(signal, delta, event->get_relative() * 0.0001f / delta); } } } diff --git a/src/liborng/resources/input_resource.h b/src/liborng/resources/input_resource.h index 86bb3ea..41c26d0 100644 --- a/src/liborng/resources/input_resource.h +++ b/src/liborng/resources/input_resource.h @@ -13,6 +13,8 @@ #include using namespace godot; +#define INPUTHANDLER_SUFFIX_SIGNAL StringName("_signal") + #define INPUTACTION_SUFFIX_PRESSED StringName("_pressed") #define INPUTACTION_SUFFIX_RELEASED StringName("_released") diff --git a/src/liborng/singletons/input_handler.cpp b/src/liborng/singletons/input_handler.cpp index 09dba0b..085c812 100644 --- a/src/liborng/singletons/input_handler.cpp +++ b/src/liborng/singletons/input_handler.cpp @@ -55,14 +55,15 @@ void InputHandler::add_input_resource(Node *target, InputResource *resource) for (uint8_t s = 0; s < 2; s++) { - const StringName signal_name = StringName("_on_") + action->get_action_name() + this->input_action_suffixes[s]; - if (target->has_method(signal_name)) + const StringName callback_name = StringName("_on_") + action->get_action_name() + this->input_action_suffixes[s]; + if (target->has_method(callback_name)) { - if (!resource->has_signal(signal_name)) - { - resource->add_user_signal(signal_name); - resource->connect(signal_name, Callable(target, signal_name)); - } + const StringName signal_name = callback_name + INPUTHANDLER_SUFFIX_SIGNAL; + if (!resource->has_signal(signal_name)) resource->add_user_signal(signal_name); + + const Callable &callable = Callable(target, callback_name); + if (!resource->is_connected(signal_name, callable)) + resource->connect(signal_name, callable); const TypedArray &events = action->get_input_events(); for (uint8_t e = 0; e < events.size(); e++) @@ -83,12 +84,13 @@ void InputHandler::add_input_resource(Node *target, InputResource *resource) for(uint8_t s = 0; s <= axis_dimensions; s++) { - const StringName signal_name = StringName("_on_") + axis->get_axis_name() + this->input_axis_suffixes[s]; - const Callable &callable = Callable(target, signal_name); - if (target->has_method(signal_name) && !resource->has_signal(signal_name)) + const StringName callback_name = StringName("_on_") + axis->get_axis_name() + this->input_axis_suffixes[s]; + if (target->has_method(callback_name)) { - resource->add_user_signal(signal_name); - resource->connect(signal_name, callable); + const StringName signal_name = callback_name + INPUTHANDLER_SUFFIX_SIGNAL; + if (!resource->has_signal(signal_name)) resource->add_user_signal(signal_name); + const Callable &callable = Callable(target, callback_name); + if (!resource->is_connected(signal_name, callable)) resource->connect(signal_name, callable); } } @@ -183,12 +185,23 @@ void InputHandler::remove_input_resource(Node *target, InputResource *resource) input->action_release(action->get_action_name()); input_map->action_erase_events(action->get_action_name()); - const StringName signal_name_pressed = StringName("_on_") + action->get_action_name() + input_action_suffixes[0]; - if (target->has_method(signal_name_pressed)) resource->disconnect(signal_name_pressed, Callable(target, signal_name_pressed)); + const StringName &name_prefix = StringName("_on_") + action->get_action_name(); - const StringName signal_name_released = StringName("_on_") + action->get_action_name() + input_action_suffixes[1]; - if (target->has_method(signal_name_released)) resource->disconnect(signal_name_released, Callable(target, signal_name_released)); - target->call(signal_name_released); + const StringName &callback_name_pressed = name_prefix + input_action_suffixes[0]; + const StringName &signal_name_pressed = callback_name_pressed + INPUTHANDLER_SUFFIX_SIGNAL; + const Callable &callable_pressed = Callable(target, callback_name_pressed); + if (resource->is_connected(signal_name_pressed, callable_pressed)) + resource->disconnect(signal_name_pressed, callable_pressed); + + const StringName &callback_name_released = name_prefix + input_action_suffixes[1]; + const StringName &signal_name_released = callback_name_released + INPUTHANDLER_SUFFIX_SIGNAL; + const Callable &callable_released = Callable(target, callback_name_released); + if (target->has_method(callback_name_released)) + { + target->call(callback_name_released); + if (resource->is_connected(signal_name_released, callable_released)) + resource->disconnect(signal_name_released, callable_released); + } } } @@ -196,28 +209,34 @@ void InputHandler::remove_input_resource(Node *target, InputResource *resource) { if (const InputAxis *axis = cast_to(input_axes[i])) { - const StringName signal_name_one = StringName("_on_") + axis->get_axis_name() + this->input_axis_suffixes[0]; - if (target->has_method(signal_name_one)) + const StringName &callback_name_one = StringName("_on_") + axis->get_axis_name() + this->input_axis_suffixes[0]; + const StringName &signal_name_one = callback_name_one + INPUTHANDLER_SUFFIX_SIGNAL; + if (target->has_method(callback_name_one)) { if (resource->has_signal(signal_name_one)) - resource->emit_signal(signal_name_one, this->get_process_delta_time(), 0.0f); - resource->disconnect(signal_name_one, Callable(target, signal_name_one)); + resource->disconnect(signal_name_one, Callable(target, callback_name_one)); + if (target->has_method(callback_name_one)) + target->call(callback_name_one, this->get_process_delta_time(), 0.0f); } - const StringName signal_name_two = StringName("_on_") + axis->get_axis_name() + this->input_axis_suffixes[1]; - if (target->has_method(signal_name_two)) + const StringName &callback_name_two = StringName("_on_") + axis->get_axis_name() + this->input_axis_suffixes[1]; + const StringName &signal_name_two = callback_name_two + INPUTHANDLER_SUFFIX_SIGNAL; + if (target->has_method(callback_name_two)) { if (resource->has_signal(signal_name_two)) - resource->emit_signal(signal_name_two, this->get_process_delta_time(), Vector2(0.0f, 0.0f)); - resource->disconnect(signal_name_two, Callable(target, signal_name_two)); + resource->disconnect(signal_name_two, Callable(target, callback_name_two)); + if (target->has_method(callback_name_two)) + target->call(callback_name_two, this->get_process_delta_time(), Vector2(0.0f, 0.0f)); } - const StringName signal_name_three = StringName("_on_") + axis->get_axis_name() + this->input_axis_suffixes[2]; - if (target->has_method(signal_name_three)) + const StringName &callback_name_three = StringName("_on_") + axis->get_axis_name() + this->input_axis_suffixes[2]; + const StringName &signal_name_three = callback_name_three + INPUTHANDLER_SUFFIX_SIGNAL; + if (target->has_method(callback_name_three)) { if (resource->has_signal(signal_name_three)) - resource->emit_signal(signal_name_three, this->get_process_delta_time(), Vector3(0.0f, 0.0f, 0.0f)); - resource->disconnect(signal_name_three, Callable(target, signal_name_three)); + resource->disconnect(signal_name_three, Callable(target, callback_name_three)); + if (target->has_method(callback_name_three)) + target->call(callback_name_three, this->get_process_delta_time(), Vector3(0.0f, 0.0f, 0.0f)); } /*