Skip to content

Commit

Permalink
Merge pull request #5502 from denzp/objectloader_textures
Browse files Browse the repository at this point in the history
Textures support for ObjectLoader. issue #4967
  • Loading branch information
mrdoob committed Feb 13, 2015
2 parents a6251e2 + 854688f commit eed8ae4
Showing 1 changed file with 130 additions and 7 deletions.
137 changes: 130 additions & 7 deletions src/loaders/ObjectLoader.js
Expand Up @@ -6,6 +6,8 @@ THREE.ObjectLoader = function ( manager ) {

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

this.texturePath = '';

};

THREE.ObjectLoader.prototype = {
Expand All @@ -20,25 +22,48 @@ THREE.ObjectLoader.prototype = {
loader.setCrossOrigin( this.crossOrigin );
loader.load( url, function ( text ) {

onLoad( scope.parse( JSON.parse( text ) ) );
scope.parse( JSON.parse( text ), onLoad );

}, onProgress, onError );

},

setTexturePath: function ( texturePath ) {

if ( typeof texturePath === 'string' ) {
this.texturePath = texturePath;
}
else {
console.warn( 'THREE.ObjectLoader: texturePath should be a string', texturePath );
}

},

setCrossOrigin: function ( value ) {

this.crossOrigin = value;

},

parse: function ( json ) {
parse: function ( json, onLoad ) {

var geometries, materials, images, textures;
var self = this;

self.manager.itemStart(json.object.uuid);
var manager = new THREE.LoadingManager( function() {

var geometries = this.parseGeometries( json.geometries );
var materials = this.parseMaterials( json.materials );
var object = this.parseObject( json.object, geometries, materials );
textures = self.parseTextures( json.textures, images );
materials = self.parseMaterials( json.materials, textures );

return object;
onLoad( self.parseObject( json.object, geometries, materials ) );
// report back to parent manager
self.manager.itemEnd(json.object.uuid);

} );

geometries = this.parseGeometries( json.geometries );
images = this.parseImages( json.images, manager );

},

Expand Down Expand Up @@ -182,7 +207,7 @@ THREE.ObjectLoader.prototype = {

},

parseMaterials: function ( json ) {
parseMaterials: function ( json, textures ) {

var materials = {};

Expand All @@ -199,6 +224,16 @@ THREE.ObjectLoader.prototype = {

if ( data.name !== undefined ) material.name = data.name;

if ( data.map ) {

if ( !textures[data.map] ) {
console.warn( 'THREE.ObjectLoader: Undefined texture', data.map );
}

material.map = textures[data.map];

}

materials[ data.uuid ] = material;

}
Expand All @@ -209,6 +244,94 @@ THREE.ObjectLoader.prototype = {

},

parseImages: function ( json, manager ) {

var images = {};
var self = this;

if ( json !== undefined ) {

var loader = new THREE.ImageLoader( manager );
loader.setCrossOrigin( this.crossOrigin );

if ( json.length === 0 ) {

manager.onLoad();

}

for ( var i = 0, l = json.length; i < l; i ++ ) {

var data = json[ i ];
var url = self.texturePath + data.url;

self.manager.itemStart( url );
loader.load( url, function ( uuid, url, image ) {

self.manager.itemEnd( url );

images[ uuid ] = image;

}.bind( null, data.uuid, url ) );

}

}
else {

manager.onLoad();

}

return images;

},

parseTextures: function ( json, images ) {

var textures = {};

if ( json !== undefined ) {

for ( var i = 0, l = json.length; i < l; i ++ ) {

var data = json[ i ];

if ( !data.image ) {
console.warn( 'THREE.ObjectLoader: No "image" speficied for', data.uuid );
}

if ( !images[data.image] ) {
console.warn( 'THREE.ObjectLoader: Undefined image', data.image );
}

var texture = new THREE.Texture( images[data.image] );
texture.needsUpdate = true;

texture.uuid = data.uuid;

if ( data.name !== undefined ) texture.name = data.name;
if ( data.repeat !== undefined ) texture.repeat = new THREE.Vector2(data.repeat[0], data.repeat[1]);
if ( data.minFilter !== undefined ) texture.minFilter = THREE[data.minFilter];
if ( data.magFilter !== undefined ) texture.magFilter = THREE[data.magFilter];
if ( data.anisotropy !== undefined ) texture.anisotropy = data.anisotropy;
if ( data.wrap instanceof Array ) {

texture.wrapS = THREE[data.wrap[0]];
texture.wrapT = THREE[data.wrap[1]];

}

textures[ data.uuid ] = texture;

}

}

return textures;

},

parseObject: function () {

var matrix = new THREE.Matrix4();
Expand Down

0 comments on commit eed8ae4

Please sign in to comment.