mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-01-31 10:01:26 +02:00
InputCommon: Add support for SDL gamecontroller rumble triggers.
This commit is contained in:
parent
fb512adc5f
commit
8354279aae
@ -187,11 +187,13 @@ private:
|
|||||||
};
|
};
|
||||||
|
|
||||||
// Rumble
|
// Rumble
|
||||||
class Motor : public Output
|
class Rumble : public Output
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
Motor(const char* name, GameController& gc, Uint16* state)
|
using UpdateCallback = void (GameController::*)(void);
|
||||||
: m_name{name}, m_gc{gc}, m_state{*state}
|
|
||||||
|
Rumble(const char* name, GameController& gc, Uint16* state, UpdateCallback update_callback)
|
||||||
|
: m_name{name}, m_gc{gc}, m_state{*state}, m_update_callback{update_callback}
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
std::string GetName() const override { return m_name; }
|
std::string GetName() const override { return m_name; }
|
||||||
@ -202,23 +204,24 @@ private:
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
m_state = new_state;
|
m_state = new_state;
|
||||||
m_gc.UpdateRumble();
|
(m_gc.*m_update_callback)();
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
const char* const m_name;
|
const char* const m_name;
|
||||||
GameController& m_gc;
|
GameController& m_gc;
|
||||||
Uint16& m_state;
|
Uint16& m_state;
|
||||||
|
UpdateCallback const m_update_callback;
|
||||||
};
|
};
|
||||||
|
|
||||||
class CombinedMotor : public Output
|
class CombinedMotor : public Output
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
CombinedMotor(const char* name, GameController& gc, Uint16* low_state, Uint16* high_state)
|
CombinedMotor(GameController& gc, Uint16* low_state, Uint16* high_state)
|
||||||
: m_name{name}, m_gc{gc}, m_low_state{*low_state}, m_high_state{*high_state}
|
: m_gc{gc}, m_low_state{*low_state}, m_high_state{*high_state}
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
std::string GetName() const override { return m_name; }
|
std::string GetName() const override { return "Motor"; }
|
||||||
void SetState(ControlState state) override
|
void SetState(ControlState state) override
|
||||||
{
|
{
|
||||||
const auto new_state = state * std::numeric_limits<Uint16>::max();
|
const auto new_state = state * std::numeric_limits<Uint16>::max();
|
||||||
@ -231,7 +234,6 @@ private:
|
|||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
const char* const m_name;
|
|
||||||
GameController& m_gc;
|
GameController& m_gc;
|
||||||
Uint16& m_low_state;
|
Uint16& m_low_state;
|
||||||
Uint16& m_high_state;
|
Uint16& m_high_state;
|
||||||
@ -395,9 +397,18 @@ private:
|
|||||||
RUMBLE_LENGTH_MS);
|
RUMBLE_LENGTH_MS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void UpdateRumbleTriggers()
|
||||||
|
{
|
||||||
|
SDL_GameControllerRumbleTriggers(m_gamecontroller, m_trigger_l_rumble, m_trigger_r_rumble,
|
||||||
|
RUMBLE_LENGTH_MS);
|
||||||
|
}
|
||||||
|
|
||||||
Uint16 m_low_freq_rumble = 0;
|
Uint16 m_low_freq_rumble = 0;
|
||||||
Uint16 m_high_freq_rumble = 0;
|
Uint16 m_high_freq_rumble = 0;
|
||||||
|
|
||||||
|
Uint16 m_trigger_l_rumble = 0;
|
||||||
|
Uint16 m_trigger_r_rumble = 0;
|
||||||
|
|
||||||
SDL_GameController* const m_gamecontroller;
|
SDL_GameController* const m_gamecontroller;
|
||||||
std::string m_name;
|
std::string m_name;
|
||||||
SDL_Joystick* const m_joystick;
|
SDL_Joystick* const m_joystick;
|
||||||
@ -788,9 +799,16 @@ GameController::GameController(SDL_GameController* const gamecontroller,
|
|||||||
// Rumble
|
// Rumble
|
||||||
if (SDL_GameControllerHasRumble(m_gamecontroller))
|
if (SDL_GameControllerHasRumble(m_gamecontroller))
|
||||||
{
|
{
|
||||||
AddOutput(new CombinedMotor("Motor", *this, &m_low_freq_rumble, &m_high_freq_rumble));
|
AddOutput(new CombinedMotor(*this, &m_low_freq_rumble, &m_high_freq_rumble));
|
||||||
AddOutput(new Motor("Motor L", *this, &m_low_freq_rumble));
|
AddOutput(new Rumble("Motor L", *this, &m_low_freq_rumble, &GameController::UpdateRumble));
|
||||||
AddOutput(new Motor("Motor R", *this, &m_high_freq_rumble));
|
AddOutput(new Rumble("Motor R", *this, &m_high_freq_rumble, &GameController::UpdateRumble));
|
||||||
|
}
|
||||||
|
if (SDL_GameControllerHasRumbleTriggers(m_gamecontroller))
|
||||||
|
{
|
||||||
|
AddOutput(new Rumble("Trigger L", *this, &m_trigger_l_rumble,
|
||||||
|
&GameController::UpdateRumbleTriggers));
|
||||||
|
AddOutput(new Rumble("Trigger R", *this, &m_trigger_r_rumble,
|
||||||
|
&GameController::UpdateRumbleTriggers));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Touchpad
|
// Touchpad
|
||||||
|
Loading…
Reference in New Issue
Block a user