WebGLRenderer.js 61.1 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';
15
import { WebGLMorphtargets } from './webgl/WebGLMorphtargets';
R
Rich Harris 已提交
16 17
import { WebGLIndexedBufferRenderer } from './webgl/WebGLIndexedBufferRenderer';
import { WebGLBufferRenderer } from './webgl/WebGLBufferRenderer';
18
import { WebGLGeometries } from './webgl/WebGLGeometries';
R
Rich Harris 已提交
19 20
import { WebGLLights } from './webgl/WebGLLights';
import { WebGLObjects } from './webgl/WebGLObjects';
21
import { WebGLPrograms } from './webgl/WebGLPrograms';
R
Rich Harris 已提交
22 23 24 25
import { WebGLTextures } from './webgl/WebGLTextures';
import { WebGLProperties } from './webgl/WebGLProperties';
import { WebGLState } from './webgl/WebGLState';
import { WebGLCapabilities } from './webgl/WebGLCapabilities';
26
import { WebVRManager } from './webvr/WebVRManager';
R
Rich Harris 已提交
27 28 29
import { BufferGeometry } from '../core/BufferGeometry';
import { WebGLExtensions } from './webgl/WebGLExtensions';
import { Vector3 } from '../math/Vector3';
M
Mr.doob 已提交
30
// import { Sphere } from '../math/Sphere';
R
Rich Harris 已提交
31 32 33 34
import { WebGLClipping } from './webgl/WebGLClipping';
import { Frustum } from '../math/Frustum';
import { Vector4 } from '../math/Vector4';

M
Mr.doob 已提交
35 36 37 38 39
/**
 * @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 已提交
40
 * @author tschw
M
Mr.doob 已提交
41 42
 */

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

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

	parameters = parameters || {};

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

52 53 54 55 56 57
		_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 已提交
58

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

62
	var currentRenderList = null;
63

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

M
Mr.doob 已提交
67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
	// 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 已提交
83 84 85 86 87
	// user-defined clipping

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

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

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

94 95
	// physical lights

96
	this.physicallyCorrectLights = false;
97

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

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

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

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

	// internal properties

	var _this = this,

113 114
		_isContextLost = false,

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

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

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

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

129
		//
130

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

133
		//
M
Mr.doob 已提交
134

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

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

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

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

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

148
		// clipping
T
tschw 已提交
149

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

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

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

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

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

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

167
		_infoRender = {
168

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

175
		};
M
Mr.doob 已提交
176

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

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

	};
184

185 186 187 188 189
	function getTargetPixelRatio() {

		return _currentRenderTarget === null ? _pixelRatio : 1;

	}
190

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

	var _gl;

M
Mr.doob 已提交
195 196
	try {

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

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

		if ( _gl === null ) {

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

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

			} else {

				throw 'Error creating WebGL context.';

			}
M
Mr.doob 已提交
219 220 221

		}

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

		if ( _gl.getShaderPrecisionFormat === undefined ) {

			_gl.getShaderPrecisionFormat = function () {

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

			};

		}

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

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

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

	}

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

247
	var background, morphtargets, bufferRenderer, indexedBufferRenderer;
248
	var flareRenderer, spriteRenderer;
249

250
	function initGLContext() {
251

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

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

263
			BufferGeometry.MaxIndex = 4294967296;
264

265
		}
266

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

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

273 274 275 276
		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 已提交
277
		objects = new WebGLObjects( geometries, _infoRender );
278
		morphtargets = new WebGLMorphtargets( _gl );
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
		flareRenderer = new WebGLFlareRenderer( _this, _gl, state, textures, capabilities );
		spriteRenderer = new WebGLSpriteRenderer( _this, _gl, state, textures, capabilities );
290

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;

	};

660
	this.renderBufferDirect = function ( camera, fog, geometry, material, object, group ) {
661

662
		state.setMaterial( material );
M
Mr.doob 已提交
663

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

M
Mr.doob 已提交
667
		var updateBuffers = false;
M
Mr.doob 已提交
668 669 670 671 672 673 674 675

		if ( geometryProgram !== _currentGeometryProgram ) {

			_currentGeometryProgram = geometryProgram;
			updateBuffers = true;

		}

676
		if ( object.morphTargetInfluences ) {
677

678
			morphtargets.update( object, geometry, material, program );
M
Mr.doob 已提交
679 680 681 682 683

			updateBuffers = true;

		}

684 685
		//

686
		var index = geometry.index;
687
		var position = geometry.attributes.position;
688
		var rangeFactor = 1;
689

690 691
		if ( material.wireframe === true ) {

692
			index = geometries.getWireframeAttribute( geometry );
693
			rangeFactor = 2;
694 695 696

		}

M
Mr.doob 已提交
697
		var attribute;
M
Mr.doob 已提交
698
		var renderer = bufferRenderer;
699

700
		if ( index !== null ) {
701

M
Mr.doob 已提交
702
			attribute = attributes.get( index );
703

704
			renderer = indexedBufferRenderer;
M
Mr.doob 已提交
705
			renderer.setIndex( attribute );
706

707
		}
M
Mr.doob 已提交
708

709
		if ( updateBuffers ) {
M
Mr.doob 已提交
710

711
			setupVertexAttributes( material, program, geometry );
M
Mr.doob 已提交
712

713
			if ( index !== null ) {
714

M
Mr.doob 已提交
715
				_gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, attribute.buffer );
716 717 718

			}

719
		}
720

721 722
		//

723
		var dataCount = 0;
724

M
Mr.doob 已提交
725
		if ( index !== null ) {
726

M
Mr.doob 已提交
727
			dataCount = index.count;
728

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

M
Mr.doob 已提交
731
			dataCount = position.count;
732

M
Mr.doob 已提交
733
		}
734

M
Mr.doob 已提交
735 736
		var rangeStart = geometry.drawRange.start * rangeFactor;
		var rangeCount = geometry.drawRange.count * rangeFactor;
737

M
Mr.doob 已提交
738 739
		var groupStart = group !== null ? group.start * rangeFactor : 0;
		var groupCount = group !== null ? group.count * rangeFactor : Infinity;
740

M
Mr.doob 已提交
741 742
		var drawStart = Math.max( rangeStart, groupStart );
		var drawEnd = Math.min( dataCount, rangeStart + rangeCount, groupStart + groupCount ) - 1;
M
Mr.doob 已提交
743 744 745

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

746 747
		if ( drawCount === 0 ) return;

M
Mr.doob 已提交
748
		//
749

750
		if ( object.isMesh ) {
751

752
			if ( material.wireframe === true ) {
753

754
				state.setLineWidth( material.wireframeLinewidth * getTargetPixelRatio() );
755
				renderer.setMode( _gl.LINES );
756

757
			} else {
M
Mr.doob 已提交
758 759

				switch ( object.drawMode ) {
760

R
Rich Harris 已提交
761
					case TrianglesDrawMode:
B
Ben Adams 已提交
762 763 764
						renderer.setMode( _gl.TRIANGLES );
						break;

R
Rich Harris 已提交
765
					case TriangleStripDrawMode:
B
Ben Adams 已提交
766 767 768
						renderer.setMode( _gl.TRIANGLE_STRIP );
						break;

R
Rich Harris 已提交
769
					case TriangleFanDrawMode:
B
Ben Adams 已提交
770 771 772 773
						renderer.setMode( _gl.TRIANGLE_FAN );
						break;

				}
774

775
			}
776

777

778
		} else if ( object.isLine ) {
779

780
			var lineWidth = material.linewidth;
781

782
			if ( lineWidth === undefined ) lineWidth = 1; // Not using Line*Material
783

784
			state.setLineWidth( lineWidth * getTargetPixelRatio() );
785

786
			if ( object.isLineSegments ) {
787

788
				renderer.setMode( _gl.LINES );
789

790 791 792 793
			} else if ( object.isLineLoop ) {

				renderer.setMode( _gl.LINE_LOOP );

794
			} else {
795

796
				renderer.setMode( _gl.LINE_STRIP );
797 798

			}
M
Mr.doob 已提交
799

800
		} else if ( object.isPoints ) {
801 802

			renderer.setMode( _gl.POINTS );
803 804

		}
805

T
Takahiro 已提交
806
		if ( geometry && geometry.isInstancedBufferGeometry ) {
M
Mr.doob 已提交
807 808 809

			if ( geometry.maxInstancedCount > 0 ) {

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

J
jfranc 已提交
812
			}
813 814 815

		} else {

M
Mr.doob 已提交
816
			renderer.render( drawStart, drawCount );
817

M
Mr.doob 已提交
818 819 820 821
		}

	};

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

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

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

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

M
Mr.doob 已提交
831 832 833
			}

		}
B
Ben Adams 已提交
834

835 836
		if ( startIndex === undefined ) startIndex = 0;

837 838
		state.initAttributes();

839
		var geometryAttributes = geometry.attributes;
840

841
		var programAttributes = program.getAttributes();
842

843
		var materialDefaultAttributeValues = material.defaultAttributeValues;
844

845
		for ( var name in programAttributes ) {
846

847
			var programAttribute = programAttributes[ name ];
M
Mr.doob 已提交
848

M
Mr.doob 已提交
849
			if ( programAttribute >= 0 ) {
M
Mr.doob 已提交
850

851
				var geometryAttribute = geometryAttributes[ name ];
852

M
Mr.doob 已提交
853
				if ( geometryAttribute !== undefined ) {
M
Mr.doob 已提交
854

855
					var normalized = geometryAttribute.normalized;
856
					var size = geometryAttribute.itemSize;
857

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

860 861 862 863
					// TODO Attribute may not be available on context restore

					if ( attribute === undefined ) continue;

M
Mr.doob 已提交
864 865 866
					var buffer = attribute.buffer;
					var type = attribute.type;
					var bytesPerElement = attribute.bytesPerElement;
867

A
aardgoose 已提交
868
					if ( geometryAttribute.isInterleavedBufferAttribute ) {
869

M
Mr.doob 已提交
870 871 872 873
						var data = geometryAttribute.data;
						var stride = data.stride;
						var offset = geometryAttribute.offset;

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

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

M
Mr.doob 已提交
878
							if ( geometry.maxInstancedCount === undefined ) {
879

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

M
Mr.doob 已提交
882
							}
B
Ben Adams 已提交
883

M
Mr.doob 已提交
884
						} else {
B
Ben Adams 已提交
885

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

M
Mr.doob 已提交
888
						}
B
Ben Adams 已提交
889

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

M
Mr.doob 已提交
893
					} else {
B
Ben Adams 已提交
894

A
aardgoose 已提交
895
						if ( geometryAttribute.isInstancedBufferAttribute ) {
B
Ben Adams 已提交
896

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

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

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

M
Mr.doob 已提交
903
							}
B
Ben Adams 已提交
904

M
Mr.doob 已提交
905 906 907 908
						} else {

							state.enableAttribute( programAttribute );

M
Mr.doob 已提交
909
						}
B
Ben Adams 已提交
910

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

B
Ben Adams 已提交
914
					}
M
Mr.doob 已提交
915

916 917
				} else if ( materialDefaultAttributeValues !== undefined ) {

T
tschw 已提交
918
					var value = materialDefaultAttributeValues[ name ];
919

920
					if ( value !== undefined ) {
M
Mr.doob 已提交
921

922
						switch ( value.length ) {
M
Mr.doob 已提交
923

924 925 926
							case 2:
								_gl.vertexAttrib2fv( programAttribute, value );
								break;
M
Mr.doob 已提交
927

928 929 930
							case 3:
								_gl.vertexAttrib3fv( programAttribute, value );
								break;
M
Mr.doob 已提交
931

932 933 934
							case 4:
								_gl.vertexAttrib4fv( programAttribute, value );
								break;
935

936 937
							default:
								_gl.vertexAttrib1fv( programAttribute, value );
938 939

						}
M
Mr.doob 已提交
940 941 942 943 944 945 946 947

					}

				}

			}

		}
948

949
		state.disableUnusedAttributes();
950

M
Mr.doob 已提交
951 952
	}

M
Mr.doob 已提交
953
	// Compile
M
Mr.doob 已提交
954

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

957 958
		lightsArray.length = 0;
		shadowsArray.length = 0;
959

M
Mr.doob 已提交
960
		scene.traverse( function ( object ) {
G
gero3 已提交
961 962

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

964 965 966 967 968 969 970
				lightsArray.push( object );

				if ( object.castShadow ) {

					shadowsArray.push( object );

				}
M
Mr.doob 已提交
971

G
gero3 已提交
972
			}
M
Mr.doob 已提交
973 974 975

		} );

976
		lights.setup( lightsArray, shadowsArray, camera );
M
Mr.doob 已提交
977 978 979 980 981

		scene.traverse( function ( object ) {

			if ( object.material ) {

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

G
gero3 已提交
984
					for ( var i = 0; i < object.material.length; i ++ ) {
M
Mr.doob 已提交
985 986 987

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

G
gero3 已提交
988
					}
M
Mr.doob 已提交
989

G
gero3 已提交
990
				} else {
M
Mr.doob 已提交
991 992 993

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

G
gero3 已提交
994
				}
M
Mr.doob 已提交
995

G
gero3 已提交
996
			}
M
Mr.doob 已提交
997 998

		} );
G
gero3 已提交
999 1000

	};
1001

M
Mr.doob 已提交
1002 1003
	// Rendering

1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017
	this.animate = function ( callback ) {

		function onFrame() {

			callback();

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

		}

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

	};

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

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

1022
			console.error( 'THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.' );
M
Mr.doob 已提交
1023 1024 1025 1026
			return;

		}

1027 1028
		if ( _isContextLost ) return;

M
Mr.doob 已提交
1029 1030
		// reset caching for this frame

1031
		_currentGeometryProgram = '';
1032
		_currentMaterialId = - 1;
1033
		_currentCamera = null;
M
Mr.doob 已提交
1034 1035 1036

		// update scene graph

1037
		if ( scene.autoUpdate === true ) scene.updateMatrixWorld();
M
Mr.doob 已提交
1038 1039 1040

		// update camera matrices and frustum

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

1043 1044 1045 1046 1047 1048
		if ( vr.enabled ) {

			camera = vr.getCamera( camera );

		}

M
Mr.doob 已提交
1049 1050 1051
		_projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );
		_frustum.setFromMatrix( _projScreenMatrix );

1052 1053 1054
		lightsArray.length = 0;
		shadowsArray.length = 0;

1055 1056
		spritesArray.length = 0;
		flaresArray.length = 0;
M
Mr.doob 已提交
1057

T
tschw 已提交
1058
		_localClippingEnabled = this.localClippingEnabled;
M
Mr.doob 已提交
1059
		_clippingEnabled = _clipping.init( this.clippingPlanes, _localClippingEnabled, camera );
T
tschw 已提交
1060

1061 1062 1063
		currentRenderList = renderLists.get( scene, camera );
		currentRenderList.init();

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

M
Mr.doob 已提交
1066
		if ( _this.sortObjects === true ) {
1067

1068
			currentRenderList.sort();
M
Mr.doob 已提交
1069

1070 1071
		}

M
Mr.doob 已提交
1072
		//
M
Mr.doob 已提交
1073

T
tschw 已提交
1074
		if ( _clippingEnabled ) _clipping.beginShadows();
T
tschw 已提交
1075

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

1078
		lights.setup( lightsArray, shadowsArray, camera );
1079

T
tschw 已提交
1080
		if ( _clippingEnabled ) _clipping.endShadows();
T
tschw 已提交
1081

M
Mr.doob 已提交
1082 1083
		//

M
Mr.doob 已提交
1084
		_infoRender.frame ++;
1085 1086 1087 1088
		_infoRender.calls = 0;
		_infoRender.vertices = 0;
		_infoRender.faces = 0;
		_infoRender.points = 0;
M
Mr.doob 已提交
1089

1090 1091 1092 1093 1094 1095
		if ( renderTarget === undefined ) {

			renderTarget = null;

		}

M
Mr.doob 已提交
1096 1097
		this.setRenderTarget( renderTarget );

M
Mr.doob 已提交
1098 1099
		//

1100
		background.render( currentRenderList, scene, camera, forceClear );
M
Mr.doob 已提交
1101

1102
		// render scene
M
Mr.doob 已提交
1103

1104 1105
		var opaqueObjects = currentRenderList.opaque;
		var transparentObjects = currentRenderList.transparent;
M
Mr.doob 已提交
1106

1107
		if ( scene.overrideMaterial ) {
M
Mr.doob 已提交
1108

1109
			var overrideMaterial = scene.overrideMaterial;
1110

1111 1112
			if ( opaqueObjects.length ) renderObjects( opaqueObjects, scene, camera, overrideMaterial );
			if ( transparentObjects.length ) renderObjects( transparentObjects, scene, camera, overrideMaterial );
M
Mr.doob 已提交
1113

1114
		} else {
M
Mr.doob 已提交
1115

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

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

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

1122
			if ( transparentObjects.length ) renderObjects( transparentObjects, scene, camera );
M
Mr.doob 已提交
1123 1124 1125

		}

1126
		// custom renderers
M
Mr.doob 已提交
1127

1128 1129
		spriteRenderer.render( spritesArray, scene, camera );
		flareRenderer.render( flaresArray, scene, camera, _currentViewport );
M
Mr.doob 已提交
1130 1131 1132

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

M
Mr.doob 已提交
1133 1134
		if ( renderTarget ) {

1135
			textures.updateRenderTargetMipmap( renderTarget );
M
Mr.doob 已提交
1136 1137 1138

		}

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

1141 1142 1143
		state.buffers.depth.setTest( true );
		state.buffers.depth.setMask( true );
		state.buffers.color.setMask( true );
M
Mr.doob 已提交
1144

M
Mr.doob 已提交
1145 1146 1147 1148 1149
		if ( vr.enabled ) {

			vr.submitFrame();

		}
M
Mr.doob 已提交
1150

M
Mr.doob 已提交
1151 1152 1153
		// _gl.finish();

	};
M
Mr.doob 已提交
1154

1155
	/*
M
Mr.doob 已提交
1156 1157
	// TODO Duplicated code (Frustum)

1158 1159
	var _sphere = new Sphere();

T
tschw 已提交
1160 1161 1162 1163 1164 1165 1166
	function isObjectViewable( object ) {

		var geometry = object.geometry;

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

M
Mr.doob 已提交
1167
		_sphere.copy( geometry.boundingSphere ).
1168
		applyMatrix4( object.matrixWorld );
M
Mr.doob 已提交
1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184

		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 已提交
1185 1186

		if ( ! _frustum.intersectsSphere( sphere ) ) return false;
T
tschw 已提交
1187 1188 1189 1190

		var numPlanes = _clipping.numPlanes;

		if ( numPlanes === 0 ) return true;
T
tschw 已提交
1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202

		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 已提交
1203
		} while ( ++ i !== numPlanes );
T
tschw 已提交
1204 1205 1206 1207

		return true;

	}
1208
	*/
T
tschw 已提交
1209

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

M
Mr.doob 已提交
1212
		if ( ! object.visible ) return;
M
Mr.doob 已提交
1213

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

1216
		if ( visible ) {
1217

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

1220 1221 1222 1223 1224 1225 1226
				lightsArray.push( object );

				if ( object.castShadow ) {

					shadowsArray.push( object );

				}
M
Mr.doob 已提交
1227

1228
			} else if ( object.isSprite ) {
M
Mr.doob 已提交
1229

1230
				if ( ! object.frustumCulled || _frustum.intersectsSprite( object ) ) {
1231

1232
					spritesArray.push( object );
M
Mr.doob 已提交
1233

1234
				}
M
Mr.doob 已提交
1235

1236
			} else if ( object.isLensFlare ) {
M
Mr.doob 已提交
1237

1238
				flaresArray.push( object );
M
Mr.doob 已提交
1239

1240
			} else if ( object.isImmediateRenderObject ) {
M
Mr.doob 已提交
1241

1242
				if ( sortObjects ) {
M
Mr.doob 已提交
1243

1244 1245
					_vector3.setFromMatrixPosition( object.matrixWorld )
						.applyMatrix4( _projScreenMatrix );
M
Mr.doob 已提交
1246

1247
				}
M
Mr.doob 已提交
1248

1249
				currentRenderList.push( object, null, object.material, _vector3.z, null );
1250

1251
			} else if ( object.isMesh || object.isLine || object.isPoints ) {
1252

1253
				if ( object.isSkinnedMesh ) {
1254

1255
					object.skeleton.update();
1256

1257
				}
1258

1259
				if ( ! object.frustumCulled || _frustum.intersectsObject( object ) ) {
1260

1261 1262 1263 1264 1265 1266
					if ( sortObjects ) {

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

					}
1267

1268 1269
					var geometry = objects.update( object );
					var material = object.material;
1270

1271
					if ( Array.isArray( material ) ) {
1272

1273
						var groups = geometry.groups;
1274

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

1277 1278
							var group = groups[ i ];
							var groupMaterial = material[ group.materialIndex ];
1279

1280
							if ( groupMaterial && groupMaterial.visible ) {
1281

1282 1283 1284
								currentRenderList.push( object, geometry, groupMaterial, _vector3.z, group );

							}
M
Mr.doob 已提交
1285

M
Mr.doob 已提交
1286
						}
M
Mr.doob 已提交
1287

1288
					} else if ( material.visible ) {
1289

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

1292
					}
M
Mr.doob 已提交
1293

1294
				}
M
Mr.doob 已提交
1295

1296
			}
M
Mr.doob 已提交
1297

M
Mr.doob 已提交
1298
		}
M
Mr.doob 已提交
1299

M
Mr.doob 已提交
1300
		var children = object.children;
M
Mr.doob 已提交
1301

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

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

1306
		}
1307

1308
	}
M
Mr.doob 已提交
1309

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

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

1314
			var renderItem = renderList[ i ];
1315

1316 1317 1318 1319
			var object = renderItem.object;
			var geometry = renderItem.geometry;
			var material = overrideMaterial === undefined ? renderItem.material : overrideMaterial;
			var group = renderItem.group;
1320

1321
			if ( camera.isArrayCamera ) {
M
Mr.doob 已提交
1322

1323 1324
				_currentArrayCamera = camera;

1325
				var cameras = camera.cameras;
1326

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

1329
					var camera2 = cameras[ j ];
M
Mr.doob 已提交
1330

1331
					if ( object.layers.test( camera2.layers ) ) {
1332

1333
						var bounds = camera2.bounds;
M
Mr.doob 已提交
1334

1335 1336 1337 1338 1339
						var x = bounds.x * _width;
						var y = bounds.y * _height;
						var width = bounds.z * _width;
						var height = bounds.w * _height;

1340 1341
						state.viewport( _currentViewport.set( x, y, width, height ).multiplyScalar( _pixelRatio ) );
						state.scissor( _currentScissor.set( x, y, width, height ).multiplyScalar( _pixelRatio ) );
1342
						state.setScissorTest( true );
1343 1344 1345 1346

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

					}
M
Mr.doob 已提交
1347

1348
				}
1349

1350
			} else {
M
Mr.doob 已提交
1351

1352 1353
				_currentArrayCamera = null;

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

1356
			}
M
Mr.doob 已提交
1357

1358
		}
M
Mr.doob 已提交
1359

1360
	}
G
gero3 已提交
1361

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

1364 1365
		object.onBeforeRender( _this, scene, camera, geometry, material, group );

M
Mr.doob 已提交
1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384
		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 已提交
1385 1386
		object.onAfterRender( _this, scene, camera, geometry, material, group );

M
Mr.doob 已提交
1387 1388
	}

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

1391
		var materialProperties = properties.get( material );
G
gero3 已提交
1392

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

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

1398
		var program = materialProperties.program;
T
tschw 已提交
1399
		var programChange = true;
1400

1401
		if ( program === undefined ) {
B
Ben Adams 已提交
1402

M
Mr.doob 已提交
1403 1404
			// new material
			material.addEventListener( 'dispose', onMaterialDispose );
B
Ben Adams 已提交
1405

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

M
Mr.doob 已提交
1408
			// changed glsl or parameters
1409
			releaseMaterialProgramReference( material );
B
Ben Adams 已提交
1410

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

T
tschw 已提交
1413
			// same glsl and uniform list
T
tschw 已提交
1414 1415
			return;

T
tschw 已提交
1416
		} else {
B
Ben Adams 已提交
1417

T
tschw 已提交
1418 1419
			// only rebuild uniform list
			programChange = false;
B
Ben Adams 已提交
1420 1421 1422

		}

1423
		if ( programChange ) {
B
Ben Adams 已提交
1424

1425
			if ( parameters.shaderID ) {
B
Ben Adams 已提交
1426

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

1429
				materialProperties.shader = {
1430
					name: material.type,
1431
					uniforms: UniformsUtils.clone( shader.uniforms ),
1432 1433 1434
					vertexShader: shader.vertexShader,
					fragmentShader: shader.fragmentShader
				};
B
Ben Adams 已提交
1435

1436
			} else {
B
Ben Adams 已提交
1437

1438
				materialProperties.shader = {
1439 1440 1441 1442 1443
					name: material.type,
					uniforms: material.uniforms,
					vertexShader: material.vertexShader,
					fragmentShader: material.fragmentShader
				};
G
gero3 已提交
1444

1445
			}
G
gero3 已提交
1446

1447
			material.onBeforeCompile( materialProperties.shader );
G
gero3 已提交
1448

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

1451 1452
			materialProperties.program = program;
			material.program = program;
1453 1454 1455

		}

1456
		var programAttributes = program.getAttributes();
M
Mr.doob 已提交
1457 1458 1459 1460 1461

		if ( material.morphTargets ) {

			material.numSupportedMorphTargets = 0;

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

1464
				if ( programAttributes[ 'morphTarget' + i ] >= 0 ) {
M
Mr.doob 已提交
1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477

					material.numSupportedMorphTargets ++;

				}

			}

		}

		if ( material.morphNormals ) {

			material.numSupportedMorphNormals = 0;

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

1480
				if ( programAttributes[ 'morphNormal' + i ] >= 0 ) {
M
Mr.doob 已提交
1481 1482 1483 1484 1485 1486 1487 1488 1489

					material.numSupportedMorphNormals ++;

				}

			}

		}

1490
		var uniforms = materialProperties.shader.uniforms;
T
tschw 已提交
1491

1492
		if ( ! material.isShaderMaterial &&
1493 1494
			! material.isRawShaderMaterial ||
			material.clipping === true ) {
T
tschw 已提交
1495

T
tschw 已提交
1496
			materialProperties.numClippingPlanes = _clipping.numPlanes;
1497
			materialProperties.numIntersection = _clipping.numIntersection;
T
tschw 已提交
1498
			uniforms.clippingPlanes = _clipping.uniform;
T
tschw 已提交
1499 1500 1501

		}

1502
		materialProperties.fog = fog;
1503

1504
		// store the light setup it was created for
1505

1506
		materialProperties.lightsHash = lights.state.hash;
1507

M
Mr.doob 已提交
1508
		if ( material.lights ) {
1509 1510 1511

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

1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524
			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;
1525
			// TODO (abelnation): add area lights shadow info to uniforms
1526

1527 1528
		}

T
tschw 已提交
1529 1530
		var progUniforms = materialProperties.program.getUniforms(),
			uniformsList =
1531
				WebGLUniforms.seqWithValue( progUniforms.seq, uniforms );
A
arose 已提交
1532

T
tschw 已提交
1533
		materialProperties.uniformsList = uniformsList;
A
arose 已提交
1534

M
Mr.doob 已提交
1535
	}
M
Mr.doob 已提交
1536

1537
	function setProgram( camera, fog, material, object ) {
M
Mr.doob 已提交
1538 1539 1540

		_usedTextureUnits = 0;

1541
		var materialProperties = properties.get( material );
1542

T
tschw 已提交
1543 1544 1545 1546 1547
		if ( _clippingEnabled ) {

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

				var useCache =
1548 1549
					camera === _currentCamera &&
					material.id === _currentMaterialId;
T
tschw 已提交
1550 1551 1552 1553

				// we might want to call this function with some ClippingGroup
				// object instead of the material, once it becomes feasible
				// (#8465, #8379)
T
tschw 已提交
1554
				_clipping.setState(
1555 1556
					material.clippingPlanes, material.clipIntersection, material.clipShadows,
					camera, materialProperties, useCache );
T
tschw 已提交
1557 1558 1559 1560 1561

			}

		}

1562
		if ( material.needsUpdate === false ) {
1563

1564
			if ( materialProperties.program === undefined ) {
1565

1566
				material.needsUpdate = true;
1567

1568
			} else if ( material.fog && materialProperties.fog !== fog ) {
1569

M
Mr.doob 已提交
1570
				material.needsUpdate = true;
1571

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

1574
				material.needsUpdate = true;
1575

1576
			} else if ( materialProperties.numClippingPlanes !== undefined &&
1577
				( materialProperties.numClippingPlanes !== _clipping.numPlanes ||
M
Mr.doob 已提交
1578
				materialProperties.numIntersection !== _clipping.numIntersection ) ) {
1579 1580 1581

				material.needsUpdate = true;

1582
			}
1583 1584 1585 1586

		}

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

1588
			initMaterial( material, fog, object );
M
Mr.doob 已提交
1589 1590 1591 1592
			material.needsUpdate = false;

		}

1593
		var refreshProgram = false;
M
Mr.doob 已提交
1594
		var refreshMaterial = false;
1595
		var refreshLights = false;
M
Mr.doob 已提交
1596

1597
		var program = materialProperties.program,
1598
			p_uniforms = program.getUniforms(),
1599
			m_uniforms = materialProperties.shader.uniforms;
M
Mr.doob 已提交
1600

1601
		if ( state.useProgram( program.program ) ) {
M
Mr.doob 已提交
1602

1603
			refreshProgram = true;
M
Mr.doob 已提交
1604
			refreshMaterial = true;
1605
			refreshLights = true;
M
Mr.doob 已提交
1606 1607 1608 1609 1610 1611

		}

		if ( material.id !== _currentMaterialId ) {

			_currentMaterialId = material.id;
1612

M
Mr.doob 已提交
1613 1614 1615 1616
			refreshMaterial = true;

		}

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

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

G
gero3 已提交
1621
			if ( capabilities.logarithmicDepthBuffer ) {
1622

T
tschw 已提交
1623
				p_uniforms.setValue( _gl, 'logDepthBufFC',
1624
					2.0 / ( Math.log( camera.far + 1.0 ) / Math.LN2 ) );
1625 1626 1627

			}

1628
			// Avoid unneeded uniform updates per ArrayCamera's sub-camera
1629

1630
			if ( _currentCamera !== ( _currentArrayCamera || camera ) ) {
1631

1632
				_currentCamera = ( _currentArrayCamera || camera );
1633 1634 1635 1636 1637 1638

				// 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 已提交
1639
				refreshLights = true;		// remains set until update done
1640 1641

			}
M
Mr.doob 已提交
1642

1643 1644 1645
			// load material specific uniforms
			// (shader material also gets them for the sake of genericity)

1646
			if ( material.isShaderMaterial ||
1647 1648 1649
				material.isMeshPhongMaterial ||
				material.isMeshStandardMaterial ||
				material.envMap ) {
1650

T
tschw 已提交
1651 1652 1653
				var uCamPos = p_uniforms.map.cameraPosition;

				if ( uCamPos !== undefined ) {
1654

T
tschw 已提交
1655
					uCamPos.setValue( _gl,
1656
						_vector3.setFromMatrixPosition( camera.matrixWorld ) );
1657 1658 1659 1660 1661

				}

			}

1662
			if ( material.isMeshPhongMaterial ||
1663 1664 1665 1666
				material.isMeshLambertMaterial ||
				material.isMeshBasicMaterial ||
				material.isMeshStandardMaterial ||
				material.isShaderMaterial ||
1667
				material.skinning ) {
1668

T
tschw 已提交
1669
				p_uniforms.setValue( _gl, 'viewMatrix', camera.matrixWorldInverse );
1670 1671 1672

			}

M
Mr.doob 已提交
1673 1674 1675 1676 1677 1678
		}

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

1679
		if ( material.skinning ) {
M
Mr.doob 已提交
1680

T
tschw 已提交
1681 1682
			p_uniforms.setOptional( _gl, object, 'bindMatrix' );
			p_uniforms.setOptional( _gl, object, 'bindMatrixInverse' );
1683

T
tschw 已提交
1684
			var skeleton = object.skeleton;
1685

T
tschw 已提交
1686
			if ( skeleton ) {
1687

1688 1689
				var bones = skeleton.bones;

1690
				if ( capabilities.floatVertexTextures ) {
M
Mr.doob 已提交
1691

1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716
					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 已提交
1717 1718
					p_uniforms.setValue( _gl, 'boneTexture', skeleton.boneTexture );
					p_uniforms.setValue( _gl, 'boneTextureSize', skeleton.boneTextureSize );
M
Mr.doob 已提交
1719

T
tschw 已提交
1720
				} else {
M
Mr.doob 已提交
1721

T
tschw 已提交
1722
					p_uniforms.setOptional( _gl, skeleton, 'boneMatrices' );
M
Mr.doob 已提交
1723 1724 1725 1726 1727 1728 1729 1730 1731

				}

			}

		}

		if ( refreshMaterial ) {

1732 1733 1734
			p_uniforms.setValue( _gl, 'toneMappingExposure', _this.toneMappingExposure );
			p_uniforms.setValue( _gl, 'toneMappingWhitePoint', _this.toneMappingWhitePoint );

M
Mr.doob 已提交
1735
			if ( material.lights ) {
M
Mr.doob 已提交
1736

1737
				// the current material requires lighting info
M
Mr.doob 已提交
1738

T
tschw 已提交
1739 1740 1741 1742 1743 1744
				// 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 已提交
1745

T
tschw 已提交
1746
				markUniformsLightsNeedsUpdate( m_uniforms, refreshLights );
G
gero3 已提交
1747

T
tschw 已提交
1748
			}
G
gero3 已提交
1749

T
tschw 已提交
1750
			// refresh uniforms common to several materials
G
gero3 已提交
1751

T
tschw 已提交
1752
			if ( fog && material.fog ) {
G
gero3 已提交
1753

T
tschw 已提交
1754
				refreshUniformsFog( m_uniforms, fog );
M
Mr.doob 已提交
1755 1756 1757

			}

1758
			if ( material.isMeshBasicMaterial ||
1759 1760 1761
				material.isMeshLambertMaterial ||
				material.isMeshPhongMaterial ||
				material.isMeshStandardMaterial ||
1762
				material.isMeshNormalMaterial ||
W
WestLangley 已提交
1763 1764
				material.isMeshDepthMaterial ||
				material.isMeshDistanceMaterial ) {
M
Mr.doob 已提交
1765 1766 1767 1768 1769 1770 1771

				refreshUniformsCommon( m_uniforms, material );

			}

			// refresh single material specific uniforms

1772
			if ( material.isLineBasicMaterial ) {
M
Mr.doob 已提交
1773 1774 1775

				refreshUniformsLine( m_uniforms, material );

1776
			} else if ( material.isLineDashedMaterial ) {
M
Mr.doob 已提交
1777 1778 1779 1780

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

1781
			} else if ( material.isPointsMaterial ) {
M
Mr.doob 已提交
1782

M
Mr.doob 已提交
1783
				refreshUniformsPoints( m_uniforms, material );
M
Mr.doob 已提交
1784

1785
			} else if ( material.isMeshLambertMaterial ) {
1786 1787 1788

				refreshUniformsLambert( m_uniforms, material );

T
Takahiro 已提交
1789 1790 1791 1792
			} else if ( material.isMeshToonMaterial ) {

				refreshUniformsToon( m_uniforms, material );

1793 1794 1795 1796
			} else if ( material.isMeshPhongMaterial ) {

				refreshUniformsPhong( m_uniforms, material );

1797
			} else if ( material.isMeshPhysicalMaterial ) {
W
WestLangley 已提交
1798 1799 1800

				refreshUniformsPhysical( m_uniforms, material );

1801
			} else if ( material.isMeshStandardMaterial ) {
W
WestLangley 已提交
1802

1803
				refreshUniformsStandard( m_uniforms, material );
W
WestLangley 已提交
1804

1805
			} else if ( material.isMeshDepthMaterial ) {
M
Mr.doob 已提交
1806

W
WestLangley 已提交
1807
				refreshUniformsDepth( m_uniforms, material );
1808

W
WestLangley 已提交
1809
			} else if ( material.isMeshDistanceMaterial ) {
1810

W
WestLangley 已提交
1811
				refreshUniformsDistance( m_uniforms, material );
1812

1813
			} else if ( material.isMeshNormalMaterial ) {
M
Mr.doob 已提交
1814

1815
				refreshUniformsNormal( m_uniforms, material );
M
Mr.doob 已提交
1816 1817 1818

			}

M
Mr.doob 已提交
1819 1820 1821 1822 1823 1824
			// 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 已提交
1825
			WebGLUniforms.upload(
1826
				_gl, materialProperties.uniformsList, m_uniforms, _this );
A
arose 已提交
1827 1828 1829

		}

M
Mr.doob 已提交
1830

T
tschw 已提交
1831
		// common matrices
M
Mr.doob 已提交
1832

M
Mr.doob 已提交
1833 1834
		p_uniforms.setValue( _gl, 'modelViewMatrix', object.modelViewMatrix );
		p_uniforms.setValue( _gl, 'normalMatrix', object.normalMatrix );
T
tschw 已提交
1835
		p_uniforms.setValue( _gl, 'modelMatrix', object.matrixWorld );
A
arose 已提交
1836

T
tschw 已提交
1837
		return program;
A
arose 已提交
1838 1839 1840

	}

M
Mr.doob 已提交
1841 1842
	// Uniforms (refresh uniforms objects)

M
Mr.doob 已提交
1843
	function refreshUniformsCommon( uniforms, material ) {
M
Mr.doob 已提交
1844 1845 1846

		uniforms.opacity.value = material.opacity;

1847 1848 1849 1850 1851
		if ( material.color ) {

			uniforms.diffuse.value = material.color;

		}
M
Mr.doob 已提交
1852

1853
		if ( material.emissive ) {
M
Mr.doob 已提交
1854

1855
			uniforms.emissive.value.copy( material.emissive ).multiplyScalar( material.emissiveIntensity );
M
Mr.doob 已提交
1856 1857 1858

		}

1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890
		if ( material.map ) {

			uniforms.map.value = material.map;

		}

		if ( material.alphaMap ) {

			uniforms.alphaMap.value = material.alphaMap;

		}

		if ( material.specularMap ) {

			uniforms.specularMap.value = material.specularMap;

		}

		if ( material.envMap ) {

			uniforms.envMap.value = material.envMap;

			// 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
			uniforms.flipEnvMap.value = ( ! ( material.envMap && material.envMap.isCubeTexture ) ) ? 1 : - 1;

			uniforms.reflectivity.value = material.reflectivity;
			uniforms.refractionRatio.value = material.refractionRatio;

		}
M
Mr.doob 已提交
1891

1892 1893 1894 1895 1896 1897 1898
		if ( material.lightMap ) {

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

		}

1899
		if ( material.aoMap ) {
1900

1901 1902
			uniforms.aoMap.value = material.aoMap;
			uniforms.aoMapIntensity.value = material.aoMapIntensity;
1903 1904 1905

		}

M
Mr.doob 已提交
1906
		// uv repeat and offset setting priorities
M
Mr.doob 已提交
1907 1908 1909 1910 1911
		// 1. color map
		// 2. specular map
		// 3. normal map
		// 4. bump map
		// 5. alpha map
1912
		// 6. emissive map
M
Mr.doob 已提交
1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923

		var uvScaleMap;

		if ( material.map ) {

			uvScaleMap = material.map;

		} else if ( material.specularMap ) {

			uvScaleMap = material.specularMap;

1924 1925 1926 1927
		} else if ( material.displacementMap ) {

			uvScaleMap = material.displacementMap;

M
Mr.doob 已提交
1928 1929 1930 1931 1932 1933 1934 1935
		} else if ( material.normalMap ) {

			uvScaleMap = material.normalMap;

		} else if ( material.bumpMap ) {

			uvScaleMap = material.bumpMap;

1936 1937 1938 1939 1940 1941 1942 1943
		} else if ( material.roughnessMap ) {

			uvScaleMap = material.roughnessMap;

		} else if ( material.metalnessMap ) {

			uvScaleMap = material.metalnessMap;

1944 1945 1946 1947
		} else if ( material.alphaMap ) {

			uvScaleMap = material.alphaMap;

1948 1949 1950 1951
		} else if ( material.emissiveMap ) {

			uvScaleMap = material.emissiveMap;

M
Mr.doob 已提交
1952 1953 1954 1955
		}

		if ( uvScaleMap !== undefined ) {

1956
			// backwards compatibility
1957
			if ( uvScaleMap.isWebGLRenderTarget ) {
M
Mr.doob 已提交
1958 1959 1960 1961 1962

				uvScaleMap = uvScaleMap.texture;

			}

M
Mr.doob 已提交
1963 1964 1965 1966 1967 1968 1969
			var offset = uvScaleMap.offset;
			var repeat = uvScaleMap.repeat;

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

		}

M
Mr.doob 已提交
1970
	}
M
Mr.doob 已提交
1971

M
Mr.doob 已提交
1972
	function refreshUniformsLine( uniforms, material ) {
M
Mr.doob 已提交
1973 1974 1975 1976

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

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

M
Mr.doob 已提交
1979
	function refreshUniformsDash( uniforms, material ) {
M
Mr.doob 已提交
1980 1981 1982 1983 1984

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

M
Mr.doob 已提交
1985
	}
M
Mr.doob 已提交
1986

M
Mr.doob 已提交
1987
	function refreshUniformsPoints( uniforms, material ) {
M
Mr.doob 已提交
1988

1989
		uniforms.diffuse.value = material.color;
M
Mr.doob 已提交
1990
		uniforms.opacity.value = material.opacity;
1991
		uniforms.size.value = material.size * _pixelRatio;
1992
		uniforms.scale.value = _height * 0.5;
M
Mr.doob 已提交
1993 1994 1995

		uniforms.map.value = material.map;

1996 1997 1998 1999 2000 2001 2002 2003 2004
		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 已提交
2005
	}
M
Mr.doob 已提交
2006

M
Mr.doob 已提交
2007
	function refreshUniformsFog( uniforms, fog ) {
M
Mr.doob 已提交
2008 2009 2010

		uniforms.fogColor.value = fog.color;

2011
		if ( fog.isFog ) {
M
Mr.doob 已提交
2012 2013 2014 2015

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

2016
		} else if ( fog.isFogExp2 ) {
M
Mr.doob 已提交
2017 2018 2019 2020 2021

			uniforms.fogDensity.value = fog.density;

		}

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

M
Mr.doob 已提交
2024
	function refreshUniformsLambert( uniforms, material ) {
2025 2026 2027 2028 2029 2030 2031 2032 2033

		if ( material.emissiveMap ) {

			uniforms.emissiveMap.value = material.emissiveMap;

		}

	}

M
Mr.doob 已提交
2034
	function refreshUniformsPhong( uniforms, material ) {
M
Mr.doob 已提交
2035

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

2039
		if ( material.emissiveMap ) {
2040

2041
			uniforms.emissiveMap.value = material.emissiveMap;
2042

2043
		}
M
Mr.doob 已提交
2044

2045 2046 2047 2048
		if ( material.bumpMap ) {

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

2050
		}
M
Mr.doob 已提交
2051

2052 2053 2054 2055 2056 2057
		if ( material.normalMap ) {

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

		}
M
Mr.doob 已提交
2058

2059 2060 2061 2062 2063
		if ( material.displacementMap ) {

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

2065
		}
2066

T
Takahiro 已提交
2067 2068 2069 2070 2071 2072
	}

	function refreshUniformsToon( uniforms, material ) {

		refreshUniformsPhong( uniforms, material );

T
Takahiro 已提交
2073
		if ( material.gradientMap ) {
T
Takahiro 已提交
2074

T
Takahiro 已提交
2075
			uniforms.gradientMap.value = material.gradientMap;
T
Takahiro 已提交
2076 2077 2078

		}

2079 2080
	}

M
Mr.doob 已提交
2081
	function refreshUniformsStandard( uniforms, material ) {
W
WestLangley 已提交
2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134

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

2137 2138 2139
		uniforms.clearCoat.value = material.clearCoat;
		uniforms.clearCoatRoughness.value = material.clearCoatRoughness;

W
WestLangley 已提交
2140 2141 2142 2143
		refreshUniformsStandard( uniforms, material );

	}

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

	}

2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197
	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;

		}

	}

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

M
Mr.doob 已提交
2200
	function markUniformsLightsNeedsUpdate( uniforms, value ) {
2201

M
Mr.doob 已提交
2202
		uniforms.ambientLightColor.needsUpdate = value;
2203

B
Ben Houston 已提交
2204 2205 2206
		uniforms.directionalLights.needsUpdate = value;
		uniforms.pointLights.needsUpdate = value;
		uniforms.spotLights.needsUpdate = value;
2207
		uniforms.rectAreaLights.needsUpdate = value;
B
Ben Houston 已提交
2208
		uniforms.hemisphereLights.needsUpdate = value;
2209

M
Mr.doob 已提交
2210
	}
2211

M
Mr.doob 已提交
2212 2213 2214 2215
	// GL state setting

	this.setFaceCulling = function ( cullFace, frontFaceDirection ) {

T
tschw 已提交
2216
		state.setCullFace( cullFace );
R
Rich Harris 已提交
2217
		state.setFlipSided( frontFaceDirection === FrontFaceDirectionCW );
M
Mr.doob 已提交
2218 2219 2220 2221 2222

	};

	// Textures

T
tschw 已提交
2223 2224 2225 2226 2227 2228
	function allocTextureUnit() {

		var textureUnit = _usedTextureUnits;

		if ( textureUnit >= capabilities.maxTextures ) {

M
Mugen87 已提交
2229
			console.warn( 'THREE.WebGLRenderer: Trying to use ' + textureUnit + ' texture units while this GPU supports only ' + capabilities.maxTextures );
T
tschw 已提交
2230 2231 2232 2233 2234 2235 2236 2237 2238

		}

		_usedTextureUnits += 1;

		return textureUnit;

	}

2239
	this.allocTextureUnit = allocTextureUnit;
T
tschw 已提交
2240

2241
	// this.setTexture2D = setTexture2D;
M
Mr.doob 已提交
2242
	this.setTexture2D = ( function () {
T
tschw 已提交
2243

2244
		var warned = false;
T
tschw 已提交
2245

2246
		// backwards compatibility: peel texture.texture
W
WestLangley 已提交
2247
		return function setTexture2D( texture, slot ) {
T
tschw 已提交
2248

T
Takahiro 已提交
2249
			if ( texture && texture.isWebGLRenderTarget ) {
T
tschw 已提交
2250

2251
				if ( ! warned ) {
T
tschw 已提交
2252

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

2256
				}
T
tschw 已提交
2257

2258
				texture = texture.texture;
T
tschw 已提交
2259

2260
			}
T
tschw 已提交
2261

2262
			textures.setTexture2D( texture, slot );
T
tschw 已提交
2263

2264
		};
T
tschw 已提交
2265

2266
	}() );
T
tschw 已提交
2267

M
Mr.doob 已提交
2268
	this.setTexture = ( function () {
2269 2270 2271

		var warned = false;

W
WestLangley 已提交
2272
		return function setTexture( texture, slot ) {
2273 2274 2275 2276 2277 2278 2279 2280

			if ( ! warned ) {

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

			}

2281
			textures.setTexture2D( texture, slot );
2282 2283 2284 2285 2286

		};

	}() );

M
Mr.doob 已提交
2287
	this.setTextureCube = ( function () {
2288 2289 2290

		var warned = false;

W
WestLangley 已提交
2291
		return function setTextureCube( texture, slot ) {
2292 2293

			// backwards compatibility: peel texture.texture
T
Takahiro 已提交
2294
			if ( texture && texture.isWebGLRenderTargetCube ) {
2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308

				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 已提交
2309
			if ( ( texture && texture.isCubeTexture ) ||
2310
				( Array.isArray( texture.image ) && texture.image.length === 6 ) ) {
2311 2312 2313 2314

				// CompressedTexture can have Array in image :/

				// this function alone should take care of cube textures
2315
				textures.setTextureCube( texture, slot );
2316 2317 2318 2319 2320

			} else {

				// assumed: texture property of THREE.WebGLRenderTargetCube

2321
				textures.setTextureCubeDynamic( texture, slot );
2322 2323 2324 2325 2326 2327

			}

		};

	}() );
T
tschw 已提交
2328

2329
	this.getRenderTarget = function () {
2330 2331 2332

		return _currentRenderTarget;

M
Michael Herzog 已提交
2333
	};
2334

2335
	this.setRenderTarget = function ( renderTarget ) {
M
Mr.doob 已提交
2336

2337 2338
		_currentRenderTarget = renderTarget;

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

2341
			textures.setupRenderTarget( renderTarget );
M
Mr.doob 已提交
2342 2343 2344

		}

M
Mr.doob 已提交
2345
		var framebuffer = null;
M
Mr.doob 已提交
2346
		var isCube = false;
M
Mr.doob 已提交
2347 2348 2349

		if ( renderTarget ) {

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

M
Mr.doob 已提交
2352
			if ( renderTarget.isWebGLRenderTargetCube ) {
M
Mr.doob 已提交
2353

M
Mr.doob 已提交
2354
				framebuffer = __webglFramebuffer[ renderTarget.activeCubeFace ];
M
Mr.doob 已提交
2355
				isCube = true;
M
Mr.doob 已提交
2356 2357 2358

			} else {

M
Mr.doob 已提交
2359
				framebuffer = __webglFramebuffer;
M
Mr.doob 已提交
2360 2361 2362

			}

M
Mr.doob 已提交
2363
			_currentViewport.copy( renderTarget.viewport );
2364 2365
			_currentScissor.copy( renderTarget.scissor );
			_currentScissorTest = renderTarget.scissorTest;
2366

M
Mr.doob 已提交
2367 2368
		} else {

M
Mr.doob 已提交
2369
			_currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio );
2370
			_currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio );
2371
			_currentScissorTest = _scissorTest;
2372

M
Mr.doob 已提交
2373 2374
		}

M
Mr.doob 已提交
2375
		if ( _currentFramebuffer !== framebuffer ) {
M
Mr.doob 已提交
2376 2377 2378 2379 2380 2381

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

		}

M
Mr.doob 已提交
2382
		state.viewport( _currentViewport );
2383 2384
		state.scissor( _currentScissor );
		state.setScissorTest( _currentScissorTest );
2385

M
Mr.doob 已提交
2386 2387 2388
		if ( isCube ) {

			var textureProperties = properties.get( renderTarget.texture );
2389
			_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + renderTarget.activeCubeFace, textureProperties.__webglTexture, renderTarget.activeMipMapLevel );
M
Mr.doob 已提交
2390 2391 2392

		}

M
Mr.doob 已提交
2393 2394
	};

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

0
06wj 已提交
2397
		if ( ! ( renderTarget && renderTarget.isWebGLRenderTarget ) ) {
2398

2399
			console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.' );
G
gero3 已提交
2400
			return;
2401

G
gero3 已提交
2402
		}
2403

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

M
Mr.doob 已提交
2406
		if ( framebuffer ) {
2407

G
gero3 已提交
2408
			var restore = false;
2409

M
Mr.doob 已提交
2410
			if ( framebuffer !== _currentFramebuffer ) {
2411

M
Mr.doob 已提交
2412
				_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );
2413

G
gero3 已提交
2414
				restore = true;
2415

G
gero3 已提交
2416
			}
2417

M
Mr.doob 已提交
2418
			try {
2419

M
Mr.doob 已提交
2420
				var texture = renderTarget.texture;
M
Mr.doob 已提交
2421 2422
				var textureFormat = texture.format;
				var textureType = texture.type;
2423

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

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

M
Mr.doob 已提交
2429
				}
2430

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

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

M
Mr.doob 已提交
2438
				}
2439

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

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

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

M
Mr.doob 已提交
2446
						_gl.readPixels( x, y, width, height, paramThreeToGL( textureFormat ), paramThreeToGL( textureType ), buffer );
2447 2448

					}
2449

M
Mr.doob 已提交
2450
				} else {
M
Mr.doob 已提交
2451

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

				}
M
Mr.doob 已提交
2455

M
Mr.doob 已提交
2456
			} finally {
M
Mr.doob 已提交
2457

M
Mr.doob 已提交
2458 2459 2460
				if ( restore ) {

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

M
Mr.doob 已提交
2462 2463 2464
				}

			}
M
Mr.doob 已提交
2465 2466 2467

		}

M
Mr.doob 已提交
2468 2469
	};

M
Mr.doob 已提交
2470 2471
	// Map three.js constants to WebGL constants

M
Mr.doob 已提交
2472
	function paramThreeToGL( p ) {
M
Mr.doob 已提交
2473

2474 2475
		var extension;

R
Rich Harris 已提交
2476 2477 2478
		if ( p === RepeatWrapping ) return _gl.REPEAT;
		if ( p === ClampToEdgeWrapping ) return _gl.CLAMP_TO_EDGE;
		if ( p === MirroredRepeatWrapping ) return _gl.MIRRORED_REPEAT;
M
Mr.doob 已提交
2479

R
Rich Harris 已提交
2480 2481 2482
		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 已提交
2483

R
Rich Harris 已提交
2484 2485 2486
		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 已提交
2487

R
Rich Harris 已提交
2488 2489 2490 2491
		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 已提交
2492

R
Rich Harris 已提交
2493 2494 2495 2496 2497 2498
		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 已提交
2499

2500
		if ( p === HalfFloatType ) {
2501

2502
			extension = extensions.get( 'OES_texture_half_float' );
2503

2504
			if ( extension !== null ) return extension.HALF_FLOAT_OES;
2505 2506 2507

		}

R
Rich Harris 已提交
2508 2509 2510 2511 2512 2513
		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;
2514
		if ( p === DepthStencilFormat ) return _gl.DEPTH_STENCIL;
M
Mr.doob 已提交
2515

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

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

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

2533 2534
		if ( p === RGB_S3TC_DXT1_Format || p === RGBA_S3TC_DXT1_Format ||
			p === RGBA_S3TC_DXT3_Format || p === RGBA_S3TC_DXT5_Format ) {
M
Mr.doob 已提交
2535

2536
			extension = extensions.get( 'WEBGL_compressed_texture_s3tc' );
2537

2538 2539 2540 2541 2542 2543 2544 2545
			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 已提交
2546 2547 2548

		}

2549
		if ( p === RGB_PVRTC_4BPPV1_Format || p === RGB_PVRTC_2BPPV1_Format ||
2550
			p === RGBA_PVRTC_4BPPV1_Format || p === RGBA_PVRTC_2BPPV1_Format ) {
2551

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

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

		}

2565
		if ( p === RGB_ETC1_Format ) {
2566

2567
			extension = extensions.get( 'WEBGL_compressed_texture_etc1' );
2568

2569
			if ( extension !== null ) return extension.COMPRESSED_RGB_ETC1_WEBGL;
2570 2571 2572

		}

2573 2574 2575
		if ( p === MinEquation || p === MaxEquation ) {

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

2577
			if ( extension !== null ) {
2578

2579 2580 2581 2582
				if ( p === MinEquation ) return extension.MIN_EXT;
				if ( p === MaxEquation ) return extension.MAX_EXT;

			}
2583 2584 2585

		}

2586
		if ( p === UnsignedInt248Type ) {
2587

2588
			extension = extensions.get( 'WEBGL_depth_texture' );
2589

2590
			if ( extension !== null ) return extension.UNSIGNED_INT_24_8_WEBGL;
2591 2592 2593

		}

M
Mr.doob 已提交
2594 2595
		return 0;

M
Mr.doob 已提交
2596
	}
M
Mr.doob 已提交
2597

M
Mr.doob 已提交
2598
}
R
Rich Harris 已提交
2599

T
Tristan VALCKE 已提交
2600

2601
export { WebGLRenderer };