17#include "OgcInputDriver.h"
18#include "../Platform.h"
19#include "OgcInputUtil.h"
20#include "../InputController.h"
26static uint32_t MapPADToGeneric(uint32_t pad_btns) {
27 uint32_t mask = INPUT_BTN_NONE;
28 if (pad_btns & PAD_BUTTON_A) mask |= INPUT_BTN_A;
29 if (pad_btns & PAD_BUTTON_B) mask |= INPUT_BTN_B;
30 if (pad_btns & PAD_BUTTON_X) mask |= INPUT_BTN_X;
31 if (pad_btns & PAD_BUTTON_Y) mask |= INPUT_BTN_Y;
32 if (pad_btns & PAD_BUTTON_UP) mask |= INPUT_BTN_UP;
33 if (pad_btns & PAD_BUTTON_DOWN) mask |= INPUT_BTN_DOWN;
34 if (pad_btns & PAD_BUTTON_LEFT) mask |= INPUT_BTN_LEFT;
35 if (pad_btns & PAD_BUTTON_RIGHT) mask |= INPUT_BTN_RIGHT;
36 if (pad_btns & PAD_BUTTON_START) mask |= INPUT_BTN_PLUS;
37 if (pad_btns & PAD_TRIGGER_L) mask |= INPUT_TRIGGER_L;
38 if (pad_btns & PAD_TRIGGER_R) mask |= INPUT_TRIGGER_R;
39 if (pad_btns & PAD_TRIGGER_Z) mask |= INPUT_TRIGGER_ZR;
43OgcInputDriver::OgcInputDriver() {
44 for (
int i = 0; i < 4; i++) {
45 rumbleRequest[i] = continuousRumble[i] =
false;
46 menuRumbleFrames[i] = continuousRumbleCount[i] = silenceFrames[i] = menuRumbleGapFrames[i] = 0;
50OgcInputDriver::~OgcInputDriver() {
57 InitUserInputControllers();
61 for (
int i = 0; i < 4; i++) {
63 PAD_ControlMotor(i, PAD_MOTOR_STOP);
64 rumbleRequest[i] = continuousRumble[i] =
false;
65 menuRumbleFrames[i] = continuousRumbleCount[i] = silenceFrames[i] = menuRumbleGapFrames[i] = 0;
70 if (channel >= 0 && channel < 4) {
71 rumbleRequest[channel] = rumble;
76 if (channel >= 0 && channel < 4) continuousRumble[channel] = continuous;
82 u32 activeGamecubePads = PAD_ScanPads();
85 for(
int i = 3; i >= 0; i--) {
88 bool gamecubeActive = (activeGamecubePads & (1 << i)) != 0;
92 padData.
hw_buttons_d[INPUT_HW_GAMECUBE] = MapPADToGeneric(PAD_ButtonsDown(i));
93 padData.
hw_buttons_h[INPUT_HW_GAMECUBE] = MapPADToGeneric(PAD_ButtonsHeld(i));
94 padData.
hw_buttons_r[INPUT_HW_GAMECUBE] = MapPADToGeneric(PAD_ButtonsUp(i));
95 padData.
hw_stickX[INPUT_HW_GAMECUBE] = OgcStickToFloat(PAD_StickX(i));
96 padData.
hw_stickY[INPUT_HW_GAMECUBE] = OgcStickToFloat(PAD_StickY(i));
97 padData.
hw_substickX[INPUT_HW_GAMECUBE] = OgcStickToFloat(PAD_SubStickX(i));
98 padData.
hw_substickY[INPUT_HW_GAMECUBE] = OgcStickToFloat(PAD_SubStickY(i));
99 padData.
hw_triggerL[INPUT_HW_GAMECUBE] = OgcClampf((
float)PAD_TriggerL(i) / 255.0f, 0.0f, 1.0f);
100 padData.
hw_triggerR[INPUT_HW_GAMECUBE] = OgcClampf((
float)PAD_TriggerR(i) / 255.0f, 0.0f, 1.0f);
107 for (uint32_t hw = 0; hw < INPUT_HW_MAX; hw++) {
124 if (std::abs(padData.
hw_yaw[hw]) > std::abs(padData.
yaw)) padData.
yaw = padData.
hw_yaw[hw];
128 controller[i]->update(padData, platform->getVideo()->getDeltaTime());
131 static constexpr int kMenuRumbleOnFrames = 2;
132 static constexpr int kMenuRumbleGapFrames = 6;
134 if (rumbleRequest[i]) {
135 rumbleRequest[i] =
false;
136 if (menuRumbleFrames[i] == 0 && menuRumbleGapFrames[i] == 0) {
137 menuRumbleFrames[i] = kMenuRumbleOnFrames;
141 bool menuWantRumble = menuRumbleFrames[i] > 0;
143 if (menuRumbleFrames[i] > 0) {
144 menuRumbleFrames[i]--;
145 if (menuRumbleFrames[i] == 0) menuRumbleGapFrames[i] = kMenuRumbleGapFrames;
146 }
else if (menuRumbleGapFrames[i] > 0) {
147 menuRumbleGapFrames[i]--;
150 bool wantRumble = menuWantRumble || continuousRumble[i];
151 bool motorOn =
false;
155 if (silenceFrames[i] > 0) {
157 continuousRumbleCount[i] = 0;
159 if (wantRumble && allowRumble) {
160 continuousRumbleCount[i]++;
161 if (continuousRumbleCount[i] > 70) {
162 silenceFrames[i] = 5;
163 continuousRumbleCount[i] = 0;
168 continuousRumbleCount[i] = 0;
174 if (gamecubeActive) {
175 PAD_ControlMotor(i, motorOn ? PAD_MOTOR_RUMBLE : PAD_MOTOR_STOP);