code: function make( v1, v2, v3, detail ) {
  
  		if ( detail < 1 ) {
  
  			var face = new THREE.Face3( v1.index, v2.index, v3.index, [ v1.clone(), v2.clone(), v3.clone() ] );
  			face.centroid.addSelf( v1 ).addSelf( v2 ).addSelf( v3 ).divideScalar( 3 );
  			face.normal = face.centroid.clone().normalize();
  			that.faces.push( face );
  
  			var azi = azimuth( face.centroid );
  			that.faceVertexUvs[ 0 ].push( [ 
  				correctUV( v1.uv, v1, azi ),
  				correctUV( v2.uv, v2, azi ),
  				correctUV( v3.uv, v3, azi )
  			] );
  
  		}
  		else {
  
  			detail -= 1;
  			// split triangle into 4 smaller triangles
  			make( v1, midpoint( v1, v2 ), midpoint( v1, v3 ), detail ); // top quadrant
  			make( midpoint( v1, v2 ), v2, midpoint( v2, v3 ), detail ); // left quadrant
  			make( midpoint( v1, v3 ), midpoint( v2, v3 ), v3, detail ); // right quadrant
  			make( midpoint( v1, v2 ), midpoint( v2, v3 ), midpoint( v1, v3 ), detail ); // center quadrant
  
  		}
  
  	}
docs: Approximate a curved face with recursively sub-divided triangles.