|
@@ -44,7 +44,7 @@
|
|
|
|
|
|
</div>
|
|
</div>
|
|
<div id="info">
|
|
<div id="info">
|
|
- <a href="https://threejs.org" target="_blank" rel="noopener">three.js</a> - OBJLoader2 usage options
|
|
|
|
|
|
+ <a href="https://threejs.org" target="_blank" rel="noopener">three.js</a> - OBJLoader2 usage options<br>Use module workers with Chromium based browser (80+)
|
|
<div id="feedback"></div>
|
|
<div id="feedback"></div>
|
|
</div>
|
|
</div>
|
|
|
|
|
|
@@ -85,6 +85,8 @@
|
|
|
|
|
|
this.flatShading = false;
|
|
this.flatShading = false;
|
|
this.doubleSide = false;
|
|
this.doubleSide = false;
|
|
|
|
+ this.useJsmWorker = false;
|
|
|
|
+ this.loadCount = 6;
|
|
|
|
|
|
this.cube = null;
|
|
this.cube = null;
|
|
this.pivot = null;
|
|
this.pivot = null;
|
|
@@ -155,7 +157,8 @@
|
|
scope.pivot.add( local );
|
|
scope.pivot.add( local );
|
|
local.add( objLoader2.parse( content ) );
|
|
local.add( objLoader2.parse( content ) );
|
|
|
|
|
|
- scope._reportProgress( { detail: { text: 'Loading of ' + modelName + 'completed: ' + message } } );
|
|
|
|
|
|
+ scope._reportProgress( { detail: { text: 'Loading of ' + modelName + ' completed: OBJLoader2#pase: Parsing completed' } } );
|
|
|
|
+ scope.finalize();
|
|
}
|
|
}
|
|
);
|
|
);
|
|
}
|
|
}
|
|
@@ -176,7 +179,8 @@
|
|
let scope = this;
|
|
let scope = this;
|
|
function callbackOnLoad( object3d, message ) {
|
|
function callbackOnLoad( object3d, message ) {
|
|
local.add( object3d );
|
|
local.add( object3d );
|
|
- scope._reportProgress( { detail: { text: 'Loading of ' + modelName + 'completed: ' + message } } );
|
|
|
|
|
|
+ scope._reportProgress( { detail: { text: 'Loading of ' + modelName + ' completed: ' + message } } );
|
|
|
|
+ scope.finalize();
|
|
}
|
|
}
|
|
|
|
|
|
let materials = {
|
|
let materials = {
|
|
@@ -185,6 +189,7 @@
|
|
|
|
|
|
let objLoader2Parallel = new OBJLoader2Parallel()
|
|
let objLoader2Parallel = new OBJLoader2Parallel()
|
|
.setModelName( modelName )
|
|
.setModelName( modelName )
|
|
|
|
+ .setJsmWorker( this.useJsmWorker, new URL( OBJLoader2Parallel.DEFAULT_JSM_WORKER_PATH, window.location.href ) )
|
|
.setCallbackOnLoad( callbackOnLoad )
|
|
.setCallbackOnLoad( callbackOnLoad )
|
|
.addMaterials( materials, true );
|
|
.addMaterials( materials, true );
|
|
|
|
|
|
@@ -214,7 +219,8 @@
|
|
scope.pivot.add( local );
|
|
scope.pivot.add( local );
|
|
local.add( object3d );
|
|
local.add( object3d );
|
|
|
|
|
|
- scope._reportProgress( { detail: { text: 'Loading of ' + modelName + 'completed: ' + message } } );
|
|
|
|
|
|
+ scope._reportProgress( { detail: { text: 'Loading of ' + modelName + ' completed: ' + message } } );
|
|
|
|
+ scope.finalize();
|
|
}
|
|
}
|
|
|
|
|
|
function onLoadMtl ( mtlParseResult ) {
|
|
function onLoadMtl ( mtlParseResult ) {
|
|
@@ -238,12 +244,14 @@
|
|
this.pivot.add( local );
|
|
this.pivot.add( local );
|
|
|
|
|
|
let objLoader2Parallel = new OBJLoader2Parallel()
|
|
let objLoader2Parallel = new OBJLoader2Parallel()
|
|
- .setModelName( modelName );
|
|
|
|
|
|
+ .setModelName( modelName )
|
|
|
|
+ .setJsmWorker( this.useJsmWorker, new URL( OBJLoader2Parallel.DEFAULT_JSM_WORKER_PATH, window.location.href ) );
|
|
|
|
|
|
let scope = this;
|
|
let scope = this;
|
|
function callbackOnLoad ( object3d, message ) {
|
|
function callbackOnLoad ( object3d, message ) {
|
|
local.add( object3d );
|
|
local.add( object3d );
|
|
- scope._reportProgress( { detail: { text: 'Loading of ' + modelName + 'completed: ' + message } } );
|
|
|
|
|
|
+ scope._reportProgress( { detail: { text: 'Loading of ' + modelName + ' completed: ' + message } } );
|
|
|
|
+ scope.finalize();
|
|
}
|
|
}
|
|
function onLoadMtl ( mtlParseResult ) {
|
|
function onLoadMtl ( mtlParseResult ) {
|
|
objLoader2Parallel.addMaterials( MtlObjBridge.addMaterialsFromMtlLoader( mtlParseResult ), true );
|
|
objLoader2Parallel.addMaterials( MtlObjBridge.addMaterialsFromMtlLoader( mtlParseResult ), true );
|
|
@@ -269,7 +277,8 @@
|
|
let scope = this;
|
|
let scope = this;
|
|
function callbackOnLoad ( object3d, message ) {
|
|
function callbackOnLoad ( object3d, message ) {
|
|
local.add( object3d );
|
|
local.add( object3d );
|
|
- scope._reportProgress( { detail: { text: 'Loading of ' + objLoader2Parallel.modelName + 'completed: ' + message } } );
|
|
|
|
|
|
+ scope._reportProgress( { detail: { text: 'Loading of ' + objLoader2Parallel.modelName + ' completed: ' + message } } );
|
|
|
|
+ scope.finalize();
|
|
}
|
|
}
|
|
|
|
|
|
objLoader2Parallel.load( 'models/obj/cerberus/Cerberus.obj', callbackOnLoad );
|
|
objLoader2Parallel.load( 'models/obj/cerberus/Cerberus.obj', callbackOnLoad );
|
|
@@ -283,6 +292,7 @@
|
|
|
|
|
|
let objLoader2Parallel = new OBJLoader2Parallel()
|
|
let objLoader2Parallel = new OBJLoader2Parallel()
|
|
.setModelName( local.name )
|
|
.setModelName( local.name )
|
|
|
|
+ .setJsmWorker( this.useJsmWorker, new URL( OBJLoader2Parallel.DEFAULT_JSM_WORKER_PATH, window.location.href ) )
|
|
.setBaseObject3d( local );
|
|
.setBaseObject3d( local );
|
|
|
|
|
|
// Configure WorkerExecutionSupport to not disregard worker after execution
|
|
// Configure WorkerExecutionSupport to not disregard worker after execution
|
|
@@ -305,14 +315,20 @@
|
|
|
|
|
|
let scope = this;
|
|
let scope = this;
|
|
function callbackOnLoad ( object3d, message ) {
|
|
function callbackOnLoad ( object3d, message ) {
|
|
- scope._reportProgress( { detail: { text: 'Loading of ' + objLoader2Parallel.modelName + 'completed: ' + message } } );
|
|
|
|
|
|
+ scope._reportProgress( { detail: { text: 'Loading of ' + objLoader2Parallel.modelName + ' completed: ' + message } } );
|
|
|
|
+ scope.finalize();
|
|
}
|
|
}
|
|
|
|
|
|
objLoader2Parallel.load( 'models/obj/ninja/ninjaHead_Low.obj', callbackOnLoad );
|
|
objLoader2Parallel.load( 'models/obj/ninja/ninjaHead_Low.obj', callbackOnLoad );
|
|
},
|
|
},
|
|
|
|
|
|
finalize: function () {
|
|
finalize: function () {
|
|
- this._reportProgress( { detail: { text: '' } } );
|
|
|
|
|
|
+ this.loadCount--;
|
|
|
|
+ if ( this.loadCount === 0 ) {
|
|
|
|
+
|
|
|
|
+ this._reportProgress( { detail: { text: '' } } );
|
|
|
|
+
|
|
|
|
+ }
|
|
},
|
|
},
|
|
|
|
|
|
_reportProgress: function( event ) {
|
|
_reportProgress: function( event ) {
|
|
@@ -408,15 +424,55 @@
|
|
this.traversalFunction( object3d.material );
|
|
this.traversalFunction( object3d.material );
|
|
|
|
|
|
}
|
|
}
|
|
|
|
+ },
|
|
|
|
+
|
|
|
|
+ executeLoading: function () {
|
|
|
|
+ // Load a file with OBJLoader2.parse on main
|
|
|
|
+ this.useParseMain();
|
|
|
|
+
|
|
|
|
+ // Load a file with OBJLoader2Parallel.parse in parallel in worker
|
|
|
|
+ this.useParseParallel();
|
|
|
|
+
|
|
|
|
+ // Load a file with OBJLoader.load on main
|
|
|
|
+ this.useLoadMain();
|
|
|
|
+
|
|
|
|
+ // Load a file with OBJLoader2Parallel.load in parallel in worker
|
|
|
|
+ this.useLoadParallel();
|
|
|
|
+
|
|
|
|
+ // Load a file with OBJLoader2Parallel.load on main with fallback to OBJLoader2.parse
|
|
|
|
+ this.useLoadMainFallback();
|
|
|
|
+
|
|
|
|
+ // Load a file with OBJLoader2Parallel.load in parallel in worker and add normals during onMeshAlter
|
|
|
|
+ this.useLoadParallelMeshAlter();
|
|
}
|
|
}
|
|
|
|
|
|
};
|
|
};
|
|
|
|
|
|
let app = new WWOBJLoader2Example( document.getElementById( 'example' ) );
|
|
let app = new WWOBJLoader2Example( document.getElementById( 'example' ) );
|
|
|
|
|
|
|
|
+ let handleExecuteLoading;
|
|
let wwObjLoader2Control = {
|
|
let wwObjLoader2Control = {
|
|
flatShading: app.flatShading,
|
|
flatShading: app.flatShading,
|
|
- doubleSide: app.doubleSide
|
|
|
|
|
|
+ doubleSide: app.doubleSide,
|
|
|
|
+ useJsmWorker: app.useJsmWorker,
|
|
|
|
+ blockEvent: function ( event ) {
|
|
|
|
+
|
|
|
|
+ event.stopPropagation();
|
|
|
|
+
|
|
|
|
+ },
|
|
|
|
+ disableElement: function ( elementHandle ) {
|
|
|
|
+
|
|
|
|
+ elementHandle.domElement.addEventListener( 'click', this.blockEvent, true );
|
|
|
|
+ elementHandle.domElement.parentElement.style.pointerEvents = 'none';
|
|
|
|
+ elementHandle.domElement.parentElement.style.opacity = 0.5;
|
|
|
|
+
|
|
|
|
+ },
|
|
|
|
+ executeLoading: function() {
|
|
|
|
+
|
|
|
|
+ app.executeLoading();
|
|
|
|
+ this.disableElement( handleExecuteLoading );
|
|
|
|
+
|
|
|
|
+ },
|
|
};
|
|
};
|
|
|
|
|
|
let menuDiv = document.getElementById( 'dat' );
|
|
let menuDiv = document.getElementById( 'dat' );
|
|
@@ -426,19 +482,31 @@
|
|
} );
|
|
} );
|
|
menuDiv.appendChild( gui.domElement );
|
|
menuDiv.appendChild( gui.domElement );
|
|
|
|
|
|
- let folderOptions = gui.addFolder( 'WWOBJLoader2 Options' );
|
|
|
|
- let controlFlat = folderOptions.add( wwObjLoader2Control, 'flatShading' ).name( 'Flat Shading' );
|
|
|
|
|
|
+ let folderRenderingOptions = gui.addFolder( 'Rendering Options' );
|
|
|
|
+ let controlFlat = folderRenderingOptions.add( wwObjLoader2Control, 'flatShading' ).name( 'Flat Shading' );
|
|
controlFlat.onChange( function( value ) {
|
|
controlFlat.onChange( function( value ) {
|
|
console.log( 'Setting flatShading to: ' + value );
|
|
console.log( 'Setting flatShading to: ' + value );
|
|
app.alterShading();
|
|
app.alterShading();
|
|
});
|
|
});
|
|
|
|
|
|
- let controlDouble = folderOptions.add( wwObjLoader2Control, 'doubleSide' ).name( 'Double Side Materials' );
|
|
|
|
|
|
+ let controlDouble = folderRenderingOptions.add( wwObjLoader2Control, 'doubleSide' ).name( 'Double Side Materials' );
|
|
controlDouble.onChange( function( value ) {
|
|
controlDouble.onChange( function( value ) {
|
|
console.log( 'Setting doubleSide to: ' + value );
|
|
console.log( 'Setting doubleSide to: ' + value );
|
|
app.alterDouble();
|
|
app.alterDouble();
|
|
});
|
|
});
|
|
- folderOptions.open();
|
|
|
|
|
|
+
|
|
|
|
+ let folderObjLoader2ParallelOptions = gui.addFolder( 'OBJLoader2Parallel Options' );
|
|
|
|
+ let controlJsmWorker = folderObjLoader2ParallelOptions.add( wwObjLoader2Control, 'useJsmWorker' ).name( 'Use Module Workers' );
|
|
|
|
+ controlJsmWorker.onChange( function( value ) {
|
|
|
|
+ console.log( 'Setting useJsmWorker to: ' + value );
|
|
|
|
+ app.useJsmWorker = value;
|
|
|
|
+ });
|
|
|
|
+ let folderExecution = gui.addFolder( 'Execution' );
|
|
|
|
+ handleExecuteLoading = folderExecution.add( wwObjLoader2Control, 'executeLoading' ).name( 'Run' );
|
|
|
|
+ handleExecuteLoading.domElement.id = 'startButton';
|
|
|
|
+ folderRenderingOptions.open();
|
|
|
|
+ folderObjLoader2ParallelOptions.open();
|
|
|
|
+ folderExecution.open();
|
|
|
|
|
|
|
|
|
|
// init three.js example application
|
|
// init three.js example application
|
|
@@ -459,25 +527,6 @@
|
|
// kick render loop
|
|
// kick render loop
|
|
render();
|
|
render();
|
|
|
|
|
|
- // Load a file with OBJLoader2.parse on main
|
|
|
|
- app.useParseMain();
|
|
|
|
-
|
|
|
|
- // Load a file with OBJLoader2Parallel.parse in parallel in worker
|
|
|
|
- app.useParseParallel();
|
|
|
|
-
|
|
|
|
- // Load a file with OBJLoader.load on main
|
|
|
|
- app.useLoadMain();
|
|
|
|
-
|
|
|
|
- // Load a file with OBJLoader2Parallel.load in parallel in worker
|
|
|
|
- app.useLoadParallel();
|
|
|
|
-
|
|
|
|
- // Load a file with OBJLoader2Parallel.load on main with fallback to OBJLoader2.parse
|
|
|
|
- app.useLoadMainFallback();
|
|
|
|
-
|
|
|
|
- // Load a file with OBJLoader2Parallel.load in parallel in worker and add normals during onMeshAlter
|
|
|
|
- app.useLoadParallelMeshAlter();
|
|
|
|
- app.finalize();
|
|
|
|
-
|
|
|
|
</script>
|
|
</script>
|
|
</body>
|
|
</body>
|
|
</html>
|
|
</html>
|