This commit is contained in:
Al. Lopez 2025-04-13 01:29:50 +00:00 committed by GitHub
commit 458fca855f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -209,112 +209,148 @@ static void SetControllerInputDevice(Controller* controller)
} }
} }
static void SetControllerTimeOfDayLED(Controller& controller, bool isNight) static void SetControllerTimeOfDayLED(Controller& ctrl, bool isNight)
{ {
auto r = isNight ? 22 : 0; // Fetch the lightbar color based on the time of day
auto g = isNight ? 0 : 37; uint8_t r = 0, g = 0, b = 0;
auto b = isNight ? 101 : 184;
controller.SetLED(r, g, b); if (isNight)
{
r = 22; // Night: Red tone
g = 0; // Night: No green
b = 101; // Night: Cool blue
}
else
{
r = 0; // Day: No red
g = 0; // Day: No green
b = 60; // Day: Dimmer blue
}
// Apply the lightbar color to the specified controller
if (ctrl.CanPoll())
{
ctrl.SetLED(r, g, b);
}
} }
int HID_OnSDLEvent(void*, SDL_Event* event) int HID_OnSDLEvent(void*, SDL_Event* event)
{ {
switch (event->type) switch (event->type)
{ {
case SDL_CONTROLLERDEVICEADDED: case SDL_CONTROLLERDEVICEADDED:
{
const auto freeIndex = FindFreeController();
if (freeIndex != -1)
{ {
const auto freeIndex = FindFreeController(); // Initialize the new controller
auto controller = Controller(event->cdevice.which);
g_controllers[freeIndex] = controller;
if (freeIndex != -1) // Assign "Player 1 LED" for Player 0 and Player 1
if (freeIndex == 0 || freeIndex == 1) // Player 0 and Player 1 both use "Player 1 LED"
{ {
auto controller = Controller(event->cdevice.which); SDL_GameControllerSetPlayerIndex(controller.controller, 1); // Force Player LED to "Player 1"
}
g_controllers[freeIndex] = controller; else // Additional external controllers (Player 2+)
{
SetControllerTimeOfDayLED(controller, App::s_isWerehog); SDL_GameControllerSetPlayerIndex(controller.controller, freeIndex); // Assign correct LED for Player 2+
} }
break; // Apply lightbar settings immediately for the new controller
} SetControllerTimeOfDayLED(controller, App::s_isWerehog);
case SDL_CONTROLLERDEVICEREMOVED: // Refresh LEDs for all connected controllers
{ for (auto& ctrl : g_controllers)
auto* controller = FindController(event->cdevice.which);
if (controller)
controller->Close();
break;
}
case SDL_CONTROLLERBUTTONDOWN:
case SDL_CONTROLLERBUTTONUP:
case SDL_CONTROLLERAXISMOTION:
case SDL_CONTROLLERTOUCHPADDOWN:
{
auto* controller = FindController(event->cdevice.which);
if (!controller)
break;
if (event->type == SDL_CONTROLLERAXISMOTION)
{ {
if (abs(event->caxis.value) > 8000) if (ctrl.CanPoll())
{ {
SDL_ShowCursor(SDL_DISABLE); SDL_GameControllerSetPlayerIndex(ctrl.controller, ctrl.index); // Ensure correct LED updates
SetControllerInputDevice(controller);
} }
controller->PollAxis();
} }
else }
break;
}
case SDL_CONTROLLERDEVICEREMOVED:
{
auto* controller = FindController(event->cdevice.which);
if (controller)
{
controller->Close();
// If Player 1 disconnects, promote the next available controller to Player 1
if (controller == &g_controllers[1]) // Player 1 removed
{
for (auto& ctrl : g_controllers)
{
if (ctrl.CanPoll() && &ctrl != &g_controllers[0]) // Skip Player 0
{
g_controllers[1] = ctrl; // Promote next available controller to Player 1
SDL_GameControllerSetPlayerIndex(ctrl.controller, 1); // Reflect Player 1 LED
SetControllerTimeOfDayLED(ctrl, App::s_isWerehog); // Update lightbar
break;
}
}
}
// Update Player LED indices for all controllers immediately
for (std::size_t i = 2; i < g_controllers.size(); ++i) // Start from Player 2 onward
{
if (g_controllers[i].CanPoll())
{
SDL_GameControllerSetPlayerIndex(g_controllers[i].controller, static_cast<int>(i)); // Assign correct LED index
SetControllerTimeOfDayLED(g_controllers[i], App::s_isWerehog); // Update lightbars
}
}
// Refresh lightbar settings for all connected controllers
for (auto& ctrl : g_controllers)
{
if (ctrl.CanPoll())
{
SetControllerTimeOfDayLED(ctrl, App::s_isWerehog);
}
}
}
break;
}
case SDL_CONTROLLERBUTTONDOWN:
case SDL_CONTROLLERBUTTONUP:
case SDL_CONTROLLERAXISMOTION:
case SDL_CONTROLLERTOUCHPADDOWN:
{
auto* controller = FindController(event->cdevice.which);
if (!controller)
break;
// Process input
if (event->type == SDL_CONTROLLERAXISMOTION)
{
if (abs(event->caxis.value) > 8000)
{ {
SDL_ShowCursor(SDL_DISABLE); SDL_ShowCursor(SDL_DISABLE);
SetControllerInputDevice(controller); SetControllerInputDevice(controller);
controller->Poll();
} }
break; controller->PollAxis();
} }
else
case SDL_KEYDOWN:
case SDL_KEYUP:
hid::g_inputDevice = hid::EInputDevice::Keyboard;
break;
case SDL_MOUSEMOTION:
case SDL_MOUSEBUTTONDOWN:
case SDL_MOUSEBUTTONUP:
{ {
if (!GameWindow::IsFullscreen() || GameWindow::s_isFullscreenCursorVisible) SDL_ShowCursor(SDL_DISABLE);
SDL_ShowCursor(SDL_ENABLE); SetControllerInputDevice(controller);
hid::g_inputDevice = hid::EInputDevice::Mouse; controller->Poll();
break;
} }
case SDL_WINDOWEVENT: // Instantly apply updated lightbar settings during input
{ SetControllerTimeOfDayLED(*controller, App::s_isWerehog);
if (event->window.event == SDL_WINDOWEVENT_FOCUS_LOST) break;
{ }
// Stop vibrating controllers on focus lost.
for (auto& controller : g_controllers)
controller.SetVibration({ 0, 0 });
}
break;
}
case SDL_USER_EVILSONIC:
{
for (auto& controller : g_controllers)
SetControllerTimeOfDayLED(controller, event->user.code);
break;
}
} }
return 0; return 0;