Spaces:
Running
Running
/** | |
* @author mrdoob / http://mrdoob.com/ | |
*/ | |
import { REVISION } from '../constants.js'; | |
import { WebGLExtensions } from './webgl/WebGLExtensions.js'; | |
import { WebGLState } from './webgl/WebGLState.js'; | |
import { Color } from '../math/Color.js'; | |
import { Vector4 } from '../math/Vector4.js'; | |
function WebGL2Renderer( parameters ) { | |
console.log( 'THREE.WebGL2Renderer', REVISION ); | |
parameters = parameters || {}; | |
var _canvas = parameters.canvas !== undefined ? parameters.canvas : document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' ), | |
_context = parameters.context !== undefined ? parameters.context : null, | |
_alpha = parameters.alpha !== undefined ? parameters.alpha : false, | |
_depth = parameters.depth !== undefined ? parameters.depth : true, | |
_stencil = parameters.stencil !== undefined ? parameters.stencil : true, | |
_antialias = parameters.antialias !== undefined ? parameters.antialias : false, | |
_premultipliedAlpha = parameters.premultipliedAlpha !== undefined ? parameters.premultipliedAlpha : true, | |
_preserveDrawingBuffer = parameters.preserveDrawingBuffer !== undefined ? parameters.preserveDrawingBuffer : false, | |
_powerPreference = parameters.powerPreference !== undefined ? parameters.powerPreference : 'default'; | |
// initialize | |
var gl; | |
try { | |
var attributes = { | |
alpha: _alpha, | |
depth: _depth, | |
stencil: _stencil, | |
antialias: _antialias, | |
premultipliedAlpha: _premultipliedAlpha, | |
preserveDrawingBuffer: _preserveDrawingBuffer, | |
powerPreference: _powerPreference | |
}; | |
// event listeners must be registered before WebGL context is created, see #12753 | |
_canvas.addEventListener( 'webglcontextlost', onContextLost, false ); | |
_canvas.addEventListener( 'webglcontextrestored', function () { } ); | |
gl = _context || _canvas.getContext( 'webgl2', attributes ); | |
if ( gl === null ) { | |
if ( _canvas.getContext( 'webgl2' ) !== null ) { | |
throw new Error( 'Error creating WebGL2 context with your selected attributes.' ); | |
} else { | |
throw new Error( 'Error creating WebGL2 context.' ); | |
} | |
} | |
} catch ( error ) { | |
console.error( 'THREE.WebGL2Renderer: ' + error.message ); | |
} | |
// | |
var _autoClear = true, | |
_autoClearColor = true, | |
_autoClearDepth = true, | |
_autoClearStencil = true, | |
_clearColor = new Color( 0x000000 ), | |
_clearAlpha = 0, | |
_width = _canvas.width, | |
_height = _canvas.height, | |
_pixelRatio = 1, | |
_viewport = new Vector4( 0, 0, _width, _height ); | |
var extensions = new WebGLExtensions( gl ); | |
var state = new WebGLState( gl, extensions, function () {} ); | |
// | |
function clear( color, depth, stencil ) { | |
var bits = 0; | |
if ( color === undefined || color ) bits |= gl.COLOR_BUFFER_BIT; | |
if ( depth === undefined || depth ) bits |= gl.DEPTH_BUFFER_BIT; | |
if ( stencil === undefined || stencil ) bits |= gl.STENCIL_BUFFER_BIT; | |
gl.clear( bits ); | |
} | |
function setPixelRatio( value ) { | |
if ( value === undefined ) return; | |
_pixelRatio = value; | |
setSize( _viewport.z, _viewport.w, false ); | |
} | |
function setSize( width, height, updateStyle ) { | |
_width = width; | |
_height = height; | |
_canvas.width = width * _pixelRatio; | |
_canvas.height = height * _pixelRatio; | |
if ( updateStyle !== false ) { | |
_canvas.style.width = width + 'px'; | |
_canvas.style.height = height + 'px'; | |
} | |
setViewport( 0, 0, width, height ); | |
} | |
function setViewport( x, y, width, height ) { | |
state.viewport( _viewport.set( x, y, width, height ) ); | |
} | |
function render( scene, camera ) { | |
if ( camera !== undefined && camera.isCamera !== true ) { | |
console.error( 'THREE.WebGL2Renderer.render: camera is not an instance of THREE.Camera.' ); | |
return; | |
} | |
var background = scene.background; | |
var forceClear = false; | |
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 ( _autoClear || forceClear ) { | |
this.clear( _autoClearColor, _autoClearDepth, _autoClearStencil ); | |
} | |
} | |
function onContextLost( event ) { | |
event.preventDefault(); | |
} | |
return { | |
domElement: _canvas, | |
clear: clear, | |
setPixelRatio: setPixelRatio, | |
setSize: setSize, | |
render: render | |
}; | |
} | |
export { WebGL2Renderer }; | |