|
@@ -22187,13 +22187,15 @@ class WebXRManager extends EventDispatcher {
|
|
|
const state = renderer.state;
|
|
|
|
|
|
let session = null;
|
|
|
-
|
|
|
let framebufferScaleFactor = 1.0;
|
|
|
|
|
|
let referenceSpace = null;
|
|
|
let referenceSpaceType = 'local-floor';
|
|
|
|
|
|
let pose = null;
|
|
|
+ let glBinding = null;
|
|
|
+ let glFramebuffer = null;
|
|
|
+ let glProjLayer = null;
|
|
|
|
|
|
const controllers = [];
|
|
|
const inputSourcesMap = new Map();
|
|
@@ -22370,18 +22372,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 ? 34041 : 6402;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ const projectionlayerInit = {
|
|
|
+ colorFormat: attributes.alpha ? 6408 : 6407,
|
|
|
+ depthFormat: depthFormat,
|
|
|
+ scaleFactor: framebufferScaleFactor
|
|
|
+ };
|
|
|
+
|
|
|
+ // eslint-disable-next-line no-undef
|
|
|
+ glBinding = new XRWebGLBinding( session, gl );
|
|
|
|
|
|
- // eslint-disable-next-line no-undef
|
|
|
- const baseLayer = new XRWebGLLayer( session, gl, layerInit );
|
|
|
+ glProjLayer = glBinding.createProjectionLayer( projectionlayerInit );
|
|
|
|
|
|
- session.updateRenderState( { baseLayer: baseLayer } );
|
|
|
+ glFramebuffer = gl.createFramebuffer();
|
|
|
+
|
|
|
+ session.updateRenderState( { layers: [ glProjLayer ] } );
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
referenceSpace = await session.requestReferenceSpace( referenceSpaceType );
|
|
|
|
|
@@ -22600,9 +22631,14 @@ class WebXRManager extends EventDispatcher {
|
|
|
if ( pose !== null ) {
|
|
|
|
|
|
const views = pose.views;
|
|
|
+
|
|
|
const baseLayer = session.renderState.baseLayer;
|
|
|
|
|
|
- state.bindXRFramebuffer( baseLayer.framebuffer );
|
|
|
+ if ( session.renderState.layers === undefined ) {
|
|
|
+
|
|
|
+ state.bindXRFramebuffer( baseLayer.framebuffer );
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
let cameraVRNeedsUpdate = false;
|
|
|
|
|
@@ -22611,18 +22647,50 @@ class WebXRManager extends EventDispatcher {
|
|
|
if ( views.length !== cameraVR.cameras.length ) {
|
|
|
|
|
|
cameraVR.cameras.length = 0;
|
|
|
+
|
|
|
cameraVRNeedsUpdate = true;
|
|
|
|
|
|
+
|
|
|
}
|
|
|
|
|
|
for ( let i = 0; i < views.length; 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( 36160, glFramebuffer );
|
|
|
+
|
|
|
+ gl.framebufferTexture2D( 36160, 36064, 3553, glSubImage.colorTexture, 0 );
|
|
|
+
|
|
|
+ if ( glSubImage.depthStencilTexture !== undefined ) {
|
|
|
+
|
|
|
+ gl.framebufferTexture2D( 36160, 36096, 3553, glSubImage.depthStencilTexture, 0 );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ gl.bindFramebuffer( 36160, null );
|
|
|
+
|
|
|
+ state.bindXRFramebuffer( glFramebuffer );
|
|
|
+
|
|
|
+ viewport = glSubImage.viewport;
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
const camera = cameras[ i ];
|
|
|
+
|
|
|
camera.matrix.fromArray( view.transform.matrix );
|
|
|
+
|
|
|
camera.projectionMatrix.fromArray( view.projectionMatrix );
|
|
|
+
|
|
|
camera.viewport.set( viewport.x, viewport.y, viewport.width, viewport.height );
|
|
|
|
|
|
if ( i === 0 ) {
|
|
@@ -46491,6 +46559,29 @@ class AxesHelper extends LineSegments {
|
|
|
|
|
|
}
|
|
|
|
|
|
+ setColors( xAxisColor, yAxisColor, zAxisColor ) {
|
|
|
+
|
|
|
+ const color = new Color();
|
|
|
+ const array = this.geometry.attributes.color.array;
|
|
|
+
|
|
|
+ color.set( xAxisColor );
|
|
|
+ color.toArray( array, 0 );
|
|
|
+ color.toArray( array, 3 );
|
|
|
+
|
|
|
+ color.set( yAxisColor );
|
|
|
+ color.toArray( array, 6 );
|
|
|
+ color.toArray( array, 9 );
|
|
|
+
|
|
|
+ color.set( zAxisColor );
|
|
|
+ color.toArray( array, 12 );
|
|
|
+ color.toArray( array, 15 );
|
|
|
+
|
|
|
+ this.geometry.attributes.color.needsUpdate = true;
|
|
|
+
|
|
|
+ return this;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
dispose() {
|
|
|
|
|
|
this.geometry.dispose();
|