|
@@ -17,8 +17,6 @@ if ( THREE.LoaderSupport === undefined ) console.error( '"THREE.LoaderSupport" i
|
|
|
*/
|
|
|
|
|
|
THREE.OBJLoader2 = function ( manager ) {
|
|
|
- console.info( 'Using THREE.OBJLoader2 version: ' + THREE.OBJLoader2.OBJLOADER2_VERSION );
|
|
|
-
|
|
|
this.manager = THREE.LoaderSupport.Validator.verifyInput( manager, THREE.DefaultLoadingManager );
|
|
|
this.logging = {
|
|
|
enabled: true,
|
|
@@ -40,8 +38,9 @@ THREE.OBJLoader2 = function ( manager ) {
|
|
|
this.workerSupport = new THREE.LoaderSupport.WorkerSupport();
|
|
|
this.terminateWorkerOnLoad = true;
|
|
|
};
|
|
|
-
|
|
|
THREE.OBJLoader2.OBJLOADER2_VERSION = '2.5.1';
|
|
|
+console.info( 'Using THREE.OBJLoader2 version: ' + THREE.OBJLoader2.OBJLOADER2_VERSION );
|
|
|
+
|
|
|
|
|
|
THREE.OBJLoader2.prototype = {
|
|
|
|
|
@@ -174,19 +173,12 @@ THREE.OBJLoader2.prototype = {
|
|
|
if ( this.logging.enabled && this.logging.debug ) console.debug( content );
|
|
|
},
|
|
|
|
|
|
- _onError: function ( event ) {
|
|
|
- var output = 'Error occurred while downloading!';
|
|
|
-
|
|
|
- if ( event.currentTarget && event.currentTarget.statusText !== null ) {
|
|
|
+ _onError: function ( errorMessage ) {
|
|
|
+ if ( this.logging.enabled && this.logging.debug ) {
|
|
|
|
|
|
- output += '\nurl: ' + event.currentTarget.responseURL + '\nstatus: ' + event.currentTarget.statusText;
|
|
|
+ console.log( errorMessage );
|
|
|
|
|
|
}
|
|
|
- this.onProgress( 'error', output, -1 );
|
|
|
- this._throwError( output );
|
|
|
- },
|
|
|
-
|
|
|
- _throwError: function ( errorMessage ) {
|
|
|
if ( THREE.LoaderSupport.Validator.isValid( this.callbacks.onReportError ) ) {
|
|
|
|
|
|
this.callbacks.onReportError( errorMessage );
|
|
@@ -216,9 +208,18 @@ THREE.OBJLoader2.prototype = {
|
|
|
_loadObj: function ( resource, onLoad, onProgress, onError, onMeshAlter, useAsync ) {
|
|
|
var scope = this;
|
|
|
if ( ! THREE.LoaderSupport.Validator.isValid( onError ) ) {
|
|
|
+
|
|
|
onError = function ( event ) {
|
|
|
- scope._onError( event );
|
|
|
- }
|
|
|
+
|
|
|
+ var errorMessage = event;
|
|
|
+ if ( event.currentTarget && event.currentTarget.statusText !== null ) {
|
|
|
+
|
|
|
+ errorMessage = 'Error occurred while downloading!\nurl: ' + event.currentTarget.responseURL + '\nstatus: ' + event.currentTarget.statusText;
|
|
|
+
|
|
|
+ }
|
|
|
+ scope._onError( errorMessage );
|
|
|
+
|
|
|
+ };
|
|
|
}
|
|
|
|
|
|
// fast-fail
|
|
@@ -365,11 +366,15 @@ THREE.OBJLoader2.prototype = {
|
|
|
scope.loaderRootNode.add( mesh );
|
|
|
}
|
|
|
};
|
|
|
- parser.setCallbackMeshBuilder( onMeshLoaded );
|
|
|
+ parser.setCallbackOnAssetAvailable( onMeshLoaded );
|
|
|
var onProgressScoped = function ( text, numericalValue ) {
|
|
|
scope.onProgress( 'progressParse', text, numericalValue );
|
|
|
};
|
|
|
- parser.setCallbackProgress( onProgressScoped );
|
|
|
+ parser.setCallbackOnProgress( onProgressScoped );
|
|
|
+ var onErrorScoped = function ( message ) {
|
|
|
+ scope._onError( message );
|
|
|
+ };
|
|
|
+ parser.setCallbackOnError( onErrorScoped );
|
|
|
|
|
|
if ( content instanceof ArrayBuffer || content instanceof Uint8Array ) {
|
|
|
|
|
@@ -383,7 +388,7 @@ THREE.OBJLoader2.prototype = {
|
|
|
|
|
|
} else {
|
|
|
|
|
|
- this._throwError( 'Provided content was neither of type String nor Uint8Array! Aborting...' );
|
|
|
+ this._onError( 'Provided content was neither of type String nor Uint8Array! Aborting...' );
|
|
|
|
|
|
}
|
|
|
if ( this.logging.enabled ) console.timeEnd( 'OBJLoader2 parse: ' + this.modelName );
|
|
@@ -439,7 +444,6 @@ THREE.OBJLoader2.prototype = {
|
|
|
workerCode += ' * This code was constructed by OBJLoader2 buildCode.\n';
|
|
|
workerCode += ' */\n\n';
|
|
|
workerCode += 'THREE = { LoaderSupport: {}, OBJLoader2: {} };\n\n';
|
|
|
- workerCode += codeSerializer.serializeObject( 'THREE.LoaderSupport.Validator', THREE.LoaderSupport.Validator );
|
|
|
workerCode += codeSerializer.serializeClass( 'THREE.OBJLoader2.Parser', THREE.OBJLoader2.Parser );
|
|
|
|
|
|
return workerCode;
|
|
@@ -546,7 +550,7 @@ THREE.OBJLoader2.prototype = {
|
|
|
|
|
|
} else {
|
|
|
|
|
|
- this._throwError( 'Unable to parse mtl as it it seems to be neither a String, an Array or an ArrayBuffer!' );
|
|
|
+ scope._onError( 'Unable to parse mtl as it it seems to be neither a String, an Array or an ArrayBuffer!' );
|
|
|
}
|
|
|
|
|
|
}
|
|
@@ -595,8 +599,11 @@ THREE.OBJLoader2.prototype = {
|
|
|
* @class
|
|
|
*/
|
|
|
THREE.OBJLoader2.Parser = function () {
|
|
|
- this.callbackProgress = null;
|
|
|
- this.callbackMeshBuilder = null;
|
|
|
+ this.callbacks = {
|
|
|
+ onProgress: null,
|
|
|
+ onAssetAvailable: null,
|
|
|
+ onError: null
|
|
|
+ };
|
|
|
this.contentRef = null;
|
|
|
this.legacyMode = false;
|
|
|
|
|
@@ -694,29 +701,61 @@ THREE.OBJLoader2.Parser.prototype = {
|
|
|
},
|
|
|
|
|
|
setMaterials: function ( materials ) {
|
|
|
- this.materials = THREE.LoaderSupport.Validator.verifyInput( materials, this.materials );
|
|
|
- this.materials = THREE.LoaderSupport.Validator.verifyInput( this.materials, {} );
|
|
|
+ if ( materials === undefined || materials === null ) return;
|
|
|
+
|
|
|
+ for ( var materialName in materials ) {
|
|
|
+ if ( materials.hasOwnProperty( materialName ) ) {
|
|
|
+
|
|
|
+ this.materials[ materialName ] = materials[ materialName ];
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
},
|
|
|
|
|
|
- setCallbackMeshBuilder: function ( callbackMeshBuilder ) {
|
|
|
- if ( ! THREE.LoaderSupport.Validator.isValid( callbackMeshBuilder ) ) {
|
|
|
+ setCallbackOnAssetAvailable: function ( onAssetAvailable ) {
|
|
|
+ if ( onAssetAvailable !== null && onAssetAvailable !== undefined ) {
|
|
|
|
|
|
- this._throwError( 'Unable to run as no "MeshBuilder" callback is set.' );
|
|
|
+ this.callbacks.onAssetAvailable = onAssetAvailable;
|
|
|
|
|
|
}
|
|
|
- this.callbackMeshBuilder = callbackMeshBuilder;
|
|
|
},
|
|
|
|
|
|
- setCallbackProgress: function ( callbackProgress ) {
|
|
|
- this.callbackProgress = callbackProgress;
|
|
|
+ setCallbackOnProgress: function ( onProgress ) {
|
|
|
+ if ( onProgress !== null && onProgress !== undefined ) {
|
|
|
+
|
|
|
+ this.callbacks.onProgress = onProgress;
|
|
|
+
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ setCallbackOnError: function ( onError ) {
|
|
|
+ if ( onError !== null && onError !== undefined ) {
|
|
|
+
|
|
|
+ this.callbacks.onError = onError;
|
|
|
+
|
|
|
+ }
|
|
|
},
|
|
|
|
|
|
+
|
|
|
setLogging: function ( enabled, debug ) {
|
|
|
this.logging.enabled = enabled === true;
|
|
|
this.logging.debug = debug === true;
|
|
|
},
|
|
|
|
|
|
configure: function () {
|
|
|
+ if ( this.callbacks.onAssetAvailable === null ) {
|
|
|
+
|
|
|
+ var errorMessage = 'Unable to run as no callback for building meshes is set.';
|
|
|
+ if ( this.callbacks.onError !== null ) {
|
|
|
+
|
|
|
+ this.callbacks.onError( errorMessage );
|
|
|
+
|
|
|
+ } else {
|
|
|
+
|
|
|
+ throw errorMessage;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
this.pushSmoothingGroup( 1 );
|
|
|
|
|
|
if ( this.logging.enabled ) {
|
|
@@ -729,9 +768,16 @@ THREE.OBJLoader2.Parser.prototype = {
|
|
|
+ '\n\tmaterialPerSmoothingGroup: ' + this.materialPerSmoothingGroup
|
|
|
+ '\n\tuseOAsMesh: ' + this.useOAsMesh
|
|
|
+ '\n\tuseIndices: ' + this.useIndices
|
|
|
- + '\n\tdisregardNormals: ' + this.disregardNormals
|
|
|
- + '\n\tcallbackMeshBuilderName: ' + this.callbackMeshBuilder.name
|
|
|
- + '\n\tcallbackProgressName: ' + this.callbackProgress.name;
|
|
|
+ + '\n\tdisregardNormals: ' + this.disregardNormals;
|
|
|
+ if ( this.callbacks.onProgress !== null ) {
|
|
|
+ printedConfig += '\n\tcallbacks.onProgress: ' + this.callbacks.onProgress.name;
|
|
|
+ }
|
|
|
+ if ( this.callbacks.onAssetAvailable !== null ) {
|
|
|
+ printedConfig += '\n\tcallbacks.onAssetAvailable: ' + this.callbacks.onAssetAvailable.name;
|
|
|
+ }
|
|
|
+ if ( this.callbacks.onError !== null ) {
|
|
|
+ printedConfig += '\n\tcallbacks.onError: ' + this.callbacks.onError.name;
|
|
|
+ }
|
|
|
console.info( printedConfig );
|
|
|
}
|
|
|
},
|
|
@@ -1040,7 +1086,7 @@ THREE.OBJLoader2.Parser.prototype = {
|
|
|
var index = this.rawMesh.activeMtlName + '|' + this.rawMesh.smoothingGroup.normalized;
|
|
|
this.rawMesh.subGroupInUse = this.rawMesh.subGroups[ index ];
|
|
|
|
|
|
- if ( ! THREE.LoaderSupport.Validator.isValid( this.rawMesh.subGroupInUse ) ) {
|
|
|
+ if ( this.rawMesh.subGroupInUse === undefined || this.rawMesh.subGroupInUse === null ) {
|
|
|
|
|
|
this.rawMesh.subGroupInUse = {
|
|
|
index: index,
|
|
@@ -1108,17 +1154,17 @@ THREE.OBJLoader2.Parser.prototype = {
|
|
|
|
|
|
var mappingName = faceIndexV + ( faceIndexU ? '_' + faceIndexU : '_n' ) + ( faceIndexN ? '_' + faceIndexN : '_n' );
|
|
|
var indicesPointer = this.rawMesh.subGroupInUse.indexMappings[ mappingName ];
|
|
|
- if ( THREE.LoaderSupport.Validator.isValid( indicesPointer ) ) {
|
|
|
-
|
|
|
- this.rawMesh.counts.doubleIndicesCount++;
|
|
|
-
|
|
|
- } else {
|
|
|
+ if ( indicesPointer === undefined || indicesPointer === null ) {
|
|
|
|
|
|
indicesPointer = this.rawMesh.subGroupInUse.vertices.length / 3;
|
|
|
updateSubGroupInUse();
|
|
|
this.rawMesh.subGroupInUse.indexMappings[ mappingName ] = indicesPointer;
|
|
|
this.rawMesh.subGroupInUse.indexMappingsCount++;
|
|
|
|
|
|
+ } else {
|
|
|
+
|
|
|
+ this.rawMesh.counts.doubleIndicesCount++;
|
|
|
+
|
|
|
}
|
|
|
this.rawMesh.subGroupInUse.indices.push( indicesPointer );
|
|
|
|
|
@@ -1200,11 +1246,12 @@ THREE.OBJLoader2.Parser.prototype = {
|
|
|
|
|
|
processCompletedMesh: function () {
|
|
|
var result = this.finalizeRawMesh();
|
|
|
- if ( THREE.LoaderSupport.Validator.isValid( result ) ) {
|
|
|
+ var haveMesh = result !== null;
|
|
|
+ if ( haveMesh ) {
|
|
|
|
|
|
- if ( this.colors.length > 0 && this.colors.length !== this.vertices.length ) {
|
|
|
+ if ( this.colors.length > 0 && this.colors.length !== this.vertices.length && this.callbacks.onError !== null ) {
|
|
|
|
|
|
- this._throwError( 'Vertex Colors were detected, but vertex count and color count do not match!' );
|
|
|
+ this.callbacks.onError( 'Vertex Colors were detected, but vertex count and color count do not match!' );
|
|
|
|
|
|
}
|
|
|
if ( this.logging.enabled && this.logging.debug ) console.debug( this.createRawMeshReport( this.inputObjectCount ) );
|
|
@@ -1212,14 +1259,17 @@ THREE.OBJLoader2.Parser.prototype = {
|
|
|
|
|
|
this.buildMesh( result );
|
|
|
var progressBytesPercent = this.globalCounts.currentByte / this.globalCounts.totalBytes;
|
|
|
- this.callbackProgress( 'Completed [o: ' + this.rawMesh.objectName + ' g:' + this.rawMesh.groupName + '] Total progress: ' + ( progressBytesPercent * 100 ).toFixed( 2 ) + '%', progressBytesPercent );
|
|
|
+ if ( this.callbacks.onProgress !== null ) {
|
|
|
+
|
|
|
+ this.callbacks.onProgress( 'Completed [o: ' + this.rawMesh.objectName + ' g:' + this.rawMesh.groupName +
|
|
|
+ '] Total progress: ' + ( progressBytesPercent * 100 ).toFixed( 2 ) + '%', progressBytesPercent );
|
|
|
+
|
|
|
+ }
|
|
|
this.resetRawMesh();
|
|
|
return true;
|
|
|
|
|
|
- } else {
|
|
|
-
|
|
|
- return false;
|
|
|
}
|
|
|
+ return haveMesh;
|
|
|
},
|
|
|
|
|
|
/**
|
|
@@ -1239,7 +1289,7 @@ THREE.OBJLoader2.Parser.prototype = {
|
|
|
var colorFA = ( result.absoluteColorCount > 0 ) ? new Float32Array( result.absoluteColorCount ) : null;
|
|
|
var normalFA = ( result.absoluteNormalCount > 0 ) ? new Float32Array( result.absoluteNormalCount ) : null;
|
|
|
var uvFA = ( result.absoluteUvCount > 0 ) ? new Float32Array( result.absoluteUvCount ) : null;
|
|
|
- var haveVertexColors = THREE.LoaderSupport.Validator.isValid( colorFA );
|
|
|
+ var haveVertexColors = colorFA !== null;
|
|
|
|
|
|
var meshOutputGroup;
|
|
|
var materialNames = [];
|
|
@@ -1281,29 +1331,20 @@ THREE.OBJLoader2.Parser.prototype = {
|
|
|
material = this.materials[ materialName ];
|
|
|
|
|
|
// both original and derived names do not lead to an existing material => need to use a default material
|
|
|
- if ( ! THREE.LoaderSupport.Validator.isValid( materialOrg ) && ! THREE.LoaderSupport.Validator.isValid( material ) ) {
|
|
|
+ if ( ( materialOrg === undefined || materialOrg === null ) && ( material === undefined || material === null ) ) {
|
|
|
|
|
|
- var defaultMaterialName = haveVertexColors ? 'defaultVertexColorMaterial' : 'defaultMaterial';
|
|
|
- materialOrg = this.materials[ defaultMaterialName ];
|
|
|
+ materialName = haveVertexColors ? 'defaultVertexColorMaterial' : 'defaultMaterial';
|
|
|
+ material = this.materials[ materialName ];
|
|
|
if ( this.logging.enabled ) {
|
|
|
|
|
|
console.info( 'object_group "' + meshOutputGroup.objectName + '_' +
|
|
|
meshOutputGroup.groupName + '" was defined with unresolvable material "' +
|
|
|
- materialNameOrg + '"! Assigning "' + defaultMaterialName + '".' );
|
|
|
-
|
|
|
- }
|
|
|
- materialNameOrg = defaultMaterialName;
|
|
|
-
|
|
|
- // if names are identical then there is no need for later manipulation
|
|
|
- if ( materialNameOrg === materialName ) {
|
|
|
-
|
|
|
- material = materialOrg;
|
|
|
- materialName = defaultMaterialName;
|
|
|
+ materialNameOrg + '"! Assigning "' + materialName + '".' );
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
- if ( ! THREE.LoaderSupport.Validator.isValid( material ) ) {
|
|
|
+ if ( material === undefined || material === null ) {
|
|
|
|
|
|
var materialCloneInstructions = {
|
|
|
materialNameOrg: materialNameOrg,
|
|
@@ -1319,7 +1360,7 @@ THREE.OBJLoader2.Parser.prototype = {
|
|
|
materialCloneInstructions: materialCloneInstructions
|
|
|
}
|
|
|
};
|
|
|
- this.callbackMeshBuilder( payload );
|
|
|
+ this.callbacks.onAssetAvailable( payload );
|
|
|
|
|
|
// fake entry for async; sync Parser always works on material references (Builder update directly visible here)
|
|
|
if ( this.useAsync ) this.materials[ materialName ] = materialCloneInstructions;
|
|
@@ -1384,7 +1425,7 @@ THREE.OBJLoader2.Parser.prototype = {
|
|
|
}
|
|
|
|
|
|
if ( this.logging.enabled && this.logging.debug ) {
|
|
|
- var materialIndexLine = THREE.LoaderSupport.Validator.isValid( selectedMaterialIndex ) ? '\n\t\tmaterialIndex: ' + selectedMaterialIndex : '';
|
|
|
+ var materialIndexLine = ( selectedMaterialIndex === undefined || selectedMaterialIndex === null ) ? '' : '\n\t\tmaterialIndex: ' + selectedMaterialIndex;
|
|
|
var createdReport = '\tOutput Object no.: ' + this.outputObjectCount +
|
|
|
'\n\t\tgroupName: ' + meshOutputGroup.groupName +
|
|
|
'\n\t\tIndex: ' + meshOutputGroup.index +
|
|
@@ -1404,7 +1445,7 @@ THREE.OBJLoader2.Parser.prototype = {
|
|
|
}
|
|
|
|
|
|
this.outputObjectCount++;
|
|
|
- this.callbackMeshBuilder(
|
|
|
+ this.callbacks.onAssetAvailable(
|
|
|
{
|
|
|
cmd: 'meshData',
|
|
|
progress: {
|
|
@@ -1429,10 +1470,10 @@ THREE.OBJLoader2.Parser.prototype = {
|
|
|
geometryType: this.rawMesh.faceType < 4 ? 0 : ( this.rawMesh.faceType === 6 ) ? 2 : 1
|
|
|
},
|
|
|
[ vertexFA.buffer ],
|
|
|
- THREE.LoaderSupport.Validator.isValid( indexUA ) ? [ indexUA.buffer ] : null,
|
|
|
- THREE.LoaderSupport.Validator.isValid( colorFA ) ? [ colorFA.buffer ] : null,
|
|
|
- THREE.LoaderSupport.Validator.isValid( normalFA ) ? [ normalFA.buffer ] : null,
|
|
|
- THREE.LoaderSupport.Validator.isValid( uvFA ) ? [ uvFA.buffer ] : null
|
|
|
+ indexUA !== null ? [ indexUA.buffer ] : null,
|
|
|
+ colorFA !== null ? [ colorFA.buffer ] : null,
|
|
|
+ normalFA !== null ? [ normalFA.buffer ] : null,
|
|
|
+ uvFA !== null ? [ uvFA.buffer ] : null
|
|
|
);
|
|
|
},
|
|
|
|