summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/rcore.c110
1 files changed, 94 insertions, 16 deletions
diff --git a/src/rcore.c b/src/rcore.c
index f9468707..e46751d2 100644
--- a/src/rcore.c
+++ b/src/rcore.c
@@ -5580,6 +5580,32 @@ static void AndroidCommandCallback(struct android_app *app, int32_t cmd)
}
}
+static GamepadButton AndroidTranslateGamepadButton(int button)
+{
+ switch (button)
+ {
+ case AKEYCODE_BUTTON_A: return GAMEPAD_BUTTON_RIGHT_FACE_DOWN;
+ case AKEYCODE_BUTTON_B: return GAMEPAD_BUTTON_RIGHT_FACE_RIGHT;
+ case AKEYCODE_BUTTON_X: return GAMEPAD_BUTTON_RIGHT_FACE_LEFT;
+ case AKEYCODE_BUTTON_Y: return GAMEPAD_BUTTON_RIGHT_FACE_UP;
+ case AKEYCODE_BUTTON_L1: return GAMEPAD_BUTTON_LEFT_TRIGGER_1;
+ case AKEYCODE_BUTTON_R1: return GAMEPAD_BUTTON_RIGHT_TRIGGER_1;
+ case AKEYCODE_BUTTON_L2: return GAMEPAD_BUTTON_LEFT_TRIGGER_2;
+ case AKEYCODE_BUTTON_R2: return GAMEPAD_BUTTON_RIGHT_TRIGGER_2;
+ case AKEYCODE_BUTTON_THUMBL: return GAMEPAD_BUTTON_LEFT_THUMB;
+ case AKEYCODE_BUTTON_THUMBR: return GAMEPAD_BUTTON_RIGHT_THUMB;
+ case AKEYCODE_BUTTON_START: return GAMEPAD_BUTTON_MIDDLE_RIGHT;
+ case AKEYCODE_BUTTON_SELECT: return GAMEPAD_BUTTON_MIDDLE_LEFT;
+ case AKEYCODE_BUTTON_MODE: return GAMEPAD_BUTTON_MIDDLE;
+ // On some (most?) gamepads dpad events are reported as axis motion instead
+ case AKEYCODE_DPAD_DOWN: return GAMEPAD_BUTTON_LEFT_FACE_DOWN;
+ case AKEYCODE_DPAD_RIGHT: return GAMEPAD_BUTTON_LEFT_FACE_RIGHT;
+ case AKEYCODE_DPAD_LEFT: return GAMEPAD_BUTTON_LEFT_FACE_LEFT;
+ case AKEYCODE_DPAD_UP: return GAMEPAD_BUTTON_LEFT_FACE_UP;
+ default: return GAMEPAD_BUTTON_UNKNOWN;
+ }
+}
+
// ANDROID: Get input events
static int32_t AndroidInputCallback(struct android_app *app, AInputEvent *event)
{
@@ -5595,26 +5621,59 @@ static int32_t AndroidInputCallback(struct android_app *app, AInputEvent *event)
if (((source & AINPUT_SOURCE_JOYSTICK) == AINPUT_SOURCE_JOYSTICK) ||
((source & AINPUT_SOURCE_GAMEPAD) == AINPUT_SOURCE_GAMEPAD))
{
- // Get first touch position
- CORE.Input.Touch.position[0].x = AMotionEvent_getX(event, 0);
- CORE.Input.Touch.position[0].y = AMotionEvent_getY(event, 0);
-
- // Get second touch position
- CORE.Input.Touch.position[1].x = AMotionEvent_getX(event, 1);
- CORE.Input.Touch.position[1].y = AMotionEvent_getY(event, 1);
-
- int32_t keycode = AKeyEvent_getKeyCode(event);
- if (AKeyEvent_getAction(event) == AKEY_EVENT_ACTION_DOWN)
+ // For now we'll assume a single gamepad which we "detect" on its input event
+ CORE.Input.Gamepad.ready[0] = true;
+
+ CORE.Input.Gamepad.axisState[0][GAMEPAD_AXIS_LEFT_X] = AMotionEvent_getAxisValue(
+ event, AMOTION_EVENT_AXIS_X, 0);
+ CORE.Input.Gamepad.axisState[0][GAMEPAD_AXIS_LEFT_Y] = AMotionEvent_getAxisValue(
+ event, AMOTION_EVENT_AXIS_Y, 0);
+ CORE.Input.Gamepad.axisState[0][GAMEPAD_AXIS_RIGHT_X] = AMotionEvent_getAxisValue(
+ event, AMOTION_EVENT_AXIS_Z, 0);
+ CORE.Input.Gamepad.axisState[0][GAMEPAD_AXIS_RIGHT_Y] = AMotionEvent_getAxisValue(
+ event, AMOTION_EVENT_AXIS_RZ, 0);
+ CORE.Input.Gamepad.axisState[0][GAMEPAD_AXIS_LEFT_TRIGGER] = AMotionEvent_getAxisValue(
+ event, AMOTION_EVENT_AXIS_BRAKE, 0) * 2.0f - 1.0f;
+ CORE.Input.Gamepad.axisState[0][GAMEPAD_AXIS_RIGHT_TRIGGER] = AMotionEvent_getAxisValue(
+ event, AMOTION_EVENT_AXIS_GAS, 0) * 2.0f - 1.0f;
+
+ // dpad is reported as an axis on android
+ float dpadX = AMotionEvent_getAxisValue(event, AMOTION_EVENT_AXIS_HAT_X, 0);
+ float dpadY = AMotionEvent_getAxisValue(event, AMOTION_EVENT_AXIS_HAT_Y, 0);
+
+ if (dpadX == 1.0f)
+ {
+ CORE.Input.Gamepad.currentButtonState[0][GAMEPAD_BUTTON_LEFT_FACE_RIGHT] = 1;
+ CORE.Input.Gamepad.currentButtonState[0][GAMEPAD_BUTTON_LEFT_FACE_LEFT] = 0;
+ }
+ else if (dpadX == -1.0f)
{
- CORE.Input.Keyboard.currentKeyState[keycode] = 1; // Key down
+ CORE.Input.Gamepad.currentButtonState[0][GAMEPAD_BUTTON_LEFT_FACE_RIGHT] = 0;
+ CORE.Input.Gamepad.currentButtonState[0][GAMEPAD_BUTTON_LEFT_FACE_LEFT] = 1;
+ }
+ else
+ {
+ CORE.Input.Gamepad.currentButtonState[0][GAMEPAD_BUTTON_LEFT_FACE_RIGHT] = 0;
+ CORE.Input.Gamepad.currentButtonState[0][GAMEPAD_BUTTON_LEFT_FACE_LEFT] = 0;
+ }
- CORE.Input.Keyboard.keyPressedQueue[CORE.Input.Keyboard.keyPressedQueueCount] = keycode;
- CORE.Input.Keyboard.keyPressedQueueCount++;
+ if (dpadY == 1.0f)
+ {
+ CORE.Input.Gamepad.currentButtonState[0][GAMEPAD_BUTTON_LEFT_FACE_DOWN] = 1;
+ CORE.Input.Gamepad.currentButtonState[0][GAMEPAD_BUTTON_LEFT_FACE_UP] = 0;
+ }
+ else if (dpadY == -1.0f)
+ {
+ CORE.Input.Gamepad.currentButtonState[0][GAMEPAD_BUTTON_LEFT_FACE_DOWN] = 0;
+ CORE.Input.Gamepad.currentButtonState[0][GAMEPAD_BUTTON_LEFT_FACE_UP] = 1;
+ }
+ else
+ {
+ CORE.Input.Gamepad.currentButtonState[0][GAMEPAD_BUTTON_LEFT_FACE_DOWN] = 0;
+ CORE.Input.Gamepad.currentButtonState[0][GAMEPAD_BUTTON_LEFT_FACE_UP] = 0;
}
- else CORE.Input.Keyboard.currentKeyState[keycode] = 0; // Key up
- // Stop processing gamepad buttons
- return 1;
+ return 1; // Handled gamepad axis motion
}
}
else if (type == AINPUT_EVENT_TYPE_KEY)
@@ -5622,6 +5681,25 @@ static int32_t AndroidInputCallback(struct android_app *app, AInputEvent *event)
int32_t keycode = AKeyEvent_getKeyCode(event);
//int32_t AKeyEvent_getMetaState(event);
+ // Handle gamepad button presses and releases
+ if (((source & AINPUT_SOURCE_JOYSTICK) == AINPUT_SOURCE_JOYSTICK) ||
+ ((source & AINPUT_SOURCE_GAMEPAD) == AINPUT_SOURCE_GAMEPAD))
+ {
+ // For now we'll assume a single gamepad which we "detect" on its input event
+ CORE.Input.Gamepad.ready[0] = true;
+
+ GamepadButton button = AndroidTranslateGamepadButton(keycode);
+ if (button == GAMEPAD_BUTTON_UNKNOWN)
+ return 1;
+
+ if (AKeyEvent_getAction(event) == AKEY_EVENT_ACTION_DOWN)
+ {
+ CORE.Input.Gamepad.currentButtonState[0][button] = 1;
+ }
+ else CORE.Input.Gamepad.currentButtonState[0][button] = 0; // Key up
+ return 1; // Handled gamepad button
+ }
+
// Save current button and its state
// NOTE: Android key action is 0 for down and 1 for up
if (AKeyEvent_getAction(event) == AKEY_EVENT_ACTION_DOWN)