diff --git a/release/include/raylib.h b/release/include/raylib.h index b68a36c6..0da3a552 100644 --- a/release/include/raylib.h +++ b/release/include/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 diff --git a/release/libs/android/arm64-v8a/libraylib.a b/release/libs/android/arm64-v8a/libraylib.a index 3c593bbc..100abf64 100644 Binary files a/release/libs/android/arm64-v8a/libraylib.a and b/release/libs/android/arm64-v8a/libraylib.a differ diff --git a/release/libs/win32/mingw32/libraylib.a b/release/libs/win32/mingw32/libraylib.a index 955b13a3..4637d1db 100644 Binary files a/release/libs/win32/mingw32/libraylib.a and b/release/libs/win32/mingw32/libraylib.a differ 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