summaryrefslogtreecommitdiffstats
path: root/core/input/input.cpp
diff options
context:
space:
mode:
authorRémi Verschelde <rverschelde@gmail.com>2023-06-12 14:13:52 +0200
committerRémi Verschelde <rverschelde@gmail.com>2023-06-12 14:13:52 +0200
commit35ff936b93969f3e6d316a485cee3722bb17bba0 (patch)
treee5a380c287a38f00ec43bab34e562bc0f8008a60 /core/input/input.cpp
parent54ab17eb2111604f9d28c09b30083dbdae32d765 (diff)
parenta3ef092f18842b369183f43772fc47830e2924ff (diff)
downloadredot-engine-35ff936b93969f3e6d316a485cee3722bb17bba0.tar.gz
Merge pull request #77055 from lawnjelly/input_just_pressed_4
Input - fix just pressed and released with short presses
Diffstat (limited to 'core/input/input.cpp')
-rw-r--r--core/input/input.cpp61
1 files changed, 38 insertions, 23 deletions
diff --git a/core/input/input.cpp b/core/input/input.cpp
index ca348c0c3c..b4945b41a8 100644
--- a/core/input/input.cpp
+++ b/core/input/input.cpp
@@ -297,10 +297,13 @@ bool Input::is_action_just_pressed(const StringName &p_action, bool p_exact) con
return false;
}
+ // Backward compatibility for legacy behavior, only return true if currently pressed.
+ bool pressed_requirement = legacy_just_pressed_behavior ? E->value.pressed : true;
+
if (Engine::get_singleton()->is_in_physics_frame()) {
- return E->value.pressed && E->value.physics_frame == Engine::get_singleton()->get_physics_frames();
+ return pressed_requirement && E->value.pressed_physics_frame == Engine::get_singleton()->get_physics_frames();
} else {
- return E->value.pressed && E->value.process_frame == Engine::get_singleton()->get_process_frames();
+ return pressed_requirement && E->value.pressed_process_frame == Engine::get_singleton()->get_process_frames();
}
}
@@ -315,10 +318,13 @@ bool Input::is_action_just_released(const StringName &p_action, bool p_exact) co
return false;
}
+ // Backward compatibility for legacy behavior, only return true if currently released.
+ bool released_requirement = legacy_just_pressed_behavior ? !E->value.pressed : true;
+
if (Engine::get_singleton()->is_in_physics_frame()) {
- return !E->value.pressed && E->value.physics_frame == Engine::get_singleton()->get_physics_frames();
+ return released_requirement && E->value.released_physics_frame == Engine::get_singleton()->get_physics_frames();
} else {
- return !E->value.pressed && E->value.process_frame == Engine::get_singleton()->get_process_frames();
+ return released_requirement && E->value.released_process_frame == Engine::get_singleton()->get_process_frames();
}
}
@@ -686,19 +692,24 @@ void Input::_parse_input_event_impl(const Ref<InputEvent> &p_event, bool p_is_em
for (const KeyValue<StringName, InputMap::Action> &E : InputMap::get_singleton()->get_action_map()) {
if (InputMap::get_singleton()->event_is_action(p_event, E.key)) {
+ Action &action = action_state[E.key];
// If not echo and action pressed state has changed
if (!p_event->is_echo() && is_action_pressed(E.key, false) != p_event->is_action_pressed(E.key)) {
- Action action;
- action.physics_frame = Engine::get_singleton()->get_physics_frames();
- action.process_frame = Engine::get_singleton()->get_process_frames();
- action.pressed = p_event->is_action_pressed(E.key);
+ if (p_event->is_action_pressed(E.key)) {
+ action.pressed = true;
+ action.pressed_physics_frame = Engine::get_singleton()->get_physics_frames();
+ action.pressed_process_frame = Engine::get_singleton()->get_process_frames();
+ } else {
+ action.pressed = false;
+ action.released_physics_frame = Engine::get_singleton()->get_physics_frames();
+ action.released_process_frame = Engine::get_singleton()->get_process_frames();
+ }
action.strength = 0.0f;
action.raw_strength = 0.0f;
action.exact = InputMap::get_singleton()->event_is_action(p_event, E.key, true);
- action_state[E.key] = action;
}
- action_state[E.key].strength = p_event->get_action_strength(E.key);
- action_state[E.key].raw_strength = p_event->get_action_raw_strength(E.key);
+ action.strength = p_event->get_action_strength(E.key);
+ action.raw_strength = p_event->get_action_raw_strength(E.key);
}
}
@@ -813,29 +824,27 @@ Point2i Input::warp_mouse_motion(const Ref<InputEventMouseMotion> &p_motion, con
}
void Input::action_press(const StringName &p_action, float p_strength) {
- Action action;
+ // Create or retrieve existing action.
+ Action &action = action_state[p_action];
- action.physics_frame = Engine::get_singleton()->get_physics_frames();
- action.process_frame = Engine::get_singleton()->get_process_frames();
+ action.pressed_physics_frame = Engine::get_singleton()->get_physics_frames();
+ action.pressed_process_frame = Engine::get_singleton()->get_process_frames();
action.pressed = true;
action.strength = p_strength;
action.raw_strength = p_strength;
action.exact = true;
-
- action_state[p_action] = action;
}
void Input::action_release(const StringName &p_action) {
- Action action;
+ // Create or retrieve existing action.
+ Action &action = action_state[p_action];
- action.physics_frame = Engine::get_singleton()->get_physics_frames();
- action.process_frame = Engine::get_singleton()->get_process_frames();
+ action.released_physics_frame = Engine::get_singleton()->get_physics_frames();
+ action.released_process_frame = Engine::get_singleton()->get_process_frames();
action.pressed = false;
- action.strength = 0.f;
- action.raw_strength = 0.f;
+ action.strength = 0.0f;
+ action.raw_strength = 0.0f;
action.exact = true;
-
- action_state[p_action] = action;
}
void Input::set_emulate_touch_from_mouse(bool p_emulate) {
@@ -1532,6 +1541,12 @@ Input::Input() {
parse_mapping(entries[i]);
}
}
+
+ legacy_just_pressed_behavior = GLOBAL_DEF("input_devices/compatibility/legacy_just_pressed_behavior", false);
+ if (Engine::get_singleton()->is_editor_hint()) {
+ // Always use standard behaviour in the editor.
+ legacy_just_pressed_behavior = false;
+ }
}
Input::~Input() {