diff --git a/ISLE/isleapp.cpp b/ISLE/isleapp.cpp index 585134a0..6d1c0a99 100644 --- a/ISLE/isleapp.cpp +++ b/ISLE/isleapp.cpp @@ -95,6 +95,11 @@ MxFloat g_lastJoystickMouseY = 0; MxFloat g_lastMouseX = 320; MxFloat g_lastMouseY = 240; +bool g_dpadUp = false; +bool g_dpadDown = false; +bool g_dpadLeft = false; +bool g_dpadRight = false; + // STRING: ISLE 0x4101dc #define WINDOW_TITLE "LEGO®" @@ -466,17 +471,73 @@ SDL_AppResult SDL_AppEvent(void* appstate, SDL_Event* event) break; } case SDL_EVENT_GAMEPAD_BUTTON_DOWN: { - { - if (event->gbutton.button == SDL_GAMEPAD_BUTTON_SOUTH) { - if (InputManager()) { - InputManager()->QueueEvent(c_notificationKeyPress, SDLK_SPACE, 0, 0, SDLK_SPACE); - } + switch (event->gbutton.button) { + case SDL_GAMEPAD_BUTTON_DPAD_UP: + g_dpadUp = true; + break; + case SDL_GAMEPAD_BUTTON_DPAD_DOWN: + g_dpadDown = true; + break; + case SDL_GAMEPAD_BUTTON_DPAD_LEFT: + g_dpadLeft = true; + break; + case SDL_GAMEPAD_BUTTON_DPAD_RIGHT: + g_dpadRight = true; + break; + case SDL_GAMEPAD_BUTTON_EAST: + g_mousedown = TRUE; + if (InputManager()) { + InputManager()->QueueEvent( + c_notificationButtonDown, + LegoEventNotificationParam::c_lButtonState, + g_lastMouseX, + g_lastMouseY, + 0 + ); } - if (event->gbutton.button == SDL_GAMEPAD_BUTTON_START) { - if (InputManager()) { - InputManager()->QueueEvent(c_notificationKeyPress, SDLK_ESCAPE, 0, 0, SDLK_ESCAPE); - } + break; + + case SDL_GAMEPAD_BUTTON_SOUTH: + if (InputManager()) { + InputManager()->QueueEvent(c_notificationKeyPress, SDLK_SPACE, 0, 0, SDLK_SPACE); } + break; + + case SDL_GAMEPAD_BUTTON_START: + if (InputManager()) { + InputManager()->QueueEvent(c_notificationKeyPress, SDLK_ESCAPE, 0, 0, SDLK_ESCAPE); + } + break; + } + break; + } + + case SDL_EVENT_GAMEPAD_BUTTON_UP: { + switch (event->gbutton.button) { + case SDL_GAMEPAD_BUTTON_DPAD_UP: + g_dpadUp = false; + break; + case SDL_GAMEPAD_BUTTON_DPAD_DOWN: + g_dpadDown = false; + break; + case SDL_GAMEPAD_BUTTON_DPAD_LEFT: + g_dpadLeft = false; + break; + case SDL_GAMEPAD_BUTTON_DPAD_RIGHT: + g_dpadRight = false; + break; + case SDL_GAMEPAD_BUTTON_EAST: + g_mousedown = FALSE; + if (InputManager()) { + InputManager()->QueueEvent( + c_notificationButtonUp, + LegoEventNotificationParam::c_lButtonState, + g_lastMouseX, + g_lastMouseY, + 0 + ); + } + break; } break; } @@ -1278,11 +1339,31 @@ IDirect3DRMMiniwinDevice* GetD3DRMMiniwinDevice() void IsleApp::MoveVirtualMouseViaJoystick() { - if (g_lastJoystickMouseX != 0 || g_lastJoystickMouseY != 0) { + float dpadX = 0.0f; + float dpadY = 0.0f; + + if (g_dpadLeft) { + dpadX -= m_cursorSensitivity; + } + if (g_dpadRight) { + dpadX += m_cursorSensitivity; + } + if (g_dpadUp) { + dpadY -= m_cursorSensitivity; + } + if (g_dpadDown) { + dpadY += m_cursorSensitivity; + } + + // Use joystick axis if non-zero, else fall back to dpad + float moveX = (g_lastJoystickMouseX != 0) ? g_lastJoystickMouseX : dpadX; + float moveY = (g_lastJoystickMouseY != 0) ? g_lastJoystickMouseY : dpadY; + + if (moveX != 0 || moveY != 0) { g_mousemoved = TRUE; - g_lastMouseX = SDL_clamp(g_lastMouseX + g_lastJoystickMouseX, 0, 640); - g_lastMouseY = SDL_clamp(g_lastMouseY + g_lastJoystickMouseY, 0, 480); + g_lastMouseX = SDL_clamp(g_lastMouseX + moveX, 0, 640); + g_lastMouseY = SDL_clamp(g_lastMouseY + moveY, 0, 480); if (InputManager()) { InputManager()->QueueEvent(