From 2baec79aef70921c439a3e9ca15b016494a5fd73 Mon Sep 17 00:00:00 2001 From: "Mr.doob" Date: Tue, 14 Jun 2016 16:54:30 -0700 Subject: [PATCH] Scene: Added background property. --- src/renderers/WebGLRenderer.js | 64 +++++++++++++++++++++++++++++++++- src/scenes/Scene.js | 2 ++ 2 files changed, 65 insertions(+), 1 deletion(-) diff --git a/src/renderers/WebGLRenderer.js b/src/renderers/WebGLRenderer.js index d48a79f20e..ca948d3da1 100644 --- a/src/renderers/WebGLRenderer.js +++ b/src/renderers/WebGLRenderer.js @@ -261,6 +261,29 @@ THREE.WebGLRenderer = function ( parameters ) { // + var backgroundCamera = new THREE.OrthographicCamera( - 1, 1, 1, - 1, 0, 1 ); + var backgroundCamera2 = new THREE.PerspectiveCamera(); + var backgroundPlaneMesh = new THREE.Mesh( + new THREE.PlaneBufferGeometry( 2, 2 ), + new THREE.MeshBasicMaterial( { depthTest: false, depthWrite: false } ) + ); + var backgroundBoxShader = THREE.ShaderLib[ 'cube' ]; + var backgroundBoxMesh = new THREE.Mesh( + new THREE.BoxBufferGeometry( 5, 5, 5 ), + new THREE.ShaderMaterial( { + uniforms: backgroundBoxShader.uniforms, + vertexShader: backgroundBoxShader.vertexShader, + fragmentShader: backgroundBoxShader.fragmentShader, + depthTest: false, + depthWrite: false, + side: THREE.BackSide + } ) + ); + objects.update( backgroundPlaneMesh ); + objects.update( backgroundBoxMesh ); + + // + function getTargetPixelRatio() { return _currentRenderTarget === null ? _pixelRatio : 1; @@ -1137,7 +1160,46 @@ THREE.WebGLRenderer = function ( parameters ) { this.setRenderTarget( renderTarget ); - if ( this.autoClear || forceClear ) { + // + + var needsClear = this.autoClear || forceClear; + var background = scene.background; + + if ( background === null ) { + + glClearColor( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha ); + + } else if ( background instanceof THREE.CubeTexture ) { + + backgroundCamera2.projectionMatrix = camera.projectionMatrix; + + backgroundCamera2.matrixWorld.extractRotation( camera.matrixWorld ); + backgroundCamera2.matrixWorldInverse.getInverse( backgroundCamera2.matrixWorld ); + + backgroundBoxMesh.material.uniforms[ "tCube" ].value = background; + backgroundBoxMesh.modelViewMatrix.multiplyMatrices( backgroundCamera2.matrixWorldInverse, backgroundBoxMesh.matrixWorld ); + + _this.renderBufferDirect( backgroundCamera2, null, backgroundBoxMesh.geometry, backgroundBoxMesh.material, backgroundBoxMesh, null ); + + needsClear = false; + + } else if ( background instanceof THREE.Texture ) { + + backgroundPlaneMesh.material.map = background; + + _this.renderBufferDirect( backgroundCamera, null, backgroundPlaneMesh.geometry, backgroundPlaneMesh.material, backgroundPlaneMesh, null ); + + needsClear = false; + + } else if ( background instanceof THREE.Color ) { + + glClearColor( background.r, background.g, background.b, 1 ); + + needsClear = true; + + } + + if ( needsClear ) { this.clear( this.autoClearColor, this.autoClearDepth, this.autoClearStencil ); diff --git a/src/scenes/Scene.js b/src/scenes/Scene.js index aa126bae54..91436e2136 100644 --- a/src/scenes/Scene.js +++ b/src/scenes/Scene.js @@ -8,6 +8,7 @@ THREE.Scene = function () { this.type = 'Scene'; + this.background = null; this.fog = null; this.overrideMaterial = null; @@ -22,6 +23,7 @@ THREE.Scene.prototype.copy = function ( source, recursive ) { THREE.Object3D.prototype.copy.call( this, source, recursive ); + if ( source.background !== null ) this.background = source.background.clone(); if ( source.fog !== null ) this.fog = source.fog.clone(); if ( source.overrideMaterial !== null ) this.overrideMaterial = source.overrideMaterial.clone(); -- GitLab