Skip to content

Commit dee33cf

Browse files
committed
mrdoob#12456 ImageBitmapLoader relies on THREE.LoaderSupport.WorkerSupport
1 parent f09f1f2 commit dee33cf

File tree

4 files changed

+88
-55
lines changed

4 files changed

+88
-55
lines changed

examples/js/loaders/ImageBitmapLoader.js

+63-38
Original file line numberDiff line numberDiff line change
@@ -62,37 +62,44 @@ var canUseImageBitmapOptions = detectCreateImageBitmap( [
6262
* Self-contained worker for fetching and decoding an image, returning an
6363
* ImageBitmap to the main thread.
6464
*/
65-
var ImageBitmapWorker = function () {
65+
var Parser = (function () {
6666

67-
/* global self */
68-
69-
self.onmessage = function ( message ) {
70-
71-
fetch( message.data.url ).then( function ( response ) {
72-
73-
return response.blob();
74-
75-
} ).then( function ( blob ) {
67+
function Parser() {
68+
this.callbackBuilder = null;
69+
this.callbackProgress = null;
70+
}
7671

77-
return message.data.options === undefined
78-
? self.createImageBitmap( blob )
79-
: self.createImageBitmap( blob, message.data.options );
72+
/* global self */
73+
Parser.prototype.parse = function ( input, options ) {
74+
var imageBitmapCreator = ( options === undefined ) ? this.workerScope.createImageBitmap( input ) : this.workerScope.createImageBitmap( input, options );
8075

81-
} ).then( function (imageBitmap) {
76+
var scope = this;
77+
imageBitmapCreator.then( function ( imageBitmap ) {
8278

83-
self.postMessage( imageBitmap );
79+
scope.callbackBuilder(
80+
{
81+
cmd: 'imageData',
82+
data: imageBitmap
83+
}
84+
);
8485

8586
} ).catch( function ( error ) {
8687

87-
console.error('THREE.ImageBitmapWorker: ' + error);
88+
var errorMessage = 'THREE.ImageBitmapWorker: ' + error;
89+
console.error( errorMessage );
8890

89-
self.postMessage( error );
91+
scope.callbackBuilder(
92+
{
93+
cmd: 'error',
94+
msg: errorMessage
95+
}
96+
);
9097

9198
} );
92-
9399
};
94100

95-
};
101+
return Parser;
102+
})();
96103

97104
var createAbsolutePath = function ( href ) {
98105

@@ -135,6 +142,10 @@ THREE.ImageBitmapLoader.prototype = {
135142

136143
},
137144

145+
run: function run( prepData ) {
146+
147+
},
148+
138149
load: function load( url, onLoad, onProgress, onError ) {
139150

140151
if ( url === undefined ) url = '';
@@ -161,24 +172,19 @@ THREE.ImageBitmapLoader.prototype = {
161172

162173
}
163174

164-
// Build a worker from an anonymous function body
165-
var workerBlobURL = URL.createObjectURL( new Blob(
166-
[ '(', ImageBitmapWorker.toString(), ')()' ],
167-
{ type: 'application/javascript' }
168-
) );
169-
170-
var worker = new Worker( workerBlobURL );
171-
172-
worker.postMessage( {
173-
url: createAbsolutePath( url ),
174-
options: scope.options
175-
} );
175+
var workerSupport = new THREE.LoaderSupport.WorkerSupport();
176+
var buildWorkerCode = function ( funcBuildObject, funcBuildSingelton ) {
177+
var workerCode = '';
178+
workerCode += '/**\n';
179+
workerCode += ' * This code was constructed by ImageBitmapLoader buildWorkerCode.\n';
180+
workerCode += ' */\n\n';
181+
workerCode += funcBuildSingelton( 'Parser', 'Parser', Parser );
176182

177-
worker.onmessage = function ( message ) {
178-
179-
var result = message.data;
180-
181-
if ( result instanceof ImageBitmap ) {
183+
return workerCode;
184+
};
185+
var scopeBuilderFunc = function ( payload ) {
186+
var result = payload.data;
187+
if ( payload.data instanceof ImageBitmap ) {
182188

183189
THREE.Cache.add( url, result );
184190

@@ -194,10 +200,29 @@ THREE.ImageBitmapLoader.prototype = {
194200
scope.manager.itemError( url );
195201

196202
}
197-
198203
};
204+
var scopeFuncComplete = function ( message ) {
205+
};
206+
207+
workerSupport.validate( buildWorkerCode, false );
208+
workerSupport.setCallbacks( scopeBuilderFunc, scopeFuncComplete );
209+
fetch( url ).then( function ( response ) {
210+
211+
return response.blob();
212+
213+
} ).then( function ( arrayBuffer ) {
214+
215+
workerSupport.run(
216+
{
217+
data: {
218+
input: arrayBuffer,
219+
options: scope.options
220+
}
221+
},
222+
[ arrayBuffer.buffer ]
223+
);
199224

200-
URL.revokeObjectURL( workerBlobURL );
225+
} )
201226

202227
}
203228

examples/js/loaders/LoaderSupport.js

+20-11
Original file line numberDiff line numberDiff line change
@@ -891,7 +891,7 @@ THREE.LoaderSupport.WorkerRunnerRefImpl = (function () {
891891
function WorkerRunnerRefImpl() {
892892
var scope = this;
893893
var scopedRunner = function( event ) {
894-
scope.run( event.data );
894+
scope.processMessage( event.data );
895895
};
896896
self.addEventListener( 'message', scopedRunner, false );
897897
}
@@ -927,12 +927,15 @@ THREE.LoaderSupport.WorkerRunnerRefImpl = (function () {
927927
*
928928
* @param {Object} payload Raw mesh description (buffers, params, materials) used to build one to many meshes.
929929
*/
930-
WorkerRunnerRefImpl.prototype.run = function ( payload ) {
931-
var logger = new ConsoleLogger( payload.logger.enabled, payload.logger.debug );
930+
WorkerRunnerRefImpl.prototype.processMessage = function ( payload ) {
931+
var logger = new ConsoleLogger();
932+
if ( Validator.isValid( payload.logger ) ) {
932933

933-
if ( payload.cmd === 'run' ) {
934+
logger.setEnabled( payload.logger.enabled );
935+
logger.setDebug( payload.logger.debug );
934936

935-
logger.logInfo( 'WorkerRunner: Starting Run...' );
937+
}
938+
if ( payload.cmd === 'run' ) {
936939

937940
var callbacks = {
938941
callbackBuilder: function ( payload ) {
@@ -948,7 +951,8 @@ THREE.LoaderSupport.WorkerRunnerRefImpl = (function () {
948951
this.applyProperties( parser, payload.params );
949952
this.applyProperties( parser, payload.materials );
950953
this.applyProperties( parser, callbacks );
951-
parser.parse( payload.buffers.input );
954+
parser.workerScope = self;
955+
parser.parse( payload.data.input, payload.data.options );
952956

953957
logger.logInfo( 'WorkerRunner: Run complete!' );
954958

@@ -1046,11 +1050,17 @@ THREE.LoaderSupport.WorkerSupport = (function () {
10461050
var scope = this;
10471051
var buildWorkerCode = function ( baseWorkerCode ) {
10481052
scope.workerCode = baseWorkerCode;
1053+
if ( workerRunner == THREE.LoaderSupport.WorkerRunnerRefImpl ) {
1054+
1055+
scope.workerCode += buildObject( 'Validator', THREE.LoaderSupport.Validator );
1056+
scope.workerCode += buildSingelton( 'ConsoleLogger', 'ConsoleLogger', THREE.LoaderSupport.ConsoleLogger );
1057+
1058+
}
10491059
scope.workerCode += functionCodeBuilder( buildObject, buildSingelton );
10501060
scope.workerCode += buildSingelton( workerRunner.name, workerRunner.name, workerRunner );
10511061
scope.workerCode += 'new ' + workerRunner.name + '();\n\n';
10521062

1053-
var blob = new Blob( [ scope.workerCode ], { type: 'text/plain' } );
1063+
var blob = new Blob( [ scope.workerCode ], { type: 'application/javascript' } );
10541064
scope.worker = new Worker( window.URL.createObjectURL( blob ) );
10551065
scope.logger.logTimeEnd( 'buildWebWorkerCode' );
10561066

@@ -1059,10 +1069,8 @@ THREE.LoaderSupport.WorkerSupport = (function () {
10591069

10601070
switch ( payload.cmd ) {
10611071
case 'meshData':
1062-
scope.callbacks.builder( payload );
1063-
break;
1064-
10651072
case 'materialData':
1073+
case 'imageData':
10661074
scope.callbacks.builder( payload );
10671075
break;
10681076

@@ -1223,8 +1231,9 @@ THREE.LoaderSupport.WorkerSupport = (function () {
12231231
if ( ! Validator.isValid( this.callbacks.builder ) ) throw 'Unable to run as no "builder" callback is set.';
12241232
if ( ! Validator.isValid( this.callbacks.onLoad ) ) throw 'Unable to run as no "onLoad" callback is set.';
12251233
if ( Validator.isValid( this.worker ) || this.loading ) {
1226-
this.running = true;
1234+
if ( payload.cmd !== 'run' ) payload.cmd = 'run';
12271235
this.queuedMessage = payload;
1236+
this.running = true;
12281237
this._postMessage();
12291238

12301239
}

examples/js/loaders/OBJLoader2.js

+4-6
Original file line numberDiff line numberDiff line change
@@ -254,12 +254,10 @@ THREE.OBJLoader2 = (function () {
254254
var buildCode = function ( funcBuildObject, funcBuildSingelton ) {
255255
var workerCode = '';
256256
workerCode += '/**\n';
257-
workerCode += ' * This code was constructed by OBJLoader2 buildWorkerCode.\n';
257+
workerCode += ' * This code was constructed by OBJLoader2 buildCode.\n';
258258
workerCode += ' */\n\n';
259259
workerCode += funcBuildSingelton( 'LoaderBase', 'LoaderBase', LoaderBase );
260260
workerCode += funcBuildObject( 'Consts', Consts );
261-
workerCode += funcBuildObject( 'Validator', Validator );
262-
workerCode += funcBuildSingelton( 'ConsoleLogger', 'ConsoleLogger', ConsoleLogger );
263261
workerCode += funcBuildSingelton( 'Parser', 'Parser', Parser );
264262
workerCode += funcBuildSingelton( 'RawMesh', 'RawMesh', RawMesh );
265263
workerCode += funcBuildSingelton( 'RawMeshSubGroup', 'RawMeshSubGroup', RawMeshSubGroup );
@@ -278,7 +276,6 @@ THREE.OBJLoader2 = (function () {
278276
}
279277
this.workerSupport.run(
280278
{
281-
cmd: 'run',
282279
params: {
283280
useAsync: true,
284281
materialPerSmoothingGroup: this.materialPerSmoothingGroup,
@@ -293,8 +290,9 @@ THREE.OBJLoader2 = (function () {
293290
// in async case only material names are supplied to parser
294291
materials: materialNames
295292
},
296-
buffers: {
297-
input: content
293+
data: {
294+
input: content,
295+
options: null
298296
}
299297
},
300298
[ content.buffer ]

examples/webgl_loader_imagebitmap.html

+1
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@
5555
<body>
5656
<script src="../build/three.js"></script>
5757
<script src="js/Detector.js"></script>
58+
<script src="js/loaders/LoaderSupport.js"></script>
5859
<script src="js/loaders/ImageBitmapLoader.js"></script>
5960
<div id="info">
6061
<a href="http://threejs.org" target="_blank" rel="noopener">three.js</a> - Texture loader using ImageBitmap

0 commit comments

Comments
 (0)