Loader.js 6.9 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
/**
 * @author alteredq / http://alteredqualia.com/
 */

THREE.Loader = function () {

	this.onLoadStart = function () {};
	this.onLoadProgress = function () {};
	this.onLoadComplete = function () {};

};

THREE.Loader.prototype = {

	constructor: THREE.Loader,

	crossOrigin: undefined,

	extractUrlBase: function ( url ) {

		var parts = url.split( '/' );

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

		parts.pop();

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

	},

	initMaterials: function ( materials, texturePath, crossOrigin ) {

		var array = [];

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

			array[ i ] = this.createMaterial( materials[ i ], texturePath, crossOrigin );

		}

		return array;

	},

	createMaterial: ( function () {

47
		var color, textureLoader, materialLoader;
48

49
		return function ( m, texturePath, crossOrigin ) {
50

51 52 53
			if ( color === undefined ) color = new THREE.Color();
			if ( textureLoader === undefined ) textureLoader = new THREE.TextureLoader();
			if ( materialLoader === undefined ) materialLoader = new THREE.MaterialLoader();
54

55
			// convert from old material format
56

57
			var textures = {};
58

59
			function loadTexture( path, repeat, offset, wrap, anisotropy ) {
60

61 62
				var fullPath = texturePath + path;
				var loader = THREE.Loader.Handlers.get( fullPath );
63 64 65 66 67 68 69 70 71

				var texture;

				if ( loader !== null ) {

					texture = loader.load( fullPath );

				} else {

72 73
					textureLoader.setCrossOrigin( crossOrigin );
					texture = textureLoader.load( fullPath );
74 75 76

				}

77
				if ( repeat !== undefined ) {
78

M
Mr.doob 已提交
79
					texture.repeat.fromArray( repeat );
80

M
Mr.doob 已提交
81 82
					if ( repeat[ 0 ] !== 1 ) texture.wrapS = THREE.RepeatWrapping;
					if ( repeat[ 1 ] !== 1 ) texture.wrapT = THREE.RepeatWrapping;
83 84 85

				}

86
				if ( offset !== undefined ) {
87

M
Mr.doob 已提交
88
					texture.offset.fromArray( offset );
89 90 91

				}

92
				if ( wrap !== undefined ) {
93

94 95
					if ( wrap[ 0 ] === 'repeat' ) texture.wrapS = THREE.RepeatWrapping;
					if ( wrap[ 0 ] === 'mirror' ) texture.wrapS = THREE.MirroredRepeatWrapping;
96

97 98
					if ( wrap[ 1 ] === 'repeat' ) texture.wrapT = THREE.RepeatWrapping;
					if ( wrap[ 1 ] === 'mirror' ) texture.wrapT = THREE.MirroredRepeatWrapping;
99 100 101

				}

102
				if ( anisotropy !== undefined ) {
103 104 105 106 107

					texture.anisotropy = anisotropy;

				}

108
				var uuid = THREE.Math.generateUUID();
109

110
				textures[ uuid ] = texture;
111

112
				return uuid;
113 114 115 116 117

			}

			//

118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138
			var json = {
				uuid: THREE.Math.generateUUID(),
				type: 'MeshLambertMaterial'
			};

			for ( var name in m ) {

				var value = m[ name ];

				switch ( name ) {
					case 'DbgColor':
					case 'DbgIndex':
					case 'opticalDensity':
					case 'illumination':
						break;
					case 'DbgName':
						json.name = value;
						break;
					case 'blending':
						json.blending = THREE[ value ];
						break;
139 140 141
					case 'colorAmbient':
						console.warn( 'THREE.Loader.createMaterial: colorAmbient is no longer supported' );
						break;
142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158
					case 'colorDiffuse':
						json.color = color.fromArray( value ).getHex();
						break;
					case 'colorSpecular':
						json.specular = color.fromArray( value ).getHex();
						break;
					case 'colorEmissive':
						json.emissive = color.fromArray( value ).getHex();
						break;
					case 'specularCoef':
						json.shininess = value;
						break;
					case 'shading':
						if ( value.toLowerCase() === 'basic' ) json.type = 'MeshBasicMaterial';
						if ( value.toLowerCase() === 'phong' ) json.type = 'MeshPhongMaterial';
						break;
					case 'mapDiffuse':
M
Mr.doob 已提交
159
						json.map = loadTexture( value, m.mapDiffuseRepeat, m.mapDiffuseOffset, m.mapDiffuseWrap, m.mapDiffuseAnisotropy );
160 161 162 163 164 165 166
						break;
					case 'mapDiffuseRepeat':
					case 'mapDiffuseOffset':
					case 'mapDiffuseWrap':
					case 'mapDiffuseAnisotropy':
						break;
					case 'mapLight':
M
Mr.doob 已提交
167
						json.lightMap = loadTexture( value, m.mapLightRepeat, m.mapLightOffset, m.mapLightWrap, m.mapLightAnisotropy );
168 169 170 171 172 173 174
						break;
					case 'mapLightRepeat':
					case 'mapLightOffset':
					case 'mapLightWrap':
					case 'mapLightAnisotropy':
						break;
					case 'mapAO':
M
Mr.doob 已提交
175
						json.aoMap = loadTexture( value, m.mapAORepeat, m.mapAOOffset, m.mapAOWrap, m.mapAOAnisotropy );
176 177 178 179 180 181 182
						break;
					case 'mapAORepeat':
					case 'mapAOOffset':
					case 'mapAOWrap':
					case 'mapAOAnisotropy':
						break;
					case 'mapBump':
M
Mr.doob 已提交
183
						json.bumpMap = loadTexture( value, m.mapBumpRepeat, m.mapBumpOffset, m.mapBumpWrap, m.mapBumpAnisotropy );
184 185 186 187 188 189 190 191 192 193
						break;
					case 'mapBumpScale':
						json.bumpScale = value;
						break;
					case 'mapBumpRepeat':
					case 'mapBumpOffset':
					case 'mapBumpWrap':
					case 'mapBumpAnisotropy':
						break;
					case 'mapNormal':
M
Mr.doob 已提交
194
						json.normalMap = loadTexture( value, m.mapNormalRepeat, m.mapNormalOffset, m.mapNormalWrap, m.mapNormalAnisotropy );
195 196 197 198 199 200 201 202 203 204
						break;
					case 'mapNormalFactor':
						json.normalScale = [ value, value ];
						break;
					case 'mapNormalRepeat':
					case 'mapNormalOffset':
					case 'mapNormalWrap':
					case 'mapNormalAnisotropy':
						break;
					case 'mapSpecular':
M
Mr.doob 已提交
205
						json.specularMap = loadTexture( value, m.mapSpecularRepeat, m.mapSpecularOffset, m.mapSpecularWrap, m.mapSpecularAnisotropy );
206 207 208 209 210 211 212
						break;
					case 'mapSpecularRepeat':
					case 'mapSpecularOffset':
					case 'mapSpecularWrap':
					case 'mapSpecularAnisotropy':
						break;
					case 'mapAlpha':
M
Mr.doob 已提交
213
						json.alphaMap = loadTexture( value, m.mapAlphaRepeat, m.mapAlphaOffset, m.mapAlphaWrap, m.mapAlphaAnisotropy );
214 215 216 217 218 219 220 221 222 223 224 225 226
						break;
					case 'mapAlphaRepeat':
					case 'mapAlphaOffset':
					case 'mapAlphaWrap':
					case 'mapAlphaAnisotropy':
						break;
					case 'flipSided':
						json.side = THREE.BackSide;
						break;
					case 'doubleSided':
						json.side = THREE.DoubleSide;
						break;
					case 'transparency':
227
						console.warn( 'THREE.Loader.createMaterial: transparency has been renamed to opacity' );
228 229 230 231
						json.opacity = value;
						break;
					case 'depthTest':
					case 'depthWrite':
M
Mugen87 已提交
232
					case 'colorWrite':
M
Mr.doob 已提交
233 234 235
					case 'opacity':
					case 'reflectivity':
					case 'transparent':
236 237 238 239 240 241 242 243 244
					case 'visible':
					case 'wireframe':
						json[ name ] = value;
						break;
					case 'vertexColors':
						if ( value === true ) json.vertexColors = THREE.VertexColors;
						if ( value === 'face' ) json.vertexColors = THREE.FaceColors;
						break;
					default:
245
						console.error( 'THREE.Loader.createMaterial: Unsupported', name, value );
246 247
						break;
				}
248 249 250

			}

251
			if ( json.type === 'MeshBasicMaterial' ) delete json.emissive;
252
			if ( json.type !== 'MeshPhongMaterial' ) delete json.specular;
253

254
			if ( json.opacity < 1 ) json.transparent = true;
255

256
			materialLoader.setTextures( textures );
257

258
			return materialLoader.parse( json );
259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277

		};

	} )()

};

THREE.Loader.Handlers = {

	handlers: [],

	add: function ( regex, loader ) {

		this.handlers.push( regex, loader );

	},

	get: function ( file ) {

278 279 280
		var handlers = this.handlers;

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

282 283
			var regex = handlers[ i ];
			var loader  = handlers[ i + 1 ];
284 285 286 287 288 289 290 291 292 293 294 295 296 297

			if ( regex.test( file ) ) {

				return loader;

			}

		}

		return null;

	}

};