Browse Source

tweak variable definitions; change check for objects in file; regex pattern changes; misc

- DRYer code for creating a new group. See `addObject` method.
- lessened number of variables (`geometry` and `material` are referenced through `object`)
- different way of checking if a group exists in OBJ file: create an empty object, and if there is object found, switch a boolean and use that initial empty object as the object.
- add smoothing group regex pattern and material smoothing assignment
- add object group regex pattern and use result as name
- tweaks to other regexes: do not include spaces in matching groups; add start-of-line anchor
- if there are no normals defined, attempt to compute them
Daniel Hritzkiv 9 years ago
parent
commit
ef39e33d17
1 changed files with 70 additions and 72 deletions
  1. 70 72
      examples/js/loaders/OBJLoader.js

+ 70 - 72
examples/js/loaders/OBJLoader.js

@@ -44,8 +44,35 @@ THREE.OBJLoader.prototype = {
 
 
 		console.time( 'OBJLoader' );
 		console.time( 'OBJLoader' );
 
 
-		var object, objects = [];
-		var geometry, material;
+		var objects = [];
+		var object;
+		var foundObjects = false;
+		var vertices = [];
+		var normals = [];
+		var uvs = [];
+		
+		function addObject(name) {
+			
+			var geometry = {
+				vertices: [],
+				normals: [],
+				uvs: []
+			};
+
+			var material = {
+				name: '',
+				smooth: true
+			};
+
+			object = {
+				name: name,
+				geometry: geometry,
+				material: material
+			};
+
+			objects.push( object );
+			
+		}
 
 
 		function parseVertexIndex( value ) {
 		function parseVertexIndex( value ) {
 
 
@@ -73,7 +100,7 @@ THREE.OBJLoader.prototype = {
 
 
 		function addVertex( a, b, c ) {
 		function addVertex( a, b, c ) {
 
 
-			geometry.vertices.push(
+			object.geometry.vertices.push(
 				vertices[ a ], vertices[ a + 1 ], vertices[ a + 2 ],
 				vertices[ a ], vertices[ a + 1 ], vertices[ a + 2 ],
 				vertices[ b ], vertices[ b + 1 ], vertices[ b + 2 ],
 				vertices[ b ], vertices[ b + 1 ], vertices[ b + 2 ],
 				vertices[ c ], vertices[ c + 1 ], vertices[ c + 2 ]
 				vertices[ c ], vertices[ c + 1 ], vertices[ c + 2 ]
@@ -83,7 +110,7 @@ THREE.OBJLoader.prototype = {
 
 
 		function addNormal( a, b, c ) {
 		function addNormal( a, b, c ) {
 
 
-			geometry.normals.push(
+			object.geometry.normals.push(
 				normals[ a ], normals[ a + 1 ], normals[ a + 2 ],
 				normals[ a ], normals[ a + 1 ], normals[ a + 2 ],
 				normals[ b ], normals[ b + 1 ], normals[ b + 2 ],
 				normals[ b ], normals[ b + 1 ], normals[ b + 2 ],
 				normals[ c ], normals[ c + 1 ], normals[ c + 2 ]
 				normals[ c ], normals[ c + 1 ], normals[ c + 2 ]
@@ -93,7 +120,7 @@ THREE.OBJLoader.prototype = {
 
 
 		function addUV( a, b, c ) {
 		function addUV( a, b, c ) {
 
 
-			geometry.uvs.push(
+			object.geometry.uvs.push(
 				uvs[ a ], uvs[ a + 1 ],
 				uvs[ a ], uvs[ a + 1 ],
 				uvs[ b ], uvs[ b + 1 ],
 				uvs[ b ], uvs[ b + 1 ],
 				uvs[ c ], uvs[ c + 1 ]
 				uvs[ c ], uvs[ c + 1 ]
@@ -164,62 +191,33 @@ THREE.OBJLoader.prototype = {
 			}
 			}
 
 
 		}
 		}
-
-		// create mesh if no objects in text
-
-		if ( /^o /gm.test( text ) === false ) {
-
-			geometry = {
-				vertices: [],
-				normals: [],
-				uvs: []
-			};
-
-			material = {
-				name: ''
-			};
-
-			object = {
-				name: '',
-				geometry: geometry,
-				material: material
-			};
-
-			objects.push( object );
-
-		}
-
-		var vertices = [];
-		var normals = [];
-		var uvs = [];
+		
+		addObject("");
 
 
 		// v float float float
 		// v float float float
-
-		var vertex_pattern = /v( +[\d|\.|\+|\-|e|E]+)( +[\d|\.|\+|\-|e|E]+)( +[\d|\.|\+|\-|e|E]+)/;
+		var vertex_pattern = /^v\s+([\d|\.|\+|\-|e|E]+)\s+([\d|\.|\+|\-|e|E]+)\s+([\d|\.|\+|\-|e|E]+)/;
 
 
 		// vn float float float
 		// vn float float float
-
-		var normal_pattern = /vn( +[\d|\.|\+|\-|e|E]+)( +[\d|\.|\+|\-|e|E]+)( +[\d|\.|\+|\-|e|E]+)/;
+		var normal_pattern = /^vn\s+([\d|\.|\+|\-|e|E]+)\s+([\d|\.|\+|\-|e|E]+)\s+([\d|\.|\+|\-|e|E]+)/;
 
 
 		// vt float float
 		// vt float float
-
-		var uv_pattern = /vt( +[\d|\.|\+|\-|e|E]+)( +[\d|\.|\+|\-|e|E]+)/;
+		var uv_pattern = /^vt\s+([\d|\.|\+|\-|e|E]+)\s+([\d|\.|\+|\-|e|E]+)/;
 
 
 		// f vertex vertex vertex ...
 		// f vertex vertex vertex ...
-
-		var face_pattern1 = /f( +-?\d+)( +-?\d+)( +-?\d+)( +-?\d+)?/;
+		var face_pattern1 = /^f\s+(-?\d+)\s+(-?\d+)\s+(-?\d+)(?:\s+(-?\d+))?/;
 
 
 		// f vertex/uv vertex/uv vertex/uv ...
 		// f vertex/uv vertex/uv vertex/uv ...
-
-		var face_pattern2 = /f( +(-?\d+)\/(-?\d+))( +(-?\d+)\/(-?\d+))( +(-?\d+)\/(-?\d+))( +(-?\d+)\/(-?\d+))?/;
+		var face_pattern2 = /^f\s+((-?\d+)\/(-?\d+))\s+((-?\d+)\/(-?\d+))\s+((-?\d+)\/(-?\d+))(?:\s+((-?\d+)\/(-?\d+)))?/;
 
 
 		// f vertex/uv/normal vertex/uv/normal vertex/uv/normal ...
 		// f vertex/uv/normal vertex/uv/normal vertex/uv/normal ...
-
-		var face_pattern3 = /f( +(-?\d+)\/(-?\d+)\/(-?\d+))( +(-?\d+)\/(-?\d+)\/(-?\d+))( +(-?\d+)\/(-?\d+)\/(-?\d+))( +(-?\d+)\/(-?\d+)\/(-?\d+))?/;
+		var face_pattern3 = /^f\s+((-?\d+)\/(-?\d+)\/(-?\d+))\s+((-?\d+)\/(-?\d+)\/(-?\d+))\s+((-?\d+)\/(-?\d+)\/(-?\d+))(?:\s+((-?\d+)\/(-?\d+)\/(-?\d+)))?/;
 
 
 		// f vertex//normal vertex//normal vertex//normal ...
 		// f vertex//normal vertex//normal vertex//normal ...
-
-		var face_pattern4 = /f( +(-?\d+)\/\/(-?\d+))( +(-?\d+)\/\/(-?\d+))( +(-?\d+)\/\/(-?\d+))( +(-?\d+)\/\/(-?\d+))?/;
+		var face_pattern4 = /^f\s+((-?\d+)\/\/(-?\d+))\s+((-?\d+)\/\/(-?\d+))\s+((-?\d+)\/\/(-?\d+))(?:\s+((-?\d+)\/\/(-?\d+)))?/;
+		
+		var object_pattern = /^o\s+(.+)/;
+		
+		var smoothing_pattern = /^s\s+([01]|on|off)/;
 
 
 		//
 		//
 
 
@@ -302,25 +300,20 @@ THREE.OBJLoader.prototype = {
 					result[ 3 ], result[ 6 ], result[ 9 ], result[ 12 ]
 					result[ 3 ], result[ 6 ], result[ 9 ], result[ 12 ]
 				);
 				);
 
 
-			} else if ( /^o /.test( line ) ) {
-
-				geometry = {
-					vertices: [],
-					normals: [],
-					uvs: []
-				};
-
-				material = {
-					name: ''
-				};
-
-				object = {
-					name: line.substring( 2 ).trim(),
-					geometry: geometry,
-					material: material
-				};
-
-				objects.push( object )
+			} else if ( ( result = object_pattern.exec( line ) ) !== null ) {
+				
+				var name = result[1].trim();
+				
+				if ( foundObjects === false ) {
+					
+					foundObjects = true;
+					object.name = name;
+					
+				} else {
+					
+					addObject(name);
+					
+				}
 
 
 			} else if ( /^g /.test( line ) ) {
 			} else if ( /^g /.test( line ) ) {
 
 
@@ -330,15 +323,17 @@ THREE.OBJLoader.prototype = {
 
 
 				// material
 				// material
 
 
-				material.name = line.substring( 7 ).trim();
+				object.material.name = line.substring( 7 ).trim();
 
 
 			} else if ( /^mtllib /.test( line ) ) {
 			} else if ( /^mtllib /.test( line ) ) {
 
 
 				// mtl file
 				// mtl file
 
 
-			} else if ( /^s /.test( line ) ) {
+			} else if ( ( result = smoothing_pattern.exec( line ) ) !== null ) {
 
 
 				// smooth shading
 				// smooth shading
+				
+				object.material.smooth = result[ 1 ] === "1" || result[ 1 ] === "on";
 
 
 			} else {
 			} else {
 
 
@@ -348,12 +343,12 @@ THREE.OBJLoader.prototype = {
 
 
 		}
 		}
 
 
-		var container = new THREE.Object3D();
+		var container = new THREE.Group();
 
 
 		for ( var i = 0, l = objects.length; i < l; i ++ ) {
 		for ( var i = 0, l = objects.length; i < l; i ++ ) {
 
 
 			object = objects[ i ];
 			object = objects[ i ];
-			geometry = object.geometry;
+			var geometry = object.geometry;
 
 
 			var buffergeometry = new THREE.BufferGeometry();
 			var buffergeometry = new THREE.BufferGeometry();
 
 
@@ -363,6 +358,10 @@ THREE.OBJLoader.prototype = {
 
 
 				buffergeometry.addAttribute( 'normal', new THREE.BufferAttribute( new Float32Array( geometry.normals ), 3 ) );
 				buffergeometry.addAttribute( 'normal', new THREE.BufferAttribute( new Float32Array( geometry.normals ), 3 ) );
 
 
+			} else {
+				
+				buffergeometry.computeVertexNormals();
+				
 			}
 			}
 
 
 			if ( geometry.uvs.length > 0 ) {
 			if ( geometry.uvs.length > 0 ) {
@@ -386,8 +385,7 @@ THREE.OBJLoader.prototype = {
 				
 				
 			}
 			}
 
 
-			material = new THREE.MeshLambertMaterial();
-			material.name = object.material.name;
+			material.shading = object.material.smooth ? THREE.SmoothShading : THREE.FlatShading;
 
 
 			var mesh = new THREE.Mesh( buffergeometry, material );
 			var mesh = new THREE.Mesh( buffergeometry, material );
 			mesh.name = object.name;
 			mesh.name = object.name;