WebGLRenderer.js 72.8 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
	_projScreenMatrix = new THREE.Matrix4(),
30 31 32 33
	_projectionMatrixArray = new Float32Array( 16 ),
	
	_viewMatrixArray = new Float32Array( 16 ),	

34 35
	_vector3 = new THREE.Vector4(),
	
36
	// parameters defaults
M
Mr.doob 已提交
37

38 39 40
	antialias = true,
	clearColor = new THREE.Color( 0x000000 ),
	clearAlpha = 0;
41

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

44 45 46
		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 已提交
47

48
	}
M
Mr.doob 已提交
49

N
Nicolas Garcia Belmonte 已提交
50 51 52
	this.domElement = _canvas;
	this.autoClear = true;

53
	initGL( antialias, clearColor, clearAlpha );
M
Mr.doob 已提交
54

55 56
	this.context = _gl;

57
	//alert( dumpObject( getGLParams() ) );
M
Mr.doob 已提交
58

59
	this.lights = {
M
Mr.doob 已提交
60 61 62

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

65
	};
M
Mr.doob 已提交
66

N
Nicolas Garcia Belmonte 已提交
67 68 69 70 71 72 73 74
	this.setSize = function ( width, height ) {

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

	};

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

77 78
		var color = new THREE.Color( hex );
		_gl.clearColor( color.r, color.g, color.b, alpha );
79

80
	};
A
alteredq 已提交
81 82 83 84 85 86

	this.setClearColor = function( color, alpha ) {

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

	};
87

N
Nicolas Garcia Belmonte 已提交
88 89 90 91 92 93
	this.clear = function () {

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

	};

M
Mr.doob 已提交
94

95
	this.setupLights = function ( program, lights ) {
96

97
		var l, ll, light, r = 0, g = 0, b = 0,
98
			color, position, intensity,
M
Mr.doob 已提交
99

100
			zlights = this.lights,
M
Mr.doob 已提交
101

102 103
			dcolors    = zlights.directional.colors,
			dpositions = zlights.directional.positions,
104

105 106
			pcolors    = zlights.point.colors,
			ppositions = zlights.point.positions,
107

108
			dlength = 0,
109 110 111 112
			plength = 0,
		
			doffset = 0,
			poffset = 0;
M
Mr.doob 已提交
113

114
		for ( l = 0, ll = lights.length; l < ll; l++ ) {
115

116
			light = lights[ l ];
117 118 119
			color = light.color;
			position = light.position;
			intensity = light.intensity;
120 121 122

			if ( light instanceof THREE.AmbientLight ) {

123 124 125
				r += color.r;
				g += color.g;
				b += color.b;
M
Mr.doob 已提交
126

127
			} else if ( light instanceof THREE.DirectionalLight ) {
128

129 130 131 132 133
				doffset = dlength * 3;
				
				dcolors[ doffset ]     = color.r * intensity;
				dcolors[ doffset + 1 ] = color.g * intensity;
				dcolors[ doffset + 2 ] = color.b * intensity;
134

135 136 137
				dpositions[ doffset ]     = position.x;
				dpositions[ doffset + 1 ] = position.y;
				dpositions[ doffset + 2 ] = position.z;
138

139
				dlength += 1;
M
Mr.doob 已提交
140

141 142
			} else if( light instanceof THREE.PointLight ) {

143 144 145 146 147
				poffset = plength * 3;
				
				pcolors[ poffset ]     = color.r * intensity;
				pcolors[ poffset + 1 ] = color.g * intensity;
				pcolors[ poffset + 2 ] = color.b * intensity;
148

149 150 151
				ppositions[ poffset ]     = position.x;
				ppositions[ poffset + 1 ] = position.y;
				ppositions[ poffset + 2 ] = position.z;
M
Mr.doob 已提交
152

153
				plength += 1;
M
Mr.doob 已提交
154

155 156 157
			}

		}
158 159 160 161 162 163
		
		// 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 已提交
164

165 166
		zlights.point.length = plength;
		zlights.directional.length = dlength;
M
Mr.doob 已提交
167

168 169 170
		zlights.ambient[ 0 ] = r;
		zlights.ambient[ 1 ] = g;
		zlights.ambient[ 2 ] = b;
M
Mr.doob 已提交
171

172
	};
M
Mr.doob 已提交
173

174
	this.createParticleBuffers = function( geometry ) {
M
Mr.doob 已提交
175

176
		geometry.__webGLVertexBuffer = _gl.createBuffer();
177
		geometry.__webGLColorBuffer = _gl.createBuffer();
178
		geometry.__webGLParticleBuffer = _gl.createBuffer();
M
Mr.doob 已提交
179

180
	};
M
Mr.doob 已提交
181

182
	this.createLineBuffers = function( geometry ) {
M
Mr.doob 已提交
183

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

188
	};
189 190

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

192 193 194
		geometryChunk.__webGLVertexBuffer = _gl.createBuffer();
		geometryChunk.__webGLNormalBuffer = _gl.createBuffer();
		geometryChunk.__webGLTangentBuffer = _gl.createBuffer();
195
		geometryChunk.__webGLColorBuffer = _gl.createBuffer();
196
		geometryChunk.__webGLUVBuffer = _gl.createBuffer();
197
		geometryChunk.__webGLUV2Buffer = _gl.createBuffer();
198
		
199 200
		geometryChunk.__webGLFaceBuffer = _gl.createBuffer();
		geometryChunk.__webGLLineBuffer = _gl.createBuffer();
M
Mr.doob 已提交
201

202
	};
A
alteredq 已提交
203
	
204
	this.initLineBuffers = function( geometry ) {
M
Mr.doob 已提交
205

206 207 208
		var nvertices = geometry.vertices.length;

		geometry.__vertexArray = new Float32Array( nvertices * 3 );
209
		geometry.__colorArray = new Float32Array( nvertices * 3 );
210
		geometry.__lineArray = new Uint16Array( nvertices );
M
Mr.doob 已提交
211

212
		geometry.__webGLLineCount = nvertices;
M
Mr.doob 已提交
213

214
	};
M
Mr.doob 已提交
215

216 217 218 219 220
	this.initParticleBuffers = function( geometry ) {

		var nvertices = geometry.vertices.length;

		geometry.__vertexArray = new Float32Array( nvertices * 3 );
A
alteredq 已提交
221
		geometry.__colorArray = new Float32Array( nvertices * 3 );
222
		geometry.__particleArray = new Uint16Array( nvertices );
223 224
		
		geometry.__sortArray = [];
225 226 227 228 229

		geometry.__webGLParticleCount = nvertices;

	};

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

232
		var f, fl, nvertices = 0, ntris = 0, nlines = 0,
M
Mr.doob 已提交
233
			obj_faces = object.geometry.faces,
234
			chunk_faces = geometryChunk.faces;
M
Mr.doob 已提交
235

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

238 239
			fi = chunk_faces[ f ];
			face = obj_faces[ fi ];
M
Mr.doob 已提交
240

241
			if ( face instanceof THREE.Face3 ) {
M
Mr.doob 已提交
242

243 244 245
				nvertices += 3;
				ntris += 1;
				nlines += 3;
M
Mr.doob 已提交
246

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

249 250
				nvertices += 4;
				ntris += 2;
251
				nlines += 4;
M
Mr.doob 已提交
252

253
			}
M
Mr.doob 已提交
254

255
		}
M
Mr.doob 已提交
256

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

259 260 261
		geometryChunk.__vertexArray  = new Float32Array( nvertices * 3 );
		geometryChunk.__normalArray  = new Float32Array( nvertices * 3 );
		geometryChunk.__tangentArray = new Float32Array( nvertices * 4 );
262
		geometryChunk.__colorArray = new Float32Array( nvertices * 3 );
263
		geometryChunk.__uvArray = new Float32Array( nvertices * 2 );
264
		geometryChunk.__uv2Array = new Float32Array( nvertices * 2 );
M
Mr.doob 已提交
265

266 267
		geometryChunk.__faceArray = new Uint16Array( ntris * 3 );
		geometryChunk.__lineArray = new Uint16Array( nlines * 2 );
M
Mr.doob 已提交
268

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

271 272
		geometryChunk.__webGLFaceCount = ntris * 3;
		geometryChunk.__webGLLineCount = nlines * 2;
M
Mr.doob 已提交
273

274
	};
M
Mr.doob 已提交
275

276
	this.setMeshBuffers = function ( geometryChunk, object, hint ) {
277

278 279 280 281
		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,
282
			vn, uvi, uv2i,
M
Mr.doob 已提交
283

284
		vertexIndex = 0,
285

286 287
		offset = 0,
		offset_uv = 0,
288
		offset_uv2 = 0,
289 290 291 292
		offset_face = 0,
		offset_normal = 0,
		offset_tangent = 0,
		offset_line = 0,
293
		offset_color = 0,
M
Mr.doob 已提交
294

295 296
		vertexArray = geometryChunk.__vertexArray,
		uvArray = geometryChunk.__uvArray,
297
		uv2Array = geometryChunk.__uv2Array,
298 299
		normalArray = geometryChunk.__normalArray,
		tangentArray = geometryChunk.__tangentArray,
300
		colorArray = geometryChunk.__colorArray,
M
Mr.doob 已提交
301

302 303
		faceArray = geometryChunk.__faceArray,
		lineArray = geometryChunk.__lineArray,
M
Mr.doob 已提交
304

305
		needsSmoothNormals = geometryChunk.__needsSmoothNormals,
306 307 308 309 310 311 312 313
		
		geometry = object.geometry, // this is shared for all chunks
		
		dirtyVertices = geometry.__dirtyVertices,
		dirtyElements = geometry.__dirtyElements, 
		dirtyUvs = geometry.__dirtyUvs, 
		dirtyNormals = geometry.__dirtyNormals, 
		dirtyTangents = geometry.__dirtyTangents,
314
		dirtyColors = geometry.__dirtyColors,
M
Mr.doob 已提交
315

316 317 318
		vertices = geometry.vertices,
		chunk_faces = geometryChunk.faces,
		obj_faces = geometry.faces,
319
		obj_uvs = geometry.uvs,
320 321 322
		obj_uvs2 = geometry.uvs2,
		obj_colors = geometry.colors;
		
323
		for ( f = 0, fl = chunk_faces.length; f < fl; f++ ) {
M
Mr.doob 已提交
324

325 326 327
			fi = chunk_faces[ f ];
			face = obj_faces[ fi ];
			uv = obj_uvs[ fi ];
328
			uv2 = obj_uvs2[ fi ];
M
Mr.doob 已提交
329

330
			vertexNormals = face.vertexNormals;
331
			faceNormal = face.normal;
332 333 334

			if ( face instanceof THREE.Face3 ) {

335
				if ( dirtyVertices ) {
M
Mr.doob 已提交
336

337 338 339
					v1 = vertices[ face.a ].position;
					v2 = vertices[ face.b ].position;
					v3 = vertices[ face.c ].position;
M
Mr.doob 已提交
340

341 342 343
					vertexArray[ offset ]     = v1.x;
					vertexArray[ offset + 1 ] = v1.y;
					vertexArray[ offset + 2 ] = v1.z;
M
Mr.doob 已提交
344

345 346 347
					vertexArray[ offset + 3 ] = v2.x;
					vertexArray[ offset + 4 ] = v2.y;
					vertexArray[ offset + 5 ] = v2.z;
348

349 350 351
					vertexArray[ offset + 6 ] = v3.x;
					vertexArray[ offset + 7 ] = v3.y;
					vertexArray[ offset + 8 ] = v3.z;
M
Mr.doob 已提交
352

353
					offset += 9;
M
Mr.doob 已提交
354

355
				}
356

357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378
				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;

				}

379
				if ( dirtyTangents && geometry.hasTangents ) {
380

381 382 383
					t1 = vertices[ face.a ].tangent;
					t2 = vertices[ face.b ].tangent;
					t3 = vertices[ face.c ].tangent;
384

385 386 387 388
					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 已提交
389

390 391 392 393
					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 已提交
394

395 396 397 398
					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 已提交
399

400
					offset_tangent += 12;
M
Mr.doob 已提交
401

402 403
				}

404
				if( dirtyNormals ) {
M
Mr.doob 已提交
405

406 407 408
					if ( vertexNormals.length == 3 && needsSmoothNormals ) {

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

410
							vn = vertexNormals[ i ];
M
Mr.doob 已提交
411

412 413 414
							normalArray[ offset_normal ]     = vn.x;
							normalArray[ offset_normal + 1 ] = vn.y;
							normalArray[ offset_normal + 2 ] = vn.z;
M
Mr.doob 已提交
415

416
							offset_normal += 3;
M
Mr.doob 已提交
417

418
						}
M
Mr.doob 已提交
419

420
					} else {
421

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

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

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

430
						}
M
Mr.doob 已提交
431 432

					}
M
Mr.doob 已提交
433

434 435
				}

436
				if ( dirtyUvs && uv ) {
437

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

440
						uvi = uv[ i ];
M
Mr.doob 已提交
441

442 443
						uvArray[ offset_uv ]     = uvi.u;
						uvArray[ offset_uv + 1 ] = uvi.v;
M
Mr.doob 已提交
444

445
						offset_uv += 2;
M
Mr.doob 已提交
446

M
Mr.doob 已提交
447
					}
448 449 450

				}

451 452 453 454 455 456 457 458 459 460 461 462 463 464 465
				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;

					}

				}

466
				if( dirtyElements ) {
M
Mr.doob 已提交
467

468 469 470
					faceArray[ offset_face ] = vertexIndex;
					faceArray[ offset_face + 1 ] = vertexIndex + 1;
					faceArray[ offset_face + 2 ] = vertexIndex + 2;
M
Mr.doob 已提交
471

472
					offset_face += 3;
M
Mr.doob 已提交
473

474 475
					lineArray[ offset_line ]     = vertexIndex;
					lineArray[ offset_line + 1 ] = vertexIndex + 1;
M
Mr.doob 已提交
476

477 478
					lineArray[ offset_line + 2 ] = vertexIndex;
					lineArray[ offset_line + 3 ] = vertexIndex + 2;
M
Mr.doob 已提交
479

480 481
					lineArray[ offset_line + 4 ] = vertexIndex + 1;
					lineArray[ offset_line + 5 ] = vertexIndex + 2;
M
Mr.doob 已提交
482

483
					offset_line += 6;
484

485
					vertexIndex += 3;
M
Mr.doob 已提交
486

487
				}
M
Mr.doob 已提交
488

489 490 491

			} else if ( face instanceof THREE.Face4 ) {

492
				if ( dirtyVertices ) {
M
Mr.doob 已提交
493

494 495 496 497
					v1 = vertices[ face.a ].position;
					v2 = vertices[ face.b ].position;
					v3 = vertices[ face.c ].position;
					v4 = vertices[ face.d ].position;
M
Mr.doob 已提交
498

499 500 501
					vertexArray[ offset ]     = v1.x;
					vertexArray[ offset + 1 ] = v1.y;
					vertexArray[ offset + 2 ] = v1.z;
M
Mr.doob 已提交
502

503 504 505
					vertexArray[ offset + 3 ] = v2.x;
					vertexArray[ offset + 4 ] = v2.y;
					vertexArray[ offset + 5 ] = v2.z;
506

507 508 509
					vertexArray[ offset + 6 ] = v3.x;
					vertexArray[ offset + 7 ] = v3.y;
					vertexArray[ offset + 8 ] = v3.z;
510

511 512 513
					vertexArray[ offset + 9 ] = v4.x;
					vertexArray[ offset + 10 ] = v4.y;
					vertexArray[ offset + 11 ] = v4.z;
M
Mr.doob 已提交
514

515
					offset += 12;
M
Mr.doob 已提交
516

517
				}
518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536
				
				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;
537

538 539 540 541 542 543 544 545
					colorArray[ offset_color + 9 ]  = c4.r;
					colorArray[ offset_color + 10 ] = c4.g;
					colorArray[ offset_color + 11 ] = c4.b;
					
					offset_color += 12;

				}	
				
546
				if ( dirtyTangents && geometry.hasTangents ) {
547

548 549 550 551
					t1 = vertices[ face.a ].tangent;
					t2 = vertices[ face.b ].tangent;
					t3 = vertices[ face.c ].tangent;
					t4 = vertices[ face.d ].tangent;
552

553 554 555 556
					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 已提交
557

558 559 560 561
					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 已提交
562

563 564 565 566
					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 已提交
567

568 569 570 571
					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 已提交
572

573
					offset_tangent += 16;
M
Mr.doob 已提交
574

575
				}
M
Mr.doob 已提交
576

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

579
					if ( vertexNormals.length == 4 && needsSmoothNormals ) {
580

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

583
							vn = vertexNormals[ i ];
M
Mr.doob 已提交
584

585 586 587
							normalArray[ offset_normal ]     = vn.x;
							normalArray[ offset_normal + 1 ] = vn.y;
							normalArray[ offset_normal + 2 ] = vn.z;
M
Mr.doob 已提交
588

589
							offset_normal += 3;
M
Mr.doob 已提交
590

591
						}
M
Mr.doob 已提交
592

593
					} else {
594

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

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

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

603
						}
M
Mr.doob 已提交
604 605

					}
M
Mr.doob 已提交
606

607 608
				}

609
				if ( dirtyUvs && uv ) {
610

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

613
						uvi = uv[ i ];
M
Mr.doob 已提交
614

615 616
						uvArray[ offset_uv ]     = uvi.u;
						uvArray[ offset_uv + 1 ] = uvi.v;
M
Mr.doob 已提交
617

618
						offset_uv += 2;
M
Mr.doob 已提交
619

M
Mr.doob 已提交
620
					}
621 622

				}
623 624 625 626 627 628 629 630 631 632 633 634 635 636 637
				
				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 已提交
638

639
				if( dirtyElements ) {
M
Mr.doob 已提交
640

641 642 643
					faceArray[ offset_face ]     = vertexIndex;
					faceArray[ offset_face + 1 ] = vertexIndex + 1;
					faceArray[ offset_face + 2 ] = vertexIndex + 2;
M
Mr.doob 已提交
644

645 646 647
					faceArray[ offset_face + 3 ] = vertexIndex;
					faceArray[ offset_face + 4 ] = vertexIndex + 2;
					faceArray[ offset_face + 5 ] = vertexIndex + 3;
M
Mr.doob 已提交
648

649
					offset_face += 6;
M
Mr.doob 已提交
650

651 652
					lineArray[ offset_line ]     = vertexIndex;
					lineArray[ offset_line + 1 ] = vertexIndex + 1;
M
Mr.doob 已提交
653

654
					lineArray[ offset_line + 2 ] = vertexIndex;
655
					lineArray[ offset_line + 3 ] = vertexIndex + 3;
M
Mr.doob 已提交
656

657 658
					lineArray[ offset_line + 4 ] = vertexIndex + 1;
					lineArray[ offset_line + 5 ] = vertexIndex + 2;
M
Mr.doob 已提交
659

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

663
					offset_line += 8;
M
Mr.doob 已提交
664

665
					vertexIndex += 4;
M
Mr.doob 已提交
666

667
				}
M
Mr.doob 已提交
668

669
			}
M
Mr.doob 已提交
670

671 672
		}

673
		if ( dirtyVertices ) {
M
Mr.doob 已提交
674

675 676
			_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryChunk.__webGLVertexBuffer );
			_gl.bufferData( _gl.ARRAY_BUFFER, vertexArray, hint );
M
Mr.doob 已提交
677

678
		}
M
Mr.doob 已提交
679

680 681 682 683 684 685 686
		if ( dirtyColors && obj_colors.length ) {

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

		}
		
687
		if ( dirtyNormals ) {
M
Mr.doob 已提交
688

689 690
			_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryChunk.__webGLNormalBuffer );
			_gl.bufferData( _gl.ARRAY_BUFFER, normalArray, hint );
M
Mr.doob 已提交
691

692 693
		}

694
		if ( dirtyTangents && geometry.hasTangents ) {
695

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

699
		}
700

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

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

706
		}
M
Mr.doob 已提交
707

708 709 710 711 712 713 714
		if ( dirtyUvs && offset_uv2 > 0 ) {

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

		}

715
		if( dirtyElements ) {
M
Mr.doob 已提交
716

717 718
			_gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, geometryChunk.__webGLFaceBuffer );
			_gl.bufferData( _gl.ELEMENT_ARRAY_BUFFER, faceArray, hint );
719

720 721
			_gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, geometryChunk.__webGLLineBuffer );
			_gl.bufferData( _gl.ELEMENT_ARRAY_BUFFER, lineArray, hint );
M
Mr.doob 已提交
722

723
		}
724 725

	};
726

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

729
		var v, c, vertex, offset,
730
			vertices = geometry.vertices,
731
			colors = geometry.colors,
732
			vl = vertices.length,
733
			cl = colors.length,
M
Mr.doob 已提交
734 735

			vertexArray = geometry.__vertexArray,
736
			colorArray = geometry.__colorArray,
737 738 739
			lineArray = geometry.__lineArray,
		
			dirtyVertices = geometry.__dirtyVertices, 
740
			dirtyColors = geometry.__dirtyColors,
741
			dirtyElements = geometry.__dirtyElements;
M
Mr.doob 已提交
742

743
		if ( dirtyVertices ) {
M
Mr.doob 已提交
744

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

747
				vertex = vertices[ v ].position;
M
Mr.doob 已提交
748

749
				offset = v * 3;
M
Mr.doob 已提交
750

751 752 753
				vertexArray[ offset ]     = vertex.x;
				vertexArray[ offset + 1 ] = vertex.y;
				vertexArray[ offset + 2 ] = vertex.z;
M
Mr.doob 已提交
754

755 756
			}

A
alteredq 已提交
757 758 759
			_gl.bindBuffer( _gl.ARRAY_BUFFER, geometry.__webGLVertexBuffer );
			_gl.bufferData( _gl.ARRAY_BUFFER, vertexArray, hint );

760
		}
M
Mr.doob 已提交
761

762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780
		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 );

		}

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

784
		if ( dirtyElements ) {
M
Mr.doob 已提交
785

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

788
				lineArray[ v ] = v;
M
Mr.doob 已提交
789

790
			}
M
Mr.doob 已提交
791

A
alteredq 已提交
792 793
			_gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, geometry.__webGLLineBuffer );
			_gl.bufferData( _gl.ELEMENT_ARRAY_BUFFER, lineArray, hint );
M
Mr.doob 已提交
794

A
alteredq 已提交
795
		}
M
Mr.doob 已提交
796

797
	};
M
Mr.doob 已提交
798

799
	this.setParticleBuffers = function( geometry, hint, object, camera ) {
800

A
alteredq 已提交
801
		var v, c, vertex, offset,
802 803 804
			vertices = geometry.vertices,
			vl = vertices.length,

A
alteredq 已提交
805 806 807
			colors = geometry.colors,
			cl = colors.length,
		
808
			vertexArray = geometry.__vertexArray,
809
			particleArray = geometry.__particleArray,
A
alteredq 已提交
810
			colorArray = geometry.__colorArray,
811
		
812 813 814 815 816
			sortArray = geometry.__sortArray,
		
			dirtyVertices = geometry.__dirtyVertices,
			dirtyElements = geometry.__dirtyElements,
			dirtyColors = geometry.__dirtyColors;
817

818 819 820 821 822
		if ( object.sortParticles ) {
		
			_projScreenMatrix.multiply( camera.projectionMatrix, camera.matrix );
			_projScreenMatrix.multiplySelf( object.matrix );
			
823 824 825
			for ( v = 0; v < vl; v++ ) {

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

				}
876 877

			}
A
alteredq 已提交
878 879 880 881 882 883 884 885 886 887 888 889 890
			
			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;

891
				}
A
alteredq 已提交
892 893
				
			}
894 895

		}
896
		
A
alteredq 已提交
897
		
898 899 900
		// yeah, this is silly as order of element indices is currently fixed
		// though this could change if some use case arises
		// (like depth-sorting of semi-opaque particles)
901
		
902 903 904 905 906 907 908
		if ( dirtyElements ) {

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

				particleArray[ v ] = v;

			}
A
alteredq 已提交
909 910 911
			
			_gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, geometry.__webGLParticleBuffer );
			_gl.bufferData( _gl.ELEMENT_ARRAY_BUFFER, particleArray, hint );
912 913

		}
A
alteredq 已提交
914 915 916 917 918 919 920 921 922
		
		if ( dirtyVertices || object.sortParticles ) {
		
			_gl.bindBuffer( _gl.ARRAY_BUFFER, geometry.__webGLVertexBuffer );
			_gl.bufferData( _gl.ARRAY_BUFFER, vertexArray, hint );
			
		}
		
		if ( dirtyColors || object.sortParticles ) {
923
			
A
alteredq 已提交
924 925
			_gl.bindBuffer( _gl.ARRAY_BUFFER, geometry.__webGLColorBuffer );
			_gl.bufferData( _gl.ARRAY_BUFFER, colorArray, hint );
926
		
A
alteredq 已提交
927
		}
928
		
929
	};
M
Mr.doob 已提交
930

M
Mr.doob 已提交
931
	function setMaterialShaders( material, shaders ) {
932

M
Mr.doob 已提交
933 934
		material.fragment_shader = shaders.fragment_shader;
		material.vertex_shader = shaders.vertex_shader;
935
		material.uniforms = Uniforms.clone( shaders.uniforms );
936

M
Mr.doob 已提交
937
	};
938

939
	function refreshUniformsCommon( material, fog ) {
M
Mr.doob 已提交
940

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

944 945
		// pure color
		//material.uniforms.color.value.setHex( material.color.hex );
M
Mr.doob 已提交
946

947 948
		material.uniforms.opacity.value = material.opacity;
		material.uniforms.map.texture = material.map;
949 950
		
		material.uniforms.light_map.texture = material.light_map;
951

952 953 954 955 956
		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;
957

958 959 960
		if ( fog ) {

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

962
			if ( fog instanceof THREE.Fog ) {
963

964 965
				material.uniforms.fogNear.value = fog.near;
				material.uniforms.fogFar.value = fog.far;
966

967
			} else if ( fog instanceof THREE.FogExp2 ) {
968

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

971 972 973
			}

		}
974

975
	};
976 977

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

A
alteredq 已提交
979
		material.uniforms.diffuse.value.setRGB( material.color.r * material.opacity, material.color.g * material.opacity, material.color.b * material.opacity );
980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999
		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 已提交
1000

1001 1002
	function refreshUniformsParticle( material, fog ) {

A
alteredq 已提交
1003
		material.uniforms.psColor.value.setRGB( material.color.r * material.opacity, material.color.g * material.opacity, material.color.b * material.opacity );
1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026
		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;

			}

		}

	};

1027
	function refreshUniformsPhong( material ) {
M
Mr.doob 已提交
1028

1029 1030 1031 1032 1033
		//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 已提交
1034

1035
	};
M
Mr.doob 已提交
1036 1037


1038
	function refreshLights( material, lights ) {
M
Mr.doob 已提交
1039

1040
		material.uniforms.enableLighting.value = lights.directional.length + lights.point.length;
1041 1042 1043 1044 1045
		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 已提交
1046

A
alteredq 已提交
1047
	};
M
Mr.doob 已提交
1048

1049 1050
	this.initMaterial = function( material, lights, fog ) {
		
1051
		if ( !material.program ) {
M
Mr.doob 已提交
1052

1053 1054
			var u, identifiers, parameters, maxLightCount;
			
1055
			if ( material instanceof THREE.MeshDepthMaterial ) {
1056

1057
				setMaterialShaders( material, THREE.ShaderLib[ 'depth' ] );
1058

1059
			} else if ( material instanceof THREE.MeshNormalMaterial ) {
1060

1061
				setMaterialShaders( material, THREE.ShaderLib[ 'normal' ] );
1062

1063
			} else if ( material instanceof THREE.MeshBasicMaterial ) {
1064

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

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

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

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

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

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

1077 1078
				setMaterialShaders( material, THREE.ShaderLib[ 'basic' ] );

1079 1080 1081 1082
			} else if ( material instanceof THREE.ParticleBasicMaterial ) {
				
				setMaterialShaders( material, THREE.ShaderLib[ 'particle_basic' ] );
				
1083
			}
1084

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

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

A
alteredq 已提交
1090 1091
			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 };
1092
			material.program = buildProgram( material.fragment_shader, material.vertex_shader, parameters );
M
Mr.doob 已提交
1093

1094 1095
			identifiers = [ 'viewMatrix', 'modelViewMatrix', 'projectionMatrix', 'normalMatrix', 'objectMatrix', 'cameraPosition' ];
			for( u in material.uniforms ) {
1096

1097
				identifiers.push(u);
M
Mr.doob 已提交
1098

M
Mr.doob 已提交
1099
			}
M
Mr.doob 已提交
1100

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

M
Mr.doob 已提交
1104
		}
1105 1106 1107
		
	};
	
A
alteredq 已提交
1108 1109
	this.setProgram = function( camera, lights, fog, material, object ) {
		
1110
		this.initMaterial( material, lights, fog );
M
Mr.doob 已提交
1111

A
alteredq 已提交
1112
		var program = material.program;
1113

M
Mr.doob 已提交
1114
		if( program != _oldProgram ) {
M
Mr.doob 已提交
1115

M
Mr.doob 已提交
1116 1117
			_gl.useProgram( program );
			_oldProgram = program;
M
Mr.doob 已提交
1118

M
Mr.doob 已提交
1119
		}
M
Mr.doob 已提交
1120

1121
		this.loadCamera( program, camera );
1122
		this.loadMatrices( program, object );
M
Mr.doob 已提交
1123

M
Mr.doob 已提交
1124
		if ( material instanceof THREE.MeshPhongMaterial ||
1125
			 material instanceof THREE.MeshLambertMaterial ) {
1126

1127 1128
			this.setupLights( program, lights );
			refreshLights( material, this.lights );
M
Mr.doob 已提交
1129 1130 1131

		}

1132 1133 1134
		if ( material instanceof THREE.MeshBasicMaterial ||
			 material instanceof THREE.MeshLambertMaterial ||
			 material instanceof THREE.MeshPhongMaterial ) {
M
Mr.doob 已提交
1135

1136
			refreshUniformsCommon( material, fog );
M
Mr.doob 已提交
1137

A
alteredq 已提交
1138
		}
M
Mr.doob 已提交
1139

1140
		if ( material instanceof THREE.LineBasicMaterial ) {
M
Mr.doob 已提交
1141

1142
			refreshUniformsLine( material, fog );
1143 1144 1145 1146 1147 1148 1149
			
		}

		if ( material instanceof THREE.ParticleBasicMaterial ) {

			refreshUniformsParticle( material, fog );
			
1150
		}
M
Mr.doob 已提交
1151

M
Mr.doob 已提交
1152
		if ( material instanceof THREE.MeshPhongMaterial ) {
M
Mr.doob 已提交
1153

1154
			refreshUniformsPhong( material );
M
Mr.doob 已提交
1155

1156
		}
M
Mr.doob 已提交
1157

1158 1159 1160 1161
		if ( material instanceof THREE.MeshDepthMaterial ) {

			material.uniforms.mNear.value = camera.near;
			material.uniforms.mFar.value = camera.far;
1162
			material.uniforms.opacity.value = material.opacity;
1163
			
1164
		}
1165 1166 1167 1168 1169 1170 1171

		if ( material instanceof THREE.MeshNormalMaterial ) {

			material.uniforms.opacity.value = material.opacity;
			
		}
		
1172
		setUniforms( program, material.uniforms );
1173

A
alteredq 已提交
1174 1175 1176 1177 1178 1179 1180 1181 1182 1183
		return program;
		
	};
	
	this.renderBuffer = function ( camera, lights, fog, material, geometryChunk, object ) {

		var program, attributes, linewidth, primitives;

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

1186
		// vertices
M
Mr.doob 已提交
1187

M
Mr.doob 已提交
1188
		_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryChunk.__webGLVertexBuffer );
1189
		_gl.vertexAttribPointer( attributes.position, 3, _gl.FLOAT, false, 0, 0 );
1190
		_gl.enableVertexAttribArray( attributes.position );
1191

A
alteredq 已提交
1192 1193 1194 1195 1196 1197 1198 1199 1200 1201
		// 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 );

		}

1202
		// normals
M
Mr.doob 已提交
1203

1204
		if ( attributes.normal >= 0 ) {
1205

1206 1207
			_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryChunk.__webGLNormalBuffer );
			_gl.vertexAttribPointer( attributes.normal, 3, _gl.FLOAT, false, 0, 0 );
1208
			_gl.enableVertexAttribArray( attributes.normal );
1209

1210
		}
1211

1212 1213 1214
		// tangents

		if ( attributes.tangent >= 0 ) {
1215

1216 1217
			_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryChunk.__webGLTangentBuffer );
			_gl.vertexAttribPointer( attributes.tangent, 4, _gl.FLOAT, false, 0, 0 );
1218
			_gl.enableVertexAttribArray( attributes.tangent );
1219

1220
		}
1221

1222
		// uvs
M
Mr.doob 已提交
1223

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

1226
			if ( geometryChunk.__webGLUVBuffer ) {
1227

1228
				_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryChunk.__webGLUVBuffer );
1229
				_gl.vertexAttribPointer( attributes.uv, 2, _gl.FLOAT, false, 0, 0 );
1230

1231
				_gl.enableVertexAttribArray( attributes.uv );
1232

1233
			} else {
1234

1235
				_gl.disableVertexAttribArray( attributes.uv );
M
Mr.doob 已提交
1236

1237
			}
1238 1239 1240

		}

1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257
		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 );

			}

		}

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

1260
		if ( material.wireframe || material instanceof THREE.LineBasicMaterial ) {
1261

M
Mr.doob 已提交
1262
			linewidth = material.wireframe_linewidth !== undefined ? material.wireframe_linewidth :
1263
						material.linewidth !== undefined ? material.linewidth : 1;
M
Mr.doob 已提交
1264

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

1267 1268
			_gl.lineWidth( linewidth );
			_gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, geometryChunk.__webGLLineBuffer );
1269
			_gl.drawElements( primitives, geometryChunk.__webGLLineCount, _gl.UNSIGNED_SHORT, 0 );
1270

1271
		// render particles
M
Mr.doob 已提交
1272

1273 1274 1275 1276
		} else if ( material instanceof THREE.ParticleBasicMaterial ) {

			_gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, geometryChunk.__webGLParticleBuffer );
			_gl.drawElements( _gl.POINTS, geometryChunk.__webGLParticleCount, _gl.UNSIGNED_SHORT, 0 );			
1277

1278 1279 1280 1281
		// render triangles
			
		} else {
			
1282 1283
			_gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, geometryChunk.__webGLFaceBuffer );
			_gl.drawElements( _gl.TRIANGLES, geometryChunk.__webGLFaceCount, _gl.UNSIGNED_SHORT, 0 );
1284
			
1285 1286 1287 1288
		}

	};

A
alteredq 已提交
1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317
	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 已提交
1318
	this.renderPass = function ( camera, lights, fog, object, geometryChunk, blending, transparent ) {
M
Mr.doob 已提交
1319

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

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

M
Mr.doob 已提交
1324
			meshMaterial = object.materials[ m ];
1325

M
Mr.doob 已提交
1326
			if ( meshMaterial instanceof THREE.MeshFaceMaterial ) {
1327

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

					material = geometryChunk.materials[ i ];
1331

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
					}

M
Mr.doob 已提交
1341
				}
1342

M
Mr.doob 已提交
1343
			} else {
1344

M
Mr.doob 已提交
1345
				material = meshMaterial;
1346
				if ( material && material.blending == blending && ( material.opacity < 1.0 == transparent ) ) {
M
Mr.doob 已提交
1347

M
Mr.doob 已提交
1348
					this.setBlending( material.blending );
1349 1350
					this.setDepthTest( material.depth_test );
					
1351
					this.renderBuffer( camera, lights, fog, material, geometryChunk, object );
M
Mr.doob 已提交
1352

1353 1354 1355
				}

			}
1356 1357

		}
M
Mr.doob 已提交
1358

1359
	};
M
Mr.doob 已提交
1360

A
alteredq 已提交
1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371
	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 );
1372 1373
				this.setDepthTest( material.depth_test );
				
A
alteredq 已提交
1374 1375 1376 1377 1378 1379 1380 1381 1382 1383
				program = this.setProgram( camera, lights, fog, material, object );
				
				object.render( function( object ) { renderBufferImmediate( object, program ); } );

			}

		}

	};
	
1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408
	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 );

			}

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

1411
		var o, ol, oil, webGLObject, object, buffer,
A
alteredq 已提交
1412
			lights = scene.lights,
1413 1414 1415 1416 1417 1418 1419
			fog = scene.fog,
			ol;

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

1421
		this.initWebGLObjects( scene, camera );
M
Mr.doob 已提交
1422

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

1425
		if ( this.autoClear ) {
M
Mr.doob 已提交
1426

1427
			this.clear();
M
Mr.doob 已提交
1428

1429 1430
		}

1431 1432 1433
		// set matrices and faces
		
		ol = scene.__webGLObjects.length;
A
alteredq 已提交
1434
	
1435
		for ( o = 0; o < ol; o++ ) {
M
Mr.doob 已提交
1436

M
Mr.doob 已提交
1437
			webGLObject = scene.__webGLObjects[ o ];
M
Mr.doob 已提交
1438

M
Mr.doob 已提交
1439 1440
			object = webGLObject.object;
			buffer = webGLObject.buffer;
M
Mr.doob 已提交
1441

M
Mr.doob 已提交
1442
			if ( object.visible ) {
1443
				
1444
				object.autoUpdateMatrix && object.updateMatrix();
1445
				this.setupMatrices( object, camera );
1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460
			
			}
		
		}
		
		oil = scene.__webGLObjectsImmediate.length;
		
		for ( o = 0; o < oil; o++ ) {
			
			webGLObject = scene.__webGLObjectsImmediate[ o ];
			object = webGLObject.object;
			
			if ( object.visible ) {
			
				object.autoUpdateMatrix && object.updateMatrix();
1461
				this.setupMatrices( object, camera );
1462 1463
			
			}
A
alteredq 已提交
1464
		
1465
		}
A
alteredq 已提交
1466

1467 1468 1469
		// opaque pass

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

1471 1472 1473 1474 1475 1476
			webGLObject = scene.__webGLObjects[ o ];

			object = webGLObject.object;
			buffer = webGLObject.buffer;

			if ( object.visible ) {
1477 1478
				
				setObjectFaces( object );
1479 1480 1481 1482 1483 1484
				this.renderPass( camera, lights, fog, object, buffer, THREE.NormalBlending, false );

			}

		}

A
alteredq 已提交
1485 1486 1487 1488 1489 1490 1491 1492 1493
		// opaque pass (immediate simulator)
		
		for ( o = 0; o < scene.__webGLObjectsImmediate.length; o++ ) {
			
			webGLObject = scene.__webGLObjectsImmediate[ o ];
			object = webGLObject.object;
			
			if ( object.visible ) {
			
1494
				setObjectFaces( object );
A
alteredq 已提交
1495 1496 1497 1498 1499 1500
				this.renderPassImmediate( camera, lights, fog, object, THREE.NormalBlending, false );
			
			}
			
		}

1501 1502
		// transparent pass

1503
		for ( o = 0; o < ol; o++ ) {
1504 1505 1506 1507 1508 1509 1510 1511

			webGLObject = scene.__webGLObjects[ o ];

			object = webGLObject.object;
			buffer = webGLObject.buffer;

			if ( object.visible ) {

1512 1513
				setObjectFaces( object );
				
1514
				// opaque blended materials
M
Mr.doob 已提交
1515

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

1519
				// transparent blended materials
M
Mr.doob 已提交
1520

A
alteredq 已提交
1521 1522
				this.renderPass( camera, lights, fog, object, buffer, THREE.AdditiveBlending, true );
				this.renderPass( camera, lights, fog, object, buffer, THREE.SubtractiveBlending, true );
1523

1524
				// transparent normal materials
M
Mr.doob 已提交
1525

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

1528 1529 1530 1531
				// billboard materials

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

1532
			}
M
Mr.doob 已提交
1533

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

1536 1537 1538 1539 1540 1541 1542 1543 1544
		// transparent pass (immediate simulator)
		
		for ( o = 0; o < scene.__webGLObjectsImmediate.length; o++ ) {
			
			webGLObject = scene.__webGLObjectsImmediate[ o ];
			object = webGLObject.object;
			
			if ( object.visible ) {
			
1545
				setObjectFaces( object );
1546 1547 1548 1549 1550 1551 1552
				
				this.renderPassImmediate( camera, lights, fog, object, THREE.NormalBlending, true );
			
			}
			
		}
		
1553
		// Generate mipmap if we're using any kind of mipmap filtering
M
Mr.doob 已提交
1554

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

1557
			updateRenderTargetMipmap( renderTarget );
M
Mr.doob 已提交
1558

1559
		}
1560

M
Mr.doob 已提交
1561
	};
M
Mr.doob 已提交
1562

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

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

1567 1568 1569 1570 1571 1572
			if ( objmap[ id ] == undefined ) {

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

			}
M
Mr.doob 已提交
1573

1574
		};
M
Mr.doob 已提交
1575

A
alteredq 已提交
1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586
		function add_buffer_immediate( objmap, id, object ) {

			if ( objmap[ id ] == undefined ) {

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

			}

		};

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

M
Mr.doob 已提交
1589
		if ( !scene.__webGLObjects ) {
M
Mr.doob 已提交
1590

M
Mr.doob 已提交
1591
			scene.__webGLObjects = [];
M
Mr.doob 已提交
1592
			scene.__webGLObjectsMap = {};
M
Mr.doob 已提交
1593

A
alteredq 已提交
1594 1595
			scene.__webGLObjectsImmediate = [];

M
Mr.doob 已提交
1596
		}
M
Mr.doob 已提交
1597

1598 1599 1600
		for ( o = 0, ol = scene.objects.length; o < ol; o++ ) {

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

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

1605
				scene.__webGLObjectsMap[ object.id ] = {};
1606 1607 1608 1609 1610 1611
					
				object._modelViewMatrix = new THREE.Matrix4();
				
				object._normalMatrixArray = new Float32Array( 9 );
				object._modelViewMatrixArray = new Float32Array( 16 );	
				object._objectMatrixArray = new Float32Array( 16 );
M
Mr.doob 已提交
1612

1613
			}
1614

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

1617
			if ( object instanceof THREE.Mesh ) {
M
Mr.doob 已提交
1618

M
Mr.doob 已提交
1619
				// create separate VBOs per geometry chunk
M
Mr.doob 已提交
1620

1621
				for ( g in geometry.geometryChunks ) {
M
Mr.doob 已提交
1622

1623
					geometryChunk = geometry.geometryChunks[ g ];
M
Mr.doob 已提交
1624

M
Mr.doob 已提交
1625
					// initialise VBO on the first access
M
Mr.doob 已提交
1626

M
Mr.doob 已提交
1627
					if( ! geometryChunk.__webGLVertexBuffer ) {
M
Mr.doob 已提交
1628

1629 1630
						this.createMeshBuffers( geometryChunk );
						this.initMeshBuffers( geometryChunk, object );
M
Mr.doob 已提交
1631

1632 1633 1634 1635 1636
						geometry.__dirtyVertices = true;
						geometry.__dirtyElements = true;
						geometry.__dirtyUvs = true;
						geometry.__dirtyNormals = true;
						geometry.__dirtyTangents = true;
1637
						geometry.__dirtyColors = true;
1638 1639 1640

					}

1641 1642 1643
					if( geometry.__dirtyVertices || geometry.__dirtyElements || 
						geometry.__dirtyUvs || geometry.__dirtyNormals || 
						geometry.__dirtyColors || geometry.__dirtyTangents ) {
1644

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

M
Mr.doob 已提交
1647
					}
M
Mr.doob 已提交
1648

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

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

M
Mr.doob 已提交
1653
				}
1654

1655 1656 1657 1658 1659
				geometry.__dirtyVertices = false;
				geometry.__dirtyElements = false;
				geometry.__dirtyUvs = false;
				geometry.__dirtyNormals = false;
				geometry.__dirtyTangents = false;
1660
				geometry.__dirtyColors = false;
1661

1662
			} else if ( object instanceof THREE.Line ) {
M
Mr.doob 已提交
1663 1664


1665
				if( ! geometry.__webGLVertexBuffer ) {
M
Mr.doob 已提交
1666

1667 1668
					this.createLineBuffers( geometry );
					this.initLineBuffers( geometry );
M
Mr.doob 已提交
1669

1670 1671
					geometry.__dirtyVertices = true;
					geometry.__dirtyElements = true;
1672
					geometry.__dirtyColors = true;
M
Mr.doob 已提交
1673

1674
				}
M
Mr.doob 已提交
1675

1676
				if( geometry.__dirtyVertices ||  geometry.__dirtyColors ) {
M
Mr.doob 已提交
1677

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

1680
				}
M
Mr.doob 已提交
1681

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

1684 1685
				geometry.__dirtyVertices = false;
				geometry.__dirtyElements = false;
1686
				geometry.__dirtyColors = false;
1687

1688
			} else if ( object instanceof THREE.ParticleSystem ) {
1689

1690
				if( ! geometry.__webGLVertexBuffer ) {
M
Mr.doob 已提交
1691

1692
					this.createParticleBuffers( geometry );
1693 1694 1695
					this.initParticleBuffers( geometry );

					geometry.__dirtyVertices = true;
1696
					geometry.__dirtyColors = true;
1697 1698 1699 1700
					geometry.__dirtyElements = true;
					
				}

1701
				if( geometry.__dirtyVertices || geometry.__dirtyColors || object.sortParticles ) {
1702

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

1705
				}
M
Mr.doob 已提交
1706

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

1709
				geometry.__dirtyVertices = false;
1710
				geometry.__dirtyColors = false;
1711 1712
				geometry.__dirtyElements = false;

M
Mr.doob 已提交
1713

A
alteredq 已提交
1714 1715 1716 1717
			} else if ( object instanceof THREE.MarchingCubes ) {
				
				add_buffer_immediate( objmap, 0, object );
				
1718
			}/*else if ( object instanceof THREE.Particle ) {
M
Mr.doob 已提交
1719 1720 1721

			}*/

M
Mr.doob 已提交
1722
		}
1723 1724 1725 1726 1727 1728

	};

	this.removeObject = function ( scene, object ) {

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

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

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

1734
			if ( object == zobject ) {
1735 1736 1737 1738

				scene.__webGLObjects.splice( o, 1 );

			}
M
Mr.doob 已提交
1739

1740
		}
M
Mr.doob 已提交
1741

M
Mr.doob 已提交
1742
	};
M
Mr.doob 已提交
1743

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

1746 1747
		object._modelViewMatrix.multiply( camera.matrix, object.matrix );
		object._modelViewMatrixArray.set( object._modelViewMatrix.flatten() );
1748

1749 1750
		object._normalMatrix = THREE.Matrix4.makeInvert3x3( object._modelViewMatrix ).transpose();
		object._normalMatrixArray.set( object._normalMatrix.m );
1751

1752
		object._objectMatrixArray.set( object.matrix.flatten() );
M
Mr.doob 已提交
1753

M
Mr.doob 已提交
1754
	};
M
Mr.doob 已提交
1755

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

M
Mr.doob 已提交
1758 1759
		_gl.uniformMatrix4fv( program.uniforms.viewMatrix, false, _viewMatrixArray );
		_gl.uniformMatrix4fv( program.uniforms.projectionMatrix, false, _projectionMatrixArray );
1760 1761 1762 1763
		
		_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 已提交
1764

M
Mr.doob 已提交
1765
	};
1766

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

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

M
Mr.doob 已提交
1771
	};
M
Mr.doob 已提交
1772

1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786
	this.setDepthTest = function( test ) {
		
		if( test ) {
			
			_gl.enable( _gl.DEPTH_TEST );
			
		} else {
			
			_gl.disable( _gl.DEPTH_TEST );
			
		}
		
	};
	
M
Mr.doob 已提交
1787
	this.setBlending = function( blending ) {
M
Mr.doob 已提交
1788

M
Mr.doob 已提交
1789
		switch ( blending ) {
1790

M
Mr.doob 已提交
1791
			case THREE.AdditiveBlending:
1792

M
Mr.doob 已提交
1793 1794
				_gl.blendEquation( _gl.FUNC_ADD );
				_gl.blendFunc( _gl.ONE, _gl.ONE );
M
Mr.doob 已提交
1795

M
Mr.doob 已提交
1796
				break;
1797

M
Mr.doob 已提交
1798
			case THREE.SubtractiveBlending:
1799

M
Mr.doob 已提交
1800 1801
				//_gl.blendEquation( _gl.FUNC_SUBTRACT );
				_gl.blendFunc( _gl.DST_COLOR, _gl.ZERO );
M
Mr.doob 已提交
1802

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

1805 1806 1807 1808 1809 1810 1811
			case THREE.BillboardBlending:

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

				break;

M
Mr.doob 已提交
1812
			default:
M
Mr.doob 已提交
1813

M
Mr.doob 已提交
1814 1815
				_gl.blendEquation( _gl.FUNC_ADD );
				_gl.blendFunc( _gl.ONE, _gl.ONE_MINUS_SRC_ALPHA );
M
Mr.doob 已提交
1816

M
Mr.doob 已提交
1817
				break;
1818
		
N
Nicolas Garcia Belmonte 已提交
1819
		}
M
Mr.doob 已提交
1820

N
Nicolas Garcia Belmonte 已提交
1821
	};
M
Mr.doob 已提交
1822

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

1825
		if ( cullFace ) {
M
Mr.doob 已提交
1826

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

1829
				_gl.frontFace( _gl.CCW );
M
Mr.doob 已提交
1830

1831
			} else {
M
Mr.doob 已提交
1832

1833
				_gl.frontFace( _gl.CW );
M
Mr.doob 已提交
1834

1835
			}
M
Mr.doob 已提交
1836

1837
			if( cullFace == "back" ) {
M
Mr.doob 已提交
1838

1839
				_gl.cullFace( _gl.BACK );
M
Mr.doob 已提交
1840

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

1843
				_gl.cullFace( _gl.FRONT );
M
Mr.doob 已提交
1844

1845
			} else {
M
Mr.doob 已提交
1846

1847
				_gl.cullFace( _gl.FRONT_AND_BACK );
M
Mr.doob 已提交
1848

1849
			}
M
Mr.doob 已提交
1850

1851
			_gl.enable( _gl.CULL_FACE );
M
Mr.doob 已提交
1852

1853
		} else {
M
Mr.doob 已提交
1854

1855
			_gl.disable( _gl.CULL_FACE );
M
Mr.doob 已提交
1856

1857 1858 1859
		}

	};
N
Nicolas Garcia Belmonte 已提交
1860

1861
	this.supportsVertexTextures = function() {
1862

1863
		return maxVertexTextures() > 0;
1864

1865
	};
1866

1867
	function maxVertexTextures() {
1868

1869 1870 1871
		return _gl.getParameter( _gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS );

	};
1872

1873
	function initGL( antialias, clearColor, clearAlpha ) {
N
Nicolas Garcia Belmonte 已提交
1874 1875 1876

		try {

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

A
alteredq 已提交
1879
		} catch(e) { console.log(e) }
N
Nicolas Garcia Belmonte 已提交
1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893

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

1894 1895
		_gl.frontFace( _gl.CCW );
		_gl.cullFace( _gl.BACK );
1896
		_gl.enable( _gl.CULL_FACE );
M
Mr.doob 已提交
1897

N
Nicolas Garcia Belmonte 已提交
1898
		_gl.enable( _gl.BLEND );
1899
		_gl.blendFunc( _gl.ONE, _gl.ONE_MINUS_SRC_ALPHA );
1900
		_gl.clearColor( clearColor.r, clearColor.g, clearColor.b, clearAlpha );
N
Nicolas Garcia Belmonte 已提交
1901

1902
	};
M
Mr.doob 已提交
1903

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

M
Mr.doob 已提交
1906
		var program = _gl.createProgram(),
M
Mr.doob 已提交
1907

M
Mr.doob 已提交
1908 1909 1910 1911
		prefix_fragment = [
			"#ifdef GL_ES",
			"precision highp float;",
			"#endif",
M
Mr.doob 已提交
1912

1913 1914
			"#define MAX_DIR_LIGHTS " + parameters.maxDirLights,
			"#define MAX_POINT_LIGHTS " + parameters.maxPointLights,
A
alteredq 已提交
1915

1916 1917
			parameters.fog ? "#define USE_FOG" : "",
			parameters.fog instanceof THREE.FogExp2 ? "#define FOG_EXP2" : "",
1918

1919 1920
			parameters.map ? "#define USE_MAP" : "",
			parameters.env_map ? "#define USE_ENVMAP" : "",
1921
			parameters.light_map ? "#define USE_LIGHTMAP" : "",
A
alteredq 已提交
1922
			parameters.vertex_colors ? "#define USE_COLOR" : "",
1923

1924
			"uniform mat4 viewMatrix;",
1925
			"uniform vec3 cameraPosition;",
M
Mr.doob 已提交
1926 1927
			""
		].join("\n"),
1928

M
Mr.doob 已提交
1929
		prefix_vertex = [
1930
			maxVertexTextures() > 0 ? "#define VERTEX_TEXTURES" : "",
1931

1932 1933 1934
			"#define MAX_DIR_LIGHTS " + parameters.maxDirLights,
			"#define MAX_POINT_LIGHTS " + parameters.maxPointLights,

1935 1936
			parameters.map ? "#define USE_MAP" : "",
			parameters.env_map ? "#define USE_ENVMAP" : "",
1937
			parameters.light_map ? "#define USE_LIGHTMAP" : "",
A
alteredq 已提交
1938
			parameters.vertex_colors ? "#define USE_COLOR" : "",
1939

M
Mr.doob 已提交
1940 1941 1942
			"uniform mat4 objectMatrix;",
			"uniform mat4 modelViewMatrix;",
			"uniform mat4 projectionMatrix;",
1943 1944
			"uniform mat4 viewMatrix;",
			"uniform mat3 normalMatrix;",
M
Mr.doob 已提交
1945
			"uniform vec3 cameraPosition;",
M
Mr.doob 已提交
1946 1947
			"attribute vec3 position;",
			"attribute vec3 normal;",
A
alteredq 已提交
1948
			"attribute vec3 color;",
M
Mr.doob 已提交
1949
			"attribute vec2 uv;",
1950
			"attribute vec2 uv2;",
M
Mr.doob 已提交
1951 1952
			""
		].join("\n");
1953

M
Mr.doob 已提交
1954 1955
		_gl.attachShader( program, getShader( "fragment", prefix_fragment + fragment_shader ) );
		_gl.attachShader( program, getShader( "vertex", prefix_vertex + vertex_shader ) );
M
Mr.doob 已提交
1956

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

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

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

1964 1965
			//console.log( prefix_fragment + fragment_shader );
			//console.log( prefix_vertex + vertex_shader );
M
Mr.doob 已提交
1966

N
Nicolas Garcia Belmonte 已提交
1967
		}
1968 1969 1970
		
		//console.log( prefix_fragment + fragment_shader );
		//console.log( prefix_vertex + vertex_shader );
M
Mr.doob 已提交
1971

M
Mr.doob 已提交
1972
		program.uniforms = {};
1973
		program.attributes = {};
M
Mr.doob 已提交
1974

M
Mr.doob 已提交
1975
		return program;
M
Mr.doob 已提交
1976

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

M
Mr.doob 已提交
1979
	function setUniforms( program, uniforms ) {
M
Mr.doob 已提交
1980

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

M
Mr.doob 已提交
1983
		for( u in uniforms ) {
M
Mr.doob 已提交
1984

1985 1986
			location = program.uniforms[u];
			if ( !location ) continue;
M
Mr.doob 已提交
1987

1988
			uniform = uniforms[u];
M
Mr.doob 已提交
1989

1990 1991
			type = uniform.type;
			value = uniform.value;
M
Mr.doob 已提交
1992

M
Mr.doob 已提交
1993
			if( type == "i" ) {
M
Mr.doob 已提交
1994

M
Mr.doob 已提交
1995
				_gl.uniform1i( location, value );
M
Mr.doob 已提交
1996

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

M
Mr.doob 已提交
1999
				_gl.uniform1f( location, value );
2000

A
alteredq 已提交
2001 2002 2003
			} else if( type == "fv1" ) {

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

2005 2006 2007 2008
			} else if( type == "fv" ) {

				_gl.uniform3fv( location, value );

2009 2010 2011 2012
			} else if( type == "v2" ) {

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

2013 2014 2015
			} else if( type == "v3" ) {

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

2017 2018 2019
			} else if( type == "c" ) {

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

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

M
Mr.doob 已提交
2023
				_gl.uniform1i( location, value );
M
Mr.doob 已提交
2024

2025
				texture = uniform.texture;
M
Mr.doob 已提交
2026

2027
				if ( !texture ) continue;
M
Mr.doob 已提交
2028

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

2031
					setCubeTexture( texture, value );
M
Mr.doob 已提交
2032

2033
				} else {
M
Mr.doob 已提交
2034

2035
					setTexture( texture, value );
M
Mr.doob 已提交
2036

2037
				}
M
Mr.doob 已提交
2038

2039
			}
M
Mr.doob 已提交
2040

2041
		}
M
Mr.doob 已提交
2042

2043
	};
M
Mr.doob 已提交
2044

2045
	function setCubeTexture( texture, slot ) {
M
Mr.doob 已提交
2046

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

2049 2050
			if ( !texture.image.__webGLTextureCube &&
				 !texture.image.__cubeMapInitialized && texture.image.loadCount == 6 ) {
M
Mr.doob 已提交
2051

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

2054
				_gl.bindTexture( _gl.TEXTURE_CUBE_MAP, texture.image.__webGLTextureCube );
2055

2056 2057
				_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 已提交
2058

2059 2060
				_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 已提交
2061

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

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

2066
				}
M
Mr.doob 已提交
2067

2068
				_gl.generateMipmap( _gl.TEXTURE_CUBE_MAP );
2069

2070
				_gl.bindTexture( _gl.TEXTURE_CUBE_MAP, null );
M
Mr.doob 已提交
2071

2072
				texture.image.__cubeMapInitialized = true;
M
Mr.doob 已提交
2073

M
Mr.doob 已提交
2074
			}
2075 2076 2077

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

2079
		}
M
Mr.doob 已提交
2080

M
Mr.doob 已提交
2081
	};
M
Mr.doob 已提交
2082

2083
	function setTexture( texture, slot ) {
M
Mr.doob 已提交
2084

2085 2086 2087 2088 2089
		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 已提交
2090

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

			_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 ) );
2096 2097 2098 2099 2100 2101 2102
			_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 已提交
2103

2104
	};
M
Mr.doob 已提交
2105

A
alteredq 已提交
2106
	function setRenderTarget( renderTexture, clear ) {
2107 2108

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

2110 2111 2112 2113 2114
			renderTexture.__webGLFramebuffer = _gl.createFramebuffer();
			renderTexture.__webGLRenderbuffer = _gl.createRenderbuffer();
			renderTexture.__webGLTexture = _gl.createTexture();

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

2116 2117 2118 2119
			_gl.bindRenderbuffer( _gl.RENDERBUFFER, renderTexture.__webGLRenderbuffer );
			_gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_COMPONENT16, renderTexture.width, renderTexture.height );

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

2121 2122 2123 2124 2125
			_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 ) );
2126
			_gl.texImage2D( _gl.TEXTURE_2D, 0, paramThreeToGL( renderTexture.format ), renderTexture.width, renderTexture.height, 0, paramThreeToGL( renderTexture.format ), paramThreeToGL( renderTexture.type ), null );
2127 2128

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

2130 2131
			_gl.bindFramebuffer( _gl.FRAMEBUFFER, renderTexture.__webGLFramebuffer );
			_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D, renderTexture.__webGLTexture, 0 );
2132
			_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.RENDERBUFFER, renderTexture.__webGLRenderbuffer );
2133 2134

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

2136 2137 2138
			_gl.bindTexture( _gl.TEXTURE_2D, null );
			_gl.bindRenderbuffer( _gl.RENDERBUFFER, null );
			_gl.bindFramebuffer( _gl.FRAMEBUFFER, null);
M
Mr.doob 已提交
2139

2140 2141
		}

2142
		var framebuffer, width, height;
M
Mr.doob 已提交
2143

2144
		if ( renderTexture ) {
M
Mr.doob 已提交
2145

2146 2147 2148
			framebuffer = renderTexture.__webGLFramebuffer;
			width = renderTexture.width;
			height = renderTexture.height;
M
Mr.doob 已提交
2149

2150
		} else {
M
Mr.doob 已提交
2151

2152 2153 2154
			framebuffer = null;
			width = _canvas.width;
			height = _canvas.height;
M
Mr.doob 已提交
2155

2156
		}
M
Mr.doob 已提交
2157

2158
		if( framebuffer != _oldFramebuffer ) {
M
Mr.doob 已提交
2159

2160 2161
			_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );
			_gl.viewport( 0, 0, width, height );
M
Mr.doob 已提交
2162

A
alteredq 已提交
2163
			if ( clear ) {
M
Mr.doob 已提交
2164

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

A
alteredq 已提交
2167
			}
M
Mr.doob 已提交
2168

2169
			_oldFramebuffer = framebuffer;
M
Mr.doob 已提交
2170

2171
		}
2172

2173
	};
M
Mr.doob 已提交
2174

2175
	function updateRenderTargetMipmap( renderTarget ) {
M
Mr.doob 已提交
2176

2177 2178 2179
		_gl.bindTexture( _gl.TEXTURE_2D, renderTarget.__webGLTexture );
		_gl.generateMipmap( _gl.TEXTURE_2D );
		_gl.bindTexture( _gl.TEXTURE_2D, null );
M
Mr.doob 已提交
2180 2181

	};
2182

M
Mr.doob 已提交
2183
	function cacheUniformLocations( program, identifiers ) {
M
Mr.doob 已提交
2184

M
Mr.doob 已提交
2185
		var i, l, id;
M
Mr.doob 已提交
2186

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

2189 2190
			id = identifiers[ i ];
			program.uniforms[ id ] = _gl.getUniformLocation( program, id );
M
Mr.doob 已提交
2191

M
Mr.doob 已提交
2192
		}
M
Mr.doob 已提交
2193

M
Mr.doob 已提交
2194
	};
M
Mr.doob 已提交
2195

2196
	function cacheAttributeLocations( program, identifiers ) {
2197

2198
		var i, l, id;
M
Mr.doob 已提交
2199

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

2202 2203
			id = identifiers[ i ];
			program.attributes[ id ] = _gl.getAttribLocation( program, id );
M
Mr.doob 已提交
2204

2205
		}
M
Mr.doob 已提交
2206

M
Mr.doob 已提交
2207
	};
M
Mr.doob 已提交
2208

N
Nicolas Garcia Belmonte 已提交
2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233
	function 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 已提交
2234

2235
	};
N
Nicolas Garcia Belmonte 已提交
2236

2237
	function paramThreeToGL( p ) {
M
Mr.doob 已提交
2238

2239
		switch ( p ) {
M
Mr.doob 已提交
2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252

			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;

2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266
			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;

2267
		}
M
Mr.doob 已提交
2268

2269
		return 0;
M
Mr.doob 已提交
2270

2271 2272 2273 2274 2275 2276
	};

	function materialNeedsSmoothNormals( material ) {

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

2277
	};
M
Mr.doob 已提交
2278

M
Mr.doob 已提交
2279
	function bufferNeedsSmoothNormals( geometryChunk, object ) {
M
Mr.doob 已提交
2280

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

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

M
Mr.doob 已提交
2285
			meshMaterial = object.materials[ m ];
2286 2287 2288

			if ( meshMaterial instanceof THREE.MeshFaceMaterial ) {

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

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

2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312 2313
						needsSmoothNormals = true;
						break;

					}

				}

			} else {

				if ( materialNeedsSmoothNormals( meshMaterial ) ) {

					needsSmoothNormals = true;
					break;

				}

			}

			if ( needsSmoothNormals ) break;

		}
M
Mr.doob 已提交
2314

2315
		return needsSmoothNormals;
M
Mr.doob 已提交
2316

2317
	};
M
Mr.doob 已提交
2318

2319
	function allocateLights( lights, maxLights ) {
2320

2321 2322
		var l, ll, light, dirLights, pointLights, maxDirLights, maxPointLights;
		dirLights = pointLights = maxDirLights = maxPointLights = 0;
2323

2324
		for ( l = 0, ll = lights.length; l < ll; l++ ) {
2325

2326
			light = lights[ l ];
2327

2328 2329
			if ( light instanceof THREE.DirectionalLight ) dirLights++;
			if ( light instanceof THREE.PointLight ) pointLights++;
2330

2331
		}
2332

2333
		if ( ( pointLights + dirLights ) <= maxLights ) {
2334

2335 2336
			maxDirLights = dirLights;
			maxPointLights = pointLights;
2337

2338
		} else {
2339

2340 2341
			maxDirLights = Math.ceil( maxLights * dirLights / ( pointLights + dirLights ) );
			maxPointLights = maxLights - maxDirLights;
2342 2343 2344

		}

2345
		return { 'directional' : maxDirLights, 'point' : maxPointLights };
2346 2347

	};
M
Mr.doob 已提交
2348

A
alteredq 已提交
2349
	/* DEBUG
2350
	function getGLParams() {
M
Mr.doob 已提交
2351

2352
		var params  = {
M
Mr.doob 已提交
2353

2354 2355
			'MAX_VARYING_VECTORS': _gl.getParameter( _gl.MAX_VARYING_VECTORS ),
			'MAX_VERTEX_ATTRIBS': _gl.getParameter( _gl.MAX_VERTEX_ATTRIBS ),
M
Mr.doob 已提交
2356

2357 2358 2359
			'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 已提交
2360

2361 2362 2363
			'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 已提交
2364

2365 2366
		return params;
	};
M
Mr.doob 已提交
2367

2368
	function dumpObject( obj ) {
M
Mr.doob 已提交
2369

2370 2371
		var p, str = "";
		for ( p in obj ) {
M
Mr.doob 已提交
2372

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

2375
		}
M
Mr.doob 已提交
2376

2377 2378
		return str;
	}
A
alteredq 已提交
2379
	*/
2380

2381
};
2382

2383
THREE.Snippets = {
M
Mr.doob 已提交
2384

2385 2386
	// FOG
	
2387
	fog_pars_fragment: [
M
Mr.doob 已提交
2388

2389
	"#ifdef USE_FOG",
2390

2391
		"uniform vec3 fogColor;",
2392

2393 2394 2395 2396 2397 2398
		"#ifdef FOG_EXP2",
			"uniform float fogDensity;",
		"#else",
			"uniform float fogNear;",
			"uniform float fogFar;",
		"#endif",
2399

2400
	"#endif"
2401

2402
	].join("\n"),
M
Mr.doob 已提交
2403

2404
	fog_fragment: [
2405

2406
	"#ifdef USE_FOG",
2407

2408 2409 2410 2411 2412 2413 2414 2415 2416
		"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",
2417

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

2420
	"#endif"
M
Mr.doob 已提交
2421

2422
	].join("\n"),
M
Mr.doob 已提交
2423

2424 2425
	// ENVIRONMENT MAP
	
2426
	envmap_pars_fragment: [
M
Mr.doob 已提交
2427

2428
	"#ifdef USE_ENVMAP",
M
Mr.doob 已提交
2429

2430 2431 2432 2433
		"varying vec3 vReflect;",
		"uniform float reflectivity;",
		"uniform samplerCube env_map;",
		"uniform int combine;",
M
Mr.doob 已提交
2434

2435
	"#endif"
M
Mr.doob 已提交
2436

2437
	].join("\n"),
M
Mr.doob 已提交
2438

2439
	envmap_fragment: [
M
Mr.doob 已提交
2440

2441 2442
	"#ifdef USE_ENVMAP",

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

2445 2446
		"if ( combine == 1 ) {",

2447 2448
			//"gl_FragColor = mix( gl_FragColor, cubeColor, reflectivity );",
			"gl_FragColor = vec4( mix( gl_FragColor.xyz, cubeColor.xyz, reflectivity ), opacity );",
2449 2450 2451 2452 2453

		"} else {",

			"gl_FragColor = gl_FragColor * cubeColor;",

M
Mr.doob 已提交
2454
		"}",
2455 2456

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

2458
	].join("\n"),
M
Mr.doob 已提交
2459

2460
	envmap_pars_vertex: [
M
Mr.doob 已提交
2461

2462
	"#ifdef USE_ENVMAP",
M
Mr.doob 已提交
2463

2464 2465 2466
		"varying vec3 vReflect;",
		"uniform float refraction_ratio;",
		"uniform bool useRefract;",
M
Mr.doob 已提交
2467

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

2470 2471 2472
	].join("\n"),

	envmap_vertex : [
M
Mr.doob 已提交
2473

2474
	"#ifdef USE_ENVMAP",
M
Mr.doob 已提交
2475

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

2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489
		"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 已提交
2490

2491
	].join("\n"),
2492
	
2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2507 2508 2509
	// COLOR MAP (particles)

	map_particle_pars_fragment: [

	"#ifdef USE_MAP",

		"uniform sampler2D map;",

	"#endif"

	].join("\n"),


	map_particle_fragment: [

	"#ifdef USE_MAP",

A
alteredq 已提交
2510
		"gl_FragColor = gl_FragColor * texture2D( map, gl_PointCoord );",
2511 2512 2513 2514 2515 2516

	"#endif"

	].join("\n"),

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

2518
	map_pars_fragment: [
M
Mr.doob 已提交
2519

2520
	"#ifdef USE_MAP",
M
Mr.doob 已提交
2521

2522 2523
		"varying vec2 vUv;",
		"uniform sampler2D map;",
M
Mr.doob 已提交
2524

2525
	"#endif"
M
Mr.doob 已提交
2526

2527
	].join("\n"),
M
Mr.doob 已提交
2528

2529
	map_pars_vertex: [
M
Mr.doob 已提交
2530

2531
	"#ifdef USE_MAP",
M
Mr.doob 已提交
2532

2533 2534 2535
		"varying vec2 vUv;",

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

2537
	].join("\n"),
M
Mr.doob 已提交
2538

2539 2540 2541 2542
	map_fragment: [

	"#ifdef USE_MAP",

A
alteredq 已提交
2543
		"gl_FragColor = gl_FragColor * texture2D( map, vUv );",
2544 2545

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

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

2549
	map_vertex: [
M
Mr.doob 已提交
2550

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

2553
		"vUv = uv;",
M
Mr.doob 已提交
2554

2555
	"#endif"
M
Mr.doob 已提交
2556

2557
	].join("\n"),
M
Mr.doob 已提交
2558

2559 2560 2561 2562 2563 2564 2565 2566 2567 2568 2569 2570 2571 2572 2573 2574 2575 2576 2577 2578 2579 2580 2581 2582 2583 2584 2585
	// 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 已提交
2586
		"gl_FragColor = gl_FragColor * texture2D( light_map, vUv2 );",
2587 2588 2589 2590 2591 2592 2593 2594 2595 2596 2597 2598 2599 2600 2601

	"#endif"

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

	"#ifdef USE_LIGHTMAP",

		"vUv2 = uv2;",

	"#endif"

	].join("\n"),

2602
	lights_pars_vertex: [
M
Mr.doob 已提交
2603

2604 2605
	"uniform bool enableLighting;",
	"uniform vec3 ambientLightColor;",
M
Mr.doob 已提交
2606

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

2609 2610
		"uniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];",
		"uniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];",
M
Mr.doob 已提交
2611

2612 2613 2614
	"#endif",

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

2616 2617
		"uniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];",
		"uniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];",
M
Mr.doob 已提交
2618

2619 2620 2621
		"#ifdef PHONG",
			"varying vec3 vPointLightVector[ MAX_POINT_LIGHTS ];",
		"#endif",
M
Mr.doob 已提交
2622

2623
	"#endif"
M
Mr.doob 已提交
2624

2625
	].join("\n"),
M
Mr.doob 已提交
2626

2627 2628
	// LIGHTS
	
2629
	lights_vertex: [
M
Mr.doob 已提交
2630

2631 2632
	"if ( !enableLighting ) {",

A
alteredq 已提交
2633
		"vLightWeighting = vec3( 1.0 );",
2634 2635 2636 2637 2638 2639

	"} else {",

		"vLightWeighting = ambientLightColor;",

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

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

2643 2644 2645
			"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 已提交
2646

2647
		"}",
M
Mr.doob 已提交
2648

2649 2650 2651
		"#endif",

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

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

2655 2656 2657 2658
			"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 已提交
2659

2660 2661 2662
			"#ifdef PHONG",
				"vPointLightVector[ i ] = pointLightVector;",
			"#endif",
M
Mr.doob 已提交
2663

2664
		"}",
M
Mr.doob 已提交
2665

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

2668
	"}"
M
Mr.doob 已提交
2669

2670
	].join("\n"),
M
Mr.doob 已提交
2671

2672
	lights_pars_fragment: [
M
Mr.doob 已提交
2673

2674 2675 2676
	"#if MAX_DIR_LIGHTS > 0",
		"uniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];",
	"#endif",
M
Mr.doob 已提交
2677

2678 2679 2680
	"#if MAX_POINT_LIGHTS > 0",
		"varying vec3 vPointLightVector[ MAX_POINT_LIGHTS ];",
	"#endif",
M
Mr.doob 已提交
2681

2682 2683
	"varying vec3 vViewPosition;",
	"varying vec3 vNormal;"
M
Mr.doob 已提交
2684

2685
	].join("\n"),
M
Mr.doob 已提交
2686

2687
	lights_fragment: [
M
Mr.doob 已提交
2688

2689 2690
	"vec3 normal = normalize( vNormal );",
	"vec3 viewPosition = normalize( vViewPosition );",
A
alteredq 已提交
2691 2692
	
	"vec4 mColor = vec4( diffuse, opacity );",
2693 2694 2695
	"vec4 mSpecular = vec4( specular, opacity );",

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

2697 2698 2699 2700 2701 2702 2703 2704 2705 2706 2707 2708 2709 2710 2711 2712 2713 2714 2715 2716 2717
		"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 已提交
2718

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

2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2733 2734 2735 2736 2737 2738 2739 2740 2741 2742
		"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 已提交
2743

2744 2745 2746 2747 2748 2749 2750
	"#endif",

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

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

2752 2753
	"#if MAX_POINT_LIGHTS > 0",
		"totalLight += pointDiffuse + pointSpecular;",
A
alteredq 已提交
2754 2755 2756
	"#endif",
	
	"gl_FragColor = gl_FragColor * totalLight;"
2757

A
alteredq 已提交
2758 2759 2760 2761 2762 2763 2764 2765 2766 2767 2768 2769 2770 2771 2772 2773 2774 2775 2776
	].join("\n"),
	
	// VERTEX COLORS

	color_pars_fragment: [

	"#ifdef USE_COLOR",

		"varying vec3 vColor;",

	"#endif"

	].join("\n"),


	color_fragment: [

	"#ifdef USE_COLOR",

A
alteredq 已提交
2777
		"gl_FragColor = gl_FragColor * vec4( vColor, opacity );",
A
alteredq 已提交
2778 2779 2780 2781 2782 2783 2784 2785 2786 2787 2788 2789 2790 2791 2792 2793 2794 2795 2796 2797 2798 2799 2800 2801

	"#endif"

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

	"#ifdef USE_COLOR",

		"varying vec3 vColor;",

	"#endif"

	].join("\n"),


	color_vertex: [

	"#ifdef USE_COLOR",

		"vColor = color;",

	"#endif"

2802
	].join("\n")
A
alteredq 已提交
2803
	
2804

2805
};
2806

2807
THREE.UniformsLib = {
M
Mr.doob 已提交
2808

2809
	common: {
M
Mr.doob 已提交
2810

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

2815 2816
	"light_map"       : { type: "t", value: 2, texture: null },

2817 2818
	"env_map" 		  : { type: "t", value: 1, texture: null },
	"useRefract"	  : { type: "i", value: 0 },
2819
	"reflectivity"    : { type: "f", value: 1.0 },
2820 2821
	"refraction_ratio": { type: "f", value: 0.98 },
	"combine"		  : { type: "i", value: 0 },
M
Mr.doob 已提交
2822

2823 2824 2825 2826
	"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 已提交
2827

2828
	},
M
Mr.doob 已提交
2829

2830
	lights: {
M
Mr.doob 已提交
2831

2832 2833 2834 2835 2836 2837
	"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 已提交
2838

2839 2840 2841 2842
	},

	particle: {

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

2848 2849 2850 2851 2852 2853 2854
	"fogDensity": { type: "f", value: 0.00025 },
	"fogNear"	: { type: "f", value: 1 },
	"fogFar"	: { type: "f", value: 2000 },
	"fogColor"	: { type: "c", value: new THREE.Color( 0xffffff ) }
	
	}
	
2855 2856
};

2857
THREE.ShaderLib = {
2858

2859
	'depth': {
M
Mr.doob 已提交
2860

2861
		uniforms: { "mNear": { type: "f", value: 1.0 },
2862
					"mFar" : { type: "f", value: 2000.0 },
A
alteredq 已提交
2863
					"opacity" : { type: "f", value: 1.0 }
2864
				  },
2865

2866
		fragment_shader: [
M
Mr.doob 已提交
2867

2868 2869
			"uniform float mNear;",
			"uniform float mFar;",
2870
			"uniform float opacity;",
M
Mr.doob 已提交
2871

2872
			"void main() {",
M
Mr.doob 已提交
2873

2874 2875
				"float depth = gl_FragCoord.z / gl_FragCoord.w;",
				"float color = 1.0 - smoothstep( mNear, mFar, depth );",
2876
				"gl_FragColor = vec4( vec3( color ), opacity );",
M
Mr.doob 已提交
2877

2878
			"}"
M
Mr.doob 已提交
2879

2880
		].join("\n"),
2881

2882
		vertex_shader: [
2883

2884
			"void main() {",
2885

2886
				"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",
2887

2888
			"}"
2889

2890
		].join("\n")
2891

2892
	},
2893

2894
	'normal': {
M
Mr.doob 已提交
2895

2896
		uniforms: { "opacity" : { type: "f", value: 1.0 } },
2897

2898
		fragment_shader: [
2899

2900
			"uniform float opacity;",
2901
			"varying vec3 vNormal;",
M
Mr.doob 已提交
2902

2903
			"void main() {",
2904

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

2907
			"}"
M
Mr.doob 已提交
2908

2909
		].join("\n"),
M
Mr.doob 已提交
2910

2911
		vertex_shader: [
2912

2913
			"varying vec3 vNormal;",
2914

2915 2916 2917 2918 2919 2920 2921 2922 2923 2924 2925 2926
			"void main() {",

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

				"gl_Position = projectionMatrix * mvPosition;",

			"}"

		].join("\n")

	},
2927

2928
	'basic': {
M
Mr.doob 已提交
2929

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

2932
		fragment_shader: [
2933

A
alteredq 已提交
2934
			"uniform vec3 diffuse;",
2935
			"uniform float opacity;",
M
Mr.doob 已提交
2936

2937
			THREE.Snippets[ "color_pars_fragment" ],
2938
			THREE.Snippets[ "map_pars_fragment" ],
2939
			THREE.Snippets[ "lightmap_pars_fragment" ],
2940 2941
			THREE.Snippets[ "envmap_pars_fragment" ],
			THREE.Snippets[ "fog_pars_fragment" ],
M
Mr.doob 已提交
2942

2943
			"void main() {",
2944

A
alteredq 已提交
2945 2946
				"gl_FragColor = vec4( diffuse, opacity );",
		
2947
				THREE.Snippets[ "map_fragment" ],
2948
				THREE.Snippets[ "lightmap_fragment" ],
2949
				THREE.Snippets[ "color_fragment" ],
2950 2951
				THREE.Snippets[ "envmap_fragment" ],
				THREE.Snippets[ "fog_fragment" ],
M
Mr.doob 已提交
2952

2953
			"}"
2954

2955
		].join("\n"),
M
Mr.doob 已提交
2956

2957
		vertex_shader: [
M
Mr.doob 已提交
2958

2959
			THREE.Snippets[ "map_pars_vertex" ],
2960
			THREE.Snippets[ "lightmap_pars_vertex" ],
2961
			THREE.Snippets[ "envmap_pars_vertex" ],
2962
			THREE.Snippets[ "color_pars_vertex" ],
M
Mr.doob 已提交
2963

2964
			"void main() {",
M
Mr.doob 已提交
2965

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

2968
				THREE.Snippets[ "map_vertex" ],
2969
				THREE.Snippets[ "lightmap_vertex" ],
2970
				THREE.Snippets[ "envmap_vertex" ],
2971
				THREE.Snippets[ "color_vertex" ],
M
Mr.doob 已提交
2972

2973
				"gl_Position = projectionMatrix * mvPosition;",
2974

2975
			"}"
2976

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

2979
	},
2980

2981
	'lambert': {
M
Mr.doob 已提交
2982 2983

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

2986
		fragment_shader: [
M
Mr.doob 已提交
2987

A
alteredq 已提交
2988
			"uniform vec3 diffuse;",
2989
			"uniform float opacity;",
M
Mr.doob 已提交
2990

2991
			"varying vec3 vLightWeighting;",
M
Mr.doob 已提交
2992

A
alteredq 已提交
2993
			THREE.Snippets[ "color_pars_fragment" ],
2994
			THREE.Snippets[ "map_pars_fragment" ],
2995
			THREE.Snippets[ "lightmap_pars_fragment" ],
2996 2997
			THREE.Snippets[ "envmap_pars_fragment" ],
			THREE.Snippets[ "fog_pars_fragment" ],
M
Mr.doob 已提交
2998

2999
			"void main() {",
M
Mr.doob 已提交
3000

A
alteredq 已提交
3001 3002
				"gl_FragColor = vec4( diffuse, opacity );",
				"gl_FragColor = gl_FragColor * vec4( vLightWeighting, 1.0 );",
3003 3004

				THREE.Snippets[ "map_fragment" ],
3005
				THREE.Snippets[ "lightmap_fragment" ],
A
alteredq 已提交
3006
				THREE.Snippets[ "color_fragment" ],
3007
				THREE.Snippets[ "envmap_fragment" ],
3008 3009 3010 3011 3012 3013 3014
				THREE.Snippets[ "fog_fragment" ],

			"}"

		].join("\n"),

		vertex_shader: [
M
Mr.doob 已提交
3015

3016
			"varying vec3 vLightWeighting;",
M
Mr.doob 已提交
3017

3018
			THREE.Snippets[ "map_pars_vertex" ],
3019
			THREE.Snippets[ "lightmap_pars_vertex" ],
3020 3021
			THREE.Snippets[ "envmap_pars_vertex" ],
			THREE.Snippets[ "lights_pars_vertex" ],
A
alteredq 已提交
3022
			THREE.Snippets[ "color_pars_vertex" ],
M
Mr.doob 已提交
3023

3024
			"void main() {",
M
Mr.doob 已提交
3025

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

3028
				THREE.Snippets[ "map_vertex" ],
3029
				THREE.Snippets[ "lightmap_vertex" ],
3030
				THREE.Snippets[ "envmap_vertex" ],
A
alteredq 已提交
3031
				THREE.Snippets[ "color_vertex" ],
M
Mr.doob 已提交
3032

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

3035
				THREE.Snippets[ "lights_vertex" ],
M
Mr.doob 已提交
3036

3037 3038 3039 3040 3041
				"gl_Position = projectionMatrix * mvPosition;",

			"}"

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

3043
	},
M
Mr.doob 已提交
3044

3045
	'phong': {
M
Mr.doob 已提交
3046 3047

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

3050
									{ "ambient"  : { type: "c", value: new THREE.Color( 0x050505 ) },
3051 3052 3053
									  "specular" : { type: "c", value: new THREE.Color( 0x111111 ) },
									  "shininess": { type: "f", value: 30 }
									}
M
Mr.doob 已提交
3054

3055
								] ),
M
Mr.doob 已提交
3056

3057
		fragment_shader: [
M
Mr.doob 已提交
3058

A
alteredq 已提交
3059
			"uniform vec3 diffuse;",
3060
			"uniform float opacity;",
M
Mr.doob 已提交
3061

3062 3063 3064
			"uniform vec3 ambient;",
			"uniform vec3 specular;",
			"uniform float shininess;",
M
Mr.doob 已提交
3065

3066
			"varying vec3 vLightWeighting;",
M
Mr.doob 已提交
3067

A
alteredq 已提交
3068
			THREE.Snippets[ "color_pars_fragment" ],
3069
			THREE.Snippets[ "map_pars_fragment" ],
3070
			THREE.Snippets[ "lightmap_pars_fragment" ],
3071 3072 3073
			THREE.Snippets[ "envmap_pars_fragment" ],
			THREE.Snippets[ "fog_pars_fragment" ],
			THREE.Snippets[ "lights_pars_fragment" ],
M
Mr.doob 已提交
3074

3075
			"void main() {",
M
Mr.doob 已提交
3076

A
alteredq 已提交
3077 3078
				"gl_FragColor = vec4( vLightWeighting, 1.0 );",
				THREE.Snippets[ "lights_fragment" ],
3079 3080

				THREE.Snippets[ "map_fragment" ],
3081
				THREE.Snippets[ "lightmap_fragment" ],
A
alteredq 已提交
3082
				THREE.Snippets[ "color_fragment" ],
3083 3084 3085 3086 3087 3088 3089 3090
				THREE.Snippets[ "envmap_fragment" ],
				THREE.Snippets[ "fog_fragment" ],

			"}"

		].join("\n"),

		vertex_shader: [
M
Mr.doob 已提交
3091

3092
			"#define PHONG",
M
Mr.doob 已提交
3093

3094 3095 3096
			"varying vec3 vLightWeighting;",
			"varying vec3 vViewPosition;",
			"varying vec3 vNormal;",
M
Mr.doob 已提交
3097

3098
			THREE.Snippets[ "map_pars_vertex" ],
3099
			THREE.Snippets[ "lightmap_pars_vertex" ],
3100 3101
			THREE.Snippets[ "envmap_pars_vertex" ],
			THREE.Snippets[ "lights_pars_vertex" ],
A
alteredq 已提交
3102
			THREE.Snippets[ "color_pars_vertex" ],
M
Mr.doob 已提交
3103

3104
			"void main() {",
M
Mr.doob 已提交
3105

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

3108
				THREE.Snippets[ "map_vertex" ],
3109
				THREE.Snippets[ "lightmap_vertex" ],
3110
				THREE.Snippets[ "envmap_vertex" ],
A
alteredq 已提交
3111
				THREE.Snippets[ "color_vertex" ],
M
Mr.doob 已提交
3112

3113 3114 3115
				"#ifndef USE_ENVMAP",
					"vec4 mPosition = objectMatrix * vec4( position, 1.0 );",
				"#endif",
M
Mr.doob 已提交
3116

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

3119 3120
				"vec3 transformedNormal = normalize( normalMatrix * normal );",
				"vNormal = transformedNormal;",
3121

3122
				THREE.Snippets[ "lights_vertex" ],
M
Mr.doob 已提交
3123

3124
				"gl_Position = projectionMatrix * mvPosition;",
3125 3126 3127 3128

			"}"

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

3130 3131 3132 3133 3134 3135 3136 3137
	},
	
	'particle_basic': {

		uniforms: THREE.UniformsLib[ "particle" ],

		fragment_shader: [

A
alteredq 已提交
3138
			"uniform vec3 psColor;",
3139 3140
			"uniform float opacity;",

A
alteredq 已提交
3141
			THREE.Snippets[ "color_pars_fragment" ],
3142 3143 3144 3145 3146
			THREE.Snippets[ "map_particle_pars_fragment" ],
			THREE.Snippets[ "fog_pars_fragment" ],

			"void main() {",

A
alteredq 已提交
3147
				"gl_FragColor = vec4( psColor, opacity );",
3148 3149

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

			"}"

		].join("\n"),

		vertex_shader: [

			"uniform float size;",
			
A
alteredq 已提交
3161 3162
			THREE.Snippets[ "color_pars_vertex" ],
			
3163 3164
			"void main() {",

A
alteredq 已提交
3165 3166
				THREE.Snippets[ "color_vertex" ],
				
3167 3168 3169 3170 3171 3172 3173 3174 3175 3176
				"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 已提交
3177
	}
3178
	
A
alteredq 已提交
3179

N
Nicolas Garcia Belmonte 已提交
3180
};