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

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

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

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

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

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

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

M
Mr.doob 已提交
23
	var _canvas = document.createElement( 'canvas' ), _gl,
24
	_oldProgram = null,
25
	_oldFramebuffer = null,
26
	_modelViewMatrix = new THREE.Matrix4(), _normalMatrix,
M
Mr.doob 已提交
27 28 29 30

	_viewMatrixArray = new Float32Array(16),
	_modelViewMatrixArray = new Float32Array(16),
	_projectionMatrixArray = new Float32Array(16),
M
Mr.doob 已提交
31
	_normalMatrixArray = new Float32Array(9),
M
Mr.doob 已提交
32
	_objectMatrixArray = new Float32Array(16),
M
Mr.doob 已提交
33

34
	// parameters defaults
M
Mr.doob 已提交
35

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

40
	if ( parameters ) {
M
Mr.doob 已提交
41

42 43 44
		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 已提交
45

46
	}
M
Mr.doob 已提交
47

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

51
	initGL( antialias, clearColor, clearAlpha );
M
Mr.doob 已提交
52

53 54
	this.context = _gl;

55
	//alert( dumpObject( getGLParams() ) );
M
Mr.doob 已提交
56

57
	this.lights = {
M
Mr.doob 已提交
58 59 60

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

63
	};
M
Mr.doob 已提交
64

65

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

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

	};

74
	this.setClearColor = function( hex, alpha ) {
75

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

79
	};
80

N
Nicolas Garcia Belmonte 已提交
81 82 83 84 85 86
	this.clear = function () {

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

	};

M
Mr.doob 已提交
87

88
	this.setupLights = function ( program, lights ) {
89

90
		var l, ll, light, r = 0, g = 0, b = 0,
91
			color, position, intensity,
M
Mr.doob 已提交
92

93
			zlights = this.lights,
M
Mr.doob 已提交
94

95 96
			dcolors    = zlights.directional.colors,
			dpositions = zlights.directional.positions,
97

98 99
			pcolors    = zlights.point.colors,
			ppositions = zlights.point.positions,
100

101 102
			dlength = 0,
			plength = 0;
M
Mr.doob 已提交
103

104
		for ( l = 0, ll = lights.length; l < ll; l++ ) {
105

106
			light = lights[ l ];
107 108 109
			color = light.color;
			position = light.position;
			intensity = light.intensity;
110 111 112

			if ( light instanceof THREE.AmbientLight ) {

113 114 115
				r += color.r;
				g += color.g;
				b += color.b;
M
Mr.doob 已提交
116

117
			} else if ( light instanceof THREE.DirectionalLight ) {
118

119 120 121
				dcolors[ dlength*3 ]     = color.r * intensity;
				dcolors[ dlength*3 + 1 ] = color.g * intensity;
				dcolors[ dlength*3 + 2 ] = color.b * intensity;
122

123 124 125
				dpositions[ dlength*3 ]     = position.x;
				dpositions[ dlength*3 + 1 ] = position.y;
				dpositions[ dlength*3 + 2 ] = position.z;
126

127
				dlength += 1;
M
Mr.doob 已提交
128

129 130
			} else if( light instanceof THREE.PointLight ) {

131 132 133 134 135 136 137
				pcolors[ plength*3 ]     = color.r * intensity;
				pcolors[ plength*3 + 1 ] = color.g * intensity;
				pcolors[ plength*3 + 2 ] = color.b * intensity;

				ppositions[ plength*3 ]     = position.x;
				ppositions[ plength*3 + 1 ] = position.y;
				ppositions[ plength*3 + 2 ] = position.z;
M
Mr.doob 已提交
138

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

141 142 143
			}

		}
M
Mr.doob 已提交
144

145 146
		zlights.point.length = plength;
		zlights.directional.length = dlength;
M
Mr.doob 已提交
147

148 149 150
		zlights.ambient[ 0 ] = r;
		zlights.ambient[ 1 ] = g;
		zlights.ambient[ 2 ] = b;
M
Mr.doob 已提交
151

152
	};
M
Mr.doob 已提交
153

154
	this.createParticleBuffers = function( geometry ) {
M
Mr.doob 已提交
155

156
		geometry.__webGLVertexBuffer = _gl.createBuffer();
157
		geometry.__webGLParticleBuffer = _gl.createBuffer();
M
Mr.doob 已提交
158

159
	};
M
Mr.doob 已提交
160

161
	this.createLineBuffers = function( geometry ) {
M
Mr.doob 已提交
162

163 164
		geometry.__webGLVertexBuffer = _gl.createBuffer();
		geometry.__webGLLineBuffer = _gl.createBuffer();
M
Mr.doob 已提交
165

166
	};
167 168

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

170 171 172 173
		geometryChunk.__webGLVertexBuffer = _gl.createBuffer();
		geometryChunk.__webGLNormalBuffer = _gl.createBuffer();
		geometryChunk.__webGLTangentBuffer = _gl.createBuffer();
		geometryChunk.__webGLUVBuffer = _gl.createBuffer();
174
		geometryChunk.__webGLUV2Buffer = _gl.createBuffer();
175 176
		geometryChunk.__webGLFaceBuffer = _gl.createBuffer();
		geometryChunk.__webGLLineBuffer = _gl.createBuffer();
M
Mr.doob 已提交
177

178
	};
179 180

	this.initLineBuffers = function( geometry ) {
M
Mr.doob 已提交
181

182 183 184 185
		var nvertices = geometry.vertices.length;

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

187
		geometry.__webGLLineCount = nvertices;
M
Mr.doob 已提交
188

189
	};
M
Mr.doob 已提交
190

191 192 193 194 195 196 197 198 199 200 201
	this.initParticleBuffers = function( geometry ) {

		var nvertices = geometry.vertices.length;

		geometry.__vertexArray = new Float32Array( nvertices * 3 );
		geometry.__particleArray = new Uint16Array( nvertices );

		geometry.__webGLParticleCount = nvertices;

	};

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

204
		var f, fl, nvertices = 0, ntris = 0, nlines = 0,
M
Mr.doob 已提交
205
			obj_faces = object.geometry.faces,
206
			chunk_faces = geometryChunk.faces;
M
Mr.doob 已提交
207

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

210 211
			fi = chunk_faces[ f ];
			face = obj_faces[ fi ];
M
Mr.doob 已提交
212

213
			if ( face instanceof THREE.Face3 ) {
M
Mr.doob 已提交
214

215 216 217
				nvertices += 3;
				ntris += 1;
				nlines += 3;
M
Mr.doob 已提交
218

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

221 222
				nvertices += 4;
				ntris += 2;
223
				nlines += 4;
M
Mr.doob 已提交
224

225
			}
M
Mr.doob 已提交
226

227
		}
M
Mr.doob 已提交
228

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

231 232 233 234
		geometryChunk.__vertexArray  = new Float32Array( nvertices * 3 );
		geometryChunk.__normalArray  = new Float32Array( nvertices * 3 );
		geometryChunk.__tangentArray = new Float32Array( nvertices * 4 );
		geometryChunk.__uvArray = new Float32Array( nvertices * 2 );
235
		geometryChunk.__uv2Array = new Float32Array( nvertices * 2 );
M
Mr.doob 已提交
236

237 238
		geometryChunk.__faceArray = new Uint16Array( ntris * 3 );
		geometryChunk.__lineArray = new Uint16Array( nlines * 2 );
M
Mr.doob 已提交
239

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

242 243
		geometryChunk.__webGLFaceCount = ntris * 3;
		geometryChunk.__webGLLineCount = nlines * 2;
M
Mr.doob 已提交
244

245
	};
M
Mr.doob 已提交
246

247
	this.setMeshBuffers = function ( geometryChunk, object, hint, dirtyVertices, dirtyElements, dirtyUvs, dirtyNormals, dirtyTangents ) {
248

249 250
		var f, fl, fi, face, vertexNormals, faceNormal, normal, uv, uv2, v1, v2, v3, v4, t1, t2, t3, t4, m, ml, i,
			vn, uvi, uv2i,
M
Mr.doob 已提交
251

252
		vertexIndex = 0,
253

254 255
		offset = 0,
		offset_uv = 0,
256
		offset_uv2 = 0,
257 258 259 260
		offset_face = 0,
		offset_normal = 0,
		offset_tangent = 0,
		offset_line = 0,
M
Mr.doob 已提交
261

262 263
		vertexArray = geometryChunk.__vertexArray,
		uvArray = geometryChunk.__uvArray,
264
		uv2Array = geometryChunk.__uv2Array,
265 266
		normalArray = geometryChunk.__normalArray,
		tangentArray = geometryChunk.__tangentArray,
M
Mr.doob 已提交
267

268 269
		faceArray = geometryChunk.__faceArray,
		lineArray = geometryChunk.__lineArray,
M
Mr.doob 已提交
270

271
		needsSmoothNormals = geometryChunk.__needsSmoothNormals,
M
Mr.doob 已提交
272

273 274 275 276
		geometry = object.geometry,
		vertices = geometry.vertices,
		chunk_faces = geometryChunk.faces,
		obj_faces = geometry.faces,
277 278
		obj_uvs = geometry.uvs,
		obj_uvs2 = geometry.uvs2;
M
Mr.doob 已提交
279

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

282 283 284
			fi = chunk_faces[ f ];
			face = obj_faces[ fi ];
			uv = obj_uvs[ fi ];
285
			uv2 = obj_uvs2[ fi ];
M
Mr.doob 已提交
286

287
			vertexNormals = face.vertexNormals;
288
			faceNormal = face.normal;
289 290 291

			if ( face instanceof THREE.Face3 ) {

292
				if ( dirtyVertices ) {
M
Mr.doob 已提交
293

294 295 296
					v1 = vertices[ face.a ].position;
					v2 = vertices[ face.b ].position;
					v3 = vertices[ face.c ].position;
M
Mr.doob 已提交
297

298 299 300
					vertexArray[ offset ]     = v1.x;
					vertexArray[ offset + 1 ] = v1.y;
					vertexArray[ offset + 2 ] = v1.z;
M
Mr.doob 已提交
301

302 303 304
					vertexArray[ offset + 3 ] = v2.x;
					vertexArray[ offset + 4 ] = v2.y;
					vertexArray[ offset + 5 ] = v2.z;
305

306 307 308
					vertexArray[ offset + 6 ] = v3.x;
					vertexArray[ offset + 7 ] = v3.y;
					vertexArray[ offset + 8 ] = v3.z;
M
Mr.doob 已提交
309

310
					offset += 9;
M
Mr.doob 已提交
311

312
				}
313

314
				if ( dirtyTangents && geometry.hasTangents ) {
315

316 317 318
					t1 = vertices[ face.a ].tangent;
					t2 = vertices[ face.b ].tangent;
					t3 = vertices[ face.c ].tangent;
319

320 321 322 323
					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 已提交
324

325 326 327 328
					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 已提交
329

330 331 332 333
					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 已提交
334

335
					offset_tangent += 12;
M
Mr.doob 已提交
336

337 338
				}

339
				if( dirtyNormals ) {
M
Mr.doob 已提交
340

341 342
					if ( vertexNormals.length == 3 && needsSmoothNormals ) {

343

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

346
							vn = vertexNormals[ i ];
M
Mr.doob 已提交
347

348 349 350
							normalArray[ offset_normal ]     = vn.x;
							normalArray[ offset_normal + 1 ] = vn.y;
							normalArray[ offset_normal + 2 ] = vn.z;
M
Mr.doob 已提交
351

352
							offset_normal += 3;
M
Mr.doob 已提交
353

354
						}
M
Mr.doob 已提交
355

356
					} else {
357

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

360 361 362
							normalArray[ offset_normal ]     = faceNormal.x;
							normalArray[ offset_normal + 1 ] = faceNormal.y;
							normalArray[ offset_normal + 2 ] = faceNormal.z;
M
Mr.doob 已提交
363

364
							offset_normal += 3;
M
Mr.doob 已提交
365

366
						}
M
Mr.doob 已提交
367 368

					}
M
Mr.doob 已提交
369

370 371
				}

372
				if ( dirtyUvs && uv ) {
373

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

376
						uvi = uv[ i ];
M
Mr.doob 已提交
377

378 379
						uvArray[ offset_uv ]     = uvi.u;
						uvArray[ offset_uv + 1 ] = uvi.v;
M
Mr.doob 已提交
380

381
						offset_uv += 2;
M
Mr.doob 已提交
382

M
Mr.doob 已提交
383
					}
384 385 386

				}

387 388 389 390 391 392 393 394 395 396 397 398 399 400 401
				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;

					}

				}

402
				if( dirtyElements ) {
M
Mr.doob 已提交
403

404 405 406
					faceArray[ offset_face ] = vertexIndex;
					faceArray[ offset_face + 1 ] = vertexIndex + 1;
					faceArray[ offset_face + 2 ] = vertexIndex + 2;
M
Mr.doob 已提交
407

408
					offset_face += 3;
M
Mr.doob 已提交
409

410 411
					lineArray[ offset_line ]     = vertexIndex;
					lineArray[ offset_line + 1 ] = vertexIndex + 1;
M
Mr.doob 已提交
412

413 414
					lineArray[ offset_line + 2 ] = vertexIndex;
					lineArray[ offset_line + 3 ] = vertexIndex + 2;
M
Mr.doob 已提交
415

416 417
					lineArray[ offset_line + 4 ] = vertexIndex + 1;
					lineArray[ offset_line + 5 ] = vertexIndex + 2;
M
Mr.doob 已提交
418

419
					offset_line += 6;
420

421
					vertexIndex += 3;
M
Mr.doob 已提交
422

423
				}
M
Mr.doob 已提交
424

425 426 427

			} else if ( face instanceof THREE.Face4 ) {

428
				if ( dirtyVertices ) {
M
Mr.doob 已提交
429

430 431 432 433
					v1 = vertices[ face.a ].position;
					v2 = vertices[ face.b ].position;
					v3 = vertices[ face.c ].position;
					v4 = vertices[ face.d ].position;
M
Mr.doob 已提交
434

435 436 437
					vertexArray[ offset ]     = v1.x;
					vertexArray[ offset + 1 ] = v1.y;
					vertexArray[ offset + 2 ] = v1.z;
M
Mr.doob 已提交
438

439 440 441
					vertexArray[ offset + 3 ] = v2.x;
					vertexArray[ offset + 4 ] = v2.y;
					vertexArray[ offset + 5 ] = v2.z;
442

443 444 445
					vertexArray[ offset + 6 ] = v3.x;
					vertexArray[ offset + 7 ] = v3.y;
					vertexArray[ offset + 8 ] = v3.z;
446

447 448 449
					vertexArray[ offset + 9 ] = v4.x;
					vertexArray[ offset + 10 ] = v4.y;
					vertexArray[ offset + 11 ] = v4.z;
M
Mr.doob 已提交
450

451
					offset += 12;
M
Mr.doob 已提交
452

453
				}
454

455
				if ( dirtyTangents && geometry.hasTangents ) {
456

457 458 459 460
					t1 = vertices[ face.a ].tangent;
					t2 = vertices[ face.b ].tangent;
					t3 = vertices[ face.c ].tangent;
					t4 = vertices[ face.d ].tangent;
461

462 463 464 465
					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 已提交
466

467 468 469 470
					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 已提交
471

472 473 474 475
					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 已提交
476

477 478 479 480
					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 已提交
481

482
					offset_tangent += 16;
M
Mr.doob 已提交
483

484
				}
M
Mr.doob 已提交
485

486
				if( dirtyNormals ) {
M
Mr.doob 已提交
487

488
					if ( vertexNormals.length == 4 && needsSmoothNormals ) {
489

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

492
							vn = vertexNormals[ i ];
M
Mr.doob 已提交
493

494 495 496
							normalArray[ offset_normal ]     = vn.x;
							normalArray[ offset_normal + 1 ] = vn.y;
							normalArray[ offset_normal + 2 ] = vn.z;
M
Mr.doob 已提交
497

498
							offset_normal += 3;
M
Mr.doob 已提交
499

500
						}
M
Mr.doob 已提交
501

502
					} else {
503

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

506 507 508
							normalArray[ offset_normal ]     = faceNormal.x;
							normalArray[ offset_normal + 1 ] = faceNormal.y;
							normalArray[ offset_normal + 2 ] = faceNormal.z;
M
Mr.doob 已提交
509

510
							offset_normal += 3;
M
Mr.doob 已提交
511

512
						}
M
Mr.doob 已提交
513 514

					}
M
Mr.doob 已提交
515

516 517
				}

518
				if ( dirtyUvs && uv ) {
519

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

522
						uvi = uv[ i ];
M
Mr.doob 已提交
523

524 525
						uvArray[ offset_uv ]     = uvi.u;
						uvArray[ offset_uv + 1 ] = uvi.v;
M
Mr.doob 已提交
526

527
						offset_uv += 2;
M
Mr.doob 已提交
528

M
Mr.doob 已提交
529
					}
530 531

				}
532 533 534 535 536 537 538 539 540 541 542 543 544 545 546
				
				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 已提交
547

548
				if( dirtyElements ) {
M
Mr.doob 已提交
549

550 551 552
					faceArray[ offset_face ]     = vertexIndex;
					faceArray[ offset_face + 1 ] = vertexIndex + 1;
					faceArray[ offset_face + 2 ] = vertexIndex + 2;
M
Mr.doob 已提交
553

554 555 556
					faceArray[ offset_face + 3 ] = vertexIndex;
					faceArray[ offset_face + 4 ] = vertexIndex + 2;
					faceArray[ offset_face + 5 ] = vertexIndex + 3;
M
Mr.doob 已提交
557

558
					offset_face += 6;
M
Mr.doob 已提交
559

560 561
					lineArray[ offset_line ]     = vertexIndex;
					lineArray[ offset_line + 1 ] = vertexIndex + 1;
M
Mr.doob 已提交
562

563
					lineArray[ offset_line + 2 ] = vertexIndex;
564
					lineArray[ offset_line + 3 ] = vertexIndex + 3;
M
Mr.doob 已提交
565

566 567
					lineArray[ offset_line + 4 ] = vertexIndex + 1;
					lineArray[ offset_line + 5 ] = vertexIndex + 2;
M
Mr.doob 已提交
568

569 570
					lineArray[ offset_line + 6 ] = vertexIndex + 2;
					lineArray[ offset_line + 7 ] = vertexIndex + 3;
M
Mr.doob 已提交
571

572
					offset_line += 8;
M
Mr.doob 已提交
573

574
					vertexIndex += 4;
M
Mr.doob 已提交
575

576
				}
M
Mr.doob 已提交
577

578
			}
M
Mr.doob 已提交
579

580 581
		}

582
		if ( dirtyVertices ) {
M
Mr.doob 已提交
583

584 585
			_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryChunk.__webGLVertexBuffer );
			_gl.bufferData( _gl.ARRAY_BUFFER, vertexArray, hint );
M
Mr.doob 已提交
586

587
		}
M
Mr.doob 已提交
588

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

591 592
			_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryChunk.__webGLNormalBuffer );
			_gl.bufferData( _gl.ARRAY_BUFFER, normalArray, hint );
M
Mr.doob 已提交
593

594 595
		}

596
		if ( dirtyTangents && geometry.hasTangents ) {
597

598
			_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryChunk.__webGLTangentBuffer );
599
			_gl.bufferData( _gl.ARRAY_BUFFER, tangentArray, hint );
M
Mr.doob 已提交
600

601
		}
602

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

605
			_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryChunk.__webGLUVBuffer );
606
			_gl.bufferData( _gl.ARRAY_BUFFER, uvArray, hint );
M
Mr.doob 已提交
607

608
		}
M
Mr.doob 已提交
609

610 611 612 613 614 615 616
		if ( dirtyUvs && offset_uv2 > 0 ) {

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

		}

617
		if( dirtyElements ) {
M
Mr.doob 已提交
618

619 620
			_gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, geometryChunk.__webGLFaceBuffer );
			_gl.bufferData( _gl.ELEMENT_ARRAY_BUFFER, faceArray, hint );
621

622 623
			_gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, geometryChunk.__webGLLineBuffer );
			_gl.bufferData( _gl.ELEMENT_ARRAY_BUFFER, lineArray, hint );
M
Mr.doob 已提交
624

625
		}
626 627

	};
628

629
	this.setLineBuffers = function( geometry, hint, dirtyVertices, dirtyElements ) {
M
Mr.doob 已提交
630

631 632 633
		var v, vertex, offset,
			vertices = geometry.vertices,
			vl = vertices.length,
M
Mr.doob 已提交
634 635

			vertexArray = geometry.__vertexArray,
636
			lineArray = geometry.__lineArray;
M
Mr.doob 已提交
637

638
		if ( dirtyVertices ) {
M
Mr.doob 已提交
639

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

642
				vertex = vertices[ v ].position;
M
Mr.doob 已提交
643

644
				offset = v * 3;
M
Mr.doob 已提交
645

646 647 648
				vertexArray[ offset ]     = vertex.x;
				vertexArray[ offset + 1 ] = vertex.y;
				vertexArray[ offset + 2 ] = vertex.z;
M
Mr.doob 已提交
649

650 651 652
			}

		}
M
Mr.doob 已提交
653

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

657
		if ( dirtyElements ) {
M
Mr.doob 已提交
658

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

661
				lineArray[ v ] = v;
M
Mr.doob 已提交
662

663
			}
M
Mr.doob 已提交
664

665 666 667 668
		}

		_gl.bindBuffer( _gl.ARRAY_BUFFER, geometry.__webGLVertexBuffer );
		_gl.bufferData( _gl.ARRAY_BUFFER, vertexArray, hint );
M
Mr.doob 已提交
669

670 671
		_gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, geometry.__webGLLineBuffer );
		_gl.bufferData( _gl.ELEMENT_ARRAY_BUFFER, lineArray, hint );
M
Mr.doob 已提交
672

673
	};
M
Mr.doob 已提交
674

675
	this.setParticleBuffers = function( geometry, hint, dirtyVertices, dirtyElements ) {
676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719

		var v, vertex, offset,
			vertices = geometry.vertices,
			vl = vertices.length,

			vertexArray = geometry.__vertexArray,
			particleArray = geometry.__particleArray;

		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;

			}

		}

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

		if ( dirtyElements ) {

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

				particleArray[ v ] = v;

			}

		}
		
		_gl.bindBuffer( _gl.ARRAY_BUFFER, geometry.__webGLVertexBuffer );
		_gl.bufferData( _gl.ARRAY_BUFFER, vertexArray, hint );

		_gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, geometry.__webGLParticleBuffer );
		_gl.bufferData( _gl.ELEMENT_ARRAY_BUFFER, particleArray, hint );
		
720
	};
M
Mr.doob 已提交
721

M
Mr.doob 已提交
722
	function setMaterialShaders( material, shaders ) {
723

M
Mr.doob 已提交
724 725
		material.fragment_shader = shaders.fragment_shader;
		material.vertex_shader = shaders.vertex_shader;
726
		material.uniforms = Uniforms.clone( shaders.uniforms );
727

M
Mr.doob 已提交
728
	};
729

730
	function refreshUniformsCommon( material, fog ) {
M
Mr.doob 已提交
731

732 733
		// premultiply alpha
		material.uniforms.color.value.setRGB( material.color.r * material.opacity, material.color.g * material.opacity, material.color.b * material.opacity );
M
Mr.doob 已提交
734

735 736
		// pure color
		//material.uniforms.color.value.setHex( material.color.hex );
M
Mr.doob 已提交
737

738 739
		material.uniforms.opacity.value = material.opacity;
		material.uniforms.map.texture = material.map;
740 741
		
		material.uniforms.light_map.texture = material.light_map;
742

743 744 745 746 747
		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;
748

749 750 751
		if ( fog ) {

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

753
			if ( fog instanceof THREE.Fog ) {
754

755 756
				material.uniforms.fogNear.value = fog.near;
				material.uniforms.fogFar.value = fog.far;
757

758
			} else if ( fog instanceof THREE.FogExp2 ) {
759

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

762 763 764
			}

		}
765

766
	};
767 768

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

		material.uniforms.color.value.setRGB( material.color.r * material.opacity, material.color.g * material.opacity, material.color.b * material.opacity );
771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790
		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 已提交
791

792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817
	function refreshUniformsParticle( material, fog ) {

		material.uniforms.color.value.setRGB( material.color.r * material.opacity, material.color.g * material.opacity, material.color.b * material.opacity );
		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;

			}

		}

	};

818
	function refreshUniformsPhong( material ) {
M
Mr.doob 已提交
819

820 821 822 823 824
		//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 已提交
825

826
	};
M
Mr.doob 已提交
827 828


829
	function refreshLights( material, lights ) {
M
Mr.doob 已提交
830

831
		material.uniforms.enableLighting.value = lights.directional.length + lights.point.length;
832 833 834 835 836
		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 已提交
837

A
alteredq 已提交
838
	};
M
Mr.doob 已提交
839

840 841
	this.initMaterial = function( material, lights, fog ) {
		
842
		if ( !material.program ) {
M
Mr.doob 已提交
843

844 845
			var u, identifiers, parameters, maxLightCount;
			
846
			if ( material instanceof THREE.MeshDepthMaterial ) {
847

848
				setMaterialShaders( material, THREE.ShaderLib[ 'depth' ] );
849

850
			} else if ( material instanceof THREE.MeshNormalMaterial ) {
851

852
				setMaterialShaders( material, THREE.ShaderLib[ 'normal' ] );
853

854
			} else if ( material instanceof THREE.MeshBasicMaterial ) {
855

856
				setMaterialShaders( material, THREE.ShaderLib[ 'basic' ] );
857

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

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

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

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

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

868 869
				setMaterialShaders( material, THREE.ShaderLib[ 'basic' ] );

870 871 872 873
			} else if ( material instanceof THREE.ParticleBasicMaterial ) {
				
				setMaterialShaders( material, THREE.ShaderLib[ 'particle_basic' ] );
				
874
			}
875

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

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

881
			parameters = { fog: fog, map: material.map, env_map: material.env_map, light_map: material.light_map, maxDirLights: maxLightCount.directional, maxPointLights: maxLightCount.point };
882
			material.program = buildProgram( material.fragment_shader, material.vertex_shader, parameters );
M
Mr.doob 已提交
883

884 885
			identifiers = [ 'viewMatrix', 'modelViewMatrix', 'projectionMatrix', 'normalMatrix', 'objectMatrix', 'cameraPosition' ];
			for( u in material.uniforms ) {
886

887
				identifiers.push(u);
M
Mr.doob 已提交
888

M
Mr.doob 已提交
889
			}
M
Mr.doob 已提交
890

891
			cacheUniformLocations( material.program, identifiers );
892
			cacheAttributeLocations( material.program, [ "position", "normal", "uv", "uv2", "tangent" ] );
M
Mr.doob 已提交
893

M
Mr.doob 已提交
894
		}
895 896 897 898 899 900 901 902
		
	};
	
	this.renderBuffer = function ( camera, lights, fog, material, geometryChunk, object ) {

		var program, u, identifiers, attributes, parameters, maxLightCount, linewidth, primitives;

		this.initMaterial( material, lights, fog );
M
Mr.doob 已提交
903

904 905
		program = material.program;

M
Mr.doob 已提交
906
		if( program != _oldProgram ) {
M
Mr.doob 已提交
907

M
Mr.doob 已提交
908 909
			_gl.useProgram( program );
			_oldProgram = program;
M
Mr.doob 已提交
910

M
Mr.doob 已提交
911
		}
M
Mr.doob 已提交
912

913 914
		this.loadCamera( program, camera );
		this.loadMatrices( program );
M
Mr.doob 已提交
915

M
Mr.doob 已提交
916
		if ( material instanceof THREE.MeshPhongMaterial ||
917
			 material instanceof THREE.MeshLambertMaterial ) {
918

919 920
			this.setupLights( program, lights );
			refreshLights( material, this.lights );
M
Mr.doob 已提交
921 922 923

		}

924 925 926
		if ( material instanceof THREE.MeshBasicMaterial ||
			 material instanceof THREE.MeshLambertMaterial ||
			 material instanceof THREE.MeshPhongMaterial ) {
M
Mr.doob 已提交
927

928
			refreshUniformsCommon( material, fog );
M
Mr.doob 已提交
929

A
alteredq 已提交
930
		}
M
Mr.doob 已提交
931

932
		if ( material instanceof THREE.LineBasicMaterial ) {
M
Mr.doob 已提交
933

934
			refreshUniformsLine( material, fog );
935 936 937 938 939 940 941
			
		}

		if ( material instanceof THREE.ParticleBasicMaterial ) {

			refreshUniformsParticle( material, fog );
			
942
		}
M
Mr.doob 已提交
943

M
Mr.doob 已提交
944
		if ( material instanceof THREE.MeshPhongMaterial ) {
M
Mr.doob 已提交
945

946
			refreshUniformsPhong( material );
M
Mr.doob 已提交
947

948
		}
M
Mr.doob 已提交
949

950 951 952 953
		if ( material instanceof THREE.MeshDepthMaterial ) {

			material.uniforms.mNear.value = camera.near;
			material.uniforms.mFar.value = camera.far;
954
			
955 956
		}
		
957
		setUniforms( program, material.uniforms );
958

959
		attributes = program.attributes;
M
Mr.doob 已提交
960

961
		// vertices
M
Mr.doob 已提交
962

M
Mr.doob 已提交
963
		_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryChunk.__webGLVertexBuffer );
964
		_gl.vertexAttribPointer( attributes.position, 3, _gl.FLOAT, false, 0, 0 );
965
		_gl.enableVertexAttribArray( attributes.position );
966 967

		// normals
M
Mr.doob 已提交
968

969
		if ( attributes.normal >= 0 ) {
970

971 972
			_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryChunk.__webGLNormalBuffer );
			_gl.vertexAttribPointer( attributes.normal, 3, _gl.FLOAT, false, 0, 0 );
973
			_gl.enableVertexAttribArray( attributes.normal );
974

975
		}
976

977 978 979
		// tangents

		if ( attributes.tangent >= 0 ) {
980

981 982
			_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryChunk.__webGLTangentBuffer );
			_gl.vertexAttribPointer( attributes.tangent, 4, _gl.FLOAT, false, 0, 0 );
983
			_gl.enableVertexAttribArray( attributes.tangent );
984

985
		}
986

987
		// uvs
M
Mr.doob 已提交
988

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

991
			if ( geometryChunk.__webGLUVBuffer ) {
992

993
				_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryChunk.__webGLUVBuffer );
994
				_gl.vertexAttribPointer( attributes.uv, 2, _gl.FLOAT, false, 0, 0 );
995

996
				_gl.enableVertexAttribArray( attributes.uv );
997

998
			} else {
999

1000
				_gl.disableVertexAttribArray( attributes.uv );
M
Mr.doob 已提交
1001

1002
			}
1003 1004 1005

		}

1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022
		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 );

			}

		}

1023
		// render lines
M
Mr.doob 已提交
1024

1025
		if ( material.wireframe || material instanceof THREE.LineBasicMaterial ) {
1026

M
Mr.doob 已提交
1027
			linewidth = material.wireframe_linewidth !== undefined ? material.wireframe_linewidth :
1028
						material.linewidth !== undefined ? material.linewidth : 1;
M
Mr.doob 已提交
1029

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

1032 1033
			_gl.lineWidth( linewidth );
			_gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, geometryChunk.__webGLLineBuffer );
1034
			_gl.drawElements( primitives, geometryChunk.__webGLLineCount, _gl.UNSIGNED_SHORT, 0 );
1035

1036
		// render particles
M
Mr.doob 已提交
1037

1038 1039 1040 1041
		} else if ( material instanceof THREE.ParticleBasicMaterial ) {

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

1043 1044 1045 1046
		// render triangles
			
		} else {
			
1047 1048
			_gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, geometryChunk.__webGLFaceBuffer );
			_gl.drawElements( _gl.TRIANGLES, geometryChunk.__webGLFaceCount, _gl.UNSIGNED_SHORT, 0 );
1049
			
1050 1051 1052 1053
		}

	};

A
alteredq 已提交
1054
	this.renderPass = function ( camera, lights, fog, object, geometryChunk, blending, transparent ) {
M
Mr.doob 已提交
1055

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

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

M
Mr.doob 已提交
1060
			meshMaterial = object.materials[ m ];
1061

M
Mr.doob 已提交
1062
			if ( meshMaterial instanceof THREE.MeshFaceMaterial ) {
1063

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

					material = geometryChunk.materials[ i ];
1067

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

M
Mr.doob 已提交
1070
						this.setBlending( material.blending );
1071
						this.renderBuffer( camera, lights, fog, material, geometryChunk, object );
M
Mr.doob 已提交
1072

1073 1074
					}

M
Mr.doob 已提交
1075
				}
1076

M
Mr.doob 已提交
1077
			} else {
1078

M
Mr.doob 已提交
1079
				material = meshMaterial;
1080
				if ( material && material.blending == blending && ( material.opacity < 1.0 == transparent ) ) {
M
Mr.doob 已提交
1081

M
Mr.doob 已提交
1082
					this.setBlending( material.blending );
1083
					this.renderBuffer( camera, lights, fog, material, geometryChunk, object );
M
Mr.doob 已提交
1084

1085 1086 1087
				}

			}
1088 1089

		}
M
Mr.doob 已提交
1090

1091
	};
M
Mr.doob 已提交
1092

A
alteredq 已提交
1093
	this.render = function( scene, camera, renderTarget, clear ) {
M
Mr.doob 已提交
1094

M
Mr.doob 已提交
1095
		var o, ol, webGLObject, object, buffer,
A
alteredq 已提交
1096 1097
			lights = scene.lights,
			fog = scene.fog;
M
Mr.doob 已提交
1098

M
Mr.doob 已提交
1099
		this.initWebGLObjects( scene );
M
Mr.doob 已提交
1100

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

1103
		if ( this.autoClear ) {
M
Mr.doob 已提交
1104

1105
			this.clear();
M
Mr.doob 已提交
1106

1107 1108
		}

1109
		camera.autoUpdateMatrix && camera.updateMatrix();
M
Mr.doob 已提交
1110

1111 1112
		_viewMatrixArray.set( camera.matrix.flatten() );
		_projectionMatrixArray.set( camera.projectionMatrix.flatten() );
M
Mr.doob 已提交
1113

M
Mr.doob 已提交
1114
		// opaque pass
M
Mr.doob 已提交
1115

M
Mr.doob 已提交
1116
		for ( o = 0, ol = scene.__webGLObjects.length; o < ol; o++ ) {
M
Mr.doob 已提交
1117

M
Mr.doob 已提交
1118
			webGLObject = scene.__webGLObjects[ o ];
M
Mr.doob 已提交
1119

M
Mr.doob 已提交
1120 1121
			object = webGLObject.object;
			buffer = webGLObject.buffer;
M
Mr.doob 已提交
1122

M
Mr.doob 已提交
1123
			if ( object.visible ) {
M
Mr.doob 已提交
1124

M
Mr.doob 已提交
1125
				this.setupMatrices( object, camera );
A
alteredq 已提交
1126
				this.renderPass( camera, lights, fog, object, buffer, THREE.NormalBlending, false );
M
Mr.doob 已提交
1127

1128
			}
M
Mr.doob 已提交
1129

M
Mr.doob 已提交
1130
		}
M
Mr.doob 已提交
1131

M
Mr.doob 已提交
1132
		// transparent pass
M
Mr.doob 已提交
1133

M
Mr.doob 已提交
1134
		for ( o = 0, ol = scene.__webGLObjects.length; o < ol; o++ ) {
M
Mr.doob 已提交
1135

M
Mr.doob 已提交
1136
			webGLObject = scene.__webGLObjects[ o ];
M
Mr.doob 已提交
1137

M
Mr.doob 已提交
1138 1139
			object = webGLObject.object;
			buffer = webGLObject.buffer;
M
Mr.doob 已提交
1140

M
Mr.doob 已提交
1141
			if ( object.visible ) {
M
Mr.doob 已提交
1142

M
Mr.doob 已提交
1143
				this.setupMatrices( object, camera );
1144

1145
				if( object.doubleSided ) {
M
Mr.doob 已提交
1146

1147
					_gl.disable( _gl.CULL_FACE );
M
Mr.doob 已提交
1148

1149
				} else {
M
Mr.doob 已提交
1150

1151
					_gl.enable( _gl.CULL_FACE );
M
Mr.doob 已提交
1152

1153
					if( object.flipSided ) {
M
Mr.doob 已提交
1154

1155
						_gl.frontFace( _gl.CW );
M
Mr.doob 已提交
1156

1157 1158
					}
					else {
M
Mr.doob 已提交
1159

1160
						_gl.frontFace( _gl.CCW );
M
Mr.doob 已提交
1161

1162
					}
M
Mr.doob 已提交
1163

1164
				}
M
Mr.doob 已提交
1165

1166
				// opaque blended materials
M
Mr.doob 已提交
1167

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

1171
				// transparent blended materials
M
Mr.doob 已提交
1172

A
alteredq 已提交
1173 1174
				this.renderPass( camera, lights, fog, object, buffer, THREE.AdditiveBlending, true );
				this.renderPass( camera, lights, fog, object, buffer, THREE.SubtractiveBlending, true );
1175

1176
				// transparent normal materials
M
Mr.doob 已提交
1177

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

1180
			}
M
Mr.doob 已提交
1181

M
Mr.doob 已提交
1182
		}
M
Mr.doob 已提交
1183

1184
		// Generate mipmap if we're using any kind of mipmap filtering
M
Mr.doob 已提交
1185

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

1188
			updateRenderTargetMipmap( renderTarget );
M
Mr.doob 已提交
1189

1190
		}
1191

M
Mr.doob 已提交
1192
	};
M
Mr.doob 已提交
1193

M
Mr.doob 已提交
1194
	this.initWebGLObjects = function( scene ) {
M
Mr.doob 已提交
1195

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

1198 1199 1200 1201 1202 1203
			if ( objmap[ id ] == undefined ) {

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

			}
M
Mr.doob 已提交
1204

1205
		};
M
Mr.doob 已提交
1206

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

M
Mr.doob 已提交
1209
		if ( !scene.__webGLObjects ) {
M
Mr.doob 已提交
1210

M
Mr.doob 已提交
1211
			scene.__webGLObjects = [];
M
Mr.doob 已提交
1212
			scene.__webGLObjectsMap = {};
M
Mr.doob 已提交
1213

M
Mr.doob 已提交
1214
		}
M
Mr.doob 已提交
1215

1216 1217 1218
		for ( o = 0, ol = scene.objects.length; o < ol; o++ ) {

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

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

1223
				scene.__webGLObjectsMap[ object.id ] = {};
M
Mr.doob 已提交
1224

1225
			}
1226

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

1229
			if ( object instanceof THREE.Mesh ) {
M
Mr.doob 已提交
1230

M
Mr.doob 已提交
1231
				// create separate VBOs per geometry chunk
M
Mr.doob 已提交
1232

1233
				for ( g in geometry.geometryChunks ) {
M
Mr.doob 已提交
1234

1235
					geometryChunk = geometry.geometryChunks[ g ];
M
Mr.doob 已提交
1236

M
Mr.doob 已提交
1237
					// initialise VBO on the first access
M
Mr.doob 已提交
1238

M
Mr.doob 已提交
1239
					if( ! geometryChunk.__webGLVertexBuffer ) {
M
Mr.doob 已提交
1240

1241 1242
						this.createMeshBuffers( geometryChunk );
						this.initMeshBuffers( geometryChunk, object );
M
Mr.doob 已提交
1243

1244 1245 1246 1247 1248 1249 1250 1251 1252 1253
						geometry.__dirtyVertices = true;
						geometry.__dirtyElements = true;
						geometry.__dirtyUvs = true;
						geometry.__dirtyNormals = true;
						geometry.__dirtyTangents = true;

					}

					if( geometry.__dirtyVertices || geometry.__dirtyElements || geometry.__dirtyUvs ) {

1254
						this.setMeshBuffers( geometryChunk, object, _gl.DYNAMIC_DRAW,
1255 1256
										 geometry.__dirtyVertices, geometry.__dirtyElements, geometry.__dirtyUvs,
										 geometry.__dirtyNormals, geometry.__dirtyTangents );
M
Mr.doob 已提交
1257

M
Mr.doob 已提交
1258 1259

					}
M
Mr.doob 已提交
1260

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

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

M
Mr.doob 已提交
1265
				}
1266

1267 1268 1269 1270 1271 1272
				geometry.__dirtyVertices = false;
				geometry.__dirtyElements = false;
				geometry.__dirtyUvs = false;
				geometry.__dirtyNormals = false;
				geometry.__dirtyTangents = false;

1273
			} else if ( object instanceof THREE.Line ) {
M
Mr.doob 已提交
1274 1275


1276
				if( ! geometry.__webGLVertexBuffer ) {
M
Mr.doob 已提交
1277

1278 1279
					this.createLineBuffers( geometry );
					this.initLineBuffers( geometry );
M
Mr.doob 已提交
1280

1281 1282
					geometry.__dirtyVertices = true;
					geometry.__dirtyElements = true;
M
Mr.doob 已提交
1283

1284
				}
M
Mr.doob 已提交
1285

1286
				if( geometry.__dirtyVertices ) {
M
Mr.doob 已提交
1287

1288
					this.setLineBuffers( geometry, _gl.DYNAMIC_DRAW, geometry.__dirtyVertices, geometry.__dirtyElements );
M
Mr.doob 已提交
1289

1290
				}
M
Mr.doob 已提交
1291

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

1294 1295
				geometry.__dirtyVertices = false;
				geometry.__dirtyElements = false;
1296

1297
			} else if ( object instanceof THREE.ParticleSystem ) {
1298

1299
				if( ! geometry.__webGLVertexBuffer ) {
M
Mr.doob 已提交
1300

1301
					this.createParticleBuffers( geometry );
1302 1303 1304 1305 1306 1307 1308 1309 1310 1311
					this.initParticleBuffers( geometry );

					geometry.__dirtyVertices = true;
					geometry.__dirtyElements = true;
					
				}

				if( geometry.__dirtyVertices ) {

					this.setParticleBuffers( geometry, _gl.DYNAMIC_DRAW, geometry.__dirtyVertices, geometry.__dirtyElements );
M
Mr.doob 已提交
1312

1313
				}
M
Mr.doob 已提交
1314

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

1317 1318 1319
				geometry.__dirtyVertices = false;
				geometry.__dirtyElements = false;

M
Mr.doob 已提交
1320

1321
			}/*else if ( object instanceof THREE.Particle ) {
M
Mr.doob 已提交
1322 1323 1324

			}*/

M
Mr.doob 已提交
1325
		}
1326 1327 1328 1329 1330 1331

	};

	this.removeObject = function ( scene, object ) {

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

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

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

1337
			if ( object == zobject ) {
1338 1339 1340 1341

				scene.__webGLObjects.splice( o, 1 );

			}
M
Mr.doob 已提交
1342

1343
		}
M
Mr.doob 已提交
1344

M
Mr.doob 已提交
1345
	};
M
Mr.doob 已提交
1346

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

M
Mr.doob 已提交
1349
		object.autoUpdateMatrix && object.updateMatrix();
1350

M
Mr.doob 已提交
1351
		_modelViewMatrix.multiply( camera.matrix, object.matrix );
M
Mr.doob 已提交
1352
		_modelViewMatrixArray.set( _modelViewMatrix.flatten() );
1353

1354
		_normalMatrix = THREE.Matrix4.makeInvert3x3( _modelViewMatrix ).transpose();
M
Mr.doob 已提交
1355
		_normalMatrixArray.set( _normalMatrix.m );
1356

M
Mr.doob 已提交
1357
		_objectMatrixArray.set( object.matrix.flatten() );
M
Mr.doob 已提交
1358

M
Mr.doob 已提交
1359
	};
M
Mr.doob 已提交
1360

M
Mr.doob 已提交
1361
	this.loadMatrices = function ( program ) {
M
Mr.doob 已提交
1362

M
Mr.doob 已提交
1363 1364 1365 1366
		_gl.uniformMatrix4fv( program.uniforms.viewMatrix, false, _viewMatrixArray );
		_gl.uniformMatrix4fv( program.uniforms.modelViewMatrix, false, _modelViewMatrixArray );
		_gl.uniformMatrix4fv( program.uniforms.projectionMatrix, false, _projectionMatrixArray );
		_gl.uniformMatrix3fv( program.uniforms.normalMatrix, false, _normalMatrixArray );
M
Mr.doob 已提交
1367
		_gl.uniformMatrix4fv( program.uniforms.objectMatrix, false, _objectMatrixArray );
M
Mr.doob 已提交
1368

M
Mr.doob 已提交
1369
	};
1370

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

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

M
Mr.doob 已提交
1375
	};
M
Mr.doob 已提交
1376

M
Mr.doob 已提交
1377
	this.setBlending = function( blending ) {
M
Mr.doob 已提交
1378

M
Mr.doob 已提交
1379
		switch ( blending ) {
1380

M
Mr.doob 已提交
1381
			case THREE.AdditiveBlending:
1382

M
Mr.doob 已提交
1383 1384
				_gl.blendEquation( _gl.FUNC_ADD );
				_gl.blendFunc( _gl.ONE, _gl.ONE );
M
Mr.doob 已提交
1385

M
Mr.doob 已提交
1386
				break;
1387

M
Mr.doob 已提交
1388
			case THREE.SubtractiveBlending:
1389

M
Mr.doob 已提交
1390 1391
				//_gl.blendEquation( _gl.FUNC_SUBTRACT );
				_gl.blendFunc( _gl.DST_COLOR, _gl.ZERO );
M
Mr.doob 已提交
1392

M
Mr.doob 已提交
1393
				break;
M
Mr.doob 已提交
1394

M
Mr.doob 已提交
1395
			default:
M
Mr.doob 已提交
1396

M
Mr.doob 已提交
1397 1398
				_gl.blendEquation( _gl.FUNC_ADD );
				_gl.blendFunc( _gl.ONE, _gl.ONE_MINUS_SRC_ALPHA );
M
Mr.doob 已提交
1399

M
Mr.doob 已提交
1400
				break;
N
Nicolas Garcia Belmonte 已提交
1401
		}
M
Mr.doob 已提交
1402

N
Nicolas Garcia Belmonte 已提交
1403
	};
M
Mr.doob 已提交
1404

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

1407
		if ( cullFace ) {
M
Mr.doob 已提交
1408

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

1411
				_gl.frontFace( _gl.CCW );
M
Mr.doob 已提交
1412

1413
			} else {
M
Mr.doob 已提交
1414

1415
				_gl.frontFace( _gl.CW );
M
Mr.doob 已提交
1416

1417
			}
M
Mr.doob 已提交
1418

1419
			if( cullFace == "back" ) {
M
Mr.doob 已提交
1420

1421
				_gl.cullFace( _gl.BACK );
M
Mr.doob 已提交
1422

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

1425
				_gl.cullFace( _gl.FRONT );
M
Mr.doob 已提交
1426

1427
			} else {
M
Mr.doob 已提交
1428

1429
				_gl.cullFace( _gl.FRONT_AND_BACK );
M
Mr.doob 已提交
1430

1431
			}
M
Mr.doob 已提交
1432

1433
			_gl.enable( _gl.CULL_FACE );
M
Mr.doob 已提交
1434

1435
		} else {
M
Mr.doob 已提交
1436

1437
			_gl.disable( _gl.CULL_FACE );
M
Mr.doob 已提交
1438

1439 1440 1441
		}

	};
N
Nicolas Garcia Belmonte 已提交
1442

1443
	this.supportsVertexTextures = function() {
1444

1445
		return maxVertexTextures() > 0;
1446

1447
	};
1448

1449
	function maxVertexTextures() {
1450

1451 1452 1453
		return _gl.getParameter( _gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS );

	};
1454

1455
	function initGL( antialias, clearColor, clearAlpha ) {
N
Nicolas Garcia Belmonte 已提交
1456 1457 1458

		try {

1459
			_gl = _canvas.getContext( 'experimental-webgl', { antialias: antialias } );
N
Nicolas Garcia Belmonte 已提交
1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475

		} catch(e) { }

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

1476 1477
		_gl.frontFace( _gl.CCW );
		_gl.cullFace( _gl.BACK );
1478
		_gl.enable( _gl.CULL_FACE );
M
Mr.doob 已提交
1479

N
Nicolas Garcia Belmonte 已提交
1480
		_gl.enable( _gl.BLEND );
1481
		_gl.blendFunc( _gl.ONE, _gl.ONE_MINUS_SRC_ALPHA );
1482
		_gl.clearColor( clearColor.r, clearColor.g, clearColor.b, clearAlpha );
N
Nicolas Garcia Belmonte 已提交
1483

1484
	};
M
Mr.doob 已提交
1485

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

M
Mr.doob 已提交
1488
		var program = _gl.createProgram(),
M
Mr.doob 已提交
1489

M
Mr.doob 已提交
1490 1491 1492 1493
		prefix_fragment = [
			"#ifdef GL_ES",
			"precision highp float;",
			"#endif",
M
Mr.doob 已提交
1494

1495 1496
			"#define MAX_DIR_LIGHTS " + parameters.maxDirLights,
			"#define MAX_POINT_LIGHTS " + parameters.maxPointLights,
A
alteredq 已提交
1497

1498 1499
			parameters.fog ? "#define USE_FOG" : "",
			parameters.fog instanceof THREE.FogExp2 ? "#define FOG_EXP2" : "",
1500

1501 1502
			parameters.map ? "#define USE_MAP" : "",
			parameters.env_map ? "#define USE_ENVMAP" : "",
1503
			parameters.light_map ? "#define USE_LIGHTMAP" : "",
1504

1505
			"uniform mat4 viewMatrix;",
1506
			"uniform vec3 cameraPosition;",
M
Mr.doob 已提交
1507 1508
			""
		].join("\n"),
1509

M
Mr.doob 已提交
1510
		prefix_vertex = [
1511
			maxVertexTextures() > 0 ? "#define VERTEX_TEXTURES" : "",
1512

1513 1514 1515
			"#define MAX_DIR_LIGHTS " + parameters.maxDirLights,
			"#define MAX_POINT_LIGHTS " + parameters.maxPointLights,

1516 1517
			parameters.map ? "#define USE_MAP" : "",
			parameters.env_map ? "#define USE_ENVMAP" : "",
1518
			parameters.light_map ? "#define USE_LIGHTMAP" : "",
1519

M
Mr.doob 已提交
1520 1521 1522
			"uniform mat4 objectMatrix;",
			"uniform mat4 modelViewMatrix;",
			"uniform mat4 projectionMatrix;",
1523 1524
			"uniform mat4 viewMatrix;",
			"uniform mat3 normalMatrix;",
M
Mr.doob 已提交
1525
			"uniform vec3 cameraPosition;",
M
Mr.doob 已提交
1526 1527 1528
			"attribute vec3 position;",
			"attribute vec3 normal;",
			"attribute vec2 uv;",
1529
			"attribute vec2 uv2;",
M
Mr.doob 已提交
1530 1531
			""
		].join("\n");
1532

M
Mr.doob 已提交
1533 1534
		_gl.attachShader( program, getShader( "fragment", prefix_fragment + fragment_shader ) );
		_gl.attachShader( program, getShader( "vertex", prefix_vertex + vertex_shader ) );
M
Mr.doob 已提交
1535

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

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

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

1543 1544
			//console.log( prefix_fragment + fragment_shader );
			//console.log( prefix_vertex + vertex_shader );
M
Mr.doob 已提交
1545

N
Nicolas Garcia Belmonte 已提交
1546
		}
1547 1548 1549
		
		//console.log( prefix_fragment + fragment_shader );
		//console.log( prefix_vertex + vertex_shader );
M
Mr.doob 已提交
1550

M
Mr.doob 已提交
1551
		program.uniforms = {};
1552
		program.attributes = {};
M
Mr.doob 已提交
1553

M
Mr.doob 已提交
1554
		return program;
M
Mr.doob 已提交
1555

M
Mr.doob 已提交
1556
	};
M
Mr.doob 已提交
1557

M
Mr.doob 已提交
1558
	function setUniforms( program, uniforms ) {
M
Mr.doob 已提交
1559

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

M
Mr.doob 已提交
1562
		for( u in uniforms ) {
M
Mr.doob 已提交
1563

1564 1565
			location = program.uniforms[u];
			if ( !location ) continue;
M
Mr.doob 已提交
1566

1567
			uniform = uniforms[u];
M
Mr.doob 已提交
1568

1569 1570
			type = uniform.type;
			value = uniform.value;
M
Mr.doob 已提交
1571

M
Mr.doob 已提交
1572
			if( type == "i" ) {
M
Mr.doob 已提交
1573

M
Mr.doob 已提交
1574
				_gl.uniform1i( location, value );
M
Mr.doob 已提交
1575

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

M
Mr.doob 已提交
1578
				_gl.uniform1f( location, value );
1579

A
alteredq 已提交
1580 1581 1582
			} else if( type == "fv1" ) {

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

1584 1585 1586 1587
			} else if( type == "fv" ) {

				_gl.uniform3fv( location, value );

1588 1589 1590 1591
			} else if( type == "v2" ) {

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

1592 1593 1594
			} else if( type == "v3" ) {

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

1596 1597 1598
			} else if( type == "c" ) {

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

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

M
Mr.doob 已提交
1602
				_gl.uniform1i( location, value );
M
Mr.doob 已提交
1603

1604
				texture = uniform.texture;
M
Mr.doob 已提交
1605

1606
				if ( !texture ) continue;
M
Mr.doob 已提交
1607

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

1610
					setCubeTexture( texture, value );
M
Mr.doob 已提交
1611

1612
				} else {
M
Mr.doob 已提交
1613

1614
					setTexture( texture, value );
M
Mr.doob 已提交
1615

1616
				}
M
Mr.doob 已提交
1617

1618
			}
M
Mr.doob 已提交
1619

1620
		}
M
Mr.doob 已提交
1621

1622
	};
M
Mr.doob 已提交
1623

1624
	function setCubeTexture( texture, slot ) {
M
Mr.doob 已提交
1625

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

1628 1629
			if ( !texture.image.__webGLTextureCube &&
				 !texture.image.__cubeMapInitialized && texture.image.loadCount == 6 ) {
M
Mr.doob 已提交
1630

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

1633
				_gl.bindTexture( _gl.TEXTURE_CUBE_MAP, texture.image.__webGLTextureCube );
1634

1635 1636
				_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 已提交
1637

1638 1639
				_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 已提交
1640

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

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

1645
				}
M
Mr.doob 已提交
1646

1647
				_gl.generateMipmap( _gl.TEXTURE_CUBE_MAP );
1648

1649
				_gl.bindTexture( _gl.TEXTURE_CUBE_MAP, null );
M
Mr.doob 已提交
1650

1651
				texture.image.__cubeMapInitialized = true;
M
Mr.doob 已提交
1652

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

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

1658
		}
M
Mr.doob 已提交
1659

M
Mr.doob 已提交
1660
	};
M
Mr.doob 已提交
1661

1662
	function setTexture( texture, slot ) {
M
Mr.doob 已提交
1663

1664 1665 1666 1667 1668
		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 已提交
1669

1670 1671
			_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 已提交
1672 1673 1674

			_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 ) );
1675 1676 1677 1678 1679 1680 1681
			_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 已提交
1682

1683
	};
M
Mr.doob 已提交
1684

A
alteredq 已提交
1685
	function setRenderTarget( renderTexture, clear ) {
1686 1687

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

1689 1690 1691 1692 1693
			renderTexture.__webGLFramebuffer = _gl.createFramebuffer();
			renderTexture.__webGLRenderbuffer = _gl.createRenderbuffer();
			renderTexture.__webGLTexture = _gl.createTexture();

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

1695 1696 1697 1698
			_gl.bindRenderbuffer( _gl.RENDERBUFFER, renderTexture.__webGLRenderbuffer );
			_gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_COMPONENT16, renderTexture.width, renderTexture.height );

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

1700 1701 1702 1703 1704
			_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 ) );
1705
			_gl.texImage2D( _gl.TEXTURE_2D, 0, paramThreeToGL( renderTexture.format ), renderTexture.width, renderTexture.height, 0, paramThreeToGL( renderTexture.format ), paramThreeToGL( renderTexture.type ), null );
1706 1707

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

1709 1710
			_gl.bindFramebuffer( _gl.FRAMEBUFFER, renderTexture.__webGLFramebuffer );
			_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D, renderTexture.__webGLTexture, 0 );
1711
			_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.RENDERBUFFER, renderTexture.__webGLRenderbuffer );
1712 1713

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

1715 1716 1717
			_gl.bindTexture( _gl.TEXTURE_2D, null );
			_gl.bindRenderbuffer( _gl.RENDERBUFFER, null );
			_gl.bindFramebuffer( _gl.FRAMEBUFFER, null);
M
Mr.doob 已提交
1718

1719 1720
		}

1721
		var framebuffer, width, height;
M
Mr.doob 已提交
1722

1723
		if ( renderTexture ) {
M
Mr.doob 已提交
1724

1725 1726 1727
			framebuffer = renderTexture.__webGLFramebuffer;
			width = renderTexture.width;
			height = renderTexture.height;
M
Mr.doob 已提交
1728

1729
		} else {
M
Mr.doob 已提交
1730

1731 1732 1733
			framebuffer = null;
			width = _canvas.width;
			height = _canvas.height;
M
Mr.doob 已提交
1734

1735
		}
M
Mr.doob 已提交
1736

1737
		if( framebuffer != _oldFramebuffer ) {
M
Mr.doob 已提交
1738

1739 1740
			_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );
			_gl.viewport( 0, 0, width, height );
M
Mr.doob 已提交
1741

A
alteredq 已提交
1742
			if ( clear ) {
M
Mr.doob 已提交
1743

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

A
alteredq 已提交
1746
			}
M
Mr.doob 已提交
1747

1748
			_oldFramebuffer = framebuffer;
M
Mr.doob 已提交
1749

1750
		}
1751

1752
	};
M
Mr.doob 已提交
1753

1754
	function updateRenderTargetMipmap( renderTarget ) {
M
Mr.doob 已提交
1755

1756 1757 1758
		_gl.bindTexture( _gl.TEXTURE_2D, renderTarget.__webGLTexture );
		_gl.generateMipmap( _gl.TEXTURE_2D );
		_gl.bindTexture( _gl.TEXTURE_2D, null );
M
Mr.doob 已提交
1759 1760

	};
1761

M
Mr.doob 已提交
1762
	function cacheUniformLocations( program, identifiers ) {
M
Mr.doob 已提交
1763

M
Mr.doob 已提交
1764
		var i, l, id;
M
Mr.doob 已提交
1765

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

1768 1769
			id = identifiers[ i ];
			program.uniforms[ id ] = _gl.getUniformLocation( program, id );
M
Mr.doob 已提交
1770

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

M
Mr.doob 已提交
1773
	};
M
Mr.doob 已提交
1774

1775
	function cacheAttributeLocations( program, identifiers ) {
1776

1777
		var i, l, id;
M
Mr.doob 已提交
1778

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

1781 1782
			id = identifiers[ i ];
			program.attributes[ id ] = _gl.getAttribLocation( program, id );
M
Mr.doob 已提交
1783

1784
		}
M
Mr.doob 已提交
1785

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

N
Nicolas Garcia Belmonte 已提交
1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812
	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 已提交
1813

1814
	};
N
Nicolas Garcia Belmonte 已提交
1815

1816
	function paramThreeToGL( p ) {
M
Mr.doob 已提交
1817

1818
		switch ( p ) {
M
Mr.doob 已提交
1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831

			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;

1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845
			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;

1846
		}
M
Mr.doob 已提交
1847

1848
		return 0;
M
Mr.doob 已提交
1849

1850 1851 1852 1853 1854 1855
	};

	function materialNeedsSmoothNormals( material ) {

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

1856
	};
M
Mr.doob 已提交
1857

M
Mr.doob 已提交
1858
	function bufferNeedsSmoothNormals( geometryChunk, object ) {
M
Mr.doob 已提交
1859

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

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

M
Mr.doob 已提交
1864
			meshMaterial = object.materials[ m ];
1865 1866 1867

			if ( meshMaterial instanceof THREE.MeshFaceMaterial ) {

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

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

1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892
						needsSmoothNormals = true;
						break;

					}

				}

			} else {

				if ( materialNeedsSmoothNormals( meshMaterial ) ) {

					needsSmoothNormals = true;
					break;

				}

			}

			if ( needsSmoothNormals ) break;

		}
M
Mr.doob 已提交
1893

1894
		return needsSmoothNormals;
M
Mr.doob 已提交
1895

1896
	};
M
Mr.doob 已提交
1897

1898
	function allocateLights( lights, maxLights ) {
1899

1900 1901
		var l, ll, light, dirLights, pointLights, maxDirLights, maxPointLights;
		dirLights = pointLights = maxDirLights = maxPointLights = 0;
1902

1903
		for ( l = 0, ll = lights.length; l < ll; l++ ) {
1904

1905
			light = lights[ l ];
1906

1907 1908
			if ( light instanceof THREE.DirectionalLight ) dirLights++;
			if ( light instanceof THREE.PointLight ) pointLights++;
1909

1910
		}
1911

1912
		if ( ( pointLights + dirLights ) <= maxLights ) {
1913

1914 1915
			maxDirLights = dirLights;
			maxPointLights = pointLights;
1916

1917
		} else {
1918

1919 1920
			maxDirLights = Math.ceil( maxLights * dirLights / ( pointLights + dirLights ) );
			maxPointLights = maxLights - maxDirLights;
1921 1922 1923

		}

1924
		return { 'directional' : maxDirLights, 'point' : maxPointLights };
1925 1926

	};
M
Mr.doob 已提交
1927

A
alteredq 已提交
1928
	/* DEBUG
1929
	function getGLParams() {
M
Mr.doob 已提交
1930

1931
		var params  = {
M
Mr.doob 已提交
1932

1933 1934
			'MAX_VARYING_VECTORS': _gl.getParameter( _gl.MAX_VARYING_VECTORS ),
			'MAX_VERTEX_ATTRIBS': _gl.getParameter( _gl.MAX_VERTEX_ATTRIBS ),
M
Mr.doob 已提交
1935

1936 1937 1938
			'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 已提交
1939

1940 1941 1942
			'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 已提交
1943

1944 1945
		return params;
	};
M
Mr.doob 已提交
1946

1947
	function dumpObject( obj ) {
M
Mr.doob 已提交
1948

1949 1950
		var p, str = "";
		for ( p in obj ) {
M
Mr.doob 已提交
1951

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

1954
		}
M
Mr.doob 已提交
1955

1956 1957
		return str;
	}
A
alteredq 已提交
1958
	*/
1959

1960
};
1961

1962
THREE.Snippets = {
M
Mr.doob 已提交
1963

1964 1965
	// FOG
	
1966
	fog_pars_fragment: [
M
Mr.doob 已提交
1967

1968
	"#ifdef USE_FOG",
1969

1970
		"uniform vec3 fogColor;",
1971

1972 1973 1974 1975 1976 1977
		"#ifdef FOG_EXP2",
			"uniform float fogDensity;",
		"#else",
			"uniform float fogNear;",
			"uniform float fogFar;",
		"#endif",
1978

1979
	"#endif"
1980

1981
	].join("\n"),
M
Mr.doob 已提交
1982

1983
	fog_fragment: [
1984

1985
	"#ifdef USE_FOG",
1986

1987 1988 1989 1990 1991 1992 1993 1994 1995
		"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",
1996

1997
		"gl_FragColor = mix( gl_FragColor, vec4( fogColor, 1.0 ), fogFactor );",
M
Mr.doob 已提交
1998

1999
	"#endif"
M
Mr.doob 已提交
2000

2001
	].join("\n"),
M
Mr.doob 已提交
2002

2003 2004
	// ENVIRONMENT MAP
	
2005
	envmap_pars_fragment: [
M
Mr.doob 已提交
2006

2007
	"#ifdef USE_ENVMAP",
M
Mr.doob 已提交
2008

2009 2010 2011 2012
		"varying vec3 vReflect;",
		"uniform float reflectivity;",
		"uniform samplerCube env_map;",
		"uniform int combine;",
M
Mr.doob 已提交
2013

2014
	"#endif"
M
Mr.doob 已提交
2015

2016
	].join("\n"),
M
Mr.doob 已提交
2017

2018
	envmap_fragment: [
M
Mr.doob 已提交
2019

2020 2021 2022
	"#ifdef USE_ENVMAP",

		"cubeColor = textureCube( env_map, vec3( -vReflect.x, vReflect.yz ) );",
M
Mr.doob 已提交
2023

2024 2025 2026 2027 2028 2029 2030 2031
		"if ( combine == 1 ) {",

			"gl_FragColor = mix( gl_FragColor, cubeColor, reflectivity );",

		"} else {",

			"gl_FragColor = gl_FragColor * cubeColor;",

M
Mr.doob 已提交
2032
		"}",
2033 2034

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

2036
	].join("\n"),
M
Mr.doob 已提交
2037

2038
	envmap_pars_vertex: [
M
Mr.doob 已提交
2039

2040
	"#ifdef USE_ENVMAP",
M
Mr.doob 已提交
2041

2042 2043 2044
		"varying vec3 vReflect;",
		"uniform float refraction_ratio;",
		"uniform bool useRefract;",
M
Mr.doob 已提交
2045

2046
	"#endif"
M
Mr.doob 已提交
2047

2048 2049 2050
	].join("\n"),

	envmap_vertex : [
M
Mr.doob 已提交
2051

2052
	"#ifdef USE_ENVMAP",
M
Mr.doob 已提交
2053

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

2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067
		"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 已提交
2068

2069
	].join("\n"),
2070
	
2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094
	// COLOR MAP (particles)

	map_particle_pars_fragment: [

	"#ifdef USE_MAP",

		"uniform sampler2D map;",

	"#endif"

	].join("\n"),


	map_particle_fragment: [

	"#ifdef USE_MAP",

		"mapColor = texture2D( map, gl_PointCoord );",

	"#endif"

	].join("\n"),

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

2096
	map_pars_fragment: [
M
Mr.doob 已提交
2097

2098
	"#ifdef USE_MAP",
M
Mr.doob 已提交
2099

2100 2101
		"varying vec2 vUv;",
		"uniform sampler2D map;",
M
Mr.doob 已提交
2102

2103
	"#endif"
M
Mr.doob 已提交
2104

2105
	].join("\n"),
M
Mr.doob 已提交
2106

2107
	map_pars_vertex: [
M
Mr.doob 已提交
2108

2109
	"#ifdef USE_MAP",
M
Mr.doob 已提交
2110

2111 2112 2113
		"varying vec2 vUv;",

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

2115
	].join("\n"),
M
Mr.doob 已提交
2116

2117 2118 2119 2120 2121 2122 2123
	map_fragment: [

	"#ifdef USE_MAP",

		"mapColor = texture2D( map, vUv );",

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

2125
	].join("\n"),
M
Mr.doob 已提交
2126

2127
	map_vertex: [
M
Mr.doob 已提交
2128

2129
	"#ifdef USE_MAP",
M
Mr.doob 已提交
2130

2131
		"vUv = uv;",
M
Mr.doob 已提交
2132

2133
	"#endif"
M
Mr.doob 已提交
2134

2135
	].join("\n"),
M
Mr.doob 已提交
2136

2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179
	// 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",

		"lightmapColor = texture2D( light_map, vUv2 );",

	"#endif"

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

	"#ifdef USE_LIGHTMAP",

		"vUv2 = uv2;",

	"#endif"

	].join("\n"),

2180
	lights_pars_vertex: [
M
Mr.doob 已提交
2181

2182 2183
	"uniform bool enableLighting;",
	"uniform vec3 ambientLightColor;",
M
Mr.doob 已提交
2184

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

2187 2188
		"uniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];",
		"uniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];",
M
Mr.doob 已提交
2189

2190 2191 2192
	"#endif",

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

2194 2195
		"uniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];",
		"uniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];",
M
Mr.doob 已提交
2196

2197 2198 2199
		"#ifdef PHONG",
			"varying vec3 vPointLightVector[ MAX_POINT_LIGHTS ];",
		"#endif",
M
Mr.doob 已提交
2200

2201
	"#endif"
M
Mr.doob 已提交
2202

2203
	].join("\n"),
M
Mr.doob 已提交
2204

2205 2206
	// LIGHTS
	
2207
	lights_vertex: [
M
Mr.doob 已提交
2208

2209 2210
	"if ( !enableLighting ) {",

A
alteredq 已提交
2211
		"vLightWeighting = vec3( 1.0 );",
2212 2213 2214 2215 2216 2217

	"} else {",

		"vLightWeighting = ambientLightColor;",

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

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

2221 2222 2223
			"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 已提交
2224

2225
		"}",
M
Mr.doob 已提交
2226

2227 2228 2229
		"#endif",

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

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

2233 2234 2235 2236
			"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 已提交
2237

2238 2239 2240
			"#ifdef PHONG",
				"vPointLightVector[ i ] = pointLightVector;",
			"#endif",
M
Mr.doob 已提交
2241

2242
		"}",
M
Mr.doob 已提交
2243

2244
		"#endif",
M
Mr.doob 已提交
2245

2246
	"}"
M
Mr.doob 已提交
2247

2248
	].join("\n"),
M
Mr.doob 已提交
2249

2250
	lights_pars_fragment: [
M
Mr.doob 已提交
2251

2252 2253 2254
	"#if MAX_DIR_LIGHTS > 0",
		"uniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];",
	"#endif",
M
Mr.doob 已提交
2255

2256 2257 2258
	"#if MAX_POINT_LIGHTS > 0",
		"varying vec3 vPointLightVector[ MAX_POINT_LIGHTS ];",
	"#endif",
M
Mr.doob 已提交
2259

2260 2261
	"varying vec3 vViewPosition;",
	"varying vec3 vNormal;"
M
Mr.doob 已提交
2262

2263
	].join("\n"),
M
Mr.doob 已提交
2264

2265
	lights_fragment: [
M
Mr.doob 已提交
2266

2267 2268
	"vec3 normal = normalize( vNormal );",
	"vec3 viewPosition = normalize( vViewPosition );",
M
Mr.doob 已提交
2269

2270 2271 2272
	"vec4 mSpecular = vec4( specular, opacity );",

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

2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294
		"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 已提交
2295

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

2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319
		"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 已提交
2320

2321 2322 2323 2324 2325 2326 2327
	"#endif",

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

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

2329 2330 2331
	"#if MAX_POINT_LIGHTS > 0",
		"totalLight += pointDiffuse + pointSpecular;",
	"#endif"
2332

2333
	].join("\n")
2334

2335
};
2336

2337
THREE.UniformsLib = {
M
Mr.doob 已提交
2338

2339
	common: {
M
Mr.doob 已提交
2340

2341 2342 2343
	"color"   : { type: "c", value: new THREE.Color( 0xeeeeee ) },
	"opacity" : { type: "f", value: 1 },
	"map"     : { type: "t", value: 0, texture: null },
M
Mr.doob 已提交
2344

2345 2346
	"light_map"       : { type: "t", value: 2, texture: null },

2347 2348 2349 2350 2351
	"env_map" 		  : { type: "t", value: 1, texture: null },
	"useRefract"	  : { type: "i", value: 0 },
	"reflectivity"    : { type: "f", value: 1 },
	"refraction_ratio": { type: "f", value: 0.98 },
	"combine"		  : { type: "i", value: 0 },
M
Mr.doob 已提交
2352

2353 2354 2355 2356
	"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 已提交
2357

2358
	},
M
Mr.doob 已提交
2359

2360
	lights: {
M
Mr.doob 已提交
2361

2362 2363 2364 2365 2366 2367
	"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 已提交
2368

2369 2370 2371 2372 2373 2374 2375 2376
	},

	particle: {

	"color"   : { type: "c", value: new THREE.Color( 0xeeeeee ) },
	"opacity" : { type: "f", value: 1 },
	"size" 	  : { type: "f", value: 1 },
	"map"     : { type: "t", value: 0, texture: null },
M
Mr.doob 已提交
2377

2378 2379 2380 2381 2382 2383 2384
	"fogDensity": { type: "f", value: 0.00025 },
	"fogNear"	: { type: "f", value: 1 },
	"fogFar"	: { type: "f", value: 2000 },
	"fogColor"	: { type: "c", value: new THREE.Color( 0xffffff ) }
	
	}
	
2385 2386
};

2387
THREE.ShaderLib = {
2388

2389
	'depth': {
M
Mr.doob 已提交
2390

2391 2392
		uniforms: { "mNear": { type: "f", value: 1.0 },
					"mFar" : { type: "f", value: 2000.0 } },
2393

2394
		fragment_shader: [
M
Mr.doob 已提交
2395

2396 2397
			"uniform float mNear;",
			"uniform float mFar;",
M
Mr.doob 已提交
2398

2399
			"void main() {",
M
Mr.doob 已提交
2400

2401 2402 2403
				"float depth = gl_FragCoord.z / gl_FragCoord.w;",
				"float color = 1.0 - smoothstep( mNear, mFar, depth );",
				"gl_FragColor = vec4( vec3( color ), 1.0 );",
M
Mr.doob 已提交
2404

2405
			"}"
M
Mr.doob 已提交
2406

2407
		].join("\n"),
2408

2409
		vertex_shader: [
2410

2411
			"void main() {",
2412

2413
				"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",
2414

2415
			"}"
2416

2417
		].join("\n")
2418

2419
	},
2420

2421
	'normal': {
M
Mr.doob 已提交
2422

2423
		uniforms: { },
2424

2425
		fragment_shader: [
2426

2427
			"varying vec3 vNormal;",
M
Mr.doob 已提交
2428

2429
			"void main() {",
2430

2431
				"gl_FragColor = vec4( 0.5 * normalize( vNormal ) + 0.5, 1.0 );",
M
Mr.doob 已提交
2432

2433
			"}"
M
Mr.doob 已提交
2434

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

2437
		vertex_shader: [
2438

2439
			"varying vec3 vNormal;",
2440

2441 2442 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452
			"void main() {",

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

				"gl_Position = projectionMatrix * mvPosition;",

			"}"

		].join("\n")

	},
2453

2454
	'basic': {
M
Mr.doob 已提交
2455

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

2458
		fragment_shader: [
2459

2460 2461
			"uniform vec3 color;",
			"uniform float opacity;",
M
Mr.doob 已提交
2462

2463
			THREE.Snippets[ "map_pars_fragment" ],
2464
			THREE.Snippets[ "lightmap_pars_fragment" ],
2465 2466
			THREE.Snippets[ "envmap_pars_fragment" ],
			THREE.Snippets[ "fog_pars_fragment" ],
M
Mr.doob 已提交
2467

2468
			"void main() {",
2469

2470
				"vec4 mColor = vec4( color, opacity );",
A
alteredq 已提交
2471
				"vec4 mapColor = vec4( 1.0 );",
2472
				"vec4 lightmapColor = vec4( 1.0 );",
A
alteredq 已提交
2473
				"vec4 cubeColor = vec4( 1.0 );",
2474

2475
				THREE.Snippets[ "map_fragment" ],
2476
				THREE.Snippets[ "lightmap_fragment" ],
M
Mr.doob 已提交
2477

2478
				"gl_FragColor = mColor * mapColor * lightmapColor;",
M
Mr.doob 已提交
2479

2480 2481
				THREE.Snippets[ "envmap_fragment" ],
				THREE.Snippets[ "fog_fragment" ],
M
Mr.doob 已提交
2482

2483
			"}"
2484

2485
		].join("\n"),
M
Mr.doob 已提交
2486

2487
		vertex_shader: [
M
Mr.doob 已提交
2488

2489
			THREE.Snippets[ "map_pars_vertex" ],
2490
			THREE.Snippets[ "lightmap_pars_vertex" ],
2491
			THREE.Snippets[ "envmap_pars_vertex" ],
M
Mr.doob 已提交
2492

2493
			"void main() {",
M
Mr.doob 已提交
2494

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

2497
				THREE.Snippets[ "map_vertex" ],
2498
				THREE.Snippets[ "lightmap_vertex" ],
2499
				THREE.Snippets[ "envmap_vertex" ],
M
Mr.doob 已提交
2500

2501
				"gl_Position = projectionMatrix * mvPosition;",
2502

2503
			"}"
2504

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

2507
	},
2508

2509
	'lambert': {
M
Mr.doob 已提交
2510 2511

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

2514
		fragment_shader: [
M
Mr.doob 已提交
2515

2516 2517
			"uniform vec3 color;",
			"uniform float opacity;",
M
Mr.doob 已提交
2518

2519
			"varying vec3 vLightWeighting;",
M
Mr.doob 已提交
2520

2521
			THREE.Snippets[ "map_pars_fragment" ],
2522
			THREE.Snippets[ "lightmap_pars_fragment" ],
2523 2524
			THREE.Snippets[ "envmap_pars_fragment" ],
			THREE.Snippets[ "fog_pars_fragment" ],
M
Mr.doob 已提交
2525

2526
			"void main() {",
M
Mr.doob 已提交
2527

2528
				"vec4 mColor = vec4( color, opacity );",
A
alteredq 已提交
2529
				"vec4 mapColor = vec4( 1.0 );",
2530
				"vec4 lightmapColor = vec4( 1.0 );",
A
alteredq 已提交
2531
				"vec4 cubeColor = vec4( 1.0 );",
2532 2533

				THREE.Snippets[ "map_fragment" ],
2534
				THREE.Snippets[ "lightmap_fragment" ],
2535

2536
				"gl_FragColor =  mColor * mapColor * lightmapColor * vec4( vLightWeighting, 1.0 );",
M
Mr.doob 已提交
2537

2538
				THREE.Snippets[ "envmap_fragment" ],
2539 2540 2541 2542 2543 2544 2545
				THREE.Snippets[ "fog_fragment" ],

			"}"

		].join("\n"),

		vertex_shader: [
M
Mr.doob 已提交
2546

2547
			"varying vec3 vLightWeighting;",
M
Mr.doob 已提交
2548

2549
			THREE.Snippets[ "map_pars_vertex" ],
2550
			THREE.Snippets[ "lightmap_pars_vertex" ],
2551 2552
			THREE.Snippets[ "envmap_pars_vertex" ],
			THREE.Snippets[ "lights_pars_vertex" ],
M
Mr.doob 已提交
2553

2554
			"void main() {",
M
Mr.doob 已提交
2555

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

2558
				THREE.Snippets[ "map_vertex" ],
2559
				THREE.Snippets[ "lightmap_vertex" ],
2560
				THREE.Snippets[ "envmap_vertex" ],
M
Mr.doob 已提交
2561

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

2564
				THREE.Snippets[ "lights_vertex" ],
M
Mr.doob 已提交
2565

2566 2567 2568 2569 2570
				"gl_Position = projectionMatrix * mvPosition;",

			"}"

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

2572
	},
M
Mr.doob 已提交
2573

2574
	'phong': {
M
Mr.doob 已提交
2575 2576

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

2579
									{ "ambient"  : { type: "c", value: new THREE.Color( 0x050505 ) },
2580 2581 2582
									  "specular" : { type: "c", value: new THREE.Color( 0x111111 ) },
									  "shininess": { type: "f", value: 30 }
									}
M
Mr.doob 已提交
2583

2584
								] ),
M
Mr.doob 已提交
2585

2586
		fragment_shader: [
M
Mr.doob 已提交
2587

2588 2589
			"uniform vec3 color;",
			"uniform float opacity;",
M
Mr.doob 已提交
2590

2591 2592 2593
			"uniform vec3 ambient;",
			"uniform vec3 specular;",
			"uniform float shininess;",
M
Mr.doob 已提交
2594

2595
			"varying vec3 vLightWeighting;",
M
Mr.doob 已提交
2596

2597
			THREE.Snippets[ "map_pars_fragment" ],
2598
			THREE.Snippets[ "lightmap_pars_fragment" ],
2599 2600 2601
			THREE.Snippets[ "envmap_pars_fragment" ],
			THREE.Snippets[ "fog_pars_fragment" ],
			THREE.Snippets[ "lights_pars_fragment" ],
M
Mr.doob 已提交
2602

2603
			"void main() {",
M
Mr.doob 已提交
2604

2605 2606
				"vec4 mColor = vec4( color, opacity );",
				"vec4 mapColor = vec4( 1.0 );",
2607
				"vec4 lightmapColor = vec4( 1.0 );",
2608 2609 2610 2611
				"vec4 cubeColor = vec4( 1.0 );",

				THREE.Snippets[ "map_fragment" ],
				THREE.Snippets[ "lights_fragment" ],
2612
				THREE.Snippets[ "lightmap_fragment" ],
2613

2614
				"gl_FragColor =  mapColor * lightmapColor * totalLight * vec4( vLightWeighting, 1.0 );",
M
Mr.doob 已提交
2615

2616 2617 2618 2619 2620 2621 2622 2623
				THREE.Snippets[ "envmap_fragment" ],
				THREE.Snippets[ "fog_fragment" ],

			"}"

		].join("\n"),

		vertex_shader: [
M
Mr.doob 已提交
2624

2625
			"#define PHONG",
M
Mr.doob 已提交
2626

2627 2628 2629
			"varying vec3 vLightWeighting;",
			"varying vec3 vViewPosition;",
			"varying vec3 vNormal;",
M
Mr.doob 已提交
2630

2631
			THREE.Snippets[ "map_pars_vertex" ],
2632
			THREE.Snippets[ "lightmap_pars_vertex" ],
2633 2634
			THREE.Snippets[ "envmap_pars_vertex" ],
			THREE.Snippets[ "lights_pars_vertex" ],
M
Mr.doob 已提交
2635

2636
			"void main() {",
M
Mr.doob 已提交
2637

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

2640
				THREE.Snippets[ "map_vertex" ],
2641
				THREE.Snippets[ "lightmap_vertex" ],
2642
				THREE.Snippets[ "envmap_vertex" ],
M
Mr.doob 已提交
2643

2644 2645 2646
				"#ifndef USE_ENVMAP",
					"vec4 mPosition = objectMatrix * vec4( position, 1.0 );",
				"#endif",
M
Mr.doob 已提交
2647

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

2650 2651
				"vec3 transformedNormal = normalize( normalMatrix * normal );",
				"vNormal = transformedNormal;",
2652

2653
				THREE.Snippets[ "lights_vertex" ],
M
Mr.doob 已提交
2654

2655
				"gl_Position = projectionMatrix * mvPosition;",
2656 2657 2658 2659

			"}"

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

2661 2662 2663 2664 2665 2666 2667 2668 2669 2670 2671 2672 2673 2674 2675 2676 2677 2678 2679 2680 2681 2682 2683 2684 2685 2686 2687 2688 2689 2690 2691 2692 2693 2694 2695 2696 2697 2698 2699 2700 2701 2702 2703 2704 2705
	},
	
	'particle_basic': {

		uniforms: THREE.UniformsLib[ "particle" ],

		fragment_shader: [

			"uniform vec3 color;",
			"uniform float opacity;",

			THREE.Snippets[ "map_particle_pars_fragment" ],
			THREE.Snippets[ "fog_pars_fragment" ],

			"void main() {",

				"vec4 mColor = vec4( color, opacity );",
				"vec4 mapColor = vec4( 1.0 );",

				THREE.Snippets[ "map_particle_fragment" ],
		
				"gl_FragColor = mColor * mapColor;",

				THREE.Snippets[ "fog_fragment" ],

			"}"

		].join("\n"),

		vertex_shader: [

			"uniform float size;",
			
			"void main() {",

				"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 已提交
2706
	}
2707
	
A
alteredq 已提交
2708

N
Nicolas Garcia Belmonte 已提交
2709
};