Esempio n. 1
0
	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
	}
Esempio n. 2
0
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;
}
Esempio n. 4
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 ) );
}