Skip to content

Commit 4e6676b

Browse files
committed
fix(core): make raycaster compatible with thouch screens
1 parent 2b23f80 commit 4e6676b

File tree

3 files changed

+16
-8
lines changed

3 files changed

+16
-8
lines changed

packages/core/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "@thatopen/components",
33
"description": "Collection of core functionalities to author BIM apps.",
4-
"version": "2.3.6",
4+
"version": "2.3.7",
55
"author": "That Open Company",
66
"contributors": [
77
"Antonio Gonzalez Viegas (https://github.com/agviegas)",

packages/core/src/core/Components/index.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ export class Components implements Disposable {
1414
/**
1515
* The version of the @thatopen/components library.
1616
*/
17-
static readonly release = "2.3.6";
17+
static readonly release = "2.3.7";
1818

1919
/** {@link Disposable.onDisposed} */
2020
readonly onDisposed = new Event<void>();

packages/core/src/core/Raycasters/src/mouse.ts

+14-6
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { Disposable, Event } from "../../Types";
55
* A helper to easily get the real position of the mouse in the Three.js canvas to work with tools like the [raycaster](https://threejs.org/docs/#api/en/core/Raycaster), even if it has been transformed through CSS or doesn't occupy the whole screen.
66
*/
77
export class Mouse implements Disposable {
8-
private _event?: MouseEvent;
8+
private _event?: MouseEvent | TouchEvent;
99
private _position = new THREE.Vector2();
1010

1111
/** {@link Disposable.onDisposed} */
@@ -34,23 +34,31 @@ export class Mouse implements Disposable {
3434
this.onDisposed.reset();
3535
}
3636

37-
private getPositionY(bound: DOMRect, event: MouseEvent) {
38-
return -((event.clientY - bound.top) / (bound.bottom - bound.top)) * 2 + 1;
37+
private getPositionY(bound: DOMRect, event: MouseEvent | TouchEvent) {
38+
const data = this.getDataObject(event);
39+
return -((data.clientY - bound.top) / (bound.bottom - bound.top)) * 2 + 1;
3940
}
4041

41-
private getPositionX(bound: DOMRect, event: MouseEvent) {
42-
return ((event.clientX - bound.left) / (bound.right - bound.left)) * 2 - 1;
42+
private getPositionX(bound: DOMRect, event: MouseEvent | TouchEvent) {
43+
const data = this.getDataObject(event);
44+
return ((data.clientX - bound.left) / (bound.right - bound.left)) * 2 - 1;
4345
}
4446

45-
private updateMouseInfo = (event: MouseEvent) => {
47+
private updateMouseInfo = (event: MouseEvent | TouchEvent) => {
4648
this._event = event;
4749
};
4850

51+
private getDataObject(event: MouseEvent | TouchEvent) {
52+
return event instanceof MouseEvent ? event : event.touches[0];
53+
}
54+
4955
private setupEvents(active: boolean) {
5056
if (active) {
5157
this.dom.addEventListener("pointermove", this.updateMouseInfo);
58+
this.dom.addEventListener("touchstart", this.updateMouseInfo);
5259
} else {
5360
this.dom.removeEventListener("pointermove", this.updateMouseInfo);
61+
this.dom.removeEventListener("touchstart", this.updateMouseInfo);
5462
}
5563
}
5664
}

0 commit comments

Comments
 (0)