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

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

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

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

	parameters = parameters || {};

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

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

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

61
	var currentRenderList = null;
62

63 64
	var morphInfluences = new Float32Array( 8 );

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

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

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

	// clearing

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

	// scene graph

	this.sortObjects = true;

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

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

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

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

95 96
	// physical lights

97
	this.physicallyCorrectLights = false;
98

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

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

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

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

	// internal properties

	var _this = this,

114 115
		_isContextLost = false,

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

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

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

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

130
		//
131

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

134
		//
M
Mr.doob 已提交
135

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

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

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

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

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

149
		// clipping
T
tschw 已提交
150

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

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

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

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

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

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

168
		_infoRender = {
169

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

176
		};
M
Mr.doob 已提交
177

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

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

	};
185

186 187 188 189 190
	function getTargetPixelRatio() {

		return _currentRenderTarget === null ? _pixelRatio : 1;

	}
191

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

	var _gl;

M
Mr.doob 已提交
196 197
	try {

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

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

		if ( _gl === null ) {

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

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

			} else {

				throw 'Error creating WebGL context.';

			}
M
Mr.doob 已提交
220 221 222

		}

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

		if ( _gl.getShaderPrecisionFormat === undefined ) {

			_gl.getShaderPrecisionFormat = function () {

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

			};

		}

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

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

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

	}

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

248
	var background, bufferRenderer, indexedBufferRenderer;
249
	var flareRenderer, spriteRenderer;
250

251
	function initGLContext() {
252

253 254 255 256 257 258 259 260
		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' );
261

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

264
			BufferGeometry.MaxIndex = 4294967296;
265

266
		}
267

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

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

274 275 276 277 278
		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 );
279
		programCache = new WebGLPrograms( _this, extensions, capabilities );
280
		lights = new WebGLLights();
281
		renderLists = new WebGLRenderLists();
282

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

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

288 289 290
		flareRenderer = new WebGLFlareRenderer( _this, _gl, state, capabilities );
		spriteRenderer = new WebGLSpriteRenderer( _this, _gl, state, capabilities );

291
		_this.info.programs = programCache.programs;
292

293 294 295 296 297 298 299
		_this.context = _gl;
		_this.capabilities = capabilities;
		_this.extensions = extensions;
		_this.properties = properties;
		_this.renderLists = renderLists;
		_this.state = state;

300 301
	}

302
	initGLContext();
303

304
	// vr
305

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

308
	this.vr = vr;
M
Mr.doob 已提交
309

M
Mr.doob 已提交
310 311
	// shadow map

312
	var shadowMap = new WebGLShadowMap( _this, objects, capabilities.maxTextureSize );
M
Mr.doob 已提交
313

314
	this.shadowMap = shadowMap;
M
Mr.doob 已提交
315

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

	this.getContext = function () {

		return _gl;

	};

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

		return _gl.getContextAttributes();

	};

330 331
	this.forceContextLoss = function () {

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

	};

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

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

	};

344 345
	this.getPixelRatio = function () {

346
		return _pixelRatio;
347 348 349 350 351

	};

	this.setPixelRatio = function ( value ) {

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

		_pixelRatio = value;

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

	};

360 361 362
	this.getSize = function () {

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

	};

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

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

		if ( device && device.isPresenting ) {

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

		}

380 381 382
		_width = width;
		_height = height;

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

386
		if ( updateStyle !== false ) {
387

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

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

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

	};

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

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

	};

406 407 408 409 410 411 412 413 414 415 416 417 418 419
	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 已提交
420 421
	this.setViewport = function ( x, y, width, height ) {

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

M
Mr.doob 已提交
425 426
	};

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

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

M
Mr.doob 已提交
432 433
	};

434 435
	this.setScissorTest = function ( boolean ) {

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

	};

	// Clearing

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

	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 );
456 457 458 459 460

	};

	this.clearColor = function () {

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

	};

	this.clearDepth = function () {

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

	};

	this.clearStencil = function () {

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

	};

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

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

	};

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

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

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

491 492
		renderLists.dispose();

D
dubejf 已提交
493 494
	};

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

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

		event.preventDefault();

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

503 504 505 506 507
		_isContextLost = true;

	}

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

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

		_isContextLost = false;
D
dubejf 已提交
512

513 514
		initGLContext();

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

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

		var material = event.target;

		material.removeEventListener( 'dispose', onMaterialDispose );

		deallocateMaterial( material );

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

	// Buffer deallocation

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

531 532
		releaseMaterialProgramReference( material );

533
		properties.remove( material );
534

535
	}
536 537


538
	function releaseMaterialProgramReference( material ) {
539

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

		material.program = undefined;

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

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

M
Mr.doob 已提交
548 549
		}

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

	// Buffer rendering

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

		object.render( function ( object ) {

			_this.renderBufferImmediate( object, program, material );

		} );

	}

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

566
		state.initAttributes();
567

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

570 571 572 573
		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 已提交
574

575
		var programAttributes = program.getAttributes();
576

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

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

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

		}

		if ( object.hasNormals ) {

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

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

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

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

600 601 602
					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 已提交
603

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

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

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

				}

			}

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

622
			state.enableAttribute( programAttributes.normal );
623

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

		}

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

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

633
			state.enableAttribute( programAttributes.uv );
634

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

		}

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

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

644
			state.enableAttribute( programAttributes.color );
645

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

		}

650
		state.disableUnusedAttributes();
651

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

		object.count = 0;

	};

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

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

	}

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

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

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

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

		if ( geometryProgram !== _currentGeometryProgram ) {

			_currentGeometryProgram = geometryProgram;
			updateBuffers = true;

		}

		// morph targets

		var morphTargetInfluences = object.morphTargetInfluences;

		if ( morphTargetInfluences !== undefined ) {

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

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

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

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

			}

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

			if ( activeInfluences.length > 8 ) {

				activeInfluences.length = 8;

			}

705 706
			var morphAttributes = geometry.morphAttributes;

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

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

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

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

716 717
					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 已提交
718 719 720

				} else {

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

				}

			}

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

				morphInfluences[ i ] = 0.0;

			}

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

			updateBuffers = true;

		}

740 741
		//

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

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

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

		}

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

756
		if ( index !== null ) {
757

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

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

763
		}
M
Mr.doob 已提交
764

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

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

769
			if ( index !== null ) {
770

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

			}

775
		}
776

777 778
		//

779
		var dataCount = 0;
780

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

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

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

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

M
Mr.doob 已提交
789
		}
790

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

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

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

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

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

M
Mr.doob 已提交
804
		//
805

806
		if ( object.isMesh ) {
807

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

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

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

				switch ( object.drawMode ) {
816

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

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

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

				}
830

831
			}
832

833

834
		} else if ( object.isLine ) {
835

836
			var lineWidth = material.linewidth;
837

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

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

842
			if ( object.isLineSegments ) {
843

844
				renderer.setMode( _gl.LINES );
845

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

				renderer.setMode( _gl.LINE_LOOP );

850
			} else {
851

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

			}
M
Mr.doob 已提交
855

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

			renderer.setMode( _gl.POINTS );
859 860

		}
861

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

			if ( geometry.maxInstancedCount > 0 ) {

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

J
jfranc 已提交
868
			}
869 870 871

		} else {

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

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

	};

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

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

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

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

M
Mr.doob 已提交
887 888 889
			}

		}
B
Ben Adams 已提交
890

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

893 894
		state.initAttributes();

895
		var geometryAttributes = geometry.attributes;
896

897
		var programAttributes = program.getAttributes();
898

899
		var materialDefaultAttributeValues = material.defaultAttributeValues;
900

901
		for ( var name in programAttributes ) {
902

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

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

907
				var geometryAttribute = geometryAttributes[ name ];
908

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

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

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

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

					if ( attribute === undefined ) continue;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

							state.enableAttribute( programAttribute );

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

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

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

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

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

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

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

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

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

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

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

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

					}

				}

			}

		}
1004

1005
		state.disableUnusedAttributes();
1006

M
Mr.doob 已提交
1007 1008
	}

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

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

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

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

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

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

				if ( object.castShadow ) {

					shadowsArray.push( object );

				}
M
Mr.doob 已提交
1027

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

		} );

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

		scene.traverse( function ( object ) {

			if ( object.material ) {

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

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

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

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

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

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

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

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

		} );
G
gero3 已提交
1055 1056

	};
1057

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

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

		function onFrame() {

			callback();

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

		}

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

	};

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

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

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

		}

1083 1084
		if ( _isContextLost ) return;

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

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

		// update scene graph

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

		// update camera matrices and frustum

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

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

			camera = vr.getCamera( camera );

		}

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

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

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

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

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

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

1122
		currentRenderList.finish();
1123

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

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

1128 1129
		}

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

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

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

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

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

M
Mr.doob 已提交
1140 1141
		//

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

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

			renderTarget = null;

		}

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

M
Mr.doob 已提交
1156 1157
		//

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

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

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

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

1167
			var overrideMaterial = scene.overrideMaterial;
1168

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

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

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

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

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

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

		}

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

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

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

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

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

		}

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

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

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

			vr.submitFrame();

		}
M
Mr.doob 已提交
1208

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

	};
M
Mr.doob 已提交
1212

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

1216 1217
	var _sphere = new Sphere();

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

		var geometry = object.geometry;

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

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

		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 已提交
1243 1244

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

		var numPlanes = _clipping.numPlanes;

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

		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 已提交
1261
		} while ( ++ i !== numPlanes );
T
tschw 已提交
1262 1263 1264 1265

		return true;

	}
1266
	*/
T
tschw 已提交
1267

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

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

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

1274
		if ( visible ) {
1275

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

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

				if ( object.castShadow ) {

					shadowsArray.push( object );

				}
M
Mr.doob 已提交
1285

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

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

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

1292
				}
M
Mr.doob 已提交
1293

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

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

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

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

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

1305
				}
M
Mr.doob 已提交
1306

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

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

1311
				if ( object.isSkinnedMesh ) {
1312

1313
					object.skeleton.update();
1314

1315
				}
1316

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

1319 1320 1321 1322 1323 1324
					if ( sortObjects ) {

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

					}
1325

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

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

1331
						var groups = geometry.groups;
1332

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

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

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

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

							}
M
Mr.doob 已提交
1343

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

1346
					} else if ( material.visible ) {
1347

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

1350
					}
M
Mr.doob 已提交
1351

1352
				}
M
Mr.doob 已提交
1353

1354
			}
M
Mr.doob 已提交
1355

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

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

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

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

1364
		}
1365

1366
	}
M
Mr.doob 已提交
1367

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

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

1372
			var renderItem = renderList[ i ];
1373

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

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

1381 1382
				_currentArrayCamera = camera;

1383
				var cameras = camera.cameras;
1384

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

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

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

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

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

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

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

					}
M
Mr.doob 已提交
1405

1406
				}
1407

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

1410 1411
				_currentArrayCamera = null;

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

1414
			}
M
Mr.doob 已提交
1415

1416
		}
M
Mr.doob 已提交
1417

1418
	}
G
gero3 已提交
1419

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

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

M
Mr.doob 已提交
1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442
		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 已提交
1443 1444
		object.onAfterRender( _this, scene, camera, geometry, material, group );

M
Mr.doob 已提交
1445 1446
	}

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

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

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

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

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

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

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

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

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

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

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

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

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

		}

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

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

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

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

1494
			} else {
B
Ben Adams 已提交
1495

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

1503
			}
G
gero3 已提交
1504

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

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

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

		}

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

		if ( material.morphTargets ) {

			material.numSupportedMorphTargets = 0;

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

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

					material.numSupportedMorphTargets ++;

				}

			}

		}

		if ( material.morphNormals ) {

			material.numSupportedMorphNormals = 0;

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

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

					material.numSupportedMorphNormals ++;

				}

			}

		}

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

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

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

		}

1560
		materialProperties.fog = fog;
1561

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

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

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

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

1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582
			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;
1583
			// TODO (abelnation): add area lights shadow info to uniforms
1584

1585 1586
		}

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

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

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

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

		_usedTextureUnits = 0;

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

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

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

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

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

			}

		}

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

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

1624
				material.needsUpdate = true;
1625

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

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

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

1632
				material.needsUpdate = true;
1633

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

				material.needsUpdate = true;

1640
			}
1641 1642 1643 1644

		}

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

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

		}

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

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

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

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

		}

		if ( material.id !== _currentMaterialId ) {

			_currentMaterialId = material.id;
1670

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

		}

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

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

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

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

			}

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

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

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

				// 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 已提交
1697
				refreshLights = true;		// remains set until update done
1698 1699

			}
M
Mr.doob 已提交
1700

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

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

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

				if ( uCamPos !== undefined ) {
1712

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

				}

			}

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

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

			}

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

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

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

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

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

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

1746 1747
				var bones = skeleton.bones;

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

1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774
					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 已提交
1775 1776
					p_uniforms.setValue( _gl, 'boneTexture', skeleton.boneTexture );
					p_uniforms.setValue( _gl, 'boneTextureSize', skeleton.boneTextureSize );
M
Mr.doob 已提交
1777

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

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

				}

			}

		}

		if ( refreshMaterial ) {

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

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

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

T
tschw 已提交
1797 1798 1799 1800 1801 1802
				// 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 已提交
1803

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

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

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

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

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

			}

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

				refreshUniformsCommon( m_uniforms, material );

			}

			// refresh single material specific uniforms

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

				refreshUniformsLine( m_uniforms, material );

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

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

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

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

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

				refreshUniformsLambert( m_uniforms, material );

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

				refreshUniformsToon( m_uniforms, material );

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

				refreshUniformsPhong( m_uniforms, material );

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

				refreshUniformsPhysical( m_uniforms, material );

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

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

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

W
WestLangley 已提交
1865
				refreshUniformsDepth( m_uniforms, material );
1866

W
WestLangley 已提交
1867
			} else if ( material.isMeshDistanceMaterial ) {
1868

W
WestLangley 已提交
1869
				refreshUniformsDistance( m_uniforms, material );
1870

1871
			} else if ( material.isMeshNormalMaterial ) {
M
Mr.doob 已提交
1872

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

			}

M
Mr.doob 已提交
1877 1878 1879 1880 1881 1882
			// 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 已提交
1883
			WebGLUniforms.upload(
1884
				_gl, materialProperties.uniformsList, m_uniforms, _this );
A
arose 已提交
1885 1886 1887

		}

M
Mr.doob 已提交
1888

T
tschw 已提交
1889
		// common matrices
M
Mr.doob 已提交
1890

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

T
tschw 已提交
1895
		return program;
A
arose 已提交
1896 1897 1898

	}

M
Mr.doob 已提交
1899 1900
	// Uniforms (refresh uniforms objects)

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

		uniforms.opacity.value = material.opacity;

1905
		uniforms.diffuse.value = material.color;
M
Mr.doob 已提交
1906

1907
		if ( material.emissive ) {
M
Mr.doob 已提交
1908

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

		}

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

1917 1918 1919 1920 1921 1922 1923
		if ( material.lightMap ) {

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

		}

1924
		if ( material.aoMap ) {
1925

1926 1927
			uniforms.aoMap.value = material.aoMap;
			uniforms.aoMapIntensity.value = material.aoMapIntensity;
1928 1929 1930

		}

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

		var uvScaleMap;

		if ( material.map ) {

			uvScaleMap = material.map;

		} else if ( material.specularMap ) {

			uvScaleMap = material.specularMap;

1949 1950 1951 1952
		} else if ( material.displacementMap ) {

			uvScaleMap = material.displacementMap;

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

			uvScaleMap = material.normalMap;

		} else if ( material.bumpMap ) {

			uvScaleMap = material.bumpMap;

1961 1962 1963 1964 1965 1966 1967 1968
		} else if ( material.roughnessMap ) {

			uvScaleMap = material.roughnessMap;

		} else if ( material.metalnessMap ) {

			uvScaleMap = material.metalnessMap;

1969 1970 1971 1972
		} else if ( material.alphaMap ) {

			uvScaleMap = material.alphaMap;

1973 1974 1975 1976
		} else if ( material.emissiveMap ) {

			uvScaleMap = material.emissiveMap;

M
Mr.doob 已提交
1977 1978 1979 1980
		}

		if ( uvScaleMap !== undefined ) {

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

				uvScaleMap = uvScaleMap.texture;

			}

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

		// 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 已提交
2001
		uniforms.flipEnvMap.value = ( ! ( material.envMap && material.envMap.isCubeTexture ) ) ? 1 : - 1;
M
Mr.doob 已提交
2002

2003
		uniforms.reflectivity.value = material.reflectivity;
M
Mr.doob 已提交
2004 2005
		uniforms.refractionRatio.value = material.refractionRatio;

M
Mr.doob 已提交
2006
	}
M
Mr.doob 已提交
2007

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

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

M
Mr.doob 已提交
2013
	}
M
Mr.doob 已提交
2014

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

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

M
Mr.doob 已提交
2021
	}
M
Mr.doob 已提交
2022

M
Mr.doob 已提交
2023
	function refreshUniformsPoints( uniforms, material ) {
M
Mr.doob 已提交
2024

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

		uniforms.map.value = material.map;

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

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

		uniforms.fogColor.value = fog.color;

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

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

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

			uniforms.fogDensity.value = fog.density;

		}

M
Mr.doob 已提交
2058
	}
M
Mr.doob 已提交
2059

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

		if ( material.emissiveMap ) {

			uniforms.emissiveMap.value = material.emissiveMap;

		}

	}

M
Mr.doob 已提交
2070
	function refreshUniformsPhong( uniforms, material ) {
M
Mr.doob 已提交
2071

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

2075
		if ( material.emissiveMap ) {
2076

2077
			uniforms.emissiveMap.value = material.emissiveMap;
2078

2079
		}
M
Mr.doob 已提交
2080

2081 2082 2083 2084
		if ( material.bumpMap ) {

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

2086
		}
M
Mr.doob 已提交
2087

2088 2089 2090 2091 2092 2093
		if ( material.normalMap ) {

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

		}
M
Mr.doob 已提交
2094

2095 2096 2097 2098 2099
		if ( material.displacementMap ) {

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

2101
		}
2102

T
Takahiro 已提交
2103 2104 2105 2106 2107 2108
	}

	function refreshUniformsToon( uniforms, material ) {

		refreshUniformsPhong( uniforms, material );

T
Takahiro 已提交
2109
		if ( material.gradientMap ) {
T
Takahiro 已提交
2110

T
Takahiro 已提交
2111
			uniforms.gradientMap.value = material.gradientMap;
T
Takahiro 已提交
2112 2113 2114

		}

2115 2116
	}

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

		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 已提交
2171
	function refreshUniformsPhysical( uniforms, material ) {
W
WestLangley 已提交
2172

2173 2174 2175
		uniforms.clearCoat.value = material.clearCoat;
		uniforms.clearCoatRoughness.value = material.clearCoatRoughness;

W
WestLangley 已提交
2176 2177 2178 2179
		refreshUniformsStandard( uniforms, material );

	}

W
WestLangley 已提交
2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207
	function refreshUniformsDepth( uniforms, material ) {

		if ( material.displacementMap ) {

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

		}

	}

	function refreshUniformsDistance( uniforms, material ) {

		if ( material.displacementMap ) {

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

		}

		uniforms.referencePosition.value.copy( material.referencePosition );
		uniforms.nearDistance.value = material.nearDistance;
		uniforms.farDistance.value = material.farDistance;

	}

2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233
	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;

		}

	}

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

M
Mr.doob 已提交
2236
	function markUniformsLightsNeedsUpdate( uniforms, value ) {
2237

M
Mr.doob 已提交
2238
		uniforms.ambientLightColor.needsUpdate = value;
2239

B
Ben Houston 已提交
2240 2241 2242
		uniforms.directionalLights.needsUpdate = value;
		uniforms.pointLights.needsUpdate = value;
		uniforms.spotLights.needsUpdate = value;
2243
		uniforms.rectAreaLights.needsUpdate = value;
B
Ben Houston 已提交
2244
		uniforms.hemisphereLights.needsUpdate = value;
2245

M
Mr.doob 已提交
2246
	}
2247

M
Mr.doob 已提交
2248 2249 2250 2251
	// GL state setting

	this.setFaceCulling = function ( cullFace, frontFaceDirection ) {

T
tschw 已提交
2252
		state.setCullFace( cullFace );
R
Rich Harris 已提交
2253
		state.setFlipSided( frontFaceDirection === FrontFaceDirectionCW );
M
Mr.doob 已提交
2254 2255 2256 2257 2258

	};

	// Textures

T
tschw 已提交
2259 2260 2261 2262 2263 2264
	function allocTextureUnit() {

		var textureUnit = _usedTextureUnits;

		if ( textureUnit >= capabilities.maxTextures ) {

M
Mugen87 已提交
2265
			console.warn( 'THREE.WebGLRenderer: Trying to use ' + textureUnit + ' texture units while this GPU supports only ' + capabilities.maxTextures );
T
tschw 已提交
2266 2267 2268 2269 2270 2271 2272 2273 2274

		}

		_usedTextureUnits += 1;

		return textureUnit;

	}

2275
	this.allocTextureUnit = allocTextureUnit;
T
tschw 已提交
2276

2277
	// this.setTexture2D = setTexture2D;
M
Mr.doob 已提交
2278
	this.setTexture2D = ( function () {
T
tschw 已提交
2279

2280
		var warned = false;
T
tschw 已提交
2281

2282
		// backwards compatibility: peel texture.texture
W
WestLangley 已提交
2283
		return function setTexture2D( texture, slot ) {
T
tschw 已提交
2284

T
Takahiro 已提交
2285
			if ( texture && texture.isWebGLRenderTarget ) {
T
tschw 已提交
2286

2287
				if ( ! warned ) {
T
tschw 已提交
2288

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

2292
				}
T
tschw 已提交
2293

2294
				texture = texture.texture;
T
tschw 已提交
2295

2296
			}
T
tschw 已提交
2297

2298
			textures.setTexture2D( texture, slot );
T
tschw 已提交
2299

2300
		};
T
tschw 已提交
2301

2302
	}() );
T
tschw 已提交
2303

M
Mr.doob 已提交
2304
	this.setTexture = ( function () {
2305 2306 2307

		var warned = false;

W
WestLangley 已提交
2308
		return function setTexture( texture, slot ) {
2309 2310 2311 2312 2313 2314 2315 2316

			if ( ! warned ) {

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

			}

2317
			textures.setTexture2D( texture, slot );
2318 2319 2320 2321 2322

		};

	}() );

M
Mr.doob 已提交
2323
	this.setTextureCube = ( function () {
2324 2325 2326

		var warned = false;

W
WestLangley 已提交
2327
		return function setTextureCube( texture, slot ) {
2328 2329

			// backwards compatibility: peel texture.texture
T
Takahiro 已提交
2330
			if ( texture && texture.isWebGLRenderTargetCube ) {
2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344

				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 已提交
2345
			if ( ( texture && texture.isCubeTexture ) ||
2346
				( Array.isArray( texture.image ) && texture.image.length === 6 ) ) {
2347 2348 2349 2350

				// CompressedTexture can have Array in image :/

				// this function alone should take care of cube textures
2351
				textures.setTextureCube( texture, slot );
2352 2353 2354 2355 2356

			} else {

				// assumed: texture property of THREE.WebGLRenderTargetCube

2357
				textures.setTextureCubeDynamic( texture, slot );
2358 2359 2360 2361 2362 2363

			}

		};

	}() );
T
tschw 已提交
2364

2365
	this.getRenderTarget = function () {
2366 2367 2368

		return _currentRenderTarget;

M
Michael Herzog 已提交
2369
	};
2370

2371
	this.setRenderTarget = function ( renderTarget ) {
M
Mr.doob 已提交
2372

2373 2374
		_currentRenderTarget = renderTarget;

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

2377
			textures.setupRenderTarget( renderTarget );
M
Mr.doob 已提交
2378 2379 2380

		}

M
Mr.doob 已提交
2381
		var framebuffer = null;
M
Mr.doob 已提交
2382
		var isCube = false;
M
Mr.doob 已提交
2383 2384 2385

		if ( renderTarget ) {

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

M
Mr.doob 已提交
2388
			if ( renderTarget.isWebGLRenderTargetCube ) {
M
Mr.doob 已提交
2389

M
Mr.doob 已提交
2390
				framebuffer = __webglFramebuffer[ renderTarget.activeCubeFace ];
M
Mr.doob 已提交
2391
				isCube = true;
M
Mr.doob 已提交
2392 2393 2394

			} else {

M
Mr.doob 已提交
2395
				framebuffer = __webglFramebuffer;
M
Mr.doob 已提交
2396 2397 2398

			}

M
Mr.doob 已提交
2399
			_currentViewport.copy( renderTarget.viewport );
2400 2401
			_currentScissor.copy( renderTarget.scissor );
			_currentScissorTest = renderTarget.scissorTest;
2402

M
Mr.doob 已提交
2403 2404
		} else {

M
Mr.doob 已提交
2405
			_currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio );
2406
			_currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio );
2407
			_currentScissorTest = _scissorTest;
2408

M
Mr.doob 已提交
2409 2410
		}

M
Mr.doob 已提交
2411
		if ( _currentFramebuffer !== framebuffer ) {
M
Mr.doob 已提交
2412 2413 2414 2415 2416 2417

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

		}

M
Mr.doob 已提交
2418
		state.viewport( _currentViewport );
2419 2420
		state.scissor( _currentScissor );
		state.setScissorTest( _currentScissorTest );
2421

M
Mr.doob 已提交
2422 2423 2424
		if ( isCube ) {

			var textureProperties = properties.get( renderTarget.texture );
2425
			_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + renderTarget.activeCubeFace, textureProperties.__webglTexture, renderTarget.activeMipMapLevel );
M
Mr.doob 已提交
2426 2427 2428

		}

M
Mr.doob 已提交
2429 2430
	};

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

0
06wj 已提交
2433
		if ( ! ( renderTarget && renderTarget.isWebGLRenderTarget ) ) {
2434

2435
			console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.' );
G
gero3 已提交
2436
			return;
2437

G
gero3 已提交
2438
		}
2439

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

M
Mr.doob 已提交
2442
		if ( framebuffer ) {
2443

G
gero3 已提交
2444
			var restore = false;
2445

M
Mr.doob 已提交
2446
			if ( framebuffer !== _currentFramebuffer ) {
2447

M
Mr.doob 已提交
2448
				_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );
2449

G
gero3 已提交
2450
				restore = true;
2451

G
gero3 已提交
2452
			}
2453

M
Mr.doob 已提交
2454
			try {
2455

M
Mr.doob 已提交
2456
				var texture = renderTarget.texture;
M
Mr.doob 已提交
2457 2458
				var textureFormat = texture.format;
				var textureType = texture.type;
2459

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

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

M
Mr.doob 已提交
2465
				}
2466

M
Mr.doob 已提交
2467
				if ( textureType !== UnsignedByteType && paramThreeToGL( textureType ) !== _gl.getParameter( _gl.IMPLEMENTATION_COLOR_READ_TYPE ) && // IE11, Edge and Chrome Mac < 52 (#9513)
2468 2469
					! ( 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' ) ) ) {
2470

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

M
Mr.doob 已提交
2474
				}
2475

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

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

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

M
Mr.doob 已提交
2482
						_gl.readPixels( x, y, width, height, paramThreeToGL( textureFormat ), paramThreeToGL( textureType ), buffer );
2483 2484

					}
2485

M
Mr.doob 已提交
2486
				} else {
M
Mr.doob 已提交
2487

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

				}
M
Mr.doob 已提交
2491

M
Mr.doob 已提交
2492
			} finally {
M
Mr.doob 已提交
2493

M
Mr.doob 已提交
2494 2495 2496
				if ( restore ) {

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

M
Mr.doob 已提交
2498 2499 2500
				}

			}
M
Mr.doob 已提交
2501 2502 2503

		}

M
Mr.doob 已提交
2504 2505
	};

M
Mr.doob 已提交
2506 2507
	// Map three.js constants to WebGL constants

M
Mr.doob 已提交
2508
	function paramThreeToGL( p ) {
M
Mr.doob 已提交
2509

2510 2511
		var extension;

R
Rich Harris 已提交
2512 2513 2514
		if ( p === RepeatWrapping ) return _gl.REPEAT;
		if ( p === ClampToEdgeWrapping ) return _gl.CLAMP_TO_EDGE;
		if ( p === MirroredRepeatWrapping ) return _gl.MIRRORED_REPEAT;
M
Mr.doob 已提交
2515

R
Rich Harris 已提交
2516 2517 2518
		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 已提交
2519

R
Rich Harris 已提交
2520 2521 2522
		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 已提交
2523

R
Rich Harris 已提交
2524 2525 2526 2527
		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 已提交
2528

R
Rich Harris 已提交
2529 2530 2531 2532 2533 2534
		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 已提交
2535

2536
		if ( p === HalfFloatType ) {
2537

2538
			extension = extensions.get( 'OES_texture_half_float' );
2539

2540
			if ( extension !== null ) return extension.HALF_FLOAT_OES;
2541 2542 2543

		}

R
Rich Harris 已提交
2544 2545 2546 2547 2548 2549
		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;
2550
		if ( p === DepthStencilFormat ) return _gl.DEPTH_STENCIL;
M
Mr.doob 已提交
2551

R
Rich Harris 已提交
2552 2553 2554
		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 已提交
2555

R
Rich Harris 已提交
2556 2557 2558 2559 2560 2561 2562 2563
		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 已提交
2564

R
Rich Harris 已提交
2565 2566 2567
		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 已提交
2568

2569 2570
		if ( p === RGB_S3TC_DXT1_Format || p === RGBA_S3TC_DXT1_Format ||
			p === RGBA_S3TC_DXT3_Format || p === RGBA_S3TC_DXT5_Format ) {
M
Mr.doob 已提交
2571

2572
			extension = extensions.get( 'WEBGL_compressed_texture_s3tc' );
2573

2574 2575 2576 2577 2578 2579 2580 2581
			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 已提交
2582 2583 2584

		}

2585
		if ( p === RGB_PVRTC_4BPPV1_Format || p === RGB_PVRTC_2BPPV1_Format ||
2586
			p === RGBA_PVRTC_4BPPV1_Format || p === RGBA_PVRTC_2BPPV1_Format ) {
2587

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

2590 2591 2592 2593 2594 2595 2596 2597
			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 已提交
2598 2599 2600

		}

2601
		if ( p === RGB_ETC1_Format ) {
2602

2603
			extension = extensions.get( 'WEBGL_compressed_texture_etc1' );
2604

2605
			if ( extension !== null ) return extension.COMPRESSED_RGB_ETC1_WEBGL;
2606 2607 2608

		}

2609 2610 2611
		if ( p === MinEquation || p === MaxEquation ) {

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

2613
			if ( extension !== null ) {
2614

2615 2616 2617 2618
				if ( p === MinEquation ) return extension.MIN_EXT;
				if ( p === MaxEquation ) return extension.MAX_EXT;

			}
2619 2620 2621

		}

2622
		if ( p === UnsignedInt248Type ) {
2623

2624
			extension = extensions.get( 'WEBGL_depth_texture' );
2625

2626
			if ( extension !== null ) return extension.UNSIGNED_INT_24_8_WEBGL;
2627 2628 2629

		}

M
Mr.doob 已提交
2630 2631
		return 0;

M
Mr.doob 已提交
2632
	}
M
Mr.doob 已提交
2633

M
Mr.doob 已提交
2634
}
R
Rich Harris 已提交
2635

T
Tristan VALCKE 已提交
2636

2637
export { WebGLRenderer };