|
|
@ -0,0 +1,58 @@ |
|
|
|
raylib input system basically uses an event polling mechanism, centralized on raylib [core module](https://github.com/raysan5/raylib/blob/master/src/core.c). |
|
|
|
|
|
|
|
At the end of the game loop, `EndDrawing()` function is called. This function calls `SwapBuffers()` and `PollInputEvents()`, multiple input devices are scanned at that moment and states are reqistered. |
|
|
|
|
|
|
|
Depending on the platform, input events are managed using different mechanisms. |
|
|
|
|
|
|
|
Default supported input systems are: `KEYBOARD`, `MOUSE`, `GAMEPAD`, `TOUCH` |
|
|
|
|
|
|
|
PLATFORM_DESKTOP |
|
|
|
--------------------- |
|
|
|
On this platform GLFW3 library ([rglfw](https://github.com/raysan5/raylib/blob/master/src/rglfw.c)) is used for input management. Events polling is done using `glfwPollEvents()`. |
|
|
|
|
|
|
|
Input | Library | Details |
|
|
|
:---: | :---: | --- |
|
|
|
KEYBOARD | GLFW3 | Values are registered through callbacks `KeyCallback()`, `CharCallback()` |
|
|
|
MOUSE | GLFW3 | Values are registered through callbacks `MouseButtonCallback()`, `MouseCursorPosCallback()`, `ScrollCallback()` |
|
|
|
GAMEPAD | GLFW3 | Values registered by (no-callbacks): `glfwJoystickPresent()`, `glfwGetJoystickButtons()`, `glfwGetJoystickAxes()` *NOTE: Those functions do not require `glfwPollEvents()`* |
|
|
|
TOUCH | - | Not available by default. Mouse clicks are mapped to touch events using gestures API. |
|
|
|
|
|
|
|
PLATFORM_WEB |
|
|
|
-------------- |
|
|
|
Some of the inputs in this platform are directly using GLFW3 because the library has been partially [ported to emscripten](https://github.com/emscripten-core/emscripten/blob/incoming/src/library_glfw.js). Despite that, gamepad and touch inputs are directly managed using emscripten API. |
|
|
|
|
|
|
|
Input | Library | Details |
|
|
|
:---: | :---: | --- |
|
|
|
KEYBOARD | GLFW3 | Same as `PLATFOM_DESKTOP`, uses GLFW3 JS implementation |
|
|
|
MOUSE | GLFW3 | Same as `PLATFOM_DESKTOP`, uses GLFW3 JS implementation |
|
|
|
GAMEPAD | Emscripten | Using emscripten gamepad API: `EmscriptenGamepadCallback()` |
|
|
|
TOUCH | Emscripten | Using emscripten touch API: `EmscriptenTouchCallback()` |
|
|
|
|
|
|
|
PLATFORM_ANDROID |
|
|
|
------------------ |
|
|
|
Android NDK provides its own events polling system: `ALooper_pollAll()`, called on `PollInputEvents()`. |
|
|
|
|
|
|
|
Using `AndroidInputCallback()`, all inputs can be later processed. Currently only some inputs are processed but additional inputs could be processed |
|
|
|
|
|
|
|
Input | Library | Details |
|
|
|
:---: | :---: | --- |
|
|
|
KEYBOARD | Android NDK | Keys registered on `AndroidInputCallback()` |
|
|
|
MOUSE | - | Mouse inputs are actually mapped with TOUCH input |
|
|
|
GAMEPAD | Android NDK | Support *partially* implemented on `AndroidInputCallback()` |
|
|
|
TOUCH | Android NDK | Touch points registered on `AndroidInputCallback()` |
|
|
|
|
|
|
|
PLATFORM_RPI |
|
|
|
------------- |
|
|
|
Probably this platform inputs polling is the most complex one. Some input events are polled by multiple secondary threads. |
|
|
|
|
|
|
|
Keyboard polling is a special case, it can use directly `stdin` inputs to read keycodes. In that case, `stdin` is being reconfigured for ASCII chars reading and reseted at the end of the program... This approach presents several problems like a standard input lose if program is not closed properly but it does not require `X.org` libraries or superuser rights... Second option is being implemented to avoid `stdin` usage. |
|
|
|
|
|
|
|
Input | Library | Details |
|
|
|
:---: | :---: | --- |
|
|
|
KEYBOARD (1) | - | `stdin` is remapped to read keys using: `InitKeyboard()`, `ProcessKeyboard()`, `RestoreKeyboard()` |
|
|
|
KEYBOARD (2) | libevdev | Using standard `input_event` to read events from input device |
|
|
|
MOUSE | libevdev | **Threaded**: `InitMouse()` -> `EventThreadSpawn()` -> `EventThread()`, uses `input_event` |
|
|
|
GAMEPAD | joystick.h | **Threaded**: `InitGamepad()` -> `GamepadThread()`, uses `js_event` |
|
|
|
TOUCH | libevdev | *Share `MOUSE` implementation* |
|
|
|
|
|
|
|
Probably inputs could be further improved in all platforms, specially TOUCH inputs support and mapping with MOUSE. |