Browse Source

#11707 OBJLoader and OBJLoader2 are tolerant against smoothing group definitions without a value.

Kai Salmen 8 years ago
parent
commit
67f24d0d2d

+ 11 - 8
examples/js/loaders/OBJLoader.js

@@ -20,8 +20,6 @@ THREE.OBJLoader = ( function () {
 	var face_vertex_normal       = /^f\s+(-?\d+)\/\/(-?\d+)\s+(-?\d+)\/\/(-?\d+)\s+(-?\d+)\/\/(-?\d+)(?:\s+(-?\d+)\/\/(-?\d+))?/;
 	// o object_name | g group_name
 	var object_pattern           = /^[og]\s*(.+)?/;
-	// s boolean
-	var smoothing_pattern        = /^s\s+(\d+|on|off)/;
 	// mtllib file_reference
 	var material_library_pattern = /^mtllib /;
 	// usemtl material_name
@@ -589,7 +587,9 @@ THREE.OBJLoader = ( function () {
 
 					state.materialLibraries.push( line.substring( 7 ).trim() );
 
-				} else if ( ( result = smoothing_pattern.exec( line ) ) !== null ) {
+				} else if ( lineFirstChar === "s" ) {
+
+					result = line.length > 1 ? line.substring( 1 ).trim().split( " " ) : [];
 
 					// smooth shading
 
@@ -600,7 +600,6 @@ THREE.OBJLoader = ( function () {
 					// where explicit usemtl defines geometry groups.
 					// Example asset: examples/models/obj/cerberus/Cerberus.obj
 
-					var value = result[ 1 ].trim().toLowerCase();
 					/*
 					 * http://paulbourke.net/dataformats/obj/
 					 * or
@@ -612,14 +611,18 @@ THREE.OBJLoader = ( function () {
 					 * surfaces, smoothing groups are either turned on or off; there is no difference between values greater
 					 * than 0."
 					 */
-					state.object.smooth = ( value !== '0' && value !== 'off' );
+					if ( result.length > 0 ) {
 
-					var material = state.object.currentMaterial();
-					if ( material ) {
+						var value = result[ 0 ].trim().toLowerCase();
+						state.object.smooth = ( value !== '0' && value !== 'off' );
 
-						material.smooth = state.object.smooth;
+					} else {
+
+						state.object.smooth = true;
 
 					}
+					var material = state.object.currentMaterial();
+					if ( material ) material.smooth = state.object.smooth;
 
 				} else {
 

+ 12 - 1
examples/js/loaders/OBJLoader2.js

@@ -15,7 +15,7 @@ if ( THREE.OBJLoader2 === undefined ) { THREE.OBJLoader2 = {} }
  */
 THREE.OBJLoader2 = (function () {
 
-	var OBJLOADER2_VERSION = '1.3.0';
+	var OBJLOADER2_VERSION = '1.3.1';
 
 	function OBJLoader2( manager ) {
 		console.log( "Using THREE.OBJLoader2 version: " + OBJLOADER2_VERSION );
@@ -449,11 +449,13 @@ THREE.OBJLoader2 = (function () {
 
 				case Consts.LINE_S:
 					this.rawObject.pushSmoothingGroup( buffer[ 1 ] );
+					this.flushStringBuffer( buffer, bufferPointer );
 					break;
 
 				case Consts.LINE_G:
 					concatBuffer = bufferLength > 1 ? buffer.slice( 1, bufferPointer ).join( ' ' ) : buffer[ 1 ];
 					this.processCompletedGroup( concatBuffer );
+					this.flushStringBuffer( buffer, bufferPointer );
 					break;
 
 				case Consts.LINE_O:
@@ -468,16 +470,19 @@ THREE.OBJLoader2 = (function () {
 						this.rawObject.pushObject( concatBuffer );
 
 					}
+					this.flushStringBuffer( buffer, bufferPointer );
 					break;
 
 				case Consts.LINE_MTLLIB:
 					concatBuffer = bufferLength > 1 ? buffer.slice( 1, bufferPointer ).join( ' ' ) : buffer[ 1 ];
 					this.rawObject.pushMtllib( concatBuffer );
+					this.flushStringBuffer( buffer, bufferPointer );
 					break;
 
 				case Consts.LINE_USEMTL:
 					concatBuffer = bufferLength > 1 ? buffer.slice( 1, bufferPointer ).join( ' ' ) : buffer[ 1 ];
 					this.rawObject.pushUsemtl( concatBuffer );
+					this.flushStringBuffer( buffer, bufferPointer );
 					break;
 
 				default:
@@ -486,6 +491,12 @@ THREE.OBJLoader2 = (function () {
 			return reachedFaces;
 		};
 
+		Parser.prototype.flushStringBuffer = function ( buffer, bufferLength ) {
+			for ( var i = 0; i < bufferLength; i++ ) {
+				buffer[ i ] = '';
+			}
+		};
+
 		Parser.prototype.processCompletedObject = function ( objectName, groupName ) {
 			this.rawObject.finalize( this.meshCreator, this.inputObjectCount, this.debug );
 			this.inputObjectCount++;

+ 1 - 1
examples/js/loaders/WWOBJLoader2.js

@@ -15,7 +15,7 @@ if ( THREE.OBJLoader2 === undefined ) { THREE.OBJLoader2 = {} }
  */
 THREE.OBJLoader2.WWOBJLoader2 = (function () {
 
-	var WWOBJLOADER2_VERSION = '1.3.0';
+	var WWOBJLOADER2_VERSION = '1.3.1';
 
 	var Validator = THREE.OBJLoader2.prototype._getValidator();