You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
82 lines
1.7 KiB
82 lines
1.7 KiB
/**
|
|
* @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;
|
|
|
|
} )();
|