Spaces:
Running
Running
/** | |
* @author Mugen87 / https://github.com/Mugen87 | |
*/ | |
( function () { | |
// ConvexGeometry | |
function ConvexGeometry( points ) { | |
THREE.Geometry.call( this ); | |
this.fromBufferGeometry( new ConvexBufferGeometry( points ) ); | |
this.mergeVertices(); | |
} | |
ConvexGeometry.prototype = Object.create( THREE.Geometry.prototype ); | |
ConvexGeometry.prototype.constructor = ConvexGeometry; | |
// ConvexBufferGeometry | |
function ConvexBufferGeometry( points ) { | |
THREE.BufferGeometry.call( this ); | |
// buffers | |
var vertices = []; | |
var normals = []; | |
// execute QuickHull | |
if ( THREE.QuickHull === undefined ) { | |
console.error( 'THREE.ConvexBufferGeometry: ConvexBufferGeometry relies on THREE.QuickHull' ); | |
} | |
var quickHull = new THREE.QuickHull().setFromPoints( points ); | |
// generate vertices and normals | |
var faces = quickHull.faces; | |
for ( var i = 0; i < faces.length; i ++ ) { | |
var face = faces[ i ]; | |
var edge = face.edge; | |
// we move along a doubly-connected edge list to access all face points (see HalfEdge docs) | |
do { | |
var point = edge.head().point; | |
vertices.push( point.x, point.y, point.z ); | |
normals.push( face.normal.x, face.normal.y, face.normal.z ); | |
edge = edge.next; | |
} while ( edge !== face.edge ); | |
} | |
// build geometry | |
this.addAttribute( 'position', new THREE.Float32BufferAttribute( vertices, 3 ) ); | |
this.addAttribute( 'normal', new THREE.Float32BufferAttribute( normals, 3 ) ); | |
} | |
ConvexBufferGeometry.prototype = Object.create( THREE.BufferGeometry.prototype ); | |
ConvexBufferGeometry.prototype.constructor = ConvexBufferGeometry; | |
// export | |
THREE.ConvexGeometry = ConvexGeometry; | |
THREE.ConvexBufferGeometry = ConvexBufferGeometry; | |
} )(); | |