| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309 | 
							- import {
 
- 	Color,
 
- 	Matrix3,
 
- 	Vector2,
 
- 	Vector3
 
- } from '../../../build/three.module.js';
 
- class OBJExporter {
 
- 	parse( object ) {
 
- 		let output = '';
 
- 		let indexVertex = 0;
 
- 		let indexVertexUvs = 0;
 
- 		let indexNormals = 0;
 
- 		const vertex = new Vector3();
 
- 		const color = new Color();
 
- 		const normal = new Vector3();
 
- 		const uv = new Vector2();
 
- 		const face = [];
 
- 		function parseMesh( mesh ) {
 
- 			let nbVertex = 0;
 
- 			let nbNormals = 0;
 
- 			let nbVertexUvs = 0;
 
- 			const geometry = mesh.geometry;
 
- 			const normalMatrixWorld = new Matrix3();
 
- 			if ( geometry.isBufferGeometry !== true ) {
 
- 				throw new Error( 'THREE.OBJExporter: Geometry is not of type THREE.BufferGeometry.' );
 
- 			}
 
- 			// shortcuts
 
- 			const vertices = geometry.getAttribute( 'position' );
 
- 			const normals = geometry.getAttribute( 'normal' );
 
- 			const uvs = geometry.getAttribute( 'uv' );
 
- 			const indices = geometry.getIndex();
 
- 			// name of the mesh object
 
- 			output += 'o ' + mesh.name + '\n';
 
- 			// name of the mesh material
 
- 			if ( mesh.material && mesh.material.name ) {
 
- 				output += 'usemtl ' + mesh.material.name + '\n';
 
- 			}
 
- 			// vertices
 
- 			if ( vertices !== undefined ) {
 
- 				for ( let i = 0, l = vertices.count; i < l; i ++, nbVertex ++ ) {
 
- 					vertex.x = vertices.getX( i );
 
- 					vertex.y = vertices.getY( i );
 
- 					vertex.z = vertices.getZ( i );
 
- 					// transform the vertex to world space
 
- 					vertex.applyMatrix4( mesh.matrixWorld );
 
- 					// transform the vertex to export format
 
- 					output += 'v ' + vertex.x + ' ' + vertex.y + ' ' + vertex.z + '\n';
 
- 				}
 
- 			}
 
- 			// uvs
 
- 			if ( uvs !== undefined ) {
 
- 				for ( let i = 0, l = uvs.count; i < l; i ++, nbVertexUvs ++ ) {
 
- 					uv.x = uvs.getX( i );
 
- 					uv.y = uvs.getY( i );
 
- 					// transform the uv to export format
 
- 					output += 'vt ' + uv.x + ' ' + uv.y + '\n';
 
- 				}
 
- 			}
 
- 			// normals
 
- 			if ( normals !== undefined ) {
 
- 				normalMatrixWorld.getNormalMatrix( mesh.matrixWorld );
 
- 				for ( let i = 0, l = normals.count; i < l; i ++, nbNormals ++ ) {
 
- 					normal.x = normals.getX( i );
 
- 					normal.y = normals.getY( i );
 
- 					normal.z = normals.getZ( i );
 
- 					// transform the normal to world space
 
- 					normal.applyMatrix3( normalMatrixWorld ).normalize();
 
- 					// transform the normal to export format
 
- 					output += 'vn ' + normal.x + ' ' + normal.y + ' ' + normal.z + '\n';
 
- 				}
 
- 			}
 
- 			// faces
 
- 			if ( indices !== null ) {
 
- 				for ( let i = 0, l = indices.count; i < l; i += 3 ) {
 
- 					for ( let m = 0; m < 3; m ++ ) {
 
- 						const j = indices.getX( i + m ) + 1;
 
- 						face[ m ] = ( indexVertex + j ) + ( normals || uvs ? '/' + ( uvs ? ( indexVertexUvs + j ) : '' ) + ( normals ? '/' + ( indexNormals + j ) : '' ) : '' );
 
- 					}
 
- 					// transform the face to export format
 
- 					output += 'f ' + face.join( ' ' ) + '\n';
 
- 				}
 
- 			} else {
 
- 				for ( let i = 0, l = vertices.count; i < l; i += 3 ) {
 
- 					for ( let m = 0; m < 3; m ++ ) {
 
- 						const j = i + m + 1;
 
- 						face[ m ] = ( indexVertex + j ) + ( normals || uvs ? '/' + ( uvs ? ( indexVertexUvs + j ) : '' ) + ( normals ? '/' + ( indexNormals + j ) : '' ) : '' );
 
- 					}
 
- 					// transform the face to export format
 
- 					output += 'f ' + face.join( ' ' ) + '\n';
 
- 				}
 
- 			}
 
- 			// update index
 
- 			indexVertex += nbVertex;
 
- 			indexVertexUvs += nbVertexUvs;
 
- 			indexNormals += nbNormals;
 
- 		}
 
- 		function parseLine( line ) {
 
- 			let nbVertex = 0;
 
- 			const geometry = line.geometry;
 
- 			const type = line.type;
 
- 			if ( geometry.isBufferGeometry !== true ) {
 
- 				throw new Error( 'THREE.OBJExporter: Geometry is not of type THREE.BufferGeometry.' );
 
- 			}
 
- 			// shortcuts
 
- 			const vertices = geometry.getAttribute( 'position' );
 
- 			// name of the line object
 
- 			output += 'o ' + line.name + '\n';
 
- 			if ( vertices !== undefined ) {
 
- 				for ( let i = 0, l = vertices.count; i < l; i ++, nbVertex ++ ) {
 
- 					vertex.x = vertices.getX( i );
 
- 					vertex.y = vertices.getY( i );
 
- 					vertex.z = vertices.getZ( i );
 
- 					// transform the vertex to world space
 
- 					vertex.applyMatrix4( line.matrixWorld );
 
- 					// transform the vertex to export format
 
- 					output += 'v ' + vertex.x + ' ' + vertex.y + ' ' + vertex.z + '\n';
 
- 				}
 
- 			}
 
- 			if ( type === 'Line' ) {
 
- 				output += 'l ';
 
- 				for ( let j = 1, l = vertices.count; j <= l; j ++ ) {
 
- 					output += ( indexVertex + j ) + ' ';
 
- 				}
 
- 				output += '\n';
 
- 			}
 
- 			if ( type === 'LineSegments' ) {
 
- 				for ( let j = 1, k = j + 1, l = vertices.count; j < l; j += 2, k = j + 1 ) {
 
- 					output += 'l ' + ( indexVertex + j ) + ' ' + ( indexVertex + k ) + '\n';
 
- 				}
 
- 			}
 
- 			// update index
 
- 			indexVertex += nbVertex;
 
- 		}
 
- 		function parsePoints( points ) {
 
- 			let nbVertex = 0;
 
- 			const geometry = points.geometry;
 
- 			if ( geometry.isBufferGeometry !== true ) {
 
- 				throw new Error( 'THREE.OBJExporter: Geometry is not of type THREE.BufferGeometry.' );
 
- 			}
 
- 			const vertices = geometry.getAttribute( 'position' );
 
- 			const colors = geometry.getAttribute( 'color' );
 
- 			output += 'o ' + points.name + '\n';
 
- 			if ( vertices !== undefined ) {
 
- 				for ( let i = 0, l = vertices.count; i < l; i ++, nbVertex ++ ) {
 
- 					vertex.fromBufferAttribute( vertices, i );
 
- 					vertex.applyMatrix4( points.matrixWorld );
 
- 					output += 'v ' + vertex.x + ' ' + vertex.y + ' ' + vertex.z;
 
- 					if ( colors !== undefined ) {
 
- 						color.fromBufferAttribute( colors, i );
 
- 						output += ' ' + color.r + ' ' + color.g + ' ' + color.b;
 
- 					}
 
- 					output += '\n';
 
- 				}
 
- 			}
 
- 			output += 'p ';
 
- 			for ( let j = 1, l = vertices.count; j <= l; j ++ ) {
 
- 				output += ( indexVertex + j ) + ' ';
 
- 			}
 
- 			output += '\n';
 
- 			// update index
 
- 			indexVertex += nbVertex;
 
- 		}
 
- 		object.traverse( function ( child ) {
 
- 			if ( child.isMesh === true ) {
 
- 				parseMesh( child );
 
- 			}
 
- 			if ( child.isLine === true ) {
 
- 				parseLine( child );
 
- 			}
 
- 			if ( child.isPoints === true ) {
 
- 				parsePoints( child );
 
- 			}
 
- 		} );
 
- 		return output;
 
- 	}
 
- }
 
- export { OBJExporter };
 
 
  |