forked from LeenkxTeam/LNXSDK
		
	
		
			
				
	
	
		
			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
 |