Browse Source

GeometryUtils.explode to ExplodeModifier and GeometryUtils.tessellate to TessellateModifier.

Mr.doob 12 years ago
parent
commit
cf1366af12

+ 69 - 0
examples/js/modifiers/ExplodeModifier.js

@@ -0,0 +1,69 @@
+/**
+ * Make all faces use unique vertices
+ * so that each face can be separated from others
+ *
+ * @author alteredq / http://alteredqualia.com/
+ */
+
+THREE.ExplodeModifier = function () {
+
+};
+
+THREE.ExplodeModifier.prototype.modify = function ( geometry ) {
+
+	var vertices = [];
+
+	for ( var i = 0, il = geometry.faces.length; i < il; i ++ ) {
+
+		var n = vertices.length;
+
+		var face = geometry.faces[ i ];
+
+		if ( face instanceof THREE.Face4 ) {
+
+			var a = face.a;
+			var b = face.b;
+			var c = face.c;
+			var d = face.d;
+
+			var va = geometry.vertices[ a ];
+			var vb = geometry.vertices[ b ];
+			var vc = geometry.vertices[ c ];
+			var vd = geometry.vertices[ d ];
+
+			vertices.push( va.clone() );
+			vertices.push( vb.clone() );
+			vertices.push( vc.clone() );
+			vertices.push( vd.clone() );
+
+			face.a = n;
+			face.b = n + 1;
+			face.c = n + 2;
+			face.d = n + 3;
+
+		} else {
+
+			var a = face.a;
+			var b = face.b;
+			var c = face.c;
+
+			var va = geometry.vertices[ a ];
+			var vb = geometry.vertices[ b ];
+			var vc = geometry.vertices[ c ];
+
+			vertices.push( va.clone() );
+			vertices.push( vb.clone() );
+			vertices.push( vc.clone() );
+
+			face.a = n;
+			face.b = n + 1;
+			face.c = n + 2;
+
+		}
+
+	}
+
+	geometry.vertices = vertices;
+	delete geometry.__tmpVertices;
+
+}

+ 1 - 1
examples/js/modifiers/SubdivisionModifier.js

@@ -27,7 +27,7 @@
  */
  */
 
 
 
 
-THREE.SubdivisionModifier = function( subdivisions ) {
+THREE.SubdivisionModifier = function ( subdivisions ) {
 
 
 	this.subdivisions = (subdivisions === undefined ) ? 1 : subdivisions;
 	this.subdivisions = (subdivisions === undefined ) ? 1 : subdivisions;
 
 

+ 441 - 0
examples/js/modifiers/TessellateModifier.js

@@ -0,0 +1,441 @@
+/**
+ * Break faces with edges longer than maxEdgeLength
+ * - not recursive
+ *
+ * @author alteredq / http://alteredqualia.com/
+ */
+
+THREE.TessellateModifier = function ( maxEdgeLength ) {
+
+	this.maxEdgeLength = maxEdgeLength;
+
+};
+
+THREE.TessellateModifier.prototype.modify = function ( geometry ) {
+
+	var i, il, face,
+	a, b, c, d,
+	va, vb, vc, vd,
+	dab, dbc, dac, dcd, dad,
+	m, m1, m2,
+	vm, vm1, vm2,
+	vnm, vnm1, vnm2,
+	vcm, vcm1, vcm2,
+	triA, triB,
+	quadA, quadB,
+	edge;
+
+	var faces = [];
+	var faceVertexUvs = [];
+	var maxEdgeLength = this.maxEdgeLength;
+
+	for ( i = 0, il = geometry.faceVertexUvs.length; i < il; i ++ ) {
+
+		faceVertexUvs[ i ] = [];
+
+	}
+
+	for ( i = 0, il = geometry.faces.length; i < il; i ++ ) {
+
+		face = geometry.faces[ i ];
+
+		if ( face instanceof THREE.Face3 ) {
+
+			a = face.a;
+			b = face.b;
+			c = face.c;
+
+			va = geometry.vertices[ a ];
+			vb = geometry.vertices[ b ];
+			vc = geometry.vertices[ c ];
+
+			dab = va.distanceTo( vb );
+			dbc = vb.distanceTo( vc );
+			dac = va.distanceTo( vc );
+
+			if ( dab > maxEdgeLength || dbc > maxEdgeLength || dac > maxEdgeLength ) {
+
+				m = geometry.vertices.length;
+
+				triA = face.clone();
+				triB = face.clone();
+
+				if ( dab >= dbc && dab >= dac ) {
+
+					vm = va.clone();
+					vm.lerp( vb, 0.5 );
+
+					triA.a = a;
+					triA.b = m;
+					triA.c = c;
+
+					triB.a = m;
+					triB.b = b;
+					triB.c = c;
+
+					if ( face.vertexNormals.length === 3 ) {
+
+						vnm = face.vertexNormals[ 0 ].clone();
+						vnm.lerp( face.vertexNormals[ 1 ], 0.5 );
+
+						triA.vertexNormals[ 1 ].copy( vnm );
+						triB.vertexNormals[ 0 ].copy( vnm );
+
+					}
+
+					if ( face.vertexColors.length === 3 ) {
+
+						vcm = face.vertexColors[ 0 ].clone();
+						vcm.lerp( face.vertexColors[ 1 ], 0.5 );
+
+						triA.vertexColors[ 1 ].copy( vcm );
+						triB.vertexColors[ 0 ].copy( vcm );
+
+					}
+
+					edge = 0;
+
+				} else if ( dbc >= dab && dbc >= dac ) {
+
+					vm = vb.clone();
+					vm.lerp( vc, 0.5 );
+
+					triA.a = a;
+					triA.b = b;
+					triA.c = m;
+
+					triB.a = m;
+					triB.b = c;
+					triB.c = a;
+
+					if ( face.vertexNormals.length === 3 ) {
+
+						vnm = face.vertexNormals[ 1 ].clone();
+						vnm.lerp( face.vertexNormals[ 2 ], 0.5 );
+
+						triA.vertexNormals[ 2 ].copy( vnm );
+
+						triB.vertexNormals[ 0 ].copy( vnm );
+						triB.vertexNormals[ 1 ].copy( face.vertexNormals[ 2 ] );
+						triB.vertexNormals[ 2 ].copy( face.vertexNormals[ 0 ] );
+
+					}
+
+					if ( face.vertexColors.length === 3 ) {
+
+						vcm = face.vertexColors[ 1 ].clone();
+						vcm.lerp( face.vertexColors[ 2 ], 0.5 );
+
+						triA.vertexColors[ 2 ].copy( vcm );
+
+						triB.vertexColors[ 0 ].copy( vcm );
+						triB.vertexColors[ 1 ].copy( face.vertexColors[ 2 ] );
+						triB.vertexColors[ 2 ].copy( face.vertexColors[ 0 ] );
+
+					}
+
+					edge = 1;
+
+				} else {
+
+					vm = va.clone();
+					vm.lerp( vc, 0.5 );
+
+					triA.a = a;
+					triA.b = b;
+					triA.c = m;
+
+					triB.a = m;
+					triB.b = b;
+					triB.c = c;
+
+					if ( face.vertexNormals.length === 3 ) {
+
+						vnm = face.vertexNormals[ 0 ].clone();
+						vnm.lerp( face.vertexNormals[ 2 ], 0.5 );
+
+						triA.vertexNormals[ 2 ].copy( vnm );
+						triB.vertexNormals[ 0 ].copy( vnm );
+
+					}
+
+					if ( face.vertexColors.length === 3 ) {
+
+						vcm = face.vertexColors[ 0 ].clone();
+						vcm.lerp( face.vertexColors[ 2 ], 0.5 );
+
+						triA.vertexColors[ 2 ].copy( vcm );
+						triB.vertexColors[ 0 ].copy( vcm );
+
+					}
+
+					edge = 2;
+
+				}
+
+				faces.push( triA, triB );
+				geometry.vertices.push( vm );
+
+				var j, jl, uvs, uvA, uvB, uvC, uvM, uvsTriA, uvsTriB;
+
+				for ( j = 0, jl = geometry.faceVertexUvs.length; j < jl; j ++ ) {
+
+					if ( geometry.faceVertexUvs[ j ].length ) {
+
+						uvs = geometry.faceVertexUvs[ j ][ i ];
+
+						uvA = uvs[ 0 ];
+						uvB = uvs[ 1 ];
+						uvC = uvs[ 2 ];
+
+						// AB
+
+						if ( edge === 0 ) {
+
+							uvM = uvA.clone();
+							uvM.lerp( uvB, 0.5 );
+
+							uvsTriA = [ uvA.clone(), uvM.clone(), uvC.clone() ];
+							uvsTriB = [ uvM.clone(), uvB.clone(), uvC.clone() ];
+
+						// BC
+
+						} else if ( edge === 1 ) {
+
+							uvM = uvB.clone();
+							uvM.lerp( uvC, 0.5 );
+
+							uvsTriA = [ uvA.clone(), uvB.clone(), uvM.clone() ];
+							uvsTriB = [ uvM.clone(), uvC.clone(), uvA.clone() ];
+
+						// AC
+
+						} else {
+
+							uvM = uvA.clone();
+							uvM.lerp( uvC, 0.5 );
+
+							uvsTriA = [ uvA.clone(), uvB.clone(), uvM.clone() ];
+							uvsTriB = [ uvM.clone(), uvB.clone(), uvC.clone() ];
+
+						}
+
+						faceVertexUvs[ j ].push( uvsTriA, uvsTriB );
+
+					}
+
+				}
+
+			} else {
+
+				faces.push( face );
+
+				for ( j = 0, jl = geometry.faceVertexUvs.length; j < jl; j ++ ) {
+
+					faceVertexUvs[ j ].push( geometry.faceVertexUvs[ j ][ i ] );
+
+				}
+
+			}
+
+		} else {
+
+			a = face.a;
+			b = face.b;
+			c = face.c;
+			d = face.d;
+
+			va = geometry.vertices[ a ];
+			vb = geometry.vertices[ b ];
+			vc = geometry.vertices[ c ];
+			vd = geometry.vertices[ d ];
+
+			dab = va.distanceTo( vb );
+			dbc = vb.distanceTo( vc );
+			dcd = vc.distanceTo( vd );
+			dad = va.distanceTo( vd );
+
+			if ( dab > maxEdgeLength || dbc > maxEdgeLength || dcd > maxEdgeLength || dad > maxEdgeLength ) {
+
+				m1 = geometry.vertices.length;
+				m2 = geometry.vertices.length + 1;
+
+				quadA = face.clone();
+				quadB = face.clone();
+
+				if ( ( dab >= dbc && dab >= dcd && dab >= dad ) || ( dcd >= dbc && dcd >= dab && dcd >= dad ) ) {
+
+					vm1 = va.clone();
+					vm1.lerp( vb, 0.5 );
+
+					vm2 = vc.clone();
+					vm2.lerp( vd, 0.5 );
+
+					quadA.a = a;
+					quadA.b = m1;
+					quadA.c = m2;
+					quadA.d = d;
+
+					quadB.a = m1;
+					quadB.b = b;
+					quadB.c = c;
+					quadB.d = m2;
+
+					if ( face.vertexNormals.length === 4 ) {
+
+						vnm1 = face.vertexNormals[ 0 ].clone();
+						vnm1.lerp( face.vertexNormals[ 1 ], 0.5 );
+
+						vnm2 = face.vertexNormals[ 2 ].clone();
+						vnm2.lerp( face.vertexNormals[ 3 ], 0.5 );
+
+						quadA.vertexNormals[ 1 ].copy( vnm1 );
+						quadA.vertexNormals[ 2 ].copy( vnm2 );
+
+						quadB.vertexNormals[ 0 ].copy( vnm1 );
+						quadB.vertexNormals[ 3 ].copy( vnm2 );
+
+					}
+
+					if ( face.vertexColors.length === 4 ) {
+
+						vcm1 = face.vertexColors[ 0 ].clone();
+						vcm1.lerp( face.vertexColors[ 1 ], 0.5 );
+
+						vcm2 = face.vertexColors[ 2 ].clone();
+						vcm2.lerp( face.vertexColors[ 3 ], 0.5 );
+
+						quadA.vertexColors[ 1 ].copy( vcm1 );
+						quadA.vertexColors[ 2 ].copy( vcm2 );
+
+						quadB.vertexColors[ 0 ].copy( vcm1 );
+						quadB.vertexColors[ 3 ].copy( vcm2 );
+
+					}
+
+					edge = 0;
+
+				} else {
+
+					vm1 = vb.clone();
+					vm1.lerp( vc, 0.5 );
+
+					vm2 = vd.clone();
+					vm2.lerp( va, 0.5 );
+
+					quadA.a = a;
+					quadA.b = b;
+					quadA.c = m1;
+					quadA.d = m2;
+
+					quadB.a = m2;
+					quadB.b = m1;
+					quadB.c = c;
+					quadB.d = d;
+
+					if ( face.vertexNormals.length === 4 ) {
+
+						vnm1 = face.vertexNormals[ 1 ].clone();
+						vnm1.lerp( face.vertexNormals[ 2 ], 0.5 );
+
+						vnm2 = face.vertexNormals[ 3 ].clone();
+						vnm2.lerp( face.vertexNormals[ 0 ], 0.5 );
+
+						quadA.vertexNormals[ 2 ].copy( vnm1 );
+						quadA.vertexNormals[ 3 ].copy( vnm2 );
+
+						quadB.vertexNormals[ 0 ].copy( vnm2 );
+						quadB.vertexNormals[ 1 ].copy( vnm1 );
+
+					}
+
+					if ( face.vertexColors.length === 4 ) {
+
+						vcm1 = face.vertexColors[ 1 ].clone();
+						vcm1.lerp( face.vertexColors[ 2 ], 0.5 );
+
+						vcm2 = face.vertexColors[ 3 ].clone();
+						vcm2.lerp( face.vertexColors[ 0 ], 0.5 );
+
+						quadA.vertexColors[ 2 ].copy( vcm1 );
+						quadA.vertexColors[ 3 ].copy( vcm2 );
+
+						quadB.vertexColors[ 0 ].copy( vcm2 );
+						quadB.vertexColors[ 1 ].copy( vcm1 );
+
+					}
+
+					edge = 1;
+
+				}
+
+				faces.push( quadA, quadB );
+				geometry.vertices.push( vm1, vm2 );
+
+				var j, jl, uvs, uvA, uvB, uvC, uvD, uvM1, uvM2, uvsQuadA, uvsQuadB;
+
+				for ( j = 0, jl = geometry.faceVertexUvs.length; j < jl; j ++ ) {
+
+					if ( geometry.faceVertexUvs[ j ].length ) {
+
+						uvs = geometry.faceVertexUvs[ j ][ i ];
+
+						uvA = uvs[ 0 ];
+						uvB = uvs[ 1 ];
+						uvC = uvs[ 2 ];
+						uvD = uvs[ 3 ];
+
+						// AB + CD
+
+						if ( edge === 0 ) {
+
+							uvM1 = uvA.clone();
+							uvM1.lerp( uvB, 0.5 );
+
+							uvM2 = uvC.clone();
+							uvM2.lerp( uvD, 0.5 );
+
+							uvsQuadA = [ uvA.clone(), uvM1.clone(), uvM2.clone(), uvD.clone() ];
+							uvsQuadB = [ uvM1.clone(), uvB.clone(), uvC.clone(), uvM2.clone() ];
+
+						// BC + AD
+
+						} else {
+
+							uvM1 = uvB.clone();
+							uvM1.lerp( uvC, 0.5 );
+
+							uvM2 = uvD.clone();
+							uvM2.lerp( uvA, 0.5 );
+
+							uvsQuadA = [ uvA.clone(), uvB.clone(), uvM1.clone(), uvM2.clone() ];
+							uvsQuadB = [ uvM2.clone(), uvM1.clone(), uvC.clone(), uvD.clone() ];
+
+						}
+
+						faceVertexUvs[ j ].push( uvsQuadA, uvsQuadB );
+
+					}
+
+				}
+
+			} else {
+
+				faces.push( face );
+
+				for ( j = 0, jl = geometry.faceVertexUvs.length; j < jl; j ++ ) {
+
+					faceVertexUvs[ j ].push( geometry.faceVertexUvs[ j ][ i ] );
+
+				}
+
+			}
+
+		}
+
+	}
+
+	geometry.faces = faces;
+	geometry.faceVertexUvs = faceVertexUvs;
+
+}

+ 12 - 3
examples/webgl_geometry_tessellation.html

@@ -41,6 +41,9 @@
 
 
 		<script src="js/controls/TrackballControls.js"></script>
 		<script src="js/controls/TrackballControls.js"></script>
 
 
+		<script src="js/modifiers/ExplodeModifier.js"></script>
+		<script src="js/modifiers/TessellateModifier.js"></script>
+
 		<script src="js/Detector.js"></script>
 		<script src="js/Detector.js"></script>
 		<script src="js/libs/stats.min.js"></script>
 		<script src="js/libs/stats.min.js"></script>
 
 
@@ -160,10 +163,16 @@
 
 
 			THREE.GeometryUtils.center( geometry );
 			THREE.GeometryUtils.center( geometry );
 
 
-			var i, n = 6, maxEdgeLength = 4;
-			for ( i = 0; i < n; i ++ ) THREE.GeometryUtils.tessellate( geometry, maxEdgeLength );
+			var tessellateModifier = new THREE.TessellateModifier( 4 );
+
+			for ( var i = 0; i < 6; i ++ ) {
+
+				tessellateModifier.modify( geometry );
+
+			}
 
 
-			THREE.GeometryUtils.explode( geometry );
+			var explodeModifier = new THREE.ExplodeModifier();
+			explodeModifier.modify( geometry );
 
 
 			var vertices = geometry.vertices;
 			var vertices = geometry.vertices;
 
 

+ 4 - 497
src/extras/GeometryUtils.js

@@ -555,511 +555,18 @@ THREE.GeometryUtils = {
 
 
 	},
 	},
 
 
-	// Make all faces use unique vertices
-	// so that each face can be separated from others
-
-	explode: function( geometry ) {
-
-		var vertices = [];
-
-		for ( var i = 0, il = geometry.faces.length; i < il; i ++ ) {
-
-			var n = vertices.length;
-
-			var face = geometry.faces[ i ];
-
-			if ( face instanceof THREE.Face4 ) {
-
-				var a = face.a;
-				var b = face.b;
-				var c = face.c;
-				var d = face.d;
-
-				var va = geometry.vertices[ a ];
-				var vb = geometry.vertices[ b ];
-				var vc = geometry.vertices[ c ];
-				var vd = geometry.vertices[ d ];
-
-				vertices.push( va.clone() );
-				vertices.push( vb.clone() );
-				vertices.push( vc.clone() );
-				vertices.push( vd.clone() );
-
-				face.a = n;
-				face.b = n + 1;
-				face.c = n + 2;
-				face.d = n + 3;
-
-			} else {
-
-				var a = face.a;
-				var b = face.b;
-				var c = face.c;
-
-				var va = geometry.vertices[ a ];
-				var vb = geometry.vertices[ b ];
-				var vc = geometry.vertices[ c ];
-
-				vertices.push( va.clone() );
-				vertices.push( vb.clone() );
-				vertices.push( vc.clone() );
-
-				face.a = n;
-				face.b = n + 1;
-				face.c = n + 2;
-
-			}
-
-		}
-
-		geometry.vertices = vertices;
-		delete geometry.__tmpVertices;
-
-	},
-
-	// Break faces with edges longer than maxEdgeLength
-	// - not recursive
-
-	tessellate: function ( geometry, maxEdgeLength ) {
-
-		var i, il, face,
-		a, b, c, d,
-		va, vb, vc, vd,
-		dab, dbc, dac, dcd, dad,
-		m, m1, m2,
-		vm, vm1, vm2,
-		vnm, vnm1, vnm2,
-		vcm, vcm1, vcm2,
-		triA, triB,
-		quadA, quadB,
-		edge;
-
-		var faces = [];
-		var faceVertexUvs = [];
-
-		for ( i = 0, il = geometry.faceVertexUvs.length; i < il; i ++ ) {
-
-			faceVertexUvs[ i ] = [];
-
-		}
-
-		for ( i = 0, il = geometry.faces.length; i < il; i ++ ) {
-
-			face = geometry.faces[ i ];
-
-			if ( face instanceof THREE.Face3 ) {
-
-				a = face.a;
-				b = face.b;
-				c = face.c;
-
-				va = geometry.vertices[ a ];
-				vb = geometry.vertices[ b ];
-				vc = geometry.vertices[ c ];
-
-				dab = va.distanceTo( vb );
-				dbc = vb.distanceTo( vc );
-				dac = va.distanceTo( vc );
-
-				if ( dab > maxEdgeLength || dbc > maxEdgeLength || dac > maxEdgeLength ) {
-
-					m = geometry.vertices.length;
-
-					triA = face.clone();
-					triB = face.clone();
-
-					if ( dab >= dbc && dab >= dac ) {
-
-						vm = va.clone();
-						vm.lerp( vb, 0.5 );
-
-						triA.a = a;
-						triA.b = m;
-						triA.c = c;
-
-						triB.a = m;
-						triB.b = b;
-						triB.c = c;
-
-						if ( face.vertexNormals.length === 3 ) {
-
-							vnm = face.vertexNormals[ 0 ].clone();
-							vnm.lerp( face.vertexNormals[ 1 ], 0.5 );
-
-							triA.vertexNormals[ 1 ].copy( vnm );
-							triB.vertexNormals[ 0 ].copy( vnm );
-
-						}
-
-						if ( face.vertexColors.length === 3 ) {
-
-							vcm = face.vertexColors[ 0 ].clone();
-							vcm.lerp( face.vertexColors[ 1 ], 0.5 );
-
-							triA.vertexColors[ 1 ].copy( vcm );
-							triB.vertexColors[ 0 ].copy( vcm );
-
-						}
-
-						edge = 0;
-
-					} else if ( dbc >= dab && dbc >= dac ) {
-
-						vm = vb.clone();
-						vm.lerp( vc, 0.5 );
-
-						triA.a = a;
-						triA.b = b;
-						triA.c = m;
-
-						triB.a = m;
-						triB.b = c;
-						triB.c = a;
-
-						if ( face.vertexNormals.length === 3 ) {
-
-							vnm = face.vertexNormals[ 1 ].clone();
-							vnm.lerp( face.vertexNormals[ 2 ], 0.5 );
-
-							triA.vertexNormals[ 2 ].copy( vnm );
-
-							triB.vertexNormals[ 0 ].copy( vnm );
-							triB.vertexNormals[ 1 ].copy( face.vertexNormals[ 2 ] );
-							triB.vertexNormals[ 2 ].copy( face.vertexNormals[ 0 ] );
-
-						}
-
-						if ( face.vertexColors.length === 3 ) {
-
-							vcm = face.vertexColors[ 1 ].clone();
-							vcm.lerp( face.vertexColors[ 2 ], 0.5 );
-
-							triA.vertexColors[ 2 ].copy( vcm );
-
-							triB.vertexColors[ 0 ].copy( vcm );
-							triB.vertexColors[ 1 ].copy( face.vertexColors[ 2 ] );
-							triB.vertexColors[ 2 ].copy( face.vertexColors[ 0 ] );
-
-						}
-
-						edge = 1;
-
-					} else {
-
-						vm = va.clone();
-						vm.lerp( vc, 0.5 );
-
-						triA.a = a;
-						triA.b = b;
-						triA.c = m;
-
-						triB.a = m;
-						triB.b = b;
-						triB.c = c;
-
-						if ( face.vertexNormals.length === 3 ) {
-
-							vnm = face.vertexNormals[ 0 ].clone();
-							vnm.lerp( face.vertexNormals[ 2 ], 0.5 );
-
-							triA.vertexNormals[ 2 ].copy( vnm );
-							triB.vertexNormals[ 0 ].copy( vnm );
-
-						}
-
-						if ( face.vertexColors.length === 3 ) {
-
-							vcm = face.vertexColors[ 0 ].clone();
-							vcm.lerp( face.vertexColors[ 2 ], 0.5 );
-
-							triA.vertexColors[ 2 ].copy( vcm );
-							triB.vertexColors[ 0 ].copy( vcm );
-
-						}
-
-						edge = 2;
-
-					}
-
-					faces.push( triA, triB );
-					geometry.vertices.push( vm );
-
-					var j, jl, uvs, uvA, uvB, uvC, uvM, uvsTriA, uvsTriB;
-
-					for ( j = 0, jl = geometry.faceVertexUvs.length; j < jl; j ++ ) {
-
-						if ( geometry.faceVertexUvs[ j ].length ) {
-
-							uvs = geometry.faceVertexUvs[ j ][ i ];
-
-							uvA = uvs[ 0 ];
-							uvB = uvs[ 1 ];
-							uvC = uvs[ 2 ];
-
-							// AB
-
-							if ( edge === 0 ) {
-
-								uvM = uvA.clone();
-								uvM.lerp( uvB, 0.5 );
-
-								uvsTriA = [ uvA.clone(), uvM.clone(), uvC.clone() ];
-								uvsTriB = [ uvM.clone(), uvB.clone(), uvC.clone() ];
-
-							// BC
-
-							} else if ( edge === 1 ) {
-
-								uvM = uvB.clone();
-								uvM.lerp( uvC, 0.5 );
-
-								uvsTriA = [ uvA.clone(), uvB.clone(), uvM.clone() ];
-								uvsTriB = [ uvM.clone(), uvC.clone(), uvA.clone() ];
-
-							// AC
-
-							} else {
-
-								uvM = uvA.clone();
-								uvM.lerp( uvC, 0.5 );
-
-								uvsTriA = [ uvA.clone(), uvB.clone(), uvM.clone() ];
-								uvsTriB = [ uvM.clone(), uvB.clone(), uvC.clone() ];
-
-							}
-
-							faceVertexUvs[ j ].push( uvsTriA, uvsTriB );
-
-						}
-
-					}
-
-				} else {
-
-					faces.push( face );
-
-					for ( j = 0, jl = geometry.faceVertexUvs.length; j < jl; j ++ ) {
-
-						faceVertexUvs[ j ].push( geometry.faceVertexUvs[ j ][ i ] );
-
-					}
-
-				}
-
-			} else {
-
-				a = face.a;
-				b = face.b;
-				c = face.c;
-				d = face.d;
-
-				va = geometry.vertices[ a ];
-				vb = geometry.vertices[ b ];
-				vc = geometry.vertices[ c ];
-				vd = geometry.vertices[ d ];
-
-				dab = va.distanceTo( vb );
-				dbc = vb.distanceTo( vc );
-				dcd = vc.distanceTo( vd );
-				dad = va.distanceTo( vd );
-
-				if ( dab > maxEdgeLength || dbc > maxEdgeLength || dcd > maxEdgeLength || dad > maxEdgeLength ) {
-
-					m1 = geometry.vertices.length;
-					m2 = geometry.vertices.length + 1;
-
-					quadA = face.clone();
-					quadB = face.clone();
-
-					if ( ( dab >= dbc && dab >= dcd && dab >= dad ) || ( dcd >= dbc && dcd >= dab && dcd >= dad ) ) {
-
-						vm1 = va.clone();
-						vm1.lerp( vb, 0.5 );
-
-						vm2 = vc.clone();
-						vm2.lerp( vd, 0.5 );
-
-						quadA.a = a;
-						quadA.b = m1;
-						quadA.c = m2;
-						quadA.d = d;
-
-						quadB.a = m1;
-						quadB.b = b;
-						quadB.c = c;
-						quadB.d = m2;
-
-						if ( face.vertexNormals.length === 4 ) {
-
-							vnm1 = face.vertexNormals[ 0 ].clone();
-							vnm1.lerp( face.vertexNormals[ 1 ], 0.5 );
-
-							vnm2 = face.vertexNormals[ 2 ].clone();
-							vnm2.lerp( face.vertexNormals[ 3 ], 0.5 );
-
-							quadA.vertexNormals[ 1 ].copy( vnm1 );
-							quadA.vertexNormals[ 2 ].copy( vnm2 );
-
-							quadB.vertexNormals[ 0 ].copy( vnm1 );
-							quadB.vertexNormals[ 3 ].copy( vnm2 );
-
-						}
-
-						if ( face.vertexColors.length === 4 ) {
-
-							vcm1 = face.vertexColors[ 0 ].clone();
-							vcm1.lerp( face.vertexColors[ 1 ], 0.5 );
-
-							vcm2 = face.vertexColors[ 2 ].clone();
-							vcm2.lerp( face.vertexColors[ 3 ], 0.5 );
-
-							quadA.vertexColors[ 1 ].copy( vcm1 );
-							quadA.vertexColors[ 2 ].copy( vcm2 );
-
-							quadB.vertexColors[ 0 ].copy( vcm1 );
-							quadB.vertexColors[ 3 ].copy( vcm2 );
-
-						}
-
-						edge = 0;
-
-					} else {
-
-						vm1 = vb.clone();
-						vm1.lerp( vc, 0.5 );
-
-						vm2 = vd.clone();
-						vm2.lerp( va, 0.5 );
-
-						quadA.a = a;
-						quadA.b = b;
-						quadA.c = m1;
-						quadA.d = m2;
-
-						quadB.a = m2;
-						quadB.b = m1;
-						quadB.c = c;
-						quadB.d = d;
-
-						if ( face.vertexNormals.length === 4 ) {
-
-							vnm1 = face.vertexNormals[ 1 ].clone();
-							vnm1.lerp( face.vertexNormals[ 2 ], 0.5 );
-
-							vnm2 = face.vertexNormals[ 3 ].clone();
-							vnm2.lerp( face.vertexNormals[ 0 ], 0.5 );
-
-							quadA.vertexNormals[ 2 ].copy( vnm1 );
-							quadA.vertexNormals[ 3 ].copy( vnm2 );
-
-							quadB.vertexNormals[ 0 ].copy( vnm2 );
-							quadB.vertexNormals[ 1 ].copy( vnm1 );
-
-						}
-
-						if ( face.vertexColors.length === 4 ) {
-
-							vcm1 = face.vertexColors[ 1 ].clone();
-							vcm1.lerp( face.vertexColors[ 2 ], 0.5 );
-
-							vcm2 = face.vertexColors[ 3 ].clone();
-							vcm2.lerp( face.vertexColors[ 0 ], 0.5 );
-
-							quadA.vertexColors[ 2 ].copy( vcm1 );
-							quadA.vertexColors[ 3 ].copy( vcm2 );
-
-							quadB.vertexColors[ 0 ].copy( vcm2 );
-							quadB.vertexColors[ 1 ].copy( vcm1 );
-
-						}
-
-						edge = 1;
-
-					}
-
-					faces.push( quadA, quadB );
-					geometry.vertices.push( vm1, vm2 );
-
-					var j, jl, uvs, uvA, uvB, uvC, uvD, uvM1, uvM2, uvsQuadA, uvsQuadB;
-
-					for ( j = 0, jl = geometry.faceVertexUvs.length; j < jl; j ++ ) {
-
-						if ( geometry.faceVertexUvs[ j ].length ) {
-
-							uvs = geometry.faceVertexUvs[ j ][ i ];
-
-							uvA = uvs[ 0 ];
-							uvB = uvs[ 1 ];
-							uvC = uvs[ 2 ];
-							uvD = uvs[ 3 ];
-
-							// AB + CD
-
-							if ( edge === 0 ) {
-
-								uvM1 = uvA.clone();
-								uvM1.lerp( uvB, 0.5 );
-
-								uvM2 = uvC.clone();
-								uvM2.lerp( uvD, 0.5 );
-
-								uvsQuadA = [ uvA.clone(), uvM1.clone(), uvM2.clone(), uvD.clone() ];
-								uvsQuadB = [ uvM1.clone(), uvB.clone(), uvC.clone(), uvM2.clone() ];
-
-							// BC + AD
-
-							} else {
-
-								uvM1 = uvB.clone();
-								uvM1.lerp( uvC, 0.5 );
-
-								uvM2 = uvD.clone();
-								uvM2.lerp( uvA, 0.5 );
-
-								uvsQuadA = [ uvA.clone(), uvB.clone(), uvM1.clone(), uvM2.clone() ];
-								uvsQuadB = [ uvM2.clone(), uvM1.clone(), uvC.clone(), uvD.clone() ];
-
-							}
-
-							faceVertexUvs[ j ].push( uvsQuadA, uvsQuadB );
-
-						}
-
-					}
-
-				} else {
-
-					faces.push( face );
-
-					for ( j = 0, jl = geometry.faceVertexUvs.length; j < jl; j ++ ) {
-
-						faceVertexUvs[ j ].push( geometry.faceVertexUvs[ j ][ i ] );
-
-					}
-
-				}
-
-			}
-
-		}
-
-		geometry.faces = faces;
-		geometry.faceVertexUvs = faceVertexUvs;
-
-	},
-	
 	setMaterialIndex: function ( geometry, index, startFace, endFace ){
 	setMaterialIndex: function ( geometry, index, startFace, endFace ){
-		
+
 		var faces = geometry.faces;
 		var faces = geometry.faces;
 		var start = startFace || 0;
 		var start = startFace || 0;
 		var end = endFace || faces.length - 1;
 		var end = endFace || faces.length - 1;
-		
+
 		for ( var i = start; i <= end; i ++ ) {
 		for ( var i = start; i <= end; i ++ ) {
-		
+
 			faces[i].materialIndex = index;
 			faces[i].materialIndex = index;
 
 
 		}
 		}
-		
+
     }
     }
 
 
 };
 };