Old version of OBJLoader so we can keep the vertices merged
This commit is contained in:
		
							parent
							
								
									ab0396ae6f
								
							
						
					
					
						commit
						1101c74132
					
				| @ -22,156 +22,139 @@ THREE.OBJLoader.prototype = { | ||||
| 
 | ||||
| 			onLoad( scope.parse( text ) ); | ||||
| 
 | ||||
| 		}, onProgress, onError ); | ||||
| 		} ); | ||||
| 
 | ||||
| 	}, | ||||
| 
 | ||||
| 	parse: function ( text ) { | ||||
| 
 | ||||
| 		console.time( 'OBJLoader' ); | ||||
| 		function vector( x, y, z ) { | ||||
| 
 | ||||
| 		var object, objects = []; | ||||
| 		var geometry, material; | ||||
| 
 | ||||
| 		function parseVertexIndex( value ) { | ||||
| 
 | ||||
| 			var index = parseInt( value ); | ||||
| 
 | ||||
| 			return ( index >= 0 ? index - 1 : index + vertices.length / 3 ) * 3; | ||||
| 			return new THREE.Vector3( parseFloat( x ), parseFloat( y ), parseFloat( z ) ); | ||||
| 
 | ||||
| 		} | ||||
| 
 | ||||
| 		function parseNormalIndex( value ) { | ||||
| 		function uv( u, v ) { | ||||
| 
 | ||||
| 			var index = parseInt( value ); | ||||
| 
 | ||||
| 			return ( index >= 0 ? index - 1 : index + normals.length / 3 ) * 3; | ||||
| 			return new THREE.Vector2( parseFloat( u ), parseFloat( v ) ); | ||||
| 
 | ||||
| 		} | ||||
| 
 | ||||
| 		function parseUVIndex( value ) { | ||||
| 		function face3( a, b, c, normals ) { | ||||
| 
 | ||||
| 			var index = parseInt( value ); | ||||
| 			return new THREE.Face3( a, b, c, normals ); | ||||
| 
 | ||||
| 			return ( index >= 0 ? index - 1 : index + uvs.length / 2 ) * 2; | ||||
| 		} | ||||
| 		 | ||||
| 		var object = new THREE.Object3D(); | ||||
| 		var geometry, material, mesh; | ||||
| 
 | ||||
| 		function parseVertexIndex( index ) { | ||||
| 
 | ||||
| 			index = parseInt( index ); | ||||
| 
 | ||||
| 			return index >= 0 ? index - 1 : index + vertices.length; | ||||
| 
 | ||||
| 		} | ||||
| 
 | ||||
| 		function addVertex( a, b, c ) { | ||||
| 		function parseNormalIndex( index ) { | ||||
| 
 | ||||
| 			geometry.vertices.push( | ||||
| 				vertices[ a ], vertices[ a + 1 ], vertices[ a + 2 ], | ||||
| 				vertices[ b ], vertices[ b + 1 ], vertices[ b + 2 ], | ||||
| 				vertices[ c ], vertices[ c + 1 ], vertices[ c + 2 ] | ||||
| 			); | ||||
| 			index = parseInt( index ); | ||||
| 
 | ||||
| 			return index >= 0 ? index - 1 : index + normals.length; | ||||
| 
 | ||||
| 		} | ||||
| 
 | ||||
| 		function addNormal( a, b, c ) { | ||||
| 		function parseUVIndex( index ) { | ||||
| 
 | ||||
| 			geometry.normals.push( | ||||
| 				normals[ a ], normals[ a + 1 ], normals[ a + 2 ], | ||||
| 				normals[ b ], normals[ b + 1 ], normals[ b + 2 ], | ||||
| 				normals[ c ], normals[ c + 1 ], normals[ c + 2 ] | ||||
| 			); | ||||
| 			index = parseInt( index ); | ||||
| 
 | ||||
| 			return index >= 0 ? index - 1 : index + uvs.length; | ||||
| 
 | ||||
| 		} | ||||
| 		 | ||||
| 		function add_face( a, b, c, normals_inds ) { | ||||
| 
 | ||||
| 		function addUV( a, b, c ) { | ||||
| 			if ( normals_inds === undefined ) { | ||||
| 
 | ||||
| 			geometry.uvs.push( | ||||
| 				uvs[ a ], uvs[ a + 1 ], | ||||
| 				uvs[ b ], uvs[ b + 1 ], | ||||
| 				uvs[ c ], uvs[ c + 1 ] | ||||
| 			); | ||||
| 
 | ||||
| 		} | ||||
| 
 | ||||
| 		function addFace( a, b, c, d,  ua, ub, uc, ud, na, nb, nc, nd ) { | ||||
| 
 | ||||
| 			var ia = parseVertexIndex( a ); | ||||
| 			var ib = parseVertexIndex( b ); | ||||
| 			var ic = parseVertexIndex( c ); | ||||
| 			var id; | ||||
| 
 | ||||
| 			if ( d === undefined ) { | ||||
| 
 | ||||
| 				addVertex( ia, ib, ic ); | ||||
| 				geometry.faces.push( face3( | ||||
| 					vertices[ parseVertexIndex( a ) ] - 1, | ||||
| 					vertices[ parseVertexIndex( b ) ] - 1, | ||||
| 					vertices[ parseVertexIndex( c ) ] - 1 | ||||
| 				) ); | ||||
| 
 | ||||
| 			} else { | ||||
| 
 | ||||
| 				id = parseVertexIndex( d ); | ||||
| 
 | ||||
| 				addVertex( ia, ib, id ); | ||||
| 				addVertex( ib, ic, id ); | ||||
| 				geometry.faces.push( face3( | ||||
| 					vertices[ parseVertexIndex( a ) ] - 1, | ||||
| 					vertices[ parseVertexIndex( b ) ] - 1, | ||||
| 					vertices[ parseVertexIndex( c ) ] - 1, | ||||
| 					[ | ||||
| 						normals[ parseNormalIndex( normals_inds[ 0 ] ) ].clone(), | ||||
| 						normals[ parseNormalIndex( normals_inds[ 1 ] ) ].clone(), | ||||
| 						normals[ parseNormalIndex( normals_inds[ 2 ] ) ].clone() | ||||
| 					] | ||||
| 				) ); | ||||
| 
 | ||||
| 			} | ||||
| 
 | ||||
| 			if ( ua !== undefined ) { | ||||
| 		} | ||||
| 		 | ||||
| 		function add_uvs( a, b, c ) { | ||||
| 	   | ||||
| 			geometry.faceVertexUvs[ 0 ].push( [ | ||||
| 				uvs[ parseUVIndex( a ) ].clone(), | ||||
| 				uvs[ parseUVIndex( b ) ].clone(), | ||||
| 				uvs[ parseUVIndex( c ) ].clone() | ||||
| 			] ); | ||||
| 
 | ||||
| 				ia = parseUVIndex( ua ); | ||||
| 				ib = parseUVIndex( ub ); | ||||
| 				ic = parseUVIndex( uc ); | ||||
| 		} | ||||
| 		 | ||||
| 		function handle_face_line(faces, uvs, normals_inds) { | ||||
| 
 | ||||
| 				if ( d === undefined ) { | ||||
| 			if ( faces[ 3 ] === undefined ) { | ||||
| 				 | ||||
| 				add_face( faces[ 0 ], faces[ 1 ], faces[ 2 ], normals_inds ); | ||||
| 				 | ||||
| 				if ( uvs !== undefined && uvs.length > 0 ) { | ||||
| 
 | ||||
| 					addUV( ia, ib, ic ); | ||||
| 					add_uvs( uvs[ 0 ], uvs[ 1 ], uvs[ 2 ] ); | ||||
| 
 | ||||
| 				} | ||||
| 
 | ||||
| 			} else { | ||||
| 				 | ||||
| 				if ( normals_inds !== undefined && normals_inds.length > 0 ) { | ||||
| 
 | ||||
| 					add_face( faces[ 0 ], faces[ 1 ], faces[ 3 ], [ normals_inds[ 0 ], normals_inds[ 1 ], normals_inds[ 3 ] ] ); | ||||
| 					add_face( faces[ 1 ], faces[ 2 ], faces[ 3 ], [ normals_inds[ 1 ], normals_inds[ 2 ], normals_inds[ 3 ] ] ); | ||||
| 
 | ||||
| 				} else { | ||||
| 
 | ||||
| 					id = parseUVIndex( ud ); | ||||
| 					add_face( faces[ 0 ], faces[ 1 ], faces[ 3 ] ); | ||||
| 					add_face( faces[ 1 ], faces[ 2 ], faces[ 3 ] ); | ||||
| 
 | ||||
| 					addUV( ia, ib, id ); | ||||
| 					addUV( ib, ic, id ); | ||||
| 				} | ||||
| 				 | ||||
| 				if ( uvs !== undefined && uvs.length > 0 ) { | ||||
| 
 | ||||
| 					add_uvs( uvs[ 0 ], uvs[ 1 ], uvs[ 3 ] ); | ||||
| 					add_uvs( uvs[ 1 ], uvs[ 2 ], uvs[ 3 ] ); | ||||
| 
 | ||||
| 				} | ||||
| 
 | ||||
| 			} | ||||
| 
 | ||||
| 			if ( na !== undefined ) { | ||||
| 
 | ||||
| 				ia = parseNormalIndex( na ); | ||||
| 				ib = parseNormalIndex( nb ); | ||||
| 				ic = parseNormalIndex( nc ); | ||||
| 
 | ||||
| 				if ( d === undefined ) { | ||||
| 
 | ||||
| 					addNormal( ia, ib, ic ); | ||||
| 
 | ||||
| 				} else { | ||||
| 
 | ||||
| 					id = parseNormalIndex( nd ); | ||||
| 
 | ||||
| 					addNormal( ia, ib, id ); | ||||
| 					addNormal( ib, ic, id ); | ||||
| 
 | ||||
| 				} | ||||
| 
 | ||||
| 			} | ||||
| 
 | ||||
| 			 | ||||
| 		} | ||||
| 
 | ||||
| 		// 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 ); | ||||
| 			geometry = new THREE.Geometry(); | ||||
| 			material = new THREE.MeshLambertMaterial(); | ||||
| 			mesh = new THREE.Mesh( geometry, material ); | ||||
| 			object.add( mesh ); | ||||
| 
 | ||||
| 		} | ||||
| 
 | ||||
| @ -181,15 +164,15 @@ THREE.OBJLoader.prototype = { | ||||
| 
 | ||||
| 		// v float float float
 | ||||
| 
 | ||||
| 		var vertex_pattern = /v( +[\d|\.|\+|\-|e|E]+)( +[\d|\.|\+|\-|e|E]+)( +[\d|\.|\+|\-|e|E]+)/; | ||||
| 		var vertex_pattern = /v( +[\d|\.|\+|\-|e]+)( +[\d|\.|\+|\-|e]+)( +[\d|\.|\+|\-|e]+)/; | ||||
| 
 | ||||
| 		// vn float float float
 | ||||
| 
 | ||||
| 		var normal_pattern = /vn( +[\d|\.|\+|\-|e|E]+)( +[\d|\.|\+|\-|e|E]+)( +[\d|\.|\+|\-|e|E]+)/; | ||||
| 		var normal_pattern = /vn( +[\d|\.|\+|\-|e]+)( +[\d|\.|\+|\-|e]+)( +[\d|\.|\+|\-|e]+)/; | ||||
| 
 | ||||
| 		// vt float float
 | ||||
| 
 | ||||
| 		var uv_pattern = /vt( +[\d|\.|\+|\-|e|E]+)( +[\d|\.|\+|\-|e|E]+)/; | ||||
| 		var uv_pattern = /vt( +[\d|\.|\+|\-|e]+)( +[\d|\.|\+|\-|e]+)/; | ||||
| 
 | ||||
| 		// f vertex vertex vertex ...
 | ||||
| 
 | ||||
| @ -203,11 +186,13 @@ THREE.OBJLoader.prototype = { | ||||
| 
 | ||||
| 		var face_pattern3 = /f( +(-?\d+)\/(-?\d+)\/(-?\d+))( +(-?\d+)\/(-?\d+)\/(-?\d+))( +(-?\d+)\/(-?\d+)\/(-?\d+))( +(-?\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+))?/ | ||||
| 
 | ||||
| 		//
 | ||||
| 		// fixes
 | ||||
| 
 | ||||
| 		text = text.replace( /\\\r?\n/g, '' ); // handles line continuations \
 | ||||
| 
 | ||||
| 		var lines = text.split( '\n' ); | ||||
| 
 | ||||
| @ -226,10 +211,12 @@ THREE.OBJLoader.prototype = { | ||||
| 
 | ||||
| 				// ["v 1.0 2.0 3.0", "1.0", "2.0", "3.0"]
 | ||||
| 
 | ||||
| 				vertices.push( | ||||
| 					parseFloat( result[ 1 ] ), | ||||
| 					parseFloat( result[ 2 ] ), | ||||
| 					parseFloat( result[ 3 ] ) | ||||
| 				vertices.push(  | ||||
| 					geometry.vertices.push( | ||||
| 						vector( | ||||
| 							result[ 1 ], result[ 2 ], result[ 3 ] | ||||
| 						) | ||||
| 					) | ||||
| 				); | ||||
| 
 | ||||
| 			} else if ( ( result = normal_pattern.exec( line ) ) !== null ) { | ||||
| @ -237,9 +224,9 @@ THREE.OBJLoader.prototype = { | ||||
| 				// ["vn 1.0 2.0 3.0", "1.0", "2.0", "3.0"]
 | ||||
| 
 | ||||
| 				normals.push( | ||||
| 					parseFloat( result[ 1 ] ), | ||||
| 					parseFloat( result[ 2 ] ), | ||||
| 					parseFloat( result[ 3 ] ) | ||||
| 					vector( | ||||
| 						result[ 1 ], result[ 2 ], result[ 3 ] | ||||
| 					) | ||||
| 				); | ||||
| 
 | ||||
| 			} else if ( ( result = uv_pattern.exec( line ) ) !== null ) { | ||||
| @ -247,66 +234,56 @@ THREE.OBJLoader.prototype = { | ||||
| 				// ["vt 0.1 0.2", "0.1", "0.2"]
 | ||||
| 
 | ||||
| 				uvs.push( | ||||
| 					parseFloat( result[ 1 ] ), | ||||
| 					parseFloat( result[ 2 ] ) | ||||
| 					uv( | ||||
| 						result[ 1 ], result[ 2 ] | ||||
| 					) | ||||
| 				); | ||||
| 
 | ||||
| 			} else if ( ( result = face_pattern1.exec( line ) ) !== null ) { | ||||
| 
 | ||||
| 				// ["f 1 2 3", "1", "2", "3", undefined]
 | ||||
| 
 | ||||
| 				addFace( | ||||
| 					result[ 1 ], result[ 2 ], result[ 3 ], result[ 4 ] | ||||
| 				handle_face_line( | ||||
| 					[ result[ 1 ], result[ 2 ], result[ 3 ], result[ 4 ] ] | ||||
| 				); | ||||
| 
 | ||||
| 			} else if ( ( result = face_pattern2.exec( line ) ) !== null ) { | ||||
| 
 | ||||
| 				// ["f 1/1 2/2 3/3", " 1/1", "1", "1", " 2/2", "2", "2", " 3/3", "3", "3", undefined, undefined, undefined]
 | ||||
| 
 | ||||
| 				addFace( | ||||
| 					result[ 2 ], result[ 5 ], result[ 8 ], result[ 11 ], | ||||
| 					result[ 3 ], result[ 6 ], result[ 9 ], result[ 12 ] | ||||
| 				 | ||||
| 				handle_face_line( | ||||
| 					[ result[ 2 ], result[ 5 ], result[ 8 ], result[ 11 ] ], //faces
 | ||||
| 					[ result[ 3 ], result[ 6 ], result[ 9 ], result[ 12 ] ] //uv
 | ||||
| 				); | ||||
| 
 | ||||
| 			} else if ( ( result = face_pattern3.exec( line ) ) !== null ) { | ||||
| 
 | ||||
| 				// ["f 1/1/1 2/2/2 3/3/3", " 1/1/1", "1", "1", "1", " 2/2/2", "2", "2", "2", " 3/3/3", "3", "3", "3", undefined, undefined, undefined, undefined]
 | ||||
| 
 | ||||
| 				addFace( | ||||
| 					result[ 2 ], result[ 6 ], result[ 10 ], result[ 14 ], | ||||
| 					result[ 3 ], result[ 7 ], result[ 11 ], result[ 15 ], | ||||
| 					result[ 4 ], result[ 8 ], result[ 12 ], result[ 16 ] | ||||
| 				handle_face_line( | ||||
| 					[ result[ 2 ], result[ 6 ], result[ 10 ], result[ 14 ] ], //faces
 | ||||
| 					[ result[ 3 ], result[ 7 ], result[ 11 ], result[ 15 ] ], //uv
 | ||||
| 					[ result[ 4 ], result[ 8 ], result[ 12 ], result[ 16 ] ] //normal
 | ||||
| 				); | ||||
| 
 | ||||
| 			} else if ( ( result = face_pattern4.exec( line ) ) !== null ) { | ||||
| 
 | ||||
| 				// ["f 1//1 2//2 3//3", " 1//1", "1", "1", " 2//2", "2", "2", " 3//3", "3", "3", undefined, undefined, undefined]
 | ||||
| 
 | ||||
| 				addFace( | ||||
| 					result[ 2 ], result[ 5 ], result[ 8 ], result[ 11 ], | ||||
| 					undefined, undefined, undefined, undefined, | ||||
| 					result[ 3 ], result[ 6 ], result[ 9 ], result[ 12 ] | ||||
| 				handle_face_line( | ||||
| 					[ result[ 2 ], result[ 5 ], result[ 8 ], result[ 11 ] ], //faces
 | ||||
| 					[ ], //uv
 | ||||
| 					[ result[ 3 ], result[ 6 ], result[ 9 ], result[ 12 ] ] //normal
 | ||||
| 				); | ||||
| 
 | ||||
| 			} else if ( /^o /.test( line ) ) { | ||||
| 
 | ||||
| 				geometry = { | ||||
| 					vertices: [], | ||||
| 					normals: [], | ||||
| 					uvs: [] | ||||
| 				}; | ||||
| 				geometry = new THREE.Geometry(); | ||||
| 				material = new THREE.MeshLambertMaterial(); | ||||
| 
 | ||||
| 				material = { | ||||
| 					name: '' | ||||
| 				}; | ||||
| 
 | ||||
| 				object = { | ||||
| 					name: line.substring( 2 ).trim(), | ||||
| 					geometry: geometry, | ||||
| 					material: material | ||||
| 				}; | ||||
| 
 | ||||
| 				objects.push( object ) | ||||
| 				mesh = new THREE.Mesh( geometry, material ); | ||||
| 				mesh.name = line.substring( 2 ).trim(); | ||||
| 				object.add( mesh ); | ||||
| 
 | ||||
| 			} else if ( /^g /.test( line ) ) { | ||||
| 
 | ||||
| @ -334,38 +311,18 @@ THREE.OBJLoader.prototype = { | ||||
| 
 | ||||
| 		} | ||||
| 
 | ||||
| 		var container = new THREE.Object3D(); | ||||
| 		var children = object.children; | ||||
| 
 | ||||
| 		for ( var i = 0, l = objects.length; i < l; i ++ ) { | ||||
| 		for ( var i = 0, l = children.length; i < l; i ++ ) { | ||||
| 
 | ||||
| 			object = objects[ i ]; | ||||
| 			geometry = object.geometry; | ||||
| 			var geometry = children[ i ].geometry; | ||||
| 
 | ||||
| 			var buffergeometry = new THREE.BufferGeometry(); | ||||
| 
 | ||||
| 			buffergeometry.addAttribute( 'position', new THREE.BufferAttribute( new Float32Array( geometry.vertices ), 3 ) ); | ||||
| 
 | ||||
| 			if ( geometry.normals.length > 0 ) { | ||||
| 				buffergeometry.addAttribute( 'normal', new THREE.BufferAttribute( new Float32Array( geometry.normals ), 3 ) ); | ||||
| 			} | ||||
| 
 | ||||
| 			if ( geometry.uvs.length > 0 ) { | ||||
| 				buffergeometry.addAttribute( 'uv', new THREE.BufferAttribute( new Float32Array( geometry.uvs ), 2 ) ); | ||||
| 			} | ||||
| 
 | ||||
| 			material = new THREE.MeshLambertMaterial(); | ||||
| 			material.name = object.material.name; | ||||
| 
 | ||||
| 			var mesh = new THREE.Mesh( buffergeometry, material ); | ||||
| 			mesh.name = object.name; | ||||
| 
 | ||||
| 			container.add( mesh ); | ||||
| 			geometry.computeFaceNormals(); | ||||
| 			geometry.computeBoundingSphere(); | ||||
| 
 | ||||
| 		} | ||||
| 
 | ||||
| 		console.timeEnd( 'OBJLoader' ); | ||||
| 
 | ||||
| 		return container; | ||||
| 		 | ||||
| 		return object; | ||||
| 
 | ||||
| 	} | ||||
| 
 | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user