@pmndrs/xr
Version:
VR/AR for threejs
44 lines (43 loc) • 2.13 kB
JavaScript
import { isAppleVisionPro } from './misc.js';
export function buildXRSessionInit(mode, domOverlayRoot, { anchors = true, handTracking = isAppleVisionPro() ? false : true, layers = true, meshDetection = true, planeDetection = true, customSessionInit, depthSensing = false, hitTest = true, domOverlay = true, bodyTracking = false, //until 6.7 since breaking change
bounded, } = {}) {
if (customSessionInit != null) {
return customSessionInit;
}
const requiredFeatures = bounded == null ? ['local-floor'] : bounded ? ['bounded-floor'] : ['unbounded', 'local-floor'];
const optionalFeatures = [];
if (domOverlay instanceof Element) {
domOverlay = true;
}
addXRSessionFeature(anchors, 'anchors', requiredFeatures, optionalFeatures);
addXRSessionFeature(handTracking, 'hand-tracking', requiredFeatures, optionalFeatures);
addXRSessionFeature(layers, 'layers', requiredFeatures, optionalFeatures);
addXRSessionFeature(meshDetection, 'mesh-detection', requiredFeatures, optionalFeatures);
addXRSessionFeature(planeDetection, 'plane-detection', requiredFeatures, optionalFeatures);
addXRSessionFeature(depthSensing, 'depth-sensing', requiredFeatures, optionalFeatures);
addXRSessionFeature(domOverlay, 'dom-overlay', requiredFeatures, optionalFeatures);
addXRSessionFeature(hitTest, 'hit-test', requiredFeatures, optionalFeatures);
addXRSessionFeature(bodyTracking, 'body-tracking', requiredFeatures, optionalFeatures);
const init = {
requiredFeatures,
optionalFeatures,
};
if (domOverlayRoot != null) {
init.domOverlay = { root: domOverlayRoot };
}
//TODO: replace with call to isSupportedFeature (unbounded, ...)
if (depthSensing) {
Object.assign(init, { depthSensing: { usagePreference: ['gpu-optimized'], dataFormatPreference: [] } });
}
return init;
}
function addXRSessionFeature(value, key, requiredFeatures, optionalFeatures) {
if (value === false) {
return;
}
if (value === true) {
optionalFeatures.push(key);
return;
}
requiredFeatures.push(key);
}