mirror of
https://github.com/libsdl-org/SDL.git
synced 2026-06-01 06:44:27 +08:00
Fixed the right touchpad calculation for the BLE Steam Controller
Fixes https://github.com/libsdl-org/SDL/issues/14368
(cherry picked from commit eb87a36940)
This commit is contained in:
@@ -644,13 +644,6 @@ static void RotatePad(int *pX, int *pY, float flAngleInRad)
|
|||||||
*pX = (int)(SDL_cosf(flAngleInRad) * origX - SDL_sinf(flAngleInRad) * origY);
|
*pX = (int)(SDL_cosf(flAngleInRad) * origX - SDL_sinf(flAngleInRad) * origY);
|
||||||
*pY = (int)(SDL_sinf(flAngleInRad) * origX + SDL_cosf(flAngleInRad) * origY);
|
*pY = (int)(SDL_sinf(flAngleInRad) * origX + SDL_cosf(flAngleInRad) * origY);
|
||||||
}
|
}
|
||||||
static void RotatePadShort(short *pX, short *pY, float flAngleInRad)
|
|
||||||
{
|
|
||||||
short int origX = *pX, origY = *pY;
|
|
||||||
|
|
||||||
*pX = (short)(SDL_cosf(flAngleInRad) * origX - SDL_sinf(flAngleInRad) * origY);
|
|
||||||
*pY = (short)(SDL_sinf(flAngleInRad) * origX + SDL_cosf(flAngleInRad) * origY);
|
|
||||||
}
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
// Format the first part of the state packet
|
// Format the first part of the state packet
|
||||||
@@ -774,9 +767,16 @@ static void FormatStatePacketUntilGyro(SteamControllerStateInternal_t *pState, V
|
|||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
static bool UpdateBLESteamControllerState(const uint8_t *pData, int nDataSize, SteamControllerStateInternal_t *pState)
|
static bool UpdateBLESteamControllerState(const uint8_t *pData, int nDataSize, SteamControllerStateInternal_t *pState)
|
||||||
{
|
{
|
||||||
const float flRotationAngle = 0.261799f;
|
int nLeftPadX;
|
||||||
|
int nLeftPadY;
|
||||||
|
int nRightPadX;
|
||||||
|
int nRightPadY;
|
||||||
|
int nPadOffset;
|
||||||
uint32_t ucOptionDataMask;
|
uint32_t ucOptionDataMask;
|
||||||
|
|
||||||
|
// 15 degrees in rad
|
||||||
|
const float flRotationAngle = 0.261799f;
|
||||||
|
|
||||||
pState->unPacketNum++;
|
pState->unPacketNum++;
|
||||||
ucOptionDataMask = (*pData++ & 0xF0);
|
ucOptionDataMask = (*pData++ & 0xF0);
|
||||||
ucOptionDataMask |= (uint32_t)(*pData++) << 8;
|
ucOptionDataMask |= (uint32_t)(*pData++) << 8;
|
||||||
@@ -805,7 +805,6 @@ static bool UpdateBLESteamControllerState(const uint8_t *pData, int nDataSize, S
|
|||||||
}
|
}
|
||||||
if (ucOptionDataMask & k_EBLELeftTrackpadChunk) {
|
if (ucOptionDataMask & k_EBLELeftTrackpadChunk) {
|
||||||
int nLength = sizeof(pState->sLeftPadX) + sizeof(pState->sLeftPadY);
|
int nLength = sizeof(pState->sLeftPadX) + sizeof(pState->sLeftPadY);
|
||||||
int nPadOffset;
|
|
||||||
SDL_memcpy(&pState->sLeftPadX, pData, nLength);
|
SDL_memcpy(&pState->sLeftPadX, pData, nLength);
|
||||||
if (pState->ulButtons & STEAM_LEFTPAD_FINGERDOWN_MASK) {
|
if (pState->ulButtons & STEAM_LEFTPAD_FINGERDOWN_MASK) {
|
||||||
nPadOffset = 1000;
|
nPadOffset = 1000;
|
||||||
@@ -813,14 +812,15 @@ static bool UpdateBLESteamControllerState(const uint8_t *pData, int nDataSize, S
|
|||||||
nPadOffset = 0;
|
nPadOffset = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
RotatePadShort(&pState->sLeftPadX, &pState->sLeftPadY, -flRotationAngle);
|
nLeftPadX = pState->sLeftPadX;
|
||||||
pState->sLeftPadX = clamp(pState->sLeftPadX + nPadOffset, SDL_MIN_SINT16, SDL_MAX_SINT16);
|
nLeftPadY = pState->sLeftPadY;
|
||||||
pState->sLeftPadY = clamp(pState->sLeftPadY + nPadOffset, SDL_MIN_SINT16, SDL_MAX_SINT16);
|
RotatePad(&nLeftPadX, &nLeftPadY, -flRotationAngle);
|
||||||
|
pState->sLeftPadX = (short)clamp(nLeftPadX + nPadOffset, SDL_MIN_SINT16, SDL_MAX_SINT16);
|
||||||
|
pState->sLeftPadY = (short)clamp(nLeftPadY + nPadOffset, SDL_MIN_SINT16, SDL_MAX_SINT16);
|
||||||
pData += nLength;
|
pData += nLength;
|
||||||
}
|
}
|
||||||
if (ucOptionDataMask & k_EBLERightTrackpadChunk) {
|
if (ucOptionDataMask & k_EBLERightTrackpadChunk) {
|
||||||
int nLength = sizeof(pState->sRightPadX) + sizeof(pState->sRightPadY);
|
int nLength = sizeof(pState->sRightPadX) + sizeof(pState->sRightPadY);
|
||||||
int nPadOffset = 0;
|
|
||||||
|
|
||||||
SDL_memcpy(&pState->sRightPadX, pData, nLength);
|
SDL_memcpy(&pState->sRightPadX, pData, nLength);
|
||||||
|
|
||||||
@@ -830,9 +830,11 @@ static bool UpdateBLESteamControllerState(const uint8_t *pData, int nDataSize, S
|
|||||||
nPadOffset = 0;
|
nPadOffset = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
RotatePadShort(&pState->sRightPadX, &pState->sRightPadY, flRotationAngle);
|
nRightPadX = pState->sRightPadX;
|
||||||
pState->sRightPadX = clamp(pState->sRightPadX + nPadOffset, SDL_MIN_SINT16, SDL_MAX_SINT16);
|
nRightPadY = pState->sRightPadY;
|
||||||
pState->sRightPadY = clamp(pState->sRightPadY + nPadOffset, SDL_MIN_SINT16, SDL_MAX_SINT16);
|
RotatePad(&nRightPadX, &nRightPadY, flRotationAngle);
|
||||||
|
pState->sRightPadX = (short)clamp(nRightPadX + nPadOffset, SDL_MIN_SINT16, SDL_MAX_SINT16);
|
||||||
|
pState->sRightPadY = (short)clamp(nRightPadY + nPadOffset, SDL_MIN_SINT16, SDL_MAX_SINT16);
|
||||||
pData += nLength;
|
pData += nLength;
|
||||||
}
|
}
|
||||||
if (ucOptionDataMask & k_EBLEIMUAccelChunk) {
|
if (ucOptionDataMask & k_EBLEIMUAccelChunk) {
|
||||||
|
|||||||
Reference in New Issue
Block a user