diff --git a/src/core/Vertex.js b/src/core/Vertex.js index 6edbb9b86171d075c98478a8ba5c8bb7b6b6f19f..e1e5c17686438f8d9145f941b7c2e6e62cdcf51a 100644 --- a/src/core/Vertex.js +++ b/src/core/Vertex.js @@ -7,3 +7,15 @@ THREE.Vertex = function ( position ) { this.position = position || new THREE.Vector3(); }; + +THREE.Vertex.prototype = { + + constructor: THREE.Vertex, + + clone: function () { + + return new THREE.Vertex( this.position.clone() ); + + } + +}; diff --git a/src/extras/GeometryUtils.js b/src/extras/GeometryUtils.js index fbcabb8cd03ab356ec5b448ccc4a9f4c28940ab2..b3169f08988a16bb918bbe24b412c2cac240af1b 100644 --- a/src/extras/GeometryUtils.js +++ b/src/extras/GeometryUtils.js @@ -47,7 +47,7 @@ THREE.GeometryUtils = { var vertex = vertices2[ i ]; - var vertexCopy = new THREE.Vertex( vertex.position.clone() ); + var vertexCopy = vertex.clone(); if ( matrix ) matrix.multiplyVector3( vertexCopy.position ); @@ -602,6 +602,67 @@ THREE.GeometryUtils = { if ( geometry.hasTangents ) geometry.computeTangents(); + }, + + // Make all faces use unique vertices + // so that each face can be separated from others + + explode: function( geometry ) { + + var vertices = []; + + for ( var i = geometry.faces.length - 1; i >= 0; 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; + } };