提交 21515188 编写于 作者: M Mr.doob

Simplified OBJLoader, MTLLoader and OBJMTLLoader.

Eventually I would like to kill OBJMTLLoader altogether though...
上级 02bec63c
......@@ -16,56 +16,18 @@ THREE.MTLLoader.prototype = {
constructor: THREE.MTLLoader,
/**
* Loads a MTL file
*
* Loading progress is indicated by the following events:
* "load" event (successful loading): type = 'load', content = THREE.MTLLoader.MaterialCreator
* "error" event (error loading): type = 'load', message
* "progress" event (progress loading): type = 'progress', loaded, total
*
* @param url - location of MTL file
*/
load: function( url ) {
load: function ( url, onLoad, onProgress, onError ) {
var scope = this;
var xhr = new XMLHttpRequest();
function onloaded( event ) {
if ( event.target.status === 200 || event.target.status === 0 ) {
var materialCreator = scope.parse( event.target.responseText );
// Notify caller, that I'm done
scope.dispatchEvent( { type: 'load', content: materialCreator } );
} else {
scope.dispatchEvent( { type: 'error', message: 'Couldn\'t load URL [' + url + ']',
response: event.target.responseText } );
}
}
xhr.addEventListener( 'load', onloaded, false );
xhr.addEventListener( 'progress', function ( event ) {
scope.dispatchEvent( { type: 'progress', loaded: event.loaded, total: event.total } );
}, false );
xhr.addEventListener( 'error', function () {
var loader = new THREE.XHRLoader();
loader.setCrossOrigin( this.crossOrigin );
loader.load( url, function ( text ) {
scope.dispatchEvent( { type: 'error', message: 'Couldn\'t load URL [' + url + ']' } );
onLoad( scope.parse( text ) );
}, false );
} );
xhr.open( 'GET', url, true );
xhr.send( null );
},
/**
......@@ -73,14 +35,14 @@ THREE.MTLLoader.prototype = {
* @param text - Content of MTL file
* @return {THREE.MTLLoader.MaterialCreator}
*/
parse: function( text ) {
parse: function ( text ) {
var lines = text.split( "\n" );
var info = {};
var delimiter_pattern = /\s+/;
var materialsInfo = {};
for ( var i = 0; i < lines.length; i ++ ) {
for ( var i = 0; i < lines.length; i ++ ) {
var line = lines[ i ];
line = line.trim();
......@@ -94,7 +56,7 @@ THREE.MTLLoader.prototype = {
var pos = line.indexOf( ' ' );
var key = ( pos >= 0 ) ? line.substring( 0, pos) : line;
var key = ( pos >= 0 ) ? line.substring( 0, pos ) : line;
key = key.toLowerCase();
var value = ( pos >= 0 ) ? line.substring( pos + 1 ) : "";
......@@ -326,7 +288,7 @@ THREE.MTLLoader.MaterialCreator.prototype = {
// Diffuse color (color under white light) using RGB values
params[ 'diffuse' ] = new THREE.Color().setRGB( value[0], value[1], value[2] );
params[ 'diffuse' ] = new THREE.Color().fromArray( value );
break;
......@@ -334,14 +296,14 @@ THREE.MTLLoader.MaterialCreator.prototype = {
// Ambient color (color under shadow) using RGB values
params[ 'ambient' ] = new THREE.Color().setRGB( value[0], value[1], value[2] );
params[ 'ambient' ] = new THREE.Color().fromArray( value );
break;
case 'ks':
// Specular color (color when light is reflected from shiny surface) using RGB values
params[ 'specular' ] = new THREE.Color().setRGB( value[0], value[1], value[2] );
params[ 'specular' ] = new THREE.Color().fromArray( value );
break;
......
......@@ -26,17 +26,17 @@ THREE.OBJLoader.prototype = {
},
parse: function ( data ) {
parse: function ( text ) {
// fixes
data = data.replace( /\ \\\r\n/g, '' ); // rhino adds ' \\r\n' some times.
text = text.replace( /\ \\\r\n/g, '' ); // rhino adds ' \\r\n' some times.
var replacement = '/f$1$2$4\n/f$2$3$4'; // quads to tris
data = data.replace( /f( +\d+)( +\d+)( +\d+)( +\d+)/g, replacement );
data = data.replace( /f( +\d+\/\d+)( +\d+\/\d+)( +\d+\/\d+)( +\d+\/\d+)/g, replacement );
data = data.replace( /f( +\d+\/\d+\/\d+)( +\d+\/\d+\/\d+)( +\d+\/\d+\/\d+)( +\d+\/\d+\/\d+)/g, replacement );
data = data.replace( /f( +\d+\/\/\d+)( +\d+\/\/\d+)( +\d+\/\/\d+)( +\d+\/\/\d+)/g, replacement );
text = text.replace( /f( +\d+)( +\d+)( +\d+)( +\d+)/g, replacement );
text = text.replace( /f( +\d+\/\d+)( +\d+\/\d+)( +\d+\/\d+)( +\d+\/\d+)/g, replacement );
text = text.replace( /f( +\d+\/\d+\/\d+)( +\d+\/\d+\/\d+)( +\d+\/\d+\/\d+)( +\d+\/\d+\/\d+)/g, replacement );
text = text.replace( /f( +\d+\/\/\d+)( +\d+\/\/\d+)( +\d+\/\/\d+)( +\d+\/\/\d+)/g, replacement );
//
......@@ -61,9 +61,9 @@ THREE.OBJLoader.prototype = {
var object = new THREE.Object3D();
var geometry, material, mesh;
// create mesh if no objects in data
// create mesh if no objects in text
if ( /^o /gm.test( data ) === false ) {
if ( /^o /gm.test( text ) === false ) {
geometry = new THREE.Geometry();
material = new THREE.MeshLambertMaterial();
......@@ -107,7 +107,7 @@ THREE.OBJLoader.prototype = {
//
var lines = data.split( '\n' );
var lines = text.split( '\n' );
for ( var i = 0; i < lines.length; i ++ ) {
......
......@@ -11,159 +11,43 @@ THREE.OBJMTLLoader.prototype = {
constructor: THREE.OBJMTLLoader,
/**
* Load a Wavefront OBJ file with materials (MTL file)
*
* Loading progress is indicated by the following events:
* "load" event (successful loading): type = 'load', content = THREE.Object3D
* "error" event (error loading): type = 'load', message
* "progress" event (progress loading): type = 'progress', loaded, total
*
* If the MTL file cannot be loaded, then a MeshLambertMaterial is used as a default
* @param url - Location of OBJ file to load
* @param mtlfileurl - MTL file to load (optional, if not specified, attempts to use MTL specified in OBJ file)
* @param options - Options on how to interpret the material (see THREE.MTLLoader.MaterialCreator )
*/
load: function ( url, mtlfileurl, options ) {
load: function ( url, mtlurl, onLoad, onProgress, onError ) {
var scope = this;
var xhr = new XMLHttpRequest();
var mtlDone; // Is the MTL done (true if no MTL, error loading MTL, or MTL actually loaded)
var obj3d; // Loaded model (from obj file)
var materialsCreator; // Material creator is created when MTL file is loaded
// Loader for MTL
var mtlLoader = new THREE.MTLLoader( url.substr( 0, url.lastIndexOf( "/" ) + 1 ), options );
mtlLoader.addEventListener( 'load', waitReady );
mtlLoader.addEventListener( 'error', waitReady );
// Try to load mtlfile
if ( mtlfileurl ) {
mtlLoader.load( mtlfileurl );
mtlDone = false;
} else {
mtlDone = true;
}
function waitReady( event ) {
if ( event.type === 'load' ) {
var mtlLoader = new THREE.MTLLoader( url.substr( 0, url.lastIndexOf( "/" ) + 1 ) );
mtlLoader.load( mtlurl, function ( materials ) {
if ( event.content instanceof THREE.MTLLoader.MaterialCreator ) {
var materialsCreator = materials;
materialsCreator.preload();
// MTL file is loaded
var loader = new THREE.XHRLoader( scope.manager );
loader.setCrossOrigin( this.crossOrigin );
loader.load( url, function ( text ) {
mtlDone = true;
materialsCreator = event.content;
materialsCreator.preload();
var object = scope.parse( text );
} else {
object.traverse( function ( object ) {
// OBJ file is loaded
if ( object instanceof THREE.Mesh ) {
if ( event.target.status === 200 || event.target.status === 0 ) {
if ( object.material.name ) {
var objContent = event.target.responseText;
var material = materialsCreator.create( object.material.name );
if ( mtlfileurl ) {
// Parse with passed in MTL file
obj3d = scope.parse( objContent );
} else {
// No passed in MTL file, look for mtlfile in obj file
obj3d = scope.parse( objContent, function( mtlfile ) {
mtlDone = false;
mtlLoader.load( mtlLoader.baseUrl + mtlfile );
} );
if ( material ) object.material = material;
}
} else {
// Error loading OBJ file....
scope.dispatchEvent( {
type: 'error',
message: 'Couldn\'t load URL [' + url + ']',
response: event.target.responseText } );
}
}
} else if ( event.type === 'error' ) {
// MTL failed to load -- oh well, we will just not have material ...
mtlDone = true;
}
if ( mtlDone && obj3d ) {
// MTL file is loaded and OBJ file is loaded
// Apply materials to model
if ( materialsCreator ) {
obj3d.traverse( function( object ) {
if ( object instanceof THREE.Mesh ) {
if ( object.material.name ) {
var material = materialsCreator.create( object.material.name );
if ( material ) {
object.material = material;
}
}
}
} );
}
// Notify listeners
scope.dispatchEvent( { type: 'load', content: obj3d } );
}
}
xhr.addEventListener( 'load', waitReady, false );
xhr.addEventListener( 'progress', function ( event ) {
scope.dispatchEvent( { type: 'progress', loaded: event.loaded, total: event.total } );
}, false );
xhr.addEventListener( 'error', function () {
} );
scope.dispatchEvent( { type: 'error', message: 'Couldn\'t load URL [' + url + ']' } );
onLoad( object );
}, false );
} );
xhr.open( 'GET', url, true );
xhr.send( null );
} );
},
......
......@@ -76,15 +76,12 @@
// model
var loader = new THREE.OBJMTLLoader();
loader.addEventListener( 'load', function ( event ) {
var object = event.content;
loader.load( 'obj/male02/male02.obj', 'obj/male02/male02_dds.mtl', function ( object ) {
object.position.y = - 80;
scene.add( object );
});
loader.load( 'obj/male02/male02.obj', 'obj/male02/male02_dds.mtl' );
} );
//
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册