From e59877f897b7139da88cfbd3151c38f605a75d74 Mon Sep 17 00:00:00 2001 From: "Mr.doob" Date: Fri, 10 Mar 2017 11:25:42 -0800 Subject: [PATCH] Added ArrayCamera. See #10927. --- src/Three.js | 1 + src/cameras/ArrayCamera.js | 25 ++++++++++++++ src/renderers/WebGLRenderer.js | 59 ++++++++++++++++++++++++++++------ 3 files changed, 76 insertions(+), 9 deletions(-) create mode 100644 src/cameras/ArrayCamera.js diff --git a/src/Three.js b/src/Three.js index c3f572e76e..86c86576d9 100644 --- a/src/Three.js +++ b/src/Three.js @@ -61,6 +61,7 @@ export { StereoCamera } from './cameras/StereoCamera.js'; export { PerspectiveCamera } from './cameras/PerspectiveCamera.js'; export { OrthographicCamera } from './cameras/OrthographicCamera.js'; export { CubeCamera } from './cameras/CubeCamera.js'; +export { ArrayCamera } from './cameras/ArrayCamera.js'; export { Camera } from './cameras/Camera.js'; export { AudioListener } from './audio/AudioListener.js'; export { PositionalAudio } from './audio/PositionalAudio.js'; diff --git a/src/cameras/ArrayCamera.js b/src/cameras/ArrayCamera.js new file mode 100644 index 0000000000..8b98f7a59c --- /dev/null +++ b/src/cameras/ArrayCamera.js @@ -0,0 +1,25 @@ +/** + * @author mrdoob / http://mrdoob.com/ + */ + +import { PerspectiveCamera } from './PerspectiveCamera'; + +function ArrayCamera( array ) { + + PerspectiveCamera.call( this ); + + this.enabled = false; + this.cameras = array || []; + +} + +ArrayCamera.prototype = Object.assign( Object.create( PerspectiveCamera.prototype ), { + + constructor: ArrayCamera, + + isArrayCamera: true + +} ); + + +export { ArrayCamera }; diff --git a/src/renderers/WebGLRenderer.js b/src/renderers/WebGLRenderer.js index 558f76f5bd..451f9fcbe6 100644 --- a/src/renderers/WebGLRenderer.js +++ b/src/renderers/WebGLRenderer.js @@ -1060,6 +1060,8 @@ function WebGLRenderer( parameters ) { // update camera matrices and frustum + camera.onBeforeRender( _this ); + if ( camera.parent === null ) camera.updateMatrixWorld(); camera.matrixWorldInverse.getInverse( camera.matrixWorld ); @@ -1236,6 +1238,14 @@ function WebGLRenderer( parameters ) { state.buffers.depth.setMask( true ); state.buffers.color.setMask( true ); + if ( camera.isArrayCamera && camera.enabled ) { + + _this.setScissorTest( false ); + + } + + camera.onAfterRender( _this ); + // _gl.finish(); }; @@ -1402,22 +1412,30 @@ function WebGLRenderer( parameters ) { object.onBeforeRender( _this, scene, camera, geometry, material, group ); - object.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld ); - object.normalMatrix.getNormalMatrix( object.modelViewMatrix ); + if ( camera.isArrayCamera && camera.enabled ) { - if ( object.isImmediateRenderObject ) { + var cameras = camera.cameras; - state.setMaterial( material ); + for ( var j = 0, jl = cameras.length; j < jl; j ++ ) { - var program = setProgram( camera, scene.fog, material, object ); + var camera2 = cameras[ j ]; + var bounds = camera2.bounds; + _this.setViewport( + bounds.x * _width * _pixelRatio, bounds.y * _height * _pixelRatio, + bounds.z * _width * _pixelRatio, bounds.w * _height * _pixelRatio + ); + _this.setScissor( + bounds.x * _width * _pixelRatio, bounds.y * _height * _pixelRatio, + bounds.z * _width * _pixelRatio, bounds.w * _height * _pixelRatio + ); + _this.setScissorTest( true ); + renderObject( object, scene, camera2, geometry, material, group ); - _currentGeometryProgram = ''; - - renderObjectImmediate( object, program, material ); + } } else { - _this.renderBufferDirect( camera, scene.fog, geometry, material, object, group ); + renderObject( object, scene, camera, geometry, material, group ); } @@ -1427,6 +1445,29 @@ function WebGLRenderer( parameters ) { } + function renderObject( object, scene, camera, geometry, material, group ) { + + object.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld ); + object.normalMatrix.getNormalMatrix( object.modelViewMatrix ); + + if ( object.isImmediateRenderObject ) { + + state.setMaterial( material ); + + var program = setProgram( camera, scene.fog, material, object ); + + _currentGeometryProgram = ''; + + renderObjectImmediate( object, program, material ); + + } else { + + _this.renderBufferDirect( camera, scene.fog, geometry, material, object, group ); + + } + + } + function initMaterial( material, fog, object ) { var materialProperties = properties.get( material ); -- GitLab