| 
				
				
					
						
					
				
				
				 | 
			
			 | 
			
			@ -102,16 +102,6 @@ | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    #include "EGL/egl.h"        // Khronos EGL library - Native platform display device control functions | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    #include "EGL/eglext.h"     // Khronos EGL library - Extensions | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    #include "GLES2/gl2.h"      // Khronos OpenGL ES 2.0 library | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			     | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    // Old device inputs system | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    #define DEFAULT_KEYBOARD_DEV      STDIN_FILENO            // Standard input | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    #define DEFAULT_MOUSE_DEV         "/dev/input/mouse0" | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    #define DEFAULT_GAMEPAD_DEV       "/dev/input/js0" | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    // New device input events (evdev) (must be detected) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    //#define DEFAULT_KEYBOARD_DEV    "/dev/input/eventN" | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    //#define DEFAULT_MOUSE_DEV       "/dev/input/eventN" | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    //#define DEFAULT_GAMEPAD_DEV     "/dev/input/eventN" | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			#endif | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			#if defined(PLATFORM_WEB) | 
			
		
		
	
	
		
			
				| 
				
				
				
					
						
					
				
				 | 
			
			 | 
			
			@ -124,6 +114,21 @@ | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			//---------------------------------------------------------------------------------- | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			#define STORAGE_FILENAME     "storage.data" | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			#if defined(PLATFORM_RPI) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    // Old device inputs system | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    #define DEFAULT_KEYBOARD_DEV      STDIN_FILENO            // Standard input | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    #define DEFAULT_MOUSE_DEV         "/dev/input/mouse0" | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    #define DEFAULT_GAMEPAD_DEV       "/dev/input/js0" | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    // New device input events (evdev) (must be detected) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    //#define DEFAULT_KEYBOARD_DEV    "/dev/input/eventN" | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    //#define DEFAULT_MOUSE_DEV       "/dev/input/eventN" | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    //#define DEFAULT_GAMEPAD_DEV     "/dev/input/eventN" | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			     | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    #define MOUSE_SENSITIVITY         1.0f | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    #define MAX_GAMEPAD_BUTTONS       11 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			#endif | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			//---------------------------------------------------------------------------------- | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			// Types and Structures Definition | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			//---------------------------------------------------------------------------------- | 
			
		
		
	
	
		
			
				| 
				
					
						
					
				
				
					
						
					
				
				
				 | 
			
			 | 
			
			@ -168,6 +173,10 @@ pthread_t mouseThreadId;                        // Mouse reading thread id | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			static int gamepadStream = -1;                  // Gamepad device file descriptor | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			static bool gamepadReady = false;               // Flag to know if gamepad is ready | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			pthread_t gamepadThreadId;                      // Gamepad reading thread id | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			int gamepadButtons[MAX_GAMEPAD_BUTTONS]; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			int gamepadAxisX = 0; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			int gamepadAxisY = 0; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			#endif | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			#if defined(PLATFORM_ANDROID) || defined(PLATFORM_RPI) | 
			
		
		
	
	
		
			
				| 
				
					
						
					
				
				
					
						
					
				
				
				 | 
			
			 | 
			
			@ -1165,6 +1174,7 @@ Vector2 GetGamepadMovement(int gamepad) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			     | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			#if defined(PLATFORM_RPI) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    // TODO: Get gamepad axis information | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    // Use gamepadAxisX, gamepadAxisY | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			#else | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    axes = glfwGetJoystickAxes(gamepad, &axisCount); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			#endif | 
			
		
		
	
	
		
			
				| 
				
					
						
					
				
				
					
						
					
				
				
				 | 
			
			 | 
			
			@ -1206,7 +1216,9 @@ bool IsGamepadButtonDown(int gamepad, int button) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    int buttonsCount; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			     | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			#if defined(PLATFORM_RPI) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    // TODO: Get gamepad buttons information | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    // Get gamepad buttons information | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    if ((gamepad == 0) && (gamepadButtons[button] == 1)) result = true; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    else result = false; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			#else | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    buttons = glfwGetJoystickButtons(gamepad, &buttonsCount); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
	
		
			
				| 
				
					
						
					
				
				
					
						
					
				
				
				 | 
			
			 | 
			
			@ -1242,7 +1254,9 @@ bool IsGamepadButtonUp(int gamepad, int button) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    int buttonsCount; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			#if defined(PLATFORM_RPI) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    // TODO: Get gamepad buttons information | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    // Get gamepad buttons information | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    if ((gamepad == 0) && (gamepadButtons[button] == 0)) result = true; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    else result = false; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			#else | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    buttons = glfwGetJoystickButtons(gamepad, &buttonsCount); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
	
		
			
				| 
				
					
						
					
				
				
					
						
					
				
				
				 | 
			
			 | 
			
			@ -2400,8 +2414,10 @@ static void *MouseThread(void *arg) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            if ((mouse.buttons & XSIGN) > 0) mouseRelX = -1*(255 - mouseRelX); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            if ((mouse.buttons & YSIGN) > 0) mouseRelY = -1*(255 - mouseRelY); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			             | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            mousePosition.x += (float)mouseRelX; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            mousePosition.y -= (float)mouseRelY; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            // TODO: Mouse movement should not depend on screenWidth and screenHeight, normalize! | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			             | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            mousePosition.x += (float)mouseRelX/MOUSE_SENSITIVITY; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            mousePosition.y -= (float)mouseRelY/MOUSE_SENSITIVITY; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			             | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            if (mousePosition.x < 0) mousePosition.x = 0; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            if (mousePosition.y < 0) mousePosition.y = 0; | 
			
		
		
	
	
		
			
				| 
				
					
						
					
				
				
					
						
					
				
				
				 | 
			
			 | 
			
			@ -2453,11 +2469,6 @@ static void *GamepadThread(void *arg) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    // Read gamepad event | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
				struct js_event gamepadEvent; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    int bytes; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			     | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    int buttons[11]; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    int stickX; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    int stickY; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			     | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
				while (1)  | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    { | 
			
		
		
	
	
		
			
				| 
				
				
				
					
						
					
				
				 | 
			
			 | 
			
			@ -2468,12 +2479,12 @@ static void *GamepadThread(void *arg) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            // Process gamepad events by type | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            if (gamepadEvent.type == JS_EVENT_BUTTON)  | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            { | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			                if (gamepadEvent.number < mi">11)  | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			                if (gamepadEvent.number < n">MAX_GAMEPAD_BUTTONS)  | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			                { | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			                    switch (gamepadEvent.value)  | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			                    { | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			                        case 0: | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			                        case 1: buttons[gamepadEvent.number] = gamepadEvent.value; break; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			                        case 1: gamepadButtons[gamepadEvent.number] = (int)gamepadEvent.value; break; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			                        default: break; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			                    } | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			                } | 
			
		
		
	
	
		
			
				| 
				
				
				
					
						
					
				
				 | 
			
			 | 
			
			@ -2498,8 +2509,8 @@ static void *GamepadThread(void *arg) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            } | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            else if (gamepadEvent.type == JS_EVENT_AXIS)  | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            { | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			                if (gamepadEvent.number == joystickAxisX) stickX = gamepadEvent.value; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			                if (gamepadEvent.number == joystickAxisY) stickY = gamepadEvent.value; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			                if (gamepadEvent.number == joystickAxisX) gamepadAxisX = (int)gamepadEvent.value; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			                if (gamepadEvent.number == joystickAxisY) gamepadAxisY = (int)gamepadEvent.value; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			                /* | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			                switch (gamepadEvent.number) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			                { | 
			
		
		
	
	
		
			
				| 
				
				
				
					
						
					
				
				 | 
			
			 | 
			
			@ -2512,7 +2523,6 @@ static void *GamepadThread(void *arg) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			                */ | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            } | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        } | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        else read(gamepadStream, &gamepadEvent, 1);   // Try to sync up again | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
				} | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			} | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			#endif | 
			
		
		
	
	
		
			
				| 
				
					
						
					
				
				
				
				 | 
			
			 | 
			
			
 |