|
@@ -16,13 +16,15 @@ class WebXRManager extends EventDispatcher {
|
|
const state = renderer.state;
|
|
const state = renderer.state;
|
|
|
|
|
|
let session = null;
|
|
let session = null;
|
|
-
|
|
|
|
let framebufferScaleFactor = 1.0;
|
|
let framebufferScaleFactor = 1.0;
|
|
|
|
|
|
let referenceSpace = null;
|
|
let referenceSpace = null;
|
|
let referenceSpaceType = 'local-floor';
|
|
let referenceSpaceType = 'local-floor';
|
|
|
|
|
|
let pose = null;
|
|
let pose = null;
|
|
|
|
+ let glBinding = null;
|
|
|
|
+ let glFramebuffer = null;
|
|
|
|
+ let glProjLayer = null;
|
|
|
|
|
|
const controllers = [];
|
|
const controllers = [];
|
|
const inputSourcesMap = new Map();
|
|
const inputSourcesMap = new Map();
|
|
@@ -199,18 +201,47 @@ class WebXRManager extends EventDispatcher {
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
- const layerInit = {
|
|
|
|
- antialias: attributes.antialias,
|
|
|
|
- alpha: attributes.alpha,
|
|
|
|
- depth: attributes.depth,
|
|
|
|
- stencil: attributes.stencil,
|
|
|
|
- framebufferScaleFactor: framebufferScaleFactor
|
|
|
|
- };
|
|
|
|
|
|
+ if ( session.renderState.layers === undefined ) {
|
|
|
|
+
|
|
|
|
+ const layerInit = {
|
|
|
|
+ antialias: attributes.antialias,
|
|
|
|
+ alpha: attributes.alpha,
|
|
|
|
+ depth: attributes.depth,
|
|
|
|
+ stencil: attributes.stencil,
|
|
|
|
+ framebufferScaleFactor: framebufferScaleFactor
|
|
|
|
+ };
|
|
|
|
+
|
|
|
|
+ // eslint-disable-next-line no-undef
|
|
|
|
+ const baseLayer = new XRWebGLLayer( session, gl, layerInit );
|
|
|
|
+
|
|
|
|
+ session.updateRenderState( { baseLayer: baseLayer } );
|
|
|
|
+
|
|
|
|
+ } else {
|
|
|
|
+
|
|
|
|
+ let depthFormat = 0;
|
|
|
|
+
|
|
|
|
+ if ( attributes.depth ) {
|
|
|
|
+
|
|
|
|
+ depthFormat = attributes.stencil ? gl.DEPTH_STENCIL : gl.DEPTH_COMPONENT;
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ const projectionlayerInit = {
|
|
|
|
+ colorFormat: attributes.alpha ? gl.RGBA : gl.RGB,
|
|
|
|
+ depthFormat: depthFormat,
|
|
|
|
+ scaleFactor: framebufferScaleFactor
|
|
|
|
+ };
|
|
|
|
+
|
|
|
|
+ // eslint-disable-next-line no-undef
|
|
|
|
+ glBinding = new XRWebGLBinding( session, gl );
|
|
|
|
+
|
|
|
|
+ glProjLayer = glBinding.createProjectionLayer( projectionlayerInit );
|
|
|
|
|
|
- // eslint-disable-next-line no-undef
|
|
|
|
- const baseLayer = new XRWebGLLayer( session, gl, layerInit );
|
|
|
|
|
|
+ glFramebuffer = gl.createFramebuffer();
|
|
|
|
|
|
- session.updateRenderState( { baseLayer: baseLayer } );
|
|
|
|
|
|
+ session.updateRenderState( { layers: [ glProjLayer ] } );
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
|
|
referenceSpace = await session.requestReferenceSpace( referenceSpaceType );
|
|
referenceSpace = await session.requestReferenceSpace( referenceSpaceType );
|
|
|
|
|
|
@@ -429,9 +460,14 @@ class WebXRManager extends EventDispatcher {
|
|
if ( pose !== null ) {
|
|
if ( pose !== null ) {
|
|
|
|
|
|
const views = pose.views;
|
|
const views = pose.views;
|
|
|
|
+
|
|
const baseLayer = session.renderState.baseLayer;
|
|
const baseLayer = session.renderState.baseLayer;
|
|
|
|
|
|
- state.bindXRFramebuffer( baseLayer.framebuffer );
|
|
|
|
|
|
+ if ( session.renderState.layers === undefined ) {
|
|
|
|
+
|
|
|
|
+ state.bindXRFramebuffer( baseLayer.framebuffer );
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
|
|
let cameraVRNeedsUpdate = false;
|
|
let cameraVRNeedsUpdate = false;
|
|
|
|
|
|
@@ -440,18 +476,50 @@ class WebXRManager extends EventDispatcher {
|
|
if ( views.length !== cameraVR.cameras.length ) {
|
|
if ( views.length !== cameraVR.cameras.length ) {
|
|
|
|
|
|
cameraVR.cameras.length = 0;
|
|
cameraVR.cameras.length = 0;
|
|
|
|
+
|
|
cameraVRNeedsUpdate = true;
|
|
cameraVRNeedsUpdate = true;
|
|
|
|
|
|
|
|
+
|
|
}
|
|
}
|
|
|
|
|
|
for ( let i = 0; i < views.length; i ++ ) {
|
|
for ( let i = 0; i < views.length; i ++ ) {
|
|
|
|
|
|
const view = views[ i ];
|
|
const view = views[ i ];
|
|
- const viewport = baseLayer.getViewport( view );
|
|
|
|
|
|
+
|
|
|
|
+ let viewport = null;
|
|
|
|
+
|
|
|
|
+ if ( session.renderState.layers === undefined ) {
|
|
|
|
+
|
|
|
|
+ viewport = baseLayer.getViewport( view );
|
|
|
|
+
|
|
|
|
+ } else {
|
|
|
|
+
|
|
|
|
+ const glSubImage = glBinding.getViewSubImage( glProjLayer, view );
|
|
|
|
+
|
|
|
|
+ gl.bindFramebuffer( gl.FRAMEBUFFER, glFramebuffer );
|
|
|
|
+
|
|
|
|
+ gl.framebufferTexture2D( gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, glSubImage.colorTexture, 0 );
|
|
|
|
+
|
|
|
|
+ if ( glSubImage.depthStencilTexture !== undefined ) {
|
|
|
|
+
|
|
|
|
+ gl.framebufferTexture2D( gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.TEXTURE_2D, glSubImage.depthStencilTexture, 0 );
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ gl.bindFramebuffer( gl.FRAMEBUFFER, null );
|
|
|
|
+
|
|
|
|
+ state.bindXRFramebuffer( glFramebuffer );
|
|
|
|
+
|
|
|
|
+ viewport = glSubImage.viewport;
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
|
|
const camera = cameras[ i ];
|
|
const camera = cameras[ i ];
|
|
|
|
+
|
|
camera.matrix.fromArray( view.transform.matrix );
|
|
camera.matrix.fromArray( view.transform.matrix );
|
|
|
|
+
|
|
camera.projectionMatrix.fromArray( view.projectionMatrix );
|
|
camera.projectionMatrix.fromArray( view.projectionMatrix );
|
|
|
|
+
|
|
camera.viewport.set( viewport.x, viewport.y, viewport.width, viewport.height );
|
|
camera.viewport.set( viewport.x, viewport.y, viewport.width, viewport.height );
|
|
|
|
|
|
if ( i === 0 ) {
|
|
if ( i === 0 ) {
|