Skip to content

Commit d483814

Browse files
committed
feat(components): add microgestures
1 parent 99bdb44 commit d483814

6 files changed

Lines changed: 1016 additions & 319 deletions

File tree

package-lock.json

Lines changed: 319 additions & 289 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/library/src/_generated/babylon.core.constructors.ts

Lines changed: 82 additions & 14 deletions
Large diffs are not rendered by default.

packages/library/src/_generated/babylon.core.declarations.ts

Lines changed: 524 additions & 16 deletions
Large diffs are not rendered by default.
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
import React, { useEffect, useRef } from 'react';
2+
import type { Observer, WebXRAbstractMotionController, WebXRControllerComponent, WebXRInputSource } from '@babylonjs/core';
3+
import { useXrExperience } from '../store';
4+
import '@babylonjs/core/XR/motionController/webXROculusHandController.js';
5+
6+
type MicrogesturesProps = Partial<{
7+
onSwipeLeft: () => void;
8+
onSwipeRight: () => void;
9+
onSwipeForward: () => void;
10+
onSwipeBackward: () => void;
11+
onTapThumb: () => void;
12+
onMenu: () => void;
13+
}>;
14+
15+
export const Microgestures: React.FC<MicrogesturesProps> = ({ onSwipeLeft, onSwipeRight, onSwipeForward, onSwipeBackward, onTapThumb, onMenu }) => {
16+
const xrExperience = useXrExperience();
17+
const observersRef = useRef<Array<Observer<WebXRInputSource> | Observer<WebXRAbstractMotionController> | Observer<WebXRControllerComponent>>>([]);
18+
19+
useEffect(() => {
20+
const onControllerAddedObserver = xrExperience.input.onControllerAddedObservable.add(xrController => {
21+
const onMotionControllerInitObserver = xrController.onMotionControllerInitObservable.add(motionController => {
22+
if (onSwipeLeft) {
23+
const swipeLeftComponent = motionController.getComponent('swipe-left');
24+
const observer = swipeLeftComponent?.onButtonStateChangedObservable.add(() => {
25+
if (swipeLeftComponent.pressed) {
26+
onSwipeLeft();
27+
}
28+
});
29+
observersRef.current.push(observer);
30+
}
31+
if (onSwipeRight) {
32+
const swipeRightComponent = motionController.getComponent('swipe-right');
33+
const observer = swipeRightComponent?.onButtonStateChangedObservable.add(() => {
34+
if (swipeRightComponent.pressed) {
35+
onSwipeRight();
36+
}
37+
});
38+
observersRef.current.push(observer);
39+
}
40+
if (onSwipeForward) {
41+
const swipeForwardComponent = motionController.getComponent('swipe-forward');
42+
const observer = swipeForwardComponent?.onButtonStateChangedObservable.add(() => {
43+
if (swipeForwardComponent.pressed) {
44+
onSwipeForward();
45+
}
46+
});
47+
observersRef.current.push(observer);
48+
}
49+
if (onSwipeBackward) {
50+
const swipeBackwardComponent = motionController.getComponent('swipe-backward');
51+
const observable = swipeBackwardComponent?.onButtonStateChangedObservable.add(() => {
52+
if (swipeBackwardComponent.pressed) {
53+
onSwipeBackward();
54+
}
55+
});
56+
observersRef.current.push(observable);
57+
}
58+
if (onTapThumb) {
59+
const tapThumbComponent = motionController.getComponent('tap-thumb');
60+
const observer = tapThumbComponent?.onButtonStateChangedObservable.add(() => {
61+
if (tapThumbComponent.pressed) {
62+
onTapThumb();
63+
}
64+
});
65+
observersRef.current.push(observer);
66+
}
67+
if (onMenu) {
68+
const menu = motionController.getComponent('menu');
69+
const observer = menu?.onButtonStateChangedObservable.add(() => {
70+
if (menu.pressed) {
71+
onMenu();
72+
}
73+
});
74+
observersRef.current.push(observer);
75+
}
76+
});
77+
observersRef.current.push(onMotionControllerInitObserver);
78+
});
79+
observersRef.current.push(onControllerAddedObserver);
80+
81+
return () => {
82+
observersRef.current.forEach(observer => {
83+
observer.remove();
84+
});
85+
};
86+
}, []);
87+
88+
return null;
89+
};
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export * from './Microgestures';

packages/library/src/core/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,4 @@ export { register } from './inventory';
22
export * from './store';
33
export * from './useModel';
44
export * from './Scene';
5+
export * from './components/Microgestures';

0 commit comments

Comments
 (0)