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

5
THREE.Loader = function ( showStatus ) {
6

7
	this.showStatus = showStatus;
A
alteredq 已提交
8
	this.statusDomElement = showStatus ? THREE.Loader.prototype.addStatusElement() : null;
9

10
	this.onLoadStart = function () {};
M
Mr.doob 已提交
11
	this.onLoadProgress = function () {};
12 13
	this.onLoadComplete = function () {};

14
};
15 16 17

THREE.Loader.prototype = {

M
Mr.doob 已提交
18 19
	constructor: THREE.Loader,

20
	crossOrigin: undefined,
21

22 23
	addStatusElement: function () {

24 25 26 27 28 29 30 31 32 33 34
		var e = document.createElement( 'div' );

		e.style.position = 'absolute';
		e.style.right = '0px';
		e.style.top = '0px';
		e.style.fontSize = '0.8em';
		e.style.textAlign = 'left';
		e.style.background = 'rgba(0,0,0,0.25)';
		e.style.color = '#fff';
		e.style.width = '120px';
		e.style.padding = '0.5em 0.5em 0.5em 0.5em';
35
		e.style.zIndex = 1000;
36

37
		e.innerHTML = 'Loading ...';
38

39
		return e;
40

41
	},
42

43 44
	updateProgress: function ( progress ) {

45
		var message = 'Loaded ';
46 47 48

		if ( progress.total ) {

49
			message += ( 100 * progress.loaded / progress.total ).toFixed( 0 ) + '%';
50 51 52 53


		} else {

54
			message += ( progress.loaded / 1024 ).toFixed( 2 ) + ' KB';
55 56 57 58 59 60

		}

		this.statusDomElement.innerHTML = message;

	},
61

M
Mr.doob 已提交
62
	extractUrlBase: function ( url ) {
63

M
Mr.doob 已提交
64
		var parts = url.split( '/' );
M
Mr.doob 已提交
65 66 67

		if ( parts.length === 1 ) return './';

M
Mr.doob 已提交
68
		parts.pop();
M
Mr.doob 已提交
69 70

		return parts.join( '/' ) + '/';
71

72 73
	},

74
	initMaterials: function ( materials, texturePath, crossOrigin ) {
75

76
		var array = [];
77

78
		for ( var i = 0; i < materials.length; ++ i ) {
79

80
			array[ i ] = this.createMaterial( materials[ i ], texturePath, crossOrigin );
81 82 83

		}

84 85
		return array;

86 87
	},

88
	needsTangents: function ( materials ) {
M
Mr.doob 已提交
89

90
		for ( var i = 0, il = materials.length; i < il; i ++ ) {
M
Mr.doob 已提交
91

92
			var m = materials[ i ];
M
Mr.doob 已提交
93

94
			if ( m instanceof THREE.ShaderMaterial ) return true;
M
Mr.doob 已提交
95 96 97 98 99 100 101

		}

		return false;

	},

102
	createMaterial: ( function () {
103

104
		var imageLoader;
105

106
		return function ( m, texturePath, crossOrigin ) {
107

J
James Kiefer 已提交
108
			var scope = this;
109

J
James Kiefer 已提交
110
			if ( crossOrigin === undefined && scope.crossOrigin !== undefined ) crossOrigin = scope.crossOrigin;
111

112
			if ( imageLoader === undefined ) imageLoader = new THREE.ImageLoader();
113

J
James Kiefer 已提交
114
			function nearest_pow2( n ) {
M
Mr.doob 已提交
115

J
James Kiefer 已提交
116 117
				var l = Math.log( n ) / Math.LN2;
				return Math.pow( 2, Math.round(  l ) );
M
Mr.doob 已提交
118

J
James Kiefer 已提交
119
			}
120

J
James Kiefer 已提交
121
			function create_texture( where, name, sourceFile, repeat, offset, wrap, anisotropy ) {
M
Mr.doob 已提交
122

J
James Kiefer 已提交
123
				var fullPath = texturePath + sourceFile;
M
Mr.doob 已提交
124

J
James Kiefer 已提交
125
				var texture;
M
Mr.doob 已提交
126

J
James Kiefer 已提交
127
				var loader = THREE.Loader.Handlers.get( fullPath );
M
Mr.doob 已提交
128

J
James Kiefer 已提交
129
				if ( loader !== null ) {
M
Mr.doob 已提交
130

J
James Kiefer 已提交
131
					texture = loader.load( fullPath );
M
Mr.doob 已提交
132

J
James Kiefer 已提交
133
				} else {
M
Mr.doob 已提交
134

J
James Kiefer 已提交
135
					texture = new THREE.Texture();
136

137
					loader = imageLoader;
J
James Kiefer 已提交
138 139
					loader.setCrossOrigin( crossOrigin );
					loader.load( fullPath, function ( image ) {
M
Mr.doob 已提交
140 141 142 143

					if ( THREE.Math.isPowerOfTwo( image.width ) === false ||
						 THREE.Math.isPowerOfTwo( image.height ) === false ) {

J
James Kiefer 已提交
144 145
							var width = nearest_pow2( image.width );
							var height = nearest_pow2( image.height );
M
Mr.doob 已提交
146

J
James Kiefer 已提交
147 148 149
							var canvas = document.createElement( 'canvas' );
							canvas.width = width;
							canvas.height = height;
150

J
James Kiefer 已提交
151 152
							var context = canvas.getContext( '2d' );
							context.drawImage( image, 0, 0, width, height );
M
Mr.doob 已提交
153

J
James Kiefer 已提交
154
							texture.image = canvas;
M
Mr.doob 已提交
155

J
James Kiefer 已提交
156
						} else {
M
Mr.doob 已提交
157

J
James Kiefer 已提交
158
							texture.image = image;
M
Mr.doob 已提交
159

J
James Kiefer 已提交
160
						}
M
Mr.doob 已提交
161

J
James Kiefer 已提交
162
						texture.needsUpdate = true;
M
Mr.doob 已提交
163

J
James Kiefer 已提交
164
					} );
M
Mr.doob 已提交
165

J
James Kiefer 已提交
166
				}
M
Mr.doob 已提交
167

J
James Kiefer 已提交
168
				texture.sourceFile = sourceFile;
M
Mr.doob 已提交
169

J
James Kiefer 已提交
170
				if ( repeat ) {
M
Mr.doob 已提交
171

J
James Kiefer 已提交
172
					texture.repeat.set( repeat[ 0 ], repeat[ 1 ] );
M
Mr.doob 已提交
173

J
James Kiefer 已提交
174 175
					if ( repeat[ 0 ] !== 1 ) texture.wrapS = THREE.RepeatWrapping;
					if ( repeat[ 1 ] !== 1 ) texture.wrapT = THREE.RepeatWrapping;
M
Mr.doob 已提交
176

J
James Kiefer 已提交
177
				}
M
Mr.doob 已提交
178

J
James Kiefer 已提交
179
				if ( offset ) {
M
Mr.doob 已提交
180

J
James Kiefer 已提交
181
					texture.offset.set( offset[ 0 ], offset[ 1 ] );
M
Mr.doob 已提交
182 183 184

				}

J
James Kiefer 已提交
185
				if ( wrap ) {
M
Mr.doob 已提交
186

J
James Kiefer 已提交
187 188 189
					var wrapMap = {
						'repeat': THREE.RepeatWrapping,
						'mirror': THREE.MirroredRepeatWrapping
190
					};
M
Mr.doob 已提交
191

J
James Kiefer 已提交
192 193
					if ( wrapMap[ wrap[ 0 ] ] !== undefined ) texture.wrapS = wrapMap[ wrap[ 0 ] ];
					if ( wrapMap[ wrap[ 1 ] ] !== undefined ) texture.wrapT = wrapMap[ wrap[ 1 ] ];
M
Mr.doob 已提交
194

J
James Kiefer 已提交
195
				}
M
Mr.doob 已提交
196

J
James Kiefer 已提交
197
				if ( anisotropy ) {
198

J
James Kiefer 已提交
199
					texture.anisotropy = anisotropy;
200

J
James Kiefer 已提交
201
				}
202

J
James Kiefer 已提交
203
				where[ name ] = texture;
M
Mr.doob 已提交
204

J
James Kiefer 已提交
205
			}
M
Mr.doob 已提交
206

J
James Kiefer 已提交
207
			function rgb2hex( rgb ) {
M
Mr.doob 已提交
208

J
James Kiefer 已提交
209
				return ( rgb[ 0 ] * 255 << 16 ) + ( rgb[ 1 ] * 255 << 8 ) + rgb[ 2 ] * 255;
M
Mr.doob 已提交
210

J
James Kiefer 已提交
211
			}
M
Mr.doob 已提交
212

J
James Kiefer 已提交
213
			// defaults
214

J
James Kiefer 已提交
215 216
			var mtype = 'MeshLambertMaterial';
			var mpars = { color: 0xeeeeee, opacity: 1.0, map: null, lightMap: null, normalMap: null, bumpMap: null, wireframe: false };
M
Mr.doob 已提交
217

J
James Kiefer 已提交
218
			// parameters from model file
219

J
James Kiefer 已提交
220
			if ( m.shading ) {
221

J
James Kiefer 已提交
222
				var shading = m.shading.toLowerCase();
223

J
James Kiefer 已提交
224 225
				if ( shading === 'phong' ) mtype = 'MeshPhongMaterial';
				else if ( shading === 'basic' ) mtype = 'MeshBasicMaterial';
226

J
James Kiefer 已提交
227
			}
M
Mr.doob 已提交
228

J
James Kiefer 已提交
229
			if ( m.blending !== undefined && THREE[ m.blending ] !== undefined ) {
M
Mr.doob 已提交
230

J
James Kiefer 已提交
231
				mpars.blending = THREE[ m.blending ];
232

J
James Kiefer 已提交
233
			}
M
Mr.doob 已提交
234

235
			if ( m.transparent !== undefined ) {
M
Mr.doob 已提交
236

J
James Kiefer 已提交
237
				mpars.transparent = m.transparent;
238

J
James Kiefer 已提交
239
			}
M
Mr.doob 已提交
240

241
			if ( m.opacity !== undefined && m.opacity < 1.0 ) {
M
Mr.doob 已提交
242

243
				mpars.transparent = true;
M
Mr.doob 已提交
244

245
			}
246

J
James Kiefer 已提交
247
			if ( m.depthTest !== undefined ) {
M
Mr.doob 已提交
248

J
James Kiefer 已提交
249
				mpars.depthTest = m.depthTest;
250

J
James Kiefer 已提交
251
			}
M
Mr.doob 已提交
252

J
James Kiefer 已提交
253
			if ( m.depthWrite !== undefined ) {
254

J
James Kiefer 已提交
255
				mpars.depthWrite = m.depthWrite;
256

J
James Kiefer 已提交
257
			}
258

J
James Kiefer 已提交
259
			if ( m.visible !== undefined ) {
260

J
James Kiefer 已提交
261
				mpars.visible = m.visible;
262

J
James Kiefer 已提交
263
			}
264

J
James Kiefer 已提交
265
			if ( m.flipSided !== undefined ) {
266

J
James Kiefer 已提交
267
				mpars.side = THREE.BackSide;
268

J
James Kiefer 已提交
269
			}
270

J
James Kiefer 已提交
271
			if ( m.doubleSided !== undefined ) {
272

J
James Kiefer 已提交
273
				mpars.side = THREE.DoubleSide;
274

J
James Kiefer 已提交
275
			}
276

J
James Kiefer 已提交
277
			if ( m.wireframe !== undefined ) {
278

J
James Kiefer 已提交
279
				mpars.wireframe = m.wireframe;
280

J
James Kiefer 已提交
281 282 283
			}

			if ( m.vertexColors !== undefined ) {
284

J
James Kiefer 已提交
285
				if ( m.vertexColors === 'face' ) {
M
Mr.doob 已提交
286

J
James Kiefer 已提交
287
					mpars.vertexColors = THREE.FaceColors;
M
Mr.doob 已提交
288

J
James Kiefer 已提交
289
				} else if ( m.vertexColors ) {
M
Mr.doob 已提交
290

J
James Kiefer 已提交
291
					mpars.vertexColors = THREE.VertexColors;
M
Mr.doob 已提交
292

J
James Kiefer 已提交
293
				}
M
Mr.doob 已提交
294 295 296

			}

J
James Kiefer 已提交
297
			// colors
M
Mr.doob 已提交
298

J
James Kiefer 已提交
299
			if ( m.colorDiffuse ) {
300

J
James Kiefer 已提交
301
				mpars.color = rgb2hex( m.colorDiffuse );
302

J
James Kiefer 已提交
303
			} else if ( m.DbgColor ) {
304

J
James Kiefer 已提交
305
				mpars.color = m.DbgColor;
306

J
James Kiefer 已提交
307
			}
308

J
James Kiefer 已提交
309
			if ( m.colorSpecular ) {
310

J
James Kiefer 已提交
311
				mpars.specular = rgb2hex( m.colorSpecular );
312

J
James Kiefer 已提交
313
			}
314

J
James Kiefer 已提交
315
			if ( m.colorEmissive ) {
316

J
James Kiefer 已提交
317
				mpars.emissive = rgb2hex( m.colorEmissive );
A
Alessandro Piva 已提交
318

J
James Kiefer 已提交
319
			}
A
Alessandro Piva 已提交
320

J
James Kiefer 已提交
321
			// modifiers
A
Alessandro Piva 已提交
322

323
			if ( m.transparency !== undefined ) {
324

325 326
				console.warn( 'THREE.Loader: transparency has been renamed to opacity' );
				m.opacity = m.transparency;
M
Mr.doob 已提交
327

328
			}
M
Mr.doob 已提交
329

330
			if ( m.opacity !== undefined ) {
M
Mr.doob 已提交
331

332
				mpars.opacity = m.opacity;
Y
yomotsu 已提交
333

J
James Kiefer 已提交
334
			}
Y
yomotsu 已提交
335

J
James Kiefer 已提交
336
			if ( m.specularCoef ) {
Y
yomotsu 已提交
337

J
James Kiefer 已提交
338
				mpars.shininess = m.specularCoef;
M
Mr.doob 已提交
339

J
James Kiefer 已提交
340
			}
M
Mr.doob 已提交
341

J
James Kiefer 已提交
342
			// textures
M
Mr.doob 已提交
343

J
James Kiefer 已提交
344
			if ( m.mapDiffuse && texturePath ) {
M
Mr.doob 已提交
345

J
James Kiefer 已提交
346
				create_texture( mpars, 'map', m.mapDiffuse, m.mapDiffuseRepeat, m.mapDiffuseOffset, m.mapDiffuseWrap, m.mapDiffuseAnisotropy );
M
Mr.doob 已提交
347

J
James Kiefer 已提交
348
			}
349

J
James Kiefer 已提交
350
			if ( m.mapLight && texturePath ) {
351

J
James Kiefer 已提交
352
				create_texture( mpars, 'lightMap', m.mapLight, m.mapLightRepeat, m.mapLightOffset, m.mapLightWrap, m.mapLightAnisotropy );
353

J
James Kiefer 已提交
354
			}
M
Mr.doob 已提交
355

356
			if ( m.mapAO && texturePath ) {
357

358
				create_texture( mpars, 'aoMap', m.mapAO, m.mapAORepeat, m.mapAOOffset, m.mapAOWrap, m.mapAOAnisotropy );
B
Ben Houston 已提交
359

360
			}
B
Ben Houston 已提交
361

J
James Kiefer 已提交
362
			if ( m.mapBump && texturePath ) {
B
Ben Houston 已提交
363

J
James Kiefer 已提交
364
				create_texture( mpars, 'bumpMap', m.mapBump, m.mapBumpRepeat, m.mapBumpOffset, m.mapBumpWrap, m.mapBumpAnisotropy );
365

J
James Kiefer 已提交
366
			}
367

J
James Kiefer 已提交
368
			if ( m.mapNormal && texturePath ) {
369

J
James Kiefer 已提交
370
				create_texture( mpars, 'normalMap', m.mapNormal, m.mapNormalRepeat, m.mapNormalOffset, m.mapNormalWrap, m.mapNormalAnisotropy );
371

J
James Kiefer 已提交
372
			}
M
Mr.doob 已提交
373

J
James Kiefer 已提交
374
			if ( m.mapSpecular && texturePath ) {
375

J
James Kiefer 已提交
376
				create_texture( mpars, 'specularMap', m.mapSpecular, m.mapSpecularRepeat, m.mapSpecularOffset, m.mapSpecularWrap, m.mapSpecularAnisotropy );
377

J
James Kiefer 已提交
378
			}
379

J
James Kiefer 已提交
380
			if ( m.mapAlpha && texturePath ) {
381

J
James Kiefer 已提交
382
				create_texture( mpars, 'alphaMap', m.mapAlpha, m.mapAlphaRepeat, m.mapAlphaOffset, m.mapAlphaWrap, m.mapAlphaAnisotropy );
383

J
James Kiefer 已提交
384
			}
385

J
James Kiefer 已提交
386
			//
387

J
James Kiefer 已提交
388
			if ( m.mapBumpScale ) {
389

J
James Kiefer 已提交
390
				mpars.bumpScale = m.mapBumpScale;
391

J
James Kiefer 已提交
392
			}
393

394
			if ( m.mapNormalFactor ) {
395

396
				mpars.normalScale = new THREE.Vector2( m.mapNormalFactor, m.mapNormalFactor );
M
Mr.doob 已提交
397

J
James Kiefer 已提交
398
			}
M
Mr.doob 已提交
399

400
			var material = new THREE[ mtype ]( mpars );
401

J
James Kiefer 已提交
402
			if ( m.DbgName !== undefined ) material.name = m.DbgName;
403

J
James Kiefer 已提交
404
			return material;
A
alteredq 已提交
405

406
		};
407

408
	} )()
409

410
};
M
Mr.doob 已提交
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

THREE.Loader.Handlers = {

	handlers: [],

	add: function ( regex, loader ) {

		this.handlers.push( regex, loader );

	},

	get: function ( file ) {

		for ( var i = 0, l = this.handlers.length; i < l; i += 2 ) {

			var regex = this.handlers[ i ];
			var loader  = this.handlers[ i + 1 ];

			if ( regex.test( file ) ) {

				return loader;

			}

		}

		return null;

	}

};