Browse Source

Added Bezel support

zz85 14 years ago
parent
commit
1e95d917dc
1 changed files with 182 additions and 22 deletions
  1. 182 22
      src/extras/geometries/Text.js

+ 182 - 22
src/extras/geometries/Text.js

@@ -52,6 +52,9 @@ THREE.Text.prototype.set = function ( text, parameters ) {
 	var font = parameters.font !== undefined ? parameters.font : "helvetiker";
 	var weight = parameters.weight !== undefined ? parameters.weight : "normal";
 	var style = parameters.style !== undefined ? parameters.style : "normal";
+	var bezelThickness = 10;
+	var bezelSize = 8;
+	var needsChezel = true;
 	
 	THREE.FontUtils.size = size;
     THREE.FontUtils.divisions = curveSegments;
@@ -59,6 +62,7 @@ THREE.Text.prototype.set = function ( text, parameters ) {
 	THREE.FontUtils.face = font;
 	THREE.FontUtils.weight = weight;
 	THREE.FontUtils.style = style;
+	THREE.FontUtils.bezelSize = bezelSize;
 
     // Get a Font data json object
 
@@ -69,6 +73,7 @@ THREE.Text.prototype.set = function ( text, parameters ) {
     var vertices = data.points;
     var faces = data.faces;
     var contour = data.contour;
+	var bezelPoints = data.bezel;
     
     var scope = this;
 
@@ -79,23 +84,44 @@ THREE.Text.prototype.set = function ( text, parameters ) {
 	
     var i, 
 		vert, vlen = vertices.length, 
-		face, flen = faces.length;
+		face, flen = faces.length,
+		bezelPt, blen = bezelPoints.length;
 
+	// Back facing Vertices	
     for ( i = 0; i < vlen; i++ ) {
 
         vert = vertices[ i ];
         v( vert.x, vert.y, 0 );
 
     }
-    
+
+    // Front faces Vertices
     for ( i = 0; i < vlen; i++ ) {
         
 		vert = vertices[ i ];
         v( vert.x, vert.y, height );
 
     }
+
+	if (needsChezel) {
+		
+		for ( i = 0; i < blen; i++ ) {
+
+	        bezelPt = bezelPoints[ i ];
+	        v( bezelPt.x, bezelPt.y, bezelThickness );
+
+	    }
+	
+		for ( i = 0; i < blen; i++ ) {
+
+	        bezelPt = bezelPoints[ i ];
+	        v( bezelPt.x, bezelPt.y, height - bezelThickness );
+
+	    }
 	
 	
+	}
+	
 	// Bottom faces
 
     for ( i = 0; i < flen; i++ ) {
@@ -113,41 +139,90 @@ THREE.Text.prototype.set = function ( text, parameters ) {
         f3( face[ 0 ] + vlen, face[ 1 ] + vlen, face[ 2 ] + vlen );
 
     }
-    
-	
-    i = contour.length;
-    
+
     var lastV;
-    var j, k;
+    var j, k, l, m;
 
-    while ( --i > 0 ) {
+	if (needsChezel) {
+		
+		i = bezelPoints.length;
 
-        if ( !lastV ) {
+	    while ( --i > 0 ) {
 
-            lastV = contour[ i ];
+	        if ( !lastV ) {
 
-        } else if ( lastV.equals( contour[ i ] ) ) {
+	            lastV = contour[ i ];
 
-            lastV = null;
-            continue;
+	        } else if ( lastV.equals( contour[ i ] ) ) {
+			
+				// We reached the last point of a closed loop
+	            lastV = null;
+	            continue;
 
-        }
+	        }
+        
+			l = vlen*2 + i;
+			m = vlen*2 + i - 1;
+        
+			// Create faces for the z-sides of the text
+	        f4( l, m, m+blen, l+blen );
+	
+			for ( j = 0; j < vlen; j++ ) {
+
+	            if ( vertices[ j ].equals( contour[ i ] ) ) break;
+
+	        }
         
-        for ( j = 0; j < vlen; j++ ) {
+	        for ( k = 0; k < vlen; k++ ) {
 
-            if ( vertices[ j ].equals( contour[ i ] ) ) break;
+	            if ( vertices[ k ].equals( contour[ i - 1 ] ) ) break;
 
-        }
+	        }
         
-        for ( k = 0; k < vlen; k++ ) {
+			// Create faces for the z-sides of the text
+	        f4( j, k, m, l );
+			f4( l + blen, m + blen, k+vlen, j+vlen );
+			
+	
+        
+	    }
+		
+		
+	} else {
 
-            if ( vertices[ k ].equals( contour[ i - 1 ] ) ) break;
+		i = contour.length;
 
-        }
+	    while ( --i > 0 ) {
+
+	        if ( !lastV ) {
+
+	            lastV = contour[ i ];
+
+	        } else if ( lastV.equals( contour[ i ] ) ) {
+			
+				// We reached the last point of a closed loop
+	            lastV = null;
+	            continue;
+
+	        }
         
-        f4( j, k, k+vlen, j+vlen );
+	        for ( j = 0; j < vlen; j++ ) {
+
+	            if ( vertices[ j ].equals( contour[ i ] ) ) break;
+
+	        }
         
-    }
+	        for ( k = 0; k < vlen; k++ ) {
+
+	            if ( vertices[ k ].equals( contour[ i - 1 ] ) ) break;
+
+	        }
+        
+			// Create faces for the z-sides of the text
+	        f4( j, k, k+vlen, j+vlen );
+        
+	    }
+	}
 
     
     // UVs to be added
@@ -582,6 +657,91 @@ THREE.FontUtils = {
 	    var extract = this.extractPoints( pts, characterpts );
     
 	    extract.contour = pts;
+	
+		//this.bezelSize;
+		var bezelPoints = [];
+		
+		
+		
+		var centroids = [], forCentroids = [], expandOutwards = [], sum = new THREE.Vector2(), lastV;
+		
+		i = pts.length;
+
+	    while ( --i >= 0 ) {
+	        if ( !lastV ) {
+
+	            lastV = pts[ i ];
+
+	        } else if ( lastV.equals( pts[ i ] ) ) {
+			
+				// We reached the last point of a closed loop
+	            lastV = null;
+				var bool = this.Triangulate.area(forCentroids) > 0;
+				expandOutwards.push(bool);
+				centroids.push(sum.divideScalar(forCentroids.length));
+				forCentroids = [];
+				
+				sum = new THREE.Vector2();
+	            continue;
+
+	        }
+			
+			sum.addSelf(pts[i]);
+			forCentroids.push(pts[i]);
+			
+	    }
+	
+		
+		i = pts.length;
+		p = 0;
+		var pt, centroid ;
+		var dirV, adj;
+	    while ( --i >= 0 ) {
+			pt = pts[ i ];
+			centroid = centroids[p];
+			
+			
+			
+			dirV = pt.clone().subSelf(centroid);
+			adj = this.bezelSize / dirV.length();
+			
+			if (expandOutwards[p]) {
+				adj += 1;
+			}  else {
+				adj = 1 - adj;
+			}
+			
+			adj = dirV.multiplyScalar(adj).addSelf(centroid);
+			bezelPoints.unshift(adj);
+			
+			
+	        if ( !lastV ) {
+
+	            lastV = pts[ i ];
+
+	        } else if ( lastV.equals( pts[ i ] ) ) {
+			
+				// We reached the last point of a closed loop
+	            lastV = null;
+				p++;
+	            continue;
+
+	        }
+
+			
+	    }
+	
+	
+		/*
+		for ( p = 0; p < pts.length; p++ ) {
+			pt = pts[ p ];
+	        bezelPoints.push (new THREE.Vector2(pt.x + this.bezelSize, pt.y + this.bezelSize));
+
+	    }*/
+	
+	
+		extract.bezel = bezelPoints;
+	
 	    return extract;
     
 	},