Skip to content

Commit

Permalink
WebGLRenderer: Moved background code to WebGLBackground.
Browse files Browse the repository at this point in the history
  • Loading branch information
mrdoob committed Jun 20, 2017
1 parent 3c4b4b8 commit 9b260d8
Show file tree
Hide file tree
Showing 2 changed files with 148 additions and 121 deletions.
130 changes: 9 additions & 121 deletions src/renderers/WebGLRenderer.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { REVISION, MaxEquation, MinEquation, RGB_ETC1_Format, RGBA_PVRTC_2BPPV1_Format, RGBA_PVRTC_4BPPV1_Format, RGB_PVRTC_2BPPV1_Format, RGB_PVRTC_4BPPV1_Format, RGBA_S3TC_DXT5_Format, RGBA_S3TC_DXT3_Format, RGBA_S3TC_DXT1_Format, RGB_S3TC_DXT1_Format, SrcAlphaSaturateFactor, OneMinusDstColorFactor, DstColorFactor, OneMinusDstAlphaFactor, DstAlphaFactor, OneMinusSrcAlphaFactor, SrcAlphaFactor, OneMinusSrcColorFactor, SrcColorFactor, OneFactor, ZeroFactor, ReverseSubtractEquation, SubtractEquation, AddEquation, DepthFormat, DepthStencilFormat, LuminanceAlphaFormat, LuminanceFormat, RGBAFormat, RGBFormat, AlphaFormat, HalfFloatType, FloatType, UnsignedIntType, IntType, UnsignedShortType, ShortType, ByteType, UnsignedInt248Type, UnsignedShort565Type, UnsignedShort5551Type, UnsignedShort4444Type, UnsignedByteType, LinearMipMapLinearFilter, LinearMipMapNearestFilter, LinearFilter, NearestMipMapLinearFilter, NearestMipMapNearestFilter, NearestFilter, MirroredRepeatWrapping, ClampToEdgeWrapping, RepeatWrapping, FrontFaceDirectionCW, NoBlending, BackSide, TriangleFanDrawMode, TriangleStripDrawMode, TrianglesDrawMode, NoColors, FlatShading, LinearToneMapping } from '../constants';
import { REVISION, MaxEquation, MinEquation, RGB_ETC1_Format, RGBA_PVRTC_2BPPV1_Format, RGBA_PVRTC_4BPPV1_Format, RGB_PVRTC_2BPPV1_Format, RGB_PVRTC_4BPPV1_Format, RGBA_S3TC_DXT5_Format, RGBA_S3TC_DXT3_Format, RGBA_S3TC_DXT1_Format, RGB_S3TC_DXT1_Format, SrcAlphaSaturateFactor, OneMinusDstColorFactor, DstColorFactor, OneMinusDstAlphaFactor, DstAlphaFactor, OneMinusSrcAlphaFactor, SrcAlphaFactor, OneMinusSrcColorFactor, SrcColorFactor, OneFactor, ZeroFactor, ReverseSubtractEquation, SubtractEquation, AddEquation, DepthFormat, DepthStencilFormat, LuminanceAlphaFormat, LuminanceFormat, RGBAFormat, RGBFormat, AlphaFormat, HalfFloatType, FloatType, UnsignedIntType, IntType, UnsignedShortType, ShortType, ByteType, UnsignedInt248Type, UnsignedShort565Type, UnsignedShort5551Type, UnsignedShort4444Type, UnsignedByteType, LinearMipMapLinearFilter, LinearMipMapNearestFilter, LinearFilter, NearestMipMapLinearFilter, NearestMipMapNearestFilter, NearestFilter, MirroredRepeatWrapping, ClampToEdgeWrapping, RepeatWrapping, FrontFaceDirectionCW, NoBlending, TriangleFanDrawMode, TriangleStripDrawMode, TrianglesDrawMode, NoColors, FlatShading, LinearToneMapping } from '../constants';
import { _Math } from '../math/Math';
import { Matrix4 } from '../math/Matrix4';
import { DataTexture } from '../textures/DataTexture';
Expand All @@ -9,14 +9,8 @@ import { ShaderLib } from './shaders/ShaderLib';
import { LensFlarePlugin } from './webgl/plugins/LensFlarePlugin';
import { SpritePlugin } from './webgl/plugins/SpritePlugin';
import { WebGLShadowMap } from './webgl/WebGLShadowMap';
import { ShaderMaterial } from '../materials/ShaderMaterial';
import { Mesh } from '../objects/Mesh';
import { BoxBufferGeometry } from '../geometries/BoxGeometry';
import { PlaneBufferGeometry } from '../geometries/PlaneGeometry';
import { MeshBasicMaterial } from '../materials/MeshBasicMaterial';
import { PerspectiveCamera } from '../cameras/PerspectiveCamera';
import { OrthographicCamera } from '../cameras/OrthographicCamera';
import { WebGLAttributes } from './webgl/WebGLAttributes';
import { WebGLBackground } from './webgl/WebGLBackground';
import { WebGLRenderLists } from './webgl/WebGLRenderLists';
import { WebGLIndexedBufferRenderer } from './webgl/WebGLIndexedBufferRenderer';
import { WebGLBufferRenderer } from './webgl/WebGLBufferRenderer';
Expand All @@ -36,7 +30,6 @@ import { Vector3 } from '../math/Vector3';
import { WebGLClipping } from './webgl/WebGLClipping';
import { Frustum } from '../math/Frustum';
import { Vector4 } from '../math/Vector4';
import { Color } from '../math/Color';

/**
* @author supereggbert / http://www.paulbrunt.co.uk/
Expand Down Expand Up @@ -139,9 +132,6 @@ function WebGLRenderer( parameters ) {

//

_clearColor = new Color( 0x000000 ),
_clearAlpha = 0,

_width = _canvas.width,
_height = _canvas.height,

Expand Down Expand Up @@ -298,6 +288,8 @@ function WebGLRenderer( parameters ) {
var programCache = new WebGLPrograms( this, capabilities );
var lightCache = new WebGLLights();
var renderLists = new WebGLRenderLists();

var background = new WebGLBackground( this, state, objects, _premultipliedAlpha );
var vr = new WebVRManager( this );

this.info.programs = programCache.programs;
Expand All @@ -307,11 +299,6 @@ function WebGLRenderer( parameters ) {

//

var backgroundPlaneCamera, backgroundPlaneMesh;
var backgroundBoxCamera, backgroundBoxMesh;

//

function getTargetPixelRatio() {

return _currentRenderTarget === null ? _pixelRatio : 1;
Expand All @@ -325,8 +312,6 @@ function WebGLRenderer( parameters ) {
state.scissor( _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ) );
state.viewport( _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ) );

state.buffers.color.setClear( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha, _premultipliedAlpha );

}

function resetGLState() {
Expand Down Expand Up @@ -462,35 +447,10 @@ function WebGLRenderer( parameters ) {

// Clearing

this.getClearColor = function () {

return _clearColor;

};

this.setClearColor = function ( color, alpha ) {

_clearColor.set( color );

_clearAlpha = alpha !== undefined ? alpha : 1;

state.buffers.color.setClear( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha, _premultipliedAlpha );

};

this.getClearAlpha = function () {

return _clearAlpha;

};

this.setClearAlpha = function ( alpha ) {

_clearAlpha = alpha;

state.buffers.color.setClear( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha, _premultipliedAlpha );

};
this.getClearColor = background.getClearColor;
this.setClearColor = background.setClearColor;
this.getClearAlpha = background.getClearAlpha;
this.setClearAlpha = background.setClearAlpha;

this.clear = function ( color, depth, stencil ) {

Expand Down Expand Up @@ -1183,79 +1143,7 @@ function WebGLRenderer( parameters ) {

//

var background = scene.background;

if ( background === null ) {

state.buffers.color.setClear( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha, _premultipliedAlpha );

} else if ( background && background.isColor ) {

state.buffers.color.setClear( background.r, background.g, background.b, 1, _premultipliedAlpha );
forceClear = true;

}

if ( this.autoClear || forceClear ) {

this.clear( this.autoClearColor, this.autoClearDepth, this.autoClearStencil );

}

if ( background && background.isCubeTexture ) {

if ( backgroundBoxCamera === undefined ) {

backgroundBoxCamera = new PerspectiveCamera();

backgroundBoxMesh = new Mesh(
new BoxBufferGeometry( 5, 5, 5 ),
new ShaderMaterial( {
uniforms: ShaderLib.cube.uniforms,
vertexShader: ShaderLib.cube.vertexShader,
fragmentShader: ShaderLib.cube.fragmentShader,
side: BackSide,
depthTest: false,
depthWrite: false,
fog: false
} )
);

}

backgroundBoxCamera.projectionMatrix.copy( camera.projectionMatrix );

backgroundBoxCamera.matrixWorld.extractRotation( camera.matrixWorld );
backgroundBoxCamera.matrixWorldInverse.getInverse( backgroundBoxCamera.matrixWorld );


backgroundBoxMesh.material.uniforms[ "tCube" ].value = background;
backgroundBoxMesh.modelViewMatrix.multiplyMatrices( backgroundBoxCamera.matrixWorldInverse, backgroundBoxMesh.matrixWorld );

objects.update( backgroundBoxMesh );

_this.renderBufferDirect( backgroundBoxCamera, null, backgroundBoxMesh.geometry, backgroundBoxMesh.material, backgroundBoxMesh, null );

} else if ( background && background.isTexture ) {

if ( backgroundPlaneCamera === undefined ) {

backgroundPlaneCamera = new OrthographicCamera( - 1, 1, 1, - 1, 0, 1 );

backgroundPlaneMesh = new Mesh(
new PlaneBufferGeometry( 2, 2 ),
new MeshBasicMaterial( { depthTest: false, depthWrite: false, fog: false } )
);

}

backgroundPlaneMesh.material.map = background;

objects.update( backgroundPlaneMesh );

_this.renderBufferDirect( backgroundPlaneCamera, null, backgroundPlaneMesh.geometry, backgroundPlaneMesh.material, backgroundPlaneMesh, null );

}
background.render( scene, camera, forceClear );

// render scene

Expand Down
139 changes: 139 additions & 0 deletions src/renderers/webgl/WebGLBackground.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,139 @@
/**
* @author mrdoob / http://mrdoob.com/
*/

import { BackSide } from '../../constants';
import { OrthographicCamera } from '../../cameras/OrthographicCamera';
import { PerspectiveCamera } from '../../cameras/PerspectiveCamera';
import { BoxBufferGeometry } from '../../geometries/BoxGeometry';
import { PlaneBufferGeometry } from '../../geometries/PlaneGeometry';
import { MeshBasicMaterial } from '../../materials/MeshBasicMaterial';
import { ShaderMaterial } from '../../materials/ShaderMaterial';
import { Color } from '../../math/Color';
import { Mesh } from '../../objects/Mesh';
import { ShaderLib } from '../shaders/ShaderLib';

function WebGLBackground( renderer, state, objects, premultipliedAlpha ) {

var clearColor = new Color( 0x000000 );
var clearAlpha = 0;

var planeCamera, planeMesh;
var boxCamera, boxMesh;

function render( scene, camera, forceClear ) {

var background = scene.background;

if ( background === null ) {

setClear( clearColor, clearAlpha );

} else if ( background && background.isColor ) {

setClear( background, 1 );
forceClear = true;

}

if ( renderer.autoClear || forceClear ) {

renderer.clear( renderer.autoClearColor, renderer.autoClearDepth, renderer.autoClearStencil );

}

if ( background && background.isCubeTexture ) {

if ( boxCamera === undefined ) {

boxCamera = new PerspectiveCamera();

boxMesh = new Mesh(
new BoxBufferGeometry( 5, 5, 5 ),
new ShaderMaterial( {
uniforms: ShaderLib.cube.uniforms,
vertexShader: ShaderLib.cube.vertexShader,
fragmentShader: ShaderLib.cube.fragmentShader,
side: BackSide,
depthTest: false,
depthWrite: false,
fog: false
} )
);

}

boxCamera.projectionMatrix.copy( camera.projectionMatrix );

boxCamera.matrixWorld.extractRotation( camera.matrixWorld );
boxCamera.matrixWorldInverse.getInverse( boxCamera.matrixWorld );

boxMesh.material.uniforms[ "tCube" ].value = background;
boxMesh.modelViewMatrix.multiplyMatrices( boxCamera.matrixWorldInverse, boxMesh.matrixWorld );

objects.update( boxMesh );

renderer.renderBufferDirect( boxCamera, null, boxMesh.geometry, boxMesh.material, boxMesh, null );

} else if ( background && background.isTexture ) {

if ( planeCamera === undefined ) {

planeCamera = new OrthographicCamera( - 1, 1, 1, - 1, 0, 1 );

planeMesh = new Mesh(
new PlaneBufferGeometry( 2, 2 ),
new MeshBasicMaterial( { depthTest: false, depthWrite: false, fog: false } )
);

}

planeMesh.material.map = background;

objects.update( planeMesh );

renderer.renderBufferDirect( planeCamera, null, planeMesh.geometry, planeMesh.material, planeMesh, null );

}

}

function setClear( color, alpha ) {

state.buffers.color.setClear( color.r, color.g, color.b, alpha, premultipliedAlpha );

}

return {

getClearColor: function () {

return clearColor;

},
setClearColor: function ( color, alpha ) {

clearColor.set( color );
clearAlpha = alpha !== undefined ? alpha : 1;
setClear( clearColor, clearAlpha );

},
getClearAlpha: function () {

return clearAlpha;

},
setClearAlpha: function ( alpha ) {

clearAlpha = alpha;
setClear( clearColor, clearAlpha );

},
render: render

};

}


export { WebGLBackground };

0 comments on commit 9b260d8

Please sign in to comment.