WebGLRenderer.js 86.6 KB
Newer Older
M
Mr.doob 已提交
1 2 3 4 5 6 7 8 9
/**
 * @author supereggbert / http://www.paulbrunt.co.uk/
 * @author mrdoob / http://mrdoob.com/
 * @author alteredq / http://alteredqualia.com/
 * @author szimek / https://github.com/szimek/
 */

THREE.WebGLRenderer = function ( parameters ) {

10
	console.log( 'THREE.WebGLRenderer', THREE.REVISION );
M
Mr.doob 已提交
11 12 13 14

	parameters = parameters || {};

	var _canvas = parameters.canvas !== undefined ? parameters.canvas : document.createElement( 'canvas' ),
15
	_context = parameters.context !== undefined ? parameters.context : null,
M
Mr.doob 已提交
16

M
Mr.doob 已提交
17 18
	_width = _canvas.width,
	_height = _canvas.height,
19

20 21
	pixelRatio = 1,

M
Mr.doob 已提交
22 23
	_precision = parameters.precision !== undefined ? parameters.precision : 'highp',

24
	_alpha = parameters.alpha !== undefined ? parameters.alpha : false,
25
	_depth = parameters.depth !== undefined ? parameters.depth : true,
M
Mr.doob 已提交
26
	_stencil = parameters.stencil !== undefined ? parameters.stencil : true,
27 28
	_antialias = parameters.antialias !== undefined ? parameters.antialias : false,
	_premultipliedAlpha = parameters.premultipliedAlpha !== undefined ? parameters.premultipliedAlpha : true,
M
Mr.doob 已提交
29
	_preserveDrawingBuffer = parameters.preserveDrawingBuffer !== undefined ? parameters.preserveDrawingBuffer : false,
30
	_logarithmicDepthBuffer = parameters.logarithmicDepthBuffer !== undefined ? parameters.logarithmicDepthBuffer : false,
M
Mr.doob 已提交
31

32 33
	_clearColor = new THREE.Color( 0x000000 ),
	_clearAlpha = 0;
M
Mr.doob 已提交
34

M
Mr.doob 已提交
35
	var lights = [];
M
Mr.doob 已提交
36

O
OpenShift guest 已提交
37
	var opaqueObjects = [];
38
	var transparentObjects = [];
39

40 41 42
	var opaqueImmediateObjects = [];
	var transparentImmediateObjects = [];

43 44
	var morphInfluences = new Float32Array( 8 );

M
Mr.doob 已提交
45 46 47
	var sprites = [];
	var lensFlares = [];

M
Mr.doob 已提交
48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
	// 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;

	// physically based shading

66
	this.gammaFactor = 2.0;	// for backwards compatibility
M
Mr.doob 已提交
67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
	this.gammaInput = false;
	this.gammaOutput = false;

	// morphs

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

	// flags

	this.autoScaleCubemaps = true;

	// internal properties

	var _this = this,

	_programs = [],

	// internal state cache

	_currentProgram = null,
	_currentFramebuffer = null,
89
	_currentMaterialId = - 1,
90
	_currentGeometryProgram = '',
M
Mr.doob 已提交
91 92 93 94 95 96
	_currentCamera = null,

	_usedTextureUnits = 0,

	_viewportX = 0,
	_viewportY = 0,
97 98
	_viewportWidth = _canvas.width,
	_viewportHeight = _canvas.height,
M
Mr.doob 已提交
99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
	_currentWidth = 0,
	_currentHeight = 0,

	// frustum

	_frustum = new THREE.Frustum(),

	 // camera matrices cache

	_projScreenMatrix = new THREE.Matrix4(),

	_vector3 = new THREE.Vector3(),

	// light arrays cache

	_direction = new THREE.Vector3(),

	_lightsNeedUpdate = true,

	_lights = {

		ambient: [ 0, 0, 0 ],
G
gero3 已提交
121
		directional: { length: 0, colors: [], positions: [] },
M
Mr.doob 已提交
122 123
		point: { length: 0, colors: [], positions: [], distances: [], decays: [] },
		spot: { length: 0, colors: [], positions: [], distances: [], directions: [], anglesCos: [], exponents: [], decays: [] },
G
gero3 已提交
124
		hemi: { length: 0, skyColors: [], groundColors: [], positions: [] }
M
Mr.doob 已提交
125

126 127
	},

M
Mr.doob 已提交
128 129
	// info

130
	_infoMemory = {
131 132 133 134 135 136 137

		programs: 0,
		geometries: 0,
		textures: 0

	},

138
	_infoRender = {
139 140 141 142 143 144

		calls: 0,
		vertices: 0,
		faces: 0,
		points: 0

M
Mr.doob 已提交
145 146
	};

M
Mr.doob 已提交
147
	this.info = {
148

M
Mr.doob 已提交
149 150 151 152 153
		render: _infoRender,
		memory: _infoMemory,
		programs: _programs

	};
154

M
Mr.doob 已提交
155 156 157 158
	// initialize

	var _gl;

M
Mr.doob 已提交
159 160 161 162 163 164 165 166 167 168 169 170 171 172 173
	try {

		var attributes = {
			alpha: _alpha,
			depth: _depth,
			stencil: _stencil,
			antialias: _antialias,
			premultipliedAlpha: _premultipliedAlpha,
			preserveDrawingBuffer: _preserveDrawingBuffer
		};

		_gl = _context || _canvas.getContext( 'webgl', attributes ) || _canvas.getContext( 'experimental-webgl', attributes );

		if ( _gl === null ) {

G
gero3 已提交
174
			if ( _canvas.getContext( 'webgl' ) !== null ) {
175 176 177 178 179 180 181 182

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

			} else {

				throw 'Error creating WebGL context.';

			}
M
Mr.doob 已提交
183 184 185

		}

D
dubejf 已提交
186
		_canvas.addEventListener( 'webglcontextlost', onContextLost, false );
187

M
Mr.doob 已提交
188 189
	} catch ( error ) {

190
		console.error( 'THREE.WebGLRenderer: ' + error );
M
Mr.doob 已提交
191 192 193

	}

194 195
	var extensions = new THREE.WebGLExtensions( _gl );

196 197
	extensions.get( 'OES_texture_float' );
	extensions.get( 'OES_texture_float_linear' );
198 199
	extensions.get( 'OES_texture_half_float' );
	extensions.get( 'OES_texture_half_float_linear' );
200
	extensions.get( 'OES_standard_derivatives' );
B
Ben Adams 已提交
201
	extensions.get( 'ANGLE_instanced_arrays' );
202

203 204
	if ( extensions.get( 'OES_element_index_uint' ) ) {

205
		THREE.BufferGeometry.MaxIndex = 4294967296;
206 207 208

	}

M
Mr.doob 已提交
209 210
	if ( _logarithmicDepthBuffer ) {

211
		extensions.get( 'EXT_frag_depth' );
M
Mr.doob 已提交
212 213 214

	}

215 216 217
	var state = new THREE.WebGLState( _gl, extensions, paramThreeToGL );
	var properties = new THREE.WebGLProperties();
	var objects = new THREE.WebGLObjects( _gl, properties, this.info );
218 219 220

	var bufferRenderer = new THREE.WebGLBufferRenderer( _gl, extensions, _infoRender );
	var indexedBufferRenderer = new THREE.WebGLIndexedBufferRenderer( _gl, extensions, _infoRender );
221

M
Mr.doob 已提交
222 223
	//

224
	function glClearColor( r, g, b, a ) {
225 226 227

		if ( _premultipliedAlpha === true ) {

228
			r *= a; g *= a; b *= a;
229 230 231

		}

232 233
		_gl.clearColor( r, g, b, a );

234
	}
235

236
	function setDefaultGLState() {
M
Mr.doob 已提交
237

M
Mr.doob 已提交
238
		state.init();
M
Mr.doob 已提交
239 240 241

		_gl.viewport( _viewportX, _viewportY, _viewportWidth, _viewportHeight );

242
		glClearColor( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha );
M
Mr.doob 已提交
243

244
	}
245

246
	function resetGLState() {
247 248 249 250

		_currentProgram = null;
		_currentCamera = null;

251
		_currentGeometryProgram = '';
252 253 254 255
		_currentMaterialId = - 1;

		_lightsNeedUpdate = true;

M
Mr.doob 已提交
256 257
		state.reset();

258
	}
M
Mr.doob 已提交
259 260 261 262

	setDefaultGLState();

	this.context = _gl;
263
	this.extensions = extensions;
M
Mr.doob 已提交
264
	this.state = state;
M
Mr.doob 已提交
265

M
Mr.doob 已提交
266 267
	// shadow map

M
Mr.doob 已提交
268
	var shadowMap = new THREE.WebGLShadowMap( this, lights, objects );
M
Mr.doob 已提交
269

270
	this.shadowMap = shadowMap;
M
Mr.doob 已提交
271

M
Mr.doob 已提交
272 273 274 275 276 277 278
	// GPU capabilities

	var _maxTextures = _gl.getParameter( _gl.MAX_TEXTURE_IMAGE_UNITS );
	var _maxVertexTextures = _gl.getParameter( _gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS );
	var _maxTextureSize = _gl.getParameter( _gl.MAX_TEXTURE_SIZE );
	var _maxCubemapSize = _gl.getParameter( _gl.MAX_CUBE_MAP_TEXTURE_SIZE );

279 280
	var _supportsVertexTextures = _maxVertexTextures > 0;
	var _supportsBoneTextures = _supportsVertexTextures && extensions.get( 'OES_texture_float' );
B
Ben Adams 已提交
281
	var _supportsInstancedArrays = extensions.get( 'ANGLE_instanced_arrays' );
M
Mr.doob 已提交
282

283
	//
284

M
Mr.doob 已提交
285 286


287
	//
M
Mr.doob 已提交
288

289
	var _maxPrecision = state.getMaxPrecision( _precision );
M
Mr.doob 已提交
290

291
	if ( _maxPrecision !== _precision ) {
M
Mr.doob 已提交
292

293 294
		console.warn( 'THREE.WebGLRenderer:', _precision, 'not supported, using', _maxPrecision, 'instead.' );
		_precision = _maxPrecision;
M
Mr.doob 已提交
295 296 297

	}

M
Mr.doob 已提交
298 299 300 301 302
	// Plugins

	var spritePlugin = new THREE.SpritePlugin( this, sprites );
	var lensFlarePlugin = new THREE.LensFlarePlugin( this, lensFlares );

M
Mr.doob 已提交
303 304 305 306 307 308 309 310
	// API

	this.getContext = function () {

		return _gl;

	};

311 312 313 314 315 316
	this.getContextAttributes = function () {

		return _gl.getContextAttributes();

	};

317 318 319 320 321 322
	this.forceContextLoss = function () {

		extensions.get( 'WEBGL_lose_context' ).loseContext();

	};

M
Mr.doob 已提交
323 324 325 326 327 328
	this.supportsVertexTextures = function () {

		return _supportsVertexTextures;

	};

B
Ben Adams 已提交
329 330
	this.supportsInstancedArrays = function () {

M
Mr.doob 已提交
331
		return _supportsInstancedArrays;
B
Ben Adams 已提交
332 333 334

	};

335
	this.getMaxAnisotropy = ( function () {
M
Mr.doob 已提交
336

337
		var value;
M
Mr.doob 已提交
338

339
		return function getMaxAnisotropy() {
340

M
Mr.doob 已提交
341
			if ( value !== undefined ) return value;
342

M
Mr.doob 已提交
343
			var extension = extensions.get( 'EXT_texture_filter_anisotropic' );
344

M
Mr.doob 已提交
345
			if ( extension !== null ) {
346

M
Mr.doob 已提交
347
				value = _gl.getParameter( extension.MAX_TEXTURE_MAX_ANISOTROPY_EXT );
348

M
Mr.doob 已提交
349 350 351 352 353
			} else {

				value = 0;

			}
354 355 356 357 358 359

			return value;

		}

	} )();
M
Mr.doob 已提交
360 361 362 363 364 365 366

	this.getPrecision = function () {

		return _precision;

	};

367 368 369 370 371 372 373 374
	this.getPixelRatio = function () {

		return pixelRatio;

	};

	this.setPixelRatio = function ( value ) {

375
		if ( value !== undefined ) pixelRatio = value;
376 377 378

	};

379 380 381 382 383 384 385 386 387
	this.getSize = function () {

		return {
			width: _width,
			height: _height
		};

	};

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

390 391 392
		_width = width;
		_height = height;

393 394
		_canvas.width = width * pixelRatio;
		_canvas.height = height * pixelRatio;
395

396
		if ( updateStyle !== false ) {
397

G
gero3 已提交
398 399
			_canvas.style.width = width + 'px';
			_canvas.style.height = height + 'px';
400

G
gero3 已提交
401
		}
M
Mr.doob 已提交
402

403
		this.setViewport( 0, 0, width, height );
M
Mr.doob 已提交
404 405 406 407 408

	};

	this.setViewport = function ( x, y, width, height ) {

409 410
		_viewportX = x * pixelRatio;
		_viewportY = y * pixelRatio;
M
Mr.doob 已提交
411

412 413
		_viewportWidth = width * pixelRatio;
		_viewportHeight = height * pixelRatio;
M
Mr.doob 已提交
414 415 416 417 418 419 420

		_gl.viewport( _viewportX, _viewportY, _viewportWidth, _viewportHeight );

	};

	this.setScissor = function ( x, y, width, height ) {

421
		_gl.scissor(
422 423 424 425
			x * pixelRatio,
			y * pixelRatio,
			width * pixelRatio,
			height * pixelRatio
426
		);
M
Mr.doob 已提交
427 428 429

	};

430
	this.enableScissorTest = function ( boolean ) {
M
Mr.doob 已提交
431

M
Mr.doob 已提交
432
		state.setScissorTest( boolean );
M
Mr.doob 已提交
433 434 435 436 437

	};

	// Clearing

M
Mr.doob 已提交
438
	this.getClearColor = function () {
M
Mr.doob 已提交
439

M
Mr.doob 已提交
440
		return _clearColor;
M
Mr.doob 已提交
441 442 443

	};

M
Mr.doob 已提交
444
	this.setClearColor = function ( color, alpha ) {
M
Mr.doob 已提交
445

M
Mr.doob 已提交
446
		_clearColor.set( color );
447

M
Mr.doob 已提交
448
		_clearAlpha = alpha !== undefined ? alpha : 1;
M
Mr.doob 已提交
449

450
		glClearColor( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha );
M
Mr.doob 已提交
451 452 453

	};

M
Mr.doob 已提交
454
	this.getClearAlpha = function () {
M
Mr.doob 已提交
455

M
Mr.doob 已提交
456
		return _clearAlpha;
M
Mr.doob 已提交
457 458 459

	};

M
Mr.doob 已提交
460
	this.setClearAlpha = function ( alpha ) {
M
Mr.doob 已提交
461

M
Mr.doob 已提交
462
		_clearAlpha = alpha;
M
Mr.doob 已提交
463

464
		glClearColor( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha );
M
Mr.doob 已提交
465 466 467 468 469 470 471 472 473 474 475 476

	};

	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 );
477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494

	};

	this.clearColor = function () {

		_gl.clear( _gl.COLOR_BUFFER_BIT );

	};

	this.clearDepth = function () {

		_gl.clear( _gl.DEPTH_BUFFER_BIT );

	};

	this.clearStencil = function () {

		_gl.clear( _gl.STENCIL_BUFFER_BIT );
M
Mr.doob 已提交
495 496 497 498 499 500 501 502 503 504

	};

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

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

	};

M
Mr.doob 已提交
505 506
	// Reset

507
	this.resetGLState = resetGLState;
M
Mr.doob 已提交
508

D
dubejf 已提交
509 510 511 512 513 514
	this.dispose = function() {

		_canvas.removeEventListener( 'webglcontextlost', onContextLost, false );

	};

M
Mr.doob 已提交
515
	// Events
M
Mr.doob 已提交
516

D
dubejf 已提交
517 518 519 520 521 522 523 524 525 526 527
	function onContextLost( event ) {

		event.preventDefault();

		resetGLState();
		setDefaultGLState();

		properties.clear();

	};

528
	function onTextureDispose( event ) {
M
Mr.doob 已提交
529 530 531 532 533 534 535

		var texture = event.target;

		texture.removeEventListener( 'dispose', onTextureDispose );

		deallocateTexture( texture );

536
		_infoMemory.textures --;
M
Mr.doob 已提交
537 538


539
	}
M
Mr.doob 已提交
540

541
	function onRenderTargetDispose( event ) {
M
Mr.doob 已提交
542 543 544 545 546 547 548

		var renderTarget = event.target;

		renderTarget.removeEventListener( 'dispose', onRenderTargetDispose );

		deallocateRenderTarget( renderTarget );

549
		_infoMemory.textures --;
M
Mr.doob 已提交
550

551
	}
M
Mr.doob 已提交
552

553
	function onMaterialDispose( event ) {
M
Mr.doob 已提交
554 555 556 557 558 559 560

		var material = event.target;

		material.removeEventListener( 'dispose', onMaterialDispose );

		deallocateMaterial( material );

561
	}
M
Mr.doob 已提交
562 563 564

	// Buffer deallocation

565
	function deallocateTexture( texture ) {
M
Mr.doob 已提交
566

567
		var textureProperties = properties.get( texture );
M
Mr.doob 已提交
568

569
		if ( texture.image && textureProperties.__image__webglTextureCube ) {
M
Mr.doob 已提交
570 571 572

			// cube texture

573
			_gl.deleteTexture( textureProperties.__image__webglTextureCube );
M
Mr.doob 已提交
574

575 576 577 578
		} else {

			// 2D texture

579
			if ( textureProperties.__webglInit === undefined ) return;
580

581
			_gl.deleteTexture( textureProperties.__webglTexture );
582

M
Mr.doob 已提交
583 584
		}

585
		// remove all webgl properties
586
		properties.delete( texture );
587

588
	}
M
Mr.doob 已提交
589

590
	function deallocateRenderTarget( renderTarget ) {
M
Mr.doob 已提交
591

592
		var renderTargetProperties = properties.get( renderTarget );
M
Mr.doob 已提交
593

594
		if ( ! renderTarget || renderTargetProperties.__webglTexture === undefined ) return;
M
Mr.doob 已提交
595

596
		_gl.deleteTexture( renderTargetProperties.__webglTexture );
M
Mr.doob 已提交
597

M
Mr.doob 已提交
598 599 600 601
		if ( renderTarget instanceof THREE.WebGLRenderTargetCube ) {

			for ( var i = 0; i < 6; i ++ ) {

602 603
				_gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ i ] );
				_gl.deleteRenderbuffer( renderTargetProperties.__webglRenderbuffer[ i ] );
M
Mr.doob 已提交
604 605 606 607 608

			}

		} else {

609 610
			_gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer );
			_gl.deleteRenderbuffer( renderTargetProperties.__webglRenderbuffer );
M
Mr.doob 已提交
611 612 613

		}

D
Daosheng Mu 已提交
614
		properties.delete( renderTarget );
M
Mr.doob 已提交
615

616
	}
M
Mr.doob 已提交
617

618
	function deallocateMaterial( material ) {
M
Mr.doob 已提交
619

620 621 622 623
		releaseMaterialProgramReference( material );

		properties.delete( material );

624
	}
625 626


627
	function releaseMaterialProgramReference( material ) {
628

629
		var program = properties.get( material ).program.program;
M
Mr.doob 已提交
630 631 632 633 634

		if ( program === undefined ) return;

		material.program = undefined;

635
		for ( var i = 0, n = _programs.length; i !== n; ++ i ) {
M
Mr.doob 已提交
636

637
			var programInfo = _programs[ i ];
M
Mr.doob 已提交
638 639 640

			if ( programInfo.program === program ) {

641
				var newReferenceCount = -- programInfo.usedTimes;
M
Mr.doob 已提交
642

643
				if ( newReferenceCount === 0 ) {
M
Mr.doob 已提交
644

645 646 647
					// the last meterial that has been using the program let
					// go of it, so remove it from the (unordered) _programs
					// set and deallocate the GL resource
M
Mr.doob 已提交
648

649
					var newLength = n - 1;
M
Mr.doob 已提交
650

651 652
					_programs[ i ] = _programs[ newLength ];
					_programs.pop();
M
Mr.doob 已提交
653

654
					_gl.deleteProgram( program );
M
Mr.doob 已提交
655

656
					_infoMemory.programs = newLength;
M
Mr.doob 已提交
657

658
				}
M
Mr.doob 已提交
659

660
				break;
M
Mr.doob 已提交
661

662
			}
M
Mr.doob 已提交
663 664 665

		}

666
	}
M
Mr.doob 已提交
667 668 669 670 671

	// Buffer rendering

	this.renderBufferImmediate = function ( object, program, material ) {

672
		state.initAttributes();
673

674
		var buffers = properties.get( object );
675

676 677 678 679
		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 已提交
680

681
		var attributes = program.getAttributes();
682

M
Mr.doob 已提交
683 684
		if ( object.hasPositions ) {

685
			_gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.position );
M
Mr.doob 已提交
686
			_gl.bufferData( _gl.ARRAY_BUFFER, object.positionArray, _gl.DYNAMIC_DRAW );
687

688 689
			state.enableAttribute( attributes.position );
			_gl.vertexAttribPointer( attributes.position, 3, _gl.FLOAT, false, 0, 0 );
M
Mr.doob 已提交
690 691 692 693 694

		}

		if ( object.hasNormals ) {

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

697
			if ( material.type !== 'MeshPhongMaterial' && material.shading === THREE.FlatShading ) {
M
Mr.doob 已提交
698

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

701
					var array = object.normalArray;
M
Mr.doob 已提交
702

703 704 705
					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 已提交
706

707 708 709
					array[ i + 0 ] = nx;
					array[ i + 1 ] = ny;
					array[ i + 2 ] = nz;
M
Mr.doob 已提交
710

711 712 713
					array[ i + 3 ] = nx;
					array[ i + 4 ] = ny;
					array[ i + 5 ] = nz;
M
Mr.doob 已提交
714

715 716 717
					array[ i + 6 ] = nx;
					array[ i + 7 ] = ny;
					array[ i + 8 ] = nz;
M
Mr.doob 已提交
718 719 720 721 722 723

				}

			}

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

725
			state.enableAttribute( attributes.normal );
726

727
			_gl.vertexAttribPointer( attributes.normal, 3, _gl.FLOAT, false, 0, 0 );
M
Mr.doob 已提交
728 729 730 731 732

		}

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

733
			_gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.uv );
M
Mr.doob 已提交
734
			_gl.bufferData( _gl.ARRAY_BUFFER, object.uvArray, _gl.DYNAMIC_DRAW );
735

736
			state.enableAttribute( attributes.uv );
737

738
			_gl.vertexAttribPointer( attributes.uv, 2, _gl.FLOAT, false, 0, 0 );
M
Mr.doob 已提交
739 740 741 742 743

		}

		if ( object.hasColors && material.vertexColors !== THREE.NoColors ) {

744
			_gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.color );
M
Mr.doob 已提交
745
			_gl.bufferData( _gl.ARRAY_BUFFER, object.colorArray, _gl.DYNAMIC_DRAW );
746

747
			state.enableAttribute( attributes.color );
748

749
			_gl.vertexAttribPointer( attributes.color, 3, _gl.FLOAT, false, 0, 0 );
M
Mr.doob 已提交
750 751 752

		}

753
		state.disableUnusedAttributes();
754

M
Mr.doob 已提交
755 756 757 758 759 760
		_gl.drawArrays( _gl.TRIANGLES, 0, object.count );

		object.count = 0;

	};

761 762 763
	this.renderBufferDirect = function ( camera, lights, fog, geometry, material, object, group ) {

		if ( material.visible === false ) return;
M
Mr.doob 已提交
764 765 766 767 768

		setMaterial( material );

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

M
Mr.doob 已提交
769 770
		var updateBuffers = false;
		var geometryProgram = geometry.id + '_' + program.id + '_' + material.wireframe;
M
Mr.doob 已提交
771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801

		if ( geometryProgram !== _currentGeometryProgram ) {

			_currentGeometryProgram = geometryProgram;
			updateBuffers = true;

		}

		// morph targets

		var morphTargetInfluences = object.morphTargetInfluences;

		if ( morphTargetInfluences !== undefined ) {

			var activeInfluences = [];

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

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

			}

			activeInfluences.sort( numericalSort );

			if ( activeInfluences.length > 8 ) {

				activeInfluences.length = 8;

			}

802 803
			var morphAttributes = geometry.morphAttributes;

M
Mr.doob 已提交
804 805 806 807 808 809 810
			for ( var i = 0, l = activeInfluences.length; i < l; i ++ ) {

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

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

811
					var index = influence[ 1 ];
M
Mr.doob 已提交
812

813 814
					if ( material.morphTargets === true ) geometry.addAttribute( 'morphTarget' + i, morphAttributes.position[ index ] );
					if ( material.morphNormals === true ) geometry.addAttribute( 'morphNormal' + i, morphAttributes.normal[ index ] );
M
Mr.doob 已提交
815 816 817

				} else {

818 819
					if ( material.morphTargets === true ) geometry.removeAttribute( 'morphTarget' + i );
					if ( material.morphNormals === true ) geometry.removeAttribute( 'morphNormal' + i );
M
Mr.doob 已提交
820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836

				}

			}

			var uniforms = program.getUniforms();

			if ( uniforms.morphTargetInfluences !== null ) {

				_gl.uniform1fv( uniforms.morphTargetInfluences, morphInfluences );

			}

			updateBuffers = true;

		}

M
Mr.doob 已提交
837 838
		//

839
		var index = geometry.attributes.index;
840 841
		var position = geometry.attributes.position;

842 843
		if ( material.wireframe === true ) {

844
			index = objects.getWireframeAttribute( geometry );
845 846 847

		}

848 849
		var renderer;

850 851
		if ( index !== undefined ) {

852 853
			renderer = indexedBufferRenderer;
			renderer.setIndex( index );
854

855
		} else {
856

857
			renderer = bufferRenderer;
858

859
		}
M
Mr.doob 已提交
860

861
		if ( updateBuffers ) {
M
Mr.doob 已提交
862

863
			setupVertexAttributes( material, program, geometry );
M
Mr.doob 已提交
864

865
			if ( index !== undefined ) {
866

867
				_gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, objects.getAttributeBuffer( index ) );
868 869 870

			}

871
		}
872

873
		if ( group === undefined ) {
874

875
			var count;
876

877
			if ( index !== undefined ) {
878

879
				count = index.array.length;
880

881
			} else if ( position instanceof THREE.InterleavedBufferAttribute ) {
882

883
				count = position.data.array.length / 3;
884

885
			} else {
886

887
				count = position.array.length / 3;
888

889
			}
890

891
			group = {
892
				start: 0,
M
Mr.doob 已提交
893
				count: count
894
			};
895 896

		}
897

898
		if ( object instanceof THREE.Mesh ) {
899

900
			if ( material.wireframe === true ) {
901

902 903
				state.setLineWidth( material.wireframeLinewidth * pixelRatio );
				renderer.setMode( _gl.LINES );
904

905
			} else {
906

907
				renderer.setMode( _gl.TRIANGLES );
908

909
			}
910

911
			if ( geometry instanceof THREE.InstancedBufferGeometry && geometry.maxInstancedCount > 0 ) {
912

913
				renderer.renderInstances( geometry );
914

915
			} else if ( position instanceof THREE.InterleavedBufferAttribute ) {
916

917
				renderer.render( 0, position.data.count );
918

919
			} else {
920

921
				renderer.render( group.start, group.count );
922

923
			}
924

925
		} else if ( object instanceof THREE.Line ) {
926

927
			var lineWidth = material.linewidth;
928

929
			if ( lineWidth === undefined ) lineWidth = 1; // Not using Line*Material
930

931
			state.setLineWidth( lineWidth * pixelRatio );
932

933
			if ( object instanceof THREE.LineSegments ) {
934

935
				renderer.setMode( _gl.LINES );
936

937
			} else {
938

939
				renderer.setMode( _gl.LINE_STRIP );
940 941

			}
M
Mr.doob 已提交
942

943
			renderer.render( group.start, group.count );
944 945 946 947

		} else if ( object instanceof THREE.PointCloud ) {

			renderer.setMode( _gl.POINTS );
948
			renderer.render( group.start, group.count );
949

M
Mr.doob 已提交
950 951 952 953
		}

	};

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

M
Mr.doob 已提交
956
		var extension;
B
Ben Adams 已提交
957

M
Mr.doob 已提交
958
		if ( geometry instanceof THREE.InstancedBufferGeometry ) {
B
Ben Adams 已提交
959

M
Mr.doob 已提交
960
			extension = extensions.get( 'ANGLE_instanced_arrays' );
B
Ben Adams 已提交
961

M
Mr.doob 已提交
962
			if ( extension === null ) {
B
Ben Adams 已提交
963

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

M
Mr.doob 已提交
967 968 969
			}

		}
B
Ben Adams 已提交
970

971 972
		if ( startIndex === undefined ) startIndex = 0;

973 974
		state.initAttributes();

975
		var geometryAttributes = geometry.attributes;
976

977
		var programAttributes = program.getAttributes();
978

979
		var materialDefaultAttributeValues = material.defaultAttributeValues;
980

981
		for ( var name in programAttributes ) {
982

983
			var programAttribute = programAttributes[ name ];
M
Mr.doob 已提交
984

M
Mr.doob 已提交
985
			if ( programAttribute >= 0 ) {
M
Mr.doob 已提交
986

987
				var geometryAttribute = geometryAttributes[ name ];
988

M
Mr.doob 已提交
989
				if ( geometryAttribute !== undefined ) {
M
Mr.doob 已提交
990

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

993
					var size = geometryAttribute.itemSize;
G
gero3 已提交
994
					var buffer = objects.getAttributeBuffer( geometryAttribute );
995

B
Ben Adams 已提交
996
					if ( geometryAttribute instanceof THREE.InterleavedBufferAttribute ) {
997

M
Mr.doob 已提交
998 999 1000 1001
						var data = geometryAttribute.data;
						var stride = data.stride;
						var offset = geometryAttribute.offset;

1002
						_gl.bindBuffer( _gl.ARRAY_BUFFER, buffer );
M
Mr.doob 已提交
1003
						_gl.vertexAttribPointer( programAttribute, size, _gl.FLOAT, false, stride * data.array.BYTES_PER_ELEMENT, ( startIndex * stride + offset ) * data.array.BYTES_PER_ELEMENT );
1004

M
Mr.doob 已提交
1005
						if ( data instanceof THREE.InstancedInterleavedBuffer ) {
M
Mr.doob 已提交
1006

M
Mr.doob 已提交
1007
							if ( extension === null ) {
B
Ben Adams 已提交
1008

1009
								console.error( 'THREE.WebGLRenderer.setupVertexAttributes: using THREE.InstancedBufferAttribute but hardware does not support extension ANGLE_instanced_arrays.' );
M
Mr.doob 已提交
1010
								return;
B
Ben Adams 已提交
1011

M
Mr.doob 已提交
1012
							}
B
Ben Adams 已提交
1013

M
Mr.doob 已提交
1014
							extension.vertexAttribDivisorANGLE( programAttribute, data.meshPerAttribute );
B
Ben Adams 已提交
1015

M
Mr.doob 已提交
1016
							if ( geometry.maxInstancedCount === undefined ) {
1017

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

M
Mr.doob 已提交
1020
							}
B
Ben Adams 已提交
1021

M
Mr.doob 已提交
1022
						}
B
Ben Adams 已提交
1023

B
Ben Adams 已提交
1024 1025
					} else {

1026
						_gl.bindBuffer( _gl.ARRAY_BUFFER, buffer );
M
Mr.doob 已提交
1027
						_gl.vertexAttribPointer( programAttribute, size, _gl.FLOAT, false, 0, startIndex * size * 4 ); // 4 bytes per Float32
B
Ben Adams 已提交
1028

M
Mr.doob 已提交
1029
						if ( geometryAttribute instanceof THREE.InstancedBufferAttribute ) {
B
Ben Adams 已提交
1030

M
Mr.doob 已提交
1031
							if ( extension === null ) {
B
Ben Adams 已提交
1032

1033
								console.error( 'THREE.WebGLRenderer.setupVertexAttributes: using THREE.InstancedBufferAttribute but hardware does not support extension ANGLE_instanced_arrays.' );
M
Mr.doob 已提交
1034
								return;
B
Ben Adams 已提交
1035

M
Mr.doob 已提交
1036
							}
B
Ben Adams 已提交
1037

M
Mr.doob 已提交
1038
							extension.vertexAttribDivisorANGLE( programAttribute, geometryAttribute.meshPerAttribute );
B
Ben Adams 已提交
1039

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

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

M
Mr.doob 已提交
1044
							}
B
Ben Adams 已提交
1045

M
Mr.doob 已提交
1046
						}
B
Ben Adams 已提交
1047 1048

					}
M
Mr.doob 已提交
1049

1050 1051
				} else if ( materialDefaultAttributeValues !== undefined ) {

T
tschw 已提交
1052
					var value = materialDefaultAttributeValues[ name ];
1053

1054
					if ( value !== undefined ) {
M
Mr.doob 已提交
1055

1056
						switch ( value.length ) {
M
Mr.doob 已提交
1057

1058 1059 1060
							case 2:
								_gl.vertexAttrib2fv( programAttribute, value );
								break;
M
Mr.doob 已提交
1061

1062 1063 1064
							case 3:
								_gl.vertexAttrib3fv( programAttribute, value );
								break;
M
Mr.doob 已提交
1065

1066 1067 1068
							case 4:
								_gl.vertexAttrib4fv( programAttribute, value );
								break;
1069

1070 1071
							default:
								_gl.vertexAttrib1fv( programAttribute, value );
1072 1073

						}
M
Mr.doob 已提交
1074 1075 1076 1077 1078 1079 1080 1081

					}

				}

			}

		}
1082

1083
		state.disableUnusedAttributes();
1084

M
Mr.doob 已提交
1085 1086
	}

M
Mr.doob 已提交
1087 1088
	// Sorting

1089 1090 1091 1092 1093 1094
	function numericalSort ( a, b ) {

		return b[ 0 ] - a[ 0 ];

	}

M
Mr.doob 已提交
1095 1096
	function painterSortStable ( a, b ) {

U
unconed 已提交
1097
		if ( a.object.renderOrder !== b.object.renderOrder ) {
1098

U
unconed 已提交
1099
			return a.object.renderOrder - b.object.renderOrder;
1100

M
Mr.doob 已提交
1101
		} else if ( a.material.id !== b.material.id ) {
M
Mr.doob 已提交
1102

M
Mr.doob 已提交
1103
			return a.material.id - b.material.id;
1104 1105

		} else if ( a.z !== b.z ) {
M
Mr.doob 已提交
1106

M
Mr.doob 已提交
1107
			return a.z - b.z;
M
Mr.doob 已提交
1108 1109 1110

		} else {

1111
			return a.id - b.id;
M
Mr.doob 已提交
1112 1113 1114

		}

1115
	}
M
Mr.doob 已提交
1116

1117 1118
	function reversePainterSortStable ( a, b ) {

U
unconed 已提交
1119
		if ( a.object.renderOrder !== b.object.renderOrder ) {
1120

U
unconed 已提交
1121
			return a.object.renderOrder - b.object.renderOrder;
1122 1123

		} if ( a.z !== b.z ) {
1124

M
Mr.doob 已提交
1125
			return b.z - a.z;
1126 1127 1128 1129 1130 1131 1132

		} else {

			return a.id - b.id;

		}

1133
	}
1134

M
Mr.doob 已提交
1135 1136 1137 1138 1139 1140
	// Rendering

	this.render = function ( scene, camera, renderTarget, forceClear ) {

		if ( camera instanceof THREE.Camera === false ) {

1141
			console.error( 'THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.' );
M
Mr.doob 已提交
1142 1143 1144 1145
			return;

		}

M
Mr.doob 已提交
1146
		var fog = scene.fog;
M
Mr.doob 已提交
1147 1148 1149

		// reset caching for this frame

1150
		_currentGeometryProgram = '';
1151
		_currentMaterialId = - 1;
1152
		_currentCamera = null;
M
Mr.doob 已提交
1153 1154 1155 1156
		_lightsNeedUpdate = true;

		// update scene graph

1157
		if ( scene.autoUpdate === true ) scene.updateMatrixWorld();
M
Mr.doob 已提交
1158 1159 1160

		// update camera matrices and frustum

1161
		if ( camera.parent === null ) camera.updateMatrixWorld();
M
Mr.doob 已提交
1162 1163 1164 1165 1166 1167

		camera.matrixWorldInverse.getInverse( camera.matrixWorld );

		_projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );
		_frustum.setFromMatrix( _projScreenMatrix );

M
Mr.doob 已提交
1168
		lights.length = 0;
1169

1170 1171
		opaqueObjects.length = 0;
		transparentObjects.length = 0;
M
Mr.doob 已提交
1172

1173 1174 1175
		opaqueImmediateObjects.length = 0;
		transparentImmediateObjects.length = 0;

M
Mr.doob 已提交
1176 1177 1178
		sprites.length = 0;
		lensFlares.length = 0;

1179
		projectObject( scene );
M
Mr.doob 已提交
1180

M
Mr.doob 已提交
1181
		if ( _this.sortObjects === true ) {
1182 1183 1184

			opaqueObjects.sort( painterSortStable );
			transparentObjects.sort( reversePainterSortStable );
M
Mr.doob 已提交
1185

1186 1187
		}

M
Mr.doob 已提交
1188
		//
M
Mr.doob 已提交
1189

1190
		shadowMap.render( scene, camera );
M
Mr.doob 已提交
1191 1192 1193

		//

1194 1195 1196 1197
		_infoRender.calls = 0;
		_infoRender.vertices = 0;
		_infoRender.faces = 0;
		_infoRender.points = 0;
M
Mr.doob 已提交
1198 1199 1200 1201 1202 1203 1204 1205 1206

		this.setRenderTarget( renderTarget );

		if ( this.autoClear || forceClear ) {

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

		}

1207
		//
M
Mr.doob 已提交
1208 1209 1210

		if ( scene.overrideMaterial ) {

1211
			var overrideMaterial = scene.overrideMaterial;
M
Mr.doob 已提交
1212

1213 1214
			renderObjects( opaqueObjects, camera, lights, fog, overrideMaterial );
			renderObjects( transparentObjects, camera, lights, fog, overrideMaterial );
1215 1216 1217

			renderObjectsImmediate( opaqueImmediateObjects, camera, lights, fog, overrideMaterial );
			renderObjectsImmediate( transparentImmediateObjects, camera, lights, fog, overrideMaterial );
M
Mr.doob 已提交
1218 1219 1220 1221 1222

		} else {

			// opaque pass (front-to-back order)

M
Mr.doob 已提交
1223
			state.setBlending( THREE.NoBlending );
M
Mr.doob 已提交
1224

1225 1226
			renderObjects( opaqueObjects, camera, lights, fog );
			renderObjectsImmediate( opaqueImmediateObjects, camera, lights, fog );
M
Mr.doob 已提交
1227 1228 1229

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

1230 1231
			renderObjects( transparentObjects, camera, lights, fog );
			renderObjectsImmediate( transparentImmediateObjects, camera, lights, fog );
M
Mr.doob 已提交
1232 1233 1234 1235 1236

		}

		// custom render plugins (post pass)

M
Mr.doob 已提交
1237 1238
		spritePlugin.render( scene, camera );
		lensFlarePlugin.render( scene, camera, _currentWidth, _currentHeight );
M
Mr.doob 已提交
1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249

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

		if ( renderTarget && renderTarget.generateMipmaps && renderTarget.minFilter !== THREE.NearestFilter && renderTarget.minFilter !== THREE.LinearFilter ) {

			updateRenderTargetMipmap( renderTarget );

		}

		// Ensure depth buffer writing is enabled so it can be cleared on next render

M
Mr.doob 已提交
1250 1251
		state.setDepthTest( true );
		state.setDepthWrite( true );
1252
		state.setColorWrite( true );
M
Mr.doob 已提交
1253 1254 1255 1256

		// _gl.finish();

	};
M
Mr.doob 已提交
1257

1258
	function projectObject( object ) {
M
Mr.doob 已提交
1259

M
Mr.doob 已提交
1260
		if ( object.visible === false ) return;
M
Mr.doob 已提交
1261

1262
		if ( object instanceof THREE.Light ) {
M
Mr.doob 已提交
1263

1264
			lights.push( object );
M
Mr.doob 已提交
1265

1266
		} else if ( object instanceof THREE.Sprite ) {
M
Mr.doob 已提交
1267

1268
			sprites.push( object );
M
Mr.doob 已提交
1269

1270
		} else if ( object instanceof THREE.LensFlare ) {
M
Mr.doob 已提交
1271

1272
			lensFlares.push( object );
M
Mr.doob 已提交
1273

1274
		} else if ( object instanceof THREE.ImmediateRenderObject ) {
M
Mr.doob 已提交
1275

1276
			var material = object.material;
M
Mr.doob 已提交
1277

1278
			if ( material.transparent ) {
1279

1280
				transparentImmediateObjects.push( object );
1281

1282
			} else {
1283

1284
				opaqueImmediateObjects.push( object );
1285

1286
			}
1287

1288
		} else if ( object instanceof THREE.Mesh || object instanceof THREE.Line || object instanceof THREE.PointCloud ){
M
Mr.doob 已提交
1289

1290
			if ( object instanceof THREE.SkinnedMesh ) {
M
Mr.doob 已提交
1291

1292
				object.skeleton.update();
M
Mr.doob 已提交
1293

1294
			}
1295

1296
			if ( object.frustumCulled === false || _frustum.intersectsObject( object ) === true ) {
1297

1298
				var material = object.material;
1299

1300
				if ( material.visible === true ) {
1301

M
Mr.doob 已提交
1302 1303 1304 1305 1306 1307 1308
					if ( _this.sortObjects === true ) {

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

					}

1309
					if ( material instanceof THREE.MeshFaceMaterial ) {
1310

1311
						var materials = material.materials;
1312

1313
						for ( var i = 0, l = materials.length; i < l; i ++ ) {
1314

1315
							materials[ i ].program = properties.get( materials[ i ] ).program;
1316

1317
						}
1318

1319
					} else {
1320

1321
						material.program = properties.get( material ).program;
1322

1323
					}
1324

1325 1326 1327
					var renderItem = {
						id: object.id,
						object: object,
M
Mr.doob 已提交
1328
						material: object.material,
1329 1330
						z: _vector3.z
					};
M
Mr.doob 已提交
1331

1332
					if ( material.transparent ) {
M
Mr.doob 已提交
1333

1334
						transparentObjects.push( renderItem );
M
Mr.doob 已提交
1335

1336
					} else {
1337

1338
						opaqueObjects.push( renderItem );
O
OpenShift guest 已提交
1339

1340
					}
M
Mr.doob 已提交
1341

1342
				}
M
Mr.doob 已提交
1343

1344
			}
M
Mr.doob 已提交
1345

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

M
Mr.doob 已提交
1348
		var children = object.children;
M
Mr.doob 已提交
1349

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

			projectObject( children[ i ] );
M
Mr.doob 已提交
1353

1354
		}
1355

1356
	}
M
Mr.doob 已提交
1357

1358
	function renderObjects( renderList, camera, lights, fog, overrideMaterial ) {
M
Mr.doob 已提交
1359

M
Mr.doob 已提交
1360
		var material = overrideMaterial;
M
Mr.doob 已提交
1361

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

1364 1365
			var renderItem = renderList[ i ];
			var object = renderItem.object;
1366
			var geometry = objects.update( object );
M
Mr.doob 已提交
1367

1368 1369
			object.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld );
			object.normalMatrix.getNormalMatrix( object.modelViewMatrix );
M
Mr.doob 已提交
1370

1371
			if ( overrideMaterial === undefined ) material = object.material;
M
Mr.doob 已提交
1372

1373 1374
			if ( material instanceof THREE.MeshFaceMaterial ) {

1375
				var groups = geometry.groups;
1376 1377
				var materials = material.materials;

1378
				for ( var j = 0, jl = groups.length; j < jl; j ++ ) {
1379

1380 1381
					var group = groups[ j ];
					var groupMaterial = materials[ group.materialIndex ];
1382

1383
					if ( groupMaterial !== undefined ) {
1384

1385
						_this.renderBufferDirect( camera, lights, fog, geometry, groupMaterial, object, group );
1386 1387

					}
1388 1389 1390

				}

1391
			} else {
1392

1393 1394 1395
				_this.renderBufferDirect( camera, lights, fog, geometry, material, object );

			}
M
Mr.doob 已提交
1396 1397 1398

		}

1399
	}
M
Mr.doob 已提交
1400

1401
	function renderObjectsImmediate( renderList, camera, lights, fog, overrideMaterial ) {
M
Mr.doob 已提交
1402

M
Mr.doob 已提交
1403
		var material = overrideMaterial;
M
Mr.doob 已提交
1404

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

1407
			var object = renderList[ i ];
M
Mr.doob 已提交
1408

1409 1410
			object.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld );
			object.normalMatrix.getNormalMatrix( object.modelViewMatrix );
M
Mr.doob 已提交
1411

1412
			if ( overrideMaterial === undefined ) material = object.material;
M
Mr.doob 已提交
1413

1414
			setMaterial( material );
1415

1416
			var program = setProgram( camera, lights, fog, material, object );
M
Mr.doob 已提交
1417

1418
			_currentGeometryProgram = '';
M
Mr.doob 已提交
1419

1420
			object.render( function ( object ) {
M
Mr.doob 已提交
1421

1422
				_this.renderBufferImmediate( object, program, material );
M
Mr.doob 已提交
1423

1424
			} );
M
Mr.doob 已提交
1425

1426
		}
M
Mr.doob 已提交
1427

1428
	}
M
Mr.doob 已提交
1429 1430 1431

	// Materials

1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442
	var shaderIDs = {
		MeshDepthMaterial: 'depth',
		MeshNormalMaterial: 'normal',
		MeshBasicMaterial: 'basic',
		MeshLambertMaterial: 'lambert',
		MeshPhongMaterial: 'phong',
		LineBasicMaterial: 'basic',
		LineDashedMaterial: 'dashed',
		PointCloudMaterial: 'particle_basic'
	};

1443
	function initMaterial( material, lights, fog, object ) {
M
Mr.doob 已提交
1444

1445
		var materialProperties = properties.get( material );
F
Fordy 已提交
1446

1447
		var shaderID = shaderIDs[ material.type ];
M
Mr.doob 已提交
1448 1449 1450 1451

		// heuristics to create shader parameters according to lights in the scene
		// (not to blow over maxLights budget)

1452 1453 1454
		var maxLightCount = allocateLights( lights );
		var maxShadows = allocateShadows( lights );
		var maxBones = allocateBones( object );
1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467
		var precision = _precision;

		if ( material.precision !== null ) {

			precision = state.getMaxPrecision( material.precision );

			if ( precision !== material.precision ) {

				console.warn( 'THREE.WebGLRenderer.initMaterial:', material.precision, 'not supported, using', precision, 'instead.' );

			}

		}
M
Mr.doob 已提交
1468

1469
		var parameters = {
M
Mr.doob 已提交
1470

1471
			precision: precision,
1472 1473
			supportsVertexTextures: _supportsVertexTextures,

1474 1475
			map: !! material.map,
			envMap: !! material.envMap,
M
Mr.doob 已提交
1476
			envMapMode: material.envMap && material.envMap.mapping,
1477
			lightMap: !! material.lightMap,
1478
			aoMap: !! material.aoMap,
1479
			emissiveMap: !! material.emissiveMap,
1480 1481 1482
			bumpMap: !! material.bumpMap,
			normalMap: !! material.normalMap,
			specularMap: !! material.specularMap,
1483
			alphaMap: !! material.alphaMap,
M
Mr.doob 已提交
1484

1485 1486
			combine: material.combine,

M
Mr.doob 已提交
1487 1488 1489 1490 1491 1492
			vertexColors: material.vertexColors,

			fog: fog,
			useFog: material.fog,
			fogExp: fog instanceof THREE.FogExp2,

1493 1494
			flatShading: material.shading === THREE.FlatShading,

M
Mr.doob 已提交
1495
			sizeAttenuation: material.sizeAttenuation,
1496
			logarithmicDepthBuffer: _logarithmicDepthBuffer,
M
Mr.doob 已提交
1497 1498 1499

			skinning: material.skinning,
			maxBones: maxBones,
1500
			useVertexTexture: _supportsBoneTextures && object && object.skeleton && object.skeleton.useVertexTexture,
M
Mr.doob 已提交
1501 1502 1503

			morphTargets: material.morphTargets,
			morphNormals: material.morphNormals,
1504 1505
			maxMorphTargets: _this.maxMorphTargets,
			maxMorphNormals: _this.maxMorphNormals,
M
Mr.doob 已提交
1506 1507 1508 1509 1510 1511 1512

			maxDirLights: maxLightCount.directional,
			maxPointLights: maxLightCount.point,
			maxSpotLights: maxLightCount.spot,
			maxHemiLights: maxLightCount.hemi,

			maxShadows: maxShadows,
1513 1514 1515
			shadowMapEnabled: shadowMap.enabled && object.receiveShadow && maxShadows > 0,
			shadowMapType: shadowMap.type,
			shadowMapDebug: shadowMap.debug,
M
Mr.doob 已提交
1516 1517 1518 1519 1520 1521 1522 1523

			alphaTest: material.alphaTest,
			metal: material.metal,
			doubleSided: material.side === THREE.DoubleSide,
			flipSided: material.side === THREE.BackSide

		};

1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538
		// Generate code

		var chunks = [];

		if ( shaderID ) {

			chunks.push( shaderID );

		} else {

			chunks.push( material.fragmentShader );
			chunks.push( material.vertexShader );

		}

1539 1540
		if ( material.defines !== undefined ) {

1541
			for ( var name in material.defines ) {
1542

1543 1544
				chunks.push( name );
				chunks.push( material.defines[ name ] );
1545 1546

			}
1547 1548 1549

		}

1550
		for ( var name in parameters ) {
1551

1552 1553
			chunks.push( name );
			chunks.push( parameters[ name ] );
1554 1555 1556 1557

		}

		var code = chunks.join();
T
tschw 已提交
1558
		var programChange = true;
1559

G
gero3 已提交
1560
		if ( ! materialProperties.program ) {
B
Ben Adams 已提交
1561

M
Mr.doob 已提交
1562 1563
			// new material
			material.addEventListener( 'dispose', onMaterialDispose );
B
Ben Adams 已提交
1564

1565
		} else if ( materialProperties.program.code !== code ) {
B
Ben Adams 已提交
1566

M
Mr.doob 已提交
1567
			// changed glsl or parameters
1568
			releaseMaterialProgramReference( material );
B
Ben Adams 已提交
1569

T
tschw 已提交
1570
		} else if ( shaderID !== undefined ) {
B
Ben Adams 已提交
1571

T
tschw 已提交
1572
			// same glsl and uniform list
T
tschw 已提交
1573 1574
			return;

T
tschw 已提交
1575
		} else {
B
Ben Adams 已提交
1576

T
tschw 已提交
1577 1578
			// only rebuild uniform list
			programChange = false;
B
Ben Adams 已提交
1579 1580 1581 1582 1583 1584 1585

		}

		if ( shaderID ) {

			var shader = THREE.ShaderLib[ shaderID ];

1586
			materialProperties.__webglShader = {
1587
				name: material.type,
B
Ben Adams 已提交
1588 1589 1590
				uniforms: THREE.UniformsUtils.clone( shader.uniforms ),
				vertexShader: shader.vertexShader,
				fragmentShader: shader.fragmentShader
D
dubejf 已提交
1591
			};
B
Ben Adams 已提交
1592 1593 1594

		} else {

1595
			materialProperties.__webglShader = {
1596
				name: material.type,
B
Ben Adams 已提交
1597 1598 1599
				uniforms: material.uniforms,
				vertexShader: material.vertexShader,
				fragmentShader: material.fragmentShader
D
dubejf 已提交
1600
			};
B
Ben Adams 已提交
1601 1602 1603

		}

1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614
		var program;

		// Check if code has been already compiled

		for ( var p = 0, pl = _programs.length; p < pl; p ++ ) {

			var programInfo = _programs[ p ];

			if ( programInfo.code === code ) {

				program = programInfo;
T
tschw 已提交
1615 1616 1617 1618 1619 1620

				if ( programChange ) {

					program.usedTimes ++;

				}
1621 1622 1623 1624 1625 1626 1627 1628 1629

				break;

			}

		}

		if ( program === undefined ) {

1630
			material.__webglShader = materialProperties.__webglShader;
1631
			program = new THREE.WebGLProgram( _this, code, material, parameters );
1632 1633
			_programs.push( program );

1634
			_infoMemory.programs = _programs.length;
1635 1636 1637

		}

1638
		materialProperties.program = program;
M
Mr.doob 已提交
1639

1640
		var attributes = program.getAttributes();
M
Mr.doob 已提交
1641 1642 1643 1644 1645

		if ( material.morphTargets ) {

			material.numSupportedMorphTargets = 0;

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

M
Mr.doob 已提交
1648
				if ( attributes[ 'morphTarget' + i ] >= 0 ) {
M
Mr.doob 已提交
1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661

					material.numSupportedMorphTargets ++;

				}

			}

		}

		if ( material.morphNormals ) {

			material.numSupportedMorphNormals = 0;

1662
			for ( i = 0; i < _this.maxMorphNormals; i ++ ) {
M
Mr.doob 已提交
1663

M
Mr.doob 已提交
1664
				if ( attributes[ 'morphNormal' + i ] >= 0 ) {
M
Mr.doob 已提交
1665 1666 1667 1668 1669 1670 1671 1672 1673

					material.numSupportedMorphNormals ++;

				}

			}

		}

1674
		materialProperties.uniformsList = [];
M
Mr.doob 已提交
1675

1676 1677
		var uniformLocations = materialProperties.program.getUniforms();
		for ( var u in materialProperties.__webglShader.uniforms ) {
M
Mr.doob 已提交
1678

1679
			var location = uniformLocations[ u ];
1680 1681

			if ( location ) {
G
gero3 已提交
1682

1683
				materialProperties.uniformsList.push( [ materialProperties.__webglShader.uniforms[ u ], location ] );
G
gero3 已提交
1684

1685
			}
M
Mr.doob 已提交
1686 1687 1688

		}

M
Mr.doob 已提交
1689
	}
M
Mr.doob 已提交
1690

1691 1692
	function setMaterial( material ) {

M
Mr.doob 已提交
1693 1694
		setMaterialFaces( material );

1695 1696
		if ( material.transparent === true ) {

M
Mr.doob 已提交
1697
			state.setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst, material.blendEquationAlpha, material.blendSrcAlpha, material.blendDstAlpha );
1698

1699 1700 1701 1702
		} else {

			state.setBlending( THREE.NoBlending );

1703 1704
		}

B
Ben Adams 已提交
1705
		state.setDepthFunc( material.depthFunc );
M
Mr.doob 已提交
1706 1707
		state.setDepthTest( material.depthTest );
		state.setDepthWrite( material.depthWrite );
1708
		state.setColorWrite( material.colorWrite );
M
Mr.doob 已提交
1709
		state.setPolygonOffset( material.polygonOffset, material.polygonOffsetFactor, material.polygonOffsetUnits );
1710 1711 1712

	}

M
Mr.doob 已提交
1713 1714
	function setMaterialFaces( material ) {

1715
		material.side !== THREE.DoubleSide ? state.enable( _gl.CULL_FACE ) : state.disable( _gl.CULL_FACE );
M
Mr.doob 已提交
1716 1717 1718 1719
		state.setFlipSided( material.side === THREE.BackSide );

	}

M
Mr.doob 已提交
1720 1721 1722 1723
	function setProgram( camera, lights, fog, material, object ) {

		_usedTextureUnits = 0;

1724
		var materialProperties = properties.get( material );
1725

1726
		if ( material.needsUpdate || ! materialProperties.program ) {
M
Mr.doob 已提交
1727

1728
			initMaterial( material, lights, fog, object );
M
Mr.doob 已提交
1729 1730 1731 1732
			material.needsUpdate = false;

		}

1733
		var refreshProgram = false;
M
Mr.doob 已提交
1734
		var refreshMaterial = false;
1735
		var refreshLights = false;
M
Mr.doob 已提交
1736

1737
		var program = materialProperties.program,
1738
			p_uniforms = program.getUniforms(),
1739
			m_uniforms = materialProperties.__webglShader.uniforms;
M
Mr.doob 已提交
1740

1741
		if ( program.id !== _currentProgram ) {
M
Mr.doob 已提交
1742

1743 1744
			_gl.useProgram( program.program );
			_currentProgram = program.id;
M
Mr.doob 已提交
1745

1746
			refreshProgram = true;
M
Mr.doob 已提交
1747
			refreshMaterial = true;
1748
			refreshLights = true;
M
Mr.doob 已提交
1749 1750 1751 1752 1753

		}

		if ( material.id !== _currentMaterialId ) {

G
gero3 已提交
1754
			if ( _currentMaterialId === - 1 ) refreshLights = true;
M
Mr.doob 已提交
1755
			_currentMaterialId = material.id;
1756

M
Mr.doob 已提交
1757 1758 1759 1760
			refreshMaterial = true;

		}

1761
		if ( refreshProgram || camera !== _currentCamera ) {
M
Mr.doob 已提交
1762 1763 1764

			_gl.uniformMatrix4fv( p_uniforms.projectionMatrix, false, camera.projectionMatrix.elements );

1765 1766
			if ( _logarithmicDepthBuffer ) {

1767
				_gl.uniform1f( p_uniforms.logDepthBufFC, 2.0 / ( Math.log( camera.far + 1.0 ) / Math.LN2 ) );
1768 1769 1770 1771

			}


M
Mr.doob 已提交
1772 1773
			if ( camera !== _currentCamera ) _currentCamera = camera;

1774 1775 1776 1777 1778 1779 1780
			// load material specific uniforms
			// (shader material also gets them for the sake of genericity)

			if ( material instanceof THREE.ShaderMaterial ||
				 material instanceof THREE.MeshPhongMaterial ||
				 material.envMap ) {

1781
				if ( p_uniforms.cameraPosition !== undefined ) {
1782 1783 1784 1785 1786 1787 1788 1789 1790 1791

					_vector3.setFromMatrixPosition( camera.matrixWorld );
					_gl.uniform3f( p_uniforms.cameraPosition, _vector3.x, _vector3.y, _vector3.z );

				}

			}

			if ( material instanceof THREE.MeshPhongMaterial ||
				 material instanceof THREE.MeshLambertMaterial ||
1792
				 material instanceof THREE.MeshBasicMaterial ||
1793 1794 1795
				 material instanceof THREE.ShaderMaterial ||
				 material.skinning ) {

1796
				if ( p_uniforms.viewMatrix !== undefined ) {
1797 1798

					_gl.uniformMatrix4fv( p_uniforms.viewMatrix, false, camera.matrixWorldInverse.elements );
M
Mr.doob 已提交
1799

1800 1801 1802 1803
				}

			}

M
Mr.doob 已提交
1804 1805 1806 1807 1808 1809 1810 1811
		}

		// 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

		if ( material.skinning ) {

1812
			if ( object.bindMatrix && p_uniforms.bindMatrix !== undefined ) {
1813 1814 1815 1816 1817

				_gl.uniformMatrix4fv( p_uniforms.bindMatrix, false, object.bindMatrix.elements );

			}

1818
			if ( object.bindMatrixInverse && p_uniforms.bindMatrixInverse !== undefined ) {
1819 1820 1821 1822 1823 1824

				_gl.uniformMatrix4fv( p_uniforms.bindMatrixInverse, false, object.bindMatrixInverse.elements );

			}

			if ( _supportsBoneTextures && object.skeleton && object.skeleton.useVertexTexture ) {
M
Mr.doob 已提交
1825

1826
				if ( p_uniforms.boneTexture !== undefined ) {
M
Mr.doob 已提交
1827 1828 1829 1830

					var textureUnit = getTextureUnit();

					_gl.uniform1i( p_uniforms.boneTexture, textureUnit );
1831
					_this.setTexture( object.skeleton.boneTexture, textureUnit );
M
Mr.doob 已提交
1832 1833 1834

				}

1835
				if ( p_uniforms.boneTextureWidth !== undefined ) {
1836

1837
					_gl.uniform1i( p_uniforms.boneTextureWidth, object.skeleton.boneTextureWidth );
1838 1839 1840

				}

1841
				if ( p_uniforms.boneTextureHeight !== undefined ) {
1842

1843
					_gl.uniform1i( p_uniforms.boneTextureHeight, object.skeleton.boneTextureHeight );
1844 1845 1846

				}

1847
			} else if ( object.skeleton && object.skeleton.boneMatrices ) {
M
Mr.doob 已提交
1848

1849
				if ( p_uniforms.boneGlobalMatrices !== undefined ) {
M
Mr.doob 已提交
1850

1851
					_gl.uniformMatrix4fv( p_uniforms.boneGlobalMatrices, false, object.skeleton.boneMatrices );
M
Mr.doob 已提交
1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874

				}

			}

		}

		if ( refreshMaterial ) {

			// refresh uniforms common to several materials

			if ( fog && material.fog ) {

				refreshUniformsFog( m_uniforms, fog );

			}

			if ( material instanceof THREE.MeshPhongMaterial ||
				 material instanceof THREE.MeshLambertMaterial ||
				 material.lights ) {

				if ( _lightsNeedUpdate ) {

1875
					refreshLights = true;
T
tschw 已提交
1876
					setupLights( lights, camera );
M
Mr.doob 已提交
1877
					_lightsNeedUpdate = false;
G
gero3 已提交
1878

M
Mr.doob 已提交
1879 1880
				}

1881
				if ( refreshLights ) {
G
gero3 已提交
1882

1883
					refreshUniformsLights( m_uniforms, _lights );
1884
					markUniformsLightsNeedsUpdate( m_uniforms, true );
G
gero3 已提交
1885

1886
				} else {
G
gero3 已提交
1887

1888
					markUniformsLightsNeedsUpdate( m_uniforms, false );
G
gero3 已提交
1889

1890
				}
M
Mr.doob 已提交
1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912

			}

			if ( material instanceof THREE.MeshBasicMaterial ||
				 material instanceof THREE.MeshLambertMaterial ||
				 material instanceof THREE.MeshPhongMaterial ) {

				refreshUniformsCommon( m_uniforms, material );

			}

			// refresh single material specific uniforms

			if ( material instanceof THREE.LineBasicMaterial ) {

				refreshUniformsLine( m_uniforms, material );

			} else if ( material instanceof THREE.LineDashedMaterial ) {

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

1913
			} else if ( material instanceof THREE.PointCloudMaterial ) {
M
Mr.doob 已提交
1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924

				refreshUniformsParticle( m_uniforms, material );

			} else if ( material instanceof THREE.MeshPhongMaterial ) {

				refreshUniformsPhong( m_uniforms, material );

			} else if ( material instanceof THREE.MeshLambertMaterial ) {

				refreshUniformsLambert( m_uniforms, material );

1925 1926 1927 1928
			} else if ( material instanceof THREE.MeshBasicMaterial ) {

				refreshUniformsBasic( m_uniforms, material );

M
Mr.doob 已提交
1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948
			} else if ( material instanceof THREE.MeshDepthMaterial ) {

				m_uniforms.mNear.value = camera.near;
				m_uniforms.mFar.value = camera.far;
				m_uniforms.opacity.value = material.opacity;

			} else if ( material instanceof THREE.MeshNormalMaterial ) {

				m_uniforms.opacity.value = material.opacity;

			}

			if ( object.receiveShadow && ! material._shadowPass ) {

				refreshUniformsShadow( m_uniforms, lights );

			}

			// load common uniforms

1949
			loadUniformsGeneric( materialProperties.uniformsList );
M
Mr.doob 已提交
1950 1951 1952 1953 1954

		}

		loadUniformsMatrices( p_uniforms, object );

1955
		if ( p_uniforms.modelMatrix !== undefined ) {
M
Mr.doob 已提交
1956 1957

			_gl.uniformMatrix4fv( p_uniforms.modelMatrix, false, object.matrixWorld.elements );
M
Mr.doob 已提交
1958

M
Mr.doob 已提交
1959 1960 1961 1962
		}

		return program;

M
Mr.doob 已提交
1963
	}
M
Mr.doob 已提交
1964 1965 1966 1967 1968 1969 1970

	// Uniforms (refresh uniforms objects)

	function refreshUniformsCommon ( uniforms, material ) {

		uniforms.opacity.value = material.opacity;

1971
		uniforms.diffuse.value = material.color;
M
Mr.doob 已提交
1972 1973 1974

		uniforms.map.value = material.map;
		uniforms.specularMap.value = material.specularMap;
1975
		uniforms.alphaMap.value = material.alphaMap;
M
Mr.doob 已提交
1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991

		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 );

		}

		// uv repeat and offset setting priorities
M
Mr.doob 已提交
1992 1993 1994 1995 1996
		// 1. color map
		// 2. specular map
		// 3. normal map
		// 4. bump map
		// 5. alpha map
1997
		// 6. emissive map
M
Mr.doob 已提交
1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016

		var uvScaleMap;

		if ( material.map ) {

			uvScaleMap = material.map;

		} else if ( material.specularMap ) {

			uvScaleMap = material.specularMap;

		} else if ( material.normalMap ) {

			uvScaleMap = material.normalMap;

		} else if ( material.bumpMap ) {

			uvScaleMap = material.bumpMap;

2017 2018 2019 2020
		} else if ( material.alphaMap ) {

			uvScaleMap = material.alphaMap;

2021 2022 2023 2024
		} else if ( material.emissiveMap ) {

			uvScaleMap = material.emissiveMap;

M
Mr.doob 已提交
2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036
		}

		if ( uvScaleMap !== undefined ) {

			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;
2037
		uniforms.flipEnvMap.value = ( material.envMap instanceof THREE.WebGLRenderTargetCube ) ? 1 : - 1;
M
Mr.doob 已提交
2038

2039
		uniforms.reflectivity.value = material.reflectivity;
M
Mr.doob 已提交
2040 2041
		uniforms.refractionRatio.value = material.refractionRatio;

M
Mr.doob 已提交
2042
	}
M
Mr.doob 已提交
2043 2044 2045 2046 2047 2048

	function refreshUniformsLine ( uniforms, material ) {

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

M
Mr.doob 已提交
2049
	}
M
Mr.doob 已提交
2050 2051 2052 2053 2054 2055 2056

	function refreshUniformsDash ( uniforms, material ) {

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

M
Mr.doob 已提交
2057
	}
M
Mr.doob 已提交
2058 2059 2060 2061 2062 2063 2064 2065 2066 2067

	function refreshUniformsParticle ( uniforms, material ) {

		uniforms.psColor.value = material.color;
		uniforms.opacity.value = material.opacity;
		uniforms.size.value = material.size;
		uniforms.scale.value = _canvas.height / 2.0; // TODO: Cache this.

		uniforms.map.value = material.map;

2068 2069 2070 2071 2072 2073 2074 2075 2076
		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 已提交
2077
	}
M
Mr.doob 已提交
2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093

	function refreshUniformsFog ( uniforms, fog ) {

		uniforms.fogColor.value = fog.color;

		if ( fog instanceof THREE.Fog ) {

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

		} else if ( fog instanceof THREE.FogExp2 ) {

			uniforms.fogDensity.value = fog.density;

		}

M
Mr.doob 已提交
2094
	}
M
Mr.doob 已提交
2095 2096 2097 2098 2099

	function refreshUniformsPhong ( uniforms, material ) {

		uniforms.shininess.value = material.shininess;

2100 2101
		uniforms.emissive.value = material.emissive;
		uniforms.specular.value = material.specular;
M
Mr.doob 已提交
2102

2103 2104 2105 2106 2107 2108
		uniforms.lightMap.value = material.lightMap;
		uniforms.lightMapIntensity.value = material.lightMapIntensity;

		uniforms.aoMap.value = material.aoMap;
		uniforms.aoMapIntensity.value = material.aoMapIntensity;

2109 2110
		uniforms.emissiveMap.value = material.emissiveMap;

M
Mr.doob 已提交
2111
	}
M
Mr.doob 已提交
2112 2113 2114

	function refreshUniformsLambert ( uniforms, material ) {

2115
		uniforms.emissive.value = material.emissive;
M
Mr.doob 已提交
2116

M
Mr.doob 已提交
2117
	}
M
Mr.doob 已提交
2118

2119 2120 2121 2122 2123 2124 2125
	function refreshUniformsBasic ( uniforms, material ) {

		uniforms.aoMap.value = material.aoMap;
		uniforms.aoMapIntensity.value = material.aoMapIntensity;

	}

M
Mr.doob 已提交
2126 2127 2128 2129 2130 2131 2132 2133 2134 2135
	function refreshUniformsLights ( uniforms, lights ) {

		uniforms.ambientLightColor.value = lights.ambient;

		uniforms.directionalLightColor.value = lights.directional.colors;
		uniforms.directionalLightDirection.value = lights.directional.positions;

		uniforms.pointLightColor.value = lights.point.colors;
		uniforms.pointLightPosition.value = lights.point.positions;
		uniforms.pointLightDistance.value = lights.point.distances;
M
Mr.doob 已提交
2136
		uniforms.pointLightDecay.value = lights.point.decays;
M
Mr.doob 已提交
2137 2138 2139 2140 2141 2142 2143

		uniforms.spotLightColor.value = lights.spot.colors;
		uniforms.spotLightPosition.value = lights.spot.positions;
		uniforms.spotLightDistance.value = lights.spot.distances;
		uniforms.spotLightDirection.value = lights.spot.directions;
		uniforms.spotLightAngleCos.value = lights.spot.anglesCos;
		uniforms.spotLightExponent.value = lights.spot.exponents;
M
Mr.doob 已提交
2144
		uniforms.spotLightDecay.value = lights.spot.decays;
M
Mr.doob 已提交
2145 2146 2147 2148 2149

		uniforms.hemisphereLightSkyColor.value = lights.hemi.skyColors;
		uniforms.hemisphereLightGroundColor.value = lights.hemi.groundColors;
		uniforms.hemisphereLightDirection.value = lights.hemi.positions;

M
Mr.doob 已提交
2150
	}
M
Mr.doob 已提交
2151

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

M
Mr.doob 已提交
2154
	function markUniformsLightsNeedsUpdate ( uniforms, value ) {
2155

M
Mr.doob 已提交
2156
		uniforms.ambientLightColor.needsUpdate = value;
2157

M
Mr.doob 已提交
2158 2159
		uniforms.directionalLightColor.needsUpdate = value;
		uniforms.directionalLightDirection.needsUpdate = value;
2160

M
Mr.doob 已提交
2161 2162 2163 2164
		uniforms.pointLightColor.needsUpdate = value;
		uniforms.pointLightPosition.needsUpdate = value;
		uniforms.pointLightDistance.needsUpdate = value;
		uniforms.pointLightDecay.needsUpdate = value;
2165

M
Mr.doob 已提交
2166 2167 2168 2169 2170 2171 2172
		uniforms.spotLightColor.needsUpdate = value;
		uniforms.spotLightPosition.needsUpdate = value;
		uniforms.spotLightDistance.needsUpdate = value;
		uniforms.spotLightDirection.needsUpdate = value;
		uniforms.spotLightAngleCos.needsUpdate = value;
		uniforms.spotLightExponent.needsUpdate = value;
		uniforms.spotLightDecay.needsUpdate = value;
2173

M
Mr.doob 已提交
2174 2175 2176
		uniforms.hemisphereLightSkyColor.needsUpdate = value;
		uniforms.hemisphereLightGroundColor.needsUpdate = value;
		uniforms.hemisphereLightDirection.needsUpdate = value;
2177

M
Mr.doob 已提交
2178
	}
2179

M
Mr.doob 已提交
2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191
	function refreshUniformsShadow ( uniforms, lights ) {

		if ( uniforms.shadowMatrix ) {

			var j = 0;

			for ( var i = 0, il = lights.length; i < il; i ++ ) {

				var light = lights[ i ];

				if ( ! light.castShadow ) continue;

2192
				if ( light instanceof THREE.SpotLight || ( light instanceof THREE.DirectionalLight ) ) {
M
Mr.doob 已提交
2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209

					uniforms.shadowMap.value[ j ] = light.shadowMap;
					uniforms.shadowMapSize.value[ j ] = light.shadowMapSize;

					uniforms.shadowMatrix.value[ j ] = light.shadowMatrix;

					uniforms.shadowDarkness.value[ j ] = light.shadowDarkness;
					uniforms.shadowBias.value[ j ] = light.shadowBias;

					j ++;

				}

			}

		}

M
Mr.doob 已提交
2210
	}
M
Mr.doob 已提交
2211 2212 2213 2214 2215

	// Uniforms (load to GPU)

	function loadUniformsMatrices ( uniforms, object ) {

2216
		_gl.uniformMatrix4fv( uniforms.modelViewMatrix, false, object.modelViewMatrix.elements );
M
Mr.doob 已提交
2217 2218 2219

		if ( uniforms.normalMatrix ) {

2220
			_gl.uniformMatrix3fv( uniforms.normalMatrix, false, object.normalMatrix.elements );
M
Mr.doob 已提交
2221 2222 2223

		}

M
Mr.doob 已提交
2224
	}
M
Mr.doob 已提交
2225 2226 2227 2228 2229 2230 2231

	function getTextureUnit() {

		var textureUnit = _usedTextureUnits;

		if ( textureUnit >= _maxTextures ) {

2232
			console.warn( 'WebGLRenderer: trying to use ' + textureUnit + ' texture units while this GPU supports only ' + _maxTextures );
M
Mr.doob 已提交
2233 2234 2235 2236 2237 2238 2239

		}

		_usedTextureUnits += 1;

		return textureUnit;

M
Mr.doob 已提交
2240
	}
M
Mr.doob 已提交
2241

2242
	function loadUniformsGeneric ( uniforms ) {
M
Mr.doob 已提交
2243

M
Mr.doob 已提交
2244
		var texture, textureUnit, offset;
M
Mr.doob 已提交
2245

M
Mr.doob 已提交
2246 2247 2248
		for ( var j = 0, jl = uniforms.length; j < jl; j ++ ) {

			var uniform = uniforms[ j ][ 0 ];
M
Mr.doob 已提交
2249

2250 2251
			// needsUpdate property is not added to all uniforms.
			if ( uniform.needsUpdate === false ) continue;
2252

M
Mr.doob 已提交
2253 2254
			var type = uniform.type;
			var value = uniform.value;
2255
			var location = uniforms[ j ][ 1 ];
M
Mr.doob 已提交
2256

2257
			switch ( type ) {
M
Mr.doob 已提交
2258

2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312
				case '1i':
					_gl.uniform1i( location, value );
					break;

				case '1f':
					_gl.uniform1f( location, value );
					break;

				case '2f':
					_gl.uniform2f( location, value[ 0 ], value[ 1 ] );
					break;

				case '3f':
					_gl.uniform3f( location, value[ 0 ], value[ 1 ], value[ 2 ] );
					break;

				case '4f':
					_gl.uniform4f( location, value[ 0 ], value[ 1 ], value[ 2 ], value[ 3 ] );
					break;

				case '1iv':
					_gl.uniform1iv( location, value );
					break;

				case '3iv':
					_gl.uniform3iv( location, value );
					break;

				case '1fv':
					_gl.uniform1fv( location, value );
					break;

				case '2fv':
					_gl.uniform2fv( location, value );
					break;

				case '3fv':
					_gl.uniform3fv( location, value );
					break;

				case '4fv':
					_gl.uniform4fv( location, value );
					break;

				case 'Matrix3fv':
					_gl.uniformMatrix3fv( location, false, value );
					break;

				case 'Matrix4fv':
					_gl.uniformMatrix4fv( location, false, value );
					break;

				//

M
Mr.doob 已提交
2313
				case 'i':
M
Mr.doob 已提交
2314

2315 2316
					// single integer
					_gl.uniform1i( location, value );
M
Mr.doob 已提交
2317

2318
					break;
M
Mr.doob 已提交
2319

2320
				case 'f':
M
Mr.doob 已提交
2321

2322 2323
					// single float
					_gl.uniform1f( location, value );
M
Mr.doob 已提交
2324

2325
					break;
M
Mr.doob 已提交
2326

2327
				case 'v2':
M
Mr.doob 已提交
2328

2329 2330
					// single THREE.Vector2
					_gl.uniform2f( location, value.x, value.y );
M
Mr.doob 已提交
2331

2332
					break;
M
Mr.doob 已提交
2333

2334
				case 'v3':
M
Mr.doob 已提交
2335

2336 2337
					// single THREE.Vector3
					_gl.uniform3f( location, value.x, value.y, value.z );
M
Mr.doob 已提交
2338

2339
					break;
M
Mr.doob 已提交
2340

M
Mr.doob 已提交
2341
				case 'v4':
M
Mr.doob 已提交
2342

2343 2344
					// single THREE.Vector4
					_gl.uniform4f( location, value.x, value.y, value.z, value.w );
M
Mr.doob 已提交
2345

2346
					break;
M
Mr.doob 已提交
2347

2348
				case 'c':
M
Mr.doob 已提交
2349

2350 2351
					// single THREE.Color
					_gl.uniform3f( location, value.r, value.g, value.b );
M
Mr.doob 已提交
2352

2353
					break;
M
Mr.doob 已提交
2354

2355
				case 'iv1':
M
Mr.doob 已提交
2356

2357 2358
					// flat array of integers (JS or typed array)
					_gl.uniform1iv( location, value );
M
Mr.doob 已提交
2359

2360
					break;
M
Mr.doob 已提交
2361

2362
				case 'iv':
M
Mr.doob 已提交
2363

2364 2365
					// flat array of integers with 3 x N size (JS or typed array)
					_gl.uniform3iv( location, value );
M
Mr.doob 已提交
2366

2367
					break;
M
Mr.doob 已提交
2368

2369
				case 'fv1':
M
Mr.doob 已提交
2370

2371 2372
					// flat array of floats (JS or typed array)
					_gl.uniform1fv( location, value );
M
Mr.doob 已提交
2373

2374
					break;
M
Mr.doob 已提交
2375

2376
				case 'fv':
M
Mr.doob 已提交
2377

2378 2379
					// flat array of floats with 3 x N size (JS or typed array)
					_gl.uniform3fv( location, value );
M
Mr.doob 已提交
2380

2381
					break;
M
Mr.doob 已提交
2382

2383
				case 'v2v':
M
Mr.doob 已提交
2384

2385
					// array of THREE.Vector2
M
Mr.doob 已提交
2386

2387
					if ( uniform._array === undefined ) {
M
Mr.doob 已提交
2388

2389
						uniform._array = new Float32Array( 2 * value.length );
M
Mr.doob 已提交
2390

2391
					}
M
Mr.doob 已提交
2392

2393
					for ( var i = 0, il = value.length; i < il; i ++ ) {
M
Mr.doob 已提交
2394

2395
						offset = i * 2;
M
Mr.doob 已提交
2396

M
Mr.doob 已提交
2397
						uniform._array[ offset + 0 ] = value[ i ].x;
2398
						uniform._array[ offset + 1 ] = value[ i ].y;
M
Mr.doob 已提交
2399

2400
					}
M
Mr.doob 已提交
2401

2402
					_gl.uniform2fv( location, uniform._array );
M
Mr.doob 已提交
2403

2404
					break;
M
Mr.doob 已提交
2405

2406
				case 'v3v':
M
Mr.doob 已提交
2407

2408
					// array of THREE.Vector3
M
Mr.doob 已提交
2409

2410
					if ( uniform._array === undefined ) {
M
Mr.doob 已提交
2411

2412
						uniform._array = new Float32Array( 3 * value.length );
M
Mr.doob 已提交
2413

2414
					}
M
Mr.doob 已提交
2415

2416
					for ( var i = 0, il = value.length; i < il; i ++ ) {
R
Ryan Tsao 已提交
2417

2418
						offset = i * 3;
R
Ryan Tsao 已提交
2419

M
Mr.doob 已提交
2420
						uniform._array[ offset + 0 ] = value[ i ].x;
2421 2422
						uniform._array[ offset + 1 ] = value[ i ].y;
						uniform._array[ offset + 2 ] = value[ i ].z;
R
Ryan Tsao 已提交
2423

2424
					}
R
Ryan Tsao 已提交
2425

2426
					_gl.uniform3fv( location, uniform._array );
R
Ryan Tsao 已提交
2427

2428
					break;
R
Ryan Tsao 已提交
2429

2430
				case 'v4v':
R
Ryan Tsao 已提交
2431

2432
					// array of THREE.Vector4
R
Ryan Tsao 已提交
2433

2434
					if ( uniform._array === undefined ) {
R
Ryan Tsao 已提交
2435

2436
						uniform._array = new Float32Array( 4 * value.length );
R
Ryan Tsao 已提交
2437

2438
					}
M
Mr.doob 已提交
2439

2440
					for ( var i = 0, il = value.length; i < il; i ++ ) {
M
Mr.doob 已提交
2441

2442
						offset = i * 4;
M
Mr.doob 已提交
2443

M
Mr.doob 已提交
2444
						uniform._array[ offset + 0 ] = value[ i ].x;
2445 2446 2447
						uniform._array[ offset + 1 ] = value[ i ].y;
						uniform._array[ offset + 2 ] = value[ i ].z;
						uniform._array[ offset + 3 ] = value[ i ].w;
M
Mr.doob 已提交
2448

2449
					}
M
Mr.doob 已提交
2450

2451
					_gl.uniform4fv( location, uniform._array );
M
Mr.doob 已提交
2452

2453
					break;
M
Mr.doob 已提交
2454

2455
				case 'm3':
M
Mr.doob 已提交
2456

2457 2458
					// single THREE.Matrix3
					_gl.uniformMatrix3fv( location, false, value.elements );
M
Mr.doob 已提交
2459

2460
					break;
M
Mr.doob 已提交
2461

2462
				case 'm3v':
M
Mr.doob 已提交
2463

2464
					// array of THREE.Matrix3
M
Mr.doob 已提交
2465

2466
					if ( uniform._array === undefined ) {
M
Mr.doob 已提交
2467

2468
						uniform._array = new Float32Array( 9 * value.length );
M
Mr.doob 已提交
2469

2470
					}
M
Mr.doob 已提交
2471

2472
					for ( var i = 0, il = value.length; i < il; i ++ ) {
M
Mr.doob 已提交
2473

2474
						value[ i ].flattenToArrayOffset( uniform._array, i * 9 );
M
Mr.doob 已提交
2475

2476
					}
M
Mr.doob 已提交
2477

2478
					_gl.uniformMatrix3fv( location, false, uniform._array );
M
Mr.doob 已提交
2479

2480
					break;
M
Mr.doob 已提交
2481

2482
				case 'm4':
M
Mr.doob 已提交
2483

2484 2485
					// single THREE.Matrix4
					_gl.uniformMatrix4fv( location, false, value.elements );
M
Mr.doob 已提交
2486

2487
					break;
M
Mr.doob 已提交
2488

2489
				case 'm4v':
M
Mr.doob 已提交
2490

2491
					// array of THREE.Matrix4
M
Mr.doob 已提交
2492

2493
					if ( uniform._array === undefined ) {
M
Mr.doob 已提交
2494

2495
						uniform._array = new Float32Array( 16 * value.length );
M
Mr.doob 已提交
2496

2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2507
					}

					for ( var i = 0, il = value.length; i < il; i ++ ) {

						value[ i ].flattenToArrayOffset( uniform._array, i * 16 );

					}

					_gl.uniformMatrix4fv( location, false, uniform._array );

					break;
M
Mr.doob 已提交
2508

2509
				case 't':
M
Mr.doob 已提交
2510

2511
					// single THREE.Texture (2d or cube)
M
Mr.doob 已提交
2512

2513 2514 2515 2516
					texture = value;
					textureUnit = getTextureUnit();

					_gl.uniform1i( location, textureUnit );
M
Mr.doob 已提交
2517

2518
					if ( ! texture ) continue;
M
Mr.doob 已提交
2519

2520
					if ( texture instanceof THREE.CubeTexture ||
G
gero3 已提交
2521 2522 2523
						 ( Array.isArray( texture.image ) && texture.image.length === 6 ) ) {

						// CompressedTexture can have Array in image :/
M
Mr.doob 已提交
2524

2525
						setCubeTexture( texture, textureUnit );
M
Mr.doob 已提交
2526

2527 2528 2529 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554 2555 2556 2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 2567 2568 2569 2570
					} else if ( texture instanceof THREE.WebGLRenderTargetCube ) {

						setCubeTextureDynamic( texture, textureUnit );

					} else {

						_this.setTexture( texture, textureUnit );

					}

					break;

				case 'tv':

					// array of THREE.Texture (2d)

					if ( uniform._array === undefined ) {

						uniform._array = [];

					}

					for ( var i = 0, il = uniform.value.length; i < il; i ++ ) {

						uniform._array[ i ] = getTextureUnit();

					}

					_gl.uniform1iv( location, uniform._array );

					for ( var i = 0, il = uniform.value.length; i < il; i ++ ) {

						texture = uniform.value[ i ];
						textureUnit = uniform._array[ i ];

						if ( ! texture ) continue;

						_this.setTexture( texture, textureUnit );

					}

					break;

				default:
2571

2572
					console.warn( 'THREE.WebGLRenderer: Unknown uniform type: ' + type );
2573

M
Mr.doob 已提交
2574 2575 2576 2577
			}

		}

M
Mr.doob 已提交
2578
	}
M
Mr.doob 已提交
2579 2580 2581

	function setColorLinear( array, offset, color, intensity ) {

M
Mr.doob 已提交
2582
		array[ offset + 0 ] = color.r * intensity;
M
Mr.doob 已提交
2583 2584 2585
		array[ offset + 1 ] = color.g * intensity;
		array[ offset + 2 ] = color.b * intensity;

M
Mr.doob 已提交
2586
	}
M
Mr.doob 已提交
2587

T
tschw 已提交
2588
	function setupLights ( lights, camera ) {
M
Mr.doob 已提交
2589

B
brason 已提交
2590
		var l, ll, light,
M
Mr.doob 已提交
2591 2592
		r = 0, g = 0, b = 0,
		color, skyColor, groundColor,
B
brason 已提交
2593
		intensity,
M
Mr.doob 已提交
2594 2595 2596 2597
		distance,

		zlights = _lights,

T
tschw 已提交
2598 2599
		viewMatrix = camera.matrixWorldInverse,

M
Mr.doob 已提交
2600 2601 2602 2603 2604 2605
		dirColors = zlights.directional.colors,
		dirPositions = zlights.directional.positions,

		pointColors = zlights.point.colors,
		pointPositions = zlights.point.positions,
		pointDistances = zlights.point.distances,
M
Mr.doob 已提交
2606
		pointDecays = zlights.point.decays,
M
Mr.doob 已提交
2607 2608 2609 2610 2611 2612 2613

		spotColors = zlights.spot.colors,
		spotPositions = zlights.spot.positions,
		spotDistances = zlights.spot.distances,
		spotDirections = zlights.spot.directions,
		spotAnglesCos = zlights.spot.anglesCos,
		spotExponents = zlights.spot.exponents,
M
Mr.doob 已提交
2614
		spotDecays = zlights.spot.decays,
M
Mr.doob 已提交
2615 2616 2617 2618 2619 2620 2621 2622 2623 2624 2625 2626 2627 2628 2629 2630 2631 2632 2633 2634 2635 2636 2637 2638 2639 2640 2641 2642 2643 2644 2645 2646 2647 2648

		hemiSkyColors = zlights.hemi.skyColors,
		hemiGroundColors = zlights.hemi.groundColors,
		hemiPositions = zlights.hemi.positions,

		dirLength = 0,
		pointLength = 0,
		spotLength = 0,
		hemiLength = 0,

		dirCount = 0,
		pointCount = 0,
		spotCount = 0,
		hemiCount = 0,

		dirOffset = 0,
		pointOffset = 0,
		spotOffset = 0,
		hemiOffset = 0;

		for ( l = 0, ll = lights.length; l < ll; l ++ ) {

			light = lights[ l ];

			if ( light.onlyShadow ) continue;

			color = light.color;
			intensity = light.intensity;
			distance = light.distance;

			if ( light instanceof THREE.AmbientLight ) {

				if ( ! light.visible ) continue;

2649 2650 2651
				r += color.r;
				g += color.g;
				b += color.b;
M
Mr.doob 已提交
2652 2653 2654 2655 2656 2657 2658

			} else if ( light instanceof THREE.DirectionalLight ) {

				dirCount += 1;

				if ( ! light.visible ) continue;

2659 2660
				_direction.setFromMatrixPosition( light.matrixWorld );
				_vector3.setFromMatrixPosition( light.target.matrixWorld );
M
Mr.doob 已提交
2661
				_direction.sub( _vector3 );
T
tschw 已提交
2662
				_direction.transformDirection( viewMatrix );
M
Mr.doob 已提交
2663 2664 2665

				dirOffset = dirLength * 3;

M
Mr.doob 已提交
2666
				dirPositions[ dirOffset + 0 ] = _direction.x;
M
Mr.doob 已提交
2667 2668 2669
				dirPositions[ dirOffset + 1 ] = _direction.y;
				dirPositions[ dirOffset + 2 ] = _direction.z;

2670
				setColorLinear( dirColors, dirOffset, color, intensity );
M
Mr.doob 已提交
2671 2672 2673 2674 2675 2676 2677 2678 2679 2680 2681

				dirLength += 1;

			} else if ( light instanceof THREE.PointLight ) {

				pointCount += 1;

				if ( ! light.visible ) continue;

				pointOffset = pointLength * 3;

2682
				setColorLinear( pointColors, pointOffset, color, intensity );
M
Mr.doob 已提交
2683

2684
				_vector3.setFromMatrixPosition( light.matrixWorld );
T
tschw 已提交
2685
				_vector3.applyMatrix4( viewMatrix );
M
Mr.doob 已提交
2686

M
Mr.doob 已提交
2687
				pointPositions[ pointOffset + 0 ] = _vector3.x;
M
Mr.doob 已提交
2688 2689 2690
				pointPositions[ pointOffset + 1 ] = _vector3.y;
				pointPositions[ pointOffset + 2 ] = _vector3.z;

M
Mr.doob 已提交
2691
				// distance is 0 if decay is 0, because there is no attenuation at all.
M
Mr.doob 已提交
2692
				pointDistances[ pointLength ] = distance;
M
Mr.doob 已提交
2693
				pointDecays[ pointLength ] = ( light.distance === 0 ) ? 0.0 : light.decay;
M
Mr.doob 已提交
2694 2695 2696 2697 2698 2699 2700 2701 2702 2703 2704

				pointLength += 1;

			} else if ( light instanceof THREE.SpotLight ) {

				spotCount += 1;

				if ( ! light.visible ) continue;

				spotOffset = spotLength * 3;

2705
				setColorLinear( spotColors, spotOffset, color, intensity );
M
Mr.doob 已提交
2706

G
gero3 已提交
2707
				_direction.setFromMatrixPosition( light.matrixWorld );
T
tschw 已提交
2708
				_vector3.copy( _direction ).applyMatrix4( viewMatrix );
M
Mr.doob 已提交
2709

T
tschw 已提交
2710 2711 2712
				spotPositions[ spotOffset + 0 ] = _vector3.x;
				spotPositions[ spotOffset + 1 ] = _vector3.y;
				spotPositions[ spotOffset + 2 ] = _vector3.z;
M
Mr.doob 已提交
2713 2714 2715

				spotDistances[ spotLength ] = distance;

2716
				_vector3.setFromMatrixPosition( light.target.matrixWorld );
M
Mr.doob 已提交
2717
				_direction.sub( _vector3 );
T
tschw 已提交
2718
				_direction.transformDirection( viewMatrix );
M
Mr.doob 已提交
2719

M
Mr.doob 已提交
2720
				spotDirections[ spotOffset + 0 ] = _direction.x;
M
Mr.doob 已提交
2721 2722 2723 2724 2725
				spotDirections[ spotOffset + 1 ] = _direction.y;
				spotDirections[ spotOffset + 2 ] = _direction.z;

				spotAnglesCos[ spotLength ] = Math.cos( light.angle );
				spotExponents[ spotLength ] = light.exponent;
M
Mr.doob 已提交
2726
				spotDecays[ spotLength ] = ( light.distance === 0 ) ? 0.0 : light.decay;
M
Mr.doob 已提交
2727 2728 2729 2730 2731 2732 2733 2734 2735

				spotLength += 1;

			} else if ( light instanceof THREE.HemisphereLight ) {

				hemiCount += 1;

				if ( ! light.visible ) continue;

2736
				_direction.setFromMatrixPosition( light.matrixWorld );
T
tschw 已提交
2737
				_direction.transformDirection( viewMatrix );
M
Mr.doob 已提交
2738 2739 2740

				hemiOffset = hemiLength * 3;

M
Mr.doob 已提交
2741
				hemiPositions[ hemiOffset + 0 ] = _direction.x;
M
Mr.doob 已提交
2742 2743 2744 2745 2746 2747
				hemiPositions[ hemiOffset + 1 ] = _direction.y;
				hemiPositions[ hemiOffset + 2 ] = _direction.z;

				skyColor = light.color;
				groundColor = light.groundColor;

2748 2749
				setColorLinear( hemiSkyColors, hemiOffset, skyColor, intensity );
				setColorLinear( hemiGroundColors, hemiOffset, groundColor, intensity );
M
Mr.doob 已提交
2750 2751 2752 2753 2754 2755 2756 2757 2758 2759 2760 2761 2762 2763 2764 2765 2766 2767 2768 2769 2770 2771 2772 2773 2774

				hemiLength += 1;

			}

		}

		// null eventual remains from removed lights
		// (this is to avoid if in shader)

		for ( l = dirLength * 3, ll = Math.max( dirColors.length, dirCount * 3 ); l < ll; l ++ ) dirColors[ l ] = 0.0;
		for ( l = pointLength * 3, ll = Math.max( pointColors.length, pointCount * 3 ); l < ll; l ++ ) pointColors[ l ] = 0.0;
		for ( l = spotLength * 3, ll = Math.max( spotColors.length, spotCount * 3 ); l < ll; l ++ ) spotColors[ l ] = 0.0;
		for ( l = hemiLength * 3, ll = Math.max( hemiSkyColors.length, hemiCount * 3 ); l < ll; l ++ ) hemiSkyColors[ l ] = 0.0;
		for ( l = hemiLength * 3, ll = Math.max( hemiGroundColors.length, hemiCount * 3 ); l < ll; l ++ ) hemiGroundColors[ l ] = 0.0;

		zlights.directional.length = dirLength;
		zlights.point.length = pointLength;
		zlights.spot.length = spotLength;
		zlights.hemi.length = hemiLength;

		zlights.ambient[ 0 ] = r;
		zlights.ambient[ 1 ] = g;
		zlights.ambient[ 2 ] = b;

M
Mr.doob 已提交
2775
	}
M
Mr.doob 已提交
2776 2777 2778 2779 2780 2781 2782

	// GL state setting

	this.setFaceCulling = function ( cullFace, frontFaceDirection ) {

		if ( cullFace === THREE.CullFaceNone ) {

2783
			state.disable( _gl.CULL_FACE );
M
Mr.doob 已提交
2784 2785 2786 2787 2788 2789 2790 2791 2792 2793 2794 2795 2796 2797 2798 2799 2800 2801 2802 2803 2804 2805 2806 2807 2808 2809 2810

		} else {

			if ( frontFaceDirection === THREE.FrontFaceDirectionCW ) {

				_gl.frontFace( _gl.CW );

			} else {

				_gl.frontFace( _gl.CCW );

			}

			if ( cullFace === THREE.CullFaceBack ) {

				_gl.cullFace( _gl.BACK );

			} else if ( cullFace === THREE.CullFaceFront ) {

				_gl.cullFace( _gl.FRONT );

			} else {

				_gl.cullFace( _gl.FRONT_AND_BACK );

			}

2811
			state.enable( _gl.CULL_FACE );
M
Mr.doob 已提交
2812 2813 2814 2815 2816 2817 2818 2819 2820

		}

	};

	// Textures

	function setTextureParameters ( textureType, texture, isImagePowerOfTwo ) {

2821 2822
		var extension;

M
Mr.doob 已提交
2823 2824 2825 2826 2827 2828 2829 2830 2831 2832 2833 2834
		if ( isImagePowerOfTwo ) {

			_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_S, paramThreeToGL( texture.wrapS ) );
			_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, paramThreeToGL( texture.wrapT ) );

			_gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, paramThreeToGL( texture.magFilter ) );
			_gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, paramThreeToGL( texture.minFilter ) );

		} else {

			_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_S, _gl.CLAMP_TO_EDGE );
			_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, _gl.CLAMP_TO_EDGE );
M
Mr.doob 已提交
2835 2836 2837

			if ( texture.wrapS !== THREE.ClampToEdgeWrapping || texture.wrapT !== THREE.ClampToEdgeWrapping ) {

2838
				console.warn( 'THREE.WebGLRenderer: Texture is not power of two. Texture.wrapS and Texture.wrapT should be set to THREE.ClampToEdgeWrapping. ( ' + texture.sourceFile + ' )' );
M
Mr.doob 已提交
2839

2840
			}
M
Mr.doob 已提交
2841 2842 2843 2844

			_gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, filterFallback( texture.magFilter ) );
			_gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, filterFallback( texture.minFilter ) );

M
Mr.doob 已提交
2845 2846
			if ( texture.minFilter !== THREE.NearestFilter && texture.minFilter !== THREE.LinearFilter ) {

2847
				console.warn( 'THREE.WebGLRenderer: Texture is not power of two. Texture.minFilter should be set to THREE.NearestFilter or THREE.LinearFilter. ( ' + texture.sourceFile + ' )' );
M
Mr.doob 已提交
2848

2849
			}
M
Mr.doob 已提交
2850

M
Mr.doob 已提交
2851 2852
		}

2853 2854
		extension = extensions.get( 'EXT_texture_filter_anisotropic' );

2855 2856 2857 2858 2859
		if ( extension ) {
			if ( texture.type === THREE.FloatType && !extensions.get( 'OES_texture_float_linear' ) ||
					texture.type === THREE.HalfFloatType && !extensions.get( 'OES_texture_half_float_linear' ) ) {
				return;
			}
M
Mr.doob 已提交
2860

2861
			if ( texture.anisotropy > 1 || properties.get( texture ).__currentAnisotropy ) {
M
Mr.doob 已提交
2862

2863
				_gl.texParameterf( textureType, extension.TEXTURE_MAX_ANISOTROPY_EXT, Math.min( texture.anisotropy, _this.getMaxAnisotropy() ) );
2864
				properties.get( texture ).__currentAnisotropy = texture.anisotropy;
M
Mr.doob 已提交
2865 2866 2867 2868 2869

			}

		}

M
Mr.doob 已提交
2870
	}
M
Mr.doob 已提交
2871

2872
	function uploadTexture( textureProperties, texture, slot ) {
2873

2874
		if ( textureProperties.__webglInit === undefined ) {
2875

2876
			textureProperties.__webglInit = true;
2877 2878 2879 2880 2881

			texture.__webglInit = true;

			texture.addEventListener( 'dispose', onTextureDispose );

2882
			textureProperties.__webglTexture = _gl.createTexture();
2883

2884
			_infoMemory.textures ++;
2885 2886

		}
M
Mr.doob 已提交
2887

B
Ben Adams 已提交
2888
		state.activeTexture( _gl.TEXTURE0 + slot );
2889
		state.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture );
M
Mr.doob 已提交
2890

H
Henri Astre 已提交
2891 2892 2893 2894
		_gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY );
		_gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha );
		_gl.pixelStorei( _gl.UNPACK_ALIGNMENT, texture.unpackAlignment );

2895 2896
		texture.image = clampToMaxSize( texture.image, _maxTextureSize );

H
Henri Astre 已提交
2897 2898 2899 2900
		var image = texture.image,
		isImagePowerOfTwo = THREE.Math.isPowerOfTwo( image.width ) && THREE.Math.isPowerOfTwo( image.height ),
		glFormat = paramThreeToGL( texture.format ),
		glType = paramThreeToGL( texture.type );
M
Mr.doob 已提交
2901

H
Henri Astre 已提交
2902
		setTextureParameters( _gl.TEXTURE_2D, texture, isImagePowerOfTwo );
M
Mr.doob 已提交
2903

H
Henri Astre 已提交
2904
		var mipmap, mipmaps = texture.mipmaps;
M
Mr.doob 已提交
2905

H
Henri Astre 已提交
2906
		if ( texture instanceof THREE.DataTexture ) {
M
Mr.doob 已提交
2907

H
Henri Astre 已提交
2908 2909 2910
			// use manually created mipmaps if available
			// if there are no manual mipmaps
			// set 0 level mipmap and then use GL to generate other mipmap levels
M
Mr.doob 已提交
2911

H
Henri Astre 已提交
2912 2913 2914
			if ( mipmaps.length > 0 && isImagePowerOfTwo ) {

				for ( var i = 0, il = mipmaps.length; i < il; i ++ ) {
M
Mr.doob 已提交
2915

H
Henri Astre 已提交
2916
					mipmap = mipmaps[ i ];
2917
					state.texImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );
M
Mr.doob 已提交
2918

H
Henri Astre 已提交
2919
				}
M
Mr.doob 已提交
2920

H
Henri Astre 已提交
2921
				texture.generateMipmaps = false;
M
Mr.doob 已提交
2922

H
Henri Astre 已提交
2923
			} else {
M
Mr.doob 已提交
2924

2925
				state.texImage2D( _gl.TEXTURE_2D, 0, glFormat, image.width, image.height, 0, glFormat, glType, image.data );
M
Mr.doob 已提交
2926

H
Henri Astre 已提交
2927
			}
M
Mr.doob 已提交
2928

H
Henri Astre 已提交
2929
		} else if ( texture instanceof THREE.CompressedTexture ) {
M
Mr.doob 已提交
2930

H
Henri Astre 已提交
2931
			for ( var i = 0, il = mipmaps.length; i < il; i ++ ) {
M
Mr.doob 已提交
2932

H
Henri Astre 已提交
2933
				mipmap = mipmaps[ i ];
M
Mr.doob 已提交
2934

2935
				if ( texture.format !== THREE.RGBAFormat && texture.format !== THREE.RGBFormat ) {
M
Mr.doob 已提交
2936

2937
					if ( state.getCompressedTextureFormats().indexOf( glFormat ) > - 1 ) {
M
Mr.doob 已提交
2938

2939
						state.compressedTexImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, mipmap.data );
M
Mr.doob 已提交
2940

2941
					} else {
M
Mr.doob 已提交
2942

2943
						console.warn( "THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()" );
M
Mr.doob 已提交
2944

2945
					}
M
Mr.doob 已提交
2946

H
Henri Astre 已提交
2947
				} else {
M
Mr.doob 已提交
2948

2949
					state.texImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );
M
Mr.doob 已提交
2950

M
Mr.doob 已提交
2951 2952
				}

H
Henri Astre 已提交
2953 2954
			}

G
gero3 已提交
2955 2956 2957
		} else {

			// regular Texture (image, video, canvas)
H
Henri Astre 已提交
2958 2959 2960 2961 2962 2963

			// use manually created mipmaps if available
			// if there are no manual mipmaps
			// set 0 level mipmap and then use GL to generate other mipmap levels

			if ( mipmaps.length > 0 && isImagePowerOfTwo ) {
M
Mr.doob 已提交
2964

2965
				for ( var i = 0, il = mipmaps.length; i < il; i ++ ) {
M
Mr.doob 已提交
2966 2967

					mipmap = mipmaps[ i ];
2968
					state.texImage2D( _gl.TEXTURE_2D, i, glFormat, glFormat, glType, mipmap );
M
Mr.doob 已提交
2969 2970 2971

				}

H
Henri Astre 已提交
2972
				texture.generateMipmaps = false;
M
Mr.doob 已提交
2973

H
Henri Astre 已提交
2974
			} else {
M
Mr.doob 已提交
2975

2976
				state.texImage2D( _gl.TEXTURE_2D, 0, glFormat, glFormat, glType, texture.image );
M
Mr.doob 已提交
2977

H
Henri Astre 已提交
2978
			}
M
Mr.doob 已提交
2979

H
Henri Astre 已提交
2980
		}
M
Mr.doob 已提交
2981

H
Henri Astre 已提交
2982
		if ( texture.generateMipmaps && isImagePowerOfTwo ) _gl.generateMipmap( _gl.TEXTURE_2D );
M
Mr.doob 已提交
2983

2984
		textureProperties.__version = texture.version;
M
Mr.doob 已提交
2985

B
Ben Adams 已提交
2986
		if ( texture.onUpdate ) texture.onUpdate( texture );
M
Mr.doob 已提交
2987

2988
	}
M
Mr.doob 已提交
2989

H
Henri Astre 已提交
2990
	this.setTexture = function ( texture, slot ) {
M
Mr.doob 已提交
2991

2992 2993 2994
		var textureProperties = properties.get( texture );

		if ( texture.version > 0 && textureProperties.__version !== texture.version ) {
M
Mr.doob 已提交
2995

2996
			var image = texture.image;
M
Mr.doob 已提交
2997

2998 2999
			if ( image === undefined ) {

3000
				console.warn( 'THREE.WebGLRenderer: Texture marked for update but image is undefined', texture );
3001 3002 3003 3004
				return;

			}

3005
			if ( image.complete === false ) {
M
Mr.doob 已提交
3006

3007
				console.warn( 'THREE.WebGLRenderer: Texture marked for update but image is incomplete', texture );
3008 3009 3010 3011
				return;

			}

3012
			uploadTexture( textureProperties, texture, slot );
3013
			return;
M
Mr.doob 已提交
3014 3015 3016

		}

B
Ben Adams 已提交
3017
		state.activeTexture( _gl.TEXTURE0 + slot );
3018
		state.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture );
3019

M
Mr.doob 已提交
3020 3021 3022 3023
	};

	function clampToMaxSize ( image, maxSize ) {

3024
		if ( image.width > maxSize || image.height > maxSize ) {
M
Mr.doob 已提交
3025

3026 3027
			// Warning: Scaling through the canvas will only work with images that use
			// premultiplied alpha.
M
Mr.doob 已提交
3028

3029
			var scale = maxSize / Math.max( image.width, image.height );
M
Mr.doob 已提交
3030

3031 3032 3033
			var canvas = document.createElement( 'canvas' );
			canvas.width = Math.floor( image.width * scale );
			canvas.height = Math.floor( image.height * scale );
M
Mr.doob 已提交
3034

3035 3036
			var context = canvas.getContext( '2d' );
			context.drawImage( image, 0, 0, image.width, image.height, 0, 0, canvas.width, canvas.height );
M
Mr.doob 已提交
3037

3038
			console.warn( 'THREE.WebGLRenderer: image is too big (' + image.width + 'x' + image.height + '). Resized to ' + canvas.width + 'x' + canvas.height, image );
M
Mr.doob 已提交
3039

3040 3041 3042
			return canvas;

		}
M
Mr.doob 已提交
3043

3044
		return image;
M
Mr.doob 已提交
3045 3046 3047 3048 3049

	}

	function setCubeTexture ( texture, slot ) {

3050
		var textureProperties = properties.get( texture );
3051

M
Mr.doob 已提交
3052 3053
		if ( texture.image.length === 6 ) {

3054
			if ( texture.version > 0 && textureProperties.__version !== texture.version ) {
M
Mr.doob 已提交
3055

3056
				if ( ! textureProperties.__image__webglTextureCube ) {
M
Mr.doob 已提交
3057

3058 3059
					texture.addEventListener( 'dispose', onTextureDispose );

3060
					textureProperties.__image__webglTextureCube = _gl.createTexture();
M
Mr.doob 已提交
3061

3062
					_infoMemory.textures ++;
M
Mr.doob 已提交
3063 3064 3065

				}

B
Ben Adams 已提交
3066
				state.activeTexture( _gl.TEXTURE0 + slot );
3067
				state.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__image__webglTextureCube );
M
Mr.doob 已提交
3068 3069 3070

				_gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY );

M
Mr.doob 已提交
3071 3072
				var isCompressed = texture instanceof THREE.CompressedTexture;
				var isDataTexture = texture.image[ 0 ] instanceof THREE.DataTexture;
M
Mr.doob 已提交
3073 3074 3075 3076 3077

				var cubeImage = [];

				for ( var i = 0; i < 6; i ++ ) {

3078
					if ( _this.autoScaleCubemaps && ! isCompressed && ! isDataTexture ) {
M
Mr.doob 已提交
3079 3080 3081 3082 3083

						cubeImage[ i ] = clampToMaxSize( texture.image[ i ], _maxCubemapSize );

					} else {

3084
						cubeImage[ i ] = isDataTexture ? texture.image[ i ].image : texture.image[ i ];
M
Mr.doob 已提交
3085 3086 3087 3088 3089 3090

					}

				}

				var image = cubeImage[ 0 ],
3091
				isImagePowerOfTwo = THREE.Math.isPowerOfTwo( image.width ) && THREE.Math.isPowerOfTwo( image.height ),
M
Mr.doob 已提交
3092 3093 3094 3095 3096 3097 3098
				glFormat = paramThreeToGL( texture.format ),
				glType = paramThreeToGL( texture.type );

				setTextureParameters( _gl.TEXTURE_CUBE_MAP, texture, isImagePowerOfTwo );

				for ( var i = 0; i < 6; i ++ ) {

3099
					if ( ! isCompressed ) {
M
Mr.doob 已提交
3100

M
Mr.doob 已提交
3101
						if ( isDataTexture ) {
3102

3103
							state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glFormat, cubeImage[ i ].width, cubeImage[ i ].height, 0, glFormat, glType, cubeImage[ i ].data );
3104

M
Mr.doob 已提交
3105
						} else {
3106

3107
							state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glFormat, glFormat, glType, cubeImage[ i ] );
3108

M
Mr.doob 已提交
3109 3110
						}

3111
					} else {
3112

M
Mr.doob 已提交
3113 3114
						var mipmap, mipmaps = cubeImage[ i ].mipmaps;

3115
						for ( var j = 0, jl = mipmaps.length; j < jl; j ++ ) {
M
Mr.doob 已提交
3116 3117

							mipmap = mipmaps[ j ];
M
Mr.doob 已提交
3118

3119
							if ( texture.format !== THREE.RGBAFormat && texture.format !== THREE.RGBFormat ) {
M
Mr.doob 已提交
3120

3121
								if ( state.getCompressedTextureFormats().indexOf( glFormat ) > - 1 ) {
M
Mr.doob 已提交
3122

3123
									state.compressedTexImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glFormat, mipmap.width, mipmap.height, 0, mipmap.data );
M
Mr.doob 已提交
3124

3125
								} else {
M
Mr.doob 已提交
3126

3127
									console.warn( "THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setCubeTexture()" );
M
Mr.doob 已提交
3128

3129
								}
M
Mr.doob 已提交
3130

3131
							} else {
M
Mr.doob 已提交
3132

3133
								state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );
M
Mr.doob 已提交
3134

3135
							}
M
Mr.doob 已提交
3136

3137
						}
M
Mr.doob 已提交
3138

M
Mr.doob 已提交
3139
					}
M
Mr.doob 已提交
3140

M
Mr.doob 已提交
3141 3142 3143 3144 3145 3146 3147 3148
				}

				if ( texture.generateMipmaps && isImagePowerOfTwo ) {

					_gl.generateMipmap( _gl.TEXTURE_CUBE_MAP );

				}

3149
				textureProperties.__version = texture.version;
M
Mr.doob 已提交
3150

B
Ben Adams 已提交
3151
				if ( texture.onUpdate ) texture.onUpdate( texture );
M
Mr.doob 已提交
3152 3153 3154

			} else {

B
Ben Adams 已提交
3155
				state.activeTexture( _gl.TEXTURE0 + slot );
3156
				state.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__image__webglTextureCube );
M
Mr.doob 已提交
3157 3158 3159 3160 3161

			}

		}

M
Mr.doob 已提交
3162
	}
M
Mr.doob 已提交
3163 3164 3165

	function setCubeTextureDynamic ( texture, slot ) {

B
Ben Adams 已提交
3166
		state.activeTexture( _gl.TEXTURE0 + slot );
3167
		state.bindTexture( _gl.TEXTURE_CUBE_MAP, properties.get( texture ).__webglTexture );
M
Mr.doob 已提交
3168

M
Mr.doob 已提交
3169
	}
M
Mr.doob 已提交
3170 3171 3172 3173 3174 3175

	// Render targets

	function setupFrameBuffer ( framebuffer, renderTarget, textureTarget ) {

		_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );
3176
		_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, textureTarget, properties.get( renderTarget ).__webglTexture, 0 );
M
Mr.doob 已提交
3177

M
Mr.doob 已提交
3178
	}
M
Mr.doob 已提交
3179

M
Mr.doob 已提交
3180
	function setupRenderBuffer ( renderbuffer, renderTarget ) {
M
Mr.doob 已提交
3181 3182 3183 3184 3185 3186 3187 3188 3189

		_gl.bindRenderbuffer( _gl.RENDERBUFFER, renderbuffer );

		if ( renderTarget.depthBuffer && ! renderTarget.stencilBuffer ) {

			_gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_COMPONENT16, renderTarget.width, renderTarget.height );
			_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer );

		/* For some reason this is not working. Defaulting to RGBA4.
3190
		} else if ( ! renderTarget.depthBuffer && renderTarget.stencilBuffer ) {
M
Mr.doob 已提交
3191 3192 3193 3194

			_gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.STENCIL_INDEX8, renderTarget.width, renderTarget.height );
			_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.STENCIL_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer );
		*/
G
gero3 已提交
3195

M
Mr.doob 已提交
3196 3197 3198 3199 3200 3201 3202 3203 3204 3205 3206
		} else if ( renderTarget.depthBuffer && renderTarget.stencilBuffer ) {

			_gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_STENCIL, renderTarget.width, renderTarget.height );
			_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer );

		} else {

			_gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.RGBA4, renderTarget.width, renderTarget.height );

		}

M
Mr.doob 已提交
3207
	}
M
Mr.doob 已提交
3208 3209 3210 3211 3212

	this.setRenderTarget = function ( renderTarget ) {

		var isCube = ( renderTarget instanceof THREE.WebGLRenderTargetCube );

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

3215
			var renderTargetProperties = properties.get( renderTarget );
M
Mr.doob 已提交
3216 3217 3218 3219 3220 3221

			if ( renderTarget.depthBuffer === undefined ) renderTarget.depthBuffer = true;
			if ( renderTarget.stencilBuffer === undefined ) renderTarget.stencilBuffer = true;

			renderTarget.addEventListener( 'dispose', onRenderTargetDispose );

3222
			renderTargetProperties.__webglTexture = _gl.createTexture();
M
Mr.doob 已提交
3223

3224
			_infoMemory.textures ++;
M
Mr.doob 已提交
3225 3226 3227

			// Setup texture, create render and frame buffers

3228
			var isTargetPowerOfTwo = THREE.Math.isPowerOfTwo( renderTarget.width ) && THREE.Math.isPowerOfTwo( renderTarget.height ),
M
Mr.doob 已提交
3229 3230 3231 3232 3233
				glFormat = paramThreeToGL( renderTarget.format ),
				glType = paramThreeToGL( renderTarget.type );

			if ( isCube ) {

3234 3235
				renderTargetProperties.__webglFramebuffer = [];
				renderTargetProperties.__webglRenderbuffer = [];
M
Mr.doob 已提交
3236

3237
				state.bindTexture( _gl.TEXTURE_CUBE_MAP, renderTargetProperties.__webglTexture );
B
Ben Adams 已提交
3238

M
Mr.doob 已提交
3239 3240 3241 3242
				setTextureParameters( _gl.TEXTURE_CUBE_MAP, renderTarget, isTargetPowerOfTwo );

				for ( var i = 0; i < 6; i ++ ) {

3243 3244
					renderTargetProperties.__webglFramebuffer[ i ] = _gl.createFramebuffer();
					renderTargetProperties.__webglRenderbuffer[ i ] = _gl.createRenderbuffer();
M
Mr.doob 已提交
3245

3246
					state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glFormat, renderTarget.width, renderTarget.height, 0, glFormat, glType, null );
M
Mr.doob 已提交
3247

3248 3249
					setupFrameBuffer( renderTargetProperties.__webglFramebuffer[ i ], renderTarget, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i );
					setupRenderBuffer( renderTargetProperties.__webglRenderbuffer[ i ], renderTarget );
M
Mr.doob 已提交
3250 3251 3252

				}

3253
				if ( renderTarget.generateMipmaps && isTargetPowerOfTwo ) _gl.generateMipmap( _gl.TEXTURE_CUBE_MAP );
M
Mr.doob 已提交
3254 3255 3256

			} else {

3257
				renderTargetProperties.__webglFramebuffer = _gl.createFramebuffer();
M
Mr.doob 已提交
3258 3259 3260

				if ( renderTarget.shareDepthFrom ) {

3261
					renderTargetProperties.__webglRenderbuffer = renderTarget.shareDepthFrom.__webglRenderbuffer;
M
Mr.doob 已提交
3262 3263 3264

				} else {

3265
					renderTargetProperties.__webglRenderbuffer = _gl.createRenderbuffer();
M
Mr.doob 已提交
3266 3267 3268

				}

3269
				state.bindTexture( _gl.TEXTURE_2D, renderTargetProperties.__webglTexture );
M
Mr.doob 已提交
3270 3271
				setTextureParameters( _gl.TEXTURE_2D, renderTarget, isTargetPowerOfTwo );

3272
				state.texImage2D( _gl.TEXTURE_2D, 0, glFormat, renderTarget.width, renderTarget.height, 0, glFormat, glType, null );
M
Mr.doob 已提交
3273

3274
				setupFrameBuffer( renderTargetProperties.__webglFramebuffer, renderTarget, _gl.TEXTURE_2D );
M
Mr.doob 已提交
3275 3276 3277 3278 3279

				if ( renderTarget.shareDepthFrom ) {

					if ( renderTarget.depthBuffer && ! renderTarget.stencilBuffer ) {

3280
						_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.RENDERBUFFER, renderTargetProperties.__webglRenderbuffer );
M
Mr.doob 已提交
3281 3282 3283

					} else if ( renderTarget.depthBuffer && renderTarget.stencilBuffer ) {

3284
						_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.RENDERBUFFER, renderTargetProperties.__webglRenderbuffer );
M
Mr.doob 已提交
3285 3286 3287 3288 3289

					}

				} else {

3290
					setupRenderBuffer( renderTargetProperties.__webglRenderbuffer, renderTarget );
M
Mr.doob 已提交
3291 3292 3293

				}

3294
				if ( renderTarget.generateMipmaps && isTargetPowerOfTwo ) _gl.generateMipmap( _gl.TEXTURE_2D );
M
Mr.doob 已提交
3295 3296 3297 3298 3299 3300 3301

			}

			// Release everything

			if ( isCube ) {

B
Ben Adams 已提交
3302
				state.bindTexture( _gl.TEXTURE_CUBE_MAP, null );
M
Mr.doob 已提交
3303 3304 3305

			} else {

B
Ben Adams 已提交
3306
				state.bindTexture( _gl.TEXTURE_2D, null );
M
Mr.doob 已提交
3307 3308 3309 3310 3311 3312 3313 3314 3315 3316 3317 3318

			}

			_gl.bindRenderbuffer( _gl.RENDERBUFFER, null );
			_gl.bindFramebuffer( _gl.FRAMEBUFFER, null );

		}

		var framebuffer, width, height, vx, vy;

		if ( renderTarget ) {

3319
			var renderTargetProperties = properties.get( renderTarget );
F
Fordy 已提交
3320

M
Mr.doob 已提交
3321 3322
			if ( isCube ) {

3323
				framebuffer = renderTargetProperties.__webglFramebuffer[ renderTarget.activeCubeFace ];
M
Mr.doob 已提交
3324 3325 3326

			} else {

3327
				framebuffer = renderTargetProperties.__webglFramebuffer;
M
Mr.doob 已提交
3328 3329 3330 3331 3332 3333 3334 3335 3336 3337 3338 3339 3340 3341 3342 3343 3344 3345 3346 3347 3348 3349 3350 3351 3352 3353 3354 3355 3356 3357 3358 3359 3360 3361 3362

			}

			width = renderTarget.width;
			height = renderTarget.height;

			vx = 0;
			vy = 0;

		} else {

			framebuffer = null;

			width = _viewportWidth;
			height = _viewportHeight;

			vx = _viewportX;
			vy = _viewportY;

		}

		if ( framebuffer !== _currentFramebuffer ) {

			_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );
			_gl.viewport( vx, vy, width, height );

			_currentFramebuffer = framebuffer;

		}

		_currentWidth = width;
		_currentHeight = height;

	};

3363
	this.readRenderTargetPixels = function( renderTarget, x, y, width, height, buffer ) {
3364

G
gero3 已提交
3365
		if ( ! ( renderTarget instanceof THREE.WebGLRenderTarget ) ) {
3366

3367
			console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.' );
G
gero3 已提交
3368
			return;
3369

G
gero3 已提交
3370
		}
3371

3372
		if ( properties.get( renderTarget ).__webglFramebuffer ) {
3373

G
gero3 已提交
3374
			if ( renderTarget.format !== THREE.RGBAFormat ) {
3375

3376
				console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA format. readPixels can read only RGBA format.' );
G
gero3 已提交
3377
				return;
3378

G
gero3 已提交
3379
			}
3380

G
gero3 已提交
3381
			var restore = false;
3382

3383
			if ( properties.get( renderTarget ).__webglFramebuffer !== _currentFramebuffer ) {
3384

3385
				_gl.bindFramebuffer( _gl.FRAMEBUFFER, properties.get( renderTarget ).__webglFramebuffer );
3386

G
gero3 已提交
3387
				restore = true;
3388

G
gero3 已提交
3389
			}
3390

G
gero3 已提交
3391
			if ( _gl.checkFramebufferStatus( _gl.FRAMEBUFFER ) === _gl.FRAMEBUFFER_COMPLETE ) {
3392

G
gero3 已提交
3393
				_gl.readPixels( x, y, width, height, _gl.RGBA, _gl.UNSIGNED_BYTE, buffer );
3394

G
gero3 已提交
3395
			} else {
3396

3397
				console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete.' );
3398

G
gero3 已提交
3399
			}
3400

G
gero3 已提交
3401
			if ( restore ) {
3402

G
gero3 已提交
3403
				_gl.bindFramebuffer( _gl.FRAMEBUFFER, _currentFramebuffer );
3404

G
gero3 已提交
3405
			}
3406

G
gero3 已提交
3407
		}
3408 3409 3410

	};

M
Mr.doob 已提交
3411 3412 3413 3414
	function updateRenderTargetMipmap ( renderTarget ) {

		if ( renderTarget instanceof THREE.WebGLRenderTargetCube ) {

3415
			state.bindTexture( _gl.TEXTURE_CUBE_MAP, properties.get( renderTarget ).__webglTexture );
M
Mr.doob 已提交
3416
			_gl.generateMipmap( _gl.TEXTURE_CUBE_MAP );
B
Ben Adams 已提交
3417
			state.bindTexture( _gl.TEXTURE_CUBE_MAP, null );
M
Mr.doob 已提交
3418 3419 3420

		} else {

3421
			state.bindTexture( _gl.TEXTURE_2D, properties.get( renderTarget ).__webglTexture );
M
Mr.doob 已提交
3422
			_gl.generateMipmap( _gl.TEXTURE_2D );
B
Ben Adams 已提交
3423
			state.bindTexture( _gl.TEXTURE_2D, null );
M
Mr.doob 已提交
3424 3425 3426

		}

M
Mr.doob 已提交
3427
	}
M
Mr.doob 已提交
3428 3429 3430 3431 3432 3433 3434 3435 3436 3437 3438 3439 3440

	// Fallback filters for non-power-of-2 textures

	function filterFallback ( f ) {

		if ( f === THREE.NearestFilter || f === THREE.NearestMipMapNearestFilter || f === THREE.NearestMipMapLinearFilter ) {

			return _gl.NEAREST;

		}

		return _gl.LINEAR;

M
Mr.doob 已提交
3441
	}
M
Mr.doob 已提交
3442 3443 3444 3445 3446

	// Map three.js constants to WebGL constants

	function paramThreeToGL ( p ) {

3447 3448
		var extension;

M
Mr.doob 已提交
3449 3450 3451 3452 3453 3454 3455 3456 3457 3458 3459 3460 3461 3462 3463 3464 3465 3466 3467 3468 3469 3470 3471 3472
		if ( p === THREE.RepeatWrapping ) return _gl.REPEAT;
		if ( p === THREE.ClampToEdgeWrapping ) return _gl.CLAMP_TO_EDGE;
		if ( p === THREE.MirroredRepeatWrapping ) return _gl.MIRRORED_REPEAT;

		if ( p === THREE.NearestFilter ) return _gl.NEAREST;
		if ( p === THREE.NearestMipMapNearestFilter ) return _gl.NEAREST_MIPMAP_NEAREST;
		if ( p === THREE.NearestMipMapLinearFilter ) return _gl.NEAREST_MIPMAP_LINEAR;

		if ( p === THREE.LinearFilter ) return _gl.LINEAR;
		if ( p === THREE.LinearMipMapNearestFilter ) return _gl.LINEAR_MIPMAP_NEAREST;
		if ( p === THREE.LinearMipMapLinearFilter ) return _gl.LINEAR_MIPMAP_LINEAR;

		if ( p === THREE.UnsignedByteType ) return _gl.UNSIGNED_BYTE;
		if ( p === THREE.UnsignedShort4444Type ) return _gl.UNSIGNED_SHORT_4_4_4_4;
		if ( p === THREE.UnsignedShort5551Type ) return _gl.UNSIGNED_SHORT_5_5_5_1;
		if ( p === THREE.UnsignedShort565Type ) return _gl.UNSIGNED_SHORT_5_6_5;

		if ( p === THREE.ByteType ) return _gl.BYTE;
		if ( p === THREE.ShortType ) return _gl.SHORT;
		if ( p === THREE.UnsignedShortType ) return _gl.UNSIGNED_SHORT;
		if ( p === THREE.IntType ) return _gl.INT;
		if ( p === THREE.UnsignedIntType ) return _gl.UNSIGNED_INT;
		if ( p === THREE.FloatType ) return _gl.FLOAT;

3473 3474 3475 3476 3477 3478 3479 3480
		extension = extensions.get( 'OES_texture_half_float' );

		if ( extension !== null ) {

			if ( p === THREE.HalfFloatType ) return extension.HALF_FLOAT_OES;

		}

M
Mr.doob 已提交
3481 3482 3483 3484 3485 3486 3487 3488 3489 3490 3491 3492 3493 3494 3495 3496 3497 3498 3499 3500 3501 3502 3503
		if ( p === THREE.AlphaFormat ) return _gl.ALPHA;
		if ( p === THREE.RGBFormat ) return _gl.RGB;
		if ( p === THREE.RGBAFormat ) return _gl.RGBA;
		if ( p === THREE.LuminanceFormat ) return _gl.LUMINANCE;
		if ( p === THREE.LuminanceAlphaFormat ) return _gl.LUMINANCE_ALPHA;

		if ( p === THREE.AddEquation ) return _gl.FUNC_ADD;
		if ( p === THREE.SubtractEquation ) return _gl.FUNC_SUBTRACT;
		if ( p === THREE.ReverseSubtractEquation ) return _gl.FUNC_REVERSE_SUBTRACT;

		if ( p === THREE.ZeroFactor ) return _gl.ZERO;
		if ( p === THREE.OneFactor ) return _gl.ONE;
		if ( p === THREE.SrcColorFactor ) return _gl.SRC_COLOR;
		if ( p === THREE.OneMinusSrcColorFactor ) return _gl.ONE_MINUS_SRC_COLOR;
		if ( p === THREE.SrcAlphaFactor ) return _gl.SRC_ALPHA;
		if ( p === THREE.OneMinusSrcAlphaFactor ) return _gl.ONE_MINUS_SRC_ALPHA;
		if ( p === THREE.DstAlphaFactor ) return _gl.DST_ALPHA;
		if ( p === THREE.OneMinusDstAlphaFactor ) return _gl.ONE_MINUS_DST_ALPHA;

		if ( p === THREE.DstColorFactor ) return _gl.DST_COLOR;
		if ( p === THREE.OneMinusDstColorFactor ) return _gl.ONE_MINUS_DST_COLOR;
		if ( p === THREE.SrcAlphaSaturateFactor ) return _gl.SRC_ALPHA_SATURATE;

3504
		extension = extensions.get( 'WEBGL_compressed_texture_s3tc' );
M
Mr.doob 已提交
3505

3506 3507 3508 3509 3510 3511
		if ( extension !== null ) {

			if ( p === THREE.RGB_S3TC_DXT1_Format ) return extension.COMPRESSED_RGB_S3TC_DXT1_EXT;
			if ( p === THREE.RGBA_S3TC_DXT1_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT1_EXT;
			if ( p === THREE.RGBA_S3TC_DXT3_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT3_EXT;
			if ( p === THREE.RGBA_S3TC_DXT5_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT5_EXT;
M
Mr.doob 已提交
3512 3513 3514

		}

3515 3516 3517
		extension = extensions.get( 'WEBGL_compressed_texture_pvrtc' );

		if ( extension !== null ) {
P
Pierre Lepers 已提交
3518

3519 3520 3521 3522
			if ( p === THREE.RGB_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;
			if ( p === THREE.RGB_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;
			if ( p === THREE.RGBA_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;
			if ( p === THREE.RGBA_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG;
P
Pierre Lepers 已提交
3523 3524 3525

		}

3526 3527 3528
		extension = extensions.get( 'EXT_blend_minmax' );

		if ( extension !== null ) {
3529

3530 3531
			if ( p === THREE.MinEquation ) return extension.MIN_EXT;
			if ( p === THREE.MaxEquation ) return extension.MAX_EXT;
3532 3533 3534

		}

M
Mr.doob 已提交
3535 3536
		return 0;

M
Mr.doob 已提交
3537
	}
M
Mr.doob 已提交
3538 3539 3540 3541 3542

	// Allocations

	function allocateBones ( object ) {

3543
		if ( _supportsBoneTextures && object && object.skeleton && object.skeleton.useVertexTexture ) {
M
Mr.doob 已提交
3544 3545 3546 3547 3548 3549

			return 1024;

		} else {

			// default for when object is not specified
M
Mr.doob 已提交
3550
			// ( for example when prebuilding shader to be used with multiple objects )
M
Mr.doob 已提交
3551
			//
3552
			//  - leave some extra space for other uniforms
M
Mr.doob 已提交
3553 3554 3555 3556 3557 3558 3559 3560 3561 3562
			//  - limit here is ANGLE's 254 max uniform vectors
			//    (up to 54 should be safe)

			var nVertexUniforms = _gl.getParameter( _gl.MAX_VERTEX_UNIFORM_VECTORS );
			var nVertexMatrices = Math.floor( ( nVertexUniforms - 20 ) / 4 );

			var maxBones = nVertexMatrices;

			if ( object !== undefined && object instanceof THREE.SkinnedMesh ) {

3563
				maxBones = Math.min( object.skeleton.bones.length, maxBones );
M
Mr.doob 已提交
3564

3565
				if ( maxBones < object.skeleton.bones.length ) {
M
Mr.doob 已提交
3566

3567
					console.warn( 'WebGLRenderer: too many bones - ' + object.skeleton.bones.length + ', this GPU supports just ' + maxBones + ' (try OpenGL instead of ANGLE)' );
M
Mr.doob 已提交
3568 3569 3570 3571 3572 3573 3574 3575 3576

				}

			}

			return maxBones;

		}

M
Mr.doob 已提交
3577
	}
M
Mr.doob 已提交
3578

M
Mr.doob 已提交
3579
	function allocateLights( lights ) {
M
Mr.doob 已提交
3580

M
Mr.doob 已提交
3581 3582 3583 3584
		var dirLights = 0;
		var pointLights = 0;
		var spotLights = 0;
		var hemiLights = 0;
M
Mr.doob 已提交
3585

M
Mr.doob 已提交
3586
		for ( var l = 0, ll = lights.length; l < ll; l ++ ) {
M
Mr.doob 已提交
3587

M
Mr.doob 已提交
3588
			var light = lights[ l ];
M
Mr.doob 已提交
3589

3590
			if ( light.onlyShadow || light.visible === false ) continue;
M
Mr.doob 已提交
3591 3592 3593 3594 3595 3596 3597 3598

			if ( light instanceof THREE.DirectionalLight ) dirLights ++;
			if ( light instanceof THREE.PointLight ) pointLights ++;
			if ( light instanceof THREE.SpotLight ) spotLights ++;
			if ( light instanceof THREE.HemisphereLight ) hemiLights ++;

		}

3599
		return { 'directional': dirLights, 'point': pointLights, 'spot': spotLights, 'hemi': hemiLights };
M
Mr.doob 已提交
3600

M
Mr.doob 已提交
3601
	}
M
Mr.doob 已提交
3602

M
Mr.doob 已提交
3603
	function allocateShadows( lights ) {
M
Mr.doob 已提交
3604

M
Mr.doob 已提交
3605
		var maxShadows = 0;
M
Mr.doob 已提交
3606

3607
		for ( var l = 0, ll = lights.length; l < ll; l ++ ) {
M
Mr.doob 已提交
3608

M
Mr.doob 已提交
3609
			var light = lights[ l ];
M
Mr.doob 已提交
3610 3611 3612 3613

			if ( ! light.castShadow ) continue;

			if ( light instanceof THREE.SpotLight ) maxShadows ++;
3614
			if ( light instanceof THREE.DirectionalLight ) maxShadows ++;
M
Mr.doob 已提交
3615 3616 3617 3618 3619

		}

		return maxShadows;

3620
	}
M
Mr.doob 已提交
3621

M
Mr.doob 已提交
3622
	// DEPRECATED
3623

3624 3625 3626 3627 3628 3629 3630 3631 3632 3633 3634 3635 3636 3637 3638 3639 3640 3641 3642 3643 3644 3645 3646 3647 3648 3649 3650 3651 3652 3653 3654 3655 3656 3657 3658 3659 3660 3661 3662 3663 3664 3665
	this.supportsFloatTextures = function () {

		console.warn( 'THREE.WebGLRenderer: .supportsFloatTextures() is now .extensions.get( \'OES_texture_float\' ).' );
		return extensions.get( 'OES_texture_float' );

	};

	this.supportsHalfFloatTextures = function () {

		console.warn( 'THREE.WebGLRenderer: .supportsHalfFloatTextures() is now .extensions.get( \'OES_texture_half_float\' ).' );
		return extensions.get( 'OES_texture_half_float' );

	};

	this.supportsStandardDerivatives = function () {

		console.warn( 'THREE.WebGLRenderer: .supportsStandardDerivatives() is now .extensions.get( \'OES_standard_derivatives\' ).' );
		return extensions.get( 'OES_standard_derivatives' );

	};

	this.supportsCompressedTextureS3TC = function () {

		console.warn( 'THREE.WebGLRenderer: .supportsCompressedTextureS3TC() is now .extensions.get( \'WEBGL_compressed_texture_s3tc\' ).' );
		return extensions.get( 'WEBGL_compressed_texture_s3tc' );

	};

	this.supportsCompressedTexturePVRTC = function () {

		console.warn( 'THREE.WebGLRenderer: .supportsCompressedTexturePVRTC() is now .extensions.get( \'WEBGL_compressed_texture_pvrtc\' ).' );
		return extensions.get( 'WEBGL_compressed_texture_pvrtc' );

	};

	this.supportsBlendMinMax = function () {

		console.warn( 'THREE.WebGLRenderer: .supportsBlendMinMax() is now .extensions.get( \'EXT_blend_minmax\' ).' );
		return extensions.get( 'EXT_blend_minmax' );

	};

M
Mr.doob 已提交
3666 3667
	this.initMaterial = function () {

3668
		console.warn( 'THREE.WebGLRenderer: .initMaterial() has been removed.' );
M
Mr.doob 已提交
3669 3670

	};
M
Mr.doob 已提交
3671

M
Mr.doob 已提交
3672
	this.addPrePlugin = function () {
M
Mr.doob 已提交
3673

3674
		console.warn( 'THREE.WebGLRenderer: .addPrePlugin() has been removed.' );
M
Mr.doob 已提交
3675 3676 3677 3678 3679

	};

	this.addPostPlugin = function () {

3680
		console.warn( 'THREE.WebGLRenderer: .addPostPlugin() has been removed.' );
M
Mr.doob 已提交
3681 3682

	};
M
Mr.doob 已提交
3683

M
Mr.doob 已提交
3684 3685
	this.updateShadowMap = function () {

3686
		console.warn( 'THREE.WebGLRenderer: .updateShadowMap() has been removed.' );
M
Mr.doob 已提交
3687 3688 3689

	};

3690 3691 3692
	Object.defineProperties( this, {
		shadowMapEnabled: {
			get: function () {
G
gero3 已提交
3693

M
Mr.doob 已提交
3694
				return shadowMap.enabled;
G
gero3 已提交
3695

3696 3697
			},
			set: function ( value ) {
G
gero3 已提交
3698

3699
				console.warn( 'THREE.WebGLRenderer: .shadowMapEnabled is now .shadowMap.enabled.' );
M
Mr.doob 已提交
3700
				shadowMap.enabled = value;
G
gero3 已提交
3701

3702 3703 3704 3705
			}
		},
		shadowMapType: {
			get: function () {
G
gero3 已提交
3706

M
Mr.doob 已提交
3707
				return shadowMap.type;
G
gero3 已提交
3708

3709 3710
			},
			set: function ( value ) {
G
gero3 已提交
3711

3712
				console.warn( 'THREE.WebGLRenderer: .shadowMapType is now .shadowMap.type.' );
M
Mr.doob 已提交
3713
				shadowMap.type = value;
G
gero3 已提交
3714

3715 3716 3717 3718
			}
		},
		shadowMapCullFace: {
			get: function () {
G
gero3 已提交
3719

M
Mr.doob 已提交
3720
				return shadowMap.cullFace;
G
gero3 已提交
3721

3722 3723
			},
			set: function ( value ) {
G
gero3 已提交
3724

3725
				console.warn( 'THREE.WebGLRenderer: .shadowMapCullFace is now .shadowMap.cullFace.' );
M
Mr.doob 已提交
3726
				shadowMap.cullFace = value;
G
gero3 已提交
3727

3728 3729 3730 3731
			}
		},
		shadowMapDebug: {
			get: function () {
G
gero3 已提交
3732

M
Mr.doob 已提交
3733
				return shadowMap.debug;
G
gero3 已提交
3734

3735 3736
			},
			set: function ( value ) {
G
gero3 已提交
3737

3738
				console.warn( 'THREE.WebGLRenderer: .shadowMapDebug is now .shadowMap.debug.' );
M
Mr.doob 已提交
3739
				shadowMap.debug = value;
G
gero3 已提交
3740

3741 3742 3743 3744
			}
		}
	} );

M
Mr.doob 已提交
3745
};