NodeLoader.js 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. import { createNodeFromType } from '../core/Node.js';
  2. import { nodeObject } from '../shadernode/ShaderNode.js';
  3. import { FileLoader, Loader } from 'three';
  4. class NodeLoader extends Loader {
  5. constructor( manager ) {
  6. super( manager );
  7. this.textures = {};
  8. }
  9. load( url, onLoad, onProgress, onError ) {
  10. const loader = new FileLoader( this.manager );
  11. loader.setPath( this.path );
  12. loader.setRequestHeader( this.requestHeader );
  13. loader.setWithCredentials( this.withCredentials );
  14. loader.load( url, ( text ) => {
  15. try {
  16. onLoad( this.parse( JSON.parse( text ) ) );
  17. } catch ( e ) {
  18. if ( onError ) {
  19. onError( e );
  20. } else {
  21. console.error( e );
  22. }
  23. this.manager.itemError( url );
  24. }
  25. }, onProgress, onError );
  26. }
  27. parseNodes( json ) {
  28. const nodes = {};
  29. if ( json !== undefined ) {
  30. for ( const nodeJSON of json ) {
  31. const { uuid, type } = nodeJSON;
  32. nodes[ uuid ] = nodeObject( createNodeFromType( type ) ); // @TODO: Maybe nodeObjectify the node in createNodeFromType?
  33. nodes[ uuid ].uuid = uuid;
  34. }
  35. const meta = { nodes, textures: this.textures };
  36. for ( const nodeJSON of json ) {
  37. nodeJSON.meta = meta;
  38. const node = nodes[ nodeJSON.uuid ];
  39. node.deserialize( nodeJSON );
  40. delete nodeJSON.meta;
  41. }
  42. }
  43. return nodes;
  44. }
  45. parse( json ) {
  46. const node = nodeObject( createNodeFromType( json.type ) );
  47. node.uuid = json.uuid;
  48. const nodes = this.parseNodes( json.nodes );
  49. const meta = { nodes, textures: this.textures };
  50. json.meta = meta;
  51. node.deserialize( json );
  52. delete json.meta;
  53. return node;
  54. }
  55. setTextures( value ) {
  56. this.textures = value;
  57. return this;
  58. }
  59. }
  60. export default NodeLoader;