6 Commits
Author SHA1 Message Date
str1k3r 0c24c663ef merge upstream 2026-08-15 22:58:27 +00:00
str1k3r 842fb91443 fix: shaders not building 2026-08-15 18:56:00 -04:00
str1k3r 88a26c82a6 feat: gamecube type 2026-08-09 03:07:36 -04:00
str1k3r 26a297f1de fix: main pad idx not swapping when controller disconnects 2026-08-09 02:02:37 -04:00
str1k3r a9df365c5c feat: combine all switch types into one 2026-08-08 22:44:09 -04:00
str1k3r fdef90f8e7 feat: controller type polling 2026-08-08 22:23:45 -04:00
5 changed files with 113 additions and 14 deletions
+17
View File
@@ -165,6 +165,23 @@ void C_4JInput::GetText(uint16_t *UTF16String)
InternalKeyboard.GetText(UTF16String);
}
const char* C_4JInput::PollControllerType(int ipad) {
const char* GamepadType = InternalInputManager.GetGamepadType(ipad);
if (!GamepadType)
return "UNKNOWN";
if (strcmp(GamepadType, "SWITCH_PRO") == 0 ||
strcmp(GamepadType, "JOYCON_PAIR") == 0 ||
strcmp(GamepadType, "JOYCON_L") == 0 ||
strcmp(GamepadType, "JOYCON_R") == 0)
{
return "SWITCH";
}
return GamepadType; // str1k3r - if not one of the switch types, return the type itself
}
bool C_4JInput::VerifyStrings(WCHAR **pwStringA, int iStringC, int (*Func)(LPVOID, STRING_VERIFY_RESPONSE *), LPVOID lpParam)
{
return true;
+69 -10
View File
@@ -317,6 +317,16 @@ unsigned int CInput::GetGameJoypadMaps(unsigned char ucMap, unsigned char ucActi
return m_JoypadMap[ucMap][ucAction];
}
const char* CInput::GetGamepadType(int iPad)
{
if (!m_Joypads[iPad].m_pGamepad)
{
return "UNKNOWN";
}
return GamepadTypeName(SDL_GetGamepadType(m_Joypads[iPad].m_pGamepad));
}
void CInput::SetJoypadMapVal(int iPad, unsigned char ucMap)
{
m_bJoypadMapArrayIsSetup = true;
@@ -637,23 +647,72 @@ void CInput::HandleGamepadEvents()
}
break;
case SDL_EVENT_GAMEPAD_REMOVED:
for (int i = 0; i < MAX_JOYPADS; i++)
{
if (m_Joypads[i].m_pGamepad &&
SDL_GetGamepadID(m_Joypads[i].m_pGamepad) == event.gdevice.which)
{
SDL_CloseGamepad(m_Joypads[i].m_pGamepad);
m_Joypads[i].m_pGamepad = nullptr;
m_Joypads[i].m_bIsConnected = false;
{
int removedIndex = -1;
break;
for (int i = 0; i < MAX_JOYPADS; i++)
{
if (m_Joypads[i].m_pGamepad &&
SDL_GetGamepadID(m_Joypads[i].m_pGamepad) == event.gdevice.which)
{
SDL_CloseGamepad(m_Joypads[i].m_pGamepad);
m_Joypads[i].m_pGamepad = nullptr;
m_Joypads[i].m_bIsConnected = false;
removedIndex = i;
break;
}
}
if (removedIndex == 0)
{
for (int i = 1; i < MAX_JOYPADS; i++)
{
if (m_Joypads[i].m_bIsConnected && m_Joypads[i].m_pGamepad)
{
ShiftGamepadData(0, i);
SDL_SetGamepadPlayerIndex(m_Joypads[0].m_pGamepad, 0);
ClearGamepadSlot(i);
break;
}
}
}
break;
}
break;
}
}
}
void CInput::ShiftGamepadData(int destIndex, int srcIndex)
{
m_Joypads[destIndex] = m_Joypads[srcIndex];
m_Joypads[destIndex].m_pfLeftThumbXAxisMap = &m_Joypads[destIndex].m_fNormalizedLeftThumbX;
m_Joypads[destIndex].m_pfLeftThumbYAxisMap = &m_Joypads[destIndex].m_fNormalizedLeftThumbY;
m_Joypads[destIndex].m_pfRightThumbXAxisMap = &m_Joypads[destIndex].m_fNormalizedRightThumbX;
m_Joypads[destIndex].m_pfRightThumbYAxisMap = &m_Joypads[destIndex].m_fNormalizedRightThumbY;
m_Joypads[destIndex].m_pucLeftTriggerAxisMap = &m_Joypads[destIndex].m_ucLeftTriggerState;
m_Joypads[destIndex].m_pucRightTriggerAxisMap = &m_Joypads[destIndex].m_ucRightTriggerState;
}
void CInput::ClearGamepadSlot(int index)
{
m_Joypads[index].m_pGamepad = nullptr;
m_Joypads[index].m_bIsConnected = false;
m_Joypads[index].m_uiButtons = 0;
m_Joypads[index].m_ucInputStateIndex = -1;
m_Joypads[index].m_ucLeftTriggerState = 0;
m_Joypads[index].m_ucRightTriggerState = 0;
m_Joypads[index].m_iRightThumbX = 0;
m_Joypads[index].m_iRightThumbY = 0;
m_Joypads[index].m_pfLeftThumbXAxisMap = &m_Joypads[index].m_fNormalizedLeftThumbX;
m_Joypads[index].m_pfLeftThumbYAxisMap = &m_Joypads[index].m_fNormalizedLeftThumbY;
m_Joypads[index].m_pfRightThumbXAxisMap = &m_Joypads[index].m_fNormalizedRightThumbX;
m_Joypads[index].m_pfRightThumbYAxisMap = &m_Joypads[index].m_fNormalizedRightThumbY;
m_Joypads[index].m_pucLeftTriggerAxisMap = &m_Joypads[index].m_ucLeftTriggerState;
m_Joypads[index].m_pucRightTriggerAxisMap = &m_Joypads[index].m_ucRightTriggerState;
}
bool CInput::UpdateJoypads()
{
assert(m_bJoypadMapArrayIsSetup);
+23
View File
@@ -31,6 +31,26 @@ SOFTWARE.
class CInput
{
private:
const char* GamepadTypeName(SDL_GamepadType type)
{
switch (type)
{
case SDL_GAMEPAD_TYPE_UNKNOWN: return "UNKNOWN";
case SDL_GAMEPAD_TYPE_GAMECUBE: return "GAMECUBE";
case SDL_GAMEPAD_TYPE_STANDARD: return "STANDARD";
case SDL_GAMEPAD_TYPE_XBOX360: return "XBOX360";
case SDL_GAMEPAD_TYPE_XBOXONE: return "XBOXONE";
case SDL_GAMEPAD_TYPE_PS3: return "PS3";
case SDL_GAMEPAD_TYPE_PS4: return "PS4";
case SDL_GAMEPAD_TYPE_PS5: return "PS5";
case SDL_GAMEPAD_TYPE_NINTENDO_SWITCH_PRO: return "SWITCH_PRO";
case SDL_GAMEPAD_TYPE_NINTENDO_SWITCH_JOYCON_LEFT: return "JOYCON_L";
case SDL_GAMEPAD_TYPE_NINTENDO_SWITCH_JOYCON_RIGHT: return "JOYCON_R";
case SDL_GAMEPAD_TYPE_NINTENDO_SWITCH_JOYCON_PAIR: return "JOYCON_PAIR";
default: return "UNKNOWN";
}
}
public:
struct JOYPAD
{
@@ -101,6 +121,7 @@ public:
void SetGameJoypadMaps(unsigned char ucMap, unsigned char ucAction, unsigned int uiActionVal);
unsigned int GetGameJoypadMaps(unsigned char ucMap, unsigned char ucAction);
const char* GetGamepadType(int iPad);
void SetJoypadMapVal(int iPad, unsigned char ucMap);
unsigned char GetJoypadMapVal(int iPad);
@@ -137,6 +158,8 @@ public:
FLOAT GetIdleSeconds(int iPad);
void HandleGamepadEvents();
void ShiftGamepadData(int destIndex, int srcIndex);
void ClearGamepadSlot(int index);
bool UpdateJoypads(void);
void ClearJoypadValues(JOYPAD *pThisPad);
+3 -4
View File
@@ -160,10 +160,6 @@
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
<PreLinkEvent>
<Command>
</Command>
</PreLinkEvent>
<PreBuildEvent>
<Command>./Windows64/shaders/build.bat</Command>
</PreBuildEvent>
@@ -208,6 +204,9 @@
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
</Link>
<PreBuildEvent>
<Command>./Windows64/shaders/build.bat</Command>
</PreBuildEvent>
</ItemDefinitionGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
+1
View File
@@ -135,6 +135,7 @@ public:
EKeyboardResult RequestKeyboard(LPCWSTR Title, LPCWSTR Text, DWORD dwPad, UINT uiMaxChars, int( *Func)(LPVOID,const bool),LPVOID lpParam,C_4JInput::EKeyboardMode eMode);
void DestroyKeyboard();
void GetText(uint16_t *UTF16String);
const char* PollControllerType(int ipad);
void SetLostInputControlCallback(void( *Func)(LPVOID, bool),LPVOID lpParam);