aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorraysan5 <raysan5@gmail.com>2016-11-01 14:39:57 +0100
committerraysan5 <raysan5@gmail.com>2016-11-01 14:39:57 +0100
commit64f67f6e9f414a54dfc3fb519b892ecd5517f2cf (patch)
treec9587d0b1e84a89a3e9c8acb1ae16a3aeede4f78 /src
parent6d3b11ef9124c9d938d9ecd2b341837bd5ed5dc1 (diff)
downloadraylib-64f67f6e9f414a54dfc3fb519b892ecd5517f2cf.tar.gz
raylib-64f67f6e9f414a54dfc3fb519b892ecd5517f2cf.zip
Improved gamepad support
new function: GetGamepadAxisCount() new function: IsGamepadName()
Diffstat (limited to 'src')
-rw-r--r--src/core.c50
-rw-r--r--src/raylib.h4
2 files changed, 42 insertions, 12 deletions
diff --git a/src/core.c b/src/core.c
index 8850eefa..3bade07b 100644
--- a/src/core.c
+++ b/src/core.c
@@ -58,12 +58,12 @@
#endif
#include <stdio.h> // Standard input / output lib
-#include <stdlib.h> // Declares malloc() and free() for memory management, rand(), atexit()
-#include <stdint.h> // Required for typedef unsigned long long int uint64_t, used by hi-res timer
-#include <time.h> // Useful to initialize random seed - Android/RPI hi-res timer (NOTE: Linux only!)
-#include <math.h> // Math related functions, tan() used to set perspective
-#include <string.h> // String function definitions, memset()
-#include <errno.h> // Macros for reporting and retrieving error conditions through error codes
+#include <stdlib.h> // Required for: malloc(), free(), rand(), atexit()
+#include <stdint.h> // Required for: typedef unsigned long long int uint64_t, used by hi-res timer
+#include <time.h> // Required for: time() - Android/RPI hi-res timer (NOTE: Linux only!)
+#include <math.h> // Required for: tan() [Used in Begin3dMode() to set perspective]
+#include <string.h> // Required for: strcmp()
+//#include <errno.h> // Macros for reporting and retrieving error conditions through error codes
#if defined(PLATFORM_DESKTOP) || defined(PLATFORM_WEB)
//#define GLFW_INCLUDE_NONE // Disable the standard OpenGL header inclusion on GLFW3
@@ -222,6 +222,7 @@ static char currentKeyState[512] = { 0 }; // Registers current frame key state
static int lastKeyPressed = -1; // Register last key pressed
static int lastGamepadButtonPressed = -1; // Register last gamepad button pressed
+static int gamepadAxisCount = 0; // Register number of available gamepad axis
static Vector2 mousePosition; // Mouse position on screen
static Vector2 touchPosition[MAX_TOUCH_POINTS]; // Touch position on screen
@@ -1168,17 +1169,36 @@ bool IsGamepadAvailable(int gamepad)
return result;
}
+// Check gamepad name (if available)
+bool IsGamepadName(int gamepad, const char *name)
+{
+ bool result = false;
+ const char *gamepadName = NULL;
+
+ if (gamepadReady[gamepad]) gamepadName = GetGamepadName(gamepad);
+
+ if ((name != NULL) && (gamepadName != NULL)) result = (strcmp(name, gamepadName) == 0);
+
+ return result;
+}
+
// Return gamepad internal name id
const char *GetGamepadName(int gamepad)
{
#if defined(PLATFORM_DESKTOP)
- if (glfwJoystickPresent(gamepad) == 1) return glfwGetJoystickName(gamepad);
+ if (gamepadReady[gamepad]) return glfwGetJoystickName(gamepad);
else return NULL;
#else
return NULL;
#endif
}
+// Return gamepad axis count
+int GetGamepadAxisCount(int gamepad)
+{
+ return gamepadAxisCount;
+}
+
// Return axis movement vector for a gamepad
float GetGamepadAxisMovement(int gamepad, int axis)
{
@@ -1921,6 +1941,7 @@ static void PollInputEvents(void)
// Reset last gamepad button pressed registered
lastGamepadButtonPressed = -1;
+ gamepadAxisCount = 0;
#if defined(PLATFORM_DESKTOP) || defined(PLATFORM_WEB)
// Mouse input polling
@@ -1943,13 +1964,19 @@ static void PollInputEvents(void)
previousMouseWheelY = currentMouseWheelY;
currentMouseWheelY = 0;
+ // Check if gamepads are ready
+ // NOTE: We do it here in case of disconection
+ for (int i = 0; i < MAX_GAMEPADS; i++)
+ {
+ if (glfwJoystickPresent(i)) gamepadReady[i] = true;
+ else gamepadReady[i] = false;
+ }
+
// Register gamepads buttons events
for (int i = 0; i < MAX_GAMEPADS; i++)
{
- if (glfwJoystickPresent(i)) // Check if gamepad is available
+ if (gamepadReady[i]) // Check if gamepad is available
{
- gamepadReady[i] = true;
-
// Register previous gamepad states
for (int k = 0; k < MAX_GAMEPAD_BUTTONS; k++) previousGamepadState[i][k] = currentGamepadState[i][k];
@@ -1980,8 +2007,9 @@ static void PollInputEvents(void)
{
gamepadAxisState[i][k] = axes[k];
}
+
+ gamepadAxisCount = axisCount;
}
- else gamepadReady[i] = false;
}
glfwPollEvents(); // Register keyboard/mouse events (callbacks)... and window events!
diff --git a/src/raylib.h b/src/raylib.h
index 4996bb2b..58037770 100644
--- a/src/raylib.h
+++ b/src/raylib.h
@@ -687,13 +687,15 @@ RLAPI int GetKeyPressed(void); // Get latest key
RLAPI void SetExitKey(int key); // Set a custom key to exit program (default is ESC)
RLAPI bool IsGamepadAvailable(int gamepad); // Detect if a gamepad is available
+RLAPI bool IsGamepadName(int gamepad, const char *name); // Check gamepad name (if available)
RLAPI const char *GetGamepadName(int gamepad); // Return gamepad internal name id
-RLAPI float GetGamepadAxisMovement(int gamepad, int axis); // Return axis movement value for a gamepad axis
RLAPI bool IsGamepadButtonPressed(int gamepad, int button); // Detect if a gamepad button has been pressed once
RLAPI bool IsGamepadButtonDown(int gamepad, int button); // Detect if a gamepad button is being pressed
RLAPI bool IsGamepadButtonReleased(int gamepad, int button); // Detect if a gamepad button has been released once
RLAPI bool IsGamepadButtonUp(int gamepad, int button); // Detect if a gamepad button is NOT being pressed
RLAPI int GetGamepadButtonPressed(void); // Get the last gamepad button pressed
+RLAPI int GetGamepadAxisCount(int gamepad); // Return gamepad axis count for a gamepad
+RLAPI float GetGamepadAxisMovement(int gamepad, int axis); // Return axis movement value for a gamepad axis
RLAPI bool IsMouseButtonPressed(int button); // Detect if a mouse button has been pressed once
RLAPI bool IsMouseButtonDown(int button); // Detect if a mouse button is being pressed