1
0
mirror of https://github.com/XProger/OpenLara.git synced 2025-08-01 02:40:43 +02:00

macOS add popular gamepads support, fix game exit

This commit is contained in:
XProger
2023-03-01 05:34:39 +03:00
parent 50066382df
commit 6033a1ffe1
2 changed files with 36 additions and 6 deletions

View File

@@ -199,6 +199,7 @@
developmentRegion = English;
hasScannedForEncodings = 0;
knownRegions = (
English,
en,
);
mainGroup = 99C4C0771796A8230032DE85;

View File

@@ -107,33 +107,43 @@ float joyAxisValue(IOHIDValueRef value) {
}
static const struct { uint32 vendorId, productId; } JOY_VENDORS[] = {
{ 0x045E, 0x0000 }, // Microsoft
{ 0x045E, 0x02FD }, // Microsoft Xbox One
{ 0x045E, 0x0000 }, // Microsoft x360
{ 0x2DC8, 0x0000 }, // 8Bitdo
{ 0x054C, 0x0CE6 }, // Sony DualSense
{ 0x054C, 0x05C4 }, // Sony DS4 CUH-ZCT1x
{ 0x054C, 0x09CC }, // Sony DS4 CUH-ZCT2x
{ 0x054C, 0x0000 }, // Sony DS3
{ 0x2717, 0x0000 }, // Xiaomi
{ 0x18D1, 0x9400 }, // Google Stadia Controller
};
#define JOY_MAX_VENDORS COUNT(JOY_VENDORS)
#define JOY_MAX_BUTTONS 17
static const uint32 joyAxisTable[][6] = {
{ kHIDUsage_GD_X, kHIDUsage_GD_Y, kHIDUsage_GD_Z, kHIDUsage_GD_Rz, kHIDUsage_GD_Z, kHIDUsage_GD_Rz },
{ kHIDUsage_GD_X, kHIDUsage_GD_Y, kHIDUsage_GD_Rx, kHIDUsage_GD_Ry, kHIDUsage_GD_Z, kHIDUsage_GD_Rz },
{ kHIDUsage_GD_X, kHIDUsage_GD_Y, kHIDUsage_GD_Z, kHIDUsage_GD_Rz, 0, 0 },
{ kHIDUsage_GD_X, kHIDUsage_GD_Y, kHIDUsage_GD_Z, kHIDUsage_GD_Rz, 0, 0 },
{ kHIDUsage_GD_X, kHIDUsage_GD_Y, kHIDUsage_GD_Z, kHIDUsage_GD_Rz, 0, 0 },
{ kHIDUsage_GD_X, kHIDUsage_GD_Y, kHIDUsage_GD_Z, kHIDUsage_GD_Rz, kHIDUsage_GD_Rx, kHIDUsage_GD_Ry },
{ kHIDUsage_GD_X, kHIDUsage_GD_Y, kHIDUsage_GD_Z, kHIDUsage_GD_Rz, 0, 0 },
{ kHIDUsage_GD_X, kHIDUsage_GD_Y, kHIDUsage_GD_Z, kHIDUsage_GD_Rz, 0, 0 },
{ kHIDUsage_GD_X, kHIDUsage_GD_Y, kHIDUsage_GD_Z, kHIDUsage_GD_Rz, kHIDUsage_GD_Z, kHIDUsage_GD_Rz },
{ kHIDUsage_GD_X, kHIDUsage_GD_Y, kHIDUsage_GD_Z, kHIDUsage_GD_Rz, kHIDUsage_GD_Z, kHIDUsage_GD_Rz }
};
static const uint32 joyButtonsTable[][JOY_MAX_BUTTONS] = {
{ jkA, jkB, jkNone, jkX, jkY, jkNone, jkLB, jkRB, jkNone, jkNone, jkNone, jkStart, jkNone, jkL, jkR, jkNone, jkNone },
{ jkA, jkB, jkX, jkY, jkLB, jkRB, jkLT, jkRT, jkStart, jkSelect, jkNone, jkUp, jkDown, jkLeft, jkRight, jkNone, jkNone },
{ jkB, jkA, jkNone, jkY, jkX, jkNone, jkLB, jkRB, jkLT, jkRT, jkSelect, jkStart, jkNone, jkL, jkR, jkNone, jkNone },
{ jkX, jkA, jkB, jkY, jkLB, jkRB, jkLT, jkRT, jkSelect, jkStart, jkL, jkR, jkNone, jkNone, jkNone, jkNone, jkNone },
{ jkX, jkA, jkB, jkY, jkLB, jkRB, jkLT, jkRT, jkSelect, jkStart, jkL, jkR, jkNone, jkNone, jkNone, jkNone, jkNone },
{ jkX, jkA, jkB, jkY, jkLB, jkRB, jkLT, jkRT, jkSelect, jkStart, jkL, jkR, jkNone, jkNone, jkNone, jkNone, jkNone },
{ jkSelect, jkL, jkR, jkStart, jkUp, jkRight, jkDown, jkLeft, jkLT, jkRT, jkLB, jkRB, jkY, jkB, jkA, jkX, jkNone },
{ jkA, jkB, jkNone, jkX, jkY, jkNone, jkLB, jkRB, jkLT, jkRT, jkSelect, jkStart, jkNone, jkL, jkR, jkNone, jkNone },
{ jkA, jkB, jkNone, jkX, jkY, jkNone, jkLB, jkRB, jkNone, jkNone, jkSelect, jkStart, jkNone, jkL, jkR, jkNone, jkNone }
};
JoyKey joyButtonToKey(const uint32 *btns, uint32 button) {
@@ -199,15 +209,27 @@ void hidValueCallback(void *context, IOReturn result, void *sender, IOHIDValueRe
Input::setJoyPos(joyIndex, jkRT, vec2(joyAxisValue(value) * 0.5f + 0.5f, 0.0f));
else if (usage == kHIDUsage_GD_Hatswitch) {
CFIndex p = IOHIDValueGetIntegerValue(value);
Input::setJoyDown(joyIndex, jkUp, p == 7 || p == 0 || p == 1);
Input::setJoyDown(joyIndex, jkRight, p == 1 || p == 2 || p == 3);
Input::setJoyDown(joyIndex, jkDown, p == 3 || p == 4 || p == 5);
Input::setJoyDown(joyIndex, jkLeft, p == 5 || p == 6 || p == 7);
CFIndex min = IOHIDElementGetLogicalMin(element);
if (min == 0)
{
p++;
}
Input::setJoyDown(joyIndex, jkUp, p == 8 || p == 1 || p == 2);
Input::setJoyDown(joyIndex, jkRight, p == 2 || p == 3 || p == 4);
Input::setJoyDown(joyIndex, jkDown, p == 4 || p == 5 || p == 6);
Input::setJoyDown(joyIndex, jkLeft, p == 6 || p == 7 || p == 8);
}
//if (usage != axis[0] && usage != axis[1] && usage != axis[2] && usage != axis[3])
// LOG("! joy: axis 0x%x (%d)\n", usage, (int)IOHIDValueGetIntegerValue(value));
break;
}
case kHIDPage_Simulation : {
if (usage == kHIDUsage_Sim_Accelerator)
Input::setJoyPos(joyIndex, jkRT, vec2(joyAxisValue(value) * 0.5f + 0.5f, 0.0f));
else if (usage == kHIDUsage_Sim_Brake)
Input::setJoyPos(joyIndex, jkLT, vec2(joyAxisValue(value) * 0.5f + 0.5f, 0.0f));
break;
}
case kHIDPage_Button : {
uint32_t button = IOHIDElementGetUsage(IOHIDValueGetElement(value)) - kHIDUsage_Button_1;
bool down = IOHIDValueGetIntegerValue(value) != 0;
@@ -429,6 +451,13 @@ BOOL allowFrameUpdate = YES;
[inv setTarget:self];
[inv setArgument:&arg atIndex:2];
[inv performSelector:@selector(invoke) withObject:self afterDelay:nextDelaySec];
if (Core::isQuit)
{
NSApplication *application = [NSApplication sharedApplication];
[application stop:nil];
[application abortModal]; // generate UI event
}
}
@end