| |
| |
| |
| |
| |
| |
|
|
| THREE.TessellateModifier = function ( maxEdgeLength ) { |
|
|
| this.maxEdgeLength = maxEdgeLength; |
|
|
| }; |
|
|
| THREE.TessellateModifier.prototype.modify = function ( geometry ) { |
|
|
| var edge; |
|
|
| var faces = []; |
| var faceVertexUvs = []; |
| var maxEdgeLengthSquared = this.maxEdgeLength * this.maxEdgeLength; |
|
|
| for ( var i = 0, il = geometry.faceVertexUvs.length; i < il; i ++ ) { |
|
|
| faceVertexUvs[ i ] = []; |
|
|
| } |
|
|
| for ( var i = 0, il = geometry.faces.length; i < il; i ++ ) { |
|
|
| var face = geometry.faces[ i ]; |
|
|
| if ( face instanceof THREE.Face3 ) { |
|
|
| 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 ]; |
|
|
| var dab = va.distanceToSquared( vb ); |
| var dbc = vb.distanceToSquared( vc ); |
| var dac = va.distanceToSquared( vc ); |
|
|
| if ( dab > maxEdgeLengthSquared || dbc > maxEdgeLengthSquared || dac > maxEdgeLengthSquared ) { |
|
|
| var m = geometry.vertices.length; |
|
|
| var triA = face.clone(); |
| var triB = face.clone(); |
|
|
| if ( dab >= dbc && dab >= dac ) { |
|
|
| var 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 ) { |
|
|
| var 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 ) { |
|
|
| var 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 ) { |
|
|
| var 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 ) { |
|
|
| var 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 ) { |
|
|
| var 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 { |
|
|
| var 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 ) { |
|
|
| var 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 ) { |
|
|
| var 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 ); |
|
|
| for ( var j = 0, jl = geometry.faceVertexUvs.length; j < jl; j ++ ) { |
|
|
| if ( geometry.faceVertexUvs[ j ].length ) { |
|
|
| var uvs = geometry.faceVertexUvs[ j ][ i ]; |
|
|
| var uvA = uvs[ 0 ]; |
| var uvB = uvs[ 1 ]; |
| var uvC = uvs[ 2 ]; |
|
|
| |
|
|
| if ( edge === 0 ) { |
|
|
| var uvM = uvA.clone(); |
| uvM.lerp( uvB, 0.5 ); |
|
|
| var uvsTriA = [ uvA.clone(), uvM.clone(), uvC.clone() ]; |
| var uvsTriB = [ uvM.clone(), uvB.clone(), uvC.clone() ]; |
|
|
| |
|
|
| } else if ( edge === 1 ) { |
|
|
| var uvM = uvB.clone(); |
| uvM.lerp( uvC, 0.5 ); |
|
|
| var uvsTriA = [ uvA.clone(), uvB.clone(), uvM.clone() ]; |
| var uvsTriB = [ uvM.clone(), uvC.clone(), uvA.clone() ]; |
|
|
| |
|
|
| } else { |
|
|
| var uvM = uvA.clone(); |
| uvM.lerp( uvC, 0.5 ); |
|
|
| var uvsTriA = [ uvA.clone(), uvB.clone(), uvM.clone() ]; |
| var uvsTriB = [ uvM.clone(), uvB.clone(), uvC.clone() ]; |
|
|
| } |
|
|
| faceVertexUvs[ j ].push( uvsTriA, uvsTriB ); |
|
|
| } |
|
|
| } |
|
|
| } else { |
|
|
| faces.push( face ); |
|
|
| for ( var j = 0, jl = geometry.faceVertexUvs.length; j < jl; j ++ ) { |
|
|
| faceVertexUvs[ j ].push( geometry.faceVertexUvs[ j ][ i ] ); |
|
|
| } |
|
|
| } |
|
|
| } |
|
|
| } |
|
|
| geometry.faces = faces; |
| geometry.faceVertexUvs = faceVertexUvs; |
|
|
| }; |
|
|