109 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			109 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
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;
 |