Browse Source

Fix pointer position in hidpi-corrected resolutions on web

(cherry picked from commit 31cc1bdb58708101022c43aba4130f7a7366b337)
Leonardo Giovanni Scur 6 years ago
parent
commit
19f132b368
2 changed files with 25 additions and 6 deletions
  1. 7 2
      misc/dist/html/full-size.html
  2. 18 4
      platform/javascript/os_javascript.cpp

+ 7 - 2
misc/dist/html/full-size.html

@@ -162,8 +162,13 @@ $GODOT_HEAD_INCLUDE
 			requestAnimationFrame(animate);
 			requestAnimationFrame(animate);
 
 
 			function adjustCanvasDimensions() {
 			function adjustCanvasDimensions() {
-				canvas.width = innerWidth;
-				canvas.height = innerHeight;
+				var scale = window.devicePixelRatio || 1;
+				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();

+ 18 - 4
platform/javascript/os_javascript.cpp

@@ -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();