void CGamePad::UpdateState() { #ifdef ION_CONFIG_WINDOWS if (pXInputGetState) { XINPUT_STATE XInputState; if (pXInputGetState(0, & XInputState)) return; LeftTrigger = GamepadTrigger(XInputState.Gamepad.bLeftTrigger); RightTrigger = GamepadTrigger(XInputState.Gamepad.bRightTrigger); LeftStick.X = GamepadStick(XInputState.Gamepad.sThumbLX); LeftStick.Y = GamepadStick(XInputState.Gamepad.sThumbLY); RightStick.X = GamepadStick(XInputState.Gamepad.sThumbRX); RightStick.Y = GamepadStick(XInputState.Gamepad.sThumbRY); ButtonPressed[(int) EGamePadButton::A] = (XInputState.Gamepad.wButtons & XINPUT_GAMEPAD_A) != 0; ButtonPressed[(int) EGamePadButton::B] = (XInputState.Gamepad.wButtons & XINPUT_GAMEPAD_B) != 0; ButtonPressed[(int) EGamePadButton::X] = (XInputState.Gamepad.wButtons & XINPUT_GAMEPAD_X) != 0; ButtonPressed[(int) EGamePadButton::Y] = (XInputState.Gamepad.wButtons & XINPUT_GAMEPAD_Y) != 0; ButtonPressed[(int) EGamePadButton::LeftShoulder] = (XInputState.Gamepad.wButtons & XINPUT_GAMEPAD_LEFT_SHOULDER) != 0; ButtonPressed[(int) EGamePadButton::RightShoulder] = (XInputState.Gamepad.wButtons & XINPUT_GAMEPAD_RIGHT_SHOULDER) != 0; ButtonPressed[(int) EGamePadButton::DPadUp] = (XInputState.Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_UP) != 0; ButtonPressed[(int) EGamePadButton::DPadDown] = (XInputState.Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_DOWN) != 0; ButtonPressed[(int) EGamePadButton::DPadLeft] = (XInputState.Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_LEFT) != 0; ButtonPressed[(int) EGamePadButton::DPadRight] = (XInputState.Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_RIGHT) != 0; ButtonPressed[(int) EGamePadButton::Start] = (XInputState.Gamepad.wButtons & XINPUT_GAMEPAD_START) != 0; ButtonPressed[(int) EGamePadButton::Back] = (XInputState.Gamepad.wButtons & XINPUT_GAMEPAD_BACK) != 0; ButtonPressed[(int) EGamePadButton::LeftThumb] = (XInputState.Gamepad.wButtons & XINPUT_GAMEPAD_LEFT_THUMB) != 0; ButtonPressed[(int) EGamePadButton::RightThumb] = (XInputState.Gamepad.wButtons & XINPUT_GAMEPAD_RIGHT_THUMB) != 0; } #endif }
bool GamepadManager::GetGamepadState(GamepadState* pState) { if (pXInputGetState) { if((NextTryTime == 0) || (GetTickCount() >= NextTryTime)) // If the device is known to be present or if it's time to try testing for it again... { XINPUT_STATE xis; DWORD dwResult = pXInputGetState(0, &xis); // This function is expensive, including if there is no connected device. if(dwResult == ERROR_SUCCESS) { if (xis.dwPacketNumber != LastPadPacketNo) { // State changed. pState->Buttons = xis.Gamepad.wButtons; // Currently matches Xinput pState->LT = GamepadTrigger(xis.Gamepad.bLeftTrigger); pState->RT = GamepadTrigger(xis.Gamepad.bRightTrigger); pState->LX = GamepadStick(xis.Gamepad.sThumbLX); pState->LY = GamepadStick(xis.Gamepad.sThumbLY); pState->RX = GamepadStick(xis.Gamepad.sThumbRX); pState->RY = GamepadStick(xis.Gamepad.sThumbRY); LastPadPacketNo = xis.dwPacketNumber; NextTryTime = 0; return true; } } else if(dwResult == ERROR_DEVICE_NOT_CONNECTED) { // Don't bother wasting time on XInputGetState if one isn't connected, as it's very slow when one isn't connected. // GetTickCount64 is available with Windows Vista+ and doesn't wrap around. // GetTickCount wraps around every 49.7 days since the system started, but we don't need absolute time and it's OK // if we have a false positive which would occur if NextTryTime is set to a value that has wrapped around to zero. NextTryTime = GetTickCount() + 5000; } } } return false; }
int OculusRoomTinyApp::Run() { // Loop processing messages until Quit flag is set, // rendering game scene inside of OnIdle(). while (!Quit) { MSG msg; if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); } else { // Read game-pad. XINPUT_STATE xis; if (pXInputGetState && !pXInputGetState(0, &xis) && (xis.dwPacketNumber != LastPadPacketNo)) { OnGamepad(GamepadStick(xis.Gamepad.sThumbLX), GamepadStick(xis.Gamepad.sThumbLY), GamepadStick(xis.Gamepad.sThumbRX), GamepadStick(xis.Gamepad.sThumbRY)); //pad.LT = GamepadTrigger(xis.Gamepad.bLeftTrigger); LastPadPacketNo = xis.dwPacketNumber; } pApp->OnIdle(); // Keep sleeping when we're minimized. if (IsIconic(hWnd)) Sleep(10); } } return 0; }
/* * IN_Commands */ void IN_Commands( void ) { int i; int buttons, buttonsOld, buttonsDiff; bool trigger, triggerOld; static bool notConnected; static int64_t lastConnectedCheck; if( in_xinput_initialized && in_appactive ) { XINPUT_STATE state; if( notConnected && ( ( Sys_Milliseconds() - lastConnectedCheck ) < 2000 ) ) { // gamepad not connected, and the previous null state has been applied already return; } if( pXInputGetState( 0, &state ) == ERROR_SUCCESS ) { notConnected = false; memcpy( &in_xinput_gamepad, &( state.Gamepad ), sizeof( in_xinput_gamepad ) ); } else { notConnected = true; lastConnectedCheck = Sys_Milliseconds(); memset( &in_xinput_gamepad, 0, sizeof( in_xinput_gamepad ) ); } } buttons = in_xinput_gamepad.wButtons; buttonsOld = in_xinput_oldGamepad.wButtons; buttonsDiff = buttons ^ buttonsOld; if( buttonsDiff ) { const int keys[] = { K_DPAD_UP, K_DPAD_DOWN, K_DPAD_LEFT, K_DPAD_RIGHT, 0, 0, K_LSTICK, K_RSTICK, K_LSHOULDER, K_RSHOULDER, 0, 0, K_A_BUTTON, K_B_BUTTON, K_X_BUTTON, K_Y_BUTTON }; int64_t time = Sys_Milliseconds(); for( i = 0; i < ( sizeof( keys ) / sizeof( keys[0] ) ); i++ ) { if( !keys[i] ) { continue; } if( buttonsDiff & ( 1 << i ) ) { Key_Event( keys[i], ( buttons & ( 1 << i ) ) ? true : false, time ); } } if( buttonsDiff & ( XINPUT_GAMEPAD_START | XINPUT_GAMEPAD_BACK ) ) { if( !( buttonsOld & ( XINPUT_GAMEPAD_START | XINPUT_GAMEPAD_BACK ) ) ) { Key_Event( K_ESCAPE, true, time ); } else if( !( buttons & ( XINPUT_GAMEPAD_START | XINPUT_GAMEPAD_BACK ) ) ) { Key_Event( K_ESCAPE, false, time ); } } } trigger = ( in_xinput_gamepad.bLeftTrigger > XINPUT_GAMEPAD_TRIGGER_THRESHOLD ); triggerOld = ( in_xinput_oldGamepad.bLeftTrigger > XINPUT_GAMEPAD_TRIGGER_THRESHOLD ); if( trigger != triggerOld ) { Key_Event( K_LTRIGGER, trigger, Sys_Milliseconds() ); } trigger = ( in_xinput_gamepad.bRightTrigger > XINPUT_GAMEPAD_TRIGGER_THRESHOLD ); triggerOld = ( in_xinput_oldGamepad.bRightTrigger > XINPUT_GAMEPAD_TRIGGER_THRESHOLD ); if( trigger != triggerOld ) { Key_Event( K_RTRIGGER, trigger, Sys_Milliseconds() ); } memcpy( &in_xinput_oldGamepad, &in_xinput_gamepad, sizeof( in_xinput_gamepad ) ); }