summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorraysan5 <[email protected]>2018-07-07 10:15:19 +0200
committerraysan5 <[email protected]>2018-07-07 10:15:19 +0200
commitc6d188a09a9a82653027476690a69c28e8545e48 (patch)
tree7f336190e1771b7919b259927f5a5b3ce889248b /src
parent50088bf49bd923e32a93a6687f030f289d5805ac (diff)
downloadraylib-c6d188a09a9a82653027476690a69c28e8545e48.tar.gz
raylib-c6d188a09a9a82653027476690a69c28e8545e48.zip
Reviewed latest commit for Android gamepad support
Diffstat (limited to 'src')
-rw-r--r--src/Makefile52
-rw-r--r--src/core.c57
-rw-r--r--src/raylib.h34
3 files changed, 68 insertions, 75 deletions
diff --git a/src/Makefile b/src/Makefile
index 8ba6d303..d3024df2 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -170,13 +170,22 @@ ifeq ($(PLATFORM),PLATFORM_WEB)
endif
ifeq ($(PLATFORM),PLATFORM_ANDROID)
- # Android required path variables
- ANDROID_NDK = C:/android-ndk
- ANDROID_TOOLCHAIN = C:/android_toolchain_arm64_api21
-
# Android architecture: ARM64
# Starting at 2019 using ARM64 is mandatory for published apps
ANDROID_ARCH ?= ARM64
+
+ # Android required path variables
+ # NOTE: Android NDK is just required to generate the standalone toolchain,
+ # in case is not already provided
+ ANDROID_NDK = C:/android-ndk
+
+ # Android standalone toolchain path
+ ifeq ($(ANDROID_ARCH),ARM64)
+ ANDROID_TOOLCHAIN = C:/android_toolchain_arm64_api21
+ endif
+ ifeq ($(ANDROID_ARCH),ARM)
+ ANDROID_TOOLCHAIN = C:/android_toolchain_arm_api21
+ endif
endif
# RAYLIB_RELEASE_PATH points to provided binaries or your immediate build of raylib.
@@ -233,9 +242,10 @@ ifeq ($(PLATFORM),PLATFORM_ANDROID)
GRAPHICS = GRAPHICS_API_OPENGL_ES2
endif
-# Define default C compiler: gcc
+# Define default C compiler and archiver to pack library
# NOTE: define g++ compiler if using C++
CC = gcc
+AR = ar
ifeq ($(PLATFORM),PLATFORM_DESKTOP)
ifeq ($(PLATFORM_OS),OSX)
@@ -253,6 +263,7 @@ ifeq ($(PLATFORM),PLATFORM_RPI)
# Define RPI cross-compiler
#CC = armv6j-hardfloat-linux-gnueabi-gcc
CC = $(RPI_TOOLCHAIN)/bin/arm-linux-gnueabihf-gcc
+ AR = $(RPI_TOOLCHAIN)/bin/arm-linux-gnueabihf-ar
endif
endif
ifeq ($(PLATFORM),PLATFORM_WEB)
@@ -263,33 +274,15 @@ ifeq ($(PLATFORM),PLATFORM_ANDROID)
# Android toolchain (must be provided for desired architecture and compiler)
ifeq ($(ANDROID_ARCH),ARM64)
CC = $(ANDROID_TOOLCHAIN)/bin/aarch64-linux-android-clang
- endif
- ifeq ($(ANDROID_ARCH),ARM)
- CC = $(ANDROID_TOOLCHAIN)/bin/arm-linux-androideabi-clang
- endif
-endif
-
-# Default archiver program to pack libraries
-AR = ar
-
-ifeq ($(PLATFORM),PLATFORM_RPI)
- ifeq ($(USE_RPI_CROSS_COMPILER),TRUE)
- # Define RPI cross-archiver
- #CC = armv6j-hardfloat-linux-gnueabi-gcc
- AR = $(RPI_TOOLCHAIN)/bin/arm-linux-gnueabihf-ar
- endif
-endif
-
-# Android archiver (also depends on desired architecture)
-ifeq ($(PLATFORM),PLATFORM_ANDROID)
- ifeq ($(ANDROID_ARCH),ARM64)
AR = $(ANDROID_TOOLCHAIN)/bin/aarch64-linux-android-ar
endif
ifeq ($(ANDROID_ARCH),ARM)
+ CC = $(ANDROID_TOOLCHAIN)/bin/arm-linux-androideabi-clang
AR = $(ANDROID_TOOLCHAIN)/bin/arm-linux-androideabi-ar
endif
endif
+
# Define compiler flags:
# -O1 defines optimization level
# -g enable debugging
@@ -327,11 +320,11 @@ endif
ifeq ($(PLATFORM),PLATFORM_ANDROID)
# Compiler flags for arquitecture (only ARM, not ARM64)
ifeq ($(ANDROID_ARCH),ARM64)
- CFLAGS += -target aarch64 -mfix-cortex-a53-835769
- endif
+ CFLAGS += -target aarch64 -mfix-cortex-a53-835769
+ endif
ifeq ($(ANDROID_ARCH),ARM)
- CFLAGS += -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16
- endif
+ CFLAGS += -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16
+ endif
# Compilation functions attributes options
CFLAGS += -ffunction-sections -funwind-tables -fstack-protector-strong -fPIE -fPIC
# Compiler options for the linker
@@ -552,6 +545,7 @@ stb_vorbis.o: external/stb_vorbis.c external/stb_vorbis.h
utils.o : utils.c utils.h
$(CC) -c $< $(CFLAGS) $(INCLUDE_PATHS) -D$(PLATFORM)
+
# Install generated and needed files to desired directories.
# On GNU/Linux and BSDs, there are some standard directories that contain extra
# libraries and header files. These directories (often /usr/local/lib and
diff --git a/src/core.c b/src/core.c
index 28a04e4d..45615f83 100644
--- a/src/core.c
+++ b/src/core.c
@@ -3099,14 +3099,17 @@ static int32_t AndroidInputCallback(struct android_app *app, AInputEvent *event)
//AMotionEvent_getAxisValue()
//AMotionEvent_getButtonState()
- // This is all it takes to capture gamepad dpad button presses
+ // Gamepad dpad button presses capturing
+ // TODO: That's weird, key input (or button)
+ // shouldn't come as a TYPE_MOTION event...
int32_t keycode = AKeyEvent_getKeyCode(event);
- if (AKeyEvent_getAction(event) == 0)
+ if (AKeyEvent_getAction(event) == AKEY_EVENT_ACTION_DOWN)
{
currentKeyState[keycode] = 1; // Key down
lastKeyPressed = keycode;
}
else currentKeyState[keycode] = 0; // Key up
+
}
else if (type == AINPUT_EVENT_TYPE_KEY)
{
@@ -3115,9 +3118,9 @@ static int32_t AndroidInputCallback(struct android_app *app, AInputEvent *event)
// Save current button and its state
// NOTE: Android key action is 0 for down and 1 for up
- if (AKeyEvent_getAction(event) == 0)
+ if (AKeyEvent_getAction(event) == AKEY_EVENT_ACTION_DOWN)
{
- currentKeyState[keycode] = 1; // Key down
+ currentKeyState[keycode] = 1; // Key down
lastKeyPressed = keycode;
}
else currentKeyState[keycode] = 0; // Key up
@@ -3146,14 +3149,7 @@ static int32_t AndroidInputCallback(struct android_app *app, AInputEvent *event)
int32_t action = AMotionEvent_getAction(event);
unsigned int flags = action & AMOTION_EVENT_ACTION_MASK;
-
#if defined(SUPPORT_GESTURES_SYSTEM)
-
- // @Completeness: Fix this so that gamepad does not cause this to crash
- // If actions is not caputred in the above, then it may not be a gesture at all.
- // If we do not end here, when we reach getPointerId there is a high likelyhood of crashing
- return 0;
-
GestureEvent gestureEvent;
// Register touch actions
@@ -3162,29 +3158,32 @@ static int32_t AndroidInputCallback(struct android_app *app, AInputEvent *event)
else if (flags == AMOTION_EVENT_ACTION_MOVE) gestureEvent.touchAction = TOUCH_MOVE;
// Register touch points count
+ // NOTE: Documentation says pointerCount is Always >= 1,
+ // but in practice it can be 0 or over a million
gestureEvent.pointCount = AMotionEvent_getPointerCount(event);
- // Documentation says pointerCount is Always >= 1.
- // But in practice it can be 0 or over a million
- // Register touch points id
-
- // Register touch points position
- // NOTE: Only two points registered
- // @Fix: This is where the break happens for dpads
- gestureEvent.pointerId[0] = AMotionEvent_getPointerId(event, 0);
- gestureEvent.pointerId[1] = AMotionEvent_getPointerId(event, 1);
+ // Only enable gestures for 1-3 touch points
+ if ((gestureEvent.pointCount > 0) && (gestureEvent.pointCount < 4))
+ {
+ // Register touch points id
+ // NOTE: Only two points registered
+ gestureEvent.pointerId[0] = AMotionEvent_getPointerId(event, 0);
+ gestureEvent.pointerId[1] = AMotionEvent_getPointerId(event, 1);
- gestureEvent.position[0] = (Vector2){ AMotionEvent_getX(event, 0), AMotionEvent_getY(event, 0) };
- gestureEvent.position[1] = (Vector2){ AMotionEvent_getX(event, 1), AMotionEvent_getY(event, 1) };
+ // Register touch points position
+ gestureEvent.position[0] = (Vector2){ AMotionEvent_getX(event, 0), AMotionEvent_getY(event, 0) };
+ gestureEvent.position[1] = (Vector2){ AMotionEvent_getX(event, 1), AMotionEvent_getY(event, 1) };
- // Normalize gestureEvent.position[x] for screenWidth and screenHeight
- gestureEvent.position[0].x /= (float)GetScreenWidth();
- gestureEvent.position[1].x /= (float)GetScreenWidth();
- gestureEvent.position[0].y /= (float)GetScreenHeight();
- gestureEvent.position[1].y /= (float)GetScreenHeight();
+ // Normalize gestureEvent.position[x] for screenWidth and screenHeight
+ gestureEvent.position[0].x /= (float)GetScreenWidth();
+ gestureEvent.position[0].y /= (float)GetScreenHeight();
+
+ gestureEvent.position[1].x /= (float)GetScreenWidth();
+ gestureEvent.position[1].y /= (float)GetScreenHeight();
- // Gesture data is sent to gestures system for processing
- ProcessGestureEvent(gestureEvent);
+ // Gesture data is sent to gestures system for processing
+ ProcessGestureEvent(gestureEvent);
+ }
#else
// Support only simple touch position
diff --git a/src/raylib.h b/src/raylib.h
index b68a36c6..0da3a552 100644
--- a/src/raylib.h
+++ b/src/raylib.h
@@ -241,23 +241,23 @@
#define GAMEPAD_XBOX_BUTTON_LEFT 13
#define GAMEPAD_XBOX_BUTTON_HOME 8
-// 8BitDo Gamepad SNES CLASSIC
-#define GAMEPAD_SNES_DPAD_UP 19
-#define GAMEPAD_SNES_DPAD_DOWN 20
-#define GAMEPAD_SNES_DPAD_LEFT 21
-#define GAMEPAD_SNES_DPAD_RIGHT 22
-#define GAMEPAD_SNES_DPAD_CENTER 23
-
-#define GAMEPAD_SNES_BUTTON_A 96
-#define GAMEPAD_SNES_BUTTON_B 97
-#define GAMEPAD_SNES_BUTTON_C 98
-#define GAMEPAD_SNES_BUTTON_X 99
-#define GAMEPAD_SNES_BUTTON_Y 100
-#define GAMEPAD_SNES_BUTTON_Z 101
-#define GAMEPAD_SNES_BUTTON_L1 102
-#define GAMEPAD_SNES_BUTTON_R1 103
-#define GAMEPAD_SNES_BUTTON_L2 104
-#define GAMEPAD_SNES_BUTTON_R2 105
+// Android Gamepad Controller (SNES CLASSIC)
+#define GAMEPAD_ANDROID_DPAD_UP 19
+#define GAMEPAD_ANDROID_DPAD_DOWN 20
+#define GAMEPAD_ANDROID_DPAD_LEFT 21
+#define GAMEPAD_ANDROID_DPAD_RIGHT 22
+#define GAMEPAD_ANDROID_DPAD_CENTER 23
+
+#define GAMEPAD_ANDROID_BUTTON_A 96
+#define GAMEPAD_ANDROID_BUTTON_B 97
+#define GAMEPAD_ANDROID_BUTTON_C 98
+#define GAMEPAD_ANDROID_BUTTON_X 99
+#define GAMEPAD_ANDROID_BUTTON_Y 100
+#define GAMEPAD_ANDROID_BUTTON_Z 101
+#define GAMEPAD_ANDROID_BUTTON_L1 102
+#define GAMEPAD_ANDROID_BUTTON_R1 103
+#define GAMEPAD_ANDROID_BUTTON_L2 104
+#define GAMEPAD_ANDROID_BUTTON_R2 105
// Xbox360 USB Controller Axis
// NOTE: For Raspberry Pi, axis must be reconfigured