WebGLRenderer.js 61.5 KB
Newer Older
1
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, LinearToneMapping } from '../constants';
2
import { _Math } from '../math/Math';
R
Rich Harris 已提交
3
import { Matrix4 } from '../math/Matrix4';
4
import { DataTexture } from '../textures/DataTexture';
R
Rich Harris 已提交
5
import { WebGLUniforms } from './webgl/WebGLUniforms';
M
Mr.doob 已提交
6
import { UniformsLib } from './shaders/UniformsLib';
7
import { UniformsUtils } from './shaders/UniformsUtils';
R
Rich Harris 已提交
8
import { ShaderLib } from './shaders/ShaderLib';
9 10
import { WebGLFlareRenderer } from './webgl/WebGLFlareRenderer';
import { WebGLSpriteRenderer } from './webgl/WebGLSpriteRenderer';
R
Rich Harris 已提交
11
import { WebGLShadowMap } from './webgl/WebGLShadowMap';
12
import { WebGLAttributes } from './webgl/WebGLAttributes';
13
import { WebGLBackground } from './webgl/WebGLBackground';
14
import { WebGLRenderLists } from './webgl/WebGLRenderLists';
R
Rich Harris 已提交
15 16
import { WebGLIndexedBufferRenderer } from './webgl/WebGLIndexedBufferRenderer';
import { WebGLBufferRenderer } from './webgl/WebGLBufferRenderer';
17
import { WebGLGeometries } from './webgl/WebGLGeometries';
R
Rich Harris 已提交
18 19
import { WebGLLights } from './webgl/WebGLLights';
import { WebGLObjects } from './webgl/WebGLObjects';
20
import { WebGLPrograms } from './webgl/WebGLPrograms';
R
Rich Harris 已提交
21 22 23 24
import { WebGLTextures } from './webgl/WebGLTextures';
import { WebGLProperties } from './webgl/WebGLProperties';
import { WebGLState } from './webgl/WebGLState';
import { WebGLCapabilities } from './webgl/WebGLCapabilities';
25
import { WebVRManager } from './webvr/WebVRManager';
R
Rich Harris 已提交
26 27 28
import { BufferGeometry } from '../core/BufferGeometry';
import { WebGLExtensions } from './webgl/WebGLExtensions';
import { Vector3 } from '../math/Vector3';
M
Mr.doob 已提交
29
// import { Sphere } from '../math/Sphere';
R
Rich Harris 已提交
30 31 32 33
import { WebGLClipping } from './webgl/WebGLClipping';
import { Frustum } from '../math/Frustum';
import { Vector4 } from '../math/Vector4';

M
Mr.doob 已提交
34 35 36 37 38
/**
 * @author supereggbert / http://www.paulbrunt.co.uk/
 * @author mrdoob / http://mrdoob.com/
 * @author alteredq / http://alteredqualia.com/
 * @author szimek / https://github.com/szimek/
T
tschw 已提交
39
 * @author tschw
M
Mr.doob 已提交
40 41
 */

M
Mr.doob 已提交
42
function WebGLRenderer( parameters ) {
M
Mr.doob 已提交
43

M
Mr.doob 已提交
44
	console.log( 'THREE.WebGLRenderer', REVISION );
M
Mr.doob 已提交
45 46 47

	parameters = parameters || {};

E
Eli Grey 已提交
48
	var _canvas = parameters.canvas !== undefined ? parameters.canvas : document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' ),
49
		_context = parameters.context !== undefined ? parameters.context : null,
M
Mr.doob 已提交
50

51 52 53 54 55 56
		_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;
M
Mr.doob 已提交
57

58 59
	var lightsArray = [];
	var shadowsArray = [];
M
Mr.doob 已提交
60

61
	var currentRenderList = null;
62

63 64
	var morphInfluences = new Float32Array( 8 );

65 66
	var spritesArray = [];
	var flaresArray = [];
M
Mr.doob 已提交
67

M
Mr.doob 已提交
68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
	// public properties

	this.domElement = _canvas;
	this.context = null;

	// clearing

	this.autoClear = true;
	this.autoClearColor = true;
	this.autoClearDepth = true;
	this.autoClearStencil = true;

	// scene graph

	this.sortObjects = true;

T
tschw 已提交
84 85 86 87 88
	// user-defined clipping

	this.clippingPlanes = [];
	this.localClippingEnabled = false;

M
Mr.doob 已提交
89 90
	// physically based shading

91
	this.gammaFactor = 2.0;	// for backwards compatibility
M
Mr.doob 已提交
92 93 94
	this.gammaInput = false;
	this.gammaOutput = false;

95 96
	// physical lights

97
	this.physicallyCorrectLights = false;
98

B
Ben Houston 已提交
99 100
	// tone mapping

R
Rich Harris 已提交
101
	this.toneMapping = LinearToneMapping;
B
Ben Houston 已提交
102 103 104
	this.toneMappingExposure = 1.0;
	this.toneMappingWhitePoint = 1.0;

M
Mr.doob 已提交
105 106 107 108 109 110 111 112 113
	// morphs

	this.maxMorphTargets = 8;
	this.maxMorphNormals = 4;

	// internal properties

	var _this = this,

114 115
		_isContextLost = false,

116
		// internal state cache
M
Mr.doob 已提交
117

118 119 120 121
		_currentRenderTarget = null,
		_currentFramebuffer = null,
		_currentMaterialId = - 1,
		_currentGeometryProgram = '',
122

123
		_currentCamera = null,
124
		_currentArrayCamera = null,
M
Mr.doob 已提交
125

M
Mr.doob 已提交
126
		_currentViewport = new Vector4(),
127 128
		_currentScissor = new Vector4(),
		_currentScissorTest = null,
129

130
		//
131

132
		_usedTextureUnits = 0,
M
Mr.doob 已提交
133

134
		//
M
Mr.doob 已提交
135

136 137
		_width = _canvas.width,
		_height = _canvas.height,
M
Mr.doob 已提交
138

139
		_pixelRatio = 1,
M
Mr.doob 已提交
140

M
Mr.doob 已提交
141
		_viewport = new Vector4( 0, 0, _width, _height ),
142 143
		_scissor = new Vector4( 0, 0, _width, _height ),
		_scissorTest = false,
144

145
		// frustum
M
Mr.doob 已提交
146

147
		_frustum = new Frustum(),
M
Mr.doob 已提交
148

149
		// clipping
T
tschw 已提交
150

151 152 153
		_clipping = new WebGLClipping(),
		_clippingEnabled = false,
		_localClippingEnabled = false,
T
tschw 已提交
154

155
		// camera matrices cache
M
Mr.doob 已提交
156

157
		_projScreenMatrix = new Matrix4(),
M
Mr.doob 已提交
158

A
aardgoose 已提交
159
		_vector3 = new Vector3(),
160

161
		// info
M
Mr.doob 已提交
162

M
Mr.doob 已提交
163 164 165 166 167
		_infoMemory = {
			geometries: 0,
			textures: 0
		},

168
		_infoRender = {
169

170
			frame: 0,
171 172 173 174
			calls: 0,
			vertices: 0,
			faces: 0,
			points: 0
175

176
		};
M
Mr.doob 已提交
177

M
Mr.doob 已提交
178
	this.info = {
179

M
Mr.doob 已提交
180
		render: _infoRender,
M
Mr.doob 已提交
181
		memory: _infoMemory,
182
		programs: null
M
Mr.doob 已提交
183 184

	};
185

186 187 188 189 190
	function getTargetPixelRatio() {

		return _currentRenderTarget === null ? _pixelRatio : 1;

	}
191

M
Mr.doob 已提交
192 193 194 195
	// initialize

	var _gl;

M
Mr.doob 已提交
196 197
	try {

198
		var contextAttributes = {
M
Mr.doob 已提交
199 200 201 202 203 204 205 206
			alpha: _alpha,
			depth: _depth,
			stencil: _stencil,
			antialias: _antialias,
			premultipliedAlpha: _premultipliedAlpha,
			preserveDrawingBuffer: _preserveDrawingBuffer
		};

207
		_gl = _context || _canvas.getContext( 'webgl', contextAttributes ) || _canvas.getContext( 'experimental-webgl', contextAttributes );
M
Mr.doob 已提交
208 209 210

		if ( _gl === null ) {

G
gero3 已提交
211
			if ( _canvas.getContext( 'webgl' ) !== null ) {
212 213 214 215 216 217 218 219

				throw 'Error creating WebGL context with your selected attributes.';

			} else {

				throw 'Error creating WebGL context.';

			}
M
Mr.doob 已提交
220 221 222

		}

223 224 225 226 227 228 229 230 231 232 233 234
		// Some experimental-webgl implementations do not have getShaderPrecisionFormat

		if ( _gl.getShaderPrecisionFormat === undefined ) {

			_gl.getShaderPrecisionFormat = function () {

				return { 'rangeMin': 1, 'rangeMax': 1, 'precision': 1 };

			};

		}

D
dubejf 已提交
235
		_canvas.addEventListener( 'webglcontextlost', onContextLost, false );
236
		_canvas.addEventListener( 'webglcontextrestored', onContextRestore, false );
237

M
Mr.doob 已提交
238 239
	} catch ( error ) {

240
		console.error( 'THREE.WebGLRenderer: ' + error );
M
Mr.doob 已提交
241 242 243

	}

244
	var extensions, capabilities, state;
245 246
	var properties, textures, attributes, geometries, objects, lights;
	var programCache, renderLists;
247

248
	var background, bufferRenderer, indexedBufferRenderer;
249

250
	function initGLContext() {
251

252 253 254 255 256 257 258 259
		extensions = new WebGLExtensions( _gl );
		extensions.get( 'WEBGL_depth_texture' );
		extensions.get( 'OES_texture_float' );
		extensions.get( 'OES_texture_float_linear' );
		extensions.get( 'OES_texture_half_float' );
		extensions.get( 'OES_texture_half_float_linear' );
		extensions.get( 'OES_standard_derivatives' );
		extensions.get( 'ANGLE_instanced_arrays' );
260

261
		if ( extensions.get( 'OES_element_index_uint' ) ) {
M
Mr.doob 已提交
262

263
			BufferGeometry.MaxIndex = 4294967296;
264

265
		}
266

267
		capabilities = new WebGLCapabilities( _gl, extensions, parameters );
268

269 270 271
		state = new WebGLState( _gl, extensions, paramThreeToGL );
		state.scissor( _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ) );
		state.viewport( _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ) );
272

273 274 275 276 277
		properties = new WebGLProperties();
		textures = new WebGLTextures( _gl, extensions, state, properties, capabilities, paramThreeToGL, _infoMemory );
		attributes = new WebGLAttributes( _gl );
		geometries = new WebGLGeometries( _gl, attributes, _infoMemory );
		objects = new WebGLObjects( _gl, geometries, _infoRender );
278
		programCache = new WebGLPrograms( _this, extensions, capabilities );
279
		lights = new WebGLLights();
280
		renderLists = new WebGLRenderLists();
281

282
		background = new WebGLBackground( _this, state, objects, _premultipliedAlpha );
M
Mr.doob 已提交
283

284 285
		bufferRenderer = new WebGLBufferRenderer( _gl, extensions, _infoRender );
		indexedBufferRenderer = new WebGLIndexedBufferRenderer( _gl, extensions, _infoRender );
286

287
		_this.info.programs = programCache.programs;
288

289 290 291 292 293 294 295
		_this.context = _gl;
		_this.capabilities = capabilities;
		_this.extensions = extensions;
		_this.properties = properties;
		_this.renderLists = renderLists;
		_this.state = state;

296 297
	}

298
	initGLContext();
299

300
	// vr
301

302
	var vr = new WebVRManager( _this );
M
Mr.doob 已提交
303

304
	this.vr = vr;
M
Mr.doob 已提交
305

M
Mr.doob 已提交
306 307
	// shadow map

308
	var shadowMap = new WebGLShadowMap( this, shadowsArray, objects, capabilities );
M
Mr.doob 已提交
309

310
	this.shadowMap = shadowMap;
M
Mr.doob 已提交
311

312
	//
M
Mr.doob 已提交
313

314 315
	var spriteRenderer = new WebGLSpriteRenderer( this, spritesArray );
	var flareRenderer = new WebGLFlareRenderer( this, flaresArray );
M
Mr.doob 已提交
316

M
Mr.doob 已提交
317 318 319 320 321 322 323 324
	// API

	this.getContext = function () {

		return _gl;

	};

325 326 327 328 329 330
	this.getContextAttributes = function () {

		return _gl.getContextAttributes();

	};

331 332
	this.forceContextLoss = function () {

M
Michael Bond 已提交
333 334
		var extension = extensions.get( 'WEBGL_lose_context' );
		if ( extension ) extension.loseContext();
335 336 337

	};

338 339 340 341 342 343 344
	this.forceContextRestore = function () {

		var extension = extensions.get( 'WEBGL_lose_context' );
		if ( extension ) extension.restoreContext();

	};

345 346
	this.getPixelRatio = function () {

347
		return _pixelRatio;
348 349 350 351 352

	};

	this.setPixelRatio = function ( value ) {

353 354 355 356
		if ( value === undefined ) return;

		_pixelRatio = value;

M
Mr.doob 已提交
357
		this.setSize( _width, _height, false );
358 359 360

	};

361 362 363
	this.getSize = function () {

		return {
364 365
			width: _width,
			height: _height
366 367 368 369
		};

	};

370
	this.setSize = function ( width, height, updateStyle ) {
M
Mr.doob 已提交
371

372 373 374 375 376 377 378 379 380
		var device = vr.getDevice();

		if ( device && device.isPresenting ) {

			console.warn( 'THREE.WebGLRenderer: Can\'t change size while VR device is presenting.' );
			return;

		}

381 382 383
		_width = width;
		_height = height;

384 385
		_canvas.width = width * _pixelRatio;
		_canvas.height = height * _pixelRatio;
386

387
		if ( updateStyle !== false ) {
388

G
gero3 已提交
389 390
			_canvas.style.width = width + 'px';
			_canvas.style.height = height + 'px';
391

G
gero3 已提交
392
		}
M
Mr.doob 已提交
393

394
		this.setViewport( 0, 0, width, height );
M
Mr.doob 已提交
395 396 397

	};

M
Mr.doob 已提交
398 399 400 401 402 403 404 405 406
	this.getDrawingBufferSize = function () {

		return {
			width: _width * _pixelRatio,
			height: _height * _pixelRatio
		};

	};

407 408 409 410 411 412 413 414 415 416 417 418 419 420
	this.setDrawingBufferSize = function ( width, height, pixelRatio ) {

		_width = width;
		_height = height;

		_pixelRatio = pixelRatio;

		_canvas.width = width * pixelRatio;
		_canvas.height = height * pixelRatio;

		this.setViewport( 0, 0, width, height );

	};

M
Mr.doob 已提交
421 422
	this.setViewport = function ( x, y, width, height ) {

M
Mugen87 已提交
423
		_viewport.set( x, _height - y - height, width, height );
424
		state.viewport( _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ) );
425

M
Mr.doob 已提交
426 427
	};

428
	this.setScissor = function ( x, y, width, height ) {
M
Mr.doob 已提交
429

M
Mugen87 已提交
430
		_scissor.set( x, _height - y - height, width, height );
431
		state.scissor( _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ) );
432

M
Mr.doob 已提交
433 434
	};

435 436
	this.setScissorTest = function ( boolean ) {

437
		state.setScissorTest( _scissorTest = boolean );
M
Mr.doob 已提交
438 439 440 441 442

	};

	// Clearing

443 444 445 446
	this.getClearColor = background.getClearColor;
	this.setClearColor = background.setClearColor;
	this.getClearAlpha = background.getClearAlpha;
	this.setClearAlpha = background.setClearAlpha;
M
Mr.doob 已提交
447 448 449 450 451 452 453 454 455 456

	this.clear = function ( 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 );
457 458 459 460 461

	};

	this.clearColor = function () {

M
Mr.doob 已提交
462
		this.clear( true, false, false );
463 464 465 466 467

	};

	this.clearDepth = function () {

M
Mr.doob 已提交
468
		this.clear( false, true, false );
469 470 471 472 473

	};

	this.clearStencil = function () {

M
Mr.doob 已提交
474
		this.clear( false, false, true );
M
Mr.doob 已提交
475 476 477 478 479 480 481 482 483 484

	};

	this.clearTarget = function ( renderTarget, color, depth, stencil ) {

		this.setRenderTarget( renderTarget );
		this.clear( color, depth, stencil );

	};

M
Mr.doob 已提交
485
	//
M
Mr.doob 已提交
486

M
Mr.doob 已提交
487
	this.dispose = function () {
D
dubejf 已提交
488 489

		_canvas.removeEventListener( 'webglcontextlost', onContextLost, false );
490
		_canvas.removeEventListener( 'webglcontextrestored', onContextRestore, false );
D
dubejf 已提交
491

492 493
		renderLists.dispose();

D
dubejf 已提交
494 495
	};

M
Mr.doob 已提交
496
	// Events
M
Mr.doob 已提交
497

D
dubejf 已提交
498 499 500 501
	function onContextLost( event ) {

		event.preventDefault();

502 503
		console.log( 'THREE.WebGLRenderer: Context Lost.' );

504 505 506 507 508
		_isContextLost = true;

	}

	function onContextRestore( event ) {
D
dubejf 已提交
509

510
		console.log( 'THREE.WebGLRenderer: Context Restored.' );
511 512

		_isContextLost = false;
D
dubejf 已提交
513

514 515
		initGLContext();

M
Mr.doob 已提交
516
	}
D
dubejf 已提交
517

518
	function onMaterialDispose( event ) {
M
Mr.doob 已提交
519 520 521 522 523 524 525

		var material = event.target;

		material.removeEventListener( 'dispose', onMaterialDispose );

		deallocateMaterial( material );

526
	}
M
Mr.doob 已提交
527 528 529

	// Buffer deallocation

530
	function deallocateMaterial( material ) {
M
Mr.doob 已提交
531

532 533
		releaseMaterialProgramReference( material );

534
		properties.remove( material );
535

536
	}
537 538


539
	function releaseMaterialProgramReference( material ) {
540

541
		var programInfo = properties.get( material ).program;
M
Mr.doob 已提交
542 543 544

		material.program = undefined;

545
		if ( programInfo !== undefined ) {
M
Mr.doob 已提交
546

547
			programCache.releaseProgram( programInfo );
M
Mr.doob 已提交
548

M
Mr.doob 已提交
549 550
		}

551
	}
M
Mr.doob 已提交
552 553 554

	// Buffer rendering

M
Mr.doob 已提交
555 556 557 558 559 560 561 562 563 564
	function renderObjectImmediate( object, program, material ) {

		object.render( function ( object ) {

			_this.renderBufferImmediate( object, program, material );

		} );

	}

M
Mr.doob 已提交
565 566
	this.renderBufferImmediate = function ( object, program, material ) {

567
		state.initAttributes();
568

569
		var buffers = properties.get( object );
570

571 572 573 574
		if ( object.hasPositions && ! buffers.position ) buffers.position = _gl.createBuffer();
		if ( object.hasNormals && ! buffers.normal ) buffers.normal = _gl.createBuffer();
		if ( object.hasUvs && ! buffers.uv ) buffers.uv = _gl.createBuffer();
		if ( object.hasColors && ! buffers.color ) buffers.color = _gl.createBuffer();
M
Mr.doob 已提交
575

576
		var programAttributes = program.getAttributes();
577

M
Mr.doob 已提交
578 579
		if ( object.hasPositions ) {

580
			_gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.position );
M
Mr.doob 已提交
581
			_gl.bufferData( _gl.ARRAY_BUFFER, object.positionArray, _gl.DYNAMIC_DRAW );
582

583 584
			state.enableAttribute( programAttributes.position );
			_gl.vertexAttribPointer( programAttributes.position, 3, _gl.FLOAT, false, 0, 0 );
M
Mr.doob 已提交
585 586 587 588 589

		}

		if ( object.hasNormals ) {

590
			_gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.normal );
M
Mr.doob 已提交
591

592
			if ( ! material.isMeshPhongMaterial &&
593
				! material.isMeshStandardMaterial &&
594
				! material.isMeshNormalMaterial &&
595
				material.flatShading === true ) {
M
Mr.doob 已提交
596

597
				for ( var i = 0, l = object.count * 3; i < l; i += 9 ) {
M
Mr.doob 已提交
598

599
					var array = object.normalArray;
M
Mr.doob 已提交
600

601 602 603
					var nx = ( array[ i + 0 ] + array[ i + 3 ] + array[ i + 6 ] ) / 3;
					var ny = ( array[ i + 1 ] + array[ i + 4 ] + array[ i + 7 ] ) / 3;
					var nz = ( array[ i + 2 ] + array[ i + 5 ] + array[ i + 8 ] ) / 3;
M
Mr.doob 已提交
604

605 606 607
					array[ i + 0 ] = nx;
					array[ i + 1 ] = ny;
					array[ i + 2 ] = nz;
M
Mr.doob 已提交
608

609 610 611
					array[ i + 3 ] = nx;
					array[ i + 4 ] = ny;
					array[ i + 5 ] = nz;
M
Mr.doob 已提交
612

613 614 615
					array[ i + 6 ] = nx;
					array[ i + 7 ] = ny;
					array[ i + 8 ] = nz;
M
Mr.doob 已提交
616 617 618 619 620 621

				}

			}

			_gl.bufferData( _gl.ARRAY_BUFFER, object.normalArray, _gl.DYNAMIC_DRAW );
622

623
			state.enableAttribute( programAttributes.normal );
624

625
			_gl.vertexAttribPointer( programAttributes.normal, 3, _gl.FLOAT, false, 0, 0 );
M
Mr.doob 已提交
626 627 628 629 630

		}

		if ( object.hasUvs && material.map ) {

631
			_gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.uv );
M
Mr.doob 已提交
632
			_gl.bufferData( _gl.ARRAY_BUFFER, object.uvArray, _gl.DYNAMIC_DRAW );
633

634
			state.enableAttribute( programAttributes.uv );
635

636
			_gl.vertexAttribPointer( attributes.uv, 2, _gl.FLOAT, false, 0, 0 );
M
Mr.doob 已提交
637 638 639

		}

R
Rich Harris 已提交
640
		if ( object.hasColors && material.vertexColors !== NoColors ) {
M
Mr.doob 已提交
641

642
			_gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.color );
M
Mr.doob 已提交
643
			_gl.bufferData( _gl.ARRAY_BUFFER, object.colorArray, _gl.DYNAMIC_DRAW );
644

645
			state.enableAttribute( programAttributes.color );
646

647
			_gl.vertexAttribPointer( programAttributes.color, 3, _gl.FLOAT, false, 0, 0 );
M
Mr.doob 已提交
648 649 650

		}

651
		state.disableUnusedAttributes();
652

M
Mr.doob 已提交
653 654 655 656 657 658
		_gl.drawArrays( _gl.TRIANGLES, 0, object.count );

		object.count = 0;

	};

M
Mr.doob 已提交
659 660 661 662 663 664
	function absNumericalSort( a, b ) {

		return Math.abs( b[ 0 ] ) - Math.abs( a[ 0 ] );

	}

665
	this.renderBufferDirect = function ( camera, fog, geometry, material, object, group ) {
666

667
		state.setMaterial( material );
M
Mr.doob 已提交
668

M
Mr.doob 已提交
669
		var program = setProgram( camera, fog, material, object );
M
Mr.doob 已提交
670
		var geometryProgram = geometry.id + '_' + program.id + '_' + ( material.wireframe === true );
M
Mr.doob 已提交
671

M
Mr.doob 已提交
672
		var updateBuffers = false;
M
Mr.doob 已提交
673 674 675 676 677 678 679 680 681 682 683 684 685 686

		if ( geometryProgram !== _currentGeometryProgram ) {

			_currentGeometryProgram = geometryProgram;
			updateBuffers = true;

		}

		// morph targets

		var morphTargetInfluences = object.morphTargetInfluences;

		if ( morphTargetInfluences !== undefined ) {

M
Mr.doob 已提交
687 688
			// TODO Remove allocations

M
Mr.doob 已提交
689 690 691 692 693 694 695 696 697
			var activeInfluences = [];

			for ( var i = 0, l = morphTargetInfluences.length; i < l; i ++ ) {

				var influence = morphTargetInfluences[ i ];
				activeInfluences.push( [ influence, i ] );

			}

698
			activeInfluences.sort( absNumericalSort );
M
Mr.doob 已提交
699 700 701 702 703 704 705

			if ( activeInfluences.length > 8 ) {

				activeInfluences.length = 8;

			}

706 707
			var morphAttributes = geometry.morphAttributes;

M
Mr.doob 已提交
708 709 710 711 712 713 714
			for ( var i = 0, l = activeInfluences.length; i < l; i ++ ) {

				var influence = activeInfluences[ i ];
				morphInfluences[ i ] = influence[ 0 ];

				if ( influence[ 0 ] !== 0 ) {

715
					var index = influence[ 1 ];
M
Mr.doob 已提交
716

717 718
					if ( material.morphTargets === true && morphAttributes.position ) geometry.addAttribute( 'morphTarget' + i, morphAttributes.position[ index ] );
					if ( material.morphNormals === true && morphAttributes.normal ) geometry.addAttribute( 'morphNormal' + i, morphAttributes.normal[ index ] );
M
Mr.doob 已提交
719 720 721

				} else {

722 723
					if ( material.morphTargets === true ) geometry.removeAttribute( 'morphTarget' + i );
					if ( material.morphNormals === true ) geometry.removeAttribute( 'morphNormal' + i );
M
Mr.doob 已提交
724 725 726 727 728

				}

			}

729 730 731 732 733 734
			for ( var i = activeInfluences.length, il = morphInfluences.length; i < il; i ++ ) {

				morphInfluences[ i ] = 0.0;

			}

M
Mr.doob 已提交
735
			program.getUniforms().setValue( _gl, 'morphTargetInfluences', morphInfluences );
M
Mr.doob 已提交
736 737 738 739 740

			updateBuffers = true;

		}

741 742
		//

743
		var index = geometry.index;
744
		var position = geometry.attributes.position;
745
		var rangeFactor = 1;
746

747 748
		if ( material.wireframe === true ) {

749
			index = geometries.getWireframeAttribute( geometry );
750
			rangeFactor = 2;
751 752 753

		}

M
Mr.doob 已提交
754
		var attribute;
M
Mr.doob 已提交
755
		var renderer = bufferRenderer;
756

757
		if ( index !== null ) {
758

M
Mr.doob 已提交
759
			attribute = attributes.get( index );
760

761
			renderer = indexedBufferRenderer;
M
Mr.doob 已提交
762
			renderer.setIndex( attribute );
763

764
		}
M
Mr.doob 已提交
765

766
		if ( updateBuffers ) {
M
Mr.doob 已提交
767

768
			setupVertexAttributes( material, program, geometry );
M
Mr.doob 已提交
769

770
			if ( index !== null ) {
771

M
Mr.doob 已提交
772
				_gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, attribute.buffer );
773 774 775

			}

776
		}
777

778 779
		//

780
		var dataCount = 0;
781

M
Mr.doob 已提交
782
		if ( index !== null ) {
783

M
Mr.doob 已提交
784
			dataCount = index.count;
785

M
Mr.doob 已提交
786
		} else if ( position !== undefined ) {
787

M
Mr.doob 已提交
788
			dataCount = position.count;
789

M
Mr.doob 已提交
790
		}
791

M
Mr.doob 已提交
792 793
		var rangeStart = geometry.drawRange.start * rangeFactor;
		var rangeCount = geometry.drawRange.count * rangeFactor;
794

M
Mr.doob 已提交
795 796
		var groupStart = group !== null ? group.start * rangeFactor : 0;
		var groupCount = group !== null ? group.count * rangeFactor : Infinity;
797

M
Mr.doob 已提交
798 799
		var drawStart = Math.max( rangeStart, groupStart );
		var drawEnd = Math.min( dataCount, rangeStart + rangeCount, groupStart + groupCount ) - 1;
M
Mr.doob 已提交
800 801 802

		var drawCount = Math.max( 0, drawEnd - drawStart + 1 );

803 804
		if ( drawCount === 0 ) return;

M
Mr.doob 已提交
805
		//
806

807
		if ( object.isMesh ) {
808

809
			if ( material.wireframe === true ) {
810

811
				state.setLineWidth( material.wireframeLinewidth * getTargetPixelRatio() );
812
				renderer.setMode( _gl.LINES );
813

814
			} else {
M
Mr.doob 已提交
815 816

				switch ( object.drawMode ) {
817

R
Rich Harris 已提交
818
					case TrianglesDrawMode:
B
Ben Adams 已提交
819 820 821
						renderer.setMode( _gl.TRIANGLES );
						break;

R
Rich Harris 已提交
822
					case TriangleStripDrawMode:
B
Ben Adams 已提交
823 824 825
						renderer.setMode( _gl.TRIANGLE_STRIP );
						break;

R
Rich Harris 已提交
826
					case TriangleFanDrawMode:
B
Ben Adams 已提交
827 828 829 830
						renderer.setMode( _gl.TRIANGLE_FAN );
						break;

				}
831

832
			}
833

834

835
		} else if ( object.isLine ) {
836

837
			var lineWidth = material.linewidth;
838

839
			if ( lineWidth === undefined ) lineWidth = 1; // Not using Line*Material
840

841
			state.setLineWidth( lineWidth * getTargetPixelRatio() );
842

843
			if ( object.isLineSegments ) {
844

845
				renderer.setMode( _gl.LINES );
846

847 848 849 850
			} else if ( object.isLineLoop ) {

				renderer.setMode( _gl.LINE_LOOP );

851
			} else {
852

853
				renderer.setMode( _gl.LINE_STRIP );
854 855

			}
M
Mr.doob 已提交
856

857
		} else if ( object.isPoints ) {
858 859

			renderer.setMode( _gl.POINTS );
860 861

		}
862

T
Takahiro 已提交
863
		if ( geometry && geometry.isInstancedBufferGeometry ) {
M
Mr.doob 已提交
864 865 866

			if ( geometry.maxInstancedCount > 0 ) {

J
jfranc 已提交
867
				renderer.renderInstances( geometry, drawStart, drawCount );
M
Mr.doob 已提交
868

J
jfranc 已提交
869
			}
870 871 872

		} else {

M
Mr.doob 已提交
873
			renderer.render( drawStart, drawCount );
874

M
Mr.doob 已提交
875 876 877 878
		}

	};

879
	function setupVertexAttributes( material, program, geometry, startIndex ) {
M
Mr.doob 已提交
880

T
Takahiro 已提交
881
		if ( geometry && geometry.isInstancedBufferGeometry ) {
B
Ben Adams 已提交
882

883
			if ( extensions.get( 'ANGLE_instanced_arrays' ) === null ) {
B
Ben Adams 已提交
884

885
				console.error( 'THREE.WebGLRenderer.setupVertexAttributes: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' );
M
Mr.doob 已提交
886
				return;
B
Ben Adams 已提交
887

M
Mr.doob 已提交
888 889 890
			}

		}
B
Ben Adams 已提交
891

892 893
		if ( startIndex === undefined ) startIndex = 0;

894 895
		state.initAttributes();

896
		var geometryAttributes = geometry.attributes;
897

898
		var programAttributes = program.getAttributes();
899

900
		var materialDefaultAttributeValues = material.defaultAttributeValues;
901

902
		for ( var name in programAttributes ) {
903

904
			var programAttribute = programAttributes[ name ];
M
Mr.doob 已提交
905

M
Mr.doob 已提交
906
			if ( programAttribute >= 0 ) {
M
Mr.doob 已提交
907

908
				var geometryAttribute = geometryAttributes[ name ];
909

M
Mr.doob 已提交
910
				if ( geometryAttribute !== undefined ) {
M
Mr.doob 已提交
911

912
					var normalized = geometryAttribute.normalized;
913
					var size = geometryAttribute.itemSize;
914

M
Mr.doob 已提交
915
					var attribute = attributes.get( geometryAttribute );
916

917 918 919 920
					// TODO Attribute may not be available on context restore

					if ( attribute === undefined ) continue;

M
Mr.doob 已提交
921 922 923
					var buffer = attribute.buffer;
					var type = attribute.type;
					var bytesPerElement = attribute.bytesPerElement;
924

A
aardgoose 已提交
925
					if ( geometryAttribute.isInterleavedBufferAttribute ) {
926

M
Mr.doob 已提交
927 928 929 930
						var data = geometryAttribute.data;
						var stride = data.stride;
						var offset = geometryAttribute.offset;

T
Takahiro 已提交
931
						if ( data && data.isInstancedInterleavedBuffer ) {
M
Mr.doob 已提交
932

933
							state.enableAttributeAndDivisor( programAttribute, data.meshPerAttribute );
B
Ben Adams 已提交
934

M
Mr.doob 已提交
935
							if ( geometry.maxInstancedCount === undefined ) {
936

D
dubejf 已提交
937
								geometry.maxInstancedCount = data.meshPerAttribute * data.count;
B
Ben Adams 已提交
938

M
Mr.doob 已提交
939
							}
B
Ben Adams 已提交
940

M
Mr.doob 已提交
941
						} else {
B
Ben Adams 已提交
942

M
Mr.doob 已提交
943
							state.enableAttribute( programAttribute );
B
Ben Adams 已提交
944

M
Mr.doob 已提交
945
						}
B
Ben Adams 已提交
946

M
Mr.doob 已提交
947
						_gl.bindBuffer( _gl.ARRAY_BUFFER, buffer );
948
						_gl.vertexAttribPointer( programAttribute, size, type, normalized, stride * bytesPerElement, ( startIndex * stride + offset ) * bytesPerElement );
B
Ben Adams 已提交
949

M
Mr.doob 已提交
950
					} else {
B
Ben Adams 已提交
951

A
aardgoose 已提交
952
						if ( geometryAttribute.isInstancedBufferAttribute ) {
B
Ben Adams 已提交
953

954
							state.enableAttributeAndDivisor( programAttribute, geometryAttribute.meshPerAttribute );
B
Ben Adams 已提交
955

M
Mr.doob 已提交
956
							if ( geometry.maxInstancedCount === undefined ) {
B
Ben Adams 已提交
957

D
dubejf 已提交
958
								geometry.maxInstancedCount = geometryAttribute.meshPerAttribute * geometryAttribute.count;
B
Ben Adams 已提交
959

M
Mr.doob 已提交
960
							}
B
Ben Adams 已提交
961

M
Mr.doob 已提交
962 963 964 965
						} else {

							state.enableAttribute( programAttribute );

M
Mr.doob 已提交
966
						}
B
Ben Adams 已提交
967

M
Mr.doob 已提交
968
						_gl.bindBuffer( _gl.ARRAY_BUFFER, buffer );
969
						_gl.vertexAttribPointer( programAttribute, size, type, normalized, 0, startIndex * size * bytesPerElement );
M
Mr.doob 已提交
970

B
Ben Adams 已提交
971
					}
M
Mr.doob 已提交
972

973 974
				} else if ( materialDefaultAttributeValues !== undefined ) {

T
tschw 已提交
975
					var value = materialDefaultAttributeValues[ name ];
976

977
					if ( value !== undefined ) {
M
Mr.doob 已提交
978

979
						switch ( value.length ) {
M
Mr.doob 已提交
980

981 982 983
							case 2:
								_gl.vertexAttrib2fv( programAttribute, value );
								break;
M
Mr.doob 已提交
984

985 986 987
							case 3:
								_gl.vertexAttrib3fv( programAttribute, value );
								break;
M
Mr.doob 已提交
988

989 990 991
							case 4:
								_gl.vertexAttrib4fv( programAttribute, value );
								break;
992

993 994
							default:
								_gl.vertexAttrib1fv( programAttribute, value );
995 996

						}
M
Mr.doob 已提交
997 998 999 1000 1001 1002 1003 1004

					}

				}

			}

		}
1005

1006
		state.disableUnusedAttributes();
1007

M
Mr.doob 已提交
1008 1009
	}

M
Mr.doob 已提交
1010
	// Compile
M
Mr.doob 已提交
1011

M
Mr.doob 已提交
1012
	this.compile = function ( scene, camera ) {
1013

1014 1015
		lightsArray.length = 0;
		shadowsArray.length = 0;
1016

M
Mr.doob 已提交
1017
		scene.traverse( function ( object ) {
G
gero3 已提交
1018 1019

			if ( object.isLight ) {
M
Mr.doob 已提交
1020

1021 1022 1023 1024 1025 1026 1027
				lightsArray.push( object );

				if ( object.castShadow ) {

					shadowsArray.push( object );

				}
M
Mr.doob 已提交
1028

G
gero3 已提交
1029
			}
M
Mr.doob 已提交
1030 1031 1032

		} );

1033
		lights.setup( lightsArray, shadowsArray, camera );
M
Mr.doob 已提交
1034 1035 1036 1037 1038

		scene.traverse( function ( object ) {

			if ( object.material ) {

G
gero3 已提交
1039
				if ( Array.isArray( object.material ) ) {
M
Mr.doob 已提交
1040

G
gero3 已提交
1041
					for ( var i = 0; i < object.material.length; i ++ ) {
M
Mr.doob 已提交
1042 1043 1044

						initMaterial( object.material[ i ], scene.fog, object );

G
gero3 已提交
1045
					}
M
Mr.doob 已提交
1046

G
gero3 已提交
1047
				} else {
M
Mr.doob 已提交
1048 1049 1050

					initMaterial( object.material, scene.fog, object );

G
gero3 已提交
1051
				}
M
Mr.doob 已提交
1052

G
gero3 已提交
1053
			}
M
Mr.doob 已提交
1054 1055

		} );
G
gero3 已提交
1056 1057

	};
1058

M
Mr.doob 已提交
1059 1060
	// Rendering

1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074
	this.animate = function ( callback ) {

		function onFrame() {

			callback();

			( vr.getDevice() || window ).requestAnimationFrame( onFrame );

		}

		( vr.getDevice() || window ).requestAnimationFrame( onFrame );

	};

M
Mr.doob 已提交
1075
	this.render = function ( scene, camera, renderTarget, forceClear ) {
1076

0
06wj 已提交
1077
		if ( ! ( camera && camera.isCamera ) ) {
M
Mr.doob 已提交
1078

1079
			console.error( 'THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.' );
M
Mr.doob 已提交
1080 1081 1082 1083
			return;

		}

1084 1085
		if ( _isContextLost ) return;

M
Mr.doob 已提交
1086 1087
		// reset caching for this frame

1088
		_currentGeometryProgram = '';
1089
		_currentMaterialId = - 1;
1090
		_currentCamera = null;
M
Mr.doob 已提交
1091 1092 1093

		// update scene graph

1094
		if ( scene.autoUpdate === true ) scene.updateMatrixWorld();
M
Mr.doob 已提交
1095 1096 1097

		// update camera matrices and frustum

1098
		if ( camera.parent === null ) camera.updateMatrixWorld();
M
Mr.doob 已提交
1099

1100 1101 1102 1103 1104 1105
		if ( vr.enabled ) {

			camera = vr.getCamera( camera );

		}

M
Mr.doob 已提交
1106 1107 1108
		_projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );
		_frustum.setFromMatrix( _projScreenMatrix );

1109 1110 1111
		lightsArray.length = 0;
		shadowsArray.length = 0;

1112 1113
		spritesArray.length = 0;
		flaresArray.length = 0;
M
Mr.doob 已提交
1114

T
tschw 已提交
1115
		_localClippingEnabled = this.localClippingEnabled;
M
Mr.doob 已提交
1116
		_clippingEnabled = _clipping.init( this.clippingPlanes, _localClippingEnabled, camera );
T
tschw 已提交
1117

1118 1119 1120
		currentRenderList = renderLists.get( scene, camera );
		currentRenderList.init();

M
Mr.doob 已提交
1121
		projectObject( scene, camera, _this.sortObjects );
M
Mr.doob 已提交
1122

1123
		currentRenderList.finish();
1124

M
Mr.doob 已提交
1125
		if ( _this.sortObjects === true ) {
1126

1127
			currentRenderList.sort();
M
Mr.doob 已提交
1128

1129 1130
		}

M
Mr.doob 已提交
1131
		//
M
Mr.doob 已提交
1132

T
tschw 已提交
1133
		if ( _clippingEnabled ) _clipping.beginShadows();
T
tschw 已提交
1134

M
Mr.doob 已提交
1135
		shadowMap.render( scene, camera );
M
Mr.doob 已提交
1136

1137
		lights.setup( lightsArray, shadowsArray, camera );
1138

T
tschw 已提交
1139
		if ( _clippingEnabled ) _clipping.endShadows();
T
tschw 已提交
1140

M
Mr.doob 已提交
1141 1142
		//

M
Mr.doob 已提交
1143
		_infoRender.frame ++;
1144 1145 1146 1147
		_infoRender.calls = 0;
		_infoRender.vertices = 0;
		_infoRender.faces = 0;
		_infoRender.points = 0;
M
Mr.doob 已提交
1148

1149 1150 1151 1152 1153 1154
		if ( renderTarget === undefined ) {

			renderTarget = null;

		}

M
Mr.doob 已提交
1155 1156
		this.setRenderTarget( renderTarget );

M
Mr.doob 已提交
1157 1158
		//

1159
		background.render( scene, camera, forceClear );
M
Mr.doob 已提交
1160

1161
		// render scene
M
Mr.doob 已提交
1162

1163 1164
		var opaqueObjects = currentRenderList.opaque;
		var transparentObjects = currentRenderList.transparent;
M
Mr.doob 已提交
1165

1166
		if ( scene.overrideMaterial ) {
M
Mr.doob 已提交
1167

1168
			var overrideMaterial = scene.overrideMaterial;
1169

1170 1171
			if ( opaqueObjects.length ) renderObjects( opaqueObjects, scene, camera, overrideMaterial );
			if ( transparentObjects.length ) renderObjects( transparentObjects, scene, camera, overrideMaterial );
M
Mr.doob 已提交
1172

1173
		} else {
M
Mr.doob 已提交
1174

1175
			// opaque pass (front-to-back order)
M
Mr.doob 已提交
1176

1177
			if ( opaqueObjects.length ) renderObjects( opaqueObjects, scene, camera );
M
Mr.doob 已提交
1178

1179
			// transparent pass (back-to-front order)
1180

1181
			if ( transparentObjects.length ) renderObjects( transparentObjects, scene, camera );
M
Mr.doob 已提交
1182 1183 1184

		}

1185
		// custom renderers
M
Mr.doob 已提交
1186

1187 1188
		spriteRenderer.render( scene, camera );
		flareRenderer.render( scene, camera, _currentViewport );
M
Mr.doob 已提交
1189 1190 1191

		// Generate mipmap if we're using any kind of mipmap filtering

M
Mr.doob 已提交
1192 1193
		if ( renderTarget ) {

1194
			textures.updateRenderTargetMipmap( renderTarget );
M
Mr.doob 已提交
1195 1196 1197

		}

1198
		// Ensure depth buffer writing is enabled so it can be cleared on next render
M
Mr.doob 已提交
1199

1200 1201 1202
		state.buffers.depth.setTest( true );
		state.buffers.depth.setMask( true );
		state.buffers.color.setMask( true );
M
Mr.doob 已提交
1203

M
Mr.doob 已提交
1204 1205 1206 1207 1208
		if ( vr.enabled ) {

			vr.submitFrame();

		}
M
Mr.doob 已提交
1209

M
Mr.doob 已提交
1210 1211 1212
		// _gl.finish();

	};
M
Mr.doob 已提交
1213

1214
	/*
M
Mr.doob 已提交
1215 1216
	// TODO Duplicated code (Frustum)

1217 1218
	var _sphere = new Sphere();

T
tschw 已提交
1219 1220 1221 1222 1223 1224 1225
	function isObjectViewable( object ) {

		var geometry = object.geometry;

		if ( geometry.boundingSphere === null )
			geometry.computeBoundingSphere();

M
Mr.doob 已提交
1226
		_sphere.copy( geometry.boundingSphere ).
1227
		applyMatrix4( object.matrixWorld );
M
Mr.doob 已提交
1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243

		return isSphereViewable( _sphere );

	}

	function isSpriteViewable( sprite ) {

		_sphere.center.set( 0, 0, 0 );
		_sphere.radius = 0.7071067811865476;
		_sphere.applyMatrix4( sprite.matrixWorld );

		return isSphereViewable( _sphere );

	}

	function isSphereViewable( sphere ) {
T
tschw 已提交
1244 1245

		if ( ! _frustum.intersectsSphere( sphere ) ) return false;
T
tschw 已提交
1246 1247 1248 1249

		var numPlanes = _clipping.numPlanes;

		if ( numPlanes === 0 ) return true;
T
tschw 已提交
1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261

		var planes = _this.clippingPlanes,

			center = sphere.center,
			negRad = - sphere.radius,
			i = 0;

		do {

			// out when deeper than radius in the negative halfspace
			if ( planes[ i ].distanceToPoint( center ) < negRad ) return false;

T
tschw 已提交
1262
		} while ( ++ i !== numPlanes );
T
tschw 已提交
1263 1264 1265 1266

		return true;

	}
1267
	*/
T
tschw 已提交
1268

M
Mr.doob 已提交
1269
	function projectObject( object, camera, sortObjects ) {
M
Mr.doob 已提交
1270

M
Mr.doob 已提交
1271
		if ( ! object.visible ) return;
M
Mr.doob 已提交
1272

1273
		var visible = object.layers.test( camera.layers );
M
Mr.doob 已提交
1274

1275
		if ( visible ) {
1276

1277
			if ( object.isLight ) {
M
Mr.doob 已提交
1278

1279 1280 1281 1282 1283 1284 1285
				lightsArray.push( object );

				if ( object.castShadow ) {

					shadowsArray.push( object );

				}
M
Mr.doob 已提交
1286

1287
			} else if ( object.isSprite ) {
M
Mr.doob 已提交
1288

1289
				if ( ! object.frustumCulled || _frustum.intersectsSprite( object ) ) {
1290

1291
					spritesArray.push( object );
M
Mr.doob 已提交
1292

1293
				}
M
Mr.doob 已提交
1294

1295
			} else if ( object.isLensFlare ) {
M
Mr.doob 已提交
1296

1297
				flaresArray.push( object );
M
Mr.doob 已提交
1298

1299
			} else if ( object.isImmediateRenderObject ) {
M
Mr.doob 已提交
1300

1301
				if ( sortObjects ) {
M
Mr.doob 已提交
1302

1303 1304
					_vector3.setFromMatrixPosition( object.matrixWorld )
						.applyMatrix4( _projScreenMatrix );
M
Mr.doob 已提交
1305

1306
				}
M
Mr.doob 已提交
1307

1308
				currentRenderList.push( object, null, object.material, _vector3.z, null );
1309

1310
			} else if ( object.isMesh || object.isLine || object.isPoints ) {
1311

1312
				if ( object.isSkinnedMesh ) {
1313

1314
					object.skeleton.update();
1315

1316
				}
1317

1318
				if ( ! object.frustumCulled || _frustum.intersectsObject( object ) ) {
1319

1320 1321 1322 1323 1324 1325
					if ( sortObjects ) {

						_vector3.setFromMatrixPosition( object.matrixWorld )
							.applyMatrix4( _projScreenMatrix );

					}
1326

1327 1328
					var geometry = objects.update( object );
					var material = object.material;
1329

1330
					if ( Array.isArray( material ) ) {
1331

1332
						var groups = geometry.groups;
1333

1334
						for ( var i = 0, l = groups.length; i < l; i ++ ) {
M
Mr.doob 已提交
1335

1336 1337
							var group = groups[ i ];
							var groupMaterial = material[ group.materialIndex ];
1338

1339
							if ( groupMaterial && groupMaterial.visible ) {
1340

1341 1342 1343
								currentRenderList.push( object, geometry, groupMaterial, _vector3.z, group );

							}
M
Mr.doob 已提交
1344

M
Mr.doob 已提交
1345
						}
M
Mr.doob 已提交
1346

1347
					} else if ( material.visible ) {
1348

1349
						currentRenderList.push( object, geometry, material, _vector3.z, null );
O
OpenShift guest 已提交
1350

1351
					}
M
Mr.doob 已提交
1352

1353
				}
M
Mr.doob 已提交
1354

1355
			}
M
Mr.doob 已提交
1356

M
Mr.doob 已提交
1357
		}
M
Mr.doob 已提交
1358

M
Mr.doob 已提交
1359
		var children = object.children;
M
Mr.doob 已提交
1360

M
Mr.doob 已提交
1361 1362
		for ( var i = 0, l = children.length; i < l; i ++ ) {

M
Mr.doob 已提交
1363
			projectObject( children[ i ], camera, sortObjects );
M
Mr.doob 已提交
1364

1365
		}
1366

1367
	}
M
Mr.doob 已提交
1368

1369
	function renderObjects( renderList, scene, camera, overrideMaterial ) {
M
Mr.doob 已提交
1370

1371
		for ( var i = 0, l = renderList.length; i < l; i ++ ) {
M
Mr.doob 已提交
1372

1373
			var renderItem = renderList[ i ];
1374

1375 1376 1377 1378
			var object = renderItem.object;
			var geometry = renderItem.geometry;
			var material = overrideMaterial === undefined ? renderItem.material : overrideMaterial;
			var group = renderItem.group;
1379

1380
			if ( camera.isArrayCamera ) {
M
Mr.doob 已提交
1381

1382 1383
				_currentArrayCamera = camera;

1384
				var cameras = camera.cameras;
1385

1386
				for ( var j = 0, jl = cameras.length; j < jl; j ++ ) {
M
Mr.doob 已提交
1387

1388
					var camera2 = cameras[ j ];
M
Mr.doob 已提交
1389

1390
					if ( object.layers.test( camera2.layers ) ) {
1391

1392
						var bounds = camera2.bounds;
M
Mr.doob 已提交
1393

1394 1395 1396 1397 1398
						var x = bounds.x * _width;
						var y = bounds.y * _height;
						var width = bounds.z * _width;
						var height = bounds.w * _height;

1399 1400
						state.viewport( _currentViewport.set( x, y, width, height ).multiplyScalar( _pixelRatio ) );
						state.scissor( _currentScissor.set( x, y, width, height ).multiplyScalar( _pixelRatio ) );
1401
						state.setScissorTest( true );
1402 1403 1404 1405

						renderObject( object, scene, camera2, geometry, material, group );

					}
M
Mr.doob 已提交
1406

1407
				}
1408

1409
			} else {
M
Mr.doob 已提交
1410

1411 1412
				_currentArrayCamera = null;

1413
				renderObject( object, scene, camera, geometry, material, group );
M
Mr.doob 已提交
1414

1415
			}
M
Mr.doob 已提交
1416

1417
		}
M
Mr.doob 已提交
1418

1419
	}
G
gero3 已提交
1420

M
Mr.doob 已提交
1421 1422
	function renderObject( object, scene, camera, geometry, material, group ) {

1423 1424
		object.onBeforeRender( _this, scene, camera, geometry, material, group );

M
Mr.doob 已提交
1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443
		object.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld );
		object.normalMatrix.getNormalMatrix( object.modelViewMatrix );

		if ( object.isImmediateRenderObject ) {

			state.setMaterial( material );

			var program = setProgram( camera, scene.fog, material, object );

			_currentGeometryProgram = '';

			renderObjectImmediate( object, program, material );

		} else {

			_this.renderBufferDirect( camera, scene.fog, geometry, material, object, group );

		}

M
Mr.doob 已提交
1444 1445
		object.onAfterRender( _this, scene, camera, geometry, material, group );

M
Mr.doob 已提交
1446 1447
	}

1448
	function initMaterial( material, fog, object ) {
M
Mr.doob 已提交
1449

1450
		var materialProperties = properties.get( material );
G
gero3 已提交
1451

T
tschw 已提交
1452
		var parameters = programCache.getParameters(
1453
			material, lights.state, shadowsArray, fog, _clipping.numPlanes, _clipping.numIntersection, object );
T
tschw 已提交
1454

G
gero3 已提交
1455
		var code = programCache.getProgramCode( material, parameters );
G
gero3 已提交
1456

1457
		var program = materialProperties.program;
T
tschw 已提交
1458
		var programChange = true;
1459

1460
		if ( program === undefined ) {
B
Ben Adams 已提交
1461

M
Mr.doob 已提交
1462 1463
			// new material
			material.addEventListener( 'dispose', onMaterialDispose );
B
Ben Adams 已提交
1464

1465
		} else if ( program.code !== code ) {
B
Ben Adams 已提交
1466

M
Mr.doob 已提交
1467
			// changed glsl or parameters
1468
			releaseMaterialProgramReference( material );
B
Ben Adams 已提交
1469

G
gero3 已提交
1470
		} else if ( parameters.shaderID !== undefined ) {
B
Ben Adams 已提交
1471

T
tschw 已提交
1472
			// same glsl and uniform list
T
tschw 已提交
1473 1474
			return;

T
tschw 已提交
1475
		} else {
B
Ben Adams 已提交
1476

T
tschw 已提交
1477 1478
			// only rebuild uniform list
			programChange = false;
B
Ben Adams 已提交
1479 1480 1481

		}

1482
		if ( programChange ) {
B
Ben Adams 已提交
1483

1484
			if ( parameters.shaderID ) {
B
Ben Adams 已提交
1485

R
Rich Harris 已提交
1486
				var shader = ShaderLib[ parameters.shaderID ];
B
Ben Adams 已提交
1487

1488
				materialProperties.shader = {
1489
					name: material.type,
1490
					uniforms: UniformsUtils.clone( shader.uniforms ),
1491 1492 1493
					vertexShader: shader.vertexShader,
					fragmentShader: shader.fragmentShader
				};
B
Ben Adams 已提交
1494

1495
			} else {
B
Ben Adams 已提交
1496

1497
				materialProperties.shader = {
1498 1499 1500 1501 1502
					name: material.type,
					uniforms: material.uniforms,
					vertexShader: material.vertexShader,
					fragmentShader: material.fragmentShader
				};
G
gero3 已提交
1503

1504
			}
G
gero3 已提交
1505

1506
			material.onBeforeCompile( materialProperties.shader );
G
gero3 已提交
1507

1508
			program = programCache.acquireProgram( material, materialProperties.shader, parameters, code );
B
Ben Adams 已提交
1509

1510 1511
			materialProperties.program = program;
			material.program = program;
1512 1513 1514

		}

1515
		var programAttributes = program.getAttributes();
M
Mr.doob 已提交
1516 1517 1518 1519 1520

		if ( material.morphTargets ) {

			material.numSupportedMorphTargets = 0;

1521
			for ( var i = 0; i < _this.maxMorphTargets; i ++ ) {
M
Mr.doob 已提交
1522

1523
				if ( programAttributes[ 'morphTarget' + i ] >= 0 ) {
M
Mr.doob 已提交
1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536

					material.numSupportedMorphTargets ++;

				}

			}

		}

		if ( material.morphNormals ) {

			material.numSupportedMorphNormals = 0;

M
Mr.doob 已提交
1537
			for ( var i = 0; i < _this.maxMorphNormals; i ++ ) {
M
Mr.doob 已提交
1538

1539
				if ( programAttributes[ 'morphNormal' + i ] >= 0 ) {
M
Mr.doob 已提交
1540 1541 1542 1543 1544 1545 1546 1547 1548

					material.numSupportedMorphNormals ++;

				}

			}

		}

1549
		var uniforms = materialProperties.shader.uniforms;
T
tschw 已提交
1550

1551
		if ( ! material.isShaderMaterial &&
1552 1553
			! material.isRawShaderMaterial ||
			material.clipping === true ) {
T
tschw 已提交
1554

T
tschw 已提交
1555
			materialProperties.numClippingPlanes = _clipping.numPlanes;
1556
			materialProperties.numIntersection = _clipping.numIntersection;
T
tschw 已提交
1557
			uniforms.clippingPlanes = _clipping.uniform;
T
tschw 已提交
1558 1559 1560

		}

1561
		materialProperties.fog = fog;
1562

1563
		// store the light setup it was created for
1564

1565
		materialProperties.lightsHash = lights.state.hash;
1566

M
Mr.doob 已提交
1567
		if ( material.lights ) {
1568 1569 1570

			// wire up the material to this renderer's lighting state

1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583
			uniforms.ambientLightColor.value = lights.state.ambient;
			uniforms.directionalLights.value = lights.state.directional;
			uniforms.spotLights.value = lights.state.spot;
			uniforms.rectAreaLights.value = lights.state.rectArea;
			uniforms.pointLights.value = lights.state.point;
			uniforms.hemisphereLights.value = lights.state.hemi;

			uniforms.directionalShadowMap.value = lights.state.directionalShadowMap;
			uniforms.directionalShadowMatrix.value = lights.state.directionalShadowMatrix;
			uniforms.spotShadowMap.value = lights.state.spotShadowMap;
			uniforms.spotShadowMatrix.value = lights.state.spotShadowMatrix;
			uniforms.pointShadowMap.value = lights.state.pointShadowMap;
			uniforms.pointShadowMatrix.value = lights.state.pointShadowMatrix;
1584
			// TODO (abelnation): add area lights shadow info to uniforms
1585

1586 1587
		}

T
tschw 已提交
1588 1589
		var progUniforms = materialProperties.program.getUniforms(),
			uniformsList =
1590
				WebGLUniforms.seqWithValue( progUniforms.seq, uniforms );
A
arose 已提交
1591

T
tschw 已提交
1592
		materialProperties.uniformsList = uniformsList;
A
arose 已提交
1593

M
Mr.doob 已提交
1594
	}
M
Mr.doob 已提交
1595

1596
	function setProgram( camera, fog, material, object ) {
M
Mr.doob 已提交
1597 1598 1599

		_usedTextureUnits = 0;

1600
		var materialProperties = properties.get( material );
1601

T
tschw 已提交
1602 1603 1604 1605 1606
		if ( _clippingEnabled ) {

			if ( _localClippingEnabled || camera !== _currentCamera ) {

				var useCache =
1607 1608
					camera === _currentCamera &&
					material.id === _currentMaterialId;
T
tschw 已提交
1609 1610 1611 1612

				// we might want to call this function with some ClippingGroup
				// object instead of the material, once it becomes feasible
				// (#8465, #8379)
T
tschw 已提交
1613
				_clipping.setState(
1614 1615
					material.clippingPlanes, material.clipIntersection, material.clipShadows,
					camera, materialProperties, useCache );
T
tschw 已提交
1616 1617 1618 1619 1620

			}

		}

1621
		if ( material.needsUpdate === false ) {
1622

1623
			if ( materialProperties.program === undefined ) {
1624

1625
				material.needsUpdate = true;
1626

1627
			} else if ( material.fog && materialProperties.fog !== fog ) {
1628

M
Mr.doob 已提交
1629
				material.needsUpdate = true;
1630

1631
			} else if ( material.lights && materialProperties.lightsHash !== lights.state.hash ) {
1632

1633
				material.needsUpdate = true;
1634

1635
			} else if ( materialProperties.numClippingPlanes !== undefined &&
1636
				( materialProperties.numClippingPlanes !== _clipping.numPlanes ||
M
Mr.doob 已提交
1637
				materialProperties.numIntersection !== _clipping.numIntersection ) ) {
1638 1639 1640

				material.needsUpdate = true;

1641
			}
1642 1643 1644 1645

		}

		if ( material.needsUpdate ) {
M
Mr.doob 已提交
1646

1647
			initMaterial( material, fog, object );
M
Mr.doob 已提交
1648 1649 1650 1651
			material.needsUpdate = false;

		}

1652
		var refreshProgram = false;
M
Mr.doob 已提交
1653
		var refreshMaterial = false;
1654
		var refreshLights = false;
M
Mr.doob 已提交
1655

1656
		var program = materialProperties.program,
1657
			p_uniforms = program.getUniforms(),
1658
			m_uniforms = materialProperties.shader.uniforms;
M
Mr.doob 已提交
1659

1660
		if ( state.useProgram( program.program ) ) {
M
Mr.doob 已提交
1661

1662
			refreshProgram = true;
M
Mr.doob 已提交
1663
			refreshMaterial = true;
1664
			refreshLights = true;
M
Mr.doob 已提交
1665 1666 1667 1668 1669 1670

		}

		if ( material.id !== _currentMaterialId ) {

			_currentMaterialId = material.id;
1671

M
Mr.doob 已提交
1672 1673 1674 1675
			refreshMaterial = true;

		}

1676
		if ( refreshProgram || camera !== _currentCamera ) {
M
Mr.doob 已提交
1677

M
Mr.doob 已提交
1678
			p_uniforms.setValue( _gl, 'projectionMatrix', camera.projectionMatrix );
M
Mr.doob 已提交
1679

G
gero3 已提交
1680
			if ( capabilities.logarithmicDepthBuffer ) {
1681

T
tschw 已提交
1682
				p_uniforms.setValue( _gl, 'logDepthBufFC',
1683
					2.0 / ( Math.log( camera.far + 1.0 ) / Math.LN2 ) );
1684 1685 1686

			}

1687
			// Avoid unneeded uniform updates per ArrayCamera's sub-camera
1688

1689
			if ( _currentCamera !== ( _currentArrayCamera || camera ) ) {
1690

1691
				_currentCamera = ( _currentArrayCamera || camera );
1692 1693 1694 1695 1696 1697

				// lighting uniforms depend on the camera so enforce an update
				// now, in case this material supports lights - or later, when
				// the next material that does gets activated:

				refreshMaterial = true;		// set to true on material change
T
tschw 已提交
1698
				refreshLights = true;		// remains set until update done
1699 1700

			}
M
Mr.doob 已提交
1701

1702 1703 1704
			// load material specific uniforms
			// (shader material also gets them for the sake of genericity)

1705
			if ( material.isShaderMaterial ||
1706 1707 1708
				material.isMeshPhongMaterial ||
				material.isMeshStandardMaterial ||
				material.envMap ) {
1709

T
tschw 已提交
1710 1711 1712
				var uCamPos = p_uniforms.map.cameraPosition;

				if ( uCamPos !== undefined ) {
1713

T
tschw 已提交
1714
					uCamPos.setValue( _gl,
1715
						_vector3.setFromMatrixPosition( camera.matrixWorld ) );
1716 1717 1718 1719 1720

				}

			}

1721
			if ( material.isMeshPhongMaterial ||
1722 1723 1724 1725
				material.isMeshLambertMaterial ||
				material.isMeshBasicMaterial ||
				material.isMeshStandardMaterial ||
				material.isShaderMaterial ||
1726
				material.skinning ) {
1727

T
tschw 已提交
1728
				p_uniforms.setValue( _gl, 'viewMatrix', camera.matrixWorldInverse );
1729 1730 1731

			}

M
Mr.doob 已提交
1732 1733 1734 1735 1736 1737
		}

		// skinning uniforms must be set even if material didn't change
		// auto-setting of texture unit for bone texture must go before other textures
		// not sure why, but otherwise weird things happen

1738
		if ( material.skinning ) {
M
Mr.doob 已提交
1739

T
tschw 已提交
1740 1741
			p_uniforms.setOptional( _gl, object, 'bindMatrix' );
			p_uniforms.setOptional( _gl, object, 'bindMatrixInverse' );
1742

T
tschw 已提交
1743
			var skeleton = object.skeleton;
1744

T
tschw 已提交
1745
			if ( skeleton ) {
1746

1747 1748
				var bones = skeleton.bones;

1749
				if ( capabilities.floatVertexTextures ) {
M
Mr.doob 已提交
1750

1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775
					if ( skeleton.boneTexture === undefined ) {

						// layout (1 matrix = 4 pixels)
						//      RGBA RGBA RGBA RGBA (=> column1, column2, column3, column4)
						//  with  8x8  pixel texture max   16 bones * 4 pixels =  (8 * 8)
						//       16x16 pixel texture max   64 bones * 4 pixels = (16 * 16)
						//       32x32 pixel texture max  256 bones * 4 pixels = (32 * 32)
						//       64x64 pixel texture max 1024 bones * 4 pixels = (64 * 64)


						var size = Math.sqrt( bones.length * 4 ); // 4 pixels needed for 1 matrix
						size = _Math.nextPowerOfTwo( Math.ceil( size ) );
						size = Math.max( size, 4 );

						var boneMatrices = new Float32Array( size * size * 4 ); // 4 floats per RGBA pixel
						boneMatrices.set( skeleton.boneMatrices ); // copy current values

						var boneTexture = new DataTexture( boneMatrices, size, size, RGBAFormat, FloatType );

						skeleton.boneMatrices = boneMatrices;
						skeleton.boneTexture = boneTexture;
						skeleton.boneTextureSize = size;

					}

M
Mr.doob 已提交
1776 1777
					p_uniforms.setValue( _gl, 'boneTexture', skeleton.boneTexture );
					p_uniforms.setValue( _gl, 'boneTextureSize', skeleton.boneTextureSize );
M
Mr.doob 已提交
1778

T
tschw 已提交
1779
				} else {
M
Mr.doob 已提交
1780

T
tschw 已提交
1781
					p_uniforms.setOptional( _gl, skeleton, 'boneMatrices' );
M
Mr.doob 已提交
1782 1783 1784 1785 1786 1787 1788 1789 1790

				}

			}

		}

		if ( refreshMaterial ) {

1791 1792 1793
			p_uniforms.setValue( _gl, 'toneMappingExposure', _this.toneMappingExposure );
			p_uniforms.setValue( _gl, 'toneMappingWhitePoint', _this.toneMappingWhitePoint );

M
Mr.doob 已提交
1794
			if ( material.lights ) {
M
Mr.doob 已提交
1795

1796
				// the current material requires lighting info
M
Mr.doob 已提交
1797

T
tschw 已提交
1798 1799 1800 1801 1802 1803
				// note: all lighting uniforms are always set correctly
				// they simply reference the renderer's state for their
				// values
				//
				// use the current material's .needsUpdate flags to set
				// the GL state when required
M
Mr.doob 已提交
1804

T
tschw 已提交
1805
				markUniformsLightsNeedsUpdate( m_uniforms, refreshLights );
G
gero3 已提交
1806

T
tschw 已提交
1807
			}
G
gero3 已提交
1808

T
tschw 已提交
1809
			// refresh uniforms common to several materials
G
gero3 已提交
1810

T
tschw 已提交
1811
			if ( fog && material.fog ) {
G
gero3 已提交
1812

T
tschw 已提交
1813
				refreshUniformsFog( m_uniforms, fog );
M
Mr.doob 已提交
1814 1815 1816

			}

1817
			if ( material.isMeshBasicMaterial ||
1818 1819 1820
				material.isMeshLambertMaterial ||
				material.isMeshPhongMaterial ||
				material.isMeshStandardMaterial ||
1821
				material.isMeshNormalMaterial ||
1822
				material.isMeshDepthMaterial ) {
M
Mr.doob 已提交
1823 1824 1825 1826 1827 1828 1829

				refreshUniformsCommon( m_uniforms, material );

			}

			// refresh single material specific uniforms

1830
			if ( material.isLineBasicMaterial ) {
M
Mr.doob 已提交
1831 1832 1833

				refreshUniformsLine( m_uniforms, material );

1834
			} else if ( material.isLineDashedMaterial ) {
M
Mr.doob 已提交
1835 1836 1837 1838

				refreshUniformsLine( m_uniforms, material );
				refreshUniformsDash( m_uniforms, material );

1839
			} else if ( material.isPointsMaterial ) {
M
Mr.doob 已提交
1840

M
Mr.doob 已提交
1841
				refreshUniformsPoints( m_uniforms, material );
M
Mr.doob 已提交
1842

1843
			} else if ( material.isMeshLambertMaterial ) {
1844 1845 1846

				refreshUniformsLambert( m_uniforms, material );

T
Takahiro 已提交
1847 1848 1849 1850
			} else if ( material.isMeshToonMaterial ) {

				refreshUniformsToon( m_uniforms, material );

1851 1852 1853 1854
			} else if ( material.isMeshPhongMaterial ) {

				refreshUniformsPhong( m_uniforms, material );

1855
			} else if ( material.isMeshPhysicalMaterial ) {
W
WestLangley 已提交
1856 1857 1858

				refreshUniformsPhysical( m_uniforms, material );

1859
			} else if ( material.isMeshStandardMaterial ) {
W
WestLangley 已提交
1860

1861
				refreshUniformsStandard( m_uniforms, material );
W
WestLangley 已提交
1862

1863
			} else if ( material.isMeshDepthMaterial ) {
M
Mr.doob 已提交
1864

1865 1866 1867 1868 1869 1870 1871 1872
				if ( material.displacementMap ) {

					m_uniforms.displacementMap.value = material.displacementMap;
					m_uniforms.displacementScale.value = material.displacementScale;
					m_uniforms.displacementBias.value = material.displacementBias;

				}

1873
			} else if ( material.isMeshNormalMaterial ) {
M
Mr.doob 已提交
1874

1875
				refreshUniformsNormal( m_uniforms, material );
M
Mr.doob 已提交
1876 1877 1878

			}

M
Mr.doob 已提交
1879 1880 1881 1882 1883 1884
			// RectAreaLight Texture
			// TODO (mrdoob): Find a nicer implementation

			if ( m_uniforms.ltcMat !== undefined ) m_uniforms.ltcMat.value = UniformsLib.LTC_MAT_TEXTURE;
			if ( m_uniforms.ltcMag !== undefined ) m_uniforms.ltcMag.value = UniformsLib.LTC_MAG_TEXTURE;

R
Rich Harris 已提交
1885
			WebGLUniforms.upload(
1886
				_gl, materialProperties.uniformsList, m_uniforms, _this );
A
arose 已提交
1887 1888 1889

		}

M
Mr.doob 已提交
1890

T
tschw 已提交
1891
		// common matrices
M
Mr.doob 已提交
1892

M
Mr.doob 已提交
1893 1894
		p_uniforms.setValue( _gl, 'modelViewMatrix', object.modelViewMatrix );
		p_uniforms.setValue( _gl, 'normalMatrix', object.normalMatrix );
T
tschw 已提交
1895
		p_uniforms.setValue( _gl, 'modelMatrix', object.matrixWorld );
A
arose 已提交
1896

T
tschw 已提交
1897
		return program;
A
arose 已提交
1898 1899 1900

	}

M
Mr.doob 已提交
1901 1902
	// Uniforms (refresh uniforms objects)

M
Mr.doob 已提交
1903
	function refreshUniformsCommon( uniforms, material ) {
M
Mr.doob 已提交
1904 1905 1906

		uniforms.opacity.value = material.opacity;

1907
		uniforms.diffuse.value = material.color;
M
Mr.doob 已提交
1908

1909
		if ( material.emissive ) {
M
Mr.doob 已提交
1910

1911
			uniforms.emissive.value.copy( material.emissive ).multiplyScalar( material.emissiveIntensity );
M
Mr.doob 已提交
1912 1913 1914

		}

1915 1916 1917
		uniforms.map.value = material.map;
		uniforms.specularMap.value = material.specularMap;
		uniforms.alphaMap.value = material.alphaMap;
M
Mr.doob 已提交
1918

1919 1920 1921 1922 1923 1924 1925
		if ( material.lightMap ) {

			uniforms.lightMap.value = material.lightMap;
			uniforms.lightMapIntensity.value = material.lightMapIntensity;

		}

1926
		if ( material.aoMap ) {
1927

1928 1929
			uniforms.aoMap.value = material.aoMap;
			uniforms.aoMapIntensity.value = material.aoMapIntensity;
1930 1931 1932

		}

M
Mr.doob 已提交
1933
		// uv repeat and offset setting priorities
M
Mr.doob 已提交
1934 1935 1936 1937 1938
		// 1. color map
		// 2. specular map
		// 3. normal map
		// 4. bump map
		// 5. alpha map
1939
		// 6. emissive map
M
Mr.doob 已提交
1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950

		var uvScaleMap;

		if ( material.map ) {

			uvScaleMap = material.map;

		} else if ( material.specularMap ) {

			uvScaleMap = material.specularMap;

1951 1952 1953 1954
		} else if ( material.displacementMap ) {

			uvScaleMap = material.displacementMap;

M
Mr.doob 已提交
1955 1956 1957 1958 1959 1960 1961 1962
		} else if ( material.normalMap ) {

			uvScaleMap = material.normalMap;

		} else if ( material.bumpMap ) {

			uvScaleMap = material.bumpMap;

1963 1964 1965 1966 1967 1968 1969 1970
		} else if ( material.roughnessMap ) {

			uvScaleMap = material.roughnessMap;

		} else if ( material.metalnessMap ) {

			uvScaleMap = material.metalnessMap;

1971 1972 1973 1974
		} else if ( material.alphaMap ) {

			uvScaleMap = material.alphaMap;

1975 1976 1977 1978
		} else if ( material.emissiveMap ) {

			uvScaleMap = material.emissiveMap;

M
Mr.doob 已提交
1979 1980 1981 1982
		}

		if ( uvScaleMap !== undefined ) {

1983
			// backwards compatibility
1984
			if ( uvScaleMap.isWebGLRenderTarget ) {
M
Mr.doob 已提交
1985 1986 1987 1988 1989

				uvScaleMap = uvScaleMap.texture;

			}

M
Mr.doob 已提交
1990 1991 1992 1993 1994 1995 1996 1997
			var offset = uvScaleMap.offset;
			var repeat = uvScaleMap.repeat;

			uniforms.offsetRepeat.value.set( offset.x, offset.y, repeat.x, repeat.y );

		}

		uniforms.envMap.value = material.envMap;
1998 1999 2000 2001 2002

		// don't flip CubeTexture envMaps, flip everything else:
		//  WebGLRenderTargetCube will be flipped for backwards compatibility
		//  WebGLRenderTargetCube.texture will be flipped because it's a Texture and NOT a CubeTexture
		// this check must be handled differently, or removed entirely, if WebGLRenderTargetCube uses a CubeTexture in the future
T
Takahiro 已提交
2003
		uniforms.flipEnvMap.value = ( ! ( material.envMap && material.envMap.isCubeTexture ) ) ? 1 : - 1;
M
Mr.doob 已提交
2004

2005
		uniforms.reflectivity.value = material.reflectivity;
M
Mr.doob 已提交
2006 2007
		uniforms.refractionRatio.value = material.refractionRatio;

M
Mr.doob 已提交
2008
	}
M
Mr.doob 已提交
2009

M
Mr.doob 已提交
2010
	function refreshUniformsLine( uniforms, material ) {
M
Mr.doob 已提交
2011 2012 2013 2014

		uniforms.diffuse.value = material.color;
		uniforms.opacity.value = material.opacity;

M
Mr.doob 已提交
2015
	}
M
Mr.doob 已提交
2016

M
Mr.doob 已提交
2017
	function refreshUniformsDash( uniforms, material ) {
M
Mr.doob 已提交
2018 2019 2020 2021 2022

		uniforms.dashSize.value = material.dashSize;
		uniforms.totalSize.value = material.dashSize + material.gapSize;
		uniforms.scale.value = material.scale;

M
Mr.doob 已提交
2023
	}
M
Mr.doob 已提交
2024

M
Mr.doob 已提交
2025
	function refreshUniformsPoints( uniforms, material ) {
M
Mr.doob 已提交
2026

2027
		uniforms.diffuse.value = material.color;
M
Mr.doob 已提交
2028
		uniforms.opacity.value = material.opacity;
2029
		uniforms.size.value = material.size * _pixelRatio;
2030
		uniforms.scale.value = _height * 0.5;
M
Mr.doob 已提交
2031 2032 2033

		uniforms.map.value = material.map;

2034 2035 2036 2037 2038 2039 2040 2041 2042
		if ( material.map !== null ) {

			var offset = material.map.offset;
			var repeat = material.map.repeat;

			uniforms.offsetRepeat.value.set( offset.x, offset.y, repeat.x, repeat.y );

		}

M
Mr.doob 已提交
2043
	}
M
Mr.doob 已提交
2044

M
Mr.doob 已提交
2045
	function refreshUniformsFog( uniforms, fog ) {
M
Mr.doob 已提交
2046 2047 2048

		uniforms.fogColor.value = fog.color;

2049
		if ( fog.isFog ) {
M
Mr.doob 已提交
2050 2051 2052 2053

			uniforms.fogNear.value = fog.near;
			uniforms.fogFar.value = fog.far;

2054
		} else if ( fog.isFogExp2 ) {
M
Mr.doob 已提交
2055 2056 2057 2058 2059

			uniforms.fogDensity.value = fog.density;

		}

M
Mr.doob 已提交
2060
	}
M
Mr.doob 已提交
2061

M
Mr.doob 已提交
2062
	function refreshUniformsLambert( uniforms, material ) {
2063 2064 2065 2066 2067 2068 2069 2070 2071

		if ( material.emissiveMap ) {

			uniforms.emissiveMap.value = material.emissiveMap;

		}

	}

M
Mr.doob 已提交
2072
	function refreshUniformsPhong( uniforms, material ) {
M
Mr.doob 已提交
2073

2074
		uniforms.specular.value = material.specular;
M
Mr.doob 已提交
2075
		uniforms.shininess.value = Math.max( material.shininess, 1e-4 ); // to prevent pow( 0.0, 0.0 )
M
Mr.doob 已提交
2076

2077
		if ( material.emissiveMap ) {
2078

2079
			uniforms.emissiveMap.value = material.emissiveMap;
2080

2081
		}
M
Mr.doob 已提交
2082

2083 2084 2085 2086
		if ( material.bumpMap ) {

			uniforms.bumpMap.value = material.bumpMap;
			uniforms.bumpScale.value = material.bumpScale;
M
Mr.doob 已提交
2087

2088
		}
M
Mr.doob 已提交
2089

2090 2091 2092 2093 2094 2095
		if ( material.normalMap ) {

			uniforms.normalMap.value = material.normalMap;
			uniforms.normalScale.value.copy( material.normalScale );

		}
M
Mr.doob 已提交
2096

2097 2098 2099 2100 2101
		if ( material.displacementMap ) {

			uniforms.displacementMap.value = material.displacementMap;
			uniforms.displacementScale.value = material.displacementScale;
			uniforms.displacementBias.value = material.displacementBias;
2102

2103
		}
2104

T
Takahiro 已提交
2105 2106 2107 2108 2109 2110
	}

	function refreshUniformsToon( uniforms, material ) {

		refreshUniformsPhong( uniforms, material );

T
Takahiro 已提交
2111
		if ( material.gradientMap ) {
T
Takahiro 已提交
2112

T
Takahiro 已提交
2113
			uniforms.gradientMap.value = material.gradientMap;
T
Takahiro 已提交
2114 2115 2116

		}

2117 2118
	}

M
Mr.doob 已提交
2119
	function refreshUniformsStandard( uniforms, material ) {
W
WestLangley 已提交
2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172

		uniforms.roughness.value = material.roughness;
		uniforms.metalness.value = material.metalness;

		if ( material.roughnessMap ) {

			uniforms.roughnessMap.value = material.roughnessMap;

		}

		if ( material.metalnessMap ) {

			uniforms.metalnessMap.value = material.metalnessMap;

		}

		if ( material.emissiveMap ) {

			uniforms.emissiveMap.value = material.emissiveMap;

		}

		if ( material.bumpMap ) {

			uniforms.bumpMap.value = material.bumpMap;
			uniforms.bumpScale.value = material.bumpScale;

		}

		if ( material.normalMap ) {

			uniforms.normalMap.value = material.normalMap;
			uniforms.normalScale.value.copy( material.normalScale );

		}

		if ( material.displacementMap ) {

			uniforms.displacementMap.value = material.displacementMap;
			uniforms.displacementScale.value = material.displacementScale;
			uniforms.displacementBias.value = material.displacementBias;

		}

		if ( material.envMap ) {

			//uniforms.envMap.value = material.envMap; // part of uniforms common
			uniforms.envMapIntensity.value = material.envMapIntensity;

		}

	}

M
Mr.doob 已提交
2173
	function refreshUniformsPhysical( uniforms, material ) {
W
WestLangley 已提交
2174

2175 2176 2177
		uniforms.clearCoat.value = material.clearCoat;
		uniforms.clearCoatRoughness.value = material.clearCoatRoughness;

W
WestLangley 已提交
2178 2179 2180 2181
		refreshUniformsStandard( uniforms, material );

	}

2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207
	function refreshUniformsNormal( uniforms, material ) {

		if ( material.bumpMap ) {

			uniforms.bumpMap.value = material.bumpMap;
			uniforms.bumpScale.value = material.bumpScale;

		}

		if ( material.normalMap ) {

			uniforms.normalMap.value = material.normalMap;
			uniforms.normalScale.value.copy( material.normalScale );

		}

		if ( material.displacementMap ) {

			uniforms.displacementMap.value = material.displacementMap;
			uniforms.displacementScale.value = material.displacementScale;
			uniforms.displacementBias.value = material.displacementBias;

		}

	}

2208 2209
	// If uniforms are marked as clean, they don't need to be loaded to the GPU.

M
Mr.doob 已提交
2210
	function markUniformsLightsNeedsUpdate( uniforms, value ) {
2211

M
Mr.doob 已提交
2212
		uniforms.ambientLightColor.needsUpdate = value;
2213

B
Ben Houston 已提交
2214 2215 2216
		uniforms.directionalLights.needsUpdate = value;
		uniforms.pointLights.needsUpdate = value;
		uniforms.spotLights.needsUpdate = value;
2217
		uniforms.rectAreaLights.needsUpdate = value;
B
Ben Houston 已提交
2218
		uniforms.hemisphereLights.needsUpdate = value;
2219

M
Mr.doob 已提交
2220
	}
2221

M
Mr.doob 已提交
2222 2223 2224 2225
	// GL state setting

	this.setFaceCulling = function ( cullFace, frontFaceDirection ) {

T
tschw 已提交
2226
		state.setCullFace( cullFace );
R
Rich Harris 已提交
2227
		state.setFlipSided( frontFaceDirection === FrontFaceDirectionCW );
M
Mr.doob 已提交
2228 2229 2230 2231 2232

	};

	// Textures

T
tschw 已提交
2233 2234 2235 2236 2237 2238
	function allocTextureUnit() {

		var textureUnit = _usedTextureUnits;

		if ( textureUnit >= capabilities.maxTextures ) {

M
Mugen87 已提交
2239
			console.warn( 'THREE.WebGLRenderer: Trying to use ' + textureUnit + ' texture units while this GPU supports only ' + capabilities.maxTextures );
T
tschw 已提交
2240 2241 2242 2243 2244 2245 2246 2247 2248

		}

		_usedTextureUnits += 1;

		return textureUnit;

	}

2249
	this.allocTextureUnit = allocTextureUnit;
T
tschw 已提交
2250

2251
	// this.setTexture2D = setTexture2D;
M
Mr.doob 已提交
2252
	this.setTexture2D = ( function () {
T
tschw 已提交
2253

2254
		var warned = false;
T
tschw 已提交
2255

2256
		// backwards compatibility: peel texture.texture
W
WestLangley 已提交
2257
		return function setTexture2D( texture, slot ) {
T
tschw 已提交
2258

T
Takahiro 已提交
2259
			if ( texture && texture.isWebGLRenderTarget ) {
T
tschw 已提交
2260

2261
				if ( ! warned ) {
T
tschw 已提交
2262

2263 2264
					console.warn( "THREE.WebGLRenderer.setTexture2D: don't use render targets as textures. Use their .texture property instead." );
					warned = true;
T
tschw 已提交
2265

2266
				}
T
tschw 已提交
2267

2268
				texture = texture.texture;
T
tschw 已提交
2269

2270
			}
T
tschw 已提交
2271

2272
			textures.setTexture2D( texture, slot );
T
tschw 已提交
2273

2274
		};
T
tschw 已提交
2275

2276
	}() );
T
tschw 已提交
2277

M
Mr.doob 已提交
2278
	this.setTexture = ( function () {
2279 2280 2281

		var warned = false;

W
WestLangley 已提交
2282
		return function setTexture( texture, slot ) {
2283 2284 2285 2286 2287 2288 2289 2290

			if ( ! warned ) {

				console.warn( "THREE.WebGLRenderer: .setTexture is deprecated, use setTexture2D instead." );
				warned = true;

			}

2291
			textures.setTexture2D( texture, slot );
2292 2293 2294 2295 2296

		};

	}() );

M
Mr.doob 已提交
2297
	this.setTextureCube = ( function () {
2298 2299 2300

		var warned = false;

W
WestLangley 已提交
2301
		return function setTextureCube( texture, slot ) {
2302 2303

			// backwards compatibility: peel texture.texture
T
Takahiro 已提交
2304
			if ( texture && texture.isWebGLRenderTargetCube ) {
2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 2318

				if ( ! warned ) {

					console.warn( "THREE.WebGLRenderer.setTextureCube: don't use cube render targets as textures. Use their .texture property instead." );
					warned = true;

				}

				texture = texture.texture;

			}

			// currently relying on the fact that WebGLRenderTargetCube.texture is a Texture and NOT a CubeTexture
			// TODO: unify these code paths
T
Takahiro 已提交
2319
			if ( ( texture && texture.isCubeTexture ) ||
2320
				( Array.isArray( texture.image ) && texture.image.length === 6 ) ) {
2321 2322 2323 2324

				// CompressedTexture can have Array in image :/

				// this function alone should take care of cube textures
2325
				textures.setTextureCube( texture, slot );
2326 2327 2328 2329 2330

			} else {

				// assumed: texture property of THREE.WebGLRenderTargetCube

2331
				textures.setTextureCubeDynamic( texture, slot );
2332 2333 2334 2335 2336 2337

			}

		};

	}() );
T
tschw 已提交
2338

2339
	this.getRenderTarget = function () {
2340 2341 2342

		return _currentRenderTarget;

M
Michael Herzog 已提交
2343
	};
2344

2345
	this.setRenderTarget = function ( renderTarget ) {
M
Mr.doob 已提交
2346

2347 2348
		_currentRenderTarget = renderTarget;

2349
		if ( renderTarget && properties.get( renderTarget ).__webglFramebuffer === undefined ) {
M
Mr.doob 已提交
2350

2351
			textures.setupRenderTarget( renderTarget );
M
Mr.doob 已提交
2352 2353 2354

		}

M
Mr.doob 已提交
2355
		var framebuffer = null;
M
Mr.doob 已提交
2356
		var isCube = false;
M
Mr.doob 已提交
2357 2358 2359

		if ( renderTarget ) {

M
Mr.doob 已提交
2360
			var __webglFramebuffer = properties.get( renderTarget ).__webglFramebuffer;
F
Fordy 已提交
2361

M
Mr.doob 已提交
2362
			if ( renderTarget.isWebGLRenderTargetCube ) {
M
Mr.doob 已提交
2363

M
Mr.doob 已提交
2364
				framebuffer = __webglFramebuffer[ renderTarget.activeCubeFace ];
M
Mr.doob 已提交
2365
				isCube = true;
M
Mr.doob 已提交
2366 2367 2368

			} else {

M
Mr.doob 已提交
2369
				framebuffer = __webglFramebuffer;
M
Mr.doob 已提交
2370 2371 2372

			}

M
Mr.doob 已提交
2373
			_currentViewport.copy( renderTarget.viewport );
2374 2375
			_currentScissor.copy( renderTarget.scissor );
			_currentScissorTest = renderTarget.scissorTest;
2376

M
Mr.doob 已提交
2377 2378
		} else {

M
Mr.doob 已提交
2379
			_currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio );
2380
			_currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio );
2381
			_currentScissorTest = _scissorTest;
2382

M
Mr.doob 已提交
2383 2384
		}

M
Mr.doob 已提交
2385
		if ( _currentFramebuffer !== framebuffer ) {
M
Mr.doob 已提交
2386 2387 2388 2389 2390 2391

			_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );
			_currentFramebuffer = framebuffer;

		}

M
Mr.doob 已提交
2392
		state.viewport( _currentViewport );
2393 2394
		state.scissor( _currentScissor );
		state.setScissorTest( _currentScissorTest );
2395

M
Mr.doob 已提交
2396 2397 2398
		if ( isCube ) {

			var textureProperties = properties.get( renderTarget.texture );
2399
			_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + renderTarget.activeCubeFace, textureProperties.__webglTexture, renderTarget.activeMipMapLevel );
M
Mr.doob 已提交
2400 2401 2402

		}

M
Mr.doob 已提交
2403 2404
	};

M
Mr.doob 已提交
2405
	this.readRenderTargetPixels = function ( renderTarget, x, y, width, height, buffer ) {
2406

0
06wj 已提交
2407
		if ( ! ( renderTarget && renderTarget.isWebGLRenderTarget ) ) {
2408

2409
			console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.' );
G
gero3 已提交
2410
			return;
2411

G
gero3 已提交
2412
		}
2413

M
Mr.doob 已提交
2414
		var framebuffer = properties.get( renderTarget ).__webglFramebuffer;
2415

M
Mr.doob 已提交
2416
		if ( framebuffer ) {
2417

G
gero3 已提交
2418
			var restore = false;
2419

M
Mr.doob 已提交
2420
			if ( framebuffer !== _currentFramebuffer ) {
2421

M
Mr.doob 已提交
2422
				_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );
2423

G
gero3 已提交
2424
				restore = true;
2425

G
gero3 已提交
2426
			}
2427

M
Mr.doob 已提交
2428
			try {
2429

M
Mr.doob 已提交
2430
				var texture = renderTarget.texture;
M
Mr.doob 已提交
2431 2432
				var textureFormat = texture.format;
				var textureType = texture.type;
2433

M
Mr.doob 已提交
2434
				if ( textureFormat !== RGBAFormat && paramThreeToGL( textureFormat ) !== _gl.getParameter( _gl.IMPLEMENTATION_COLOR_READ_FORMAT ) ) {
2435

M
Mr.doob 已提交
2436 2437
					console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.' );
					return;
2438

M
Mr.doob 已提交
2439
				}
2440

M
Mr.doob 已提交
2441
				if ( textureType !== UnsignedByteType && paramThreeToGL( textureType ) !== _gl.getParameter( _gl.IMPLEMENTATION_COLOR_READ_TYPE ) && // IE11, Edge and Chrome Mac < 52 (#9513)
2442 2443
					! ( textureType === FloatType && ( extensions.get( 'OES_texture_float' ) || extensions.get( 'WEBGL_color_buffer_float' ) ) ) && // Chrome Mac >= 52 and Firefox
					! ( textureType === HalfFloatType && extensions.get( 'EXT_color_buffer_half_float' ) ) ) {
2444

M
Mr.doob 已提交
2445 2446
					console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.' );
					return;
2447

M
Mr.doob 已提交
2448
				}
2449

M
Mr.doob 已提交
2450
				if ( _gl.checkFramebufferStatus( _gl.FRAMEBUFFER ) === _gl.FRAMEBUFFER_COMPLETE ) {
2451

2452 2453
					// the following if statement ensures valid read requests (no out-of-bounds pixels, see #8604)

2454
					if ( ( x >= 0 && x <= ( renderTarget.width - width ) ) && ( y >= 0 && y <= ( renderTarget.height - height ) ) ) {
2455

M
Mr.doob 已提交
2456
						_gl.readPixels( x, y, width, height, paramThreeToGL( textureFormat ), paramThreeToGL( textureType ), buffer );
2457 2458

					}
2459

M
Mr.doob 已提交
2460
				} else {
M
Mr.doob 已提交
2461

M
Mr.doob 已提交
2462 2463 2464
					console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete.' );

				}
M
Mr.doob 已提交
2465

M
Mr.doob 已提交
2466
			} finally {
M
Mr.doob 已提交
2467

M
Mr.doob 已提交
2468 2469 2470
				if ( restore ) {

					_gl.bindFramebuffer( _gl.FRAMEBUFFER, _currentFramebuffer );
M
Mr.doob 已提交
2471

M
Mr.doob 已提交
2472 2473 2474
				}

			}
M
Mr.doob 已提交
2475 2476 2477

		}

M
Mr.doob 已提交
2478 2479
	};

M
Mr.doob 已提交
2480 2481
	// Map three.js constants to WebGL constants

M
Mr.doob 已提交
2482
	function paramThreeToGL( p ) {
M
Mr.doob 已提交
2483

2484 2485
		var extension;

R
Rich Harris 已提交
2486 2487 2488
		if ( p === RepeatWrapping ) return _gl.REPEAT;
		if ( p === ClampToEdgeWrapping ) return _gl.CLAMP_TO_EDGE;
		if ( p === MirroredRepeatWrapping ) return _gl.MIRRORED_REPEAT;
M
Mr.doob 已提交
2489

R
Rich Harris 已提交
2490 2491 2492
		if ( p === NearestFilter ) return _gl.NEAREST;
		if ( p === NearestMipMapNearestFilter ) return _gl.NEAREST_MIPMAP_NEAREST;
		if ( p === NearestMipMapLinearFilter ) return _gl.NEAREST_MIPMAP_LINEAR;
M
Mr.doob 已提交
2493

R
Rich Harris 已提交
2494 2495 2496
		if ( p === LinearFilter ) return _gl.LINEAR;
		if ( p === LinearMipMapNearestFilter ) return _gl.LINEAR_MIPMAP_NEAREST;
		if ( p === LinearMipMapLinearFilter ) return _gl.LINEAR_MIPMAP_LINEAR;
M
Mr.doob 已提交
2497

R
Rich Harris 已提交
2498 2499 2500 2501
		if ( p === UnsignedByteType ) return _gl.UNSIGNED_BYTE;
		if ( p === UnsignedShort4444Type ) return _gl.UNSIGNED_SHORT_4_4_4_4;
		if ( p === UnsignedShort5551Type ) return _gl.UNSIGNED_SHORT_5_5_5_1;
		if ( p === UnsignedShort565Type ) return _gl.UNSIGNED_SHORT_5_6_5;
M
Mr.doob 已提交
2502

R
Rich Harris 已提交
2503 2504 2505 2506 2507 2508
		if ( p === ByteType ) return _gl.BYTE;
		if ( p === ShortType ) return _gl.SHORT;
		if ( p === UnsignedShortType ) return _gl.UNSIGNED_SHORT;
		if ( p === IntType ) return _gl.INT;
		if ( p === UnsignedIntType ) return _gl.UNSIGNED_INT;
		if ( p === FloatType ) return _gl.FLOAT;
M
Mr.doob 已提交
2509

2510
		if ( p === HalfFloatType ) {
2511

2512
			extension = extensions.get( 'OES_texture_half_float' );
2513

2514
			if ( extension !== null ) return extension.HALF_FLOAT_OES;
2515 2516 2517

		}

R
Rich Harris 已提交
2518 2519 2520 2521 2522 2523
		if ( p === AlphaFormat ) return _gl.ALPHA;
		if ( p === RGBFormat ) return _gl.RGB;
		if ( p === RGBAFormat ) return _gl.RGBA;
		if ( p === LuminanceFormat ) return _gl.LUMINANCE;
		if ( p === LuminanceAlphaFormat ) return _gl.LUMINANCE_ALPHA;
		if ( p === DepthFormat ) return _gl.DEPTH_COMPONENT;
2524
		if ( p === DepthStencilFormat ) return _gl.DEPTH_STENCIL;
M
Mr.doob 已提交
2525

R
Rich Harris 已提交
2526 2527 2528
		if ( p === AddEquation ) return _gl.FUNC_ADD;
		if ( p === SubtractEquation ) return _gl.FUNC_SUBTRACT;
		if ( p === ReverseSubtractEquation ) return _gl.FUNC_REVERSE_SUBTRACT;
M
Mr.doob 已提交
2529

R
Rich Harris 已提交
2530 2531 2532 2533 2534 2535 2536 2537
		if ( p === ZeroFactor ) return _gl.ZERO;
		if ( p === OneFactor ) return _gl.ONE;
		if ( p === SrcColorFactor ) return _gl.SRC_COLOR;
		if ( p === OneMinusSrcColorFactor ) return _gl.ONE_MINUS_SRC_COLOR;
		if ( p === SrcAlphaFactor ) return _gl.SRC_ALPHA;
		if ( p === OneMinusSrcAlphaFactor ) return _gl.ONE_MINUS_SRC_ALPHA;
		if ( p === DstAlphaFactor ) return _gl.DST_ALPHA;
		if ( p === OneMinusDstAlphaFactor ) return _gl.ONE_MINUS_DST_ALPHA;
M
Mr.doob 已提交
2538

R
Rich Harris 已提交
2539 2540 2541
		if ( p === DstColorFactor ) return _gl.DST_COLOR;
		if ( p === OneMinusDstColorFactor ) return _gl.ONE_MINUS_DST_COLOR;
		if ( p === SrcAlphaSaturateFactor ) return _gl.SRC_ALPHA_SATURATE;
M
Mr.doob 已提交
2542

2543 2544
		if ( p === RGB_S3TC_DXT1_Format || p === RGBA_S3TC_DXT1_Format ||
			p === RGBA_S3TC_DXT3_Format || p === RGBA_S3TC_DXT5_Format ) {
M
Mr.doob 已提交
2545

2546
			extension = extensions.get( 'WEBGL_compressed_texture_s3tc' );
2547

2548 2549 2550 2551 2552 2553 2554 2555
			if ( extension !== null ) {

				if ( p === RGB_S3TC_DXT1_Format ) return extension.COMPRESSED_RGB_S3TC_DXT1_EXT;
				if ( p === RGBA_S3TC_DXT1_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT1_EXT;
				if ( p === RGBA_S3TC_DXT3_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT3_EXT;
				if ( p === RGBA_S3TC_DXT5_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT5_EXT;

			}
M
Mr.doob 已提交
2556 2557 2558

		}

2559
		if ( p === RGB_PVRTC_4BPPV1_Format || p === RGB_PVRTC_2BPPV1_Format ||
2560
			p === RGBA_PVRTC_4BPPV1_Format || p === RGBA_PVRTC_2BPPV1_Format ) {
2561

2562
			extension = extensions.get( 'WEBGL_compressed_texture_pvrtc' );
P
Pierre Lepers 已提交
2563

2564 2565 2566 2567 2568 2569 2570 2571
			if ( extension !== null ) {

				if ( p === RGB_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;
				if ( p === RGB_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;
				if ( p === RGBA_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;
				if ( p === RGBA_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG;

			}
P
Pierre Lepers 已提交
2572 2573 2574

		}

2575
		if ( p === RGB_ETC1_Format ) {
2576

2577
			extension = extensions.get( 'WEBGL_compressed_texture_etc1' );
2578

2579
			if ( extension !== null ) return extension.COMPRESSED_RGB_ETC1_WEBGL;
2580 2581 2582

		}

2583 2584 2585
		if ( p === MinEquation || p === MaxEquation ) {

			extension = extensions.get( 'EXT_blend_minmax' );
2586

2587
			if ( extension !== null ) {
2588

2589 2590 2591 2592
				if ( p === MinEquation ) return extension.MIN_EXT;
				if ( p === MaxEquation ) return extension.MAX_EXT;

			}
2593 2594 2595

		}

2596
		if ( p === UnsignedInt248Type ) {
2597

2598
			extension = extensions.get( 'WEBGL_depth_texture' );
2599

2600
			if ( extension !== null ) return extension.UNSIGNED_INT_24_8_WEBGL;
2601 2602 2603

		}

M
Mr.doob 已提交
2604 2605
		return 0;

M
Mr.doob 已提交
2606
	}
M
Mr.doob 已提交
2607

M
Mr.doob 已提交
2608
}
R
Rich Harris 已提交
2609

T
Tristan VALCKE 已提交
2610

2611
export { WebGLRenderer };