WebGLRenderer.js 72.7 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 35 36
	_projScreenMatrix = new THREE.Matrix4(),
	_vector3 = new THREE.Vector4(),
	
37
	// parameters defaults
M
Mr.doob 已提交
38

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

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

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

49
	}
M
Mr.doob 已提交
50

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

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

56 57
	this.context = _gl;

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

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

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

66
	};
M
Mr.doob 已提交
67

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

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

	};

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

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

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

	this.setClearColor = function( color, alpha ) {

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

	};
88

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

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

	};

M
Mr.doob 已提交
95

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

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

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

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

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

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

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

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

			if ( light instanceof THREE.AmbientLight ) {

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

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

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

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

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

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

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

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

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

156 157 158
			}

		}
159 160 161 162 163 164
		
		// null eventual remains from removed lights
		// (this is to avoid if in shader)
		
		for( l = dlength * 3; l < dcolors.length; l++ ) dcolors[ l ] = 0.0;
		for( l = plength * 3; l < pcolors.length; l++ ) pcolors[ l ] = 0.0;
M
Mr.doob 已提交
165

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

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

173
	};
M
Mr.doob 已提交
174

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

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

181
	};
M
Mr.doob 已提交
182

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

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

189
	};
190 191

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

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

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

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

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

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

215
	};
M
Mr.doob 已提交
216

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

		var nvertices = geometry.vertices.length;

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

		geometry.__webGLParticleCount = nvertices;

	};

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

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

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

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

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

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

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

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

254
			}
M
Mr.doob 已提交
255

256
		}
M
Mr.doob 已提交
257

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

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

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

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

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

275
	};
M
Mr.doob 已提交
276

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

279 280 281 282
		var f, fl, fi, face, vertexNormals, faceNormal, normal, 
			uv, uv2, v1, v2, v3, v4, t1, t2, t3, t4, 
			c1, c2, c3, c4,
			m, ml, i,
283
			vn, uvi, uv2i,
M
Mr.doob 已提交
284

285
		vertexIndex = 0,
286

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

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

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

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

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

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

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

			if ( face instanceof THREE.Face3 ) {

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

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

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

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

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

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

356
				}
357

358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379
				if ( dirtyColors && obj_colors.length ) {
					
					c1 = obj_colors[ face.a ];
					c2 = obj_colors[ face.b ];
					c3 = obj_colors[ face.c ];

					colorArray[ offset_color ]     = c1.r;
					colorArray[ offset_color + 1 ] = c1.g;
					colorArray[ offset_color + 2 ] = c1.b;

					colorArray[ offset_color + 3 ] = c2.r;
					colorArray[ offset_color + 4 ] = c2.g;
					colorArray[ offset_color + 5 ] = c2.b;

					colorArray[ offset_color + 6 ] = c3.r;
					colorArray[ offset_color + 7 ] = c3.g;
					colorArray[ offset_color + 8 ] = c3.b;
					
					offset_color += 9;

				}

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

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

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

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

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

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

403 404
				}

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

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

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

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

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

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

419
						}
M
Mr.doob 已提交
420

421
					} else {
422

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

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

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

431
						}
M
Mr.doob 已提交
432 433

					}
M
Mr.doob 已提交
434

435 436
				}

437
				if ( dirtyUvs && uv ) {
438

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

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

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

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

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

				}

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

					}

				}

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

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

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

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

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

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

484
					offset_line += 6;
485

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

488
				}
M
Mr.doob 已提交
489

490 491 492

			} else if ( face instanceof THREE.Face4 ) {

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

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

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

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

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

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

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

518
				}
519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537
				
				if ( dirtyColors && obj_colors.length ) {

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

					colorArray[ offset_color ]     = c1.r;
					colorArray[ offset_color + 1 ] = c1.g;
					colorArray[ offset_color + 2 ] = c1.b;

					colorArray[ offset_color + 3 ] = c2.r;
					colorArray[ offset_color + 4 ] = c2.g;
					colorArray[ offset_color + 5 ] = c2.b;

					colorArray[ offset_color + 6 ] = c3.r;
					colorArray[ offset_color + 7 ] = c3.g;
					colorArray[ offset_color + 8 ] = c3.b;
538

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

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

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

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

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

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

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

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

576
				}
M
Mr.doob 已提交
577

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

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

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

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

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

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

592
						}
M
Mr.doob 已提交
593

594
					} else {
595

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

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

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

604
						}
M
Mr.doob 已提交
605 606

					}
M
Mr.doob 已提交
607

608 609
				}

610
				if ( dirtyUvs && uv ) {
611

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

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

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

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

M
Mr.doob 已提交
621
					}
622 623

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

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

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

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

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

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

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

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

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

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

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

668
				}
M
Mr.doob 已提交
669

670
			}
M
Mr.doob 已提交
671

672 673
		}

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

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

679
		}
M
Mr.doob 已提交
680

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

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

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

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

693 694
		}

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

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

700
		}
701

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

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

707
		}
M
Mr.doob 已提交
708

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

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

		}

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

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

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

724
		}
725 726

	};
727

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

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

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

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

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

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

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

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

756 757
			}

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

761
		}
M
Mr.doob 已提交
762

763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781
		if ( dirtyColors ) {

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

				color = colors[ c ];

				offset = c * 3;

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

			}

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

		}

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

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

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

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

791
			}
M
Mr.doob 已提交
792

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

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

798
	};
M
Mr.doob 已提交
799

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

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

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

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

				vertex = vertices[ v ].position;
827 828 829 830 831 832 833 834 835 836 837 838 839 840
				
				_vector3.copy( vertex );
				_projScreenMatrix.multiplyVector3( _vector3 );
				
				sortArray[ v ] = [ _vector3.z, v ];
				
			}
			
			sortArray.sort( function(a,b) { return b[0] - a[0]; } );
			
			for ( v = 0; v < vl; v++ ) {
				
				vertex = vertices[ sortArray[v][1] ].position;
				
841
				offset = v * 3;
842
				
843 844 845
				vertexArray[ offset ]     = vertex.x;
				vertexArray[ offset + 1 ] = vertex.y;
				vertexArray[ offset + 2 ] = vertex.z;
846
				
847 848
			}
			
A
alteredq 已提交
849 850 851 852 853 854 855 856 857 858
			for ( c = 0; c < cl; c++ ) {
				
				offset = c * 3;
				
				color = colors[ sortArray[c][1] ];

				colorArray[ offset ]     = color.r;
				colorArray[ offset + 1 ] = color.g;
				colorArray[ offset + 2 ] = color.b;
				
859
			}
A
alteredq 已提交
860 861
			
			
862 863 864 865 866 867 868 869 870 871 872 873 874 875 876
		} else {
		
			if ( dirtyVertices ) {

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

					vertex = vertices[ v ].position;

					offset = v * 3;

					vertexArray[ offset ]     = vertex.x;
					vertexArray[ offset + 1 ] = vertex.y;
					vertexArray[ offset + 2 ] = vertex.z;

				}
877 878

			}
A
alteredq 已提交
879 880 881 882 883 884 885 886 887 888 889 890 891
			
			if ( dirtyColors ) {
				
				for ( c = 0; c < cl; c++ ) {

					color = colors[ c ];

					offset = c * 3;

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

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

		}
897
		
A
alteredq 已提交
898
		
899 900 901
		// 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)
902
		
903 904 905 906 907 908 909
		if ( dirtyElements ) {

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

				particleArray[ v ] = v;

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

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

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

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

M
Mr.doob 已提交
938
	};
939

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

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

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

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

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

959 960 961
		if ( fog ) {

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

963
			if ( fog instanceof THREE.Fog ) {
964

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

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

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

972 973 974
			}

		}
975

976
	};
977 978

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

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

1002 1003
	function refreshUniformsParticle( material, fog ) {

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

			}

		}

	};

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

A
alteredq 已提交
1091 1092
			parameters = { fog: fog, map: material.map, env_map: material.env_map, light_map: material.light_map, vertex_colors: material.vertex_colors,
						   maxDirLights: maxLightCount.directional, maxPointLights: maxLightCount.point };
1093
			material.program = buildProgram( material.fragment_shader, material.vertex_shader, parameters );
M
Mr.doob 已提交
1094

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

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

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

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

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

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

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

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

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

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

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

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

		}

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

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

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

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

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

		if ( material instanceof THREE.ParticleBasicMaterial ) {

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

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

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

1157
		}
M
Mr.doob 已提交
1158

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

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

		if ( material instanceof THREE.MeshNormalMaterial ) {

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

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

		var program, attributes, linewidth, primitives;

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

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

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

A
alteredq 已提交
1193 1194 1195 1196 1197 1198 1199 1200 1201 1202
		// colors

		if ( attributes.color >= 0 ) {

			_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryChunk.__webGLColorBuffer );
			_gl.vertexAttribPointer( attributes.color, 3, _gl.FLOAT, false, 0, 0 );
			_gl.enableVertexAttribArray( attributes.color );

		}

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

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

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

1211
		}
1212

1213 1214 1215
		// tangents

		if ( attributes.tangent >= 0 ) {
1216

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

1221
		}
1222

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

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

1227
			if ( geometryChunk.__webGLUVBuffer ) {
1228

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

1232
				_gl.enableVertexAttribArray( attributes.uv );
1233

1234
			} else {
1235

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

1238
			}
1239 1240 1241

		}

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

			}

		}

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

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

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

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

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

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

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

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

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

	};

A
alteredq 已提交
1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318
	function renderBufferImmediate( object, program ) {
		
		if ( ! object.__webGLVertexBuffer ) object.__webGLVertexBuffer = _gl.createBuffer();
		if ( ! object.__webGLNormalBuffer ) object.__webGLNormalBuffer = _gl.createBuffer();
		
		if ( object.hasPos ) {
			
		  _gl.bindBuffer( _gl.ARRAY_BUFFER, object.__webGLVertexBuffer );
		  _gl.bufferData( _gl.ARRAY_BUFFER, object.positionArray, _gl.DYNAMIC_DRAW );
		  _gl.enableVertexAttribArray( program.attributes.position );
		  _gl.vertexAttribPointer( program.attributes.position, 3, _gl.FLOAT, false, 0, 0 );
		
		}
		
		if ( object.hasNormal ) {
			
		  _gl.bindBuffer( _gl.ARRAY_BUFFER, object.__webGLNormalBuffer );
		  _gl.bufferData( _gl.ARRAY_BUFFER, object.normalArray, _gl.DYNAMIC_DRAW );
		  _gl.enableVertexAttribArray( program.attributes.normal );
		  _gl.vertexAttribPointer( program.attributes.normal, 3, _gl.FLOAT, false, 0, 0 );
		
		}
		
		_gl.drawArrays( _gl.TRIANGLES, 0, object.count );
		
		object.count = 0;
		
	};
	
A
alteredq 已提交
1319
	this.renderPass = function ( camera, lights, fog, object, geometryChunk, blending, transparent ) {
M
Mr.doob 已提交
1320

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

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

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

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

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

					material = geometryChunk.materials[ i ];
1332

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

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

1340 1341
					}

M
Mr.doob 已提交
1342
				}
1343

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

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

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

1354 1355 1356
				}

			}
1357 1358

		}
M
Mr.doob 已提交
1359

1360
	};
M
Mr.doob 已提交
1361

A
alteredq 已提交
1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372
	this.renderPassImmediate = function ( camera, lights, fog, object, blending, transparent ) {

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

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

			material = object.materials[ m ];

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

				this.setBlending( material.blending );
1373 1374
				this.setDepthTest( material.depth_test );
				
A
alteredq 已提交
1375 1376 1377 1378 1379 1380 1381 1382 1383 1384
				program = this.setProgram( camera, lights, fog, material, object );
				
				object.render( function( object ) { renderBufferImmediate( object, program ); } );

			}

		}

	};
	
1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409
	function setObjectFaces( object ) {
		
		if( object.doubleSided ) {

			_gl.disable( _gl.CULL_FACE );

		} else {

			_gl.enable( _gl.CULL_FACE );

			if( object.flipSided ) {

				_gl.frontFace( _gl.CW );

			}
			else {

				_gl.frontFace( _gl.CCW );

			}

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

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

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

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

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

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

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

1430 1431
		}

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

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

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

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

1466 1467 1468
		// opaque pass

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

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

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

			if ( object.visible ) {
1476 1477
				
				setObjectFaces( object );
A
alteredq 已提交
1478
				
1479 1480 1481 1482 1483 1484 1485
				this.setupMatrices( object, camera );
				this.renderPass( camera, lights, fog, object, buffer, THREE.NormalBlending, false );

			}

		}

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

1504 1505
		// transparent pass

1506
		for ( o = 0; o < ol; o++ ) {
1507 1508 1509 1510 1511 1512 1513 1514

			webGLObject = scene.__webGLObjects[ o ];

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

			if ( object.visible ) {

1515 1516
				setObjectFaces( object );
				
1517
				this.setupMatrices( object, camera );
1518
				
1519
				// opaque blended materials
M
Mr.doob 已提交
1520

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

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

A
alteredq 已提交
1526 1527
				this.renderPass( camera, lights, fog, object, buffer, THREE.AdditiveBlending, true );
				this.renderPass( camera, lights, fog, object, buffer, THREE.SubtractiveBlending, true );
1528

1529
				// transparent normal materials
M
Mr.doob 已提交
1530

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

1533 1534 1535 1536
				// billboard materials

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

1537
			}
M
Mr.doob 已提交
1538

M
Mr.doob 已提交
1539
		}
M
Mr.doob 已提交
1540

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

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

1563
			updateRenderTargetMipmap( renderTarget );
M
Mr.doob 已提交
1564

1565
		}
1566

M
Mr.doob 已提交
1567
	};
M
Mr.doob 已提交
1568

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

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

1573 1574 1575 1576 1577 1578
			if ( objmap[ id ] == undefined ) {

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

			}
M
Mr.doob 已提交
1579

1580
		};
M
Mr.doob 已提交
1581

A
alteredq 已提交
1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592
		function add_buffer_immediate( objmap, id, object ) {

			if ( objmap[ id ] == undefined ) {

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

			}

		};

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

M
Mr.doob 已提交
1595
		if ( !scene.__webGLObjects ) {
M
Mr.doob 已提交
1596

M
Mr.doob 已提交
1597
			scene.__webGLObjects = [];
M
Mr.doob 已提交
1598
			scene.__webGLObjectsMap = {};
M
Mr.doob 已提交
1599

A
alteredq 已提交
1600 1601
			scene.__webGLObjectsImmediate = [];

M
Mr.doob 已提交
1602
		}
M
Mr.doob 已提交
1603

1604 1605 1606
		for ( o = 0, ol = scene.objects.length; o < ol; o++ ) {

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

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

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

1613
			}
1614

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

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

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

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

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

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

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

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

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

					}

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

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

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

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

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

M
Mr.doob 已提交
1653
				}
1654

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

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


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

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

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

1674
				}
M
Mr.doob 已提交
1675

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

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

1680
				}
M
Mr.doob 已提交
1681

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

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

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

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

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

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

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

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

1704
				}
M
Mr.doob 已提交
1705

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

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

M
Mr.doob 已提交
1712

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

			}*/

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

	};

	this.removeObject = function ( scene, object ) {

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

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

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

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

				scene.__webGLObjects.splice( o, 1 );

			}
M
Mr.doob 已提交
1738

1739
		}
M
Mr.doob 已提交
1740

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

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

M
Mr.doob 已提交
1745
		_modelViewMatrix.multiply( camera.matrix, object.matrix );
M
Mr.doob 已提交
1746
		_modelViewMatrixArray.set( _modelViewMatrix.flatten() );
1747

1748
		_normalMatrix = THREE.Matrix4.makeInvert3x3( _modelViewMatrix ).transpose();
M
Mr.doob 已提交
1749
		_normalMatrixArray.set( _normalMatrix.m );
1750

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

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

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

M
Mr.doob 已提交
1757 1758 1759 1760
		_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 已提交
1761
		_gl.uniformMatrix4fv( program.uniforms.objectMatrix, false, _objectMatrixArray );
M
Mr.doob 已提交
1762

M
Mr.doob 已提交
1763
	};
1764

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

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

M
Mr.doob 已提交
1769
	};
M
Mr.doob 已提交
1770

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

M
Mr.doob 已提交
1787
		switch ( blending ) {
1788

M
Mr.doob 已提交
1789
			case THREE.AdditiveBlending:
1790

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

M
Mr.doob 已提交
1794
				break;
1795

M
Mr.doob 已提交
1796
			case THREE.SubtractiveBlending:
1797

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

M
Mr.doob 已提交
1801
				break;
M
Mr.doob 已提交
1802

1803 1804 1805 1806 1807 1808 1809
			case THREE.BillboardBlending:

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

				break;

M
Mr.doob 已提交
1810
			default:
M
Mr.doob 已提交
1811

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

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

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

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

1823
		if ( cullFace ) {
M
Mr.doob 已提交
1824

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

1827
				_gl.frontFace( _gl.CCW );
M
Mr.doob 已提交
1828

1829
			} else {
M
Mr.doob 已提交
1830

1831
				_gl.frontFace( _gl.CW );
M
Mr.doob 已提交
1832

1833
			}
M
Mr.doob 已提交
1834

1835
			if( cullFace == "back" ) {
M
Mr.doob 已提交
1836

1837
				_gl.cullFace( _gl.BACK );
M
Mr.doob 已提交
1838

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

1841
				_gl.cullFace( _gl.FRONT );
M
Mr.doob 已提交
1842

1843
			} else {
M
Mr.doob 已提交
1844

1845
				_gl.cullFace( _gl.FRONT_AND_BACK );
M
Mr.doob 已提交
1846

1847
			}
M
Mr.doob 已提交
1848

1849
			_gl.enable( _gl.CULL_FACE );
M
Mr.doob 已提交
1850

1851
		} else {
M
Mr.doob 已提交
1852

1853
			_gl.disable( _gl.CULL_FACE );
M
Mr.doob 已提交
1854

1855 1856 1857
		}

	};
N
Nicolas Garcia Belmonte 已提交
1858

1859
	this.supportsVertexTextures = function() {
1860

1861
		return maxVertexTextures() > 0;
1862

1863
	};
1864

1865
	function maxVertexTextures() {
1866

1867 1868 1869
		return _gl.getParameter( _gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS );

	};
1870

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

		try {

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

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

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

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

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

1900
	};
M
Mr.doob 已提交
1901

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

M
Mr.doob 已提交
1904
		var program = _gl.createProgram(),
M
Mr.doob 已提交
1905

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

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

1914 1915
			parameters.fog ? "#define USE_FOG" : "",
			parameters.fog instanceof THREE.FogExp2 ? "#define FOG_EXP2" : "",
1916

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

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

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

1930 1931 1932
			"#define MAX_DIR_LIGHTS " + parameters.maxDirLights,
			"#define MAX_POINT_LIGHTS " + parameters.maxPointLights,

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

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

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

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

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

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

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

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

M
Mr.doob 已提交
1970
		program.uniforms = {};
1971
		program.attributes = {};
M
Mr.doob 已提交
1972

M
Mr.doob 已提交
1973
		return program;
M
Mr.doob 已提交
1974

M
Mr.doob 已提交
1975
	};
M
Mr.doob 已提交
1976

M
Mr.doob 已提交
1977
	function setUniforms( program, uniforms ) {
M
Mr.doob 已提交
1978

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

M
Mr.doob 已提交
1981
		for( u in uniforms ) {
M
Mr.doob 已提交
1982

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

1986
			uniform = uniforms[u];
M
Mr.doob 已提交
1987

1988 1989
			type = uniform.type;
			value = uniform.value;
M
Mr.doob 已提交
1990

M
Mr.doob 已提交
1991
			if( type == "i" ) {
M
Mr.doob 已提交
1992

M
Mr.doob 已提交
1993
				_gl.uniform1i( location, value );
M
Mr.doob 已提交
1994

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

M
Mr.doob 已提交
1997
				_gl.uniform1f( location, value );
1998

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

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

2003 2004 2005 2006
			} else if( type == "fv" ) {

				_gl.uniform3fv( location, value );

2007 2008 2009 2010
			} else if( type == "v2" ) {

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

2011 2012 2013
			} else if( type == "v3" ) {

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

2015 2016 2017
			} else if( type == "c" ) {

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

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

M
Mr.doob 已提交
2021
				_gl.uniform1i( location, value );
M
Mr.doob 已提交
2022

2023
				texture = uniform.texture;
M
Mr.doob 已提交
2024

2025
				if ( !texture ) continue;
M
Mr.doob 已提交
2026

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

2029
					setCubeTexture( texture, value );
M
Mr.doob 已提交
2030

2031
				} else {
M
Mr.doob 已提交
2032

2033
					setTexture( texture, value );
M
Mr.doob 已提交
2034

2035
				}
M
Mr.doob 已提交
2036

2037
			}
M
Mr.doob 已提交
2038

2039
		}
M
Mr.doob 已提交
2040

2041
	};
M
Mr.doob 已提交
2042

2043
	function setCubeTexture( texture, slot ) {
M
Mr.doob 已提交
2044

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

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

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

2052
				_gl.bindTexture( _gl.TEXTURE_CUBE_MAP, texture.image.__webGLTextureCube );
2053

2054 2055
				_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 已提交
2056

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

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

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

2064
				}
M
Mr.doob 已提交
2065

2066
				_gl.generateMipmap( _gl.TEXTURE_CUBE_MAP );
2067

2068
				_gl.bindTexture( _gl.TEXTURE_CUBE_MAP, null );
M
Mr.doob 已提交
2069

2070
				texture.image.__cubeMapInitialized = true;
M
Mr.doob 已提交
2071

M
Mr.doob 已提交
2072
			}
2073 2074 2075

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

2077
		}
M
Mr.doob 已提交
2078

M
Mr.doob 已提交
2079
	};
M
Mr.doob 已提交
2080

2081
	function setTexture( texture, slot ) {
M
Mr.doob 已提交
2082

2083 2084 2085 2086 2087
		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 已提交
2088

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

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

2102
	};
M
Mr.doob 已提交
2103

A
alteredq 已提交
2104
	function setRenderTarget( renderTexture, clear ) {
2105 2106

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

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

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

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

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

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

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

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

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

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

2138 2139
		}

2140
		var framebuffer, width, height;
M
Mr.doob 已提交
2141

2142
		if ( renderTexture ) {
M
Mr.doob 已提交
2143

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

2148
		} else {
M
Mr.doob 已提交
2149

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

2154
		}
M
Mr.doob 已提交
2155

2156
		if( framebuffer != _oldFramebuffer ) {
M
Mr.doob 已提交
2157

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

A
alteredq 已提交
2161
			if ( clear ) {
M
Mr.doob 已提交
2162

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

A
alteredq 已提交
2165
			}
M
Mr.doob 已提交
2166

2167
			_oldFramebuffer = framebuffer;
M
Mr.doob 已提交
2168

2169
		}
2170

2171
	};
M
Mr.doob 已提交
2172

2173
	function updateRenderTargetMipmap( renderTarget ) {
M
Mr.doob 已提交
2174

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

	};
2180

M
Mr.doob 已提交
2181
	function cacheUniformLocations( program, identifiers ) {
M
Mr.doob 已提交
2182

M
Mr.doob 已提交
2183
		var i, l, id;
M
Mr.doob 已提交
2184

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

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

M
Mr.doob 已提交
2190
		}
M
Mr.doob 已提交
2191

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

2194
	function cacheAttributeLocations( program, identifiers ) {
2195

2196
		var i, l, id;
M
Mr.doob 已提交
2197

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

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

2203
		}
M
Mr.doob 已提交
2204

M
Mr.doob 已提交
2205
	};
M
Mr.doob 已提交
2206

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

2233
	};
N
Nicolas Garcia Belmonte 已提交
2234

2235
	function paramThreeToGL( p ) {
M
Mr.doob 已提交
2236

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

			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;

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

2265
		}
M
Mr.doob 已提交
2266

2267
		return 0;
M
Mr.doob 已提交
2268

2269 2270 2271 2272 2273 2274
	};

	function materialNeedsSmoothNormals( material ) {

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

2275
	};
M
Mr.doob 已提交
2276

M
Mr.doob 已提交
2277
	function bufferNeedsSmoothNormals( geometryChunk, object ) {
M
Mr.doob 已提交
2278

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

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

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

			if ( meshMaterial instanceof THREE.MeshFaceMaterial ) {

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

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

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

					}

				}

			} else {

				if ( materialNeedsSmoothNormals( meshMaterial ) ) {

					needsSmoothNormals = true;
					break;

				}

			}

			if ( needsSmoothNormals ) break;

		}
M
Mr.doob 已提交
2312

2313
		return needsSmoothNormals;
M
Mr.doob 已提交
2314

2315
	};
M
Mr.doob 已提交
2316

2317
	function allocateLights( lights, maxLights ) {
2318

2319 2320
		var l, ll, light, dirLights, pointLights, maxDirLights, maxPointLights;
		dirLights = pointLights = maxDirLights = maxPointLights = 0;
2321

2322
		for ( l = 0, ll = lights.length; l < ll; l++ ) {
2323

2324
			light = lights[ l ];
2325

2326 2327
			if ( light instanceof THREE.DirectionalLight ) dirLights++;
			if ( light instanceof THREE.PointLight ) pointLights++;
2328

2329
		}
2330

2331
		if ( ( pointLights + dirLights ) <= maxLights ) {
2332

2333 2334
			maxDirLights = dirLights;
			maxPointLights = pointLights;
2335

2336
		} else {
2337

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

		}

2343
		return { 'directional' : maxDirLights, 'point' : maxPointLights };
2344 2345

	};
M
Mr.doob 已提交
2346

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

2350
		var params  = {
M
Mr.doob 已提交
2351

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

2355 2356 2357
			'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 已提交
2358

2359 2360 2361
			'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 已提交
2362

2363 2364
		return params;
	};
M
Mr.doob 已提交
2365

2366
	function dumpObject( obj ) {
M
Mr.doob 已提交
2367

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

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

2373
		}
M
Mr.doob 已提交
2374

2375 2376
		return str;
	}
A
alteredq 已提交
2377
	*/
2378

2379
};
2380

2381
THREE.Snippets = {
M
Mr.doob 已提交
2382

2383 2384
	// FOG
	
2385
	fog_pars_fragment: [
M
Mr.doob 已提交
2386

2387
	"#ifdef USE_FOG",
2388

2389
		"uniform vec3 fogColor;",
2390

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

2398
	"#endif"
2399

2400
	].join("\n"),
M
Mr.doob 已提交
2401

2402
	fog_fragment: [
2403

2404
	"#ifdef USE_FOG",
2405

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

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

2418
	"#endif"
M
Mr.doob 已提交
2419

2420
	].join("\n"),
M
Mr.doob 已提交
2421

2422 2423
	// ENVIRONMENT MAP
	
2424
	envmap_pars_fragment: [
M
Mr.doob 已提交
2425

2426
	"#ifdef USE_ENVMAP",
M
Mr.doob 已提交
2427

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

2433
	"#endif"
M
Mr.doob 已提交
2434

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

2437
	envmap_fragment: [
M
Mr.doob 已提交
2438

2439 2440
	"#ifdef USE_ENVMAP",

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

2443 2444
		"if ( combine == 1 ) {",

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

		"} else {",

			"gl_FragColor = gl_FragColor * cubeColor;",

M
Mr.doob 已提交
2452
		"}",
2453 2454

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

2456
	].join("\n"),
M
Mr.doob 已提交
2457

2458
	envmap_pars_vertex: [
M
Mr.doob 已提交
2459

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

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

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

2468 2469 2470
	].join("\n"),

	envmap_vertex : [
M
Mr.doob 已提交
2471

2472
	"#ifdef USE_ENVMAP",
M
Mr.doob 已提交
2473

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

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

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

	map_particle_pars_fragment: [

	"#ifdef USE_MAP",

		"uniform sampler2D map;",

	"#endif"

	].join("\n"),


	map_particle_fragment: [

	"#ifdef USE_MAP",

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

	"#endif"

	].join("\n"),

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

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

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

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

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

2525
	].join("\n"),
M
Mr.doob 已提交
2526

2527
	map_pars_vertex: [
M
Mr.doob 已提交
2528

2529
	"#ifdef USE_MAP",
M
Mr.doob 已提交
2530

2531 2532 2533
		"varying vec2 vUv;",

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

2535
	].join("\n"),
M
Mr.doob 已提交
2536

2537 2538 2539 2540
	map_fragment: [

	"#ifdef USE_MAP",

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

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

2545
	].join("\n"),
M
Mr.doob 已提交
2546

2547
	map_vertex: [
M
Mr.doob 已提交
2548

2549
	"#ifdef USE_MAP",
M
Mr.doob 已提交
2550

2551
		"vUv = uv;",
M
Mr.doob 已提交
2552

2553
	"#endif"
M
Mr.doob 已提交
2554

2555
	].join("\n"),
M
Mr.doob 已提交
2556

2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 2567 2568 2569 2570 2571 2572 2573 2574 2575 2576 2577 2578 2579 2580 2581 2582 2583
	// LIGHT MAP
	
	lightmap_pars_fragment: [

	"#ifdef USE_LIGHTMAP",

		"varying vec2 vUv2;",
		"uniform sampler2D light_map;",

	"#endif"

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

	"#ifdef USE_LIGHTMAP",

		"varying vec2 vUv2;",

	"#endif"

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

	"#ifdef USE_LIGHTMAP",

A
alteredq 已提交
2584
		"gl_FragColor = gl_FragColor * texture2D( light_map, vUv2 );",
2585 2586 2587 2588 2589 2590 2591 2592 2593 2594 2595 2596 2597 2598 2599

	"#endif"

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

	"#ifdef USE_LIGHTMAP",

		"vUv2 = uv2;",

	"#endif"

	].join("\n"),

2600
	lights_pars_vertex: [
M
Mr.doob 已提交
2601

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

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

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

2610 2611 2612
	"#endif",

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

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

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

2621
	"#endif"
M
Mr.doob 已提交
2622

2623
	].join("\n"),
M
Mr.doob 已提交
2624

2625 2626
	// LIGHTS
	
2627
	lights_vertex: [
M
Mr.doob 已提交
2628

2629 2630
	"if ( !enableLighting ) {",

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

	"} else {",

		"vLightWeighting = ambientLightColor;",

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

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

2641 2642 2643
			"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 已提交
2644

2645
		"}",
M
Mr.doob 已提交
2646

2647 2648 2649
		"#endif",

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

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

2653 2654 2655 2656
			"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 已提交
2657

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

2662
		"}",
M
Mr.doob 已提交
2663

2664
		"#endif",
M
Mr.doob 已提交
2665

2666
	"}"
M
Mr.doob 已提交
2667

2668
	].join("\n"),
M
Mr.doob 已提交
2669

2670
	lights_pars_fragment: [
M
Mr.doob 已提交
2671

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

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

2680 2681
	"varying vec3 vViewPosition;",
	"varying vec3 vNormal;"
M
Mr.doob 已提交
2682

2683
	].join("\n"),
M
Mr.doob 已提交
2684

2685
	lights_fragment: [
M
Mr.doob 已提交
2686

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

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

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

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

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

2742 2743 2744 2745 2746 2747 2748
	"#endif",

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

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

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

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

	color_pars_fragment: [

	"#ifdef USE_COLOR",

		"varying vec3 vColor;",

	"#endif"

	].join("\n"),


	color_fragment: [

	"#ifdef USE_COLOR",

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

	"#endif"

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

	"#ifdef USE_COLOR",

		"varying vec3 vColor;",

	"#endif"

	].join("\n"),


	color_vertex: [

	"#ifdef USE_COLOR",

		"vColor = color;",

	"#endif"

2800
	].join("\n")
A
alteredq 已提交
2801
	
2802

2803
};
2804

2805
THREE.UniformsLib = {
M
Mr.doob 已提交
2806

2807
	common: {
M
Mr.doob 已提交
2808

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

2813 2814
	"light_map"       : { type: "t", value: 2, texture: null },

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

2821 2822 2823 2824
	"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 已提交
2825

2826
	},
M
Mr.doob 已提交
2827

2828
	lights: {
M
Mr.doob 已提交
2829

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

2837 2838 2839 2840
	},

	particle: {

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

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

2855
THREE.ShaderLib = {
2856

2857
	'depth': {
M
Mr.doob 已提交
2858

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

2864
		fragment_shader: [
M
Mr.doob 已提交
2865

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

2870
			"void main() {",
M
Mr.doob 已提交
2871

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

2876
			"}"
M
Mr.doob 已提交
2877

2878
		].join("\n"),
2879

2880
		vertex_shader: [
2881

2882
			"void main() {",
2883

2884
				"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",
2885

2886
			"}"
2887

2888
		].join("\n")
2889

2890
	},
2891

2892
	'normal': {
M
Mr.doob 已提交
2893

2894
		uniforms: { "opacity" : { type: "f", value: 1.0 } },
2895

2896
		fragment_shader: [
2897

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

2901
			"void main() {",
2902

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

2905
			"}"
M
Mr.doob 已提交
2906

2907
		].join("\n"),
M
Mr.doob 已提交
2908

2909
		vertex_shader: [
2910

2911
			"varying vec3 vNormal;",
2912

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

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

				"gl_Position = projectionMatrix * mvPosition;",

			"}"

		].join("\n")

	},
2925

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

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

2930
		fragment_shader: [
2931

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

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

2941
			"void main() {",
2942

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

2951
			"}"
2952

2953
		].join("\n"),
M
Mr.doob 已提交
2954

2955
		vertex_shader: [
M
Mr.doob 已提交
2956

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

2962
			"void main() {",
M
Mr.doob 已提交
2963

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

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

2971
				"gl_Position = projectionMatrix * mvPosition;",
2972

2973
			"}"
2974

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

2977
	},
2978

2979
	'lambert': {
M
Mr.doob 已提交
2980 2981

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

2984
		fragment_shader: [
M
Mr.doob 已提交
2985

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

2989
			"varying vec3 vLightWeighting;",
M
Mr.doob 已提交
2990

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

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

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

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

			"}"

		].join("\n"),

		vertex_shader: [
M
Mr.doob 已提交
3013

3014
			"varying vec3 vLightWeighting;",
M
Mr.doob 已提交
3015

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

3022
			"void main() {",
M
Mr.doob 已提交
3023

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

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

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

3033
				THREE.Snippets[ "lights_vertex" ],
M
Mr.doob 已提交
3034

3035 3036 3037 3038 3039
				"gl_Position = projectionMatrix * mvPosition;",

			"}"

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

3041
	},
M
Mr.doob 已提交
3042

3043
	'phong': {
M
Mr.doob 已提交
3044 3045

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

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

3053
								] ),
M
Mr.doob 已提交
3054

3055
		fragment_shader: [
M
Mr.doob 已提交
3056

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

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

3064
			"varying vec3 vLightWeighting;",
M
Mr.doob 已提交
3065

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

3073
			"void main() {",
M
Mr.doob 已提交
3074

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

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

			"}"

		].join("\n"),

		vertex_shader: [
M
Mr.doob 已提交
3089

3090
			"#define PHONG",
M
Mr.doob 已提交
3091

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

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

3102
			"void main() {",
M
Mr.doob 已提交
3103

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

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

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

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

3117 3118
				"vec3 transformedNormal = normalize( normalMatrix * normal );",
				"vNormal = transformedNormal;",
3119

3120
				THREE.Snippets[ "lights_vertex" ],
M
Mr.doob 已提交
3121

3122
				"gl_Position = projectionMatrix * mvPosition;",
3123 3124 3125 3126

			"}"

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

3128 3129 3130 3131 3132 3133 3134 3135
	},
	
	'particle_basic': {

		uniforms: THREE.UniformsLib[ "particle" ],

		fragment_shader: [

A
alteredq 已提交
3136
			"uniform vec3 psColor;",
3137 3138
			"uniform float opacity;",

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

			"void main() {",

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

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

			"}"

		].join("\n"),

		vertex_shader: [

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

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

N
Nicolas Garcia Belmonte 已提交
3178
};