Fix pointer position in hidpi-corrected resolutions on web

This commit is contained in:
Leonardo Giovanni Scur 2019-06-14 17:37:21 -03:00
parent 0b555fc70a
commit 31cc1bdb58
2 changed files with 25 additions and 6 deletions

View file

@ -162,8 +162,13 @@ $GODOT_HEAD_INCLUDE
requestAnimationFrame(animate); requestAnimationFrame(animate);
function adjustCanvasDimensions() { function adjustCanvasDimensions() {
canvas.width = innerWidth; var scale = window.devicePixelRatio || 1;
canvas.height = innerHeight; var width = window.innerWidth;
var height = window.innerHeight;
canvas.width = width * scale;
canvas.height = height * scale;
canvas.style.width = width + "px";
canvas.style.height = height + "px";
} }
animationCallbacks.push(adjustCanvasDimensions); animationCallbacks.push(adjustCanvasDimensions);
adjustCanvasDimensions(); adjustCanvasDimensions();

View file

@ -70,6 +70,20 @@ static bool is_canvas_focused() {
/* clang-format on */ /* clang-format on */
} }
static Point2 correct_canvas_position(int x, int y) {
int canvas_width;
int canvas_height;
emscripten_get_canvas_element_size(NULL, &canvas_width, &canvas_height);
double element_width;
double element_height;
emscripten_get_element_css_size(NULL, &element_width, &element_height);
x = (int)(canvas_width / element_width * x);
y = (int)(canvas_height / element_height * y);
return Point2(x, y);
}
static bool cursor_inside_canvas = true; static bool cursor_inside_canvas = true;
EM_BOOL OS_JavaScript::fullscreen_change_callback(int p_event_type, const EmscriptenFullscreenChangeEvent *p_event, void *p_user_data) { EM_BOOL OS_JavaScript::fullscreen_change_callback(int p_event_type, const EmscriptenFullscreenChangeEvent *p_event, void *p_user_data) {
@ -285,7 +299,7 @@ EM_BOOL OS_JavaScript::mouse_button_callback(int p_event_type, const EmscriptenM
Ref<InputEventMouseButton> ev; Ref<InputEventMouseButton> ev;
ev.instance(); ev.instance();
ev->set_pressed(p_event_type == EMSCRIPTEN_EVENT_MOUSEDOWN); ev->set_pressed(p_event_type == EMSCRIPTEN_EVENT_MOUSEDOWN);
ev->set_position(Point2(p_event->canvasX, p_event->canvasY)); ev->set_position(correct_canvas_position(p_event->canvasX, p_event->canvasY));
ev->set_global_position(ev->get_position()); ev->set_global_position(ev->get_position());
dom2godot_mod(p_event, ev); dom2godot_mod(p_event, ev);
switch (p_event->button) { switch (p_event->button) {
@ -349,7 +363,7 @@ EM_BOOL OS_JavaScript::mousemove_callback(int p_event_type, const EmscriptenMous
OS_JavaScript *os = get_singleton(); OS_JavaScript *os = get_singleton();
int input_mask = os->input->get_mouse_button_mask(); int input_mask = os->input->get_mouse_button_mask();
Point2 pos = Point2(p_event->canvasX, p_event->canvasY); Point2 pos = correct_canvas_position(p_event->canvasX, p_event->canvasY);
// For motion outside the canvas, only read mouse movement if dragging // For motion outside the canvas, only read mouse movement if dragging
// started inside the canvas; imitating desktop app behaviour. // started inside the canvas; imitating desktop app behaviour.
if (!cursor_inside_canvas && !input_mask) if (!cursor_inside_canvas && !input_mask)
@ -666,7 +680,7 @@ EM_BOOL OS_JavaScript::touch_press_callback(int p_event_type, const EmscriptenTo
if (!touch.isChanged) if (!touch.isChanged)
continue; continue;
ev->set_index(touch.identifier); ev->set_index(touch.identifier);
ev->set_position(Point2(touch.canvasX, touch.canvasY)); ev->set_position(correct_canvas_position(touch.canvasX, touch.canvasY));
os->touches[i] = ev->get_position(); os->touches[i] = ev->get_position();
ev->set_pressed(p_event_type == EMSCRIPTEN_EVENT_TOUCHSTART); ev->set_pressed(p_event_type == EMSCRIPTEN_EVENT_TOUCHSTART);
@ -691,7 +705,7 @@ EM_BOOL OS_JavaScript::touchmove_callback(int p_event_type, const EmscriptenTouc
if (!touch.isChanged) if (!touch.isChanged)
continue; continue;
ev->set_index(touch.identifier); ev->set_index(touch.identifier);
ev->set_position(Point2(touch.canvasX, touch.canvasY)); ev->set_position(correct_canvas_position(touch.canvasX, touch.canvasY));
Point2 &prev = os->touches[i]; Point2 &prev = os->touches[i];
ev->set_relative(ev->get_position() - prev); ev->set_relative(ev->get_position() - prev);
prev = ev->get_position(); prev = ev->get_position();