Browse Source

Cleaned up STLLoader and example.

Mr.doob 13 years ago
parent
commit
c84b263772
2 changed files with 84 additions and 76 deletions
  1. 62 55
      examples/js/loaders/STLLoader.js
  2. 22 21
      examples/webgl_loader_stl.html

+ 62 - 55
examples/js/loaders/STLLoader.js

@@ -2,28 +2,26 @@
  * @author aleeper / http://adamleeper.com/
  * @author mrdoob / http://mrdoob.com/
  *
- * Description: A THREE loader for STL ASCII files, as created
- *              by Solidworks and other CAD programs.
+ * Description: A THREE loader for STL ASCII files, as created by Solidworks and other CAD programs.
  *
  * Limitations: Currently supports ASCII format only
  *
  * Usage:
- *    var loader = new THREE.STLLoader();
- *    loader.addEventListener( 'load', function ( event ) {
- *        var object = event.content;
- *        // Optionally apply some sort of material...
- *        if(material instanceof THREE.Material){
- *            for ( var i = 0; i < object.children.length; i ++ ) {
- *                object.children[ i ].material = material;
- *            }
- *        }
- *        object.updateMatrix(); // Not sure if this is needed.
- *        stl = object;
- *        init();
- *        animate();
- *    } );
- *    loader.load( './models/stl/slotted_disk.stl' );
+ * 	var loader = new THREE.STLLoader();
+ * 	loader.addEventListener( 'load', function ( event ) {
  *
+ * 		var object = event.content;
+ *
+ * 		for ( var i = 0; i < object.children.length; i ++ ) {
+ *
+ * 			object.children[ i ].material = material;
+ *
+ * 		}
+ *
+ * 		scene.add( object );
+ *
+ * 	} );
+ * 	loader.load( './models/stl/slotted_disk.stl' );
  */
 
 
@@ -35,12 +33,12 @@ THREE.STLLoader = function () {
 
 THREE.STLLoader.prototype = {
 
-  constructor: THREE.STLLoader,
+	constructor: THREE.STLLoader,
 
-  load: function ( url ) {
+	load: function ( url ) {
 
-	  var scope = this;
-	  var xhr = new XMLHttpRequest();
+		var scope = this;
+		var xhr = new XMLHttpRequest();
 
 		xhr.addEventListener( 'load', function ( event ) {
 
@@ -63,49 +61,58 @@ THREE.STLLoader.prototype = {
 		xhr.open( 'GET', url, true );
 		xhr.send( null );
 
-  },
+	},
+
+	parse: function ( data ) {
+
+		function face3( a, b, c, normals ) {
+
+			return new THREE.Face3( a, b, c, normals );
+
+		}
+
+
+		var group = new THREE.Object3D();
+		var geometry = new THREE.Geometry();
+
+		var pattern, result;
+
+		pattern = /facet([\s\S]*?)endfacet/g;
+
+		while ( ( result = pattern.exec( data ) ) != null ) {
+
+			facet_text = facet_result[ 0 ];
+
+			var face_normal = new THREE.Vector3();
+
+			// Normal
+			pattern = /normal[\s]+([-+]?[0-9]+\.?[0-9]*([eE][-+]?[0-9]+)?)+[\s]+([-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?)+[\s]+([-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?)+/g;
+
+			while( ( result = pattern.exec( facet_text ) ) != null ) {
+
+				var normal = new THREE.Vector3( +( result[1]), +( result[3] ), +( result[5] ) );
 
-  parse: function ( data ) {
+			}
 
-    function face3( a, b, c, normals ) {
-      return new THREE.Face3( a, b, c, normals );
-    }
+			// Vertex
+			pattern = /vertex[\s]+([-+]?[0-9]+\.?[0-9]*([eE][-+]?[0-9]+)?)+[\s]+([-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?)+[\s]+([-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?)+/g;
 
+			while( ( result = pattern.exec( facet_text ) ) != null ) {
 
-  	var group = new THREE.Object3D();
-    var geometry = new THREE.Geometry();
+				geometry.vertices.push( new THREE.Vector3(+(result[1]), +(result[3]), +(result[ 5 ] ) ) );
 
-	  var pattern, result;
+			}
 
-    facet_pattern = /facet([\s\S]*?)endfacet/g;
-    while ( ( facet_result = facet_pattern.exec( data ) ) != null ) {
-        facet_text = facet_result[0];
+			var len = geometry.vertices.length;
+			geometry.faces.push( face3( len - 3, len - 2, len - 1, normal ) );
 
-        var face_normal = new THREE.Vector3();
+		}
 
-        // Find the normal info
-        normal_pattern = /normal[\s]+([-+]?[0-9]+\.?[0-9]*([eE][-+]?[0-9]+)?)+[\s]+([-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?)+[\s]+([-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?)+/g;
-        while( (normal_result = normal_pattern.exec(facet_text)) != null )
-        {
-            //console.log(vsprintf("normal: %f %f %f", [+(normal_result[1]), +(normal_result[3]), +(normal_result[5])]));
-            var face_normal = new THREE.Vector3( +(normal_result[1]), +(normal_result[3]), +(normal_result[5]) );
-            //geometry.normals.push(new THREE.Vector3( +(normal_result[1]), +(normal_result[3]), +(normal_result[5])));
-        }
+		geometry.computeCentroids();
+		group.add( new THREE.Mesh( geometry, new THREE.MeshLambertMaterial() ) );
 
-        // Find the vertex info
-        vertex_pattern = /vertex[\s]+([-+]?[0-9]+\.?[0-9]*([eE][-+]?[0-9]+)?)+[\s]+([-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?)+[\s]+([-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?)+/g;
-        while( (vertex_result = vertex_pattern.exec(facet_text)) != null )
-        {
-            //console.log(vsprintf("vertex: %f %f %f", [+(vertex_result[1]), +(vertex_result[3]), +(vertex_result[5])]));
-            geometry.vertices.push(new THREE.Vector3(+(vertex_result[1]), +(vertex_result[3]), +(vertex_result[5])));
-        }
+		return group;
 
-        var len = geometry.vertices.length;
-        geometry.faces.push( face3(len-3, len-2, len-1, face_normal) );
+	}
 
-    }
-    geometry.computeCentroids();
-    group.add( new THREE.Mesh( geometry, new THREE.MeshLambertMaterial() ) );
-	  return group;
-  }
 };

+ 22 - 21
examples/webgl_loader_stl.html

@@ -47,25 +47,8 @@
 
 			var camera, scene, renderer, objects;
 			var particleLight, pointLight;
-			var stl;
-      var material = new THREE.MeshPhongMaterial( { ambient :0xFF0000, color: 0xFF0000, specular: 0xFFFFFF } );
-      
-      var loader = new THREE.STLLoader();
-      loader.addEventListener( 'load', function ( event ) {
-          var object = event.content;
-          if(material instanceof THREE.Material){
-              for ( var i = 0; i < object.children.length; i ++ ) {
-                  object.children[ i ].material = material;
-              }
-          }
-          object.updateMatrix();// Not sure if this is needed.
-          stl = object;
-          init();
-          animate();
-      } );
-      var file_path = './models/stl/slotted_disk.stl';
-      loader.load( file_path );
 
+			init();
 
 			function init() {
 
@@ -97,9 +80,27 @@
 				var line = new THREE.Line( geometry, material, THREE.LinePieces );
 				scene.add( line );
 
-				// Add the STL file
+				var loader = new THREE.STLLoader();
+				loader.addEventListener( 'load', function ( event ) {
+
+					var object = event.content;
+
+					var material = new THREE.MeshPhongMaterial( { ambient: 0xff0000, color: 0xff0000, specular: 0xffffff } );
+					console.log( object );
+
+					for ( var i = 0; i < object.children.length; i ++ ) {
+
+						object.children[ i ].material = material;
+
+					}
+
+					scene.add( object );
+
+					animate();
+
+				} );
+				loader.load( './models/stl/slotted_disk.stl' );
 
-				scene.add( stl );
 
 				particleLight = new THREE.Mesh( new THREE.SphereGeometry( 4, 8, 8 ), new THREE.MeshBasicMaterial( { color: 0xffffff } ) );
 				scene.add( particleLight );
@@ -108,7 +109,7 @@
 
 				scene.add( new THREE.AmbientLight( 0xcccccc ) );
 
-				var directionalLight = new THREE.DirectionalLight(/*Math.random() * 0xffffff*/0xeeeeee );
+				var directionalLight = new THREE.DirectionalLight( 0xeeeeee );
 				directionalLight.position.x = Math.random() - 0.5;
 				directionalLight.position.y = Math.random() - 0.5;
 				directionalLight.position.z = Math.random() - 0.5;