433 lines
		
	
	
		
			8.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			433 lines
		
	
	
		
			8.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
var THREE = require("./three.min");
 | 
						|
 | 
						|
// BufferGeometryUtils.js
 | 
						|
/**
 | 
						|
 * @author spite / http://www.clicktorelease.com/
 | 
						|
 * @author mrdoob / http://mrdoob.com/
 | 
						|
 */
 | 
						|
 | 
						|
THREE.BufferGeometryUtils = {
 | 
						|
 | 
						|
	fromGeometry: function geometryToBufferGeometry( geometry, settings ) {
 | 
						|
 | 
						|
		if ( geometry instanceof THREE.BufferGeometry ) {
 | 
						|
 | 
						|
			return geometry;
 | 
						|
 | 
						|
		}
 | 
						|
 | 
						|
		settings = settings || { 'vertexColors': THREE.NoColors };
 | 
						|
 | 
						|
		var vertices = geometry.vertices;
 | 
						|
		var faces = geometry.faces;
 | 
						|
		var faceVertexUvs = geometry.faceVertexUvs;
 | 
						|
		var vertexColors = settings.vertexColors;
 | 
						|
		var hasFaceVertexUv = faceVertexUvs[ 0 ].length > 0;
 | 
						|
		var hasFaceVertexNormals = faces[ 0 ].vertexNormals.length == 3;
 | 
						|
 | 
						|
		var bufferGeometry = new THREE.BufferGeometry();
 | 
						|
 | 
						|
		bufferGeometry.attributes = {
 | 
						|
 | 
						|
			position: {
 | 
						|
				itemSize: 3,
 | 
						|
				array: new Float32Array( faces.length * 3 * 3 )
 | 
						|
			},
 | 
						|
			normal: {
 | 
						|
				itemSize: 3,
 | 
						|
				array: new Float32Array( faces.length * 3 * 3 )
 | 
						|
			}
 | 
						|
 | 
						|
		}
 | 
						|
 | 
						|
		var positions = bufferGeometry.attributes.position.array;
 | 
						|
		var normals = bufferGeometry.attributes.normal.array;
 | 
						|
 | 
						|
		if ( vertexColors !== THREE.NoColors ) {
 | 
						|
 | 
						|
			bufferGeometry.attributes.color = {
 | 
						|
				itemSize: 3,
 | 
						|
				array: new Float32Array( faces.length * 3 * 3 )
 | 
						|
			};
 | 
						|
 | 
						|
			var colors = bufferGeometry.attributes.color.array;
 | 
						|
 | 
						|
		}
 | 
						|
 | 
						|
		if ( hasFaceVertexUv === true ) {
 | 
						|
 | 
						|
			bufferGeometry.attributes.uv = {
 | 
						|
				itemSize: 2,
 | 
						|
				array: new Float32Array( faces.length * 3 * 2 )
 | 
						|
			};
 | 
						|
 | 
						|
			var uvs = bufferGeometry.attributes.uv.array;
 | 
						|
 | 
						|
		}
 | 
						|
 | 
						|
		for ( var i = 0, i2 = 0, i3 = 0; i < faces.length; i ++, i2 += 6, i3 += 9 ) {
 | 
						|
 | 
						|
			var face = faces[ i ];
 | 
						|
 | 
						|
			var a = vertices[ face.a ];
 | 
						|
			var b = vertices[ face.b ];
 | 
						|
			var c = vertices[ face.c ];
 | 
						|
 | 
						|
			positions[ i3     ] = a.x;
 | 
						|
			positions[ i3 + 1 ] = a.y;
 | 
						|
			positions[ i3 + 2 ] = a.z;
 | 
						|
			
 | 
						|
			positions[ i3 + 3 ] = b.x;
 | 
						|
			positions[ i3 + 4 ] = b.y;
 | 
						|
			positions[ i3 + 5 ] = b.z;
 | 
						|
			
 | 
						|
			positions[ i3 + 6 ] = c.x;
 | 
						|
			positions[ i3 + 7 ] = c.y;
 | 
						|
			positions[ i3 + 8 ] = c.z;
 | 
						|
 | 
						|
			if ( hasFaceVertexNormals === true ) {
 | 
						|
 | 
						|
				var na = face.vertexNormals[ 0 ];
 | 
						|
				var nb = face.vertexNormals[ 1 ];
 | 
						|
				var nc = face.vertexNormals[ 2 ];
 | 
						|
 | 
						|
				normals[ i3     ] = na.x;
 | 
						|
				normals[ i3 + 1 ] = na.y;
 | 
						|
				normals[ i3 + 2 ] = na.z;
 | 
						|
 | 
						|
				normals[ i3 + 3 ] = nb.x;
 | 
						|
				normals[ i3 + 4 ] = nb.y;
 | 
						|
				normals[ i3 + 5 ] = nb.z;
 | 
						|
 | 
						|
				normals[ i3 + 6 ] = nc.x;
 | 
						|
				normals[ i3 + 7 ] = nc.y;
 | 
						|
				normals[ i3 + 8 ] = nc.z;
 | 
						|
 | 
						|
			} else {
 | 
						|
 | 
						|
				var n = face.normal;
 | 
						|
 | 
						|
				normals[ i3     ] = n.x;
 | 
						|
				normals[ i3 + 1 ] = n.y;
 | 
						|
				normals[ i3 + 2 ] = n.z;
 | 
						|
 | 
						|
				normals[ i3 + 3 ] = n.x;
 | 
						|
				normals[ i3 + 4 ] = n.y;
 | 
						|
				normals[ i3 + 5 ] = n.z;
 | 
						|
 | 
						|
				normals[ i3 + 6 ] = n.x;
 | 
						|
				normals[ i3 + 7 ] = n.y;
 | 
						|
				normals[ i3 + 8 ] = n.z;
 | 
						|
 | 
						|
			}
 | 
						|
 | 
						|
			if ( vertexColors === THREE.FaceColors ) {
 | 
						|
 | 
						|
				var fc = face.color;
 | 
						|
 | 
						|
				colors[ i3     ] = fc.r;
 | 
						|
				colors[ i3 + 1 ] = fc.g;
 | 
						|
				colors[ i3 + 2 ] = fc.b;
 | 
						|
 | 
						|
				colors[ i3 + 3 ] = fc.r;
 | 
						|
				colors[ i3 + 4 ] = fc.g;
 | 
						|
				colors[ i3 + 5 ] = fc.b;
 | 
						|
 | 
						|
				colors[ i3 + 6 ] = fc.r;
 | 
						|
				colors[ i3 + 7 ] = fc.g;
 | 
						|
				colors[ i3 + 8 ] = fc.b;
 | 
						|
 | 
						|
			} else if ( vertexColors === THREE.VertexColors ) {
 | 
						|
 | 
						|
				var vca = face.vertexColors[ 0 ];
 | 
						|
				var vcb = face.vertexColors[ 1 ];
 | 
						|
				var vcc = face.vertexColors[ 2 ];
 | 
						|
 | 
						|
				colors[ i3     ] = vca.r;
 | 
						|
				colors[ i3 + 1 ] = vca.g;
 | 
						|
				colors[ i3 + 2 ] = vca.b;
 | 
						|
 | 
						|
				colors[ i3 + 3 ] = vcb.r;
 | 
						|
				colors[ i3 + 4 ] = vcb.g;
 | 
						|
				colors[ i3 + 5 ] = vcb.b;
 | 
						|
 | 
						|
				colors[ i3 + 6 ] = vcc.r;
 | 
						|
				colors[ i3 + 7 ] = vcc.g;
 | 
						|
				colors[ i3 + 8 ] = vcc.b;
 | 
						|
 | 
						|
			}
 | 
						|
 | 
						|
			if ( hasFaceVertexUv === true ) {
 | 
						|
 | 
						|
				var uva = faceVertexUvs[ 0 ][ i ][ 0 ];
 | 
						|
				var uvb = faceVertexUvs[ 0 ][ i ][ 1 ];
 | 
						|
				var uvc = faceVertexUvs[ 0 ][ i ][ 2 ];
 | 
						|
 | 
						|
				uvs[ i2     ] = uva.x;
 | 
						|
				uvs[ i2 + 1 ] = uva.y;
 | 
						|
			
 | 
						|
				uvs[ i2 + 2 ] = uvb.x;
 | 
						|
				uvs[ i2 + 3 ] = uvb.y;
 | 
						|
			
 | 
						|
				uvs[ i2 + 4 ] = uvc.x;
 | 
						|
				uvs[ i2 + 5 ] = uvc.y;
 | 
						|
 | 
						|
			}
 | 
						|
 | 
						|
		}
 | 
						|
 | 
						|
		bufferGeometry.computeBoundingSphere();
 | 
						|
 | 
						|
		return bufferGeometry;
 | 
						|
 | 
						|
	}
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
// ConvexGeometry.js
 | 
						|
// @author qiao / https://github.com/qiao
 | 
						|
 | 
						|
THREE.ConvexGeometry = function( vertices ) {
 | 
						|
 | 
						|
	THREE.Geometry.call( this );
 | 
						|
 | 
						|
	var faces = [ [ 0, 1, 2 ], [ 0, 2, 1 ] ]; 
 | 
						|
 | 
						|
	for ( var i = 3; i < vertices.length; i++ ) {
 | 
						|
 | 
						|
		addPoint( i );
 | 
						|
 | 
						|
	}
 | 
						|
 | 
						|
 | 
						|
	function addPoint( vertexId ) {
 | 
						|
 | 
						|
		var vertex = vertices[ vertexId ].clone();
 | 
						|
 | 
						|
		var mag = vertex.length();
 | 
						|
		vertex.x += mag * randomOffset();
 | 
						|
		vertex.y += mag * randomOffset();
 | 
						|
		vertex.z += mag * randomOffset();
 | 
						|
 | 
						|
		var hole = [];
 | 
						|
 | 
						|
		for ( var f = 0; f < faces.length; ) {
 | 
						|
 | 
						|
			var face = faces[ f ];
 | 
						|
 | 
						|
			// for each face, if the vertex can see it,
 | 
						|
			// then we try to add the face's edges into the hole.
 | 
						|
			if ( visible( face, vertex ) ) {
 | 
						|
 | 
						|
				for ( var e = 0; e < 3; e++ ) {
 | 
						|
 | 
						|
					var edge = [ face[ e ], face[ ( e + 1 ) % 3 ] ];
 | 
						|
					var boundary = true;
 | 
						|
 | 
						|
					// remove duplicated edges.
 | 
						|
					for ( var h = 0; h < hole.length; h++ ) {
 | 
						|
 | 
						|
						if ( equalEdge( hole[ h ], edge ) ) {
 | 
						|
 | 
						|
							hole[ h ] = hole[ hole.length - 1 ];
 | 
						|
							hole.pop();
 | 
						|
							boundary = false;
 | 
						|
							break;
 | 
						|
 | 
						|
						}
 | 
						|
 | 
						|
					}
 | 
						|
 | 
						|
					if ( boundary ) {
 | 
						|
 | 
						|
						hole.push( edge );
 | 
						|
 | 
						|
					}
 | 
						|
 | 
						|
				}
 | 
						|
 | 
						|
				// remove faces[ f ]
 | 
						|
				faces[ f ] = faces[ faces.length - 1 ];
 | 
						|
				faces.pop();
 | 
						|
 | 
						|
			} else { // not visible
 | 
						|
 | 
						|
				f++;
 | 
						|
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		// construct the new faces formed by the edges of the hole and the vertex
 | 
						|
		for ( var h = 0; h < hole.length; h++ ) {
 | 
						|
 | 
						|
			faces.push( [ 
 | 
						|
				hole[ h ][ 0 ],
 | 
						|
				hole[ h ][ 1 ],
 | 
						|
				vertexId
 | 
						|
			] );
 | 
						|
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Whether the face is visible from the vertex
 | 
						|
	 */
 | 
						|
	function visible( face, vertex ) {
 | 
						|
 | 
						|
		var va = vertices[ face[ 0 ] ];
 | 
						|
		var vb = vertices[ face[ 1 ] ];
 | 
						|
		var vc = vertices[ face[ 2 ] ];
 | 
						|
 | 
						|
		var n = normal( va, vb, vc );
 | 
						|
 | 
						|
		// distance from face to origin
 | 
						|
		var dist = n.dot( va );
 | 
						|
 | 
						|
		return n.dot( vertex ) >= dist; 
 | 
						|
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Face normal
 | 
						|
	 */
 | 
						|
	function normal( va, vb, vc ) {
 | 
						|
 | 
						|
		var cb = new THREE.Vector3();
 | 
						|
		var ab = new THREE.Vector3();
 | 
						|
 | 
						|
		cb.subVectors( vc, vb );
 | 
						|
		ab.subVectors( va, vb );
 | 
						|
		cb.cross( ab );
 | 
						|
 | 
						|
		cb.normalize();
 | 
						|
 | 
						|
		return cb;
 | 
						|
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Detect whether two edges are equal.
 | 
						|
	 * Note that when constructing the convex hull, two same edges can only
 | 
						|
	 * be of the negative direction.
 | 
						|
	 */
 | 
						|
	function equalEdge( ea, eb ) {
 | 
						|
 | 
						|
		return ea[ 0 ] === eb[ 1 ] && ea[ 1 ] === eb[ 0 ]; 
 | 
						|
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Create a random offset between -1e-6 and 1e-6.
 | 
						|
	 */
 | 
						|
	function randomOffset() {
 | 
						|
 | 
						|
		return ( Math.random() - 0.5 ) * 2 * 1e-6;
 | 
						|
 | 
						|
	}
 | 
						|
 | 
						|
 | 
						|
	/**
 | 
						|
	 * XXX: Not sure if this is the correct approach. Need someone to review.
 | 
						|
	 */
 | 
						|
	function vertexUv( vertex ) {
 | 
						|
 | 
						|
		var mag = vertex.length();
 | 
						|
		return new THREE.Vector2( vertex.x / mag, vertex.y / mag );
 | 
						|
 | 
						|
	}
 | 
						|
 | 
						|
	// Push vertices into `this.vertices`, skipping those inside the hull
 | 
						|
	var id = 0;
 | 
						|
	var newId = new Array( vertices.length ); // map from old vertex id to new id
 | 
						|
 | 
						|
	for ( var i = 0; i < faces.length; i++ ) {
 | 
						|
 | 
						|
		 var face = faces[ i ];
 | 
						|
 | 
						|
		 for ( var j = 0; j < 3; j++ ) {
 | 
						|
 | 
						|
				if ( newId[ face[ j ] ] === undefined ) {
 | 
						|
 | 
						|
						newId[ face[ j ] ] = id++;
 | 
						|
						this.vertices.push( vertices[ face[ j ] ] );
 | 
						|
 | 
						|
				}
 | 
						|
 | 
						|
				face[ j ] = newId[ face[ j ] ];
 | 
						|
 | 
						|
		 }
 | 
						|
 | 
						|
	}
 | 
						|
 | 
						|
	// Convert faces into instances of THREE.Face3
 | 
						|
	for ( var i = 0; i < faces.length; i++ ) {
 | 
						|
 | 
						|
		this.faces.push( new THREE.Face3( 
 | 
						|
				faces[ i ][ 0 ],
 | 
						|
				faces[ i ][ 1 ],
 | 
						|
				faces[ i ][ 2 ]
 | 
						|
		) );
 | 
						|
 | 
						|
	}
 | 
						|
 | 
						|
	// Compute UVs
 | 
						|
	for ( var i = 0; i < this.faces.length; i++ ) {
 | 
						|
 | 
						|
		var face = this.faces[ i ];
 | 
						|
 | 
						|
		this.faceVertexUvs[ 0 ].push( [
 | 
						|
			vertexUv( this.vertices[ face.a ] ),
 | 
						|
			vertexUv( this.vertices[ face.b ] ),
 | 
						|
			vertexUv( this.vertices[ face.c ])
 | 
						|
		] );
 | 
						|
 | 
						|
	}
 | 
						|
 | 
						|
	this.computeFaceNormals();
 | 
						|
	this.computeVertexNormals();
 | 
						|
 | 
						|
};
 | 
						|
 | 
						|
THREE.ConvexGeometry.prototype = Object.create( THREE.Geometry.prototype );
 | 
						|
 | 
						|
// SceneUtils.js
 | 
						|
/**
 | 
						|
 * @author alteredq / http://alteredqualia.com/
 | 
						|
 */
 | 
						|
 | 
						|
THREE.SceneUtils = {
 | 
						|
 | 
						|
	createMultiMaterialObject: function ( geometry, materials ) {
 | 
						|
 | 
						|
		var group = new THREE.Group();
 | 
						|
 | 
						|
		for ( var i = 0, l = materials.length; i < l; i ++ ) {
 | 
						|
 | 
						|
			group.add( new THREE.Mesh( geometry, materials[ i ] ) );
 | 
						|
 | 
						|
		}
 | 
						|
 | 
						|
		return group;
 | 
						|
 | 
						|
	},
 | 
						|
 | 
						|
	detach: function ( child, parent, scene ) {
 | 
						|
 | 
						|
		console.warn( 'THREE.SceneUtils: detach() has been deprecated. Use scene.attach( child ) instead.' );
 | 
						|
 | 
						|
		scene.attach( child );
 | 
						|
 | 
						|
	},
 | 
						|
 | 
						|
	attach: function ( child, scene, parent ) {
 | 
						|
 | 
						|
		console.warn( 'THREE.SceneUtils: attach() has been deprecated. Use parent.attach( child ) instead.' );
 | 
						|
 | 
						|
		parent.attach( child );
 | 
						|
 | 
						|
	}
 | 
						|
 | 
						|
};
 | 
						|
 | 
						|
module.exports = THREE
 |