if ( _clippingEnabled === true ) clipping.beginShadows();
const shadowsArray = currentRenderState.state.shadowsArray;
shadowMap.render( shadowsArray, scene, camera );
currentRenderState.setupLights();
currentRenderState.setupLightsView( camera );
if ( _clippingEnabled === true ) clipping.endShadows();
if ( this.info.autoReset === true ) this.info.reset();
if ( renderTarget !== undefined ) {
this.setRenderTarget( renderTarget );
}
background.render( currentRenderList, scene, camera, forceClear );
const opaqueObjects = currentRenderList.opaque;
const transparentObjects = currentRenderList.transparent;
if ( opaqueObjects.length > 0 ) renderObjects( opaqueObjects, scene, camera );
if ( transparentObjects.length > 0 )
renderObjects( transparentObjects, scene, camera );
this.render = function ( scene, camera ) {
let renderTarget, forceClear;
if ( arguments[ 2 ] !== undefined ) {
console.warn(
'THREE.WebGLRenderer.render(): the renderTarget argument has been removed. Use .setRenderTarget() instead.'
);
renderTarget = arguments[ 2 ];
}
if ( arguments[ 3 ] !== undefined ) {
console.warn(
'THREE.WebGLRenderer.render(): the forceClear argument has been removed. Use .clear() instead.'
);
forceClear = arguments[ 3 ];
}
if ( camera !== undefined && camera.isCamera !== true ) {
console.error(
'THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.'
);
return;
}
if ( _isContextLost === true ) return;
if ( scene.autoUpdate === true ) scene.updateMatrixWorld();
if ( camera.parent === null ) camera.updateMatrixWorld();
if ( xr.enabled === true && xr.isPresenting === true ) {
camera = xr.getCamera( camera );
}
if ( scene.isScene === true )
scene.onBeforeRender(
_this,
scene,
camera,
renderTarget || _currentRenderTarget
);
currentRenderState = renderStates.get( scene, renderStateStack.length );
currentRenderState.init();
renderStateStack.push( currentRenderState );
_projScreenMatrix.multiplyMatrices(
camera.projectionMatrix,
camera.matrixWorldInverse
);
_frustum.setFromProjectionMatrix( _projScreenMatrix );
_localClippingEnabled = this.localClippingEnabled;
_clippingEnabled = clipping.init(
this.clippingPlanes,
_localClippingEnabled,
camera
);
currentRenderList = renderLists.get( scene, renderListStack.length );
currentRenderList.init();
renderListStack.push( currentRenderList );
projectObject( scene, camera, 0, _this.sortObjects );
currentRenderList.finish();
if ( _this.sortObjects === true ) {
currentRenderList.sort( _opaqueSort, _transparentSort );
}
if ( _clippingEnabled === true ) clipping.beginShadows();
const shadowsArray = currentRenderState.state.shadowsArray;
shadowMap.render( shadowsArray, scene, camera );
currentRenderState.setupLights();
currentRenderState.setupLightsView( camera );
if ( _clippingEnabled === true ) clipping.endShadows();
if ( this.info.autoReset === true ) this.info.reset();
if ( renderTarget !== undefined ) {
this.setRenderTarget( renderTarget );
}
background.render( currentRenderList, scene, camera, forceClear );
const opaqueObjects = currentRenderList.opaque;
const transparentObjects = currentRenderList.transparent;
if ( opaqueObjects.length > 0 ) renderObjects( opaqueObjects, scene, camera );
if ( transparentObjects.length > 0 )
renderObjects( transparentObjects, scene, camera );
if ( _currentRenderTarget !== null ) {
textures.updateRenderTargetMipmap( _currentRenderTarget );
textures.updateMultisampleRenderTarget( _currentRenderTarget );
}
if ( scene.isScene === true ) scene.onAfterRender( _this, scene, camera );
state.buffers.depth.setTest( true );
state.buffers.depth.setMask( true );
state.buffers.color.setMask( true );
state.setPolygonOffset( false );
bindingStates.resetDefaultState();
_currentMaterialId = - 1;
_currentCamera = null;
renderStateStack.pop();
if ( renderStateStack.length > 0 ) {
currentRenderState = renderStateStack[ renderStateStack.length - 1 ];
} else {
currentRenderState = null;
}
renderListStack.pop();
if ( renderListStack.length > 0 ) {
currentRenderList = renderListStack[ renderListStack.length - 1 ];
} else {
currentRenderList = null;
}
};