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