mirror of
https://github.com/XProger/OpenLara.git
synced 2025-08-06 05:07:48 +02:00
macOS add popular gamepads support, fix game exit
This commit is contained in:
@@ -199,6 +199,7 @@
|
|||||||
developmentRegion = English;
|
developmentRegion = English;
|
||||||
hasScannedForEncodings = 0;
|
hasScannedForEncodings = 0;
|
||||||
knownRegions = (
|
knownRegions = (
|
||||||
|
English,
|
||||||
en,
|
en,
|
||||||
);
|
);
|
||||||
mainGroup = 99C4C0771796A8230032DE85;
|
mainGroup = 99C4C0771796A8230032DE85;
|
||||||
|
@@ -107,33 +107,43 @@ float joyAxisValue(IOHIDValueRef value) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static const struct { uint32 vendorId, productId; } JOY_VENDORS[] = {
|
static const struct { uint32 vendorId, productId; } JOY_VENDORS[] = {
|
||||||
{ 0x045E, 0x0000 }, // Microsoft
|
{ 0x045E, 0x02FD }, // Microsoft Xbox One
|
||||||
|
{ 0x045E, 0x0000 }, // Microsoft x360
|
||||||
{ 0x2DC8, 0x0000 }, // 8Bitdo
|
{ 0x2DC8, 0x0000 }, // 8Bitdo
|
||||||
|
{ 0x054C, 0x0CE6 }, // Sony DualSense
|
||||||
{ 0x054C, 0x05C4 }, // Sony DS4 CUH-ZCT1x
|
{ 0x054C, 0x05C4 }, // Sony DS4 CUH-ZCT1x
|
||||||
{ 0x054C, 0x09CC }, // Sony DS4 CUH-ZCT2x
|
{ 0x054C, 0x09CC }, // Sony DS4 CUH-ZCT2x
|
||||||
{ 0x054C, 0x0000 }, // Sony DS3
|
{ 0x054C, 0x0000 }, // Sony DS3
|
||||||
{ 0x2717, 0x0000 }, // Xiaomi
|
{ 0x2717, 0x0000 }, // Xiaomi
|
||||||
|
{ 0x18D1, 0x9400 }, // Google Stadia Controller
|
||||||
};
|
};
|
||||||
|
|
||||||
#define JOY_MAX_VENDORS COUNT(JOY_VENDORS)
|
#define JOY_MAX_VENDORS COUNT(JOY_VENDORS)
|
||||||
#define JOY_MAX_BUTTONS 17
|
#define JOY_MAX_BUTTONS 17
|
||||||
|
|
||||||
static const uint32 joyAxisTable[][6] = {
|
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_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, 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, 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, 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] = {
|
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 },
|
{ 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 },
|
{ 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 },
|
{ 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 },
|
{ 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, 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) {
|
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));
|
Input::setJoyPos(joyIndex, jkRT, vec2(joyAxisValue(value) * 0.5f + 0.5f, 0.0f));
|
||||||
else if (usage == kHIDUsage_GD_Hatswitch) {
|
else if (usage == kHIDUsage_GD_Hatswitch) {
|
||||||
CFIndex p = IOHIDValueGetIntegerValue(value);
|
CFIndex p = IOHIDValueGetIntegerValue(value);
|
||||||
Input::setJoyDown(joyIndex, jkUp, p == 7 || p == 0 || p == 1);
|
CFIndex min = IOHIDElementGetLogicalMin(element);
|
||||||
Input::setJoyDown(joyIndex, jkRight, p == 1 || p == 2 || p == 3);
|
if (min == 0)
|
||||||
Input::setJoyDown(joyIndex, jkDown, p == 3 || p == 4 || p == 5);
|
{
|
||||||
Input::setJoyDown(joyIndex, jkLeft, p == 5 || p == 6 || p == 7);
|
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])
|
//if (usage != axis[0] && usage != axis[1] && usage != axis[2] && usage != axis[3])
|
||||||
// LOG("! joy: axis 0x%x (%d)\n", usage, (int)IOHIDValueGetIntegerValue(value));
|
// LOG("! joy: axis 0x%x (%d)\n", usage, (int)IOHIDValueGetIntegerValue(value));
|
||||||
break;
|
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 : {
|
case kHIDPage_Button : {
|
||||||
uint32_t button = IOHIDElementGetUsage(IOHIDValueGetElement(value)) - kHIDUsage_Button_1;
|
uint32_t button = IOHIDElementGetUsage(IOHIDValueGetElement(value)) - kHIDUsage_Button_1;
|
||||||
bool down = IOHIDValueGetIntegerValue(value) != 0;
|
bool down = IOHIDValueGetIntegerValue(value) != 0;
|
||||||
@@ -429,6 +451,13 @@ BOOL allowFrameUpdate = YES;
|
|||||||
[inv setTarget:self];
|
[inv setTarget:self];
|
||||||
[inv setArgument:&arg atIndex:2];
|
[inv setArgument:&arg atIndex:2];
|
||||||
[inv performSelector:@selector(invoke) withObject:self afterDelay:nextDelaySec];
|
[inv performSelector:@selector(invoke) withObject:self afterDelay:nextDelaySec];
|
||||||
|
|
||||||
|
if (Core::isQuit)
|
||||||
|
{
|
||||||
|
NSApplication *application = [NSApplication sharedApplication];
|
||||||
|
[application stop:nil];
|
||||||
|
[application abortModal]; // generate UI event
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
Reference in New Issue
Block a user