Move the last functions out of rcore
This commit is contained in:
parent
959a466b37
commit
227ba707f8
320
src/rcore.c
320
src/rcore.c
|
|
@ -140,10 +140,6 @@
|
||||||
#include "external/sdefl.h" // Deflate (RFC 1951) compressor
|
#include "external/sdefl.h" // Deflate (RFC 1951) compressor
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if (defined(__linux__) || defined(PLATFORM_WEB)) && (_POSIX_C_SOURCE < 199309L)
|
|
||||||
#undef _POSIX_C_SOURCE
|
|
||||||
#define _POSIX_C_SOURCE 199309L // Required for: CLOCK_MONOTONIC if compiled with c99 without gnu ext.
|
|
||||||
#endif
|
|
||||||
#if defined(__linux__) && !defined(_GNU_SOURCE)
|
#if defined(__linux__) && !defined(_GNU_SOURCE)
|
||||||
#define _GNU_SOURCE
|
#define _GNU_SOURCE
|
||||||
#endif
|
#endif
|
||||||
|
|
@ -2358,322 +2354,6 @@ void WaitTime(double seconds)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
// Swap back buffer with front buffer (screen drawing)
|
|
||||||
void SwapScreenBuffer(void)
|
|
||||||
{
|
|
||||||
#if defined(PLATFORM_DESKTOP) || defined(PLATFORM_WEB)
|
|
||||||
glfwSwapBuffers(CORE.Window.handle);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(PLATFORM_ANDROID) || defined(PLATFORM_DRM)
|
|
||||||
eglSwapBuffers(CORE.Window.device, CORE.Window.surface);
|
|
||||||
|
|
||||||
#if defined(PLATFORM_DRM)
|
|
||||||
|
|
||||||
if (!CORE.Window.gbmSurface || (-1 == CORE.Window.fd) || !CORE.Window.connector || !CORE.Window.crtc) TRACELOG(LOG_ERROR, "DISPLAY: DRM initialization failed to swap");
|
|
||||||
|
|
||||||
struct gbm_bo *bo = gbm_surface_lock_front_buffer(CORE.Window.gbmSurface);
|
|
||||||
if (!bo) TRACELOG(LOG_ERROR, "DISPLAY: Failed GBM to lock front buffer");
|
|
||||||
|
|
||||||
uint32_t fb = 0;
|
|
||||||
int result = drmModeAddFB(CORE.Window.fd, CORE.Window.connector->modes[CORE.Window.modeIndex].hdisplay, CORE.Window.connector->modes[CORE.Window.modeIndex].vdisplay, 24, 32, gbm_bo_get_stride(bo), gbm_bo_get_handle(bo).u32, &fb);
|
|
||||||
if (result != 0) TRACELOG(LOG_ERROR, "DISPLAY: drmModeAddFB() failed with result: %d", result);
|
|
||||||
|
|
||||||
result = drmModeSetCrtc(CORE.Window.fd, CORE.Window.crtc->crtc_id, fb, 0, 0, &CORE.Window.connector->connector_id, 1, &CORE.Window.connector->modes[CORE.Window.modeIndex]);
|
|
||||||
if (result != 0) TRACELOG(LOG_ERROR, "DISPLAY: drmModeSetCrtc() failed with result: %d", result);
|
|
||||||
|
|
||||||
if (CORE.Window.prevFB)
|
|
||||||
{
|
|
||||||
result = drmModeRmFB(CORE.Window.fd, CORE.Window.prevFB);
|
|
||||||
if (result != 0) TRACELOG(LOG_ERROR, "DISPLAY: drmModeRmFB() failed with result: %d", result);
|
|
||||||
}
|
|
||||||
|
|
||||||
CORE.Window.prevFB = fb;
|
|
||||||
|
|
||||||
if (CORE.Window.prevBO) gbm_surface_release_buffer(CORE.Window.gbmSurface, CORE.Window.prevBO);
|
|
||||||
|
|
||||||
CORE.Window.prevBO = bo;
|
|
||||||
|
|
||||||
#endif // PLATFORM_DRM
|
|
||||||
#endif // PLATFORM_ANDROID || PLATFORM_DRM
|
|
||||||
}
|
|
||||||
|
|
||||||
// Register all input events
|
|
||||||
void PollInputEvents(void)
|
|
||||||
{
|
|
||||||
#if defined(SUPPORT_GESTURES_SYSTEM)
|
|
||||||
// NOTE: Gestures update must be called every frame to reset gestures correctly
|
|
||||||
// because ProcessGestureEvent() is just called on an event, not every frame
|
|
||||||
UpdateGestures();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Reset keys/chars pressed registered
|
|
||||||
CORE.Input.Keyboard.keyPressedQueueCount = 0;
|
|
||||||
CORE.Input.Keyboard.charPressedQueueCount = 0;
|
|
||||||
// Reset key repeats
|
|
||||||
for (int i = 0; i < MAX_KEYBOARD_KEYS; i++) CORE.Input.Keyboard.keyRepeatInFrame[i] = 0;
|
|
||||||
|
|
||||||
// Reset last gamepad button/axis registered state
|
|
||||||
CORE.Input.Gamepad.lastButtonPressed = 0; // GAMEPAD_BUTTON_UNKNOWN
|
|
||||||
CORE.Input.Gamepad.axisCount = 0;
|
|
||||||
|
|
||||||
#if defined(PLATFORM_DRM)
|
|
||||||
// Register previous keys states
|
|
||||||
for (int i = 0; i < MAX_KEYBOARD_KEYS; i++)
|
|
||||||
{
|
|
||||||
CORE.Input.Keyboard.previousKeyState[i] = CORE.Input.Keyboard.currentKeyState[i];
|
|
||||||
CORE.Input.Keyboard.keyRepeatInFrame[i] = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
PollKeyboardEvents();
|
|
||||||
|
|
||||||
// Register previous mouse states
|
|
||||||
CORE.Input.Mouse.previousWheelMove = CORE.Input.Mouse.currentWheelMove;
|
|
||||||
CORE.Input.Mouse.currentWheelMove = CORE.Input.Mouse.eventWheelMove;
|
|
||||||
CORE.Input.Mouse.eventWheelMove = (Vector2){ 0.0f, 0.0f };
|
|
||||||
for (int i = 0; i < MAX_MOUSE_BUTTONS; i++)
|
|
||||||
{
|
|
||||||
CORE.Input.Mouse.previousButtonState[i] = CORE.Input.Mouse.currentButtonState[i];
|
|
||||||
CORE.Input.Mouse.currentButtonState[i] = CORE.Input.Mouse.currentButtonStateEvdev[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
// Register gamepads buttons events
|
|
||||||
for (int i = 0; i < MAX_GAMEPADS; i++)
|
|
||||||
{
|
|
||||||
if (CORE.Input.Gamepad.ready[i])
|
|
||||||
{
|
|
||||||
// Register previous gamepad states
|
|
||||||
for (int k = 0; k < MAX_GAMEPAD_BUTTONS; k++) CORE.Input.Gamepad.previousButtonState[i][k] = CORE.Input.Gamepad.currentButtonState[i][k];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(PLATFORM_DESKTOP) || defined(PLATFORM_WEB)
|
|
||||||
// Keyboard/Mouse input polling (automatically managed by GLFW3 through callback)
|
|
||||||
|
|
||||||
// Register previous keys states
|
|
||||||
for (int i = 0; i < MAX_KEYBOARD_KEYS; i++)
|
|
||||||
{
|
|
||||||
CORE.Input.Keyboard.previousKeyState[i] = CORE.Input.Keyboard.currentKeyState[i];
|
|
||||||
CORE.Input.Keyboard.keyRepeatInFrame[i] = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Register previous mouse states
|
|
||||||
for (int i = 0; i < MAX_MOUSE_BUTTONS; i++) CORE.Input.Mouse.previousButtonState[i] = CORE.Input.Mouse.currentButtonState[i];
|
|
||||||
|
|
||||||
// Register previous mouse wheel state
|
|
||||||
CORE.Input.Mouse.previousWheelMove = CORE.Input.Mouse.currentWheelMove;
|
|
||||||
CORE.Input.Mouse.currentWheelMove = (Vector2){ 0.0f, 0.0f };
|
|
||||||
|
|
||||||
// Register previous mouse position
|
|
||||||
CORE.Input.Mouse.previousPosition = CORE.Input.Mouse.currentPosition;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Register previous touch states
|
|
||||||
for (int i = 0; i < MAX_TOUCH_POINTS; i++) CORE.Input.Touch.previousTouchState[i] = CORE.Input.Touch.currentTouchState[i];
|
|
||||||
|
|
||||||
// Reset touch positions
|
|
||||||
// TODO: It resets on PLATFORM_WEB the mouse position and not filled again until a move-event,
|
|
||||||
// so, if mouse is not moved it returns a (0, 0) position... this behaviour should be reviewed!
|
|
||||||
//for (int i = 0; i < MAX_TOUCH_POINTS; i++) CORE.Input.Touch.position[i] = (Vector2){ 0, 0 };
|
|
||||||
|
|
||||||
#if defined(PLATFORM_DESKTOP)
|
|
||||||
// Check if gamepads are ready
|
|
||||||
// NOTE: We do it here in case of disconnection
|
|
||||||
for (int i = 0; i < MAX_GAMEPADS; i++)
|
|
||||||
{
|
|
||||||
if (glfwJoystickPresent(i)) CORE.Input.Gamepad.ready[i] = true;
|
|
||||||
else CORE.Input.Gamepad.ready[i] = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Register gamepads buttons events
|
|
||||||
for (int i = 0; i < MAX_GAMEPADS; i++)
|
|
||||||
{
|
|
||||||
if (CORE.Input.Gamepad.ready[i]) // Check if gamepad is available
|
|
||||||
{
|
|
||||||
// Register previous gamepad states
|
|
||||||
for (int k = 0; k < MAX_GAMEPAD_BUTTONS; k++) CORE.Input.Gamepad.previousButtonState[i][k] = CORE.Input.Gamepad.currentButtonState[i][k];
|
|
||||||
|
|
||||||
// Get current gamepad state
|
|
||||||
// NOTE: There is no callback available, so we get it manually
|
|
||||||
GLFWgamepadstate state = { 0 };
|
|
||||||
glfwGetGamepadState(i, &state); // This remapps all gamepads so they have their buttons mapped like an xbox controller
|
|
||||||
|
|
||||||
const unsigned char *buttons = state.buttons;
|
|
||||||
|
|
||||||
for (int k = 0; (buttons != NULL) && (k < GLFW_GAMEPAD_BUTTON_DPAD_LEFT + 1) && (k < MAX_GAMEPAD_BUTTONS); k++)
|
|
||||||
{
|
|
||||||
int button = -1; // GamepadButton enum values assigned
|
|
||||||
|
|
||||||
switch (k)
|
|
||||||
{
|
|
||||||
case GLFW_GAMEPAD_BUTTON_Y: button = GAMEPAD_BUTTON_RIGHT_FACE_UP; break;
|
|
||||||
case GLFW_GAMEPAD_BUTTON_B: button = GAMEPAD_BUTTON_RIGHT_FACE_RIGHT; break;
|
|
||||||
case GLFW_GAMEPAD_BUTTON_A: button = GAMEPAD_BUTTON_RIGHT_FACE_DOWN; break;
|
|
||||||
case GLFW_GAMEPAD_BUTTON_X: button = GAMEPAD_BUTTON_RIGHT_FACE_LEFT; break;
|
|
||||||
|
|
||||||
case GLFW_GAMEPAD_BUTTON_LEFT_BUMPER: button = GAMEPAD_BUTTON_LEFT_TRIGGER_1; break;
|
|
||||||
case GLFW_GAMEPAD_BUTTON_RIGHT_BUMPER: button = GAMEPAD_BUTTON_RIGHT_TRIGGER_1; break;
|
|
||||||
|
|
||||||
case GLFW_GAMEPAD_BUTTON_BACK: button = GAMEPAD_BUTTON_MIDDLE_LEFT; break;
|
|
||||||
case GLFW_GAMEPAD_BUTTON_GUIDE: button = GAMEPAD_BUTTON_MIDDLE; break;
|
|
||||||
case GLFW_GAMEPAD_BUTTON_START: button = GAMEPAD_BUTTON_MIDDLE_RIGHT; break;
|
|
||||||
|
|
||||||
case GLFW_GAMEPAD_BUTTON_DPAD_UP: button = GAMEPAD_BUTTON_LEFT_FACE_UP; break;
|
|
||||||
case GLFW_GAMEPAD_BUTTON_DPAD_RIGHT: button = GAMEPAD_BUTTON_LEFT_FACE_RIGHT; break;
|
|
||||||
case GLFW_GAMEPAD_BUTTON_DPAD_DOWN: button = GAMEPAD_BUTTON_LEFT_FACE_DOWN; break;
|
|
||||||
case GLFW_GAMEPAD_BUTTON_DPAD_LEFT: button = GAMEPAD_BUTTON_LEFT_FACE_LEFT; break;
|
|
||||||
|
|
||||||
case GLFW_GAMEPAD_BUTTON_LEFT_THUMB: button = GAMEPAD_BUTTON_LEFT_THUMB; break;
|
|
||||||
case GLFW_GAMEPAD_BUTTON_RIGHT_THUMB: button = GAMEPAD_BUTTON_RIGHT_THUMB; break;
|
|
||||||
default: break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (button != -1) // Check for valid button
|
|
||||||
{
|
|
||||||
if (buttons[k] == GLFW_PRESS)
|
|
||||||
{
|
|
||||||
CORE.Input.Gamepad.currentButtonState[i][button] = 1;
|
|
||||||
CORE.Input.Gamepad.lastButtonPressed = button;
|
|
||||||
}
|
|
||||||
else CORE.Input.Gamepad.currentButtonState[i][button] = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get current axis state
|
|
||||||
const float *axes = state.axes;
|
|
||||||
|
|
||||||
for (int k = 0; (axes != NULL) && (k < GLFW_GAMEPAD_AXIS_LAST + 1) && (k < MAX_GAMEPAD_AXIS); k++)
|
|
||||||
{
|
|
||||||
CORE.Input.Gamepad.axisState[i][k] = axes[k];
|
|
||||||
}
|
|
||||||
|
|
||||||
// Register buttons for 2nd triggers (because GLFW doesn't count these as buttons but rather axis)
|
|
||||||
CORE.Input.Gamepad.currentButtonState[i][GAMEPAD_BUTTON_LEFT_TRIGGER_2] = (char)(CORE.Input.Gamepad.axisState[i][GAMEPAD_AXIS_LEFT_TRIGGER] > 0.1f);
|
|
||||||
CORE.Input.Gamepad.currentButtonState[i][GAMEPAD_BUTTON_RIGHT_TRIGGER_2] = (char)(CORE.Input.Gamepad.axisState[i][GAMEPAD_AXIS_RIGHT_TRIGGER] > 0.1f);
|
|
||||||
|
|
||||||
CORE.Input.Gamepad.axisCount = GLFW_GAMEPAD_AXIS_LAST + 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
CORE.Window.resizedLastFrame = false;
|
|
||||||
|
|
||||||
if (CORE.Window.eventWaiting) glfwWaitEvents(); // Wait for in input events before continue (drawing is paused)
|
|
||||||
else glfwPollEvents(); // Poll input events: keyboard/mouse/window events (callbacks)
|
|
||||||
#endif // PLATFORM_DESKTOP
|
|
||||||
|
|
||||||
#if defined(PLATFORM_WEB)
|
|
||||||
CORE.Window.resizedLastFrame = false;
|
|
||||||
#endif // PLATFORM_WEB
|
|
||||||
|
|
||||||
// Gamepad support using emscripten API
|
|
||||||
// NOTE: GLFW3 joystick functionality not available in web
|
|
||||||
#if defined(PLATFORM_WEB)
|
|
||||||
// Get number of gamepads connected
|
|
||||||
int numGamepads = 0;
|
|
||||||
if (emscripten_sample_gamepad_data() == EMSCRIPTEN_RESULT_SUCCESS) numGamepads = emscripten_get_num_gamepads();
|
|
||||||
|
|
||||||
for (int i = 0; (i < numGamepads) && (i < MAX_GAMEPADS); i++)
|
|
||||||
{
|
|
||||||
// Register previous gamepad button states
|
|
||||||
for (int k = 0; k < MAX_GAMEPAD_BUTTONS; k++) CORE.Input.Gamepad.previousButtonState[i][k] = CORE.Input.Gamepad.currentButtonState[i][k];
|
|
||||||
|
|
||||||
EmscriptenGamepadEvent gamepadState;
|
|
||||||
|
|
||||||
int result = emscripten_get_gamepad_status(i, &gamepadState);
|
|
||||||
|
|
||||||
if (result == EMSCRIPTEN_RESULT_SUCCESS)
|
|
||||||
{
|
|
||||||
// Register buttons data for every connected gamepad
|
|
||||||
for (int j = 0; (j < gamepadState.numButtons) && (j < MAX_GAMEPAD_BUTTONS); j++)
|
|
||||||
{
|
|
||||||
GamepadButton button = -1;
|
|
||||||
|
|
||||||
// Gamepad Buttons reference: https://www.w3.org/TR/gamepad/#gamepad-interface
|
|
||||||
switch (j)
|
|
||||||
{
|
|
||||||
case 0: button = GAMEPAD_BUTTON_RIGHT_FACE_DOWN; break;
|
|
||||||
case 1: button = GAMEPAD_BUTTON_RIGHT_FACE_RIGHT; break;
|
|
||||||
case 2: button = GAMEPAD_BUTTON_RIGHT_FACE_LEFT; break;
|
|
||||||
case 3: button = GAMEPAD_BUTTON_RIGHT_FACE_UP; break;
|
|
||||||
case 4: button = GAMEPAD_BUTTON_LEFT_TRIGGER_1; break;
|
|
||||||
case 5: button = GAMEPAD_BUTTON_RIGHT_TRIGGER_1; break;
|
|
||||||
case 6: button = GAMEPAD_BUTTON_LEFT_TRIGGER_2; break;
|
|
||||||
case 7: button = GAMEPAD_BUTTON_RIGHT_TRIGGER_2; break;
|
|
||||||
case 8: button = GAMEPAD_BUTTON_MIDDLE_LEFT; break;
|
|
||||||
case 9: button = GAMEPAD_BUTTON_MIDDLE_RIGHT; break;
|
|
||||||
case 10: button = GAMEPAD_BUTTON_LEFT_THUMB; break;
|
|
||||||
case 11: button = GAMEPAD_BUTTON_RIGHT_THUMB; break;
|
|
||||||
case 12: button = GAMEPAD_BUTTON_LEFT_FACE_UP; break;
|
|
||||||
case 13: button = GAMEPAD_BUTTON_LEFT_FACE_DOWN; break;
|
|
||||||
case 14: button = GAMEPAD_BUTTON_LEFT_FACE_LEFT; break;
|
|
||||||
case 15: button = GAMEPAD_BUTTON_LEFT_FACE_RIGHT; break;
|
|
||||||
default: break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (button != -1) // Check for valid button
|
|
||||||
{
|
|
||||||
if (gamepadState.digitalButton[j] == 1)
|
|
||||||
{
|
|
||||||
CORE.Input.Gamepad.currentButtonState[i][button] = 1;
|
|
||||||
CORE.Input.Gamepad.lastButtonPressed = button;
|
|
||||||
}
|
|
||||||
else CORE.Input.Gamepad.currentButtonState[i][button] = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
//TRACELOGD("INPUT: Gamepad %d, button %d: Digital: %d, Analog: %g", gamepadState.index, j, gamepadState.digitalButton[j], gamepadState.analogButton[j]);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Register axis data for every connected gamepad
|
|
||||||
for (int j = 0; (j < gamepadState.numAxes) && (j < MAX_GAMEPAD_AXIS); j++)
|
|
||||||
{
|
|
||||||
CORE.Input.Gamepad.axisState[i][j] = gamepadState.axis[j];
|
|
||||||
}
|
|
||||||
|
|
||||||
CORE.Input.Gamepad.axisCount = gamepadState.numAxes;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(PLATFORM_ANDROID)
|
|
||||||
// Register previous keys states
|
|
||||||
// NOTE: Android supports up to 260 keys
|
|
||||||
for (int i = 0; i < 260; i++)
|
|
||||||
{
|
|
||||||
CORE.Input.Keyboard.previousKeyState[i] = CORE.Input.Keyboard.currentKeyState[i];
|
|
||||||
CORE.Input.Keyboard.keyRepeatInFrame[i] = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Android ALooper_pollAll() variables
|
|
||||||
int pollResult = 0;
|
|
||||||
int pollEvents = 0;
|
|
||||||
|
|
||||||
// Poll Events (registered events)
|
|
||||||
// NOTE: Activity is paused if not enabled (CORE.Android.appEnabled)
|
|
||||||
while ((pollResult = ALooper_pollAll(CORE.Android.appEnabled? 0 : -1, NULL, &pollEvents, (void**)&CORE.Android.source)) >= 0)
|
|
||||||
{
|
|
||||||
// Process this event
|
|
||||||
if (CORE.Android.source != NULL) CORE.Android.source->process(CORE.Android.app, CORE.Android.source);
|
|
||||||
|
|
||||||
// NOTE: Never close window, native activity is controlled by the system!
|
|
||||||
if (CORE.Android.app->destroyRequested != 0)
|
|
||||||
{
|
|
||||||
//CORE.Window.shouldClose = true;
|
|
||||||
//ANativeActivity_finish(CORE.Android.app->activity);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(PLATFORM_DRM) && defined(SUPPORT_SSH_KEYBOARD_RPI)
|
|
||||||
// NOTE: Keyboard reading could be done using input_event(s) or just read from stdin, both methods are used here.
|
|
||||||
// stdin reading is still used for legacy purposes, it allows keyboard input trough SSH console
|
|
||||||
|
|
||||||
if (!CORE.Input.Keyboard.evtMode) ProcessKeyboard();
|
|
||||||
|
|
||||||
// NOTE: Mouse input events polling is done asynchronously in another pthread - EventThread()
|
|
||||||
// NOTE: Gamepad (Joystick) input events polling is done asynchonously in another pthread - GamepadThread()
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
// Scan all files and directories in a base path
|
// Scan all files and directories in a base path
|
||||||
// WARNING: files.paths[] must be previously allocated and
|
// WARNING: files.paths[] must be previously allocated and
|
||||||
|
|
|
||||||
|
|
@ -89,6 +89,11 @@
|
||||||
#define GLFW_MOUSE_PASSTHROUGH 0x0002000D
|
#define GLFW_MOUSE_PASSTHROUGH 0x0002000D
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if (defined(__linux__) || defined(PLATFORM_WEB)) && (_POSIX_C_SOURCE < 199309L)
|
||||||
|
#undef _POSIX_C_SOURCE
|
||||||
|
#define _POSIX_C_SOURCE 199309L // Required for: CLOCK_MONOTONIC if compiled with c99 without gnu ext.
|
||||||
|
#endif
|
||||||
|
|
||||||
//----------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------
|
||||||
// Types and Structures Definition
|
// Types and Structures Definition
|
||||||
//----------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
|
@ -1683,3 +1683,66 @@ float GetMouseWheelMove(void)
|
||||||
{
|
{
|
||||||
return 0.0f;
|
return 0.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Swap back buffer with front buffer (screen drawing)
|
||||||
|
void SwapScreenBuffer(void)
|
||||||
|
{
|
||||||
|
eglSwapBuffers(CORE.Window.device, CORE.Window.surface);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Register all input events
|
||||||
|
void PollInputEvents(void)
|
||||||
|
{
|
||||||
|
#if defined(SUPPORT_GESTURES_SYSTEM)
|
||||||
|
// NOTE: Gestures update must be called every frame to reset gestures correctly
|
||||||
|
// because ProcessGestureEvent() is just called on an event, not every frame
|
||||||
|
UpdateGestures();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Reset keys/chars pressed registered
|
||||||
|
CORE.Input.Keyboard.keyPressedQueueCount = 0;
|
||||||
|
CORE.Input.Keyboard.charPressedQueueCount = 0;
|
||||||
|
// Reset key repeats
|
||||||
|
for (int i = 0; i < MAX_KEYBOARD_KEYS; i++) CORE.Input.Keyboard.keyRepeatInFrame[i] = 0;
|
||||||
|
|
||||||
|
// Reset last gamepad button/axis registered state
|
||||||
|
CORE.Input.Gamepad.lastButtonPressed = 0; // GAMEPAD_BUTTON_UNKNOWN
|
||||||
|
CORE.Input.Gamepad.axisCount = 0;
|
||||||
|
|
||||||
|
// Register previous touch states
|
||||||
|
for (int i = 0; i < MAX_TOUCH_POINTS; i++) CORE.Input.Touch.previousTouchState[i] = CORE.Input.Touch.currentTouchState[i];
|
||||||
|
|
||||||
|
// Reset touch positions
|
||||||
|
// TODO: It resets on PLATFORM_WEB the mouse position and not filled again until a move-event,
|
||||||
|
// so, if mouse is not moved it returns a (0, 0) position... this behaviour should be reviewed!
|
||||||
|
//for (int i = 0; i < MAX_TOUCH_POINTS; i++) CORE.Input.Touch.position[i] = (Vector2){ 0, 0 };
|
||||||
|
|
||||||
|
// Register previous keys states
|
||||||
|
// NOTE: Android supports up to 260 keys
|
||||||
|
for (int i = 0; i < 260; i++)
|
||||||
|
{
|
||||||
|
CORE.Input.Keyboard.previousKeyState[i] = CORE.Input.Keyboard.currentKeyState[i];
|
||||||
|
CORE.Input.Keyboard.keyRepeatInFrame[i] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Android ALooper_pollAll() variables
|
||||||
|
int pollResult = 0;
|
||||||
|
int pollEvents = 0;
|
||||||
|
|
||||||
|
// Poll Events (registered events)
|
||||||
|
// NOTE: Activity is paused if not enabled (CORE.Android.appEnabled)
|
||||||
|
while ((pollResult = ALooper_pollAll(CORE.Android.appEnabled? 0 : -1, NULL, &pollEvents, (void**)&CORE.Android.source)) >= 0)
|
||||||
|
{
|
||||||
|
// Process this event
|
||||||
|
if (CORE.Android.source != NULL) CORE.Android.source->process(CORE.Android.app, CORE.Android.source);
|
||||||
|
|
||||||
|
// NOTE: Never close window, native activity is controlled by the system!
|
||||||
|
if (CORE.Android.app->destroyRequested != 0)
|
||||||
|
{
|
||||||
|
//CORE.Window.shouldClose = true;
|
||||||
|
//ANativeActivity_finish(CORE.Android.app->activity);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1580,3 +1580,140 @@ float GetMouseWheelMove(void)
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Swap back buffer with front buffer (screen drawing)
|
||||||
|
void SwapScreenBuffer(void)
|
||||||
|
{
|
||||||
|
glfwSwapBuffers(CORE.Window.handle);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Register all input events
|
||||||
|
void PollInputEvents(void)
|
||||||
|
{
|
||||||
|
#if defined(SUPPORT_GESTURES_SYSTEM)
|
||||||
|
// NOTE: Gestures update must be called every frame to reset gestures correctly
|
||||||
|
// because ProcessGestureEvent() is just called on an event, not every frame
|
||||||
|
UpdateGestures();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Reset keys/chars pressed registered
|
||||||
|
CORE.Input.Keyboard.keyPressedQueueCount = 0;
|
||||||
|
CORE.Input.Keyboard.charPressedQueueCount = 0;
|
||||||
|
// Reset key repeats
|
||||||
|
for (int i = 0; i < MAX_KEYBOARD_KEYS; i++) CORE.Input.Keyboard.keyRepeatInFrame[i] = 0;
|
||||||
|
|
||||||
|
// Reset last gamepad button/axis registered state
|
||||||
|
CORE.Input.Gamepad.lastButtonPressed = 0; // GAMEPAD_BUTTON_UNKNOWN
|
||||||
|
CORE.Input.Gamepad.axisCount = 0;
|
||||||
|
// Keyboard/Mouse input polling (automatically managed by GLFW3 through callback)
|
||||||
|
|
||||||
|
// Register previous keys states
|
||||||
|
for (int i = 0; i < MAX_KEYBOARD_KEYS; i++)
|
||||||
|
{
|
||||||
|
CORE.Input.Keyboard.previousKeyState[i] = CORE.Input.Keyboard.currentKeyState[i];
|
||||||
|
CORE.Input.Keyboard.keyRepeatInFrame[i] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Register previous mouse states
|
||||||
|
for (int i = 0; i < MAX_MOUSE_BUTTONS; i++) CORE.Input.Mouse.previousButtonState[i] = CORE.Input.Mouse.currentButtonState[i];
|
||||||
|
|
||||||
|
// Register previous mouse wheel state
|
||||||
|
CORE.Input.Mouse.previousWheelMove = CORE.Input.Mouse.currentWheelMove;
|
||||||
|
CORE.Input.Mouse.currentWheelMove = (Vector2){ 0.0f, 0.0f };
|
||||||
|
|
||||||
|
// Register previous mouse position
|
||||||
|
CORE.Input.Mouse.previousPosition = CORE.Input.Mouse.currentPosition;
|
||||||
|
|
||||||
|
// Register previous touch states
|
||||||
|
for (int i = 0; i < MAX_TOUCH_POINTS; i++) CORE.Input.Touch.previousTouchState[i] = CORE.Input.Touch.currentTouchState[i];
|
||||||
|
|
||||||
|
// Reset touch positions
|
||||||
|
// TODO: It resets on PLATFORM_WEB the mouse position and not filled again until a move-event,
|
||||||
|
// so, if mouse is not moved it returns a (0, 0) position... this behaviour should be reviewed!
|
||||||
|
//for (int i = 0; i < MAX_TOUCH_POINTS; i++) CORE.Input.Touch.position[i] = (Vector2){ 0, 0 };
|
||||||
|
|
||||||
|
// Check if gamepads are ready
|
||||||
|
// NOTE: We do it here in case of disconnection
|
||||||
|
for (int i = 0; i < MAX_GAMEPADS; i++)
|
||||||
|
{
|
||||||
|
if (glfwJoystickPresent(i)) CORE.Input.Gamepad.ready[i] = true;
|
||||||
|
else CORE.Input.Gamepad.ready[i] = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Register gamepads buttons events
|
||||||
|
for (int i = 0; i < MAX_GAMEPADS; i++)
|
||||||
|
{
|
||||||
|
if (CORE.Input.Gamepad.ready[i]) // Check if gamepad is available
|
||||||
|
{
|
||||||
|
// Register previous gamepad states
|
||||||
|
for (int k = 0; k < MAX_GAMEPAD_BUTTONS; k++) CORE.Input.Gamepad.previousButtonState[i][k] = CORE.Input.Gamepad.currentButtonState[i][k];
|
||||||
|
|
||||||
|
// Get current gamepad state
|
||||||
|
// NOTE: There is no callback available, so we get it manually
|
||||||
|
GLFWgamepadstate state = { 0 };
|
||||||
|
glfwGetGamepadState(i, &state); // This remapps all gamepads so they have their buttons mapped like an xbox controller
|
||||||
|
|
||||||
|
const unsigned char *buttons = state.buttons;
|
||||||
|
|
||||||
|
for (int k = 0; (buttons != NULL) && (k < GLFW_GAMEPAD_BUTTON_DPAD_LEFT + 1) && (k < MAX_GAMEPAD_BUTTONS); k++)
|
||||||
|
{
|
||||||
|
int button = -1; // GamepadButton enum values assigned
|
||||||
|
|
||||||
|
switch (k)
|
||||||
|
{
|
||||||
|
case GLFW_GAMEPAD_BUTTON_Y: button = GAMEPAD_BUTTON_RIGHT_FACE_UP; break;
|
||||||
|
case GLFW_GAMEPAD_BUTTON_B: button = GAMEPAD_BUTTON_RIGHT_FACE_RIGHT; break;
|
||||||
|
case GLFW_GAMEPAD_BUTTON_A: button = GAMEPAD_BUTTON_RIGHT_FACE_DOWN; break;
|
||||||
|
case GLFW_GAMEPAD_BUTTON_X: button = GAMEPAD_BUTTON_RIGHT_FACE_LEFT; break;
|
||||||
|
|
||||||
|
case GLFW_GAMEPAD_BUTTON_LEFT_BUMPER: button = GAMEPAD_BUTTON_LEFT_TRIGGER_1; break;
|
||||||
|
case GLFW_GAMEPAD_BUTTON_RIGHT_BUMPER: button = GAMEPAD_BUTTON_RIGHT_TRIGGER_1; break;
|
||||||
|
|
||||||
|
case GLFW_GAMEPAD_BUTTON_BACK: button = GAMEPAD_BUTTON_MIDDLE_LEFT; break;
|
||||||
|
case GLFW_GAMEPAD_BUTTON_GUIDE: button = GAMEPAD_BUTTON_MIDDLE; break;
|
||||||
|
case GLFW_GAMEPAD_BUTTON_START: button = GAMEPAD_BUTTON_MIDDLE_RIGHT; break;
|
||||||
|
|
||||||
|
case GLFW_GAMEPAD_BUTTON_DPAD_UP: button = GAMEPAD_BUTTON_LEFT_FACE_UP; break;
|
||||||
|
case GLFW_GAMEPAD_BUTTON_DPAD_RIGHT: button = GAMEPAD_BUTTON_LEFT_FACE_RIGHT; break;
|
||||||
|
case GLFW_GAMEPAD_BUTTON_DPAD_DOWN: button = GAMEPAD_BUTTON_LEFT_FACE_DOWN; break;
|
||||||
|
case GLFW_GAMEPAD_BUTTON_DPAD_LEFT: button = GAMEPAD_BUTTON_LEFT_FACE_LEFT; break;
|
||||||
|
|
||||||
|
case GLFW_GAMEPAD_BUTTON_LEFT_THUMB: button = GAMEPAD_BUTTON_LEFT_THUMB; break;
|
||||||
|
case GLFW_GAMEPAD_BUTTON_RIGHT_THUMB: button = GAMEPAD_BUTTON_RIGHT_THUMB; break;
|
||||||
|
default: break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (button != -1) // Check for valid button
|
||||||
|
{
|
||||||
|
if (buttons[k] == GLFW_PRESS)
|
||||||
|
{
|
||||||
|
CORE.Input.Gamepad.currentButtonState[i][button] = 1;
|
||||||
|
CORE.Input.Gamepad.lastButtonPressed = button;
|
||||||
|
}
|
||||||
|
else CORE.Input.Gamepad.currentButtonState[i][button] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get current axis state
|
||||||
|
const float *axes = state.axes;
|
||||||
|
|
||||||
|
for (int k = 0; (axes != NULL) && (k < GLFW_GAMEPAD_AXIS_LAST + 1) && (k < MAX_GAMEPAD_AXIS); k++)
|
||||||
|
{
|
||||||
|
CORE.Input.Gamepad.axisState[i][k] = axes[k];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Register buttons for 2nd triggers (because GLFW doesn't count these as buttons but rather axis)
|
||||||
|
CORE.Input.Gamepad.currentButtonState[i][GAMEPAD_BUTTON_LEFT_TRIGGER_2] = (char)(CORE.Input.Gamepad.axisState[i][GAMEPAD_AXIS_LEFT_TRIGGER] > 0.1f);
|
||||||
|
CORE.Input.Gamepad.currentButtonState[i][GAMEPAD_BUTTON_RIGHT_TRIGGER_2] = (char)(CORE.Input.Gamepad.axisState[i][GAMEPAD_AXIS_RIGHT_TRIGGER] > 0.1f);
|
||||||
|
|
||||||
|
CORE.Input.Gamepad.axisCount = GLFW_GAMEPAD_AXIS_LAST + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
CORE.Window.resizedLastFrame = false;
|
||||||
|
|
||||||
|
if (CORE.Window.eventWaiting) glfwWaitEvents(); // Wait for in input events before continue (drawing is paused)
|
||||||
|
else glfwPollEvents(); // Poll input events: keyboard/mouse/window events (callbacks)
|
||||||
|
}
|
||||||
101
src/rcore_drm.c
101
src/rcore_drm.c
|
|
@ -1,5 +1,7 @@
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include "time.h"
|
||||||
|
|
||||||
#include "rcore.h"
|
#include "rcore.h"
|
||||||
|
|
||||||
#include <fcntl.h> // POSIX file control definitions - open(), creat(), fcntl()
|
#include <fcntl.h> // POSIX file control definitions - open(), creat(), fcntl()
|
||||||
|
|
@ -1019,3 +1021,102 @@ float GetMouseWheelMove(void)
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Swap back buffer with front buffer (screen drawing)
|
||||||
|
void SwapScreenBuffer(void)
|
||||||
|
{
|
||||||
|
eglSwapBuffers(CORE.Window.device, CORE.Window.surface);
|
||||||
|
|
||||||
|
if (!CORE.Window.gbmSurface || (-1 == CORE.Window.fd) || !CORE.Window.connector || !CORE.Window.crtc) TRACELOG(LOG_ERROR, "DISPLAY: DRM initialization failed to swap");
|
||||||
|
|
||||||
|
struct gbm_bo *bo = gbm_surface_lock_front_buffer(CORE.Window.gbmSurface);
|
||||||
|
if (!bo) TRACELOG(LOG_ERROR, "DISPLAY: Failed GBM to lock front buffer");
|
||||||
|
|
||||||
|
uint32_t fb = 0;
|
||||||
|
int result = drmModeAddFB(CORE.Window.fd, CORE.Window.connector->modes[CORE.Window.modeIndex].hdisplay, CORE.Window.connector->modes[CORE.Window.modeIndex].vdisplay, 24, 32, gbm_bo_get_stride(bo), gbm_bo_get_handle(bo).u32, &fb);
|
||||||
|
if (result != 0) TRACELOG(LOG_ERROR, "DISPLAY: drmModeAddFB() failed with result: %d", result);
|
||||||
|
|
||||||
|
result = drmModeSetCrtc(CORE.Window.fd, CORE.Window.crtc->crtc_id, fb, 0, 0, &CORE.Window.connector->connector_id, 1, &CORE.Window.connector->modes[CORE.Window.modeIndex]);
|
||||||
|
if (result != 0) TRACELOG(LOG_ERROR, "DISPLAY: drmModeSetCrtc() failed with result: %d", result);
|
||||||
|
|
||||||
|
if (CORE.Window.prevFB)
|
||||||
|
{
|
||||||
|
result = drmModeRmFB(CORE.Window.fd, CORE.Window.prevFB);
|
||||||
|
if (result != 0) TRACELOG(LOG_ERROR, "DISPLAY: drmModeRmFB() failed with result: %d", result);
|
||||||
|
}
|
||||||
|
|
||||||
|
CORE.Window.prevFB = fb;
|
||||||
|
|
||||||
|
if (CORE.Window.prevBO) gbm_surface_release_buffer(CORE.Window.gbmSurface, CORE.Window.prevBO);
|
||||||
|
|
||||||
|
CORE.Window.prevBO = bo;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Register all input events
|
||||||
|
void PollInputEvents(void)
|
||||||
|
{
|
||||||
|
#if defined(SUPPORT_GESTURES_SYSTEM)
|
||||||
|
// NOTE: Gestures update must be called every frame to reset gestures correctly
|
||||||
|
// because ProcessGestureEvent() is just called on an event, not every frame
|
||||||
|
UpdateGestures();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Reset keys/chars pressed registered
|
||||||
|
CORE.Input.Keyboard.keyPressedQueueCount = 0;
|
||||||
|
CORE.Input.Keyboard.charPressedQueueCount = 0;
|
||||||
|
// Reset key repeats
|
||||||
|
for (int i = 0; i < MAX_KEYBOARD_KEYS; i++) CORE.Input.Keyboard.keyRepeatInFrame[i] = 0;
|
||||||
|
|
||||||
|
// Reset last gamepad button/axis registered state
|
||||||
|
CORE.Input.Gamepad.lastButtonPressed = 0; // GAMEPAD_BUTTON_UNKNOWN
|
||||||
|
CORE.Input.Gamepad.axisCount = 0;
|
||||||
|
|
||||||
|
// Register previous keys states
|
||||||
|
for (int i = 0; i < MAX_KEYBOARD_KEYS; i++)
|
||||||
|
{
|
||||||
|
CORE.Input.Keyboard.previousKeyState[i] = CORE.Input.Keyboard.currentKeyState[i];
|
||||||
|
CORE.Input.Keyboard.keyRepeatInFrame[i] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
PollKeyboardEvents();
|
||||||
|
|
||||||
|
// Register previous mouse states
|
||||||
|
CORE.Input.Mouse.previousWheelMove = CORE.Input.Mouse.currentWheelMove;
|
||||||
|
CORE.Input.Mouse.currentWheelMove = CORE.Input.Mouse.eventWheelMove;
|
||||||
|
CORE.Input.Mouse.eventWheelMove = (Vector2){ 0.0f, 0.0f };
|
||||||
|
for (int i = 0; i < MAX_MOUSE_BUTTONS; i++)
|
||||||
|
{
|
||||||
|
CORE.Input.Mouse.previousButtonState[i] = CORE.Input.Mouse.currentButtonState[i];
|
||||||
|
CORE.Input.Mouse.currentButtonState[i] = CORE.Input.Mouse.currentButtonStateEvdev[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Register gamepads buttons events
|
||||||
|
for (int i = 0; i < MAX_GAMEPADS; i++)
|
||||||
|
{
|
||||||
|
if (CORE.Input.Gamepad.ready[i])
|
||||||
|
{
|
||||||
|
// Register previous gamepad states
|
||||||
|
for (int k = 0; k < MAX_GAMEPAD_BUTTONS; k++) CORE.Input.Gamepad.previousButtonState[i][k] = CORE.Input.Gamepad.currentButtonState[i][k];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Register previous touch states
|
||||||
|
for (int i = 0; i < MAX_TOUCH_POINTS; i++) CORE.Input.Touch.previousTouchState[i] = CORE.Input.Touch.currentTouchState[i];
|
||||||
|
|
||||||
|
// Reset touch positions
|
||||||
|
// TODO: It resets on PLATFORM_WEB the mouse position and not filled again until a move-event,
|
||||||
|
// so, if mouse is not moved it returns a (0, 0) position... this behaviour should be reviewed!
|
||||||
|
//for (int i = 0; i < MAX_TOUCH_POINTS; i++) CORE.Input.Touch.position[i] = (Vector2){ 0, 0 };
|
||||||
|
|
||||||
|
#if defined(SUPPORT_SSH_KEYBOARD_RPI)
|
||||||
|
// NOTE: Keyboard reading could be done using input_event(s) or just read from stdin, both methods are used here.
|
||||||
|
// stdin reading is still used for legacy purposes, it allows keyboard input trough SSH console
|
||||||
|
|
||||||
|
if (!CORE.Input.Keyboard.evtMode) ProcessKeyboard();
|
||||||
|
|
||||||
|
// NOTE: Mouse input events polling is done asynchronously in another pthread - EventThread()
|
||||||
|
// NOTE: Gamepad (Joystick) input events polling is done asynchonously in another pthread - GamepadThread()
|
||||||
|
#endif
|
||||||
|
}
|
||||||
123
src/rcore_web.c
123
src/rcore_web.c
|
|
@ -1621,3 +1621,126 @@ float GetMouseWheelMove(void)
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Swap back buffer with front buffer (screen drawing)
|
||||||
|
void SwapScreenBuffer(void)
|
||||||
|
{
|
||||||
|
glfwSwapBuffers(CORE.Window.handle);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Register all input events
|
||||||
|
void PollInputEvents(void)
|
||||||
|
{
|
||||||
|
#if defined(SUPPORT_GESTURES_SYSTEM)
|
||||||
|
// NOTE: Gestures update must be called every frame to reset gestures correctly
|
||||||
|
// because ProcessGestureEvent() is just called on an event, not every frame
|
||||||
|
UpdateGestures();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Reset keys/chars pressed registered
|
||||||
|
CORE.Input.Keyboard.keyPressedQueueCount = 0;
|
||||||
|
CORE.Input.Keyboard.charPressedQueueCount = 0;
|
||||||
|
// Reset key repeats
|
||||||
|
for (int i = 0; i < MAX_KEYBOARD_KEYS; i++) CORE.Input.Keyboard.keyRepeatInFrame[i] = 0;
|
||||||
|
|
||||||
|
// Reset last gamepad button/axis registered state
|
||||||
|
CORE.Input.Gamepad.lastButtonPressed = 0; // GAMEPAD_BUTTON_UNKNOWN
|
||||||
|
CORE.Input.Gamepad.axisCount = 0;
|
||||||
|
// Keyboard/Mouse input polling (automatically managed by GLFW3 through callback)
|
||||||
|
|
||||||
|
// Register previous keys states
|
||||||
|
for (int i = 0; i < MAX_KEYBOARD_KEYS; i++)
|
||||||
|
{
|
||||||
|
CORE.Input.Keyboard.previousKeyState[i] = CORE.Input.Keyboard.currentKeyState[i];
|
||||||
|
CORE.Input.Keyboard.keyRepeatInFrame[i] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Register previous mouse states
|
||||||
|
for (int i = 0; i < MAX_MOUSE_BUTTONS; i++) CORE.Input.Mouse.previousButtonState[i] = CORE.Input.Mouse.currentButtonState[i];
|
||||||
|
|
||||||
|
// Register previous mouse wheel state
|
||||||
|
CORE.Input.Mouse.previousWheelMove = CORE.Input.Mouse.currentWheelMove;
|
||||||
|
CORE.Input.Mouse.currentWheelMove = (Vector2){ 0.0f, 0.0f };
|
||||||
|
|
||||||
|
// Register previous mouse position
|
||||||
|
CORE.Input.Mouse.previousPosition = CORE.Input.Mouse.currentPosition;
|
||||||
|
|
||||||
|
// Register previous touch states
|
||||||
|
for (int i = 0; i < MAX_TOUCH_POINTS; i++) CORE.Input.Touch.previousTouchState[i] = CORE.Input.Touch.currentTouchState[i];
|
||||||
|
|
||||||
|
// Reset touch positions
|
||||||
|
// TODO: It resets on PLATFORM_WEB the mouse position and not filled again until a move-event,
|
||||||
|
// so, if mouse is not moved it returns a (0, 0) position... this behaviour should be reviewed!
|
||||||
|
//for (int i = 0; i < MAX_TOUCH_POINTS; i++) CORE.Input.Touch.position[i] = (Vector2){ 0, 0 };
|
||||||
|
|
||||||
|
CORE.Window.resizedLastFrame = false;
|
||||||
|
|
||||||
|
// Gamepad support using emscripten API
|
||||||
|
// NOTE: GLFW3 joystick functionality not available in web
|
||||||
|
// Get number of gamepads connected
|
||||||
|
int numGamepads = 0;
|
||||||
|
if (emscripten_sample_gamepad_data() == EMSCRIPTEN_RESULT_SUCCESS) numGamepads = emscripten_get_num_gamepads();
|
||||||
|
|
||||||
|
for (int i = 0; (i < numGamepads) && (i < MAX_GAMEPADS); i++)
|
||||||
|
{
|
||||||
|
// Register previous gamepad button states
|
||||||
|
for (int k = 0; k < MAX_GAMEPAD_BUTTONS; k++) CORE.Input.Gamepad.previousButtonState[i][k] = CORE.Input.Gamepad.currentButtonState[i][k];
|
||||||
|
|
||||||
|
EmscriptenGamepadEvent gamepadState;
|
||||||
|
|
||||||
|
int result = emscripten_get_gamepad_status(i, &gamepadState);
|
||||||
|
|
||||||
|
if (result == EMSCRIPTEN_RESULT_SUCCESS)
|
||||||
|
{
|
||||||
|
// Register buttons data for every connected gamepad
|
||||||
|
for (int j = 0; (j < gamepadState.numButtons) && (j < MAX_GAMEPAD_BUTTONS); j++)
|
||||||
|
{
|
||||||
|
GamepadButton button = -1;
|
||||||
|
|
||||||
|
// Gamepad Buttons reference: https://www.w3.org/TR/gamepad/#gamepad-interface
|
||||||
|
switch (j)
|
||||||
|
{
|
||||||
|
case 0: button = GAMEPAD_BUTTON_RIGHT_FACE_DOWN; break;
|
||||||
|
case 1: button = GAMEPAD_BUTTON_RIGHT_FACE_RIGHT; break;
|
||||||
|
case 2: button = GAMEPAD_BUTTON_RIGHT_FACE_LEFT; break;
|
||||||
|
case 3: button = GAMEPAD_BUTTON_RIGHT_FACE_UP; break;
|
||||||
|
case 4: button = GAMEPAD_BUTTON_LEFT_TRIGGER_1; break;
|
||||||
|
case 5: button = GAMEPAD_BUTTON_RIGHT_TRIGGER_1; break;
|
||||||
|
case 6: button = GAMEPAD_BUTTON_LEFT_TRIGGER_2; break;
|
||||||
|
case 7: button = GAMEPAD_BUTTON_RIGHT_TRIGGER_2; break;
|
||||||
|
case 8: button = GAMEPAD_BUTTON_MIDDLE_LEFT; break;
|
||||||
|
case 9: button = GAMEPAD_BUTTON_MIDDLE_RIGHT; break;
|
||||||
|
case 10: button = GAMEPAD_BUTTON_LEFT_THUMB; break;
|
||||||
|
case 11: button = GAMEPAD_BUTTON_RIGHT_THUMB; break;
|
||||||
|
case 12: button = GAMEPAD_BUTTON_LEFT_FACE_UP; break;
|
||||||
|
case 13: button = GAMEPAD_BUTTON_LEFT_FACE_DOWN; break;
|
||||||
|
case 14: button = GAMEPAD_BUTTON_LEFT_FACE_LEFT; break;
|
||||||
|
case 15: button = GAMEPAD_BUTTON_LEFT_FACE_RIGHT; break;
|
||||||
|
default: break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (button != -1) // Check for valid button
|
||||||
|
{
|
||||||
|
if (gamepadState.digitalButton[j] == 1)
|
||||||
|
{
|
||||||
|
CORE.Input.Gamepad.currentButtonState[i][button] = 1;
|
||||||
|
CORE.Input.Gamepad.lastButtonPressed = button;
|
||||||
|
}
|
||||||
|
else CORE.Input.Gamepad.currentButtonState[i][button] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
//TRACELOGD("INPUT: Gamepad %d, button %d: Digital: %d, Analog: %g", gamepadState.index, j, gamepadState.digitalButton[j], gamepadState.analogButton[j]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Register axis data for every connected gamepad
|
||||||
|
for (int j = 0; (j < gamepadState.numAxes) && (j < MAX_GAMEPAD_AXIS); j++)
|
||||||
|
{
|
||||||
|
CORE.Input.Gamepad.axisState[i][j] = gamepadState.axis[j];
|
||||||
|
}
|
||||||
|
|
||||||
|
CORE.Input.Gamepad.axisCount = gamepadState.numAxes;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user