File: //var/www/aspa/three/addons/nodes/loaders/NodeLoader.js
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;