Skip to content

Commit bf9afa6

Browse files
committed
[macOS/iOS] Controller motion, adaptive triggers and touchpad support.
1 parent 16d6142 commit bf9afa6

10 files changed

+1160
-43
lines changed

core/core_constants.cpp

+4
Original file line numberDiff line numberDiff line change
@@ -561,6 +561,10 @@ void register_global_constants() {
561561
BIND_CORE_ENUM_CLASS_CONSTANT(JoyAxis, JOY_AXIS, TRIGGER_LEFT);
562562
BIND_CORE_ENUM_CLASS_CONSTANT(JoyAxis, JOY_AXIS, TRIGGER_RIGHT);
563563
BIND_CORE_ENUM_CLASS_CONSTANT(JoyAxis, JOY_AXIS, SDL_MAX);
564+
BIND_CORE_ENUM_CLASS_CONSTANT(JoyAxis, JOY_AXIS, PRIMARY_FINGER_X);
565+
BIND_CORE_ENUM_CLASS_CONSTANT(JoyAxis, JOY_AXIS, PRIMARY_FINGER_Y);
566+
BIND_CORE_ENUM_CLASS_CONSTANT(JoyAxis, JOY_AXIS, SECONDARY_FINGER_X);
567+
BIND_CORE_ENUM_CLASS_CONSTANT(JoyAxis, JOY_AXIS, SECONDARY_FINGER_Y);
564568
BIND_CORE_ENUM_CLASS_CONSTANT(JoyAxis, JOY_AXIS, MAX);
565569

566570
BIND_CORE_ENUM_CLASS_CONSTANT(MIDIMessage, MIDI_MESSAGE, NONE);

core/input/input.cpp

+207
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,8 @@ void Input::_bind_methods() {
120120
ClassDB::bind_method(D_METHOD("get_joy_vibration_duration", "device"), &Input::get_joy_vibration_duration);
121121
ClassDB::bind_method(D_METHOD("start_joy_vibration", "device", "weak_magnitude", "strong_magnitude", "duration"), &Input::start_joy_vibration, DEFVAL(0));
122122
ClassDB::bind_method(D_METHOD("stop_joy_vibration", "device"), &Input::stop_joy_vibration);
123+
ClassDB::bind_method(D_METHOD("get_joy_sensors_enabled", "device"), &Input::get_joy_sensors_enabled);
124+
ClassDB::bind_method(D_METHOD("set_joy_sensors_enabled", "device", "enabled"), &Input::set_joy_sensors_enabled);
123125
ClassDB::bind_method(D_METHOD("vibrate_handheld", "duration_ms"), &Input::vibrate_handheld, DEFVAL(500));
124126
ClassDB::bind_method(D_METHOD("get_gravity"), &Input::get_gravity);
125127
ClassDB::bind_method(D_METHOD("get_accelerometer"), &Input::get_accelerometer);
@@ -129,6 +131,24 @@ void Input::_bind_methods() {
129131
ClassDB::bind_method(D_METHOD("set_accelerometer", "value"), &Input::set_accelerometer);
130132
ClassDB::bind_method(D_METHOD("set_magnetometer", "value"), &Input::set_magnetometer);
131133
ClassDB::bind_method(D_METHOD("set_gyroscope", "value"), &Input::set_gyroscope);
134+
ClassDB::bind_method(D_METHOD("get_joy_gravity", "device"), &Input::get_joy_gravity);
135+
ClassDB::bind_method(D_METHOD("get_joy_accelerometer", "device"), &Input::get_joy_accelerometer);
136+
ClassDB::bind_method(D_METHOD("get_joy_gyroscope", "device"), &Input::get_joy_gyroscope);
137+
ClassDB::bind_method(D_METHOD("set_joy_gravity", "device", "value"), &Input::set_joy_gravity);
138+
ClassDB::bind_method(D_METHOD("set_joy_accelerometer", "device", "value"), &Input::set_joy_accelerometer);
139+
ClassDB::bind_method(D_METHOD("set_joy_gyroscope", "device", "value"), &Input::set_joy_gyroscope);
140+
ClassDB::bind_method(D_METHOD("get_joy_adaptive_trigger_mode", "device", "axis"), &Input::get_joy_adaptive_trigger_mode);
141+
ClassDB::bind_method(D_METHOD("set_joy_adaptive_trigger_mode", "device", "axis", "mode"), &Input::set_joy_adaptive_trigger_mode);
142+
ClassDB::bind_method(D_METHOD("get_joy_adaptive_trigger_strength", "device", "axis"), &Input::get_joy_adaptive_trigger_strength);
143+
ClassDB::bind_method(D_METHOD("set_joy_adaptive_trigger_strength", "device", "axis", "strength"), &Input::set_joy_adaptive_trigger_strength);
144+
ClassDB::bind_method(D_METHOD("get_joy_adaptive_trigger_position", "device", "axis"), &Input::get_joy_adaptive_trigger_position);
145+
ClassDB::bind_method(D_METHOD("set_joy_adaptive_trigger_position", "device", "axis", "position"), &Input::set_joy_adaptive_trigger_position);
146+
ClassDB::bind_method(D_METHOD("get_joy_battery_state", "device"), &Input::get_joy_battery_state);
147+
ClassDB::bind_method(D_METHOD("set_joy_battery_state", "device", "state"), &Input::set_joy_battery_state);
148+
ClassDB::bind_method(D_METHOD("get_joy_battery_level", "device"), &Input::get_joy_battery_level);
149+
ClassDB::bind_method(D_METHOD("set_joy_battery_level", "device", "level"), &Input::set_joy_battery_level);
150+
ClassDB::bind_method(D_METHOD("get_joy_light", "device"), &Input::get_joy_light);
151+
ClassDB::bind_method(D_METHOD("set_joy_light", "device", "color"), &Input::set_joy_light);
132152
ClassDB::bind_method(D_METHOD("get_last_mouse_velocity"), &Input::get_last_mouse_velocity);
133153
ClassDB::bind_method(D_METHOD("get_last_mouse_screen_velocity"), &Input::get_last_mouse_screen_velocity);
134154
ClassDB::bind_method(D_METHOD("get_mouse_button_mask"), &Input::get_mouse_button_mask);
@@ -160,6 +180,17 @@ void Input::_bind_methods() {
160180
BIND_ENUM_CONSTANT(MOUSE_MODE_CONFINED);
161181
BIND_ENUM_CONSTANT(MOUSE_MODE_CONFINED_HIDDEN);
162182

183+
BIND_ENUM_CONSTANT(JOY_ADAPTIVE_TRIGGER_MODE_OFF);
184+
BIND_ENUM_CONSTANT(JOY_ADAPTIVE_TRIGGER_MODE_FEEDBACK);
185+
BIND_ENUM_CONSTANT(JOY_ADAPTIVE_TRIGGER_MODE_WEAPON);
186+
BIND_ENUM_CONSTANT(JOY_ADAPTIVE_TRIGGER_MODE_VIBRATION);
187+
BIND_ENUM_CONSTANT(JOY_ADAPTIVE_TRIGGER_MODE_SLOPE_FEEDBACK);
188+
189+
BIND_ENUM_CONSTANT(JOY_BATTERY_STATE_UNKNOWN);
190+
BIND_ENUM_CONSTANT(JOY_BATTERY_STATE_DISCHARGING);
191+
BIND_ENUM_CONSTANT(JOY_BATTERY_STATE_CHARGING);
192+
BIND_ENUM_CONSTANT(JOY_BATTERY_STATE_FULL);
193+
163194
BIND_ENUM_CONSTANT(CURSOR_ARROW);
164195
BIND_ENUM_CONSTANT(CURSOR_IBEAM);
165196
BIND_ENUM_CONSTANT(CURSOR_POINTING_HAND);
@@ -420,6 +451,14 @@ String Input::get_joy_name(int p_idx) {
420451
return joy_names[p_idx].name;
421452
}
422453

454+
bool Input::get_joy_sensors_enabled(int p_device) const {
455+
if (joy_motion.has(p_device)) {
456+
return joy_motion[p_device].enabled;
457+
} else {
458+
return false;
459+
}
460+
}
461+
423462
Vector2 Input::get_joy_vibration_strength(int p_device) {
424463
if (joy_vibration.has(p_device)) {
425464
return Vector2(joy_vibration[p_device].weak_magnitude, joy_vibration[p_device].strong_magnitude);
@@ -528,6 +567,33 @@ Vector3 Input::get_gyroscope() const {
528567
return gyroscope;
529568
}
530569

570+
Vector3 Input::get_joy_gravity(int p_device) const {
571+
_THREAD_SAFE_METHOD_
572+
if (joy_motion.has(p_device)) {
573+
return joy_motion[p_device].gravity;
574+
} else {
575+
return Vector3();
576+
}
577+
}
578+
579+
Vector3 Input::get_joy_accelerometer(int p_device) const {
580+
_THREAD_SAFE_METHOD_
581+
if (joy_motion.has(p_device)) {
582+
return joy_motion[p_device].accelerometer;
583+
} else {
584+
return Vector3();
585+
}
586+
}
587+
588+
Vector3 Input::get_joy_gyroscope(int p_device) const {
589+
_THREAD_SAFE_METHOD_
590+
if (joy_motion.has(p_device)) {
591+
return joy_motion[p_device].gyroscope;
592+
} else {
593+
return Vector3();
594+
}
595+
}
596+
531597
void Input::_parse_input_event_impl(const Ref<InputEvent> &p_event, bool p_is_emulated) {
532598
// This function does the final delivery of the input event to user land.
533599
// Regardless where the event came from originally, this has to happen on the main thread.
@@ -791,6 +857,15 @@ void Input::start_joy_vibration(int p_device, float p_weak_magnitude, float p_st
791857
joy_vibration[p_device] = vibration;
792858
}
793859

860+
void Input::set_joy_sensors_enabled(int p_device, bool p_enabled) {
861+
joy_motion[p_device].enabled = p_enabled;
862+
if (!p_enabled) {
863+
joy_motion[p_device].gravity = Vector3();
864+
joy_motion[p_device].accelerometer = Vector3();
865+
joy_motion[p_device].gyroscope = Vector3();
866+
}
867+
}
868+
794869
void Input::stop_joy_vibration(int p_device) {
795870
_THREAD_SAFE_METHOD_
796871
VibrationInfo vibration;
@@ -829,6 +904,138 @@ void Input::set_gyroscope(const Vector3 &p_gyroscope) {
829904
gyroscope = p_gyroscope;
830905
}
831906

907+
void Input::set_joy_gravity(int p_device, const Vector3 &p_gravity) {
908+
_THREAD_SAFE_METHOD_
909+
910+
joy_motion[p_device].gravity = p_gravity;
911+
}
912+
913+
void Input::set_joy_accelerometer(int p_device, const Vector3 &p_accel) {
914+
_THREAD_SAFE_METHOD_
915+
916+
joy_motion[p_device].accelerometer = p_accel;
917+
}
918+
919+
void Input::set_joy_gyroscope(int p_device, const Vector3 &p_gyroscope) {
920+
_THREAD_SAFE_METHOD_
921+
922+
joy_motion[p_device].gyroscope = p_gyroscope;
923+
}
924+
925+
Input::JoyAdaptiveTriggerMode Input::get_joy_adaptive_trigger_mode(int p_device, JoyAxis p_axis) const {
926+
_THREAD_SAFE_METHOD_
927+
928+
if (p_axis == JoyAxis::TRIGGER_LEFT && joy_ad_trig.has(p_device)) {
929+
return joy_ad_trig[p_device].l_mode;
930+
} else if (p_axis == JoyAxis::TRIGGER_RIGHT && joy_ad_trig.has(p_device)) {
931+
return joy_ad_trig[p_device].r_mode;
932+
} else {
933+
return JOY_ADAPTIVE_TRIGGER_MODE_OFF;
934+
}
935+
}
936+
937+
void Input::set_joy_adaptive_trigger_mode(int p_device, JoyAxis p_axis, Input::JoyAdaptiveTriggerMode p_mode) {
938+
_THREAD_SAFE_METHOD_
939+
940+
if (p_axis == JoyAxis::TRIGGER_LEFT) {
941+
joy_ad_trig[p_device].l_mode = p_mode;
942+
} else if (p_axis == JoyAxis::TRIGGER_RIGHT) {
943+
joy_ad_trig[p_device].r_mode = p_mode;
944+
}
945+
}
946+
947+
Vector2 Input::get_joy_adaptive_trigger_strength(int p_device, JoyAxis p_axis) const {
948+
_THREAD_SAFE_METHOD_
949+
950+
if (p_axis == JoyAxis::TRIGGER_LEFT && joy_ad_trig.has(p_device)) {
951+
return joy_ad_trig[p_device].l_strength;
952+
} else if (p_axis == JoyAxis::TRIGGER_RIGHT && joy_ad_trig.has(p_device)) {
953+
return joy_ad_trig[p_device].r_strength;
954+
} else {
955+
return Vector2();
956+
}
957+
}
958+
959+
void Input::set_joy_adaptive_trigger_strength(int p_device, JoyAxis p_axis, const Vector2 &p_strength) {
960+
_THREAD_SAFE_METHOD_
961+
962+
if (p_axis == JoyAxis::TRIGGER_LEFT) {
963+
joy_ad_trig[p_device].l_strength = p_strength;
964+
} else if (p_axis == JoyAxis::TRIGGER_RIGHT) {
965+
joy_ad_trig[p_device].r_strength = p_strength;
966+
}
967+
}
968+
969+
Vector2 Input::get_joy_adaptive_trigger_position(int p_device, JoyAxis p_axis) const {
970+
_THREAD_SAFE_METHOD_
971+
972+
if (p_axis == JoyAxis::TRIGGER_LEFT && joy_ad_trig.has(p_device)) {
973+
return joy_ad_trig[p_device].l_position;
974+
} else if (p_axis == JoyAxis::TRIGGER_RIGHT && joy_ad_trig.has(p_device)) {
975+
return joy_ad_trig[p_device].r_position;
976+
} else {
977+
return Vector2();
978+
}
979+
}
980+
981+
void Input::set_joy_adaptive_trigger_position(int p_device, JoyAxis p_axis, const Vector2 &p_position) {
982+
_THREAD_SAFE_METHOD_
983+
984+
if (p_axis == JoyAxis::TRIGGER_LEFT) {
985+
joy_ad_trig[p_device].l_position = p_position;
986+
} else if (p_axis == JoyAxis::TRIGGER_RIGHT) {
987+
joy_ad_trig[p_device].r_position = p_position;
988+
}
989+
}
990+
991+
Input::JoyBatteryState Input::get_joy_battery_state(int p_device) const {
992+
_THREAD_SAFE_METHOD_
993+
994+
if (joy_info.has(p_device)) {
995+
return joy_info[p_device].batt_state;
996+
} else {
997+
return JOY_BATTERY_STATE_UNKNOWN;
998+
}
999+
}
1000+
1001+
void Input::set_joy_battery_state(int p_device, Input::JoyBatteryState p_state) {
1002+
_THREAD_SAFE_METHOD_
1003+
1004+
joy_info[p_device].batt_state = p_state;
1005+
}
1006+
1007+
float Input::get_joy_battery_level(int p_device) const {
1008+
_THREAD_SAFE_METHOD_
1009+
1010+
if (joy_info.has(p_device)) {
1011+
return joy_info[p_device].batt_level;
1012+
} else {
1013+
return 0.0;
1014+
}
1015+
}
1016+
1017+
void Input::set_joy_battery_level(int p_device, float p_level) {
1018+
_THREAD_SAFE_METHOD_
1019+
1020+
joy_info[p_device].batt_level = p_level;
1021+
}
1022+
1023+
Color Input::get_joy_light(int p_device) const {
1024+
_THREAD_SAFE_METHOD_
1025+
1026+
if (joy_info.has(p_device)) {
1027+
return joy_info[p_device].light;
1028+
} else {
1029+
return Color();
1030+
}
1031+
}
1032+
1033+
void Input::set_joy_light(int p_device, Color p_color) {
1034+
_THREAD_SAFE_METHOD_
1035+
1036+
joy_info[p_device].light = p_color;
1037+
}
1038+
8321039
void Input::set_mouse_position(const Point2 &p_posf) {
8331040
mouse_pos = p_posf;
8341041
}

core/input/input.h

+73
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,21 @@ class Input : public Object {
5555
MOUSE_MODE_CONFINED_HIDDEN,
5656
};
5757

58+
enum JoyAdaptiveTriggerMode {
59+
JOY_ADAPTIVE_TRIGGER_MODE_OFF,
60+
JOY_ADAPTIVE_TRIGGER_MODE_FEEDBACK,
61+
JOY_ADAPTIVE_TRIGGER_MODE_WEAPON,
62+
JOY_ADAPTIVE_TRIGGER_MODE_VIBRATION,
63+
JOY_ADAPTIVE_TRIGGER_MODE_SLOPE_FEEDBACK,
64+
};
65+
66+
enum JoyBatteryState {
67+
JOY_BATTERY_STATE_UNKNOWN,
68+
JOY_BATTERY_STATE_DISCHARGING,
69+
JOY_BATTERY_STATE_CHARGING,
70+
JOY_BATTERY_STATE_FULL,
71+
};
72+
5873
#undef CursorShape
5974
enum CursorShape {
6075
CURSOR_ARROW,
@@ -142,6 +157,33 @@ class Input : public Object {
142157

143158
HashMap<int, VibrationInfo> joy_vibration;
144159

160+
struct MotionInfo {
161+
Vector3 gravity;
162+
Vector3 accelerometer;
163+
Vector3 gyroscope;
164+
bool enabled = false;
165+
};
166+
HashMap<int, MotionInfo> joy_motion;
167+
168+
struct AdaptiveTriggersInfo {
169+
JoyAdaptiveTriggerMode l_mode = JOY_ADAPTIVE_TRIGGER_MODE_OFF;
170+
Vector2 l_strength;
171+
Vector2 l_position;
172+
173+
JoyAdaptiveTriggerMode r_mode = JOY_ADAPTIVE_TRIGGER_MODE_OFF;
174+
Vector2 r_strength;
175+
Vector2 r_position;
176+
};
177+
HashMap<int, AdaptiveTriggersInfo> joy_ad_trig;
178+
179+
struct MiscInfo {
180+
JoyBatteryState batt_state = JOY_BATTERY_STATE_UNKNOWN;
181+
float batt_level = 0.0;
182+
Color light;
183+
};
184+
185+
HashMap<int, MiscInfo> joy_info;
186+
145187
struct VelocityTrack {
146188
uint64_t last_tick = 0;
147189
Vector2 velocity;
@@ -302,6 +344,10 @@ class Input : public Object {
302344
Vector3 get_magnetometer() const;
303345
Vector3 get_gyroscope() const;
304346

347+
Vector3 get_joy_gravity(int p_device) const;
348+
Vector3 get_joy_accelerometer(int p_device) const;
349+
Vector3 get_joy_gyroscope(int p_device) const;
350+
305351
Point2 get_mouse_position() const;
306352
Vector2 get_last_mouse_velocity();
307353
Vector2 get_last_mouse_screen_velocity();
@@ -318,10 +364,35 @@ class Input : public Object {
318364
void set_gyroscope(const Vector3 &p_gyroscope);
319365
void set_joy_axis(int p_device, JoyAxis p_axis, float p_value);
320366

367+
void set_joy_gravity(int p_device, const Vector3 &p_gravity);
368+
void set_joy_accelerometer(int p_device, const Vector3 &p_accel);
369+
void set_joy_gyroscope(int p_device, const Vector3 &p_gyroscope);
370+
371+
JoyAdaptiveTriggerMode get_joy_adaptive_trigger_mode(int p_device, JoyAxis p_axis) const;
372+
void set_joy_adaptive_trigger_mode(int p_device, JoyAxis p_axis, JoyAdaptiveTriggerMode p_mode);
373+
374+
Vector2 get_joy_adaptive_trigger_strength(int p_device, JoyAxis p_axis) const;
375+
void set_joy_adaptive_trigger_strength(int p_device, JoyAxis p_axis, const Vector2 &p_strength);
376+
377+
Vector2 get_joy_adaptive_trigger_position(int p_device, JoyAxis p_axis) const;
378+
void set_joy_adaptive_trigger_position(int p_device, JoyAxis p_axis, const Vector2 &p_position);
379+
380+
JoyBatteryState get_joy_battery_state(int p_device) const;
381+
void set_joy_battery_state(int p_device, JoyBatteryState p_state);
382+
383+
float get_joy_battery_level(int p_device) const;
384+
void set_joy_battery_level(int p_device, float p_level);
385+
386+
Color get_joy_light(int p_device) const;
387+
void set_joy_light(int p_device, Color p_color);
388+
321389
void start_joy_vibration(int p_device, float p_weak_magnitude, float p_strong_magnitude, float p_duration = 0);
322390
void stop_joy_vibration(int p_device);
323391
void vibrate_handheld(int p_duration_ms = 500);
324392

393+
bool get_joy_sensors_enabled(int p_device) const;
394+
void set_joy_sensors_enabled(int p_device, bool p_enabled);
395+
325396
void set_mouse_position(const Point2 &p_posf);
326397

327398
void action_press(const StringName &p_action, float p_strength = 1.f);
@@ -370,6 +441,8 @@ class Input : public Object {
370441
};
371442

372443
VARIANT_ENUM_CAST(Input::MouseMode);
444+
VARIANT_ENUM_CAST(Input::JoyAdaptiveTriggerMode);
445+
VARIANT_ENUM_CAST(Input::JoyBatteryState);
373446
VARIANT_ENUM_CAST(Input::CursorShape);
374447

375448
#endif // INPUT_H

core/input/input_enums.h

+4
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,10 @@ enum class JoyAxis {
5656
TRIGGER_LEFT = 4,
5757
TRIGGER_RIGHT = 5,
5858
SDL_MAX = 6,
59+
PRIMARY_FINGER_X = 6,
60+
PRIMARY_FINGER_Y = 7,
61+
SECONDARY_FINGER_X = 8,
62+
SECONDARY_FINGER_Y = 9,
5963
MAX = 10, // OpenVR supports up to 5 Joysticks making a total of 10 axes.
6064
};
6165

0 commit comments

Comments
 (0)