123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294 |
- /**
- * @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 () {
- var color, textureLoader, materialLoader;
- return function ( m, texturePath, crossOrigin ) {
- if ( color === undefined ) color = new THREE.Color();
- if ( textureLoader === undefined ) textureLoader = new THREE.TextureLoader();
- if ( materialLoader === undefined ) materialLoader = new THREE.MaterialLoader();
- // convert from old material format
- var textures = {};
- function loadTexture( path, repeat, offset, wrap, anisotropy ) {
- var fullPath = texturePath + path;
- var loader = THREE.Loader.Handlers.get( fullPath );
- var texture;
- if ( loader !== null ) {
- texture = loader.load( fullPath );
- } else {
- textureLoader.setCrossOrigin( crossOrigin );
- texture = textureLoader.load( fullPath );
- }
- if ( repeat !== undefined ) {
- texture.repeat.fromArray( repeat );
- if ( repeat[ 0 ] !== 1 ) texture.wrapS = THREE.RepeatWrapping;
- if ( repeat[ 1 ] !== 1 ) texture.wrapT = THREE.RepeatWrapping;
- }
- if ( offset !== undefined ) {
- texture.offset.fromArray( offset );
- }
- if ( wrap !== undefined ) {
- if ( wrap[ 0 ] === 'repeat' ) texture.wrapS = THREE.RepeatWrapping;
- if ( wrap[ 0 ] === 'mirror' ) texture.wrapS = THREE.MirroredRepeatWrapping;
- if ( wrap[ 1 ] === 'repeat' ) texture.wrapT = THREE.RepeatWrapping;
- if ( wrap[ 1 ] === 'mirror' ) texture.wrapT = THREE.MirroredRepeatWrapping;
- }
- if ( anisotropy !== undefined ) {
- texture.anisotropy = anisotropy;
- }
- var uuid = THREE.Math.generateUUID();
- textures[ uuid ] = texture;
- return uuid;
- }
- //
- 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;
- case 'colorAmbient':
- console.warn( 'THREE.Loader.createMaterial: colorAmbient is no longer supported' );
- break;
- 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':
- json.map = loadTexture( value, m.mapDiffuseRepeat, m.mapDiffuseOffset, m.mapDiffuseWrap, m.mapDiffuseAnisotropy );
- break;
- case 'mapDiffuseRepeat':
- case 'mapDiffuseOffset':
- case 'mapDiffuseWrap':
- case 'mapDiffuseAnisotropy':
- break;
- case 'mapLight':
- json.lightMap = loadTexture( value, m.mapLightRepeat, m.mapLightOffset, m.mapLightWrap, m.mapLightAnisotropy );
- break;
- case 'mapLightRepeat':
- case 'mapLightOffset':
- case 'mapLightWrap':
- case 'mapLightAnisotropy':
- break;
- case 'mapAO':
- json.aoMap = loadTexture( value, m.mapAORepeat, m.mapAOOffset, m.mapAOWrap, m.mapAOAnisotropy );
- break;
- case 'mapAORepeat':
- case 'mapAOOffset':
- case 'mapAOWrap':
- case 'mapAOAnisotropy':
- break;
- case 'mapBump':
- json.bumpMap = loadTexture( value, m.mapBumpRepeat, m.mapBumpOffset, m.mapBumpWrap, m.mapBumpAnisotropy );
- break;
- case 'mapBumpScale':
- json.bumpScale = value;
- break;
- case 'mapBumpRepeat':
- case 'mapBumpOffset':
- case 'mapBumpWrap':
- case 'mapBumpAnisotropy':
- break;
- case 'mapNormal':
- json.normalMap = loadTexture( value, m.mapNormalRepeat, m.mapNormalOffset, m.mapNormalWrap, m.mapNormalAnisotropy );
- break;
- case 'mapNormalFactor':
- json.normalScale = [ value, value ];
- break;
- case 'mapNormalRepeat':
- case 'mapNormalOffset':
- case 'mapNormalWrap':
- case 'mapNormalAnisotropy':
- break;
- case 'mapSpecular':
- json.specularMap = loadTexture( value, m.mapSpecularRepeat, m.mapSpecularOffset, m.mapSpecularWrap, m.mapSpecularAnisotropy );
- break;
- case 'mapSpecularRepeat':
- case 'mapSpecularOffset':
- case 'mapSpecularWrap':
- case 'mapSpecularAnisotropy':
- break;
- case 'mapAlpha':
- json.alphaMap = loadTexture( value, m.mapAlphaRepeat, m.mapAlphaOffset, m.mapAlphaWrap, m.mapAlphaAnisotropy );
- 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':
- console.warn( 'THREE.Loader.createMaterial: transparency has been renamed to opacity' );
- json.opacity = value;
- break;
- case 'opacity':
- case 'transparent':
- case 'depthTest':
- case 'depthWrite':
- case 'transparent':
- 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:
- console.error( 'THREE.Loader.createMaterial: Unsupported', name, value );
- break;
- }
- }
- if ( json.type !== 'MeshPhongMaterial' ) delete json.specular;
- if ( json.opacity < 1 ) json.transparent = true;
- materialLoader.setTextures( textures );
- return materialLoader.parse( json );
- };
- } )()
- };
- THREE.Loader.Handlers = {
- handlers: [],
- add: function ( regex, loader ) {
- this.handlers.push( regex, loader );
- },
- get: function ( file ) {
- var handlers = this.handlers;
- for ( var i = 0, l = handlers.length; i < l; i += 2 ) {
- var regex = handlers[ i ];
- var loader = handlers[ i + 1 ];
- if ( regex.test( file ) ) {
- return loader;
- }
- }
- return null;
- }
- };
|