diff --git a/examples/webxr_vr_video.html b/examples/webxr_vr_video.html index 41850c6db85fb5..ecea2e9ed14c9d 100644 --- a/examples/webxr_vr_video.html +++ b/examples/webxr_vr_video.html @@ -114,6 +114,7 @@ renderer.setSize( window.innerWidth, window.innerHeight ); renderer.xr.enabled = true; renderer.xr.setReferenceSpaceType( 'local' ); + renderer.xr.setEyeLayers( [ 1, 2 ] ); // set layers on left and right camera; container.appendChild( renderer.domElement ); document.body.appendChild( VRButton.createButton( renderer ) ); diff --git a/src/renderers/webxr/WebXRManager.js b/src/renderers/webxr/WebXRManager.js index 3b61a859f99e47..62e802590bec0a 100644 --- a/src/renderers/webxr/WebXRManager.js +++ b/src/renderers/webxr/WebXRManager.js @@ -43,21 +43,20 @@ class WebXRManager extends EventDispatcher { // const cameraL = new PerspectiveCamera(); - cameraL.layers.enable( 1 ); cameraL.viewport = new Vector4(); const cameraR = new PerspectiveCamera(); - cameraR.layers.enable( 2 ); cameraR.viewport = new Vector4(); const cameras = [ cameraL, cameraR ]; const cameraXR = new ArrayCamera(); - cameraXR.layers.enable( 1 ); - cameraXR.layers.enable( 2 ); let _currentDepthNear = null; let _currentDepthFar = null; + let _currentCameraLayers = null; + let _leftEyeLayer = null; + let _rightEyeLayer = null; // @@ -159,6 +158,7 @@ class WebXRManager extends EventDispatcher { _currentDepthNear = null; _currentDepthFar = null; + _currentCameraLayers = null; // restore framebuffer/rendering state @@ -502,6 +502,14 @@ class WebXRManager extends EventDispatcher { } + this.setEyeLayers = function ( layers ) { + + _leftEyeLayer = layers[ 0 ]; + _rightEyeLayer = layers[ 1 ]; + _currentCameraLayers = null; // force layer setting on next update + + }; + this.updateCamera = function ( camera ) { if ( session === null ) return; @@ -523,6 +531,27 @@ class WebXRManager extends EventDispatcher { } + if ( _currentCameraLayers !== camera.layers.mask ) { + + const mask = camera.layers.mask; + + if ( _leftEyeLayer && _rightEyeLayer ) { + + cameraL.layers.mask = mask | 1 << _leftEyeLayer; + cameraR.layers.mask = mask | 1 << _rightEyeLayer; + cameraXR.layers.mask = mask | 1 << _rightEyeLayer | 1 << _leftEyeLayer; + + } else { + + cameraXR.layers.mask = cameraL.layers.mask = cameraR.layers.mask = mask; + + } + + _currentCameraLayers = mask; + + } + + const parent = camera.parent; const cameras = cameraXR.cameras;