WorkerRunner.js 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. /**
  2. * @author Kai Salmen / https://kaisalmen.de
  3. * Development repository: https://github.com/kaisalmen/WWOBJLoader
  4. */
  5. import { ObjectManipulator } from "../../utils/ObjectManipulator.js";
  6. const DefaultWorkerPayloadHandler = function ( parser ) {
  7. this.parser = parser;
  8. this.logging = {
  9. enabled: false,
  10. debug: false
  11. };
  12. };
  13. DefaultWorkerPayloadHandler.prototype = {
  14. constructor: DefaultWorkerPayloadHandler,
  15. handlePayload: function ( payload ) {
  16. if ( payload.logging ) {
  17. this.logging.enabled = payload.logging.enabled === true;
  18. this.logging.debug = payload.logging.debug === true;
  19. }
  20. if ( payload.cmd === 'parse' ) {
  21. let scope = this;
  22. let callbacks = {
  23. callbackOnAssetAvailable: function ( payload ) {
  24. self.postMessage( payload );
  25. },
  26. callbackOnProgress: function ( text ) {
  27. if ( scope.logging.enabled && scope.logging.debug ) console.debug( 'WorkerRunner: progress: ' + text );
  28. }
  29. };
  30. let parser = this.parser;
  31. if ( typeof parser[ 'setLogging' ] === 'function' ) {
  32. parser.setLogging( this.logging.enabled, this.logging.debug );
  33. }
  34. ObjectManipulator.applyProperties( parser, payload.params );
  35. ObjectManipulator.applyProperties( parser, payload.materials );
  36. ObjectManipulator.applyProperties( parser, callbacks );
  37. let arraybuffer;
  38. if ( payload.params && payload.params.index !== undefined && payload.params.index !== null ) {
  39. arraybuffer = this.resourceDescriptors[ payload.params.index ].content;
  40. } else {
  41. arraybuffer = payload.data.input;
  42. }
  43. let parseFunctionName = 'parse';
  44. if ( typeof parser.getParseFunctionName === 'function' ) parseFunctionName = parser.getParseFunctionName();
  45. if ( payload.usesMeshDisassembler ) {
  46. // TODO: Allow to plug and use generic MeshDisassembler
  47. } else {
  48. parser[ parseFunctionName ]( arraybuffer, payload.data.options );
  49. }
  50. if ( this.logging.enabled ) console.log( 'WorkerRunner: Run complete!' );
  51. self.postMessage( {
  52. cmd: 'completeOverall',
  53. msg: 'WorkerRunner completed run.'
  54. } );
  55. } else {
  56. console.error( 'WorkerRunner: Received unknown command: ' + payload.cmd );
  57. }
  58. }
  59. };
  60. /**
  61. * Default implementation of the WorkerRunner responsible for creation and configuration of the parser within the worker.
  62. * @constructor
  63. */
  64. const WorkerRunner = function ( payloadHandler ) {
  65. this.resourceDescriptors = [];
  66. this.payloadHandler = payloadHandler;
  67. let scope = this;
  68. let scopedRunner = function ( event ) {
  69. scope.processMessage( event.data );
  70. };
  71. self.addEventListener( 'message', scopedRunner, false );
  72. };
  73. WorkerRunner.prototype = {
  74. constructor: WorkerRunner,
  75. /**
  76. * Configures the Parser implementation according the supplied configuration object.
  77. *
  78. * @param {Object} payload Raw mesh description (buffers, params, materials) used to build one to many meshes.
  79. */
  80. processMessage: function ( payload ) {
  81. if ( payload.data.resourceDescriptors && this.resourceDescriptors.length === 0 ) {
  82. for ( let name in payload.data.resourceDescriptors ) {
  83. this.resourceDescriptors.push( payload.data.resourceDescriptors[ name ] );
  84. }
  85. }
  86. this.payloadHandler.handlePayload( payload );
  87. }
  88. };
  89. export {
  90. WorkerRunner,
  91. DefaultWorkerPayloadHandler
  92. };