WorkerRunner.js 3.6 KB

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