WebGLRenderer.js 55.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 157
		geometry.__webGLVertexBuffer = _gl.createBuffer();
		geometry.__webGLFaceBuffer = _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 174 175
		geometryChunk.__webGLVertexBuffer = _gl.createBuffer();
		geometryChunk.__webGLNormalBuffer = _gl.createBuffer();
		geometryChunk.__webGLTangentBuffer = _gl.createBuffer();
		geometryChunk.__webGLUVBuffer = _gl.createBuffer();
		geometryChunk.__webGLFaceBuffer = _gl.createBuffer();
		geometryChunk.__webGLLineBuffer = _gl.createBuffer();
M
Mr.doob 已提交
176

177
	};
178 179

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

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

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

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

188
	};
M
Mr.doob 已提交
189

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

192
		var f, fl, nvertices = 0, ntris = 0, nlines = 0,
M
Mr.doob 已提交
193
			obj_faces = object.geometry.faces,
194
			chunk_faces = geometryChunk.faces;
M
Mr.doob 已提交
195

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

198 199
			fi = chunk_faces[ f ];
			face = obj_faces[ fi ];
M
Mr.doob 已提交
200

201
			if ( face instanceof THREE.Face3 ) {
M
Mr.doob 已提交
202

203 204 205
				nvertices += 3;
				ntris += 1;
				nlines += 3;
M
Mr.doob 已提交
206

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

209 210
				nvertices += 4;
				ntris += 2;
211
				nlines += 4;
M
Mr.doob 已提交
212

213
			}
M
Mr.doob 已提交
214

215
		}
M
Mr.doob 已提交
216

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

219 220 221 222
		geometryChunk.__vertexArray  = new Float32Array( nvertices * 3 );
		geometryChunk.__normalArray  = new Float32Array( nvertices * 3 );
		geometryChunk.__tangentArray = new Float32Array( nvertices * 4 );
		geometryChunk.__uvArray = new Float32Array( nvertices * 2 );
M
Mr.doob 已提交
223

224 225
		geometryChunk.__faceArray = new Uint16Array( ntris * 3 );
		geometryChunk.__lineArray = new Uint16Array( nlines * 2 );
M
Mr.doob 已提交
226

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

229 230
		geometryChunk.__webGLFaceCount = ntris * 3;
		geometryChunk.__webGLLineCount = nlines * 2;
M
Mr.doob 已提交
231

232
	};
M
Mr.doob 已提交
233

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

236
		var f, fl, fi, face, vertexNormals, faceNormal, normal, uv, v1, v2, v3, v4, t1, t2, t3, t4, m, ml, i,
237
			vn, uvi,
M
Mr.doob 已提交
238

239
		vertexIndex = 0,
240

241 242 243 244 245 246
		offset = 0,
		offset_uv = 0,
		offset_face = 0,
		offset_normal = 0,
		offset_tangent = 0,
		offset_line = 0,
M
Mr.doob 已提交
247

248 249 250 251
		vertexArray = geometryChunk.__vertexArray,
		uvArray = geometryChunk.__uvArray,
		normalArray = geometryChunk.__normalArray,
		tangentArray = geometryChunk.__tangentArray,
M
Mr.doob 已提交
252

253 254
		faceArray = geometryChunk.__faceArray,
		lineArray = geometryChunk.__lineArray,
M
Mr.doob 已提交
255

256
		needsSmoothNormals = geometryChunk.__needsSmoothNormals,
M
Mr.doob 已提交
257

258 259 260 261 262
		geometry = object.geometry,
		vertices = geometry.vertices,
		chunk_faces = geometryChunk.faces,
		obj_faces = geometry.faces,
		obj_uvs = geometry.uvs;
M
Mr.doob 已提交
263

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

266 267 268
			fi = chunk_faces[ f ];
			face = obj_faces[ fi ];
			uv = obj_uvs[ fi ];
M
Mr.doob 已提交
269

270
			vertexNormals = face.vertexNormals;
271
			faceNormal = face.normal;
272 273 274

			if ( face instanceof THREE.Face3 ) {

275
				if ( dirtyVertices ) {
M
Mr.doob 已提交
276

277 278 279
					v1 = vertices[ face.a ].position;
					v2 = vertices[ face.b ].position;
					v3 = vertices[ face.c ].position;
M
Mr.doob 已提交
280

281 282 283
					vertexArray[ offset ]     = v1.x;
					vertexArray[ offset + 1 ] = v1.y;
					vertexArray[ offset + 2 ] = v1.z;
M
Mr.doob 已提交
284

285 286 287
					vertexArray[ offset + 3 ] = v2.x;
					vertexArray[ offset + 4 ] = v2.y;
					vertexArray[ offset + 5 ] = v2.z;
288

289 290 291
					vertexArray[ offset + 6 ] = v3.x;
					vertexArray[ offset + 7 ] = v3.y;
					vertexArray[ offset + 8 ] = v3.z;
M
Mr.doob 已提交
292

293
					offset += 9;
M
Mr.doob 已提交
294

295
				}
296

297
				if ( dirtyTangents && geometry.hasTangents ) {
298

299 300 301
					t1 = vertices[ face.a ].tangent;
					t2 = vertices[ face.b ].tangent;
					t3 = vertices[ face.c ].tangent;
302

303 304 305 306
					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 已提交
307

308 309 310 311
					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 已提交
312

313 314 315 316
					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 已提交
317

318
					offset_tangent += 12;
M
Mr.doob 已提交
319

320 321
				}

322
				if( dirtyNormals ) {
M
Mr.doob 已提交
323

324 325
					if ( vertexNormals.length == 3 && needsSmoothNormals ) {

326

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

329
							vn = vertexNormals[ i ];
M
Mr.doob 已提交
330

331 332 333
							normalArray[ offset_normal ]     = vn.x;
							normalArray[ offset_normal + 1 ] = vn.y;
							normalArray[ offset_normal + 2 ] = vn.z;
M
Mr.doob 已提交
334

335
							offset_normal += 3;
M
Mr.doob 已提交
336

337
						}
M
Mr.doob 已提交
338

339
					} else {
340

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

343 344 345
							normalArray[ offset_normal ]     = faceNormal.x;
							normalArray[ offset_normal + 1 ] = faceNormal.y;
							normalArray[ offset_normal + 2 ] = faceNormal.z;
M
Mr.doob 已提交
346

347
							offset_normal += 3;
M
Mr.doob 已提交
348

349
						}
M
Mr.doob 已提交
350 351

					}
M
Mr.doob 已提交
352

353 354
				}

355
				if ( dirtyUvs && uv ) {
356

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

359
						uvi = uv[ i ];
M
Mr.doob 已提交
360

361 362
						uvArray[ offset_uv ]     = uvi.u;
						uvArray[ offset_uv + 1 ] = uvi.v;
M
Mr.doob 已提交
363

364
						offset_uv += 2;
M
Mr.doob 已提交
365

M
Mr.doob 已提交
366
					}
367 368 369

				}

370
				if( dirtyElements ) {
M
Mr.doob 已提交
371

372 373 374
					faceArray[ offset_face ] = vertexIndex;
					faceArray[ offset_face + 1 ] = vertexIndex + 1;
					faceArray[ offset_face + 2 ] = vertexIndex + 2;
M
Mr.doob 已提交
375

376
					offset_face += 3;
M
Mr.doob 已提交
377

378 379
					lineArray[ offset_line ]     = vertexIndex;
					lineArray[ offset_line + 1 ] = vertexIndex + 1;
M
Mr.doob 已提交
380

381 382
					lineArray[ offset_line + 2 ] = vertexIndex;
					lineArray[ offset_line + 3 ] = vertexIndex + 2;
M
Mr.doob 已提交
383

384 385
					lineArray[ offset_line + 4 ] = vertexIndex + 1;
					lineArray[ offset_line + 5 ] = vertexIndex + 2;
M
Mr.doob 已提交
386

387
					offset_line += 6;
388

389
					vertexIndex += 3;
M
Mr.doob 已提交
390

391
				}
M
Mr.doob 已提交
392

393 394 395

			} else if ( face instanceof THREE.Face4 ) {

396
				if ( dirtyVertices ) {
M
Mr.doob 已提交
397

398 399 400 401
					v1 = vertices[ face.a ].position;
					v2 = vertices[ face.b ].position;
					v3 = vertices[ face.c ].position;
					v4 = vertices[ face.d ].position;
M
Mr.doob 已提交
402

403 404 405
					vertexArray[ offset ]     = v1.x;
					vertexArray[ offset + 1 ] = v1.y;
					vertexArray[ offset + 2 ] = v1.z;
M
Mr.doob 已提交
406

407 408 409
					vertexArray[ offset + 3 ] = v2.x;
					vertexArray[ offset + 4 ] = v2.y;
					vertexArray[ offset + 5 ] = v2.z;
410

411 412 413
					vertexArray[ offset + 6 ] = v3.x;
					vertexArray[ offset + 7 ] = v3.y;
					vertexArray[ offset + 8 ] = v3.z;
414

415 416 417
					vertexArray[ offset + 9 ] = v4.x;
					vertexArray[ offset + 10 ] = v4.y;
					vertexArray[ offset + 11 ] = v4.z;
M
Mr.doob 已提交
418

419
					offset += 12;
M
Mr.doob 已提交
420

421
				}
422

423
				if ( dirtyTangents && geometry.hasTangents ) {
424

425 426 427 428
					t1 = vertices[ face.a ].tangent;
					t2 = vertices[ face.b ].tangent;
					t3 = vertices[ face.c ].tangent;
					t4 = vertices[ face.d ].tangent;
429

430 431 432 433
					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 已提交
434

435 436 437 438
					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 已提交
439

440 441 442 443
					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 已提交
444

445 446 447 448
					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 已提交
449

450
					offset_tangent += 16;
M
Mr.doob 已提交
451

452
				}
M
Mr.doob 已提交
453

454
				if( dirtyNormals ) {
M
Mr.doob 已提交
455

456
					if ( vertexNormals.length == 4 && needsSmoothNormals ) {
457

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

460
							vn = vertexNormals[ i ];
M
Mr.doob 已提交
461

462 463 464
							normalArray[ offset_normal ]     = vn.x;
							normalArray[ offset_normal + 1 ] = vn.y;
							normalArray[ offset_normal + 2 ] = vn.z;
M
Mr.doob 已提交
465

466
							offset_normal += 3;
M
Mr.doob 已提交
467

468
						}
M
Mr.doob 已提交
469

470
					} else {
471

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

474 475 476
							normalArray[ offset_normal ]     = faceNormal.x;
							normalArray[ offset_normal + 1 ] = faceNormal.y;
							normalArray[ offset_normal + 2 ] = faceNormal.z;
M
Mr.doob 已提交
477

478
							offset_normal += 3;
M
Mr.doob 已提交
479

480
						}
M
Mr.doob 已提交
481 482

					}
M
Mr.doob 已提交
483

484 485
				}

486
				if ( dirtyUvs && uv ) {
487

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

490
						uvi = uv[ i ];
M
Mr.doob 已提交
491

492 493
						uvArray[ offset_uv ]     = uvi.u;
						uvArray[ offset_uv + 1 ] = uvi.v;
M
Mr.doob 已提交
494

495
						offset_uv += 2;
M
Mr.doob 已提交
496

M
Mr.doob 已提交
497
					}
498 499

				}
M
Mr.doob 已提交
500

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

503 504 505
					faceArray[ offset_face ]     = vertexIndex;
					faceArray[ offset_face + 1 ] = vertexIndex + 1;
					faceArray[ offset_face + 2 ] = vertexIndex + 2;
M
Mr.doob 已提交
506

507 508 509
					faceArray[ offset_face + 3 ] = vertexIndex;
					faceArray[ offset_face + 4 ] = vertexIndex + 2;
					faceArray[ offset_face + 5 ] = vertexIndex + 3;
M
Mr.doob 已提交
510

511
					offset_face += 6;
M
Mr.doob 已提交
512

513 514
					lineArray[ offset_line ]     = vertexIndex;
					lineArray[ offset_line + 1 ] = vertexIndex + 1;
M
Mr.doob 已提交
515

516
					lineArray[ offset_line + 2 ] = vertexIndex;
517
					lineArray[ offset_line + 3 ] = vertexIndex + 3;
M
Mr.doob 已提交
518

519 520
					lineArray[ offset_line + 4 ] = vertexIndex + 1;
					lineArray[ offset_line + 5 ] = vertexIndex + 2;
M
Mr.doob 已提交
521

522 523
					lineArray[ offset_line + 6 ] = vertexIndex + 2;
					lineArray[ offset_line + 7 ] = vertexIndex + 3;
M
Mr.doob 已提交
524

525
					offset_line += 8;
M
Mr.doob 已提交
526

527
					vertexIndex += 4;
M
Mr.doob 已提交
528

529
				}
M
Mr.doob 已提交
530

531
			}
M
Mr.doob 已提交
532

533 534
		}

535
		if ( dirtyVertices ) {
M
Mr.doob 已提交
536

537 538
			_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryChunk.__webGLVertexBuffer );
			_gl.bufferData( _gl.ARRAY_BUFFER, vertexArray, hint );
M
Mr.doob 已提交
539

540
		}
M
Mr.doob 已提交
541

542
		if ( dirtyNormals ) {
M
Mr.doob 已提交
543

544 545
			_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryChunk.__webGLNormalBuffer );
			_gl.bufferData( _gl.ARRAY_BUFFER, normalArray, hint );
M
Mr.doob 已提交
546

547 548
		}

549
		if ( dirtyTangents && geometry.hasTangents ) {
550

551
			_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryChunk.__webGLTangentBuffer );
552
			_gl.bufferData( _gl.ARRAY_BUFFER, tangentArray, hint );
M
Mr.doob 已提交
553

554
		}
555

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

558
			_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryChunk.__webGLUVBuffer );
559
			_gl.bufferData( _gl.ARRAY_BUFFER, uvArray, hint );
M
Mr.doob 已提交
560

561
		}
M
Mr.doob 已提交
562

563
		if( dirtyElements ) {
M
Mr.doob 已提交
564

565 566
			_gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, geometryChunk.__webGLFaceBuffer );
			_gl.bufferData( _gl.ELEMENT_ARRAY_BUFFER, faceArray, hint );
567

568 569
			_gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, geometryChunk.__webGLLineBuffer );
			_gl.bufferData( _gl.ELEMENT_ARRAY_BUFFER, lineArray, hint );
M
Mr.doob 已提交
570

571
		}
572 573

	};
574

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

577 578 579
		var v, vertex, offset,
			vertices = geometry.vertices,
			vl = vertices.length,
M
Mr.doob 已提交
580 581

			vertexArray = geometry.__vertexArray,
582
			lineArray = geometry.__lineArray;
M
Mr.doob 已提交
583

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

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

588
				vertex = vertices[ v ].position;
M
Mr.doob 已提交
589

590
				offset = v * 3;
M
Mr.doob 已提交
591

592 593 594
				vertexArray[ offset ]     = vertex.x;
				vertexArray[ offset + 1 ] = vertex.y;
				vertexArray[ offset + 2 ] = vertex.z;
M
Mr.doob 已提交
595

596 597 598
			}

		}
M
Mr.doob 已提交
599

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

603
		if ( dirtyElements ) {
M
Mr.doob 已提交
604

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

607
				lineArray[ v ] = v;
M
Mr.doob 已提交
608

609
			}
M
Mr.doob 已提交
610

611 612 613 614
		}

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

616 617
		_gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, geometry.__webGLLineBuffer );
		_gl.bufferData( _gl.ELEMENT_ARRAY_BUFFER, lineArray, hint );
M
Mr.doob 已提交
618

619
	};
M
Mr.doob 已提交
620

621 622
	this.setParticleBuffers = function( geometry, hint, dirtyVertices, dirtyElements ) {
	};
M
Mr.doob 已提交
623

M
Mr.doob 已提交
624
	function setMaterialShaders( material, shaders ) {
625

M
Mr.doob 已提交
626 627
		material.fragment_shader = shaders.fragment_shader;
		material.vertex_shader = shaders.vertex_shader;
628
		material.uniforms = Uniforms.clone( shaders.uniforms );
629

M
Mr.doob 已提交
630
	};
631

632
	function refreshUniformsCommon( material, fog ) {
M
Mr.doob 已提交
633

634 635
		// 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 已提交
636

637 638
		// pure color
		//material.uniforms.color.value.setHex( material.color.hex );
M
Mr.doob 已提交
639

640 641
		material.uniforms.opacity.value = material.opacity;
		material.uniforms.map.texture = material.map;
642

643 644 645 646 647
		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;
648

649 650 651
		if ( fog ) {

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

653
			if ( fog instanceof THREE.Fog ) {
654

655 656
				material.uniforms.fogNear.value = fog.near;
				material.uniforms.fogFar.value = fog.far;
657

658
			} else if ( fog instanceof THREE.FogExp2 ) {
659

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

662 663 664
			}

		}
665

666
	};
667 668

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

		material.uniforms.color.value.setRGB( material.color.r * material.opacity, material.color.g * material.opacity, material.color.b * material.opacity );
671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690
		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 已提交
691

692
	function refreshUniformsPhong( material ) {
M
Mr.doob 已提交
693

694 695 696 697 698
		//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 已提交
699

700
	};
M
Mr.doob 已提交
701 702


703
	function refreshLights( material, lights ) {
M
Mr.doob 已提交
704

705
		material.uniforms.enableLighting.value = lights.directional.length + lights.point.length;
706 707 708 709 710
		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 已提交
711

A
alteredq 已提交
712
	};
M
Mr.doob 已提交
713

714 715
	this.initMaterial = function( material, lights, fog ) {
		
716
		if ( !material.program ) {
M
Mr.doob 已提交
717

718 719
			var u, identifiers, parameters, maxLightCount;
			
720
			if ( material instanceof THREE.MeshDepthMaterial ) {
721

722
				setMaterialShaders( material, THREE.ShaderLib[ 'depth' ] );
723

724
			} else if ( material instanceof THREE.MeshNormalMaterial ) {
725

726
				setMaterialShaders( material, THREE.ShaderLib[ 'normal' ] );
727

728
			} else if ( material instanceof THREE.MeshBasicMaterial ) {
729

730
				setMaterialShaders( material, THREE.ShaderLib[ 'basic' ] );
731

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

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

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

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

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

742 743
				setMaterialShaders( material, THREE.ShaderLib[ 'basic' ] );

744
			}
745

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

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

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

754 755
			identifiers = [ 'viewMatrix', 'modelViewMatrix', 'projectionMatrix', 'normalMatrix', 'objectMatrix', 'cameraPosition' ];
			for( u in material.uniforms ) {
756

757
				identifiers.push(u);
M
Mr.doob 已提交
758

M
Mr.doob 已提交
759
			}
M
Mr.doob 已提交
760

761 762
			cacheUniformLocations( material.program, identifiers );
			cacheAttributeLocations( material.program, [ "position", "normal", "uv", "tangent" ] );
M
Mr.doob 已提交
763

M
Mr.doob 已提交
764
		}
765 766 767 768 769 770 771 772
		
	};
	
	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 已提交
773

774 775
		program = material.program;

M
Mr.doob 已提交
776
		if( program != _oldProgram ) {
M
Mr.doob 已提交
777

M
Mr.doob 已提交
778 779
			_gl.useProgram( program );
			_oldProgram = program;
M
Mr.doob 已提交
780

M
Mr.doob 已提交
781
		}
M
Mr.doob 已提交
782

783 784
		this.loadCamera( program, camera );
		this.loadMatrices( program );
M
Mr.doob 已提交
785

M
Mr.doob 已提交
786
		if ( material instanceof THREE.MeshPhongMaterial ||
787
			 material instanceof THREE.MeshLambertMaterial ) {
788

789 790
			this.setupLights( program, lights );
			refreshLights( material, this.lights );
M
Mr.doob 已提交
791 792 793

		}

794 795 796
		if ( material instanceof THREE.MeshBasicMaterial ||
			 material instanceof THREE.MeshLambertMaterial ||
			 material instanceof THREE.MeshPhongMaterial ) {
M
Mr.doob 已提交
797

798
			refreshUniformsCommon( material, fog );
M
Mr.doob 已提交
799

A
alteredq 已提交
800
		}
M
Mr.doob 已提交
801

802
		if ( material instanceof THREE.LineBasicMaterial ) {
M
Mr.doob 已提交
803

804 805
			refreshUniformsLine( material, fog );
		}
M
Mr.doob 已提交
806

M
Mr.doob 已提交
807
		if ( material instanceof THREE.MeshPhongMaterial ) {
M
Mr.doob 已提交
808

809
			refreshUniformsPhong( material );
M
Mr.doob 已提交
810

811
		}
M
Mr.doob 已提交
812

813 814 815 816 817 818
		if ( material instanceof THREE.MeshDepthMaterial ) {

			material.uniforms.mNear.value = camera.near;
			material.uniforms.mFar.value = camera.far;
		}
		
819
		setUniforms( program, material.uniforms );
820

821
		attributes = program.attributes;
M
Mr.doob 已提交
822

823
		// vertices
M
Mr.doob 已提交
824

M
Mr.doob 已提交
825
		_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryChunk.__webGLVertexBuffer );
826
		_gl.vertexAttribPointer( attributes.position, 3, _gl.FLOAT, false, 0, 0 );
827
		_gl.enableVertexAttribArray( attributes.position );
828 829

		// normals
M
Mr.doob 已提交
830

831
		if ( attributes.normal >= 0 ) {
832

833 834
			_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryChunk.__webGLNormalBuffer );
			_gl.vertexAttribPointer( attributes.normal, 3, _gl.FLOAT, false, 0, 0 );
835
			_gl.enableVertexAttribArray( attributes.normal );
836

837
		}
838

839 840 841
		// tangents

		if ( attributes.tangent >= 0 ) {
842

843 844
			_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryChunk.__webGLTangentBuffer );
			_gl.vertexAttribPointer( attributes.tangent, 4, _gl.FLOAT, false, 0, 0 );
845
			_gl.enableVertexAttribArray( attributes.tangent );
846

847
		}
848

849
		// uvs
M
Mr.doob 已提交
850

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

853
			if ( geometryChunk.__webGLUVBuffer ) {
854

855
				_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryChunk.__webGLUVBuffer );
856
				_gl.vertexAttribPointer( attributes.uv, 2, _gl.FLOAT, false, 0, 0 );
857

858
				_gl.enableVertexAttribArray( attributes.uv );
859

860
			} else {
861

862
				_gl.disableVertexAttribArray( attributes.uv );
M
Mr.doob 已提交
863

864
			}
865 866 867

		}

868
		// render lines
M
Mr.doob 已提交
869

870
		if ( material.wireframe || material instanceof THREE.LineBasicMaterial ) {
871

M
Mr.doob 已提交
872
			linewidth = material.wireframe_linewidth !== undefined ? material.wireframe_linewidth :
873
						material.linewidth !== undefined ? material.linewidth : 1;
M
Mr.doob 已提交
874

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

877 878
			_gl.lineWidth( linewidth );
			_gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, geometryChunk.__webGLLineBuffer );
879
			_gl.drawElements( primitives, geometryChunk.__webGLLineCount, _gl.UNSIGNED_SHORT, 0 );
880

881
		// render triangles
M
Mr.doob 已提交
882

A
alteredq 已提交
883
		} else {
884

885 886
			_gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, geometryChunk.__webGLFaceBuffer );
			_gl.drawElements( _gl.TRIANGLES, geometryChunk.__webGLFaceCount, _gl.UNSIGNED_SHORT, 0 );
887 888 889 890 891

		}

	};

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

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

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

M
Mr.doob 已提交
898
			meshMaterial = object.materials[ m ];
899

M
Mr.doob 已提交
900
			if ( meshMaterial instanceof THREE.MeshFaceMaterial ) {
901

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

					material = geometryChunk.materials[ i ];
905

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

M
Mr.doob 已提交
908
						this.setBlending( material.blending );
909
						this.renderBuffer( camera, lights, fog, material, geometryChunk, object );
M
Mr.doob 已提交
910

911 912
					}

M
Mr.doob 已提交
913
				}
914

M
Mr.doob 已提交
915
			} else {
916

M
Mr.doob 已提交
917
				material = meshMaterial;
918
				if ( material && material.blending == blending && ( material.opacity < 1.0 == transparent ) ) {
M
Mr.doob 已提交
919

M
Mr.doob 已提交
920
					this.setBlending( material.blending );
921
					this.renderBuffer( camera, lights, fog, material, geometryChunk, object );
M
Mr.doob 已提交
922

923 924 925
				}

			}
926 927

		}
M
Mr.doob 已提交
928

929
	};
M
Mr.doob 已提交
930

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

M
Mr.doob 已提交
933
		var o, ol, webGLObject, object, buffer,
A
alteredq 已提交
934 935
			lights = scene.lights,
			fog = scene.fog;
M
Mr.doob 已提交
936

M
Mr.doob 已提交
937
		this.initWebGLObjects( scene );
M
Mr.doob 已提交
938

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

941
		if ( this.autoClear ) {
M
Mr.doob 已提交
942

943
			this.clear();
M
Mr.doob 已提交
944

945 946
		}

947
		camera.autoUpdateMatrix && camera.updateMatrix();
M
Mr.doob 已提交
948

949 950
		_viewMatrixArray.set( camera.matrix.flatten() );
		_projectionMatrixArray.set( camera.projectionMatrix.flatten() );
M
Mr.doob 已提交
951

M
Mr.doob 已提交
952
		// opaque pass
M
Mr.doob 已提交
953

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

M
Mr.doob 已提交
956
			webGLObject = scene.__webGLObjects[ o ];
M
Mr.doob 已提交
957

M
Mr.doob 已提交
958 959
			object = webGLObject.object;
			buffer = webGLObject.buffer;
M
Mr.doob 已提交
960

M
Mr.doob 已提交
961
			if ( object.visible ) {
M
Mr.doob 已提交
962

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

966
			}
M
Mr.doob 已提交
967

M
Mr.doob 已提交
968
		}
M
Mr.doob 已提交
969

M
Mr.doob 已提交
970
		// transparent pass
M
Mr.doob 已提交
971

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

M
Mr.doob 已提交
974
			webGLObject = scene.__webGLObjects[ o ];
M
Mr.doob 已提交
975

M
Mr.doob 已提交
976 977
			object = webGLObject.object;
			buffer = webGLObject.buffer;
M
Mr.doob 已提交
978

M
Mr.doob 已提交
979
			if ( object.visible ) {
M
Mr.doob 已提交
980

M
Mr.doob 已提交
981
				this.setupMatrices( object, camera );
982

983
				if( object.doubleSided ) {
M
Mr.doob 已提交
984

985
					_gl.disable( _gl.CULL_FACE );
M
Mr.doob 已提交
986

987
				} else {
M
Mr.doob 已提交
988

989
					_gl.enable( _gl.CULL_FACE );
M
Mr.doob 已提交
990

991
					if( object.flipSided ) {
M
Mr.doob 已提交
992

993
						_gl.frontFace( _gl.CW );
M
Mr.doob 已提交
994

995 996
					}
					else {
M
Mr.doob 已提交
997

998
						_gl.frontFace( _gl.CCW );
M
Mr.doob 已提交
999

1000
					}
M
Mr.doob 已提交
1001

1002
				}
M
Mr.doob 已提交
1003

1004
				// opaque blended materials
M
Mr.doob 已提交
1005

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

1009
				// transparent blended materials
M
Mr.doob 已提交
1010

A
alteredq 已提交
1011 1012
				this.renderPass( camera, lights, fog, object, buffer, THREE.AdditiveBlending, true );
				this.renderPass( camera, lights, fog, object, buffer, THREE.SubtractiveBlending, true );
1013

1014
				// transparent normal materials
M
Mr.doob 已提交
1015

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

1018
			}
M
Mr.doob 已提交
1019

M
Mr.doob 已提交
1020
		}
M
Mr.doob 已提交
1021

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

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

1026
			updateRenderTargetMipmap( renderTarget );
M
Mr.doob 已提交
1027

1028
		}
1029

M
Mr.doob 已提交
1030
	};
M
Mr.doob 已提交
1031

M
Mr.doob 已提交
1032
	this.initWebGLObjects = function( scene ) {
M
Mr.doob 已提交
1033

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

1036 1037 1038 1039 1040 1041
			if ( objmap[ id ] == undefined ) {

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

			}
M
Mr.doob 已提交
1042

1043
		};
M
Mr.doob 已提交
1044

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

M
Mr.doob 已提交
1047
		if ( !scene.__webGLObjects ) {
M
Mr.doob 已提交
1048

M
Mr.doob 已提交
1049
			scene.__webGLObjects = [];
M
Mr.doob 已提交
1050
			scene.__webGLObjectsMap = {};
M
Mr.doob 已提交
1051

M
Mr.doob 已提交
1052
		}
M
Mr.doob 已提交
1053

1054 1055 1056
		for ( o = 0, ol = scene.objects.length; o < ol; o++ ) {

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

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

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

1063
			}
1064

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

1067
			if ( object instanceof THREE.Mesh ) {
M
Mr.doob 已提交
1068

M
Mr.doob 已提交
1069
				// create separate VBOs per geometry chunk
M
Mr.doob 已提交
1070

1071
				for ( g in geometry.geometryChunks ) {
M
Mr.doob 已提交
1072

1073
					geometryChunk = geometry.geometryChunks[ g ];
M
Mr.doob 已提交
1074

M
Mr.doob 已提交
1075
					// initialise VBO on the first access
M
Mr.doob 已提交
1076

M
Mr.doob 已提交
1077
					if( ! geometryChunk.__webGLVertexBuffer ) {
M
Mr.doob 已提交
1078

1079 1080
						this.createMeshBuffers( geometryChunk );
						this.initMeshBuffers( geometryChunk, object );
M
Mr.doob 已提交
1081

1082 1083 1084 1085 1086 1087 1088 1089 1090 1091
						geometry.__dirtyVertices = true;
						geometry.__dirtyElements = true;
						geometry.__dirtyUvs = true;
						geometry.__dirtyNormals = true;
						geometry.__dirtyTangents = true;

					}

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

1092
						this.setMeshBuffers( geometryChunk, object, _gl.DYNAMIC_DRAW,
1093 1094
										 geometry.__dirtyVertices, geometry.__dirtyElements, geometry.__dirtyUvs,
										 geometry.__dirtyNormals, geometry.__dirtyTangents );
M
Mr.doob 已提交
1095

M
Mr.doob 已提交
1096 1097

					}
M
Mr.doob 已提交
1098

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

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

M
Mr.doob 已提交
1103
				}
1104

1105 1106 1107 1108 1109 1110
				geometry.__dirtyVertices = false;
				geometry.__dirtyElements = false;
				geometry.__dirtyUvs = false;
				geometry.__dirtyNormals = false;
				geometry.__dirtyTangents = false;

1111
			} else if ( object instanceof THREE.Line ) {
M
Mr.doob 已提交
1112 1113


1114
				if( ! geometry.__webGLVertexBuffer ) {
M
Mr.doob 已提交
1115

1116 1117
					this.createLineBuffers( geometry );
					this.initLineBuffers( geometry );
M
Mr.doob 已提交
1118

1119 1120
					geometry.__dirtyVertices = true;
					geometry.__dirtyElements = true;
M
Mr.doob 已提交
1121

1122
				}
M
Mr.doob 已提交
1123

1124
				if( geometry.__dirtyVertices ) {
M
Mr.doob 已提交
1125

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

1128
				}
M
Mr.doob 已提交
1129

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

1132 1133
				geometry.__dirtyVertices = false;
				geometry.__dirtyElements = false;
1134

1135
			} else if ( object instanceof THREE.ParticleSystem ) {
1136

1137
				if( ! geometry.__webGLVertexBuffer ) {
M
Mr.doob 已提交
1138

1139
					this.createParticleBuffers( geometry );
M
Mr.doob 已提交
1140

1141
				}
M
Mr.doob 已提交
1142

1143
				add_buffer( objmap, 0, geometry, object );
M
Mr.doob 已提交
1144 1145


1146
			}/*else if ( object instanceof THREE.Particle ) {
M
Mr.doob 已提交
1147 1148 1149

			}*/

M
Mr.doob 已提交
1150
		}
1151 1152 1153 1154 1155 1156

	};

	this.removeObject = function ( scene, object ) {

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

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

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

1162
			if ( object == zobject ) {
1163 1164 1165 1166

				scene.__webGLObjects.splice( o, 1 );

			}
M
Mr.doob 已提交
1167

1168
		}
M
Mr.doob 已提交
1169

M
Mr.doob 已提交
1170
	};
M
Mr.doob 已提交
1171

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

M
Mr.doob 已提交
1174
		object.autoUpdateMatrix && object.updateMatrix();
1175

M
Mr.doob 已提交
1176
		_modelViewMatrix.multiply( camera.matrix, object.matrix );
M
Mr.doob 已提交
1177
		_modelViewMatrixArray.set( _modelViewMatrix.flatten() );
1178

1179
		_normalMatrix = THREE.Matrix4.makeInvert3x3( _modelViewMatrix ).transpose();
M
Mr.doob 已提交
1180
		_normalMatrixArray.set( _normalMatrix.m );
1181

M
Mr.doob 已提交
1182
		_objectMatrixArray.set( object.matrix.flatten() );
M
Mr.doob 已提交
1183

M
Mr.doob 已提交
1184
	};
M
Mr.doob 已提交
1185

M
Mr.doob 已提交
1186
	this.loadMatrices = function ( program ) {
M
Mr.doob 已提交
1187

M
Mr.doob 已提交
1188 1189 1190 1191
		_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 已提交
1192
		_gl.uniformMatrix4fv( program.uniforms.objectMatrix, false, _objectMatrixArray );
M
Mr.doob 已提交
1193

M
Mr.doob 已提交
1194
	};
1195

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

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

M
Mr.doob 已提交
1200
	};
M
Mr.doob 已提交
1201

M
Mr.doob 已提交
1202
	this.setBlending = function( blending ) {
M
Mr.doob 已提交
1203

M
Mr.doob 已提交
1204
		switch ( blending ) {
1205

M
Mr.doob 已提交
1206
			case THREE.AdditiveBlending:
1207

M
Mr.doob 已提交
1208 1209
				_gl.blendEquation( _gl.FUNC_ADD );
				_gl.blendFunc( _gl.ONE, _gl.ONE );
M
Mr.doob 已提交
1210

M
Mr.doob 已提交
1211
				break;
1212

M
Mr.doob 已提交
1213
			case THREE.SubtractiveBlending:
1214

M
Mr.doob 已提交
1215 1216
				//_gl.blendEquation( _gl.FUNC_SUBTRACT );
				_gl.blendFunc( _gl.DST_COLOR, _gl.ZERO );
M
Mr.doob 已提交
1217

M
Mr.doob 已提交
1218
				break;
M
Mr.doob 已提交
1219

M
Mr.doob 已提交
1220
			default:
M
Mr.doob 已提交
1221

M
Mr.doob 已提交
1222 1223
				_gl.blendEquation( _gl.FUNC_ADD );
				_gl.blendFunc( _gl.ONE, _gl.ONE_MINUS_SRC_ALPHA );
M
Mr.doob 已提交
1224

M
Mr.doob 已提交
1225
				break;
N
Nicolas Garcia Belmonte 已提交
1226
		}
M
Mr.doob 已提交
1227

N
Nicolas Garcia Belmonte 已提交
1228
	};
M
Mr.doob 已提交
1229

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

1232
		if ( cullFace ) {
M
Mr.doob 已提交
1233

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

1236
				_gl.frontFace( _gl.CCW );
M
Mr.doob 已提交
1237

1238
			} else {
M
Mr.doob 已提交
1239

1240
				_gl.frontFace( _gl.CW );
M
Mr.doob 已提交
1241

1242
			}
M
Mr.doob 已提交
1243

1244
			if( cullFace == "back" ) {
M
Mr.doob 已提交
1245

1246
				_gl.cullFace( _gl.BACK );
M
Mr.doob 已提交
1247

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

1250
				_gl.cullFace( _gl.FRONT );
M
Mr.doob 已提交
1251

1252
			} else {
M
Mr.doob 已提交
1253

1254
				_gl.cullFace( _gl.FRONT_AND_BACK );
M
Mr.doob 已提交
1255

1256
			}
M
Mr.doob 已提交
1257

1258
			_gl.enable( _gl.CULL_FACE );
M
Mr.doob 已提交
1259

1260
		} else {
M
Mr.doob 已提交
1261

1262
			_gl.disable( _gl.CULL_FACE );
M
Mr.doob 已提交
1263

1264 1265 1266
		}

	};
N
Nicolas Garcia Belmonte 已提交
1267

1268
	this.supportsVertexTextures = function() {
1269

1270
		return maxVertexTextures() > 0;
1271

1272
	};
1273

1274
	function maxVertexTextures() {
1275

1276 1277 1278
		return _gl.getParameter( _gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS );

	};
1279

1280
	function initGL( antialias, clearColor, clearAlpha ) {
N
Nicolas Garcia Belmonte 已提交
1281 1282 1283

		try {

1284
			_gl = _canvas.getContext( 'experimental-webgl', { antialias: antialias } );
N
Nicolas Garcia Belmonte 已提交
1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300

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

1301 1302
		_gl.frontFace( _gl.CCW );
		_gl.cullFace( _gl.BACK );
1303
		_gl.enable( _gl.CULL_FACE );
M
Mr.doob 已提交
1304

N
Nicolas Garcia Belmonte 已提交
1305
		_gl.enable( _gl.BLEND );
1306
		_gl.blendFunc( _gl.ONE, _gl.ONE_MINUS_SRC_ALPHA );
1307
		_gl.clearColor( clearColor.r, clearColor.g, clearColor.b, clearAlpha );
N
Nicolas Garcia Belmonte 已提交
1308

1309
	};
M
Mr.doob 已提交
1310

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

M
Mr.doob 已提交
1313
		var program = _gl.createProgram(),
M
Mr.doob 已提交
1314

M
Mr.doob 已提交
1315 1316 1317 1318
		prefix_fragment = [
			"#ifdef GL_ES",
			"precision highp float;",
			"#endif",
M
Mr.doob 已提交
1319

1320 1321
			"#define MAX_DIR_LIGHTS " + parameters.maxDirLights,
			"#define MAX_POINT_LIGHTS " + parameters.maxPointLights,
A
alteredq 已提交
1322

1323 1324
			parameters.fog ? "#define USE_FOG" : "",
			parameters.fog instanceof THREE.FogExp2 ? "#define FOG_EXP2" : "",
1325

1326 1327
			parameters.map ? "#define USE_MAP" : "",
			parameters.env_map ? "#define USE_ENVMAP" : "",
1328

1329
			"uniform mat4 viewMatrix;",
1330
			"uniform vec3 cameraPosition;",
M
Mr.doob 已提交
1331 1332
			""
		].join("\n"),
1333

M
Mr.doob 已提交
1334
		prefix_vertex = [
1335
			maxVertexTextures() > 0 ? "#define VERTEX_TEXTURES" : "",
1336

1337 1338 1339
			"#define MAX_DIR_LIGHTS " + parameters.maxDirLights,
			"#define MAX_POINT_LIGHTS " + parameters.maxPointLights,

1340 1341 1342
			parameters.map ? "#define USE_MAP" : "",
			parameters.env_map ? "#define USE_ENVMAP" : "",

M
Mr.doob 已提交
1343 1344 1345
			"uniform mat4 objectMatrix;",
			"uniform mat4 modelViewMatrix;",
			"uniform mat4 projectionMatrix;",
1346 1347
			"uniform mat4 viewMatrix;",
			"uniform mat3 normalMatrix;",
M
Mr.doob 已提交
1348
			"uniform vec3 cameraPosition;",
M
Mr.doob 已提交
1349 1350 1351
			"attribute vec3 position;",
			"attribute vec3 normal;",
			"attribute vec2 uv;",
M
Mr.doob 已提交
1352 1353
			""
		].join("\n");
1354

M
Mr.doob 已提交
1355 1356
		_gl.attachShader( program, getShader( "fragment", prefix_fragment + fragment_shader ) );
		_gl.attachShader( program, getShader( "vertex", prefix_vertex + vertex_shader ) );
M
Mr.doob 已提交
1357

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

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

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

1365 1366
			//console.log( prefix_fragment + fragment_shader );
			//console.log( prefix_vertex + vertex_shader );
M
Mr.doob 已提交
1367

N
Nicolas Garcia Belmonte 已提交
1368
		}
M
Mr.doob 已提交
1369

M
Mr.doob 已提交
1370
		program.uniforms = {};
1371
		program.attributes = {};
M
Mr.doob 已提交
1372

M
Mr.doob 已提交
1373
		return program;
M
Mr.doob 已提交
1374

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

M
Mr.doob 已提交
1377
	function setUniforms( program, uniforms ) {
M
Mr.doob 已提交
1378

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

M
Mr.doob 已提交
1381
		for( u in uniforms ) {
M
Mr.doob 已提交
1382

1383 1384
			location = program.uniforms[u];
			if ( !location ) continue;
M
Mr.doob 已提交
1385

1386
			uniform = uniforms[u];
M
Mr.doob 已提交
1387

1388 1389
			type = uniform.type;
			value = uniform.value;
M
Mr.doob 已提交
1390

M
Mr.doob 已提交
1391
			if( type == "i" ) {
M
Mr.doob 已提交
1392

M
Mr.doob 已提交
1393
				_gl.uniform1i( location, value );
M
Mr.doob 已提交
1394

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

M
Mr.doob 已提交
1397
				_gl.uniform1f( location, value );
1398

A
alteredq 已提交
1399 1400 1401
			} else if( type == "fv1" ) {

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

1403 1404 1405 1406
			} else if( type == "fv" ) {

				_gl.uniform3fv( location, value );

1407 1408 1409 1410
			} else if( type == "v2" ) {

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

1411 1412 1413
			} else if( type == "v3" ) {

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

1415 1416 1417
			} else if( type == "c" ) {

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

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

M
Mr.doob 已提交
1421
				_gl.uniform1i( location, value );
M
Mr.doob 已提交
1422

1423
				texture = uniform.texture;
M
Mr.doob 已提交
1424

1425
				if ( !texture ) continue;
M
Mr.doob 已提交
1426

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

1429
					setCubeTexture( texture, value );
M
Mr.doob 已提交
1430

1431
				} else {
M
Mr.doob 已提交
1432

1433
					setTexture( texture, value );
M
Mr.doob 已提交
1434

1435
				}
M
Mr.doob 已提交
1436

1437
			}
M
Mr.doob 已提交
1438

1439
		}
M
Mr.doob 已提交
1440

1441
	};
M
Mr.doob 已提交
1442

1443
	function setCubeTexture( texture, slot ) {
M
Mr.doob 已提交
1444

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

1447 1448
			if ( !texture.image.__webGLTextureCube &&
				 !texture.image.__cubeMapInitialized && texture.image.loadCount == 6 ) {
M
Mr.doob 已提交
1449

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

1452
				_gl.bindTexture( _gl.TEXTURE_CUBE_MAP, texture.image.__webGLTextureCube );
1453

1454 1455
				_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 已提交
1456

1457 1458
				_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 已提交
1459

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

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

1464
				}
M
Mr.doob 已提交
1465

1466
				_gl.generateMipmap( _gl.TEXTURE_CUBE_MAP );
1467

1468
				_gl.bindTexture( _gl.TEXTURE_CUBE_MAP, null );
M
Mr.doob 已提交
1469

1470
				texture.image.__cubeMapInitialized = true;
M
Mr.doob 已提交
1471

M
Mr.doob 已提交
1472
			}
1473 1474 1475

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

1477
		}
M
Mr.doob 已提交
1478

M
Mr.doob 已提交
1479
	};
M
Mr.doob 已提交
1480

1481
	function setTexture( texture, slot ) {
M
Mr.doob 已提交
1482

1483 1484 1485 1486 1487
		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 已提交
1488

1489 1490
			_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 已提交
1491 1492 1493

			_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 ) );
1494 1495 1496 1497 1498 1499 1500
			_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 已提交
1501

1502
	};
M
Mr.doob 已提交
1503

A
alteredq 已提交
1504
	function setRenderTarget( renderTexture, clear ) {
1505 1506

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

1508 1509 1510 1511 1512
			renderTexture.__webGLFramebuffer = _gl.createFramebuffer();
			renderTexture.__webGLRenderbuffer = _gl.createRenderbuffer();
			renderTexture.__webGLTexture = _gl.createTexture();

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

1514 1515 1516 1517
			_gl.bindRenderbuffer( _gl.RENDERBUFFER, renderTexture.__webGLRenderbuffer );
			_gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_COMPONENT16, renderTexture.width, renderTexture.height );

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

1519 1520 1521 1522 1523
			_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 ) );
1524
			_gl.texImage2D( _gl.TEXTURE_2D, 0, paramThreeToGL( renderTexture.format ), renderTexture.width, renderTexture.height, 0, paramThreeToGL( renderTexture.format ), paramThreeToGL( renderTexture.type ), null );
1525 1526

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

1528 1529
			_gl.bindFramebuffer( _gl.FRAMEBUFFER, renderTexture.__webGLFramebuffer );
			_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D, renderTexture.__webGLTexture, 0 );
1530
			_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.RENDERBUFFER, renderTexture.__webGLRenderbuffer );
1531 1532

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

1534 1535 1536
			_gl.bindTexture( _gl.TEXTURE_2D, null );
			_gl.bindRenderbuffer( _gl.RENDERBUFFER, null );
			_gl.bindFramebuffer( _gl.FRAMEBUFFER, null);
M
Mr.doob 已提交
1537

1538 1539
		}

1540
		var framebuffer, width, height;
M
Mr.doob 已提交
1541

1542
		if ( renderTexture ) {
M
Mr.doob 已提交
1543

1544 1545 1546
			framebuffer = renderTexture.__webGLFramebuffer;
			width = renderTexture.width;
			height = renderTexture.height;
M
Mr.doob 已提交
1547

1548
		} else {
M
Mr.doob 已提交
1549

1550 1551 1552
			framebuffer = null;
			width = _canvas.width;
			height = _canvas.height;
M
Mr.doob 已提交
1553

1554
		}
M
Mr.doob 已提交
1555

1556
		if( framebuffer != _oldFramebuffer ) {
M
Mr.doob 已提交
1557

1558 1559
			_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );
			_gl.viewport( 0, 0, width, height );
M
Mr.doob 已提交
1560

A
alteredq 已提交
1561
			if ( clear ) {
M
Mr.doob 已提交
1562

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

A
alteredq 已提交
1565
			}
M
Mr.doob 已提交
1566

1567
			_oldFramebuffer = framebuffer;
M
Mr.doob 已提交
1568

1569
		}
1570

1571
	};
M
Mr.doob 已提交
1572

1573
	function updateRenderTargetMipmap( renderTarget ) {
M
Mr.doob 已提交
1574

1575 1576 1577
		_gl.bindTexture( _gl.TEXTURE_2D, renderTarget.__webGLTexture );
		_gl.generateMipmap( _gl.TEXTURE_2D );
		_gl.bindTexture( _gl.TEXTURE_2D, null );
M
Mr.doob 已提交
1578 1579

	};
1580

M
Mr.doob 已提交
1581
	function cacheUniformLocations( program, identifiers ) {
M
Mr.doob 已提交
1582

M
Mr.doob 已提交
1583
		var i, l, id;
M
Mr.doob 已提交
1584

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

1587 1588
			id = identifiers[ i ];
			program.uniforms[ id ] = _gl.getUniformLocation( program, id );
M
Mr.doob 已提交
1589

M
Mr.doob 已提交
1590
		}
M
Mr.doob 已提交
1591

M
Mr.doob 已提交
1592
	};
M
Mr.doob 已提交
1593

1594
	function cacheAttributeLocations( program, identifiers ) {
1595

1596
		var i, l, id;
M
Mr.doob 已提交
1597

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

1600 1601
			id = identifiers[ i ];
			program.attributes[ id ] = _gl.getAttribLocation( program, id );
M
Mr.doob 已提交
1602

1603
		}
M
Mr.doob 已提交
1604

M
Mr.doob 已提交
1605
	};
M
Mr.doob 已提交
1606

N
Nicolas Garcia Belmonte 已提交
1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631
	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 已提交
1632

1633
	};
N
Nicolas Garcia Belmonte 已提交
1634

1635
	function paramThreeToGL( p ) {
M
Mr.doob 已提交
1636

1637
		switch ( p ) {
M
Mr.doob 已提交
1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650

			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;

1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664
			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;

1665
		}
M
Mr.doob 已提交
1666

1667
		return 0;
M
Mr.doob 已提交
1668

1669 1670 1671 1672 1673 1674
	};

	function materialNeedsSmoothNormals( material ) {

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

1675
	};
M
Mr.doob 已提交
1676

M
Mr.doob 已提交
1677
	function bufferNeedsSmoothNormals( geometryChunk, object ) {
M
Mr.doob 已提交
1678

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

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

M
Mr.doob 已提交
1683
			meshMaterial = object.materials[ m ];
1684 1685 1686

			if ( meshMaterial instanceof THREE.MeshFaceMaterial ) {

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

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

1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711
						needsSmoothNormals = true;
						break;

					}

				}

			} else {

				if ( materialNeedsSmoothNormals( meshMaterial ) ) {

					needsSmoothNormals = true;
					break;

				}

			}

			if ( needsSmoothNormals ) break;

		}
M
Mr.doob 已提交
1712

1713
		return needsSmoothNormals;
M
Mr.doob 已提交
1714

1715
	};
M
Mr.doob 已提交
1716

1717
	function allocateLights( lights, maxLights ) {
1718

1719 1720
		var l, ll, light, dirLights, pointLights, maxDirLights, maxPointLights;
		dirLights = pointLights = maxDirLights = maxPointLights = 0;
1721

1722
		for ( l = 0, ll = lights.length; l < ll; l++ ) {
1723

1724
			light = lights[ l ];
1725

1726 1727
			if ( light instanceof THREE.DirectionalLight ) dirLights++;
			if ( light instanceof THREE.PointLight ) pointLights++;
1728

1729
		}
1730

1731
		if ( ( pointLights + dirLights ) <= maxLights ) {
1732

1733 1734
			maxDirLights = dirLights;
			maxPointLights = pointLights;
1735

1736
		} else {
1737

1738 1739
			maxDirLights = Math.ceil( maxLights * dirLights / ( pointLights + dirLights ) );
			maxPointLights = maxLights - maxDirLights;
1740 1741 1742

		}

1743
		return { 'directional' : maxDirLights, 'point' : maxPointLights };
1744 1745

	};
M
Mr.doob 已提交
1746

A
alteredq 已提交
1747
	/* DEBUG
1748
	function getGLParams() {
M
Mr.doob 已提交
1749

1750
		var params  = {
M
Mr.doob 已提交
1751

1752 1753
			'MAX_VARYING_VECTORS': _gl.getParameter( _gl.MAX_VARYING_VECTORS ),
			'MAX_VERTEX_ATTRIBS': _gl.getParameter( _gl.MAX_VERTEX_ATTRIBS ),
M
Mr.doob 已提交
1754

1755 1756 1757
			'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 已提交
1758

1759 1760 1761
			'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 已提交
1762

1763 1764
		return params;
	};
M
Mr.doob 已提交
1765

1766
	function dumpObject( obj ) {
M
Mr.doob 已提交
1767

1768 1769
		var p, str = "";
		for ( p in obj ) {
M
Mr.doob 已提交
1770

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

1773
		}
M
Mr.doob 已提交
1774

1775 1776
		return str;
	}
A
alteredq 已提交
1777
	*/
1778

1779
};
1780

1781
THREE.Snippets = {
M
Mr.doob 已提交
1782

1783
	fog_pars_fragment: [
M
Mr.doob 已提交
1784

1785
	"#ifdef USE_FOG",
1786

1787
		"uniform vec3 fogColor;",
1788

1789 1790 1791 1792 1793 1794
		"#ifdef FOG_EXP2",
			"uniform float fogDensity;",
		"#else",
			"uniform float fogNear;",
			"uniform float fogFar;",
		"#endif",
1795

1796
	"#endif"
1797

1798
	].join("\n"),
M
Mr.doob 已提交
1799

1800
	fog_fragment: [
1801

1802
	"#ifdef USE_FOG",
1803

1804 1805 1806 1807 1808 1809 1810 1811 1812
		"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",
1813

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

1816
	"#endif"
M
Mr.doob 已提交
1817

1818
	].join("\n"),
M
Mr.doob 已提交
1819

1820
	envmap_pars_fragment: [
M
Mr.doob 已提交
1821

1822
	"#ifdef USE_ENVMAP",
M
Mr.doob 已提交
1823

1824 1825 1826 1827
		"varying vec3 vReflect;",
		"uniform float reflectivity;",
		"uniform samplerCube env_map;",
		"uniform int combine;",
M
Mr.doob 已提交
1828

1829
	"#endif"
M
Mr.doob 已提交
1830

1831
	].join("\n"),
M
Mr.doob 已提交
1832

1833
	envmap_fragment: [
M
Mr.doob 已提交
1834

1835 1836 1837
	"#ifdef USE_ENVMAP",

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

1839 1840 1841 1842 1843 1844 1845 1846
		"if ( combine == 1 ) {",

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

		"} else {",

			"gl_FragColor = gl_FragColor * cubeColor;",

M
Mr.doob 已提交
1847
		"}",
1848 1849

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

1851
	].join("\n"),
M
Mr.doob 已提交
1852

1853
	envmap_pars_vertex: [
M
Mr.doob 已提交
1854

1855
	"#ifdef USE_ENVMAP",
M
Mr.doob 已提交
1856

1857 1858 1859
		"varying vec3 vReflect;",
		"uniform float refraction_ratio;",
		"uniform bool useRefract;",
M
Mr.doob 已提交
1860

1861
	"#endif"
M
Mr.doob 已提交
1862

1863 1864 1865
	].join("\n"),

	envmap_vertex : [
M
Mr.doob 已提交
1866

1867
	"#ifdef USE_ENVMAP",
M
Mr.doob 已提交
1868

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

1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882
		"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 已提交
1883

1884
	].join("\n"),
M
Mr.doob 已提交
1885

1886
	map_pars_fragment: [
M
Mr.doob 已提交
1887

1888
	"#ifdef USE_MAP",
M
Mr.doob 已提交
1889

1890 1891
		"varying vec2 vUv;",
		"uniform sampler2D map;",
M
Mr.doob 已提交
1892

1893
	"#endif"
M
Mr.doob 已提交
1894

1895
	].join("\n"),
M
Mr.doob 已提交
1896

1897
	map_pars_vertex: [
M
Mr.doob 已提交
1898

1899
	"#ifdef USE_MAP",
M
Mr.doob 已提交
1900

1901 1902 1903
		"varying vec2 vUv;",

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

1905
	].join("\n"),
M
Mr.doob 已提交
1906

1907 1908 1909 1910 1911 1912 1913
	map_fragment: [

	"#ifdef USE_MAP",

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

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

1915
	].join("\n"),
M
Mr.doob 已提交
1916

1917
	map_vertex: [
M
Mr.doob 已提交
1918

1919
	"#ifdef USE_MAP",
M
Mr.doob 已提交
1920

1921
		"vUv = uv;",
M
Mr.doob 已提交
1922

1923
	"#endif"
M
Mr.doob 已提交
1924

1925
	].join("\n"),
M
Mr.doob 已提交
1926

1927
	lights_pars_vertex: [
M
Mr.doob 已提交
1928

1929 1930
	"uniform bool enableLighting;",
	"uniform vec3 ambientLightColor;",
M
Mr.doob 已提交
1931

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

1934 1935
		"uniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];",
		"uniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];",
M
Mr.doob 已提交
1936

1937 1938 1939
	"#endif",

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

1941 1942
		"uniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];",
		"uniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];",
M
Mr.doob 已提交
1943

1944 1945 1946
		"#ifdef PHONG",
			"varying vec3 vPointLightVector[ MAX_POINT_LIGHTS ];",
		"#endif",
M
Mr.doob 已提交
1947

1948
	"#endif"
M
Mr.doob 已提交
1949

1950
	].join("\n"),
M
Mr.doob 已提交
1951

1952
	lights_vertex: [
M
Mr.doob 已提交
1953

1954 1955
	"if ( !enableLighting ) {",

A
alteredq 已提交
1956
		"vLightWeighting = vec3( 1.0 );",
1957 1958 1959 1960 1961 1962

	"} else {",

		"vLightWeighting = ambientLightColor;",

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

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

1966 1967 1968
			"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 已提交
1969

1970
		"}",
M
Mr.doob 已提交
1971

1972 1973 1974
		"#endif",

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

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

1978 1979 1980 1981
			"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 已提交
1982

1983 1984 1985
			"#ifdef PHONG",
				"vPointLightVector[ i ] = pointLightVector;",
			"#endif",
M
Mr.doob 已提交
1986

1987
		"}",
M
Mr.doob 已提交
1988

1989
		"#endif",
M
Mr.doob 已提交
1990

1991
	"}"
M
Mr.doob 已提交
1992

1993
	].join("\n"),
M
Mr.doob 已提交
1994

1995
	lights_pars_fragment: [
M
Mr.doob 已提交
1996

1997 1998 1999
	"#if MAX_DIR_LIGHTS > 0",
		"uniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];",
	"#endif",
M
Mr.doob 已提交
2000

2001 2002 2003
	"#if MAX_POINT_LIGHTS > 0",
		"varying vec3 vPointLightVector[ MAX_POINT_LIGHTS ];",
	"#endif",
M
Mr.doob 已提交
2004

2005 2006
	"varying vec3 vViewPosition;",
	"varying vec3 vNormal;"
M
Mr.doob 已提交
2007

2008
	].join("\n"),
M
Mr.doob 已提交
2009

2010
	lights_fragment: [
M
Mr.doob 已提交
2011

2012 2013
	"vec3 normal = normalize( vNormal );",
	"vec3 viewPosition = normalize( vViewPosition );",
M
Mr.doob 已提交
2014

2015 2016 2017
	"vec4 mSpecular = vec4( specular, opacity );",

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

2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039
		"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 已提交
2040

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

2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064
		"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 已提交
2065

2066 2067 2068 2069 2070 2071 2072
	"#endif",

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

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

2074 2075 2076
	"#if MAX_POINT_LIGHTS > 0",
		"totalLight += pointDiffuse + pointSpecular;",
	"#endif"
2077

2078
	].join("\n")
2079

2080
};
2081

2082
THREE.UniformsLib = {
M
Mr.doob 已提交
2083

2084
	common: {
M
Mr.doob 已提交
2085

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

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

2096 2097 2098 2099
	"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 已提交
2100

2101
	},
M
Mr.doob 已提交
2102

2103
	lights: {
M
Mr.doob 已提交
2104

2105 2106 2107 2108 2109 2110
	"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 已提交
2111

2112
	}
M
Mr.doob 已提交
2113

2114 2115
};

2116
THREE.ShaderLib = {
2117

2118
	'depth': {
M
Mr.doob 已提交
2119

2120 2121
		uniforms: { "mNear": { type: "f", value: 1.0 },
					"mFar" : { type: "f", value: 2000.0 } },
2122

2123
		fragment_shader: [
M
Mr.doob 已提交
2124

2125 2126
			"uniform float mNear;",
			"uniform float mFar;",
M
Mr.doob 已提交
2127

2128
			"void main() {",
M
Mr.doob 已提交
2129

2130 2131 2132
				"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 已提交
2133

2134
			"}"
M
Mr.doob 已提交
2135

2136
		].join("\n"),
2137

2138
		vertex_shader: [
2139

2140
			"void main() {",
2141

2142
				"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",
2143

2144
			"}"
2145

2146
		].join("\n")
2147

2148
	},
2149

2150
	'normal': {
M
Mr.doob 已提交
2151

2152
		uniforms: { },
2153

2154
		fragment_shader: [
2155

2156
			"varying vec3 vNormal;",
M
Mr.doob 已提交
2157

2158
			"void main() {",
2159

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

2162
			"}"
M
Mr.doob 已提交
2163

2164
		].join("\n"),
M
Mr.doob 已提交
2165

2166
		vertex_shader: [
2167

2168
			"varying vec3 vNormal;",
2169

2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181
			"void main() {",

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

				"gl_Position = projectionMatrix * mvPosition;",

			"}"

		].join("\n")

	},
2182

2183
	'basic': {
M
Mr.doob 已提交
2184

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

2187
		fragment_shader: [
2188

2189 2190
			"uniform vec3 color;",
			"uniform float opacity;",
M
Mr.doob 已提交
2191

2192 2193 2194
			THREE.Snippets[ "map_pars_fragment" ],
			THREE.Snippets[ "envmap_pars_fragment" ],
			THREE.Snippets[ "fog_pars_fragment" ],
M
Mr.doob 已提交
2195

2196
			"void main() {",
2197

2198
				"vec4 mColor = vec4( color, opacity );",
A
alteredq 已提交
2199 2200
				"vec4 mapColor = vec4( 1.0 );",
				"vec4 cubeColor = vec4( 1.0 );",
2201

2202
				THREE.Snippets[ "map_fragment" ],
M
Mr.doob 已提交
2203

2204
				"gl_FragColor = mColor * mapColor;",
M
Mr.doob 已提交
2205

2206 2207
				THREE.Snippets[ "envmap_fragment" ],
				THREE.Snippets[ "fog_fragment" ],
M
Mr.doob 已提交
2208

2209
			"}"
2210

2211
		].join("\n"),
M
Mr.doob 已提交
2212

2213
		vertex_shader: [
M
Mr.doob 已提交
2214

2215 2216
			THREE.Snippets[ "map_pars_vertex" ],
			THREE.Snippets[ "envmap_pars_vertex" ],
M
Mr.doob 已提交
2217

2218
			"void main() {",
M
Mr.doob 已提交
2219

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

2222 2223
				THREE.Snippets[ "map_vertex" ],
				THREE.Snippets[ "envmap_vertex" ],
M
Mr.doob 已提交
2224

2225
				"gl_Position = projectionMatrix * mvPosition;",
2226

2227
			"}"
2228

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

2231
	},
2232

2233
	'lambert': {
M
Mr.doob 已提交
2234 2235

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

2238
		fragment_shader: [
M
Mr.doob 已提交
2239

2240 2241
			"uniform vec3 color;",
			"uniform float opacity;",
M
Mr.doob 已提交
2242

2243
			"varying vec3 vLightWeighting;",
M
Mr.doob 已提交
2244

2245 2246 2247
			THREE.Snippets[ "map_pars_fragment" ],
			THREE.Snippets[ "envmap_pars_fragment" ],
			THREE.Snippets[ "fog_pars_fragment" ],
M
Mr.doob 已提交
2248

2249
			"void main() {",
M
Mr.doob 已提交
2250

2251
				"vec4 mColor = vec4( color, opacity );",
A
alteredq 已提交
2252 2253
				"vec4 mapColor = vec4( 1.0 );",
				"vec4 cubeColor = vec4( 1.0 );",
2254 2255

				THREE.Snippets[ "map_fragment" ],
2256

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

2259
				THREE.Snippets[ "envmap_fragment" ],
2260 2261 2262 2263 2264 2265 2266
				THREE.Snippets[ "fog_fragment" ],

			"}"

		].join("\n"),

		vertex_shader: [
M
Mr.doob 已提交
2267

2268
			"varying vec3 vLightWeighting;",
M
Mr.doob 已提交
2269

2270 2271 2272
			THREE.Snippets[ "map_pars_vertex" ],
			THREE.Snippets[ "envmap_pars_vertex" ],
			THREE.Snippets[ "lights_pars_vertex" ],
M
Mr.doob 已提交
2273

2274
			"void main() {",
M
Mr.doob 已提交
2275

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

2278 2279
				THREE.Snippets[ "map_vertex" ],
				THREE.Snippets[ "envmap_vertex" ],
M
Mr.doob 已提交
2280

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

2283
				THREE.Snippets[ "lights_vertex" ],
M
Mr.doob 已提交
2284

2285 2286 2287 2288 2289
				"gl_Position = projectionMatrix * mvPosition;",

			"}"

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

2291
	},
M
Mr.doob 已提交
2292

2293
	'phong': {
M
Mr.doob 已提交
2294 2295

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

2298
									{ "ambient"  : { type: "c", value: new THREE.Color( 0x050505 ) },
2299 2300 2301
									  "specular" : { type: "c", value: new THREE.Color( 0x111111 ) },
									  "shininess": { type: "f", value: 30 }
									}
M
Mr.doob 已提交
2302

2303
								] ),
M
Mr.doob 已提交
2304

2305
		fragment_shader: [
M
Mr.doob 已提交
2306

2307 2308
			"uniform vec3 color;",
			"uniform float opacity;",
M
Mr.doob 已提交
2309

2310 2311 2312
			"uniform vec3 ambient;",
			"uniform vec3 specular;",
			"uniform float shininess;",
M
Mr.doob 已提交
2313

2314
			"varying vec3 vLightWeighting;",
M
Mr.doob 已提交
2315

2316 2317 2318 2319
			THREE.Snippets[ "map_pars_fragment" ],
			THREE.Snippets[ "envmap_pars_fragment" ],
			THREE.Snippets[ "fog_pars_fragment" ],
			THREE.Snippets[ "lights_pars_fragment" ],
M
Mr.doob 已提交
2320

2321
			"void main() {",
M
Mr.doob 已提交
2322

2323 2324 2325 2326 2327 2328 2329 2330
				"vec4 mColor = vec4( color, opacity );",
				"vec4 mapColor = vec4( 1.0 );",
				"vec4 cubeColor = vec4( 1.0 );",

				THREE.Snippets[ "map_fragment" ],
				THREE.Snippets[ "lights_fragment" ],

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

2332 2333 2334 2335 2336 2337 2338 2339
				THREE.Snippets[ "envmap_fragment" ],
				THREE.Snippets[ "fog_fragment" ],

			"}"

		].join("\n"),

		vertex_shader: [
M
Mr.doob 已提交
2340

2341
			"#define PHONG",
M
Mr.doob 已提交
2342

2343 2344 2345
			"varying vec3 vLightWeighting;",
			"varying vec3 vViewPosition;",
			"varying vec3 vNormal;",
M
Mr.doob 已提交
2346

2347 2348 2349
			THREE.Snippets[ "map_pars_vertex" ],
			THREE.Snippets[ "envmap_pars_vertex" ],
			THREE.Snippets[ "lights_pars_vertex" ],
M
Mr.doob 已提交
2350

2351
			"void main() {",
M
Mr.doob 已提交
2352

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

2355 2356
				THREE.Snippets[ "map_vertex" ],
				THREE.Snippets[ "envmap_vertex" ],
M
Mr.doob 已提交
2357

2358 2359 2360
				"#ifndef USE_ENVMAP",
					"vec4 mPosition = objectMatrix * vec4( position, 1.0 );",
				"#endif",
M
Mr.doob 已提交
2361

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

2364 2365
				"vec3 transformedNormal = normalize( normalMatrix * normal );",
				"vNormal = transformedNormal;",
2366

2367
				THREE.Snippets[ "lights_vertex" ],
M
Mr.doob 已提交
2368

2369
				"gl_Position = projectionMatrix * mvPosition;",
2370 2371 2372 2373

			"}"

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

	}
A
alteredq 已提交
2376

N
Nicolas Garcia Belmonte 已提交
2377
};