/** * @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 };