WebGLRenderer.js 75.1 KB
Newer Older
N
Nicolas Garcia Belmonte 已提交
1 2 3
/**
 * @author supereggbert / http://www.paulbrunt.co.uk/
 * @author mrdoob / http://mrdoob.com/
4
 * @author alteredq / http://alteredqualia.com/
5
 * @author szimek / https://github.com/szimek/
N
Nicolas Garcia Belmonte 已提交
6 7
 */

8
THREE.WebGLRenderer = function ( parameters ) {
M
Mr.doob 已提交
9

M
Mr.doob 已提交
10 11
	// Currently you can use just up to 4 directional / point lights total.
	// Chrome barfs on shader linking when there are more than 4 lights :(
M
Mr.doob 已提交
12

13
	// The problem comes from shader using too many varying vectors.
M
Mr.doob 已提交
14

15
	// This is not GPU limitation as the same shader works ok in Firefox
M
Mr.doob 已提交
16
	// and Chrome with "--use-gl=desktop" flag.
M
Mr.doob 已提交
17

M
Mr.doob 已提交
18
	// Difference comes from Chrome on Windows using by default ANGLE,
19
	// thus going DirectX9 route (while FF uses OpenGL).
M
Mr.doob 已提交
20

21
	// See http://code.google.com/p/chromium/issues/detail?id=63491
M
Mr.doob 已提交
22

M
Mr.doob 已提交
23
	var _canvas = document.createElement( 'canvas' ), _gl,
24
	_oldProgram = null,
25
	_oldFramebuffer = null,	
M
Mr.doob 已提交
26

A
alteredq 已提交
27 28
	// gl state cache
	
29 30
	_oldDoubleSided = null,
	_oldFlipSided = null,
A
alteredq 已提交
31 32
	_oldBlending = null,
	
33 34
	// camera matrices caches
	
35 36 37 38 39 40 41 42 43
	_frustum = [ 
		new THREE.Vector4(),
		new THREE.Vector4(),
		new THREE.Vector4(),
		new THREE.Vector4(),
		new THREE.Vector4(),
		new THREE.Vector4()
	 ],

44
	_projScreenMatrix = new THREE.Matrix4(),
45 46 47 48
	_projectionMatrixArray = new Float32Array( 16 ),
	
	_viewMatrixArray = new Float32Array( 16 ),	

49 50
	_vector3 = new THREE.Vector4(),
	
51
	// parameters defaults
M
Mr.doob 已提交
52

53 54 55
	antialias = true,
	clearColor = new THREE.Color( 0x000000 ),
	clearAlpha = 0;
56

57
	if ( parameters ) {
M
Mr.doob 已提交
58

59 60 61
		if ( parameters.antialias !== undefined ) antialias = parameters.antialias;
		if ( parameters.clearColor !== undefined ) clearColor.setHex( parameters.clearColor );
		if ( parameters.clearAlpha !== undefined ) clearAlpha = parameters.clearAlpha;
M
Mr.doob 已提交
62

63
	}
M
Mr.doob 已提交
64

N
Nicolas Garcia Belmonte 已提交
65 66 67
	this.domElement = _canvas;
	this.autoClear = true;

68
	initGL( antialias, clearColor, clearAlpha );
M
Mr.doob 已提交
69

70 71
	this.context = _gl;

72
	//alert( dumpObject( getGLParams() ) );
M
Mr.doob 已提交
73

74
	this.lights = {
M
Mr.doob 已提交
75 76 77

		ambient: 	 [ 0, 0, 0 ],
		directional: { length: 0, colors: new Array(), positions: new Array() },
78
		point: 		 { length: 0, colors: new Array(), positions: new Array() }
M
Mr.doob 已提交
79

80
	};
M
Mr.doob 已提交
81

N
Nicolas Garcia Belmonte 已提交
82 83 84 85 86 87 88 89
	this.setSize = function ( width, height ) {

		_canvas.width = width;
		_canvas.height = height;
		_gl.viewport( 0, 0, _canvas.width, _canvas.height );

	};

90
	this.setClearColorHex = function ( hex, alpha ) {
91

92 93
		var color = new THREE.Color( hex );
		_gl.clearColor( color.r, color.g, color.b, alpha );
94

95
	};
A
alteredq 已提交
96

97
	this.setClearColor = function ( color, alpha ) {
A
alteredq 已提交
98 99 100 101

		_gl.clearColor( color.r, color.g, color.b, alpha );

	};
102

N
Nicolas Garcia Belmonte 已提交
103 104 105 106 107 108
	this.clear = function () {

		_gl.clear( _gl.COLOR_BUFFER_BIT | _gl.DEPTH_BUFFER_BIT );

	};

M
Mr.doob 已提交
109

110
	this.setupLights = function ( program, lights ) {
111

112
		var l, ll, light, r = 0, g = 0, b = 0,
113
			color, position, intensity,
M
Mr.doob 已提交
114

115
			zlights = this.lights,
M
Mr.doob 已提交
116

117 118
			dcolors    = zlights.directional.colors,
			dpositions = zlights.directional.positions,
119

120 121
			pcolors    = zlights.point.colors,
			ppositions = zlights.point.positions,
122

123
			dlength = 0,
124 125 126 127
			plength = 0,
		
			doffset = 0,
			poffset = 0;
M
Mr.doob 已提交
128

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

131
			light = lights[ l ];
132 133 134
			color = light.color;
			position = light.position;
			intensity = light.intensity;
135 136 137

			if ( light instanceof THREE.AmbientLight ) {

138 139 140
				r += color.r;
				g += color.g;
				b += color.b;
M
Mr.doob 已提交
141

142
			} else if ( light instanceof THREE.DirectionalLight ) {
143

144 145 146 147 148
				doffset = dlength * 3;
				
				dcolors[ doffset ]     = color.r * intensity;
				dcolors[ doffset + 1 ] = color.g * intensity;
				dcolors[ doffset + 2 ] = color.b * intensity;
149

150 151 152
				dpositions[ doffset ]     = position.x;
				dpositions[ doffset + 1 ] = position.y;
				dpositions[ doffset + 2 ] = position.z;
153

154
				dlength += 1;
M
Mr.doob 已提交
155

156 157
			} else if( light instanceof THREE.PointLight ) {

158 159 160 161 162
				poffset = plength * 3;
				
				pcolors[ poffset ]     = color.r * intensity;
				pcolors[ poffset + 1 ] = color.g * intensity;
				pcolors[ poffset + 2 ] = color.b * intensity;
163

164 165 166
				ppositions[ poffset ]     = position.x;
				ppositions[ poffset + 1 ] = position.y;
				ppositions[ poffset + 2 ] = position.z;
M
Mr.doob 已提交
167

168
				plength += 1;
M
Mr.doob 已提交
169

170 171 172
			}

		}
173 174 175 176 177 178
		
		// null eventual remains from removed lights
		// (this is to avoid if in shader)
		
		for( l = dlength * 3; l < dcolors.length; l++ ) dcolors[ l ] = 0.0;
		for( l = plength * 3; l < pcolors.length; l++ ) pcolors[ l ] = 0.0;
M
Mr.doob 已提交
179

180 181
		zlights.point.length = plength;
		zlights.directional.length = dlength;
M
Mr.doob 已提交
182

183 184 185
		zlights.ambient[ 0 ] = r;
		zlights.ambient[ 1 ] = g;
		zlights.ambient[ 2 ] = b;
M
Mr.doob 已提交
186

187
	};
M
Mr.doob 已提交
188

189
	function createParticleBuffers ( geometry ) {
M
Mr.doob 已提交
190

191
		geometry.__webGLVertexBuffer = _gl.createBuffer();
192
		geometry.__webGLColorBuffer = _gl.createBuffer();
M
Mr.doob 已提交
193

194
	};
M
Mr.doob 已提交
195

196
	function createLineBuffers ( geometry ) {
M
Mr.doob 已提交
197

198
		geometry.__webGLVertexBuffer = _gl.createBuffer();
199
		geometry.__webGLColorBuffer = _gl.createBuffer();
M
Mr.doob 已提交
200

201
	};
202

203
	function createMeshBuffers ( geometryChunk ) {
M
Mr.doob 已提交
204

205 206 207
		geometryChunk.__webGLVertexBuffer = _gl.createBuffer();
		geometryChunk.__webGLNormalBuffer = _gl.createBuffer();
		geometryChunk.__webGLTangentBuffer = _gl.createBuffer();
208
		geometryChunk.__webGLColorBuffer = _gl.createBuffer();
209
		geometryChunk.__webGLUVBuffer = _gl.createBuffer();
210
		geometryChunk.__webGLUV2Buffer = _gl.createBuffer();
211
		
212 213
		geometryChunk.__webGLFaceBuffer = _gl.createBuffer();
		geometryChunk.__webGLLineBuffer = _gl.createBuffer();
M
Mr.doob 已提交
214

215
	};
A
alteredq 已提交
216
	
217
	function initLineBuffers ( geometry ) {
M
Mr.doob 已提交
218

219 220 221
		var nvertices = geometry.vertices.length;

		geometry.__vertexArray = new Float32Array( nvertices * 3 );
222
		geometry.__colorArray = new Float32Array( nvertices * 3 );
M
Mr.doob 已提交
223

224
		geometry.__webGLLineCount = nvertices;
M
Mr.doob 已提交
225

226
	};
M
Mr.doob 已提交
227

228
	function initParticleBuffers ( geometry ) {
229 230 231 232

		var nvertices = geometry.vertices.length;

		geometry.__vertexArray = new Float32Array( nvertices * 3 );
A
alteredq 已提交
233
		geometry.__colorArray = new Float32Array( nvertices * 3 );
234 235
		
		geometry.__sortArray = [];
236 237 238 239 240

		geometry.__webGLParticleCount = nvertices;

	};

241
	function initMeshBuffers ( geometryChunk, object ) {
M
Mr.doob 已提交
242

243
		var f, fl, nvertices = 0, ntris = 0, nlines = 0,
M
Mr.doob 已提交
244
			obj_faces = object.geometry.faces,
245
			chunk_faces = geometryChunk.faces;
M
Mr.doob 已提交
246

247
		for ( f = 0, fl = chunk_faces.length; f < fl; f++ ) {
M
Mr.doob 已提交
248

249 250
			fi = chunk_faces[ f ];
			face = obj_faces[ fi ];
M
Mr.doob 已提交
251

252
			if ( face instanceof THREE.Face3 ) {
M
Mr.doob 已提交
253

254 255 256
				nvertices += 3;
				ntris += 1;
				nlines += 3;
M
Mr.doob 已提交
257

258
			} else if ( face instanceof THREE.Face4 ) {
M
Mr.doob 已提交
259

260 261
				nvertices += 4;
				ntris += 2;
262
				nlines += 4;
M
Mr.doob 已提交
263

264
			}
M
Mr.doob 已提交
265

266
		}
M
Mr.doob 已提交
267

268
		// TODO: only create arrays for attributes existing in the object
M
Mr.doob 已提交
269

270 271 272
		geometryChunk.__vertexArray  = new Float32Array( nvertices * 3 );
		geometryChunk.__normalArray  = new Float32Array( nvertices * 3 );
		geometryChunk.__tangentArray = new Float32Array( nvertices * 4 );
273
		geometryChunk.__colorArray = new Float32Array( nvertices * 3 );
274
		geometryChunk.__uvArray = new Float32Array( nvertices * 2 );
275
		geometryChunk.__uv2Array = new Float32Array( nvertices * 2 );
M
Mr.doob 已提交
276

277 278
		geometryChunk.__faceArray = new Uint16Array( ntris * 3 );
		geometryChunk.__lineArray = new Uint16Array( nlines * 2 );
M
Mr.doob 已提交
279

280
		geometryChunk.__needsSmoothNormals = bufferNeedsSmoothNormals ( geometryChunk, object );
M
Mr.doob 已提交
281

282 283
		geometryChunk.__webGLFaceCount = ntris * 3;
		geometryChunk.__webGLLineCount = nlines * 2;
M
Mr.doob 已提交
284

285
	};
M
Mr.doob 已提交
286

287
	function setMeshBuffers ( geometryChunk, object, hint ) {
288

289 290 291 292
		var f, fl, fi, face, vertexNormals, faceNormal, normal, 
			uv, uv2, v1, v2, v3, v4, t1, t2, t3, t4, 
			c1, c2, c3, c4,
			m, ml, i,
293
			vn, uvi, uv2i,
M
Mr.doob 已提交
294

295
		vertexIndex = 0,
296

297 298
		offset = 0,
		offset_uv = 0,
299
		offset_uv2 = 0,
300 301 302 303
		offset_face = 0,
		offset_normal = 0,
		offset_tangent = 0,
		offset_line = 0,
304
		offset_color = 0,
M
Mr.doob 已提交
305

306 307
		vertexArray = geometryChunk.__vertexArray,
		uvArray = geometryChunk.__uvArray,
308
		uv2Array = geometryChunk.__uv2Array,
309 310
		normalArray = geometryChunk.__normalArray,
		tangentArray = geometryChunk.__tangentArray,
311
		colorArray = geometryChunk.__colorArray,
M
Mr.doob 已提交
312

313 314
		faceArray = geometryChunk.__faceArray,
		lineArray = geometryChunk.__lineArray,
M
Mr.doob 已提交
315

316
		needsSmoothNormals = geometryChunk.__needsSmoothNormals,
317 318 319 320 321 322 323 324
		
		geometry = object.geometry, // this is shared for all chunks
		
		dirtyVertices = geometry.__dirtyVertices,
		dirtyElements = geometry.__dirtyElements, 
		dirtyUvs = geometry.__dirtyUvs, 
		dirtyNormals = geometry.__dirtyNormals, 
		dirtyTangents = geometry.__dirtyTangents,
325
		dirtyColors = geometry.__dirtyColors,
M
Mr.doob 已提交
326

327 328 329
		vertices = geometry.vertices,
		chunk_faces = geometryChunk.faces,
		obj_faces = geometry.faces,
330
		obj_uvs = geometry.uvs,
331 332 333
		obj_uvs2 = geometry.uvs2,
		obj_colors = geometry.colors;
		
334
		for ( f = 0, fl = chunk_faces.length; f < fl; f++ ) {
M
Mr.doob 已提交
335

336 337 338
			fi = chunk_faces[ f ];
			face = obj_faces[ fi ];
			uv = obj_uvs[ fi ];
339
			uv2 = obj_uvs2[ fi ];
M
Mr.doob 已提交
340

341
			vertexNormals = face.vertexNormals;
342
			faceNormal = face.normal;
343 344 345

			if ( face instanceof THREE.Face3 ) {

346
				if ( dirtyVertices ) {
M
Mr.doob 已提交
347

348 349 350
					v1 = vertices[ face.a ].position;
					v2 = vertices[ face.b ].position;
					v3 = vertices[ face.c ].position;
M
Mr.doob 已提交
351

352 353 354
					vertexArray[ offset ]     = v1.x;
					vertexArray[ offset + 1 ] = v1.y;
					vertexArray[ offset + 2 ] = v1.z;
M
Mr.doob 已提交
355

356 357 358
					vertexArray[ offset + 3 ] = v2.x;
					vertexArray[ offset + 4 ] = v2.y;
					vertexArray[ offset + 5 ] = v2.z;
359

360 361 362
					vertexArray[ offset + 6 ] = v3.x;
					vertexArray[ offset + 7 ] = v3.y;
					vertexArray[ offset + 8 ] = v3.z;
M
Mr.doob 已提交
363

364
					offset += 9;
M
Mr.doob 已提交
365

366
				}
367

368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389
				if ( dirtyColors && obj_colors.length ) {
					
					c1 = obj_colors[ face.a ];
					c2 = obj_colors[ face.b ];
					c3 = obj_colors[ face.c ];

					colorArray[ offset_color ]     = c1.r;
					colorArray[ offset_color + 1 ] = c1.g;
					colorArray[ offset_color + 2 ] = c1.b;

					colorArray[ offset_color + 3 ] = c2.r;
					colorArray[ offset_color + 4 ] = c2.g;
					colorArray[ offset_color + 5 ] = c2.b;

					colorArray[ offset_color + 6 ] = c3.r;
					colorArray[ offset_color + 7 ] = c3.g;
					colorArray[ offset_color + 8 ] = c3.b;
					
					offset_color += 9;

				}

390
				if ( dirtyTangents && geometry.hasTangents ) {
391

392 393 394
					t1 = vertices[ face.a ].tangent;
					t2 = vertices[ face.b ].tangent;
					t3 = vertices[ face.c ].tangent;
395

396 397 398 399
					tangentArray[ offset_tangent ]     = t1.x;
					tangentArray[ offset_tangent + 1 ] = t1.y;
					tangentArray[ offset_tangent + 2 ] = t1.z;
					tangentArray[ offset_tangent + 3 ] = t1.w;
M
Mr.doob 已提交
400

401 402 403 404
					tangentArray[ offset_tangent + 4 ] = t2.x;
					tangentArray[ offset_tangent + 5 ] = t2.y;
					tangentArray[ offset_tangent + 6 ] = t2.z;
					tangentArray[ offset_tangent + 7 ] = t2.w;
M
Mr.doob 已提交
405

406 407 408 409
					tangentArray[ offset_tangent + 8 ]  = t3.x;
					tangentArray[ offset_tangent + 9 ]  = t3.y;
					tangentArray[ offset_tangent + 10 ] = t3.z;
					tangentArray[ offset_tangent + 11 ] = t3.w;
M
Mr.doob 已提交
410

411
					offset_tangent += 12;
M
Mr.doob 已提交
412

413 414
				}

415
				if( dirtyNormals ) {
M
Mr.doob 已提交
416

417 418 419
					if ( vertexNormals.length == 3 && needsSmoothNormals ) {

						for ( i = 0; i < 3; i ++ ) {
420

421
							vn = vertexNormals[ i ];
M
Mr.doob 已提交
422

423 424 425
							normalArray[ offset_normal ]     = vn.x;
							normalArray[ offset_normal + 1 ] = vn.y;
							normalArray[ offset_normal + 2 ] = vn.z;
M
Mr.doob 已提交
426

427
							offset_normal += 3;
M
Mr.doob 已提交
428

429
						}
M
Mr.doob 已提交
430

431
					} else {
432

433
						for ( i = 0; i < 3; i ++ ) {
434

435 436 437
							normalArray[ offset_normal ]     = faceNormal.x;
							normalArray[ offset_normal + 1 ] = faceNormal.y;
							normalArray[ offset_normal + 2 ] = faceNormal.z;
M
Mr.doob 已提交
438

439
							offset_normal += 3;
M
Mr.doob 已提交
440

441
						}
M
Mr.doob 已提交
442 443

					}
M
Mr.doob 已提交
444

445 446
				}

447
				if ( dirtyUvs && uv ) {
448

M
Mr.doob 已提交
449 450
					for ( i = 0; i < 3; i ++ ) {

451
						uvi = uv[ i ];
M
Mr.doob 已提交
452

453 454
						uvArray[ offset_uv ]     = uvi.u;
						uvArray[ offset_uv + 1 ] = uvi.v;
M
Mr.doob 已提交
455

456
						offset_uv += 2;
M
Mr.doob 已提交
457

M
Mr.doob 已提交
458
					}
459 460 461

				}

462 463 464 465 466 467 468 469 470 471 472 473 474 475 476
				if ( dirtyUvs && uv2 ) {

					for ( i = 0; i < 3; i ++ ) {

						uv2i = uv2[ i ];

						uv2Array[ offset_uv2 ]     = uv2i.u;
						uv2Array[ offset_uv2 + 1 ] = uv2i.v;

						offset_uv2 += 2;

					}

				}

477
				if( dirtyElements ) {
M
Mr.doob 已提交
478

479 480 481
					faceArray[ offset_face ] = vertexIndex;
					faceArray[ offset_face + 1 ] = vertexIndex + 1;
					faceArray[ offset_face + 2 ] = vertexIndex + 2;
M
Mr.doob 已提交
482

483
					offset_face += 3;
M
Mr.doob 已提交
484

485 486
					lineArray[ offset_line ]     = vertexIndex;
					lineArray[ offset_line + 1 ] = vertexIndex + 1;
M
Mr.doob 已提交
487

488 489
					lineArray[ offset_line + 2 ] = vertexIndex;
					lineArray[ offset_line + 3 ] = vertexIndex + 2;
M
Mr.doob 已提交
490

491 492
					lineArray[ offset_line + 4 ] = vertexIndex + 1;
					lineArray[ offset_line + 5 ] = vertexIndex + 2;
M
Mr.doob 已提交
493

494
					offset_line += 6;
495

496
					vertexIndex += 3;
M
Mr.doob 已提交
497

498
				}
M
Mr.doob 已提交
499

500 501 502

			} else if ( face instanceof THREE.Face4 ) {

503
				if ( dirtyVertices ) {
M
Mr.doob 已提交
504

505 506 507 508
					v1 = vertices[ face.a ].position;
					v2 = vertices[ face.b ].position;
					v3 = vertices[ face.c ].position;
					v4 = vertices[ face.d ].position;
M
Mr.doob 已提交
509

510 511 512
					vertexArray[ offset ]     = v1.x;
					vertexArray[ offset + 1 ] = v1.y;
					vertexArray[ offset + 2 ] = v1.z;
M
Mr.doob 已提交
513

514 515 516
					vertexArray[ offset + 3 ] = v2.x;
					vertexArray[ offset + 4 ] = v2.y;
					vertexArray[ offset + 5 ] = v2.z;
517

518 519 520
					vertexArray[ offset + 6 ] = v3.x;
					vertexArray[ offset + 7 ] = v3.y;
					vertexArray[ offset + 8 ] = v3.z;
521

522 523 524
					vertexArray[ offset + 9 ] = v4.x;
					vertexArray[ offset + 10 ] = v4.y;
					vertexArray[ offset + 11 ] = v4.z;
M
Mr.doob 已提交
525

526
					offset += 12;
M
Mr.doob 已提交
527

528
				}
529 530 531 532 533 534
				
				if ( dirtyColors && obj_colors.length ) {

					c1 = obj_colors[ face.a ];
					c2 = obj_colors[ face.b ];
					c3 = obj_colors[ face.c ];
535
					c4 = obj_colors[ face.d ];
536 537 538 539 540 541 542 543 544 545 546 547

					colorArray[ offset_color ]     = c1.r;
					colorArray[ offset_color + 1 ] = c1.g;
					colorArray[ offset_color + 2 ] = c1.b;

					colorArray[ offset_color + 3 ] = c2.r;
					colorArray[ offset_color + 4 ] = c2.g;
					colorArray[ offset_color + 5 ] = c2.b;

					colorArray[ offset_color + 6 ] = c3.r;
					colorArray[ offset_color + 7 ] = c3.g;
					colorArray[ offset_color + 8 ] = c3.b;
548

549 550 551 552 553 554 555 556
					colorArray[ offset_color + 9 ]  = c4.r;
					colorArray[ offset_color + 10 ] = c4.g;
					colorArray[ offset_color + 11 ] = c4.b;
					
					offset_color += 12;

				}	
				
557
				if ( dirtyTangents && geometry.hasTangents ) {
558

559 560 561 562
					t1 = vertices[ face.a ].tangent;
					t2 = vertices[ face.b ].tangent;
					t3 = vertices[ face.c ].tangent;
					t4 = vertices[ face.d ].tangent;
563

564 565 566 567
					tangentArray[ offset_tangent ]     = t1.x;
					tangentArray[ offset_tangent + 1 ] = t1.y;
					tangentArray[ offset_tangent + 2 ] = t1.z;
					tangentArray[ offset_tangent + 3 ] = t1.w;
M
Mr.doob 已提交
568

569 570 571 572
					tangentArray[ offset_tangent + 4 ] = t2.x;
					tangentArray[ offset_tangent + 5 ] = t2.y;
					tangentArray[ offset_tangent + 6 ] = t2.z;
					tangentArray[ offset_tangent + 7 ] = t2.w;
M
Mr.doob 已提交
573

574 575 576 577
					tangentArray[ offset_tangent + 8 ] = t3.x;
					tangentArray[ offset_tangent + 9 ] = t3.y;
					tangentArray[ offset_tangent + 10 ] = t3.z;
					tangentArray[ offset_tangent + 11 ] = t3.w;
M
Mr.doob 已提交
578

579 580 581 582
					tangentArray[ offset_tangent + 12 ] = t4.x;
					tangentArray[ offset_tangent + 13 ] = t4.y;
					tangentArray[ offset_tangent + 14 ] = t4.z;
					tangentArray[ offset_tangent + 15 ] = t4.w;
M
Mr.doob 已提交
583

584
					offset_tangent += 16;
M
Mr.doob 已提交
585

586
				}
M
Mr.doob 已提交
587

588
				if( dirtyNormals ) {
M
Mr.doob 已提交
589

590
					if ( vertexNormals.length == 4 && needsSmoothNormals ) {
591

592
						for ( i = 0; i < 4; i ++ ) {
593

594
							vn = vertexNormals[ i ];
M
Mr.doob 已提交
595

596 597 598
							normalArray[ offset_normal ]     = vn.x;
							normalArray[ offset_normal + 1 ] = vn.y;
							normalArray[ offset_normal + 2 ] = vn.z;
M
Mr.doob 已提交
599

600
							offset_normal += 3;
M
Mr.doob 已提交
601

602
						}
M
Mr.doob 已提交
603

604
					} else {
605

606
						for ( i = 0; i < 4; i ++ ) {
607

608 609 610
							normalArray[ offset_normal ]     = faceNormal.x;
							normalArray[ offset_normal + 1 ] = faceNormal.y;
							normalArray[ offset_normal + 2 ] = faceNormal.z;
M
Mr.doob 已提交
611

612
							offset_normal += 3;
M
Mr.doob 已提交
613

614
						}
M
Mr.doob 已提交
615 616

					}
M
Mr.doob 已提交
617

618 619
				}

620
				if ( dirtyUvs && uv ) {
621

M
Mr.doob 已提交
622 623
					for ( i = 0; i < 4; i ++ ) {

624
						uvi = uv[ i ];
M
Mr.doob 已提交
625

626 627
						uvArray[ offset_uv ]     = uvi.u;
						uvArray[ offset_uv + 1 ] = uvi.v;
M
Mr.doob 已提交
628

629
						offset_uv += 2;
M
Mr.doob 已提交
630

M
Mr.doob 已提交
631
					}
632 633

				}
634 635 636 637 638 639 640 641 642 643 644 645 646 647 648
				
				if ( dirtyUvs && uv2 ) {

					for ( i = 0; i < 4; i ++ ) {

						uv2i = uv2[ i ];

						uv2Array[ offset_uv2 ]     = uv2i.u;
						uv2Array[ offset_uv2 + 1 ] = uv2i.v;

						offset_uv2 += 2;

					}

				}
M
Mr.doob 已提交
649

650
				if( dirtyElements ) {
M
Mr.doob 已提交
651

652 653 654
					faceArray[ offset_face ]     = vertexIndex;
					faceArray[ offset_face + 1 ] = vertexIndex + 1;
					faceArray[ offset_face + 2 ] = vertexIndex + 2;
M
Mr.doob 已提交
655

656 657 658
					faceArray[ offset_face + 3 ] = vertexIndex;
					faceArray[ offset_face + 4 ] = vertexIndex + 2;
					faceArray[ offset_face + 5 ] = vertexIndex + 3;
M
Mr.doob 已提交
659

660
					offset_face += 6;
M
Mr.doob 已提交
661

662 663
					lineArray[ offset_line ]     = vertexIndex;
					lineArray[ offset_line + 1 ] = vertexIndex + 1;
M
Mr.doob 已提交
664

665
					lineArray[ offset_line + 2 ] = vertexIndex;
666
					lineArray[ offset_line + 3 ] = vertexIndex + 3;
M
Mr.doob 已提交
667

668 669
					lineArray[ offset_line + 4 ] = vertexIndex + 1;
					lineArray[ offset_line + 5 ] = vertexIndex + 2;
M
Mr.doob 已提交
670

671 672
					lineArray[ offset_line + 6 ] = vertexIndex + 2;
					lineArray[ offset_line + 7 ] = vertexIndex + 3;
M
Mr.doob 已提交
673

674
					offset_line += 8;
M
Mr.doob 已提交
675

676
					vertexIndex += 4;
M
Mr.doob 已提交
677

678
				}
M
Mr.doob 已提交
679

680
			}
M
Mr.doob 已提交
681

682 683
		}

684
		if ( dirtyVertices ) {
M
Mr.doob 已提交
685

686 687
			_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryChunk.__webGLVertexBuffer );
			_gl.bufferData( _gl.ARRAY_BUFFER, vertexArray, hint );
M
Mr.doob 已提交
688

689
		}
M
Mr.doob 已提交
690

691 692 693 694 695 696 697
		if ( dirtyColors && obj_colors.length ) {

			_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryChunk.__webGLColorBuffer );
			_gl.bufferData( _gl.ARRAY_BUFFER, colorArray, hint );

		}
		
698
		if ( dirtyNormals ) {
M
Mr.doob 已提交
699

700 701
			_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryChunk.__webGLNormalBuffer );
			_gl.bufferData( _gl.ARRAY_BUFFER, normalArray, hint );
M
Mr.doob 已提交
702

703 704
		}

705
		if ( dirtyTangents && geometry.hasTangents ) {
706

707
			_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryChunk.__webGLTangentBuffer );
708
			_gl.bufferData( _gl.ARRAY_BUFFER, tangentArray, hint );
M
Mr.doob 已提交
709

710
		}
711

712
		if ( dirtyUvs && offset_uv > 0 ) {
M
Mr.doob 已提交
713

714
			_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryChunk.__webGLUVBuffer );
715
			_gl.bufferData( _gl.ARRAY_BUFFER, uvArray, hint );
M
Mr.doob 已提交
716

717
		}
M
Mr.doob 已提交
718

719 720 721 722 723 724 725
		if ( dirtyUvs && offset_uv2 > 0 ) {

			_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryChunk.__webGLUV2Buffer );
			_gl.bufferData( _gl.ARRAY_BUFFER, uv2Array, hint );

		}

726
		if( dirtyElements ) {
M
Mr.doob 已提交
727

728 729
			_gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, geometryChunk.__webGLFaceBuffer );
			_gl.bufferData( _gl.ELEMENT_ARRAY_BUFFER, faceArray, hint );
730

731 732
			_gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, geometryChunk.__webGLLineBuffer );
			_gl.bufferData( _gl.ELEMENT_ARRAY_BUFFER, lineArray, hint );
M
Mr.doob 已提交
733

734
		}
735 736

	};
737

738
	function setLineBuffers ( geometry, hint ) {
M
Mr.doob 已提交
739

740
		var v, c, vertex, offset,
741
			vertices = geometry.vertices,
742
			colors = geometry.colors,
743
			vl = vertices.length,
744
			cl = colors.length,
M
Mr.doob 已提交
745 746

			vertexArray = geometry.__vertexArray,
747
			colorArray = geometry.__colorArray,
748 749
		
			dirtyVertices = geometry.__dirtyVertices, 
750
			dirtyColors = geometry.__dirtyColors;
M
Mr.doob 已提交
751

752
		if ( dirtyVertices ) {
M
Mr.doob 已提交
753

754
			for ( v = 0; v < vl; v++ ) {
M
Mr.doob 已提交
755

756
				vertex = vertices[ v ].position;
M
Mr.doob 已提交
757

758
				offset = v * 3;
M
Mr.doob 已提交
759

760 761 762
				vertexArray[ offset ]     = vertex.x;
				vertexArray[ offset + 1 ] = vertex.y;
				vertexArray[ offset + 2 ] = vertex.z;
M
Mr.doob 已提交
763

764 765
			}

A
alteredq 已提交
766 767 768
			_gl.bindBuffer( _gl.ARRAY_BUFFER, geometry.__webGLVertexBuffer );
			_gl.bufferData( _gl.ARRAY_BUFFER, vertexArray, hint );

769
		}
M
Mr.doob 已提交
770

771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789
		if ( dirtyColors ) {

			for ( c = 0; c < cl; c++ ) {

				color = colors[ c ];

				offset = c * 3;

				colorArray[ offset ]     = color.r;
				colorArray[ offset + 1 ] = color.g;
				colorArray[ offset + 2 ] = color.b;

			}

			_gl.bindBuffer( _gl.ARRAY_BUFFER, geometry.__webGLColorBuffer );
			_gl.bufferData( _gl.ARRAY_BUFFER, colorArray, hint );

		}

790
	};
M
Mr.doob 已提交
791

792
	function setParticleBuffers ( geometry, hint, object, camera ) {
793

A
alteredq 已提交
794
		var v, c, vertex, offset,
795 796 797
			vertices = geometry.vertices,
			vl = vertices.length,

A
alteredq 已提交
798 799 800
			colors = geometry.colors,
			cl = colors.length,
		
801
			vertexArray = geometry.__vertexArray,
A
alteredq 已提交
802
			colorArray = geometry.__colorArray,
803
		
804 805 806 807 808
			sortArray = geometry.__sortArray,
		
			dirtyVertices = geometry.__dirtyVertices,
			dirtyElements = geometry.__dirtyElements,
			dirtyColors = geometry.__dirtyColors;
809

810 811
		if ( object.sortParticles ) {
		
812
			_projScreenMatrix.multiplySelf( object.matrixWorld );
813
			
814 815 816
			for ( v = 0; v < vl; v++ ) {

				vertex = vertices[ v ].position;
817 818 819 820 821 822 823 824 825 826 827 828 829 830
				
				_vector3.copy( vertex );
				_projScreenMatrix.multiplyVector3( _vector3 );
				
				sortArray[ v ] = [ _vector3.z, v ];
				
			}
			
			sortArray.sort( function(a,b) { return b[0] - a[0]; } );
			
			for ( v = 0; v < vl; v++ ) {
				
				vertex = vertices[ sortArray[v][1] ].position;
				
831
				offset = v * 3;
832
				
833 834 835
				vertexArray[ offset ]     = vertex.x;
				vertexArray[ offset + 1 ] = vertex.y;
				vertexArray[ offset + 2 ] = vertex.z;
836
				
837 838
			}
			
A
alteredq 已提交
839 840 841 842 843 844 845 846 847 848
			for ( c = 0; c < cl; c++ ) {
				
				offset = c * 3;
				
				color = colors[ sortArray[c][1] ];

				colorArray[ offset ]     = color.r;
				colorArray[ offset + 1 ] = color.g;
				colorArray[ offset + 2 ] = color.b;
				
849
			}
A
alteredq 已提交
850 851
			
			
852 853 854 855 856 857 858 859 860 861 862 863 864 865 866
		} else {
		
			if ( dirtyVertices ) {

				for ( v = 0; v < vl; v++ ) {

					vertex = vertices[ v ].position;

					offset = v * 3;

					vertexArray[ offset ]     = vertex.x;
					vertexArray[ offset + 1 ] = vertex.y;
					vertexArray[ offset + 2 ] = vertex.z;

				}
867 868

			}
A
alteredq 已提交
869 870 871 872 873 874 875 876 877 878 879 880 881
			
			if ( dirtyColors ) {
				
				for ( c = 0; c < cl; c++ ) {

					color = colors[ c ];

					offset = c * 3;

					colorArray[ offset ]     = color.r;
					colorArray[ offset + 1 ] = color.g;
					colorArray[ offset + 2 ] = color.b;

882
				}
A
alteredq 已提交
883 884
				
			}
885 886

		}
887
		
A
alteredq 已提交
888 889 890 891 892 893 894 895
		if ( dirtyVertices || object.sortParticles ) {
		
			_gl.bindBuffer( _gl.ARRAY_BUFFER, geometry.__webGLVertexBuffer );
			_gl.bufferData( _gl.ARRAY_BUFFER, vertexArray, hint );
			
		}
		
		if ( dirtyColors || object.sortParticles ) {
896
			
A
alteredq 已提交
897 898
			_gl.bindBuffer( _gl.ARRAY_BUFFER, geometry.__webGLColorBuffer );
			_gl.bufferData( _gl.ARRAY_BUFFER, colorArray, hint );
899
		
A
alteredq 已提交
900
		}
901
		
902
	};
M
Mr.doob 已提交
903

M
Mr.doob 已提交
904
	function setMaterialShaders( material, shaders ) {
905

M
Mr.doob 已提交
906 907
		material.fragment_shader = shaders.fragment_shader;
		material.vertex_shader = shaders.vertex_shader;
908
		material.uniforms = Uniforms.clone( shaders.uniforms );
909

M
Mr.doob 已提交
910
	};
911

A
alteredq 已提交
912
	function refreshUniformsCommon( uniforms, material ) {
M
Mr.doob 已提交
913

914
		// premultiply alpha
A
alteredq 已提交
915
		uniforms.diffuse.value.setRGB( material.color.r * material.opacity, material.color.g * material.opacity, material.color.b * material.opacity );
M
Mr.doob 已提交
916

917
		// pure color
A
alteredq 已提交
918
		//uniforms.color.value.setHex( material.color.hex );
M
Mr.doob 已提交
919

A
alteredq 已提交
920 921
		uniforms.opacity.value = material.opacity;
		uniforms.map.texture = material.map;
922
		
A
alteredq 已提交
923
		uniforms.light_map.texture = material.light_map;
924

A
alteredq 已提交
925 926 927 928 929
		uniforms.env_map.texture = material.env_map;
		uniforms.reflectivity.value = material.reflectivity;
		uniforms.refraction_ratio.value = material.refraction_ratio;
		uniforms.combine.value = material.combine;
		uniforms.useRefract.value = material.env_map && material.env_map.mapping instanceof THREE.CubeRefractionMapping;
930

931
	};
932

A
alteredq 已提交
933
	function refreshUniformsLine( uniforms, material ) {
934

A
alteredq 已提交
935 936
		uniforms.diffuse.value.setRGB( material.color.r * material.opacity, material.color.g * material.opacity, material.color.b * material.opacity );
		uniforms.opacity.value = material.opacity;
937 938

	};
M
Mr.doob 已提交
939

A
alteredq 已提交
940
	function refreshUniformsParticle( uniforms, material ) {
941

A
alteredq 已提交
942 943 944 945
		uniforms.psColor.value.setRGB( material.color.r * material.opacity, material.color.g * material.opacity, material.color.b * material.opacity );
		uniforms.opacity.value = material.opacity;
		uniforms.size.value = material.size;
		uniforms.map.texture = material.map;
946

A
alteredq 已提交
947 948 949 950 951
	};
	
	function refreshUniformsFog( uniforms, fog ) {
	
		uniforms.fogColor.value.setHex( fog.color.hex );
952

A
alteredq 已提交
953
		if ( fog instanceof THREE.Fog ) {
954

A
alteredq 已提交
955 956
			uniforms.fogNear.value = fog.near;
			uniforms.fogFar.value = fog.far;
957

A
alteredq 已提交
958
		} else if ( fog instanceof THREE.FogExp2 ) {
959

A
alteredq 已提交
960
			uniforms.fogDensity.value = fog.density;
961 962

		}
A
alteredq 已提交
963
	
964 965
	};

A
alteredq 已提交
966
	function refreshUniformsPhong( uniforms, material ) {
M
Mr.doob 已提交
967

A
alteredq 已提交
968 969 970 971 972
		//uniforms.ambient.value.setHex( material.ambient.hex );
		//uniforms.specular.value.setHex( material.specular.hex );
		uniforms.ambient.value.setRGB( material.ambient.r, material.ambient.g, material.ambient.b );
		uniforms.specular.value.setRGB( material.specular.r, material.specular.g, material.specular.b );
		uniforms.shininess.value = material.shininess;
M
Mr.doob 已提交
973

974
	};
M
Mr.doob 已提交
975 976


A
alteredq 已提交
977
	function refreshUniformsLights( uniforms, lights ) {
M
Mr.doob 已提交
978

A
alteredq 已提交
979 980 981 982 983 984
		uniforms.enableLighting.value = lights.directional.length + lights.point.length;
		uniforms.ambientLightColor.value = lights.ambient;
		uniforms.directionalLightColor.value = lights.directional.colors;
		uniforms.directionalLightDirection.value = lights.directional.positions;
		uniforms.pointLightColor.value = lights.point.colors;
		uniforms.pointLightPosition.value = lights.point.positions;
M
Mr.doob 已提交
985

A
alteredq 已提交
986
	};
M
Mr.doob 已提交
987

988
	this.initMaterial = function( material, lights, fog ) {
M
Mr.doob 已提交
989

A
alteredq 已提交
990 991 992
		var u, identifiers, parameters, maxLightCount;
		
		if ( material instanceof THREE.MeshDepthMaterial ) {
993

A
alteredq 已提交
994
			setMaterialShaders( material, THREE.ShaderLib[ 'depth' ] );
995

A
alteredq 已提交
996
		} else if ( material instanceof THREE.MeshNormalMaterial ) {
997

A
alteredq 已提交
998
			setMaterialShaders( material, THREE.ShaderLib[ 'normal' ] );
999

A
alteredq 已提交
1000
		} else if ( material instanceof THREE.MeshBasicMaterial ) {
1001

A
alteredq 已提交
1002
			setMaterialShaders( material, THREE.ShaderLib[ 'basic' ] );
1003

A
alteredq 已提交
1004
		} else if ( material instanceof THREE.MeshLambertMaterial ) {
M
Mr.doob 已提交
1005

A
alteredq 已提交
1006
			setMaterialShaders( material, THREE.ShaderLib[ 'lambert' ] );
M
Mr.doob 已提交
1007

A
alteredq 已提交
1008
		} else if ( material instanceof THREE.MeshPhongMaterial ) {
M
Mr.doob 已提交
1009

A
alteredq 已提交
1010
			setMaterialShaders( material, THREE.ShaderLib[ 'phong' ] );
M
Mr.doob 已提交
1011

A
alteredq 已提交
1012
		} else if ( material instanceof THREE.LineBasicMaterial ) {
M
Mr.doob 已提交
1013

A
alteredq 已提交
1014
			setMaterialShaders( material, THREE.ShaderLib[ 'basic' ] );
1015

A
alteredq 已提交
1016 1017 1018 1019 1020
		} else if ( material instanceof THREE.ParticleBasicMaterial ) {
			
			setMaterialShaders( material, THREE.ShaderLib[ 'particle_basic' ] );
			
		}
1021

A
alteredq 已提交
1022 1023
		// heuristics to create shader parameters according to lights in the scene
		// (not to blow over maxLights budget)
M
Mr.doob 已提交
1024

A
alteredq 已提交
1025
		maxLightCount = allocateLights( lights, 4 );
M
Mr.doob 已提交
1026

A
alteredq 已提交
1027 1028 1029
		parameters = { fog: fog, map: material.map, env_map: material.env_map, light_map: material.light_map, vertex_colors: material.vertex_colors,
					   maxDirLights: maxLightCount.directional, maxPointLights: maxLightCount.point };
		material.program = buildProgram( material.fragment_shader, material.vertex_shader, parameters );
M
Mr.doob 已提交
1030

A
alteredq 已提交
1031 1032
		identifiers = [ 'viewMatrix', 'modelViewMatrix', 'projectionMatrix', 'normalMatrix', 'objectMatrix', 'cameraPosition' ];
		for( u in material.uniforms ) {
1033

A
alteredq 已提交
1034
			identifiers.push(u);
M
Mr.doob 已提交
1035

A
alteredq 已提交
1036
		}
M
Mr.doob 已提交
1037

A
alteredq 已提交
1038 1039
		cacheUniformLocations( material.program, identifiers );
		cacheAttributeLocations( material.program, [ "position", "normal", "uv", "uv2", "tangent", "color" ] );
M
Mr.doob 已提交
1040

1041 1042
	};
	
A
alteredq 已提交
1043 1044
	this.setProgram = function( camera, lights, fog, material, object ) {
		
A
alteredq 已提交
1045
		if ( !material.program ) this.initMaterial( material, lights, fog );
M
Mr.doob 已提交
1046

A
alteredq 已提交
1047 1048 1049
		var program = material.program, 
			p_uniforms = program.uniforms,
			m_uniforms = material.uniforms;
1050

M
Mr.doob 已提交
1051
		if( program != _oldProgram ) {
M
Mr.doob 已提交
1052

M
Mr.doob 已提交
1053 1054
			_gl.useProgram( program );
			_oldProgram = program;
A
alteredq 已提交
1055 1056
			
			_gl.uniformMatrix4fv( p_uniforms.projectionMatrix, false, _projectionMatrixArray );
M
Mr.doob 已提交
1057

M
Mr.doob 已提交
1058
		}
1059
		
A
alteredq 已提交
1060 1061 1062 1063 1064
		// refresh uniforms common to several materials
		
		if ( fog && ( 
			 material instanceof THREE.MeshBasicMaterial ||
			 material instanceof THREE.MeshLambertMaterial ||
1065
			 material instanceof THREE.MeshPhongMaterial ||
A
alteredq 已提交
1066 1067 1068
			 material instanceof THREE.LineBasicMaterial ||
			 material instanceof THREE.ParticleBasicMaterial )
			) {
1069
			
A
alteredq 已提交
1070
			refreshUniformsFog( m_uniforms, fog );
1071
			
A
alteredq 已提交
1072
		}		
M
Mr.doob 已提交
1073

M
Mr.doob 已提交
1074
		if ( material instanceof THREE.MeshPhongMaterial ||
1075
			 material instanceof THREE.MeshLambertMaterial ) {
1076

1077
			this.setupLights( program, lights );
A
alteredq 已提交
1078
			refreshUniformsLights( m_uniforms, this.lights );
M
Mr.doob 已提交
1079 1080 1081

		}

1082 1083 1084
		if ( material instanceof THREE.MeshBasicMaterial ||
			 material instanceof THREE.MeshLambertMaterial ||
			 material instanceof THREE.MeshPhongMaterial ) {
M
Mr.doob 已提交
1085

A
alteredq 已提交
1086
			refreshUniformsCommon( m_uniforms, material );
M
Mr.doob 已提交
1087

A
alteredq 已提交
1088
		}
M
Mr.doob 已提交
1089

A
alteredq 已提交
1090 1091
		// refresh single material specific uniforms
		
1092
		if ( material instanceof THREE.LineBasicMaterial ) {
M
Mr.doob 已提交
1093

A
alteredq 已提交
1094
			refreshUniformsLine( m_uniforms, material );
1095
			
A
alteredq 已提交
1096
		} else if ( material instanceof THREE.ParticleBasicMaterial ) {
1097

A
alteredq 已提交
1098
			refreshUniformsParticle( m_uniforms, material );
1099
			
A
alteredq 已提交
1100
		} else if ( material instanceof THREE.MeshPhongMaterial ) {
M
Mr.doob 已提交
1101

A
alteredq 已提交
1102
			refreshUniformsPhong( m_uniforms, material );
M
Mr.doob 已提交
1103

A
alteredq 已提交
1104
		} else if ( material instanceof THREE.MeshDepthMaterial ) {
M
Mr.doob 已提交
1105

A
alteredq 已提交
1106 1107 1108 1109 1110
			m_uniforms.mNear.value = camera.near;
			m_uniforms.mFar.value = camera.far;
			m_uniforms.opacity.value = material.opacity;
			
		} else if ( material instanceof THREE.MeshNormalMaterial ) {
1111

A
alteredq 已提交
1112
			m_uniforms.opacity.value = material.opacity;
1113
			
1114
		}
A
alteredq 已提交
1115 1116 1117 1118 1119
		
		// load common uniforms
		
		loadUniformsGeneric( program, m_uniforms );
		loadUniformsMatrices( p_uniforms, object );
1120

A
alteredq 已提交
1121 1122 1123 1124 1125 1126 1127 1128
		// load material specific uniforms
		// (shader material also gets them for the sake of genericity)
		
		if ( material instanceof THREE.MeshShaderMaterial ||
			 material instanceof THREE.MeshPhongMaterial ||
			 material.env_map ) {
			
			_gl.uniform3f( p_uniforms.cameraPosition, camera.position.x, camera.position.y, camera.position.z );
1129 1130 1131
			
		}
		
A
alteredq 已提交
1132 1133 1134 1135 1136 1137
		if ( material instanceof THREE.MeshShaderMaterial ||
			 material.env_map) {
				 
			_gl.uniformMatrix4fv( p_uniforms.objectMatrix, false, object._objectMatrixArray );
		
		}
1138

A
alteredq 已提交
1139 1140 1141 1142 1143 1144 1145 1146
		if ( material instanceof THREE.MeshPhongMaterial ||
			 material instanceof THREE.MeshLambertMaterial ||
			 material instanceof THREE.MeshShaderMaterial ) {
			 
			_gl.uniformMatrix4fv( p_uniforms.viewMatrix, false, _viewMatrixArray );
			
		}
		
A
alteredq 已提交
1147 1148 1149 1150 1151 1152 1153 1154 1155 1156
		return program;
		
	};
	
	this.renderBuffer = function ( camera, lights, fog, material, geometryChunk, object ) {

		var program, attributes, linewidth, primitives;

		program = this.setProgram( camera, lights, fog, material, object );
		
1157
		attributes = program.attributes;
M
Mr.doob 已提交
1158

1159
		// vertices
M
Mr.doob 已提交
1160

M
Mr.doob 已提交
1161
		_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryChunk.__webGLVertexBuffer );
1162
		_gl.vertexAttribPointer( attributes.position, 3, _gl.FLOAT, false, 0, 0 );
1163
		_gl.enableVertexAttribArray( attributes.position );
1164

A
alteredq 已提交
1165 1166 1167 1168 1169 1170 1171 1172 1173 1174
		// colors

		if ( attributes.color >= 0 ) {

			_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryChunk.__webGLColorBuffer );
			_gl.vertexAttribPointer( attributes.color, 3, _gl.FLOAT, false, 0, 0 );
			_gl.enableVertexAttribArray( attributes.color );

		}

1175
		// normals
M
Mr.doob 已提交
1176

1177
		if ( attributes.normal >= 0 ) {
1178

1179 1180
			_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryChunk.__webGLNormalBuffer );
			_gl.vertexAttribPointer( attributes.normal, 3, _gl.FLOAT, false, 0, 0 );
1181
			_gl.enableVertexAttribArray( attributes.normal );
1182

1183
		}
1184

1185 1186 1187
		// tangents

		if ( attributes.tangent >= 0 ) {
1188

1189 1190
			_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryChunk.__webGLTangentBuffer );
			_gl.vertexAttribPointer( attributes.tangent, 4, _gl.FLOAT, false, 0, 0 );
1191
			_gl.enableVertexAttribArray( attributes.tangent );
1192

1193
		}
1194

1195
		// uvs
M
Mr.doob 已提交
1196

M
Mr.doob 已提交
1197 1198
		if ( attributes.uv >= 0 ) {

1199
			if ( geometryChunk.__webGLUVBuffer ) {
1200

1201
				_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryChunk.__webGLUVBuffer );
1202
				_gl.vertexAttribPointer( attributes.uv, 2, _gl.FLOAT, false, 0, 0 );
1203

1204
				_gl.enableVertexAttribArray( attributes.uv );
1205

1206
			} else {
1207

1208
				_gl.disableVertexAttribArray( attributes.uv );
M
Mr.doob 已提交
1209

1210
			}
1211 1212 1213

		}

1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230
		if ( attributes.uv2 >= 0 ) {

			if ( geometryChunk.__webGLUV2Buffer ) {

				_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryChunk.__webGLUV2Buffer );
				_gl.vertexAttribPointer( attributes.uv2, 2, _gl.FLOAT, false, 0, 0 );

				_gl.enableVertexAttribArray( attributes.uv2 );

			} else {

				_gl.disableVertexAttribArray( attributes.uv2 );

			}

		}

1231
		// render mesh
M
Mr.doob 已提交
1232

1233
		if ( object instanceof THREE.Mesh ) {
1234

1235 1236 1237
			// wireframe
			
			if ( material.wireframe ) {
M
Mr.doob 已提交
1238

1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255
				_gl.lineWidth( material.wireframe_linewidth );
				_gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, geometryChunk.__webGLLineBuffer );
				_gl.drawElements( _gl.LINES, geometryChunk.__webGLLineCount, _gl.UNSIGNED_SHORT, 0 );
			
			// triangles
			
			} else {
				
				_gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, geometryChunk.__webGLFaceBuffer );
				_gl.drawElements( _gl.TRIANGLES, geometryChunk.__webGLFaceCount, _gl.UNSIGNED_SHORT, 0 );
				
			}
		
		// render lines
		
		} else if ( object instanceof THREE.Line ) {
			
1256
			primitives = ( object.type == THREE.LineStrip ) ? _gl.LINE_STRIP : _gl.LINES;
M
Mr.doob 已提交
1257

1258
			_gl.lineWidth( material.linewidth );
1259
			_gl.drawArrays( primitives, 0, geometryChunk.__webGLLineCount );
1260
		
1261
		// render particles
1262 1263
		
		} else if ( object instanceof THREE.ParticleSystem ) {
1264
			
1265
			_gl.drawArrays( _gl.POINTS, 0, geometryChunk.__webGLParticleCount );
1266
			
1267 1268 1269 1270
		}

	};

A
alteredq 已提交
1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299
	function renderBufferImmediate( object, program ) {
		
		if ( ! object.__webGLVertexBuffer ) object.__webGLVertexBuffer = _gl.createBuffer();
		if ( ! object.__webGLNormalBuffer ) object.__webGLNormalBuffer = _gl.createBuffer();
		
		if ( object.hasPos ) {
			
		  _gl.bindBuffer( _gl.ARRAY_BUFFER, object.__webGLVertexBuffer );
		  _gl.bufferData( _gl.ARRAY_BUFFER, object.positionArray, _gl.DYNAMIC_DRAW );
		  _gl.enableVertexAttribArray( program.attributes.position );
		  _gl.vertexAttribPointer( program.attributes.position, 3, _gl.FLOAT, false, 0, 0 );
		
		}
		
		if ( object.hasNormal ) {
			
		  _gl.bindBuffer( _gl.ARRAY_BUFFER, object.__webGLNormalBuffer );
		  _gl.bufferData( _gl.ARRAY_BUFFER, object.normalArray, _gl.DYNAMIC_DRAW );
		  _gl.enableVertexAttribArray( program.attributes.normal );
		  _gl.vertexAttribPointer( program.attributes.normal, 3, _gl.FLOAT, false, 0, 0 );
		
		}
		
		_gl.drawArrays( _gl.TRIANGLES, 0, object.count );
		
		object.count = 0;
		
	};
	
1300 1301
	function setObjectFaces( object ) {
		
1302
		if ( _oldDoubleSided != object.doubleSided ) {
A
alteredq 已提交
1303
			
1304
			if( object.doubleSided ) {
A
alteredq 已提交
1305
				
1306
				_gl.disable( _gl.CULL_FACE );
1307

1308
			} else {
1309

A
alteredq 已提交
1310 1311 1312
				_gl.enable( _gl.CULL_FACE );
			
			}
1313 1314 1315 1316 1317 1318 1319
			
			_oldDoubleSided = object.doubleSided;
		
		}
		
		if ( _oldFlipSided != object.flipSided ) {
		
1320 1321 1322 1323
			if( object.flipSided ) {

				_gl.frontFace( _gl.CW );

1324
			} else {
1325 1326 1327 1328

				_gl.frontFace( _gl.CCW );

			}
1329 1330
			
			_oldFlipSided = object.flipSided;
1331 1332 1333 1334 1335

		}
		
	};
	
1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370
	function computeFrustum( m ) {

		_frustum[ 0 ].set( m.n41 - m.n11, m.n42 - m.n12, m.n43 - m.n13, m.n44 - m.n14 );
		_frustum[ 1 ].set( m.n41 + m.n11, m.n42 + m.n12, m.n43 + m.n13, m.n44 + m.n14 );
		_frustum[ 2 ].set( m.n41 + m.n21, m.n42 + m.n22, m.n43 + m.n23, m.n44 + m.n24 );
		_frustum[ 3 ].set( m.n41 - m.n21, m.n42 - m.n22, m.n43 - m.n23, m.n44 - m.n24 );
		_frustum[ 4 ].set( m.n41 - m.n31, m.n42 - m.n32, m.n43 - m.n33, m.n44 - m.n34 );
		_frustum[ 5 ].set( m.n41 + m.n31, m.n42 + m.n32, m.n43 + m.n33, m.n44 + m.n34 );

		var i, plane;
		
		for ( i = 0; i < 5; i ++ ) {

			plane = _frustum[ i ];
			plane.divideScalar( Math.sqrt( plane.x * plane.x + plane.y * plane.y + plane.z * plane.z ) );

		}

	};
	
	function isInFrustum( object ) {

		var distance, matrix = object.matrix,
		radius = - object.geometry.boundingSphere.radius * Math.max( object.scale.x, Math.max( object.scale.y, object.scale.z ) );

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

			distance = _frustum[ i ].x * matrix.n14 + _frustum[ i ].y * matrix.n24 + _frustum[ i ].z * matrix.n34 + _frustum[ i ].w;
			if ( distance <= radius ) return false;

		}

		return true;

	};
1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447

	function addToFixedArray( where, what ) {
		
		where.list[ where.count ] = what;
		where.count += 1;
	
	};
	
	function unrollImmediateBufferMaterials( globject ) {
		
		var i, l, m, ml, material,
			object = globject.object,
			opaque = globject.opaque,
			transparent = globject.transparent;

		transparent.count = 0;
		opaque.count = 0;
		
		for ( m = 0, ml = object.materials.length; m < ml; m++ ) {

			material = object.materials[ m ];
			
			if ( ( material.opacity && material.opacity < 1.0 ) || material.blending != THREE.NormalBlending )
				addToFixedArray( transparent, material );
			else
				addToFixedArray( opaque, material );
			
		}
		
	};
	
	function unrollBufferMaterials( globject ) {
		
		var i, l, m, ml, material, meshMaterial,
			object = globject.object,
			buffer = globject.buffer,
			opaque = globject.opaque,
			transparent = globject.transparent;

		transparent.count = 0;
		opaque.count = 0;
		
		for ( m = 0, ml = object.materials.length; m < ml; m++ ) {

			meshMaterial = object.materials[ m ];

			if ( meshMaterial instanceof THREE.MeshFaceMaterial ) {

				for ( i = 0, l = buffer.materials.length; i < l; i++ ) {

					material = buffer.materials[ i ];
					
					if ( material ) {
						
						if ( ( material.opacity && material.opacity < 1.0 ) || material.blending != THREE.NormalBlending )
							addToFixedArray( transparent, material );
						else
							addToFixedArray( opaque, material );
						
					}

				}

			} else {

				material = meshMaterial;
				
				if ( ( material.opacity && material.opacity < 1.0 ) || material.blending != THREE.NormalBlending )
					addToFixedArray( transparent, material );
				else
					addToFixedArray( opaque, material );

			}

		}
		
	};
1448
	
1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465
	function updateChildren( object ) {
		
		var i, l, child, children = object.children;
		
		for ( i = 0, l = children.length; i < l; i ++ ) {

			child = children[ i ];

			child.autoUpdateMatrix && child.updateMatrix();
			child.matrixWorld.multiply( object.matrixWorld, child.matrix );
			
			updateChildren( child );
		
		}
	
	};
	
A
alteredq 已提交
1466
	this.render = function( scene, camera, renderTarget, clear ) {
M
Mr.doob 已提交
1467

1468 1469
		var i, program, opaque, transparent,
			o, ol, oil, webGLObject, object, buffer,
A
alteredq 已提交
1470
			lights = scene.lights,
1471 1472
			fog = scene.fog,
			ol;
1473
		
1474 1475
		camera.autoUpdateMatrix && camera.updateMatrix();
		
1476 1477
		camera.matrix.flattenToArray( _viewMatrixArray );
		camera.projectionMatrix.flattenToArray( _projectionMatrixArray );
M
Mr.doob 已提交
1478

1479 1480 1481
		_projScreenMatrix.multiply( camera.projectionMatrix, camera.matrix );
		computeFrustum( _projScreenMatrix );
		
1482
		this.initWebGLObjects( scene, camera );
M
Mr.doob 已提交
1483

M
Mr.doob 已提交
1484 1485
		setRenderTarget( renderTarget, clear !== undefined ? clear : true );

1486
		if ( this.autoClear ) {
M
Mr.doob 已提交
1487

1488
			this.clear();
M
Mr.doob 已提交
1489

1490 1491
		}

1492
		// set matrices
1493 1494
		
		ol = scene.__webGLObjects.length;
A
alteredq 已提交
1495
	
1496
		for ( o = 0; o < ol; o++ ) {
M
Mr.doob 已提交
1497

M
Mr.doob 已提交
1498
			webGLObject = scene.__webGLObjects[ o ];
M
Mr.doob 已提交
1499
			object = webGLObject.object;
M
Mr.doob 已提交
1500

1501
			if ( object.visible ) {
1502
				
1503 1504 1505 1506
				if ( webGLObject.root ) {
			
					object.autoUpdateMatrix && object.updateMatrix();
					object.matrixWorld.copy( object.matrix );
A
alteredq 已提交
1507
				
1508 1509
					updateChildren( object );
					
A
alteredq 已提交
1510
				}
1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521

				if ( ! ( object instanceof THREE.Mesh ) || isInFrustum( object ) ) {
					
					object.matrixWorld.flattenToArray( object._objectMatrixArray );
					
					setupMatrices( object, camera );
					
					unrollBufferMaterials( webGLObject );
					
					webGLObject.render = true;
					
A
alteredq 已提交
1522
				
1523 1524 1525 1526 1527
				} else {
					
					webGLObject.render = false;
					
				}
1528
				
1529 1530 1531
			} else {
				
				webGLObject.render = false;
1532

1533 1534 1535 1536 1537 1538 1539
			}
		
		}
		
		oil = scene.__webGLObjectsImmediate.length;
		
		for ( o = 0; o < oil; o++ ) {
1540
		
1541 1542
			webGLObject = scene.__webGLObjectsImmediate[ o ];
			object = webGLObject.object;
1543 1544 1545
			
			if ( object.visible ) {
			
A
alteredq 已提交
1546 1547 1548
				if( object.autoUpdateMatrix ) { 
				
					object.updateMatrix();
1549 1550
					object.matrixWorld.copy( object.matrix );
					object.matrixWorld.flattenToArray( object._objectMatrixArray );
A
alteredq 已提交
1551 1552 1553
				
				}
				
1554
				setupMatrices( object, camera );
1555 1556
				
				unrollImmediateBufferMaterials( webGLObject );
1557 1558
			
			}
A
alteredq 已提交
1559
		
1560
		}
A
alteredq 已提交
1561

1562 1563
		// opaque pass

1564 1565
		setBlending( THREE.NormalBlending );
		
1566
		for ( o = 0; o < ol; o++ ) {
M
Mr.doob 已提交
1567

1568 1569
			webGLObject = scene.__webGLObjects[ o ];

1570 1571 1572 1573
			if ( webGLObject.render ) {
				
				object = webGLObject.object;
				buffer = webGLObject.buffer;
1574
				opaque = webGLObject.opaque;
1575 1576
				
				setObjectFaces( object );
1577 1578 1579 1580 1581 1582 1583 1584 1585
				
				for( i = 0; i < opaque.count; i++ ) {
					
					material = opaque.list[ i ];
					
					this.setDepthTest( material.depth_test );
					this.renderBuffer( camera, lights, fog, material, buffer, object );
				
				}
1586 1587 1588 1589 1590

			}

		}

A
alteredq 已提交
1591 1592
		// opaque pass (immediate simulator)
		
1593
		for ( o = 0; o < oil; o++ ) {
A
alteredq 已提交
1594
			
1595 1596
			webGLObject = scene.__webGLObjectsImmediate[ o ];
			object = webGLObject.object;
A
alteredq 已提交
1597 1598 1599
			
			if ( object.visible ) {
			
1600 1601
				opaque = webGLObject.opaque;
				
1602
				setObjectFaces( object );
1603 1604 1605 1606 1607 1608 1609 1610 1611 1612
				
				for( i = 0; i < opaque.count; i++ ) {
				
					material = opaque.list[ i ];
				
					this.setDepthTest( material.depth_test );
					program = this.setProgram( camera, lights, fog, material, object );
					object.render( function( object ) { renderBufferImmediate( object, program ); } );
				
				}
A
alteredq 已提交
1613 1614 1615 1616 1617
			
			}
			
		}

1618 1619
		// transparent pass

1620
		for ( o = 0; o < ol; o++ ) {
1621 1622 1623

			webGLObject = scene.__webGLObjects[ o ];

1624 1625 1626 1627
			if ( webGLObject.render ) {
				
				object = webGLObject.object;
				buffer = webGLObject.buffer;
1628 1629
				transparent = webGLObject.transparent;
				
1630 1631
				setObjectFaces( object );
				
1632 1633 1634 1635 1636 1637 1638 1639 1640
				for( i = 0; i < transparent.count; i++ ) {
					
					material = transparent.list[ i ];
					
					setBlending( material.blending );
					this.setDepthTest( material.depth_test );
					this.renderBuffer( camera, lights, fog, material, buffer, object );
				
				}
1641

1642
			}
M
Mr.doob 已提交
1643

M
Mr.doob 已提交
1644
		}
M
Mr.doob 已提交
1645

1646 1647
		// transparent pass (immediate simulator)
		
1648 1649
		for ( o = 0; o < oil; o++ ) {
		
1650 1651
			webGLObject = scene.__webGLObjectsImmediate[ o ];
			object = webGLObject.object;
1652 1653 1654
			
			if ( object.visible ) {
			
1655 1656
				transparent = webGLObject.transparent;
				
1657
				setObjectFaces( object );
1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668
				
				for( i = 0; i < transparent.count; i++ ) {
				
					material = transparent.list[ i ];
				
					setBlending( material.blending );
					this.setDepthTest( material.depth_test );
					program = this.setProgram( camera, lights, fog, material, object );
					object.render( function( object ) { renderBufferImmediate( object, program ); } );
				
				}
1669 1670 1671 1672
			
			}
			
		}
1673
	
1674
		// Generate mipmap if we're using any kind of mipmap filtering
M
Mr.doob 已提交
1675

1676
		if ( renderTarget && renderTarget.min_filter !== THREE.NearestFilter && renderTarget.min_filter !== THREE.LinearFilter ) {
M
Mr.doob 已提交
1677

1678
			updateRenderTargetMipmap( renderTarget );
M
Mr.doob 已提交
1679

1680
		}
1681

M
Mr.doob 已提交
1682
	};
M
Mr.doob 已提交
1683

1684 1685 1686 1687 1688
	function addChildren( scene, object ) {
	
		var i, l, children = object.children;
		
		for ( i = 0, l = children.length; i < l; i ++ ) {
M
Mr.doob 已提交
1689

1690
			child = children[ i ];
M
Mr.doob 已提交
1691

1692 1693 1694 1695
			addObject( scene, child, false );
			addChildren( scene, child );
		
		}
1696

1697
	};
1698

1699 1700 1701 1702 1703 1704 1705
	function addObject( scene, object, root ) {
		
		var g, geometry, geometryChunk, objmap;
		
		geometry = object.geometry;
		
		if ( scene.__webGLObjectsMap[ object.id ] == undefined ) {
M
Mr.doob 已提交
1706

1707 1708 1709 1710 1711 1712 1713 1714 1715
			scene.__webGLObjectsMap[ object.id ] = {};
				
			object._modelViewMatrix = new THREE.Matrix4();
			
			object._normalMatrixArray = new Float32Array( 9 );
			object._modelViewMatrixArray = new Float32Array( 16 );
			object._objectMatrixArray = new Float32Array( 16 );
			
			object.matrix.flattenToArray( object._objectMatrixArray );
M
Mr.doob 已提交
1716

1717
		}
A
alteredq 已提交
1718

1719 1720
		objmap = scene.__webGLObjectsMap[ object.id ];
		objlist = scene.__webGLObjects;
A
alteredq 已提交
1721

1722
		if ( object instanceof THREE.Mesh ) {
A
alteredq 已提交
1723

1724
			// create separate VBOs per geometry chunk
A
alteredq 已提交
1725

1726
			for ( g in geometry.geometryChunks ) {
A
alteredq 已提交
1727

1728
				geometryChunk = geometry.geometryChunks[ g ];
M
Mr.doob 已提交
1729

1730
				// initialise VBO on the first access
M
Mr.doob 已提交
1731

1732
				if( ! geometryChunk.__webGLVertexBuffer ) {
M
Mr.doob 已提交
1733

1734 1735
					createMeshBuffers( geometryChunk );
					initMeshBuffers( geometryChunk, object );
A
alteredq 已提交
1736

1737 1738 1739 1740 1741 1742
					geometry.__dirtyVertices = true;
					geometry.__dirtyElements = true;
					geometry.__dirtyUvs = true;
					geometry.__dirtyNormals = true;
					geometry.__dirtyTangents = true;
					geometry.__dirtyColors = true;
M
Mr.doob 已提交
1743

1744
				}
1745

1746 1747 1748
				if( geometry.__dirtyVertices || geometry.__dirtyElements || 
					geometry.__dirtyUvs || geometry.__dirtyNormals || 
					geometry.__dirtyColors || geometry.__dirtyTangents ) {
M
Mr.doob 已提交
1749

1750
					setMeshBuffers( geometryChunk, object, _gl.DYNAMIC_DRAW );
M
Mr.doob 已提交
1751

1752
				}
M
Mr.doob 已提交
1753

1754
				// create separate wrapper per each use of VBO
1755

1756
				add_buffer( objlist, objmap, g, geometryChunk, object, root );
M
Mr.doob 已提交
1757

1758
			}
M
Mr.doob 已提交
1759

1760 1761 1762 1763 1764 1765
			geometry.__dirtyVertices = false;
			geometry.__dirtyElements = false;
			geometry.__dirtyUvs = false;
			geometry.__dirtyNormals = false;
			geometry.__dirtyTangents = false;
			geometry.__dirtyColors = false;
M
Mr.doob 已提交
1766

1767
		} else if ( object instanceof THREE.Line ) {
M
Mr.doob 已提交
1768

1769
			if( ! geometry.__webGLVertexBuffer ) {
M
Mr.doob 已提交
1770

1771 1772
				createLineBuffers( geometry );
				initLineBuffers( geometry );
M
Mr.doob 已提交
1773

1774 1775
				geometry.__dirtyVertices = true;
				geometry.__dirtyColors = true;
M
Mr.doob 已提交
1776

1777
			}
M
Mr.doob 已提交
1778

1779
			if( geometry.__dirtyVertices ||  geometry.__dirtyColors ) {
1780

1781
				setLineBuffers( geometry, _gl.DYNAMIC_DRAW );
1782

1783
			}
1784

1785
			add_buffer( objlist, objmap, 0, geometry, object, root );
M
Mr.doob 已提交
1786

1787 1788
			geometry.__dirtyVertices = false;
			geometry.__dirtyColors = false;
M
Mr.doob 已提交
1789

1790
		} else if ( object instanceof THREE.ParticleSystem ) {
M
Mr.doob 已提交
1791

1792
			if( ! geometry.__webGLVertexBuffer ) {
M
Mr.doob 已提交
1793

1794 1795
				createParticleBuffers( geometry );
				initParticleBuffers( geometry );
1796

1797 1798 1799 1800
				geometry.__dirtyVertices = true;
				geometry.__dirtyColors = true;
				
			}
1801

1802
			if( geometry.__dirtyVertices || geometry.__dirtyColors || object.sortParticles ) {
M
Mr.doob 已提交
1803

1804
				setParticleBuffers( geometry, _gl.DYNAMIC_DRAW, object, camera );
M
Mr.doob 已提交
1805

1806
			}
M
Mr.doob 已提交
1807

1808
			add_buffer( objlist, objmap, 0, geometry, object, root );
M
Mr.doob 已提交
1809

1810 1811
			geometry.__dirtyVertices = false;
			geometry.__dirtyColors = false;
M
Mr.doob 已提交
1812

1813 1814 1815 1816 1817 1818 1819 1820 1821
		} else if ( object instanceof THREE.MarchingCubes ) {
			
			add_buffer_immediate( scene.__webGLObjectsImmediate, objmap, 0, object, root );
			
		}/*else if ( object instanceof THREE.Particle ) {

		}*/
		
	};
M
Mr.doob 已提交
1822

1823
	function add_buffer( objlist, objmap, id, buffer, object, root ) {
M
Mr.doob 已提交
1824

1825
		if ( objmap[ id ] == undefined ) {
M
Mr.doob 已提交
1826

1827 1828 1829 1830 1831 1832 1833
			objlist.push( { buffer: buffer, object: object, 
							opaque: { list: [], count: 0 }, 
							transparent: { list: [], count: 0 },
							root: root
						} );
			
			objmap[ id ] = 1;
M
Mr.doob 已提交
1834

1835
		}
M
Mr.doob 已提交
1836

1837
	};
1838

1839
	function add_buffer_immediate( objlist, objmap, id, object, root ) {
1840

1841
		if ( objmap[ id ] == undefined ) {
M
Mr.doob 已提交
1842

1843 1844 1845 1846 1847 1848 1849
			objlist.push( { object: object, 
							opaque: { list: [], count: 0 }, 
							transparent: { list: [], count: 0 },
							root: root
						} );
			
			objmap[ id ] = 1;
1850

1851
		}
1852

1853 1854 1855
	};
	
	this.initWebGLObjects = function( scene, camera ) {
1856

1857
		var o, ol, object;
M
Mr.doob 已提交
1858

1859
		if ( !scene.__webGLObjects ) {
M
Mr.doob 已提交
1860

1861 1862
			scene.__webGLObjects = [];
			scene.__webGLObjectsMap = {};
M
Mr.doob 已提交
1863

1864
			scene.__webGLObjectsImmediate = [];
1865

1866 1867 1868
		}
		
		for ( o = 0, ol = scene.objects.length; o < ol; o++ ) {
M
Mr.doob 已提交
1869

1870
			object = scene.objects[ o ];
M
Mr.doob 已提交
1871

1872 1873 1874
			addObject( scene, object, true );
			addChildren( scene, object );
		
M
Mr.doob 已提交
1875
		}
1876 1877 1878 1879 1880 1881

	};

	this.removeObject = function ( scene, object ) {

		var o, ol, zobject;
M
Mr.doob 已提交
1882

1883
		for ( o = scene.__webGLObjects.length - 1; o >= 0; o-- ) {
M
Mr.doob 已提交
1884

M
Mr.doob 已提交
1885
			zobject = scene.__webGLObjects[ o ].object;
M
Mr.doob 已提交
1886

1887
			if ( object == zobject ) {
1888 1889 1890 1891

				scene.__webGLObjects.splice( o, 1 );

			}
M
Mr.doob 已提交
1892

1893
		}
M
Mr.doob 已提交
1894

M
Mr.doob 已提交
1895
	};
M
Mr.doob 已提交
1896

1897
	function setupMatrices ( object, camera ) {
1898

1899
		object._modelViewMatrix.multiplyToArray( camera.matrix, object.matrixWorld, object._modelViewMatrixArray );
A
alteredq 已提交
1900
		object._normalMatrix = THREE.Matrix4.makeInvert3x3( object._modelViewMatrix ).transposeIntoArray( object._normalMatrixArray );
M
Mr.doob 已提交
1901

M
Mr.doob 已提交
1902
	};
M
Mr.doob 已提交
1903

1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916
	this.setDepthTest = function( test ) {
		
		if( test ) {
			
			_gl.enable( _gl.DEPTH_TEST );
			
		} else {
			
			_gl.disable( _gl.DEPTH_TEST );
			
		}
		
	};
M
Mr.doob 已提交
1917

M
Mr.doob 已提交
1918
	this.setFaceCulling = function ( cullFace, frontFace ) {
M
Mr.doob 已提交
1919

1920
		if ( cullFace ) {
M
Mr.doob 已提交
1921

1922
			if ( !frontFace || frontFace == "ccw" ) {
M
Mr.doob 已提交
1923

1924
				_gl.frontFace( _gl.CCW );
M
Mr.doob 已提交
1925

1926
			} else {
M
Mr.doob 已提交
1927

1928
				_gl.frontFace( _gl.CW );
M
Mr.doob 已提交
1929

1930
			}
M
Mr.doob 已提交
1931

1932
			if( cullFace == "back" ) {
M
Mr.doob 已提交
1933

1934
				_gl.cullFace( _gl.BACK );
M
Mr.doob 已提交
1935

1936
			} else if( cullFace == "front" ) {
M
Mr.doob 已提交
1937

1938
				_gl.cullFace( _gl.FRONT );
M
Mr.doob 已提交
1939

1940
			} else {
M
Mr.doob 已提交
1941

1942
				_gl.cullFace( _gl.FRONT_AND_BACK );
M
Mr.doob 已提交
1943

1944
			}
M
Mr.doob 已提交
1945

1946
			_gl.enable( _gl.CULL_FACE );
M
Mr.doob 已提交
1947

1948
		} else {
M
Mr.doob 已提交
1949

1950
			_gl.disable( _gl.CULL_FACE );
M
Mr.doob 已提交
1951

1952 1953 1954
		}

	};
N
Nicolas Garcia Belmonte 已提交
1955

1956
	this.supportsVertexTextures = function() {
1957

1958
		return maxVertexTextures() > 0;
1959

1960
	};
1961

1962
	function maxVertexTextures() {
1963

1964 1965 1966
		return _gl.getParameter( _gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS );

	};
1967

1968
	function initGL( antialias, clearColor, clearAlpha ) {
N
Nicolas Garcia Belmonte 已提交
1969 1970 1971

		try {

1972
			_gl = _canvas.getContext( 'experimental-webgl', { antialias: antialias } );
N
Nicolas Garcia Belmonte 已提交
1973

A
alteredq 已提交
1974
		} catch(e) { console.log(e) }
N
Nicolas Garcia Belmonte 已提交
1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988

		if (!_gl) {

			alert("WebGL not supported");
			throw "cannot create webgl context";

		}

		_gl.clearColor( 0, 0, 0, 1 );
		_gl.clearDepth( 1 );

		_gl.enable( _gl.DEPTH_TEST );
		_gl.depthFunc( _gl.LEQUAL );

1989 1990
		_gl.frontFace( _gl.CCW );
		_gl.cullFace( _gl.BACK );
1991
		_gl.enable( _gl.CULL_FACE );
M
Mr.doob 已提交
1992

N
Nicolas Garcia Belmonte 已提交
1993
		_gl.enable( _gl.BLEND );
1994
		_gl.blendFunc( _gl.ONE, _gl.ONE_MINUS_SRC_ALPHA );
1995
		_gl.clearColor( clearColor.r, clearColor.g, clearColor.b, clearAlpha );
A
alteredq 已提交
1996 1997
		
		_cullEnabled = true;
N
Nicolas Garcia Belmonte 已提交
1998

1999
	};
M
Mr.doob 已提交
2000

2001
	function buildProgram( fragment_shader, vertex_shader, parameters ) {
M
Mr.doob 已提交
2002

M
Mr.doob 已提交
2003
		var program = _gl.createProgram(),
M
Mr.doob 已提交
2004

M
Mr.doob 已提交
2005 2006 2007 2008
		prefix_fragment = [
			"#ifdef GL_ES",
			"precision highp float;",
			"#endif",
M
Mr.doob 已提交
2009

2010 2011
			"#define MAX_DIR_LIGHTS " + parameters.maxDirLights,
			"#define MAX_POINT_LIGHTS " + parameters.maxPointLights,
A
alteredq 已提交
2012

2013 2014
			parameters.fog ? "#define USE_FOG" : "",
			parameters.fog instanceof THREE.FogExp2 ? "#define FOG_EXP2" : "",
2015

2016 2017
			parameters.map ? "#define USE_MAP" : "",
			parameters.env_map ? "#define USE_ENVMAP" : "",
2018
			parameters.light_map ? "#define USE_LIGHTMAP" : "",
A
alteredq 已提交
2019
			parameters.vertex_colors ? "#define USE_COLOR" : "",
2020

2021
			"uniform mat4 viewMatrix;",
2022
			"uniform vec3 cameraPosition;",
M
Mr.doob 已提交
2023 2024
			""
		].join("\n"),
2025

M
Mr.doob 已提交
2026
		prefix_vertex = [
2027
			maxVertexTextures() > 0 ? "#define VERTEX_TEXTURES" : "",
2028

2029 2030 2031
			"#define MAX_DIR_LIGHTS " + parameters.maxDirLights,
			"#define MAX_POINT_LIGHTS " + parameters.maxPointLights,

2032 2033
			parameters.map ? "#define USE_MAP" : "",
			parameters.env_map ? "#define USE_ENVMAP" : "",
2034
			parameters.light_map ? "#define USE_LIGHTMAP" : "",
A
alteredq 已提交
2035
			parameters.vertex_colors ? "#define USE_COLOR" : "",
2036

M
Mr.doob 已提交
2037 2038 2039
			"uniform mat4 objectMatrix;",
			"uniform mat4 modelViewMatrix;",
			"uniform mat4 projectionMatrix;",
2040 2041
			"uniform mat4 viewMatrix;",
			"uniform mat3 normalMatrix;",
M
Mr.doob 已提交
2042
			"uniform vec3 cameraPosition;",
M
Mr.doob 已提交
2043 2044
			"attribute vec3 position;",
			"attribute vec3 normal;",
A
alteredq 已提交
2045
			"attribute vec3 color;",
M
Mr.doob 已提交
2046
			"attribute vec2 uv;",
2047
			"attribute vec2 uv2;",
M
Mr.doob 已提交
2048 2049
			""
		].join("\n");
2050

M
Mr.doob 已提交
2051 2052
		_gl.attachShader( program, getShader( "fragment", prefix_fragment + fragment_shader ) );
		_gl.attachShader( program, getShader( "vertex", prefix_vertex + vertex_shader ) );
M
Mr.doob 已提交
2053

M
Mr.doob 已提交
2054
		_gl.linkProgram( program );
N
Nicolas Garcia Belmonte 已提交
2055

M
Mr.doob 已提交
2056
		if ( !_gl.getProgramParameter( program, _gl.LINK_STATUS ) ) {
N
Nicolas Garcia Belmonte 已提交
2057

M
Mr.doob 已提交
2058 2059
			alert( "Could not initialise shaders\n"+
					"VALIDATE_STATUS: " + _gl.getProgramParameter( program, _gl.VALIDATE_STATUS ) + ", gl error [" + _gl.getError() + "]" );
M
Mr.doob 已提交
2060

2061 2062
			//console.log( prefix_fragment + fragment_shader );
			//console.log( prefix_vertex + vertex_shader );
M
Mr.doob 已提交
2063

N
Nicolas Garcia Belmonte 已提交
2064
		}
2065 2066 2067
		
		//console.log( prefix_fragment + fragment_shader );
		//console.log( prefix_vertex + vertex_shader );
M
Mr.doob 已提交
2068

M
Mr.doob 已提交
2069
		program.uniforms = {};
2070
		program.attributes = {};
M
Mr.doob 已提交
2071

M
Mr.doob 已提交
2072
		return program;
M
Mr.doob 已提交
2073

M
Mr.doob 已提交
2074
	};
M
Mr.doob 已提交
2075

A
alteredq 已提交
2076 2077 2078 2079 2080 2081 2082 2083
	function loadUniformsMatrices( uniforms, object ) {
		
		_gl.uniformMatrix4fv( uniforms.modelViewMatrix, false, object._modelViewMatrixArray );
		_gl.uniformMatrix3fv( uniforms.normalMatrix, false, object._normalMatrixArray );

	};
	
	function loadUniformsGeneric( program, uniforms ) {
M
Mr.doob 已提交
2084

2085
		var u, uniform, value, type, location, texture;
M
Mr.doob 已提交
2086

M
Mr.doob 已提交
2087
		for( u in uniforms ) {
M
Mr.doob 已提交
2088

2089 2090
			location = program.uniforms[u];
			if ( !location ) continue;
M
Mr.doob 已提交
2091

2092
			uniform = uniforms[u];
M
Mr.doob 已提交
2093

2094 2095
			type = uniform.type;
			value = uniform.value;
M
Mr.doob 已提交
2096

M
Mr.doob 已提交
2097
			if( type == "i" ) {
M
Mr.doob 已提交
2098

M
Mr.doob 已提交
2099
				_gl.uniform1i( location, value );
M
Mr.doob 已提交
2100

M
Mr.doob 已提交
2101
			} else if( type == "f" ) {
M
Mr.doob 已提交
2102

M
Mr.doob 已提交
2103
				_gl.uniform1f( location, value );
2104

A
alteredq 已提交
2105 2106 2107
			} else if( type == "fv1" ) {

				_gl.uniform1fv( location, value );
M
Mr.doob 已提交
2108

2109 2110 2111 2112
			} else if( type == "fv" ) {

				_gl.uniform3fv( location, value );

2113 2114 2115 2116
			} else if( type == "v2" ) {

				_gl.uniform2f( location, value.x, value.y );

2117 2118 2119
			} else if( type == "v3" ) {

				_gl.uniform3f( location, value.x, value.y, value.z );
2120

2121 2122 2123
			} else if( type == "c" ) {

				_gl.uniform3f( location, value.r, value.g, value.b );
M
Mr.doob 已提交
2124

M
Mr.doob 已提交
2125
			} else if( type == "t" ) {
M
Mr.doob 已提交
2126

M
Mr.doob 已提交
2127
				_gl.uniform1i( location, value );
M
Mr.doob 已提交
2128

2129
				texture = uniform.texture;
M
Mr.doob 已提交
2130

2131
				if ( !texture ) continue;
M
Mr.doob 已提交
2132

2133
				if ( texture.image instanceof Array && texture.image.length == 6 ) {
M
Mr.doob 已提交
2134

2135
					setCubeTexture( texture, value );
M
Mr.doob 已提交
2136

2137
				} else {
M
Mr.doob 已提交
2138

2139
					setTexture( texture, value );
M
Mr.doob 已提交
2140

2141
				}
M
Mr.doob 已提交
2142

2143
			}
M
Mr.doob 已提交
2144

2145
		}
M
Mr.doob 已提交
2146

2147
	};
M
Mr.doob 已提交
2148

A
alteredq 已提交
2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190
	function setBlending( blending ) {

		if ( blending != _oldBlending ) {
		
			switch ( blending ) {

				case THREE.AdditiveBlending:

					_gl.blendEquation( _gl.FUNC_ADD );
					_gl.blendFunc( _gl.ONE, _gl.ONE );

					break;

				case THREE.SubtractiveBlending:

					//_gl.blendEquation( _gl.FUNC_SUBTRACT );
					_gl.blendFunc( _gl.DST_COLOR, _gl.ZERO );

					break;

				case THREE.BillboardBlending:

					_gl.blendEquation( _gl.FUNC_ADD );
					_gl.blendFunc( _gl.SRC_ALPHA, _gl.ONE_MINUS_SRC_ALPHA);

					break;

				default:

					_gl.blendEquation( _gl.FUNC_ADD );
					_gl.blendFunc( _gl.ONE, _gl.ONE_MINUS_SRC_ALPHA );

					break;
			
			}
			
			_oldBlending = blending;
		
		}

	};
	
2191
	function setCubeTexture( texture, slot ) {
M
Mr.doob 已提交
2192

2193
		if ( texture.image.length == 6 ) {
N
Nicolas Garcia Belmonte 已提交
2194

2195 2196
			if ( !texture.image.__webGLTextureCube &&
				 !texture.image.__cubeMapInitialized && texture.image.loadCount == 6 ) {
M
Mr.doob 已提交
2197

2198
				texture.image.__webGLTextureCube = _gl.createTexture();
N
Nicolas Garcia Belmonte 已提交
2199

2200
				_gl.bindTexture( _gl.TEXTURE_CUBE_MAP, texture.image.__webGLTextureCube );
2201

2202 2203
				_gl.texParameteri( _gl.TEXTURE_CUBE_MAP, _gl.TEXTURE_WRAP_S, _gl.CLAMP_TO_EDGE );
				_gl.texParameteri( _gl.TEXTURE_CUBE_MAP, _gl.TEXTURE_WRAP_T, _gl.CLAMP_TO_EDGE );
M
Mr.doob 已提交
2204

2205 2206
				_gl.texParameteri( _gl.TEXTURE_CUBE_MAP, _gl.TEXTURE_MAG_FILTER, _gl.LINEAR );
				_gl.texParameteri( _gl.TEXTURE_CUBE_MAP, _gl.TEXTURE_MIN_FILTER, _gl.LINEAR_MIPMAP_LINEAR );
M
Mr.doob 已提交
2207

2208
				for ( var i = 0; i < 6; ++i ) {
M
Mr.doob 已提交
2209

2210
					_gl.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, _gl.RGBA, _gl.RGBA, _gl.UNSIGNED_BYTE, texture.image[ i ] );
M
Mr.doob 已提交
2211

2212
				}
M
Mr.doob 已提交
2213

2214
				_gl.generateMipmap( _gl.TEXTURE_CUBE_MAP );
2215

2216
				_gl.bindTexture( _gl.TEXTURE_CUBE_MAP, null );
M
Mr.doob 已提交
2217

2218
				texture.image.__cubeMapInitialized = true;
M
Mr.doob 已提交
2219

M
Mr.doob 已提交
2220
			}
2221 2222 2223

			_gl.activeTexture( _gl.TEXTURE0 + slot );
			_gl.bindTexture( _gl.TEXTURE_CUBE_MAP, texture.image.__webGLTextureCube );
M
Mr.doob 已提交
2224

2225
		}
M
Mr.doob 已提交
2226

M
Mr.doob 已提交
2227
	};
M
Mr.doob 已提交
2228

2229
	function setTexture( texture, slot ) {
M
Mr.doob 已提交
2230

2231 2232 2233 2234 2235
		if ( !texture.__webGLTexture && texture.image.loaded ) {

			texture.__webGLTexture = _gl.createTexture();
			_gl.bindTexture( _gl.TEXTURE_2D, texture.__webGLTexture );
			_gl.texImage2D( _gl.TEXTURE_2D, 0, _gl.RGBA, _gl.RGBA, _gl.UNSIGNED_BYTE, texture.image );
M
Mr.doob 已提交
2236

2237 2238
			_gl.texParameteri( _gl.TEXTURE_2D, _gl.TEXTURE_WRAP_S, paramThreeToGL( texture.wrap_s ) );
			_gl.texParameteri( _gl.TEXTURE_2D, _gl.TEXTURE_WRAP_T, paramThreeToGL( texture.wrap_t ) );
M
Mr.doob 已提交
2239 2240 2241

			_gl.texParameteri( _gl.TEXTURE_2D, _gl.TEXTURE_MAG_FILTER, paramThreeToGL( texture.mag_filter ) );
			_gl.texParameteri( _gl.TEXTURE_2D, _gl.TEXTURE_MIN_FILTER, paramThreeToGL( texture.min_filter ) );
2242 2243 2244 2245 2246 2247 2248
			_gl.generateMipmap( _gl.TEXTURE_2D );
			_gl.bindTexture( _gl.TEXTURE_2D, null );

		}

		_gl.activeTexture( _gl.TEXTURE0 + slot );
		_gl.bindTexture( _gl.TEXTURE_2D, texture.__webGLTexture );
M
Mr.doob 已提交
2249

2250
	};
M
Mr.doob 已提交
2251

A
alteredq 已提交
2252
	function setRenderTarget( renderTexture, clear ) {
2253 2254

		if ( renderTexture && !renderTexture.__webGLFramebuffer ) {
M
Mr.doob 已提交
2255

2256 2257 2258 2259 2260
			renderTexture.__webGLFramebuffer = _gl.createFramebuffer();
			renderTexture.__webGLRenderbuffer = _gl.createRenderbuffer();
			renderTexture.__webGLTexture = _gl.createTexture();

			// Setup renderbuffer
M
Mr.doob 已提交
2261

2262 2263 2264 2265
			_gl.bindRenderbuffer( _gl.RENDERBUFFER, renderTexture.__webGLRenderbuffer );
			_gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_COMPONENT16, renderTexture.width, renderTexture.height );

			// Setup texture
M
Mr.doob 已提交
2266

2267 2268 2269 2270 2271
			_gl.bindTexture( _gl.TEXTURE_2D, renderTexture.__webGLTexture );
			_gl.texParameteri( _gl.TEXTURE_2D, _gl.TEXTURE_WRAP_S, paramThreeToGL( renderTexture.wrap_s ) );
			_gl.texParameteri( _gl.TEXTURE_2D, _gl.TEXTURE_WRAP_T, paramThreeToGL( renderTexture.wrap_t ) );
			_gl.texParameteri( _gl.TEXTURE_2D, _gl.TEXTURE_MAG_FILTER, paramThreeToGL( renderTexture.mag_filter ) );
			_gl.texParameteri( _gl.TEXTURE_2D, _gl.TEXTURE_MIN_FILTER, paramThreeToGL( renderTexture.min_filter ) );
2272
			_gl.texImage2D( _gl.TEXTURE_2D, 0, paramThreeToGL( renderTexture.format ), renderTexture.width, renderTexture.height, 0, paramThreeToGL( renderTexture.format ), paramThreeToGL( renderTexture.type ), null );
2273 2274

			// Setup framebuffer
M
Mr.doob 已提交
2275

2276 2277
			_gl.bindFramebuffer( _gl.FRAMEBUFFER, renderTexture.__webGLFramebuffer );
			_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D, renderTexture.__webGLTexture, 0 );
2278
			_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.RENDERBUFFER, renderTexture.__webGLRenderbuffer );
2279 2280

			// Release everything
M
Mr.doob 已提交
2281

2282 2283 2284
			_gl.bindTexture( _gl.TEXTURE_2D, null );
			_gl.bindRenderbuffer( _gl.RENDERBUFFER, null );
			_gl.bindFramebuffer( _gl.FRAMEBUFFER, null);
M
Mr.doob 已提交
2285

2286 2287
		}

2288
		var framebuffer, width, height;
M
Mr.doob 已提交
2289

2290
		if ( renderTexture ) {
M
Mr.doob 已提交
2291

2292 2293 2294
			framebuffer = renderTexture.__webGLFramebuffer;
			width = renderTexture.width;
			height = renderTexture.height;
M
Mr.doob 已提交
2295

2296
		} else {
M
Mr.doob 已提交
2297

2298 2299 2300
			framebuffer = null;
			width = _canvas.width;
			height = _canvas.height;
M
Mr.doob 已提交
2301

2302
		}
M
Mr.doob 已提交
2303

2304
		if( framebuffer != _oldFramebuffer ) {
M
Mr.doob 已提交
2305

2306 2307
			_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );
			_gl.viewport( 0, 0, width, height );
M
Mr.doob 已提交
2308

A
alteredq 已提交
2309
			if ( clear ) {
M
Mr.doob 已提交
2310

A
alteredq 已提交
2311
				_gl.clear( _gl.COLOR_BUFFER_BIT | _gl.DEPTH_BUFFER_BIT );
M
Mr.doob 已提交
2312

A
alteredq 已提交
2313
			}
M
Mr.doob 已提交
2314

2315
			_oldFramebuffer = framebuffer;
M
Mr.doob 已提交
2316

2317
		}
2318

2319
	};
M
Mr.doob 已提交
2320

2321
	function updateRenderTargetMipmap( renderTarget ) {
M
Mr.doob 已提交
2322

2323 2324 2325
		_gl.bindTexture( _gl.TEXTURE_2D, renderTarget.__webGLTexture );
		_gl.generateMipmap( _gl.TEXTURE_2D );
		_gl.bindTexture( _gl.TEXTURE_2D, null );
M
Mr.doob 已提交
2326 2327

	};
2328

M
Mr.doob 已提交
2329
	function cacheUniformLocations( program, identifiers ) {
M
Mr.doob 已提交
2330

M
Mr.doob 已提交
2331
		var i, l, id;
M
Mr.doob 已提交
2332

M
Mr.doob 已提交
2333
		for( i = 0, l = identifiers.length; i < l; i++ ) {
M
Mr.doob 已提交
2334

2335 2336
			id = identifiers[ i ];
			program.uniforms[ id ] = _gl.getUniformLocation( program, id );
M
Mr.doob 已提交
2337

M
Mr.doob 已提交
2338
		}
M
Mr.doob 已提交
2339

M
Mr.doob 已提交
2340
	};
M
Mr.doob 已提交
2341

2342
	function cacheAttributeLocations( program, identifiers ) {
2343

2344
		var i, l, id;
M
Mr.doob 已提交
2345

2346
		for( i = 0, l = identifiers.length; i < l; i++ ) {
M
Mr.doob 已提交
2347

2348 2349
			id = identifiers[ i ];
			program.attributes[ id ] = _gl.getAttribLocation( program, id );
M
Mr.doob 已提交
2350

2351
		}
M
Mr.doob 已提交
2352

M
Mr.doob 已提交
2353
	};
M
Mr.doob 已提交
2354

N
Nicolas Garcia Belmonte 已提交
2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379
	function getShader( type, string ) {

		var shader;

		if ( type == "fragment" ) {

			shader = _gl.createShader( _gl.FRAGMENT_SHADER );

		} else if ( type == "vertex" ) {

			shader = _gl.createShader( _gl.VERTEX_SHADER );

		}

		_gl.shaderSource( shader, string );
		_gl.compileShader( shader );

		if ( !_gl.getShaderParameter( shader, _gl.COMPILE_STATUS ) ) {

			alert( _gl.getShaderInfoLog( shader ) );
			return null;

		}

		return shader;
M
Mr.doob 已提交
2380

2381
	};
N
Nicolas Garcia Belmonte 已提交
2382

2383
	function paramThreeToGL( p ) {
M
Mr.doob 已提交
2384

2385
		switch ( p ) {
M
Mr.doob 已提交
2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398

			case THREE.RepeatWrapping: return _gl.REPEAT; break;
			case THREE.ClampToEdgeWrapping: return _gl.CLAMP_TO_EDGE; break;
			case THREE.MirroredRepeatWrapping: return _gl.MIRRORED_REPEAT; break;

			case THREE.NearestFilter: return _gl.NEAREST; break;
			case THREE.NearestMipMapNearestFilter: return _gl.NEAREST_MIPMAP_NEAREST; break;
			case THREE.NearestMipMapLinearFilter: return _gl.NEAREST_MIPMAP_LINEAR; break;

			case THREE.LinearFilter: return _gl.LINEAR; break;
			case THREE.LinearMipMapNearestFilter: return _gl.LINEAR_MIPMAP_NEAREST; break;
			case THREE.LinearMipMapLinearFilter: return _gl.LINEAR_MIPMAP_LINEAR; break;

2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412
			case THREE.ByteType: return _gl.BYTE; break;
			case THREE.UnsignedByteType: return _gl.UNSIGNED_BYTE; break;
			case THREE.ShortType: return _gl.SHORT; break;
			case THREE.UnsignedShortType: return _gl.UNSIGNED_SHORT; break;
			case THREE.IntType: return _gl.INT; break;
			case THREE.UnsignedShortType: return _gl.UNSIGNED_INT; break;
			case THREE.FloatType: return _gl.FLOAT; break;

			case THREE.AlphaFormat: return _gl.ALPHA; break;
			case THREE.RGBFormat: return _gl.RGB; break;
			case THREE.RGBAFormat: return _gl.RGBA; break;
			case THREE.LuminanceFormat: return _gl.LUMINANCE; break;
			case THREE.LuminanceAlphaFormat: return _gl.LUMINANCE_ALPHA; break;

2413
		}
M
Mr.doob 已提交
2414

2415
		return 0;
M
Mr.doob 已提交
2416

2417 2418 2419 2420 2421 2422
	};

	function materialNeedsSmoothNormals( material ) {

		return material && material.shading != undefined && material.shading == THREE.SmoothShading;

2423
	};
M
Mr.doob 已提交
2424

M
Mr.doob 已提交
2425
	function bufferNeedsSmoothNormals( geometryChunk, object ) {
M
Mr.doob 已提交
2426

2427
		var m, ml, i, l, meshMaterial, needsSmoothNormals = false;
M
Mr.doob 已提交
2428

M
Mr.doob 已提交
2429
		for ( m = 0, ml = object.materials.length; m < ml; m++ ) {
2430

M
Mr.doob 已提交
2431
			meshMaterial = object.materials[ m ];
2432 2433 2434

			if ( meshMaterial instanceof THREE.MeshFaceMaterial ) {

M
Mr.doob 已提交
2435
				for ( i = 0, l = geometryChunk.materials.length; i < l; i++ ) {
2436

M
Mr.doob 已提交
2437
					if ( materialNeedsSmoothNormals( geometryChunk.materials[ i ] ) ) {
2438

2439 2440 2441 2442 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459
						needsSmoothNormals = true;
						break;

					}

				}

			} else {

				if ( materialNeedsSmoothNormals( meshMaterial ) ) {

					needsSmoothNormals = true;
					break;

				}

			}

			if ( needsSmoothNormals ) break;

		}
M
Mr.doob 已提交
2460

2461
		return needsSmoothNormals;
M
Mr.doob 已提交
2462

2463
	};
M
Mr.doob 已提交
2464

2465
	function allocateLights( lights, maxLights ) {
2466

2467 2468
		var l, ll, light, dirLights, pointLights, maxDirLights, maxPointLights;
		dirLights = pointLights = maxDirLights = maxPointLights = 0;
2469

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

2472
			light = lights[ l ];
2473

2474 2475
			if ( light instanceof THREE.DirectionalLight ) dirLights++;
			if ( light instanceof THREE.PointLight ) pointLights++;
2476

2477
		}
2478

2479
		if ( ( pointLights + dirLights ) <= maxLights ) {
2480

2481 2482
			maxDirLights = dirLights;
			maxPointLights = pointLights;
2483

2484
		} else {
2485

2486 2487
			maxDirLights = Math.ceil( maxLights * dirLights / ( pointLights + dirLights ) );
			maxPointLights = maxLights - maxDirLights;
2488 2489 2490

		}

2491
		return { 'directional' : maxDirLights, 'point' : maxPointLights };
2492 2493

	};
M
Mr.doob 已提交
2494

A
alteredq 已提交
2495
	/* DEBUG
2496
	function getGLParams() {
M
Mr.doob 已提交
2497

2498
		var params  = {
M
Mr.doob 已提交
2499

2500 2501
			'MAX_VARYING_VECTORS': _gl.getParameter( _gl.MAX_VARYING_VECTORS ),
			'MAX_VERTEX_ATTRIBS': _gl.getParameter( _gl.MAX_VERTEX_ATTRIBS ),
M
Mr.doob 已提交
2502

2503 2504 2505
			'MAX_TEXTURE_IMAGE_UNITS': _gl.getParameter( _gl.MAX_TEXTURE_IMAGE_UNITS ),
			'MAX_VERTEX_TEXTURE_IMAGE_UNITS': _gl.getParameter( _gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS ),
			'MAX_COMBINED_TEXTURE_IMAGE_UNITS' : _gl.getParameter( _gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS ),
M
Mr.doob 已提交
2506

2507 2508 2509
			'MAX_VERTEX_UNIFORM_VECTORS': _gl.getParameter( _gl.MAX_VERTEX_UNIFORM_VECTORS ),
			'MAX_FRAGMENT_UNIFORM_VECTORS': _gl.getParameter( _gl.MAX_FRAGMENT_UNIFORM_VECTORS )
		}
M
Mr.doob 已提交
2510

2511 2512
		return params;
	};
M
Mr.doob 已提交
2513

2514
	function dumpObject( obj ) {
M
Mr.doob 已提交
2515

2516 2517
		var p, str = "";
		for ( p in obj ) {
M
Mr.doob 已提交
2518

2519
			str += p + ": " + obj[p] + "\n";
M
Mr.doob 已提交
2520

2521
		}
M
Mr.doob 已提交
2522

2523 2524
		return str;
	}
A
alteredq 已提交
2525
	*/
2526

2527
};
2528

2529
THREE.Snippets = {
M
Mr.doob 已提交
2530

2531 2532
	// FOG
	
2533
	fog_pars_fragment: [
M
Mr.doob 已提交
2534

2535
	"#ifdef USE_FOG",
2536

2537
		"uniform vec3 fogColor;",
2538

2539 2540 2541 2542 2543 2544
		"#ifdef FOG_EXP2",
			"uniform float fogDensity;",
		"#else",
			"uniform float fogNear;",
			"uniform float fogFar;",
		"#endif",
2545

2546
	"#endif"
2547

2548
	].join("\n"),
M
Mr.doob 已提交
2549

2550
	fog_fragment: [
2551

2552
	"#ifdef USE_FOG",
2553

2554 2555 2556 2557 2558 2559 2560 2561 2562
		"float depth = gl_FragCoord.z / gl_FragCoord.w;",

		"#ifdef FOG_EXP2",
			"const float LOG2 = 1.442695;",
			"float fogFactor = exp2( - fogDensity * fogDensity * depth * depth * LOG2 );",
			"fogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );",
		"#else",
			"float fogFactor = smoothstep( fogNear, fogFar, depth );",
		"#endif",
2563

2564
		"gl_FragColor = mix( gl_FragColor, vec4( fogColor, gl_FragColor.w ), fogFactor );",
M
Mr.doob 已提交
2565

2566
	"#endif"
M
Mr.doob 已提交
2567

2568
	].join("\n"),
M
Mr.doob 已提交
2569

2570 2571
	// ENVIRONMENT MAP
	
2572
	envmap_pars_fragment: [
M
Mr.doob 已提交
2573

2574
	"#ifdef USE_ENVMAP",
M
Mr.doob 已提交
2575

2576 2577 2578 2579
		"varying vec3 vReflect;",
		"uniform float reflectivity;",
		"uniform samplerCube env_map;",
		"uniform int combine;",
M
Mr.doob 已提交
2580

2581
	"#endif"
M
Mr.doob 已提交
2582

2583
	].join("\n"),
M
Mr.doob 已提交
2584

2585
	envmap_fragment: [
M
Mr.doob 已提交
2586

2587 2588
	"#ifdef USE_ENVMAP",

A
alteredq 已提交
2589
		"vec4 cubeColor = textureCube( env_map, vec3( -vReflect.x, vReflect.yz ) );",
M
Mr.doob 已提交
2590

2591 2592
		"if ( combine == 1 ) {",

2593 2594
			//"gl_FragColor = mix( gl_FragColor, cubeColor, reflectivity );",
			"gl_FragColor = vec4( mix( gl_FragColor.xyz, cubeColor.xyz, reflectivity ), opacity );",
2595 2596 2597 2598 2599

		"} else {",

			"gl_FragColor = gl_FragColor * cubeColor;",

M
Mr.doob 已提交
2600
		"}",
2601 2602

	"#endif"
M
Mr.doob 已提交
2603

2604
	].join("\n"),
M
Mr.doob 已提交
2605

2606
	envmap_pars_vertex: [
M
Mr.doob 已提交
2607

2608
	"#ifdef USE_ENVMAP",
M
Mr.doob 已提交
2609

2610 2611 2612
		"varying vec3 vReflect;",
		"uniform float refraction_ratio;",
		"uniform bool useRefract;",
M
Mr.doob 已提交
2613

2614
	"#endif"
M
Mr.doob 已提交
2615

2616 2617 2618
	].join("\n"),

	envmap_vertex : [
M
Mr.doob 已提交
2619

2620
	"#ifdef USE_ENVMAP",
M
Mr.doob 已提交
2621

2622 2623
		"vec4 mPosition = objectMatrix * vec4( position, 1.0 );",
		"vec3 nWorld = mat3( objectMatrix[0].xyz, objectMatrix[1].xyz, objectMatrix[2].xyz ) * normal;",
M
Mr.doob 已提交
2624

2625 2626 2627 2628 2629 2630 2631 2632 2633 2634 2635
		"if ( useRefract ) {",

			"vReflect = refract( normalize( mPosition.xyz - cameraPosition ), normalize( nWorld.xyz ), refraction_ratio );",

		"} else {",

			"vReflect = reflect( normalize( mPosition.xyz - cameraPosition ), normalize( nWorld.xyz ) );",

		"}",

	"#endif"
M
Mr.doob 已提交
2636

2637
	].join("\n"),
2638
	
2639 2640 2641 2642 2643 2644 2645 2646 2647 2648 2649 2650 2651 2652 2653 2654 2655
	// COLOR MAP (particles)

	map_particle_pars_fragment: [

	"#ifdef USE_MAP",

		"uniform sampler2D map;",

	"#endif"

	].join("\n"),


	map_particle_fragment: [

	"#ifdef USE_MAP",

A
alteredq 已提交
2656
		"gl_FragColor = gl_FragColor * texture2D( map, gl_PointCoord );",
2657 2658 2659 2660 2661 2662

	"#endif"

	].join("\n"),

	// COLOR MAP (triangles)
M
Mr.doob 已提交
2663

2664
	map_pars_fragment: [
M
Mr.doob 已提交
2665

2666
	"#ifdef USE_MAP",
M
Mr.doob 已提交
2667

2668 2669
		"varying vec2 vUv;",
		"uniform sampler2D map;",
M
Mr.doob 已提交
2670

2671
	"#endif"
M
Mr.doob 已提交
2672

2673
	].join("\n"),
M
Mr.doob 已提交
2674

2675
	map_pars_vertex: [
M
Mr.doob 已提交
2676

2677
	"#ifdef USE_MAP",
M
Mr.doob 已提交
2678

2679 2680 2681
		"varying vec2 vUv;",

	"#endif"
M
Mr.doob 已提交
2682

2683
	].join("\n"),
M
Mr.doob 已提交
2684

2685 2686 2687 2688
	map_fragment: [

	"#ifdef USE_MAP",

A
alteredq 已提交
2689
		"gl_FragColor = gl_FragColor * texture2D( map, vUv );",
2690 2691

	"#endif"
M
Mr.doob 已提交
2692

2693
	].join("\n"),
M
Mr.doob 已提交
2694

2695
	map_vertex: [
M
Mr.doob 已提交
2696

2697
	"#ifdef USE_MAP",
M
Mr.doob 已提交
2698

2699
		"vUv = uv;",
M
Mr.doob 已提交
2700

2701
	"#endif"
M
Mr.doob 已提交
2702

2703
	].join("\n"),
M
Mr.doob 已提交
2704

2705 2706 2707 2708 2709 2710 2711 2712 2713 2714 2715 2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731
	// LIGHT MAP
	
	lightmap_pars_fragment: [

	"#ifdef USE_LIGHTMAP",

		"varying vec2 vUv2;",
		"uniform sampler2D light_map;",

	"#endif"

	].join("\n"),
	
	lightmap_pars_vertex: [

	"#ifdef USE_LIGHTMAP",

		"varying vec2 vUv2;",

	"#endif"

	].join("\n"),
	
	lightmap_fragment: [

	"#ifdef USE_LIGHTMAP",

A
alteredq 已提交
2732
		"gl_FragColor = gl_FragColor * texture2D( light_map, vUv2 );",
2733 2734 2735 2736 2737 2738 2739 2740 2741 2742 2743 2744 2745 2746 2747

	"#endif"

	].join("\n"),
	
	lightmap_vertex: [

	"#ifdef USE_LIGHTMAP",

		"vUv2 = uv2;",

	"#endif"

	].join("\n"),

2748
	lights_pars_vertex: [
M
Mr.doob 已提交
2749

2750 2751
	"uniform bool enableLighting;",
	"uniform vec3 ambientLightColor;",
M
Mr.doob 已提交
2752

2753
	"#if MAX_DIR_LIGHTS > 0",
M
Mr.doob 已提交
2754

2755 2756
		"uniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];",
		"uniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];",
M
Mr.doob 已提交
2757

2758 2759 2760
	"#endif",

	"#if MAX_POINT_LIGHTS > 0",
M
Mr.doob 已提交
2761

2762 2763
		"uniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];",
		"uniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];",
M
Mr.doob 已提交
2764

2765 2766 2767
		"#ifdef PHONG",
			"varying vec3 vPointLightVector[ MAX_POINT_LIGHTS ];",
		"#endif",
M
Mr.doob 已提交
2768

2769
	"#endif"
M
Mr.doob 已提交
2770

2771
	].join("\n"),
M
Mr.doob 已提交
2772

2773 2774
	// LIGHTS
	
2775
	lights_vertex: [
M
Mr.doob 已提交
2776

2777 2778
	"if ( !enableLighting ) {",

A
alteredq 已提交
2779
		"vLightWeighting = vec3( 1.0 );",
2780 2781 2782 2783 2784 2785

	"} else {",

		"vLightWeighting = ambientLightColor;",

		"#if MAX_DIR_LIGHTS > 0",
M
Mr.doob 已提交
2786

2787
		"for( int i = 0; i < MAX_DIR_LIGHTS; i++ ) {",
M
Mr.doob 已提交
2788

2789 2790 2791
			"vec4 lDirection = viewMatrix * vec4( directionalLightDirection[ i ], 0.0 );",
			"float directionalLightWeighting = max( dot( transformedNormal, normalize( lDirection.xyz ) ), 0.0 );",
			"vLightWeighting += directionalLightColor[ i ] * directionalLightWeighting;",
M
Mr.doob 已提交
2792

2793
		"}",
M
Mr.doob 已提交
2794

2795 2796 2797
		"#endif",

		"#if MAX_POINT_LIGHTS > 0",
M
Mr.doob 已提交
2798

2799
		"for( int i = 0; i < MAX_POINT_LIGHTS; i++ ) {",
M
Mr.doob 已提交
2800

2801 2802 2803 2804
			"vec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );",
			"vec3 pointLightVector = normalize( lPosition.xyz - mvPosition.xyz );",
			"float pointLightWeighting = max( dot( transformedNormal, pointLightVector ), 0.0 );",
			"vLightWeighting += pointLightColor[ i ] * pointLightWeighting;",
M
Mr.doob 已提交
2805

2806 2807 2808
			"#ifdef PHONG",
				"vPointLightVector[ i ] = pointLightVector;",
			"#endif",
M
Mr.doob 已提交
2809

2810
		"}",
M
Mr.doob 已提交
2811

2812
		"#endif",
M
Mr.doob 已提交
2813

2814
	"}"
M
Mr.doob 已提交
2815

2816
	].join("\n"),
M
Mr.doob 已提交
2817

2818
	lights_pars_fragment: [
M
Mr.doob 已提交
2819

2820 2821 2822
	"#if MAX_DIR_LIGHTS > 0",
		"uniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];",
	"#endif",
M
Mr.doob 已提交
2823

2824 2825 2826
	"#if MAX_POINT_LIGHTS > 0",
		"varying vec3 vPointLightVector[ MAX_POINT_LIGHTS ];",
	"#endif",
M
Mr.doob 已提交
2827

2828 2829
	"varying vec3 vViewPosition;",
	"varying vec3 vNormal;"
M
Mr.doob 已提交
2830

2831
	].join("\n"),
M
Mr.doob 已提交
2832

2833
	lights_fragment: [
M
Mr.doob 已提交
2834

2835 2836
	"vec3 normal = normalize( vNormal );",
	"vec3 viewPosition = normalize( vViewPosition );",
A
alteredq 已提交
2837 2838
	
	"vec4 mColor = vec4( diffuse, opacity );",
2839 2840 2841
	"vec4 mSpecular = vec4( specular, opacity );",

	"#if MAX_POINT_LIGHTS > 0",
M
Mr.doob 已提交
2842

2843 2844 2845 2846 2847 2848 2849 2850 2851 2852 2853 2854 2855 2856 2857 2858 2859 2860 2861 2862 2863
		"vec4 pointDiffuse  = vec4( 0.0 );",
		"vec4 pointSpecular = vec4( 0.0 );",

		"for( int i = 0; i < MAX_POINT_LIGHTS; i++ ) {",

			"vec3 pointVector = normalize( vPointLightVector[ i ] );",
			"vec3 pointHalfVector = normalize( vPointLightVector[ i ] + vViewPosition );",

			"float pointDotNormalHalf = dot( normal, pointHalfVector );",
			"float pointDiffuseWeight = max( dot( normal, pointVector ), 0.0 );",

			"float pointSpecularWeight = 0.0;",
			"if ( pointDotNormalHalf >= 0.0 )",
				"pointSpecularWeight = pow( pointDotNormalHalf, shininess );",

			"pointDiffuse  += mColor * pointDiffuseWeight;",
			"pointSpecular += mSpecular * pointSpecularWeight;",

			"}",

	"#endif",
M
Mr.doob 已提交
2864

2865
	"#if MAX_DIR_LIGHTS > 0",
M
Mr.doob 已提交
2866

2867 2868 2869 2870 2871 2872 2873 2874 2875 2876 2877 2878 2879 2880 2881 2882 2883 2884 2885 2886 2887 2888
		"vec4 dirDiffuse  = vec4( 0.0 );",
		"vec4 dirSpecular = vec4( 0.0 );" ,

		"for( int i = 0; i < MAX_DIR_LIGHTS; i++ ) {",

			"vec4 lDirection = viewMatrix * vec4( directionalLightDirection[ i ], 0.0 );",

			"vec3 dirVector = normalize( lDirection.xyz );",
			"vec3 dirHalfVector = normalize( lDirection.xyz + vViewPosition );",

			"float dirDotNormalHalf = dot( normal, dirHalfVector );",

			"float dirDiffuseWeight = max( dot( normal, dirVector ), 0.0 );",

			"float dirSpecularWeight = 0.0;",
			"if ( dirDotNormalHalf >= 0.0 )",
				"dirSpecularWeight = pow( dirDotNormalHalf, shininess );",

			"dirDiffuse  += mColor * dirDiffuseWeight;",
			"dirSpecular += mSpecular * dirSpecularWeight;",

		"}",
M
Mr.doob 已提交
2889

2890 2891 2892 2893 2894 2895 2896
	"#endif",

	"vec4 totalLight = vec4( ambient, opacity );",

	"#if MAX_DIR_LIGHTS > 0",
		"totalLight += dirDiffuse + dirSpecular;",
	"#endif",
M
Mr.doob 已提交
2897

2898 2899
	"#if MAX_POINT_LIGHTS > 0",
		"totalLight += pointDiffuse + pointSpecular;",
A
alteredq 已提交
2900 2901 2902
	"#endif",
	
	"gl_FragColor = gl_FragColor * totalLight;"
2903

A
alteredq 已提交
2904 2905 2906 2907 2908 2909 2910 2911 2912 2913 2914 2915 2916 2917 2918 2919 2920 2921 2922
	].join("\n"),
	
	// VERTEX COLORS

	color_pars_fragment: [

	"#ifdef USE_COLOR",

		"varying vec3 vColor;",

	"#endif"

	].join("\n"),


	color_fragment: [

	"#ifdef USE_COLOR",

A
alteredq 已提交
2923
		"gl_FragColor = gl_FragColor * vec4( vColor, opacity );",
A
alteredq 已提交
2924 2925 2926 2927 2928 2929 2930 2931 2932 2933 2934 2935 2936 2937 2938 2939 2940 2941 2942 2943 2944 2945 2946 2947

	"#endif"

	].join("\n"),
	
	color_pars_vertex: [

	"#ifdef USE_COLOR",

		"varying vec3 vColor;",

	"#endif"

	].join("\n"),


	color_vertex: [

	"#ifdef USE_COLOR",

		"vColor = color;",

	"#endif"

2948
	].join("\n")
A
alteredq 已提交
2949
	
2950

2951
};
2952

2953
THREE.UniformsLib = {
M
Mr.doob 已提交
2954

2955
	common: {
M
Mr.doob 已提交
2956

A
alteredq 已提交
2957
	"diffuse" : { type: "c", value: new THREE.Color( 0xeeeeee ) },
2958
	"opacity" : { type: "f", value: 1.0 },
2959
	"map"     : { type: "t", value: 0, texture: null },
M
Mr.doob 已提交
2960

2961 2962
	"light_map"       : { type: "t", value: 2, texture: null },

2963 2964
	"env_map" 		  : { type: "t", value: 1, texture: null },
	"useRefract"	  : { type: "i", value: 0 },
2965
	"reflectivity"    : { type: "f", value: 1.0 },
2966 2967
	"refraction_ratio": { type: "f", value: 0.98 },
	"combine"		  : { type: "i", value: 0 },
M
Mr.doob 已提交
2968

2969 2970 2971 2972
	"fogDensity": { type: "f", value: 0.00025 },
	"fogNear"	: { type: "f", value: 1 },
	"fogFar"	: { type: "f", value: 2000 },
	"fogColor"	: { type: "c", value: new THREE.Color( 0xffffff ) }
M
Mr.doob 已提交
2973

2974
	},
M
Mr.doob 已提交
2975

2976
	lights: {
M
Mr.doob 已提交
2977

2978 2979 2980 2981 2982 2983
	"enableLighting" 			: { type: "i", value: 1 },
	"ambientLightColor" 		: { type: "fv", value: [] },
	"directionalLightDirection" : { type: "fv", value: [] },
	"directionalLightColor" 	: { type: "fv", value: [] },
	"pointLightPosition"		: { type: "fv", value: [] },
	"pointLightColor"			: { type: "fv", value: [] }
M
Mr.doob 已提交
2984

2985 2986 2987 2988
	},

	particle: {

A
alteredq 已提交
2989
	"psColor"   : { type: "c", value: new THREE.Color( 0xeeeeee ) },
2990 2991
	"opacity" : { type: "f", value: 1.0 },
	"size" 	  : { type: "f", value: 1.0 },
2992
	"map"     : { type: "t", value: 0, texture: null },
M
Mr.doob 已提交
2993

2994 2995 2996 2997 2998 2999 3000
	"fogDensity": { type: "f", value: 0.00025 },
	"fogNear"	: { type: "f", value: 1 },
	"fogFar"	: { type: "f", value: 2000 },
	"fogColor"	: { type: "c", value: new THREE.Color( 0xffffff ) }
	
	}
	
3001 3002
};

3003
THREE.ShaderLib = {
3004

3005
	'depth': {
M
Mr.doob 已提交
3006

3007
		uniforms: { "mNear": { type: "f", value: 1.0 },
3008
					"mFar" : { type: "f", value: 2000.0 },
A
alteredq 已提交
3009
					"opacity" : { type: "f", value: 1.0 }
3010
				  },
3011

3012
		fragment_shader: [
M
Mr.doob 已提交
3013

3014 3015
			"uniform float mNear;",
			"uniform float mFar;",
3016
			"uniform float opacity;",
M
Mr.doob 已提交
3017

3018
			"void main() {",
M
Mr.doob 已提交
3019

3020 3021
				"float depth = gl_FragCoord.z / gl_FragCoord.w;",
				"float color = 1.0 - smoothstep( mNear, mFar, depth );",
3022
				"gl_FragColor = vec4( vec3( color ), opacity );",
M
Mr.doob 已提交
3023

3024
			"}"
M
Mr.doob 已提交
3025

3026
		].join("\n"),
3027

3028
		vertex_shader: [
3029

3030
			"void main() {",
3031

3032
				"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",
3033

3034
			"}"
3035

3036
		].join("\n")
3037

3038
	},
3039

3040
	'normal': {
M
Mr.doob 已提交
3041

3042
		uniforms: { "opacity" : { type: "f", value: 1.0 } },
3043

3044
		fragment_shader: [
3045

3046
			"uniform float opacity;",
3047
			"varying vec3 vNormal;",
M
Mr.doob 已提交
3048

3049
			"void main() {",
3050

3051
				"gl_FragColor = vec4( 0.5 * normalize( vNormal ) + 0.5, opacity );",
M
Mr.doob 已提交
3052

3053
			"}"
M
Mr.doob 已提交
3054

3055
		].join("\n"),
M
Mr.doob 已提交
3056

3057
		vertex_shader: [
3058

3059
			"varying vec3 vNormal;",
3060

3061 3062 3063 3064 3065 3066 3067 3068 3069 3070 3071 3072
			"void main() {",

				"vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );",
				"vNormal = normalize( normalMatrix * normal );",

				"gl_Position = projectionMatrix * mvPosition;",

			"}"

		].join("\n")

	},
3073

3074
	'basic': {
M
Mr.doob 已提交
3075

3076
		uniforms: THREE.UniformsLib[ "common" ],
M
Mr.doob 已提交
3077

3078
		fragment_shader: [
3079

A
alteredq 已提交
3080
			"uniform vec3 diffuse;",
3081
			"uniform float opacity;",
M
Mr.doob 已提交
3082

3083
			THREE.Snippets[ "color_pars_fragment" ],
3084
			THREE.Snippets[ "map_pars_fragment" ],
3085
			THREE.Snippets[ "lightmap_pars_fragment" ],
3086 3087
			THREE.Snippets[ "envmap_pars_fragment" ],
			THREE.Snippets[ "fog_pars_fragment" ],
M
Mr.doob 已提交
3088

3089
			"void main() {",
3090

A
alteredq 已提交
3091 3092
				"gl_FragColor = vec4( diffuse, opacity );",
		
3093
				THREE.Snippets[ "map_fragment" ],
3094
				THREE.Snippets[ "lightmap_fragment" ],
3095
				THREE.Snippets[ "color_fragment" ],
3096 3097
				THREE.Snippets[ "envmap_fragment" ],
				THREE.Snippets[ "fog_fragment" ],
M
Mr.doob 已提交
3098

3099
			"}"
3100

3101
		].join("\n"),
M
Mr.doob 已提交
3102

3103
		vertex_shader: [
M
Mr.doob 已提交
3104

3105
			THREE.Snippets[ "map_pars_vertex" ],
3106
			THREE.Snippets[ "lightmap_pars_vertex" ],
3107
			THREE.Snippets[ "envmap_pars_vertex" ],
3108
			THREE.Snippets[ "color_pars_vertex" ],
M
Mr.doob 已提交
3109

3110
			"void main() {",
M
Mr.doob 已提交
3111

3112
				"vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );",
M
Mr.doob 已提交
3113

3114
				THREE.Snippets[ "map_vertex" ],
3115
				THREE.Snippets[ "lightmap_vertex" ],
3116
				THREE.Snippets[ "envmap_vertex" ],
3117
				THREE.Snippets[ "color_vertex" ],
M
Mr.doob 已提交
3118

3119
				"gl_Position = projectionMatrix * mvPosition;",
3120

3121
			"}"
3122

3123
		].join("\n")
M
Mr.doob 已提交
3124

3125
	},
3126

3127
	'lambert': {
M
Mr.doob 已提交
3128 3129

		uniforms: Uniforms.merge( [ THREE.UniformsLib[ "common" ],
3130
									THREE.UniformsLib[ "lights" ] ] ),
M
Mr.doob 已提交
3131

3132
		fragment_shader: [
M
Mr.doob 已提交
3133

A
alteredq 已提交
3134
			"uniform vec3 diffuse;",
3135
			"uniform float opacity;",
M
Mr.doob 已提交
3136

3137
			"varying vec3 vLightWeighting;",
M
Mr.doob 已提交
3138

A
alteredq 已提交
3139
			THREE.Snippets[ "color_pars_fragment" ],
3140
			THREE.Snippets[ "map_pars_fragment" ],
3141
			THREE.Snippets[ "lightmap_pars_fragment" ],
3142 3143
			THREE.Snippets[ "envmap_pars_fragment" ],
			THREE.Snippets[ "fog_pars_fragment" ],
M
Mr.doob 已提交
3144

3145
			"void main() {",
M
Mr.doob 已提交
3146

A
alteredq 已提交
3147 3148
				"gl_FragColor = vec4( diffuse, opacity );",
				"gl_FragColor = gl_FragColor * vec4( vLightWeighting, 1.0 );",
3149 3150

				THREE.Snippets[ "map_fragment" ],
3151
				THREE.Snippets[ "lightmap_fragment" ],
A
alteredq 已提交
3152
				THREE.Snippets[ "color_fragment" ],
3153
				THREE.Snippets[ "envmap_fragment" ],
3154 3155 3156 3157 3158 3159 3160
				THREE.Snippets[ "fog_fragment" ],

			"}"

		].join("\n"),

		vertex_shader: [
M
Mr.doob 已提交
3161

3162
			"varying vec3 vLightWeighting;",
M
Mr.doob 已提交
3163

3164
			THREE.Snippets[ "map_pars_vertex" ],
3165
			THREE.Snippets[ "lightmap_pars_vertex" ],
3166 3167
			THREE.Snippets[ "envmap_pars_vertex" ],
			THREE.Snippets[ "lights_pars_vertex" ],
A
alteredq 已提交
3168
			THREE.Snippets[ "color_pars_vertex" ],
M
Mr.doob 已提交
3169

3170
			"void main() {",
M
Mr.doob 已提交
3171

3172
				"vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );",
M
Mr.doob 已提交
3173

3174
				THREE.Snippets[ "map_vertex" ],
3175
				THREE.Snippets[ "lightmap_vertex" ],
3176
				THREE.Snippets[ "envmap_vertex" ],
A
alteredq 已提交
3177
				THREE.Snippets[ "color_vertex" ],
M
Mr.doob 已提交
3178

3179
				"vec3 transformedNormal = normalize( normalMatrix * normal );",
M
Mr.doob 已提交
3180

3181
				THREE.Snippets[ "lights_vertex" ],
M
Mr.doob 已提交
3182

3183 3184 3185 3186 3187
				"gl_Position = projectionMatrix * mvPosition;",

			"}"

		].join("\n")
M
Mr.doob 已提交
3188

3189
	},
M
Mr.doob 已提交
3190

3191
	'phong': {
M
Mr.doob 已提交
3192 3193

		uniforms: Uniforms.merge( [ THREE.UniformsLib[ "common" ],
3194
									THREE.UniformsLib[ "lights" ],
M
Mr.doob 已提交
3195

3196
									{ "ambient"  : { type: "c", value: new THREE.Color( 0x050505 ) },
3197 3198 3199
									  "specular" : { type: "c", value: new THREE.Color( 0x111111 ) },
									  "shininess": { type: "f", value: 30 }
									}
M
Mr.doob 已提交
3200

3201
								] ),
M
Mr.doob 已提交
3202

3203
		fragment_shader: [
M
Mr.doob 已提交
3204

A
alteredq 已提交
3205
			"uniform vec3 diffuse;",
3206
			"uniform float opacity;",
M
Mr.doob 已提交
3207

3208 3209 3210
			"uniform vec3 ambient;",
			"uniform vec3 specular;",
			"uniform float shininess;",
M
Mr.doob 已提交
3211

3212
			"varying vec3 vLightWeighting;",
M
Mr.doob 已提交
3213

A
alteredq 已提交
3214
			THREE.Snippets[ "color_pars_fragment" ],
3215
			THREE.Snippets[ "map_pars_fragment" ],
3216
			THREE.Snippets[ "lightmap_pars_fragment" ],
3217 3218 3219
			THREE.Snippets[ "envmap_pars_fragment" ],
			THREE.Snippets[ "fog_pars_fragment" ],
			THREE.Snippets[ "lights_pars_fragment" ],
M
Mr.doob 已提交
3220

3221
			"void main() {",
M
Mr.doob 已提交
3222

A
alteredq 已提交
3223 3224
				"gl_FragColor = vec4( vLightWeighting, 1.0 );",
				THREE.Snippets[ "lights_fragment" ],
3225 3226

				THREE.Snippets[ "map_fragment" ],
3227
				THREE.Snippets[ "lightmap_fragment" ],
A
alteredq 已提交
3228
				THREE.Snippets[ "color_fragment" ],
3229 3230 3231 3232 3233 3234 3235 3236
				THREE.Snippets[ "envmap_fragment" ],
				THREE.Snippets[ "fog_fragment" ],

			"}"

		].join("\n"),

		vertex_shader: [
M
Mr.doob 已提交
3237

3238
			"#define PHONG",
M
Mr.doob 已提交
3239

3240 3241 3242
			"varying vec3 vLightWeighting;",
			"varying vec3 vViewPosition;",
			"varying vec3 vNormal;",
M
Mr.doob 已提交
3243

3244
			THREE.Snippets[ "map_pars_vertex" ],
3245
			THREE.Snippets[ "lightmap_pars_vertex" ],
3246 3247
			THREE.Snippets[ "envmap_pars_vertex" ],
			THREE.Snippets[ "lights_pars_vertex" ],
A
alteredq 已提交
3248
			THREE.Snippets[ "color_pars_vertex" ],
M
Mr.doob 已提交
3249

3250
			"void main() {",
M
Mr.doob 已提交
3251

3252
				"vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );",
M
Mr.doob 已提交
3253

3254
				THREE.Snippets[ "map_vertex" ],
3255
				THREE.Snippets[ "lightmap_vertex" ],
3256
				THREE.Snippets[ "envmap_vertex" ],
A
alteredq 已提交
3257
				THREE.Snippets[ "color_vertex" ],
M
Mr.doob 已提交
3258

3259 3260 3261
				"#ifndef USE_ENVMAP",
					"vec4 mPosition = objectMatrix * vec4( position, 1.0 );",
				"#endif",
M
Mr.doob 已提交
3262

3263
				"vViewPosition = cameraPosition - mPosition.xyz;",
M
Mr.doob 已提交
3264

3265 3266
				"vec3 transformedNormal = normalize( normalMatrix * normal );",
				"vNormal = transformedNormal;",
3267

3268
				THREE.Snippets[ "lights_vertex" ],
M
Mr.doob 已提交
3269

3270
				"gl_Position = projectionMatrix * mvPosition;",
3271 3272 3273 3274

			"}"

		].join("\n")
M
Mr.doob 已提交
3275

3276 3277 3278 3279 3280 3281 3282 3283
	},
	
	'particle_basic': {

		uniforms: THREE.UniformsLib[ "particle" ],

		fragment_shader: [

A
alteredq 已提交
3284
			"uniform vec3 psColor;",
3285 3286
			"uniform float opacity;",

A
alteredq 已提交
3287
			THREE.Snippets[ "color_pars_fragment" ],
3288 3289 3290 3291 3292
			THREE.Snippets[ "map_particle_pars_fragment" ],
			THREE.Snippets[ "fog_pars_fragment" ],

			"void main() {",

A
alteredq 已提交
3293
				"gl_FragColor = vec4( psColor, opacity );",
3294 3295

				THREE.Snippets[ "map_particle_fragment" ],
A
alteredq 已提交
3296
				THREE.Snippets[ "color_fragment" ],
3297 3298 3299 3300 3301 3302 3303 3304 3305 3306
				THREE.Snippets[ "fog_fragment" ],

			"}"

		].join("\n"),

		vertex_shader: [

			"uniform float size;",
			
A
alteredq 已提交
3307 3308
			THREE.Snippets[ "color_pars_vertex" ],
			
3309 3310
			"void main() {",

A
alteredq 已提交
3311 3312
				THREE.Snippets[ "color_vertex" ],
				
3313 3314 3315 3316 3317 3318 3319 3320 3321 3322
				"vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );",

				"gl_Position = projectionMatrix * mvPosition;",
				"gl_PointSize = size;",
				//"gl_PointSize = 10.0 + 6.0 * mvPosition.z;";

			"}"

		].join("\n")

M
Mr.doob 已提交
3323
	}
3324
	
A
alteredq 已提交
3325

A
alteredq 已提交
3326
};