Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
60 changes: 60 additions & 0 deletions core/input/input.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,12 @@ void Input::_bind_methods() {
ClassDB::bind_method(D_METHOD("start_joy_vibration", "device", "weak_magnitude", "strong_magnitude", "duration"), &Input::start_joy_vibration, DEFVAL(0));
ClassDB::bind_method(D_METHOD("stop_joy_vibration", "device"), &Input::stop_joy_vibration);
ClassDB::bind_method(D_METHOD("vibrate_handheld", "duration_ms", "amplitude"), &Input::vibrate_handheld, DEFVAL(500), DEFVAL(-1.0));
ClassDB::bind_method(D_METHOD("constant_force_feedback", "device", "force", "duration"), &Input::constant_force_feedback);
ClassDB::bind_method(D_METHOD("spring_force_feedback", "device", "cw_coef", "ccw_coef", "offset", "duration"), &Input::spring_force_feedback);
ClassDB::bind_method(D_METHOD("friction_force_feedback", "device", "cw_coef", "ccw_coef", "duration"), &Input::friction_force_feedback);
ClassDB::bind_method(D_METHOD("damper_force_feedback", "device", "cw_coef", "ccw_coef", "offset", "duration"), &Input::damper_force_feedback);
ClassDB::bind_method(D_METHOD("inertia_force_feedback", "device", "cw_coef", "ccw_coef", "offset", "duration"), &Input::inertia_force_feedback);
ClassDB::bind_method(D_METHOD("stop_force_feedback", "device"), &Input::stop_force_feedback);
ClassDB::bind_method(D_METHOD("get_gravity"), &Input::get_gravity);
ClassDB::bind_method(D_METHOD("get_accelerometer"), &Input::get_accelerometer);
ClassDB::bind_method(D_METHOD("get_magnetometer"), &Input::get_magnetometer);
Expand Down Expand Up @@ -1250,6 +1256,60 @@ void Input::vibrate_handheld(int p_duration_ms, float p_amplitude) {
OS::get_singleton()->vibrate_handheld(p_duration_ms, p_amplitude);
}

void Input::constant_force_feedback(int p_device, float p_force, float p_duration) {
_THREAD_SAFE_METHOD_
Joypad *joypad = joy_names.getptr(p_device);
if (!joypad || joypad->features == nullptr) {
return;
}
joypad->features->constant_force_feedback(p_force, p_duration);
}

void Input::spring_force_feedback(int p_device, float p_cw_coef, float p_ccw_coef, float p_offset, float p_duration) {
_THREAD_SAFE_METHOD_
Joypad *joypad = joy_names.getptr(p_device);
if (!joypad || joypad->features == nullptr) {
return;
}
joypad->features->spring_force_feedback(p_cw_coef, p_ccw_coef, p_offset, p_duration);
}

void Input::friction_force_feedback(int p_device, float p_cw_coef, float p_ccw_coef, float p_duration) {
_THREAD_SAFE_METHOD_
Joypad *joypad = joy_names.getptr(p_device);
if (!joypad || joypad->features == nullptr) {
return;
}
joypad->features->friction_force_feedback(p_cw_coef, p_ccw_coef, p_duration);
}

void Input::damper_force_feedback(int p_device, float p_cw_coef, float p_ccw_coef, float p_offset, float p_duration) {
_THREAD_SAFE_METHOD_
Joypad *joypad = joy_names.getptr(p_device);
if (!joypad || joypad->features == nullptr) {
return;
}
joypad->features->damper_force_feedback(p_cw_coef, p_ccw_coef, p_offset, p_duration);
}

void Input::inertia_force_feedback(int p_device, float p_cw_coef, float p_ccw_coef, float p_offset, float p_duration) {
_THREAD_SAFE_METHOD_
Joypad *joypad = joy_names.getptr(p_device);
if (!joypad || joypad->features == nullptr) {
return;
}
joypad->features->inertia_force_feedback(p_cw_coef, p_ccw_coef, p_offset, p_duration);
}

void Input::stop_force_feedback(int p_device) {
_THREAD_SAFE_METHOD_
Joypad *joypad = joy_names.getptr(p_device);
if (!joypad || joypad->features == nullptr) {
return;
}
joypad->features->stop_force_feedback();
}

void Input::set_gravity(const Vector3 &p_gravity) {
_THREAD_SAFE_METHOD_

Expand Down
15 changes: 15 additions & 0 deletions core/input/input.h
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,14 @@ class Input : public Object {

virtual bool has_joy_motion_sensors() const { return false; }
virtual void set_joy_motion_sensors_enabled(bool p_enable) {}

// TODO: remove
virtual void constant_force_feedback(float p_force, float p_duration) {}
virtual void spring_force_feedback(float p_cw_coef, float p_ccw_coef, float p_offset, float p_duration) {}
virtual void friction_force_feedback(float p_cw_coef, float p_ccw_coef, float p_duration) {}
virtual void damper_force_feedback(float p_cw_coef, float p_ccw_coef, float p_offset, float p_duration) {}
virtual void inertia_force_feedback(float p_cw_coef, float p_ccw_coef, float p_offset, float p_duration) {}
virtual void stop_force_feedback() {}
};

static constexpr int32_t JOYPADS_MAX = 16;
Expand Down Expand Up @@ -417,6 +425,13 @@ class Input : public Object {
void stop_joy_vibration(int p_device);
void vibrate_handheld(int p_duration_ms = 500, float p_amplitude = -1.0);

void constant_force_feedback(int p_device, float p_force, float p_duration);
void spring_force_feedback(int p_device, float p_cw_coef, float p_ccw_coef, float p_offset, float p_duration);
void friction_force_feedback(int p_device, float p_cw_coef, float p_ccw_coef, float p_duration);
void damper_force_feedback(int p_device, float p_cw_coef, float p_ccw_coef, float p_offset, float p_duration);
void inertia_force_feedback(int p_device, float p_cw_coef, float p_ccw_coef, float p_offset, float p_duration);
void stop_force_feedback(int p_device);

void set_mouse_position(const Point2 &p_posf);

void action_press(const StringName &p_action, float p_strength = 1.f);
Expand Down
Loading
Loading