Spaces:
Running
Running
| /** | |
| * 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 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 ]; | |
| // AB | |
| 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() ]; | |
| // BC | |
| } 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() ]; | |
| // AC | |
| } 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; | |
| }; | |