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;
 |