Loader.js 8.3 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 11
	this.imageLoader = new THREE.ImageLoader();

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

16
};
17 18 19

THREE.Loader.prototype = {

M
Mr.doob 已提交
20 21
	constructor: THREE.Loader,

22
	crossOrigin: undefined,
23

24 25
	addStatusElement: function () {

26
		var e = document.createElement( "div" );
27

M
Mr.doob 已提交
28 29 30 31
		e.style.position = "absolute";
		e.style.right = "0px";
		e.style.top = "0px";
		e.style.fontSize = "0.8em";
32
		e.style.textAlign = "left";
M
Mr.doob 已提交
33 34 35 36
		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";
37
		e.style.zIndex = 1000;
38

39
		e.innerHTML = "Loading ...";
40

41
		return e;
42

43
	},
44

45 46 47 48 49 50 51 52 53 54 55
	updateProgress: function ( progress ) {

		var message = "Loaded ";

		if ( progress.total ) {

			message += ( 100 * progress.loaded / progress.total ).toFixed(0) + "%";


		} else {

S
srifqi 已提交
56
			message += ( progress.loaded / 1024 ).toFixed(2) + " KB";
57 58 59 60 61 62

		}

		this.statusDomElement.innerHTML = message;

	},
63

M
Mr.doob 已提交
64
	extractUrlBase: function ( url ) {
65

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

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

M
Mr.doob 已提交
70
		parts.pop();
M
Mr.doob 已提交
71 72

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

74 75
	},

76
	initMaterials: function ( materials, texturePath ) {
77

78
		var array = [];
79

80
		for ( var i = 0; i < materials.length; ++ i ) {
81

82
			array[ i ] = this.createMaterial( materials[ i ], texturePath );
83 84 85

		}

86 87
		return array;

88 89
	},

90
	needsTangents: function ( materials ) {
M
Mr.doob 已提交
91

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

94
			var m = materials[ i ];
M
Mr.doob 已提交
95

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

		}

		return false;

	},

104
	createMaterial: function ( m, texturePath ) {
105

106
		var scope = this;
107

108 109 110 111 112 113 114
		function nearest_pow2( n ) {

			var l = Math.log( n ) / Math.LN2;
			return Math.pow( 2, Math.round(  l ) );

		}

115
		function create_texture( where, name, sourceFile, repeat, offset, wrap, anisotropy ) {
M
Mr.doob 已提交
116

M
Mr.doob 已提交
117
			var fullPath = texturePath + sourceFile;
118

119
			where[ name ] = new THREE.Texture( document.createElement( 'canvas' ) );
M
Mr.doob 已提交
120 121
			where[ name ].sourceFile = sourceFile;

122
			if ( repeat ) {
M
Mr.doob 已提交
123 124 125

				where[ name ].repeat.set( repeat[ 0 ], repeat[ 1 ] );

126 127
				if ( repeat[ 0 ] !== 1 ) where[ name ].wrapS = THREE.RepeatWrapping;
				if ( repeat[ 1 ] !== 1 ) where[ name ].wrapT = THREE.RepeatWrapping;
M
Mr.doob 已提交
128 129 130

			}

131
			if ( offset ) {
M
Mr.doob 已提交
132 133 134 135 136

				where[ name ].offset.set( offset[ 0 ], offset[ 1 ] );

			}

137
			if ( wrap ) {
M
Mr.doob 已提交
138 139

				var wrapMap = {
140 141
					"repeat": THREE.RepeatWrapping,
					"mirror": THREE.MirroredRepeatWrapping
M
Mr.doob 已提交
142 143 144 145 146 147 148
				}

				if ( wrapMap[ wrap[ 0 ] ] !== undefined ) where[ name ].wrapS = wrapMap[ wrap[ 0 ] ];
				if ( wrapMap[ wrap[ 1 ] ] !== undefined ) where[ name ].wrapT = wrapMap[ wrap[ 1 ] ];

			}

149 150 151 152 153 154
			if ( anisotropy ) {

				where[ name ].anisotropy = anisotropy;

			}

155
			var texture = where[ name ];
156

157 158
			scope.imageLoader.crossOrigin = scope.crossOrigin;
			scope.imageLoader.load( fullPath, function ( image ) {
159

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

163 164
					var width = nearest_pow2( image.width );
					var height = nearest_pow2( image.height );
165

166 167 168
					texture.image.width = width;
					texture.image.height = height;
					texture.image.getContext( '2d' ).drawImage( image, 0, 0, width, height );
169

170
				} else {
171

172
					texture.image = image;
173

174
				}
175

176
				texture.needsUpdate = true;
177

178
			} );
M
Mr.doob 已提交
179 180 181

		}

182
		function rgb2hex( rgb ) {
M
Mr.doob 已提交
183 184 185 186 187

			return ( rgb[ 0 ] * 255 << 16 ) + ( rgb[ 1 ] * 255 << 8 ) + rgb[ 2 ] * 255;

		}

188
		// defaults
189

190
		var mtype = "MeshLambertMaterial";
191
		var mpars = { color: 0xeeeeee, opacity: 1.0, map: null, lightMap: null, normalMap: null, bumpMap: null, wireframe: false };
M
Mr.doob 已提交
192

193
		// parameters from model file
194

195
		if ( m.shading ) {
196

197 198 199 200
			var shading = m.shading.toLowerCase();

			if ( shading === "phong" ) mtype = "MeshPhongMaterial";
			else if ( shading === "basic" ) mtype = "MeshBasicMaterial";
201

202
		}
M
Mr.doob 已提交
203

204
		if ( m.blending !== undefined && THREE[ m.blending ] !== undefined ) {
M
Mr.doob 已提交
205

206
			mpars.blending = THREE[ m.blending ];
207

208
		}
M
Mr.doob 已提交
209

210
		if ( m.transparent !== undefined || m.opacity < 1.0 ) {
M
Mr.doob 已提交
211

212 213 214 215 216
			mpars.transparent = m.transparent;

		}

		if ( m.depthTest !== undefined ) {
M
Mr.doob 已提交
217

218 219 220
			mpars.depthTest = m.depthTest;

		}
M
Mr.doob 已提交
221

222 223 224 225 226 227
		if ( m.depthWrite !== undefined ) {

			mpars.depthWrite = m.depthWrite;

		}

228 229 230 231 232 233
		if ( m.visible !== undefined ) {

			mpars.visible = m.visible;

		}

234
		if ( m.flipSided !== undefined ) {
235

236
			mpars.side = THREE.BackSide;
237 238 239

		}

240
		if ( m.doubleSided !== undefined ) {
241

242
			mpars.side = THREE.DoubleSide;
243 244 245

		}

246 247 248 249 250 251
		if ( m.wireframe !== undefined ) {

			mpars.wireframe = m.wireframe;

		}

M
Mr.doob 已提交
252
		if ( m.vertexColors !== undefined ) {
M
Mr.doob 已提交
253

254
			if ( m.vertexColors === "face" ) {
M
Mr.doob 已提交
255

M
Mr.doob 已提交
256 257 258
				mpars.vertexColors = THREE.FaceColors;

			} else if ( m.vertexColors ) {
M
Mr.doob 已提交
259

M
Mr.doob 已提交
260 261 262 263 264
				mpars.vertexColors = THREE.VertexColors;

			}

		}
M
Mr.doob 已提交
265

M
Mr.doob 已提交
266
		// colors
267

M
Mr.doob 已提交
268
		if ( m.colorDiffuse ) {
269

M
Mr.doob 已提交
270
			mpars.color = rgb2hex( m.colorDiffuse );
271

M
Mr.doob 已提交
272
		} else if ( m.DbgColor ) {
273

M
Mr.doob 已提交
274
			mpars.color = m.DbgColor;
275

M
Mr.doob 已提交
276
		}
277

M
Mr.doob 已提交
278
		if ( m.colorSpecular ) {
279

M
Mr.doob 已提交
280
			mpars.specular = rgb2hex( m.colorSpecular );
281

M
Mr.doob 已提交
282
		}
283

M
Mr.doob 已提交
284
		if ( m.colorAmbient ) {
285

M
Mr.doob 已提交
286
			mpars.ambient = rgb2hex( m.colorAmbient );
287

M
Mr.doob 已提交
288
		}
289

A
Alessandro Piva 已提交
290 291 292 293 294 295
		if ( m.colorEmissive ) {

			mpars.emissive = rgb2hex( m.colorEmissive );

		}

M
Mr.doob 已提交
296
		// modifiers
297

M
Mr.doob 已提交
298 299 300 301 302 303 304 305 306 307 308 309 310 311
		if ( m.transparency ) {

			mpars.opacity = m.transparency;

		}

		if ( m.specularCoef ) {

			mpars.shininess = m.specularCoef;

		}

		// textures

312
		if ( m.mapDiffuse && texturePath ) {
M
Mr.doob 已提交
313

314
			create_texture( mpars, "map", m.mapDiffuse, m.mapDiffuseRepeat, m.mapDiffuseOffset, m.mapDiffuseWrap, m.mapDiffuseAnisotropy );
315 316 317

		}

318
		if ( m.mapLight && texturePath ) {
319

320
			create_texture( mpars, "lightMap", m.mapLight, m.mapLightRepeat, m.mapLightOffset, m.mapLightWrap, m.mapLightAnisotropy );
M
Mr.doob 已提交
321 322

		}
323

324 325
		if ( m.mapBump && texturePath ) {

326
			create_texture( mpars, "bumpMap", m.mapBump, m.mapBumpRepeat, m.mapBumpOffset, m.mapBumpWrap, m.mapBumpAnisotropy );
327 328 329

		}

330
		if ( m.mapNormal && texturePath ) {
331

332
			create_texture( mpars, "normalMap", m.mapNormal, m.mapNormalRepeat, m.mapNormalOffset, m.mapNormalWrap, m.mapNormalAnisotropy );
M
Mr.doob 已提交
333 334

		}
335

336
		if ( m.mapSpecular && texturePath ) {
337

338
			create_texture( mpars, "specularMap", m.mapSpecular, m.mapSpecularRepeat, m.mapSpecularOffset, m.mapSpecularWrap, m.mapSpecularAnisotropy );
339 340 341

		}

342 343 344 345 346 347 348 349
		//

		if ( m.mapBumpScale ) {

			mpars.bumpScale = m.mapBumpScale;

		}

M
Mr.doob 已提交
350 351 352 353
		// special case for normal mapped material

		if ( m.mapNormal ) {

354
			var shader = THREE.ShaderLib[ "normalmap" ];
M
Mr.doob 已提交
355 356
			var uniforms = THREE.UniformsUtils.clone( shader.uniforms );

357
			uniforms[ "tNormal" ].value = mpars.normalMap;
M
Mr.doob 已提交
358 359 360

			if ( m.mapNormalFactor ) {

361
				uniforms[ "uNormalScale" ].value.set( m.mapNormalFactor, m.mapNormalFactor );
362 363 364

			}

M
Mr.doob 已提交
365
			if ( mpars.map ) {
366

367
				uniforms[ "tDiffuse" ].value = mpars.map;
M
Mr.doob 已提交
368
				uniforms[ "enableDiffuse" ].value = true;
369 370 371

			}

372 373
			if ( mpars.specularMap ) {

374
				uniforms[ "tSpecular" ].value = mpars.specularMap;
375 376 377 378 379 380
				uniforms[ "enableSpecular" ].value = true;

			}

			if ( mpars.lightMap ) {

381
				uniforms[ "tAO" ].value = mpars.lightMap;
382 383 384
				uniforms[ "enableAO" ].value = true;

			}
385

386
			// for the moment don't handle displacement texture
M
Mr.doob 已提交
387

B
Ben Houston 已提交
388 389 390
			uniforms[ "diffuse" ].value.setHex( mpars.color );
			uniforms[ "specular" ].value.setHex( mpars.specular );
			uniforms[ "ambient" ].value.setHex( mpars.ambient );
M
Mr.doob 已提交
391

B
Ben Houston 已提交
392
			uniforms[ "shininess" ].value = mpars.shininess;
M
Mr.doob 已提交
393

394
			if ( mpars.opacity !== undefined ) {
395

B
Ben Houston 已提交
396
				uniforms[ "opacity" ].value = mpars.opacity;
M
Mr.doob 已提交
397 398 399

			}

A
alteredq 已提交
400
			var parameters = { fragmentShader: shader.fragmentShader, vertexShader: shader.vertexShader, uniforms: uniforms, lights: true, fog: true };
401
			var material = new THREE.ShaderMaterial( parameters );
M
Mr.doob 已提交
402

403 404 405 406 407 408
			if ( mpars.transparent ) {

				material.transparent = true;

			}

M
Mr.doob 已提交
409 410
		} else {

411
			var material = new THREE[ mtype ]( mpars );
M
Mr.doob 已提交
412 413

		}
414

A
alteredq 已提交
415 416
		if ( m.DbgName !== undefined ) material.name = m.DbgName;

417 418
		return material;

M
Mr.doob 已提交
419
	}
420

421
};