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

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

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

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

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

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

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

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

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

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

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

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

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

53 54 55
		if ( parameters.antialias !== undefined ) antialias = parameters.antialias;
		if ( parameters.clearColor !== undefined ) clearColor.setHex( parameters.clearColor );
		if ( parameters.clearAlpha !== undefined ) clearAlpha = parameters.clearAlpha;
M
Mr.doob 已提交
56

57
	}
M
Mr.doob 已提交
58

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

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

64 65
	this.context = _gl;

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

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

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

74
	};
M
Mr.doob 已提交
75

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

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

	};

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

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

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

	this.setClearColor = function( color, alpha ) {

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

	};
96

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

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

	};

M
Mr.doob 已提交
103

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

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

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

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

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

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

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

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

			if ( light instanceof THREE.AmbientLight ) {

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

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

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

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

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

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

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

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

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

164 165 166
			}

		}
167 168 169 170 171 172
		
		// null eventual remains from removed lights
		// (this is to avoid if in shader)
		
		for( l = dlength * 3; l < dcolors.length; l++ ) dcolors[ l ] = 0.0;
		for( l = plength * 3; l < pcolors.length; l++ ) pcolors[ l ] = 0.0;
M
Mr.doob 已提交
173

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

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

181
	};
M
Mr.doob 已提交
182

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

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

189
	};
M
Mr.doob 已提交
190

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

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

197
	};
198 199

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

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

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

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

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

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

223
	};
M
Mr.doob 已提交
224

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

		var nvertices = geometry.vertices.length;

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

		geometry.__webGLParticleCount = nvertices;

	};

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

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

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

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

250
			if ( face instanceof THREE.Face3 ) {
M
Mr.doob 已提交
251

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

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

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

262
			}
M
Mr.doob 已提交
263

264
		}
M
Mr.doob 已提交
265

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

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

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

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

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

283
	};
M
Mr.doob 已提交
284

285
	this.setMeshBuffers = function ( geometryChunk, object, hint ) {
286

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

293
		vertexIndex = 0,
294

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

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

311 312
		faceArray = geometryChunk.__faceArray,
		lineArray = geometryChunk.__lineArray,
M
Mr.doob 已提交
313

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

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

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

339
			vertexNormals = face.vertexNormals;
340
			faceNormal = face.normal;
341 342 343

			if ( face instanceof THREE.Face3 ) {

344
				if ( dirtyVertices ) {
M
Mr.doob 已提交
345

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

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

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

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

362
					offset += 9;
M
Mr.doob 已提交
363

364
				}
365

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

				}

388
				if ( dirtyTangents && geometry.hasTangents ) {
389

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

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

399 400 401 402
					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 已提交
403

404 405 406 407
					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 已提交
408

409
					offset_tangent += 12;
M
Mr.doob 已提交
410

411 412
				}

413
				if( dirtyNormals ) {
M
Mr.doob 已提交
414

415 416 417
					if ( vertexNormals.length == 3 && needsSmoothNormals ) {

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

419
							vn = vertexNormals[ i ];
M
Mr.doob 已提交
420

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

425
							offset_normal += 3;
M
Mr.doob 已提交
426

427
						}
M
Mr.doob 已提交
428

429
					} else {
430

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

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

437
							offset_normal += 3;
M
Mr.doob 已提交
438

439
						}
M
Mr.doob 已提交
440 441

					}
M
Mr.doob 已提交
442

443 444
				}

445
				if ( dirtyUvs && uv ) {
446

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

449
						uvi = uv[ i ];
M
Mr.doob 已提交
450

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

454
						offset_uv += 2;
M
Mr.doob 已提交
455

M
Mr.doob 已提交
456
					}
457 458 459

				}

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

					}

				}

475
				if( dirtyElements ) {
M
Mr.doob 已提交
476

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

481
					offset_face += 3;
M
Mr.doob 已提交
482

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

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

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

492
					offset_line += 6;
493

494
					vertexIndex += 3;
M
Mr.doob 已提交
495

496
				}
M
Mr.doob 已提交
497

498 499 500

			} else if ( face instanceof THREE.Face4 ) {

501
				if ( dirtyVertices ) {
M
Mr.doob 已提交
502

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

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

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

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

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

524
					offset += 12;
M
Mr.doob 已提交
525

526
				}
527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545
				
				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;
546

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

				}	
				
555
				if ( dirtyTangents && geometry.hasTangents ) {
556

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

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

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

572 573 574 575
					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 已提交
576

577 578 579 580
					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 已提交
581

582
					offset_tangent += 16;
M
Mr.doob 已提交
583

584
				}
M
Mr.doob 已提交
585

586
				if( dirtyNormals ) {
M
Mr.doob 已提交
587

588
					if ( vertexNormals.length == 4 && needsSmoothNormals ) {
589

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

592
							vn = vertexNormals[ i ];
M
Mr.doob 已提交
593

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

598
							offset_normal += 3;
M
Mr.doob 已提交
599

600
						}
M
Mr.doob 已提交
601

602
					} else {
603

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

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

610
							offset_normal += 3;
M
Mr.doob 已提交
611

612
						}
M
Mr.doob 已提交
613 614

					}
M
Mr.doob 已提交
615

616 617
				}

618
				if ( dirtyUvs && uv ) {
619

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

622
						uvi = uv[ i ];
M
Mr.doob 已提交
623

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

627
						offset_uv += 2;
M
Mr.doob 已提交
628

M
Mr.doob 已提交
629
					}
630 631

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

648
				if( dirtyElements ) {
M
Mr.doob 已提交
649

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

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

658
					offset_face += 6;
M
Mr.doob 已提交
659

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

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

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

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

672
					offset_line += 8;
M
Mr.doob 已提交
673

674
					vertexIndex += 4;
M
Mr.doob 已提交
675

676
				}
M
Mr.doob 已提交
677

678
			}
M
Mr.doob 已提交
679

680 681
		}

682
		if ( dirtyVertices ) {
M
Mr.doob 已提交
683

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

687
		}
M
Mr.doob 已提交
688

689 690 691 692 693 694 695
		if ( dirtyColors && obj_colors.length ) {

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

		}
		
696
		if ( dirtyNormals ) {
M
Mr.doob 已提交
697

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

701 702
		}

703
		if ( dirtyTangents && geometry.hasTangents ) {
704

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

708
		}
709

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

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

715
		}
M
Mr.doob 已提交
716

717 718 719 720 721 722 723
		if ( dirtyUvs && offset_uv2 > 0 ) {

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

		}

724
		if( dirtyElements ) {
M
Mr.doob 已提交
725

726 727
			_gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, geometryChunk.__webGLFaceBuffer );
			_gl.bufferData( _gl.ELEMENT_ARRAY_BUFFER, faceArray, hint );
728

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

732
		}
733 734

	};
735

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

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

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

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

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

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

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

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

764 765
			}

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

769
		}
M
Mr.doob 已提交
770

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

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

				color = colors[ c ];

				offset = c * 3;

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

			}

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

		}

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

793
		if ( dirtyElements ) {
M
Mr.doob 已提交
794

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

797
				lineArray[ v ] = v;
M
Mr.doob 已提交
798

799
			}
M
Mr.doob 已提交
800

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

A
alteredq 已提交
804
		}
M
Mr.doob 已提交
805

806
	};
M
Mr.doob 已提交
807

808
	this.setParticleBuffers = function( geometry, hint, object, camera ) {
809

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

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

827 828 829 830
		if ( object.sortParticles ) {
		
			_projScreenMatrix.multiplySelf( object.matrix );
			
831 832 833
			for ( v = 0; v < vl; v++ ) {

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

				}
884 885

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

899
				}
A
alteredq 已提交
900 901
				
			}
902 903

		}
904
		
A
alteredq 已提交
905
		
906 907 908
		// 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)
909
		
910 911 912 913 914 915 916
		if ( dirtyElements ) {

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

				particleArray[ v ] = v;

			}
A
alteredq 已提交
917 918 919
			
			_gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, geometry.__webGLParticleBuffer );
			_gl.bufferData( _gl.ELEMENT_ARRAY_BUFFER, particleArray, hint );
920 921

		}
A
alteredq 已提交
922 923 924 925 926 927 928 929 930
		
		if ( dirtyVertices || object.sortParticles ) {
		
			_gl.bindBuffer( _gl.ARRAY_BUFFER, geometry.__webGLVertexBuffer );
			_gl.bufferData( _gl.ARRAY_BUFFER, vertexArray, hint );
			
		}
		
		if ( dirtyColors || object.sortParticles ) {
931
			
A
alteredq 已提交
932 933
			_gl.bindBuffer( _gl.ARRAY_BUFFER, geometry.__webGLColorBuffer );
			_gl.bufferData( _gl.ARRAY_BUFFER, colorArray, hint );
934
		
A
alteredq 已提交
935
		}
936
		
937
	};
M
Mr.doob 已提交
938

M
Mr.doob 已提交
939
	function setMaterialShaders( material, shaders ) {
940

M
Mr.doob 已提交
941 942
		material.fragment_shader = shaders.fragment_shader;
		material.vertex_shader = shaders.vertex_shader;
943
		material.uniforms = Uniforms.clone( shaders.uniforms );
944

M
Mr.doob 已提交
945
	};
946

947
	function refreshUniformsCommon( material, fog ) {
M
Mr.doob 已提交
948

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

952 953
		// pure color
		//material.uniforms.color.value.setHex( material.color.hex );
M
Mr.doob 已提交
954

955 956
		material.uniforms.opacity.value = material.opacity;
		material.uniforms.map.texture = material.map;
957 958
		
		material.uniforms.light_map.texture = material.light_map;
959

960 961 962 963 964
		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;
965

966 967 968
		if ( fog ) {

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

970
			if ( fog instanceof THREE.Fog ) {
971

972 973
				material.uniforms.fogNear.value = fog.near;
				material.uniforms.fogFar.value = fog.far;
974

975
			} else if ( fog instanceof THREE.FogExp2 ) {
976

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

979 980 981
			}

		}
982

983
	};
984 985

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

A
alteredq 已提交
987
		material.uniforms.diffuse.value.setRGB( material.color.r * material.opacity, material.color.g * material.opacity, material.color.b * material.opacity );
988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007
		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 已提交
1008

1009 1010
	function refreshUniformsParticle( material, fog ) {

A
alteredq 已提交
1011
		material.uniforms.psColor.value.setRGB( material.color.r * material.opacity, material.color.g * material.opacity, material.color.b * material.opacity );
1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034
		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;

			}

		}

	};

1035
	function refreshUniformsPhong( material ) {
M
Mr.doob 已提交
1036

1037 1038 1039 1040 1041
		//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 已提交
1042

1043
	};
M
Mr.doob 已提交
1044 1045


1046
	function refreshLights( material, lights ) {
M
Mr.doob 已提交
1047

1048
		material.uniforms.enableLighting.value = lights.directional.length + lights.point.length;
1049 1050 1051 1052 1053
		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 已提交
1054

A
alteredq 已提交
1055
	};
M
Mr.doob 已提交
1056

1057 1058
	this.initMaterial = function( material, lights, fog ) {
		
1059
		if ( !material.program ) {
M
Mr.doob 已提交
1060

1061 1062
			var u, identifiers, parameters, maxLightCount;
			
1063
			if ( material instanceof THREE.MeshDepthMaterial ) {
1064

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

1067
			} else if ( material instanceof THREE.MeshNormalMaterial ) {
1068

1069
				setMaterialShaders( material, THREE.ShaderLib[ 'normal' ] );
1070

1071
			} else if ( material instanceof THREE.MeshBasicMaterial ) {
1072

1073
				setMaterialShaders( material, THREE.ShaderLib[ 'basic' ] );
1074

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

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

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

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

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

1085 1086
				setMaterialShaders( material, THREE.ShaderLib[ 'basic' ] );

1087 1088 1089 1090
			} else if ( material instanceof THREE.ParticleBasicMaterial ) {
				
				setMaterialShaders( material, THREE.ShaderLib[ 'particle_basic' ] );
				
1091
			}
1092

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

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

A
alteredq 已提交
1098 1099
			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 };
1100
			material.program = buildProgram( material.fragment_shader, material.vertex_shader, parameters );
M
Mr.doob 已提交
1101

1102 1103
			identifiers = [ 'viewMatrix', 'modelViewMatrix', 'projectionMatrix', 'normalMatrix', 'objectMatrix', 'cameraPosition' ];
			for( u in material.uniforms ) {
1104

1105
				identifiers.push(u);
M
Mr.doob 已提交
1106

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

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

M
Mr.doob 已提交
1112
		}
1113 1114 1115
		
	};
	
A
alteredq 已提交
1116 1117
	this.setProgram = function( camera, lights, fog, material, object ) {
		
1118
		this.initMaterial( material, lights, fog );
M
Mr.doob 已提交
1119

A
alteredq 已提交
1120
		var program = material.program;
1121

M
Mr.doob 已提交
1122
		if( program != _oldProgram ) {
M
Mr.doob 已提交
1123

M
Mr.doob 已提交
1124 1125
			_gl.useProgram( program );
			_oldProgram = program;
M
Mr.doob 已提交
1126

M
Mr.doob 已提交
1127
		}
M
Mr.doob 已提交
1128

1129
		this.loadCamera( program, camera );
1130
		this.loadMatrices( program, object );
M
Mr.doob 已提交
1131

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

1135 1136
			this.setupLights( program, lights );
			refreshLights( material, this.lights );
M
Mr.doob 已提交
1137 1138 1139

		}

1140 1141 1142
		if ( material instanceof THREE.MeshBasicMaterial ||
			 material instanceof THREE.MeshLambertMaterial ||
			 material instanceof THREE.MeshPhongMaterial ) {
M
Mr.doob 已提交
1143

1144
			refreshUniformsCommon( material, fog );
M
Mr.doob 已提交
1145

A
alteredq 已提交
1146
		}
M
Mr.doob 已提交
1147

1148
		if ( material instanceof THREE.LineBasicMaterial ) {
M
Mr.doob 已提交
1149

1150
			refreshUniformsLine( material, fog );
1151 1152 1153 1154 1155 1156 1157
			
		}

		if ( material instanceof THREE.ParticleBasicMaterial ) {

			refreshUniformsParticle( material, fog );
			
1158
		}
M
Mr.doob 已提交
1159

M
Mr.doob 已提交
1160
		if ( material instanceof THREE.MeshPhongMaterial ) {
M
Mr.doob 已提交
1161

1162
			refreshUniformsPhong( material );
M
Mr.doob 已提交
1163

1164
		}
M
Mr.doob 已提交
1165

1166 1167 1168 1169
		if ( material instanceof THREE.MeshDepthMaterial ) {

			material.uniforms.mNear.value = camera.near;
			material.uniforms.mFar.value = camera.far;
1170
			material.uniforms.opacity.value = material.opacity;
1171
			
1172
		}
1173 1174 1175 1176 1177 1178 1179

		if ( material instanceof THREE.MeshNormalMaterial ) {

			material.uniforms.opacity.value = material.opacity;
			
		}
		
1180
		setUniforms( program, material.uniforms );
1181

A
alteredq 已提交
1182 1183 1184 1185 1186 1187 1188 1189 1190 1191
		return program;
		
	};
	
	this.renderBuffer = function ( camera, lights, fog, material, geometryChunk, object ) {

		var program, attributes, linewidth, primitives;

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

1194
		// vertices
M
Mr.doob 已提交
1195

M
Mr.doob 已提交
1196
		_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryChunk.__webGLVertexBuffer );
1197
		_gl.vertexAttribPointer( attributes.position, 3, _gl.FLOAT, false, 0, 0 );
1198
		_gl.enableVertexAttribArray( attributes.position );
1199

A
alteredq 已提交
1200 1201 1202 1203 1204 1205 1206 1207 1208 1209
		// 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 );

		}

1210
		// normals
M
Mr.doob 已提交
1211

1212
		if ( attributes.normal >= 0 ) {
1213

1214 1215
			_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryChunk.__webGLNormalBuffer );
			_gl.vertexAttribPointer( attributes.normal, 3, _gl.FLOAT, false, 0, 0 );
1216
			_gl.enableVertexAttribArray( attributes.normal );
1217

1218
		}
1219

1220 1221 1222
		// tangents

		if ( attributes.tangent >= 0 ) {
1223

1224 1225
			_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryChunk.__webGLTangentBuffer );
			_gl.vertexAttribPointer( attributes.tangent, 4, _gl.FLOAT, false, 0, 0 );
1226
			_gl.enableVertexAttribArray( attributes.tangent );
1227

1228
		}
1229

1230
		// uvs
M
Mr.doob 已提交
1231

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

1234
			if ( geometryChunk.__webGLUVBuffer ) {
1235

1236
				_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryChunk.__webGLUVBuffer );
1237
				_gl.vertexAttribPointer( attributes.uv, 2, _gl.FLOAT, false, 0, 0 );
1238

1239
				_gl.enableVertexAttribArray( attributes.uv );
1240

1241
			} else {
1242

1243
				_gl.disableVertexAttribArray( attributes.uv );
M
Mr.doob 已提交
1244

1245
			}
1246 1247 1248

		}

1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265
		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 );

			}

		}

1266
		// render lines
M
Mr.doob 已提交
1267

1268
		if ( material.wireframe || material instanceof THREE.LineBasicMaterial ) {
1269

M
Mr.doob 已提交
1270
			linewidth = material.wireframe_linewidth !== undefined ? material.wireframe_linewidth :
1271
						material.linewidth !== undefined ? material.linewidth : 1;
M
Mr.doob 已提交
1272

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

1275 1276
			_gl.lineWidth( linewidth );
			_gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, geometryChunk.__webGLLineBuffer );
1277
			_gl.drawElements( primitives, geometryChunk.__webGLLineCount, _gl.UNSIGNED_SHORT, 0 );
1278

1279
		// render particles
M
Mr.doob 已提交
1280

1281 1282 1283 1284
		} else if ( material instanceof THREE.ParticleBasicMaterial ) {

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

1286 1287 1288 1289
		// render triangles
			
		} else {
			
1290 1291
			_gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, geometryChunk.__webGLFaceBuffer );
			_gl.drawElements( _gl.TRIANGLES, geometryChunk.__webGLFaceCount, _gl.UNSIGNED_SHORT, 0 );
1292
			
1293 1294 1295 1296
		}

	};

A
alteredq 已提交
1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325
	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 已提交
1326
	this.renderPass = function ( camera, lights, fog, object, geometryChunk, blending, transparent ) {
M
Mr.doob 已提交
1327

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

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

M
Mr.doob 已提交
1332
			meshMaterial = object.materials[ m ];
1333

M
Mr.doob 已提交
1334
			if ( meshMaterial instanceof THREE.MeshFaceMaterial ) {
1335

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

					material = geometryChunk.materials[ i ];
1339

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

M
Mr.doob 已提交
1342
						this.setBlending( material.blending );
1343 1344
						this.setDepthTest( material.depth_test );
						
1345
						this.renderBuffer( camera, lights, fog, material, geometryChunk, object );
M
Mr.doob 已提交
1346

1347 1348
					}

M
Mr.doob 已提交
1349
				}
1350

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

M
Mr.doob 已提交
1353
				material = meshMaterial;
1354
				if ( material && material.blending == blending && ( material.opacity < 1.0 == transparent ) ) {
M
Mr.doob 已提交
1355

M
Mr.doob 已提交
1356
					this.setBlending( material.blending );
1357 1358
					this.setDepthTest( material.depth_test );
					
1359
					this.renderBuffer( camera, lights, fog, material, geometryChunk, object );
M
Mr.doob 已提交
1360

1361 1362 1363
				}

			}
1364 1365

		}
M
Mr.doob 已提交
1366

1367
	};
M
Mr.doob 已提交
1368

A
alteredq 已提交
1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379
	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 );
1380 1381
				this.setDepthTest( material.depth_test );
				
A
alteredq 已提交
1382 1383 1384 1385 1386 1387 1388 1389 1390 1391
				program = this.setProgram( camera, lights, fog, material, object );
				
				object.render( function( object ) { renderBufferImmediate( object, program ); } );

			}

		}

	};
	
1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416
	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 );

			}

		}
		
	};
	
1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452
	function computeFrustum( m ) {

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

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

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

		}

	};
	
	function isInFrustum( object ) {

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

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

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

		}

		return true;

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

1455
		var o, ol, oil, webGLObject, object, buffer,
A
alteredq 已提交
1456
			lights = scene.lights,
1457 1458 1459 1460 1461 1462 1463
			fog = scene.fog,
			ol;

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

1465 1466 1467
		_projScreenMatrix.multiply( camera.projectionMatrix, camera.matrix );
		computeFrustum( _projScreenMatrix );
		
1468
		this.initWebGLObjects( scene, camera );
M
Mr.doob 已提交
1469

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

1472
		if ( this.autoClear ) {
M
Mr.doob 已提交
1473

1474
			this.clear();
M
Mr.doob 已提交
1475

1476 1477
		}

1478
		// set matrices
1479 1480
		
		ol = scene.__webGLObjects.length;
A
alteredq 已提交
1481
	
1482
		for ( o = 0; o < ol; o++ ) {
M
Mr.doob 已提交
1483

M
Mr.doob 已提交
1484
			webGLObject = scene.__webGLObjects[ o ];
M
Mr.doob 已提交
1485
			object = webGLObject.object;
M
Mr.doob 已提交
1486

1487
			if ( object.visible && ( ! ( object instanceof THREE.Mesh ) || isInFrustum( object ) ) ) {
1488
				
A
alteredq 已提交
1489 1490 1491 1492 1493 1494 1495
				if( object.autoUpdateMatrix ) { 
					
					object.updateMatrix();
					object._objectMatrixArray.set( object.matrix.flatten() );
				
				}
				
1496
				this.setupMatrices( object, camera );
1497 1498
				
				webGLObject.render = true;
1499
			
1500 1501 1502 1503
			} else {
				
				webGLObject.render = false;
				
1504 1505 1506 1507 1508 1509 1510
			}
		
		}
		
		oil = scene.__webGLObjectsImmediate.length;
		
		for ( o = 0; o < oil; o++ ) {
1511 1512
		
			object = scene.__webGLObjectsImmediate[ o ].object;
1513 1514 1515
			
			if ( object.visible ) {
			
A
alteredq 已提交
1516 1517 1518 1519 1520 1521 1522
				if( object.autoUpdateMatrix ) { 
				
					object.updateMatrix();
					object._objectMatrixArray.set( object.matrix.flatten() );
				
				}
				
1523
				this.setupMatrices( object, camera );
1524 1525
			
			}
A
alteredq 已提交
1526
		
1527
		}
A
alteredq 已提交
1528

1529 1530 1531
		// opaque pass

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

1533 1534
			webGLObject = scene.__webGLObjects[ o ];

1535 1536 1537 1538
			if ( webGLObject.render ) {
				
				object = webGLObject.object;
				buffer = webGLObject.buffer;
1539 1540
				
				setObjectFaces( object );
1541 1542 1543 1544 1545 1546
				this.renderPass( camera, lights, fog, object, buffer, THREE.NormalBlending, false );

			}

		}

A
alteredq 已提交
1547 1548
		// opaque pass (immediate simulator)
		
1549
		for ( o = 0; o < oil; o++ ) {
A
alteredq 已提交
1550
			
1551
			object = scene.__webGLObjectsImmediate[ o ].object;
A
alteredq 已提交
1552 1553 1554
			
			if ( object.visible ) {
			
1555
				setObjectFaces( object );
A
alteredq 已提交
1556 1557 1558 1559 1560 1561
				this.renderPassImmediate( camera, lights, fog, object, THREE.NormalBlending, false );
			
			}
			
		}

1562 1563
		// transparent pass

1564
		for ( o = 0; o < ol; o++ ) {
1565 1566 1567

			webGLObject = scene.__webGLObjects[ o ];

1568 1569 1570 1571
			if ( webGLObject.render ) {
				
				object = webGLObject.object;
				buffer = webGLObject.buffer;
1572

1573 1574
				setObjectFaces( object );
				
1575
				// opaque blended materials
M
Mr.doob 已提交
1576

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

1580
				// transparent blended materials
M
Mr.doob 已提交
1581

A
alteredq 已提交
1582 1583
				this.renderPass( camera, lights, fog, object, buffer, THREE.AdditiveBlending, true );
				this.renderPass( camera, lights, fog, object, buffer, THREE.SubtractiveBlending, true );
1584

1585
				// transparent normal materials
M
Mr.doob 已提交
1586

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

1589 1590 1591 1592
				// billboard materials

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

1593
			}
M
Mr.doob 已提交
1594

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

1597 1598
		// transparent pass (immediate simulator)
		
1599 1600 1601
		for ( o = 0; o < oil; o++ ) {
		
			object = scene.__webGLObjectsImmediate[ o ].object;
1602 1603 1604
			
			if ( object.visible ) {
			
1605
				setObjectFaces( object );
1606 1607 1608 1609 1610 1611
				this.renderPassImmediate( camera, lights, fog, object, THREE.NormalBlending, true );
			
			}
			
		}
		
1612
		// Generate mipmap if we're using any kind of mipmap filtering
M
Mr.doob 已提交
1613

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

1616
			updateRenderTargetMipmap( renderTarget );
M
Mr.doob 已提交
1617

1618
		}
1619

M
Mr.doob 已提交
1620
	};
M
Mr.doob 已提交
1621

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

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

1626 1627 1628 1629 1630 1631
			if ( objmap[ id ] == undefined ) {

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

			}
M
Mr.doob 已提交
1632

1633
		};
M
Mr.doob 已提交
1634

A
alteredq 已提交
1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645
		function add_buffer_immediate( objmap, id, object ) {

			if ( objmap[ id ] == undefined ) {

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

			}

		};

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

M
Mr.doob 已提交
1648
		if ( !scene.__webGLObjects ) {
M
Mr.doob 已提交
1649

M
Mr.doob 已提交
1650
			scene.__webGLObjects = [];
M
Mr.doob 已提交
1651
			scene.__webGLObjectsMap = {};
M
Mr.doob 已提交
1652

A
alteredq 已提交
1653 1654
			scene.__webGLObjectsImmediate = [];

M
Mr.doob 已提交
1655
		}
M
Mr.doob 已提交
1656

1657 1658 1659
		for ( o = 0, ol = scene.objects.length; o < ol; o++ ) {

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

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

1664
				scene.__webGLObjectsMap[ object.id ] = {};
1665 1666 1667 1668 1669 1670
					
				object._modelViewMatrix = new THREE.Matrix4();
				
				object._normalMatrixArray = new Float32Array( 9 );
				object._modelViewMatrixArray = new Float32Array( 16 );	
				object._objectMatrixArray = new Float32Array( 16 );
A
alteredq 已提交
1671 1672
					
				object._objectMatrixArray.set( object.matrix.flatten() );
M
Mr.doob 已提交
1673

1674
			}
1675

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

1678
			if ( object instanceof THREE.Mesh ) {
M
Mr.doob 已提交
1679

M
Mr.doob 已提交
1680
				// create separate VBOs per geometry chunk
M
Mr.doob 已提交
1681

1682
				for ( g in geometry.geometryChunks ) {
M
Mr.doob 已提交
1683

1684
					geometryChunk = geometry.geometryChunks[ g ];
M
Mr.doob 已提交
1685

M
Mr.doob 已提交
1686
					// initialise VBO on the first access
M
Mr.doob 已提交
1687

M
Mr.doob 已提交
1688
					if( ! geometryChunk.__webGLVertexBuffer ) {
M
Mr.doob 已提交
1689

1690 1691
						this.createMeshBuffers( geometryChunk );
						this.initMeshBuffers( geometryChunk, object );
M
Mr.doob 已提交
1692

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

					}

1702 1703 1704
					if( geometry.__dirtyVertices || geometry.__dirtyElements || 
						geometry.__dirtyUvs || geometry.__dirtyNormals || 
						geometry.__dirtyColors || geometry.__dirtyTangents ) {
1705

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

M
Mr.doob 已提交
1708
					}
M
Mr.doob 已提交
1709

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

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

M
Mr.doob 已提交
1714
				}
1715

1716 1717 1718 1719 1720
				geometry.__dirtyVertices = false;
				geometry.__dirtyElements = false;
				geometry.__dirtyUvs = false;
				geometry.__dirtyNormals = false;
				geometry.__dirtyTangents = false;
1721
				geometry.__dirtyColors = false;
1722

1723
			} else if ( object instanceof THREE.Line ) {
M
Mr.doob 已提交
1724 1725


1726
				if( ! geometry.__webGLVertexBuffer ) {
M
Mr.doob 已提交
1727

1728 1729
					this.createLineBuffers( geometry );
					this.initLineBuffers( geometry );
M
Mr.doob 已提交
1730

1731 1732
					geometry.__dirtyVertices = true;
					geometry.__dirtyElements = true;
1733
					geometry.__dirtyColors = true;
M
Mr.doob 已提交
1734

1735
				}
M
Mr.doob 已提交
1736

1737
				if( geometry.__dirtyVertices ||  geometry.__dirtyColors ) {
M
Mr.doob 已提交
1738

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

1741
				}
M
Mr.doob 已提交
1742

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

1745 1746
				geometry.__dirtyVertices = false;
				geometry.__dirtyElements = false;
1747
				geometry.__dirtyColors = false;
1748

1749
			} else if ( object instanceof THREE.ParticleSystem ) {
1750

1751
				if( ! geometry.__webGLVertexBuffer ) {
M
Mr.doob 已提交
1752

1753
					this.createParticleBuffers( geometry );
1754 1755 1756
					this.initParticleBuffers( geometry );

					geometry.__dirtyVertices = true;
1757
					geometry.__dirtyColors = true;
1758 1759 1760 1761
					geometry.__dirtyElements = true;
					
				}

1762
				if( geometry.__dirtyVertices || geometry.__dirtyColors || object.sortParticles ) {
1763

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

1766
				}
M
Mr.doob 已提交
1767

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

1770
				geometry.__dirtyVertices = false;
1771
				geometry.__dirtyColors = false;
1772 1773
				geometry.__dirtyElements = false;

M
Mr.doob 已提交
1774

A
alteredq 已提交
1775 1776 1777 1778
			} else if ( object instanceof THREE.MarchingCubes ) {
				
				add_buffer_immediate( objmap, 0, object );
				
1779
			}/*else if ( object instanceof THREE.Particle ) {
M
Mr.doob 已提交
1780 1781 1782

			}*/

M
Mr.doob 已提交
1783
		}
1784 1785 1786 1787 1788 1789

	};

	this.removeObject = function ( scene, object ) {

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

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

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

1795
			if ( object == zobject ) {
1796 1797 1798 1799

				scene.__webGLObjects.splice( o, 1 );

			}
M
Mr.doob 已提交
1800

1801
		}
M
Mr.doob 已提交
1802

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

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

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

M
Mr.doob 已提交
1810
	};
M
Mr.doob 已提交
1811

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

M
Mr.doob 已提交
1814 1815
		_gl.uniformMatrix4fv( program.uniforms.viewMatrix, false, _viewMatrixArray );
		_gl.uniformMatrix4fv( program.uniforms.projectionMatrix, false, _projectionMatrixArray );
1816 1817 1818 1819
		
		_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 已提交
1820

M
Mr.doob 已提交
1821
	};
1822

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

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

M
Mr.doob 已提交
1827
	};
M
Mr.doob 已提交
1828

1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842
	this.setDepthTest = function( test ) {
		
		if( test ) {
			
			_gl.enable( _gl.DEPTH_TEST );
			
		} else {
			
			_gl.disable( _gl.DEPTH_TEST );
			
		}
		
	};
	
M
Mr.doob 已提交
1843
	this.setBlending = function( blending ) {
M
Mr.doob 已提交
1844

M
Mr.doob 已提交
1845
		switch ( blending ) {
1846

M
Mr.doob 已提交
1847
			case THREE.AdditiveBlending:
1848

M
Mr.doob 已提交
1849 1850
				_gl.blendEquation( _gl.FUNC_ADD );
				_gl.blendFunc( _gl.ONE, _gl.ONE );
M
Mr.doob 已提交
1851

M
Mr.doob 已提交
1852
				break;
1853

M
Mr.doob 已提交
1854
			case THREE.SubtractiveBlending:
1855

M
Mr.doob 已提交
1856 1857
				//_gl.blendEquation( _gl.FUNC_SUBTRACT );
				_gl.blendFunc( _gl.DST_COLOR, _gl.ZERO );
M
Mr.doob 已提交
1858

M
Mr.doob 已提交
1859
				break;
M
Mr.doob 已提交
1860

1861 1862 1863 1864 1865 1866 1867
			case THREE.BillboardBlending:

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

				break;

M
Mr.doob 已提交
1868
			default:
M
Mr.doob 已提交
1869

M
Mr.doob 已提交
1870 1871
				_gl.blendEquation( _gl.FUNC_ADD );
				_gl.blendFunc( _gl.ONE, _gl.ONE_MINUS_SRC_ALPHA );
M
Mr.doob 已提交
1872

M
Mr.doob 已提交
1873
				break;
1874
		
N
Nicolas Garcia Belmonte 已提交
1875
		}
M
Mr.doob 已提交
1876

N
Nicolas Garcia Belmonte 已提交
1877
	};
M
Mr.doob 已提交
1878

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

1881
		if ( cullFace ) {
M
Mr.doob 已提交
1882

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

1885
				_gl.frontFace( _gl.CCW );
M
Mr.doob 已提交
1886

1887
			} else {
M
Mr.doob 已提交
1888

1889
				_gl.frontFace( _gl.CW );
M
Mr.doob 已提交
1890

1891
			}
M
Mr.doob 已提交
1892

1893
			if( cullFace == "back" ) {
M
Mr.doob 已提交
1894

1895
				_gl.cullFace( _gl.BACK );
M
Mr.doob 已提交
1896

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

1899
				_gl.cullFace( _gl.FRONT );
M
Mr.doob 已提交
1900

1901
			} else {
M
Mr.doob 已提交
1902

1903
				_gl.cullFace( _gl.FRONT_AND_BACK );
M
Mr.doob 已提交
1904

1905
			}
M
Mr.doob 已提交
1906

1907
			_gl.enable( _gl.CULL_FACE );
M
Mr.doob 已提交
1908

1909
		} else {
M
Mr.doob 已提交
1910

1911
			_gl.disable( _gl.CULL_FACE );
M
Mr.doob 已提交
1912

1913 1914 1915
		}

	};
N
Nicolas Garcia Belmonte 已提交
1916

1917
	this.supportsVertexTextures = function() {
1918

1919
		return maxVertexTextures() > 0;
1920

1921
	};
1922

1923
	function maxVertexTextures() {
1924

1925 1926 1927
		return _gl.getParameter( _gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS );

	};
1928

1929
	function initGL( antialias, clearColor, clearAlpha ) {
N
Nicolas Garcia Belmonte 已提交
1930 1931 1932

		try {

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

A
alteredq 已提交
1935
		} catch(e) { console.log(e) }
N
Nicolas Garcia Belmonte 已提交
1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949

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

1950 1951
		_gl.frontFace( _gl.CCW );
		_gl.cullFace( _gl.BACK );
1952
		_gl.enable( _gl.CULL_FACE );
M
Mr.doob 已提交
1953

N
Nicolas Garcia Belmonte 已提交
1954
		_gl.enable( _gl.BLEND );
1955
		_gl.blendFunc( _gl.ONE, _gl.ONE_MINUS_SRC_ALPHA );
1956
		_gl.clearColor( clearColor.r, clearColor.g, clearColor.b, clearAlpha );
N
Nicolas Garcia Belmonte 已提交
1957

1958
	};
M
Mr.doob 已提交
1959

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

M
Mr.doob 已提交
1962
		var program = _gl.createProgram(),
M
Mr.doob 已提交
1963

M
Mr.doob 已提交
1964 1965 1966 1967
		prefix_fragment = [
			"#ifdef GL_ES",
			"precision highp float;",
			"#endif",
M
Mr.doob 已提交
1968

1969 1970
			"#define MAX_DIR_LIGHTS " + parameters.maxDirLights,
			"#define MAX_POINT_LIGHTS " + parameters.maxPointLights,
A
alteredq 已提交
1971

1972 1973
			parameters.fog ? "#define USE_FOG" : "",
			parameters.fog instanceof THREE.FogExp2 ? "#define FOG_EXP2" : "",
1974

1975 1976
			parameters.map ? "#define USE_MAP" : "",
			parameters.env_map ? "#define USE_ENVMAP" : "",
1977
			parameters.light_map ? "#define USE_LIGHTMAP" : "",
A
alteredq 已提交
1978
			parameters.vertex_colors ? "#define USE_COLOR" : "",
1979

1980
			"uniform mat4 viewMatrix;",
1981
			"uniform vec3 cameraPosition;",
M
Mr.doob 已提交
1982 1983
			""
		].join("\n"),
1984

M
Mr.doob 已提交
1985
		prefix_vertex = [
1986
			maxVertexTextures() > 0 ? "#define VERTEX_TEXTURES" : "",
1987

1988 1989 1990
			"#define MAX_DIR_LIGHTS " + parameters.maxDirLights,
			"#define MAX_POINT_LIGHTS " + parameters.maxPointLights,

1991 1992
			parameters.map ? "#define USE_MAP" : "",
			parameters.env_map ? "#define USE_ENVMAP" : "",
1993
			parameters.light_map ? "#define USE_LIGHTMAP" : "",
A
alteredq 已提交
1994
			parameters.vertex_colors ? "#define USE_COLOR" : "",
1995

M
Mr.doob 已提交
1996 1997 1998
			"uniform mat4 objectMatrix;",
			"uniform mat4 modelViewMatrix;",
			"uniform mat4 projectionMatrix;",
1999 2000
			"uniform mat4 viewMatrix;",
			"uniform mat3 normalMatrix;",
M
Mr.doob 已提交
2001
			"uniform vec3 cameraPosition;",
M
Mr.doob 已提交
2002 2003
			"attribute vec3 position;",
			"attribute vec3 normal;",
A
alteredq 已提交
2004
			"attribute vec3 color;",
M
Mr.doob 已提交
2005
			"attribute vec2 uv;",
2006
			"attribute vec2 uv2;",
M
Mr.doob 已提交
2007 2008
			""
		].join("\n");
2009

M
Mr.doob 已提交
2010 2011
		_gl.attachShader( program, getShader( "fragment", prefix_fragment + fragment_shader ) );
		_gl.attachShader( program, getShader( "vertex", prefix_vertex + vertex_shader ) );
M
Mr.doob 已提交
2012

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

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

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

2020 2021
			//console.log( prefix_fragment + fragment_shader );
			//console.log( prefix_vertex + vertex_shader );
M
Mr.doob 已提交
2022

N
Nicolas Garcia Belmonte 已提交
2023
		}
2024 2025 2026
		
		//console.log( prefix_fragment + fragment_shader );
		//console.log( prefix_vertex + vertex_shader );
M
Mr.doob 已提交
2027

M
Mr.doob 已提交
2028
		program.uniforms = {};
2029
		program.attributes = {};
M
Mr.doob 已提交
2030

M
Mr.doob 已提交
2031
		return program;
M
Mr.doob 已提交
2032

M
Mr.doob 已提交
2033
	};
M
Mr.doob 已提交
2034

M
Mr.doob 已提交
2035
	function setUniforms( program, uniforms ) {
M
Mr.doob 已提交
2036

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

M
Mr.doob 已提交
2039
		for( u in uniforms ) {
M
Mr.doob 已提交
2040

2041 2042
			location = program.uniforms[u];
			if ( !location ) continue;
M
Mr.doob 已提交
2043

2044
			uniform = uniforms[u];
M
Mr.doob 已提交
2045

2046 2047
			type = uniform.type;
			value = uniform.value;
M
Mr.doob 已提交
2048

M
Mr.doob 已提交
2049
			if( type == "i" ) {
M
Mr.doob 已提交
2050

M
Mr.doob 已提交
2051
				_gl.uniform1i( location, value );
M
Mr.doob 已提交
2052

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

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

A
alteredq 已提交
2057 2058 2059
			} else if( type == "fv1" ) {

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

2061 2062 2063 2064
			} else if( type == "fv" ) {

				_gl.uniform3fv( location, value );

2065 2066 2067 2068
			} else if( type == "v2" ) {

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

2069 2070 2071
			} else if( type == "v3" ) {

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

2073 2074 2075
			} else if( type == "c" ) {

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

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

M
Mr.doob 已提交
2079
				_gl.uniform1i( location, value );
M
Mr.doob 已提交
2080

2081
				texture = uniform.texture;
M
Mr.doob 已提交
2082

2083
				if ( !texture ) continue;
M
Mr.doob 已提交
2084

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

2087
					setCubeTexture( texture, value );
M
Mr.doob 已提交
2088

2089
				} else {
M
Mr.doob 已提交
2090

2091
					setTexture( texture, value );
M
Mr.doob 已提交
2092

2093
				}
M
Mr.doob 已提交
2094

2095
			}
M
Mr.doob 已提交
2096

2097
		}
M
Mr.doob 已提交
2098

2099
	};
M
Mr.doob 已提交
2100

2101
	function setCubeTexture( texture, slot ) {
M
Mr.doob 已提交
2102

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

2105 2106
			if ( !texture.image.__webGLTextureCube &&
				 !texture.image.__cubeMapInitialized && texture.image.loadCount == 6 ) {
M
Mr.doob 已提交
2107

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

2110
				_gl.bindTexture( _gl.TEXTURE_CUBE_MAP, texture.image.__webGLTextureCube );
2111

2112 2113
				_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 已提交
2114

2115 2116
				_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 已提交
2117

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

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

2122
				}
M
Mr.doob 已提交
2123

2124
				_gl.generateMipmap( _gl.TEXTURE_CUBE_MAP );
2125

2126
				_gl.bindTexture( _gl.TEXTURE_CUBE_MAP, null );
M
Mr.doob 已提交
2127

2128
				texture.image.__cubeMapInitialized = true;
M
Mr.doob 已提交
2129

M
Mr.doob 已提交
2130
			}
2131 2132 2133

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

2135
		}
M
Mr.doob 已提交
2136

M
Mr.doob 已提交
2137
	};
M
Mr.doob 已提交
2138

2139
	function setTexture( texture, slot ) {
M
Mr.doob 已提交
2140

2141 2142 2143 2144 2145
		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 已提交
2146

2147 2148
			_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 已提交
2149 2150 2151

			_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 ) );
2152 2153 2154 2155 2156 2157 2158
			_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 已提交
2159

2160
	};
M
Mr.doob 已提交
2161

A
alteredq 已提交
2162
	function setRenderTarget( renderTexture, clear ) {
2163 2164

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

2166 2167 2168 2169 2170
			renderTexture.__webGLFramebuffer = _gl.createFramebuffer();
			renderTexture.__webGLRenderbuffer = _gl.createRenderbuffer();
			renderTexture.__webGLTexture = _gl.createTexture();

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

2172 2173 2174 2175
			_gl.bindRenderbuffer( _gl.RENDERBUFFER, renderTexture.__webGLRenderbuffer );
			_gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_COMPONENT16, renderTexture.width, renderTexture.height );

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

2177 2178 2179 2180 2181
			_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 ) );
2182
			_gl.texImage2D( _gl.TEXTURE_2D, 0, paramThreeToGL( renderTexture.format ), renderTexture.width, renderTexture.height, 0, paramThreeToGL( renderTexture.format ), paramThreeToGL( renderTexture.type ), null );
2183 2184

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

2186 2187
			_gl.bindFramebuffer( _gl.FRAMEBUFFER, renderTexture.__webGLFramebuffer );
			_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D, renderTexture.__webGLTexture, 0 );
2188
			_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.RENDERBUFFER, renderTexture.__webGLRenderbuffer );
2189 2190

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

2192 2193 2194
			_gl.bindTexture( _gl.TEXTURE_2D, null );
			_gl.bindRenderbuffer( _gl.RENDERBUFFER, null );
			_gl.bindFramebuffer( _gl.FRAMEBUFFER, null);
M
Mr.doob 已提交
2195

2196 2197
		}

2198
		var framebuffer, width, height;
M
Mr.doob 已提交
2199

2200
		if ( renderTexture ) {
M
Mr.doob 已提交
2201

2202 2203 2204
			framebuffer = renderTexture.__webGLFramebuffer;
			width = renderTexture.width;
			height = renderTexture.height;
M
Mr.doob 已提交
2205

2206
		} else {
M
Mr.doob 已提交
2207

2208 2209 2210
			framebuffer = null;
			width = _canvas.width;
			height = _canvas.height;
M
Mr.doob 已提交
2211

2212
		}
M
Mr.doob 已提交
2213

2214
		if( framebuffer != _oldFramebuffer ) {
M
Mr.doob 已提交
2215

2216 2217
			_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );
			_gl.viewport( 0, 0, width, height );
M
Mr.doob 已提交
2218

A
alteredq 已提交
2219
			if ( clear ) {
M
Mr.doob 已提交
2220

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

A
alteredq 已提交
2223
			}
M
Mr.doob 已提交
2224

2225
			_oldFramebuffer = framebuffer;
M
Mr.doob 已提交
2226

2227
		}
2228

2229
	};
M
Mr.doob 已提交
2230

2231
	function updateRenderTargetMipmap( renderTarget ) {
M
Mr.doob 已提交
2232

2233 2234 2235
		_gl.bindTexture( _gl.TEXTURE_2D, renderTarget.__webGLTexture );
		_gl.generateMipmap( _gl.TEXTURE_2D );
		_gl.bindTexture( _gl.TEXTURE_2D, null );
M
Mr.doob 已提交
2236 2237

	};
2238

M
Mr.doob 已提交
2239
	function cacheUniformLocations( program, identifiers ) {
M
Mr.doob 已提交
2240

M
Mr.doob 已提交
2241
		var i, l, id;
M
Mr.doob 已提交
2242

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

2245 2246
			id = identifiers[ i ];
			program.uniforms[ id ] = _gl.getUniformLocation( program, id );
M
Mr.doob 已提交
2247

M
Mr.doob 已提交
2248
		}
M
Mr.doob 已提交
2249

M
Mr.doob 已提交
2250
	};
M
Mr.doob 已提交
2251

2252
	function cacheAttributeLocations( program, identifiers ) {
2253

2254
		var i, l, id;
M
Mr.doob 已提交
2255

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

2258 2259
			id = identifiers[ i ];
			program.attributes[ id ] = _gl.getAttribLocation( program, id );
M
Mr.doob 已提交
2260

2261
		}
M
Mr.doob 已提交
2262

M
Mr.doob 已提交
2263
	};
M
Mr.doob 已提交
2264

N
Nicolas Garcia Belmonte 已提交
2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289
	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 已提交
2290

2291
	};
N
Nicolas Garcia Belmonte 已提交
2292

2293
	function paramThreeToGL( p ) {
M
Mr.doob 已提交
2294

2295
		switch ( p ) {
M
Mr.doob 已提交
2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308

			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;

2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322
			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;

2323
		}
M
Mr.doob 已提交
2324

2325
		return 0;
M
Mr.doob 已提交
2326

2327 2328 2329 2330 2331 2332
	};

	function materialNeedsSmoothNormals( material ) {

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

2333
	};
M
Mr.doob 已提交
2334

M
Mr.doob 已提交
2335
	function bufferNeedsSmoothNormals( geometryChunk, object ) {
M
Mr.doob 已提交
2336

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

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

M
Mr.doob 已提交
2341
			meshMaterial = object.materials[ m ];
2342 2343 2344

			if ( meshMaterial instanceof THREE.MeshFaceMaterial ) {

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

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

2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369
						needsSmoothNormals = true;
						break;

					}

				}

			} else {

				if ( materialNeedsSmoothNormals( meshMaterial ) ) {

					needsSmoothNormals = true;
					break;

				}

			}

			if ( needsSmoothNormals ) break;

		}
M
Mr.doob 已提交
2370

2371
		return needsSmoothNormals;
M
Mr.doob 已提交
2372

2373
	};
M
Mr.doob 已提交
2374

2375
	function allocateLights( lights, maxLights ) {
2376

2377 2378
		var l, ll, light, dirLights, pointLights, maxDirLights, maxPointLights;
		dirLights = pointLights = maxDirLights = maxPointLights = 0;
2379

2380
		for ( l = 0, ll = lights.length; l < ll; l++ ) {
2381

2382
			light = lights[ l ];
2383

2384 2385
			if ( light instanceof THREE.DirectionalLight ) dirLights++;
			if ( light instanceof THREE.PointLight ) pointLights++;
2386

2387
		}
2388

2389
		if ( ( pointLights + dirLights ) <= maxLights ) {
2390

2391 2392
			maxDirLights = dirLights;
			maxPointLights = pointLights;
2393

2394
		} else {
2395

2396 2397
			maxDirLights = Math.ceil( maxLights * dirLights / ( pointLights + dirLights ) );
			maxPointLights = maxLights - maxDirLights;
2398 2399 2400

		}

2401
		return { 'directional' : maxDirLights, 'point' : maxPointLights };
2402 2403

	};
M
Mr.doob 已提交
2404

A
alteredq 已提交
2405
	/* DEBUG
2406
	function getGLParams() {
M
Mr.doob 已提交
2407

2408
		var params  = {
M
Mr.doob 已提交
2409

2410 2411
			'MAX_VARYING_VECTORS': _gl.getParameter( _gl.MAX_VARYING_VECTORS ),
			'MAX_VERTEX_ATTRIBS': _gl.getParameter( _gl.MAX_VERTEX_ATTRIBS ),
M
Mr.doob 已提交
2412

2413 2414 2415
			'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 已提交
2416

2417 2418 2419
			'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 已提交
2420

2421 2422
		return params;
	};
M
Mr.doob 已提交
2423

2424
	function dumpObject( obj ) {
M
Mr.doob 已提交
2425

2426 2427
		var p, str = "";
		for ( p in obj ) {
M
Mr.doob 已提交
2428

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

2431
		}
M
Mr.doob 已提交
2432

2433 2434
		return str;
	}
A
alteredq 已提交
2435
	*/
2436

2437
};
2438

2439
THREE.Snippets = {
M
Mr.doob 已提交
2440

2441 2442
	// FOG
	
2443
	fog_pars_fragment: [
M
Mr.doob 已提交
2444

2445
	"#ifdef USE_FOG",
2446

2447
		"uniform vec3 fogColor;",
2448

2449 2450 2451 2452 2453 2454
		"#ifdef FOG_EXP2",
			"uniform float fogDensity;",
		"#else",
			"uniform float fogNear;",
			"uniform float fogFar;",
		"#endif",
2455

2456
	"#endif"
2457

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

2460
	fog_fragment: [
2461

2462
	"#ifdef USE_FOG",
2463

2464 2465 2466 2467 2468 2469 2470 2471 2472
		"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",
2473

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

2476
	"#endif"
M
Mr.doob 已提交
2477

2478
	].join("\n"),
M
Mr.doob 已提交
2479

2480 2481
	// ENVIRONMENT MAP
	
2482
	envmap_pars_fragment: [
M
Mr.doob 已提交
2483

2484
	"#ifdef USE_ENVMAP",
M
Mr.doob 已提交
2485

2486 2487 2488 2489
		"varying vec3 vReflect;",
		"uniform float reflectivity;",
		"uniform samplerCube env_map;",
		"uniform int combine;",
M
Mr.doob 已提交
2490

2491
	"#endif"
M
Mr.doob 已提交
2492

2493
	].join("\n"),
M
Mr.doob 已提交
2494

2495
	envmap_fragment: [
M
Mr.doob 已提交
2496

2497 2498
	"#ifdef USE_ENVMAP",

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

2501 2502
		"if ( combine == 1 ) {",

2503 2504
			//"gl_FragColor = mix( gl_FragColor, cubeColor, reflectivity );",
			"gl_FragColor = vec4( mix( gl_FragColor.xyz, cubeColor.xyz, reflectivity ), opacity );",
2505 2506 2507 2508 2509

		"} else {",

			"gl_FragColor = gl_FragColor * cubeColor;",

M
Mr.doob 已提交
2510
		"}",
2511 2512

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

2514
	].join("\n"),
M
Mr.doob 已提交
2515

2516
	envmap_pars_vertex: [
M
Mr.doob 已提交
2517

2518
	"#ifdef USE_ENVMAP",
M
Mr.doob 已提交
2519

2520 2521 2522
		"varying vec3 vReflect;",
		"uniform float refraction_ratio;",
		"uniform bool useRefract;",
M
Mr.doob 已提交
2523

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

2526 2527 2528
	].join("\n"),

	envmap_vertex : [
M
Mr.doob 已提交
2529

2530
	"#ifdef USE_ENVMAP",
M
Mr.doob 已提交
2531

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

2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545
		"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 已提交
2546

2547
	].join("\n"),
2548
	
2549 2550 2551 2552 2553 2554 2555 2556 2557 2558 2559 2560 2561 2562 2563 2564 2565
	// COLOR MAP (particles)

	map_particle_pars_fragment: [

	"#ifdef USE_MAP",

		"uniform sampler2D map;",

	"#endif"

	].join("\n"),


	map_particle_fragment: [

	"#ifdef USE_MAP",

A
alteredq 已提交
2566
		"gl_FragColor = gl_FragColor * texture2D( map, gl_PointCoord );",
2567 2568 2569 2570 2571 2572

	"#endif"

	].join("\n"),

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

2574
	map_pars_fragment: [
M
Mr.doob 已提交
2575

2576
	"#ifdef USE_MAP",
M
Mr.doob 已提交
2577

2578 2579
		"varying vec2 vUv;",
		"uniform sampler2D map;",
M
Mr.doob 已提交
2580

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

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

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

2587
	"#ifdef USE_MAP",
M
Mr.doob 已提交
2588

2589 2590 2591
		"varying vec2 vUv;",

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

2593
	].join("\n"),
M
Mr.doob 已提交
2594

2595 2596 2597 2598
	map_fragment: [

	"#ifdef USE_MAP",

A
alteredq 已提交
2599
		"gl_FragColor = gl_FragColor * texture2D( map, vUv );",
2600 2601

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

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

2605
	map_vertex: [
M
Mr.doob 已提交
2606

2607
	"#ifdef USE_MAP",
M
Mr.doob 已提交
2608

2609
		"vUv = uv;",
M
Mr.doob 已提交
2610

2611
	"#endif"
M
Mr.doob 已提交
2612

2613
	].join("\n"),
M
Mr.doob 已提交
2614

2615 2616 2617 2618 2619 2620 2621 2622 2623 2624 2625 2626 2627 2628 2629 2630 2631 2632 2633 2634 2635 2636 2637 2638 2639 2640 2641
	// 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 已提交
2642
		"gl_FragColor = gl_FragColor * texture2D( light_map, vUv2 );",
2643 2644 2645 2646 2647 2648 2649 2650 2651 2652 2653 2654 2655 2656 2657

	"#endif"

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

	"#ifdef USE_LIGHTMAP",

		"vUv2 = uv2;",

	"#endif"

	].join("\n"),

2658
	lights_pars_vertex: [
M
Mr.doob 已提交
2659

2660 2661
	"uniform bool enableLighting;",
	"uniform vec3 ambientLightColor;",
M
Mr.doob 已提交
2662

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

2665 2666
		"uniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];",
		"uniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];",
M
Mr.doob 已提交
2667

2668 2669 2670
	"#endif",

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

2672 2673
		"uniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];",
		"uniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];",
M
Mr.doob 已提交
2674

2675 2676 2677
		"#ifdef PHONG",
			"varying vec3 vPointLightVector[ MAX_POINT_LIGHTS ];",
		"#endif",
M
Mr.doob 已提交
2678

2679
	"#endif"
M
Mr.doob 已提交
2680

2681
	].join("\n"),
M
Mr.doob 已提交
2682

2683 2684
	// LIGHTS
	
2685
	lights_vertex: [
M
Mr.doob 已提交
2686

2687 2688
	"if ( !enableLighting ) {",

A
alteredq 已提交
2689
		"vLightWeighting = vec3( 1.0 );",
2690 2691 2692 2693 2694 2695

	"} else {",

		"vLightWeighting = ambientLightColor;",

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

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

2699 2700 2701
			"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 已提交
2702

2703
		"}",
M
Mr.doob 已提交
2704

2705 2706 2707
		"#endif",

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

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

2711 2712 2713 2714
			"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 已提交
2715

2716 2717 2718
			"#ifdef PHONG",
				"vPointLightVector[ i ] = pointLightVector;",
			"#endif",
M
Mr.doob 已提交
2719

2720
		"}",
M
Mr.doob 已提交
2721

2722
		"#endif",
M
Mr.doob 已提交
2723

2724
	"}"
M
Mr.doob 已提交
2725

2726
	].join("\n"),
M
Mr.doob 已提交
2727

2728
	lights_pars_fragment: [
M
Mr.doob 已提交
2729

2730 2731 2732
	"#if MAX_DIR_LIGHTS > 0",
		"uniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];",
	"#endif",
M
Mr.doob 已提交
2733

2734 2735 2736
	"#if MAX_POINT_LIGHTS > 0",
		"varying vec3 vPointLightVector[ MAX_POINT_LIGHTS ];",
	"#endif",
M
Mr.doob 已提交
2737

2738 2739
	"varying vec3 vViewPosition;",
	"varying vec3 vNormal;"
M
Mr.doob 已提交
2740

2741
	].join("\n"),
M
Mr.doob 已提交
2742

2743
	lights_fragment: [
M
Mr.doob 已提交
2744

2745 2746
	"vec3 normal = normalize( vNormal );",
	"vec3 viewPosition = normalize( vViewPosition );",
A
alteredq 已提交
2747 2748
	
	"vec4 mColor = vec4( diffuse, opacity );",
2749 2750 2751
	"vec4 mSpecular = vec4( specular, opacity );",

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

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

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

2777 2778 2779 2780 2781 2782 2783 2784 2785 2786 2787 2788 2789 2790 2791 2792 2793 2794 2795 2796 2797 2798
		"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 已提交
2799

2800 2801 2802 2803 2804 2805 2806
	"#endif",

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

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

2808 2809
	"#if MAX_POINT_LIGHTS > 0",
		"totalLight += pointDiffuse + pointSpecular;",
A
alteredq 已提交
2810 2811 2812
	"#endif",
	
	"gl_FragColor = gl_FragColor * totalLight;"
2813

A
alteredq 已提交
2814 2815 2816 2817 2818 2819 2820 2821 2822 2823 2824 2825 2826 2827 2828 2829 2830 2831 2832
	].join("\n"),
	
	// VERTEX COLORS

	color_pars_fragment: [

	"#ifdef USE_COLOR",

		"varying vec3 vColor;",

	"#endif"

	].join("\n"),


	color_fragment: [

	"#ifdef USE_COLOR",

A
alteredq 已提交
2833
		"gl_FragColor = gl_FragColor * vec4( vColor, opacity );",
A
alteredq 已提交
2834 2835 2836 2837 2838 2839 2840 2841 2842 2843 2844 2845 2846 2847 2848 2849 2850 2851 2852 2853 2854 2855 2856 2857

	"#endif"

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

	"#ifdef USE_COLOR",

		"varying vec3 vColor;",

	"#endif"

	].join("\n"),


	color_vertex: [

	"#ifdef USE_COLOR",

		"vColor = color;",

	"#endif"

2858
	].join("\n")
A
alteredq 已提交
2859
	
2860

2861
};
2862

2863
THREE.UniformsLib = {
M
Mr.doob 已提交
2864

2865
	common: {
M
Mr.doob 已提交
2866

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

2871 2872
	"light_map"       : { type: "t", value: 2, texture: null },

2873 2874
	"env_map" 		  : { type: "t", value: 1, texture: null },
	"useRefract"	  : { type: "i", value: 0 },
2875
	"reflectivity"    : { type: "f", value: 1.0 },
2876 2877
	"refraction_ratio": { type: "f", value: 0.98 },
	"combine"		  : { type: "i", value: 0 },
M
Mr.doob 已提交
2878

2879 2880 2881 2882
	"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 已提交
2883

2884
	},
M
Mr.doob 已提交
2885

2886
	lights: {
M
Mr.doob 已提交
2887

2888 2889 2890 2891 2892 2893
	"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 已提交
2894

2895 2896 2897 2898
	},

	particle: {

A
alteredq 已提交
2899
	"psColor"   : { type: "c", value: new THREE.Color( 0xeeeeee ) },
2900 2901
	"opacity" : { type: "f", value: 1.0 },
	"size" 	  : { type: "f", value: 1.0 },
2902
	"map"     : { type: "t", value: 0, texture: null },
M
Mr.doob 已提交
2903

2904 2905 2906 2907 2908 2909 2910
	"fogDensity": { type: "f", value: 0.00025 },
	"fogNear"	: { type: "f", value: 1 },
	"fogFar"	: { type: "f", value: 2000 },
	"fogColor"	: { type: "c", value: new THREE.Color( 0xffffff ) }
	
	}
	
2911 2912
};

2913
THREE.ShaderLib = {
2914

2915
	'depth': {
M
Mr.doob 已提交
2916

2917
		uniforms: { "mNear": { type: "f", value: 1.0 },
2918
					"mFar" : { type: "f", value: 2000.0 },
A
alteredq 已提交
2919
					"opacity" : { type: "f", value: 1.0 }
2920
				  },
2921

2922
		fragment_shader: [
M
Mr.doob 已提交
2923

2924 2925
			"uniform float mNear;",
			"uniform float mFar;",
2926
			"uniform float opacity;",
M
Mr.doob 已提交
2927

2928
			"void main() {",
M
Mr.doob 已提交
2929

2930 2931
				"float depth = gl_FragCoord.z / gl_FragCoord.w;",
				"float color = 1.0 - smoothstep( mNear, mFar, depth );",
2932
				"gl_FragColor = vec4( vec3( color ), opacity );",
M
Mr.doob 已提交
2933

2934
			"}"
M
Mr.doob 已提交
2935

2936
		].join("\n"),
2937

2938
		vertex_shader: [
2939

2940
			"void main() {",
2941

2942
				"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",
2943

2944
			"}"
2945

2946
		].join("\n")
2947

2948
	},
2949

2950
	'normal': {
M
Mr.doob 已提交
2951

2952
		uniforms: { "opacity" : { type: "f", value: 1.0 } },
2953

2954
		fragment_shader: [
2955

2956
			"uniform float opacity;",
2957
			"varying vec3 vNormal;",
M
Mr.doob 已提交
2958

2959
			"void main() {",
2960

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

2963
			"}"
M
Mr.doob 已提交
2964

2965
		].join("\n"),
M
Mr.doob 已提交
2966

2967
		vertex_shader: [
2968

2969
			"varying vec3 vNormal;",
2970

2971 2972 2973 2974 2975 2976 2977 2978 2979 2980 2981 2982
			"void main() {",

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

				"gl_Position = projectionMatrix * mvPosition;",

			"}"

		].join("\n")

	},
2983

2984
	'basic': {
M
Mr.doob 已提交
2985

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

2988
		fragment_shader: [
2989

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

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() {",
3000

A
alteredq 已提交
3001 3002
				"gl_FragColor = vec4( diffuse, opacity );",
		
3003
				THREE.Snippets[ "map_fragment" ],
3004
				THREE.Snippets[ "lightmap_fragment" ],
3005
				THREE.Snippets[ "color_fragment" ],
3006 3007
				THREE.Snippets[ "envmap_fragment" ],
				THREE.Snippets[ "fog_fragment" ],
M
Mr.doob 已提交
3008

3009
			"}"
3010

3011
		].join("\n"),
M
Mr.doob 已提交
3012

3013
		vertex_shader: [
M
Mr.doob 已提交
3014

3015
			THREE.Snippets[ "map_pars_vertex" ],
3016
			THREE.Snippets[ "lightmap_pars_vertex" ],
3017
			THREE.Snippets[ "envmap_pars_vertex" ],
3018
			THREE.Snippets[ "color_pars_vertex" ],
M
Mr.doob 已提交
3019

3020
			"void main() {",
M
Mr.doob 已提交
3021

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

3024
				THREE.Snippets[ "map_vertex" ],
3025
				THREE.Snippets[ "lightmap_vertex" ],
3026
				THREE.Snippets[ "envmap_vertex" ],
3027
				THREE.Snippets[ "color_vertex" ],
M
Mr.doob 已提交
3028

3029
				"gl_Position = projectionMatrix * mvPosition;",
3030

3031
			"}"
3032

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

3035
	},
3036

3037
	'lambert': {
M
Mr.doob 已提交
3038 3039

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

3042
		fragment_shader: [
M
Mr.doob 已提交
3043

A
alteredq 已提交
3044
			"uniform vec3 diffuse;",
3045
			"uniform float opacity;",
M
Mr.doob 已提交
3046

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

A
alteredq 已提交
3049
			THREE.Snippets[ "color_pars_fragment" ],
3050
			THREE.Snippets[ "map_pars_fragment" ],
3051
			THREE.Snippets[ "lightmap_pars_fragment" ],
3052 3053
			THREE.Snippets[ "envmap_pars_fragment" ],
			THREE.Snippets[ "fog_pars_fragment" ],
M
Mr.doob 已提交
3054

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

A
alteredq 已提交
3057 3058
				"gl_FragColor = vec4( diffuse, opacity );",
				"gl_FragColor = gl_FragColor * vec4( vLightWeighting, 1.0 );",
3059 3060

				THREE.Snippets[ "map_fragment" ],
3061
				THREE.Snippets[ "lightmap_fragment" ],
A
alteredq 已提交
3062
				THREE.Snippets[ "color_fragment" ],
3063
				THREE.Snippets[ "envmap_fragment" ],
3064 3065 3066 3067 3068 3069 3070
				THREE.Snippets[ "fog_fragment" ],

			"}"

		].join("\n"),

		vertex_shader: [
M
Mr.doob 已提交
3071

3072
			"varying vec3 vLightWeighting;",
M
Mr.doob 已提交
3073

3074
			THREE.Snippets[ "map_pars_vertex" ],
3075
			THREE.Snippets[ "lightmap_pars_vertex" ],
3076 3077
			THREE.Snippets[ "envmap_pars_vertex" ],
			THREE.Snippets[ "lights_pars_vertex" ],
A
alteredq 已提交
3078
			THREE.Snippets[ "color_pars_vertex" ],
M
Mr.doob 已提交
3079

3080
			"void main() {",
M
Mr.doob 已提交
3081

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

3084
				THREE.Snippets[ "map_vertex" ],
3085
				THREE.Snippets[ "lightmap_vertex" ],
3086
				THREE.Snippets[ "envmap_vertex" ],
A
alteredq 已提交
3087
				THREE.Snippets[ "color_vertex" ],
M
Mr.doob 已提交
3088

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

3091
				THREE.Snippets[ "lights_vertex" ],
M
Mr.doob 已提交
3092

3093 3094 3095 3096 3097
				"gl_Position = projectionMatrix * mvPosition;",

			"}"

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

3099
	},
M
Mr.doob 已提交
3100

3101
	'phong': {
M
Mr.doob 已提交
3102 3103

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

3106
									{ "ambient"  : { type: "c", value: new THREE.Color( 0x050505 ) },
3107 3108 3109
									  "specular" : { type: "c", value: new THREE.Color( 0x111111 ) },
									  "shininess": { type: "f", value: 30 }
									}
M
Mr.doob 已提交
3110

3111
								] ),
M
Mr.doob 已提交
3112

3113
		fragment_shader: [
M
Mr.doob 已提交
3114

A
alteredq 已提交
3115
			"uniform vec3 diffuse;",
3116
			"uniform float opacity;",
M
Mr.doob 已提交
3117

3118 3119 3120
			"uniform vec3 ambient;",
			"uniform vec3 specular;",
			"uniform float shininess;",
M
Mr.doob 已提交
3121

3122
			"varying vec3 vLightWeighting;",
M
Mr.doob 已提交
3123

A
alteredq 已提交
3124
			THREE.Snippets[ "color_pars_fragment" ],
3125
			THREE.Snippets[ "map_pars_fragment" ],
3126
			THREE.Snippets[ "lightmap_pars_fragment" ],
3127 3128 3129
			THREE.Snippets[ "envmap_pars_fragment" ],
			THREE.Snippets[ "fog_pars_fragment" ],
			THREE.Snippets[ "lights_pars_fragment" ],
M
Mr.doob 已提交
3130

3131
			"void main() {",
M
Mr.doob 已提交
3132

A
alteredq 已提交
3133 3134
				"gl_FragColor = vec4( vLightWeighting, 1.0 );",
				THREE.Snippets[ "lights_fragment" ],
3135 3136

				THREE.Snippets[ "map_fragment" ],
3137
				THREE.Snippets[ "lightmap_fragment" ],
A
alteredq 已提交
3138
				THREE.Snippets[ "color_fragment" ],
3139 3140 3141 3142 3143 3144 3145 3146
				THREE.Snippets[ "envmap_fragment" ],
				THREE.Snippets[ "fog_fragment" ],

			"}"

		].join("\n"),

		vertex_shader: [
M
Mr.doob 已提交
3147

3148
			"#define PHONG",
M
Mr.doob 已提交
3149

3150 3151 3152
			"varying vec3 vLightWeighting;",
			"varying vec3 vViewPosition;",
			"varying vec3 vNormal;",
M
Mr.doob 已提交
3153

3154
			THREE.Snippets[ "map_pars_vertex" ],
3155
			THREE.Snippets[ "lightmap_pars_vertex" ],
3156 3157
			THREE.Snippets[ "envmap_pars_vertex" ],
			THREE.Snippets[ "lights_pars_vertex" ],
A
alteredq 已提交
3158
			THREE.Snippets[ "color_pars_vertex" ],
M
Mr.doob 已提交
3159

3160
			"void main() {",
M
Mr.doob 已提交
3161

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

3164
				THREE.Snippets[ "map_vertex" ],
3165
				THREE.Snippets[ "lightmap_vertex" ],
3166
				THREE.Snippets[ "envmap_vertex" ],
A
alteredq 已提交
3167
				THREE.Snippets[ "color_vertex" ],
M
Mr.doob 已提交
3168

3169 3170 3171
				"#ifndef USE_ENVMAP",
					"vec4 mPosition = objectMatrix * vec4( position, 1.0 );",
				"#endif",
M
Mr.doob 已提交
3172

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

3175 3176
				"vec3 transformedNormal = normalize( normalMatrix * normal );",
				"vNormal = transformedNormal;",
3177

3178
				THREE.Snippets[ "lights_vertex" ],
M
Mr.doob 已提交
3179

3180
				"gl_Position = projectionMatrix * mvPosition;",
3181 3182 3183 3184

			"}"

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

3186 3187 3188 3189 3190 3191 3192 3193
	},
	
	'particle_basic': {

		uniforms: THREE.UniformsLib[ "particle" ],

		fragment_shader: [

A
alteredq 已提交
3194
			"uniform vec3 psColor;",
3195 3196
			"uniform float opacity;",

A
alteredq 已提交
3197
			THREE.Snippets[ "color_pars_fragment" ],
3198 3199 3200 3201 3202
			THREE.Snippets[ "map_particle_pars_fragment" ],
			THREE.Snippets[ "fog_pars_fragment" ],

			"void main() {",

A
alteredq 已提交
3203
				"gl_FragColor = vec4( psColor, opacity );",
3204 3205

				THREE.Snippets[ "map_particle_fragment" ],
A
alteredq 已提交
3206
				THREE.Snippets[ "color_fragment" ],
3207 3208 3209 3210 3211 3212 3213 3214 3215 3216
				THREE.Snippets[ "fog_fragment" ],

			"}"

		].join("\n"),

		vertex_shader: [

			"uniform float size;",
			
A
alteredq 已提交
3217 3218
			THREE.Snippets[ "color_pars_vertex" ],
			
3219 3220
			"void main() {",

A
alteredq 已提交
3221 3222
				THREE.Snippets[ "color_vertex" ],
				
3223 3224 3225 3226 3227 3228 3229 3230 3231 3232
				"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 已提交
3233
	}
3234
	
A
alteredq 已提交
3235

N
Nicolas Garcia Belmonte 已提交
3236
};