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
		properties = new WebGLProperties();
		textures = new WebGLTextures( _gl, extensions, state, properties, capabilities, paramThreeToGL, _infoMemory );
		attributes = new WebGLAttributes( _gl );
		geometries = new WebGLGeometries( _gl, attributes, _infoMemory );
M
Mr.doob 已提交
278
		objects = new WebGLObjects( geometries, _infoRender );
279
		programCache = new WebGLPrograms( _this, extensions, capabilities );
280
		lights = new WebGLLights();
281
		renderLists = new WebGLRenderLists();
282

M
Mr.doob 已提交
283
		background = new WebGLBackground( _this, state, geometries, _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();

493
		vr.dispose();
494

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( programAttributes.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;

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

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

1136
		shadowMap.render( shadowsArray, 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
		// custom renderers
M
Mr.doob 已提交
1187

1188 1189
		spriteRenderer.render( spritesArray, scene, camera );
		flareRenderer.render( flaresArray, 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
					spritesArray.push( object );
M
Mr.doob 已提交
1293

1294
				}
M
Mr.doob 已提交
1295

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

1298
				flaresArray.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 ||
W
WestLangley 已提交
1823 1824
				material.isMeshDepthMaterial ||
				material.isMeshDistanceMaterial ) {
M
Mr.doob 已提交
1825 1826 1827 1828 1829 1830 1831

				refreshUniformsCommon( m_uniforms, material );

			}

			// refresh single material specific uniforms

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

				refreshUniformsLine( m_uniforms, material );

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

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

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

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

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

				refreshUniformsLambert( m_uniforms, material );

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

				refreshUniformsToon( m_uniforms, material );

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

				refreshUniformsPhong( m_uniforms, material );

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

				refreshUniformsPhysical( m_uniforms, material );

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

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

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

W
WestLangley 已提交
1867
				refreshUniformsDepth( m_uniforms, material );
1868

W
WestLangley 已提交
1869
			} else if ( material.isMeshDistanceMaterial ) {
1870

W
WestLangley 已提交
1871
				refreshUniformsDistance( m_uniforms, material );
1872

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

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

			}

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

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

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

		}

M
Mr.doob 已提交
1890

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

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

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

	}

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

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

		uniforms.opacity.value = material.opacity;

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

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

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

		}

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

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

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

		}

1926
		if ( material.aoMap ) {
1927

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

		}

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

		var uvScaleMap;

		if ( material.map ) {

			uvScaleMap = material.map;

		} else if ( material.specularMap ) {

			uvScaleMap = material.specularMap;

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

			uvScaleMap = material.displacementMap;

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

			uvScaleMap = material.normalMap;

		} else if ( material.bumpMap ) {

			uvScaleMap = material.bumpMap;

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

			uvScaleMap = material.roughnessMap;

		} else if ( material.metalnessMap ) {

			uvScaleMap = material.metalnessMap;

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

			uvScaleMap = material.alphaMap;

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

			uvScaleMap = material.emissiveMap;

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

		if ( uvScaleMap !== undefined ) {

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

				uvScaleMap = uvScaleMap.texture;

			}

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

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

		}

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

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

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

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

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

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

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

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

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

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

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

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

		uniforms.map.value = material.map;

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

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

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

		}

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

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

		uniforms.fogColor.value = fog.color;

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

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

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

			uniforms.fogDensity.value = fog.density;

		}

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

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

		if ( material.emissiveMap ) {

			uniforms.emissiveMap.value = material.emissiveMap;

		}

	}

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

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

2077
		if ( material.emissiveMap ) {
2078

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

2081
		}
M
Mr.doob 已提交
2082

2083 2084 2085 2086
		if ( material.bumpMap ) {

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

2088
		}
M
Mr.doob 已提交
2089

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

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

		}
M
Mr.doob 已提交
2096

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

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

2103
		}
2104

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

	function refreshUniformsToon( uniforms, material ) {

		refreshUniformsPhong( uniforms, material );

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

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

		}

2117 2118
	}

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

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

		if ( material.roughnessMap ) {

			uniforms.roughnessMap.value = material.roughnessMap;

		}

		if ( material.metalnessMap ) {

			uniforms.metalnessMap.value = material.metalnessMap;

		}

		if ( material.emissiveMap ) {

			uniforms.emissiveMap.value = material.emissiveMap;

		}

		if ( material.bumpMap ) {

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

		}

		if ( material.normalMap ) {

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

		}

		if ( material.displacementMap ) {

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

		}

		if ( material.envMap ) {

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

		}

	}

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

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

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

	}

W
WestLangley 已提交
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 2208 2209
	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;

	}

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

		}

	}

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

M
Mr.doob 已提交
2238
	function markUniformsLightsNeedsUpdate( uniforms, value ) {
2239

M
Mr.doob 已提交
2240
		uniforms.ambientLightColor.needsUpdate = value;
2241

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

M
Mr.doob 已提交
2248
	}
2249

M
Mr.doob 已提交
2250 2251 2252 2253
	// GL state setting

	this.setFaceCulling = function ( cullFace, frontFaceDirection ) {

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

	};

	// Textures

T
tschw 已提交
2261 2262 2263 2264 2265 2266
	function allocTextureUnit() {

		var textureUnit = _usedTextureUnits;

		if ( textureUnit >= capabilities.maxTextures ) {

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

		}

		_usedTextureUnits += 1;

		return textureUnit;

	}

2277
	this.allocTextureUnit = allocTextureUnit;
T
tschw 已提交
2278

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

2282
		var warned = false;
T
tschw 已提交
2283

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

T
Takahiro 已提交
2287
			if ( texture && texture.isWebGLRenderTarget ) {
T
tschw 已提交
2288

2289
				if ( ! warned ) {
T
tschw 已提交
2290

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

2294
				}
T
tschw 已提交
2295

2296
				texture = texture.texture;
T
tschw 已提交
2297

2298
			}
T
tschw 已提交
2299

2300
			textures.setTexture2D( texture, slot );
T
tschw 已提交
2301

2302
		};
T
tschw 已提交
2303

2304
	}() );
T
tschw 已提交
2305

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

		var warned = false;

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

			if ( ! warned ) {

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

			}

2319
			textures.setTexture2D( texture, slot );
2320 2321 2322 2323 2324

		};

	}() );

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

		var warned = false;

W
WestLangley 已提交
2329
		return function setTextureCube( texture, slot ) {
2330 2331

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

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

				// CompressedTexture can have Array in image :/

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

			} else {

				// assumed: texture property of THREE.WebGLRenderTargetCube

2359
				textures.setTextureCubeDynamic( texture, slot );
2360 2361 2362 2363 2364 2365

			}

		};

	}() );
T
tschw 已提交
2366

2367
	this.getRenderTarget = function () {
2368 2369 2370

		return _currentRenderTarget;

M
Michael Herzog 已提交
2371
	};
2372

2373
	this.setRenderTarget = function ( renderTarget ) {
M
Mr.doob 已提交
2374

2375 2376
		_currentRenderTarget = renderTarget;

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

2379
			textures.setupRenderTarget( renderTarget );
M
Mr.doob 已提交
2380 2381 2382

		}

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

		if ( renderTarget ) {

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

M
Mr.doob 已提交
2390
			if ( renderTarget.isWebGLRenderTargetCube ) {
M
Mr.doob 已提交
2391

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

			} else {

M
Mr.doob 已提交
2397
				framebuffer = __webglFramebuffer;
M
Mr.doob 已提交
2398 2399 2400

			}

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

M
Mr.doob 已提交
2405 2406
		} else {

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

M
Mr.doob 已提交
2411 2412
		}

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

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

		}

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

M
Mr.doob 已提交
2424 2425 2426
		if ( isCube ) {

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

		}

M
Mr.doob 已提交
2431 2432
	};

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

0
06wj 已提交
2435
		if ( ! ( renderTarget && renderTarget.isWebGLRenderTarget ) ) {
2436

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

G
gero3 已提交
2440
		}
2441

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

M
Mr.doob 已提交
2444
		if ( framebuffer ) {
2445

G
gero3 已提交
2446
			var restore = false;
2447

M
Mr.doob 已提交
2448
			if ( framebuffer !== _currentFramebuffer ) {
2449

M
Mr.doob 已提交
2450
				_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );
2451

G
gero3 已提交
2452
				restore = true;
2453

G
gero3 已提交
2454
			}
2455

M
Mr.doob 已提交
2456
			try {
2457

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

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

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

M
Mr.doob 已提交
2467
				}
2468

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

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

M
Mr.doob 已提交
2476
				}
2477

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

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

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

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

					}
2487

M
Mr.doob 已提交
2488
				} else {
M
Mr.doob 已提交
2489

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

				}
M
Mr.doob 已提交
2493

M
Mr.doob 已提交
2494
			} finally {
M
Mr.doob 已提交
2495

M
Mr.doob 已提交
2496 2497 2498
				if ( restore ) {

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

M
Mr.doob 已提交
2500 2501 2502
				}

			}
M
Mr.doob 已提交
2503 2504 2505

		}

M
Mr.doob 已提交
2506 2507
	};

M
Mr.doob 已提交
2508 2509
	// Map three.js constants to WebGL constants

M
Mr.doob 已提交
2510
	function paramThreeToGL( p ) {
M
Mr.doob 已提交
2511

2512 2513
		var extension;

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

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

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

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

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

2538
		if ( p === HalfFloatType ) {
2539

2540
			extension = extensions.get( 'OES_texture_half_float' );
2541

2542
			if ( extension !== null ) return extension.HALF_FLOAT_OES;
2543 2544 2545

		}

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

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

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

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

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

2574
			extension = extensions.get( 'WEBGL_compressed_texture_s3tc' );
2575

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

		}

2587
		if ( p === RGB_PVRTC_4BPPV1_Format || p === RGB_PVRTC_2BPPV1_Format ||
2588
			p === RGBA_PVRTC_4BPPV1_Format || p === RGBA_PVRTC_2BPPV1_Format ) {
2589

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

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

		}

2603
		if ( p === RGB_ETC1_Format ) {
2604

2605
			extension = extensions.get( 'WEBGL_compressed_texture_etc1' );
2606

2607
			if ( extension !== null ) return extension.COMPRESSED_RGB_ETC1_WEBGL;
2608 2609 2610

		}

2611 2612 2613
		if ( p === MinEquation || p === MaxEquation ) {

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

2615
			if ( extension !== null ) {
2616

2617 2618 2619 2620
				if ( p === MinEquation ) return extension.MIN_EXT;
				if ( p === MaxEquation ) return extension.MAX_EXT;

			}
2621 2622 2623

		}

2624
		if ( p === UnsignedInt248Type ) {
2625

2626
			extension = extensions.get( 'WEBGL_depth_texture' );
2627

2628
			if ( extension !== null ) return extension.UNSIGNED_INT_24_8_WEBGL;
2629 2630 2631

		}

M
Mr.doob 已提交
2632 2633
		return 0;

M
Mr.doob 已提交
2634
	}
M
Mr.doob 已提交
2635

M
Mr.doob 已提交
2636
}
R
Rich Harris 已提交
2637

T
Tristan VALCKE 已提交
2638

2639
export { WebGLRenderer };