WebGLRenderer.js 61.5 KB
Newer Older
1
import { REVISION, MaxEquation, MinEquation, RGB_ETC1_Format, RGBA_PVRTC_2BPPV1_Format, RGBA_PVRTC_4BPPV1_Format, RGB_PVRTC_2BPPV1_Format, RGB_PVRTC_4BPPV1_Format, RGBA_S3TC_DXT5_Format, RGBA_S3TC_DXT3_Format, RGBA_S3TC_DXT1_Format, RGB_S3TC_DXT1_Format, SrcAlphaSaturateFactor, OneMinusDstColorFactor, DstColorFactor, OneMinusDstAlphaFactor, DstAlphaFactor, OneMinusSrcAlphaFactor, SrcAlphaFactor, OneMinusSrcColorFactor, SrcColorFactor, OneFactor, ZeroFactor, ReverseSubtractEquation, SubtractEquation, AddEquation, DepthFormat, DepthStencilFormat, LuminanceAlphaFormat, LuminanceFormat, RGBAFormat, RGBFormat, AlphaFormat, HalfFloatType, FloatType, UnsignedIntType, IntType, UnsignedShortType, ShortType, ByteType, UnsignedInt248Type, UnsignedShort565Type, UnsignedShort5551Type, UnsignedShort4444Type, UnsignedByteType, LinearMipMapLinearFilter, LinearMipMapNearestFilter, LinearFilter, NearestMipMapLinearFilter, NearestMipMapNearestFilter, NearestFilter, MirroredRepeatWrapping, ClampToEdgeWrapping, RepeatWrapping, FrontFaceDirectionCW, NoBlending, TriangleFanDrawMode, TriangleStripDrawMode, TrianglesDrawMode, NoColors, LinearToneMapping } from '../constants';
2
import { _Math } from '../math/Math';
R
Rich Harris 已提交
3
import { Matrix4 } from '../math/Matrix4';
4
import { DataTexture } from '../textures/DataTexture';
R
Rich Harris 已提交
5
import { WebGLUniforms } from './webgl/WebGLUniforms';
M
Mr.doob 已提交
6
import { UniformsLib } from './shaders/UniformsLib';
7
import { UniformsUtils } from './shaders/UniformsUtils';
R
Rich Harris 已提交
8 9 10 11
import { ShaderLib } from './shaders/ShaderLib';
import { LensFlarePlugin } from './webgl/plugins/LensFlarePlugin';
import { SpritePlugin } from './webgl/plugins/SpritePlugin';
import { WebGLShadowMap } from './webgl/WebGLShadowMap';
12
import { WebGLAttributes } from './webgl/WebGLAttributes';
13
import { WebGLBackground } from './webgl/WebGLBackground';
14
import { WebGLRenderLists } from './webgl/WebGLRenderLists';
R
Rich Harris 已提交
15 16
import { WebGLIndexedBufferRenderer } from './webgl/WebGLIndexedBufferRenderer';
import { WebGLBufferRenderer } from './webgl/WebGLBufferRenderer';
17
import { WebGLGeometries } from './webgl/WebGLGeometries';
R
Rich Harris 已提交
18 19
import { WebGLLights } from './webgl/WebGLLights';
import { WebGLObjects } from './webgl/WebGLObjects';
20
import { WebGLPrograms } from './webgl/WebGLPrograms';
R
Rich Harris 已提交
21 22 23 24
import { WebGLTextures } from './webgl/WebGLTextures';
import { WebGLProperties } from './webgl/WebGLProperties';
import { WebGLState } from './webgl/WebGLState';
import { WebGLCapabilities } from './webgl/WebGLCapabilities';
25
import { WebVRManager } from './webvr/WebVRManager';
R
Rich Harris 已提交
26 27 28
import { BufferGeometry } from '../core/BufferGeometry';
import { WebGLExtensions } from './webgl/WebGLExtensions';
import { Vector3 } from '../math/Vector3';
M
Mr.doob 已提交
29
// import { Sphere } from '../math/Sphere';
R
Rich Harris 已提交
30 31 32 33
import { WebGLClipping } from './webgl/WebGLClipping';
import { Frustum } from '../math/Frustum';
import { Vector4 } from '../math/Vector4';

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

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

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

	parameters = parameters || {};

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

51 52 53 54 55 56
		_alpha = parameters.alpha !== undefined ? parameters.alpha : false,
		_depth = parameters.depth !== undefined ? parameters.depth : true,
		_stencil = parameters.stencil !== undefined ? parameters.stencil : true,
		_antialias = parameters.antialias !== undefined ? parameters.antialias : false,
		_premultipliedAlpha = parameters.premultipliedAlpha !== undefined ? parameters.premultipliedAlpha : true,
		_preserveDrawingBuffer = parameters.preserveDrawingBuffer !== undefined ? parameters.preserveDrawingBuffer : false;
M
Mr.doob 已提交
57

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

61
	var currentRenderList = null;
62

63 64
	var morphInfluences = new Float32Array( 8 );

M
Mr.doob 已提交
65 66 67
	var sprites = [];
	var lensFlares = [];

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

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

	// clearing

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

	// scene graph

	this.sortObjects = true;

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

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

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

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

95 96
	// physical lights

97
	this.physicallyCorrectLights = false;
98

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

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

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

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

	// internal properties

	var _this = this,

114 115
		_isContextLost = false,

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

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

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

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

130
		//
131

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

134
		//
M
Mr.doob 已提交
135

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

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

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

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

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

149
		// clipping
T
tschw 已提交
150

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

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

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

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

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

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

168
		_infoRender = {
169

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

176
		};
M
Mr.doob 已提交
177

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

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

	};
185

186 187 188 189 190
	function getTargetPixelRatio() {

		return _currentRenderTarget === null ? _pixelRatio : 1;

	}
191

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

	var _gl;

M
Mr.doob 已提交
196 197
	try {

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

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

		if ( _gl === null ) {

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

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

			} else {

				throw 'Error creating WebGL context.';

			}
M
Mr.doob 已提交
220 221 222

		}

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

		if ( _gl.getShaderPrecisionFormat === undefined ) {

			_gl.getShaderPrecisionFormat = function () {

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

			};

		}

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

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

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

	}

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

248
	var background, bufferRenderer, indexedBufferRenderer;
249

250
	function initGLContext() {
251

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

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

263
			BufferGeometry.MaxIndex = 4294967296;
264

265
		}
266

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

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

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

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

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

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

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

296 297
	}

298
	initGLContext();
299

300
	// vr
301

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

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

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

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

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

M
Mr.doob 已提交
312

M
Mr.doob 已提交
313 314
	// Plugins

R
Rich Harris 已提交
315 316
	var spritePlugin = new SpritePlugin( this, sprites );
	var lensFlarePlugin = new LensFlarePlugin( this, lensFlares );
M
Mr.doob 已提交
317

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

	this.getContext = function () {

		return _gl;

	};

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

		return _gl.getContextAttributes();

	};

332 333
	this.forceContextLoss = function () {

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

	};

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

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

	};

346 347
	this.getPixelRatio = function () {

348
		return _pixelRatio;
349 350 351 352 353

	};

	this.setPixelRatio = function ( value ) {

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

		_pixelRatio = value;

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

	};

362 363 364
	this.getSize = function () {

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

	};

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

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

		if ( device && device.isPresenting ) {

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

		}

382 383 384
		_width = width;
		_height = height;

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

388
		if ( updateStyle !== false ) {
389

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

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

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

	};

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

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

	};

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

		_width = width;
		_height = height;

		_pixelRatio = pixelRatio;

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

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

	};

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

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

M
Mr.doob 已提交
427 428
	};

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

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

M
Mr.doob 已提交
434 435
	};

436 437
	this.setScissorTest = function ( boolean ) {

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

	};

	// Clearing

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

	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 );
458 459 460 461 462

	};

	this.clearColor = function () {

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

	};

	this.clearDepth = function () {

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

	};

	this.clearStencil = function () {

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

	};

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

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

	};

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

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

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

493 494
		renderLists.dispose();

D
dubejf 已提交
495 496
	};

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

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

		event.preventDefault();

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

505 506 507 508 509
		_isContextLost = true;

	}

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

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

		_isContextLost = false;
D
dubejf 已提交
514

515 516
		initGLContext();

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

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

		var material = event.target;

		material.removeEventListener( 'dispose', onMaterialDispose );

		deallocateMaterial( material );

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

	// Buffer deallocation

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

533 534
		releaseMaterialProgramReference( material );

535
		properties.remove( material );
536

537
	}
538 539


540
	function releaseMaterialProgramReference( material ) {
541

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

		material.program = undefined;

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

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

M
Mr.doob 已提交
550 551
		}

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

	// Buffer rendering

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

		object.render( function ( object ) {

			_this.renderBufferImmediate( object, program, material );

		} );

	}

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

568
		state.initAttributes();
569

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

572 573 574 575
		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 已提交
576

577
		var programAttributes = program.getAttributes();
578

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

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

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

		}

		if ( object.hasNormals ) {

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

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

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

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

602 603 604
					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 已提交
605

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

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

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

				}

			}

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

624
			state.enableAttribute( programAttributes.normal );
625

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

		}

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

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

635
			state.enableAttribute( programAttributes.uv );
636

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

		}

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

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

646
			state.enableAttribute( programAttributes.color );
647

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

		}

652
		state.disableUnusedAttributes();
653

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

		object.count = 0;

	};

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

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

	}

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

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

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

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

		if ( geometryProgram !== _currentGeometryProgram ) {

			_currentGeometryProgram = geometryProgram;
			updateBuffers = true;

		}

		// morph targets

		var morphTargetInfluences = object.morphTargetInfluences;

		if ( morphTargetInfluences !== undefined ) {

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

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

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

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

			}

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

			if ( activeInfluences.length > 8 ) {

				activeInfluences.length = 8;

			}

707 708
			var morphAttributes = geometry.morphAttributes;

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

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

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

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

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

				} else {

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

				}

			}

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

				morphInfluences[ i ] = 0.0;

			}

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

			updateBuffers = true;

		}

742 743
		//

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

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

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

		}

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

758
		if ( index !== null ) {
759

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

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

765
		}
M
Mr.doob 已提交
766

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

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

771
			if ( index !== null ) {
772

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

			}

777
		}
778

779 780
		//

781
		var dataCount = 0;
782

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

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

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

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

M
Mr.doob 已提交
791
		}
792

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

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

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

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

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

M
Mr.doob 已提交
806
		//
807

808
		if ( object.isMesh ) {
809

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

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

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

				switch ( object.drawMode ) {
818

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

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

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

				}
832

833
			}
834

835

836
		} else if ( object.isLine ) {
837

838
			var lineWidth = material.linewidth;
839

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

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

844
			if ( object.isLineSegments ) {
845

846
				renderer.setMode( _gl.LINES );
847

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

				renderer.setMode( _gl.LINE_LOOP );

852
			} else {
853

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

			}
M
Mr.doob 已提交
857

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

			renderer.setMode( _gl.POINTS );
861 862

		}
863

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

			if ( geometry.maxInstancedCount > 0 ) {

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

J
jfranc 已提交
870
			}
871 872 873

		} else {

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

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

	};

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

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

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

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

M
Mr.doob 已提交
889 890 891
			}

		}
B
Ben Adams 已提交
892

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

895 896
		state.initAttributes();

897
		var geometryAttributes = geometry.attributes;
898

899
		var programAttributes = program.getAttributes();
900

901
		var materialDefaultAttributeValues = material.defaultAttributeValues;
902

903
		for ( var name in programAttributes ) {
904

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

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

909
				var geometryAttribute = geometryAttributes[ name ];
910

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

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

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

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

					if ( attribute === undefined ) continue;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

							state.enableAttribute( programAttribute );

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

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

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

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

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

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

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

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

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

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

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

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

					}

				}

			}

		}
1006

1007
		state.disableUnusedAttributes();
1008

M
Mr.doob 已提交
1009 1010
	}

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

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

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

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

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

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

				if ( object.castShadow ) {

					shadowsArray.push( object );

				}
M
Mr.doob 已提交
1029

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

		} );

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

		scene.traverse( function ( object ) {

			if ( object.material ) {

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

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

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

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

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

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

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

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

		} );
G
gero3 已提交
1057 1058

	};
1059

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

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

		function onFrame() {

			callback();

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

		}

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

	};

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

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

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

		}

1085 1086
		if ( _isContextLost ) return;

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

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

		// update scene graph

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

		// update camera matrices and frustum

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

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

			camera = vr.getCamera( camera );

		}

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

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

M
Mr.doob 已提交
1113 1114 1115
		sprites.length = 0;
		lensFlares.length = 0;

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

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

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

1124
		currentRenderList.finish();
1125

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

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

1130 1131
		}

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

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

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

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

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

M
Mr.doob 已提交
1142 1143
		//

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

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

			renderTarget = null;

		}

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

M
Mr.doob 已提交
1158 1159
		//

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

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

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

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

1169
			var overrideMaterial = scene.overrideMaterial;
1170

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

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

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

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

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

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

		}

		// custom render plugins (post pass)

M
Mr.doob 已提交
1188
		spritePlugin.render( scene, camera );
1189
		lensFlarePlugin.render( scene, camera, _currentViewport );
M
Mr.doob 已提交
1190 1191 1192

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

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

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

		}

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

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

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

			vr.submitFrame();

		}
M
Mr.doob 已提交
1210

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

	};
M
Mr.doob 已提交
1214

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

1218 1219
	var _sphere = new Sphere();

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

		var geometry = object.geometry;

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

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

		return isSphereViewable( _sphere );

	}

	function isSpriteViewable( sprite ) {

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

		return isSphereViewable( _sphere );

	}

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

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

		var numPlanes = _clipping.numPlanes;

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

		var planes = _this.clippingPlanes,

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

		do {

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

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

		return true;

	}
1268
	*/
T
tschw 已提交
1269

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

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

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

1276
		if ( visible ) {
1277

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

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

				if ( object.castShadow ) {

					shadowsArray.push( object );

				}
M
Mr.doob 已提交
1287

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

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

1292
					sprites.push( object );
M
Mr.doob 已提交
1293

1294
				}
M
Mr.doob 已提交
1295

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

1298
				lensFlares.push( object );
M
Mr.doob 已提交
1299

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

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

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

1307
				}
M
Mr.doob 已提交
1308

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

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

1313
				if ( object.isSkinnedMesh ) {
1314

1315
					object.skeleton.update();
1316

1317
				}
1318

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

1321 1322 1323 1324 1325 1326
					if ( sortObjects ) {

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

					}
1327

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

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

1333
						var groups = geometry.groups;
1334

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

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

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

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

							}
M
Mr.doob 已提交
1345

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

1348
					} else if ( material.visible ) {
1349

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

1352
					}
M
Mr.doob 已提交
1353

1354
				}
M
Mr.doob 已提交
1355

1356
			}
M
Mr.doob 已提交
1357

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

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

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

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

1366
		}
1367

1368
	}
M
Mr.doob 已提交
1369

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

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

1374
			var renderItem = renderList[ i ];
1375

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

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

1383 1384
				_currentArrayCamera = camera;

1385
				var cameras = camera.cameras;
1386

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

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

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

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

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

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

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

					}
M
Mr.doob 已提交
1407

1408
				}
1409

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

1412 1413
				_currentArrayCamera = null;

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

1416
			}
M
Mr.doob 已提交
1417

1418
		}
M
Mr.doob 已提交
1419

1420
	}
G
gero3 已提交
1421

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

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

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

		if ( object.isImmediateRenderObject ) {

			state.setMaterial( material );

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

			_currentGeometryProgram = '';

			renderObjectImmediate( object, program, material );

		} else {

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

		}

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

M
Mr.doob 已提交
1447 1448
	}

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

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

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

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

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

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

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

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

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

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

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

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

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

		}

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

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

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

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

1496
			} else {
B
Ben Adams 已提交
1497

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

1505
			}
G
gero3 已提交
1506

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

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

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

		}

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

		if ( material.morphTargets ) {

			material.numSupportedMorphTargets = 0;

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

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

					material.numSupportedMorphTargets ++;

				}

			}

		}

		if ( material.morphNormals ) {

			material.numSupportedMorphNormals = 0;

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

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

					material.numSupportedMorphNormals ++;

				}

			}

		}

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

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

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

		}

1562
		materialProperties.fog = fog;
1563

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

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

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

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

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

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

1587 1588
		}

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

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

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

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

		_usedTextureUnits = 0;

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

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

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

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

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

			}

		}

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

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

1626
				material.needsUpdate = true;
1627

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

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

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

1634
				material.needsUpdate = true;
1635

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

				material.needsUpdate = true;

1642
			}
1643 1644 1645 1646

		}

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

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

		}

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

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

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

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

		}

		if ( material.id !== _currentMaterialId ) {

			_currentMaterialId = material.id;
1672

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

		}

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

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

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

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

			}

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

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

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

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

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

			}
M
Mr.doob 已提交
1702

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

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

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

				if ( uCamPos !== undefined ) {
1714

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

				}

			}

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

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

			}

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

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

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

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

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

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

1748 1749
				var bones = skeleton.bones;

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

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

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


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

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

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

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

					}

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

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

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

				}

			}

		}

		if ( refreshMaterial ) {

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

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

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

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

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

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

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

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

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

			}

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

				refreshUniformsCommon( m_uniforms, material );

			}

			// refresh single material specific uniforms

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

				refreshUniformsLine( m_uniforms, material );

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

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

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

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

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

				refreshUniformsLambert( m_uniforms, material );

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

				refreshUniformsToon( m_uniforms, material );

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

				refreshUniformsPhong( m_uniforms, material );

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

				refreshUniformsPhysical( m_uniforms, material );

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

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

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

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

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

				}

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

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

			}

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

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

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

		}

M
Mr.doob 已提交
1891

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

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

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

	}

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

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

		uniforms.opacity.value = material.opacity;

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

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

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

		}

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

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

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

		}

1927
		if ( material.aoMap ) {
1928

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

		}

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

		var uvScaleMap;

		if ( material.map ) {

			uvScaleMap = material.map;

		} else if ( material.specularMap ) {

			uvScaleMap = material.specularMap;

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

			uvScaleMap = material.displacementMap;

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

			uvScaleMap = material.normalMap;

		} else if ( material.bumpMap ) {

			uvScaleMap = material.bumpMap;

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

			uvScaleMap = material.roughnessMap;

		} else if ( material.metalnessMap ) {

			uvScaleMap = material.metalnessMap;

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

			uvScaleMap = material.alphaMap;

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

			uvScaleMap = material.emissiveMap;

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

		if ( uvScaleMap !== undefined ) {

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

				uvScaleMap = uvScaleMap.texture;

			}

M
Mr.doob 已提交
1991 1992 1993 1994 1995 1996 1997 1998
			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;
1999 2000 2001 2002 2003

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

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

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

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

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

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

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

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

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

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

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

		uniforms.map.value = material.map;

2035 2036 2037 2038 2039 2040 2041 2042 2043
		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 已提交
2044
	}
M
Mr.doob 已提交
2045

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

		uniforms.fogColor.value = fog.color;

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

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

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

			uniforms.fogDensity.value = fog.density;

		}

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

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

		if ( material.emissiveMap ) {

			uniforms.emissiveMap.value = material.emissiveMap;

		}

	}

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

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

2078
		if ( material.emissiveMap ) {
2079

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

2082
		}
M
Mr.doob 已提交
2083

2084 2085 2086 2087
		if ( material.bumpMap ) {

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

2089
		}
M
Mr.doob 已提交
2090

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

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

		}
M
Mr.doob 已提交
2097

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

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

2104
		}
2105

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

	function refreshUniformsToon( uniforms, material ) {

		refreshUniformsPhong( uniforms, material );

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

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

		}

2118 2119
	}

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

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

		if ( material.roughnessMap ) {

			uniforms.roughnessMap.value = material.roughnessMap;

		}

		if ( material.metalnessMap ) {

			uniforms.metalnessMap.value = material.metalnessMap;

		}

		if ( material.emissiveMap ) {

			uniforms.emissiveMap.value = material.emissiveMap;

		}

		if ( material.bumpMap ) {

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

		}

		if ( material.normalMap ) {

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

		}

		if ( material.displacementMap ) {

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

		}

		if ( material.envMap ) {

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

		}

	}

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

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

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

	}

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

		if ( material.bumpMap ) {

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

		}

		if ( material.normalMap ) {

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

		}

		if ( material.displacementMap ) {

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

		}

	}

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

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

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

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

M
Mr.doob 已提交
2221
	}
2222

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

	this.setFaceCulling = function ( cullFace, frontFaceDirection ) {

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

	};

	// Textures

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

		var textureUnit = _usedTextureUnits;

		if ( textureUnit >= capabilities.maxTextures ) {

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

		}

		_usedTextureUnits += 1;

		return textureUnit;

	}

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

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

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

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

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

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

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

2267
				}
T
tschw 已提交
2268

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

2271
			}
T
tschw 已提交
2272

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

2275
		};
T
tschw 已提交
2276

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

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

		var warned = false;

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

			if ( ! warned ) {

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

			}

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

		};

	}() );

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

		var warned = false;

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

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

				if ( ! warned ) {

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

				}

				texture = texture.texture;

			}

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

				// CompressedTexture can have Array in image :/

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

			} else {

				// assumed: texture property of THREE.WebGLRenderTargetCube

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

			}

		};

	}() );
T
tschw 已提交
2339

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

		return _currentRenderTarget;

M
Michael Herzog 已提交
2344
	};
2345

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

2348 2349
		_currentRenderTarget = renderTarget;

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

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

		}

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

		if ( renderTarget ) {

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

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

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

			} else {

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

			}

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

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

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

M
Mr.doob 已提交
2384 2385
		}

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

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

		}

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

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

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

		}

M
Mr.doob 已提交
2404 2405
	};

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

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

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

G
gero3 已提交
2413
		}
2414

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

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

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

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

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

G
gero3 已提交
2425
				restore = true;
2426

G
gero3 已提交
2427
			}
2428

M
Mr.doob 已提交
2429
			try {
2430

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

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

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

M
Mr.doob 已提交
2440
				}
2441

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

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

M
Mr.doob 已提交
2449
				}
2450

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

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

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

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

					}
2460

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

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

				}
M
Mr.doob 已提交
2466

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

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

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

M
Mr.doob 已提交
2473 2474 2475
				}

			}
M
Mr.doob 已提交
2476 2477 2478

		}

M
Mr.doob 已提交
2479 2480
	};

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

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

2485 2486
		var extension;

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

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

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

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

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

2511
		if ( p === HalfFloatType ) {
2512

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

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

		}

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

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

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

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

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

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

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

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

			}
M
Mr.doob 已提交
2557 2558 2559

		}

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

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

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

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

			}
P
Pierre Lepers 已提交
2573 2574 2575

		}

2576
		if ( p === RGB_ETC1_Format ) {
2577

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

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

		}

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

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

2588
			if ( extension !== null ) {
2589

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

			}
2594 2595 2596

		}

2597
		if ( p === UnsignedInt248Type ) {
2598

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

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

		}

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

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

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

T
Tristan VALCKE 已提交
2611

2612
export { WebGLRenderer };