WebGLRenderer.js 73.5 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

27 28
	// camera matrices caches
	
29 30 31 32 33 34 35 36 37
	_frustum = [ 
		new THREE.Vector4(),
		new THREE.Vector4(),
		new THREE.Vector4(),
		new THREE.Vector4(),
		new THREE.Vector4(),
		new THREE.Vector4()
	 ],

38
	_projScreenMatrix = new THREE.Matrix4(),
39 40 41 42
	_projectionMatrixArray = new Float32Array( 16 ),
	
	_viewMatrixArray = new Float32Array( 16 ),	

43 44
	_vector3 = new THREE.Vector4(),
	
45
	// parameters defaults
M
Mr.doob 已提交
46

47 48 49
	antialias = true,
	clearColor = new THREE.Color( 0x000000 ),
	clearAlpha = 0;
50

51
	if ( parameters ) {
M
Mr.doob 已提交
52

53 54 55
		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 已提交
56

57
	}
M
Mr.doob 已提交
58

N
Nicolas Garcia Belmonte 已提交
59 60 61
	this.domElement = _canvas;
	this.autoClear = true;

62
	initGL( antialias, clearColor, clearAlpha );
M
Mr.doob 已提交
63

64 65
	this.context = _gl;

66
	//alert( dumpObject( getGLParams() ) );
M
Mr.doob 已提交
67

68
	this.lights = {
M
Mr.doob 已提交
69 70 71

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

74
	};
M
Mr.doob 已提交
75

N
Nicolas Garcia Belmonte 已提交
76 77 78 79 80 81 82 83
	this.setSize = function ( width, height ) {

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

	};

A
alteredq 已提交
84
	this.setClearColorHex = function( hex, alpha ) {
85

86 87
		var color = new THREE.Color( hex );
		_gl.clearColor( color.r, color.g, color.b, alpha );
88

89
	};
A
alteredq 已提交
90 91 92 93 94 95

	this.setClearColor = function( color, alpha ) {

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

	};
96

N
Nicolas Garcia Belmonte 已提交
97 98 99 100 101 102
	this.clear = function () {

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

	};

M
Mr.doob 已提交
103

104
	this.setupLights = function ( program, lights ) {
105

106
		var l, ll, light, r = 0, g = 0, b = 0,
107
			color, position, intensity,
M
Mr.doob 已提交
108

109
			zlights = this.lights,
M
Mr.doob 已提交
110

111 112
			dcolors    = zlights.directional.colors,
			dpositions = zlights.directional.positions,
113

114 115
			pcolors    = zlights.point.colors,
			ppositions = zlights.point.positions,
116

117
			dlength = 0,
118 119 120 121
			plength = 0,
		
			doffset = 0,
			poffset = 0;
M
Mr.doob 已提交
122

123
		for ( l = 0, ll = lights.length; l < ll; l++ ) {
124

125
			light = lights[ l ];
126 127 128
			color = light.color;
			position = light.position;
			intensity = light.intensity;
129 130 131

			if ( light instanceof THREE.AmbientLight ) {

132 133 134
				r += color.r;
				g += color.g;
				b += color.b;
M
Mr.doob 已提交
135

136
			} else if ( light instanceof THREE.DirectionalLight ) {
137

138 139 140 141 142
				doffset = dlength * 3;
				
				dcolors[ doffset ]     = color.r * intensity;
				dcolors[ doffset + 1 ] = color.g * intensity;
				dcolors[ doffset + 2 ] = color.b * intensity;
143

144 145 146
				dpositions[ doffset ]     = position.x;
				dpositions[ doffset + 1 ] = position.y;
				dpositions[ doffset + 2 ] = position.z;
147

148
				dlength += 1;
M
Mr.doob 已提交
149

150 151
			} else if( light instanceof THREE.PointLight ) {

152 153 154 155 156
				poffset = plength * 3;
				
				pcolors[ poffset ]     = color.r * intensity;
				pcolors[ poffset + 1 ] = color.g * intensity;
				pcolors[ poffset + 2 ] = color.b * intensity;
157

158 159 160
				ppositions[ poffset ]     = position.x;
				ppositions[ poffset + 1 ] = position.y;
				ppositions[ poffset + 2 ] = position.z;
M
Mr.doob 已提交
161

162
				plength += 1;
M
Mr.doob 已提交
163

164 165 166
			}

		}
167 168 169 170 171 172
		
		// 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 已提交
173

174 175
		zlights.point.length = plength;
		zlights.directional.length = dlength;
M
Mr.doob 已提交
176

177 178 179
		zlights.ambient[ 0 ] = r;
		zlights.ambient[ 1 ] = g;
		zlights.ambient[ 2 ] = b;
M
Mr.doob 已提交
180

181
	};
M
Mr.doob 已提交
182

183
	this.createParticleBuffers = function( geometry ) {
M
Mr.doob 已提交
184

185
		geometry.__webGLVertexBuffer = _gl.createBuffer();
186
		geometry.__webGLColorBuffer = _gl.createBuffer();
M
Mr.doob 已提交
187

188
	};
M
Mr.doob 已提交
189

190
	this.createLineBuffers = function( geometry ) {
M
Mr.doob 已提交
191

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

196
	};
197 198

	this.createMeshBuffers = function( geometryChunk ) {
M
Mr.doob 已提交
199

200 201 202
		geometryChunk.__webGLVertexBuffer = _gl.createBuffer();
		geometryChunk.__webGLNormalBuffer = _gl.createBuffer();
		geometryChunk.__webGLTangentBuffer = _gl.createBuffer();
203
		geometryChunk.__webGLColorBuffer = _gl.createBuffer();
204
		geometryChunk.__webGLUVBuffer = _gl.createBuffer();
205
		geometryChunk.__webGLUV2Buffer = _gl.createBuffer();
206
		
207 208
		geometryChunk.__webGLFaceBuffer = _gl.createBuffer();
		geometryChunk.__webGLLineBuffer = _gl.createBuffer();
M
Mr.doob 已提交
209

210
	};
A
alteredq 已提交
211
	
212
	this.initLineBuffers = function( geometry ) {
M
Mr.doob 已提交
213

214 215 216
		var nvertices = geometry.vertices.length;

		geometry.__vertexArray = new Float32Array( nvertices * 3 );
217
		geometry.__colorArray = new Float32Array( nvertices * 3 );
218
		geometry.__lineArray = new Uint16Array( nvertices );
M
Mr.doob 已提交
219

220
		geometry.__webGLLineCount = nvertices;
M
Mr.doob 已提交
221

222
	};
M
Mr.doob 已提交
223

224 225 226 227 228
	this.initParticleBuffers = function( geometry ) {

		var nvertices = geometry.vertices.length;

		geometry.__vertexArray = new Float32Array( nvertices * 3 );
A
alteredq 已提交
229
		geometry.__colorArray = new Float32Array( nvertices * 3 );
230 231
		
		geometry.__sortArray = [];
232 233 234 235 236

		geometry.__webGLParticleCount = nvertices;

	};

237
	this.initMeshBuffers = function( geometryChunk, object ) {
M
Mr.doob 已提交
238

239
		var f, fl, nvertices = 0, ntris = 0, nlines = 0,
M
Mr.doob 已提交
240
			obj_faces = object.geometry.faces,
241
			chunk_faces = geometryChunk.faces;
M
Mr.doob 已提交
242

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

245 246
			fi = chunk_faces[ f ];
			face = obj_faces[ fi ];
M
Mr.doob 已提交
247

248
			if ( face instanceof THREE.Face3 ) {
M
Mr.doob 已提交
249

250 251 252
				nvertices += 3;
				ntris += 1;
				nlines += 3;
M
Mr.doob 已提交
253

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

256 257
				nvertices += 4;
				ntris += 2;
258
				nlines += 4;
M
Mr.doob 已提交
259

260
			}
M
Mr.doob 已提交
261

262
		}
M
Mr.doob 已提交
263

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

266 267 268
		geometryChunk.__vertexArray  = new Float32Array( nvertices * 3 );
		geometryChunk.__normalArray  = new Float32Array( nvertices * 3 );
		geometryChunk.__tangentArray = new Float32Array( nvertices * 4 );
269
		geometryChunk.__colorArray = new Float32Array( nvertices * 3 );
270
		geometryChunk.__uvArray = new Float32Array( nvertices * 2 );
271
		geometryChunk.__uv2Array = new Float32Array( nvertices * 2 );
M
Mr.doob 已提交
272

273 274
		geometryChunk.__faceArray = new Uint16Array( ntris * 3 );
		geometryChunk.__lineArray = new Uint16Array( nlines * 2 );
M
Mr.doob 已提交
275

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

278 279
		geometryChunk.__webGLFaceCount = ntris * 3;
		geometryChunk.__webGLLineCount = nlines * 2;
M
Mr.doob 已提交
280

281
	};
M
Mr.doob 已提交
282

283
	this.setMeshBuffers = function ( geometryChunk, object, hint ) {
284

285 286 287 288
		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,
289
			vn, uvi, uv2i,
M
Mr.doob 已提交
290

291
		vertexIndex = 0,
292

293 294
		offset = 0,
		offset_uv = 0,
295
		offset_uv2 = 0,
296 297 298 299
		offset_face = 0,
		offset_normal = 0,
		offset_tangent = 0,
		offset_line = 0,
300
		offset_color = 0,
M
Mr.doob 已提交
301

302 303
		vertexArray = geometryChunk.__vertexArray,
		uvArray = geometryChunk.__uvArray,
304
		uv2Array = geometryChunk.__uv2Array,
305 306
		normalArray = geometryChunk.__normalArray,
		tangentArray = geometryChunk.__tangentArray,
307
		colorArray = geometryChunk.__colorArray,
M
Mr.doob 已提交
308

309 310
		faceArray = geometryChunk.__faceArray,
		lineArray = geometryChunk.__lineArray,
M
Mr.doob 已提交
311

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

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

332 333 334
			fi = chunk_faces[ f ];
			face = obj_faces[ fi ];
			uv = obj_uvs[ fi ];
335
			uv2 = obj_uvs2[ fi ];
M
Mr.doob 已提交
336

337
			vertexNormals = face.vertexNormals;
338
			faceNormal = face.normal;
339 340 341

			if ( face instanceof THREE.Face3 ) {

342
				if ( dirtyVertices ) {
M
Mr.doob 已提交
343

344 345 346
					v1 = vertices[ face.a ].position;
					v2 = vertices[ face.b ].position;
					v3 = vertices[ face.c ].position;
M
Mr.doob 已提交
347

348 349 350
					vertexArray[ offset ]     = v1.x;
					vertexArray[ offset + 1 ] = v1.y;
					vertexArray[ offset + 2 ] = v1.z;
M
Mr.doob 已提交
351

352 353 354
					vertexArray[ offset + 3 ] = v2.x;
					vertexArray[ offset + 4 ] = v2.y;
					vertexArray[ offset + 5 ] = v2.z;
355

356 357 358
					vertexArray[ offset + 6 ] = v3.x;
					vertexArray[ offset + 7 ] = v3.y;
					vertexArray[ offset + 8 ] = v3.z;
M
Mr.doob 已提交
359

360
					offset += 9;
M
Mr.doob 已提交
361

362
				}
363

364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385
				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;

				}

386
				if ( dirtyTangents && geometry.hasTangents ) {
387

388 389 390
					t1 = vertices[ face.a ].tangent;
					t2 = vertices[ face.b ].tangent;
					t3 = vertices[ face.c ].tangent;
391

392 393 394 395
					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 已提交
396

397 398 399 400
					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 已提交
401

402 403 404 405
					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 已提交
406

407
					offset_tangent += 12;
M
Mr.doob 已提交
408

409 410
				}

411
				if( dirtyNormals ) {
M
Mr.doob 已提交
412

413 414 415
					if ( vertexNormals.length == 3 && needsSmoothNormals ) {

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

417
							vn = vertexNormals[ i ];
M
Mr.doob 已提交
418

419 420 421
							normalArray[ offset_normal ]     = vn.x;
							normalArray[ offset_normal + 1 ] = vn.y;
							normalArray[ offset_normal + 2 ] = vn.z;
M
Mr.doob 已提交
422

423
							offset_normal += 3;
M
Mr.doob 已提交
424

425
						}
M
Mr.doob 已提交
426

427
					} else {
428

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

431 432 433
							normalArray[ offset_normal ]     = faceNormal.x;
							normalArray[ offset_normal + 1 ] = faceNormal.y;
							normalArray[ offset_normal + 2 ] = faceNormal.z;
M
Mr.doob 已提交
434

435
							offset_normal += 3;
M
Mr.doob 已提交
436

437
						}
M
Mr.doob 已提交
438 439

					}
M
Mr.doob 已提交
440

441 442
				}

443
				if ( dirtyUvs && uv ) {
444

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

447
						uvi = uv[ i ];
M
Mr.doob 已提交
448

449 450
						uvArray[ offset_uv ]     = uvi.u;
						uvArray[ offset_uv + 1 ] = uvi.v;
M
Mr.doob 已提交
451

452
						offset_uv += 2;
M
Mr.doob 已提交
453

M
Mr.doob 已提交
454
					}
455 456 457

				}

458 459 460 461 462 463 464 465 466 467 468 469 470 471 472
				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;

					}

				}

473
				if( dirtyElements ) {
M
Mr.doob 已提交
474

475 476 477
					faceArray[ offset_face ] = vertexIndex;
					faceArray[ offset_face + 1 ] = vertexIndex + 1;
					faceArray[ offset_face + 2 ] = vertexIndex + 2;
M
Mr.doob 已提交
478

479
					offset_face += 3;
M
Mr.doob 已提交
480

481 482
					lineArray[ offset_line ]     = vertexIndex;
					lineArray[ offset_line + 1 ] = vertexIndex + 1;
M
Mr.doob 已提交
483

484 485
					lineArray[ offset_line + 2 ] = vertexIndex;
					lineArray[ offset_line + 3 ] = vertexIndex + 2;
M
Mr.doob 已提交
486

487 488
					lineArray[ offset_line + 4 ] = vertexIndex + 1;
					lineArray[ offset_line + 5 ] = vertexIndex + 2;
M
Mr.doob 已提交
489

490
					offset_line += 6;
491

492
					vertexIndex += 3;
M
Mr.doob 已提交
493

494
				}
M
Mr.doob 已提交
495

496 497 498

			} else if ( face instanceof THREE.Face4 ) {

499
				if ( dirtyVertices ) {
M
Mr.doob 已提交
500

501 502 503 504
					v1 = vertices[ face.a ].position;
					v2 = vertices[ face.b ].position;
					v3 = vertices[ face.c ].position;
					v4 = vertices[ face.d ].position;
M
Mr.doob 已提交
505

506 507 508
					vertexArray[ offset ]     = v1.x;
					vertexArray[ offset + 1 ] = v1.y;
					vertexArray[ offset + 2 ] = v1.z;
M
Mr.doob 已提交
509

510 511 512
					vertexArray[ offset + 3 ] = v2.x;
					vertexArray[ offset + 4 ] = v2.y;
					vertexArray[ offset + 5 ] = v2.z;
513

514 515 516
					vertexArray[ offset + 6 ] = v3.x;
					vertexArray[ offset + 7 ] = v3.y;
					vertexArray[ offset + 8 ] = v3.z;
517

518 519 520
					vertexArray[ offset + 9 ] = v4.x;
					vertexArray[ offset + 10 ] = v4.y;
					vertexArray[ offset + 11 ] = v4.z;
M
Mr.doob 已提交
521

522
					offset += 12;
M
Mr.doob 已提交
523

524
				}
525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543
				
				if ( dirtyColors && obj_colors.length ) {

					c1 = obj_colors[ face.a ];
					c2 = obj_colors[ face.b ];
					c3 = obj_colors[ face.c ];
					c3 = obj_colors[ face.d ];

					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;
544

545 546 547 548 549 550 551 552
					colorArray[ offset_color + 9 ]  = c4.r;
					colorArray[ offset_color + 10 ] = c4.g;
					colorArray[ offset_color + 11 ] = c4.b;
					
					offset_color += 12;

				}	
				
553
				if ( dirtyTangents && geometry.hasTangents ) {
554

555 556 557 558
					t1 = vertices[ face.a ].tangent;
					t2 = vertices[ face.b ].tangent;
					t3 = vertices[ face.c ].tangent;
					t4 = vertices[ face.d ].tangent;
559

560 561 562 563
					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 已提交
564

565 566 567 568
					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 已提交
569

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

575 576 577 578
					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 已提交
579

580
					offset_tangent += 16;
M
Mr.doob 已提交
581

582
				}
M
Mr.doob 已提交
583

584
				if( dirtyNormals ) {
M
Mr.doob 已提交
585

586
					if ( vertexNormals.length == 4 && needsSmoothNormals ) {
587

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

590
							vn = vertexNormals[ i ];
M
Mr.doob 已提交
591

592 593 594
							normalArray[ offset_normal ]     = vn.x;
							normalArray[ offset_normal + 1 ] = vn.y;
							normalArray[ offset_normal + 2 ] = vn.z;
M
Mr.doob 已提交
595

596
							offset_normal += 3;
M
Mr.doob 已提交
597

598
						}
M
Mr.doob 已提交
599

600
					} else {
601

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

604 605 606
							normalArray[ offset_normal ]     = faceNormal.x;
							normalArray[ offset_normal + 1 ] = faceNormal.y;
							normalArray[ offset_normal + 2 ] = faceNormal.z;
M
Mr.doob 已提交
607

608
							offset_normal += 3;
M
Mr.doob 已提交
609

610
						}
M
Mr.doob 已提交
611 612

					}
M
Mr.doob 已提交
613

614 615
				}

616
				if ( dirtyUvs && uv ) {
617

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

620
						uvi = uv[ i ];
M
Mr.doob 已提交
621

622 623
						uvArray[ offset_uv ]     = uvi.u;
						uvArray[ offset_uv + 1 ] = uvi.v;
M
Mr.doob 已提交
624

625
						offset_uv += 2;
M
Mr.doob 已提交
626

M
Mr.doob 已提交
627
					}
628 629

				}
630 631 632 633 634 635 636 637 638 639 640 641 642 643 644
				
				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 已提交
645

646
				if( dirtyElements ) {
M
Mr.doob 已提交
647

648 649 650
					faceArray[ offset_face ]     = vertexIndex;
					faceArray[ offset_face + 1 ] = vertexIndex + 1;
					faceArray[ offset_face + 2 ] = vertexIndex + 2;
M
Mr.doob 已提交
651

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

656
					offset_face += 6;
M
Mr.doob 已提交
657

658 659
					lineArray[ offset_line ]     = vertexIndex;
					lineArray[ offset_line + 1 ] = vertexIndex + 1;
M
Mr.doob 已提交
660

661
					lineArray[ offset_line + 2 ] = vertexIndex;
662
					lineArray[ offset_line + 3 ] = vertexIndex + 3;
M
Mr.doob 已提交
663

664 665
					lineArray[ offset_line + 4 ] = vertexIndex + 1;
					lineArray[ offset_line + 5 ] = vertexIndex + 2;
M
Mr.doob 已提交
666

667 668
					lineArray[ offset_line + 6 ] = vertexIndex + 2;
					lineArray[ offset_line + 7 ] = vertexIndex + 3;
M
Mr.doob 已提交
669

670
					offset_line += 8;
M
Mr.doob 已提交
671

672
					vertexIndex += 4;
M
Mr.doob 已提交
673

674
				}
M
Mr.doob 已提交
675

676
			}
M
Mr.doob 已提交
677

678 679
		}

680
		if ( dirtyVertices ) {
M
Mr.doob 已提交
681

682 683
			_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryChunk.__webGLVertexBuffer );
			_gl.bufferData( _gl.ARRAY_BUFFER, vertexArray, hint );
M
Mr.doob 已提交
684

685
		}
M
Mr.doob 已提交
686

687 688 689 690 691 692 693
		if ( dirtyColors && obj_colors.length ) {

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

		}
		
694
		if ( dirtyNormals ) {
M
Mr.doob 已提交
695

696 697
			_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryChunk.__webGLNormalBuffer );
			_gl.bufferData( _gl.ARRAY_BUFFER, normalArray, hint );
M
Mr.doob 已提交
698

699 700
		}

701
		if ( dirtyTangents && geometry.hasTangents ) {
702

703
			_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryChunk.__webGLTangentBuffer );
704
			_gl.bufferData( _gl.ARRAY_BUFFER, tangentArray, hint );
M
Mr.doob 已提交
705

706
		}
707

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

710
			_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryChunk.__webGLUVBuffer );
711
			_gl.bufferData( _gl.ARRAY_BUFFER, uvArray, hint );
M
Mr.doob 已提交
712

713
		}
M
Mr.doob 已提交
714

715 716 717 718 719 720 721
		if ( dirtyUvs && offset_uv2 > 0 ) {

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

		}

722
		if( dirtyElements ) {
M
Mr.doob 已提交
723

724 725
			_gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, geometryChunk.__webGLFaceBuffer );
			_gl.bufferData( _gl.ELEMENT_ARRAY_BUFFER, faceArray, hint );
726

727 728
			_gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, geometryChunk.__webGLLineBuffer );
			_gl.bufferData( _gl.ELEMENT_ARRAY_BUFFER, lineArray, hint );
M
Mr.doob 已提交
729

730
		}
731 732

	};
733

734
	this.setLineBuffers = function( geometry, hint ) {
M
Mr.doob 已提交
735

736
		var v, c, vertex, offset,
737
			vertices = geometry.vertices,
738
			colors = geometry.colors,
739
			vl = vertices.length,
740
			cl = colors.length,
M
Mr.doob 已提交
741 742

			vertexArray = geometry.__vertexArray,
743
			colorArray = geometry.__colorArray,
744 745 746
			lineArray = geometry.__lineArray,
		
			dirtyVertices = geometry.__dirtyVertices, 
747
			dirtyColors = geometry.__dirtyColors,
748
			dirtyElements = geometry.__dirtyElements;
M
Mr.doob 已提交
749

750
		if ( dirtyVertices ) {
M
Mr.doob 已提交
751

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

754
				vertex = vertices[ v ].position;
M
Mr.doob 已提交
755

756
				offset = v * 3;
M
Mr.doob 已提交
757

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

762 763
			}

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

767
		}
M
Mr.doob 已提交
768

769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787
		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 );

		}

788 789
		// yeah, this is silly as order of element indices is currently fixed
		// though this could change if some use case arises
M
Mr.doob 已提交
790

791
		if ( dirtyElements ) {
M
Mr.doob 已提交
792

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

795
				lineArray[ v ] = v;
M
Mr.doob 已提交
796

797
			}
M
Mr.doob 已提交
798

A
alteredq 已提交
799 800
			_gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, geometry.__webGLLineBuffer );
			_gl.bufferData( _gl.ELEMENT_ARRAY_BUFFER, lineArray, hint );
M
Mr.doob 已提交
801

A
alteredq 已提交
802
		}
M
Mr.doob 已提交
803

804
	};
M
Mr.doob 已提交
805

806
	this.setParticleBuffers = function( geometry, hint, object, camera ) {
807

A
alteredq 已提交
808
		var v, c, vertex, offset,
809 810 811
			vertices = geometry.vertices,
			vl = vertices.length,

A
alteredq 已提交
812 813 814
			colors = geometry.colors,
			cl = colors.length,
		
815
			vertexArray = geometry.__vertexArray,
A
alteredq 已提交
816
			colorArray = geometry.__colorArray,
817
		
818 819 820 821 822
			sortArray = geometry.__sortArray,
		
			dirtyVertices = geometry.__dirtyVertices,
			dirtyElements = geometry.__dirtyElements,
			dirtyColors = geometry.__dirtyColors;
823

824 825 826 827
		if ( object.sortParticles ) {
		
			_projScreenMatrix.multiplySelf( object.matrix );
			
828 829 830
			for ( v = 0; v < vl; v++ ) {

				vertex = vertices[ v ].position;
831 832 833 834 835 836 837 838 839 840 841 842 843 844
				
				_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;
				
845
				offset = v * 3;
846
				
847 848 849
				vertexArray[ offset ]     = vertex.x;
				vertexArray[ offset + 1 ] = vertex.y;
				vertexArray[ offset + 2 ] = vertex.z;
850
				
851 852
			}
			
A
alteredq 已提交
853 854 855 856 857 858 859 860 861 862
			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;
				
863
			}
A
alteredq 已提交
864 865
			
			
866 867 868 869 870 871 872 873 874 875 876 877 878 879 880
		} 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;

				}
881 882

			}
A
alteredq 已提交
883 884 885 886 887 888 889 890 891 892 893 894 895
			
			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;

896
				}
A
alteredq 已提交
897 898
				
			}
899 900

		}
901
		
A
alteredq 已提交
902 903 904 905 906 907 908 909
		if ( dirtyVertices || object.sortParticles ) {
		
			_gl.bindBuffer( _gl.ARRAY_BUFFER, geometry.__webGLVertexBuffer );
			_gl.bufferData( _gl.ARRAY_BUFFER, vertexArray, hint );
			
		}
		
		if ( dirtyColors || object.sortParticles ) {
910
			
A
alteredq 已提交
911 912
			_gl.bindBuffer( _gl.ARRAY_BUFFER, geometry.__webGLColorBuffer );
			_gl.bufferData( _gl.ARRAY_BUFFER, colorArray, hint );
913
		
A
alteredq 已提交
914
		}
915
		
916
	};
M
Mr.doob 已提交
917

M
Mr.doob 已提交
918
	function setMaterialShaders( material, shaders ) {
919

M
Mr.doob 已提交
920 921
		material.fragment_shader = shaders.fragment_shader;
		material.vertex_shader = shaders.vertex_shader;
922
		material.uniforms = Uniforms.clone( shaders.uniforms );
923

M
Mr.doob 已提交
924
	};
925

926
	function refreshUniformsCommon( material, fog ) {
M
Mr.doob 已提交
927

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

931 932
		// pure color
		//material.uniforms.color.value.setHex( material.color.hex );
M
Mr.doob 已提交
933

934 935
		material.uniforms.opacity.value = material.opacity;
		material.uniforms.map.texture = material.map;
936 937
		
		material.uniforms.light_map.texture = material.light_map;
938

939 940 941 942 943
		material.uniforms.env_map.texture = material.env_map;
		material.uniforms.reflectivity.value = material.reflectivity;
		material.uniforms.refraction_ratio.value = material.refraction_ratio;
		material.uniforms.combine.value = material.combine;
		material.uniforms.useRefract.value = material.env_map && material.env_map.mapping instanceof THREE.CubeRefractionMapping;
944

945 946 947
		if ( fog ) {

			material.uniforms.fogColor.value.setHex( fog.color.hex );
948

949
			if ( fog instanceof THREE.Fog ) {
950

951 952
				material.uniforms.fogNear.value = fog.near;
				material.uniforms.fogFar.value = fog.far;
953

954
			} else if ( fog instanceof THREE.FogExp2 ) {
955

956
				material.uniforms.fogDensity.value = fog.density;
957

958 959 960
			}

		}
961

962
	};
963 964

	function refreshUniformsLine( material, fog ) {
M
Mr.doob 已提交
965

A
alteredq 已提交
966
		material.uniforms.diffuse.value.setRGB( material.color.r * material.opacity, material.color.g * material.opacity, material.color.b * material.opacity );
967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986
		material.uniforms.opacity.value = material.opacity;

		if ( fog ) {

			material.uniforms.fogColor.value.setHex( fog.color.hex );

			if ( fog instanceof THREE.Fog ) {

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

			} else if ( fog instanceof THREE.FogExp2 ) {

				material.uniforms.fogDensity.value = fog.density;

			}

		}

	};
M
Mr.doob 已提交
987

988 989
	function refreshUniformsParticle( material, fog ) {

A
alteredq 已提交
990
		material.uniforms.psColor.value.setRGB( material.color.r * material.opacity, material.color.g * material.opacity, material.color.b * material.opacity );
991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013
		material.uniforms.opacity.value = material.opacity;
		material.uniforms.size.value = material.size;
		material.uniforms.map.texture = material.map;

		if ( fog ) {

			material.uniforms.fogColor.value.setHex( fog.color.hex );

			if ( fog instanceof THREE.Fog ) {

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

			} else if ( fog instanceof THREE.FogExp2 ) {

				material.uniforms.fogDensity.value = fog.density;

			}

		}

	};

1014
	function refreshUniformsPhong( material ) {
M
Mr.doob 已提交
1015

1016 1017 1018 1019 1020
		//material.uniforms.ambient.value.setHex( material.ambient.hex );
		//material.uniforms.specular.value.setHex( material.specular.hex );
		material.uniforms.ambient.value.setRGB( material.ambient.r, material.ambient.g, material.ambient.b );
		material.uniforms.specular.value.setRGB( material.specular.r, material.specular.g, material.specular.b );
		material.uniforms.shininess.value = material.shininess;
M
Mr.doob 已提交
1021

1022
	};
M
Mr.doob 已提交
1023 1024


1025
	function refreshLights( material, lights ) {
M
Mr.doob 已提交
1026

1027
		material.uniforms.enableLighting.value = lights.directional.length + lights.point.length;
1028 1029 1030 1031 1032
		material.uniforms.ambientLightColor.value = lights.ambient;
		material.uniforms.directionalLightColor.value = lights.directional.colors;
		material.uniforms.directionalLightDirection.value = lights.directional.positions;
		material.uniforms.pointLightColor.value = lights.point.colors;
		material.uniforms.pointLightPosition.value = lights.point.positions;
M
Mr.doob 已提交
1033

A
alteredq 已提交
1034
	};
M
Mr.doob 已提交
1035

1036 1037
	this.initMaterial = function( material, lights, fog ) {
		
1038
		if ( !material.program ) {
M
Mr.doob 已提交
1039

1040 1041
			var u, identifiers, parameters, maxLightCount;
			
1042
			if ( material instanceof THREE.MeshDepthMaterial ) {
1043

1044
				setMaterialShaders( material, THREE.ShaderLib[ 'depth' ] );
1045

1046
			} else if ( material instanceof THREE.MeshNormalMaterial ) {
1047

1048
				setMaterialShaders( material, THREE.ShaderLib[ 'normal' ] );
1049

1050
			} else if ( material instanceof THREE.MeshBasicMaterial ) {
1051

1052
				setMaterialShaders( material, THREE.ShaderLib[ 'basic' ] );
1053

1054
			} else if ( material instanceof THREE.MeshLambertMaterial ) {
M
Mr.doob 已提交
1055

1056
				setMaterialShaders( material, THREE.ShaderLib[ 'lambert' ] );
M
Mr.doob 已提交
1057

1058
			} else if ( material instanceof THREE.MeshPhongMaterial ) {
M
Mr.doob 已提交
1059

1060
				setMaterialShaders( material, THREE.ShaderLib[ 'phong' ] );
M
Mr.doob 已提交
1061

1062
			} else if ( material instanceof THREE.LineBasicMaterial ) {
M
Mr.doob 已提交
1063

1064 1065
				setMaterialShaders( material, THREE.ShaderLib[ 'basic' ] );

1066 1067 1068 1069
			} else if ( material instanceof THREE.ParticleBasicMaterial ) {
				
				setMaterialShaders( material, THREE.ShaderLib[ 'particle_basic' ] );
				
1070
			}
1071

1072 1073
			// heuristics to create shader parameters according to lights in the scene
			// (not to blow over maxLights budget)
M
Mr.doob 已提交
1074

1075
			maxLightCount = allocateLights( lights, 4 );
M
Mr.doob 已提交
1076

A
alteredq 已提交
1077 1078
			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 };
1079
			material.program = buildProgram( material.fragment_shader, material.vertex_shader, parameters );
M
Mr.doob 已提交
1080

1081 1082
			identifiers = [ 'viewMatrix', 'modelViewMatrix', 'projectionMatrix', 'normalMatrix', 'objectMatrix', 'cameraPosition' ];
			for( u in material.uniforms ) {
1083

1084
				identifiers.push(u);
M
Mr.doob 已提交
1085

M
Mr.doob 已提交
1086
			}
M
Mr.doob 已提交
1087

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

M
Mr.doob 已提交
1091
		}
1092 1093 1094
		
	};
	
A
alteredq 已提交
1095 1096
	this.setProgram = function( camera, lights, fog, material, object ) {
		
1097
		this.initMaterial( material, lights, fog );
M
Mr.doob 已提交
1098

A
alteredq 已提交
1099
		var program = material.program;
1100

M
Mr.doob 已提交
1101
		if( program != _oldProgram ) {
M
Mr.doob 已提交
1102

M
Mr.doob 已提交
1103 1104
			_gl.useProgram( program );
			_oldProgram = program;
M
Mr.doob 已提交
1105

M
Mr.doob 已提交
1106
		}
M
Mr.doob 已提交
1107

1108
		this.loadCamera( program, camera );
1109
		this.loadMatrices( program, object );
M
Mr.doob 已提交
1110

M
Mr.doob 已提交
1111
		if ( material instanceof THREE.MeshPhongMaterial ||
1112
			 material instanceof THREE.MeshLambertMaterial ) {
1113

1114 1115
			this.setupLights( program, lights );
			refreshLights( material, this.lights );
M
Mr.doob 已提交
1116 1117 1118

		}

1119 1120 1121
		if ( material instanceof THREE.MeshBasicMaterial ||
			 material instanceof THREE.MeshLambertMaterial ||
			 material instanceof THREE.MeshPhongMaterial ) {
M
Mr.doob 已提交
1122

1123
			refreshUniformsCommon( material, fog );
M
Mr.doob 已提交
1124

A
alteredq 已提交
1125
		}
M
Mr.doob 已提交
1126

1127
		if ( material instanceof THREE.LineBasicMaterial ) {
M
Mr.doob 已提交
1128

1129
			refreshUniformsLine( material, fog );
1130 1131 1132 1133 1134 1135 1136
			
		}

		if ( material instanceof THREE.ParticleBasicMaterial ) {

			refreshUniformsParticle( material, fog );
			
1137
		}
M
Mr.doob 已提交
1138

M
Mr.doob 已提交
1139
		if ( material instanceof THREE.MeshPhongMaterial ) {
M
Mr.doob 已提交
1140

1141
			refreshUniformsPhong( material );
M
Mr.doob 已提交
1142

1143
		}
M
Mr.doob 已提交
1144

1145 1146 1147 1148
		if ( material instanceof THREE.MeshDepthMaterial ) {

			material.uniforms.mNear.value = camera.near;
			material.uniforms.mFar.value = camera.far;
1149
			material.uniforms.opacity.value = material.opacity;
1150
			
1151
		}
1152 1153 1154 1155 1156 1157 1158

		if ( material instanceof THREE.MeshNormalMaterial ) {

			material.uniforms.opacity.value = material.opacity;
			
		}
		
1159
		setUniforms( program, material.uniforms );
1160

A
alteredq 已提交
1161 1162 1163 1164 1165 1166 1167 1168 1169 1170
		return program;
		
	};
	
	this.renderBuffer = function ( camera, lights, fog, material, geometryChunk, object ) {

		var program, attributes, linewidth, primitives;

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

1173
		// vertices
M
Mr.doob 已提交
1174

M
Mr.doob 已提交
1175
		_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryChunk.__webGLVertexBuffer );
1176
		_gl.vertexAttribPointer( attributes.position, 3, _gl.FLOAT, false, 0, 0 );
1177
		_gl.enableVertexAttribArray( attributes.position );
1178

A
alteredq 已提交
1179 1180 1181 1182 1183 1184 1185 1186 1187 1188
		// 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 );

		}

1189
		// normals
M
Mr.doob 已提交
1190

1191
		if ( attributes.normal >= 0 ) {
1192

1193 1194
			_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryChunk.__webGLNormalBuffer );
			_gl.vertexAttribPointer( attributes.normal, 3, _gl.FLOAT, false, 0, 0 );
1195
			_gl.enableVertexAttribArray( attributes.normal );
1196

1197
		}
1198

1199 1200 1201
		// tangents

		if ( attributes.tangent >= 0 ) {
1202

1203 1204
			_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryChunk.__webGLTangentBuffer );
			_gl.vertexAttribPointer( attributes.tangent, 4, _gl.FLOAT, false, 0, 0 );
1205
			_gl.enableVertexAttribArray( attributes.tangent );
1206

1207
		}
1208

1209
		// uvs
M
Mr.doob 已提交
1210

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

1213
			if ( geometryChunk.__webGLUVBuffer ) {
1214

1215
				_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryChunk.__webGLUVBuffer );
1216
				_gl.vertexAttribPointer( attributes.uv, 2, _gl.FLOAT, false, 0, 0 );
1217

1218
				_gl.enableVertexAttribArray( attributes.uv );
1219

1220
			} else {
1221

1222
				_gl.disableVertexAttribArray( attributes.uv );
M
Mr.doob 已提交
1223

1224
			}
1225 1226 1227

		}

1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244
		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 );

			}

		}

1245
		// render lines
M
Mr.doob 已提交
1246

1247
		if ( material.wireframe || material instanceof THREE.LineBasicMaterial ) {
1248

M
Mr.doob 已提交
1249
			linewidth = material.wireframe_linewidth !== undefined ? material.wireframe_linewidth :
1250
						material.linewidth !== undefined ? material.linewidth : 1;
M
Mr.doob 已提交
1251

1252
			primitives = material instanceof THREE.LineBasicMaterial && object.type == THREE.LineStrip ? _gl.LINE_STRIP : _gl.LINES;
M
Mr.doob 已提交
1253

1254 1255
			_gl.lineWidth( linewidth );
			_gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, geometryChunk.__webGLLineBuffer );
1256
			_gl.drawElements( primitives, geometryChunk.__webGLLineCount, _gl.UNSIGNED_SHORT, 0 );
1257

1258
		// render particles
M
Mr.doob 已提交
1259

1260
		} else if ( material instanceof THREE.ParticleBasicMaterial ) {
1261 1262
			
			_gl.drawArrays( _gl.POINTS, 0, geometryChunk.__webGLParticleCount );			
1263

1264 1265 1266 1267
		// render triangles
			
		} else {
			
1268 1269
			_gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, geometryChunk.__webGLFaceBuffer );
			_gl.drawElements( _gl.TRIANGLES, geometryChunk.__webGLFaceCount, _gl.UNSIGNED_SHORT, 0 );
1270
			
1271 1272 1273 1274
		}

	};

A
alteredq 已提交
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 1300 1301 1302 1303
	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;
		
	};
	
A
alteredq 已提交
1304
	this.renderPass = function ( camera, lights, fog, object, geometryChunk, blending, transparent ) {
M
Mr.doob 已提交
1305

M
Mr.doob 已提交
1306
		var i, l, m, ml, material, meshMaterial;
M
Mr.doob 已提交
1307

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

M
Mr.doob 已提交
1310
			meshMaterial = object.materials[ m ];
1311

M
Mr.doob 已提交
1312
			if ( meshMaterial instanceof THREE.MeshFaceMaterial ) {
1313

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

					material = geometryChunk.materials[ i ];
1317

1318
					if ( material && material.blending == blending && ( material.opacity < 1.0 == transparent ) ) {
M
Mr.doob 已提交
1319

M
Mr.doob 已提交
1320
						this.setBlending( material.blending );
1321 1322
						this.setDepthTest( material.depth_test );
						
1323
						this.renderBuffer( camera, lights, fog, material, geometryChunk, object );
M
Mr.doob 已提交
1324

1325 1326
					}

M
Mr.doob 已提交
1327
				}
1328

M
Mr.doob 已提交
1329
			} else {
1330

M
Mr.doob 已提交
1331
				material = meshMaterial;
1332
				if ( material && material.blending == blending && ( material.opacity < 1.0 == transparent ) ) {
M
Mr.doob 已提交
1333

M
Mr.doob 已提交
1334
					this.setBlending( material.blending );
1335 1336
					this.setDepthTest( material.depth_test );
					
1337
					this.renderBuffer( camera, lights, fog, material, geometryChunk, object );
M
Mr.doob 已提交
1338

1339 1340 1341
				}

			}
1342 1343

		}
M
Mr.doob 已提交
1344

1345
	};
M
Mr.doob 已提交
1346

A
alteredq 已提交
1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357
	this.renderPassImmediate = function ( camera, lights, fog, object, blending, transparent ) {

		var i, l, m, ml, material, program;

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

			material = object.materials[ m ];

			if ( material && material.blending == blending && ( material.opacity < 1.0 == transparent ) ) {

				this.setBlending( material.blending );
1358 1359
				this.setDepthTest( material.depth_test );
				
A
alteredq 已提交
1360 1361 1362 1363 1364 1365 1366 1367 1368 1369
				program = this.setProgram( camera, lights, fog, material, object );
				
				object.render( function( object ) { renderBufferImmediate( object, program ); } );

			}

		}

	};
	
1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394
	function setObjectFaces( object ) {
		
		if( object.doubleSided ) {

			_gl.disable( _gl.CULL_FACE );

		} else {

			_gl.enable( _gl.CULL_FACE );

			if( object.flipSided ) {

				_gl.frontFace( _gl.CW );

			}
			else {

				_gl.frontFace( _gl.CCW );

			}

		}
		
	};
	
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
	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;

	};
	
A
alteredq 已提交
1431
	this.render = function( scene, camera, renderTarget, clear ) {
M
Mr.doob 已提交
1432

1433
		var o, ol, oil, webGLObject, object, buffer,
A
alteredq 已提交
1434
			lights = scene.lights,
1435 1436 1437 1438 1439 1440 1441
			fog = scene.fog,
			ol;

		camera.autoUpdateMatrix && camera.updateMatrix();
		
		_viewMatrixArray.set( camera.matrix.flatten() );
		_projectionMatrixArray.set( camera.projectionMatrix.flatten() );
M
Mr.doob 已提交
1442

1443 1444 1445
		_projScreenMatrix.multiply( camera.projectionMatrix, camera.matrix );
		computeFrustum( _projScreenMatrix );
		
1446
		this.initWebGLObjects( scene, camera );
M
Mr.doob 已提交
1447

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

1450
		if ( this.autoClear ) {
M
Mr.doob 已提交
1451

1452
			this.clear();
M
Mr.doob 已提交
1453

1454 1455
		}

1456
		// set matrices
1457 1458
		
		ol = scene.__webGLObjects.length;
A
alteredq 已提交
1459
	
1460
		for ( o = 0; o < ol; o++ ) {
M
Mr.doob 已提交
1461

M
Mr.doob 已提交
1462
			webGLObject = scene.__webGLObjects[ o ];
M
Mr.doob 已提交
1463
			object = webGLObject.object;
M
Mr.doob 已提交
1464

1465
			if ( object.visible && ( ! ( object instanceof THREE.Mesh ) || isInFrustum( object ) ) ) {
1466
				
A
alteredq 已提交
1467 1468 1469 1470 1471 1472 1473
				if( object.autoUpdateMatrix ) { 
					
					object.updateMatrix();
					object._objectMatrixArray.set( object.matrix.flatten() );
				
				}
				
1474
				this.setupMatrices( object, camera );
1475 1476
				
				webGLObject.render = true;
1477
			
1478 1479 1480 1481
			} else {
				
				webGLObject.render = false;
				
1482 1483 1484 1485 1486 1487 1488
			}
		
		}
		
		oil = scene.__webGLObjectsImmediate.length;
		
		for ( o = 0; o < oil; o++ ) {
1489 1490
		
			object = scene.__webGLObjectsImmediate[ o ].object;
1491 1492 1493
			
			if ( object.visible ) {
			
A
alteredq 已提交
1494 1495 1496 1497 1498 1499 1500
				if( object.autoUpdateMatrix ) { 
				
					object.updateMatrix();
					object._objectMatrixArray.set( object.matrix.flatten() );
				
				}
				
1501
				this.setupMatrices( object, camera );
1502 1503
			
			}
A
alteredq 已提交
1504
		
1505
		}
A
alteredq 已提交
1506

1507 1508 1509
		// opaque pass

		for ( o = 0; o < ol; o++ ) {
M
Mr.doob 已提交
1510

1511 1512
			webGLObject = scene.__webGLObjects[ o ];

1513 1514 1515 1516
			if ( webGLObject.render ) {
				
				object = webGLObject.object;
				buffer = webGLObject.buffer;
1517 1518
				
				setObjectFaces( object );
1519 1520 1521 1522 1523 1524
				this.renderPass( camera, lights, fog, object, buffer, THREE.NormalBlending, false );

			}

		}

A
alteredq 已提交
1525 1526
		// opaque pass (immediate simulator)
		
1527
		for ( o = 0; o < oil; o++ ) {
A
alteredq 已提交
1528
			
1529
			object = scene.__webGLObjectsImmediate[ o ].object;
A
alteredq 已提交
1530 1531 1532
			
			if ( object.visible ) {
			
1533
				setObjectFaces( object );
A
alteredq 已提交
1534 1535 1536 1537 1538 1539
				this.renderPassImmediate( camera, lights, fog, object, THREE.NormalBlending, false );
			
			}
			
		}

1540 1541
		// transparent pass

1542
		for ( o = 0; o < ol; o++ ) {
1543 1544 1545

			webGLObject = scene.__webGLObjects[ o ];

1546 1547 1548 1549
			if ( webGLObject.render ) {
				
				object = webGLObject.object;
				buffer = webGLObject.buffer;
1550

1551 1552
				setObjectFaces( object );
				
1553
				// opaque blended materials
M
Mr.doob 已提交
1554

A
alteredq 已提交
1555 1556
				this.renderPass( camera, lights, fog, object, buffer, THREE.AdditiveBlending, false );
				this.renderPass( camera, lights, fog, object, buffer, THREE.SubtractiveBlending, false );
M
Mr.doob 已提交
1557

1558
				// transparent blended materials
M
Mr.doob 已提交
1559

A
alteredq 已提交
1560 1561
				this.renderPass( camera, lights, fog, object, buffer, THREE.AdditiveBlending, true );
				this.renderPass( camera, lights, fog, object, buffer, THREE.SubtractiveBlending, true );
1562

1563
				// transparent normal materials
M
Mr.doob 已提交
1564

A
alteredq 已提交
1565
				this.renderPass( camera, lights, fog, object, buffer, THREE.NormalBlending, true );
M
Mr.doob 已提交
1566

1567 1568 1569 1570
				// billboard materials

				this.renderPass( camera, lights, fog, object, buffer, THREE.BillboardBlending, false );

1571
			}
M
Mr.doob 已提交
1572

M
Mr.doob 已提交
1573
		}
M
Mr.doob 已提交
1574

1575 1576
		// transparent pass (immediate simulator)
		
1577 1578 1579
		for ( o = 0; o < oil; o++ ) {
		
			object = scene.__webGLObjectsImmediate[ o ].object;
1580 1581 1582
			
			if ( object.visible ) {
			
1583
				setObjectFaces( object );
1584 1585 1586 1587 1588 1589
				this.renderPassImmediate( camera, lights, fog, object, THREE.NormalBlending, true );
			
			}
			
		}
		
1590
		// Generate mipmap if we're using any kind of mipmap filtering
M
Mr.doob 已提交
1591

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

1594
			updateRenderTargetMipmap( renderTarget );
M
Mr.doob 已提交
1595

1596
		}
1597

M
Mr.doob 已提交
1598
	};
M
Mr.doob 已提交
1599

1600
	this.initWebGLObjects = function( scene, camera ) {
M
Mr.doob 已提交
1601

1602
		function add_buffer( objmap, id, buffer, object ) {
M
Mr.doob 已提交
1603

1604 1605 1606 1607 1608 1609
			if ( objmap[ id ] == undefined ) {

				scene.__webGLObjects.push( { buffer: buffer, object: object } );
				objmap[ id ] = 1;

			}
M
Mr.doob 已提交
1610

1611
		};
M
Mr.doob 已提交
1612

A
alteredq 已提交
1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623
		function add_buffer_immediate( objmap, id, object ) {

			if ( objmap[ id ] == undefined ) {

				scene.__webGLObjectsImmediate.push( { object: object } );
				objmap[ id ] = 1;

			}

		};

1624
		var o, ol, object, g, geometry, geometryChunk, objmap;
M
Mr.doob 已提交
1625

M
Mr.doob 已提交
1626
		if ( !scene.__webGLObjects ) {
M
Mr.doob 已提交
1627

M
Mr.doob 已提交
1628
			scene.__webGLObjects = [];
M
Mr.doob 已提交
1629
			scene.__webGLObjectsMap = {};
M
Mr.doob 已提交
1630

A
alteredq 已提交
1631 1632
			scene.__webGLObjectsImmediate = [];

M
Mr.doob 已提交
1633
		}
M
Mr.doob 已提交
1634

1635 1636 1637
		for ( o = 0, ol = scene.objects.length; o < ol; o++ ) {

			object = scene.objects[ o ];
1638
			geometry = object.geometry;
M
Mr.doob 已提交
1639

1640
			if ( scene.__webGLObjectsMap[ object.id ] == undefined ) {
M
Mr.doob 已提交
1641

1642
				scene.__webGLObjectsMap[ object.id ] = {};
1643 1644 1645 1646 1647 1648
					
				object._modelViewMatrix = new THREE.Matrix4();
				
				object._normalMatrixArray = new Float32Array( 9 );
				object._modelViewMatrixArray = new Float32Array( 16 );	
				object._objectMatrixArray = new Float32Array( 16 );
A
alteredq 已提交
1649 1650
					
				object._objectMatrixArray.set( object.matrix.flatten() );
M
Mr.doob 已提交
1651

1652
			}
1653

1654
			objmap = scene.__webGLObjectsMap[ object.id ];
M
Mr.doob 已提交
1655

1656
			if ( object instanceof THREE.Mesh ) {
M
Mr.doob 已提交
1657

M
Mr.doob 已提交
1658
				// create separate VBOs per geometry chunk
M
Mr.doob 已提交
1659

1660
				for ( g in geometry.geometryChunks ) {
M
Mr.doob 已提交
1661

1662
					geometryChunk = geometry.geometryChunks[ g ];
M
Mr.doob 已提交
1663

M
Mr.doob 已提交
1664
					// initialise VBO on the first access
M
Mr.doob 已提交
1665

M
Mr.doob 已提交
1666
					if( ! geometryChunk.__webGLVertexBuffer ) {
M
Mr.doob 已提交
1667

1668 1669
						this.createMeshBuffers( geometryChunk );
						this.initMeshBuffers( geometryChunk, object );
M
Mr.doob 已提交
1670

1671 1672 1673 1674 1675
						geometry.__dirtyVertices = true;
						geometry.__dirtyElements = true;
						geometry.__dirtyUvs = true;
						geometry.__dirtyNormals = true;
						geometry.__dirtyTangents = true;
1676
						geometry.__dirtyColors = true;
1677 1678 1679

					}

1680 1681 1682
					if( geometry.__dirtyVertices || geometry.__dirtyElements || 
						geometry.__dirtyUvs || geometry.__dirtyNormals || 
						geometry.__dirtyColors || geometry.__dirtyTangents ) {
1683

1684
						this.setMeshBuffers( geometryChunk, object, _gl.DYNAMIC_DRAW );
M
Mr.doob 已提交
1685

M
Mr.doob 已提交
1686
					}
M
Mr.doob 已提交
1687

M
Mr.doob 已提交
1688
					// create separate wrapper per each use of VBO
M
Mr.doob 已提交
1689

1690
					add_buffer( objmap, g, geometryChunk, object );
M
Mr.doob 已提交
1691

M
Mr.doob 已提交
1692
				}
1693

1694 1695 1696 1697 1698
				geometry.__dirtyVertices = false;
				geometry.__dirtyElements = false;
				geometry.__dirtyUvs = false;
				geometry.__dirtyNormals = false;
				geometry.__dirtyTangents = false;
1699
				geometry.__dirtyColors = false;
1700

1701
			} else if ( object instanceof THREE.Line ) {
M
Mr.doob 已提交
1702 1703


1704
				if( ! geometry.__webGLVertexBuffer ) {
M
Mr.doob 已提交
1705

1706 1707
					this.createLineBuffers( geometry );
					this.initLineBuffers( geometry );
M
Mr.doob 已提交
1708

1709 1710
					geometry.__dirtyVertices = true;
					geometry.__dirtyElements = true;
1711
					geometry.__dirtyColors = true;
M
Mr.doob 已提交
1712

1713
				}
M
Mr.doob 已提交
1714

1715
				if( geometry.__dirtyVertices ||  geometry.__dirtyColors ) {
M
Mr.doob 已提交
1716

1717
					this.setLineBuffers( geometry, _gl.DYNAMIC_DRAW );
M
Mr.doob 已提交
1718

1719
				}
M
Mr.doob 已提交
1720

1721
				add_buffer( objmap, 0, geometry, object );
M
Mr.doob 已提交
1722

1723 1724
				geometry.__dirtyVertices = false;
				geometry.__dirtyElements = false;
1725
				geometry.__dirtyColors = false;
1726

1727
			} else if ( object instanceof THREE.ParticleSystem ) {
1728

1729
				if( ! geometry.__webGLVertexBuffer ) {
M
Mr.doob 已提交
1730

1731
					this.createParticleBuffers( geometry );
1732 1733 1734
					this.initParticleBuffers( geometry );

					geometry.__dirtyVertices = true;
1735
					geometry.__dirtyColors = true;
1736 1737 1738
					
				}

1739
				if( geometry.__dirtyVertices || geometry.__dirtyColors || object.sortParticles ) {
1740

1741
					this.setParticleBuffers( geometry, _gl.DYNAMIC_DRAW, object, camera );
M
Mr.doob 已提交
1742

1743
				}
M
Mr.doob 已提交
1744

1745
				add_buffer( objmap, 0, geometry, object );
M
Mr.doob 已提交
1746

1747
				geometry.__dirtyVertices = false;
1748
				geometry.__dirtyColors = false;
1749

M
Mr.doob 已提交
1750

A
alteredq 已提交
1751 1752 1753 1754
			} else if ( object instanceof THREE.MarchingCubes ) {
				
				add_buffer_immediate( objmap, 0, object );
				
1755
			}/*else if ( object instanceof THREE.Particle ) {
M
Mr.doob 已提交
1756 1757 1758

			}*/

M
Mr.doob 已提交
1759
		}
1760 1761 1762 1763 1764 1765

	};

	this.removeObject = function ( scene, object ) {

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

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

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

1771
			if ( object == zobject ) {
1772 1773 1774 1775

				scene.__webGLObjects.splice( o, 1 );

			}
M
Mr.doob 已提交
1776

1777
		}
M
Mr.doob 已提交
1778

M
Mr.doob 已提交
1779
	};
M
Mr.doob 已提交
1780

M
Mr.doob 已提交
1781
	this.setupMatrices = function ( object, camera ) {
1782

A
alteredq 已提交
1783 1784
		object._modelViewMatrix.multiplyToArray( camera.matrix, object.matrix, object._modelViewMatrixArray );
		object._normalMatrix = THREE.Matrix4.makeInvert3x3( object._modelViewMatrix ).transposeIntoArray( object._normalMatrixArray );
M
Mr.doob 已提交
1785

M
Mr.doob 已提交
1786
	};
M
Mr.doob 已提交
1787

1788
	this.loadMatrices = function ( program, object ) {
M
Mr.doob 已提交
1789

M
Mr.doob 已提交
1790 1791
		_gl.uniformMatrix4fv( program.uniforms.viewMatrix, false, _viewMatrixArray );
		_gl.uniformMatrix4fv( program.uniforms.projectionMatrix, false, _projectionMatrixArray );
1792 1793 1794 1795
		
		_gl.uniformMatrix4fv( program.uniforms.modelViewMatrix, false, object._modelViewMatrixArray );
		_gl.uniformMatrix3fv( program.uniforms.normalMatrix, false, object._normalMatrixArray );
		_gl.uniformMatrix4fv( program.uniforms.objectMatrix, false, object._objectMatrixArray );
M
Mr.doob 已提交
1796

M
Mr.doob 已提交
1797
	};
1798

M
Mr.doob 已提交
1799
	this.loadCamera = function( program, camera ) {
M
Mr.doob 已提交
1800

M
Mr.doob 已提交
1801
		_gl.uniform3f( program.uniforms.cameraPosition, camera.position.x, camera.position.y, camera.position.z );
M
Mr.doob 已提交
1802

M
Mr.doob 已提交
1803
	};
M
Mr.doob 已提交
1804

1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818
	this.setDepthTest = function( test ) {
		
		if( test ) {
			
			_gl.enable( _gl.DEPTH_TEST );
			
		} else {
			
			_gl.disable( _gl.DEPTH_TEST );
			
		}
		
	};
	
M
Mr.doob 已提交
1819
	this.setBlending = function( blending ) {
M
Mr.doob 已提交
1820

M
Mr.doob 已提交
1821
		switch ( blending ) {
1822

M
Mr.doob 已提交
1823
			case THREE.AdditiveBlending:
1824

M
Mr.doob 已提交
1825 1826
				_gl.blendEquation( _gl.FUNC_ADD );
				_gl.blendFunc( _gl.ONE, _gl.ONE );
M
Mr.doob 已提交
1827

M
Mr.doob 已提交
1828
				break;
1829

M
Mr.doob 已提交
1830
			case THREE.SubtractiveBlending:
1831

M
Mr.doob 已提交
1832 1833
				//_gl.blendEquation( _gl.FUNC_SUBTRACT );
				_gl.blendFunc( _gl.DST_COLOR, _gl.ZERO );
M
Mr.doob 已提交
1834

M
Mr.doob 已提交
1835
				break;
M
Mr.doob 已提交
1836

1837 1838 1839 1840 1841 1842 1843
			case THREE.BillboardBlending:

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

				break;

M
Mr.doob 已提交
1844
			default:
M
Mr.doob 已提交
1845

M
Mr.doob 已提交
1846 1847
				_gl.blendEquation( _gl.FUNC_ADD );
				_gl.blendFunc( _gl.ONE, _gl.ONE_MINUS_SRC_ALPHA );
M
Mr.doob 已提交
1848

M
Mr.doob 已提交
1849
				break;
1850
		
N
Nicolas Garcia Belmonte 已提交
1851
		}
M
Mr.doob 已提交
1852

N
Nicolas Garcia Belmonte 已提交
1853
	};
M
Mr.doob 已提交
1854

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

1857
		if ( cullFace ) {
M
Mr.doob 已提交
1858

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

1861
				_gl.frontFace( _gl.CCW );
M
Mr.doob 已提交
1862

1863
			} else {
M
Mr.doob 已提交
1864

1865
				_gl.frontFace( _gl.CW );
M
Mr.doob 已提交
1866

1867
			}
M
Mr.doob 已提交
1868

1869
			if( cullFace == "back" ) {
M
Mr.doob 已提交
1870

1871
				_gl.cullFace( _gl.BACK );
M
Mr.doob 已提交
1872

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

1875
				_gl.cullFace( _gl.FRONT );
M
Mr.doob 已提交
1876

1877
			} else {
M
Mr.doob 已提交
1878

1879
				_gl.cullFace( _gl.FRONT_AND_BACK );
M
Mr.doob 已提交
1880

1881
			}
M
Mr.doob 已提交
1882

1883
			_gl.enable( _gl.CULL_FACE );
M
Mr.doob 已提交
1884

1885
		} else {
M
Mr.doob 已提交
1886

1887
			_gl.disable( _gl.CULL_FACE );
M
Mr.doob 已提交
1888

1889 1890 1891
		}

	};
N
Nicolas Garcia Belmonte 已提交
1892

1893
	this.supportsVertexTextures = function() {
1894

1895
		return maxVertexTextures() > 0;
1896

1897
	};
1898

1899
	function maxVertexTextures() {
1900

1901 1902 1903
		return _gl.getParameter( _gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS );

	};
1904

1905
	function initGL( antialias, clearColor, clearAlpha ) {
N
Nicolas Garcia Belmonte 已提交
1906 1907 1908

		try {

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

A
alteredq 已提交
1911
		} catch(e) { console.log(e) }
N
Nicolas Garcia Belmonte 已提交
1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925

		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 );

1926 1927
		_gl.frontFace( _gl.CCW );
		_gl.cullFace( _gl.BACK );
1928
		_gl.enable( _gl.CULL_FACE );
M
Mr.doob 已提交
1929

N
Nicolas Garcia Belmonte 已提交
1930
		_gl.enable( _gl.BLEND );
1931
		_gl.blendFunc( _gl.ONE, _gl.ONE_MINUS_SRC_ALPHA );
1932
		_gl.clearColor( clearColor.r, clearColor.g, clearColor.b, clearAlpha );
N
Nicolas Garcia Belmonte 已提交
1933

1934
	};
M
Mr.doob 已提交
1935

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

M
Mr.doob 已提交
1938
		var program = _gl.createProgram(),
M
Mr.doob 已提交
1939

M
Mr.doob 已提交
1940 1941 1942 1943
		prefix_fragment = [
			"#ifdef GL_ES",
			"precision highp float;",
			"#endif",
M
Mr.doob 已提交
1944

1945 1946
			"#define MAX_DIR_LIGHTS " + parameters.maxDirLights,
			"#define MAX_POINT_LIGHTS " + parameters.maxPointLights,
A
alteredq 已提交
1947

1948 1949
			parameters.fog ? "#define USE_FOG" : "",
			parameters.fog instanceof THREE.FogExp2 ? "#define FOG_EXP2" : "",
1950

1951 1952
			parameters.map ? "#define USE_MAP" : "",
			parameters.env_map ? "#define USE_ENVMAP" : "",
1953
			parameters.light_map ? "#define USE_LIGHTMAP" : "",
A
alteredq 已提交
1954
			parameters.vertex_colors ? "#define USE_COLOR" : "",
1955

1956
			"uniform mat4 viewMatrix;",
1957
			"uniform vec3 cameraPosition;",
M
Mr.doob 已提交
1958 1959
			""
		].join("\n"),
1960

M
Mr.doob 已提交
1961
		prefix_vertex = [
1962
			maxVertexTextures() > 0 ? "#define VERTEX_TEXTURES" : "",
1963

1964 1965 1966
			"#define MAX_DIR_LIGHTS " + parameters.maxDirLights,
			"#define MAX_POINT_LIGHTS " + parameters.maxPointLights,

1967 1968
			parameters.map ? "#define USE_MAP" : "",
			parameters.env_map ? "#define USE_ENVMAP" : "",
1969
			parameters.light_map ? "#define USE_LIGHTMAP" : "",
A
alteredq 已提交
1970
			parameters.vertex_colors ? "#define USE_COLOR" : "",
1971

M
Mr.doob 已提交
1972 1973 1974
			"uniform mat4 objectMatrix;",
			"uniform mat4 modelViewMatrix;",
			"uniform mat4 projectionMatrix;",
1975 1976
			"uniform mat4 viewMatrix;",
			"uniform mat3 normalMatrix;",
M
Mr.doob 已提交
1977
			"uniform vec3 cameraPosition;",
M
Mr.doob 已提交
1978 1979
			"attribute vec3 position;",
			"attribute vec3 normal;",
A
alteredq 已提交
1980
			"attribute vec3 color;",
M
Mr.doob 已提交
1981
			"attribute vec2 uv;",
1982
			"attribute vec2 uv2;",
M
Mr.doob 已提交
1983 1984
			""
		].join("\n");
1985

M
Mr.doob 已提交
1986 1987
		_gl.attachShader( program, getShader( "fragment", prefix_fragment + fragment_shader ) );
		_gl.attachShader( program, getShader( "vertex", prefix_vertex + vertex_shader ) );
M
Mr.doob 已提交
1988

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

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

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

1996 1997
			//console.log( prefix_fragment + fragment_shader );
			//console.log( prefix_vertex + vertex_shader );
M
Mr.doob 已提交
1998

N
Nicolas Garcia Belmonte 已提交
1999
		}
2000 2001 2002
		
		//console.log( prefix_fragment + fragment_shader );
		//console.log( prefix_vertex + vertex_shader );
M
Mr.doob 已提交
2003

M
Mr.doob 已提交
2004
		program.uniforms = {};
2005
		program.attributes = {};
M
Mr.doob 已提交
2006

M
Mr.doob 已提交
2007
		return program;
M
Mr.doob 已提交
2008

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

M
Mr.doob 已提交
2011
	function setUniforms( program, uniforms ) {
M
Mr.doob 已提交
2012

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

M
Mr.doob 已提交
2015
		for( u in uniforms ) {
M
Mr.doob 已提交
2016

2017 2018
			location = program.uniforms[u];
			if ( !location ) continue;
M
Mr.doob 已提交
2019

2020
			uniform = uniforms[u];
M
Mr.doob 已提交
2021

2022 2023
			type = uniform.type;
			value = uniform.value;
M
Mr.doob 已提交
2024

M
Mr.doob 已提交
2025
			if( type == "i" ) {
M
Mr.doob 已提交
2026

M
Mr.doob 已提交
2027
				_gl.uniform1i( location, value );
M
Mr.doob 已提交
2028

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

M
Mr.doob 已提交
2031
				_gl.uniform1f( location, value );
2032

A
alteredq 已提交
2033 2034 2035
			} else if( type == "fv1" ) {

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

2037 2038 2039 2040
			} else if( type == "fv" ) {

				_gl.uniform3fv( location, value );

2041 2042 2043 2044
			} else if( type == "v2" ) {

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

2045 2046 2047
			} else if( type == "v3" ) {

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

2049 2050 2051
			} else if( type == "c" ) {

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

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

M
Mr.doob 已提交
2055
				_gl.uniform1i( location, value );
M
Mr.doob 已提交
2056

2057
				texture = uniform.texture;
M
Mr.doob 已提交
2058

2059
				if ( !texture ) continue;
M
Mr.doob 已提交
2060

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

2063
					setCubeTexture( texture, value );
M
Mr.doob 已提交
2064

2065
				} else {
M
Mr.doob 已提交
2066

2067
					setTexture( texture, value );
M
Mr.doob 已提交
2068

2069
				}
M
Mr.doob 已提交
2070

2071
			}
M
Mr.doob 已提交
2072

2073
		}
M
Mr.doob 已提交
2074

2075
	};
M
Mr.doob 已提交
2076

2077
	function setCubeTexture( texture, slot ) {
M
Mr.doob 已提交
2078

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

2081 2082
			if ( !texture.image.__webGLTextureCube &&
				 !texture.image.__cubeMapInitialized && texture.image.loadCount == 6 ) {
M
Mr.doob 已提交
2083

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

2086
				_gl.bindTexture( _gl.TEXTURE_CUBE_MAP, texture.image.__webGLTextureCube );
2087

2088 2089
				_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 已提交
2090

2091 2092
				_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 已提交
2093

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

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

2098
				}
M
Mr.doob 已提交
2099

2100
				_gl.generateMipmap( _gl.TEXTURE_CUBE_MAP );
2101

2102
				_gl.bindTexture( _gl.TEXTURE_CUBE_MAP, null );
M
Mr.doob 已提交
2103

2104
				texture.image.__cubeMapInitialized = true;
M
Mr.doob 已提交
2105

M
Mr.doob 已提交
2106
			}
2107 2108 2109

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

2111
		}
M
Mr.doob 已提交
2112

M
Mr.doob 已提交
2113
	};
M
Mr.doob 已提交
2114

2115
	function setTexture( texture, slot ) {
M
Mr.doob 已提交
2116

2117 2118 2119 2120 2121
		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 已提交
2122

2123 2124
			_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 已提交
2125 2126 2127

			_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 ) );
2128 2129 2130 2131 2132 2133 2134
			_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 已提交
2135

2136
	};
M
Mr.doob 已提交
2137

A
alteredq 已提交
2138
	function setRenderTarget( renderTexture, clear ) {
2139 2140

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

2142 2143 2144 2145 2146
			renderTexture.__webGLFramebuffer = _gl.createFramebuffer();
			renderTexture.__webGLRenderbuffer = _gl.createRenderbuffer();
			renderTexture.__webGLTexture = _gl.createTexture();

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

2148 2149 2150 2151
			_gl.bindRenderbuffer( _gl.RENDERBUFFER, renderTexture.__webGLRenderbuffer );
			_gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_COMPONENT16, renderTexture.width, renderTexture.height );

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

2153 2154 2155 2156 2157
			_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 ) );
2158
			_gl.texImage2D( _gl.TEXTURE_2D, 0, paramThreeToGL( renderTexture.format ), renderTexture.width, renderTexture.height, 0, paramThreeToGL( renderTexture.format ), paramThreeToGL( renderTexture.type ), null );
2159 2160

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

2162 2163
			_gl.bindFramebuffer( _gl.FRAMEBUFFER, renderTexture.__webGLFramebuffer );
			_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D, renderTexture.__webGLTexture, 0 );
2164
			_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.RENDERBUFFER, renderTexture.__webGLRenderbuffer );
2165 2166

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

2168 2169 2170
			_gl.bindTexture( _gl.TEXTURE_2D, null );
			_gl.bindRenderbuffer( _gl.RENDERBUFFER, null );
			_gl.bindFramebuffer( _gl.FRAMEBUFFER, null);
M
Mr.doob 已提交
2171

2172 2173
		}

2174
		var framebuffer, width, height;
M
Mr.doob 已提交
2175

2176
		if ( renderTexture ) {
M
Mr.doob 已提交
2177

2178 2179 2180
			framebuffer = renderTexture.__webGLFramebuffer;
			width = renderTexture.width;
			height = renderTexture.height;
M
Mr.doob 已提交
2181

2182
		} else {
M
Mr.doob 已提交
2183

2184 2185 2186
			framebuffer = null;
			width = _canvas.width;
			height = _canvas.height;
M
Mr.doob 已提交
2187

2188
		}
M
Mr.doob 已提交
2189

2190
		if( framebuffer != _oldFramebuffer ) {
M
Mr.doob 已提交
2191

2192 2193
			_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );
			_gl.viewport( 0, 0, width, height );
M
Mr.doob 已提交
2194

A
alteredq 已提交
2195
			if ( clear ) {
M
Mr.doob 已提交
2196

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

A
alteredq 已提交
2199
			}
M
Mr.doob 已提交
2200

2201
			_oldFramebuffer = framebuffer;
M
Mr.doob 已提交
2202

2203
		}
2204

2205
	};
M
Mr.doob 已提交
2206

2207
	function updateRenderTargetMipmap( renderTarget ) {
M
Mr.doob 已提交
2208

2209 2210 2211
		_gl.bindTexture( _gl.TEXTURE_2D, renderTarget.__webGLTexture );
		_gl.generateMipmap( _gl.TEXTURE_2D );
		_gl.bindTexture( _gl.TEXTURE_2D, null );
M
Mr.doob 已提交
2212 2213

	};
2214

M
Mr.doob 已提交
2215
	function cacheUniformLocations( program, identifiers ) {
M
Mr.doob 已提交
2216

M
Mr.doob 已提交
2217
		var i, l, id;
M
Mr.doob 已提交
2218

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

2221 2222
			id = identifiers[ i ];
			program.uniforms[ id ] = _gl.getUniformLocation( program, id );
M
Mr.doob 已提交
2223

M
Mr.doob 已提交
2224
		}
M
Mr.doob 已提交
2225

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

2228
	function cacheAttributeLocations( program, identifiers ) {
2229

2230
		var i, l, id;
M
Mr.doob 已提交
2231

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

2234 2235
			id = identifiers[ i ];
			program.attributes[ id ] = _gl.getAttribLocation( program, id );
M
Mr.doob 已提交
2236

2237
		}
M
Mr.doob 已提交
2238

M
Mr.doob 已提交
2239
	};
M
Mr.doob 已提交
2240

N
Nicolas Garcia Belmonte 已提交
2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265
	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 已提交
2266

2267
	};
N
Nicolas Garcia Belmonte 已提交
2268

2269
	function paramThreeToGL( p ) {
M
Mr.doob 已提交
2270

2271
		switch ( p ) {
M
Mr.doob 已提交
2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284

			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;

2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298
			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;

2299
		}
M
Mr.doob 已提交
2300

2301
		return 0;
M
Mr.doob 已提交
2302

2303 2304 2305 2306 2307 2308
	};

	function materialNeedsSmoothNormals( material ) {

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

2309
	};
M
Mr.doob 已提交
2310

M
Mr.doob 已提交
2311
	function bufferNeedsSmoothNormals( geometryChunk, object ) {
M
Mr.doob 已提交
2312

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

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

M
Mr.doob 已提交
2317
			meshMaterial = object.materials[ m ];
2318 2319 2320

			if ( meshMaterial instanceof THREE.MeshFaceMaterial ) {

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

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

2325 2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345
						needsSmoothNormals = true;
						break;

					}

				}

			} else {

				if ( materialNeedsSmoothNormals( meshMaterial ) ) {

					needsSmoothNormals = true;
					break;

				}

			}

			if ( needsSmoothNormals ) break;

		}
M
Mr.doob 已提交
2346

2347
		return needsSmoothNormals;
M
Mr.doob 已提交
2348

2349
	};
M
Mr.doob 已提交
2350

2351
	function allocateLights( lights, maxLights ) {
2352

2353 2354
		var l, ll, light, dirLights, pointLights, maxDirLights, maxPointLights;
		dirLights = pointLights = maxDirLights = maxPointLights = 0;
2355

2356
		for ( l = 0, ll = lights.length; l < ll; l++ ) {
2357

2358
			light = lights[ l ];
2359

2360 2361
			if ( light instanceof THREE.DirectionalLight ) dirLights++;
			if ( light instanceof THREE.PointLight ) pointLights++;
2362

2363
		}
2364

2365
		if ( ( pointLights + dirLights ) <= maxLights ) {
2366

2367 2368
			maxDirLights = dirLights;
			maxPointLights = pointLights;
2369

2370
		} else {
2371

2372 2373
			maxDirLights = Math.ceil( maxLights * dirLights / ( pointLights + dirLights ) );
			maxPointLights = maxLights - maxDirLights;
2374 2375 2376

		}

2377
		return { 'directional' : maxDirLights, 'point' : maxPointLights };
2378 2379

	};
M
Mr.doob 已提交
2380

A
alteredq 已提交
2381
	/* DEBUG
2382
	function getGLParams() {
M
Mr.doob 已提交
2383

2384
		var params  = {
M
Mr.doob 已提交
2385

2386 2387
			'MAX_VARYING_VECTORS': _gl.getParameter( _gl.MAX_VARYING_VECTORS ),
			'MAX_VERTEX_ATTRIBS': _gl.getParameter( _gl.MAX_VERTEX_ATTRIBS ),
M
Mr.doob 已提交
2388

2389 2390 2391
			'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 已提交
2392

2393 2394 2395
			'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 已提交
2396

2397 2398
		return params;
	};
M
Mr.doob 已提交
2399

2400
	function dumpObject( obj ) {
M
Mr.doob 已提交
2401

2402 2403
		var p, str = "";
		for ( p in obj ) {
M
Mr.doob 已提交
2404

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

2407
		}
M
Mr.doob 已提交
2408

2409 2410
		return str;
	}
A
alteredq 已提交
2411
	*/
2412

2413
};
2414

2415
THREE.Snippets = {
M
Mr.doob 已提交
2416

2417 2418
	// FOG
	
2419
	fog_pars_fragment: [
M
Mr.doob 已提交
2420

2421
	"#ifdef USE_FOG",
2422

2423
		"uniform vec3 fogColor;",
2424

2425 2426 2427 2428 2429 2430
		"#ifdef FOG_EXP2",
			"uniform float fogDensity;",
		"#else",
			"uniform float fogNear;",
			"uniform float fogFar;",
		"#endif",
2431

2432
	"#endif"
2433

2434
	].join("\n"),
M
Mr.doob 已提交
2435

2436
	fog_fragment: [
2437

2438
	"#ifdef USE_FOG",
2439

2440 2441 2442 2443 2444 2445 2446 2447 2448
		"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",
2449

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

2452
	"#endif"
M
Mr.doob 已提交
2453

2454
	].join("\n"),
M
Mr.doob 已提交
2455

2456 2457
	// ENVIRONMENT MAP
	
2458
	envmap_pars_fragment: [
M
Mr.doob 已提交
2459

2460
	"#ifdef USE_ENVMAP",
M
Mr.doob 已提交
2461

2462 2463 2464 2465
		"varying vec3 vReflect;",
		"uniform float reflectivity;",
		"uniform samplerCube env_map;",
		"uniform int combine;",
M
Mr.doob 已提交
2466

2467
	"#endif"
M
Mr.doob 已提交
2468

2469
	].join("\n"),
M
Mr.doob 已提交
2470

2471
	envmap_fragment: [
M
Mr.doob 已提交
2472

2473 2474
	"#ifdef USE_ENVMAP",

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

2477 2478
		"if ( combine == 1 ) {",

2479 2480
			//"gl_FragColor = mix( gl_FragColor, cubeColor, reflectivity );",
			"gl_FragColor = vec4( mix( gl_FragColor.xyz, cubeColor.xyz, reflectivity ), opacity );",
2481 2482 2483 2484 2485

		"} else {",

			"gl_FragColor = gl_FragColor * cubeColor;",

M
Mr.doob 已提交
2486
		"}",
2487 2488

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

2490
	].join("\n"),
M
Mr.doob 已提交
2491

2492
	envmap_pars_vertex: [
M
Mr.doob 已提交
2493

2494
	"#ifdef USE_ENVMAP",
M
Mr.doob 已提交
2495

2496 2497 2498
		"varying vec3 vReflect;",
		"uniform float refraction_ratio;",
		"uniform bool useRefract;",
M
Mr.doob 已提交
2499

2500
	"#endif"
M
Mr.doob 已提交
2501

2502 2503 2504
	].join("\n"),

	envmap_vertex : [
M
Mr.doob 已提交
2505

2506
	"#ifdef USE_ENVMAP",
M
Mr.doob 已提交
2507

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

2511 2512 2513 2514 2515 2516 2517 2518 2519 2520 2521
		"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 已提交
2522

2523
	].join("\n"),
2524
	
2525 2526 2527 2528 2529 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539 2540 2541
	// COLOR MAP (particles)

	map_particle_pars_fragment: [

	"#ifdef USE_MAP",

		"uniform sampler2D map;",

	"#endif"

	].join("\n"),


	map_particle_fragment: [

	"#ifdef USE_MAP",

A
alteredq 已提交
2542
		"gl_FragColor = gl_FragColor * texture2D( map, gl_PointCoord );",
2543 2544 2545 2546 2547 2548

	"#endif"

	].join("\n"),

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

2550
	map_pars_fragment: [
M
Mr.doob 已提交
2551

2552
	"#ifdef USE_MAP",
M
Mr.doob 已提交
2553

2554 2555
		"varying vec2 vUv;",
		"uniform sampler2D map;",
M
Mr.doob 已提交
2556

2557
	"#endif"
M
Mr.doob 已提交
2558

2559
	].join("\n"),
M
Mr.doob 已提交
2560

2561
	map_pars_vertex: [
M
Mr.doob 已提交
2562

2563
	"#ifdef USE_MAP",
M
Mr.doob 已提交
2564

2565 2566 2567
		"varying vec2 vUv;",

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

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

2571 2572 2573 2574
	map_fragment: [

	"#ifdef USE_MAP",

A
alteredq 已提交
2575
		"gl_FragColor = gl_FragColor * texture2D( map, vUv );",
2576 2577

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

2579
	].join("\n"),
M
Mr.doob 已提交
2580

2581
	map_vertex: [
M
Mr.doob 已提交
2582

2583
	"#ifdef USE_MAP",
M
Mr.doob 已提交
2584

2585
		"vUv = uv;",
M
Mr.doob 已提交
2586

2587
	"#endif"
M
Mr.doob 已提交
2588

2589
	].join("\n"),
M
Mr.doob 已提交
2590

2591 2592 2593 2594 2595 2596 2597 2598 2599 2600 2601 2602 2603 2604 2605 2606 2607 2608 2609 2610 2611 2612 2613 2614 2615 2616 2617
	// 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 已提交
2618
		"gl_FragColor = gl_FragColor * texture2D( light_map, vUv2 );",
2619 2620 2621 2622 2623 2624 2625 2626 2627 2628 2629 2630 2631 2632 2633

	"#endif"

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

	"#ifdef USE_LIGHTMAP",

		"vUv2 = uv2;",

	"#endif"

	].join("\n"),

2634
	lights_pars_vertex: [
M
Mr.doob 已提交
2635

2636 2637
	"uniform bool enableLighting;",
	"uniform vec3 ambientLightColor;",
M
Mr.doob 已提交
2638

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

2641 2642
		"uniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];",
		"uniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];",
M
Mr.doob 已提交
2643

2644 2645 2646
	"#endif",

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

2648 2649
		"uniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];",
		"uniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];",
M
Mr.doob 已提交
2650

2651 2652 2653
		"#ifdef PHONG",
			"varying vec3 vPointLightVector[ MAX_POINT_LIGHTS ];",
		"#endif",
M
Mr.doob 已提交
2654

2655
	"#endif"
M
Mr.doob 已提交
2656

2657
	].join("\n"),
M
Mr.doob 已提交
2658

2659 2660
	// LIGHTS
	
2661
	lights_vertex: [
M
Mr.doob 已提交
2662

2663 2664
	"if ( !enableLighting ) {",

A
alteredq 已提交
2665
		"vLightWeighting = vec3( 1.0 );",
2666 2667 2668 2669 2670 2671

	"} else {",

		"vLightWeighting = ambientLightColor;",

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

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

2675 2676 2677
			"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 已提交
2678

2679
		"}",
M
Mr.doob 已提交
2680

2681 2682 2683
		"#endif",

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

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

2687 2688 2689 2690
			"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 已提交
2691

2692 2693 2694
			"#ifdef PHONG",
				"vPointLightVector[ i ] = pointLightVector;",
			"#endif",
M
Mr.doob 已提交
2695

2696
		"}",
M
Mr.doob 已提交
2697

2698
		"#endif",
M
Mr.doob 已提交
2699

2700
	"}"
M
Mr.doob 已提交
2701

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

2704
	lights_pars_fragment: [
M
Mr.doob 已提交
2705

2706 2707 2708
	"#if MAX_DIR_LIGHTS > 0",
		"uniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];",
	"#endif",
M
Mr.doob 已提交
2709

2710 2711 2712
	"#if MAX_POINT_LIGHTS > 0",
		"varying vec3 vPointLightVector[ MAX_POINT_LIGHTS ];",
	"#endif",
M
Mr.doob 已提交
2713

2714 2715
	"varying vec3 vViewPosition;",
	"varying vec3 vNormal;"
M
Mr.doob 已提交
2716

2717
	].join("\n"),
M
Mr.doob 已提交
2718

2719
	lights_fragment: [
M
Mr.doob 已提交
2720

2721 2722
	"vec3 normal = normalize( vNormal );",
	"vec3 viewPosition = normalize( vViewPosition );",
A
alteredq 已提交
2723 2724
	
	"vec4 mColor = vec4( diffuse, opacity );",
2725 2726 2727
	"vec4 mSpecular = vec4( specular, opacity );",

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

2729 2730 2731 2732 2733 2734 2735 2736 2737 2738 2739 2740 2741 2742 2743 2744 2745 2746 2747 2748 2749
		"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 已提交
2750

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

2753 2754 2755 2756 2757 2758 2759 2760 2761 2762 2763 2764 2765 2766 2767 2768 2769 2770 2771 2772 2773 2774
		"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 已提交
2775

2776 2777 2778 2779 2780 2781 2782
	"#endif",

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

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

2784 2785
	"#if MAX_POINT_LIGHTS > 0",
		"totalLight += pointDiffuse + pointSpecular;",
A
alteredq 已提交
2786 2787 2788
	"#endif",
	
	"gl_FragColor = gl_FragColor * totalLight;"
2789

A
alteredq 已提交
2790 2791 2792 2793 2794 2795 2796 2797 2798 2799 2800 2801 2802 2803 2804 2805 2806 2807 2808
	].join("\n"),
	
	// VERTEX COLORS

	color_pars_fragment: [

	"#ifdef USE_COLOR",

		"varying vec3 vColor;",

	"#endif"

	].join("\n"),


	color_fragment: [

	"#ifdef USE_COLOR",

A
alteredq 已提交
2809
		"gl_FragColor = gl_FragColor * vec4( vColor, opacity );",
A
alteredq 已提交
2810 2811 2812 2813 2814 2815 2816 2817 2818 2819 2820 2821 2822 2823 2824 2825 2826 2827 2828 2829 2830 2831 2832 2833

	"#endif"

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

	"#ifdef USE_COLOR",

		"varying vec3 vColor;",

	"#endif"

	].join("\n"),


	color_vertex: [

	"#ifdef USE_COLOR",

		"vColor = color;",

	"#endif"

2834
	].join("\n")
A
alteredq 已提交
2835
	
2836

2837
};
2838

2839
THREE.UniformsLib = {
M
Mr.doob 已提交
2840

2841
	common: {
M
Mr.doob 已提交
2842

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

2847 2848
	"light_map"       : { type: "t", value: 2, texture: null },

2849 2850
	"env_map" 		  : { type: "t", value: 1, texture: null },
	"useRefract"	  : { type: "i", value: 0 },
2851
	"reflectivity"    : { type: "f", value: 1.0 },
2852 2853
	"refraction_ratio": { type: "f", value: 0.98 },
	"combine"		  : { type: "i", value: 0 },
M
Mr.doob 已提交
2854

2855 2856 2857 2858
	"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 已提交
2859

2860
	},
M
Mr.doob 已提交
2861

2862
	lights: {
M
Mr.doob 已提交
2863

2864 2865 2866 2867 2868 2869
	"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 已提交
2870

2871 2872 2873 2874
	},

	particle: {

A
alteredq 已提交
2875
	"psColor"   : { type: "c", value: new THREE.Color( 0xeeeeee ) },
2876 2877
	"opacity" : { type: "f", value: 1.0 },
	"size" 	  : { type: "f", value: 1.0 },
2878
	"map"     : { type: "t", value: 0, texture: null },
M
Mr.doob 已提交
2879

2880 2881 2882 2883 2884 2885 2886
	"fogDensity": { type: "f", value: 0.00025 },
	"fogNear"	: { type: "f", value: 1 },
	"fogFar"	: { type: "f", value: 2000 },
	"fogColor"	: { type: "c", value: new THREE.Color( 0xffffff ) }
	
	}
	
2887 2888
};

2889
THREE.ShaderLib = {
2890

2891
	'depth': {
M
Mr.doob 已提交
2892

2893
		uniforms: { "mNear": { type: "f", value: 1.0 },
2894
					"mFar" : { type: "f", value: 2000.0 },
A
alteredq 已提交
2895
					"opacity" : { type: "f", value: 1.0 }
2896
				  },
2897

2898
		fragment_shader: [
M
Mr.doob 已提交
2899

2900 2901
			"uniform float mNear;",
			"uniform float mFar;",
2902
			"uniform float opacity;",
M
Mr.doob 已提交
2903

2904
			"void main() {",
M
Mr.doob 已提交
2905

2906 2907
				"float depth = gl_FragCoord.z / gl_FragCoord.w;",
				"float color = 1.0 - smoothstep( mNear, mFar, depth );",
2908
				"gl_FragColor = vec4( vec3( color ), opacity );",
M
Mr.doob 已提交
2909

2910
			"}"
M
Mr.doob 已提交
2911

2912
		].join("\n"),
2913

2914
		vertex_shader: [
2915

2916
			"void main() {",
2917

2918
				"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",
2919

2920
			"}"
2921

2922
		].join("\n")
2923

2924
	},
2925

2926
	'normal': {
M
Mr.doob 已提交
2927

2928
		uniforms: { "opacity" : { type: "f", value: 1.0 } },
2929

2930
		fragment_shader: [
2931

2932
			"uniform float opacity;",
2933
			"varying vec3 vNormal;",
M
Mr.doob 已提交
2934

2935
			"void main() {",
2936

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

2939
			"}"
M
Mr.doob 已提交
2940

2941
		].join("\n"),
M
Mr.doob 已提交
2942

2943
		vertex_shader: [
2944

2945
			"varying vec3 vNormal;",
2946

2947 2948 2949 2950 2951 2952 2953 2954 2955 2956 2957 2958
			"void main() {",

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

				"gl_Position = projectionMatrix * mvPosition;",

			"}"

		].join("\n")

	},
2959

2960
	'basic': {
M
Mr.doob 已提交
2961

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

2964
		fragment_shader: [
2965

A
alteredq 已提交
2966
			"uniform vec3 diffuse;",
2967
			"uniform float opacity;",
M
Mr.doob 已提交
2968

2969
			THREE.Snippets[ "color_pars_fragment" ],
2970
			THREE.Snippets[ "map_pars_fragment" ],
2971
			THREE.Snippets[ "lightmap_pars_fragment" ],
2972 2973
			THREE.Snippets[ "envmap_pars_fragment" ],
			THREE.Snippets[ "fog_pars_fragment" ],
M
Mr.doob 已提交
2974

2975
			"void main() {",
2976

A
alteredq 已提交
2977 2978
				"gl_FragColor = vec4( diffuse, opacity );",
		
2979
				THREE.Snippets[ "map_fragment" ],
2980
				THREE.Snippets[ "lightmap_fragment" ],
2981
				THREE.Snippets[ "color_fragment" ],
2982 2983
				THREE.Snippets[ "envmap_fragment" ],
				THREE.Snippets[ "fog_fragment" ],
M
Mr.doob 已提交
2984

2985
			"}"
2986

2987
		].join("\n"),
M
Mr.doob 已提交
2988

2989
		vertex_shader: [
M
Mr.doob 已提交
2990

2991
			THREE.Snippets[ "map_pars_vertex" ],
2992
			THREE.Snippets[ "lightmap_pars_vertex" ],
2993
			THREE.Snippets[ "envmap_pars_vertex" ],
2994
			THREE.Snippets[ "color_pars_vertex" ],
M
Mr.doob 已提交
2995

2996
			"void main() {",
M
Mr.doob 已提交
2997

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

3000
				THREE.Snippets[ "map_vertex" ],
3001
				THREE.Snippets[ "lightmap_vertex" ],
3002
				THREE.Snippets[ "envmap_vertex" ],
3003
				THREE.Snippets[ "color_vertex" ],
M
Mr.doob 已提交
3004

3005
				"gl_Position = projectionMatrix * mvPosition;",
3006

3007
			"}"
3008

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

3011
	},
3012

3013
	'lambert': {
M
Mr.doob 已提交
3014 3015

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

3018
		fragment_shader: [
M
Mr.doob 已提交
3019

A
alteredq 已提交
3020
			"uniform vec3 diffuse;",
3021
			"uniform float opacity;",
M
Mr.doob 已提交
3022

3023
			"varying vec3 vLightWeighting;",
M
Mr.doob 已提交
3024

A
alteredq 已提交
3025
			THREE.Snippets[ "color_pars_fragment" ],
3026
			THREE.Snippets[ "map_pars_fragment" ],
3027
			THREE.Snippets[ "lightmap_pars_fragment" ],
3028 3029
			THREE.Snippets[ "envmap_pars_fragment" ],
			THREE.Snippets[ "fog_pars_fragment" ],
M
Mr.doob 已提交
3030

3031
			"void main() {",
M
Mr.doob 已提交
3032

A
alteredq 已提交
3033 3034
				"gl_FragColor = vec4( diffuse, opacity );",
				"gl_FragColor = gl_FragColor * vec4( vLightWeighting, 1.0 );",
3035 3036

				THREE.Snippets[ "map_fragment" ],
3037
				THREE.Snippets[ "lightmap_fragment" ],
A
alteredq 已提交
3038
				THREE.Snippets[ "color_fragment" ],
3039
				THREE.Snippets[ "envmap_fragment" ],
3040 3041 3042 3043 3044 3045 3046
				THREE.Snippets[ "fog_fragment" ],

			"}"

		].join("\n"),

		vertex_shader: [
M
Mr.doob 已提交
3047

3048
			"varying vec3 vLightWeighting;",
M
Mr.doob 已提交
3049

3050
			THREE.Snippets[ "map_pars_vertex" ],
3051
			THREE.Snippets[ "lightmap_pars_vertex" ],
3052 3053
			THREE.Snippets[ "envmap_pars_vertex" ],
			THREE.Snippets[ "lights_pars_vertex" ],
A
alteredq 已提交
3054
			THREE.Snippets[ "color_pars_vertex" ],
M
Mr.doob 已提交
3055

3056
			"void main() {",
M
Mr.doob 已提交
3057

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

3060
				THREE.Snippets[ "map_vertex" ],
3061
				THREE.Snippets[ "lightmap_vertex" ],
3062
				THREE.Snippets[ "envmap_vertex" ],
A
alteredq 已提交
3063
				THREE.Snippets[ "color_vertex" ],
M
Mr.doob 已提交
3064

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

3067
				THREE.Snippets[ "lights_vertex" ],
M
Mr.doob 已提交
3068

3069 3070 3071 3072 3073
				"gl_Position = projectionMatrix * mvPosition;",

			"}"

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

3075
	},
M
Mr.doob 已提交
3076

3077
	'phong': {
M
Mr.doob 已提交
3078 3079

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

3082
									{ "ambient"  : { type: "c", value: new THREE.Color( 0x050505 ) },
3083 3084 3085
									  "specular" : { type: "c", value: new THREE.Color( 0x111111 ) },
									  "shininess": { type: "f", value: 30 }
									}
M
Mr.doob 已提交
3086

3087
								] ),
M
Mr.doob 已提交
3088

3089
		fragment_shader: [
M
Mr.doob 已提交
3090

A
alteredq 已提交
3091
			"uniform vec3 diffuse;",
3092
			"uniform float opacity;",
M
Mr.doob 已提交
3093

3094 3095 3096
			"uniform vec3 ambient;",
			"uniform vec3 specular;",
			"uniform float shininess;",
M
Mr.doob 已提交
3097

3098
			"varying vec3 vLightWeighting;",
M
Mr.doob 已提交
3099

A
alteredq 已提交
3100
			THREE.Snippets[ "color_pars_fragment" ],
3101
			THREE.Snippets[ "map_pars_fragment" ],
3102
			THREE.Snippets[ "lightmap_pars_fragment" ],
3103 3104 3105
			THREE.Snippets[ "envmap_pars_fragment" ],
			THREE.Snippets[ "fog_pars_fragment" ],
			THREE.Snippets[ "lights_pars_fragment" ],
M
Mr.doob 已提交
3106

3107
			"void main() {",
M
Mr.doob 已提交
3108

A
alteredq 已提交
3109 3110
				"gl_FragColor = vec4( vLightWeighting, 1.0 );",
				THREE.Snippets[ "lights_fragment" ],
3111 3112

				THREE.Snippets[ "map_fragment" ],
3113
				THREE.Snippets[ "lightmap_fragment" ],
A
alteredq 已提交
3114
				THREE.Snippets[ "color_fragment" ],
3115 3116 3117 3118 3119 3120 3121 3122
				THREE.Snippets[ "envmap_fragment" ],
				THREE.Snippets[ "fog_fragment" ],

			"}"

		].join("\n"),

		vertex_shader: [
M
Mr.doob 已提交
3123

3124
			"#define PHONG",
M
Mr.doob 已提交
3125

3126 3127 3128
			"varying vec3 vLightWeighting;",
			"varying vec3 vViewPosition;",
			"varying vec3 vNormal;",
M
Mr.doob 已提交
3129

3130
			THREE.Snippets[ "map_pars_vertex" ],
3131
			THREE.Snippets[ "lightmap_pars_vertex" ],
3132 3133
			THREE.Snippets[ "envmap_pars_vertex" ],
			THREE.Snippets[ "lights_pars_vertex" ],
A
alteredq 已提交
3134
			THREE.Snippets[ "color_pars_vertex" ],
M
Mr.doob 已提交
3135

3136
			"void main() {",
M
Mr.doob 已提交
3137

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

3140
				THREE.Snippets[ "map_vertex" ],
3141
				THREE.Snippets[ "lightmap_vertex" ],
3142
				THREE.Snippets[ "envmap_vertex" ],
A
alteredq 已提交
3143
				THREE.Snippets[ "color_vertex" ],
M
Mr.doob 已提交
3144

3145 3146 3147
				"#ifndef USE_ENVMAP",
					"vec4 mPosition = objectMatrix * vec4( position, 1.0 );",
				"#endif",
M
Mr.doob 已提交
3148

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

3151 3152
				"vec3 transformedNormal = normalize( normalMatrix * normal );",
				"vNormal = transformedNormal;",
3153

3154
				THREE.Snippets[ "lights_vertex" ],
M
Mr.doob 已提交
3155

3156
				"gl_Position = projectionMatrix * mvPosition;",
3157 3158 3159 3160

			"}"

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

3162 3163 3164 3165 3166 3167 3168 3169
	},
	
	'particle_basic': {

		uniforms: THREE.UniformsLib[ "particle" ],

		fragment_shader: [

A
alteredq 已提交
3170
			"uniform vec3 psColor;",
3171 3172
			"uniform float opacity;",

A
alteredq 已提交
3173
			THREE.Snippets[ "color_pars_fragment" ],
3174 3175 3176 3177 3178
			THREE.Snippets[ "map_particle_pars_fragment" ],
			THREE.Snippets[ "fog_pars_fragment" ],

			"void main() {",

A
alteredq 已提交
3179
				"gl_FragColor = vec4( psColor, opacity );",
3180 3181

				THREE.Snippets[ "map_particle_fragment" ],
A
alteredq 已提交
3182
				THREE.Snippets[ "color_fragment" ],
3183 3184 3185 3186 3187 3188 3189 3190 3191 3192
				THREE.Snippets[ "fog_fragment" ],

			"}"

		].join("\n"),

		vertex_shader: [

			"uniform float size;",
			
A
alteredq 已提交
3193 3194
			THREE.Snippets[ "color_pars_vertex" ],
			
3195 3196
			"void main() {",

A
alteredq 已提交
3197 3198
				THREE.Snippets[ "color_vertex" ],
				
3199 3200 3201 3202 3203 3204 3205 3206 3207 3208
				"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 已提交
3209
	}
3210
	
A
alteredq 已提交
3211

A
alteredq 已提交
3212
};