Browse Source

OBJLoader: Fix bug that produced geom group and multi-material for objects where the last line is a material change. (#9645)

This was incorrectly used for multi-material even if no faces for the new material were declared.

Fixes #9495
Jonne Nauha 9 years ago
parent
commit
af06c2121d
1 changed files with 22 additions and 7 deletions
  1. 22 7
      examples/js/loaders/OBJLoader.js

+ 22 - 7
examples/js/loaders/OBJLoader.js

@@ -89,14 +89,14 @@ THREE.OBJLoader.prototype = {
 
 
 				}
 				}
 
 
+				var previousMaterial = ( this.object && typeof this.object.currentMaterial === 'function' ? this.object.currentMaterial() : undefined );
+
 				if ( this.object && typeof this.object._finalize === 'function' ) {
 				if ( this.object && typeof this.object._finalize === 'function' ) {
 
 
-					this.object._finalize();
+					this.object._finalize( true );
 
 
 				}
 				}
 
 
-				var previousMaterial = ( this.object && typeof this.object.currentMaterial === 'function' ? this.object.currentMaterial() : undefined );
-
 				this.object = {
 				this.object = {
 					name : name || '',
 					name : name || '',
 					fromDeclaration : ( fromDeclaration !== false ),
 					fromDeclaration : ( fromDeclaration !== false ),
@@ -132,16 +132,18 @@ THREE.OBJLoader.prototype = {
 							inherited  : false,
 							inherited  : false,
 
 
 							clone : function( index ) {
 							clone : function( index ) {
-								return {
+								var cloned = {
 									index      : ( typeof index === 'number' ? index : this.index ),
 									index      : ( typeof index === 'number' ? index : this.index ),
 									name       : this.name,
 									name       : this.name,
 									mtllib     : this.mtllib,
 									mtllib     : this.mtllib,
 									smooth     : this.smooth,
 									smooth     : this.smooth,
-									groupStart : this.groupEnd,
+									groupStart : 0,
 									groupEnd   : -1,
 									groupEnd   : -1,
 									groupCount : -1,
 									groupCount : -1,
 									inherited  : false
 									inherited  : false
 								};
 								};
+								cloned.clone = this.clone.bind(cloned);
+								return cloned;
 							}
 							}
 						};
 						};
 
 
@@ -172,12 +174,25 @@ THREE.OBJLoader.prototype = {
 
 
 						}
 						}
 
 
+						// Ignore objects tail materials if no face declarations followed them before a new o/g started.
+						if ( end && this.materials.length > 1 ) {
+
+							for ( var mi = this.materials.length - 1; mi >= 0; mi-- ) {
+								if ( this.materials[mi].groupCount <= 0 ) {
+									this.materials.splice( mi, 1 );
+								}
+							}
+
+						}
+
 						// Guarantee at least one empty material, this makes the creation later more straight forward.
 						// Guarantee at least one empty material, this makes the creation later more straight forward.
-						if ( end !== false && this.materials.length === 0 ) {
+						if ( end && this.materials.length === 0 ) {
+
 							this.materials.push({
 							this.materials.push({
 								name   : '',
 								name   : '',
 								smooth : this.smooth
 								smooth : this.smooth
 							});
 							});
+
 						}
 						}
 
 
 						return lastMultiMaterial;
 						return lastMultiMaterial;
@@ -207,7 +222,7 @@ THREE.OBJLoader.prototype = {
 
 
 				if ( this.object && typeof this.object._finalize === 'function' ) {
 				if ( this.object && typeof this.object._finalize === 'function' ) {
 
 
-					this.object._finalize();
+					this.object._finalize( true );
 
 
 				}
 				}