diff --git a/raylib-input-system.md b/raylib-input-system.md new file mode 100644 index 0000000..83f6a8d --- /dev/null +++ b/raylib-input-system.md @@ -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.