From 1e43a2433cf61f29bd4a0311654ffcb7b30bc741 Mon Sep 17 00:00:00 2001 From: Jamie Greunbaum Date: Sat, 29 Aug 2026 15:52:58 -0400 Subject: [PATCH] - Inputs no longer fire continuously when the axis is in a resting position. - Fixed an error that caused a signal that doesn't exist to disconnect. --- src/liborng/resources/input_resource.cpp | 51 +++++++++++++++++++----- src/liborng/resources/input_resource.h | 6 +++ src/liborng/singletons/input_handler.cpp | 7 ++-- 3 files changed, 49 insertions(+), 15 deletions(-) diff --git a/src/liborng/resources/input_resource.cpp b/src/liborng/resources/input_resource.cpp index 3803326..bb815fc 100644 --- a/src/liborng/resources/input_resource.cpp +++ b/src/liborng/resources/input_resource.cpp @@ -46,17 +46,40 @@ void InputResource::update_axes(const float delta) { for (uint8_t i = 0; i < this->input_axes.size(); i++) { - const InputAxis *axis = cast_to(this->input_axes[i]); + InputAxis *axis = cast_to(this->input_axes[i]); const StringName prefix = StringName("_on_") + axis->get_axis_name(); - + const float axis_deadzone = axis->get_deadzone(); + + Vector3 current_input = axis->get_last_axis_input(); + 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)) + { + const float x_axis = axis->get_x_axis(); + if (current_input.x != x_axis || current_input.length() > SMALL_NUMBER) + this->emit_signal(signal_1d, delta, x_axis); + current_input.x = x_axis; + } 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)) + { + const Vector2 &vector = axis->get_lateral_vector(); + if ((current_input.x != vector.x || current_input.z != vector.y) || current_input.length() > SMALL_NUMBER) + this->emit_signal(signal_2d, delta, vector); + current_input.x = vector.x; current_input.z = vector.y; + } 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)) + { + const Vector3 &vector = axis->get_spherical_vector(); + if (current_input != vector || current_input.length() > SMALL_NUMBER) + this->emit_signal(signal_3d, delta, vector); + current_input = vector; + } + + axis->set_last_axis_input(current_input); } } @@ -104,42 +127,48 @@ Ref InputResource::find_input_axis(const StringName &name) const Vector3 InputAxis::get_spherical_vector() const { const Input *input = Input::get_singleton(); - return Vector3( + const Vector3 &axis = Vector3( input->get_axis(this->axis_name + INPUTAXIS_LEFT_SUFFIX, this->axis_name + INPUTAXIS_RIGHT_SUFFIX), input->get_axis(this->axis_name + INPUTAXIS_DOWN_SUFFIX, this->axis_name + INPUTAXIS_UP_SUFFIX), input->get_axis(this->axis_name + INPUTAXIS_FORWARD_SUFFIX, this->axis_name + INPUTAXIS_BACK_SUFFIX) ); + return axis.length() >= this->deadzone ? axis : Vector3(); } Vector2 InputAxis::get_lateral_vector() const { - return Input::get_singleton()->get_vector( + const Vector2 &axis = Input::get_singleton()->get_vector( this->axis_name + INPUTAXIS_LEFT_SUFFIX, this->axis_name + INPUTAXIS_RIGHT_SUFFIX, this->axis_name + INPUTAXIS_FORWARD_SUFFIX, this->axis_name + INPUTAXIS_BACK_SUFFIX ); + return axis.length() >= this->deadzone ? axis : Vector2(); } Vector2 InputAxis::get_lateral_vector_square() const { const Input *input = Input::get_singleton(); - return Vector2( + const Vector2 &axis = Vector2( input->get_axis(this->axis_name + INPUTAXIS_LEFT_SUFFIX, this->axis_name + INPUTAXIS_RIGHT_SUFFIX), input->get_axis(this->axis_name + INPUTAXIS_FORWARD_SUFFIX, this->axis_name + INPUTAXIS_BACK_SUFFIX) ); + return axis.length() >= this->deadzone ? axis : Vector2(); } float InputAxis::get_x_axis() const { - return Input::get_singleton()->get_axis(this->axis_name + INPUTAXIS_LEFT_SUFFIX, this->axis_name + INPUTAXIS_RIGHT_SUFFIX); + const float axis = Input::get_singleton()->get_axis(this->axis_name + INPUTAXIS_LEFT_SUFFIX, this->axis_name + INPUTAXIS_RIGHT_SUFFIX); + return UtilityFunctions::absf(axis) >= this->deadzone ? axis : 0.0f; } float InputAxis::get_y_axis() const { - return Input::get_singleton()->get_axis(this->axis_name + INPUTAXIS_DOWN_SUFFIX, this->axis_name + INPUTAXIS_UP_SUFFIX); + const float axis = Input::get_singleton()->get_axis(this->axis_name + INPUTAXIS_DOWN_SUFFIX, this->axis_name + INPUTAXIS_UP_SUFFIX); + return UtilityFunctions::absf(axis) >= this->deadzone ? axis : 0.0f; } float InputAxis::get_z_axis() const { - return Input::get_singleton()->get_axis(this->axis_name + INPUTAXIS_FORWARD_SUFFIX, this->axis_name + INPUTAXIS_BACK_SUFFIX); + const float axis = Input::get_singleton()->get_axis(this->axis_name + INPUTAXIS_FORWARD_SUFFIX, this->axis_name + INPUTAXIS_BACK_SUFFIX); + return UtilityFunctions::absf(axis) >= this->deadzone ? axis : 0.0f; } diff --git a/src/liborng/resources/input_resource.h b/src/liborng/resources/input_resource.h index 87113c9..b368086 100644 --- a/src/liborng/resources/input_resource.h +++ b/src/liborng/resources/input_resource.h @@ -128,6 +128,9 @@ public: void set_up_down_events(const TypedArray events) { this->up_down_events = events; } TypedArray get_up_down_events() const { return this->up_down_events; } + void set_last_axis_input(const Vector3 &value) { this->last_axis_input = value; } + Vector3 get_last_axis_input() const { return this->last_axis_input; } + Vector3 get_spherical_vector() const; Vector2 get_lateral_vector() const; @@ -146,6 +149,9 @@ protected: TypedArray left_right_events; TypedArray forward_back_events; TypedArray up_down_events; + +private: + Vector3 last_axis_input = Vector3(); // Godot boilerplate below protected: diff --git a/src/liborng/singletons/input_handler.cpp b/src/liborng/singletons/input_handler.cpp index 63df071..0e2fa19 100644 --- a/src/liborng/singletons/input_handler.cpp +++ b/src/liborng/singletons/input_handler.cpp @@ -163,7 +163,7 @@ void InputHandler::add_input_resource(Node *target, InputResource *resource) this->active_resources.insert(resource); - const StringName input_resource_method = target->get_name() + StringName("_") + resource->get_path(); + const StringName &input_resource_method = target->get_name() + StringName("_") + resource->get_path(); if (this->bound_remove_methods.find(input_resource_method) == this->bound_remove_methods.end()) { MethodBind *bind = ClassDB::bind_method(input_resource_method, &InputHandler::remove_input_resource); @@ -199,7 +199,7 @@ void InputHandler::remove_input_resource(Node *target, InputResource *resource) 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)) + if (resource->has_signal(signal_name_pressed) && 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]; @@ -208,7 +208,7 @@ void InputHandler::remove_input_resource(Node *target, InputResource *resource) if (target->has_method(callback_name_released)) { target->call(callback_name_released); - if (resource->is_connected(signal_name_released, callable_released)) + if (resource->has_signal(signal_name_released) && resource->is_connected(signal_name_released, callable_released)) resource->disconnect(signal_name_released, callable_released); } } @@ -267,7 +267,6 @@ void InputHandler::remove_input_resource(Node *target, InputResource *resource) */ const StringName &axis_name = axis->get_axis_name(); const uint8_t &axis_dimensions = axis->get_axis_dimensions(); - const float &deadzone = axis->get_deadzone(); if (axis_dimensions >= InputAxis::AXIS_DIMENSIONS::ONE) { const StringName &left_axis_action = axis_name + INPUTAXIS_LEFT_SUFFIX;