You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
109 lines
1.7 KiB
109 lines
1.7 KiB
import { createNodeFromType } from '../core/Node.js';
|
|
import { nodeObject } from '../shadernode/ShaderNode.js';
|
|
import { FileLoader, Loader } from 'three';
|
|
|
|
class NodeLoader extends Loader {
|
|
|
|
constructor( manager ) {
|
|
|
|
super( manager );
|
|
|
|
this.textures = {};
|
|
|
|
}
|
|
|
|
load( url, onLoad, onProgress, onError ) {
|
|
|
|
const loader = new FileLoader( this.manager );
|
|
loader.setPath( this.path );
|
|
loader.setRequestHeader( this.requestHeader );
|
|
loader.setWithCredentials( this.withCredentials );
|
|
loader.load( url, ( text ) => {
|
|
|
|
try {
|
|
|
|
onLoad( this.parse( JSON.parse( text ) ) );
|
|
|
|
} catch ( e ) {
|
|
|
|
if ( onError ) {
|
|
|
|
onError( e );
|
|
|
|
} else {
|
|
|
|
console.error( e );
|
|
|
|
}
|
|
|
|
this.manager.itemError( url );
|
|
|
|
}
|
|
|
|
}, onProgress, onError );
|
|
|
|
}
|
|
|
|
parseNodes( json ) {
|
|
|
|
const nodes = {};
|
|
|
|
if ( json !== undefined ) {
|
|
|
|
for ( const nodeJSON of json ) {
|
|
|
|
const { uuid, type } = nodeJSON;
|
|
|
|
nodes[ uuid ] = nodeObject( createNodeFromType( type ) ); // @TODO: Maybe nodeObjectify the node in createNodeFromType?
|
|
nodes[ uuid ].uuid = uuid;
|
|
|
|
}
|
|
|
|
const meta = { nodes, textures: this.textures };
|
|
|
|
for ( const nodeJSON of json ) {
|
|
|
|
nodeJSON.meta = meta;
|
|
|
|
const node = nodes[ nodeJSON.uuid ];
|
|
node.deserialize( nodeJSON );
|
|
|
|
delete nodeJSON.meta;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return nodes;
|
|
|
|
}
|
|
|
|
parse( json ) {
|
|
|
|
const node = nodeObject( createNodeFromType( json.type ) );
|
|
node.uuid = json.uuid;
|
|
|
|
const nodes = this.parseNodes( json.nodes );
|
|
const meta = { nodes, textures: this.textures };
|
|
|
|
json.meta = meta;
|
|
|
|
node.deserialize( json );
|
|
|
|
delete json.meta;
|
|
|
|
return node;
|
|
|
|
}
|
|
|
|
setTextures( value ) {
|
|
|
|
this.textures = value;
|
|
return this;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
export default NodeLoader;
|