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

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

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

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

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

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

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

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

A
alteredq 已提交
27 28
	_this = this,
	
A
alteredq 已提交
29 30
	// gl state cache
	
31 32
	_oldDoubleSided = null,
	_oldFlipSided = null,
A
alteredq 已提交
33
	_oldBlending = null,
A
alteredq 已提交
34
	_oldDepth = null,
A
alteredq 已提交
35
	
36 37
	// camera matrices caches
	
38 39 40 41 42 43 44 45 46
	_frustum = [ 
		new THREE.Vector4(),
		new THREE.Vector4(),
		new THREE.Vector4(),
		new THREE.Vector4(),
		new THREE.Vector4(),
		new THREE.Vector4()
	 ],

47
	_projScreenMatrix = new THREE.Matrix4(),
48
	_projectionMatrixArray = new Float32Array( 16 ),
A
alteredq 已提交
49
	_cameraInverseMatrixArray = new Float32Array( 16 ),
50 51 52
	
	_viewMatrixArray = new Float32Array( 16 ),	

53 54
	_vector3 = new THREE.Vector4(),
	
55
	// parameters defaults
M
Mr.doob 已提交
56

57 58 59
	antialias = true,
	clearColor = new THREE.Color( 0x000000 ),
	clearAlpha = 0;
60

61
	if ( parameters ) {
M
Mr.doob 已提交
62

63 64 65
		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 已提交
66

67
	}
M
Mr.doob 已提交
68

N
Nicolas Garcia Belmonte 已提交
69 70
	this.domElement = _canvas;
	this.autoClear = true;
71
	this.sortObjects = false;
N
Nicolas Garcia Belmonte 已提交
72

73
	initGL( antialias, clearColor, clearAlpha );
M
Mr.doob 已提交
74

75 76
	this.context = _gl;

77
	//alert( dumpObject( getGLParams() ) );
M
Mr.doob 已提交
78

79
	this.lights = {
M
Mr.doob 已提交
80 81 82

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

85
	};
M
Mr.doob 已提交
86

N
Nicolas Garcia Belmonte 已提交
87 88 89 90 91 92 93 94
	this.setSize = function ( width, height ) {

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

	};

95
	this.setClearColorHex = function ( hex, alpha ) {
96

97 98
		var color = new THREE.Color( hex );
		_gl.clearColor( color.r, color.g, color.b, alpha );
99

100
	};
A
alteredq 已提交
101

102
	this.setClearColor = function ( color, alpha ) {
A
alteredq 已提交
103 104 105 106

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

	};
107

N
Nicolas Garcia Belmonte 已提交
108 109 110 111 112 113
	this.clear = function () {

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

	};

M
Mr.doob 已提交
114

A
alteredq 已提交
115
	function setupLights ( program, lights ) {
116

117
		var l, ll, light, r = 0, g = 0, b = 0,
118
			color, position, intensity,
M
Mr.doob 已提交
119

A
alteredq 已提交
120
			zlights = _this.lights,
M
Mr.doob 已提交
121

122 123
			dcolors    = zlights.directional.colors,
			dpositions = zlights.directional.positions,
124

125 126
			pcolors    = zlights.point.colors,
			ppositions = zlights.point.positions,
127

128
			dlength = 0,
129 130 131 132
			plength = 0,
		
			doffset = 0,
			poffset = 0;
M
Mr.doob 已提交
133

134
		for ( l = 0, ll = lights.length; l < ll; l++ ) {
135

136
			light = lights[ l ];
137 138 139
			color = light.color;
			position = light.position;
			intensity = light.intensity;
140 141 142

			if ( light instanceof THREE.AmbientLight ) {

143 144 145
				r += color.r;
				g += color.g;
				b += color.b;
M
Mr.doob 已提交
146

147
			} else if ( light instanceof THREE.DirectionalLight ) {
148

149 150 151 152 153
				doffset = dlength * 3;
				
				dcolors[ doffset ]     = color.r * intensity;
				dcolors[ doffset + 1 ] = color.g * intensity;
				dcolors[ doffset + 2 ] = color.b * intensity;
154

155 156 157
				dpositions[ doffset ]     = position.x;
				dpositions[ doffset + 1 ] = position.y;
				dpositions[ doffset + 2 ] = position.z;
158

159
				dlength += 1;
M
Mr.doob 已提交
160

161 162
			} else if( light instanceof THREE.PointLight ) {

163 164 165 166 167
				poffset = plength * 3;
				
				pcolors[ poffset ]     = color.r * intensity;
				pcolors[ poffset + 1 ] = color.g * intensity;
				pcolors[ poffset + 2 ] = color.b * intensity;
168

169 170 171
				ppositions[ poffset ]     = position.x;
				ppositions[ poffset + 1 ] = position.y;
				ppositions[ poffset + 2 ] = position.z;
M
Mr.doob 已提交
172

173
				plength += 1;
M
Mr.doob 已提交
174

175 176 177
			}

		}
178 179 180 181 182 183
		
		// 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 已提交
184

185 186
		zlights.point.length = plength;
		zlights.directional.length = dlength;
M
Mr.doob 已提交
187

188 189 190
		zlights.ambient[ 0 ] = r;
		zlights.ambient[ 1 ] = g;
		zlights.ambient[ 2 ] = b;
M
Mr.doob 已提交
191

192
	};
M
Mr.doob 已提交
193

194
	function createParticleBuffers ( geometry ) {
M
Mr.doob 已提交
195

196
		geometry.__webGLVertexBuffer = _gl.createBuffer();
197
		geometry.__webGLColorBuffer = _gl.createBuffer();
M
Mr.doob 已提交
198

199
	};
M
Mr.doob 已提交
200

201
	function createLineBuffers ( geometry ) {
M
Mr.doob 已提交
202

203
		geometry.__webGLVertexBuffer = _gl.createBuffer();
204
		geometry.__webGLColorBuffer = _gl.createBuffer();
M
Mr.doob 已提交
205

206
	};
207

208
	function createMeshBuffers ( geometryChunk ) {
M
Mr.doob 已提交
209

210 211 212
		geometryChunk.__webGLVertexBuffer = _gl.createBuffer();
		geometryChunk.__webGLNormalBuffer = _gl.createBuffer();
		geometryChunk.__webGLTangentBuffer = _gl.createBuffer();
213
		geometryChunk.__webGLColorBuffer = _gl.createBuffer();
214
		geometryChunk.__webGLUVBuffer = _gl.createBuffer();
215
		geometryChunk.__webGLUV2Buffer = _gl.createBuffer();
216
		
A
alteredq 已提交
217 218 219 220 221
		geometryChunk.__webGLSkinVertexABuffer = _gl.createBuffer();
		geometryChunk.__webGLSkinVertexBBuffer = _gl.createBuffer();
		geometryChunk.__webGLSkinIndicesBuffer = _gl.createBuffer();
		geometryChunk.__webGLSkinWeightsBuffer = _gl.createBuffer();
		
222 223
		geometryChunk.__webGLFaceBuffer = _gl.createBuffer();
		geometryChunk.__webGLLineBuffer = _gl.createBuffer();
M
Mr.doob 已提交
224

225
	};
A
alteredq 已提交
226
	
227
	function initLineBuffers ( geometry ) {
M
Mr.doob 已提交
228

229 230 231
		var nvertices = geometry.vertices.length;

		geometry.__vertexArray = new Float32Array( nvertices * 3 );
232
		geometry.__colorArray = new Float32Array( nvertices * 3 );
M
Mr.doob 已提交
233

234
		geometry.__webGLLineCount = nvertices;
M
Mr.doob 已提交
235

236
	};
M
Mr.doob 已提交
237

238
	function initParticleBuffers ( geometry ) {
239 240 241 242

		var nvertices = geometry.vertices.length;

		geometry.__vertexArray = new Float32Array( nvertices * 3 );
A
alteredq 已提交
243
		geometry.__colorArray = new Float32Array( nvertices * 3 );
244 245
		
		geometry.__sortArray = [];
246 247 248 249 250

		geometry.__webGLParticleCount = nvertices;

	};

251
	function initMeshBuffers ( geometryChunk, object ) {
M
Mr.doob 已提交
252

253
		var f, fl, nvertices = 0, ntris = 0, nlines = 0,
M
Mr.doob 已提交
254
			obj_faces = object.geometry.faces,
255
			chunk_faces = geometryChunk.faces;
M
Mr.doob 已提交
256

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

259 260
			fi = chunk_faces[ f ];
			face = obj_faces[ fi ];
M
Mr.doob 已提交
261

262
			if ( face instanceof THREE.Face3 ) {
M
Mr.doob 已提交
263

264 265 266
				nvertices += 3;
				ntris += 1;
				nlines += 3;
M
Mr.doob 已提交
267

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

270 271
				nvertices += 4;
				ntris += 2;
272
				nlines += 4;
M
Mr.doob 已提交
273

274
			}
M
Mr.doob 已提交
275

276
		}
M
Mr.doob 已提交
277

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

280 281 282
		geometryChunk.__vertexArray  = new Float32Array( nvertices * 3 );
		geometryChunk.__normalArray  = new Float32Array( nvertices * 3 );
		geometryChunk.__tangentArray = new Float32Array( nvertices * 4 );
283
		geometryChunk.__colorArray = new Float32Array( nvertices * 3 );
284
		geometryChunk.__uvArray = new Float32Array( nvertices * 2 );
285
		geometryChunk.__uv2Array = new Float32Array( nvertices * 2 );
M
Mr.doob 已提交
286

A
alteredq 已提交
287 288 289 290 291
		geometryChunk.__skinVertexAArray = new Float32Array( nvertices * 4 );
		geometryChunk.__skinVertexBArray = new Float32Array( nvertices * 4 );
		geometryChunk.__skinIndexArray = new Float32Array( nvertices * 4 );
		geometryChunk.__skinWeightArray = new Float32Array( nvertices * 4 );
		
292 293
		geometryChunk.__faceArray = new Uint16Array( ntris * 3 );
		geometryChunk.__lineArray = new Uint16Array( nlines * 2 );
M
Mr.doob 已提交
294

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

297 298
		geometryChunk.__webGLFaceCount = ntris * 3;
		geometryChunk.__webGLLineCount = nlines * 2;
M
Mr.doob 已提交
299

300
	};
M
Mr.doob 已提交
301

302
	function setMeshBuffers ( geometryChunk, object, hint ) {
303

304 305 306
		var f, fl, fi, face, vertexNormals, faceNormal, normal, 
			uv, uv2, v1, v2, v3, v4, t1, t2, t3, t4, 
			c1, c2, c3, c4,
A
alteredq 已提交
307 308 309 310
			sw1, sw2, sw3, sw4,
			si1, si2, si3, si4,
			sa1, sa2, sa3, sa4,
			sb1, sb2, sb3, sb4,
311
			m, ml, i,
312
			vn, uvi, uv2i,
M
Mr.doob 已提交
313

314
		vertexIndex = 0,
315

316 317
		offset = 0,
		offset_uv = 0,
318
		offset_uv2 = 0,
319 320 321 322
		offset_face = 0,
		offset_normal = 0,
		offset_tangent = 0,
		offset_line = 0,
323
		offset_color = 0,
A
alteredq 已提交
324
		offset_skin = 0,
M
Mr.doob 已提交
325

326 327
		vertexArray = geometryChunk.__vertexArray,
		uvArray = geometryChunk.__uvArray,
328
		uv2Array = geometryChunk.__uv2Array,
329 330
		normalArray = geometryChunk.__normalArray,
		tangentArray = geometryChunk.__tangentArray,
331
		colorArray = geometryChunk.__colorArray,
A
alteredq 已提交
332 333 334 335 336
		
		skinVertexAArray = geometryChunk.__skinVertexAArray,
		skinVertexBArray = geometryChunk.__skinVertexBArray,
		skinIndexArray = geometryChunk.__skinIndexArray,
		skinWeightArray = geometryChunk.__skinWeightArray,
M
Mr.doob 已提交
337

338 339
		faceArray = geometryChunk.__faceArray,
		lineArray = geometryChunk.__lineArray,
M
Mr.doob 已提交
340

341
		needsSmoothNormals = geometryChunk.__needsSmoothNormals,
342 343 344 345 346 347 348 349
		
		geometry = object.geometry, // this is shared for all chunks
		
		dirtyVertices = geometry.__dirtyVertices,
		dirtyElements = geometry.__dirtyElements, 
		dirtyUvs = geometry.__dirtyUvs, 
		dirtyNormals = geometry.__dirtyNormals, 
		dirtyTangents = geometry.__dirtyTangents,
350
		dirtyColors = geometry.__dirtyColors,
M
Mr.doob 已提交
351

352 353 354
		vertices = geometry.vertices,
		chunk_faces = geometryChunk.faces,
		obj_faces = geometry.faces,
355
		obj_uvs = geometry.uvs,
356
		obj_uvs2 = geometry.uvs2,
A
alteredq 已提交
357 358 359 360 361 362
		obj_colors = geometry.colors,
		
		obj_skinVerticesA = geometry.skinVerticesA,
		obj_skinVerticesB = geometry.skinVerticesB,
		obj_skinIndices = geometry.skinIndices,
		obj_skinWeights = geometry.skinWeights;
363
		
364
		for ( f = 0, fl = chunk_faces.length; f < fl; f++ ) {
M
Mr.doob 已提交
365

366 367 368
			fi = chunk_faces[ f ];
			face = obj_faces[ fi ];
			uv = obj_uvs[ fi ];
369
			uv2 = obj_uvs2[ fi ];
M
Mr.doob 已提交
370

371
			vertexNormals = face.vertexNormals;
372
			faceNormal = face.normal;
373 374 375

			if ( face instanceof THREE.Face3 ) {

376
				if ( dirtyVertices ) {
M
Mr.doob 已提交
377

378 379 380
					v1 = vertices[ face.a ].position;
					v2 = vertices[ face.b ].position;
					v3 = vertices[ face.c ].position;
M
Mr.doob 已提交
381

382 383 384
					vertexArray[ offset ]     = v1.x;
					vertexArray[ offset + 1 ] = v1.y;
					vertexArray[ offset + 2 ] = v1.z;
M
Mr.doob 已提交
385

386 387 388
					vertexArray[ offset + 3 ] = v2.x;
					vertexArray[ offset + 4 ] = v2.y;
					vertexArray[ offset + 5 ] = v2.z;
389

390 391 392
					vertexArray[ offset + 6 ] = v3.x;
					vertexArray[ offset + 7 ] = v3.y;
					vertexArray[ offset + 8 ] = v3.z;
M
Mr.doob 已提交
393

394
					offset += 9;
M
Mr.doob 已提交
395

396
				}
A
alteredq 已提交
397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486
				
				if ( obj_skinWeights.length ) {

					// weights
					
					sw1 = obj_skinWeights[ face.a ];
					sw2 = obj_skinWeights[ face.b ];
					sw3 = obj_skinWeights[ face.c ];
					
					skinWeightArray[ offset_skin ]     = sw1.x;
					skinWeightArray[ offset_skin + 1 ] = sw1.y;
					skinWeightArray[ offset_skin + 2 ] = sw1.z;
					skinWeightArray[ offset_skin + 3 ] = sw1.w;

					skinWeightArray[ offset_skin + 4 ] = sw2.x;
					skinWeightArray[ offset_skin + 5 ] = sw2.y;
					skinWeightArray[ offset_skin + 6 ] = sw2.z;
					skinWeightArray[ offset_skin + 7 ] = sw2.w;

					skinWeightArray[ offset_skin + 8 ]  = sw3.x;
					skinWeightArray[ offset_skin + 9 ]  = sw3.y;
					skinWeightArray[ offset_skin + 10 ] = sw3.z;
					skinWeightArray[ offset_skin + 11 ] = sw3.w;

					// indices
					
					si1 = obj_skinIndices[ face.a ];
					si2 = obj_skinIndices[ face.b ];
					si3 = obj_skinIndices[ face.c ];

					skinIndexArray[ offset_skin ]     = si1.x;
					skinIndexArray[ offset_skin + 1 ] = si1.y;
					skinIndexArray[ offset_skin + 2 ] = si1.z;
					skinIndexArray[ offset_skin + 3 ] = si1.w;

					skinIndexArray[ offset_skin + 4 ] = si2.x;
					skinIndexArray[ offset_skin + 5 ] = si2.y;
					skinIndexArray[ offset_skin + 6 ] = si2.z;
					skinIndexArray[ offset_skin + 7 ] = si2.w;

					skinIndexArray[ offset_skin + 8 ]  = si3.x;
					skinIndexArray[ offset_skin + 9 ]  = si3.y;
					skinIndexArray[ offset_skin + 10 ] = si3.z;
					skinIndexArray[ offset_skin + 11 ] = si3.w;

					// vertices A
					
					sa1 = obj_skinVerticesA[ face.a ];
					sa2 = obj_skinVerticesA[ face.b ];
					sa3 = obj_skinVerticesA[ face.c ];

					skinVertexAArray[ offset_skin ]     = sa1.x;
					skinVertexAArray[ offset_skin + 1 ] = sa1.y;
					skinVertexAArray[ offset_skin + 2 ] = sa1.z;
					skinVertexAArray[ offset_skin + 3 ] = 1; // pad for faster vertex shader

					skinVertexAArray[ offset_skin + 4 ] = sa2.x;
					skinVertexAArray[ offset_skin + 5 ] = sa2.y;
					skinVertexAArray[ offset_skin + 6 ] = sa2.z;
					skinVertexAArray[ offset_skin + 7 ] = 1;

					skinVertexAArray[ offset_skin + 8 ]  = sa3.x;
					skinVertexAArray[ offset_skin + 9 ]  = sa3.y;
					skinVertexAArray[ offset_skin + 10 ] = sa3.z;
					skinVertexAArray[ offset_skin + 11 ] = 1;

					// vertices B
					
					sb1 = obj_skinVerticesB[ face.a ];
					sb2 = obj_skinVerticesB[ face.b ];
					sb3 = obj_skinVerticesB[ face.c ];

					skinVertexBArray[ offset_skin ]     = sb1.x;
					skinVertexBArray[ offset_skin + 1 ] = sb1.y;
					skinVertexBArray[ offset_skin + 2 ] = sb1.z;
					skinVertexBArray[ offset_skin + 3 ] = 1; // pad for faster vertex shader

					skinVertexBArray[ offset_skin + 4 ] = sb2.x;
					skinVertexBArray[ offset_skin + 5 ] = sb2.y;
					skinVertexBArray[ offset_skin + 6 ] = sb2.z;
					skinVertexBArray[ offset_skin + 7 ] = 1;

					skinVertexBArray[ offset_skin + 8 ]  = sb3.x;
					skinVertexBArray[ offset_skin + 9 ]  = sb3.y;
					skinVertexBArray[ offset_skin + 10 ] = sb3.z;
					skinVertexBArray[ offset_skin + 11 ] = 1;

					offset_skin += 12;
					
				}
487

488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509
				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;

				}

510
				if ( dirtyTangents && geometry.hasTangents ) {
511

512 513 514
					t1 = vertices[ face.a ].tangent;
					t2 = vertices[ face.b ].tangent;
					t3 = vertices[ face.c ].tangent;
515

516 517 518 519
					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 已提交
520

521 522 523 524
					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 已提交
525

526 527 528 529
					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 已提交
530

531
					offset_tangent += 12;
M
Mr.doob 已提交
532

533 534
				}

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

537 538 539
					if ( vertexNormals.length == 3 && needsSmoothNormals ) {

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

541
							vn = vertexNormals[ i ];
M
Mr.doob 已提交
542

543 544 545
							normalArray[ offset_normal ]     = vn.x;
							normalArray[ offset_normal + 1 ] = vn.y;
							normalArray[ offset_normal + 2 ] = vn.z;
M
Mr.doob 已提交
546

547
							offset_normal += 3;
M
Mr.doob 已提交
548

549
						}
M
Mr.doob 已提交
550

551
					} else {
552

553
						for ( i = 0; i < 3; i ++ ) {
554

555 556 557
							normalArray[ offset_normal ]     = faceNormal.x;
							normalArray[ offset_normal + 1 ] = faceNormal.y;
							normalArray[ offset_normal + 2 ] = faceNormal.z;
M
Mr.doob 已提交
558

559
							offset_normal += 3;
M
Mr.doob 已提交
560

561
						}
M
Mr.doob 已提交
562 563

					}
M
Mr.doob 已提交
564

565 566
				}

567
				if ( dirtyUvs && uv ) {
568

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

571
						uvi = uv[ i ];
M
Mr.doob 已提交
572

573 574
						uvArray[ offset_uv ]     = uvi.u;
						uvArray[ offset_uv + 1 ] = uvi.v;
M
Mr.doob 已提交
575

576
						offset_uv += 2;
M
Mr.doob 已提交
577

M
Mr.doob 已提交
578
					}
579 580 581

				}

582 583 584 585 586 587 588 589 590 591 592 593 594 595 596
				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;

					}

				}

597
				if( dirtyElements ) {
M
Mr.doob 已提交
598

599 600 601
					faceArray[ offset_face ] = vertexIndex;
					faceArray[ offset_face + 1 ] = vertexIndex + 1;
					faceArray[ offset_face + 2 ] = vertexIndex + 2;
M
Mr.doob 已提交
602

603
					offset_face += 3;
M
Mr.doob 已提交
604

605 606
					lineArray[ offset_line ]     = vertexIndex;
					lineArray[ offset_line + 1 ] = vertexIndex + 1;
M
Mr.doob 已提交
607

608 609
					lineArray[ offset_line + 2 ] = vertexIndex;
					lineArray[ offset_line + 3 ] = vertexIndex + 2;
M
Mr.doob 已提交
610

611 612
					lineArray[ offset_line + 4 ] = vertexIndex + 1;
					lineArray[ offset_line + 5 ] = vertexIndex + 2;
M
Mr.doob 已提交
613

614
					offset_line += 6;
615

616
					vertexIndex += 3;
M
Mr.doob 已提交
617

618
				}
M
Mr.doob 已提交
619

620 621 622

			} else if ( face instanceof THREE.Face4 ) {

623
				if ( dirtyVertices ) {
M
Mr.doob 已提交
624

625 626 627 628
					v1 = vertices[ face.a ].position;
					v2 = vertices[ face.b ].position;
					v3 = vertices[ face.c ].position;
					v4 = vertices[ face.d ].position;
M
Mr.doob 已提交
629

630 631 632
					vertexArray[ offset ]     = v1.x;
					vertexArray[ offset + 1 ] = v1.y;
					vertexArray[ offset + 2 ] = v1.z;
M
Mr.doob 已提交
633

634 635 636
					vertexArray[ offset + 3 ] = v2.x;
					vertexArray[ offset + 4 ] = v2.y;
					vertexArray[ offset + 5 ] = v2.z;
637

638 639 640
					vertexArray[ offset + 6 ] = v3.x;
					vertexArray[ offset + 7 ] = v3.y;
					vertexArray[ offset + 8 ] = v3.z;
641

642 643 644
					vertexArray[ offset + 9 ] = v4.x;
					vertexArray[ offset + 10 ] = v4.y;
					vertexArray[ offset + 11 ] = v4.z;
M
Mr.doob 已提交
645

646
					offset += 12;
M
Mr.doob 已提交
647

648
				}
649
				
A
alteredq 已提交
650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763
				if ( obj_skinWeights.length ) {

					// weights
					
					sw1 = obj_skinWeights[ face.a ];
					sw2 = obj_skinWeights[ face.b ];
					sw3 = obj_skinWeights[ face.c ];
					sw4 = obj_skinWeights[ face.d ];
					
					skinWeightArray[ offset_skin ]     = sw1.x;
					skinWeightArray[ offset_skin + 1 ] = sw1.y;
					skinWeightArray[ offset_skin + 2 ] = sw1.z;
					skinWeightArray[ offset_skin + 3 ] = sw1.w;

					skinWeightArray[ offset_skin + 4 ] = sw2.x;
					skinWeightArray[ offset_skin + 5 ] = sw2.y;
					skinWeightArray[ offset_skin + 6 ] = sw2.z;
					skinWeightArray[ offset_skin + 7 ] = sw2.w;

					skinWeightArray[ offset_skin + 8 ]  = sw3.x;
					skinWeightArray[ offset_skin + 9 ]  = sw3.y;
					skinWeightArray[ offset_skin + 10 ] = sw3.z;
					skinWeightArray[ offset_skin + 11 ] = sw3.w;

					skinWeightArray[ offset_skin + 12 ] = sw4.x;
					skinWeightArray[ offset_skin + 13 ] = sw4.y;
					skinWeightArray[ offset_skin + 14 ] = sw4.z;
					skinWeightArray[ offset_skin + 15 ] = sw4.w;

					// indices
					
					si1 = obj_skinIndices[ face.a ];
					si2 = obj_skinIndices[ face.b ];
					si3 = obj_skinIndices[ face.c ];
					si4 = obj_skinIndices[ face.d ];

					skinIndexArray[ offset_skin ]     = si1.x;
					skinIndexArray[ offset_skin + 1 ] = si1.y;
					skinIndexArray[ offset_skin + 2 ] = si1.z;
					skinIndexArray[ offset_skin + 3 ] = si1.w;

					skinIndexArray[ offset_skin + 4 ] = si2.x;
					skinIndexArray[ offset_skin + 5 ] = si2.y;
					skinIndexArray[ offset_skin + 6 ] = si2.z;
					skinIndexArray[ offset_skin + 7 ] = si2.w;

					skinIndexArray[ offset_skin + 8 ]  = si3.x;
					skinIndexArray[ offset_skin + 9 ]  = si3.y;
					skinIndexArray[ offset_skin + 10 ] = si3.z;
					skinIndexArray[ offset_skin + 11 ] = si3.w;

					skinIndexArray[ offset_skin + 12 ] = si4.x;
					skinIndexArray[ offset_skin + 13 ] = si4.y;
					skinIndexArray[ offset_skin + 14 ] = si4.z;
					skinIndexArray[ offset_skin + 15 ] = si4.w;

					// vertices A
					
					sa1 = obj_skinVerticesA[ face.a ];
					sa2 = obj_skinVerticesA[ face.b ];
					sa3 = obj_skinVerticesA[ face.c ];
					sa4 = obj_skinVerticesA[ face.d ];

					skinVertexAArray[ offset_skin ]     = sa1.x;
					skinVertexAArray[ offset_skin + 1 ] = sa1.y;
					skinVertexAArray[ offset_skin + 2 ] = sa1.z;
					skinVertexAArray[ offset_skin + 3 ] = 1; // pad for faster vertex shader

					skinVertexAArray[ offset_skin + 4 ] = sa2.x;
					skinVertexAArray[ offset_skin + 5 ] = sa2.y;
					skinVertexAArray[ offset_skin + 6 ] = sa2.z;
					skinVertexAArray[ offset_skin + 7 ] = 1;

					skinVertexAArray[ offset_skin + 8 ]  = sa3.x;
					skinVertexAArray[ offset_skin + 9 ]  = sa3.y;
					skinVertexAArray[ offset_skin + 10 ] = sa3.z;
					skinVertexAArray[ offset_skin + 11 ] = 1;

					skinVertexAArray[ offset_skin + 12 ] = sa4.x;
					skinVertexAArray[ offset_skin + 13 ] = sa4.y;
					skinVertexAArray[ offset_skin + 14 ] = sa4.z;
					skinVertexAArray[ offset_skin + 15 ] = 1;

					// vertices B
					
					sb1 = obj_skinVerticesB[ face.a ];
					sb2 = obj_skinVerticesB[ face.b ];
					sb3 = obj_skinVerticesB[ face.c ];
					sb4 = obj_skinVerticesB[ face.d ];

					skinVertexBArray[ offset_skin ]     = sb1.x;
					skinVertexBArray[ offset_skin + 1 ] = sb1.y;
					skinVertexBArray[ offset_skin + 2 ] = sb1.z;
					skinVertexBArray[ offset_skin + 3 ] = 1; // pad for faster vertex shader

					skinVertexBArray[ offset_skin + 4 ] = sb2.x;
					skinVertexBArray[ offset_skin + 5 ] = sb2.y;
					skinVertexBArray[ offset_skin + 6 ] = sb2.z;
					skinVertexBArray[ offset_skin + 7 ] = 1;

					skinVertexBArray[ offset_skin + 8 ]  = sb3.x;
					skinVertexBArray[ offset_skin + 9 ]  = sb3.y;
					skinVertexBArray[ offset_skin + 10 ] = sb3.z;
					skinVertexBArray[ offset_skin + 11 ] = 1;

					skinVertexBArray[ offset_skin + 12 ]  = sb4.x;
					skinVertexBArray[ offset_skin + 13 ]  = sb4.y;
					skinVertexBArray[ offset_skin + 14 ] = sb4.z;
					skinVertexBArray[ offset_skin + 15 ] = 1;

					offset_skin += 16;					
					
				}
				
764 765 766 767 768
				if ( dirtyColors && obj_colors.length ) {

					c1 = obj_colors[ face.a ];
					c2 = obj_colors[ face.b ];
					c3 = obj_colors[ face.c ];
769
					c4 = obj_colors[ face.d ];
770 771 772 773 774 775 776 777 778 779 780 781

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

783 784 785 786 787 788 789 790
					colorArray[ offset_color + 9 ]  = c4.r;
					colorArray[ offset_color + 10 ] = c4.g;
					colorArray[ offset_color + 11 ] = c4.b;
					
					offset_color += 12;

				}	
				
791
				if ( dirtyTangents && geometry.hasTangents ) {
792

793 794 795 796
					t1 = vertices[ face.a ].tangent;
					t2 = vertices[ face.b ].tangent;
					t3 = vertices[ face.c ].tangent;
					t4 = vertices[ face.d ].tangent;
797

798 799 800 801
					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 已提交
802

803 804 805 806
					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 已提交
807

808 809 810 811
					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 已提交
812

813 814 815 816
					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 已提交
817

818
					offset_tangent += 16;
M
Mr.doob 已提交
819

820
				}
M
Mr.doob 已提交
821

822
				if( dirtyNormals ) {
M
Mr.doob 已提交
823

824
					if ( vertexNormals.length == 4 && needsSmoothNormals ) {
825

826
						for ( i = 0; i < 4; i ++ ) {
827

828
							vn = vertexNormals[ i ];
M
Mr.doob 已提交
829

830 831 832
							normalArray[ offset_normal ]     = vn.x;
							normalArray[ offset_normal + 1 ] = vn.y;
							normalArray[ offset_normal + 2 ] = vn.z;
M
Mr.doob 已提交
833

834
							offset_normal += 3;
M
Mr.doob 已提交
835

836
						}
M
Mr.doob 已提交
837

838
					} else {
839

840
						for ( i = 0; i < 4; i ++ ) {
841

842 843 844
							normalArray[ offset_normal ]     = faceNormal.x;
							normalArray[ offset_normal + 1 ] = faceNormal.y;
							normalArray[ offset_normal + 2 ] = faceNormal.z;
M
Mr.doob 已提交
845

846
							offset_normal += 3;
M
Mr.doob 已提交
847

848
						}
M
Mr.doob 已提交
849 850

					}
M
Mr.doob 已提交
851

852 853
				}

854
				if ( dirtyUvs && uv ) {
855

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

858
						uvi = uv[ i ];
M
Mr.doob 已提交
859

860 861
						uvArray[ offset_uv ]     = uvi.u;
						uvArray[ offset_uv + 1 ] = uvi.v;
M
Mr.doob 已提交
862

863
						offset_uv += 2;
M
Mr.doob 已提交
864

M
Mr.doob 已提交
865
					}
866 867

				}
868 869 870 871 872 873 874 875 876 877 878 879 880 881 882
				
				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 已提交
883

884
				if( dirtyElements ) {
M
Mr.doob 已提交
885

886 887 888
					faceArray[ offset_face ]     = vertexIndex;
					faceArray[ offset_face + 1 ] = vertexIndex + 1;
					faceArray[ offset_face + 2 ] = vertexIndex + 2;
M
Mr.doob 已提交
889

890 891 892
					faceArray[ offset_face + 3 ] = vertexIndex;
					faceArray[ offset_face + 4 ] = vertexIndex + 2;
					faceArray[ offset_face + 5 ] = vertexIndex + 3;
M
Mr.doob 已提交
893

894
					offset_face += 6;
M
Mr.doob 已提交
895

896 897
					lineArray[ offset_line ]     = vertexIndex;
					lineArray[ offset_line + 1 ] = vertexIndex + 1;
M
Mr.doob 已提交
898

899
					lineArray[ offset_line + 2 ] = vertexIndex;
900
					lineArray[ offset_line + 3 ] = vertexIndex + 3;
M
Mr.doob 已提交
901

902 903
					lineArray[ offset_line + 4 ] = vertexIndex + 1;
					lineArray[ offset_line + 5 ] = vertexIndex + 2;
M
Mr.doob 已提交
904

905 906
					lineArray[ offset_line + 6 ] = vertexIndex + 2;
					lineArray[ offset_line + 7 ] = vertexIndex + 3;
M
Mr.doob 已提交
907

908
					offset_line += 8;
M
Mr.doob 已提交
909

910
					vertexIndex += 4;
M
Mr.doob 已提交
911

912
				}
M
Mr.doob 已提交
913

914
			}
M
Mr.doob 已提交
915

916 917
		}

918
		if ( dirtyVertices ) {
M
Mr.doob 已提交
919

920 921
			_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryChunk.__webGLVertexBuffer );
			_gl.bufferData( _gl.ARRAY_BUFFER, vertexArray, hint );
M
Mr.doob 已提交
922

923
		}
M
Mr.doob 已提交
924

925 926 927 928 929 930 931
		if ( dirtyColors && obj_colors.length ) {

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

		}
		
932
		if ( dirtyNormals ) {
M
Mr.doob 已提交
933

934 935
			_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryChunk.__webGLNormalBuffer );
			_gl.bufferData( _gl.ARRAY_BUFFER, normalArray, hint );
M
Mr.doob 已提交
936

937 938
		}

939
		if ( dirtyTangents && geometry.hasTangents ) {
940

941
			_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryChunk.__webGLTangentBuffer );
942
			_gl.bufferData( _gl.ARRAY_BUFFER, tangentArray, hint );
M
Mr.doob 已提交
943

944
		}
945

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

948
			_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryChunk.__webGLUVBuffer );
949
			_gl.bufferData( _gl.ARRAY_BUFFER, uvArray, hint );
M
Mr.doob 已提交
950

951
		}
M
Mr.doob 已提交
952

953 954 955 956 957 958 959
		if ( dirtyUvs && offset_uv2 > 0 ) {

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

		}

960
		if( dirtyElements ) {
M
Mr.doob 已提交
961

962 963
			_gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, geometryChunk.__webGLFaceBuffer );
			_gl.bufferData( _gl.ELEMENT_ARRAY_BUFFER, faceArray, hint );
964

965 966
			_gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, geometryChunk.__webGLLineBuffer );
			_gl.bufferData( _gl.ELEMENT_ARRAY_BUFFER, lineArray, hint );
M
Mr.doob 已提交
967

968
		}
A
alteredq 已提交
969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984
		
		if( offset_skin > 0 ) {
			
			_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryChunk.__webGLSkinVertexABuffer );
			_gl.bufferData( _gl.ARRAY_BUFFER, skinVertexAArray, hint );

			_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryChunk.__webGLSkinVertexBBuffer );
			_gl.bufferData( _gl.ARRAY_BUFFER, skinVertexBArray, hint );

			_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryChunk.__webGLSkinIndicesBuffer );
			_gl.bufferData( _gl.ARRAY_BUFFER, skinIndexArray, hint );

			_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryChunk.__webGLSkinWeightsBuffer );
			_gl.bufferData( _gl.ARRAY_BUFFER, skinWeightArray, hint );
			
		}
985 986

	};
987

988
	function setLineBuffers ( geometry, hint ) {
M
Mr.doob 已提交
989

990
		var v, c, vertex, offset,
991
			vertices = geometry.vertices,
992
			colors = geometry.colors,
993
			vl = vertices.length,
994
			cl = colors.length,
M
Mr.doob 已提交
995 996

			vertexArray = geometry.__vertexArray,
997
			colorArray = geometry.__colorArray,
998 999
		
			dirtyVertices = geometry.__dirtyVertices, 
1000
			dirtyColors = geometry.__dirtyColors;
M
Mr.doob 已提交
1001

1002
		if ( dirtyVertices ) {
M
Mr.doob 已提交
1003

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

1006
				vertex = vertices[ v ].position;
M
Mr.doob 已提交
1007

1008
				offset = v * 3;
M
Mr.doob 已提交
1009

1010 1011 1012
				vertexArray[ offset ]     = vertex.x;
				vertexArray[ offset + 1 ] = vertex.y;
				vertexArray[ offset + 2 ] = vertex.z;
M
Mr.doob 已提交
1013

1014 1015
			}

A
alteredq 已提交
1016 1017 1018
			_gl.bindBuffer( _gl.ARRAY_BUFFER, geometry.__webGLVertexBuffer );
			_gl.bufferData( _gl.ARRAY_BUFFER, vertexArray, hint );

1019
		}
M
Mr.doob 已提交
1020

1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039
		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 );

		}

1040
	};
M
Mr.doob 已提交
1041

1042
	function setParticleBuffers ( geometry, hint, object, camera ) {
1043

A
alteredq 已提交
1044
		var v, c, vertex, offset,
1045 1046 1047
			vertices = geometry.vertices,
			vl = vertices.length,

A
alteredq 已提交
1048 1049 1050
			colors = geometry.colors,
			cl = colors.length,
		
1051
			vertexArray = geometry.__vertexArray,
A
alteredq 已提交
1052
			colorArray = geometry.__colorArray,
1053
		
1054 1055 1056 1057 1058
			sortArray = geometry.__sortArray,
		
			dirtyVertices = geometry.__dirtyVertices,
			dirtyElements = geometry.__dirtyElements,
			dirtyColors = geometry.__dirtyColors;
1059

1060 1061
		if ( object.sortParticles ) {
		
1062
			_projScreenMatrix.multiplySelf( object.globalMatrix );
1063
			
1064 1065 1066
			for ( v = 0; v < vl; v++ ) {

				vertex = vertices[ v ].position;
1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080
				
				_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;
				
1081
				offset = v * 3;
1082
				
1083 1084 1085
				vertexArray[ offset ]     = vertex.x;
				vertexArray[ offset + 1 ] = vertex.y;
				vertexArray[ offset + 2 ] = vertex.z;
1086
				
1087 1088
			}
			
A
alteredq 已提交
1089 1090 1091 1092 1093 1094 1095 1096 1097 1098
			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;
				
1099
			}
A
alteredq 已提交
1100 1101
			
			
1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116
		} 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;

				}
1117 1118

			}
A
alteredq 已提交
1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131
			
			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;

1132
				}
A
alteredq 已提交
1133 1134
				
			}
1135 1136

		}
1137
		
A
alteredq 已提交
1138 1139 1140 1141 1142 1143 1144 1145
		if ( dirtyVertices || object.sortParticles ) {
		
			_gl.bindBuffer( _gl.ARRAY_BUFFER, geometry.__webGLVertexBuffer );
			_gl.bufferData( _gl.ARRAY_BUFFER, vertexArray, hint );
			
		}
		
		if ( dirtyColors || object.sortParticles ) {
1146
			
A
alteredq 已提交
1147 1148
			_gl.bindBuffer( _gl.ARRAY_BUFFER, geometry.__webGLColorBuffer );
			_gl.bufferData( _gl.ARRAY_BUFFER, colorArray, hint );
1149
		
A
alteredq 已提交
1150
		}
1151
		
1152
	};
M
Mr.doob 已提交
1153

M
Mr.doob 已提交
1154
	function setMaterialShaders( material, shaders ) {
1155

M
Mr.doob 已提交
1156 1157
		material.fragment_shader = shaders.fragment_shader;
		material.vertex_shader = shaders.vertex_shader;
1158
		material.uniforms = Uniforms.clone( shaders.uniforms );
1159

M
Mr.doob 已提交
1160
	};
1161

A
alteredq 已提交
1162
	function refreshUniformsCommon( uniforms, material ) {
M
Mr.doob 已提交
1163

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

1167
		// pure color
A
alteredq 已提交
1168
		//uniforms.color.value.setHex( material.color.hex );
M
Mr.doob 已提交
1169

A
alteredq 已提交
1170 1171
		uniforms.opacity.value = material.opacity;
		uniforms.map.texture = material.map;
1172
		
A
alteredq 已提交
1173
		uniforms.light_map.texture = material.light_map;
1174

A
alteredq 已提交
1175 1176 1177 1178 1179
		uniforms.env_map.texture = material.env_map;
		uniforms.reflectivity.value = material.reflectivity;
		uniforms.refraction_ratio.value = material.refraction_ratio;
		uniforms.combine.value = material.combine;
		uniforms.useRefract.value = material.env_map && material.env_map.mapping instanceof THREE.CubeRefractionMapping;
1180

1181
	};
1182

A
alteredq 已提交
1183
	function refreshUniformsLine( uniforms, material ) {
1184

A
alteredq 已提交
1185 1186
		uniforms.diffuse.value.setRGB( material.color.r * material.opacity, material.color.g * material.opacity, material.color.b * material.opacity );
		uniforms.opacity.value = material.opacity;
1187 1188

	};
M
Mr.doob 已提交
1189

A
alteredq 已提交
1190
	function refreshUniformsParticle( uniforms, material ) {
1191

A
alteredq 已提交
1192 1193 1194 1195
		uniforms.psColor.value.setRGB( material.color.r * material.opacity, material.color.g * material.opacity, material.color.b * material.opacity );
		uniforms.opacity.value = material.opacity;
		uniforms.size.value = material.size;
		uniforms.map.texture = material.map;
1196

A
alteredq 已提交
1197 1198 1199 1200 1201
	};
	
	function refreshUniformsFog( uniforms, fog ) {
	
		uniforms.fogColor.value.setHex( fog.color.hex );
1202

A
alteredq 已提交
1203
		if ( fog instanceof THREE.Fog ) {
1204

A
alteredq 已提交
1205 1206
			uniforms.fogNear.value = fog.near;
			uniforms.fogFar.value = fog.far;
1207

A
alteredq 已提交
1208
		} else if ( fog instanceof THREE.FogExp2 ) {
1209

A
alteredq 已提交
1210
			uniforms.fogDensity.value = fog.density;
1211 1212

		}
A
alteredq 已提交
1213
	
1214 1215
	};

A
alteredq 已提交
1216
	function refreshUniformsPhong( uniforms, material ) {
M
Mr.doob 已提交
1217

A
alteredq 已提交
1218 1219 1220 1221 1222
		//uniforms.ambient.value.setHex( material.ambient.hex );
		//uniforms.specular.value.setHex( material.specular.hex );
		uniforms.ambient.value.setRGB( material.ambient.r, material.ambient.g, material.ambient.b );
		uniforms.specular.value.setRGB( material.specular.r, material.specular.g, material.specular.b );
		uniforms.shininess.value = material.shininess;
M
Mr.doob 已提交
1223

1224
	};
M
Mr.doob 已提交
1225 1226


A
alteredq 已提交
1227
	function refreshUniformsLights( uniforms, lights ) {
M
Mr.doob 已提交
1228

A
alteredq 已提交
1229 1230 1231 1232 1233 1234
		uniforms.enableLighting.value = lights.directional.length + lights.point.length;
		uniforms.ambientLightColor.value = lights.ambient;
		uniforms.directionalLightColor.value = lights.directional.colors;
		uniforms.directionalLightDirection.value = lights.directional.positions;
		uniforms.pointLightColor.value = lights.point.colors;
		uniforms.pointLightPosition.value = lights.point.positions;
M
Mr.doob 已提交
1235

A
alteredq 已提交
1236
	};
M
Mr.doob 已提交
1237

1238
	this.initMaterial = function( material, lights, fog ) {
M
Mr.doob 已提交
1239

A
alteredq 已提交
1240 1241 1242
		var u, identifiers, parameters, maxLightCount;
		
		if ( material instanceof THREE.MeshDepthMaterial ) {
1243

A
alteredq 已提交
1244
			setMaterialShaders( material, THREE.ShaderLib[ 'depth' ] );
1245

A
alteredq 已提交
1246
		} else if ( material instanceof THREE.MeshNormalMaterial ) {
1247

A
alteredq 已提交
1248
			setMaterialShaders( material, THREE.ShaderLib[ 'normal' ] );
1249

A
alteredq 已提交
1250
		} else if ( material instanceof THREE.MeshBasicMaterial ) {
1251

A
alteredq 已提交
1252
			setMaterialShaders( material, THREE.ShaderLib[ 'basic' ] );
1253

A
alteredq 已提交
1254
		} else if ( material instanceof THREE.MeshLambertMaterial ) {
M
Mr.doob 已提交
1255

A
alteredq 已提交
1256
			setMaterialShaders( material, THREE.ShaderLib[ 'lambert' ] );
M
Mr.doob 已提交
1257

A
alteredq 已提交
1258
		} else if ( material instanceof THREE.MeshPhongMaterial ) {
M
Mr.doob 已提交
1259

A
alteredq 已提交
1260
			setMaterialShaders( material, THREE.ShaderLib[ 'phong' ] );
M
Mr.doob 已提交
1261

A
alteredq 已提交
1262
		} else if ( material instanceof THREE.LineBasicMaterial ) {
M
Mr.doob 已提交
1263

A
alteredq 已提交
1264
			setMaterialShaders( material, THREE.ShaderLib[ 'basic' ] );
1265

A
alteredq 已提交
1266 1267 1268 1269 1270
		} else if ( material instanceof THREE.ParticleBasicMaterial ) {
			
			setMaterialShaders( material, THREE.ShaderLib[ 'particle_basic' ] );
			
		}
1271

A
alteredq 已提交
1272 1273
		// heuristics to create shader parameters according to lights in the scene
		// (not to blow over maxLights budget)
M
Mr.doob 已提交
1274

A
alteredq 已提交
1275
		maxLightCount = allocateLights( lights, 4 );
M
Mr.doob 已提交
1276

A
alteredq 已提交
1277
		parameters = { fog: fog, map: material.map, env_map: material.env_map, light_map: material.light_map, vertex_colors: material.vertex_colors,
1278
					   skinning: material.skinning,
A
alteredq 已提交
1279
					   maxDirLights: maxLightCount.directional, maxPointLights: maxLightCount.point };
1280
		
A
alteredq 已提交
1281
		material.program = buildProgram( material.fragment_shader, material.vertex_shader, parameters );
M
Mr.doob 已提交
1282

A
alteredq 已提交
1283
		identifiers = [ 'viewMatrix', 'modelViewMatrix', 'projectionMatrix', 'normalMatrix', 'objectMatrix', 'cameraPosition', 
1284
						'cameraInverseMatrix', 'uBoneGlobalMatrices'
A
alteredq 已提交
1285
						];
A
alteredq 已提交
1286
		for( u in material.uniforms ) {
1287

A
alteredq 已提交
1288
			identifiers.push(u);
M
Mr.doob 已提交
1289

A
alteredq 已提交
1290
		}
M
Mr.doob 已提交
1291

A
alteredq 已提交
1292
		cacheUniformLocations( material.program, identifiers );
A
alteredq 已提交
1293 1294
		cacheAttributeLocations( material.program, [ "position", "normal", "uv", "uv2", "tangent", "color", 
													 "skinVertexA", "skinVertexB", "skinIndex", "skinWeight" ] );
A
alteredq 已提交
1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313
		
		var attributes = material.program.attributes;
		
		_gl.enableVertexAttribArray( attributes.position );
		
		if ( attributes.color >= 0 ) 	_gl.enableVertexAttribArray( attributes.color );
		if ( attributes.normal >= 0 ) 	_gl.enableVertexAttribArray( attributes.normal );	
		if ( attributes.tangent >= 0 ) 	_gl.enableVertexAttribArray( attributes.tangent );
		
		if ( material.skinning && 
			 attributes.skinVertexA >=0 && attributes.skinVertexB >= 0 && 
			 attributes.skinIndex >= 0 && attributes.skinWeight >= 0 ) {
			
			_gl.enableVertexAttribArray( attributes.skinVertexA );
			_gl.enableVertexAttribArray( attributes.skinVertexB );
			_gl.enableVertexAttribArray( attributes.skinIndex );
			_gl.enableVertexAttribArray( attributes.skinWeight );
			
		}
M
Mr.doob 已提交
1314

1315 1316
	};
	
A
alteredq 已提交
1317
	function setProgram ( camera, lights, fog, material, object ) {
A
alteredq 已提交
1318
		
A
alteredq 已提交
1319
		if ( !material.program ) _this.initMaterial( material, lights, fog );
M
Mr.doob 已提交
1320

A
alteredq 已提交
1321 1322 1323
		var program = material.program, 
			p_uniforms = program.uniforms,
			m_uniforms = material.uniforms;
1324

M
Mr.doob 已提交
1325
		if( program != _oldProgram ) {
M
Mr.doob 已提交
1326

M
Mr.doob 已提交
1327 1328
			_gl.useProgram( program );
			_oldProgram = program;
A
alteredq 已提交
1329 1330
			
			_gl.uniformMatrix4fv( p_uniforms.projectionMatrix, false, _projectionMatrixArray );
M
Mr.doob 已提交
1331

M
Mr.doob 已提交
1332
		}
1333
		
A
alteredq 已提交
1334 1335 1336 1337 1338
		// refresh uniforms common to several materials
		
		if ( fog && ( 
			 material instanceof THREE.MeshBasicMaterial ||
			 material instanceof THREE.MeshLambertMaterial ||
1339
			 material instanceof THREE.MeshPhongMaterial ||
A
alteredq 已提交
1340 1341 1342
			 material instanceof THREE.LineBasicMaterial ||
			 material instanceof THREE.ParticleBasicMaterial )
			) {
1343
			
A
alteredq 已提交
1344
			refreshUniformsFog( m_uniforms, fog );
1345
			
A
alteredq 已提交
1346
		}		
M
Mr.doob 已提交
1347

M
Mr.doob 已提交
1348
		if ( material instanceof THREE.MeshPhongMaterial ||
1349
			 material instanceof THREE.MeshLambertMaterial ) {
1350

A
alteredq 已提交
1351 1352
			setupLights( program, lights );
			refreshUniformsLights( m_uniforms, _this.lights );
M
Mr.doob 已提交
1353 1354 1355

		}

1356 1357 1358
		if ( material instanceof THREE.MeshBasicMaterial ||
			 material instanceof THREE.MeshLambertMaterial ||
			 material instanceof THREE.MeshPhongMaterial ) {
M
Mr.doob 已提交
1359

A
alteredq 已提交
1360
			refreshUniformsCommon( m_uniforms, material );
M
Mr.doob 已提交
1361

A
alteredq 已提交
1362
		}
M
Mr.doob 已提交
1363

A
alteredq 已提交
1364 1365
		// refresh single material specific uniforms
		
1366
		if ( material instanceof THREE.LineBasicMaterial ) {
M
Mr.doob 已提交
1367

A
alteredq 已提交
1368
			refreshUniformsLine( m_uniforms, material );
1369
			
A
alteredq 已提交
1370
		} else if ( material instanceof THREE.ParticleBasicMaterial ) {
1371

A
alteredq 已提交
1372
			refreshUniformsParticle( m_uniforms, material );
1373
			
A
alteredq 已提交
1374
		} else if ( material instanceof THREE.MeshPhongMaterial ) {
M
Mr.doob 已提交
1375

A
alteredq 已提交
1376
			refreshUniformsPhong( m_uniforms, material );
M
Mr.doob 已提交
1377

A
alteredq 已提交
1378
		} else if ( material instanceof THREE.MeshDepthMaterial ) {
M
Mr.doob 已提交
1379

A
alteredq 已提交
1380 1381 1382 1383 1384
			m_uniforms.mNear.value = camera.near;
			m_uniforms.mFar.value = camera.far;
			m_uniforms.opacity.value = material.opacity;
			
		} else if ( material instanceof THREE.MeshNormalMaterial ) {
1385

A
alteredq 已提交
1386
			m_uniforms.opacity.value = material.opacity;
1387
			
1388
		}
A
alteredq 已提交
1389 1390 1391 1392 1393
		
		// load common uniforms
		
		loadUniformsGeneric( program, m_uniforms );
		loadUniformsMatrices( p_uniforms, object );
1394

A
alteredq 已提交
1395 1396 1397 1398 1399 1400 1401 1402
		// load material specific uniforms
		// (shader material also gets them for the sake of genericity)
		
		if ( material instanceof THREE.MeshShaderMaterial ||
			 material instanceof THREE.MeshPhongMaterial ||
			 material.env_map ) {
			
			_gl.uniform3f( p_uniforms.cameraPosition, camera.position.x, camera.position.y, camera.position.z );
1403 1404 1405
			
		}
		
A
alteredq 已提交
1406
		if ( material instanceof THREE.MeshShaderMaterial ||
A
alteredq 已提交
1407
			 material.env_map ||
1408
			 material.skinning ) {
A
alteredq 已提交
1409 1410 1411 1412
				 
			_gl.uniformMatrix4fv( p_uniforms.objectMatrix, false, object._objectMatrixArray );
		
		}
1413

A
alteredq 已提交
1414 1415
		if ( material instanceof THREE.MeshPhongMaterial ||
			 material instanceof THREE.MeshLambertMaterial ||
A
alteredq 已提交
1416
			 material instanceof THREE.MeshShaderMaterial ||
1417 1418
			 material.skinning ) {

A
alteredq 已提交
1419 1420 1421 1422
			_gl.uniformMatrix4fv( p_uniforms.viewMatrix, false, _viewMatrixArray );
			
		}
		
1423
		if ( material.skinning ) {
A
alteredq 已提交
1424
			
1425
			loadUniformsSkinning( p_uniforms, object );
A
alteredq 已提交
1426 1427 1428
			
		}
		
A
alteredq 已提交
1429 1430 1431
		return program;
		
	};
1432
		
A
alteredq 已提交
1433
	function renderBuffer( camera, lights, fog, material, geometryChunk, object ) {
A
alteredq 已提交
1434 1435 1436

		var program, attributes, linewidth, primitives;

A
alteredq 已提交
1437
		program = setProgram( camera, lights, fog, material, object );
A
alteredq 已提交
1438
		
1439
		attributes = program.attributes;
M
Mr.doob 已提交
1440

1441
		// vertices
M
Mr.doob 已提交
1442

M
Mr.doob 已提交
1443
		_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryChunk.__webGLVertexBuffer );
1444
		_gl.vertexAttribPointer( attributes.position, 3, _gl.FLOAT, false, 0, 0 );
1445

A
alteredq 已提交
1446 1447 1448 1449 1450
		// colors

		if ( attributes.color >= 0 ) {

			_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryChunk.__webGLColorBuffer );
A
alteredq 已提交
1451
			_gl.vertexAttribPointer( attributes.color, 3, _gl.FLOAT, false, 0, 0 );			
A
alteredq 已提交
1452 1453 1454

		}

1455
		// normals
M
Mr.doob 已提交
1456

1457
		if ( attributes.normal >= 0 ) {
1458

1459
			_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryChunk.__webGLNormalBuffer );
A
alteredq 已提交
1460
			_gl.vertexAttribPointer( attributes.normal, 3, _gl.FLOAT, false, 0, 0 );			
1461

1462
		}
1463

1464 1465 1466
		// tangents

		if ( attributes.tangent >= 0 ) {
1467

1468 1469
			_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryChunk.__webGLTangentBuffer );
			_gl.vertexAttribPointer( attributes.tangent, 4, _gl.FLOAT, false, 0, 0 );
1470

1471
		}
1472

1473
		// uvs
M
Mr.doob 已提交
1474

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

1477
			if ( geometryChunk.__webGLUVBuffer ) {
1478

1479
				_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryChunk.__webGLUVBuffer );
1480
				_gl.vertexAttribPointer( attributes.uv, 2, _gl.FLOAT, false, 0, 0 );
1481

1482
				_gl.enableVertexAttribArray( attributes.uv );
1483

1484
			} else {
1485

1486
				_gl.disableVertexAttribArray( attributes.uv );
M
Mr.doob 已提交
1487

1488
			}
1489 1490 1491

		}

1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508
		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 );

			}

		}

A
alteredq 已提交
1509 1510 1511
		if ( material.skinning && 
			 attributes.skinVertexA >=0 && attributes.skinVertexB >= 0 && 
			 attributes.skinIndex >= 0 && attributes.skinWeight >= 0 ) {
A
alteredq 已提交
1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526
			
			_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryChunk.__webGLSkinVertexABuffer );
			_gl.vertexAttribPointer( attributes.skinVertexA, 4, _gl.FLOAT, false, 0, 0 );

			_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryChunk.__webGLSkinVertexBBuffer );
			_gl.vertexAttribPointer( attributes.skinVertexB, 4, _gl.FLOAT, false, 0, 0 );

			_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryChunk.__webGLSkinIndicesBuffer );
			_gl.vertexAttribPointer( attributes.skinIndex, 4, _gl.FLOAT, false, 0, 0 );

			_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryChunk.__webGLSkinWeightsBuffer );
			_gl.vertexAttribPointer( attributes.skinWeight, 4, _gl.FLOAT, false, 0, 0 );
			
		}
		
1527
		// render mesh
M
Mr.doob 已提交
1528

1529
		if ( object instanceof THREE.Mesh ) {
1530

1531 1532 1533
			// wireframe
			
			if ( material.wireframe ) {
M
Mr.doob 已提交
1534

1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551
				_gl.lineWidth( material.wireframe_linewidth );
				_gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, geometryChunk.__webGLLineBuffer );
				_gl.drawElements( _gl.LINES, geometryChunk.__webGLLineCount, _gl.UNSIGNED_SHORT, 0 );
			
			// triangles
			
			} else {
				
				_gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, geometryChunk.__webGLFaceBuffer );
				_gl.drawElements( _gl.TRIANGLES, geometryChunk.__webGLFaceCount, _gl.UNSIGNED_SHORT, 0 );
				
			}
		
		// render lines
		
		} else if ( object instanceof THREE.Line ) {
			
1552
			primitives = ( object.type == THREE.LineStrip ) ? _gl.LINE_STRIP : _gl.LINES;
M
Mr.doob 已提交
1553

1554
			_gl.lineWidth( material.linewidth );
1555
			_gl.drawArrays( primitives, 0, geometryChunk.__webGLLineCount );
1556
		
1557
		// render particles
1558 1559
		
		} else if ( object instanceof THREE.ParticleSystem ) {
1560
			
1561
			_gl.drawArrays( _gl.POINTS, 0, geometryChunk.__webGLParticleCount );
1562
			
1563 1564 1565 1566
		}

	};

A
alteredq 已提交
1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595
	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;
		
	};
	
1596 1597
	function setObjectFaces( object ) {
		
1598
		if ( _oldDoubleSided != object.doubleSided ) {
A
alteredq 已提交
1599
			
1600
			if( object.doubleSided ) {
A
alteredq 已提交
1601
				
1602
				_gl.disable( _gl.CULL_FACE );
1603

1604
			} else {
1605

A
alteredq 已提交
1606 1607 1608
				_gl.enable( _gl.CULL_FACE );
			
			}
1609 1610 1611 1612 1613 1614 1615
			
			_oldDoubleSided = object.doubleSided;
		
		}
		
		if ( _oldFlipSided != object.flipSided ) {
		
1616 1617 1618 1619
			if( object.flipSided ) {

				_gl.frontFace( _gl.CW );

1620
			} else {
1621 1622 1623 1624

				_gl.frontFace( _gl.CCW );

			}
1625 1626
			
			_oldFlipSided = object.flipSided;
1627 1628 1629 1630 1631

		}
		
	};
	
A
alteredq 已提交
1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651
	function setDepthTest( test ) {
		
		if ( _oldDepth != test ) {

			if( test ) {
				
				_gl.enable( _gl.DEPTH_TEST );
				
			} else {
				
				_gl.disable( _gl.DEPTH_TEST );
				
			}
			
			_oldDepth = test;

		}
		
	};
	
1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673
	function computeFrustum( m ) {

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

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

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

		}

	};
	
	function isInFrustum( object ) {

1674
		var distance, matrix = object.globalMatrix,
1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686
		radius = - object.geometry.boundingSphere.radius * Math.max( object.scale.x, Math.max( object.scale.y, object.scale.z ) );

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

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

		}

		return true;

	};
1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763

	function addToFixedArray( where, what ) {
		
		where.list[ where.count ] = what;
		where.count += 1;
	
	};
	
	function unrollImmediateBufferMaterials( globject ) {
		
		var i, l, m, ml, material,
			object = globject.object,
			opaque = globject.opaque,
			transparent = globject.transparent;

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

			material = object.materials[ m ];
			
			if ( ( material.opacity && material.opacity < 1.0 ) || material.blending != THREE.NormalBlending )
				addToFixedArray( transparent, material );
			else
				addToFixedArray( opaque, material );
			
		}
		
	};
	
	function unrollBufferMaterials( globject ) {
		
		var i, l, m, ml, material, meshMaterial,
			object = globject.object,
			buffer = globject.buffer,
			opaque = globject.opaque,
			transparent = globject.transparent;

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

			meshMaterial = object.materials[ m ];

			if ( meshMaterial instanceof THREE.MeshFaceMaterial ) {

				for ( i = 0, l = buffer.materials.length; i < l; i++ ) {

					material = buffer.materials[ i ];
					
					if ( material ) {
						
						if ( ( material.opacity && material.opacity < 1.0 ) || material.blending != THREE.NormalBlending )
							addToFixedArray( transparent, material );
						else
							addToFixedArray( opaque, material );
						
					}

				}

			} else {

				material = meshMaterial;
				
				if ( ( material.opacity && material.opacity < 1.0 ) || material.blending != THREE.NormalBlending )
					addToFixedArray( transparent, material );
				else
					addToFixedArray( opaque, material );

			}

		}
		
	};
1764
	
1765 1766
	
	function painterSort( a, b ) {
1767

1768
		return b.z - a.z;
1769 1770 1771

	};
	
A
alteredq 已提交
1772
	this.render = function( scene, camera, renderTarget, clear ) {
1773
		
A
alteredq 已提交
1774
		var i, program, opaque, transparent, material,
1775
			o, ol, oil, webGLObject, object, buffer,
A
alteredq 已提交
1776
			lights = scene.lights,
1777 1778
			fog = scene.fog,
			ol;
1779
		
1780
		camera.autoUpdateMatrix && camera.update();
1781
		
1782
		camera.globalMatrix.flattenToArray( _viewMatrixArray );
1783
		camera.projectionMatrix.flattenToArray( _projectionMatrixArray );
A
alteredq 已提交
1784
		camera.inverseMatrix.flattenToArray( _cameraInverseMatrixArray );
M
Mr.doob 已提交
1785

1786
		_projScreenMatrix.multiply( camera.projectionMatrix, camera.globalMatrix );
1787 1788
		computeFrustum( _projScreenMatrix );
		
A
alteredq 已提交
1789
		if( THREE.AnimationHandler ) THREE.AnimationHandler.update();
A
alteredq 已提交
1790
		
A
alteredq 已提交
1791
		scene.update( undefined, false, camera );
1792
		
1793
		this.initWebGLObjects( scene, camera );
M
Mr.doob 已提交
1794

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

1797
		if ( this.autoClear ) {
M
Mr.doob 已提交
1798

1799
			this.clear();
M
Mr.doob 已提交
1800

1801 1802
		}

1803
		// set matrices
1804 1805
		
		ol = scene.__webGLObjects.length;
A
alteredq 已提交
1806
	
1807
		for ( o = 0; o < ol; o++ ) {
M
Mr.doob 已提交
1808

M
Mr.doob 已提交
1809
			webGLObject = scene.__webGLObjects[ o ];
M
Mr.doob 已提交
1810
			object = webGLObject.object;
M
Mr.doob 已提交
1811

1812
			if ( object.visible ) {				
1813 1814 1815

				if ( ! ( object instanceof THREE.Mesh ) || isInFrustum( object ) ) {
					
1816
					object.globalMatrix.flattenToArray( object._objectMatrixArray );
1817 1818 1819 1820 1821 1822 1823
					
					setupMatrices( object, camera );
					
					unrollBufferMaterials( webGLObject );
					
					webGLObject.render = true;
					
1824 1825 1826 1827 1828 1829 1830 1831
					if ( this.sortObjects ) {
					
						_vector3.copy( object.position );
						_projScreenMatrix.multiplyVector3( _vector3 );

						webGLObject.z = _vector3.z;
					
					}
A
alteredq 已提交
1832
				
1833 1834 1835 1836 1837
				} else {
					
					webGLObject.render = false;
					
				}
1838
				
1839 1840 1841
			} else {
				
				webGLObject.render = false;
1842

1843 1844 1845 1846
			}
		
		}
		
1847 1848 1849 1850 1851 1852
		if ( this.sortObjects ) {
			
			scene.__webGLObjects.sort( painterSort );
			
		}
		
1853 1854 1855
		oil = scene.__webGLObjectsImmediate.length;
		
		for ( o = 0; o < oil; o++ ) {
1856
		
1857 1858
			webGLObject = scene.__webGLObjectsImmediate[ o ];
			object = webGLObject.object;
1859 1860 1861
			
			if ( object.visible ) {
			
A
alteredq 已提交
1862 1863
				if( object.autoUpdateMatrix ) { 
				
1864
					object.globalMatrix.flattenToArray( object._objectMatrixArray );
A
alteredq 已提交
1865 1866 1867
				
				}
				
1868
				setupMatrices( object, camera );
1869 1870
				
				unrollImmediateBufferMaterials( webGLObject );
1871 1872
			
			}
A
alteredq 已提交
1873
		
1874
		}
A
alteredq 已提交
1875

1876 1877
		// opaque pass

1878 1879
		setBlending( THREE.NormalBlending );
		
1880
		for ( o = 0; o < ol; o++ ) {
M
Mr.doob 已提交
1881

1882 1883
			webGLObject = scene.__webGLObjects[ o ];

1884 1885 1886 1887
			if ( webGLObject.render ) {
				
				object = webGLObject.object;
				buffer = webGLObject.buffer;
1888
				opaque = webGLObject.opaque;
1889 1890
				
				setObjectFaces( object );
1891 1892 1893 1894 1895
				
				for( i = 0; i < opaque.count; i++ ) {
					
					material = opaque.list[ i ];
					
A
alteredq 已提交
1896 1897
					setDepthTest( material.depth_test );
					renderBuffer( camera, lights, fog, material, buffer, object );
1898 1899
				
				}
1900 1901 1902 1903 1904

			}

		}

A
alteredq 已提交
1905 1906
		// opaque pass (immediate simulator)
		
1907
		for ( o = 0; o < oil; o++ ) {
A
alteredq 已提交
1908
			
1909 1910
			webGLObject = scene.__webGLObjectsImmediate[ o ];
			object = webGLObject.object;
A
alteredq 已提交
1911 1912 1913
			
			if ( object.visible ) {
			
1914 1915
				opaque = webGLObject.opaque;
				
1916
				setObjectFaces( object );
1917 1918 1919 1920 1921
				
				for( i = 0; i < opaque.count; i++ ) {
				
					material = opaque.list[ i ];
				
A
alteredq 已提交
1922 1923 1924
					setDepthTest( material.depth_test );
					
					program = setProgram( camera, lights, fog, material, object );
1925 1926 1927
					object.render( function( object ) { renderBufferImmediate( object, program ); } );
				
				}
A
alteredq 已提交
1928 1929 1930 1931 1932
			
			}
			
		}

1933 1934
		// transparent pass

1935
		for ( o = 0; o < ol; o++ ) {
1936 1937 1938

			webGLObject = scene.__webGLObjects[ o ];

1939 1940 1941 1942
			if ( webGLObject.render ) {
				
				object = webGLObject.object;
				buffer = webGLObject.buffer;
1943 1944
				transparent = webGLObject.transparent;
				
1945 1946
				setObjectFaces( object );
				
1947 1948 1949 1950 1951
				for( i = 0; i < transparent.count; i++ ) {
					
					material = transparent.list[ i ];
					
					setBlending( material.blending );
A
alteredq 已提交
1952 1953 1954
					setDepthTest( material.depth_test );
					
					renderBuffer( camera, lights, fog, material, buffer, object );
1955 1956
				
				}
1957

1958
			}
M
Mr.doob 已提交
1959

M
Mr.doob 已提交
1960
		}
M
Mr.doob 已提交
1961

1962 1963
		// transparent pass (immediate simulator)
		
1964 1965
		for ( o = 0; o < oil; o++ ) {
		
1966 1967
			webGLObject = scene.__webGLObjectsImmediate[ o ];
			object = webGLObject.object;
1968 1969 1970
			
			if ( object.visible ) {
			
1971 1972
				transparent = webGLObject.transparent;
				
1973
				setObjectFaces( object );
1974 1975 1976 1977 1978 1979
				
				for( i = 0; i < transparent.count; i++ ) {
				
					material = transparent.list[ i ];
				
					setBlending( material.blending );
A
alteredq 已提交
1980 1981 1982
					setDepthTest( material.depth_test );
					
					program = setProgram( camera, lights, fog, material, object );
1983 1984 1985
					object.render( function( object ) { renderBufferImmediate( object, program ); } );
				
				}
1986 1987 1988 1989
			
			}
			
		}
1990
	
1991
		// Generate mipmap if we're using any kind of mipmap filtering
M
Mr.doob 已提交
1992

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

1995
			updateRenderTargetMipmap( renderTarget );
M
Mr.doob 已提交
1996

1997
		}
1998

M
Mr.doob 已提交
1999
	};
M
Mr.doob 已提交
2000

2001
	function addObject( scene, object ) {
2002 2003 2004 2005 2006 2007
		
		var g, geometry, geometryChunk, objmap;
		
		geometry = object.geometry;
		
		if ( scene.__webGLObjectsMap[ object.id ] == undefined ) {
M
Mr.doob 已提交
2008

2009 2010 2011 2012 2013 2014 2015 2016
			scene.__webGLObjectsMap[ object.id ] = {};
				
			object._modelViewMatrix = new THREE.Matrix4();
			
			object._normalMatrixArray = new Float32Array( 9 );
			object._modelViewMatrixArray = new Float32Array( 16 );
			object._objectMatrixArray = new Float32Array( 16 );
			
2017
			object.globalMatrix.flattenToArray( object._objectMatrixArray );
M
Mr.doob 已提交
2018

2019
		}
A
alteredq 已提交
2020

2021 2022
		objmap = scene.__webGLObjectsMap[ object.id ];
		objlist = scene.__webGLObjects;
A
alteredq 已提交
2023

2024
		if ( object instanceof THREE.Mesh ) {
A
alteredq 已提交
2025

2026
			// create separate VBOs per geometry chunk
A
alteredq 已提交
2027

2028
			for ( g in geometry.geometryChunks ) {
A
alteredq 已提交
2029

2030
				geometryChunk = geometry.geometryChunks[ g ];
M
Mr.doob 已提交
2031

2032
				// initialise VBO on the first access
M
Mr.doob 已提交
2033

2034
				if( ! geometryChunk.__webGLVertexBuffer ) {
M
Mr.doob 已提交
2035

2036 2037
					createMeshBuffers( geometryChunk );
					initMeshBuffers( geometryChunk, object );
A
alteredq 已提交
2038

2039 2040 2041 2042 2043 2044
					geometry.__dirtyVertices = true;
					geometry.__dirtyElements = true;
					geometry.__dirtyUvs = true;
					geometry.__dirtyNormals = true;
					geometry.__dirtyTangents = true;
					geometry.__dirtyColors = true;
M
Mr.doob 已提交
2045

2046
				}
2047

2048 2049 2050
				if( geometry.__dirtyVertices || geometry.__dirtyElements || 
					geometry.__dirtyUvs || geometry.__dirtyNormals || 
					geometry.__dirtyColors || geometry.__dirtyTangents ) {
M
Mr.doob 已提交
2051

2052
					setMeshBuffers( geometryChunk, object, _gl.DYNAMIC_DRAW );
M
Mr.doob 已提交
2053

2054
				}
M
Mr.doob 已提交
2055

2056
				// create separate wrapper per each use of VBO
2057

2058
				add_buffer( objlist, objmap, g, geometryChunk, object );
M
Mr.doob 已提交
2059

2060
			}
M
Mr.doob 已提交
2061

2062 2063 2064 2065 2066 2067
			geometry.__dirtyVertices = false;
			geometry.__dirtyElements = false;
			geometry.__dirtyUvs = false;
			geometry.__dirtyNormals = false;
			geometry.__dirtyTangents = false;
			geometry.__dirtyColors = false;
M
Mr.doob 已提交
2068

2069
		} else if ( object instanceof THREE.Line ) {
M
Mr.doob 已提交
2070

2071
			if( ! geometry.__webGLVertexBuffer ) {
M
Mr.doob 已提交
2072

2073 2074
				createLineBuffers( geometry );
				initLineBuffers( geometry );
M
Mr.doob 已提交
2075

2076 2077
				geometry.__dirtyVertices = true;
				geometry.__dirtyColors = true;
M
Mr.doob 已提交
2078

2079
			}
M
Mr.doob 已提交
2080

2081
			if( geometry.__dirtyVertices ||  geometry.__dirtyColors ) {
2082

2083
				setLineBuffers( geometry, _gl.DYNAMIC_DRAW );
2084

2085
			}
2086

2087
			add_buffer( objlist, objmap, 0, geometry, object );
M
Mr.doob 已提交
2088

2089 2090
			geometry.__dirtyVertices = false;
			geometry.__dirtyColors = false;
M
Mr.doob 已提交
2091

2092
		} else if ( object instanceof THREE.ParticleSystem ) {
M
Mr.doob 已提交
2093

2094
			if( ! geometry.__webGLVertexBuffer ) {
M
Mr.doob 已提交
2095

2096 2097
				createParticleBuffers( geometry );
				initParticleBuffers( geometry );
2098

2099 2100 2101 2102
				geometry.__dirtyVertices = true;
				geometry.__dirtyColors = true;
				
			}
2103

2104
			if( geometry.__dirtyVertices || geometry.__dirtyColors || object.sortParticles ) {
M
Mr.doob 已提交
2105

2106
				setParticleBuffers( geometry, _gl.DYNAMIC_DRAW, object, camera );
M
Mr.doob 已提交
2107

2108
			}
M
Mr.doob 已提交
2109

2110
			add_buffer( objlist, objmap, 0, geometry, object );
M
Mr.doob 已提交
2111

2112 2113
			geometry.__dirtyVertices = false;
			geometry.__dirtyColors = false;
M
Mr.doob 已提交
2114

2115 2116
		} else if ( object instanceof THREE.MarchingCubes ) {
			
2117
			add_buffer_immediate( scene.__webGLObjectsImmediate, objmap, 0, object );
2118 2119 2120 2121 2122 2123
			
		}/*else if ( object instanceof THREE.Particle ) {

		}*/
		
	};
M
Mr.doob 已提交
2124

2125
	function add_buffer( objlist, objmap, id, buffer, object ) {
M
Mr.doob 已提交
2126

2127
		if ( objmap[ id ] == undefined ) {
M
Mr.doob 已提交
2128

2129 2130
			objlist.push( { buffer: buffer, object: object, 
							opaque: { list: [], count: 0 }, 
2131
							transparent: { list: [], count: 0 }
2132 2133 2134
						} );
			
			objmap[ id ] = 1;
M
Mr.doob 已提交
2135

2136
		}
M
Mr.doob 已提交
2137

2138
	};
2139

2140
	function add_buffer_immediate( objlist, objmap, id, object ) {
2141

2142
		if ( objmap[ id ] == undefined ) {
M
Mr.doob 已提交
2143

2144 2145
			objlist.push( { object: object, 
							opaque: { list: [], count: 0 }, 
2146
							transparent: { list: [], count: 0 }
2147 2148 2149
						} );
			
			objmap[ id ] = 1;
2150

2151
		}
2152

2153 2154 2155
	};
	
	this.initWebGLObjects = function( scene, camera ) {
2156

2157
		var o, ol, object;
M
Mr.doob 已提交
2158

2159
		if ( !scene.__webGLObjects ) {
M
Mr.doob 已提交
2160

2161 2162
			scene.__webGLObjects = [];
			scene.__webGLObjectsMap = {};
M
Mr.doob 已提交
2163

2164
			scene.__webGLObjectsImmediate = [];
2165

2166 2167 2168
		}
		
		for ( o = 0, ol = scene.objects.length; o < ol; o++ ) {
M
Mr.doob 已提交
2169

2170
			object = scene.objects[ o ];
M
Mr.doob 已提交
2171

2172
			addObject( scene, object );
2173
		
M
Mr.doob 已提交
2174
		}
2175 2176 2177 2178 2179 2180

	};

	this.removeObject = function ( scene, object ) {

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

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

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

2186
			if ( object == zobject ) {
2187 2188 2189 2190

				scene.__webGLObjects.splice( o, 1 );

			}
M
Mr.doob 已提交
2191

2192
		}
M
Mr.doob 已提交
2193

M
Mr.doob 已提交
2194
	};
2195
	
2196
	function setupMatrices ( object, camera ) {
2197

2198
		object._modelViewMatrix.multiplyToArray( camera.globalMatrix, object.globalMatrix, object._modelViewMatrixArray );
A
alteredq 已提交
2199
		THREE.Matrix4.makeInvert3x3( object._modelViewMatrix ).transposeIntoArray( object._normalMatrixArray );
M
Mr.doob 已提交
2200

M
Mr.doob 已提交
2201
	};
M
Mr.doob 已提交
2202

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

2205
		if ( cullFace ) {
M
Mr.doob 已提交
2206

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

2209
				_gl.frontFace( _gl.CCW );
M
Mr.doob 已提交
2210

2211
			} else {
M
Mr.doob 已提交
2212

2213
				_gl.frontFace( _gl.CW );
M
Mr.doob 已提交
2214

2215
			}
M
Mr.doob 已提交
2216

2217
			if( cullFace == "back" ) {
M
Mr.doob 已提交
2218

2219
				_gl.cullFace( _gl.BACK );
M
Mr.doob 已提交
2220

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

2223
				_gl.cullFace( _gl.FRONT );
M
Mr.doob 已提交
2224

2225
			} else {
M
Mr.doob 已提交
2226

2227
				_gl.cullFace( _gl.FRONT_AND_BACK );
M
Mr.doob 已提交
2228

2229
			}
M
Mr.doob 已提交
2230

2231
			_gl.enable( _gl.CULL_FACE );
M
Mr.doob 已提交
2232

2233
		} else {
M
Mr.doob 已提交
2234

2235
			_gl.disable( _gl.CULL_FACE );
M
Mr.doob 已提交
2236

2237 2238 2239
		}

	};
N
Nicolas Garcia Belmonte 已提交
2240

2241
	this.supportsVertexTextures = function() {
2242

2243
		return maxVertexTextures() > 0;
2244

2245
	};
2246

2247
	function maxVertexTextures() {
2248

2249 2250 2251
		return _gl.getParameter( _gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS );

	};
2252

2253
	function initGL( antialias, clearColor, clearAlpha ) {
N
Nicolas Garcia Belmonte 已提交
2254 2255 2256

		try {

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

A
alteredq 已提交
2259
		} catch(e) { console.log(e) }
N
Nicolas Garcia Belmonte 已提交
2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273

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

2274 2275
		_gl.frontFace( _gl.CCW );
		_gl.cullFace( _gl.BACK );
2276
		_gl.enable( _gl.CULL_FACE );
M
Mr.doob 已提交
2277

N
Nicolas Garcia Belmonte 已提交
2278
		_gl.enable( _gl.BLEND );
2279
		_gl.blendFunc( _gl.ONE, _gl.ONE_MINUS_SRC_ALPHA );
2280
		_gl.clearColor( clearColor.r, clearColor.g, clearColor.b, clearAlpha );
A
alteredq 已提交
2281 2282
		
		_cullEnabled = true;
N
Nicolas Garcia Belmonte 已提交
2283

2284
	};
M
Mr.doob 已提交
2285

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

M
Mr.doob 已提交
2288
		var program = _gl.createProgram(),
M
Mr.doob 已提交
2289

M
Mr.doob 已提交
2290 2291 2292 2293
		prefix_fragment = [
			"#ifdef GL_ES",
			"precision highp float;",
			"#endif",
M
Mr.doob 已提交
2294

2295 2296
			"#define MAX_DIR_LIGHTS " + parameters.maxDirLights,
			"#define MAX_POINT_LIGHTS " + parameters.maxPointLights,
A
alteredq 已提交
2297

2298 2299
			parameters.fog ? "#define USE_FOG" : "",
			parameters.fog instanceof THREE.FogExp2 ? "#define FOG_EXP2" : "",
2300

2301 2302
			parameters.map ? "#define USE_MAP" : "",
			parameters.env_map ? "#define USE_ENVMAP" : "",
2303
			parameters.light_map ? "#define USE_LIGHTMAP" : "",
A
alteredq 已提交
2304
			parameters.vertex_colors ? "#define USE_COLOR" : "",
2305

2306
			"uniform mat4 viewMatrix;",
2307
			"uniform vec3 cameraPosition;",
M
Mr.doob 已提交
2308 2309
			""
		].join("\n"),
2310

M
Mr.doob 已提交
2311
		prefix_vertex = [
2312
			maxVertexTextures() > 0 ? "#define VERTEX_TEXTURES" : "",
2313

2314 2315 2316
			"#define MAX_DIR_LIGHTS " + parameters.maxDirLights,
			"#define MAX_POINT_LIGHTS " + parameters.maxPointLights,

2317 2318
			parameters.map ? "#define USE_MAP" : "",
			parameters.env_map ? "#define USE_ENVMAP" : "",
2319
			parameters.light_map ? "#define USE_LIGHTMAP" : "",
A
alteredq 已提交
2320
			parameters.vertex_colors ? "#define USE_COLOR" : "",
2321
			parameters.skinning ? "#define USE_SKINNING" : "",
2322

M
Mr.doob 已提交
2323 2324 2325
			"uniform mat4 objectMatrix;",
			"uniform mat4 modelViewMatrix;",
			"uniform mat4 projectionMatrix;",
2326 2327
			"uniform mat4 viewMatrix;",
			"uniform mat3 normalMatrix;",
M
Mr.doob 已提交
2328
			"uniform vec3 cameraPosition;",
A
alteredq 已提交
2329 2330 2331

			"uniform mat4 cameraInverseMatrix;",

M
Mr.doob 已提交
2332 2333
			"attribute vec3 position;",
			"attribute vec3 normal;",
A
alteredq 已提交
2334
			"attribute vec3 color;",
M
Mr.doob 已提交
2335
			"attribute vec2 uv;",
2336
			"attribute vec2 uv2;",
A
alteredq 已提交
2337 2338 2339 2340 2341
			
			"attribute vec4 skinVertexA;",
			"attribute vec4 skinVertexB;",
			"attribute vec4 skinIndex;",
			"attribute vec4 skinWeight;",
M
Mr.doob 已提交
2342 2343
			""
		].join("\n");
2344

M
Mr.doob 已提交
2345 2346
		_gl.attachShader( program, getShader( "fragment", prefix_fragment + fragment_shader ) );
		_gl.attachShader( program, getShader( "vertex", prefix_vertex + vertex_shader ) );
M
Mr.doob 已提交
2347

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

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

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

2355 2356
			//console.log( prefix_fragment + fragment_shader );
			//console.log( prefix_vertex + vertex_shader );
M
Mr.doob 已提交
2357

N
Nicolas Garcia Belmonte 已提交
2358
		}
2359 2360 2361
		
		//console.log( prefix_fragment + fragment_shader );
		//console.log( prefix_vertex + vertex_shader );
M
Mr.doob 已提交
2362

M
Mr.doob 已提交
2363
		program.uniforms = {};
2364
		program.attributes = {};
M
Mr.doob 已提交
2365

M
Mr.doob 已提交
2366
		return program;
M
Mr.doob 已提交
2367

M
Mr.doob 已提交
2368
	};
M
Mr.doob 已提交
2369

2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387
	function loadUniformsSkinning( uniforms, object ) {
		
		_gl.uniformMatrix4fv( uniforms.cameraInverseMatrix, false, _cameraInverseMatrixArray );
		
		/*
		var i, l = object.boneMatrices.length;
		
		for( i = 0; i < l; i++ ) {
			
			//_gl.uniformMatrix4fv( uniforms[ "uBoneGlobalMatrices[" + i + "]" ], false, object.boneMatrices[ i ]() );
			_gl.uniformMatrix4fv( uniforms[ "uBoneGlobalMatrices[" + i + "]" ], false, object.boneMatrices[ i ] );
			
		}
		*/
		_gl.uniformMatrix4fv( uniforms[ "uBoneGlobalMatrices" ], false, object.boneMatrices );
	
	};
	
A
alteredq 已提交
2388 2389 2390 2391 2392 2393 2394 2395
	function loadUniformsMatrices( uniforms, object ) {
		
		_gl.uniformMatrix4fv( uniforms.modelViewMatrix, false, object._modelViewMatrixArray );
		_gl.uniformMatrix3fv( uniforms.normalMatrix, false, object._normalMatrixArray );

	};
	
	function loadUniformsGeneric( program, uniforms ) {
M
Mr.doob 已提交
2396

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

M
Mr.doob 已提交
2399
		for( u in uniforms ) {
M
Mr.doob 已提交
2400

2401 2402
			location = program.uniforms[u];
			if ( !location ) continue;
M
Mr.doob 已提交
2403

2404
			uniform = uniforms[u];
M
Mr.doob 已提交
2405

2406 2407
			type = uniform.type;
			value = uniform.value;
M
Mr.doob 已提交
2408

M
Mr.doob 已提交
2409
			if( type == "i" ) {
M
Mr.doob 已提交
2410

M
Mr.doob 已提交
2411
				_gl.uniform1i( location, value );
M
Mr.doob 已提交
2412

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

M
Mr.doob 已提交
2415
				_gl.uniform1f( location, value );
2416

A
alteredq 已提交
2417 2418 2419
			} else if( type == "fv1" ) {

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

2421 2422 2423 2424
			} else if( type == "fv" ) {

				_gl.uniform3fv( location, value );

2425 2426 2427 2428
			} else if( type == "v2" ) {

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

2429 2430 2431
			} else if( type == "v3" ) {

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

2433 2434 2435
			} else if( type == "c" ) {

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

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

M
Mr.doob 已提交
2439
				_gl.uniform1i( location, value );
M
Mr.doob 已提交
2440

2441
				texture = uniform.texture;
M
Mr.doob 已提交
2442

2443
				if ( !texture ) continue;
M
Mr.doob 已提交
2444

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

2447
					setCubeTexture( texture, value );
M
Mr.doob 已提交
2448

2449
				} else {
M
Mr.doob 已提交
2450

2451
					setTexture( texture, value );
M
Mr.doob 已提交
2452

2453
				}
M
Mr.doob 已提交
2454

2455
			}
M
Mr.doob 已提交
2456

2457
		}
M
Mr.doob 已提交
2458

2459
	};
M
Mr.doob 已提交
2460

A
alteredq 已提交
2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502
	function setBlending( blending ) {

		if ( blending != _oldBlending ) {
		
			switch ( blending ) {

				case THREE.AdditiveBlending:

					_gl.blendEquation( _gl.FUNC_ADD );
					_gl.blendFunc( _gl.ONE, _gl.ONE );

					break;

				case THREE.SubtractiveBlending:

					//_gl.blendEquation( _gl.FUNC_SUBTRACT );
					_gl.blendFunc( _gl.DST_COLOR, _gl.ZERO );

					break;

				case THREE.BillboardBlending:

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

					break;

				default:

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

					break;
			
			}
			
			_oldBlending = blending;
		
		}

	};
	
2503
	function setCubeTexture( texture, slot ) {
M
Mr.doob 已提交
2504

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

2507 2508
			if ( !texture.image.__webGLTextureCube &&
				 !texture.image.__cubeMapInitialized && texture.image.loadCount == 6 ) {
M
Mr.doob 已提交
2509

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

2512
				_gl.bindTexture( _gl.TEXTURE_CUBE_MAP, texture.image.__webGLTextureCube );
2513

2514 2515
				_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 已提交
2516

2517 2518
				_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 已提交
2519

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

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

2524
				}
M
Mr.doob 已提交
2525

2526
				_gl.generateMipmap( _gl.TEXTURE_CUBE_MAP );
2527

2528
				_gl.bindTexture( _gl.TEXTURE_CUBE_MAP, null );
M
Mr.doob 已提交
2529

2530
				texture.image.__cubeMapInitialized = true;
M
Mr.doob 已提交
2531

M
Mr.doob 已提交
2532
			}
2533 2534 2535

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

2537
		}
M
Mr.doob 已提交
2538

M
Mr.doob 已提交
2539
	};
M
Mr.doob 已提交
2540

2541
	function setTexture( texture, slot ) {
M
Mr.doob 已提交
2542

2543 2544 2545 2546 2547
		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 已提交
2548

2549 2550
			_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 已提交
2551 2552 2553

			_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 ) );
2554 2555 2556 2557 2558 2559 2560
			_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 已提交
2561

2562
	};
M
Mr.doob 已提交
2563

A
alteredq 已提交
2564
	function setRenderTarget( renderTexture, clear ) {
2565 2566

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

2568 2569 2570 2571 2572
			renderTexture.__webGLFramebuffer = _gl.createFramebuffer();
			renderTexture.__webGLRenderbuffer = _gl.createRenderbuffer();
			renderTexture.__webGLTexture = _gl.createTexture();

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

2574 2575 2576 2577
			_gl.bindRenderbuffer( _gl.RENDERBUFFER, renderTexture.__webGLRenderbuffer );
			_gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_COMPONENT16, renderTexture.width, renderTexture.height );

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

2579 2580 2581 2582 2583
			_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 ) );
2584
			_gl.texImage2D( _gl.TEXTURE_2D, 0, paramThreeToGL( renderTexture.format ), renderTexture.width, renderTexture.height, 0, paramThreeToGL( renderTexture.format ), paramThreeToGL( renderTexture.type ), null );
2585 2586

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

2588 2589
			_gl.bindFramebuffer( _gl.FRAMEBUFFER, renderTexture.__webGLFramebuffer );
			_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D, renderTexture.__webGLTexture, 0 );
2590
			_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.RENDERBUFFER, renderTexture.__webGLRenderbuffer );
2591 2592

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

2594 2595 2596
			_gl.bindTexture( _gl.TEXTURE_2D, null );
			_gl.bindRenderbuffer( _gl.RENDERBUFFER, null );
			_gl.bindFramebuffer( _gl.FRAMEBUFFER, null);
M
Mr.doob 已提交
2597

2598 2599
		}

2600
		var framebuffer, width, height;
M
Mr.doob 已提交
2601

2602
		if ( renderTexture ) {
M
Mr.doob 已提交
2603

2604 2605 2606
			framebuffer = renderTexture.__webGLFramebuffer;
			width = renderTexture.width;
			height = renderTexture.height;
M
Mr.doob 已提交
2607

2608
		} else {
M
Mr.doob 已提交
2609

2610 2611 2612
			framebuffer = null;
			width = _canvas.width;
			height = _canvas.height;
M
Mr.doob 已提交
2613

2614
		}
M
Mr.doob 已提交
2615

2616
		if( framebuffer != _oldFramebuffer ) {
M
Mr.doob 已提交
2617

2618 2619
			_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );
			_gl.viewport( 0, 0, width, height );
M
Mr.doob 已提交
2620

A
alteredq 已提交
2621
			if ( clear ) {
M
Mr.doob 已提交
2622

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

A
alteredq 已提交
2625
			}
M
Mr.doob 已提交
2626

2627
			_oldFramebuffer = framebuffer;
M
Mr.doob 已提交
2628

2629
		}
2630

2631
	};
M
Mr.doob 已提交
2632

2633
	function updateRenderTargetMipmap( renderTarget ) {
M
Mr.doob 已提交
2634

2635 2636 2637
		_gl.bindTexture( _gl.TEXTURE_2D, renderTarget.__webGLTexture );
		_gl.generateMipmap( _gl.TEXTURE_2D );
		_gl.bindTexture( _gl.TEXTURE_2D, null );
M
Mr.doob 已提交
2638 2639

	};
2640

M
Mr.doob 已提交
2641
	function cacheUniformLocations( program, identifiers ) {
M
Mr.doob 已提交
2642

M
Mr.doob 已提交
2643
		var i, l, id;
M
Mr.doob 已提交
2644

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

2647 2648
			id = identifiers[ i ];
			program.uniforms[ id ] = _gl.getUniformLocation( program, id );
M
Mr.doob 已提交
2649

M
Mr.doob 已提交
2650
		}
M
Mr.doob 已提交
2651

M
Mr.doob 已提交
2652
	};
M
Mr.doob 已提交
2653

2654
	function cacheAttributeLocations( program, identifiers ) {
2655

2656
		var i, l, id;
M
Mr.doob 已提交
2657

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

2660 2661
			id = identifiers[ i ];
			program.attributes[ id ] = _gl.getAttribLocation( program, id );
M
Mr.doob 已提交
2662

2663
		}
M
Mr.doob 已提交
2664

M
Mr.doob 已提交
2665
	};
M
Mr.doob 已提交
2666

N
Nicolas Garcia Belmonte 已提交
2667 2668 2669 2670 2671 2672 2673 2674 2675 2676 2677 2678 2679 2680 2681 2682 2683 2684 2685 2686 2687 2688 2689 2690 2691
	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 已提交
2692

2693
	};
N
Nicolas Garcia Belmonte 已提交
2694

2695
	function paramThreeToGL( p ) {
M
Mr.doob 已提交
2696

2697
		switch ( p ) {
M
Mr.doob 已提交
2698 2699 2700 2701 2702 2703 2704 2705 2706 2707 2708 2709 2710

			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;

2711 2712 2713 2714 2715 2716 2717 2718 2719 2720 2721 2722 2723 2724
			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;

2725
		}
M
Mr.doob 已提交
2726

2727
		return 0;
M
Mr.doob 已提交
2728

2729 2730 2731 2732 2733 2734
	};

	function materialNeedsSmoothNormals( material ) {

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

2735
	};
M
Mr.doob 已提交
2736

M
Mr.doob 已提交
2737
	function bufferNeedsSmoothNormals( geometryChunk, object ) {
M
Mr.doob 已提交
2738

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

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

M
Mr.doob 已提交
2743
			meshMaterial = object.materials[ m ];
2744 2745 2746

			if ( meshMaterial instanceof THREE.MeshFaceMaterial ) {

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

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

2751 2752 2753 2754 2755 2756 2757 2758 2759 2760 2761 2762 2763 2764 2765 2766 2767 2768 2769 2770 2771
						needsSmoothNormals = true;
						break;

					}

				}

			} else {

				if ( materialNeedsSmoothNormals( meshMaterial ) ) {

					needsSmoothNormals = true;
					break;

				}

			}

			if ( needsSmoothNormals ) break;

		}
M
Mr.doob 已提交
2772

2773
		return needsSmoothNormals;
M
Mr.doob 已提交
2774

2775
	};
M
Mr.doob 已提交
2776

2777
	function allocateLights( lights, maxLights ) {
2778

2779 2780
		var l, ll, light, dirLights, pointLights, maxDirLights, maxPointLights;
		dirLights = pointLights = maxDirLights = maxPointLights = 0;
2781

2782
		for ( l = 0, ll = lights.length; l < ll; l++ ) {
2783

2784
			light = lights[ l ];
2785

2786 2787
			if ( light instanceof THREE.DirectionalLight ) dirLights++;
			if ( light instanceof THREE.PointLight ) pointLights++;
2788

2789
		}
2790

2791
		if ( ( pointLights + dirLights ) <= maxLights ) {
2792

2793 2794
			maxDirLights = dirLights;
			maxPointLights = pointLights;
2795

2796
		} else {
2797

2798 2799
			maxDirLights = Math.ceil( maxLights * dirLights / ( pointLights + dirLights ) );
			maxPointLights = maxLights - maxDirLights;
2800 2801 2802

		}

2803
		return { 'directional' : maxDirLights, 'point' : maxPointLights };
2804 2805

	};
M
Mr.doob 已提交
2806

A
alteredq 已提交
2807
	/* DEBUG
2808
	function getGLParams() {
M
Mr.doob 已提交
2809

2810
		var params  = {
M
Mr.doob 已提交
2811

2812 2813
			'MAX_VARYING_VECTORS': _gl.getParameter( _gl.MAX_VARYING_VECTORS ),
			'MAX_VERTEX_ATTRIBS': _gl.getParameter( _gl.MAX_VERTEX_ATTRIBS ),
M
Mr.doob 已提交
2814

2815 2816 2817
			'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 已提交
2818

2819 2820 2821
			'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 已提交
2822

2823 2824
		return params;
	};
M
Mr.doob 已提交
2825

2826
	function dumpObject( obj ) {
M
Mr.doob 已提交
2827

2828 2829
		var p, str = "";
		for ( p in obj ) {
M
Mr.doob 已提交
2830

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

2833
		}
M
Mr.doob 已提交
2834

2835 2836
		return str;
	}
A
alteredq 已提交
2837
	*/
2838

2839
};
2840

2841
THREE.Snippets = {
M
Mr.doob 已提交
2842

2843 2844
	// FOG
	
2845
	fog_pars_fragment: [
M
Mr.doob 已提交
2846

2847
	"#ifdef USE_FOG",
2848

2849
		"uniform vec3 fogColor;",
2850

2851 2852 2853 2854 2855 2856
		"#ifdef FOG_EXP2",
			"uniform float fogDensity;",
		"#else",
			"uniform float fogNear;",
			"uniform float fogFar;",
		"#endif",
2857

2858
	"#endif"
2859

2860
	].join("\n"),
M
Mr.doob 已提交
2861

2862
	fog_fragment: [
2863

2864
	"#ifdef USE_FOG",
2865

2866 2867 2868 2869 2870 2871 2872 2873 2874
		"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",
2875

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

2878
	"#endif"
M
Mr.doob 已提交
2879

2880
	].join("\n"),
M
Mr.doob 已提交
2881

2882 2883
	// ENVIRONMENT MAP
	
2884
	envmap_pars_fragment: [
M
Mr.doob 已提交
2885

2886
	"#ifdef USE_ENVMAP",
M
Mr.doob 已提交
2887

2888 2889 2890 2891
		"varying vec3 vReflect;",
		"uniform float reflectivity;",
		"uniform samplerCube env_map;",
		"uniform int combine;",
M
Mr.doob 已提交
2892

2893
	"#endif"
M
Mr.doob 已提交
2894

2895
	].join("\n"),
M
Mr.doob 已提交
2896

2897
	envmap_fragment: [
M
Mr.doob 已提交
2898

2899 2900
	"#ifdef USE_ENVMAP",

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

2903 2904
		"if ( combine == 1 ) {",

2905 2906
			//"gl_FragColor = mix( gl_FragColor, cubeColor, reflectivity );",
			"gl_FragColor = vec4( mix( gl_FragColor.xyz, cubeColor.xyz, reflectivity ), opacity );",
2907 2908 2909 2910 2911

		"} else {",

			"gl_FragColor = gl_FragColor * cubeColor;",

M
Mr.doob 已提交
2912
		"}",
2913 2914

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

2916
	].join("\n"),
M
Mr.doob 已提交
2917

2918
	envmap_pars_vertex: [
M
Mr.doob 已提交
2919

2920
	"#ifdef USE_ENVMAP",
M
Mr.doob 已提交
2921

2922 2923 2924
		"varying vec3 vReflect;",
		"uniform float refraction_ratio;",
		"uniform bool useRefract;",
M
Mr.doob 已提交
2925

2926
	"#endif"
M
Mr.doob 已提交
2927

2928 2929 2930
	].join("\n"),

	envmap_vertex : [
M
Mr.doob 已提交
2931

2932
	"#ifdef USE_ENVMAP",
M
Mr.doob 已提交
2933

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

2937 2938 2939 2940 2941 2942 2943 2944 2945 2946 2947
		"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 已提交
2948

2949
	].join("\n"),
2950
	
2951 2952 2953 2954 2955 2956 2957 2958 2959 2960 2961 2962 2963 2964 2965 2966 2967
	// COLOR MAP (particles)

	map_particle_pars_fragment: [

	"#ifdef USE_MAP",

		"uniform sampler2D map;",

	"#endif"

	].join("\n"),


	map_particle_fragment: [

	"#ifdef USE_MAP",

A
alteredq 已提交
2968
		"gl_FragColor = gl_FragColor * texture2D( map, gl_PointCoord );",
2969 2970 2971 2972 2973 2974

	"#endif"

	].join("\n"),

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

2976
	map_pars_fragment: [
M
Mr.doob 已提交
2977

2978
	"#ifdef USE_MAP",
M
Mr.doob 已提交
2979

2980 2981
		"varying vec2 vUv;",
		"uniform sampler2D map;",
M
Mr.doob 已提交
2982

2983
	"#endif"
M
Mr.doob 已提交
2984

2985
	].join("\n"),
M
Mr.doob 已提交
2986

2987
	map_pars_vertex: [
M
Mr.doob 已提交
2988

2989
	"#ifdef USE_MAP",
M
Mr.doob 已提交
2990

2991 2992 2993
		"varying vec2 vUv;",

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

2995
	].join("\n"),
M
Mr.doob 已提交
2996

2997 2998 2999 3000
	map_fragment: [

	"#ifdef USE_MAP",

A
alteredq 已提交
3001
		"gl_FragColor = gl_FragColor * texture2D( map, vUv );",
3002 3003

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

3005
	].join("\n"),
M
Mr.doob 已提交
3006

3007
	map_vertex: [
M
Mr.doob 已提交
3008

3009
	"#ifdef USE_MAP",
M
Mr.doob 已提交
3010

3011
		"vUv = uv;",
M
Mr.doob 已提交
3012

3013
	"#endif"
M
Mr.doob 已提交
3014

3015
	].join("\n"),
M
Mr.doob 已提交
3016

3017 3018 3019 3020 3021 3022 3023 3024 3025 3026 3027 3028 3029 3030 3031 3032 3033 3034 3035 3036 3037 3038 3039 3040 3041 3042 3043
	// 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 已提交
3044
		"gl_FragColor = gl_FragColor * texture2D( light_map, vUv2 );",
3045 3046 3047 3048 3049 3050 3051 3052 3053 3054 3055 3056 3057 3058 3059

	"#endif"

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

	"#ifdef USE_LIGHTMAP",

		"vUv2 = uv2;",

	"#endif"

	].join("\n"),

3060
	lights_pars_vertex: [
M
Mr.doob 已提交
3061

3062 3063
	"uniform bool enableLighting;",
	"uniform vec3 ambientLightColor;",
M
Mr.doob 已提交
3064

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

3067 3068
		"uniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];",
		"uniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];",
M
Mr.doob 已提交
3069

3070 3071 3072
	"#endif",

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

3074 3075
		"uniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];",
		"uniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];",
M
Mr.doob 已提交
3076

3077 3078 3079
		"#ifdef PHONG",
			"varying vec3 vPointLightVector[ MAX_POINT_LIGHTS ];",
		"#endif",
M
Mr.doob 已提交
3080

3081
	"#endif"
M
Mr.doob 已提交
3082

3083
	].join("\n"),
M
Mr.doob 已提交
3084

3085 3086
	// LIGHTS
	
3087
	lights_vertex: [
M
Mr.doob 已提交
3088

3089 3090
	"if ( !enableLighting ) {",

A
alteredq 已提交
3091
		"vLightWeighting = vec3( 1.0 );",
3092 3093 3094 3095 3096 3097

	"} else {",

		"vLightWeighting = ambientLightColor;",

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

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

3101 3102 3103
			"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 已提交
3104

3105
		"}",
M
Mr.doob 已提交
3106

3107 3108 3109
		"#endif",

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

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

3113 3114 3115 3116
			"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 已提交
3117

3118 3119 3120
			"#ifdef PHONG",
				"vPointLightVector[ i ] = pointLightVector;",
			"#endif",
M
Mr.doob 已提交
3121

3122
		"}",
M
Mr.doob 已提交
3123

3124
		"#endif",
M
Mr.doob 已提交
3125

3126
	"}"
M
Mr.doob 已提交
3127

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

3130
	lights_pars_fragment: [
M
Mr.doob 已提交
3131

3132 3133 3134
	"#if MAX_DIR_LIGHTS > 0",
		"uniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];",
	"#endif",
M
Mr.doob 已提交
3135

3136 3137 3138
	"#if MAX_POINT_LIGHTS > 0",
		"varying vec3 vPointLightVector[ MAX_POINT_LIGHTS ];",
	"#endif",
M
Mr.doob 已提交
3139

3140 3141
	"varying vec3 vViewPosition;",
	"varying vec3 vNormal;"
M
Mr.doob 已提交
3142

3143
	].join("\n"),
M
Mr.doob 已提交
3144

3145
	lights_fragment: [
M
Mr.doob 已提交
3146

3147 3148
	"vec3 normal = normalize( vNormal );",
	"vec3 viewPosition = normalize( vViewPosition );",
A
alteredq 已提交
3149 3150
	
	"vec4 mColor = vec4( diffuse, opacity );",
3151 3152 3153
	"vec4 mSpecular = vec4( specular, opacity );",

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

3155 3156 3157 3158 3159 3160 3161 3162 3163 3164 3165 3166 3167 3168 3169 3170 3171 3172 3173 3174 3175
		"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 已提交
3176

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

3179 3180 3181 3182 3183 3184 3185 3186 3187 3188 3189 3190 3191 3192 3193 3194 3195 3196 3197 3198 3199 3200
		"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 已提交
3201

3202 3203 3204 3205 3206 3207 3208
	"#endif",

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

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

3210 3211
	"#if MAX_POINT_LIGHTS > 0",
		"totalLight += pointDiffuse + pointSpecular;",
A
alteredq 已提交
3212 3213 3214
	"#endif",
	
	"gl_FragColor = gl_FragColor * totalLight;"
3215

A
alteredq 已提交
3216 3217 3218 3219 3220 3221 3222 3223 3224 3225 3226 3227 3228 3229 3230 3231 3232 3233 3234
	].join("\n"),
	
	// VERTEX COLORS

	color_pars_fragment: [

	"#ifdef USE_COLOR",

		"varying vec3 vColor;",

	"#endif"

	].join("\n"),


	color_fragment: [

	"#ifdef USE_COLOR",

A
alteredq 已提交
3235
		"gl_FragColor = gl_FragColor * vec4( vColor, opacity );",
A
alteredq 已提交
3236 3237 3238 3239 3240 3241 3242 3243 3244 3245 3246 3247 3248 3249 3250 3251 3252 3253 3254 3255 3256 3257 3258 3259

	"#endif"

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

	"#ifdef USE_COLOR",

		"varying vec3 vColor;",

	"#endif"

	].join("\n"),


	color_vertex: [

	"#ifdef USE_COLOR",

		"vColor = color;",

	"#endif"

3260 3261 3262 3263 3264 3265 3266 3267 3268 3269 3270 3271 3272 3273 3274 3275 3276 3277 3278 3279 3280 3281 3282 3283 3284
	].join("\n"),
	
	// skinning
	
	skinning_pars_vertex: [
	
	"#ifdef USE_SKINNING",
		
		"uniform mat4 uBoneGlobalMatrices[20];",
		
	"#endif"
		
	].join("\n"),
		
	skinning_vertex: [
	
	"#ifdef USE_SKINNING",

		"gl_Position  = ( uBoneGlobalMatrices[ int( skinIndex.x ) ] * skinVertexA ) * skinWeight.x;",
		"gl_Position += ( uBoneGlobalMatrices[ int( skinIndex.y ) ] * skinVertexB ) * skinWeight.y;",
		
		// this doesn't work, no idea why
		//"gl_Position  = projectionMatrix * cameraInverseMatrix * objectMatrix * gl_Position;",
		
		"gl_Position  = projectionMatrix * viewMatrix * objectMatrix * gl_Position;",
A
alteredq 已提交
3285
	
3286 3287 3288 3289 3290 3291 3292
	"#else",
		
		"gl_Position = projectionMatrix * mvPosition;",
		
	"#endif"
	
	].join("\n")
3293

3294
};
3295

3296
THREE.UniformsLib = {
M
Mr.doob 已提交
3297

3298
	common: {
M
Mr.doob 已提交
3299

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

3304 3305
	"light_map"       : { type: "t", value: 2, texture: null },

3306 3307
	"env_map" 		  : { type: "t", value: 1, texture: null },
	"useRefract"	  : { type: "i", value: 0 },
3308
	"reflectivity"    : { type: "f", value: 1.0 },
3309 3310
	"refraction_ratio": { type: "f", value: 0.98 },
	"combine"		  : { type: "i", value: 0 },
M
Mr.doob 已提交
3311

3312 3313 3314 3315
	"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 已提交
3316

3317
	},
M
Mr.doob 已提交
3318

3319
	lights: {
M
Mr.doob 已提交
3320

3321 3322 3323 3324 3325 3326
	"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 已提交
3327

3328 3329 3330 3331
	},

	particle: {

A
alteredq 已提交
3332
	"psColor"   : { type: "c", value: new THREE.Color( 0xeeeeee ) },
3333 3334
	"opacity" : { type: "f", value: 1.0 },
	"size" 	  : { type: "f", value: 1.0 },
3335
	"map"     : { type: "t", value: 0, texture: null },
M
Mr.doob 已提交
3336

3337 3338 3339 3340 3341 3342 3343
	"fogDensity": { type: "f", value: 0.00025 },
	"fogNear"	: { type: "f", value: 1 },
	"fogFar"	: { type: "f", value: 2000 },
	"fogColor"	: { type: "c", value: new THREE.Color( 0xffffff ) }
	
	}
	
3344 3345
};

3346
THREE.ShaderLib = {
3347

3348
	'depth': {
M
Mr.doob 已提交
3349

3350
		uniforms: { "mNear": { type: "f", value: 1.0 },
3351
					"mFar" : { type: "f", value: 2000.0 },
A
alteredq 已提交
3352
					"opacity" : { type: "f", value: 1.0 }
3353
				  },
3354

3355
		fragment_shader: [
M
Mr.doob 已提交
3356

3357 3358
			"uniform float mNear;",
			"uniform float mFar;",
3359
			"uniform float opacity;",
M
Mr.doob 已提交
3360

3361
			"void main() {",
M
Mr.doob 已提交
3362

3363 3364
				"float depth = gl_FragCoord.z / gl_FragCoord.w;",
				"float color = 1.0 - smoothstep( mNear, mFar, depth );",
3365
				"gl_FragColor = vec4( vec3( color ), opacity );",
M
Mr.doob 已提交
3366

3367
			"}"
M
Mr.doob 已提交
3368

3369
		].join("\n"),
3370

3371
		vertex_shader: [
3372

3373
			"void main() {",
3374

3375
				"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",
3376

3377
			"}"
3378

3379
		].join("\n")
3380

3381
	},
3382

3383
	'normal': {
M
Mr.doob 已提交
3384

3385
		uniforms: { "opacity" : { type: "f", value: 1.0 } },
3386

3387
		fragment_shader: [
3388

3389
			"uniform float opacity;",
3390
			"varying vec3 vNormal;",
M
Mr.doob 已提交
3391

3392
			"void main() {",
3393

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

3396
			"}"
M
Mr.doob 已提交
3397

3398
		].join("\n"),
M
Mr.doob 已提交
3399

3400
		vertex_shader: [
3401

3402
			"varying vec3 vNormal;",
3403

3404 3405 3406 3407 3408 3409 3410 3411 3412 3413 3414 3415
			"void main() {",

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

				"gl_Position = projectionMatrix * mvPosition;",

			"}"

		].join("\n")

	},
3416

3417
	'basic': {
M
Mr.doob 已提交
3418

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

3421
		fragment_shader: [
3422

A
alteredq 已提交
3423
			"uniform vec3 diffuse;",
3424
			"uniform float opacity;",
M
Mr.doob 已提交
3425

3426
			THREE.Snippets[ "color_pars_fragment" ],
3427
			THREE.Snippets[ "map_pars_fragment" ],
3428
			THREE.Snippets[ "lightmap_pars_fragment" ],
3429 3430
			THREE.Snippets[ "envmap_pars_fragment" ],
			THREE.Snippets[ "fog_pars_fragment" ],
M
Mr.doob 已提交
3431

3432
			"void main() {",
3433

A
alteredq 已提交
3434 3435
				"gl_FragColor = vec4( diffuse, opacity );",
		
3436
				THREE.Snippets[ "map_fragment" ],
3437
				THREE.Snippets[ "lightmap_fragment" ],
3438
				THREE.Snippets[ "color_fragment" ],
3439 3440
				THREE.Snippets[ "envmap_fragment" ],
				THREE.Snippets[ "fog_fragment" ],
M
Mr.doob 已提交
3441

3442
			"}"
3443

3444
		].join("\n"),
M
Mr.doob 已提交
3445

3446
		vertex_shader: [
M
Mr.doob 已提交
3447

3448
			THREE.Snippets[ "map_pars_vertex" ],
3449
			THREE.Snippets[ "lightmap_pars_vertex" ],
3450
			THREE.Snippets[ "envmap_pars_vertex" ],
3451
			THREE.Snippets[ "color_pars_vertex" ],
3452
			THREE.Snippets[ "skinning_pars_vertex" ],
M
Mr.doob 已提交
3453

3454
			"void main() {",
M
Mr.doob 已提交
3455

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

3458
				THREE.Snippets[ "map_vertex" ],
3459
				THREE.Snippets[ "lightmap_vertex" ],
3460
				THREE.Snippets[ "envmap_vertex" ],
3461
				THREE.Snippets[ "color_vertex" ],
3462
				THREE.Snippets[ "skinning_vertex" ],
3463

3464
			"}"
3465

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

3468
	},
3469

3470
	'lambert': {
M
Mr.doob 已提交
3471 3472

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

3475
		fragment_shader: [
M
Mr.doob 已提交
3476

A
alteredq 已提交
3477
			"uniform vec3 diffuse;",
3478
			"uniform float opacity;",
M
Mr.doob 已提交
3479

A
alteredq 已提交
3480
			"varying vec3 vLightWeighting;",		
M
Mr.doob 已提交
3481

A
alteredq 已提交
3482
			THREE.Snippets[ "color_pars_fragment" ],
3483
			THREE.Snippets[ "map_pars_fragment" ],
3484
			THREE.Snippets[ "lightmap_pars_fragment" ],
3485 3486
			THREE.Snippets[ "envmap_pars_fragment" ],
			THREE.Snippets[ "fog_pars_fragment" ],
M
Mr.doob 已提交
3487

3488
			"void main() {",
M
Mr.doob 已提交
3489

A
alteredq 已提交
3490 3491
				"gl_FragColor = vec4( diffuse, opacity );",
				"gl_FragColor = gl_FragColor * vec4( vLightWeighting, 1.0 );",
3492 3493

				THREE.Snippets[ "map_fragment" ],
3494
				THREE.Snippets[ "lightmap_fragment" ],
A
alteredq 已提交
3495
				THREE.Snippets[ "color_fragment" ],
3496
				THREE.Snippets[ "envmap_fragment" ],
3497 3498 3499 3500 3501 3502 3503
				THREE.Snippets[ "fog_fragment" ],

			"}"

		].join("\n"),

		vertex_shader: [
M
Mr.doob 已提交
3504

3505
			"varying vec3 vLightWeighting;",
M
Mr.doob 已提交
3506

3507
			THREE.Snippets[ "map_pars_vertex" ],
3508
			THREE.Snippets[ "lightmap_pars_vertex" ],
3509 3510
			THREE.Snippets[ "envmap_pars_vertex" ],
			THREE.Snippets[ "lights_pars_vertex" ],
A
alteredq 已提交
3511
			THREE.Snippets[ "color_pars_vertex" ],
3512
			THREE.Snippets[ "skinning_pars_vertex" ],
A
alteredq 已提交
3513

3514
			"void main() {",
M
Mr.doob 已提交
3515

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

3518
				THREE.Snippets[ "map_vertex" ],
3519
				THREE.Snippets[ "lightmap_vertex" ],
3520
				THREE.Snippets[ "envmap_vertex" ],
A
alteredq 已提交
3521
				THREE.Snippets[ "color_vertex" ],
M
Mr.doob 已提交
3522

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

3525
				THREE.Snippets[ "lights_vertex" ],
3526
				THREE.Snippets[ "skinning_vertex" ],
3527 3528 3529 3530

			"}"

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

3532
	},
M
Mr.doob 已提交
3533

3534
	'phong': {
M
Mr.doob 已提交
3535 3536

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

3539
									{ "ambient"  : { type: "c", value: new THREE.Color( 0x050505 ) },
3540 3541 3542
									  "specular" : { type: "c", value: new THREE.Color( 0x111111 ) },
									  "shininess": { type: "f", value: 30 }
									}
M
Mr.doob 已提交
3543

3544
								] ),
M
Mr.doob 已提交
3545

3546
		fragment_shader: [
M
Mr.doob 已提交
3547

A
alteredq 已提交
3548
			"uniform vec3 diffuse;",
3549
			"uniform float opacity;",
M
Mr.doob 已提交
3550

3551 3552 3553
			"uniform vec3 ambient;",
			"uniform vec3 specular;",
			"uniform float shininess;",
M
Mr.doob 已提交
3554

3555
			"varying vec3 vLightWeighting;",
M
Mr.doob 已提交
3556

A
alteredq 已提交
3557
			THREE.Snippets[ "color_pars_fragment" ],
3558
			THREE.Snippets[ "map_pars_fragment" ],
3559
			THREE.Snippets[ "lightmap_pars_fragment" ],
3560 3561 3562
			THREE.Snippets[ "envmap_pars_fragment" ],
			THREE.Snippets[ "fog_pars_fragment" ],
			THREE.Snippets[ "lights_pars_fragment" ],
M
Mr.doob 已提交
3563

3564
			"void main() {",
M
Mr.doob 已提交
3565

A
alteredq 已提交
3566 3567
				"gl_FragColor = vec4( vLightWeighting, 1.0 );",
				THREE.Snippets[ "lights_fragment" ],
3568 3569

				THREE.Snippets[ "map_fragment" ],
3570
				THREE.Snippets[ "lightmap_fragment" ],
A
alteredq 已提交
3571
				THREE.Snippets[ "color_fragment" ],
3572 3573 3574 3575 3576 3577 3578 3579
				THREE.Snippets[ "envmap_fragment" ],
				THREE.Snippets[ "fog_fragment" ],

			"}"

		].join("\n"),

		vertex_shader: [
M
Mr.doob 已提交
3580

3581
			"#define PHONG",
M
Mr.doob 已提交
3582

3583 3584 3585
			"varying vec3 vLightWeighting;",
			"varying vec3 vViewPosition;",
			"varying vec3 vNormal;",
M
Mr.doob 已提交
3586

3587
			THREE.Snippets[ "map_pars_vertex" ],
3588
			THREE.Snippets[ "lightmap_pars_vertex" ],
3589 3590
			THREE.Snippets[ "envmap_pars_vertex" ],
			THREE.Snippets[ "lights_pars_vertex" ],
A
alteredq 已提交
3591
			THREE.Snippets[ "color_pars_vertex" ],
3592
			THREE.Snippets[ "skinning_pars_vertex" ],
M
Mr.doob 已提交
3593

3594
			"void main() {",
M
Mr.doob 已提交
3595

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

3598
				THREE.Snippets[ "map_vertex" ],
3599
				THREE.Snippets[ "lightmap_vertex" ],
3600
				THREE.Snippets[ "envmap_vertex" ],
A
alteredq 已提交
3601
				THREE.Snippets[ "color_vertex" ],
M
Mr.doob 已提交
3602

3603 3604 3605
				"#ifndef USE_ENVMAP",
					"vec4 mPosition = objectMatrix * vec4( position, 1.0 );",
				"#endif",
M
Mr.doob 已提交
3606

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

3609 3610
				"vec3 transformedNormal = normalize( normalMatrix * normal );",
				"vNormal = transformedNormal;",
3611

3612
				THREE.Snippets[ "lights_vertex" ],
3613
				THREE.Snippets[ "skinning_vertex" ],
3614 3615 3616 3617

			"}"

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

3619 3620 3621 3622 3623 3624 3625 3626
	},
	
	'particle_basic': {

		uniforms: THREE.UniformsLib[ "particle" ],

		fragment_shader: [

A
alteredq 已提交
3627
			"uniform vec3 psColor;",
3628 3629
			"uniform float opacity;",

A
alteredq 已提交
3630
			THREE.Snippets[ "color_pars_fragment" ],
3631 3632 3633 3634 3635
			THREE.Snippets[ "map_particle_pars_fragment" ],
			THREE.Snippets[ "fog_pars_fragment" ],

			"void main() {",

A
alteredq 已提交
3636
				"gl_FragColor = vec4( psColor, opacity );",
3637 3638

				THREE.Snippets[ "map_particle_fragment" ],
A
alteredq 已提交
3639
				THREE.Snippets[ "color_fragment" ],
3640 3641 3642 3643 3644 3645 3646 3647 3648 3649
				THREE.Snippets[ "fog_fragment" ],

			"}"

		].join("\n"),

		vertex_shader: [

			"uniform float size;",
			
A
alteredq 已提交
3650 3651
			THREE.Snippets[ "color_pars_vertex" ],
			
3652 3653
			"void main() {",

A
alteredq 已提交
3654 3655
				THREE.Snippets[ "color_vertex" ],
				
3656 3657 3658 3659 3660 3661 3662 3663 3664 3665
				"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 已提交
3666
	}
3667
	
A
alteredq 已提交
3668

A
alteredq 已提交
3669
};