@@ -9,6 +9,7 @@ import { Vector4 } from '../../math/Vector4.js';
99import { WebXRController } from '../webxr/WebXRController.js' ;
1010import { AddEquation , BackSide , CustomBlending , DepthFormat , DepthStencilFormat , FrontSide , RGBAFormat , UnsignedByteType , UnsignedInt248Type , UnsignedIntType , ZeroFactor } from '../../constants.js' ;
1111import { DepthTexture } from '../../textures/DepthTexture.js' ;
12+ import { DepthArrayTexture } from '../../textures/DepthArrayTexture.js' ;
1213import { XRRenderTarget } from './XRRenderTarget.js' ;
1314import { CylinderGeometry } from '../../geometries/CylinderGeometry.js' ;
1415import { PlaneGeometry } from '../../geometries/PlaneGeometry.js' ;
@@ -32,8 +33,9 @@ class XRManager extends EventDispatcher {
3233 * Constructs a new XR manager.
3334 *
3435 * @param {Renderer } renderer - The renderer.
36+ * @param {boolean } [multiview=false] - Enables multiview if the device supports it.
3537 */
36- constructor ( renderer ) {
38+ constructor ( renderer , multiview = false ) {
3739
3840 super ( ) ;
3941
@@ -354,6 +356,26 @@ class XRManager extends EventDispatcher {
354356 */
355357 this . _useLayers = ( typeof XRWebGLBinding !== 'undefined' && 'createProjectionLayer' in XRWebGLBinding . prototype ) ; // eslint-disable-line compat/compat
356358
359+ /**
360+ * Whether the usage of multiview has been requested by the application or not.
361+ *
362+ * @private
363+ * @type {boolean }
364+ * @default false
365+ * @readonly
366+ */
367+ this . _useMultiviewIfPossible = multiview ;
368+
369+ /**
370+ * Whether the usage of multiview is actually enabled. This flag only evaluates to `true`
371+ * if multiview has been requested by the application and the `OVR_multiview2` is available.
372+ *
373+ * @private
374+ * @type {boolean }
375+ * @readonly
376+ */
377+ this . _useMultiview = false ;
378+
357379 }
358380
359381 /**
@@ -564,6 +586,17 @@ class XRManager extends EventDispatcher {
564586
565587 }
566588
589+ /**
590+ * Returns `true` if the engine renders to a multiview target.
591+ *
592+ * @return {boolean } Whether the engine renders to a multiview render target or not.
593+ */
594+ useMultiview ( ) {
595+
596+ return this . _useMultiview ;
597+
598+ }
599+
567600 createQuadLayer ( width , height , translation , quaternion , pixelwidth , pixelheight , rendercall , attributes = [ ] ) {
568601
569602 const geometry = new PlaneGeometry ( width , height ) ;
@@ -825,6 +858,13 @@ class XRManager extends EventDispatcher {
825858 scaleFactor : this . _framebufferScaleFactor
826859 } ;
827860
861+ if ( this . _useMultiviewIfPossible && renderer . hasFeature ( 'OVR_multiview2' ) ) {
862+
863+ projectionlayerInit . textureType = 'texture-array' ;
864+ this . _useMultiview = true ;
865+
866+ }
867+
828868 const glBinding = new XRWebGLBinding ( session , gl ) ;
829869 const glProjLayer = glBinding . createProjectionLayer ( projectionlayerInit ) ;
830870 const layersArray = [ glProjLayer ] ;
@@ -835,24 +875,43 @@ class XRManager extends EventDispatcher {
835875 renderer . setPixelRatio ( 1 ) ;
836876 renderer . setSize ( glProjLayer . textureWidth , glProjLayer . textureHeight , false ) ;
837877
878+ let depthTexture ;
879+ if ( this . _useMultiview ) {
880+
881+ depthTexture = new DepthArrayTexture ( glProjLayer . textureWidth , glProjLayer . textureHeight , 2 ) ;
882+ depthTexture . type = depthType ;
883+ depthTexture . format = depthFormat ;
884+
885+ } else {
886+
887+ depthTexture = new DepthTexture ( glProjLayer . textureWidth , glProjLayer . textureHeight , depthType , undefined , undefined , undefined , undefined , undefined , undefined , depthFormat ) ;
888+
889+ }
890+
891+
838892 this . _xrRenderTarget = new XRRenderTarget (
839893 glProjLayer . textureWidth ,
840894 glProjLayer . textureHeight ,
841895 {
842896 format : RGBAFormat ,
843897 type : UnsignedByteType ,
844898 colorSpace : renderer . outputColorSpace ,
845- depthTexture : new DepthTexture ( glProjLayer . textureWidth , glProjLayer . textureHeight , depthType , undefined , undefined , undefined , undefined , undefined , undefined , depthFormat ) ,
899+ depthTexture : depthTexture ,
846900 stencilBuffer : renderer . stencil ,
847901 samples : attributes . antialias ? 4 : 0 ,
848902 resolveDepthBuffer : ( glProjLayer . ignoreDepthValues === false ) ,
849903 resolveStencilBuffer : ( glProjLayer . ignoreDepthValues === false ) ,
904+ depth : this . _useMultiview ? 2 : 1 ,
905+ multiview : this . _useMultiview
850906 } ) ;
851907
852908 this . _xrRenderTarget . hasExternalTextures = true ;
909+ this . _xrRenderTarget . depth = this . _useMultiview ? 2 : 1 ;
853910
854911 this . _supportsLayers = session . enabledFeatures . includes ( 'layers' ) ;
855912
913+ this . _referenceSpace = await session . requestReferenceSpace ( this . getReferenceSpaceType ( ) ) ;
914+
856915 if ( this . _supportsLayers ) {
857916
858917 // switch layers to native
@@ -908,14 +967,14 @@ class XRManager extends EventDispatcher {
908967 }
909968 ) ;
910969
970+ this . _referenceSpace = await session . requestReferenceSpace ( this . getReferenceSpaceType ( ) ) ;
971+
911972 }
912973
913974 //
914975
915976 this . setFoveation ( this . getFoveation ( ) ) ;
916977
917- this . _referenceSpace = await session . requestReferenceSpace ( this . getReferenceSpaceType ( ) ) ;
918-
919978 renderer . _animation . setAnimationLoop ( this . _onAnimationFrame ) ;
920979 renderer . _animation . setContext ( session ) ;
921980 renderer . _animation . start ( ) ;
@@ -950,6 +1009,7 @@ class XRManager extends EventDispatcher {
9501009
9511010 cameraXR . near = cameraR . near = cameraL . near = depthNear ;
9521011 cameraXR . far = cameraR . far = cameraL . far = depthFar ;
1012+ cameraXR . isMultiViewCamera = this . _useMultiview ;
9531013
9541014 if ( this . _currentDepthNear !== cameraXR . near || this . _currentDepthFar !== cameraXR . far ) {
9551015
@@ -1261,6 +1321,7 @@ function onSessionEnd() {
12611321 //
12621322
12631323 this . isPresenting = false ;
1324+ this . _useMultiview = false ;
12641325
12651326 renderer . _animation . stop ( ) ;
12661327
@@ -1431,7 +1492,7 @@ function onAnimationFrame( time, frame ) {
14311492 backend . setXRRenderTargetTextures (
14321493 this . _xrRenderTarget ,
14331494 glSubImage . colorTexture ,
1434- this . _glProjLayer . ignoreDepthValues ? undefined : glSubImage . depthStencilTexture
1495+ ( this . _glProjLayer . ignoreDepthValues && ! this . _useMultiview ) ? undefined : glSubImage . depthStencilTexture
14351496 ) ;
14361497
14371498 }
0 commit comments