1
0
mirror of https://github.com/godotengine/godot.git synced 2025-11-14 13:41:12 +00:00

Fix Actions mapped to triggers not using the full range

This commit is contained in:
Marcel Admiraal
2021-12-25 09:29:08 +00:00
parent 6689a9360c
commit f41c72c538
12 changed files with 65 additions and 127 deletions

View File

@@ -916,40 +916,25 @@ void Input::joy_button(int p_device, JoyButton p_button, bool p_pressed) {
// no event?
}
void Input::joy_axis(int p_device, JoyAxis p_axis, const JoyAxisValue &p_value) {
void Input::joy_axis(int p_device, JoyAxis p_axis, float p_value) {
_THREAD_SAFE_METHOD_;
ERR_FAIL_INDEX((int)p_axis, (int)JoyAxis::MAX);
Joypad &joy = joy_names[p_device];
if (joy.last_axis[(size_t)p_axis] == p_value.value) {
if (joy.last_axis[(size_t)p_axis] == p_value) {
return;
}
//when changing direction quickly, insert fake event to release pending inputmap actions
float last = joy.last_axis[(size_t)p_axis];
if (p_value.min == 0 && (last < 0.25 || last > 0.75) && (last - 0.5) * (p_value.value - 0.5) < 0) {
JoyAxisValue jx;
jx.min = p_value.min;
jx.value = p_value.value < 0.5 ? 0.6 : 0.4;
joy_axis(p_device, p_axis, jx);
} else if (ABS(last) > 0.5 && last * p_value.value <= 0) {
JoyAxisValue jx;
jx.min = p_value.min;
jx.value = last > 0 ? 0.1 : -0.1;
joy_axis(p_device, p_axis, jx);
}
joy.last_axis[(size_t)p_axis] = p_value.value;
float val = p_value.min == 0 ? -1.0f + 2.0f * p_value.value : p_value.value;
joy.last_axis[(size_t)p_axis] = p_value;
if (joy.mapping == -1) {
_axis_event(p_device, p_axis, val);
_axis_event(p_device, p_axis, p_value);
return;
}
JoyEvent map = _get_mapped_axis_event(map_db[joy.mapping], p_axis, val);
JoyEvent map = _get_mapped_axis_event(map_db[joy.mapping], p_axis, p_value);
if (map.type == TYPE_BUTTON) {
bool pressed = map.value > 0.5;
@@ -989,10 +974,15 @@ void Input::joy_axis(int p_device, JoyAxis p_axis, const JoyAxisValue &p_value)
}
if (map.type == TYPE_AXIS) {
_axis_event(p_device, (JoyAxis)map.index, map.value);
JoyAxis axis = JoyAxis(map.index);
float value = map.value;
if (axis == JoyAxis::TRIGGER_LEFT || axis == JoyAxis::TRIGGER_RIGHT) {
// Convert to a value between 0.0f and 1.0f.
value = 0.5f + value / 2.0f;
}
_axis_event(p_device, axis, value);
return;
}
//printf("invalid mapping\n");
}
void Input::joy_hat(int p_device, HatMask p_val) {