94 lines
3.5 KiB
TypeScript
94 lines
3.5 KiB
TypeScript
import {AbstractMesh, WebXRDefaultExperience, WebXRMotionControllerManager, WebXRState} from "@babylonjs/core";
|
|
import log from "loglevel";
|
|
import {WebController} from "../../controllers/webController";
|
|
import {Rigplatform} from "../../controllers/rigplatform";
|
|
import {DiagramManager} from "../../diagram/diagramManager";
|
|
import {Spinner} from "../../objects/spinner";
|
|
|
|
|
|
export async function groundMeshObserver(ground: AbstractMesh,
|
|
diagramManager: DiagramManager,
|
|
spinner: Spinner) {
|
|
const logger = log.getLogger('groungMeshObserver');
|
|
WebXRMotionControllerManager.PrioritizeOnlineRepository = false;
|
|
WebXRMotionControllerManager.UseOnlineRepository = true;
|
|
const xr = await WebXRDefaultExperience.CreateAsync(ground.getScene(), {
|
|
floorMeshes: [ground],
|
|
disableHandTracking: true,
|
|
disableTeleportation: true,
|
|
disableDefaultUI: true,
|
|
disableNearInteraction: true,
|
|
outputCanvasOptions: {
|
|
canvasOptions: {
|
|
framebufferScaleFactor: 1
|
|
}
|
|
},
|
|
optionalFeatures: true,
|
|
|
|
pointerSelectionOptions: {
|
|
enablePointerSelectionOnAllControllers: true
|
|
}
|
|
});
|
|
//xr.baseExperience.featuresManager.enableFeature(WebXRFeatureName.LAYERS, "latest", { preferMultiviewOnInit: true }, true, false);
|
|
const enterButton = (document.querySelector('#enterXR') as HTMLAnchorElement);
|
|
if (enterButton) {
|
|
const vrSupported = await xr.baseExperience.sessionManager.isSessionSupportedAsync('immersive-vr');
|
|
if (vrSupported) {
|
|
enterButton.classList.remove('inactive');
|
|
enterButton.addEventListener('click', async (evt) => {
|
|
evt.preventDefault();
|
|
//const voice = new VoiceRecognizer();
|
|
logger.debug('entering XR');
|
|
|
|
const enter = await xr.baseExperience.enterXRAsync('immersive-vr', 'local-floor');
|
|
logger.debug(enter);
|
|
});
|
|
}
|
|
|
|
}
|
|
|
|
if (spinner) {
|
|
spinner.hide();
|
|
}
|
|
|
|
xr.baseExperience.sessionManager.onXRSessionInit.add((session) => {
|
|
session.addEventListener('visibilitychange', (ev) => {
|
|
logger.debug(ev);
|
|
});
|
|
});
|
|
xr.baseExperience.sessionManager.onXRSessionEnded.add(() => {
|
|
logger.debug('session ended');
|
|
window.location.reload();
|
|
});
|
|
xr.baseExperience.onStateChangedObservable.add((state) => {
|
|
logger.debug(WebXRState[state]);
|
|
switch (state) {
|
|
case WebXRState.IN_XR:
|
|
ground.getScene().audioEnabled = true;
|
|
window.addEventListener(('pa-button-state-change'), (event: any) => {
|
|
if (event.detail) {
|
|
logger.debug(event.detail);
|
|
}
|
|
});
|
|
break;
|
|
case WebXRState.EXITING_XR:
|
|
setTimeout(() => {
|
|
logger.debug('EXITING_XR, reloading');
|
|
window.location.reload();
|
|
}, 500);
|
|
|
|
}
|
|
});
|
|
|
|
const rig = new Rigplatform(xr, diagramManager);
|
|
const currentConfig = diagramManager.config.current;
|
|
rig.flyMode = currentConfig.flyMode;
|
|
rig.turnSnap = currentConfig.turnSnap;
|
|
diagramManager.config.onConfigChangedObservable.add((config) => {
|
|
rig.flyMode = config.flyMode;
|
|
rig.turnSnap = config.turnSnap;
|
|
}, -1, false, this);
|
|
|
|
const webController = new WebController(ground.getScene(), rig, diagramManager, diagramManager.controllers);
|
|
|
|
} |