BinaryLoader.js 19.9 KB
Newer Older
1 2 3 4
/**
 * @author alteredq / http://alteredqualia.com/
 */

5
THREE.BinaryLoader = function ( manager ) {
6

7
	this.manager = ( manager !== undefined ) ? manager : THREE.DefaultLoadingManager;
8

9 10
};

11
THREE.BinaryLoader.prototype = {
12

13
	constructor: THREE.BinaryLoader,
14

15 16 17 18 19 20 21 22
	// Load models generated by slim OBJ converter with BINARY option (converter_obj_three_slim.py -t binary)
	//  - binary models consist of two files: JS and BIN
	//  - parameters
	//		- url (required)
	//		- callback (required)
	//		- texturePath (optional: if not specified, textures will be assumed to be in the same folder as JS model file)
	//		- binaryPath (optional: if not specified, binary file will be assumed to be in the same folder as JS model file)
	load: function ( url, onLoad, onProgress, onError ) {
23

24
		// todo: unify load API to for easier SceneLoader use
25

26 27
		var texturePath = this.texturePath || THREE.Loader.prototype.extractUrlBase( url );
		var binaryPath  = this.binaryPath || THREE.Loader.prototype.extractUrlBase( url );
28

29
		// #1 load JS part via web worker
30

31
		var scope = this;
32

33 34 35
		var jsonloader = new THREE.XHRLoader( this.manager );
		jsonloader.setCrossOrigin( this.crossOrigin );
		jsonloader.load( url, function ( data ) {
36

37
			var json = JSON.parse( data );
38

39
			var bufferUrl = binaryPath + json.buffers;
40

41 42 43 44
			var bufferLoader = new THREE.XHRLoader( scope.manager );
			bufferLoader.setCrossOrigin( scope.crossOrigin );
			bufferLoader.setResponseType( 'arraybuffer' );
			bufferLoader.load( bufferUrl, function ( bufData ) {
M
Mr.doob 已提交
45

46 47
				// IEWEBGL needs this ???
				//buffer = ( new Uint8Array( xhr.responseBody ) ).buffer;
48

49
				//// iOS and other XMLHttpRequest level 1 ???
50

51
				scope.parse( bufData, onLoad, texturePath, json.materials );
52

G
gero3 已提交
53
			}, onProgress, onError );
M
Mr.doob 已提交
54

55
		}, onProgress, onError );
56

57
	},
58

59
	setBinaryPath: function ( value ) {
60

61
		this.binaryPath = value;
62

63
	},
M
Mr.doob 已提交
64

65
	setCrossOrigin: function ( value ) {
M
Mr.doob 已提交
66

67
		this.crossOrigin = value;
68

69
	},
70

71
	setTexturePath: function ( value ) {
72

73
		this.texturePath = value;
74

75
	},
76

77
	parse: function ( data, callback, texturePath, jsonMaterials ) {
78

79
		var Model = function ( texturePath ) {
80

81 82 83 84 85 86 87 88 89 90
			var scope = this,
				currentOffset = 0,
				md,
				normals = [],
				uvs = [],
				start_tri_flat, start_tri_smooth, start_tri_flat_uv, start_tri_smooth_uv,
				start_quad_flat, start_quad_smooth, start_quad_flat_uv, start_quad_smooth_uv,
				tri_size, quad_size,
				len_tri_flat, len_tri_smooth, len_tri_flat_uv, len_tri_smooth_uv,
				len_quad_flat, len_quad_smooth, len_quad_flat_uv, len_quad_smooth_uv;
91

92

93
			THREE.Geometry.call( this );
94

95
			md = parseMetaData( data, currentOffset );
96

97
			currentOffset += md.header_bytes;
G
gero3 已提交
98 99 100 101 102 103
			/*
					md.vertex_index_bytes = Uint32Array.BYTES_PER_ELEMENT;
					md.material_index_bytes = Uint16Array.BYTES_PER_ELEMENT;
					md.normal_index_bytes = Uint32Array.BYTES_PER_ELEMENT;
					md.uv_index_bytes = Uint32Array.BYTES_PER_ELEMENT;
			*/
104
			// buffers sizes
105

106 107
			tri_size =  md.vertex_index_bytes * 3 + md.material_index_bytes;
			quad_size = md.vertex_index_bytes * 4 + md.material_index_bytes;
108

109 110 111 112
			len_tri_flat      = md.ntri_flat      * ( tri_size );
			len_tri_smooth    = md.ntri_smooth    * ( tri_size + md.normal_index_bytes * 3 );
			len_tri_flat_uv   = md.ntri_flat_uv   * ( tri_size + md.uv_index_bytes * 3 );
			len_tri_smooth_uv = md.ntri_smooth_uv * ( tri_size + md.normal_index_bytes * 3 + md.uv_index_bytes * 3 );
113

114 115 116 117
			len_quad_flat      = md.nquad_flat      * ( quad_size );
			len_quad_smooth    = md.nquad_smooth    * ( quad_size + md.normal_index_bytes * 4 );
			len_quad_flat_uv   = md.nquad_flat_uv   * ( quad_size + md.uv_index_bytes * 4 );
			len_quad_smooth_uv = md.nquad_smooth_uv * ( quad_size + md.normal_index_bytes * 4 + md.uv_index_bytes * 4 );
118

119
			// read buffers
120

121
			currentOffset += init_vertices( currentOffset );
122

123 124
			currentOffset += init_normals( currentOffset );
			currentOffset += handlePadding( md.nnormals * 3 );
125

126
			currentOffset += init_uvs( currentOffset );
127

128 129 130 131
			start_tri_flat 		= currentOffset;
			start_tri_smooth    = start_tri_flat    + len_tri_flat    + handlePadding( md.ntri_flat * 2 );
			start_tri_flat_uv   = start_tri_smooth  + len_tri_smooth  + handlePadding( md.ntri_smooth * 2 );
			start_tri_smooth_uv = start_tri_flat_uv + len_tri_flat_uv + handlePadding( md.ntri_flat_uv * 2 );
132

133 134 135
			start_quad_flat     = start_tri_smooth_uv + len_tri_smooth_uv  + handlePadding( md.ntri_smooth_uv * 2 );
			start_quad_smooth   = start_quad_flat     + len_quad_flat	   + handlePadding( md.nquad_flat * 2 );
			start_quad_flat_uv  = start_quad_smooth   + len_quad_smooth    + handlePadding( md.nquad_smooth * 2 );
G
gero3 已提交
136
			start_quad_smooth_uv = start_quad_flat_uv  + len_quad_flat_uv   + handlePadding( md.nquad_flat_uv * 2 );
137

138 139
			// have to first process faces with uvs
			// so that face and uv indices match
140

141 142
			init_triangles_flat_uv( start_tri_flat_uv );
			init_triangles_smooth_uv( start_tri_smooth_uv );
143

144 145
			init_quads_flat_uv( start_quad_flat_uv );
			init_quads_smooth_uv( start_quad_smooth_uv );
146

147
			// now we can process untextured faces
M
Mr.doob 已提交
148

149 150
			init_triangles_flat( start_tri_flat );
			init_triangles_smooth( start_tri_smooth );
151

152 153
			init_quads_flat( start_quad_flat );
			init_quads_smooth( start_quad_smooth );
154

155
			this.computeFaceNormals();
156

157
			function handlePadding( n ) {
158

159
				return ( n % 4 ) ? ( 4 - n % 4 ) : 0;
160

161
			}
162

163 164 165 166
			function parseMetaData( data, offset ) {

				var metaData = {

G
gero3 已提交
167 168
					'signature'               : parseString( data, offset,  12 ),
					'header_bytes'            : parseUChar8( data, offset + 12 ),
169

G
gero3 已提交
170 171 172
					'vertex_coordinate_bytes' : parseUChar8( data, offset + 13 ),
					'normal_coordinate_bytes' : parseUChar8( data, offset + 14 ),
					'uv_coordinate_bytes'     : parseUChar8( data, offset + 15 ),
173

G
gero3 已提交
174 175 176 177
					'vertex_index_bytes'      : parseUChar8( data, offset + 16 ),
					'normal_index_bytes'      : parseUChar8( data, offset + 17 ),
					'uv_index_bytes'          : parseUChar8( data, offset + 18 ),
					'material_index_bytes'    : parseUChar8( data, offset + 19 ),
178

G
gero3 已提交
179 180 181
					'nvertices'    : parseUInt32( data, offset + 20 ),
					'nnormals'     : parseUInt32( data, offset + 20 + 4 * 1 ),
					'nuvs'         : parseUInt32( data, offset + 20 + 4 * 2 ),
182

G
gero3 已提交
183 184 185 186
					'ntri_flat'      : parseUInt32( data, offset + 20 + 4 * 3 ),
					'ntri_smooth'    : parseUInt32( data, offset + 20 + 4 * 4 ),
					'ntri_flat_uv'   : parseUInt32( data, offset + 20 + 4 * 5 ),
					'ntri_smooth_uv' : parseUInt32( data, offset + 20 + 4 * 6 ),
187

G
gero3 已提交
188 189 190 191
					'nquad_flat'      : parseUInt32( data, offset + 20 + 4 * 7 ),
					'nquad_smooth'    : parseUInt32( data, offset + 20 + 4 * 8 ),
					'nquad_flat_uv'   : parseUInt32( data, offset + 20 + 4 * 9 ),
					'nquad_smooth_uv' : parseUInt32( data, offset + 20 + 4 * 10 )
192 193

				};
G
gero3 已提交
194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234
				/*
							console.log( "signature: " + metaData.signature );

							console.log( "header_bytes: " + metaData.header_bytes );
							console.log( "vertex_coordinate_bytes: " + metaData.vertex_coordinate_bytes );
							console.log( "normal_coordinate_bytes: " + metaData.normal_coordinate_bytes );
							console.log( "uv_coordinate_bytes: " + metaData.uv_coordinate_bytes );

							console.log( "vertex_index_bytes: " + metaData.vertex_index_bytes );
							console.log( "normal_index_bytes: " + metaData.normal_index_bytes );
							console.log( "uv_index_bytes: " + metaData.uv_index_bytes );
							console.log( "material_index_bytes: " + metaData.material_index_bytes );

							console.log( "nvertices: " + metaData.nvertices );
							console.log( "nnormals: " + metaData.nnormals );
							console.log( "nuvs: " + metaData.nuvs );

							console.log( "ntri_flat: " + metaData.ntri_flat );
							console.log( "ntri_smooth: " + metaData.ntri_smooth );
							console.log( "ntri_flat_uv: " + metaData.ntri_flat_uv );
							console.log( "ntri_smooth_uv: " + metaData.ntri_smooth_uv );

							console.log( "nquad_flat: " + metaData.nquad_flat );
							console.log( "nquad_smooth: " + metaData.nquad_smooth );
							console.log( "nquad_flat_uv: " + metaData.nquad_flat_uv );
							console.log( "nquad_smooth_uv: " + metaData.nquad_smooth_uv );

							var total = metaData.header_bytes
									  + metaData.nvertices * metaData.vertex_coordinate_bytes * 3
									  + metaData.nnormals * metaData.normal_coordinate_bytes * 3
									  + metaData.nuvs * metaData.uv_coordinate_bytes * 2
									  + metaData.ntri_flat * ( metaData.vertex_index_bytes*3 + metaData.material_index_bytes )
									  + metaData.ntri_smooth * ( metaData.vertex_index_bytes*3 + metaData.material_index_bytes + metaData.normal_index_bytes*3 )
									  + metaData.ntri_flat_uv * ( metaData.vertex_index_bytes*3 + metaData.material_index_bytes + metaData.uv_index_bytes*3 )
									  + metaData.ntri_smooth_uv * ( metaData.vertex_index_bytes*3 + metaData.material_index_bytes + metaData.normal_index_bytes*3 + metaData.uv_index_bytes*3 )
									  + metaData.nquad_flat * ( metaData.vertex_index_bytes*4 + metaData.material_index_bytes )
									  + metaData.nquad_smooth * ( metaData.vertex_index_bytes*4 + metaData.material_index_bytes + metaData.normal_index_bytes*4 )
									  + metaData.nquad_flat_uv * ( metaData.vertex_index_bytes*4 + metaData.material_index_bytes + metaData.uv_index_bytes*4 )
									  + metaData.nquad_smooth_uv * ( metaData.vertex_index_bytes*4 + metaData.material_index_bytes + metaData.normal_index_bytes*4 + metaData.uv_index_bytes*4 );
							console.log( "total bytes: " + total );
				*/
M
Mr.doob 已提交
235

236
				return metaData;
237

238
			}
239

240
			function parseString( data, offset, length ) {
241

242
				var charArray = new Uint8Array( data, offset, length );
243

244
				var text = "";
245

246
				for ( var i = 0; i < length; i ++ ) {
247

248
					text += String.fromCharCode( charArray[ offset + i ] );
249

250
				}
251

252
				return text;
253

254
			}
255

256
			function parseUChar8( data, offset ) {
257

258
				var charArray = new Uint8Array( data, offset, 1 );
259

260
				return charArray[ 0 ];
261

262
			}
263

264
			function parseUInt32( data, offset ) {
265

266
				var intArray = new Uint32Array( data, offset, 1 );
267

268
				return intArray[ 0 ];
269

270
			}
271

272
			function init_vertices( start ) {
273

274
				var nElements = md.nvertices;
275

276
				var coordArray = new Float32Array( data, start, nElements * 3 );
277

278
				var i, x, y, z;
279

G
gero3 已提交
280
				for ( i = 0; i < nElements; i ++ ) {
281

282 283 284
					x = coordArray[ i * 3 ];
					y = coordArray[ i * 3 + 1 ];
					z = coordArray[ i * 3 + 2 ];
285

286
					scope.vertices.push( new THREE.Vector3( x, y, z ) );
287

288
				}
289

290
				return nElements * 3 * Float32Array.BYTES_PER_ELEMENT;
291 292 293

			}

294
			function init_normals( start ) {
295

296
				var nElements = md.nnormals;
297

298
				if ( nElements ) {
299

300
					var normalArray = new Int8Array( data, start, nElements * 3 );
301

302
					var i, x, y, z;
303

G
gero3 已提交
304
					for ( i = 0; i < nElements; i ++ ) {
305

306 307 308
						x = normalArray[ i * 3 ];
						y = normalArray[ i * 3 + 1 ];
						z = normalArray[ i * 3 + 2 ];
309

G
gero3 已提交
310
						normals.push( x / 127, y / 127, z / 127 );
311

312
					}
313 314

				}
315

316
				return nElements * 3 * Int8Array.BYTES_PER_ELEMENT;
317

318
			}
319

320
			function init_uvs( start ) {
321

322
				var nElements = md.nuvs;
323

324
				if ( nElements ) {
325

326
					var uvArray = new Float32Array( data, start, nElements * 2 );
327

328
					var i, u, v;
329

G
gero3 已提交
330
					for ( i = 0; i < nElements; i ++ ) {
331

332 333
						u = uvArray[ i * 2 ];
						v = uvArray[ i * 2 + 1 ];
334

335
						uvs.push( u, v );
336

337
					}
338 339

				}
340

341
				return nElements * 2 * Float32Array.BYTES_PER_ELEMENT;
342

343
			}
344

345
			function init_uvs3( nElements, offset ) {
346

347
				var i, uva, uvb, uvc, u1, u2, u3, v1, v2, v3;
348

349
				var uvIndexBuffer = new Uint32Array( data, offset, 3 * nElements );
350

G
gero3 已提交
351
				for ( i = 0; i < nElements; i ++ ) {
352

353 354 355
					uva = uvIndexBuffer[ i * 3 ];
					uvb = uvIndexBuffer[ i * 3 + 1 ];
					uvc = uvIndexBuffer[ i * 3 + 2 ];
356

G
gero3 已提交
357 358
					u1 = uvs[ uva * 2 ];
					v1 = uvs[ uva * 2 + 1 ];
359

G
gero3 已提交
360 361
					u2 = uvs[ uvb * 2 ];
					v2 = uvs[ uvb * 2 + 1 ];
362

G
gero3 已提交
363 364
					u3 = uvs[ uvc * 2 ];
					v3 = uvs[ uvc * 2 + 1 ];
365

366 367 368 369 370
					scope.faceVertexUvs[ 0 ].push( [
						new THREE.Vector2( u1, v1 ),
						new THREE.Vector2( u2, v2 ),
						new THREE.Vector2( u3, v3 )
					] );
371

372
				}
373 374

			}
375

376
			function init_uvs4( nElements, offset ) {
377

378
				var i, uva, uvb, uvc, uvd, u1, u2, u3, u4, v1, v2, v3, v4;
379

380
				var uvIndexBuffer = new Uint32Array( data, offset, 4 * nElements );
381

G
gero3 已提交
382
				for ( i = 0; i < nElements; i ++ ) {
383

384 385 386 387
					uva = uvIndexBuffer[ i * 4 ];
					uvb = uvIndexBuffer[ i * 4 + 1 ];
					uvc = uvIndexBuffer[ i * 4 + 2 ];
					uvd = uvIndexBuffer[ i * 4 + 3 ];
388

G
gero3 已提交
389 390
					u1 = uvs[ uva * 2 ];
					v1 = uvs[ uva * 2 + 1 ];
391

G
gero3 已提交
392 393
					u2 = uvs[ uvb * 2 ];
					v2 = uvs[ uvb * 2 + 1 ];
394

G
gero3 已提交
395 396
					u3 = uvs[ uvc * 2 ];
					v3 = uvs[ uvc * 2 + 1 ];
397

G
gero3 已提交
398 399
					u4 = uvs[ uvd * 2 ];
					v4 = uvs[ uvd * 2 + 1 ];
400

401 402 403 404 405
					scope.faceVertexUvs[ 0 ].push( [
						new THREE.Vector2( u1, v1 ),
						new THREE.Vector2( u2, v2 ),
						new THREE.Vector2( u4, v4 )
					] );
406

407 408 409 410 411
					scope.faceVertexUvs[ 0 ].push( [
						new THREE.Vector2( u2, v2 ),
						new THREE.Vector2( u3, v3 ),
						new THREE.Vector2( u4, v4 )
					] );
M
Mr.doob 已提交
412

413
				}
414 415

			}
416

417
			function init_faces3_flat( nElements, offsetVertices, offsetMaterials ) {
418

419
				var i, a, b, c, m;
420

421 422
				var vertexIndexBuffer = new Uint32Array( data, offsetVertices, 3 * nElements );
				var materialIndexBuffer = new Uint16Array( data, offsetMaterials, nElements );
423

G
gero3 已提交
424
				for ( i = 0; i < nElements; i ++ ) {
425

426 427 428
					a = vertexIndexBuffer[ i * 3 ];
					b = vertexIndexBuffer[ i * 3 + 1 ];
					c = vertexIndexBuffer[ i * 3 + 2 ];
429

430
					m = materialIndexBuffer[ i ];
431

M
Mr.doob 已提交
432
					scope.faces.push( new THREE.Face3( a, b, c, null, null, m ) );
433

434
				}
435

436
			}
437

438
			function init_faces4_flat( nElements, offsetVertices, offsetMaterials ) {
439

440
				var i, a, b, c, d, m;
441

442 443
				var vertexIndexBuffer = new Uint32Array( data, offsetVertices, 4 * nElements );
				var materialIndexBuffer = new Uint16Array( data, offsetMaterials, nElements );
444

G
gero3 已提交
445
				for ( i = 0; i < nElements; i ++ ) {
446

447 448 449 450
					a = vertexIndexBuffer[ i * 4 ];
					b = vertexIndexBuffer[ i * 4 + 1 ];
					c = vertexIndexBuffer[ i * 4 + 2 ];
					d = vertexIndexBuffer[ i * 4 + 3 ];
451

452
					m = materialIndexBuffer[ i ];
453

M
Mr.doob 已提交
454 455
					scope.faces.push( new THREE.Face3( a, b, d, null, null, m ) );
					scope.faces.push( new THREE.Face3( b, c, d, null, null, m ) );
456

457
				}
458 459

			}
460

461
			function init_faces3_smooth( nElements, offsetVertices, offsetNormals, offsetMaterials ) {
462

463 464
				var i, a, b, c, m;
				var na, nb, nc;
465

466 467 468
				var vertexIndexBuffer = new Uint32Array( data, offsetVertices, 3 * nElements );
				var normalIndexBuffer = new Uint32Array( data, offsetNormals, 3 * nElements );
				var materialIndexBuffer = new Uint16Array( data, offsetMaterials, nElements );
469

G
gero3 已提交
470
				for ( i = 0; i < nElements; i ++ ) {
471

472 473 474
					a = vertexIndexBuffer[ i * 3 ];
					b = vertexIndexBuffer[ i * 3 + 1 ];
					c = vertexIndexBuffer[ i * 3 + 2 ];
475

476 477 478
					na = normalIndexBuffer[ i * 3 ];
					nb = normalIndexBuffer[ i * 3 + 1 ];
					nc = normalIndexBuffer[ i * 3 + 2 ];
479

480
					m = materialIndexBuffer[ i ];
481

G
gero3 已提交
482 483 484
					var nax = normals[ na * 3 ],
						nay = normals[ na * 3 + 1 ],
						naz = normals[ na * 3 + 2 ],
485

G
gero3 已提交
486 487 488
						nbx = normals[ nb * 3 ],
						nby = normals[ nb * 3 + 1 ],
						nbz = normals[ nb * 3 + 2 ],
M
Mr.doob 已提交
489

G
gero3 已提交
490 491 492
						ncx = normals[ nc * 3 ],
						ncy = normals[ nc * 3 + 1 ],
						ncz = normals[ nc * 3 + 2 ];
M
Mr.doob 已提交
493

494 495 496 497
					scope.faces.push( new THREE.Face3( a, b, c, [
						new THREE.Vector3( nax, nay, naz ),
						new THREE.Vector3( nbx, nby, nbz ),
						new THREE.Vector3( ncx, ncy, ncz )
M
Mr.doob 已提交
498
					], null, m ) );
M
Mr.doob 已提交
499

500
				}
501 502

			}
503

504
			function init_faces4_smooth( nElements, offsetVertices, offsetNormals, offsetMaterials ) {
505

506 507
				var i, a, b, c, d, m;
				var na, nb, nc, nd;
508

509 510 511
				var vertexIndexBuffer = new Uint32Array( data, offsetVertices, 4 * nElements );
				var normalIndexBuffer = new Uint32Array( data, offsetNormals, 4 * nElements );
				var materialIndexBuffer = new Uint16Array( data, offsetMaterials, nElements );
512

G
gero3 已提交
513
				for ( i = 0; i < nElements; i ++ ) {
514

515 516 517 518
					a = vertexIndexBuffer[ i * 4 ];
					b = vertexIndexBuffer[ i * 4 + 1 ];
					c = vertexIndexBuffer[ i * 4 + 2 ];
					d = vertexIndexBuffer[ i * 4 + 3 ];
519

520 521 522 523
					na = normalIndexBuffer[ i * 4 ];
					nb = normalIndexBuffer[ i * 4 + 1 ];
					nc = normalIndexBuffer[ i * 4 + 2 ];
					nd = normalIndexBuffer[ i * 4 + 3 ];
524

525
					m = materialIndexBuffer[ i ];
526

G
gero3 已提交
527 528 529
					var nax = normals[ na * 3 ],
						nay = normals[ na * 3 + 1 ],
						naz = normals[ na * 3 + 2 ],
530

G
gero3 已提交
531 532 533
						nbx = normals[ nb * 3 ],
						nby = normals[ nb * 3 + 1 ],
						nbz = normals[ nb * 3 + 2 ],
M
Mr.doob 已提交
534

G
gero3 已提交
535 536 537
						ncx = normals[ nc * 3 ],
						ncy = normals[ nc * 3 + 1 ],
						ncz = normals[ nc * 3 + 2 ],
M
Mr.doob 已提交
538

G
gero3 已提交
539 540 541
						ndx = normals[ nd * 3 ],
						ndy = normals[ nd * 3 + 1 ],
						ndz = normals[ nd * 3 + 2 ];
M
Mr.doob 已提交
542

543 544 545 546
					scope.faces.push( new THREE.Face3( a, b, d, [
						new THREE.Vector3( nax, nay, naz ),
						new THREE.Vector3( nbx, nby, nbz ),
						new THREE.Vector3( ndx, ndy, ndz )
M
Mr.doob 已提交
547
					], null, m ) );
M
Mr.doob 已提交
548

549 550 551 552
					scope.faces.push( new THREE.Face3( b, c, d, [
						new THREE.Vector3( nbx, nby, nbz ),
						new THREE.Vector3( ncx, ncy, ncz ),
						new THREE.Vector3( ndx, ndy, ndz )
M
Mr.doob 已提交
553
					], null, m ) );
M
Mr.doob 已提交
554

555
				}
556 557

			}
558

559
			function init_triangles_flat( start ) {
560

561
				var nElements = md.ntri_flat;
562

563
				if ( nElements ) {
564

565 566
					var offsetMaterials = start + nElements * Uint32Array.BYTES_PER_ELEMENT * 3;
					init_faces3_flat( nElements, start, offsetMaterials );
567

568
				}
569 570 571

			}

572
			function init_triangles_flat_uv( start ) {
573

574
				var nElements = md.ntri_flat_uv;
575

576
				if ( nElements ) {
577

578 579
					var offsetUvs = start + nElements * Uint32Array.BYTES_PER_ELEMENT * 3;
					var offsetMaterials = offsetUvs + nElements * Uint32Array.BYTES_PER_ELEMENT * 3;
580

581 582
					init_faces3_flat( nElements, start, offsetMaterials );
					init_uvs3( nElements, offsetUvs );
583

584
				}
585

586
			}
587

588
			function init_triangles_smooth( start ) {
589

590
				var nElements = md.ntri_smooth;
591

592
				if ( nElements ) {
593

594 595
					var offsetNormals = start + nElements * Uint32Array.BYTES_PER_ELEMENT * 3;
					var offsetMaterials = offsetNormals + nElements * Uint32Array.BYTES_PER_ELEMENT * 3;
596

597
					init_faces3_smooth( nElements, start, offsetNormals, offsetMaterials );
598

599
				}
600

601
			}
602

603
			function init_triangles_smooth_uv( start ) {
604

605
				var nElements = md.ntri_smooth_uv;
606

607
				if ( nElements ) {
608

609 610 611
					var offsetNormals = start + nElements * Uint32Array.BYTES_PER_ELEMENT * 3;
					var offsetUvs = offsetNormals + nElements * Uint32Array.BYTES_PER_ELEMENT * 3;
					var offsetMaterials = offsetUvs + nElements * Uint32Array.BYTES_PER_ELEMENT * 3;
612

613 614
					init_faces3_smooth( nElements, start, offsetNormals, offsetMaterials );
					init_uvs3( nElements, offsetUvs );
615

616
				}
617

618
			}
619

620
			function init_quads_flat( start ) {
621

622
				var nElements = md.nquad_flat;
623

624
				if ( nElements ) {
625

626 627
					var offsetMaterials = start + nElements * Uint32Array.BYTES_PER_ELEMENT * 4;
					init_faces4_flat( nElements, start, offsetMaterials );
628

629
				}
630 631 632

			}

633
			function init_quads_flat_uv( start ) {
634

635
				var nElements = md.nquad_flat_uv;
636

637
				if ( nElements ) {
638

639 640
					var offsetUvs = start + nElements * Uint32Array.BYTES_PER_ELEMENT * 4;
					var offsetMaterials = offsetUvs + nElements * Uint32Array.BYTES_PER_ELEMENT * 4;
641

642 643
					init_faces4_flat( nElements, start, offsetMaterials );
					init_uvs4( nElements, offsetUvs );
644

645
				}
646

647
			}
648

649
			function init_quads_smooth( start ) {
650

651
				var nElements = md.nquad_smooth;
652

653
				if ( nElements ) {
654

655 656
					var offsetNormals = start + nElements * Uint32Array.BYTES_PER_ELEMENT * 4;
					var offsetMaterials = offsetNormals + nElements * Uint32Array.BYTES_PER_ELEMENT * 4;
657

658
					init_faces4_smooth( nElements, start, offsetNormals, offsetMaterials );
659

660
				}
661

662
			}
663

664
			function init_quads_smooth_uv( start ) {
665

666
				var nElements = md.nquad_smooth_uv;
667

668
				if ( nElements ) {
669

670 671 672
					var offsetNormals = start + nElements * Uint32Array.BYTES_PER_ELEMENT * 4;
					var offsetUvs = offsetNormals + nElements * Uint32Array.BYTES_PER_ELEMENT * 4;
					var offsetMaterials = offsetUvs + nElements * Uint32Array.BYTES_PER_ELEMENT * 4;
673

674 675
					init_faces4_smooth( nElements, start, offsetNormals, offsetMaterials );
					init_uvs4( nElements, offsetUvs );
676

677
				}
678

679
			}
680

681
		};
682

683 684
		Model.prototype = Object.create( THREE.Geometry.prototype );
		Model.prototype.constructor = Model;
685

686
		var geometry = new Model( texturePath );
J
James Kiefer 已提交
687
		var materials = THREE.Loader.prototype.initMaterials( jsonMaterials, texturePath, this.crossOrigin );
688

689
		if ( THREE.Loader.prototype.needsTangents( materials ) ) geometry.computeTangents();
690

691
		callback( geometry, materials );
692

693
	}
694

695
};