|
@@ -1,6 +1,13 @@
|
|
|
/**
|
|
|
* @author kovacsv / http://kovacsv.hu/
|
|
|
* @author mrdoob / http://mrdoob.com/
|
|
|
+ *
|
|
|
+ * Usage:
|
|
|
+ * var exporter = new THREE.STLExporter();
|
|
|
+ *
|
|
|
+ * // second argument is a list of options
|
|
|
+ * var data = exporter.parse( mesh, { binary: true } );
|
|
|
+ *
|
|
|
*/
|
|
|
|
|
|
THREE.STLExporter = function () {};
|
|
@@ -14,65 +21,141 @@ THREE.STLExporter.prototype = {
|
|
|
var vector = new THREE.Vector3();
|
|
|
var normalMatrixWorld = new THREE.Matrix3();
|
|
|
|
|
|
- return function parse( scene ) {
|
|
|
+ return function parse( scene, options ) {
|
|
|
|
|
|
- var output = '';
|
|
|
+ if ( options === undefined ) options = {};
|
|
|
|
|
|
- output += 'solid exported\n';
|
|
|
+ var binary = options.binary !== undefined ? options.binary : false;
|
|
|
+
|
|
|
+ //
|
|
|
+
|
|
|
+ var objects = [];
|
|
|
+ var triangles = 0;
|
|
|
|
|
|
scene.traverse( function ( object ) {
|
|
|
|
|
|
- if ( object instanceof THREE.Mesh ) {
|
|
|
+ if ( object.isMesh ) {
|
|
|
|
|
|
var geometry = object.geometry;
|
|
|
- var matrixWorld = object.matrixWorld;
|
|
|
|
|
|
- if ( geometry instanceof THREE.BufferGeometry ) {
|
|
|
+ if ( geometry.isBufferGeometry ) {
|
|
|
|
|
|
geometry = new THREE.Geometry().fromBufferGeometry( geometry );
|
|
|
|
|
|
}
|
|
|
|
|
|
- if ( geometry instanceof THREE.Geometry ) {
|
|
|
+ if ( geometry.isGeometry ) {
|
|
|
|
|
|
- var vertices = geometry.vertices;
|
|
|
- var faces = geometry.faces;
|
|
|
+ triangles += geometry.faces.length;
|
|
|
|
|
|
- normalMatrixWorld.getNormalMatrix( matrixWorld );
|
|
|
+ objects.push( {
|
|
|
|
|
|
- for ( var i = 0, l = faces.length; i < l; i ++ ) {
|
|
|
+ geometry: geometry,
|
|
|
+ matrixWorld: object.matrixWorld
|
|
|
|
|
|
- var face = faces[ i ];
|
|
|
+ } );
|
|
|
|
|
|
- vector.copy( face.normal ).applyMatrix3( normalMatrixWorld ).normalize();
|
|
|
+ }
|
|
|
|
|
|
- output += '\tfacet normal ' + vector.x + ' ' + vector.y + ' ' + vector.z + '\n';
|
|
|
- output += '\t\touter loop\n';
|
|
|
+ }
|
|
|
|
|
|
- var indices = [ face.a, face.b, face.c ];
|
|
|
+ } );
|
|
|
|
|
|
- for ( var j = 0; j < 3; j ++ ) {
|
|
|
+ if ( binary ) {
|
|
|
+
|
|
|
+ var offset = 80; // skip header
|
|
|
+ var bufferLength = triangles * 2 + triangles * 3 * 4 * 4 + 80 + 4;
|
|
|
+ var arrayBuffer = new ArrayBuffer( bufferLength );
|
|
|
+ var output = new DataView( arrayBuffer );
|
|
|
+ output.setUint32( offset, triangles, true ); offset += 4;
|
|
|
+
|
|
|
+ for ( var i = 0, il = objects.length; i < il; i ++ ) {
|
|
|
+
|
|
|
+ var object = objects[ i ];
|
|
|
+
|
|
|
+ var vertices = object.geometry.vertices;
|
|
|
+ var faces = object.geometry.faces;
|
|
|
+ var matrixWorld = object.matrixWorld;
|
|
|
|
|
|
- vector.copy( vertices[ indices[ j ] ] ).applyMatrix4( matrixWorld );
|
|
|
+ normalMatrixWorld.getNormalMatrix( matrixWorld );
|
|
|
|
|
|
- output += '\t\t\tvertex ' + vector.x + ' ' + vector.y + ' ' + vector.z + '\n';
|
|
|
+ for ( var j = 0, jl = faces.length; j < jl; j ++ ) {
|
|
|
|
|
|
- }
|
|
|
+ var face = faces[ j ];
|
|
|
|
|
|
- output += '\t\tendloop\n';
|
|
|
- output += '\tendfacet\n';
|
|
|
+ vector.copy( face.normal ).applyMatrix3( normalMatrixWorld ).normalize();
|
|
|
+
|
|
|
+ output.setFloat32( offset, vector.x, true ); offset += 4; // normal
|
|
|
+ output.setFloat32( offset, vector.y, true ); offset += 4;
|
|
|
+ output.setFloat32( offset, vector.z, true ); offset += 4;
|
|
|
+
|
|
|
+ var indices = [ face.a, face.b, face.c ];
|
|
|
+
|
|
|
+ for ( var k = 0; k < 3; k ++ ) {
|
|
|
+
|
|
|
+ vector.copy( vertices[ indices[ k ] ] ).applyMatrix4( matrixWorld );
|
|
|
+
|
|
|
+ output.setFloat32( offset, vector.x, true ); offset += 4; // vertices
|
|
|
+ output.setFloat32( offset, vector.y, true ); offset += 4;
|
|
|
+ output.setFloat32( offset, vector.z, true ); offset += 4;
|
|
|
|
|
|
}
|
|
|
|
|
|
+ output.setUint16( offset, 0, true ); offset += 2; // attribute byte count
|
|
|
+
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
- } );
|
|
|
+ return output;
|
|
|
+
|
|
|
+ } else {
|
|
|
+
|
|
|
+ var output = '';
|
|
|
+
|
|
|
+ output += 'solid exported\n';
|
|
|
+
|
|
|
+ for ( var i = 0, il = objects.length; i < il; i ++ ) {
|
|
|
+
|
|
|
+ var object = objects[ i ];
|
|
|
+
|
|
|
+ var vertices = object.geometry.vertices;
|
|
|
+ var faces = object.geometry.faces;
|
|
|
+ var matrixWorld = object.matrixWorld;
|
|
|
+
|
|
|
+ normalMatrixWorld.getNormalMatrix( matrixWorld );
|
|
|
+
|
|
|
+ for ( var j = 0, jl = faces.length; j < jl; j ++ ) {
|
|
|
+
|
|
|
+ var face = faces[ j ];
|
|
|
+
|
|
|
+ vector.copy( face.normal ).applyMatrix3( normalMatrixWorld ).normalize();
|
|
|
+
|
|
|
+ output += '\tfacet normal ' + vector.x + ' ' + vector.y + ' ' + vector.z + '\n';
|
|
|
+ output += '\t\touter loop\n';
|
|
|
+
|
|
|
+ var indices = [ face.a, face.b, face.c ];
|
|
|
+
|
|
|
+ for ( var k = 0; k < 3; k ++ ) {
|
|
|
+
|
|
|
+ vector.copy( vertices[ indices[ k ] ] ).applyMatrix4( matrixWorld );
|
|
|
+
|
|
|
+ output += '\t\t\tvertex ' + vector.x + ' ' + vector.y + ' ' + vector.z + '\n';
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ output += '\t\tendloop\n';
|
|
|
+ output += '\tendfacet\n';
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ output += 'endsolid exported\n';
|
|
|
|
|
|
- output += 'endsolid exported\n';
|
|
|
+ return output;
|
|
|
|
|
|
- return output;
|
|
|
+ }
|
|
|
|
|
|
};
|
|
|
|