Spaces:
Running
Running
/** | |
* @author sunag / http://www.sunag.com.br/ | |
*/ | |
THREE.NodeMaterialLoader = function ( manager, library ) { | |
this.manager = ( manager !== undefined ) ? manager : THREE.DefaultLoadingManager; | |
this.nodes = {}; | |
this.materials = {}; | |
this.passes = {}; | |
this.names = {}; | |
this.library = library || {}; | |
}; | |
THREE.NodeMaterialLoaderUtils = { | |
replaceUUIDObject: function ( object, uuid, value, recursive ) { | |
recursive = recursive !== undefined ? recursive : true; | |
if ( typeof uuid === "object" ) uuid = uuid.uuid; | |
if ( typeof object === "object" ) { | |
var keys = Object.keys( object ); | |
for ( var i = 0; i < keys.length; i ++ ) { | |
var key = keys[ i ]; | |
if ( recursive ) { | |
object[ key ] = this.replaceUUIDObject( object[ key ], uuid, value ); | |
} | |
if ( key === uuid ) { | |
object[ uuid ] = object[ key ]; | |
delete object[ key ]; | |
} | |
} | |
} | |
return object === uuid ? value : object; | |
}, | |
replaceUUID: function ( json, uuid, value ) { | |
this.replaceUUIDObject( json, uuid, value, false ); | |
this.replaceUUIDObject( json.nodes, uuid, value ); | |
this.replaceUUIDObject( json.materials, uuid, value ); | |
this.replaceUUIDObject( json.passes, uuid, value ); | |
this.replaceUUIDObject( json.library, uuid, value, false ); | |
return json; | |
} | |
}; | |
Object.assign( THREE.NodeMaterialLoader.prototype, { | |
load: function ( url, onLoad, onProgress, onError ) { | |
var scope = this; | |
var loader = new THREE.FileLoader( scope.manager ); | |
loader.setPath( scope.path ); | |
loader.load( url, function ( text ) { | |
onLoad( scope.parse( JSON.parse( text ) ) ); | |
}, onProgress, onError ); | |
return this; | |
}, | |
setPath: function ( value ) { | |
this.path = value; | |
return this; | |
}, | |
getObjectByName: function ( uuid ) { | |
return this.names[ uuid ]; | |
}, | |
getObjectById: function ( uuid ) { | |
return this.library[ uuid ] || | |
this.nodes[ uuid ] || | |
this.materials[ uuid ] || | |
this.passes[ uuid ] || | |
this.names[ uuid ]; | |
}, | |
getNode: function ( uuid ) { | |
var object = this.getObjectById( uuid ); | |
if ( ! object ) { | |
console.warn( "Node \"" + uuid + "\" not found." ); | |
} | |
return object; | |
}, | |
resolve: function( json ) { | |
switch( typeof json ) { | |
case "boolean": | |
case "number": | |
return json; | |
case "string": | |
if (/^\w{8}-\w{4}-\w{4}-\w{4}-\w{12}$/i.test(json) || this.library[ json ]) { | |
return this.getNode( json ); | |
} | |
return json; | |
default: | |
if ( Array.isArray( json ) ) { | |
for(var i = 0; i < json.length; i++) { | |
json[i] = this.resolve( json[i] ); | |
} | |
} else { | |
for ( var prop in json ) { | |
if (prop === "uuid") continue; | |
json[ prop ] = this.resolve( json[ prop ] ); | |
} | |
} | |
} | |
return json; | |
}, | |
declare: function( json ) { | |
var uuid, node, object; | |
for ( uuid in json.nodes ) { | |
node = json.nodes[ uuid ]; | |
object = new THREE[ node.nodeType + "Node" ](); | |
if ( node.name ) { | |
object.name = node.name; | |
this.names[ object.name ] = object; | |
} | |
this.nodes[ uuid ] = object; | |
} | |
for ( uuid in json.materials ) { | |
node = json.materials[ uuid ]; | |
object = new THREE[ node.type ](); | |
if ( node.name ) { | |
object.name = node.name; | |
this.names[ object.name ] = object; | |
} | |
this.materials[ uuid ] = object; | |
} | |
for ( uuid in json.passes ) { | |
node = json.passes[ uuid ]; | |
object = new THREE[ node.type ](); | |
if ( node.name ) { | |
object.name = node.name; | |
this.names[ object.name ] = object; | |
} | |
this.passes[ uuid ] = object; | |
} | |
if ( json.material ) this.material = this.materials[ json.material ]; | |
if ( json.pass ) this.pass = this.passes[ json.pass ]; | |
return json; | |
}, | |
parse: function ( json ) { | |
var uuid; | |
json = this.resolve( this.declare( json ) ); | |
for ( uuid in json.nodes ) { | |
this.nodes[ uuid ].copy( json.nodes[ uuid ] ); | |
} | |
for ( uuid in json.materials ) { | |
this.materials[ uuid ].copy( json.materials[ uuid ] ); | |
} | |
for ( uuid in json.passes ) { | |
this.passes[ uuid ].copy( json.passes[ uuid ] ); | |
} | |
return this.material || this.pass || this; | |
} | |
} ); | |