OBJLoader2Parallel.js 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. /**
  2. * @author Kai Salmen / https://kaisalmen.de
  3. * Development repository: https://github.com/kaisalmen/WWOBJLoader
  4. */
  5. // Imports only related to wrapper
  6. import {
  7. CodeBuilderInstructions,
  8. WorkerExecutionSupport
  9. } from "./obj2/worker/main/WorkerExecutionSupport.js";
  10. import { CodeSerializer } from "./obj2/worker/main/CodeSerializer.js";
  11. import { OBJLoader2 } from "./OBJLoader2.js";
  12. // Imports only related to worker (when standard workers (modules aren't supported) are used)
  13. import { OBJLoader2Parser } from "./obj2/worker/parallel/OBJLoader2Parser.js";
  14. import { ObjectManipulator } from "./obj2/utils/ObjectManipulator.js";
  15. import {
  16. WorkerRunner,
  17. DefaultWorkerPayloadHandler
  18. } from "./obj2/worker/parallel/WorkerRunner.js";
  19. /**
  20. *
  21. * @param [LoadingManager] manager
  22. * @constructor
  23. */
  24. const OBJLoader2Parallel = function ( manager ) {
  25. OBJLoader2.call( this, manager );
  26. this.useJsmWorker = false;
  27. this.callbackOnLoad = null;
  28. this.executeParallel = true;
  29. this.workerExecutionSupport = new WorkerExecutionSupport();
  30. };
  31. OBJLoader2Parallel.prototype = Object.create( OBJLoader2.prototype );
  32. OBJLoader2Parallel.prototype.constructor = OBJLoader2Parallel;
  33. OBJLoader2Parallel.prototype.setUseJsmWorker = function ( useJsmWorker ) {
  34. this.useJsmWorker = useJsmWorker === true;
  35. return this;
  36. };
  37. OBJLoader2Parallel.prototype.setCallbackOnLoad = function ( callbackOnLoad ) {
  38. if ( callbackOnLoad !== undefined && callbackOnLoad !== null ) {
  39. this.callbackOnLoad = callbackOnLoad;
  40. }
  41. else {
  42. throw "No callbackOnLoad was provided! Aborting!"
  43. }
  44. return this;
  45. };
  46. OBJLoader2Parallel.prototype.setExecuteParallel = function ( executeParallel ) {
  47. this.executeParallel = executeParallel === true;
  48. return this;
  49. };
  50. OBJLoader2Parallel.prototype._configure = function () {
  51. if ( this.callbackOnLoad === null ) {
  52. "No callbackOnLoad was provided! Aborting!"
  53. }
  54. // check if worker is already available and if so, then fast-fail
  55. if ( this.workerExecutionSupport.isWorkerLoaded( this.useJsmWorker ) ) return;
  56. let codeBuilderInstructions = new CodeBuilderInstructions();
  57. let jsmSuccess = false;
  58. if ( this.useJsmWorker ) {
  59. codeBuilderInstructions.setJsmWorkerFile( '../../src/loaders/worker/parallel/jsm/OBJLoader2Worker.js' );
  60. jsmSuccess = this.workerExecutionSupport.buildWorkerJsm( codeBuilderInstructions );
  61. }
  62. if ( ! jsmSuccess ) {
  63. let codeOBJLoader2Parser = CodeSerializer.serializeClass( 'OBJLoader2Parser', OBJLoader2Parser );
  64. let codeObjectManipulator = CodeSerializer.serializeObject( 'ObjectManipulator', ObjectManipulator );
  65. let codeParserPayloadHandler = CodeSerializer.serializeClass( 'DefaultWorkerPayloadHandler', DefaultWorkerPayloadHandler );
  66. let codeWorkerRunner = CodeSerializer.serializeClass( 'WorkerRunner', WorkerRunner );
  67. codeBuilderInstructions.addCodeFragment( codeOBJLoader2Parser );
  68. codeBuilderInstructions.addCodeFragment( codeObjectManipulator );
  69. codeBuilderInstructions.addCodeFragment( codeParserPayloadHandler );
  70. codeBuilderInstructions.addCodeFragment( codeWorkerRunner );
  71. // codeBuilderInstructions.addLibraryImport( '../../node_modules/three/build/three.js' );
  72. codeBuilderInstructions.addStartCode( 'new WorkerRunner( new DefaultWorkerPayloadHandler( new OBJLoader2Parser() ) );' );
  73. this.workerExecutionSupport.buildWorkerStandard( codeBuilderInstructions );
  74. }
  75. let scope = this;
  76. let scopedOnAssetAvailable = function ( payload ) {
  77. scope._onAssetAvailable( payload );
  78. };
  79. this.workerExecutionSupport.updateCallbacks( scopedOnAssetAvailable, this.callbackOnLoad );
  80. };
  81. /**
  82. * Load is intercepted from OBJLoader2.
  83. * @inheritDoc
  84. */
  85. OBJLoader2Parallel.prototype.load = function( content, onLoad, onFileLoadProgress, onError, onMeshAlter ) {
  86. this.setCallbackOnLoad( onLoad );
  87. OBJLoader2.prototype.load.call( this, content, function () {}, onFileLoadProgress, onError, onMeshAlter );
  88. };
  89. /**
  90. * @inheritDoc
  91. */
  92. OBJLoader2Parallel.prototype.parse = function( content ) {
  93. if ( this.executeParallel ) {
  94. this._configure();
  95. this.workerExecutionSupport.executeParallel(
  96. {
  97. params: {
  98. modelName: this.modelName,
  99. instanceNo: this.instanceNo,
  100. useIndices: this.useIndices,
  101. disregardNormals: this.disregardNormals,
  102. materialPerSmoothingGroup: this.materialPerSmoothingGroup,
  103. useOAsMesh: this.useOAsMesh,
  104. },
  105. materials: this.materialHandler.getMaterialsJSON(),
  106. data: {
  107. input: content,
  108. options: null
  109. },
  110. logging: {
  111. enabled: this.logging.enabled,
  112. debug: this.logging.debug
  113. }
  114. } );
  115. } else {
  116. this.callbackOnLoad( OBJLoader2.prototype.parse.call( this, content ) );
  117. }
  118. };
  119. export { OBJLoader2Parallel }