Fixed signal/function name confusion when adding and removing input resources.

This commit is contained in:
2026-08-23 17:48:44 -04:00
parent 323e55c3fd
commit 814299e449
3 changed files with 63 additions and 42 deletions
+9 -9
View File
@@ -26,8 +26,8 @@ void InputResource::update_buttons(const Ref<InputEvent> event, const float delt
if (event->is_action_pressed(action->get_action_name()) && action_strength >= action_deadzone) if (event->is_action_pressed(action->get_action_name()) && action_strength >= action_deadzone)
{ {
action->set_active(true); action->set_active(true);
const StringName pressed_callback = StringName("_on_") + action->get_action_name() + INPUTACTION_SUFFIX_PRESSED; const StringName &pressed_signal = StringName("_on_") + action->get_action_name() + INPUTACTION_SUFFIX_PRESSED + INPUTHANDLER_SUFFIX_SIGNAL;
if (this->has_signal(pressed_callback)) this->emit_signal(pressed_callback); if (this->has_signal(pressed_signal)) this->emit_signal(pressed_signal);
} }
} }
else else
@@ -35,8 +35,8 @@ void InputResource::update_buttons(const Ref<InputEvent> 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)) 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); action->set_active(false);
const StringName released_callback = StringName("_on_") + action->get_action_name() + INPUTACTION_SUFFIX_RELEASED; const StringName &released_signal = StringName("_on_") + action->get_action_name() + INPUTACTION_SUFFIX_RELEASED + INPUTHANDLER_SUFFIX_SIGNAL;
if (this->has_signal(released_callback)) this->emit_signal(released_callback); 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<InputAxis>(this->input_axes[i]); const InputAxis *axis = cast_to<InputAxis>(this->input_axes[i]);
const StringName prefix = StringName("_on_") + axis->get_axis_name(); 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()); 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()); 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()); 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<InputEventMouseMotion> eve
for (uint8_t i = 0; i < this->input_axes.size(); i++) for (uint8_t i = 0; i < this->input_axes.size(); i++)
{ {
const InputAxis *axis = cast_to<InputAxis>(this->input_axes[i]); const InputAxis *axis = cast_to<InputAxis>(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)) 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);
} }
} }
} }
+2
View File
@@ -13,6 +13,8 @@
#include <godot_cpp/classes/resource.hpp> #include <godot_cpp/classes/resource.hpp>
using namespace godot; using namespace godot;
#define INPUTHANDLER_SUFFIX_SIGNAL StringName("_signal")
#define INPUTACTION_SUFFIX_PRESSED StringName("_pressed") #define INPUTACTION_SUFFIX_PRESSED StringName("_pressed")
#define INPUTACTION_SUFFIX_RELEASED StringName("_released") #define INPUTACTION_SUFFIX_RELEASED StringName("_released")
+52 -33
View File
@@ -55,14 +55,15 @@ void InputHandler::add_input_resource(Node *target, InputResource *resource)
for (uint8_t s = 0; s < 2; s++) for (uint8_t s = 0; s < 2; s++)
{ {
const StringName signal_name = StringName("_on_") + action->get_action_name() + this->input_action_suffixes[s]; const StringName callback_name = StringName("_on_") + action->get_action_name() + this->input_action_suffixes[s];
if (target->has_method(signal_name)) if (target->has_method(callback_name))
{ {
if (!resource->has_signal(signal_name)) const StringName signal_name = callback_name + INPUTHANDLER_SUFFIX_SIGNAL;
{ if (!resource->has_signal(signal_name)) resource->add_user_signal(signal_name);
resource->add_user_signal(signal_name);
resource->connect(signal_name, Callable(target, signal_name)); const Callable &callable = Callable(target, callback_name);
} if (!resource->is_connected(signal_name, callable))
resource->connect(signal_name, callable);
const TypedArray<InputEvent> &events = action->get_input_events(); const TypedArray<InputEvent> &events = action->get_input_events();
for (uint8_t e = 0; e < events.size(); e++) for (uint8_t e = 0; e < events.size(); e++)
@@ -75,20 +76,21 @@ void InputHandler::add_input_resource(Node *target, InputResource *resource)
} }
} }
for(uint8_t i = 0; i < input_axes.size(); i++) for (uint8_t i = 0; i < input_axes.size(); i++)
{ {
if (const InputAxis *axis = cast_to<InputAxis>(input_axes[i])) if (const InputAxis *axis = cast_to<InputAxis>(input_axes[i]))
{ {
const uint8_t &axis_dimensions = axis->get_axis_dimensions(); const uint8_t &axis_dimensions = axis->get_axis_dimensions();
for(uint8_t s = 0; s <= axis_dimensions; s++) 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 StringName callback_name = StringName("_on_") + axis->get_axis_name() + this->input_axis_suffixes[s];
const Callable &callable = Callable(target, signal_name); if (target->has_method(callback_name))
if (target->has_method(signal_name) && !resource->has_signal(signal_name))
{ {
resource->add_user_signal(signal_name); const StringName signal_name = callback_name + INPUTHANDLER_SUFFIX_SIGNAL;
resource->connect(signal_name, callable); 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);
} }
} }
@@ -176,48 +178,65 @@ void InputHandler::remove_input_resource(Node *target, InputResource *resource)
const TypedArray<InputAction> &input_actions = resource->get_input_actions(); const TypedArray<InputAction> &input_actions = resource->get_input_actions();
const TypedArray<InputAxis> &input_axes = resource->get_input_axes(); const TypedArray<InputAxis> &input_axes = resource->get_input_axes();
for(uint8_t i = 0; i < input_actions.size(); i++) for (uint8_t i = 0; i < input_actions.size(); i++)
{ {
if (const InputAction *action = cast_to<InputAction>(input_actions[i])) if (const InputAction *action = cast_to<InputAction>(input_actions[i]))
{ {
input->action_release(action->get_action_name()); input->action_release(action->get_action_name());
input_map->action_erase_events(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]; const StringName &name_prefix = StringName("_on_") + action->get_action_name();
if (target->has_method(signal_name_pressed)) resource->disconnect(signal_name_pressed, Callable(target, signal_name_pressed));
const StringName signal_name_released = StringName("_on_") + action->get_action_name() + input_action_suffixes[1]; const StringName &callback_name_pressed = name_prefix + input_action_suffixes[0];
if (target->has_method(signal_name_released)) resource->disconnect(signal_name_released, Callable(target, signal_name_released)); const StringName &signal_name_pressed = callback_name_pressed + INPUTHANDLER_SUFFIX_SIGNAL;
target->call(signal_name_released); 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);
}
} }
} }
for(uint8_t i = 0; i < input_axes.size(); i++) for (uint8_t i = 0; i < input_axes.size(); i++)
{ {
if (const InputAxis *axis = cast_to<InputAxis>(input_axes[i])) if (const InputAxis *axis = cast_to<InputAxis>(input_axes[i]))
{ {
const StringName signal_name_one = StringName("_on_") + axis->get_axis_name() + this->input_axis_suffixes[0]; const StringName &callback_name_one = StringName("_on_") + axis->get_axis_name() + this->input_axis_suffixes[0];
if (target->has_method(signal_name_one)) 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)) 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, callback_name_one));
resource->disconnect(signal_name_one, Callable(target, signal_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]; const StringName &callback_name_two = StringName("_on_") + axis->get_axis_name() + this->input_axis_suffixes[1];
if (target->has_method(signal_name_two)) 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)) 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, callback_name_two));
resource->disconnect(signal_name_two, Callable(target, signal_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]; const StringName &callback_name_three = StringName("_on_") + axis->get_axis_name() + this->input_axis_suffixes[2];
if (target->has_method(signal_name_three)) 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)) 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, callback_name_three));
resource->disconnect(signal_name_three, Callable(target, signal_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));
} }
/* /*