Skip to content

Commit 1d52985

Browse files
authored
[rcore_web] Relative mouse mode issues. (#3940)
* [rcore_web] Relative mouse mode issues. * Review formatting.
1 parent f26bfa0 commit 1d52985

File tree

2 files changed

+36
-3
lines changed

2 files changed

+36
-3
lines changed

.gitignore

+3
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,9 @@ packages/
5656
*.so.*
5757
*.dll
5858

59+
# Emscripten
60+
emsdk
61+
5962
# Ignore wasm data in examples/
6063
examples/**/*.wasm
6164
examples/**/*.data

src/platforms/rcore_web.c

+33-3
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,8 @@ static const char cursorLUT[11][12] = {
100100
"not-allowed" // 10 MOUSE_CURSOR_NOT_ALLOWED
101101
};
102102

103+
Vector2 lockedMousePos = { 0 };
104+
103105
//----------------------------------------------------------------------------------
104106
// Module Internal Functions Declaration
105107
//----------------------------------------------------------------------------------
@@ -131,6 +133,7 @@ static EM_BOOL EmscriptenWindowResizedCallback(int eventType, const EmscriptenUi
131133
static EM_BOOL EmscriptenResizeCallback(int eventType, const EmscriptenUiEvent *event, void *userData);
132134

133135
// Emscripten input callback events
136+
static EM_BOOL EmscriptenMouseMoveCallback(int eventType, const EmscriptenMouseEvent *mouseEvent, void *userData);
134137
static EM_BOOL EmscriptenMouseCallback(int eventType, const EmscriptenMouseEvent *mouseEvent, void *userData);
135138
static EM_BOOL EmscriptenPointerlockCallback(int eventType, const EmscriptenPointerlockChangeEvent *pointerlockChangeEvent, void *userData);
136139
static EM_BOOL EmscriptenTouchCallback(int eventType, const EmscriptenTouchEvent *touchEvent, void *userData);
@@ -862,6 +865,8 @@ void SetMousePosition(int x, int y)
862865
CORE.Input.Mouse.currentPosition = (Vector2){ (float)x, (float)y };
863866
CORE.Input.Mouse.previousPosition = CORE.Input.Mouse.currentPosition;
864867

868+
if (CORE.Input.Mouse.cursorHidden) lockedMousePos = CORE.Input.Mouse.currentPosition;
869+
865870
// NOTE: emscripten not implemented
866871
glfwSetCursorPos(platform.handle, CORE.Input.Mouse.currentPosition.x, CORE.Input.Mouse.currentPosition.y);
867872
}
@@ -1270,6 +1275,9 @@ int InitPlatform(void)
12701275
emscripten_set_click_callback("#canvas", NULL, 1, EmscriptenMouseCallback);
12711276
emscripten_set_pointerlockchange_callback(EMSCRIPTEN_EVENT_TARGET_WINDOW, NULL, 1, EmscriptenPointerlockCallback);
12721277

1278+
// Following the mouse delta when the mouse is locked
1279+
emscripten_set_mousemove_callback("#canvas", NULL, 1, EmscriptenMouseMoveCallback);
1280+
12731281
// Support touch events
12741282
emscripten_set_touchstart_callback("#canvas", NULL, 1, EmscriptenTouchCallback);
12751283
emscripten_set_touchend_callback("#canvas", NULL, 1, EmscriptenTouchCallback);
@@ -1477,9 +1485,13 @@ static void MouseButtonCallback(GLFWwindow *window, int button, int action, int
14771485
// GLFW3 Cursor Position Callback, runs on mouse move
14781486
static void MouseCursorPosCallback(GLFWwindow *window, double x, double y)
14791487
{
1480-
CORE.Input.Mouse.currentPosition.x = (float)x;
1481-
CORE.Input.Mouse.currentPosition.y = (float)y;
1482-
CORE.Input.Touch.position[0] = CORE.Input.Mouse.currentPosition;
1488+
// If the pointer is not locked, follow the position
1489+
if (!CORE.Input.Mouse.cursorHidden)
1490+
{
1491+
CORE.Input.Mouse.currentPosition.x = (float)x;
1492+
CORE.Input.Mouse.currentPosition.y = (float)y;
1493+
CORE.Input.Touch.position[0] = CORE.Input.Mouse.currentPosition;
1494+
}
14831495

14841496
#if defined(SUPPORT_GESTURES_SYSTEM) && defined(SUPPORT_MOUSE_GESTURES)
14851497
// Process mouse events as touches to be able to use mouse-gestures
@@ -1505,6 +1517,18 @@ static void MouseCursorPosCallback(GLFWwindow *window, double x, double y)
15051517
#endif
15061518
}
15071519

1520+
static EM_BOOL EmscriptenMouseMoveCallback(int eventType, const EmscriptenMouseEvent *mouseEvent, void *userData)
1521+
{
1522+
// To emulate the GLFW_RAW_MOUSE_MOTION property.
1523+
if (CORE.Input.Mouse.cursorHidden)
1524+
{
1525+
CORE.Input.Mouse.previousPosition.x = lockedMousePos.x - mouseEvent->movementX;
1526+
CORE.Input.Mouse.previousPosition.y = lockedMousePos.y - mouseEvent->movementY;
1527+
}
1528+
1529+
return 1; // The event was consumed by the callback handler
1530+
}
1531+
15081532
// GLFW3 Scrolling Callback, runs on mouse wheel
15091533
static void MouseScrollCallback(GLFWwindow *window, double xoffset, double yoffset)
15101534
{
@@ -1598,6 +1622,12 @@ static EM_BOOL EmscriptenPointerlockCallback(int eventType, const EmscriptenPoin
15981622
{
15991623
CORE.Input.Mouse.cursorHidden = EM_ASM_INT( { if (document.pointerLockElement) return 1; }, 0);
16001624

1625+
if (CORE.Input.Mouse.cursorHidden)
1626+
{
1627+
lockedMousePos = CORE.Input.Mouse.currentPosition;
1628+
CORE.Input.Mouse.previousPosition = lockedMousePos;
1629+
}
1630+
16011631
return 1; // The event was consumed by the callback handler
16021632
}
16031633

0 commit comments

Comments
 (0)