WorkerRunner.js 3.5 KB

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