10 Commits
10 changed files with 685 additions and 34 deletions
+200
View File
@@ -32,6 +32,7 @@ CKeyboard InternalKeyboard;
void C_4JInput::Initialise(int iInputStateC, unsigned char ucMapC, unsigned char ucActionC, unsigned char ucMenuActionC) void C_4JInput::Initialise(int iInputStateC, unsigned char ucMapC, unsigned char ucActionC, unsigned char ucMenuActionC)
{ {
InternalInputManager.Initialise(iInputStateC, ucMapC, ucActionC, ucMenuActionC); InternalInputManager.Initialise(iInputStateC, ucMapC, ucActionC, ucMenuActionC);
InternalKeyboard.Init();
} }
void C_4JInput::Tick(void) void C_4JInput::Tick(void)
@@ -39,6 +40,10 @@ void C_4JInput::Tick(void)
InternalInputManager.Tick(); InternalInputManager.Tick();
} }
void C_4JInput::TickKBM(void)
{
InternalKeyboard.Tick();
}
void C_4JInput::SetDeadzoneAndMovementRange(unsigned int uiDeadzone, unsigned int uiMovementRangeMax) void C_4JInput::SetDeadzoneAndMovementRange(unsigned int uiDeadzone, unsigned int uiMovementRangeMax)
{ {
InternalInputManager.SetDeadzoneAndMovementRange(uiDeadzone, uiMovementRangeMax); InternalInputManager.SetDeadzoneAndMovementRange(uiDeadzone, uiMovementRangeMax);
@@ -74,6 +79,11 @@ unsigned int C_4JInput::GetValue(int iPad, unsigned char ucAction, bool bRepeat)
return InternalInputManager.GetValue(iPad, ucAction, bRepeat); return InternalInputManager.GetValue(iPad, ucAction, bRepeat);
} }
void C_4JInput::MapTouchInput(int iPad, int button)
{
InternalInputManager.MapTouchInput(iPad, button);
}
bool C_4JInput::ButtonPressed(int iPad, unsigned char ucAction) bool C_4JInput::ButtonPressed(int iPad, unsigned char ucAction)
{ {
return InternalInputManager.ButtonPressed(iPad, ucAction); return InternalInputManager.ButtonPressed(iPad, ucAction);
@@ -129,6 +139,11 @@ bool C_4JInput::IsSelectBackSwapped()
return InternalInputManager.IsSelectBackSwapped(); return InternalInputManager.IsSelectBackSwapped();
} }
bool C_4JInput::IsPadActive(int iPad)
{
return InternalInputManager.IsPadActive(iPad);
}
float C_4JInput::GetJoypadStick_LX(int iPad, bool bCheckMenuDisplay) float C_4JInput::GetJoypadStick_LX(int iPad, bool bCheckMenuDisplay)
{ {
return InternalInputManager.GetJoypadStick_LX(iPad, bCheckMenuDisplay); return InternalInputManager.GetJoypadStick_LX(iPad, bCheckMenuDisplay);
@@ -164,6 +179,191 @@ void C_4JInput::SetMenuDisplayed(int iPad, bool bVal)
InternalInputManager.SetMenuDisplayed(iPad, bVal); InternalInputManager.SetMenuDisplayed(iPad, bVal);
} }
void C_4JInput::OnKeyDown(int vkCode)
{
InternalKeyboard.OnKeyDown(vkCode);
}
void C_4JInput::OnKeyUp(int vkCode)
{
InternalKeyboard.OnKeyUp(vkCode);
}
void C_4JInput::OnChar(wchar_t ch)
{
InternalKeyboard.OnChar(ch);
}
bool C_4JInput::IsKeyDown(int vkCode) const
{
return InternalKeyboard.IsKeyDown(vkCode);
}
bool C_4JInput::IsKeyPressed(int vkCode) const
{
return InternalKeyboard.IsKeyPressed(vkCode);
}
bool C_4JInput::IsKeyReleased(int vkCode) const
{
return InternalKeyboard.IsKeyReleased(vkCode);
}
int C_4JInput::GetMouseX() const
{
return InternalKeyboard.GetMouseX();
}
int C_4JInput::GetMouseY() const
{
return InternalKeyboard.GetMouseY();
}
bool C_4JInput::IsMouseLDown() const
{
return InternalKeyboard.IsLButtonDown();
}
bool C_4JInput::IsLButtonPressed() const
{
return InternalKeyboard.IsLButtonPressed();
}
bool C_4JInput::IsLButtonReleased() const
{
return InternalKeyboard.IsLButtonReleased();
}
bool C_4JInput::IsMouseRDown() const
{
return InternalKeyboard.IsRButtonDown();
}
bool C_4JInput::IsRButtonPressed() const
{
return InternalKeyboard.IsRButtonPressed();
}
bool C_4JInput::IsRButtonReleased() const
{
return InternalKeyboard.IsRButtonReleased();
}
int C_4JInput::GetMouseWheelDelta() const
{
return InternalKeyboard.GetMouseWheelDelta();
}
wchar_t C_4JInput::GetLastChar() const
{
return InternalKeyboard.GetLastChar();
}
bool C_4JInput::HasChar() const
{
return InternalKeyboard.HasChar();
}
int C_4JInput::GetCharCount() const
{
return InternalKeyboard.GetCharCount();
}
wchar_t C_4JInput::GetChar(int index) const
{
return InternalKeyboard.GetChar(index);
}
int C_4JInput::GetClipboardText(wchar_t *outText, int outCapacity) const
{
return InternalKeyboard.GetClipboardText(outText, outCapacity);
}
bool C_4JInput::SetClipboardText(const wchar_t *text) const
{
return InternalKeyboard.SetClipboardText(text);
}
void C_4JInput::OnMouseMove(int x, int y)
{
InternalKeyboard.OnMouseMove(x, y);
}
void C_4JInput::OnRawMouseDelta(int dx, int dy)
{
InternalKeyboard.OnRawMouseDelta(dx, dy);
}
void C_4JInput::OnLButtonDown(int x, int y)
{
InternalKeyboard.OnLButtonDown(x, y);
}
void C_4JInput::OnLButtonUp(int x, int y)
{
InternalKeyboard.OnLButtonUp(x, y);
}
void C_4JInput::OnRButtonDown(int x, int y)
{
InternalKeyboard.OnRButtonDown(x, y);
}
void C_4JInput::OnRButtonUp(int x, int y)
{
InternalKeyboard.OnRButtonUp(x, y);
}
void C_4JInput::OnMButtonDown(int x, int y)
{
InternalKeyboard.OnMButtonDown(x, y);
}
void C_4JInput::OnMButtonUp(int x, int y)
{
InternalKeyboard.OnMButtonUp(x, y);
}
void C_4JInput::OnMouseWheel(int delta, int x, int y)
{
InternalKeyboard.OnMouseWheel(delta, x, y);
}
void C_4JInput::SetMouseCaptured(bool captured)
{
InternalKeyboard.SetMouseCaptured(captured);
}
void C_4JInput::SetWindowFocused(bool focused)
{
InternalKeyboard.SetWindowFocused(focused);
}
bool C_4JInput::IsMouseCaptured() const
{
return InternalKeyboard.IsMouseCaptured();
}
bool C_4JInput::IsWindowFocused() const
{
return InternalKeyboard.IsWindowFocused();
}
void C_4JInput::SetMousePos(int x, int y)
{
InternalKeyboard.SetMousePos(x, y);
}
int C_4JInput::GetRawMouseX() const
{
return InternalKeyboard.GetRawMouseX();
}
int C_4JInput::GetRawMouseY() const
{
return InternalKeyboard.GetRawMouseY();
}
EKeyboardResult C_4JInput::RequestKeyboard(LPCWSTR Title, LPCWSTR Text, DWORD dwPad, UINT uiMaxChars, int (*Func)(LPVOID, const bool), LPVOID lpParam, EKeyboardResult C_4JInput::RequestKeyboard(LPCWSTR Title, LPCWSTR Text, DWORD dwPad, UINT uiMaxChars, int (*Func)(LPVOID, const bool), LPVOID lpParam,
C_4JInput::EKeyboardMode eMode) C_4JInput::EKeyboardMode eMode)
{ {
+10 -9
View File
@@ -85,8 +85,8 @@ void CForceFeedback::AddRumble(unsigned int uiPad, WORD leftMotorSpeed, WORD rig
QueryPerformanceCounter(&qwCurrentTime); QueryPerformanceCounter(&qwCurrentTime);
pRumble->m_TimeLeft = (m_TicksPerSecond * fSeconds) + qwCurrentTime.QuadPart; pRumble->m_TimeLeft = (m_TicksPerSecond * fSeconds) + qwCurrentTime.QuadPart;
pRumble->m_RumbleData.wLeftMotorSpeed = leftMotorSpeed; pRumble->m_LowFreqRumble = leftMotorSpeed;
pRumble->m_RumbleData.wRightMotorSpeed = rightMotorSpeed; pRumble->m_HighFreqRumble = rightMotorSpeed;
pRumble->m_Pad = uiPad; pRumble->m_Pad = uiPad;
m_RumbleList.AddToTail(pRumble); m_RumbleList.AddToTail(pRumble);
@@ -108,14 +108,15 @@ void CForceFeedback::Tick(void)
LinkedList::_LL_NODE *pRumbleNode = m_RumbleList.m_Head; LinkedList::_LL_NODE *pRumbleNode = m_RumbleList.m_Head;
while (pRumbleNode) while (pRumbleNode)
{ {
if (pRumbleNode->GetDataAs<RUMBLE_EFFECT>()->m_TimeLeft <= qwCurrentTime.QuadPart) RUMBLE_EFFECT *pRumble = pRumbleNode->GetDataAs<RUMBLE_EFFECT>();
SDL_Gamepad* m_pGamepad = SDL_GetGamepadFromPlayerIndex(pRumble->m_Pad);
if (pRumble->m_TimeLeft <= qwCurrentTime.QuadPart)
{ {
RUMBLE_EFFECT *pRumble = pRumbleNode->GetDataAs<RUMBLE_EFFECT>(); pRumble->m_LowFreqRumble = 0;
pRumble->m_HighFreqRumble = 0;
pRumble->m_RumbleData.wLeftMotorSpeed = 0; if (m_pGamepad != nullptr) SDL_RumbleGamepad(m_pGamepad, 0, 0, 0);
pRumble->m_RumbleData.wRightMotorSpeed = 0;
XInputSetState(pRumble->m_Pad, &pRumble->m_RumbleData);
m_RumbleList.RemoveNode(pRumbleNode); m_RumbleList.RemoveNode(pRumbleNode);
@@ -127,7 +128,7 @@ void CForceFeedback::Tick(void)
} }
else else
{ {
XInputSetState(pRumbleNode->GetDataAs<RUMBLE_EFFECT>()->m_Pad, &pRumbleNode->GetDataAs<RUMBLE_EFFECT>()->m_RumbleData); if (m_pGamepad != nullptr) SDL_RumbleGamepad(m_pGamepad, pRumble->m_LowFreqRumble, pRumble->m_HighFreqRumble, 30000);
pRumbleNode = pRumbleNode->m_Next; pRumbleNode = pRumbleNode->m_Next;
} }
} }
+4 -2
View File
@@ -24,6 +24,7 @@ SOFTWARE.
*/ */
#include "LinkedList.h" #include "LinkedList.h"
#include "SDL3\SDL_gamepad.h"
#define MAX_EFFECTS 10 #define MAX_EFFECTS 10
@@ -38,9 +39,10 @@ public:
struct RUMBLE_EFFECT struct RUMBLE_EFFECT
{ {
DWORD m_Pad; int m_Pad;
uint64_t m_TimeLeft; uint64_t m_TimeLeft;
XINPUT_VIBRATION m_RumbleData; uint16_t m_LowFreqRumble;
uint16_t m_HighFreqRumble;
WORD unk; WORD unk;
}; };
+274 -1
View File
@@ -24,7 +24,280 @@ SOFTWARE.
#include "INP_Keyboard.h" #include "INP_Keyboard.h"
void CKeyboard::Tick(void) {} CKeyboard::CKeyboard()
{
m_lParam = nullptr;
m_onInput = nullptr;
ZeroMemory(m_chrText, sizeof(m_chrText));
memset(m_keysPrev, 0, sizeof(m_keysPrev));
memset(m_keysCurr, 0, sizeof(m_keysCurr));
m_mouseX = m_mouseY = 0;
m_lButtonPrev = m_lButtonCurr = false;
m_rButtonPrev = m_rButtonCurr = false;
m_mButtonPrev = m_mButtonCurr = false;
m_mouseWheel = 0;
memset(m_charBuffer, 0, sizeof(m_charBuffer));
m_charCount = 0;
m_mouseCaptured = false;
m_mouseDeltaX = m_mouseDeltaY = 0;
m_windowFocused = true;
}
void CKeyboard::Init()
{
RAWINPUTDEVICE rid;
rid.usUsagePage = 0x01; // HID_USAGE_PAGE_GENERIC
rid.usUsage = 0x02; // HID_USAGE_GENERIC_MOUSE
rid.dwFlags = 0;
rid.hwndTarget = g_hWnd;
RegisterRawInputDevices(&rid, 1, sizeof(rid));
}
void CKeyboard::Tick(void)
{
memcpy(m_keysPrev, m_keysCurr, sizeof(m_keysCurr));
m_lButtonPrev = m_lButtonCurr;
m_rButtonPrev = m_rButtonCurr;
m_mButtonPrev = m_mButtonCurr;
m_mouseWheel = 0;
m_charCount = 0;
m_mouseDeltaX = m_mouseDeltaAccumX;
m_mouseDeltaY = m_mouseDeltaAccumY;
m_mouseDeltaAccumX = 0;
m_mouseDeltaAccumY = 0;
if (m_mouseCaptured && g_hWnd && m_windowFocused && g_hWnd)
{
RECT rc;
GetClientRect(g_hWnd, &rc);
POINT center;
center.x = (rc.right - rc.left) / 2;
center.y = (rc.bottom - rc.top) / 2;
ClientToScreen(g_hWnd, &center);
SetCursorPos(center.x, center.y);
}
}
void CKeyboard::OnKeyDown(int vkCode)
{
if (vkCode >= 0 && vkCode < MAX_KEYS)
{
m_keysCurr[vkCode] = true;
}
}
void CKeyboard::OnKeyUp(int vkCode)
{
if (vkCode >= 0 && vkCode < MAX_KEYS)
{
m_keysCurr[vkCode] = false;
}
}
void CKeyboard::OnChar(wchar_t ch)
{
if (m_charCount < MAX_CHARS_PER_FRAME)
{
m_charBuffer[m_charCount++] = ch;
}
}
int CKeyboard::GetClipboardText(wchar_t *outText, int outCapacity) const
{
if (!outText || outCapacity <= 0)
return 0;
outText[0] = 0;
if (!OpenClipboard(g_hWnd))
return 0;
int copied = 0;
HANDLE h = GetClipboardData(CF_UNICODETEXT);
if (h)
{
const wchar_t *src = (const wchar_t *)GlobalLock(h);
if (src)
{
while (src[copied] && copied + 1 < outCapacity)
{
outText[copied] = src[copied];
++copied;
}
outText[copied] = 0;
GlobalUnlock(h);
}
}
CloseClipboard();
return copied;
}
bool CKeyboard::SetClipboardText(const wchar_t *text) const
{
if (!text)
return false;
size_t len = wcslen(text);
if (!OpenClipboard(g_hWnd))
return false;
EmptyClipboard();
bool ok = false;
HGLOBAL h = GlobalAlloc(GMEM_MOVEABLE, (len + 1) * sizeof(wchar_t));
if (h)
{
memcpy(GlobalLock(h), text, (len + 1) * sizeof(wchar_t));
GlobalUnlock(h);
ok = (SetClipboardData(CF_UNICODETEXT, h) != NULL);
if (!ok)
GlobalFree(h);
}
CloseClipboard();
return ok;
}
bool CKeyboard::IsKeyDown(int vkCode) const
{
if (vkCode >= 0 && vkCode < MAX_KEYS)
return m_keysCurr[vkCode];
return false;
}
bool CKeyboard::IsKeyPressed(int vkCode) const
{
if (vkCode >= 0 && vkCode < MAX_KEYS)
return m_keysCurr[vkCode] && !m_keysPrev[vkCode];
return false;
}
bool CKeyboard::IsKeyReleased(int vkCode) const
{
if (vkCode >= 0 && vkCode < MAX_KEYS)
return !m_keysCurr[vkCode] && m_keysPrev[vkCode];
return false;
}
void CKeyboard::OnMouseMove(int x, int y)
{
m_mouseX = x;
m_mouseY = y;
}
void CKeyboard::OnRawMouseDelta(int dx, int dy)
{
m_mouseDeltaAccumX += dx;
m_mouseDeltaAccumY += dy;
}
void CKeyboard::OnLButtonDown(int x, int y)
{
m_mouseX = x;
m_mouseY = y;
m_lButtonCurr = true;
}
void CKeyboard::OnLButtonUp(int x, int y)
{
m_mouseX = x;
m_mouseY = y;
m_lButtonCurr = false;
}
void CKeyboard::OnRButtonDown(int x, int y)
{
m_mouseX = x;
m_mouseY = y;
m_rButtonCurr = true;
}
void CKeyboard::OnRButtonUp(int x, int y)
{
m_mouseX = x;
m_mouseY = y;
m_rButtonCurr = false;
}
void CKeyboard::OnMButtonDown(int x, int y)
{
m_mouseX = x;
m_mouseY = y;
m_mButtonCurr = true;
}
void CKeyboard::OnMButtonUp(int x, int y)
{
m_mouseX = x;
m_mouseY = y;
m_mButtonCurr = false;
}
void CKeyboard::OnMouseWheel(int delta, int x, int y)
{
m_mouseX = x;
m_mouseY = y;
m_mouseWheel += delta;
}
void CKeyboard::SetMouseCaptured(bool grabbed)
{
if (m_mouseCaptured == grabbed)
return;
m_mouseCaptured = grabbed;
if (grabbed && g_hWnd)
{
while (ShowCursor(FALSE) >= 0) {}
RECT rc;
GetClientRect(g_hWnd, &rc);
POINT topLeft = { rc.left, rc.top };
POINT bottomRight = { rc.right, rc.bottom };
ClientToScreen(g_hWnd, &topLeft);
ClientToScreen(g_hWnd, &bottomRight);
RECT clipRect = { topLeft.x, topLeft.y, bottomRight.x, bottomRight.y };
ClipCursor(&clipRect);
GetClientRect(g_hWnd, &rc);
POINT center;
center.x = (rc.right - rc.left) / 2;
center.y = (rc.bottom - rc.top) / 2;
ClientToScreen(g_hWnd, &center);
SetCursorPos(center.x, center.y);
m_mouseDeltaAccumX = 0;
m_mouseDeltaAccumY = 0;
}
else if (!grabbed && g_hWnd)
{
while (ShowCursor(TRUE) < 0) {}
ClipCursor(nullptr);
}
}
void CKeyboard::SetWindowFocused(bool focused)
{
m_windowFocused = focused;
if (focused)
{
if (m_mouseCaptured)
{
while (ShowCursor(FALSE) >= 0) {}
RECT rc;
GetClientRect(g_hWnd, &rc);
POINT center;
center.x = (rc.right - rc.left) / 2;
center.y = (rc.bottom - rc.top) / 2;
ClientToScreen(g_hWnd, &center);
SetCursorPos(center.x, center.y);
}
else
{
while (ShowCursor(TRUE) < 0) {}
ClipCursor(nullptr);
}
}
else
{
while (ShowCursor(TRUE) < 0) {}
ClipCursor(nullptr);
}
}
EKeyboardResult CKeyboard::RequestKeyboard(LPCWSTR Title, LPCWSTR Text, DWORD dwPad, UINT uiMaxChars, int (*Func)(LPVOID, const bool), LPVOID lpParam, EKeyboardResult CKeyboard::RequestKeyboard(LPCWSTR Title, LPCWSTR Text, DWORD dwPad, UINT uiMaxChars, int (*Func)(LPVOID, const bool), LPVOID lpParam,
C_4JInput::EKeyboardMode eMode) C_4JInput::EKeyboardMode eMode)
+80 -2
View File
@@ -32,6 +32,8 @@ void SeedEditBox();
class CKeyboard class CKeyboard
{ {
public: public:
CKeyboard();
enum EKeyboardProcessState enum EKeyboardProcessState
{ {
}; };
@@ -40,11 +42,87 @@ public:
{ {
}; };
void Tick(void); void Init();
void Tick();
EKeyboardResult RequestKeyboard(LPCWSTR Title, LPCWSTR Text, DWORD dwPad, UINT uiMaxChars, int (*Func)(LPVOID, const bool), LPVOID lpParam, void OnKeyDown(int vkCode);
void OnKeyUp(int vkCode);
void OnChar(wchar_t ch);
void OnMouseMove(int x, int y);
void OnRawMouseDelta(int dx, int dy);
void OnLButtonDown(int x, int y);
void OnLButtonUp(int x, int y);
void OnRButtonDown(int x, int y);
void OnRButtonUp(int x, int y);
void OnMButtonDown(int x, int y);
void OnMButtonUp(int x, int y);
void OnMouseWheel(int delta, int x, int y);
bool IsKeyDown(int vkCode) const;
bool IsKeyPressed(int vkCode) const;
bool IsKeyReleased(int vkCode) const;
int GetMouseX() const { return m_mouseX; }
int GetMouseY() const { return m_mouseY; }
int GetRawMouseX() const { return m_mouseDeltaX; }
int GetRawMouseY() const { return m_mouseDeltaY; }
bool IsLButtonDown() const { return m_lButtonCurr; }
bool IsLButtonPressed() const { return m_lButtonCurr && !m_lButtonPrev; }
bool IsLButtonReleased() const { return !m_lButtonCurr && m_lButtonPrev; }
bool IsRButtonDown() const { return m_rButtonCurr; }
bool IsRButtonPressed() const { return m_rButtonCurr && !m_rButtonPrev; }
bool IsRButtonReleased() const { return !m_rButtonCurr && m_rButtonPrev; }
int GetMouseWheelDelta() const { return m_mouseWheel; }
wchar_t GetLastChar() const { return m_charCount > 0 ? m_charBuffer[0] : 0; }
bool HasChar() const { return m_charCount > 0; }
int GetCharCount() const { return m_charCount; }
wchar_t GetChar(int index) const { return (index >= 0 && index < m_charCount) ? m_charBuffer[index] : 0; }
int GetClipboardText(wchar_t *outText, int outCapacity) const;
bool SetClipboardText(const wchar_t *text) const;
void SetMouseCaptured(bool captured);
void SetWindowFocused(bool focused);
bool IsMouseCaptured() const { return m_mouseCaptured; }
bool IsWindowFocused() const { return m_windowFocused; }
void SetMousePos(int x, int y) { m_mouseX = x; m_mouseY = y; }
EKeyboardResult RequestKeyboard(LPCWSTR Title, LPCWSTR Text, DWORD dwPad, UINT uiMaxChars, int (*Func)(LPVOID, const bool), LPVOID lpParam,
C_4JInput::EKeyboardMode eMode); C_4JInput::EKeyboardMode eMode);
void GetText(uint16_t *UTF16String); void GetText(uint16_t *UTF16String);
BYTE gap0[0x68]; BYTE gap0[0x68];
private:
static const int MAX_KEYS = 256;
static const int MAX_CHARS_PER_FRAME = 32;
bool m_keysPrev[MAX_KEYS];
bool m_keysCurr[MAX_KEYS];
int m_mouseX, m_mouseY;
bool m_lButtonPrev, m_lButtonCurr;
bool m_rButtonPrev, m_rButtonCurr;
bool m_mButtonPrev, m_mButtonCurr;
int m_mouseWheel;
wchar_t m_charBuffer[MAX_CHARS_PER_FRAME];
int m_charCount;
bool m_windowFocused;
bool m_mouseCaptured;
int m_mouseDeltaX, m_mouseDeltaY;
int m_mouseDeltaAccumX, m_mouseDeltaAccumY;
wchar_t m_chrText[128];
LPVOID m_lParam;
int (*m_onInput)(LPVOID, LPCWSTR);
}; };
+44 -16
View File
@@ -78,6 +78,8 @@ void CInput::Initialise(int iInputStateC, unsigned char ucMapC, unsigned char uc
m_Joypads[i].m_pucLeftTriggerAxisMap = &m_Joypads[i].m_ucLeftTriggerState; m_Joypads[i].m_pucLeftTriggerAxisMap = &m_Joypads[i].m_ucLeftTriggerState;
m_Joypads[i].m_pucRightTriggerAxisMap = &m_Joypads[i].m_ucRightTriggerState; m_Joypads[i].m_pucRightTriggerAxisMap = &m_Joypads[i].m_ucRightTriggerState;
m_Joypads[i].m_fSensitivity = 1.0f; m_Joypads[i].m_fSensitivity = 1.0f;
m_iTouchInputButton[i] = 0;
} }
m_JoypadMap = (unsigned int **)operator new[](ucMapC * sizeof(int *)); m_JoypadMap = (unsigned int **)operator new[](ucMapC * sizeof(int *));
@@ -96,7 +98,6 @@ void CInput::Tick(void)
{ {
HandleGamepadEvents(); HandleGamepadEvents();
UpdateJoypads(); UpdateJoypads();
m_Keyboard.Tick();
} }
void CInput::SetJoypadValues(JOYPAD *pThisPad) void CInput::SetJoypadValues(JOYPAD *pThisPad)
@@ -148,6 +149,11 @@ void CInput::SetJoypadValues(JOYPAD *pThisPad)
pThisPad->m_uiButtons |= _360_JOY_BUTTON_BACK; pThisPad->m_uiButtons |= _360_JOY_BUTTON_BACK;
} }
if (SDL_GetGamepadButton(pGamePad, SDL_GAMEPAD_BUTTON_TOUCHPAD))
{
pThisPad->m_uiButtons |= _PS_JOY_BUTTON_TOUCHPAD;
}
if (SDL_GetGamepadButton(pGamePad, SDL_GAMEPAD_BUTTON_LEFT_STICK)) if (SDL_GetGamepadButton(pGamePad, SDL_GAMEPAD_BUTTON_LEFT_STICK))
{ {
pThisPad->m_uiButtons |= _360_JOY_BUTTON_LTHUMB; pThisPad->m_uiButtons |= _360_JOY_BUTTON_LTHUMB;
@@ -344,6 +350,11 @@ unsigned char CInput::GetJoypadMapVal(int iPad)
return m_Joypads[iPad].m_ucMappingValue; return m_Joypads[iPad].m_ucMappingValue;
} }
void CInput::MapTouchInput(int iPad, int button)
{
m_iTouchInputButton[iPad] |= button;
}
void CInput::SetJoypadStickAxisMap(int iPad, unsigned int uiFrom, unsigned int uiTo) void CInput::SetJoypadStickAxisMap(int iPad, unsigned int uiFrom, unsigned int uiTo)
{ {
float *pfTo = nullptr; float *pfTo = nullptr;
@@ -424,6 +435,11 @@ bool CInput::IsSelectBackSwapped()
return m_bSelectBackSwapped; return m_bSelectBackSwapped;
} }
bool CInput::IsPadActive(int iPad)
{
return m_Joypads[iPad].m_bControllerActive;
}
void CInput::SetSigninJoypadMask(unsigned int mask) void CInput::SetSigninJoypadMask(unsigned int mask)
{ {
m_uiSigninJoypadMask = mask; m_uiSigninJoypadMask = mask;
@@ -780,27 +796,39 @@ bool CInput::UpdateJoypads()
if (pThisPad->m_bIsConnected) if (pThisPad->m_bIsConnected)
{ {
SetJoypadValues(pThisPad); SetJoypadValues(pThisPad);
pThisPad->m_uiButtonsPressed = ~pThisPad->m_uiOldButtons & pThisPad->m_uiButtons;
pThisPad->m_uiButtonsReleased = ~pThisPad->m_uiButtons & pThisPad->m_uiOldButtons;
for (int bit = 0; bit < 24; ++bit)
{
if ((pThisPad->m_uiButtonsPressed & (1 << bit)) != 0)
{
GetStartTime(i, bit);
}
else if ((pThisPad->m_uiButtons & (1 << bit)) != 0)
{
UpdateTime(i, bit);
}
}
} }
else if (pThisPad->m_bWasConnected) else if (pThisPad->m_bWasConnected)
{ {
ClearJoypadValues(pThisPad); ClearJoypadValues(pThisPad);
} }
if (m_iTouchInputButton[i])
{
pThisPad->m_uiButtons |= m_iTouchInputButton[i];
}
m_iTouchInputButton[i] = 0;
pThisPad->m_uiButtonsPressed = ~pThisPad->m_uiOldButtons & pThisPad->m_uiButtons;
pThisPad->m_uiButtonsReleased = ~pThisPad->m_uiButtons & pThisPad->m_uiOldButtons;
for (int bit = 0; bit < 24; ++bit)
{
if ((pThisPad->m_uiButtonsPressed & (1 << bit)) != 0)
{
GetStartTime(i, bit);
}
else if ((pThisPad->m_uiButtons & (1 << bit)) != 0)
{
UpdateTime(i, bit);
}
}
if (pThisPad->m_uiButtonsPressed)
pThisPad->m_bControllerActive = true;
else
pThisPad->m_bControllerActive = false;
if (m_pDebugSequenceFn && (pThisPad->m_uiButtonsPressed & (_360_JOY_BUTTON_A | _360_JOY_BUTTON_B | _360_JOY_BUTTON_X | _360_JOY_BUTTON_Y | if (m_pDebugSequenceFn && (pThisPad->m_uiButtonsPressed & (_360_JOY_BUTTON_A | _360_JOY_BUTTON_B | _360_JOY_BUTTON_X | _360_JOY_BUTTON_Y |
_360_JOY_BUTTON_RB | _360_JOY_BUTTON_LB)) != 0) _360_JOY_BUTTON_RB | _360_JOY_BUTTON_LB)) != 0)
{ {
+5
View File
@@ -38,6 +38,7 @@ public:
bool m_bIsConnected; bool m_bIsConnected;
bool m_bWasConnected; bool m_bWasConnected;
bool m_bHasConnected; bool m_bHasConnected;
bool m_bControllerActive;
unsigned int m_uiButtons; unsigned int m_uiButtons;
unsigned int m_uiOldButtons; unsigned int m_uiOldButtons;
@@ -105,12 +106,14 @@ public:
void SetJoypadMapVal(int iPad, unsigned char ucMap); void SetJoypadMapVal(int iPad, unsigned char ucMap);
unsigned char GetJoypadMapVal(int iPad); unsigned char GetJoypadMapVal(int iPad);
void MapTouchInput(int iPad, int button);
void SetJoypadStickAxisMap(int iPad, unsigned int uiFrom, unsigned int uiTo); void SetJoypadStickAxisMap(int iPad, unsigned int uiFrom, unsigned int uiTo);
void SetJoypadStickTriggerMap(int iPad, unsigned int uiFrom, unsigned int uiTo); void SetJoypadStickTriggerMap(int iPad, unsigned int uiFrom, unsigned int uiTo);
bool IsPadConnected(int iPad); bool IsPadConnected(int iPad);
void SetSelectBackSwapped(bool swapped); void SetSelectBackSwapped(bool swapped);
bool IsSelectBackSwapped(); bool IsSelectBackSwapped();
bool IsPadActive(int iPad);
void SetSigninJoypadMask(unsigned int mask); void SetSigninJoypadMask(unsigned int mask);
unsigned int GetValue(int iPad, unsigned char ucAction, bool bRepeat = false); unsigned int GetValue(int iPad, unsigned char ucAction, bool bRepeat = false);
bool IsSet(int iPad, unsigned char ucAction); bool IsSet(int iPad, unsigned char ucAction);
@@ -188,6 +191,8 @@ public:
int (*m_pDebugSequenceFn)(void *); int (*m_pDebugSequenceFn)(void *);
LPVOID m_pDebugSequenceParam; LPVOID m_pDebugSequenceParam;
unsigned int m_iTouchInputButton[MAX_JOYPADS];
private: private:
EControllerType GetControllerName(SDL_GamepadType type) EControllerType GetControllerName(SDL_GamepadType type)
{ {
+8 -2
View File
@@ -12,12 +12,18 @@ CSys::CSys()
bool CSys::IsSignedIn(int iQuadrant) bool CSys::IsSignedIn(int iQuadrant)
{ {
return InputManager.IsPadConnected(iQuadrant); //str1k3r - since we dont sign in like consoles just check if the pad is connected if (InputManager.IsPadConnected(iQuadrant))
return true;
//str1k3r - since we dont sign in like consoles just check if the pad is connected
//kbm - pad 0 also counts as signed in when the keyboard is available
return iQuadrant == 0 && InputManager.IsWindowFocused();
} }
bool CSys::IsSignedInLive(int iProf) bool CSys::IsSignedInLive(int iProf)
{ {
return InputManager.IsPadConnected(iProf); if (InputManager.IsPadConnected(iProf))
return true;
return iProf == 0 && InputManager.IsWindowFocused();
} }
//str1k3r - set every pad that isnt pad 0 as a guest //str1k3r - set every pad that isnt pad 0 as a guest
+58 -2
View File
@@ -1,6 +1,5 @@
#pragma once #pragma once
#define MAP_STYLE_0 0 #define MAP_STYLE_0 0
#define MAP_STYLE_1 1 #define MAP_STYLE_1 1
#define MAP_STYLE_2 2 #define MAP_STYLE_2 2
@@ -36,6 +35,9 @@
#define _360_JOY_BUTTON_RT 0x00400000 #define _360_JOY_BUTTON_RT 0x00400000
#define _360_JOY_BUTTON_LT 0x00800000 #define _360_JOY_BUTTON_LT 0x00800000
//str1k3r - DualShock 4 / DualSense Touchpad
#define _PS_JOY_BUTTON_TOUCHPAD _360_JOY_BUTTON_BACK
// Stick axis maps - to allow changes for SouthPaw in-game axis mapping // Stick axis maps - to allow changes for SouthPaw in-game axis mapping
#define AXIS_MAP_LX 0 #define AXIS_MAP_LX 0
#define AXIS_MAP_LY 1 #define AXIS_MAP_LY 1
@@ -113,6 +115,7 @@ public:
void Initialise( int iInputStateC, unsigned char ucMapC,unsigned char ucActionC, unsigned char ucMenuActionC ); void Initialise( int iInputStateC, unsigned char ucMapC,unsigned char ucActionC, unsigned char ucMenuActionC );
void Tick(void); void Tick(void);
void TickKBM(void);
void SetDeadzoneAndMovementRange(unsigned int uiDeadzone, unsigned int uiMovementRangeMax ); void SetDeadzoneAndMovementRange(unsigned int uiDeadzone, unsigned int uiMovementRangeMax );
void SetGameJoypadMaps(unsigned char ucMap,unsigned char ucAction,unsigned int uiActionVal); void SetGameJoypadMaps(unsigned char ucMap,unsigned char ucAction,unsigned int uiActionVal);
unsigned int GetGameJoypadMaps(unsigned char ucMap,unsigned char ucAction); unsigned int GetGameJoypadMaps(unsigned char ucMap,unsigned char ucAction);
@@ -120,6 +123,7 @@ public:
unsigned char GetJoypadMapVal(int iPad); unsigned char GetJoypadMapVal(int iPad);
void SetJoypadSensitivity(int iPad, float fSensitivity); void SetJoypadSensitivity(int iPad, float fSensitivity);
unsigned int GetValue(int iPad,unsigned char ucAction, bool bRepeat=false); unsigned int GetValue(int iPad,unsigned char ucAction, bool bRepeat=false);
void MapTouchInput(int iPad, int button);
bool ButtonPressed(int iPad,unsigned char ucAction=255); // toggled bool ButtonPressed(int iPad,unsigned char ucAction=255); // toggled
bool ButtonReleased(int iPad,unsigned char ucAction); //toggled bool ButtonReleased(int iPad,unsigned char ucAction); //toggled
bool ButtonDown(int iPad,unsigned char ucAction=255); // button held down bool ButtonDown(int iPad,unsigned char ucAction=255); // button held down
@@ -133,6 +137,8 @@ public:
void SetSelectBackSwapped(bool swapped); void SetSelectBackSwapped(bool swapped);
bool IsSelectBackSwapped(); bool IsSelectBackSwapped();
bool IsPadActive(int iPad);
bool IsCircleCrossSwapped();
// In-Game values which may have been remapped due to Southpaw, swap triggers, etc // In-Game values which may have been remapped due to Southpaw, swap triggers, etc
float GetJoypadStick_LX(int iPad, bool bCheckMenuDisplay=true); float GetJoypadStick_LX(int iPad, bool bCheckMenuDisplay=true);
float GetJoypadStick_LY(int iPad, bool bCheckMenuDisplay=true); float GetJoypadStick_LY(int iPad, bool bCheckMenuDisplay=true);
@@ -143,6 +149,55 @@ public:
void SetMenuDisplayed(int iPad, bool bVal); void SetMenuDisplayed(int iPad, bool bVal);
void OnKeyDown(int vkCode);
void OnKeyUp(int vkCode);
void OnChar(wchar_t ch);
void OnMouseMove(int x, int y);
void OnRawMouseDelta(int dx, int dy);
void OnLButtonDown(int x, int y);
void OnLButtonUp(int x, int y);
void OnRButtonDown(int x, int y);
void OnRButtonUp(int x, int y);
void OnMButtonDown(int x, int y);
void OnMButtonUp(int x, int y);
void OnMouseWheel(int delta, int x, int y);
bool IsKeyDown(int vkCode) const;
bool IsKeyPressed(int vkCode) const;
bool IsKeyReleased(int vkCode) const;
int GetMouseX() const;
int GetMouseY() const;
// PIEBOT: Used to be IsLButtonDown, changed so it doesnt conflict with windowx.h
bool IsMouseLDown() const;
bool IsLButtonPressed() const;
bool IsLButtonReleased() const;
bool IsMouseRDown() const;
bool IsRButtonPressed() const;
bool IsRButtonReleased() const;
int GetMouseWheelDelta() const;
wchar_t GetLastChar() const;
bool HasChar() const;
int GetCharCount() const;
wchar_t GetChar(int index) const;
int GetClipboardText(wchar_t *outText, int outCapacity) const;
bool SetClipboardText(const wchar_t *text) const;
void SetMouseCaptured(bool captured);
void SetWindowFocused(bool focused);
bool IsMouseCaptured() const;
bool IsWindowFocused() const;
void SetMousePos(int x, int y);
int GetRawMouseX() const;
int GetRawMouseY() const;
// EKeyboardResult RequestKeyboard(UINT uiTitle, UINT uiText, UINT uiDesc, DWORD dwPad, WCHAR *pwchResult, UINT uiResultSize,int( *Func)(LPVOID,const bool),LPVOID lpParam,EKeyboardMode eMode,C4JStringTable *pStringTable=NULL); // EKeyboardResult RequestKeyboard(UINT uiTitle, UINT uiText, UINT uiDesc, DWORD dwPad, WCHAR *pwchResult, UINT uiResultSize,int( *Func)(LPVOID,const bool),LPVOID lpParam,EKeyboardMode eMode,C4JStringTable *pStringTable=NULL);
// EKeyboardResult RequestKeyboard(UINT uiTitle, LPCWSTR pwchDefault, UINT uiDesc, DWORD dwPad, WCHAR *pwchResult, UINT uiResultSize,int( *Func)(LPVOID,const bool),LPVOID lpParam, EKeyboardMode eMode,C4JStringTable *pStringTable=NULL); // EKeyboardResult RequestKeyboard(UINT uiTitle, LPCWSTR pwchDefault, UINT uiDesc, DWORD dwPad, WCHAR *pwchResult, UINT uiResultSize,int( *Func)(LPVOID,const bool),LPVOID lpParam, EKeyboardMode eMode,C4JStringTable *pStringTable=NULL);
EKeyboardResult RequestKeyboard(LPCWSTR Title, LPCWSTR Text, DWORD dwPad, UINT uiMaxChars, int( *Func)(LPVOID,const bool),LPVOID lpParam,C_4JInput::EKeyboardMode eMode); EKeyboardResult RequestKeyboard(LPCWSTR Title, LPCWSTR Text, DWORD dwPad, UINT uiMaxChars, int( *Func)(LPVOID,const bool),LPVOID lpParam,C_4JInput::EKeyboardMode eMode);
@@ -179,4 +234,5 @@ public:
}; };
// Singleton // Singleton
extern C_4JInput InputManager; extern C_4JInput InputManager;
extern HWND g_hWnd;
+2
View File
@@ -75,6 +75,7 @@ public:
// SYS // SYS
int GetPrimaryPad(); int GetPrimaryPad();
void SetPrimaryPad(int iPad); void SetPrimaryPad(int iPad);
void ForcePrimaryPadController(int iController);
void LoadGamertag(); void LoadGamertag();
void SetFakeGamerTag(char *name); void SetFakeGamerTag(char *name);
char* GetGamertag(int iPad); char* GetGamertag(int iPad);
@@ -82,6 +83,7 @@ public:
bool IsFullVersion(); bool IsFullVersion();
void SetSignInChangeCallback(void ( *Func)(LPVOID, bool, unsigned int),LPVOID lpParam); void SetSignInChangeCallback(void ( *Func)(LPVOID, bool, unsigned int),LPVOID lpParam);
void SetNotificationsCallback(void ( *Func)(LPVOID, DWORD, unsigned int),LPVOID lpParam); void SetNotificationsCallback(void ( *Func)(LPVOID, DWORD, unsigned int),LPVOID lpParam);
bool RegionIsNorthAmerica(void);
bool LocaleIsUSorCanada(void); bool LocaleIsUSorCanada(void);
bool LocaleIsChina(void); bool LocaleIsChina(void);
HRESULT GetLiveConnectionStatus(); HRESULT GetLiveConnectionStatus();