From 5f8f0ac3053e5e7eee6dbfc40b336c4d4e52f147 Mon Sep 17 00:00:00 2001 From: Airyzz <36567925+Airyzz@users.noreply.github.com> Date: Thu, 5 Jun 2025 18:03:43 +0930 Subject: [PATCH] [web] add support for pen pressure --- platform/web/display_server_web.cpp | 9 +++++---- platform/web/display_server_web.h | 4 ++-- platform/web/godot_js.h | 2 +- platform/web/js/libs/library_godot_input.js | 4 ++-- 4 files changed, 10 insertions(+), 9 deletions(-) diff --git a/platform/web/display_server_web.cpp b/platform/web/display_server_web.cpp index 961c8efd3dd..611f8bb6c4c 100644 --- a/platform/web/display_server_web.cpp +++ b/platform/web/display_server_web.cpp @@ -305,18 +305,18 @@ int DisplayServerWeb::_mouse_button_callback(int p_pressed, int p_button, double return true; } -void DisplayServerWeb::mouse_move_callback(double p_x, double p_y, double p_rel_x, double p_rel_y, int p_modifiers) { +void DisplayServerWeb::mouse_move_callback(double p_x, double p_y, double p_rel_x, double p_rel_y, int p_modifiers, double p_pressure) { #ifdef PROXY_TO_PTHREAD_ENABLED if (!Thread::is_main_thread()) { - callable_mp_static(DisplayServerWeb::_mouse_move_callback).call_deferred(p_x, p_y, p_rel_x, p_rel_y, p_modifiers); + callable_mp_static(DisplayServerWeb::_mouse_move_callback).call_deferred(p_x, p_y, p_rel_x, p_rel_y, p_modifiers, p_pressure); return; } #endif - _mouse_move_callback(p_x, p_y, p_rel_x, p_rel_y, p_modifiers); + _mouse_move_callback(p_x, p_y, p_rel_x, p_rel_y, p_modifiers, p_pressure); } -void DisplayServerWeb::_mouse_move_callback(double p_x, double p_y, double p_rel_x, double p_rel_y, int p_modifiers) { +void DisplayServerWeb::_mouse_move_callback(double p_x, double p_y, double p_rel_x, double p_rel_y, int p_modifiers, double p_pressure) { BitField input_mask = Input::get_singleton()->get_mouse_button_mask(); // For motion outside the canvas, only read mouse movement if dragging // started inside the canvas; imitating desktop app behavior. @@ -332,6 +332,7 @@ void DisplayServerWeb::_mouse_move_callback(double p_x, double p_y, double p_rel ev->set_position(pos); ev->set_global_position(pos); + ev->set_pressure((float)p_pressure); ev->set_relative(Vector2(p_rel_x, p_rel_y)); ev->set_relative_screen_position(ev->get_relative()); diff --git a/platform/web/display_server_web.h b/platform/web/display_server_web.h index b90ffe61551..a582f899d14 100644 --- a/platform/web/display_server_web.h +++ b/platform/web/display_server_web.h @@ -120,8 +120,8 @@ private: static void _fullscreen_change_callback(int p_fullscreen); WASM_EXPORT static int mouse_button_callback(int p_pressed, int p_button, double p_x, double p_y, int p_modifiers); static int _mouse_button_callback(int p_pressed, int p_button, double p_x, double p_y, int p_modifiers); - WASM_EXPORT static void mouse_move_callback(double p_x, double p_y, double p_rel_x, double p_rel_y, int p_modifiers); - static void _mouse_move_callback(double p_x, double p_y, double p_rel_x, double p_rel_y, int p_modifiers); + WASM_EXPORT static void mouse_move_callback(double p_x, double p_y, double p_rel_x, double p_rel_y, int p_modifiers, double p_pressure); + static void _mouse_move_callback(double p_x, double p_y, double p_rel_x, double p_rel_y, int p_modifiers, double p_pressure); WASM_EXPORT static int mouse_wheel_callback(double p_delta_x, double p_delta_y); static int _mouse_wheel_callback(double p_delta_x, double p_delta_y); WASM_EXPORT static void touch_callback(int p_type, int p_count); diff --git a/platform/web/godot_js.h b/platform/web/godot_js.h index a0d9523ec08..3ab71bad6ee 100644 --- a/platform/web/godot_js.h +++ b/platform/web/godot_js.h @@ -57,7 +57,7 @@ extern int godot_js_pwa_update(); // Input extern void godot_js_input_mouse_button_cb(int (*p_callback)(int p_pressed, int p_button, double p_x, double p_y, int p_modifiers)); -extern void godot_js_input_mouse_move_cb(void (*p_callback)(double p_x, double p_y, double p_rel_x, double p_rel_y, int p_modifiers)); +extern void godot_js_input_mouse_move_cb(void (*p_callback)(double p_x, double p_y, double p_rel_x, double p_rel_y, int p_modifiers, double p_pressure)); extern void godot_js_input_mouse_wheel_cb(int (*p_callback)(double p_delta_x, double p_delta_y)); extern void godot_js_input_touch_cb(void (*p_callback)(int p_type, int p_count), uint32_t *r_identifiers, double *r_coords); extern void godot_js_input_key_cb(void (*p_callback)(int p_type, int p_repeat, int p_modifiers), char r_code[32], char r_key[32]); diff --git a/platform/web/js/libs/library_godot_input.js b/platform/web/js/libs/library_godot_input.js index 3886464df0b..d569c97b89e 100644 --- a/platform/web/js/libs/library_godot_input.js +++ b/platform/web/js/libs/library_godot_input.js @@ -515,9 +515,9 @@ const GodotInput = { const rel_pos_x = evt.movementX * rw; const rel_pos_y = evt.movementY * rh; const modifiers = GodotInput.getModifiers(evt); - func(pos[0], pos[1], rel_pos_x, rel_pos_y, modifiers); + func(pos[0], pos[1], rel_pos_x, rel_pos_y, modifiers, evt.pressure); } - GodotEventListeners.add(window, 'mousemove', move_cb, false); + GodotEventListeners.add(window, 'pointermove', move_cb, false); }, godot_js_input_mouse_wheel_cb__proxy: 'sync',