From a36819441ac32c6a206d6aff54e3da7c2cc4eb17 Mon Sep 17 00:00:00 2001 From: "Mr.doob" Date: Fri, 27 Sep 2019 14:00:08 -0700 Subject: [PATCH] WebGLMultiview: Brought back removed non-ArrayCamera code path and use in VR. --- src/renderers/WebGLRenderer.js | 12 ++--- src/renderers/webgl/WebGLMultiview.js | 63 ++++++++++++++++++++------- 2 files changed, 53 insertions(+), 22 deletions(-) diff --git a/src/renderers/WebGLRenderer.js b/src/renderers/WebGLRenderer.js index 80c08b2c8f..226d2c94b5 100644 --- a/src/renderers/WebGLRenderer.js +++ b/src/renderers/WebGLRenderer.js @@ -1197,7 +1197,7 @@ function WebGLRenderer( parameters ) { } - if ( camera.isArrayCamera && multiview.isAvailable() ) { + if ( vr.enabled && multiview.isAvailable() ) { multiview.attachCamera( camera ); @@ -1257,13 +1257,13 @@ function WebGLRenderer( parameters ) { state.setPolygonOffset( false ); - if ( camera.isArrayCamera && multiview.isAvailable() ) { + if ( vr.enabled ) { - multiview.detachCamera( camera ); + if ( multiview.isAvailable() ) { - } + multiview.detachCamera( camera ); - if ( vr.enabled ) { + } vr.submitFrame(); @@ -1416,7 +1416,7 @@ function WebGLRenderer( parameters ) { _currentArrayCamera = camera; - if ( multiview.isAvailable() ) { + if ( vr.enabled && multiview.isAvailable() ) { renderObject( object, scene, camera, geometry, material, group ); diff --git a/src/renderers/webgl/WebGLMultiview.js b/src/renderers/webgl/WebGLMultiview.js index 4ed1a14245..1428794616 100644 --- a/src/renderers/webgl/WebGLMultiview.js +++ b/src/renderers/webgl/WebGLMultiview.js @@ -16,7 +16,7 @@ function WebGLMultiview( renderer, gl ) { var properties = renderer.properties; var renderTarget, currentRenderTarget; - var mat3, mat4, renderSize; + var mat3, mat4, cameraArray, renderSize; var available; var maxNumViews = 0; @@ -39,6 +39,7 @@ function WebGLMultiview( renderer, gl ) { renderSize = new Vector2(); mat4 = []; mat3 = []; + cameraArray = []; for ( var i = 0; i < maxNumViews; i ++ ) { @@ -55,9 +56,19 @@ function WebGLMultiview( renderer, gl ) { } + function getCameraArray( camera ) { + + if ( camera.isArrayCamera ) return camera.cameras; + + cameraArray[ 0 ] = camera; + + return cameraArray; + + } + function updateCameraProjectionMatricesUniform( camera, uniforms ) { - var cameras = camera.cameras; + var cameras = getCameraArray( camera ); for ( var i = 0; i < cameras.length; i ++ ) { @@ -71,7 +82,7 @@ function WebGLMultiview( renderer, gl ) { function updateCameraViewMatricesUniform( camera, uniforms ) { - var cameras = camera.cameras; + var cameras = getCameraArray( camera ); for ( var i = 0; i < cameras.length; i ++ ) { @@ -85,7 +96,7 @@ function WebGLMultiview( renderer, gl ) { function updateObjectMatricesUniforms( object, camera, uniforms ) { - var cameras = camera.cameras; + var cameras = getCameraArray( camera ); for ( var i = 0; i < cameras.length; i ++ ) { @@ -101,6 +112,8 @@ function WebGLMultiview( renderer, gl ) { function isMultiviewCompatible( camera ) { + if ( camera.isArrayCamera === undefined ) return true; + var cameras = camera.cameras; if ( cameras.length > maxNumViews ) return false; @@ -128,16 +141,25 @@ function WebGLMultiview( renderer, gl ) { } - var viewport = camera.cameras[ 0 ].viewport; + if ( camera.isArrayCamera ) { + + var viewport = camera.cameras[ 0 ].viewport; - renderTarget.setSize( viewport.z, viewport.w ); - renderTarget.setNumViews( camera.cameras.length ); + renderTarget.setSize( viewport.z, viewport.w ); + renderTarget.setNumViews( camera.cameras.length ); + + } else { + + renderTarget.setSize( renderSize.x, renderSize.y ); + renderTarget.setNumViews( DEFAULT_NUMVIEWS ); + + } } function attachCamera( camera ) { - if ( ! isMultiviewCompatible( camera ) ) return; + if ( isMultiviewCompatible( camera ) === false ) return; currentRenderTarget = renderer.getRenderTarget(); resizeRenderTarget( camera ); @@ -165,17 +187,26 @@ function WebGLMultiview( renderer, gl ) { var viewWidth = srcRenderTarget.width; var viewHeight = srcRenderTarget.height; - for ( var i = 0; i < numViews; i ++ ) { + if ( camera.isArrayCamera ) { + + for ( var i = 0; i < numViews; i ++ ) { - var viewport = camera.cameras[ i ].viewport; + var viewport = camera.cameras[ i ].viewport; - var x1 = viewport.x; - var y1 = viewport.y; - var x2 = x1 + viewport.z; - var y2 = y1 + viewport.w; + var x1 = viewport.x; + var y1 = viewport.y; + var x2 = x1 + viewport.z; + var y2 = y1 + viewport.w; + + gl.bindFramebuffer( gl.READ_FRAMEBUFFER, srcFramebuffers[ i ] ); + gl.blitFramebuffer( 0, 0, viewWidth, viewHeight, x1, y1, x2, y2, gl.COLOR_BUFFER_BIT, gl.NEAREST ); + + } + + } else { - gl.bindFramebuffer( gl.READ_FRAMEBUFFER, srcFramebuffers[ i ] ); - gl.blitFramebuffer( 0, 0, viewWidth, viewHeight, x1, y1, x2, y2, gl.COLOR_BUFFER_BIT, gl.NEAREST ); + gl.bindFramebuffer( gl.READ_FRAMEBUFFER, srcFramebuffers[ 0 ] ); + gl.blitFramebuffer( 0, 0, viewWidth, viewHeight, 0, 0, renderSize.x, renderSize.y, gl.COLOR_BUFFER_BIT, gl.NEAREST ); } -- GitLab