浏览代码

Yet more Ray clean up.

Mr.doob 13 年之前
父节点
当前提交
b6861b3e0c
共有 4 个文件被更改,包括 424 次插入415 次删除
  1. 46 26
      build/three.js
  2. 222 221
      build/three.min.js
  3. 8 8
      examples/webgl_interactive_cubes.html
  4. 148 160
      src/core/Ray.js

+ 46 - 26
build/three.js

@@ -2761,27 +2761,13 @@ THREE.Frustum.__v1 = new THREE.Vector3();
 
 	};
 
-	//
-
-	THREE.Ray.prototype.precision = 0.0001;
-
-	THREE.Ray.prototype.intersectObject = function ( object, recursive ) {
-
-		var intersect, intersects = [], distance;
-
-		if ( recursive === true ) {
-
-			for ( var i = 0, l = object.children.length; i < l; i ++ ) {
-
-				Array.prototype.push.apply( intersects, this.intersectObject( object.children[ i ], recursive ) );
+	var intersectObject = function ( object, ray, intersects ) {
 
-			}
-
-		}
+		var distance,intersect;
 
 		if ( object instanceof THREE.Particle ) {
 
-			distance = distanceFromIntersection( this.origin, this.direction, object.matrixWorld.getPosition() );
+			distance = distanceFromIntersection( ray.origin, ray.direction, object.matrixWorld.getPosition() );
 
 			if ( distance > object.scale.x ) {
 
@@ -2808,9 +2794,9 @@ THREE.Frustum.__v1 = new THREE.Vector3();
 
 			// Checking distance to ray
 
-			distance = distanceFromIntersection( this.origin, this.direction, object.matrixWorld.getPosition() );
+			distance = distanceFromIntersection( ray.origin, ray.direction, object.matrixWorld.getPosition() );
 
-			if ( distance > scaledRadius ) {
+			if ( distance > scaledRadius) {
 
 				return intersects;
 
@@ -2827,13 +2813,13 @@ THREE.Frustum.__v1 = new THREE.Vector3();
 			geometryMaterials = object.geometry.materials;
 			isFaceMaterial = object.material instanceof THREE.MeshFaceMaterial;
 			side = object.material.side;
+
 			var a, b, c, d;
-			var precision = this.precision;
+			var precision = ray.precision;
 
 			object.matrixRotationWorld.extractRotation( object.matrixWorld );
 
-			originCopy.copy( this.origin );
-			//directionCopy.copy( this.direction );
+			originCopy.copy( ray.origin );
 
 			objMatrix = object.matrixWorld;
 			inverseMatrix.getInverse( objMatrix );
@@ -2841,7 +2827,7 @@ THREE.Frustum.__v1 = new THREE.Vector3();
 			localOriginCopy.copy( originCopy );
 			inverseMatrix.multiplyVector3( localOriginCopy );
 
-			localDirectionCopy.copy( this.direction );
+			localDirectionCopy.copy( ray.direction );
 			inverseMatrix.rotateAxis( localDirectionCopy ).normalize();
 
 			for ( f = 0, fl = geometry.faces.length; f < fl; f ++ ) {
@@ -2883,7 +2869,7 @@ THREE.Frustum.__v1 = new THREE.Vector3();
 							point = object.matrixWorld.multiplyVector3( intersectPoint.clone() );
 							distance = originCopy.distanceTo( point );
 
-							if ( distance < this.near || distance > this.far ) continue;
+							if ( distance < ray.near || distance > ray.far ) continue;
 
 							intersect = {
 
@@ -2911,7 +2897,7 @@ THREE.Frustum.__v1 = new THREE.Vector3();
 							point = object.matrixWorld.multiplyVector3( intersectPoint.clone() );
 							distance = originCopy.distanceTo( point );
 
-							if ( distance < this.near || distance > this.far ) continue;
+							if ( distance < ray.near || distance > ray.far ) continue;
 
 							intersect = {
 
@@ -2935,6 +2921,35 @@ THREE.Frustum.__v1 = new THREE.Vector3();
 
 		}
 
+	};
+
+	var intersectDescendants= function ( object, ray, intersects ) {
+
+		var descendants = object.getDescendants();
+
+		for ( var i = 0, l = descendants.length; i < l; i ++ ) {
+
+			intersectObject( descendants[ i ], this, intersects );
+
+		}
+	};
+
+	//
+
+	THREE.Ray.prototype.precision = 0.0001;
+
+	THREE.Ray.prototype.intersectObject = function ( object, recursive ) {
+
+		var intersects = [];
+
+		if ( recursive === true ) {
+
+			intersectDescendants( object, this, intersects );
+
+		}
+
+		intersectObject(object,this,intersects);
+
 		intersects.sort( descSort );
 
 		return intersects;
@@ -2947,8 +2962,13 @@ THREE.Frustum.__v1 = new THREE.Vector3();
 
 		for ( var i = 0, l = objects.length; i < l; i ++ ) {
 
-			Array.prototype.push.apply( intersects, this.intersectObject( objects[ i ], recursive ) );
+			intersectObject( objects[ i ], this, intersects );
+
+			if ( recursive === true ) {
 
+				intersectDescendants( objects[ i ], this, intersects );
+
+			}
 		}
 
 		intersects.sort( descSort );

+ 222 - 221
build/three.min.js

@@ -31,8 +31,8 @@ Math.acos(a.w);var b=Math.sqrt(1-a.w*a.w);if(b<1E-4){this.x=1;this.z=this.y=0}el
 THREE.Matrix3.prototype={constructor:THREE.Matrix3,getInverse:function(a){var b=a.elements,a=b[10]*b[5]-b[6]*b[9],c=-b[10]*b[1]+b[2]*b[9],d=b[6]*b[1]-b[2]*b[5],f=-b[10]*b[4]+b[6]*b[8],e=b[10]*b[0]-b[2]*b[8],g=-b[6]*b[0]+b[2]*b[4],h=b[9]*b[4]-b[5]*b[8],i=-b[9]*b[0]+b[1]*b[8],j=b[5]*b[0]-b[1]*b[4],b=b[0]*a+b[1]*f+b[2]*h;b===0&&console.warn("Matrix3.getInverse(): determinant == 0");var b=1/b,l=this.elements;l[0]=b*a;l[1]=b*c;l[2]=b*d;l[3]=b*f;l[4]=b*e;l[5]=b*g;l[6]=b*h;l[7]=b*i;l[8]=b*j;return this},
 transpose:function(){var a,b=this.elements;a=b[1];b[1]=b[3];b[3]=a;a=b[2];b[2]=b[6];b[6]=a;a=b[5];b[5]=b[7];b[7]=a;return this},transposeIntoArray:function(a){var b=this.m;a[0]=b[0];a[1]=b[3];a[2]=b[6];a[3]=b[1];a[4]=b[4];a[5]=b[7];a[6]=b[2];a[7]=b[5];a[8]=b[8];return this}};THREE.Matrix4=function(a,b,c,d,f,e,g,h,i,j,l,m,n,q,o,p){this.elements=new Float32Array(16);this.set(a!==void 0?a:1,b||0,c||0,d||0,f||0,e!==void 0?e:1,g||0,h||0,i||0,j||0,l!==void 0?l:1,m||0,n||0,q||0,o||0,p!==void 0?p:1)};
 THREE.Matrix4.prototype={constructor:THREE.Matrix4,set:function(a,b,c,d,f,e,g,h,i,j,l,m,n,q,o,p){var s=this.elements;s[0]=a;s[4]=b;s[8]=c;s[12]=d;s[1]=f;s[5]=e;s[9]=g;s[13]=h;s[2]=i;s[6]=j;s[10]=l;s[14]=m;s[3]=n;s[7]=q;s[11]=o;s[15]=p;return this},identity:function(){this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1);return this},copy:function(a){a=a.elements;this.set(a[0],a[4],a[8],a[12],a[1],a[5],a[9],a[13],a[2],a[6],a[10],a[14],a[3],a[7],a[11],a[15]);return this},lookAt:function(a,b,c){var d=this.elements,
-f=THREE.Matrix4.__v1,e=THREE.Matrix4.__v2,g=THREE.Matrix4.__v3;g.sub(a,b).normalize();if(g.length()===0)g.z=1;f.cross(c,g).normalize();if(f.length()===0){g.x=g.x+1E-4;f.cross(c,g).normalize()}e.cross(g,f);d[0]=f.x;d[4]=e.x;d[8]=g.x;d[1]=f.y;d[5]=e.y;d[9]=g.y;d[2]=f.z;d[6]=e.z;d[10]=g.z;return this},multiply:function(a,b){var c=a.elements,d=b.elements,f=this.elements,e=c[0],g=c[4],h=c[8],i=c[12],j=c[1],l=c[5],m=c[9],n=c[13],q=c[2],o=c[6],p=c[10],s=c[14],r=c[3],t=c[7],v=c[11],c=c[15],u=d[0],A=d[4],
-y=d[8],B=d[12],F=d[1],x=d[5],E=d[9],G=d[13],O=d[2],J=d[6],N=d[10],C=d[14],I=d[3],Q=d[7],K=d[11],d=d[15];f[0]=e*u+g*F+h*O+i*I;f[4]=e*A+g*x+h*J+i*Q;f[8]=e*y+g*E+h*N+i*K;f[12]=e*B+g*G+h*C+i*d;f[1]=j*u+l*F+m*O+n*I;f[5]=j*A+l*x+m*J+n*Q;f[9]=j*y+l*E+m*N+n*K;f[13]=j*B+l*G+m*C+n*d;f[2]=q*u+o*F+p*O+s*I;f[6]=q*A+o*x+p*J+s*Q;f[10]=q*y+o*E+p*N+s*K;f[14]=q*B+o*G+p*C+s*d;f[3]=r*u+t*F+v*O+c*I;f[7]=r*A+t*x+v*J+c*Q;f[11]=r*y+t*E+v*N+c*K;f[15]=r*B+t*G+v*C+c*d;return this},multiplySelf:function(a){return this.multiply(this,
+f=THREE.Matrix4.__v1,e=THREE.Matrix4.__v2,g=THREE.Matrix4.__v3;g.sub(a,b).normalize();if(g.length()===0)g.z=1;f.cross(c,g).normalize();if(f.length()===0){g.x=g.x+1E-4;f.cross(c,g).normalize()}e.cross(g,f);d[0]=f.x;d[4]=e.x;d[8]=g.x;d[1]=f.y;d[5]=e.y;d[9]=g.y;d[2]=f.z;d[6]=e.z;d[10]=g.z;return this},multiply:function(a,b){var c=a.elements,d=b.elements,f=this.elements,e=c[0],g=c[4],h=c[8],i=c[12],j=c[1],l=c[5],m=c[9],n=c[13],q=c[2],o=c[6],p=c[10],s=c[14],r=c[3],u=c[7],v=c[11],c=c[15],t=d[0],A=d[4],
+y=d[8],B=d[12],E=d[1],w=d[5],I=d[9],G=d[13],O=d[2],F=d[6],K=d[10],C=d[14],J=d[3],Q=d[7],L=d[11],d=d[15];f[0]=e*t+g*E+h*O+i*J;f[4]=e*A+g*w+h*F+i*Q;f[8]=e*y+g*I+h*K+i*L;f[12]=e*B+g*G+h*C+i*d;f[1]=j*t+l*E+m*O+n*J;f[5]=j*A+l*w+m*F+n*Q;f[9]=j*y+l*I+m*K+n*L;f[13]=j*B+l*G+m*C+n*d;f[2]=q*t+o*E+p*O+s*J;f[6]=q*A+o*w+p*F+s*Q;f[10]=q*y+o*I+p*K+s*L;f[14]=q*B+o*G+p*C+s*d;f[3]=r*t+u*E+v*O+c*J;f[7]=r*A+u*w+v*F+c*Q;f[11]=r*y+u*I+v*K+c*L;f[15]=r*B+u*G+v*C+c*d;return this},multiplySelf:function(a){return this.multiply(this,
 a)},multiplyToArray:function(a,b,c){var d=this.elements;this.multiply(a,b);c[0]=d[0];c[1]=d[1];c[2]=d[2];c[3]=d[3];c[4]=d[4];c[5]=d[5];c[6]=d[6];c[7]=d[7];c[8]=d[8];c[9]=d[9];c[10]=d[10];c[11]=d[11];c[12]=d[12];c[13]=d[13];c[14]=d[14];c[15]=d[15];return this},multiplyScalar:function(a){var b=this.elements;b[0]=b[0]*a;b[4]=b[4]*a;b[8]=b[8]*a;b[12]=b[12]*a;b[1]=b[1]*a;b[5]=b[5]*a;b[9]=b[9]*a;b[13]=b[13]*a;b[2]=b[2]*a;b[6]=b[6]*a;b[10]=b[10]*a;b[14]=b[14]*a;b[3]=b[3]*a;b[7]=b[7]*a;b[11]=b[11]*a;b[15]=
 b[15]*a;return this},multiplyVector3:function(a){var b=this.elements,c=a.x,d=a.y,f=a.z,e=1/(b[3]*c+b[7]*d+b[11]*f+b[15]);a.x=(b[0]*c+b[4]*d+b[8]*f+b[12])*e;a.y=(b[1]*c+b[5]*d+b[9]*f+b[13])*e;a.z=(b[2]*c+b[6]*d+b[10]*f+b[14])*e;return a},multiplyVector4:function(a){var b=this.elements,c=a.x,d=a.y,f=a.z,e=a.w;a.x=b[0]*c+b[4]*d+b[8]*f+b[12]*e;a.y=b[1]*c+b[5]*d+b[9]*f+b[13]*e;a.z=b[2]*c+b[6]*d+b[10]*f+b[14]*e;a.w=b[3]*c+b[7]*d+b[11]*f+b[15]*e;return a},multiplyVector3Array:function(a){for(var b=THREE.Matrix4.__v1,
 c=0,d=a.length;c<d;c=c+3){b.x=a[c];b.y=a[c+1];b.z=a[c+2];this.multiplyVector3(b);a[c]=b.x;a[c+1]=b.y;a[c+2]=b.z}return a},rotateAxis:function(a){var b=this.elements,c=a.x,d=a.y,f=a.z;a.x=c*b[0]+d*b[4]+f*b[8];a.y=c*b[1]+d*b[5]+f*b[9];a.z=c*b[2]+d*b[6]+f*b[10];a.normalize();return a},crossVector:function(a){var b=this.elements,c=new THREE.Vector4;c.x=b[0]*a.x+b[4]*a.y+b[8]*a.z+b[12]*a.w;c.y=b[1]*a.x+b[5]*a.y+b[9]*a.z+b[13]*a.w;c.z=b[2]*a.x+b[6]*a.y+b[10]*a.z+b[14]*a.w;c.w=a.w?b[3]*a.x+b[7]*a.y+b[11]*
@@ -48,8 +48,8 @@ g.set(d[8],d[9],d[10]);a=a instanceof THREE.Vector3?a:new THREE.Vector3;b=b inst
 c.z;d.elements[9]=d.elements[9]/c.z;d.elements[10]=d.elements[10]/c.z;b.setFromRotationMatrix(d);return[a,b,c]},extractPosition:function(a){var b=this.elements,a=a.elements;b[12]=a[12];b[13]=a[13];b[14]=a[14];return this},extractRotation:function(a){var b=this.elements,a=a.elements,c=THREE.Matrix4.__v1,d=1/c.set(a[0],a[1],a[2]).length(),f=1/c.set(a[4],a[5],a[6]).length(),c=1/c.set(a[8],a[9],a[10]).length();b[0]=a[0]*d;b[1]=a[1]*d;b[2]=a[2]*d;b[4]=a[4]*f;b[5]=a[5]*f;b[6]=a[6]*f;b[8]=a[8]*c;b[9]=a[9]*
 c;b[10]=a[10]*c;return this},translate:function(a){var b=this.elements,c=a.x,d=a.y,a=a.z;b[12]=b[0]*c+b[4]*d+b[8]*a+b[12];b[13]=b[1]*c+b[5]*d+b[9]*a+b[13];b[14]=b[2]*c+b[6]*d+b[10]*a+b[14];b[15]=b[3]*c+b[7]*d+b[11]*a+b[15];return this},rotateX:function(a){var b=this.elements,c=b[4],d=b[5],f=b[6],e=b[7],g=b[8],h=b[9],i=b[10],j=b[11],l=Math.cos(a),a=Math.sin(a);b[4]=l*c+a*g;b[5]=l*d+a*h;b[6]=l*f+a*i;b[7]=l*e+a*j;b[8]=l*g-a*c;b[9]=l*h-a*d;b[10]=l*i-a*f;b[11]=l*j-a*e;return this},rotateY:function(a){var b=
 this.elements,c=b[0],d=b[1],f=b[2],e=b[3],g=b[8],h=b[9],i=b[10],j=b[11],l=Math.cos(a),a=Math.sin(a);b[0]=l*c-a*g;b[1]=l*d-a*h;b[2]=l*f-a*i;b[3]=l*e-a*j;b[8]=l*g+a*c;b[9]=l*h+a*d;b[10]=l*i+a*f;b[11]=l*j+a*e;return this},rotateZ:function(a){var b=this.elements,c=b[0],d=b[1],f=b[2],e=b[3],g=b[4],h=b[5],i=b[6],j=b[7],l=Math.cos(a),a=Math.sin(a);b[0]=l*c+a*g;b[1]=l*d+a*h;b[2]=l*f+a*i;b[3]=l*e+a*j;b[4]=l*g-a*c;b[5]=l*h-a*d;b[6]=l*i-a*f;b[7]=l*j-a*e;return this},rotateByAxis:function(a,b){var c=this.elements;
-if(a.x===1&&a.y===0&&a.z===0)return this.rotateX(b);if(a.x===0&&a.y===1&&a.z===0)return this.rotateY(b);if(a.x===0&&a.y===0&&a.z===1)return this.rotateZ(b);var d=a.x,f=a.y,e=a.z,g=Math.sqrt(d*d+f*f+e*e),d=d/g,f=f/g,e=e/g,g=d*d,h=f*f,i=e*e,j=Math.cos(b),l=Math.sin(b),m=1-j,n=d*f*m,q=d*e*m,m=f*e*m,d=d*l,o=f*l,l=e*l,e=g+(1-g)*j,g=n+l,f=q-o,n=n-l,h=h+(1-h)*j,l=m+d,q=q+o,m=m-d,i=i+(1-i)*j,j=c[0],d=c[1],o=c[2],p=c[3],s=c[4],r=c[5],t=c[6],v=c[7],u=c[8],A=c[9],y=c[10],B=c[11];c[0]=e*j+g*s+f*u;c[1]=e*d+g*
-r+f*A;c[2]=e*o+g*t+f*y;c[3]=e*p+g*v+f*B;c[4]=n*j+h*s+l*u;c[5]=n*d+h*r+l*A;c[6]=n*o+h*t+l*y;c[7]=n*p+h*v+l*B;c[8]=q*j+m*s+i*u;c[9]=q*d+m*r+i*A;c[10]=q*o+m*t+i*y;c[11]=q*p+m*v+i*B;return this},scale:function(a){var b=this.elements,c=a.x,d=a.y,a=a.z;b[0]=b[0]*c;b[4]=b[4]*d;b[8]=b[8]*a;b[1]=b[1]*c;b[5]=b[5]*d;b[9]=b[9]*a;b[2]=b[2]*c;b[6]=b[6]*d;b[10]=b[10]*a;b[3]=b[3]*c;b[7]=b[7]*d;b[11]=b[11]*a;return this},getMaxScaleOnAxis:function(){var a=this.elements;return Math.sqrt(Math.max(a[0]*a[0]+a[1]*a[1]+
+if(a.x===1&&a.y===0&&a.z===0)return this.rotateX(b);if(a.x===0&&a.y===1&&a.z===0)return this.rotateY(b);if(a.x===0&&a.y===0&&a.z===1)return this.rotateZ(b);var d=a.x,f=a.y,e=a.z,g=Math.sqrt(d*d+f*f+e*e),d=d/g,f=f/g,e=e/g,g=d*d,h=f*f,i=e*e,j=Math.cos(b),l=Math.sin(b),m=1-j,n=d*f*m,q=d*e*m,m=f*e*m,d=d*l,o=f*l,l=e*l,e=g+(1-g)*j,g=n+l,f=q-o,n=n-l,h=h+(1-h)*j,l=m+d,q=q+o,m=m-d,i=i+(1-i)*j,j=c[0],d=c[1],o=c[2],p=c[3],s=c[4],r=c[5],u=c[6],v=c[7],t=c[8],A=c[9],y=c[10],B=c[11];c[0]=e*j+g*s+f*t;c[1]=e*d+g*
+r+f*A;c[2]=e*o+g*u+f*y;c[3]=e*p+g*v+f*B;c[4]=n*j+h*s+l*t;c[5]=n*d+h*r+l*A;c[6]=n*o+h*u+l*y;c[7]=n*p+h*v+l*B;c[8]=q*j+m*s+i*t;c[9]=q*d+m*r+i*A;c[10]=q*o+m*u+i*y;c[11]=q*p+m*v+i*B;return this},scale:function(a){var b=this.elements,c=a.x,d=a.y,a=a.z;b[0]=b[0]*c;b[4]=b[4]*d;b[8]=b[8]*a;b[1]=b[1]*c;b[5]=b[5]*d;b[9]=b[9]*a;b[2]=b[2]*c;b[6]=b[6]*d;b[10]=b[10]*a;b[3]=b[3]*c;b[7]=b[7]*d;b[11]=b[11]*a;return this},getMaxScaleOnAxis:function(){var a=this.elements;return Math.sqrt(Math.max(a[0]*a[0]+a[1]*a[1]+
 a[2]*a[2],Math.max(a[4]*a[4]+a[5]*a[5]+a[6]*a[6],a[8]*a[8]+a[9]*a[9]+a[10]*a[10])))},makeTranslation:function(a,b,c){this.set(1,0,0,a,0,1,0,b,0,0,1,c,0,0,0,1);return this},makeRotationX:function(a){var b=Math.cos(a),a=Math.sin(a);this.set(1,0,0,0,0,b,-a,0,0,a,b,0,0,0,0,1);return this},makeRotationY:function(a){var b=Math.cos(a),a=Math.sin(a);this.set(b,0,a,0,0,1,0,0,-a,0,b,0,0,0,0,1);return this},makeRotationZ:function(a){var b=Math.cos(a),a=Math.sin(a);this.set(b,-a,0,0,a,b,0,0,0,0,1,0,0,0,0,1);
 return this},makeRotationAxis:function(a,b){var c=Math.cos(b),d=Math.sin(b),f=1-c,e=a.x,g=a.y,h=a.z,i=f*e,j=f*g;this.set(i*e+c,i*g-d*h,i*h+d*g,0,i*g+d*h,j*g+c,j*h-d*e,0,i*h-d*g,j*h+d*e,f*h*h+c,0,0,0,0,1);return this},makeScale:function(a,b,c){this.set(a,0,0,0,0,b,0,0,0,0,c,0,0,0,0,1);return this},makeFrustum:function(a,b,c,d,f,e){var g=this.elements;g[0]=2*f/(b-a);g[4]=0;g[8]=(b+a)/(b-a);g[12]=0;g[1]=0;g[5]=2*f/(d-c);g[9]=(d+c)/(d-c);g[13]=0;g[2]=0;g[6]=0;g[10]=-(e+f)/(e-f);g[14]=-2*e*f/(e-f);g[3]=
 0;g[7]=0;g[11]=-1;g[15]=0;return this},makePerspective:function(a,b,c,d){var a=c*Math.tan(a*Math.PI/360),f=-a;return this.makeFrustum(f*b,a*b,f,a,c,d)},makeOrthographic:function(a,b,c,d,f,e){var g=this.elements,h=b-a,i=c-d,j=e-f;g[0]=2/h;g[4]=0;g[8]=0;g[12]=-((b+a)/h);g[1]=0;g[5]=2/i;g[9]=0;g[13]=-((c+d)/i);g[2]=0;g[6]=0;g[10]=-2/j;g[14]=-((e+f)/j);g[3]=0;g[7]=0;g[11]=0;g[15]=1;return this},clone:function(){var a=this.elements;return new THREE.Matrix4(a[0],a[4],a[8],a[12],a[1],a[5],a[9],a[13],a[2],
@@ -58,10 +58,10 @@ THREE.EventTarget=function(){var a={};this.addEventListener=function(b,c){a[b]==
 THREE.Frustum.prototype.setFromMatrix=function(a){var b=this.planes,c=a.elements,a=c[0],d=c[1],f=c[2],e=c[3],g=c[4],h=c[5],i=c[6],j=c[7],l=c[8],m=c[9],n=c[10],q=c[11],o=c[12],p=c[13],s=c[14],c=c[15];b[0].set(e-a,j-g,q-l,c-o);b[1].set(e+a,j+g,q+l,c+o);b[2].set(e+d,j+h,q+m,c+p);b[3].set(e-d,j-h,q-m,c-p);b[4].set(e-f,j-i,q-n,c-s);b[5].set(e+f,j+i,q+n,c+s);for(d=0;d<6;d++){a=b[d];a.divideScalar(Math.sqrt(a.x*a.x+a.y*a.y+a.z*a.z))}};
 THREE.Frustum.prototype.contains=function(a){for(var b=0,c=this.planes,b=a.matrixWorld,d=b.elements,a=-a.geometry.boundingSphere.radius*b.getMaxScaleOnAxis(),f=0;f<6;f++){b=c[f].x*d[12]+c[f].y*d[13]+c[f].z*d[14]+c[f].w;if(b<=a)return false}return true};THREE.Frustum.__v1=new THREE.Vector3;
 (function(a){a.Ray=function(b,c,d,f){this.origin=b||new a.Vector3;this.direction=c||new a.Vector3;this.near=d||0;this.far=f||Infinity};var b=new a.Vector3,c=new a.Vector3,d=new a.Vector3,f=new a.Vector3,e=new a.Vector3,g=new a.Vector3,h=new a.Matrix4,i=function(a,b){return a.distance-b.distance},j=new a.Vector3,l=new a.Vector3,m=new a.Vector3,n=function(a,b,c){j.sub(c,a);var d=j.dot(b),a=l.add(a,m.copy(b).multiplyScalar(d));return c.distanceTo(a)},q=function(a,b,c,d){j.sub(d,b);l.sub(c,b);m.sub(a,
-b);var a=j.dot(j),b=j.dot(l),c=j.dot(m),f=l.dot(l),d=l.dot(m),e=1/(a*f-b*b),f=(f*c-b*d)*e,a=(a*d-b*c)*e;return f>=0&&a>=0&&f+a<1};a.Ray.prototype.precision=1E-4;a.Ray.prototype.intersectObject=function(l,j){var m,r=[],t;if(j===true)for(var v=0,u=l.children.length;v<u;v++)Array.prototype.push.apply(r,this.intersectObject(l.children[v],j));if(l instanceof a.Particle){t=n(this.origin,this.direction,l.matrixWorld.getPosition());if(t>l.scale.x)return r;m={distance:t,point:l.position,face:null,object:l};
-r.push(m)}else if(l instanceof a.Mesh){v=l.geometry.boundingSphere.radius*l.matrixWorld.getMaxScaleOnAxis();t=n(this.origin,this.direction,l.matrixWorld.getPosition());if(t>v)return r;var A,y=l.geometry,B=y.vertices,F,x,E;F=l.geometry.materials;x=l.material instanceof a.MeshFaceMaterial;var G,O=this.precision;l.matrixRotationWorld.extractRotation(l.matrixWorld);b.copy(this.origin);h.getInverse(l.matrixWorld);c.copy(b);h.multiplyVector3(c);d.copy(this.direction);h.rotateAxis(d).normalize();v=0;for(u=
-y.faces.length;v<u;v++){m=y.faces[v];t=x===true?F[m.materialIndex]:l.material;if(t!==void 0){E=t.side;f.sub(m.centroid,c);e=m.normal;t=d.dot(e);if(!(Math.abs(t)<O)){A=e.dot(f)/t;if(!(A<0)&&(E===a.DoubleSide||(E===a.FrontSide?t<0:t>0))){g.add(c,d.multiplyScalar(A));if(m instanceof a.Face3){t=B[m.a];A=B[m.b];E=B[m.c];if(q(g,t,A,E)){A=l.matrixWorld.multiplyVector3(g.clone());t=b.distanceTo(A);if(!(t<this.near||t>this.far)){m={distance:t,point:A,face:m,faceIndex:v,object:l};r.push(m)}}}else if(m instanceof
-a.Face4){t=B[m.a];A=B[m.b];E=B[m.c];G=B[m.d];if(q(g,t,A,G)||q(g,A,E,G)){A=l.matrixWorld.multiplyVector3(g.clone());t=b.distanceTo(A);if(!(t<this.near||t>this.far)){m={distance:t,point:A,face:m,faceIndex:v,object:l};r.push(m)}}}}}}}}r.sort(i);return r};a.Ray.prototype.intersectObjects=function(a,b){for(var c=[],d=0,f=a.length;d<f;d++)Array.prototype.push.apply(c,this.intersectObject(a[d],b));c.sort(i);return c}})(THREE);
+b);var a=j.dot(j),b=j.dot(l),c=j.dot(m),f=l.dot(l),d=l.dot(m),e=1/(a*f-b*b),f=(f*c-b*d)*e,a=(a*d-b*c)*e;return f>=0&&a>=0&&f+a<1},o=function(i,l,j){var m,o;if(i instanceof a.Particle){m=n(l.origin,l.direction,i.matrixWorld.getPosition());if(m>i.scale.x)return j;o={distance:m,point:i.position,face:null,object:i};j.push(o)}else if(i instanceof a.Mesh){var p=i.geometry.boundingSphere.radius*i.matrixWorld.getMaxScaleOnAxis();m=n(l.origin,l.direction,i.matrixWorld.getPosition());if(m>p)return j;var y,
+B,E=i.geometry,w=E.vertices,I,G,O;I=i.geometry.materials;G=i.material instanceof a.MeshFaceMaterial;var F,K=l.precision;i.matrixRotationWorld.extractRotation(i.matrixWorld);b.copy(l.origin);h.getInverse(i.matrixWorld);c.copy(b);h.multiplyVector3(c);d.copy(l.direction);h.rotateAxis(d).normalize();p=0;for(y=E.faces.length;p<y;p++){o=E.faces[p];m=G===true?I[o.materialIndex]:i.material;if(m!==void 0){O=m.side;f.sub(o.centroid,c);e=o.normal;m=d.dot(e);if(!(Math.abs(m)<K)){B=e.dot(f)/m;if(!(B<0)&&(O===
+a.DoubleSide||(O===a.FrontSide?m<0:m>0))){g.add(c,d.multiplyScalar(B));if(o instanceof a.Face3){m=w[o.a];B=w[o.b];O=w[o.c];if(q(g,m,B,O)){B=i.matrixWorld.multiplyVector3(g.clone());m=b.distanceTo(B);if(!(m<l.near||m>l.far)){o={distance:m,point:B,face:o,faceIndex:p,object:i};j.push(o)}}}else if(o instanceof a.Face4){m=w[o.a];B=w[o.b];O=w[o.c];F=w[o.d];if(q(g,m,B,F)||q(g,B,O,F)){B=i.matrixWorld.multiplyVector3(g.clone());m=b.distanceTo(B);if(!(m<l.near||m>l.far)){o={distance:m,point:B,face:o,faceIndex:p,
+object:i};j.push(o)}}}}}}}}},p=function(a,b,c){for(var a=a.getDescendants(),b=0,d=a.length;b<d;b++)o(a[b],this,c)};a.Ray.prototype.precision=1E-4;a.Ray.prototype.intersectObject=function(a,b){var c=[];b===true&&p(a,this,c);o(a,this,c);c.sort(i);return c};a.Ray.prototype.intersectObjects=function(a,b){for(var c=[],d=0,f=a.length;d<f;d++){o(a[d],this,c);b===true&&p(a[d],this,c)}c.sort(i);return c}})(THREE);
 THREE.Rectangle=function(){function a(){e=d-b;g=f-c}var b=0,c=0,d=0,f=0,e=0,g=0,h=true;this.getX=function(){return b};this.getY=function(){return c};this.getWidth=function(){return e};this.getHeight=function(){return g};this.getLeft=function(){return b};this.getTop=function(){return c};this.getRight=function(){return d};this.getBottom=function(){return f};this.set=function(e,g,l,m){h=false;b=e;c=g;d=l;f=m;a()};this.addPoint=function(e,g){if(h===true){h=false;b=e;c=g;d=e;f=g}else{b=b<e?b:e;c=c<g?c:
 g;d=d>e?d:e;f=f>g?f:g}a()};this.add3Points=function(e,g,l,m,n,q){if(h===true){h=false;b=e<l?e<n?e:n:l<n?l:n;c=g<m?g<q?g:q:m<q?m:q;d=e>l?e>n?e:n:l>n?l:n;f=g>m?g>q?g:q:m>q?m:q}else{b=e<l?e<n?e<b?e:b:n<b?n:b:l<n?l<b?l:b:n<b?n:b;c=g<m?g<q?g<c?g:c:q<c?q:c:m<q?m<c?m:c:q<c?q:c;d=e>l?e>n?e>d?e:d:n>d?n:d:l>n?l>d?l:d:n>d?n:d;f=g>m?g>q?g>f?g:f:q>f?q:f:m>q?m>f?m:f:q>f?q:f}a()};this.addRectangle=function(e){if(h===true){h=false;b=e.getLeft();c=e.getTop();d=e.getRight();f=e.getBottom()}else{b=b<e.getLeft()?b:e.getLeft();
 c=c<e.getTop()?c:e.getTop();d=d>e.getRight()?d:e.getRight();f=f>e.getBottom()?f:e.getBottom()}a()};this.inflate=function(e){b=b-e;c=c-e;d=d+e;f=f+e;a()};this.minSelf=function(e){b=b>e.getLeft()?b:e.getLeft();c=c>e.getTop()?c:e.getTop();d=d<e.getRight()?d:e.getRight();f=f<e.getBottom()?f:e.getBottom();a()};this.intersects=function(a){return d<a.getLeft()||b>a.getRight()||f<a.getTop()||c>a.getBottom()?false:true};this.empty=function(){h=true;f=d=c=b=0;a()};this.isEmpty=function(){return h}};
@@ -75,17 +75,17 @@ this.children);for(var b=0,c=this.children.length;b<c;b++)this.children[b].getDe
 true},updateMatrixWorld:function(a){this.matrixAutoUpdate===true&&this.updateMatrix();if(this.matrixWorldNeedsUpdate===true||a===true){this.parent!==void 0?this.matrixWorld.multiply(this.parent.matrixWorld,this.matrix):this.matrixWorld.copy(this.matrix);this.matrixWorldNeedsUpdate=false;a=true}for(var b=0,c=this.children.length;b<c;b++)this.children[b].updateMatrixWorld(a)},worldToLocal:function(a){return THREE.Object3D.__m1.getInverse(this.matrixWorld).multiplyVector3(a)},localToWorld:function(a){return this.matrixWorld.multiplyVector3(a)},
 clone:function(){}};THREE.Object3D.__m1=new THREE.Matrix4;THREE.Object3DCount=0;
 THREE.Projector=function(){function a(){if(e===h){var a=new THREE.RenderableObject;g.push(a);h++;e++;return a}return g[e++]}function b(){if(j===m){var a=new THREE.RenderableVertex;l.push(a);m++;j++;return a}return l[j++]}function c(a,b){return b.z-a.z}function d(a,b){var c=0,d=1,f=a.z+a.w,e=b.z+b.w,g=-a.z+a.w,h=-b.z+b.w;if(f>=0&&e>=0&&g>=0&&h>=0)return true;if(f<0&&e<0||g<0&&h<0)return false;f<0?c=Math.max(c,f/(f-e)):e<0&&(d=Math.min(d,f/(f-e)));g<0?c=Math.max(c,g/(g-h)):h<0&&(d=Math.min(d,g/(g-h)));
-if(d<c)return false;a.lerpSelf(b,c);b.lerpSelf(a,1-d);return true}var f,e,g=[],h=0,i,j,l=[],m=0,n,q,o=[],p=0,s,r=[],t=0,v,u,A=[],y=0,B,F,x=[],E=0,G={objects:[],sprites:[],lights:[],elements:[]},O=new THREE.Vector3,J=new THREE.Vector4,N=new THREE.Matrix4,C=new THREE.Matrix4,I=new THREE.Frustum,Q=new THREE.Vector4,K=new THREE.Vector4;this.projectVector=function(a,b){b.matrixWorldInverse.getInverse(b.matrixWorld);N.multiply(b.projectionMatrix,b.matrixWorldInverse);N.multiplyVector3(a);return a};this.unprojectVector=
-function(a,b){b.projectionMatrixInverse.getInverse(b.projectionMatrix);N.multiply(b.matrixWorld,b.projectionMatrixInverse);N.multiplyVector3(a);return a};this.pickingRay=function(a,b){var c;a.z=-1;c=new THREE.Vector3(a.x,a.y,1);this.unprojectVector(a,b);this.unprojectVector(c,b);c.subSelf(a).normalize();return new THREE.Ray(a,c)};this.projectScene=function(g,h,m){var L=h.near,ea=h.far,qa=false,ha,na,ba,aa,M,Y,ga,ra,oa,ta,Da,Ja,Sa,wa,db,Qa,Za;F=u=s=q=0;G.elements.length=0;g.updateMatrixWorld();h.parent===
-void 0&&h.updateMatrixWorld();h.matrixWorldInverse.getInverse(h.matrixWorld);N.multiply(h.projectionMatrix,h.matrixWorldInverse);I.setFromMatrix(N);e=0;G.objects.length=0;G.sprites.length=0;G.lights.length=0;var eb=function(b){if(b.visible!==false){if((b instanceof THREE.Mesh||b instanceof THREE.Line)&&(b.frustumCulled===false||I.contains(b)===true)){O.copy(b.matrixWorld.getPosition());N.multiplyVector3(O);f=a();f.object=b;f.z=O.z;G.objects.push(f)}else if(b instanceof THREE.Sprite||b instanceof THREE.Particle){O.copy(b.matrixWorld.getPosition());
-N.multiplyVector3(O);f=a();f.object=b;f.z=O.z;G.sprites.push(f)}else b instanceof THREE.Light&&G.lights.push(b);for(var c=0,d=b.children.length;c<d;c++)eb(b.children[c])}};eb(g);g=0;for(ha=G.objects.length;g<ha;g++){oa=G.objects[g].object;ta=oa.matrixWorld;j=0;if(oa instanceof THREE.Mesh){Da=oa.geometry;Ja=oa.geometry.materials;aa=Da.vertices;Sa=Da.faces;db=Da.faceVertexUvs;Da=oa.matrixRotationWorld.extractRotation(ta);Za=oa.material instanceof THREE.MeshFaceMaterial;na=0;for(ba=aa.length;na<ba;na++){i=
-b();i.positionWorld.copy(aa[na]);ta.multiplyVector3(i.positionWorld);i.positionScreen.copy(i.positionWorld);N.multiplyVector4(i.positionScreen);i.positionScreen.x=i.positionScreen.x/i.positionScreen.w;i.positionScreen.y=i.positionScreen.y/i.positionScreen.w;i.visible=i.positionScreen.z>L&&i.positionScreen.z<ea}aa=0;for(na=Sa.length;aa<na;aa++){ra=Sa[aa];ba=Za===true?Ja[ra.materialIndex]:oa.material;if(ba!==void 0){ga=ba.side;if(ra instanceof THREE.Face3){M=l[ra.a];Y=l[ra.b];wa=l[ra.c];if(M.visible===
-true&&Y.visible===true&&wa.visible===true){qa=(wa.positionScreen.x-M.positionScreen.x)*(Y.positionScreen.y-M.positionScreen.y)-(wa.positionScreen.y-M.positionScreen.y)*(Y.positionScreen.x-M.positionScreen.x)<0;if(ga===THREE.DoubleSide||qa===(ga===THREE.FrontSide)){if(q===p){Qa=new THREE.RenderableFace3;o.push(Qa);p++;q++;n=Qa}else n=o[q++];n.v1.copy(M);n.v2.copy(Y);n.v3.copy(wa)}else continue}else continue}else if(ra instanceof THREE.Face4){M=l[ra.a];Y=l[ra.b];wa=l[ra.c];Qa=l[ra.d];if(M.visible===
-true&&Y.visible===true&&wa.visible===true&&Qa.visible===true){qa=(Qa.positionScreen.x-M.positionScreen.x)*(Y.positionScreen.y-M.positionScreen.y)-(Qa.positionScreen.y-M.positionScreen.y)*(Y.positionScreen.x-M.positionScreen.x)<0||(Y.positionScreen.x-wa.positionScreen.x)*(Qa.positionScreen.y-wa.positionScreen.y)-(Y.positionScreen.y-wa.positionScreen.y)*(Qa.positionScreen.x-wa.positionScreen.x)<0;if(ga===THREE.DoubleSide||qa===(ga===THREE.FrontSide)){if(s===t){var kb=new THREE.RenderableFace4;r.push(kb);
-t++;s++;n=kb}else n=r[s++];n.v1.copy(M);n.v2.copy(Y);n.v3.copy(wa);n.v4.copy(Qa)}else continue}else continue}n.normalWorld.copy(ra.normal);qa===false&&(ga===THREE.BackSide||ga===THREE.DoubleSide)&&n.normalWorld.negate();Da.multiplyVector3(n.normalWorld);n.centroidWorld.copy(ra.centroid);ta.multiplyVector3(n.centroidWorld);n.centroidScreen.copy(n.centroidWorld);N.multiplyVector3(n.centroidScreen);ra=ra.vertexNormals;M=0;for(Y=ra.length;M<Y;M++){wa=n.vertexNormalsWorld[M];wa.copy(ra[M]);qa===false&&
-(ga===THREE.BackSide||ga===THREE.DoubleSide)&&wa.negate();Da.multiplyVector3(wa)}n.vertexNormalsLength=ra.length;M=0;for(Y=db.length;M<Y;M++){wa=db[M][aa];if(wa!==void 0){ga=0;for(ra=wa.length;ga<ra;ga++)n.uvs[M][ga]=wa[ga]}}n.material=ba;n.z=n.centroidScreen.z;G.elements.push(n)}}}else if(oa instanceof THREE.Line){C.multiply(N,ta);aa=oa.geometry.vertices;M=b();M.positionScreen.copy(aa[0]);C.multiplyVector4(M.positionScreen);ta=oa.type===THREE.LinePieces?2:1;na=1;for(ba=aa.length;na<ba;na++){M=b();
-M.positionScreen.copy(aa[na]);C.multiplyVector4(M.positionScreen);if(!((na+1)%ta>0)){Y=l[j-2];Q.copy(M.positionScreen);K.copy(Y.positionScreen);if(d(Q,K)===true){Q.multiplyScalar(1/Q.w);K.multiplyScalar(1/K.w);if(u===y){Ja=new THREE.RenderableLine;A.push(Ja);y++;u++;v=Ja}else v=A[u++];v.v1.positionScreen.copy(Q);v.v2.positionScreen.copy(K);v.z=Math.max(Q.z,K.z);v.material=oa.material;G.elements.push(v)}}}}}g=0;for(ha=G.sprites.length;g<ha;g++){oa=G.sprites[g].object;ta=oa.matrixWorld;if(oa instanceof
-THREE.Particle){J.set(ta.elements[12],ta.elements[13],ta.elements[14],1);N.multiplyVector4(J);J.z=J.z/J.w;if(J.z>0&&J.z<1){if(F===E){L=new THREE.RenderableParticle;x.push(L);E++;F++;B=L}else B=x[F++];B.object=oa;B.x=J.x/J.w;B.y=J.y/J.w;B.z=J.z;B.rotation=oa.rotation.z;B.scale.x=oa.scale.x*Math.abs(B.x-(J.x+h.projectionMatrix.elements[0])/(J.w+h.projectionMatrix.elements[12]));B.scale.y=oa.scale.y*Math.abs(B.y-(J.y+h.projectionMatrix.elements[5])/(J.w+h.projectionMatrix.elements[13]));B.material=oa.material;
+if(d<c)return false;a.lerpSelf(b,c);b.lerpSelf(a,1-d);return true}var f,e,g=[],h=0,i,j,l=[],m=0,n,q,o=[],p=0,s,r=[],u=0,v,t,A=[],y=0,B,E,w=[],I=0,G={objects:[],sprites:[],lights:[],elements:[]},O=new THREE.Vector3,F=new THREE.Vector4,K=new THREE.Matrix4,C=new THREE.Matrix4,J=new THREE.Frustum,Q=new THREE.Vector4,L=new THREE.Vector4;this.projectVector=function(a,b){b.matrixWorldInverse.getInverse(b.matrixWorld);K.multiply(b.projectionMatrix,b.matrixWorldInverse);K.multiplyVector3(a);return a};this.unprojectVector=
+function(a,b){b.projectionMatrixInverse.getInverse(b.projectionMatrix);K.multiply(b.matrixWorld,b.projectionMatrixInverse);K.multiplyVector3(a);return a};this.pickingRay=function(a,b){var c;a.z=-1;c=new THREE.Vector3(a.x,a.y,1);this.unprojectVector(a,b);this.unprojectVector(c,b);c.subSelf(a).normalize();return new THREE.Ray(a,c)};this.projectScene=function(g,h,m){var M=h.near,ea=h.far,qa=false,ha,na,ba,aa,N,Y,ga,ra,oa,ta,Da,Ja,Sa,wa,db,Qa,Za;E=t=s=q=0;G.elements.length=0;g.updateMatrixWorld();h.parent===
+void 0&&h.updateMatrixWorld();h.matrixWorldInverse.getInverse(h.matrixWorld);K.multiply(h.projectionMatrix,h.matrixWorldInverse);J.setFromMatrix(K);e=0;G.objects.length=0;G.sprites.length=0;G.lights.length=0;var eb=function(b){if(b.visible!==false){if((b instanceof THREE.Mesh||b instanceof THREE.Line)&&(b.frustumCulled===false||J.contains(b)===true)){O.copy(b.matrixWorld.getPosition());K.multiplyVector3(O);f=a();f.object=b;f.z=O.z;G.objects.push(f)}else if(b instanceof THREE.Sprite||b instanceof THREE.Particle){O.copy(b.matrixWorld.getPosition());
+K.multiplyVector3(O);f=a();f.object=b;f.z=O.z;G.sprites.push(f)}else b instanceof THREE.Light&&G.lights.push(b);for(var c=0,d=b.children.length;c<d;c++)eb(b.children[c])}};eb(g);g=0;for(ha=G.objects.length;g<ha;g++){oa=G.objects[g].object;ta=oa.matrixWorld;j=0;if(oa instanceof THREE.Mesh){Da=oa.geometry;Ja=oa.geometry.materials;aa=Da.vertices;Sa=Da.faces;db=Da.faceVertexUvs;Da=oa.matrixRotationWorld.extractRotation(ta);Za=oa.material instanceof THREE.MeshFaceMaterial;na=0;for(ba=aa.length;na<ba;na++){i=
+b();i.positionWorld.copy(aa[na]);ta.multiplyVector3(i.positionWorld);i.positionScreen.copy(i.positionWorld);K.multiplyVector4(i.positionScreen);i.positionScreen.x=i.positionScreen.x/i.positionScreen.w;i.positionScreen.y=i.positionScreen.y/i.positionScreen.w;i.visible=i.positionScreen.z>M&&i.positionScreen.z<ea}aa=0;for(na=Sa.length;aa<na;aa++){ra=Sa[aa];ba=Za===true?Ja[ra.materialIndex]:oa.material;if(ba!==void 0){ga=ba.side;if(ra instanceof THREE.Face3){N=l[ra.a];Y=l[ra.b];wa=l[ra.c];if(N.visible===
+true&&Y.visible===true&&wa.visible===true){qa=(wa.positionScreen.x-N.positionScreen.x)*(Y.positionScreen.y-N.positionScreen.y)-(wa.positionScreen.y-N.positionScreen.y)*(Y.positionScreen.x-N.positionScreen.x)<0;if(ga===THREE.DoubleSide||qa===(ga===THREE.FrontSide)){if(q===p){Qa=new THREE.RenderableFace3;o.push(Qa);p++;q++;n=Qa}else n=o[q++];n.v1.copy(N);n.v2.copy(Y);n.v3.copy(wa)}else continue}else continue}else if(ra instanceof THREE.Face4){N=l[ra.a];Y=l[ra.b];wa=l[ra.c];Qa=l[ra.d];if(N.visible===
+true&&Y.visible===true&&wa.visible===true&&Qa.visible===true){qa=(Qa.positionScreen.x-N.positionScreen.x)*(Y.positionScreen.y-N.positionScreen.y)-(Qa.positionScreen.y-N.positionScreen.y)*(Y.positionScreen.x-N.positionScreen.x)<0||(Y.positionScreen.x-wa.positionScreen.x)*(Qa.positionScreen.y-wa.positionScreen.y)-(Y.positionScreen.y-wa.positionScreen.y)*(Qa.positionScreen.x-wa.positionScreen.x)<0;if(ga===THREE.DoubleSide||qa===(ga===THREE.FrontSide)){if(s===u){var kb=new THREE.RenderableFace4;r.push(kb);
+u++;s++;n=kb}else n=r[s++];n.v1.copy(N);n.v2.copy(Y);n.v3.copy(wa);n.v4.copy(Qa)}else continue}else continue}n.normalWorld.copy(ra.normal);qa===false&&(ga===THREE.BackSide||ga===THREE.DoubleSide)&&n.normalWorld.negate();Da.multiplyVector3(n.normalWorld);n.centroidWorld.copy(ra.centroid);ta.multiplyVector3(n.centroidWorld);n.centroidScreen.copy(n.centroidWorld);K.multiplyVector3(n.centroidScreen);ra=ra.vertexNormals;N=0;for(Y=ra.length;N<Y;N++){wa=n.vertexNormalsWorld[N];wa.copy(ra[N]);qa===false&&
+(ga===THREE.BackSide||ga===THREE.DoubleSide)&&wa.negate();Da.multiplyVector3(wa)}n.vertexNormalsLength=ra.length;N=0;for(Y=db.length;N<Y;N++){wa=db[N][aa];if(wa!==void 0){ga=0;for(ra=wa.length;ga<ra;ga++)n.uvs[N][ga]=wa[ga]}}n.material=ba;n.z=n.centroidScreen.z;G.elements.push(n)}}}else if(oa instanceof THREE.Line){C.multiply(K,ta);aa=oa.geometry.vertices;N=b();N.positionScreen.copy(aa[0]);C.multiplyVector4(N.positionScreen);ta=oa.type===THREE.LinePieces?2:1;na=1;for(ba=aa.length;na<ba;na++){N=b();
+N.positionScreen.copy(aa[na]);C.multiplyVector4(N.positionScreen);if(!((na+1)%ta>0)){Y=l[j-2];Q.copy(N.positionScreen);L.copy(Y.positionScreen);if(d(Q,L)===true){Q.multiplyScalar(1/Q.w);L.multiplyScalar(1/L.w);if(t===y){Ja=new THREE.RenderableLine;A.push(Ja);y++;t++;v=Ja}else v=A[t++];v.v1.positionScreen.copy(Q);v.v2.positionScreen.copy(L);v.z=Math.max(Q.z,L.z);v.material=oa.material;G.elements.push(v)}}}}}g=0;for(ha=G.sprites.length;g<ha;g++){oa=G.sprites[g].object;ta=oa.matrixWorld;if(oa instanceof
+THREE.Particle){F.set(ta.elements[12],ta.elements[13],ta.elements[14],1);K.multiplyVector4(F);F.z=F.z/F.w;if(F.z>0&&F.z<1){if(E===I){M=new THREE.RenderableParticle;w.push(M);I++;E++;B=M}else B=w[E++];B.object=oa;B.x=F.x/F.w;B.y=F.y/F.w;B.z=F.z;B.rotation=oa.rotation.z;B.scale.x=oa.scale.x*Math.abs(B.x-(F.x+h.projectionMatrix.elements[0])/(F.w+h.projectionMatrix.elements[12]));B.scale.y=oa.scale.y*Math.abs(B.y-(F.y+h.projectionMatrix.elements[5])/(F.w+h.projectionMatrix.elements[13]));B.material=oa.material;
 G.elements.push(B)}}}m&&G.elements.sort(c);return G}};THREE.Quaternion=function(a,b,c,d){this.x=a||0;this.y=b||0;this.z=c||0;this.w=d!==void 0?d:1};
 THREE.Quaternion.prototype={constructor:THREE.Quaternion,set:function(a,b,c,d){this.x=a;this.y=b;this.z=c;this.w=d;return this},copy:function(a){this.x=a.x;this.y=a.y;this.z=a.z;this.w=a.w;return this},setFromEuler:function(a,b){var c=Math.cos(a.x/2),d=Math.cos(a.y/2),f=Math.cos(a.z/2),e=Math.sin(a.x/2),g=Math.sin(a.y/2),h=Math.sin(a.z/2);if(b===void 0||b==="XYZ"){this.x=e*d*f+c*g*h;this.y=c*g*f-e*d*h;this.z=c*d*h+e*g*f;this.w=c*d*f-e*g*h}else if(b==="YXZ"){this.x=e*d*f+c*g*h;this.y=c*g*f-e*d*h;this.z=
 c*d*h-e*g*f;this.w=c*d*f+e*g*h}else if(b==="ZXY"){this.x=e*d*f-c*g*h;this.y=c*g*f+e*d*h;this.z=c*d*h+e*g*f;this.w=c*d*f-e*g*h}else if(b==="ZYX"){this.x=e*d*f-c*g*h;this.y=c*g*f+e*d*h;this.z=c*d*h-e*g*f;this.w=c*d*f+e*g*h}else if(b==="YZX"){this.x=e*d*f+c*g*h;this.y=c*g*f+e*d*h;this.z=c*d*h-e*g*f;this.w=c*d*f-e*g*h}else if(b==="XZY"){this.x=e*d*f-c*g*h;this.y=c*g*f-e*d*h;this.z=c*d*h+e*g*f;this.w=c*d*f+e*g*h}return this},setFromAxisAngle:function(a,b){var c=b/2,d=Math.sin(c);this.x=a.x*d;this.y=a.y*
@@ -108,22 +108,22 @@ else if(c instanceof THREE.Face4)c.vertexNormals=[new THREE.Vector3,new THREE.Ve
 for(b=this.vertices.length;a<b;a++)d[a].normalize();a=0;for(b=this.faces.length;a<b;a++){c=this.faces[a];if(c instanceof THREE.Face3){c.vertexNormals[0].copy(d[c.a]);c.vertexNormals[1].copy(d[c.b]);c.vertexNormals[2].copy(d[c.c])}else if(c instanceof THREE.Face4){c.vertexNormals[0].copy(d[c.a]);c.vertexNormals[1].copy(d[c.b]);c.vertexNormals[2].copy(d[c.c]);c.vertexNormals[3].copy(d[c.d])}}},computeMorphNormals:function(){var a,b,c,d,f;c=0;for(d=this.faces.length;c<d;c++){f=this.faces[c];f.__originalFaceNormal?
 f.__originalFaceNormal.copy(f.normal):f.__originalFaceNormal=f.normal.clone();if(!f.__originalVertexNormals)f.__originalVertexNormals=[];a=0;for(b=f.vertexNormals.length;a<b;a++)f.__originalVertexNormals[a]?f.__originalVertexNormals[a].copy(f.vertexNormals[a]):f.__originalVertexNormals[a]=f.vertexNormals[a].clone()}var e=new THREE.Geometry;e.faces=this.faces;a=0;for(b=this.morphTargets.length;a<b;a++){if(!this.morphNormals[a]){this.morphNormals[a]={};this.morphNormals[a].faceNormals=[];this.morphNormals[a].vertexNormals=
 [];var g=this.morphNormals[a].faceNormals,h=this.morphNormals[a].vertexNormals,i,j;c=0;for(d=this.faces.length;c<d;c++){f=this.faces[c];i=new THREE.Vector3;j=f instanceof THREE.Face3?{a:new THREE.Vector3,b:new THREE.Vector3,c:new THREE.Vector3}:{a:new THREE.Vector3,b:new THREE.Vector3,c:new THREE.Vector3,d:new THREE.Vector3};g.push(i);h.push(j)}}g=this.morphNormals[a];e.vertices=this.morphTargets[a].vertices;e.computeFaceNormals();e.computeVertexNormals();c=0;for(d=this.faces.length;c<d;c++){f=this.faces[c];
-i=g.faceNormals[c];j=g.vertexNormals[c];i.copy(f.normal);if(f instanceof THREE.Face3){j.a.copy(f.vertexNormals[0]);j.b.copy(f.vertexNormals[1]);j.c.copy(f.vertexNormals[2])}else{j.a.copy(f.vertexNormals[0]);j.b.copy(f.vertexNormals[1]);j.c.copy(f.vertexNormals[2]);j.d.copy(f.vertexNormals[3])}}}c=0;for(d=this.faces.length;c<d;c++){f=this.faces[c];f.normal=f.__originalFaceNormal;f.vertexNormals=f.__originalVertexNormals}},computeTangents:function(){function a(a,b,c,d,f,e,F){h=a.vertices[b];i=a.vertices[c];
-j=a.vertices[d];l=g[f];m=g[e];n=g[F];q=i.x-h.x;o=j.x-h.x;p=i.y-h.y;s=j.y-h.y;r=i.z-h.z;t=j.z-h.z;v=m.u-l.u;u=n.u-l.u;A=m.v-l.v;y=n.v-l.v;B=1/(v*y-u*A);G.set((y*q-A*o)*B,(y*p-A*s)*B,(y*r-A*t)*B);O.set((v*o-u*q)*B,(v*s-u*p)*B,(v*t-u*r)*B);x[b].addSelf(G);x[c].addSelf(G);x[d].addSelf(G);E[b].addSelf(O);E[c].addSelf(O);E[d].addSelf(O)}var b,c,d,f,e,g,h,i,j,l,m,n,q,o,p,s,r,t,v,u,A,y,B,F,x=[],E=[],G=new THREE.Vector3,O=new THREE.Vector3,J=new THREE.Vector3,N=new THREE.Vector3,C=new THREE.Vector3;b=0;for(c=
-this.vertices.length;b<c;b++){x[b]=new THREE.Vector3;E[b]=new THREE.Vector3}b=0;for(c=this.faces.length;b<c;b++){e=this.faces[b];g=this.faceVertexUvs[0][b];if(e instanceof THREE.Face3)a(this,e.a,e.b,e.c,0,1,2);else if(e instanceof THREE.Face4){a(this,e.a,e.b,e.d,0,1,3);a(this,e.b,e.c,e.d,1,2,3)}}var I=["a","b","c","d"];b=0;for(c=this.faces.length;b<c;b++){e=this.faces[b];for(d=0;d<e.vertexNormals.length;d++){C.copy(e.vertexNormals[d]);f=e[I[d]];F=x[f];J.copy(F);J.subSelf(C.multiplyScalar(C.dot(F))).normalize();
-N.cross(e.vertexNormals[d],F);f=N.dot(E[f]);f=f<0?-1:1;e.vertexTangents[d]=new THREE.Vector4(J.x,J.y,J.z,f)}}this.hasTangents=true},computeBoundingBox:function(){if(!this.boundingBox)this.boundingBox={min:new THREE.Vector3,max:new THREE.Vector3};if(this.vertices.length>0){var a;a=this.vertices[0];this.boundingBox.min.copy(a);this.boundingBox.max.copy(a);for(var b=this.boundingBox.min,c=this.boundingBox.max,d=1,f=this.vertices.length;d<f;d++){a=this.vertices[d];if(a.x<b.x)b.x=a.x;else if(a.x>c.x)c.x=
+i=g.faceNormals[c];j=g.vertexNormals[c];i.copy(f.normal);if(f instanceof THREE.Face3){j.a.copy(f.vertexNormals[0]);j.b.copy(f.vertexNormals[1]);j.c.copy(f.vertexNormals[2])}else{j.a.copy(f.vertexNormals[0]);j.b.copy(f.vertexNormals[1]);j.c.copy(f.vertexNormals[2]);j.d.copy(f.vertexNormals[3])}}}c=0;for(d=this.faces.length;c<d;c++){f=this.faces[c];f.normal=f.__originalFaceNormal;f.vertexNormals=f.__originalVertexNormals}},computeTangents:function(){function a(a,b,c,d,f,e,E){h=a.vertices[b];i=a.vertices[c];
+j=a.vertices[d];l=g[f];m=g[e];n=g[E];q=i.x-h.x;o=j.x-h.x;p=i.y-h.y;s=j.y-h.y;r=i.z-h.z;u=j.z-h.z;v=m.u-l.u;t=n.u-l.u;A=m.v-l.v;y=n.v-l.v;B=1/(v*y-t*A);G.set((y*q-A*o)*B,(y*p-A*s)*B,(y*r-A*u)*B);O.set((v*o-t*q)*B,(v*s-t*p)*B,(v*u-t*r)*B);w[b].addSelf(G);w[c].addSelf(G);w[d].addSelf(G);I[b].addSelf(O);I[c].addSelf(O);I[d].addSelf(O)}var b,c,d,f,e,g,h,i,j,l,m,n,q,o,p,s,r,u,v,t,A,y,B,E,w=[],I=[],G=new THREE.Vector3,O=new THREE.Vector3,F=new THREE.Vector3,K=new THREE.Vector3,C=new THREE.Vector3;b=0;for(c=
+this.vertices.length;b<c;b++){w[b]=new THREE.Vector3;I[b]=new THREE.Vector3}b=0;for(c=this.faces.length;b<c;b++){e=this.faces[b];g=this.faceVertexUvs[0][b];if(e instanceof THREE.Face3)a(this,e.a,e.b,e.c,0,1,2);else if(e instanceof THREE.Face4){a(this,e.a,e.b,e.d,0,1,3);a(this,e.b,e.c,e.d,1,2,3)}}var J=["a","b","c","d"];b=0;for(c=this.faces.length;b<c;b++){e=this.faces[b];for(d=0;d<e.vertexNormals.length;d++){C.copy(e.vertexNormals[d]);f=e[J[d]];E=w[f];F.copy(E);F.subSelf(C.multiplyScalar(C.dot(E))).normalize();
+K.cross(e.vertexNormals[d],E);f=K.dot(I[f]);f=f<0?-1:1;e.vertexTangents[d]=new THREE.Vector4(F.x,F.y,F.z,f)}}this.hasTangents=true},computeBoundingBox:function(){if(!this.boundingBox)this.boundingBox={min:new THREE.Vector3,max:new THREE.Vector3};if(this.vertices.length>0){var a;a=this.vertices[0];this.boundingBox.min.copy(a);this.boundingBox.max.copy(a);for(var b=this.boundingBox.min,c=this.boundingBox.max,d=1,f=this.vertices.length;d<f;d++){a=this.vertices[d];if(a.x<b.x)b.x=a.x;else if(a.x>c.x)c.x=
 a.x;if(a.y<b.y)b.y=a.y;else if(a.y>c.y)c.y=a.y;if(a.z<b.z)b.z=a.z;else if(a.z>c.z)c.z=a.z}}else{this.boundingBox.min.set(0,0,0);this.boundingBox.max.set(0,0,0)}},computeBoundingSphere:function(){var a=0;if(this.boundingSphere===null)this.boundingSphere={radius:0};for(var b=0,c=this.vertices.length;b<c;b++){var d=this.vertices[b].lengthSq();d>a&&(a=d)}this.boundingSphere.radius=Math.sqrt(a)},mergeVertices:function(){var a={},b=[],c=[],d,f=Math.pow(10,4),e,g,h,i;e=0;for(g=this.vertices.length;e<g;e++){d=
 this.vertices[e];d=[Math.round(d.x*f),Math.round(d.y*f),Math.round(d.z*f)].join("_");if(a[d]===void 0){a[d]=e;b.push(this.vertices[e]);c[e]=b.length-1}else c[e]=c[a[d]]}e=0;for(g=this.faces.length;e<g;e++){a=this.faces[e];if(a instanceof THREE.Face3){a.a=c[a.a];a.b=c[a.b];a.c=c[a.c]}else if(a instanceof THREE.Face4){a.a=c[a.a];a.b=c[a.b];a.c=c[a.c];a.d=c[a.d];d=[a.a,a.b,a.c,a.d];for(f=3;f>0;f--)if(d.indexOf(a["abcd"[f]])!==f){d.splice(f,1);this.faces[e]=new THREE.Face3(d[0],d[1],d[2],a.normal,a.color,
 a.materialIndex);d=0;for(h=this.faceVertexUvs.length;d<h;d++)(i=this.faceVertexUvs[d][e])&&i.splice(f,1);this.faces[e].vertexColors=a.vertexColors;break}}}c=this.vertices.length-b.length;this.vertices=b;return c},clone:function(){}};THREE.GeometryCount=0;THREE.BufferGeometry=function(){this.id=THREE.GeometryCount++;this.attributes={};this.dynamic=false;this.boundingSphere=this.boundingBox=null;this.hasTangents=false;this.morphTargets=[]};
 THREE.BufferGeometry.prototype={constructor:THREE.BufferGeometry,applyMatrix:function(a){var b,c;if(this.attributes.position)b=this.attributes.position.array;if(this.attributes.normal)c=this.attributes.normal.array;if(b!==void 0){a.multiplyVector3Array(b);this.verticesNeedUpdate=true}if(c!==void 0){b=new THREE.Matrix4;b.extractRotation(a);b.multiplyVector3Array(c);this.normalsNeedUpdate=true}},computeBoundingBox:function(){if(!this.boundingBox)this.boundingBox={min:new THREE.Vector3(Infinity,Infinity,
 Infinity),max:new THREE.Vector3(-Infinity,-Infinity,-Infinity)};var a=this.attributes.position.array;if(a)for(var b=this.boundingBox,c,d,f,e=0,g=a.length;e<g;e=e+3){c=a[e];d=a[e+1];f=a[e+2];if(c<b.min.x)b.min.x=c;else if(c>b.max.x)b.max.x=c;if(d<b.min.y)b.min.y=d;else if(d>b.max.y)b.max.y=d;if(f<b.min.z)b.min.z=f;else if(f>b.max.z)b.max.z=f}if(a===void 0||a.length===0){this.boundingBox.min.set(0,0,0);this.boundingBox.max.set(0,0,0)}},computeBoundingSphere:function(){if(!this.boundingSphere)this.boundingSphere=
 {radius:0};var a=this.attributes.position.array;if(a){for(var b,c=0,d,f,e=0,g=a.length;e<g;e=e+3){b=a[e];d=a[e+1];f=a[e+2];b=b*b+d*d+f*f;b>c&&(c=b)}this.boundingSphere.radius=Math.sqrt(c)}},computeVertexNormals:function(){if(this.attributes.position&&this.attributes.index){var a,b,c,d;a=this.attributes.position.array.length;if(this.attributes.normal===void 0)this.attributes.normal={itemSize:3,array:new Float32Array(a),numItems:a};else{a=0;for(b=this.attributes.normal.array.length;a<b;a++)this.attributes.normal.array[a]=
-0}var f=this.offsets,e=this.attributes.index.array,g=this.attributes.position.array,h=this.attributes.normal.array,i,j,l,m,n,q,o=new THREE.Vector3,p=new THREE.Vector3,s=new THREE.Vector3,r=new THREE.Vector3,t=new THREE.Vector3;c=0;for(d=f.length;c<d;++c){b=f[c].start;i=f[c].count;var v=f[c].index;a=b;for(b=b+i;a<b;a=a+3){i=v+e[a];j=v+e[a+1];l=v+e[a+2];m=g[i*3];n=g[i*3+1];q=g[i*3+2];o.set(m,n,q);m=g[j*3];n=g[j*3+1];q=g[j*3+2];p.set(m,n,q);m=g[l*3];n=g[l*3+1];q=g[l*3+2];s.set(m,n,q);r.sub(s,p);t.sub(o,
-p);r.crossSelf(t);h[i*3]=h[i*3]+r.x;h[i*3+1]=h[i*3+1]+r.y;h[i*3+2]=h[i*3+2]+r.z;h[j*3]=h[j*3]+r.x;h[j*3+1]=h[j*3+1]+r.y;h[j*3+2]=h[j*3+2]+r.z;h[l*3]=h[l*3]+r.x;h[l*3+1]=h[l*3+1]+r.y;h[l*3+2]=h[l*3+2]+r.z}}a=0;for(b=h.length;a<b;a=a+3){m=h[a];n=h[a+1];q=h[a+2];c=1/Math.sqrt(m*m+n*n+q*q);h[a]=h[a]*c;h[a+1]=h[a+1]*c;h[a+2]=h[a+2]*c}this.normalsNeedUpdate=true}},computeTangents:function(){function a(a){X.x=d[a*3];X.y=d[a*3+1];X.z=d[a*3+2];P.copy(X);ea=i[a];K.copy(ea);K.subSelf(X.multiplyScalar(X.dot(ea))).normalize();
-H.cross(P,ea);qa=H.dot(j[a]);L=qa<0?-1:1;h[a*4]=K.x;h[a*4+1]=K.y;h[a*4+2]=K.z;h[a*4+3]=L}if(this.attributes.index===void 0||this.attributes.position===void 0||this.attributes.normal===void 0||this.attributes.uv===void 0)console.warn("Missing required attributes (index, position, normal or uv) in BufferGeometry.computeTangents()");else{var b=this.attributes.index.array,c=this.attributes.position.array,d=this.attributes.normal.array,f=this.attributes.uv.array,e=c.length/3;if(this.attributes.tangent===
-void 0){var g=4*e;this.attributes.tangent={itemSize:4,array:new Float32Array(g),numItems:g}}for(var h=this.attributes.tangent.array,i=[],j=[],g=0;g<e;g++){i[g]=new THREE.Vector3;j[g]=new THREE.Vector3}var l,m,n,q,o,p,s,r,t,v,u,A,y,B,F,e=new THREE.Vector3,g=new THREE.Vector3,x,E,G,O,J,N,C,I=this.offsets;G=0;for(O=I.length;G<O;++G){E=I[G].start;J=I[G].count;var Q=I[G].index;x=E;for(E=E+J;x<E;x=x+3){J=Q+b[x];N=Q+b[x+1];C=Q+b[x+2];l=c[J*3];m=c[J*3+1];n=c[J*3+2];q=c[N*3];o=c[N*3+1];p=c[N*3+2];s=c[C*3];
-r=c[C*3+1];t=c[C*3+2];v=f[J*2];u=f[J*2+1];A=f[N*2];y=f[N*2+1];B=f[C*2];F=f[C*2+1];q=q-l;l=s-l;o=o-m;m=r-m;p=p-n;n=t-n;A=A-v;v=B-v;y=y-u;u=F-u;F=1/(A*u-v*y);e.set((u*q-y*l)*F,(u*o-y*m)*F,(u*p-y*n)*F);g.set((A*l-v*q)*F,(A*m-v*o)*F,(A*n-v*p)*F);i[J].addSelf(e);i[N].addSelf(e);i[C].addSelf(e);j[J].addSelf(g);j[N].addSelf(g);j[C].addSelf(g)}}var K=new THREE.Vector3,H=new THREE.Vector3,X=new THREE.Vector3,P=new THREE.Vector3,L,ea,qa;G=0;for(O=I.length;G<O;++G){E=I[G].start;J=I[G].count;Q=I[G].index;x=E;
-for(E=E+J;x<E;x=x+3){J=Q+b[x];N=Q+b[x+1];C=Q+b[x+2];a(J);a(N);a(C)}}this.tangentsNeedUpdate=this.hasTangents=true}}};
+0}var f=this.offsets,e=this.attributes.index.array,g=this.attributes.position.array,h=this.attributes.normal.array,i,j,l,m,n,q,o=new THREE.Vector3,p=new THREE.Vector3,s=new THREE.Vector3,r=new THREE.Vector3,u=new THREE.Vector3;c=0;for(d=f.length;c<d;++c){b=f[c].start;i=f[c].count;var v=f[c].index;a=b;for(b=b+i;a<b;a=a+3){i=v+e[a];j=v+e[a+1];l=v+e[a+2];m=g[i*3];n=g[i*3+1];q=g[i*3+2];o.set(m,n,q);m=g[j*3];n=g[j*3+1];q=g[j*3+2];p.set(m,n,q);m=g[l*3];n=g[l*3+1];q=g[l*3+2];s.set(m,n,q);r.sub(s,p);u.sub(o,
+p);r.crossSelf(u);h[i*3]=h[i*3]+r.x;h[i*3+1]=h[i*3+1]+r.y;h[i*3+2]=h[i*3+2]+r.z;h[j*3]=h[j*3]+r.x;h[j*3+1]=h[j*3+1]+r.y;h[j*3+2]=h[j*3+2]+r.z;h[l*3]=h[l*3]+r.x;h[l*3+1]=h[l*3+1]+r.y;h[l*3+2]=h[l*3+2]+r.z}}a=0;for(b=h.length;a<b;a=a+3){m=h[a];n=h[a+1];q=h[a+2];c=1/Math.sqrt(m*m+n*n+q*q);h[a]=h[a]*c;h[a+1]=h[a+1]*c;h[a+2]=h[a+2]*c}this.normalsNeedUpdate=true}},computeTangents:function(){function a(a){X.x=d[a*3];X.y=d[a*3+1];X.z=d[a*3+2];P.copy(X);ea=i[a];L.copy(ea);L.subSelf(X.multiplyScalar(X.dot(ea))).normalize();
+H.cross(P,ea);qa=H.dot(j[a]);M=qa<0?-1:1;h[a*4]=L.x;h[a*4+1]=L.y;h[a*4+2]=L.z;h[a*4+3]=M}if(this.attributes.index===void 0||this.attributes.position===void 0||this.attributes.normal===void 0||this.attributes.uv===void 0)console.warn("Missing required attributes (index, position, normal or uv) in BufferGeometry.computeTangents()");else{var b=this.attributes.index.array,c=this.attributes.position.array,d=this.attributes.normal.array,f=this.attributes.uv.array,e=c.length/3;if(this.attributes.tangent===
+void 0){var g=4*e;this.attributes.tangent={itemSize:4,array:new Float32Array(g),numItems:g}}for(var h=this.attributes.tangent.array,i=[],j=[],g=0;g<e;g++){i[g]=new THREE.Vector3;j[g]=new THREE.Vector3}var l,m,n,q,o,p,s,r,u,v,t,A,y,B,E,e=new THREE.Vector3,g=new THREE.Vector3,w,I,G,O,F,K,C,J=this.offsets;G=0;for(O=J.length;G<O;++G){I=J[G].start;F=J[G].count;var Q=J[G].index;w=I;for(I=I+F;w<I;w=w+3){F=Q+b[w];K=Q+b[w+1];C=Q+b[w+2];l=c[F*3];m=c[F*3+1];n=c[F*3+2];q=c[K*3];o=c[K*3+1];p=c[K*3+2];s=c[C*3];
+r=c[C*3+1];u=c[C*3+2];v=f[F*2];t=f[F*2+1];A=f[K*2];y=f[K*2+1];B=f[C*2];E=f[C*2+1];q=q-l;l=s-l;o=o-m;m=r-m;p=p-n;n=u-n;A=A-v;v=B-v;y=y-t;t=E-t;E=1/(A*t-v*y);e.set((t*q-y*l)*E,(t*o-y*m)*E,(t*p-y*n)*E);g.set((A*l-v*q)*E,(A*m-v*o)*E,(A*n-v*p)*E);i[F].addSelf(e);i[K].addSelf(e);i[C].addSelf(e);j[F].addSelf(g);j[K].addSelf(g);j[C].addSelf(g)}}var L=new THREE.Vector3,H=new THREE.Vector3,X=new THREE.Vector3,P=new THREE.Vector3,M,ea,qa;G=0;for(O=J.length;G<O;++G){I=J[G].start;F=J[G].count;Q=J[G].index;w=I;
+for(I=I+F;w<I;w=w+3){F=Q+b[w];K=Q+b[w+1];C=Q+b[w+2];a(F);a(K);a(C)}}this.tangentsNeedUpdate=this.hasTangents=true}}};
 THREE.Spline=function(a){function b(a,b,c,d,f,e,g){a=(c-a)*0.5;d=(d-b)*0.5;return(2*(b-c)+a+d)*g+(-3*(b-c)-2*a-d)*e+a*f+b}this.points=a;var c=[],d={x:0,y:0,z:0},f,e,g,h,i,j,l,m,n;this.initFromArray=function(a){this.points=[];for(var b=0;b<a.length;b++)this.points[b]={x:a[b][0],y:a[b][1],z:a[b][2]}};this.getPoint=function(a){f=(this.points.length-1)*a;e=Math.floor(f);g=f-e;c[0]=e===0?e:e-1;c[1]=e;c[2]=e>this.points.length-2?this.points.length-1:e+1;c[3]=e>this.points.length-3?this.points.length-1:
 e+2;j=this.points[c[0]];l=this.points[c[1]];m=this.points[c[2]];n=this.points[c[3]];h=g*g;i=g*h;d.x=b(j.x,l.x,m.x,n.x,g,h,i);d.y=b(j.y,l.y,m.y,n.y,g,h,i);d.z=b(j.z,l.z,m.z,n.z,g,h,i);return d};this.getControlPointsArray=function(){var a,b,c=this.points.length,d=[];for(a=0;a<c;a++){b=this.points[a];d[a]=[b.x,b.y,b.z]}return d};this.getLength=function(a){var b,c,d,f=b=b=0,e=new THREE.Vector3,g=new THREE.Vector3,h=[],i=0;h[0]=0;a||(a=100);c=this.points.length*a;e.copy(this.points[0]);for(a=1;a<c;a++){b=
 a/c;d=this.getPoint(b);g.copy(d);i=i+g.distanceTo(e);e.copy(d);b=(this.points.length-1)*b;b=Math.floor(b);if(b!=f){h[b]=i;f=b}}h[h.length]=i;return{chunks:h,total:i}};this.reparametrizeByArcLength=function(a){var b,c,d,f,e,g,h=[],i=new THREE.Vector3,l=this.getLength();h.push(i.copy(this.points[0]).clone());for(b=1;b<this.points.length;b++){c=l.chunks[b]-l.chunks[b-1];g=Math.ceil(a*c/l.total);f=(b-1)/(this.points.length-1);e=b/(this.points.length-1);for(c=1;c<g-1;c++){d=f+c*(1/g)*(e-f);d=this.getPoint(d);
@@ -150,24 +150,24 @@ uniforms:j,lights:true,fog:true})}else i=new THREE[h](i);if(a.DbgName!==void 0)i
 THREE.BinaryLoader.prototype.loadAjaxJSON=function(a,b,c,d,f,e){var g=new XMLHttpRequest;g.onreadystatechange=function(){if(g.readyState==4)if(g.status==200||g.status==0){var h=JSON.parse(g.responseText);a.loadAjaxBuffers(h,c,f,d,e)}else console.error("THREE.BinaryLoader: Couldn't load ["+b+"] ["+g.status+"]")};g.open("GET",b,true);g.overrideMimeType&&g.overrideMimeType("text/plain; charset=x-user-defined");g.setRequestHeader("Content-Type","text/plain");g.send(null)};
 THREE.BinaryLoader.prototype.loadAjaxBuffers=function(a,b,c,d,f){var e=new XMLHttpRequest,g=c+"/"+a.buffers,h=0;e.onreadystatechange=function(){if(e.readyState==4)if(e.status==200||e.status==0){var c=e.response;if(c===void 0)c=(new Uint8Array(e.responseBody)).buffer;THREE.BinaryLoader.prototype.createBinModel(c,b,d,a.materials)}else console.error("THREE.BinaryLoader: Couldn't load ["+g+"] ["+e.status+"]");else if(e.readyState==3){if(f){h==0&&(h=e.getResponseHeader("Content-Length"));f({total:h,loaded:e.responseText.length})}}else e.readyState==
 2&&(h=e.getResponseHeader("Content-Length"))};e.open("GET",g,true);e.responseType="arraybuffer";e.send(null)};
-THREE.BinaryLoader.prototype.createBinModel=function(a,b,c,d){var f=function(b){var c,f,i,j,l,m,n,q,o,p,s,r,t,v,u;function A(a){return a%4?4-a%4:0}function y(a,b){return(new Uint8Array(a,b,1))[0]}function B(a,b){return(new Uint32Array(a,b,1))[0]}function F(b,c){var d,f,e,g,h,i,l,j,m=new Uint32Array(a,c,3*b);for(d=0;d<b;d++){f=m[d*3];e=m[d*3+1];g=m[d*3+2];h=Q[f*2];f=Q[f*2+1];i=Q[e*2];l=Q[e*2+1];e=Q[g*2];j=Q[g*2+1];g=N.faceVertexUvs[0];var n=[];n.push(new THREE.UV(h,f));n.push(new THREE.UV(i,l));n.push(new THREE.UV(e,
-j));g.push(n)}}function x(b,c){var d,f,e,g,h,i,l,j,m,n,p=new Uint32Array(a,c,4*b);for(d=0;d<b;d++){f=p[d*4];e=p[d*4+1];g=p[d*4+2];h=p[d*4+3];i=Q[f*2];f=Q[f*2+1];l=Q[e*2];m=Q[e*2+1];j=Q[g*2];n=Q[g*2+1];g=Q[h*2];e=Q[h*2+1];h=N.faceVertexUvs[0];var o=[];o.push(new THREE.UV(i,f));o.push(new THREE.UV(l,m));o.push(new THREE.UV(j,n));o.push(new THREE.UV(g,e));h.push(o)}}function E(b,c,d){for(var f,e,g,h,c=new Uint32Array(a,c,3*b),i=new Uint16Array(a,d,b),d=0;d<b;d++){f=c[d*3];e=c[d*3+1];g=c[d*3+2];h=i[d];
-N.faces.push(new THREE.Face3(f,e,g,null,null,h))}}function G(b,c,d){for(var f,e,g,h,i,c=new Uint32Array(a,c,4*b),l=new Uint16Array(a,d,b),d=0;d<b;d++){f=c[d*4];e=c[d*4+1];g=c[d*4+2];h=c[d*4+3];i=l[d];N.faces.push(new THREE.Face4(f,e,g,h,null,null,i))}}function O(b,c,d,f){for(var e,g,h,i,l,j,m,c=new Uint32Array(a,c,3*b),d=new Uint32Array(a,d,3*b),n=new Uint16Array(a,f,b),f=0;f<b;f++){e=c[f*3];g=c[f*3+1];h=c[f*3+2];l=d[f*3];j=d[f*3+1];m=d[f*3+2];i=n[f];var p=I[j*3],o=I[j*3+1];j=I[j*3+2];var q=I[m*3],
-r=I[m*3+1];m=I[m*3+2];N.faces.push(new THREE.Face3(e,g,h,[new THREE.Vector3(I[l*3],I[l*3+1],I[l*3+2]),new THREE.Vector3(p,o,j),new THREE.Vector3(q,r,m)],null,i))}}function J(b,c,d,f){for(var e,g,h,i,l,j,m,n,p,c=new Uint32Array(a,c,4*b),d=new Uint32Array(a,d,4*b),o=new Uint16Array(a,f,b),f=0;f<b;f++){e=c[f*4];g=c[f*4+1];h=c[f*4+2];i=c[f*4+3];j=d[f*4];m=d[f*4+1];n=d[f*4+2];p=d[f*4+3];l=o[f];var q=I[m*3],r=I[m*3+1];m=I[m*3+2];var u=I[n*3],s=I[n*3+1];n=I[n*3+2];var t=I[p*3],v=I[p*3+1];p=I[p*3+2];N.faces.push(new THREE.Face4(e,
-g,h,i,[new THREE.Vector3(I[j*3],I[j*3+1],I[j*3+2]),new THREE.Vector3(q,r,m),new THREE.Vector3(u,s,n),new THREE.Vector3(t,v,p)],null,l))}}var N=this,C=0,I=[],Q=[],K,H,X;THREE.Geometry.call(this);THREE.Loader.prototype.initMaterials(N,d,b);u=a;H=C;b=new Uint8Array(u,H,12);p="";for(t=0;t<12;t++)p=p+String.fromCharCode(b[H+t]);c=y(u,H+12);y(u,H+13);y(u,H+14);y(u,H+15);f=y(u,H+16);i=y(u,H+17);j=y(u,H+18);l=y(u,H+19);m=B(u,H+20);n=B(u,H+20+4);q=B(u,H+20+8);o=B(u,H+20+12);p=B(u,H+20+16);s=B(u,H+20+20);r=
-B(u,H+20+24);t=B(u,H+20+28);b=B(u,H+20+32);v=B(u,H+20+36);u=B(u,H+20+40);C=C+c;H=f*3+l;X=f*4+l;K=o*H;c=p*(H+i*3);f=s*(H+j*3);l=r*(H+i*3+j*3);H=t*X;i=b*(X+i*4);j=v*(X+j*4);X=C;var C=new Float32Array(a,C,m*3),P,L,ea,qa;for(P=0;P<m;P++){L=C[P*3];ea=C[P*3+1];qa=C[P*3+2];N.vertices.push(new THREE.Vector3(L,ea,qa))}m=C=X+m*3*Float32Array.BYTES_PER_ELEMENT;if(n){C=new Int8Array(a,C,n*3);for(X=0;X<n;X++){P=C[X*3];L=C[X*3+1];ea=C[X*3+2];I.push(P/127,L/127,ea/127)}}C=m+n*3*Int8Array.BYTES_PER_ELEMENT;n=C=C+
-A(n*3);if(q){C=new Float32Array(a,C,q*2);for(m=0;m<q;m++){X=C[m*2];P=C[m*2+1];Q.push(X,P)}}q=C=n+q*2*Float32Array.BYTES_PER_ELEMENT;K=q+K+A(o*2);n=K+c+A(p*2);c=n+f+A(s*2);f=c+l+A(r*2);H=f+H+A(t*2);l=H+i+A(b*2);i=l+j+A(v*2);if(s){j=n+s*Uint32Array.BYTES_PER_ELEMENT*3;E(s,n,j+s*Uint32Array.BYTES_PER_ELEMENT*3);F(s,j)}if(r){s=c+r*Uint32Array.BYTES_PER_ELEMENT*3;j=s+r*Uint32Array.BYTES_PER_ELEMENT*3;O(r,c,s,j+r*Uint32Array.BYTES_PER_ELEMENT*3);F(r,j)}if(v){r=l+v*Uint32Array.BYTES_PER_ELEMENT*4;G(v,l,
-r+v*Uint32Array.BYTES_PER_ELEMENT*4);x(v,r)}if(u){v=i+u*Uint32Array.BYTES_PER_ELEMENT*4;r=v+u*Uint32Array.BYTES_PER_ELEMENT*4;J(u,i,v,r+u*Uint32Array.BYTES_PER_ELEMENT*4);x(u,r)}o&&E(o,q,q+o*Uint32Array.BYTES_PER_ELEMENT*3);if(p){o=K+p*Uint32Array.BYTES_PER_ELEMENT*3;O(p,K,o,o+p*Uint32Array.BYTES_PER_ELEMENT*3)}t&&G(t,f,f+t*Uint32Array.BYTES_PER_ELEMENT*4);if(b){p=H+b*Uint32Array.BYTES_PER_ELEMENT*4;J(b,H,p,p+b*Uint32Array.BYTES_PER_ELEMENT*4)}this.computeCentroids();this.computeFaceNormals();THREE.Loader.prototype.hasNormals(this)&&
+THREE.BinaryLoader.prototype.createBinModel=function(a,b,c,d){var f=function(b){var c,f,i,j,l,m,n,q,o,p,s,r,u,v,t;function A(a){return a%4?4-a%4:0}function y(a,b){return(new Uint8Array(a,b,1))[0]}function B(a,b){return(new Uint32Array(a,b,1))[0]}function E(b,c){var d,f,e,g,h,i,l,j,m=new Uint32Array(a,c,3*b);for(d=0;d<b;d++){f=m[d*3];e=m[d*3+1];g=m[d*3+2];h=Q[f*2];f=Q[f*2+1];i=Q[e*2];l=Q[e*2+1];e=Q[g*2];j=Q[g*2+1];g=K.faceVertexUvs[0];var n=[];n.push(new THREE.UV(h,f));n.push(new THREE.UV(i,l));n.push(new THREE.UV(e,
+j));g.push(n)}}function w(b,c){var d,f,e,g,h,i,l,j,m,n,p=new Uint32Array(a,c,4*b);for(d=0;d<b;d++){f=p[d*4];e=p[d*4+1];g=p[d*4+2];h=p[d*4+3];i=Q[f*2];f=Q[f*2+1];l=Q[e*2];m=Q[e*2+1];j=Q[g*2];n=Q[g*2+1];g=Q[h*2];e=Q[h*2+1];h=K.faceVertexUvs[0];var o=[];o.push(new THREE.UV(i,f));o.push(new THREE.UV(l,m));o.push(new THREE.UV(j,n));o.push(new THREE.UV(g,e));h.push(o)}}function I(b,c,d){for(var f,e,g,h,c=new Uint32Array(a,c,3*b),i=new Uint16Array(a,d,b),d=0;d<b;d++){f=c[d*3];e=c[d*3+1];g=c[d*3+2];h=i[d];
+K.faces.push(new THREE.Face3(f,e,g,null,null,h))}}function G(b,c,d){for(var f,e,g,h,i,c=new Uint32Array(a,c,4*b),l=new Uint16Array(a,d,b),d=0;d<b;d++){f=c[d*4];e=c[d*4+1];g=c[d*4+2];h=c[d*4+3];i=l[d];K.faces.push(new THREE.Face4(f,e,g,h,null,null,i))}}function O(b,c,d,f){for(var e,g,h,i,l,j,m,c=new Uint32Array(a,c,3*b),d=new Uint32Array(a,d,3*b),n=new Uint16Array(a,f,b),f=0;f<b;f++){e=c[f*3];g=c[f*3+1];h=c[f*3+2];l=d[f*3];j=d[f*3+1];m=d[f*3+2];i=n[f];var p=J[j*3],o=J[j*3+1];j=J[j*3+2];var q=J[m*3],
+t=J[m*3+1];m=J[m*3+2];K.faces.push(new THREE.Face3(e,g,h,[new THREE.Vector3(J[l*3],J[l*3+1],J[l*3+2]),new THREE.Vector3(p,o,j),new THREE.Vector3(q,t,m)],null,i))}}function F(b,c,d,f){for(var e,g,h,i,l,j,m,n,p,c=new Uint32Array(a,c,4*b),d=new Uint32Array(a,d,4*b),o=new Uint16Array(a,f,b),f=0;f<b;f++){e=c[f*4];g=c[f*4+1];h=c[f*4+2];i=c[f*4+3];j=d[f*4];m=d[f*4+1];n=d[f*4+2];p=d[f*4+3];l=o[f];var q=J[m*3],t=J[m*3+1];m=J[m*3+2];var r=J[n*3],s=J[n*3+1];n=J[n*3+2];var u=J[p*3],w=J[p*3+1];p=J[p*3+2];K.faces.push(new THREE.Face4(e,
+g,h,i,[new THREE.Vector3(J[j*3],J[j*3+1],J[j*3+2]),new THREE.Vector3(q,t,m),new THREE.Vector3(r,s,n),new THREE.Vector3(u,w,p)],null,l))}}var K=this,C=0,J=[],Q=[],L,H,X;THREE.Geometry.call(this);THREE.Loader.prototype.initMaterials(K,d,b);t=a;H=C;b=new Uint8Array(t,H,12);p="";for(u=0;u<12;u++)p=p+String.fromCharCode(b[H+u]);c=y(t,H+12);y(t,H+13);y(t,H+14);y(t,H+15);f=y(t,H+16);i=y(t,H+17);j=y(t,H+18);l=y(t,H+19);m=B(t,H+20);n=B(t,H+20+4);q=B(t,H+20+8);o=B(t,H+20+12);p=B(t,H+20+16);s=B(t,H+20+20);r=
+B(t,H+20+24);u=B(t,H+20+28);b=B(t,H+20+32);v=B(t,H+20+36);t=B(t,H+20+40);C=C+c;H=f*3+l;X=f*4+l;L=o*H;c=p*(H+i*3);f=s*(H+j*3);l=r*(H+i*3+j*3);H=u*X;i=b*(X+i*4);j=v*(X+j*4);X=C;var C=new Float32Array(a,C,m*3),P,M,ea,qa;for(P=0;P<m;P++){M=C[P*3];ea=C[P*3+1];qa=C[P*3+2];K.vertices.push(new THREE.Vector3(M,ea,qa))}m=C=X+m*3*Float32Array.BYTES_PER_ELEMENT;if(n){C=new Int8Array(a,C,n*3);for(X=0;X<n;X++){P=C[X*3];M=C[X*3+1];ea=C[X*3+2];J.push(P/127,M/127,ea/127)}}C=m+n*3*Int8Array.BYTES_PER_ELEMENT;n=C=C+
+A(n*3);if(q){C=new Float32Array(a,C,q*2);for(m=0;m<q;m++){X=C[m*2];P=C[m*2+1];Q.push(X,P)}}q=C=n+q*2*Float32Array.BYTES_PER_ELEMENT;L=q+L+A(o*2);n=L+c+A(p*2);c=n+f+A(s*2);f=c+l+A(r*2);H=f+H+A(u*2);l=H+i+A(b*2);i=l+j+A(v*2);if(s){j=n+s*Uint32Array.BYTES_PER_ELEMENT*3;I(s,n,j+s*Uint32Array.BYTES_PER_ELEMENT*3);E(s,j)}if(r){s=c+r*Uint32Array.BYTES_PER_ELEMENT*3;j=s+r*Uint32Array.BYTES_PER_ELEMENT*3;O(r,c,s,j+r*Uint32Array.BYTES_PER_ELEMENT*3);E(r,j)}if(v){r=l+v*Uint32Array.BYTES_PER_ELEMENT*4;G(v,l,
+r+v*Uint32Array.BYTES_PER_ELEMENT*4);w(v,r)}if(t){v=i+t*Uint32Array.BYTES_PER_ELEMENT*4;r=v+t*Uint32Array.BYTES_PER_ELEMENT*4;F(t,i,v,r+t*Uint32Array.BYTES_PER_ELEMENT*4);w(t,r)}o&&I(o,q,q+o*Uint32Array.BYTES_PER_ELEMENT*3);if(p){o=L+p*Uint32Array.BYTES_PER_ELEMENT*3;O(p,L,o,o+p*Uint32Array.BYTES_PER_ELEMENT*3)}u&&G(u,f,f+u*Uint32Array.BYTES_PER_ELEMENT*4);if(b){p=H+b*Uint32Array.BYTES_PER_ELEMENT*4;F(b,H,p,p+b*Uint32Array.BYTES_PER_ELEMENT*4)}this.computeCentroids();this.computeFaceNormals();THREE.Loader.prototype.hasNormals(this)&&
 this.computeTangents()};f.prototype=Object.create(THREE.Geometry.prototype);b(new f(c))};THREE.ImageLoader=function(){THREE.EventTarget.call(this);this.crossOrigin=null};
 THREE.ImageLoader.prototype={constructor:THREE.ImageLoader,load:function(a,b){var c=this;b===void 0&&(b=new Image);b.addEventListener("load",function(){c.dispatchEvent({type:"load",content:b})},false);b.addEventListener("error",function(){c.dispatchEvent({type:"error",message:"Couldn't load URL ["+a+"]"})},false);if(c.crossOrigin)b.crossOrigin=c.crossOrigin;b.src=a}};THREE.JSONLoader=function(a){THREE.Loader.call(this,a)};THREE.JSONLoader.prototype=Object.create(THREE.Loader.prototype);
 THREE.JSONLoader.prototype.load=function(a,b,c){c=c?c:this.extractUrlBase(a);this.onLoadStart();this.loadAjaxJSON(this,a,b,c)};
 THREE.JSONLoader.prototype.loadAjaxJSON=function(a,b,c,d,f){var e=new XMLHttpRequest,g=0;e.onreadystatechange=function(){if(e.readyState===e.DONE)if(e.status===200||e.status===0){if(e.responseText){var h=JSON.parse(e.responseText);a.createModel(h,c,d)}else console.warn("THREE.JSONLoader: ["+b+"] seems to be unreachable or file there is empty");a.onLoadComplete()}else console.error("THREE.JSONLoader: Couldn't load ["+b+"] ["+e.status+"]");else if(e.readyState===e.LOADING){if(f){g===0&&(g=e.getResponseHeader("Content-Length"));
 f({total:g,loaded:e.responseText.length})}}else e.readyState===e.HEADERS_RECEIVED&&(g=e.getResponseHeader("Content-Length"))};e.open("GET",b,true);e.overrideMimeType&&e.overrideMimeType("application/json; charset=x-user-defined");e.setRequestHeader("Content-Type","application/json");e.send(null)};
-THREE.JSONLoader.prototype.createModel=function(a,b,c){var d=new THREE.Geometry,f=a.scale!==void 0?1/a.scale:1;this.initMaterials(d,a.materials,c);var e,g,h,i,j,l,m,n,q,o,p,s,r,t,v=a.faces;q=a.vertices;var u=a.normals,A=a.colors,y=0;for(e=0;e<a.uvs.length;e++)a.uvs[e].length&&y++;for(e=0;e<y;e++){d.faceUvs[e]=[];d.faceVertexUvs[e]=[]}c=0;for(i=q.length;c<i;){j=new THREE.Vector3;j.x=q[c++]*f;j.y=q[c++]*f;j.z=q[c++]*f;d.vertices.push(j)}c=0;for(i=v.length;c<i;){q=v[c++];j=q&1;h=q&2;e=q&4;g=q&8;m=q&
-16;l=q&32;o=q&64;q=q&128;if(j){p=new THREE.Face4;p.a=v[c++];p.b=v[c++];p.c=v[c++];p.d=v[c++];j=4}else{p=new THREE.Face3;p.a=v[c++];p.b=v[c++];p.c=v[c++];j=3}if(h){h=v[c++];p.materialIndex=h}h=d.faces.length;if(e)for(e=0;e<y;e++){s=a.uvs[e];n=v[c++];t=s[n*2];n=s[n*2+1];d.faceUvs[e][h]=new THREE.UV(t,n)}if(g)for(e=0;e<y;e++){s=a.uvs[e];r=[];for(g=0;g<j;g++){n=v[c++];t=s[n*2];n=s[n*2+1];r[g]=new THREE.UV(t,n)}d.faceVertexUvs[e][h]=r}if(m){m=v[c++]*3;g=new THREE.Vector3;g.x=u[m++];g.y=u[m++];g.z=u[m];
-p.normal=g}if(l)for(e=0;e<j;e++){m=v[c++]*3;g=new THREE.Vector3;g.x=u[m++];g.y=u[m++];g.z=u[m];p.vertexNormals.push(g)}if(o){l=v[c++];l=new THREE.Color(A[l]);p.color=l}if(q)for(e=0;e<j;e++){l=v[c++];l=new THREE.Color(A[l]);p.vertexColors.push(l)}d.faces.push(p)}if(a.skinWeights){c=0;for(i=a.skinWeights.length;c<i;c=c+2){v=a.skinWeights[c];u=a.skinWeights[c+1];d.skinWeights.push(new THREE.Vector4(v,u,0,0))}}if(a.skinIndices){c=0;for(i=a.skinIndices.length;c<i;c=c+2){v=a.skinIndices[c];u=a.skinIndices[c+
-1];d.skinIndices.push(new THREE.Vector4(v,u,0,0))}}d.bones=a.bones;d.animation=a.animation;if(a.morphTargets!==void 0){c=0;for(i=a.morphTargets.length;c<i;c++){d.morphTargets[c]={};d.morphTargets[c].name=a.morphTargets[c].name;d.morphTargets[c].vertices=[];A=d.morphTargets[c].vertices;y=a.morphTargets[c].vertices;v=0;for(u=y.length;v<u;v=v+3){q=new THREE.Vector3;q.x=y[v]*f;q.y=y[v+1]*f;q.z=y[v+2]*f;A.push(q)}}}if(a.morphColors!==void 0){c=0;for(i=a.morphColors.length;c<i;c++){d.morphColors[c]={};
-d.morphColors[c].name=a.morphColors[c].name;d.morphColors[c].colors=[];u=d.morphColors[c].colors;A=a.morphColors[c].colors;f=0;for(v=A.length;f<v;f=f+3){y=new THREE.Color(16755200);y.setRGB(A[f],A[f+1],A[f+2]);u.push(y)}}}d.computeCentroids();d.computeFaceNormals();this.hasNormals(d)&&d.computeTangents();b(d)};THREE.GeometryLoader=function(){THREE.EventTarget.call(this);this.path=this.crossOrigin=null};
+THREE.JSONLoader.prototype.createModel=function(a,b,c){var d=new THREE.Geometry,f=a.scale!==void 0?1/a.scale:1;this.initMaterials(d,a.materials,c);var e,g,h,i,j,l,m,n,q,o,p,s,r,u,v=a.faces;q=a.vertices;var t=a.normals,A=a.colors,y=0;for(e=0;e<a.uvs.length;e++)a.uvs[e].length&&y++;for(e=0;e<y;e++){d.faceUvs[e]=[];d.faceVertexUvs[e]=[]}c=0;for(i=q.length;c<i;){j=new THREE.Vector3;j.x=q[c++]*f;j.y=q[c++]*f;j.z=q[c++]*f;d.vertices.push(j)}c=0;for(i=v.length;c<i;){q=v[c++];j=q&1;h=q&2;e=q&4;g=q&8;m=q&
+16;l=q&32;o=q&64;q=q&128;if(j){p=new THREE.Face4;p.a=v[c++];p.b=v[c++];p.c=v[c++];p.d=v[c++];j=4}else{p=new THREE.Face3;p.a=v[c++];p.b=v[c++];p.c=v[c++];j=3}if(h){h=v[c++];p.materialIndex=h}h=d.faces.length;if(e)for(e=0;e<y;e++){s=a.uvs[e];n=v[c++];u=s[n*2];n=s[n*2+1];d.faceUvs[e][h]=new THREE.UV(u,n)}if(g)for(e=0;e<y;e++){s=a.uvs[e];r=[];for(g=0;g<j;g++){n=v[c++];u=s[n*2];n=s[n*2+1];r[g]=new THREE.UV(u,n)}d.faceVertexUvs[e][h]=r}if(m){m=v[c++]*3;g=new THREE.Vector3;g.x=t[m++];g.y=t[m++];g.z=t[m];
+p.normal=g}if(l)for(e=0;e<j;e++){m=v[c++]*3;g=new THREE.Vector3;g.x=t[m++];g.y=t[m++];g.z=t[m];p.vertexNormals.push(g)}if(o){l=v[c++];l=new THREE.Color(A[l]);p.color=l}if(q)for(e=0;e<j;e++){l=v[c++];l=new THREE.Color(A[l]);p.vertexColors.push(l)}d.faces.push(p)}if(a.skinWeights){c=0;for(i=a.skinWeights.length;c<i;c=c+2){v=a.skinWeights[c];t=a.skinWeights[c+1];d.skinWeights.push(new THREE.Vector4(v,t,0,0))}}if(a.skinIndices){c=0;for(i=a.skinIndices.length;c<i;c=c+2){v=a.skinIndices[c];t=a.skinIndices[c+
+1];d.skinIndices.push(new THREE.Vector4(v,t,0,0))}}d.bones=a.bones;d.animation=a.animation;if(a.morphTargets!==void 0){c=0;for(i=a.morphTargets.length;c<i;c++){d.morphTargets[c]={};d.morphTargets[c].name=a.morphTargets[c].name;d.morphTargets[c].vertices=[];A=d.morphTargets[c].vertices;y=a.morphTargets[c].vertices;v=0;for(t=y.length;v<t;v=v+3){q=new THREE.Vector3;q.x=y[v]*f;q.y=y[v+1]*f;q.z=y[v+2]*f;A.push(q)}}}if(a.morphColors!==void 0){c=0;for(i=a.morphColors.length;c<i;c++){d.morphColors[c]={};
+d.morphColors[c].name=a.morphColors[c].name;d.morphColors[c].colors=[];t=d.morphColors[c].colors;A=a.morphColors[c].colors;f=0;for(v=A.length;f<v;f=f+3){y=new THREE.Color(16755200);y.setRGB(A[f],A[f+1],A[f+2]);t.push(y)}}}d.computeCentroids();d.computeFaceNormals();this.hasNormals(d)&&d.computeTangents();b(d)};THREE.GeometryLoader=function(){THREE.EventTarget.call(this);this.path=this.crossOrigin=null};
 THREE.GeometryLoader.prototype={constructor:THREE.GeometryLoader,load:function(a){var b=this,c=null;if(b.path===null){var d=a.split("/");d.pop();b.path=d.length<1?".":d.join("/")}d=new XMLHttpRequest;d.addEventListener("load",function(d){d.target.responseText?c=b.parse(JSON.parse(d.target.responseText),f):b.dispatchEvent({type:"error",message:"Invalid file ["+a+"]"})},false);d.addEventListener("error",function(){b.dispatchEvent({type:"error",message:"Couldn't load URL ["+a+"]"})},false);d.open("GET",
 a,true);d.setRequestHeader("Content-Type","application/json");d.send(null);var f=new THREE.LoadingMonitor;f.addEventListener("load",function(){b.dispatchEvent({type:"load",content:c})});f.add(d)},parse:function(a,b){var c=this,d=new THREE.Geometry,f=a.scale!==void 0?1/a.scale:1;if(a.materials){d.materials=[];for(var e=0;e<a.materials.length;++e){var g=a.materials[e],h=function(a){a=Math.log(a)/Math.LN2;return Math.floor(a)==a},i=function(a){a=Math.log(a)/Math.LN2;return Math.pow(2,Math.round(a))},
 j=function(a,d,f,e,g,l){a[d]=new THREE.Texture;a[d].sourceFile=f;if(e){a[d].repeat.set(e[0],e[1]);if(e[0]!==1)a[d].wrapS=THREE.RepeatWrapping;if(e[1]!==1)a[d].wrapT=THREE.RepeatWrapping}g&&a[d].offset.set(g[0],g[1]);if(l){e={repeat:THREE.RepeatWrapping,mirror:THREE.MirroredRepeatWrapping};if(e[l[0]]!==void 0)a[d].wrapS=e[l[0]];if(e[l[1]]!==void 0)a[d].wrapT=e[l[1]]}var j=a[d],a=new THREE.ImageLoader;a.addEventListener("load",function(a){a=a.content;if(!h(a.width)||!h(a.height)){var b=i(a.width),c=
@@ -176,27 +176,27 @@ i(a.height);j.image=document.createElement("canvas");j.image.width=b;j.image.hei
 l(g.colorSpecular);if(g.colorAmbient)n.ambient=l(g.colorAmbient);if(g.transparency)n.opacity=g.transparency;if(g.specularCoef)n.shininess=g.specularCoef;if(g.visible!==void 0)n.visible=g.visible;if(g.flipSided!==void 0)n.side=THREE.BackSide;if(g.doubleSided!==void 0)n.side=THREE.DoubleSide;if(g.wireframe!==void 0)n.wireframe=g.wireframe;g.mapDiffuse&&j(n,"map",g.mapDiffuse,g.mapDiffuseRepeat,g.mapDiffuseOffset,g.mapDiffuseWrap);g.mapLight&&j(n,"lightMap",g.mapLight,g.mapLightRepeat,g.mapLightOffset,
 g.mapLightWrap);g.mapBump&&j(n,"bumpMap",g.mapBump,g.mapBumpRepeat,g.mapBumpOffset,g.mapBumpWrap);g.mapNormal&&j(n,"normalMap",g.mapNormal,g.mapNormalRepeat,g.mapNormalOffset,g.mapNormalWrap);g.mapSpecular&&j(n,"specularMap",g.mapSpecular,g.mapSpecularRepeat,g.mapSpecularOffset,g.mapSpecularWrap);if(g.mapNormal){j=THREE.ShaderUtils.lib.normal;l=THREE.UniformsUtils.clone(j.uniforms);l.tNormal.texture=n.normalMap;if(g.mapNormalFactor)l.uNormalScale.value=g.mapNormalFactor;if(n.map){l.tDiffuse.texture=
 n.map;l.enableDiffuse.value=true}if(n.specularMap){l.tSpecular.texture=n.specularMap;l.enableSpecular.value=true}if(n.lightMap){l.tAO.texture=n.lightMap;l.enableAO.value=true}l.uDiffuseColor.value.setHex(n.color);l.uSpecularColor.value.setHex(n.specular);l.uAmbientColor.value.setHex(n.ambient);l.uShininess.value=n.shininess;if(n.opacity!==void 0)l.uOpacity.value=n.opacity;n=new THREE.ShaderMaterial({fragmentShader:j.fragmentShader,vertexShader:j.vertexShader,uniforms:l,lights:true,fog:true})}else n=
-new THREE[m](n);if(g.DbgName!==void 0)n.name=g.DbgName;d.materials[e]=n}}var g=a.faces,o=a.vertices,n=a.normals,j=a.colors,l=0;if(a.uvs)for(e=0;e<a.uvs.length;e++)a.uvs[e].length&&l++;for(e=0;e<l;e++){d.faceUvs[e]=[];d.faceVertexUvs[e]=[]}m=0;for(q=o.length;m<q;){var p=new THREE.Vector3;p.x=o[m++]*f;p.y=o[m++]*f;p.z=o[m++]*f;d.vertices.push(p)}m=0;for(q=g.length;m<q;){var s=g[m++],r=s&2,e=s&4,t=s&8,v=s&16,o=s&32,u=s&64,p=s&128;if(s&1){s=new THREE.Face4;s.a=g[m++];s.b=g[m++];s.c=g[m++];s.d=g[m++];
-var A=4}else{s=new THREE.Face3;s.a=g[m++];s.b=g[m++];s.c=g[m++];A=3}if(r){r=g[m++];s.materialIndex=r}var y=d.faces.length;if(e)for(e=0;e<l;e++){var B=a.uvs[e],r=g[m++],F=B[r*2],r=B[r*2+1];d.faceUvs[e][y]=new THREE.UV(F,r)}if(t)for(e=0;e<l;e++){for(var B=a.uvs[e],t=[],x=0;x<A;x++){r=g[m++];F=B[r*2];r=B[r*2+1];t[x]=new THREE.UV(F,r)}d.faceVertexUvs[e][y]=t}if(v){v=g[m++]*3;r=new THREE.Vector3;r.x=n[v++];r.y=n[v++];r.z=n[v];s.normal=r}if(o)for(e=0;e<A;e++){v=g[m++]*3;r=new THREE.Vector3;r.x=n[v++];r.y=
-n[v++];r.z=n[v];s.vertexNormals.push(r)}if(u){o=g[m++];s.color=new THREE.Color(j[o])}if(p)for(e=0;e<A;e++){o=g[m++];s.vertexColors.push(new THREE.Color(j[o]))}d.faces.push(s)}if(a.skinWeights){e=0;for(g=a.skinWeights.length;e<g;e=e+2)d.skinWeights.push(new THREE.Vector4(a.skinWeights[e],a.skinWeights[e+1],0,0))}if(a.skinIndices){e=0;for(g=a.skinIndices.length;e<g;e=e+2){n=0;d.skinIndices.push(new THREE.Vector4(a.skinIndices[e],a.skinIndices[e+1],n,0))}}d.bones=a.bones;d.animation=a.animation;if(a.morphTargets){e=
+new THREE[m](n);if(g.DbgName!==void 0)n.name=g.DbgName;d.materials[e]=n}}var g=a.faces,o=a.vertices,n=a.normals,j=a.colors,l=0;if(a.uvs)for(e=0;e<a.uvs.length;e++)a.uvs[e].length&&l++;for(e=0;e<l;e++){d.faceUvs[e]=[];d.faceVertexUvs[e]=[]}m=0;for(q=o.length;m<q;){var p=new THREE.Vector3;p.x=o[m++]*f;p.y=o[m++]*f;p.z=o[m++]*f;d.vertices.push(p)}m=0;for(q=g.length;m<q;){var s=g[m++],r=s&2,e=s&4,u=s&8,v=s&16,o=s&32,t=s&64,p=s&128;if(s&1){s=new THREE.Face4;s.a=g[m++];s.b=g[m++];s.c=g[m++];s.d=g[m++];
+var A=4}else{s=new THREE.Face3;s.a=g[m++];s.b=g[m++];s.c=g[m++];A=3}if(r){r=g[m++];s.materialIndex=r}var y=d.faces.length;if(e)for(e=0;e<l;e++){var B=a.uvs[e],r=g[m++],E=B[r*2],r=B[r*2+1];d.faceUvs[e][y]=new THREE.UV(E,r)}if(u)for(e=0;e<l;e++){for(var B=a.uvs[e],u=[],w=0;w<A;w++){r=g[m++];E=B[r*2];r=B[r*2+1];u[w]=new THREE.UV(E,r)}d.faceVertexUvs[e][y]=u}if(v){v=g[m++]*3;r=new THREE.Vector3;r.x=n[v++];r.y=n[v++];r.z=n[v];s.normal=r}if(o)for(e=0;e<A;e++){v=g[m++]*3;r=new THREE.Vector3;r.x=n[v++];r.y=
+n[v++];r.z=n[v];s.vertexNormals.push(r)}if(t){o=g[m++];s.color=new THREE.Color(j[o])}if(p)for(e=0;e<A;e++){o=g[m++];s.vertexColors.push(new THREE.Color(j[o]))}d.faces.push(s)}if(a.skinWeights){e=0;for(g=a.skinWeights.length;e<g;e=e+2)d.skinWeights.push(new THREE.Vector4(a.skinWeights[e],a.skinWeights[e+1],0,0))}if(a.skinIndices){e=0;for(g=a.skinIndices.length;e<g;e=e+2){n=0;d.skinIndices.push(new THREE.Vector4(a.skinIndices[e],a.skinIndices[e+1],n,0))}}d.bones=a.bones;d.animation=a.animation;if(a.morphTargets){e=
 0;for(g=a.morphTargets.length;e<g;e++){d.morphTargets[e]={};d.morphTargets[e].name=a.morphTargets[e].name;d.morphTargets[e].vertices=[];n=d.morphTargets[e].vertices;j=a.morphTargets[e].vertices;r=0;for(l=j.length;r<l;r=r+3){p=new THREE.Vector3;p.x=j[r]*f;p.y=j[r+1]*f;p.z=j[r+2]*f;n.push(p)}}}if(a.morphColors){e=0;for(g=a.morphColors.length;e<g;e++){d.morphColors[e]={};d.morphColors[e].name=a.morphColors[e].name;d.morphColors[e].colors=[];f=d.morphColors[e].colors;j=a.morphColors[e].colors;n=0;for(l=
 j.length;n<l;n=n+3){m=new THREE.Color(16755200);m.setRGB(j[n],j[n+1],j[n+2]);f.push(m)}}}d.computeCentroids();d.computeFaceNormals();return d}};THREE.SceneLoader=function(){this.onLoadStart=function(){};this.onLoadProgress=function(){};this.onLoadComplete=function(){};this.callbackSync=function(){};this.callbackProgress=function(){}};THREE.SceneLoader.prototype.constructor=THREE.SceneLoader;
 THREE.SceneLoader.prototype.load=function(a,b){var c=this,d=new XMLHttpRequest;d.onreadystatechange=function(){if(d.readyState===4)if(d.status===200||d.status===0){var f=JSON.parse(d.responseText);c.createScene(f,b,a)}else console.error("THREE.SceneLoader: Couldn't load ["+a+"] ["+d.status+"]")};d.open("GET",a,true);d.overrideMimeType&&d.overrideMimeType("application/json; charset=x-user-defined");d.setRequestHeader("Content-Type","application/json");d.send(null)};
-THREE.SceneLoader.prototype.createScene=function(a,b,c){function d(a,b){return b=="relativeToHTML"?a:j+"/"+a}function f(a,b){var c;for(n in b)if(P.objects[n]===void 0){r=b[n];if(r.geometry!==void 0){if(G=P.geometries[r.geometry]){c=false;O=P.materials[r.materials[0]];(c=O instanceof THREE.ShaderMaterial)&&G.computeTangents();A=r.position;y=r.rotation;B=r.quaternion;F=r.scale;t=r.matrix;B=0;r.materials.length==0&&(O=new THREE.MeshFaceMaterial);r.materials.length>1&&(O=new THREE.MeshFaceMaterial);c=
-new THREE.Mesh(G,O);c.name=n;if(t){c.matrixAutoUpdate=false;c.matrix.set(t[0],t[1],t[2],t[3],t[4],t[5],t[6],t[7],t[8],t[9],t[10],t[11],t[12],t[13],t[14],t[15])}else{c.position.set(A[0],A[1],A[2]);if(B){c.quaternion.set(B[0],B[1],B[2],B[3]);c.useQuaternion=true}else c.rotation.set(y[0],y[1],y[2]);c.scale.set(F[0],F[1],F[2])}c.visible=r.visible;c.castShadow=r.castShadow;c.receiveShadow=r.receiveShadow;a.add(c);P.objects[n]=c}}else{A=r.position;y=r.rotation;B=r.quaternion;F=r.scale;B=0;c=new THREE.Object3D;
-c.name=n;c.position.set(A[0],A[1],A[2]);if(B){c.quaternion.set(B[0],B[1],B[2],B[3]);c.useQuaternion=true}else c.rotation.set(y[0],y[1],y[2]);c.scale.set(F[0],F[1],F[2]);c.visible=r.visible!==void 0?r.visible:false;a.add(c);P.objects[n]=c;P.empties[n]=c}if(r.properties!==void 0)for(var d in r.properties)c.properties[d]=r.properties[d];r.children!==void 0&&f(c,r.children)}}function e(a){return function(b){P.geometries[a]=b;f(P.scene,C.objects);Q=Q-1;i.onLoadComplete();h()}}function g(a){return function(b){P.geometries[a]=
-b}}function h(){i.callbackProgress({totalModels:H,totalTextures:X,loadedModels:H-Q,loadedTextures:X-K},P);i.onLoadProgress();Q===0&&K===0&&b(P)}var i=this,j=THREE.Loader.prototype.extractUrlBase(c),l,m,n,q,o,p,s,r,t,v,u,A,y,B,F,x,E,G,O,J,N,C,I,Q,K,H,X,P;C=a;c=new THREE.BinaryLoader;I=new THREE.JSONLoader;K=Q=0;P={scene:new THREE.Scene,geometries:{},materials:{},textures:{},objects:{},cameras:{},lights:{},fogs:{},empties:{}};if(C.transform){a=C.transform.position;v=C.transform.rotation;x=C.transform.scale;
-a&&P.scene.position.set(a[0],a[1],a[2]);v&&P.scene.rotation.set(v[0],v[1],v[2]);x&&P.scene.scale.set(x[0],x[1],x[2]);if(a||v||x){P.scene.updateMatrix();P.scene.updateMatrixWorld()}}a=function(a){return function(){K=K-a;h();i.onLoadComplete()}};for(o in C.cameras){x=C.cameras[o];x.type==="perspective"?J=new THREE.PerspectiveCamera(x.fov,x.aspect,x.near,x.far):x.type==="ortho"&&(J=new THREE.OrthographicCamera(x.left,x.right,x.top,x.bottom,x.near,x.far));A=x.position;v=x.target;x=x.up;J.position.set(A[0],
-A[1],A[2]);J.target=new THREE.Vector3(v[0],v[1],v[2]);x&&J.up.set(x[0],x[1],x[2]);P.cameras[o]=J}for(q in C.lights){v=C.lights[q];o=v.color!==void 0?v.color:16777215;J=v.intensity!==void 0?v.intensity:1;if(v.type==="directional"){A=v.direction;u=new THREE.DirectionalLight(o,J);u.position.set(A[0],A[1],A[2]);u.position.normalize()}else if(v.type==="point"){A=v.position;u=v.distance;u=new THREE.PointLight(o,J,u);u.position.set(A[0],A[1],A[2])}else v.type==="ambient"&&(u=new THREE.AmbientLight(o));P.scene.add(u);
-P.lights[q]=u}for(p in C.fogs){q=C.fogs[p];q.type==="linear"?N=new THREE.Fog(0,q.near,q.far):q.type==="exp2"&&(N=new THREE.FogExp2(0,q.density));x=q.color;N.color.setRGB(x[0],x[1],x[2]);P.fogs[p]=N}if(P.cameras&&C.defaults.camera)P.currentCamera=P.cameras[C.defaults.camera];if(P.fogs&&C.defaults.fog)P.scene.fog=P.fogs[C.defaults.fog];x=C.defaults.bgcolor;P.bgColor=new THREE.Color;P.bgColor.setRGB(x[0],x[1],x[2]);P.bgColorAlpha=C.defaults.bgalpha;for(l in C.geometries){p=C.geometries[l];if(p.type==
+THREE.SceneLoader.prototype.createScene=function(a,b,c){function d(a,b){return b=="relativeToHTML"?a:j+"/"+a}function f(a,b){var c;for(n in b)if(P.objects[n]===void 0){r=b[n];if(r.geometry!==void 0){if(G=P.geometries[r.geometry]){c=false;O=P.materials[r.materials[0]];(c=O instanceof THREE.ShaderMaterial)&&G.computeTangents();A=r.position;y=r.rotation;B=r.quaternion;E=r.scale;u=r.matrix;B=0;r.materials.length==0&&(O=new THREE.MeshFaceMaterial);r.materials.length>1&&(O=new THREE.MeshFaceMaterial);c=
+new THREE.Mesh(G,O);c.name=n;if(u){c.matrixAutoUpdate=false;c.matrix.set(u[0],u[1],u[2],u[3],u[4],u[5],u[6],u[7],u[8],u[9],u[10],u[11],u[12],u[13],u[14],u[15])}else{c.position.set(A[0],A[1],A[2]);if(B){c.quaternion.set(B[0],B[1],B[2],B[3]);c.useQuaternion=true}else c.rotation.set(y[0],y[1],y[2]);c.scale.set(E[0],E[1],E[2])}c.visible=r.visible;c.castShadow=r.castShadow;c.receiveShadow=r.receiveShadow;a.add(c);P.objects[n]=c}}else{A=r.position;y=r.rotation;B=r.quaternion;E=r.scale;B=0;c=new THREE.Object3D;
+c.name=n;c.position.set(A[0],A[1],A[2]);if(B){c.quaternion.set(B[0],B[1],B[2],B[3]);c.useQuaternion=true}else c.rotation.set(y[0],y[1],y[2]);c.scale.set(E[0],E[1],E[2]);c.visible=r.visible!==void 0?r.visible:false;a.add(c);P.objects[n]=c;P.empties[n]=c}if(r.properties!==void 0)for(var d in r.properties)c.properties[d]=r.properties[d];r.children!==void 0&&f(c,r.children)}}function e(a){return function(b){P.geometries[a]=b;f(P.scene,C.objects);Q=Q-1;i.onLoadComplete();h()}}function g(a){return function(b){P.geometries[a]=
+b}}function h(){i.callbackProgress({totalModels:H,totalTextures:X,loadedModels:H-Q,loadedTextures:X-L},P);i.onLoadProgress();Q===0&&L===0&&b(P)}var i=this,j=THREE.Loader.prototype.extractUrlBase(c),l,m,n,q,o,p,s,r,u,v,t,A,y,B,E,w,I,G,O,F,K,C,J,Q,L,H,X,P;C=a;c=new THREE.BinaryLoader;J=new THREE.JSONLoader;L=Q=0;P={scene:new THREE.Scene,geometries:{},materials:{},textures:{},objects:{},cameras:{},lights:{},fogs:{},empties:{}};if(C.transform){a=C.transform.position;v=C.transform.rotation;w=C.transform.scale;
+a&&P.scene.position.set(a[0],a[1],a[2]);v&&P.scene.rotation.set(v[0],v[1],v[2]);w&&P.scene.scale.set(w[0],w[1],w[2]);if(a||v||w){P.scene.updateMatrix();P.scene.updateMatrixWorld()}}a=function(a){return function(){L=L-a;h();i.onLoadComplete()}};for(o in C.cameras){w=C.cameras[o];w.type==="perspective"?F=new THREE.PerspectiveCamera(w.fov,w.aspect,w.near,w.far):w.type==="ortho"&&(F=new THREE.OrthographicCamera(w.left,w.right,w.top,w.bottom,w.near,w.far));A=w.position;v=w.target;w=w.up;F.position.set(A[0],
+A[1],A[2]);F.target=new THREE.Vector3(v[0],v[1],v[2]);w&&F.up.set(w[0],w[1],w[2]);P.cameras[o]=F}for(q in C.lights){v=C.lights[q];o=v.color!==void 0?v.color:16777215;F=v.intensity!==void 0?v.intensity:1;if(v.type==="directional"){A=v.direction;t=new THREE.DirectionalLight(o,F);t.position.set(A[0],A[1],A[2]);t.position.normalize()}else if(v.type==="point"){A=v.position;t=v.distance;t=new THREE.PointLight(o,F,t);t.position.set(A[0],A[1],A[2])}else v.type==="ambient"&&(t=new THREE.AmbientLight(o));P.scene.add(t);
+P.lights[q]=t}for(p in C.fogs){q=C.fogs[p];q.type==="linear"?K=new THREE.Fog(0,q.near,q.far):q.type==="exp2"&&(K=new THREE.FogExp2(0,q.density));w=q.color;K.color.setRGB(w[0],w[1],w[2]);P.fogs[p]=K}if(P.cameras&&C.defaults.camera)P.currentCamera=P.cameras[C.defaults.camera];if(P.fogs&&C.defaults.fog)P.scene.fog=P.fogs[C.defaults.fog];w=C.defaults.bgcolor;P.bgColor=new THREE.Color;P.bgColor.setRGB(w[0],w[1],w[2]);P.bgColorAlpha=C.defaults.bgalpha;for(l in C.geometries){p=C.geometries[l];if(p.type==
 "bin_mesh"||p.type=="ascii_mesh"){Q=Q+1;i.onLoadStart()}}H=Q;for(l in C.geometries){p=C.geometries[l];if(p.type==="cube"){G=new THREE.CubeGeometry(p.width,p.height,p.depth,p.segmentsWidth,p.segmentsHeight,p.segmentsDepth,null,p.flipped,p.sides);P.geometries[l]=G}else if(p.type==="plane"){G=new THREE.PlaneGeometry(p.width,p.height,p.segmentsWidth,p.segmentsHeight);P.geometries[l]=G}else if(p.type==="sphere"){G=new THREE.SphereGeometry(p.radius,p.segmentsWidth,p.segmentsHeight);P.geometries[l]=G}else if(p.type===
-"cylinder"){G=new THREE.CylinderGeometry(p.topRad,p.botRad,p.height,p.radSegs,p.heightSegs);P.geometries[l]=G}else if(p.type==="torus"){G=new THREE.TorusGeometry(p.radius,p.tube,p.segmentsR,p.segmentsT);P.geometries[l]=G}else if(p.type==="icosahedron"){G=new THREE.IcosahedronGeometry(p.radius,p.subdivisions);P.geometries[l]=G}else if(p.type==="bin_mesh")c.load(d(p.url,C.urlBaseType),e(l));else if(p.type==="ascii_mesh")I.load(d(p.url,C.urlBaseType),e(l));else if(p.type==="embedded_mesh"){p=C.embeds[p.id];
-p.metadata=C.metadata;p&&I.createModel(p,g(l),"")}}for(s in C.textures){l=C.textures[s];if(l.url instanceof Array){K=K+l.url.length;for(p=0;p<l.url.length;p++)i.onLoadStart()}else{K=K+1;i.onLoadStart()}}X=K;for(s in C.textures){l=C.textures[s];if(l.mapping!==void 0&&THREE[l.mapping]!==void 0)l.mapping=new THREE[l.mapping];if(l.url instanceof Array){p=l.url.length;N=[];for(c=0;c<p;c++)N[c]=d(l.url[c],C.urlBaseType);p=THREE.ImageUtils.loadTextureCube(N,l.mapping,a(p))}else{p=THREE.ImageUtils.loadTexture(d(l.url,
-C.urlBaseType),l.mapping,a(1));if(THREE[l.minFilter]!==void 0)p.minFilter=THREE[l.minFilter];if(THREE[l.magFilter]!==void 0)p.magFilter=THREE[l.magFilter];if(l.repeat){p.repeat.set(l.repeat[0],l.repeat[1]);if(l.repeat[0]!==1)p.wrapS=THREE.RepeatWrapping;if(l.repeat[1]!==1)p.wrapT=THREE.RepeatWrapping}l.offset&&p.offset.set(l.offset[0],l.offset[1]);if(l.wrap){N={repeat:THREE.RepeatWrapping,mirror:THREE.MirroredRepeatWrapping};if(N[l.wrap[0]]!==void 0)p.wrapS=N[l.wrap[0]];if(N[l.wrap[1]]!==void 0)p.wrapT=
-N[l.wrap[1]]}}P.textures[s]=p}for(m in C.materials){t=C.materials[m];for(E in t.parameters)if(E==="envMap"||E==="map"||E==="lightMap")t.parameters[E]=P.textures[t.parameters[E]];else if(E==="shading")t.parameters[E]=t.parameters[E]=="flat"?THREE.FlatShading:THREE.SmoothShading;else if(E==="blending")t.parameters[E]=t.parameters[E]in THREE?THREE[t.parameters[E]]:THREE.NormalBlending;else if(E==="combine")t.parameters[E]=t.parameters[E]=="MixOperation"?THREE.MixOperation:THREE.MultiplyOperation;else if(E===
-"vertexColors")if(t.parameters[E]=="face")t.parameters[E]=THREE.FaceColors;else if(t.parameters[E])t.parameters[E]=THREE.VertexColors;if(t.parameters.opacity!==void 0&&t.parameters.opacity<1)t.parameters.transparent=true;if(t.parameters.normalMap){s=THREE.ShaderUtils.lib.normal;a=THREE.UniformsUtils.clone(s.uniforms);l=t.parameters.color;p=t.parameters.specular;N=t.parameters.ambient;c=t.parameters.shininess;a.tNormal.texture=P.textures[t.parameters.normalMap];if(t.parameters.normalMapFactor)a.uNormalScale.value=
-t.parameters.normalMapFactor;if(t.parameters.map){a.tDiffuse.texture=t.parameters.map;a.enableDiffuse.value=true}if(t.parameters.lightMap){a.tAO.texture=t.parameters.lightMap;a.enableAO.value=true}if(t.parameters.specularMap){a.tSpecular.texture=P.textures[t.parameters.specularMap];a.enableSpecular.value=true}a.uDiffuseColor.value.setHex(l);a.uSpecularColor.value.setHex(p);a.uAmbientColor.value.setHex(N);a.uShininess.value=c;if(t.parameters.opacity)a.uOpacity.value=t.parameters.opacity;O=new THREE.ShaderMaterial({fragmentShader:s.fragmentShader,
-vertexShader:s.vertexShader,uniforms:a,lights:true,fog:true})}else O=new THREE[t.type](t.parameters);P.materials[m]=O}f(P.scene,C.objects);i.callbackSync(P);h()};THREE.TextureLoader=function(){THREE.EventTarget.call(this);this.crossOrigin=null};
+"cylinder"){G=new THREE.CylinderGeometry(p.topRad,p.botRad,p.height,p.radSegs,p.heightSegs);P.geometries[l]=G}else if(p.type==="torus"){G=new THREE.TorusGeometry(p.radius,p.tube,p.segmentsR,p.segmentsT);P.geometries[l]=G}else if(p.type==="icosahedron"){G=new THREE.IcosahedronGeometry(p.radius,p.subdivisions);P.geometries[l]=G}else if(p.type==="bin_mesh")c.load(d(p.url,C.urlBaseType),e(l));else if(p.type==="ascii_mesh")J.load(d(p.url,C.urlBaseType),e(l));else if(p.type==="embedded_mesh"){p=C.embeds[p.id];
+p.metadata=C.metadata;p&&J.createModel(p,g(l),"")}}for(s in C.textures){l=C.textures[s];if(l.url instanceof Array){L=L+l.url.length;for(p=0;p<l.url.length;p++)i.onLoadStart()}else{L=L+1;i.onLoadStart()}}X=L;for(s in C.textures){l=C.textures[s];if(l.mapping!==void 0&&THREE[l.mapping]!==void 0)l.mapping=new THREE[l.mapping];if(l.url instanceof Array){p=l.url.length;K=[];for(c=0;c<p;c++)K[c]=d(l.url[c],C.urlBaseType);p=THREE.ImageUtils.loadTextureCube(K,l.mapping,a(p))}else{p=THREE.ImageUtils.loadTexture(d(l.url,
+C.urlBaseType),l.mapping,a(1));if(THREE[l.minFilter]!==void 0)p.minFilter=THREE[l.minFilter];if(THREE[l.magFilter]!==void 0)p.magFilter=THREE[l.magFilter];if(l.repeat){p.repeat.set(l.repeat[0],l.repeat[1]);if(l.repeat[0]!==1)p.wrapS=THREE.RepeatWrapping;if(l.repeat[1]!==1)p.wrapT=THREE.RepeatWrapping}l.offset&&p.offset.set(l.offset[0],l.offset[1]);if(l.wrap){K={repeat:THREE.RepeatWrapping,mirror:THREE.MirroredRepeatWrapping};if(K[l.wrap[0]]!==void 0)p.wrapS=K[l.wrap[0]];if(K[l.wrap[1]]!==void 0)p.wrapT=
+K[l.wrap[1]]}}P.textures[s]=p}for(m in C.materials){u=C.materials[m];for(I in u.parameters)if(I==="envMap"||I==="map"||I==="lightMap")u.parameters[I]=P.textures[u.parameters[I]];else if(I==="shading")u.parameters[I]=u.parameters[I]=="flat"?THREE.FlatShading:THREE.SmoothShading;else if(I==="blending")u.parameters[I]=u.parameters[I]in THREE?THREE[u.parameters[I]]:THREE.NormalBlending;else if(I==="combine")u.parameters[I]=u.parameters[I]=="MixOperation"?THREE.MixOperation:THREE.MultiplyOperation;else if(I===
+"vertexColors")if(u.parameters[I]=="face")u.parameters[I]=THREE.FaceColors;else if(u.parameters[I])u.parameters[I]=THREE.VertexColors;if(u.parameters.opacity!==void 0&&u.parameters.opacity<1)u.parameters.transparent=true;if(u.parameters.normalMap){s=THREE.ShaderUtils.lib.normal;a=THREE.UniformsUtils.clone(s.uniforms);l=u.parameters.color;p=u.parameters.specular;K=u.parameters.ambient;c=u.parameters.shininess;a.tNormal.texture=P.textures[u.parameters.normalMap];if(u.parameters.normalMapFactor)a.uNormalScale.value=
+u.parameters.normalMapFactor;if(u.parameters.map){a.tDiffuse.texture=u.parameters.map;a.enableDiffuse.value=true}if(u.parameters.lightMap){a.tAO.texture=u.parameters.lightMap;a.enableAO.value=true}if(u.parameters.specularMap){a.tSpecular.texture=P.textures[u.parameters.specularMap];a.enableSpecular.value=true}a.uDiffuseColor.value.setHex(l);a.uSpecularColor.value.setHex(p);a.uAmbientColor.value.setHex(K);a.uShininess.value=c;if(u.parameters.opacity)a.uOpacity.value=u.parameters.opacity;O=new THREE.ShaderMaterial({fragmentShader:s.fragmentShader,
+vertexShader:s.vertexShader,uniforms:a,lights:true,fog:true})}else O=new THREE[u.type](u.parameters);P.materials[m]=O}f(P.scene,C.objects);i.callbackSync(P);h()};THREE.TextureLoader=function(){THREE.EventTarget.call(this);this.crossOrigin=null};
 THREE.TextureLoader.prototype={constructor:THREE.TextureLoader,load:function(a){var b=this,c=new Image;c.addEventListener("load",function(){var a=new THREE.Texture(c);a.needsUpdate=true;b.dispatchEvent({type:"load",content:a})},false);c.addEventListener("error",function(){b.dispatchEvent({type:"error",message:"Couldn't load URL ["+a+"]"})},false);if(b.crossOrigin)c.crossOrigin=b.crossOrigin;c.src=a}};
 THREE.Material=function(){this.id=THREE.MaterialCount++;this.name="";this.side=THREE.FrontSide;this.opacity=1;this.transparent=false;this.blending=THREE.NormalBlending;this.blendSrc=THREE.SrcAlphaFactor;this.blendDst=THREE.OneMinusSrcAlphaFactor;this.blendEquation=THREE.AddEquation;this.depthWrite=this.depthTest=true;this.polygonOffset=false;this.alphaTest=this.polygonOffsetUnits=this.polygonOffsetFactor=0;this.overdraw=false;this.needsUpdate=this.visible=true};
 THREE.Material.prototype.setValues=function(a){if(a!==void 0)for(var b in a){var c=a[b];if(c===void 0)console.warn("THREE.Material: '"+b+"' parameter is undefined.");else if(b in this){var d=this[b];d instanceof THREE.Color&&c instanceof THREE.Color?d.copy(c):d instanceof THREE.Color&&typeof c==="number"?d.setHex(c):d instanceof THREE.Vector3&&c instanceof THREE.Vector3?d.copy(c):this[b]=c}}};
@@ -254,38 +254,39 @@ THREE.Scene=function(){THREE.Object3D.call(this);this.overrideMaterial=this.fog=
 THREE.Scene.prototype.__addObject=function(a){if(a instanceof THREE.Light){this.__lights.indexOf(a)===-1&&this.__lights.push(a);a.target&&a.target.parent===void 0&&this.add(a.target)}else if(!(a instanceof THREE.Camera||a instanceof THREE.Bone)&&this.__objects.indexOf(a)===-1){this.__objects.push(a);this.__objectsAdded.push(a);var b=this.__objectsRemoved.indexOf(a);b!==-1&&this.__objectsRemoved.splice(b,1)}for(b=0;b<a.children.length;b++)this.__addObject(a.children[b])};
 THREE.Scene.prototype.__removeObject=function(a){if(a instanceof THREE.Light){var b=this.__lights.indexOf(a);b!==-1&&this.__lights.splice(b,1)}else if(!(a instanceof THREE.Camera)){b=this.__objects.indexOf(a);if(b!==-1){this.__objects.splice(b,1);this.__objectsRemoved.push(a);b=this.__objectsAdded.indexOf(a);b!==-1&&this.__objectsAdded.splice(b,1)}}for(b=0;b<a.children.length;b++)this.__removeObject(a.children[b])};
 THREE.Fog=function(a,b,c){this.color=new THREE.Color(a);this.near=b!==void 0?b:1;this.far=c!==void 0?c:1E3};THREE.FogExp2=function(a,b){this.color=new THREE.Color(a);this.density=b!==void 0?b:2.5E-4};
-THREE.CanvasRenderer=function(a){function b(a){if(t!==a)t=p.globalAlpha=a}function c(a){if(v!==a){if(a===THREE.NormalBlending)p.globalCompositeOperation="source-over";else if(a===THREE.AdditiveBlending)p.globalCompositeOperation="lighter";else if(a===THREE.SubtractiveBlending)p.globalCompositeOperation="darker";v=a}}function d(a){if(u!==a)u=p.strokeStyle=a}function f(a){if(A!==a)A=p.fillStyle=a}console.log("THREE.CanvasRenderer",THREE.REVISION);var a=a||{},e=this,g,h,i,j=new THREE.Projector,l=a.canvas!==
-void 0?a.canvas:document.createElement("canvas"),m,n,q,o,p=l.getContext("2d"),s=new THREE.Color(0),r=0,t=1,v=0,u=null,A=null,y=null,B=null,F=null,x,E,G,O,J=new THREE.RenderableVertex,N=new THREE.RenderableVertex,C,I,Q,K,H,X,P,L,ea,qa,ha,na,ba=new THREE.Color,aa=new THREE.Color,M=new THREE.Color,Y=new THREE.Color,ga=new THREE.Color,ra=[],oa=[],ta,Da,Ja,Sa,wa,db,Qa,Za,eb,kb,jb=new THREE.Rectangle,Ma=new THREE.Rectangle,Ca=new THREE.Rectangle,tb=false,Fa=new THREE.Color,Wa=new THREE.Color,Ha=new THREE.Color,
+THREE.CanvasRenderer=function(a){function b(a){if(u!==a)u=p.globalAlpha=a}function c(a){if(v!==a){if(a===THREE.NormalBlending)p.globalCompositeOperation="source-over";else if(a===THREE.AdditiveBlending)p.globalCompositeOperation="lighter";else if(a===THREE.SubtractiveBlending)p.globalCompositeOperation="darker";v=a}}function d(a){if(t!==a)t=p.strokeStyle=a}function f(a){if(A!==a)A=p.fillStyle=a}console.log("THREE.CanvasRenderer",THREE.REVISION);var a=a||{},e=this,g,h,i,j=new THREE.Projector,l=a.canvas!==
+void 0?a.canvas:document.createElement("canvas"),m,n,q,o,p=l.getContext("2d"),s=new THREE.Color(0),r=0,u=1,v=0,t=null,A=null,y=null,B=null,E=null,w,I,G,O,F=new THREE.RenderableVertex,K=new THREE.RenderableVertex,C,J,Q,L,H,X,P,M,ea,qa,ha,na,ba=new THREE.Color,aa=new THREE.Color,N=new THREE.Color,Y=new THREE.Color,ga=new THREE.Color,ra=[],oa=[],ta,Da,Ja,Sa,wa,db,Qa,Za,eb,kb,jb=new THREE.Rectangle,Ma=new THREE.Rectangle,Ca=new THREE.Rectangle,tb=false,Fa=new THREE.Color,Wa=new THREE.Color,Ha=new THREE.Color,
 ua=new THREE.Vector3,fb,k,gb,Ya,hb,ib,a=16;fb=document.createElement("canvas");fb.width=fb.height=2;k=fb.getContext("2d");k.fillStyle="rgba(0,0,0,1)";k.fillRect(0,0,2,2);gb=k.getImageData(0,0,2,2);Ya=gb.data;hb=document.createElement("canvas");hb.width=hb.height=a;ib=hb.getContext("2d");ib.translate(-a/2,-a/2);ib.scale(a,a);a--;this.domElement=l;this.sortElements=this.sortObjects=this.autoClear=true;this.info={render:{vertices:0,faces:0}};this.setSize=function(a,b){m=a;n=b;q=Math.floor(m/2);o=Math.floor(n/
-2);l.width=m;l.height=n;jb.set(-q,-o,q,o);Ma.set(-q,-o,q,o);t=1;v=0;F=B=y=A=u=null};this.setClearColor=function(a,b){s.copy(a);r=b!==void 0?b:1;Ma.set(-q,-o,q,o)};this.setClearColorHex=function(a,b){s.setHex(a);r=b!==void 0?b:1;Ma.set(-q,-o,q,o)};this.clear=function(){p.setTransform(1,0,0,-1,q,o);if(Ma.isEmpty()===false){Ma.minSelf(jb);Ma.inflate(2);r<1&&p.clearRect(Math.floor(Ma.getX()),Math.floor(Ma.getY()),Math.floor(Ma.getWidth()),Math.floor(Ma.getHeight()));if(r>0){c(THREE.NormalBlending);b(1);
+2);l.width=m;l.height=n;jb.set(-q,-o,q,o);Ma.set(-q,-o,q,o);u=1;v=0;E=B=y=A=t=null};this.setClearColor=function(a,b){s.copy(a);r=b!==void 0?b:1;Ma.set(-q,-o,q,o)};this.setClearColorHex=function(a,b){s.setHex(a);r=b!==void 0?b:1;Ma.set(-q,-o,q,o)};this.clear=function(){p.setTransform(1,0,0,-1,q,o);if(Ma.isEmpty()===false){Ma.minSelf(jb);Ma.inflate(2);r<1&&p.clearRect(Math.floor(Ma.getX()),Math.floor(Ma.getY()),Math.floor(Ma.getWidth()),Math.floor(Ma.getHeight()));if(r>0){c(THREE.NormalBlending);b(1);
 f("rgba("+Math.floor(s.r*255)+","+Math.floor(s.g*255)+","+Math.floor(s.b*255)+","+r+")");p.fillRect(Math.floor(Ma.getX()),Math.floor(Ma.getY()),Math.floor(Ma.getWidth()),Math.floor(Ma.getHeight()))}Ma.empty()}};this.render=function(a,l){function m(a,b,c){for(var d=0,f=i.length;d<f;d++){var e=i[d],g=e.color;if(e instanceof THREE.DirectionalLight){var h=e.matrixWorld.getPosition().normalize(),k=b.dot(h);if(!(k<=0)){k=k*e.intensity;c.r=c.r+g.r*k;c.g=c.g+g.g*k;c.b=c.b+g.b*k}}else if(e instanceof THREE.PointLight){h=
-e.matrixWorld.getPosition();k=b.dot(ua.sub(h,a).normalize());if(!(k<=0)){k=k*(e.distance==0?1:1-Math.min(a.distanceTo(h)/e.distance,1));if(k!=0){k=k*e.intensity;c.r=c.r+g.r*k;c.g=c.g+g.g*k;c.b=c.b+g.b*k}}}}}function n(a,d,f,g,h,i,k,j){e.info.render.vertices=e.info.render.vertices+3;e.info.render.faces++;b(j.opacity);c(j.blending);C=a.positionScreen.x;I=a.positionScreen.y;Q=d.positionScreen.x;K=d.positionScreen.y;H=f.positionScreen.x;X=f.positionScreen.y;r(C,I,Q,K,H,X);if(j instanceof THREE.MeshBasicMaterial)if(j.map!==
-null){if(j.map.mapping instanceof THREE.UVMapping){Sa=k.uvs[0];t(C,I,Q,K,H,X,Sa[g].u,Sa[g].v,Sa[h].u,Sa[h].v,Sa[i].u,Sa[i].v,j.map)}}else if(j.envMap!==null){if(j.envMap.mapping instanceof THREE.SphericalReflectionMapping){a=l.matrixWorldInverse;ua.copy(k.vertexNormalsWorld[g]);wa=(ua.x*a.elements[0]+ua.y*a.elements[4]+ua.z*a.elements[8])*0.5+0.5;db=(ua.x*a.elements[1]+ua.y*a.elements[5]+ua.z*a.elements[9])*0.5+0.5;ua.copy(k.vertexNormalsWorld[h]);Qa=(ua.x*a.elements[0]+ua.y*a.elements[4]+ua.z*a.elements[8])*
-0.5+0.5;Za=(ua.x*a.elements[1]+ua.y*a.elements[5]+ua.z*a.elements[9])*0.5+0.5;ua.copy(k.vertexNormalsWorld[i]);eb=(ua.x*a.elements[0]+ua.y*a.elements[4]+ua.z*a.elements[8])*0.5+0.5;kb=(ua.x*a.elements[1]+ua.y*a.elements[5]+ua.z*a.elements[9])*0.5+0.5;t(C,I,Q,K,H,X,wa,db,Qa,Za,eb,kb,j.envMap)}}else j.wireframe===true?u(j.color,j.wireframeLinewidth,j.wireframeLinecap,j.wireframeLinejoin):s(j.color);else if(j instanceof THREE.MeshLambertMaterial)if(tb===true)if(j.wireframe===false&&j.shading==THREE.SmoothShading&&
-k.vertexNormalsLength==3){aa.r=M.r=Y.r=Fa.r;aa.g=M.g=Y.g=Fa.g;aa.b=M.b=Y.b=Fa.b;m(k.v1.positionWorld,k.vertexNormalsWorld[0],aa);m(k.v2.positionWorld,k.vertexNormalsWorld[1],M);m(k.v3.positionWorld,k.vertexNormalsWorld[2],Y);aa.r=Math.max(0,Math.min(j.color.r*aa.r,1));aa.g=Math.max(0,Math.min(j.color.g*aa.g,1));aa.b=Math.max(0,Math.min(j.color.b*aa.b,1));M.r=Math.max(0,Math.min(j.color.r*M.r,1));M.g=Math.max(0,Math.min(j.color.g*M.g,1));M.b=Math.max(0,Math.min(j.color.b*M.b,1));Y.r=Math.max(0,Math.min(j.color.r*
-Y.r,1));Y.g=Math.max(0,Math.min(j.color.g*Y.g,1));Y.b=Math.max(0,Math.min(j.color.b*Y.b,1));ga.r=(M.r+Y.r)*0.5;ga.g=(M.g+Y.g)*0.5;ga.b=(M.b+Y.b)*0.5;Ja=A(aa,M,Y,ga);v(C,I,Q,K,H,X,0,0,1,0,0,1,Ja)}else{ba.r=Fa.r;ba.g=Fa.g;ba.b=Fa.b;m(k.centroidWorld,k.normalWorld,ba);ba.r=Math.max(0,Math.min(j.color.r*ba.r,1));ba.g=Math.max(0,Math.min(j.color.g*ba.g,1));ba.b=Math.max(0,Math.min(j.color.b*ba.b,1));j.wireframe===true?u(ba,j.wireframeLinewidth,j.wireframeLinecap,j.wireframeLinejoin):s(ba)}else j.wireframe===
-true?u(j.color,j.wireframeLinewidth,j.wireframeLinecap,j.wireframeLinejoin):s(j.color);else if(j instanceof THREE.MeshDepthMaterial){ta=l.near;Da=l.far;aa.r=aa.g=aa.b=1-ec(a.positionScreen.z,ta,Da);M.r=M.g=M.b=1-ec(d.positionScreen.z,ta,Da);Y.r=Y.g=Y.b=1-ec(f.positionScreen.z,ta,Da);ga.r=(M.r+Y.r)*0.5;ga.g=(M.g+Y.g)*0.5;ga.b=(M.b+Y.b)*0.5;Ja=A(aa,M,Y,ga);v(C,I,Q,K,H,X,0,0,1,0,0,1,Ja)}else if(j instanceof THREE.MeshNormalMaterial){ba.r=ic(k.normalWorld.x);ba.g=ic(k.normalWorld.y);ba.b=ic(k.normalWorld.z);
-j.wireframe===true?u(ba,j.wireframeLinewidth,j.wireframeLinecap,j.wireframeLinejoin):s(ba)}}function r(a,b,c,d,f,e){p.beginPath();p.moveTo(a,b);p.lineTo(c,d);p.lineTo(f,e);p.closePath()}function Sb(a,b,c,d,f,e,g,h){p.beginPath();p.moveTo(a,b);p.lineTo(c,d);p.lineTo(f,e);p.lineTo(g,h);p.closePath()}function u(a,b,c,f){if(y!==b)y=p.lineWidth=b;if(B!==c)B=p.lineCap=c;if(F!==f)F=p.lineJoin=f;d(a.getContextStyle());p.stroke();Ca.inflate(b*2)}function s(a){f(a.getContextStyle());p.fill()}function t(a,b,
-c,d,e,g,h,k,i,j,l,m,n){if(!(n.image===void 0||n.image.width===0)){if(n.needsUpdate===true||ra[n.id]===void 0){var o=n.wrapS==THREE.RepeatWrapping,dc=n.wrapT==THREE.RepeatWrapping;ra[n.id]=p.createPattern(n.image,o===true&&dc===true?"repeat":o===true&&dc===false?"repeat-x":o===false&&dc===true?"repeat-y":"no-repeat");n.needsUpdate=false}f(ra[n.id]);var o=n.offset.x/n.repeat.x,dc=n.offset.y/n.repeat.y,q=n.image.width*n.repeat.x,Sb=n.image.height*n.repeat.y,h=(h+o)*q,k=(1-k+dc)*Sb,c=c-a,d=d-b,e=e-a,
-g=g-b,i=(i+o)*q-h,j=(1-j+dc)*Sb-k,l=(l+o)*q-h,m=(1-m+dc)*Sb-k,o=i*m-l*j;if(o===0){if(oa[n.id]===void 0){b=document.createElement("canvas");b.width=n.image.width;b.height=n.image.height;b=b.getContext("2d");b.drawImage(n.image,0,0);oa[n.id]=b.getImageData(0,0,n.image.width,n.image.height).data}b=oa[n.id];h=(Math.floor(h)+Math.floor(k)*n.image.width)*4;ba.setRGB(b[h]/255,b[h+1]/255,b[h+2]/255);s(ba)}else{o=1/o;n=(m*c-j*e)*o;j=(m*d-j*g)*o;c=(i*e-l*c)*o;d=(i*g-l*d)*o;a=a-n*h-c*k;h=b-j*h-d*k;p.save();
-p.transform(n,j,c,d,a,h);p.fill();p.restore()}}}function v(a,b,c,d,f,e,g,h,k,i,j,l,n){var m,o;m=n.width-1;o=n.height-1;g=g*m;h=h*o;c=c-a;d=d-b;f=f-a;e=e-b;k=k*m-g;i=i*o-h;j=j*m-g;l=l*o-h;o=1/(k*l-j*i);m=(l*c-i*f)*o;i=(l*d-i*e)*o;c=(k*f-j*c)*o;d=(k*e-j*d)*o;a=a-m*g-c*h;b=b-i*g-d*h;p.save();p.transform(m,i,c,d,a,b);p.clip();p.drawImage(n,0,0);p.restore()}function A(a,b,c,d){var f=a.r*255|0,e=a.g*255|0,a=a.b*255|0,g=b.r*255|0,h=b.g*255|0,b=b.b*255|0,i=c.r*255|0,j=c.g*255|0,c=c.b*255|0,l=d.r*255|0,n=
-d.g*255|0,d=d.b*255|0;Ya[0]=f<0?0:f>255?255:f;Ya[1]=e<0?0:e>255?255:e;Ya[2]=a<0?0:a>255?255:a;Ya[4]=g<0?0:g>255?255:g;Ya[5]=h<0?0:h>255?255:h;Ya[6]=b<0?0:b>255?255:b;Ya[8]=i<0?0:i>255?255:i;Ya[9]=j<0?0:j>255?255:j;Ya[10]=c<0?0:c>255?255:c;Ya[12]=l<0?0:l>255?255:l;Ya[13]=n<0?0:n>255?255:n;Ya[14]=d<0?0:d>255?255:d;k.putImageData(gb,0,0);ib.drawImage(fb,0,0);return hb}function ec(a,b,c){a=(a-b)/(c-b);return a*a*(3-2*a)}function ic(a){a=(a+1)*0.5;return a<0?0:a>1?1:a}function Tb(a,b){var c=b.x-a.x,d=
-b.y-a.y,f=c*c+d*d;if(f!==0){f=1/Math.sqrt(f);c=c*f;d=d*f;b.x=b.x+c;b.y=b.y+d;a.x=a.x-c;a.y=a.y-d}}if(l instanceof THREE.Camera===false)console.error("THREE.CanvasRenderer.render: camera is not an instance of THREE.Camera.");else{var Ub,Dc,ja,V;this.autoClear===true?this.clear():p.setTransform(1,0,0,-1,q,o);e.info.render.vertices=0;e.info.render.faces=0;g=j.projectScene(a,l,this.sortElements);h=g.elements;i=g.lights;tb=i.length>0;if(tb===true){Fa.setRGB(0,0,0);Wa.setRGB(0,0,0);Ha.setRGB(0,0,0);Ub=
-0;for(Dc=i.length;Ub<Dc;Ub++){V=i[Ub];var fa=V.color;if(V instanceof THREE.AmbientLight){Fa.r=Fa.r+fa.r;Fa.g=Fa.g+fa.g;Fa.b=Fa.b+fa.b}else if(V instanceof THREE.DirectionalLight){Wa.r=Wa.r+fa.r;Wa.g=Wa.g+fa.g;Wa.b=Wa.b+fa.b}else if(V instanceof THREE.PointLight){Ha.r=Ha.r+fa.r;Ha.g=Ha.g+fa.g;Ha.b=Ha.b+fa.b}}}Ub=0;for(Dc=h.length;Ub<Dc;Ub++){ja=h[Ub];V=ja.material;if(!(V===void 0||V.visible===false)){Ca.empty();if(ja instanceof THREE.RenderableParticle){x=ja;x.x=x.x*q;x.y=x.y*o;var fa=x,Va=ja;b(V.opacity);
-c(V.blending);var rb=void 0,sb=void 0,lb=void 0,mb=void 0,jc=ja=void 0,Qc=void 0;if(V instanceof THREE.ParticleBasicMaterial)if(V.map===null){lb=Va.object.scale.x;mb=Va.object.scale.y;lb=lb*Va.scale.x*q;mb=mb*Va.scale.y*o;Ca.set(fa.x-lb,fa.y-mb,fa.x+lb,fa.y+mb);if(jb.intersects(Ca)!==false){f(V.color.getContextStyle());p.save();p.translate(fa.x,fa.y);p.rotate(-Va.rotation);p.scale(lb,mb);p.fillRect(-1,-1,2,2);p.restore()}}else{ja=V.map.image;jc=ja.width>>1;Qc=ja.height>>1;lb=Va.scale.x*q;mb=Va.scale.y*
-o;rb=lb*jc;sb=mb*Qc;Ca.set(fa.x-rb,fa.y-sb,fa.x+rb,fa.y+sb);if(jb.intersects(Ca)!==false){p.save();p.translate(fa.x,fa.y);p.rotate(-Va.rotation);p.scale(lb,-mb);p.translate(-jc,-Qc);p.drawImage(ja,0,0);p.restore()}}else if(V instanceof THREE.ParticleCanvasMaterial){rb=Va.scale.x*q;sb=Va.scale.y*o;Ca.set(fa.x-rb,fa.y-sb,fa.x+rb,fa.y+sb);if(jb.intersects(Ca)!==false){d(V.color.getContextStyle());f(V.color.getContextStyle());p.save();p.translate(fa.x,fa.y);p.rotate(-Va.rotation);p.scale(rb,sb);V.program(p);
-p.restore()}}}else if(ja instanceof THREE.RenderableLine){x=ja.v1;E=ja.v2;x.positionScreen.x=x.positionScreen.x*q;x.positionScreen.y=x.positionScreen.y*o;E.positionScreen.x=E.positionScreen.x*q;E.positionScreen.y=E.positionScreen.y*o;Ca.addPoint(x.positionScreen.x,x.positionScreen.y);Ca.addPoint(E.positionScreen.x,E.positionScreen.y);if(jb.intersects(Ca)===true){fa=x;Va=E;b(V.opacity);c(V.blending);p.beginPath();p.moveTo(fa.positionScreen.x,fa.positionScreen.y);p.lineTo(Va.positionScreen.x,Va.positionScreen.y);
-if(V instanceof THREE.LineBasicMaterial){fa=V.linewidth;if(y!==fa)y=p.lineWidth=fa;fa=V.linecap;if(B!==fa)B=p.lineCap=fa;fa=V.linejoin;if(F!==fa)F=p.lineJoin=fa;d(V.color.getContextStyle());p.stroke();Ca.inflate(V.linewidth*2)}}}else if(ja instanceof THREE.RenderableFace3){x=ja.v1;E=ja.v2;G=ja.v3;x.positionScreen.x=x.positionScreen.x*q;x.positionScreen.y=x.positionScreen.y*o;E.positionScreen.x=E.positionScreen.x*q;E.positionScreen.y=E.positionScreen.y*o;G.positionScreen.x=G.positionScreen.x*q;G.positionScreen.y=
-G.positionScreen.y*o;if(V.overdraw===true){Tb(x.positionScreen,E.positionScreen);Tb(E.positionScreen,G.positionScreen);Tb(G.positionScreen,x.positionScreen)}Ca.add3Points(x.positionScreen.x,x.positionScreen.y,E.positionScreen.x,E.positionScreen.y,G.positionScreen.x,G.positionScreen.y);jb.intersects(Ca)===true&&n(x,E,G,0,1,2,ja,V,a)}else if(ja instanceof THREE.RenderableFace4){x=ja.v1;E=ja.v2;G=ja.v3;O=ja.v4;x.positionScreen.x=x.positionScreen.x*q;x.positionScreen.y=x.positionScreen.y*o;E.positionScreen.x=
-E.positionScreen.x*q;E.positionScreen.y=E.positionScreen.y*o;G.positionScreen.x=G.positionScreen.x*q;G.positionScreen.y=G.positionScreen.y*o;O.positionScreen.x=O.positionScreen.x*q;O.positionScreen.y=O.positionScreen.y*o;J.positionScreen.copy(E.positionScreen);N.positionScreen.copy(O.positionScreen);if(V.overdraw===true){Tb(x.positionScreen,E.positionScreen);Tb(E.positionScreen,O.positionScreen);Tb(O.positionScreen,x.positionScreen);Tb(G.positionScreen,J.positionScreen);Tb(G.positionScreen,N.positionScreen)}Ca.addPoint(x.positionScreen.x,
-x.positionScreen.y);Ca.addPoint(E.positionScreen.x,E.positionScreen.y);Ca.addPoint(G.positionScreen.x,G.positionScreen.y);Ca.addPoint(O.positionScreen.x,O.positionScreen.y);if(jb.intersects(Ca)===true){fa=x;Va=E;rb=G;sb=O;lb=J;mb=N;jc=a;e.info.render.vertices=e.info.render.vertices+4;e.info.render.faces++;b(V.opacity);c(V.blending);if(V.map!==void 0&&V.map!==null||V.envMap!==void 0&&V.envMap!==null){n(fa,Va,sb,0,1,3,ja,V,jc);n(lb,rb,mb,1,2,3,ja,V,jc)}else{C=fa.positionScreen.x;I=fa.positionScreen.y;
-Q=Va.positionScreen.x;K=Va.positionScreen.y;H=rb.positionScreen.x;X=rb.positionScreen.y;P=sb.positionScreen.x;L=sb.positionScreen.y;ea=lb.positionScreen.x;qa=lb.positionScreen.y;ha=mb.positionScreen.x;na=mb.positionScreen.y;if(V instanceof THREE.MeshBasicMaterial){Sb(C,I,Q,K,H,X,P,L);V.wireframe===true?u(V.color,V.wireframeLinewidth,V.wireframeLinecap,V.wireframeLinejoin):s(V.color)}else if(V instanceof THREE.MeshLambertMaterial)if(tb===true)if(V.wireframe===false&&V.shading==THREE.SmoothShading&&
-ja.vertexNormalsLength==4){aa.r=M.r=Y.r=ga.r=Fa.r;aa.g=M.g=Y.g=ga.g=Fa.g;aa.b=M.b=Y.b=ga.b=Fa.b;m(ja.v1.positionWorld,ja.vertexNormalsWorld[0],aa);m(ja.v2.positionWorld,ja.vertexNormalsWorld[1],M);m(ja.v4.positionWorld,ja.vertexNormalsWorld[3],Y);m(ja.v3.positionWorld,ja.vertexNormalsWorld[2],ga);aa.r=Math.max(0,Math.min(V.color.r*aa.r,1));aa.g=Math.max(0,Math.min(V.color.g*aa.g,1));aa.b=Math.max(0,Math.min(V.color.b*aa.b,1));M.r=Math.max(0,Math.min(V.color.r*M.r,1));M.g=Math.max(0,Math.min(V.color.g*
-M.g,1));M.b=Math.max(0,Math.min(V.color.b*M.b,1));Y.r=Math.max(0,Math.min(V.color.r*Y.r,1));Y.g=Math.max(0,Math.min(V.color.g*Y.g,1));Y.b=Math.max(0,Math.min(V.color.b*Y.b,1));ga.r=Math.max(0,Math.min(V.color.r*ga.r,1));ga.g=Math.max(0,Math.min(V.color.g*ga.g,1));ga.b=Math.max(0,Math.min(V.color.b*ga.b,1));Ja=A(aa,M,Y,ga);r(C,I,Q,K,P,L);v(C,I,Q,K,P,L,0,0,1,0,0,1,Ja);r(ea,qa,H,X,ha,na);v(ea,qa,H,X,ha,na,1,0,1,1,0,1,Ja)}else{ba.r=Fa.r;ba.g=Fa.g;ba.b=Fa.b;m(ja.centroidWorld,ja.normalWorld,ba);ba.r=Math.max(0,
-Math.min(V.color.r*ba.r,1));ba.g=Math.max(0,Math.min(V.color.g*ba.g,1));ba.b=Math.max(0,Math.min(V.color.b*ba.b,1));Sb(C,I,Q,K,H,X,P,L);V.wireframe===true?u(ba,V.wireframeLinewidth,V.wireframeLinecap,V.wireframeLinejoin):s(ba)}else{Sb(C,I,Q,K,H,X,P,L);V.wireframe===true?u(V.color,V.wireframeLinewidth,V.wireframeLinecap,V.wireframeLinejoin):s(V.color)}else if(V instanceof THREE.MeshNormalMaterial){ba.r=ic(ja.normalWorld.x);ba.g=ic(ja.normalWorld.y);ba.b=ic(ja.normalWorld.z);Sb(C,I,Q,K,H,X,P,L);V.wireframe===
-true?u(ba,V.wireframeLinewidth,V.wireframeLinecap,V.wireframeLinejoin):s(ba)}else if(V instanceof THREE.MeshDepthMaterial){ta=l.near;Da=l.far;aa.r=aa.g=aa.b=1-ec(fa.positionScreen.z,ta,Da);M.r=M.g=M.b=1-ec(Va.positionScreen.z,ta,Da);Y.r=Y.g=Y.b=1-ec(sb.positionScreen.z,ta,Da);ga.r=ga.g=ga.b=1-ec(rb.positionScreen.z,ta,Da);Ja=A(aa,M,Y,ga);r(C,I,Q,K,P,L);v(C,I,Q,K,P,L,0,0,1,0,0,1,Ja);r(ea,qa,H,X,ha,na);v(ea,qa,H,X,ha,na,1,0,1,1,0,1,Ja)}}}}Ma.addRectangle(Ca)}}p.setTransform(1,0,0,1,0,0)}}};
-THREE.ShaderChunk={fog_pars_fragment:"#ifdef USE_FOG\nuniform vec3 fogColor;\n#ifdef FOG_EXP2\nuniform float fogDensity;\n#else\nuniform float fogNear;\nuniform float fogFar;\n#endif\n#endif",fog_fragment:"#ifdef USE_FOG\nfloat depth = gl_FragCoord.z / gl_FragCoord.w;\n#ifdef FOG_EXP2\nconst float LOG2 = 1.442695;\nfloat fogFactor = exp2( - fogDensity * fogDensity * depth * depth * LOG2 );\nfogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );\n#else\nfloat fogFactor = smoothstep( fogNear, fogFar, depth );\n#endif\ngl_FragColor = mix( gl_FragColor, vec4( fogColor, gl_FragColor.w ), fogFactor );\n#endif",
-envmap_pars_fragment:"#ifdef USE_ENVMAP\nuniform float reflectivity;\nuniform samplerCube envMap;\nuniform float flipEnvMap;\nuniform int combine;\n#ifdef USE_BUMPMAP\nuniform bool useRefract;\nuniform float refractionRatio;\n#else\nvarying vec3 vReflect;\n#endif\n#endif",envmap_fragment:"#ifdef USE_ENVMAP\nvec3 reflectVec;\n#ifdef USE_BUMPMAP\nvec3 cameraToVertex = normalize( vWorldPosition - cameraPosition );\nif ( useRefract ) {\nreflectVec = refract( cameraToVertex, normal, refractionRatio );\n} else { \nreflectVec = reflect( cameraToVertex, normal );\n}\n#else\nreflectVec = vReflect;\n#endif\n#ifdef DOUBLE_SIDED\nfloat flipNormal = ( -1.0 + 2.0 * float( gl_FrontFacing ) );\nvec4 cubeColor = textureCube( envMap, flipNormal * vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n#else\nvec4 cubeColor = textureCube( envMap, vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n#endif\n#ifdef GAMMA_INPUT\ncubeColor.xyz *= cubeColor.xyz;\n#endif\nif ( combine == 1 ) {\ngl_FragColor.xyz = mix( gl_FragColor.xyz, cubeColor.xyz, specularStrength * reflectivity );\n} else {\ngl_FragColor.xyz = mix( gl_FragColor.xyz, gl_FragColor.xyz * cubeColor.xyz, specularStrength * reflectivity );\n}\n#endif",
+e.matrixWorld.getPosition();k=b.dot(ua.sub(h,a).normalize());if(!(k<=0)){k=k*(e.distance==0?1:1-Math.min(a.distanceTo(h)/e.distance,1));if(k!=0){k=k*e.intensity;c.r=c.r+g.r*k;c.g=c.g+g.g*k;c.b=c.b+g.b*k}}}}}function n(a,d,f,g,h,i,k,j){e.info.render.vertices=e.info.render.vertices+3;e.info.render.faces++;b(j.opacity);c(j.blending);C=a.positionScreen.x;J=a.positionScreen.y;Q=d.positionScreen.x;L=d.positionScreen.y;H=f.positionScreen.x;X=f.positionScreen.y;rc(C,J,Q,L,H,X);if(j instanceof THREE.MeshBasicMaterial)if(j.map!==
+null){if(j.map.mapping instanceof THREE.UVMapping){Sa=k.uvs[0];s(C,J,Q,L,H,X,Sa[g].u,Sa[g].v,Sa[h].u,Sa[h].v,Sa[i].u,Sa[i].v,j.map)}}else if(j.envMap!==null){if(j.envMap.mapping instanceof THREE.SphericalReflectionMapping){a=l.matrixWorldInverse;ua.copy(k.vertexNormalsWorld[g]);wa=(ua.x*a.elements[0]+ua.y*a.elements[4]+ua.z*a.elements[8])*0.5+0.5;db=(ua.x*a.elements[1]+ua.y*a.elements[5]+ua.z*a.elements[9])*0.5+0.5;ua.copy(k.vertexNormalsWorld[h]);Qa=(ua.x*a.elements[0]+ua.y*a.elements[4]+ua.z*a.elements[8])*
+0.5+0.5;Za=(ua.x*a.elements[1]+ua.y*a.elements[5]+ua.z*a.elements[9])*0.5+0.5;ua.copy(k.vertexNormalsWorld[i]);eb=(ua.x*a.elements[0]+ua.y*a.elements[4]+ua.z*a.elements[8])*0.5+0.5;kb=(ua.x*a.elements[1]+ua.y*a.elements[5]+ua.z*a.elements[9])*0.5+0.5;s(C,J,Q,L,H,X,wa,db,Qa,Za,eb,kb,j.envMap)}}else j.wireframe===true?t(j.color,j.wireframeLinewidth,j.wireframeLinecap,j.wireframeLinejoin):r(j.color);else if(j instanceof THREE.MeshLambertMaterial)if(tb===true)if(j.wireframe===false&&j.shading==THREE.SmoothShading&&
+k.vertexNormalsLength==3){aa.r=N.r=Y.r=Fa.r;aa.g=N.g=Y.g=Fa.g;aa.b=N.b=Y.b=Fa.b;m(k.v1.positionWorld,k.vertexNormalsWorld[0],aa);m(k.v2.positionWorld,k.vertexNormalsWorld[1],N);m(k.v3.positionWorld,k.vertexNormalsWorld[2],Y);aa.r=Math.max(0,Math.min(j.color.r*aa.r,1));aa.g=Math.max(0,Math.min(j.color.g*aa.g,1));aa.b=Math.max(0,Math.min(j.color.b*aa.b,1));N.r=Math.max(0,Math.min(j.color.r*N.r,1));N.g=Math.max(0,Math.min(j.color.g*N.g,1));N.b=Math.max(0,Math.min(j.color.b*N.b,1));Y.r=Math.max(0,Math.min(j.color.r*
+Y.r,1));Y.g=Math.max(0,Math.min(j.color.g*Y.g,1));Y.b=Math.max(0,Math.min(j.color.b*Y.b,1));ga.r=(N.r+Y.r)*0.5;ga.g=(N.g+Y.g)*0.5;ga.b=(N.b+Y.b)*0.5;Ja=v(aa,N,Y,ga);u(C,J,Q,L,H,X,0,0,1,0,0,1,Ja)}else{ba.r=Fa.r;ba.g=Fa.g;ba.b=Fa.b;m(k.centroidWorld,k.normalWorld,ba);ba.r=Math.max(0,Math.min(j.color.r*ba.r,1));ba.g=Math.max(0,Math.min(j.color.g*ba.g,1));ba.b=Math.max(0,Math.min(j.color.b*ba.b,1));j.wireframe===true?t(ba,j.wireframeLinewidth,j.wireframeLinecap,j.wireframeLinejoin):r(ba)}else j.wireframe===
+true?t(j.color,j.wireframeLinewidth,j.wireframeLinecap,j.wireframeLinejoin):r(j.color);else if(j instanceof THREE.MeshDepthMaterial){ta=l.near;Da=l.far;aa.r=aa.g=aa.b=1-A(a.positionScreen.z,ta,Da);N.r=N.g=N.b=1-A(d.positionScreen.z,ta,Da);Y.r=Y.g=Y.b=1-A(f.positionScreen.z,ta,Da);ga.r=(N.r+Y.r)*0.5;ga.g=(N.g+Y.g)*0.5;ga.b=(N.b+Y.b)*0.5;Ja=v(aa,N,Y,ga);u(C,J,Q,L,H,X,0,0,1,0,0,1,Ja)}else if(j instanceof THREE.MeshNormalMaterial){ba.r=hc(k.normalWorld.x);ba.g=hc(k.normalWorld.y);ba.b=hc(k.normalWorld.z);
+j.wireframe===true?t(ba,j.wireframeLinewidth,j.wireframeLinecap,j.wireframeLinejoin):r(ba)}}function rc(a,b,c,d,f,e){p.beginPath();p.moveTo(a,b);p.lineTo(c,d);p.lineTo(f,e);p.closePath()}function Sb(a,b,c,d,f,e,g,h){p.beginPath();p.moveTo(a,b);p.lineTo(c,d);p.lineTo(f,e);p.lineTo(g,h);p.closePath()}function t(a,b,c,f){if(y!==b)y=p.lineWidth=b;if(B!==c)B=p.lineCap=c;if(E!==f)E=p.lineJoin=f;d(a.getContextStyle());p.stroke();Ca.inflate(b*2)}function r(a){f(a.getContextStyle());p.fill()}function s(a,
+b,c,d,e,g,h,i,k,j,l,m,n){if(!(n.image===void 0||n.image.width===0)){if(n.needsUpdate===true||ra[n.id]===void 0){var o=n.wrapS==THREE.RepeatWrapping,dc=n.wrapT==THREE.RepeatWrapping;ra[n.id]=p.createPattern(n.image,o===true&&dc===true?"repeat":o===true&&dc===false?"repeat-x":o===false&&dc===true?"repeat-y":"no-repeat");n.needsUpdate=false}f(ra[n.id]);var o=n.offset.x/n.repeat.x,dc=n.offset.y/n.repeat.y,q=n.image.width*n.repeat.x,Sb=n.image.height*n.repeat.y,h=(h+o)*q,i=(1-i+dc)*Sb,c=c-a,d=d-b,e=e-
+a,g=g-b,k=(k+o)*q-h,j=(1-j+dc)*Sb-i,l=(l+o)*q-h,m=(1-m+dc)*Sb-i,o=k*m-l*j;if(o===0){if(oa[n.id]===void 0){b=document.createElement("canvas");b.width=n.image.width;b.height=n.image.height;b=b.getContext("2d");b.drawImage(n.image,0,0);oa[n.id]=b.getImageData(0,0,n.image.width,n.image.height).data}b=oa[n.id];h=(Math.floor(h)+Math.floor(i)*n.image.width)*4;ba.setRGB(b[h]/255,b[h+1]/255,b[h+2]/255);r(ba)}else{o=1/o;n=(m*c-j*e)*o;j=(m*d-j*g)*o;c=(k*e-l*c)*o;d=(k*g-l*d)*o;a=a-n*h-c*i;h=b-j*h-d*i;p.save();
+p.transform(n,j,c,d,a,h);p.fill();p.restore()}}}function u(a,b,c,d,f,e,g,h,i,k,j,l,n){var m,o;m=n.width-1;o=n.height-1;g=g*m;h=h*o;c=c-a;d=d-b;f=f-a;e=e-b;i=i*m-g;k=k*o-h;j=j*m-g;l=l*o-h;o=1/(i*l-j*k);m=(l*c-k*f)*o;k=(l*d-k*e)*o;c=(i*f-j*c)*o;d=(i*e-j*d)*o;a=a-m*g-c*h;b=b-k*g-d*h;p.save();p.transform(m,k,c,d,a,b);p.clip();p.drawImage(n,0,0);p.restore()}function v(a,b,c,d){var f=a.r*255|0,e=a.g*255|0,a=a.b*255|0,g=b.r*255|0,h=b.g*255|0,b=b.b*255|0,i=c.r*255|0,j=c.g*255|0,c=c.b*255|0,l=d.r*255|0,n=
+d.g*255|0,d=d.b*255|0;Ya[0]=f<0?0:f>255?255:f;Ya[1]=e<0?0:e>255?255:e;Ya[2]=a<0?0:a>255?255:a;Ya[4]=g<0?0:g>255?255:g;Ya[5]=h<0?0:h>255?255:h;Ya[6]=b<0?0:b>255?255:b;Ya[8]=i<0?0:i>255?255:i;Ya[9]=j<0?0:j>255?255:j;Ya[10]=c<0?0:c>255?255:c;Ya[12]=l<0?0:l>255?255:l;Ya[13]=n<0?0:n>255?255:n;Ya[14]=d<0?0:d>255?255:d;k.putImageData(gb,0,0);ib.drawImage(fb,0,0);return hb}function A(a,b,c){a=(a-b)/(c-b);return a*a*(3-2*a)}function hc(a){a=(a+1)*0.5;return a<0?0:a>1?1:a}function Tb(a,b){var c=b.x-a.x,d=b.y-
+a.y,f=c*c+d*d;if(f!==0){f=1/Math.sqrt(f);c=c*f;d=d*f;b.x=b.x+c;b.y=b.y+d;a.x=a.x-c;a.y=a.y-d}}if(l instanceof THREE.Camera===false)console.error("THREE.CanvasRenderer.render: camera is not an instance of THREE.Camera.");else{var Ub,Dc,ja,V;this.autoClear===true?this.clear():p.setTransform(1,0,0,-1,q,o);e.info.render.vertices=0;e.info.render.faces=0;g=j.projectScene(a,l,this.sortElements);h=g.elements;i=g.lights;tb=i.length>0;if(tb===true){Fa.setRGB(0,0,0);Wa.setRGB(0,0,0);Ha.setRGB(0,0,0);Ub=0;for(Dc=
+i.length;Ub<Dc;Ub++){V=i[Ub];var fa=V.color;if(V instanceof THREE.AmbientLight){Fa.r=Fa.r+fa.r;Fa.g=Fa.g+fa.g;Fa.b=Fa.b+fa.b}else if(V instanceof THREE.DirectionalLight){Wa.r=Wa.r+fa.r;Wa.g=Wa.g+fa.g;Wa.b=Wa.b+fa.b}else if(V instanceof THREE.PointLight){Ha.r=Ha.r+fa.r;Ha.g=Ha.g+fa.g;Ha.b=Ha.b+fa.b}}}Ub=0;for(Dc=h.length;Ub<Dc;Ub++){ja=h[Ub];V=ja.material;if(!(V===void 0||V.visible===false)){Ca.empty();if(ja instanceof THREE.RenderableParticle){w=ja;w.x=w.x*q;w.y=w.y*o;var fa=w,Va=ja;b(V.opacity);
+c(V.blending);var rb=void 0,sb=void 0,lb=void 0,mb=void 0,ic=ja=void 0,Qc=void 0;if(V instanceof THREE.ParticleBasicMaterial)if(V.map===null){lb=Va.object.scale.x;mb=Va.object.scale.y;lb=lb*Va.scale.x*q;mb=mb*Va.scale.y*o;Ca.set(fa.x-lb,fa.y-mb,fa.x+lb,fa.y+mb);if(jb.intersects(Ca)!==false){f(V.color.getContextStyle());p.save();p.translate(fa.x,fa.y);p.rotate(-Va.rotation);p.scale(lb,mb);p.fillRect(-1,-1,2,2);p.restore()}}else{ja=V.map.image;ic=ja.width>>1;Qc=ja.height>>1;lb=Va.scale.x*q;mb=Va.scale.y*
+o;rb=lb*ic;sb=mb*Qc;Ca.set(fa.x-rb,fa.y-sb,fa.x+rb,fa.y+sb);if(jb.intersects(Ca)!==false){p.save();p.translate(fa.x,fa.y);p.rotate(-Va.rotation);p.scale(lb,-mb);p.translate(-ic,-Qc);p.drawImage(ja,0,0);p.restore()}}else if(V instanceof THREE.ParticleCanvasMaterial){rb=Va.scale.x*q;sb=Va.scale.y*o;Ca.set(fa.x-rb,fa.y-sb,fa.x+rb,fa.y+sb);if(jb.intersects(Ca)!==false){d(V.color.getContextStyle());f(V.color.getContextStyle());p.save();p.translate(fa.x,fa.y);p.rotate(-Va.rotation);p.scale(rb,sb);V.program(p);
+p.restore()}}}else if(ja instanceof THREE.RenderableLine){w=ja.v1;I=ja.v2;w.positionScreen.x=w.positionScreen.x*q;w.positionScreen.y=w.positionScreen.y*o;I.positionScreen.x=I.positionScreen.x*q;I.positionScreen.y=I.positionScreen.y*o;Ca.addPoint(w.positionScreen.x,w.positionScreen.y);Ca.addPoint(I.positionScreen.x,I.positionScreen.y);if(jb.intersects(Ca)===true){fa=w;Va=I;b(V.opacity);c(V.blending);p.beginPath();p.moveTo(fa.positionScreen.x,fa.positionScreen.y);p.lineTo(Va.positionScreen.x,Va.positionScreen.y);
+if(V instanceof THREE.LineBasicMaterial){fa=V.linewidth;if(y!==fa)y=p.lineWidth=fa;fa=V.linecap;if(B!==fa)B=p.lineCap=fa;fa=V.linejoin;if(E!==fa)E=p.lineJoin=fa;d(V.color.getContextStyle());p.stroke();Ca.inflate(V.linewidth*2)}}}else if(ja instanceof THREE.RenderableFace3){w=ja.v1;I=ja.v2;G=ja.v3;w.positionScreen.x=w.positionScreen.x*q;w.positionScreen.y=w.positionScreen.y*o;I.positionScreen.x=I.positionScreen.x*q;I.positionScreen.y=I.positionScreen.y*o;G.positionScreen.x=G.positionScreen.x*q;G.positionScreen.y=
+G.positionScreen.y*o;if(V.overdraw===true){Tb(w.positionScreen,I.positionScreen);Tb(I.positionScreen,G.positionScreen);Tb(G.positionScreen,w.positionScreen)}Ca.add3Points(w.positionScreen.x,w.positionScreen.y,I.positionScreen.x,I.positionScreen.y,G.positionScreen.x,G.positionScreen.y);jb.intersects(Ca)===true&&n(w,I,G,0,1,2,ja,V,a)}else if(ja instanceof THREE.RenderableFace4){w=ja.v1;I=ja.v2;G=ja.v3;O=ja.v4;w.positionScreen.x=w.positionScreen.x*q;w.positionScreen.y=w.positionScreen.y*o;I.positionScreen.x=
+I.positionScreen.x*q;I.positionScreen.y=I.positionScreen.y*o;G.positionScreen.x=G.positionScreen.x*q;G.positionScreen.y=G.positionScreen.y*o;O.positionScreen.x=O.positionScreen.x*q;O.positionScreen.y=O.positionScreen.y*o;F.positionScreen.copy(I.positionScreen);K.positionScreen.copy(O.positionScreen);if(V.overdraw===true){Tb(w.positionScreen,I.positionScreen);Tb(I.positionScreen,O.positionScreen);Tb(O.positionScreen,w.positionScreen);Tb(G.positionScreen,F.positionScreen);Tb(G.positionScreen,K.positionScreen)}Ca.addPoint(w.positionScreen.x,
+w.positionScreen.y);Ca.addPoint(I.positionScreen.x,I.positionScreen.y);Ca.addPoint(G.positionScreen.x,G.positionScreen.y);Ca.addPoint(O.positionScreen.x,O.positionScreen.y);if(jb.intersects(Ca)===true){fa=w;Va=I;rb=G;sb=O;lb=F;mb=K;ic=a;e.info.render.vertices=e.info.render.vertices+4;e.info.render.faces++;b(V.opacity);c(V.blending);if(V.map!==void 0&&V.map!==null||V.envMap!==void 0&&V.envMap!==null){n(fa,Va,sb,0,1,3,ja,V,ic);n(lb,rb,mb,1,2,3,ja,V,ic)}else{C=fa.positionScreen.x;J=fa.positionScreen.y;
+Q=Va.positionScreen.x;L=Va.positionScreen.y;H=rb.positionScreen.x;X=rb.positionScreen.y;P=sb.positionScreen.x;M=sb.positionScreen.y;ea=lb.positionScreen.x;qa=lb.positionScreen.y;ha=mb.positionScreen.x;na=mb.positionScreen.y;if(V instanceof THREE.MeshBasicMaterial){Sb(C,J,Q,L,H,X,P,M);V.wireframe===true?t(V.color,V.wireframeLinewidth,V.wireframeLinecap,V.wireframeLinejoin):r(V.color)}else if(V instanceof THREE.MeshLambertMaterial)if(tb===true)if(V.wireframe===false&&V.shading==THREE.SmoothShading&&
+ja.vertexNormalsLength==4){aa.r=N.r=Y.r=ga.r=Fa.r;aa.g=N.g=Y.g=ga.g=Fa.g;aa.b=N.b=Y.b=ga.b=Fa.b;m(ja.v1.positionWorld,ja.vertexNormalsWorld[0],aa);m(ja.v2.positionWorld,ja.vertexNormalsWorld[1],N);m(ja.v4.positionWorld,ja.vertexNormalsWorld[3],Y);m(ja.v3.positionWorld,ja.vertexNormalsWorld[2],ga);aa.r=Math.max(0,Math.min(V.color.r*aa.r,1));aa.g=Math.max(0,Math.min(V.color.g*aa.g,1));aa.b=Math.max(0,Math.min(V.color.b*aa.b,1));N.r=Math.max(0,Math.min(V.color.r*N.r,1));N.g=Math.max(0,Math.min(V.color.g*
+N.g,1));N.b=Math.max(0,Math.min(V.color.b*N.b,1));Y.r=Math.max(0,Math.min(V.color.r*Y.r,1));Y.g=Math.max(0,Math.min(V.color.g*Y.g,1));Y.b=Math.max(0,Math.min(V.color.b*Y.b,1));ga.r=Math.max(0,Math.min(V.color.r*ga.r,1));ga.g=Math.max(0,Math.min(V.color.g*ga.g,1));ga.b=Math.max(0,Math.min(V.color.b*ga.b,1));Ja=v(aa,N,Y,ga);rc(C,J,Q,L,P,M);u(C,J,Q,L,P,M,0,0,1,0,0,1,Ja);rc(ea,qa,H,X,ha,na);u(ea,qa,H,X,ha,na,1,0,1,1,0,1,Ja)}else{ba.r=Fa.r;ba.g=Fa.g;ba.b=Fa.b;m(ja.centroidWorld,ja.normalWorld,ba);ba.r=
+Math.max(0,Math.min(V.color.r*ba.r,1));ba.g=Math.max(0,Math.min(V.color.g*ba.g,1));ba.b=Math.max(0,Math.min(V.color.b*ba.b,1));Sb(C,J,Q,L,H,X,P,M);V.wireframe===true?t(ba,V.wireframeLinewidth,V.wireframeLinecap,V.wireframeLinejoin):r(ba)}else{Sb(C,J,Q,L,H,X,P,M);V.wireframe===true?t(V.color,V.wireframeLinewidth,V.wireframeLinecap,V.wireframeLinejoin):r(V.color)}else if(V instanceof THREE.MeshNormalMaterial){ba.r=hc(ja.normalWorld.x);ba.g=hc(ja.normalWorld.y);ba.b=hc(ja.normalWorld.z);Sb(C,J,Q,L,H,
+X,P,M);V.wireframe===true?t(ba,V.wireframeLinewidth,V.wireframeLinecap,V.wireframeLinejoin):r(ba)}else if(V instanceof THREE.MeshDepthMaterial){ta=l.near;Da=l.far;aa.r=aa.g=aa.b=1-A(fa.positionScreen.z,ta,Da);N.r=N.g=N.b=1-A(Va.positionScreen.z,ta,Da);Y.r=Y.g=Y.b=1-A(sb.positionScreen.z,ta,Da);ga.r=ga.g=ga.b=1-A(rb.positionScreen.z,ta,Da);Ja=v(aa,N,Y,ga);rc(C,J,Q,L,P,M);u(C,J,Q,L,P,M,0,0,1,0,0,1,Ja);rc(ea,qa,H,X,ha,na);u(ea,qa,H,X,ha,na,1,0,1,1,0,1,Ja)}}}}Ma.addRectangle(Ca)}}p.setTransform(1,0,0,
+1,0,0)}}};
+THREE.ShaderChunk={fog_pars_fragment:"#ifdef USE_FOG\nuniform vec3 fogColor;\n#ifdef FOG_EXP2\nuniform float fogDensity;\n#else\nuniform float fogNear;\nuniform float fogFar;\n#endif\n#endif",fog_fragment:"#ifdef USE_FOG\nfloat depth = gl_FragCoord.z / gl_FragCoord.w;\n#ifdef FOG_EXP2\nconst float LOG2 = 1.442695;\nfloat fogFactor = exp2( - fogDensity * fogDensity * depth * depth * LOG2 );\nfogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );\n#else\nfloat fogFactor = smoothstep( fogNear, fogFar, depth );\n#endif\ngl_FragColor = mix( gl_FragColor, vec4( fogColor, gl_FragColor.w ), fogFactor );\n#endif",envmap_pars_fragment:"#ifdef USE_ENVMAP\nuniform float reflectivity;\nuniform samplerCube envMap;\nuniform float flipEnvMap;\nuniform int combine;\n#ifdef USE_BUMPMAP\nuniform bool useRefract;\nuniform float refractionRatio;\n#else\nvarying vec3 vReflect;\n#endif\n#endif",
+envmap_fragment:"#ifdef USE_ENVMAP\nvec3 reflectVec;\n#ifdef USE_BUMPMAP\nvec3 cameraToVertex = normalize( vWorldPosition - cameraPosition );\nif ( useRefract ) {\nreflectVec = refract( cameraToVertex, normal, refractionRatio );\n} else { \nreflectVec = reflect( cameraToVertex, normal );\n}\n#else\nreflectVec = vReflect;\n#endif\n#ifdef DOUBLE_SIDED\nfloat flipNormal = ( -1.0 + 2.0 * float( gl_FrontFacing ) );\nvec4 cubeColor = textureCube( envMap, flipNormal * vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n#else\nvec4 cubeColor = textureCube( envMap, vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n#endif\n#ifdef GAMMA_INPUT\ncubeColor.xyz *= cubeColor.xyz;\n#endif\nif ( combine == 1 ) {\ngl_FragColor.xyz = mix( gl_FragColor.xyz, cubeColor.xyz, specularStrength * reflectivity );\n} else {\ngl_FragColor.xyz = mix( gl_FragColor.xyz, gl_FragColor.xyz * cubeColor.xyz, specularStrength * reflectivity );\n}\n#endif",
 envmap_pars_vertex:"#if defined( USE_ENVMAP ) && ! defined( USE_BUMPMAP )\nvarying vec3 vReflect;\nuniform float refractionRatio;\nuniform bool useRefract;\n#endif",worldpos_vertex:"#if defined( USE_ENVMAP ) || defined( PHONG ) || defined( LAMBERT ) || defined ( USE_SHADOWMAP )\n#ifdef USE_SKINNING\nvec4 mPosition = modelMatrix * skinned;\n#endif\n#if defined( USE_MORPHTARGETS ) && ! defined( USE_SKINNING )\nvec4 mPosition = modelMatrix * vec4( morphed, 1.0 );\n#endif\n#if ! defined( USE_MORPHTARGETS ) && ! defined( USE_SKINNING )\nvec4 mPosition = modelMatrix * vec4( position, 1.0 );\n#endif\n#endif",
 envmap_vertex:"#if defined( USE_ENVMAP ) && ! defined( USE_BUMPMAP )\nvec3 nWorld = mat3( modelMatrix[ 0 ].xyz, modelMatrix[ 1 ].xyz, modelMatrix[ 2 ].xyz ) * objectNormal;\nif ( useRefract ) {\nvReflect = refract( normalize( mPosition.xyz - cameraPosition ), normalize( nWorld.xyz ), refractionRatio );\n} else {\nvReflect = reflect( normalize( mPosition.xyz - cameraPosition ), normalize( nWorld.xyz ) );\n}\n#endif",map_particle_pars_fragment:"#ifdef USE_MAP\nuniform sampler2D map;\n#endif",map_particle_fragment:"#ifdef USE_MAP\ngl_FragColor = gl_FragColor * texture2D( map, vec2( gl_PointCoord.x, 1.0 - gl_PointCoord.y ) );\n#endif",
 map_pars_vertex:"#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_SPECULARMAP )\nvarying vec2 vUv;\nuniform vec4 offsetRepeat;\n#endif",map_pars_fragment:"#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_SPECULARMAP )\nvarying vec2 vUv;\n#endif\n#ifdef USE_MAP\nuniform sampler2D map;\n#endif",map_vertex:"#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_SPECULARMAP )\nvUv = uv * offsetRepeat.zw + offsetRepeat.xy;\n#endif",map_fragment:"#ifdef USE_MAP\n#ifdef GAMMA_INPUT\nvec4 texelColor = texture2D( map, vUv );\ntexelColor.xyz *= texelColor.xyz;\ngl_FragColor = gl_FragColor * texelColor;\n#else\ngl_FragColor = gl_FragColor * texture2D( map, vUv );\n#endif\n#endif",
@@ -331,47 +332,47 @@ f,e,g,h=a.vertices;g=h.length;var i=a.colors,j=i.length,l=a.__vertexArray,n=a.__
 for(j=q.length;i<j;i++){h=q[i];if(h.boundTo===void 0||h.boundTo==="vertices"){e=0;f=h.value.length;if(h.size===1)for(d=0;d<f;d++){g=m[d][1];h.array[d]=h.value[g]}else if(h.size===2)for(d=0;d<f;d++){g=m[d][1];g=h.value[g];h.array[e]=g.x;h.array[e+1]=g.y;e=e+2}else if(h.size===3)if(h.type==="c")for(d=0;d<f;d++){g=m[d][1];g=h.value[g];h.array[e]=g.r;h.array[e+1]=g.g;h.array[e+2]=g.b;e=e+3}else for(d=0;d<f;d++){g=m[d][1];g=h.value[g];h.array[e]=g.x;h.array[e+1]=g.y;h.array[e+2]=g.z;e=e+3}else if(h.size===
 4)for(d=0;d<f;d++){g=m[d][1];g=h.value[g];h.array[e]=g.x;h.array[e+1]=g.y;h.array[e+2]=g.z;h.array[e+3]=g.w;e=e+4}}}}}else{if(o)for(d=0;d<g;d++){f=h[d];e=d*3;l[e]=f.x;l[e+1]=f.y;l[e+2]=f.z}if(p)for(d=0;d<j;d++){f=i[d];e=d*3;n[e]=f.r;n[e+1]=f.g;n[e+2]=f.b}if(q){i=0;for(j=q.length;i<j;i++){h=q[i];if(h.needsUpdate&&(h.boundTo===void 0||h.boundTo==="vertices")){f=h.value.length;e=0;if(h.size===1)for(d=0;d<f;d++)h.array[d]=h.value[d];else if(h.size===2)for(d=0;d<f;d++){g=h.value[d];h.array[e]=g.x;h.array[e+
 1]=g.y;e=e+2}else if(h.size===3)if(h.type==="c")for(d=0;d<f;d++){g=h.value[d];h.array[e]=g.r;h.array[e+1]=g.g;h.array[e+2]=g.b;e=e+3}else for(d=0;d<f;d++){g=h.value[d];h.array[e]=g.x;h.array[e+1]=g.y;h.array[e+2]=g.z;e=e+3}else if(h.size===4)for(d=0;d<f;d++){g=h.value[d];h.array[e]=g.x;h.array[e+1]=g.y;h.array[e+2]=g.z;h.array[e+3]=g.w;e=e+4}}}}}if(o||c.sortParticles){k.bindBuffer(k.ARRAY_BUFFER,a.__webglVertexBuffer);k.bufferData(k.ARRAY_BUFFER,l,b)}if(p||c.sortParticles){k.bindBuffer(k.ARRAY_BUFFER,
-a.__webglColorBuffer);k.bufferData(k.ARRAY_BUFFER,n,b)}if(q){i=0;for(j=q.length;i<j;i++){h=q[i];if(h.needsUpdate||c.sortParticles){k.bindBuffer(k.ARRAY_BUFFER,h.buffer);k.bufferData(k.ARRAY_BUFFER,h.array,b)}}}}function g(a,b){return b.z-a.z}function h(a,b){return b[1]-a[1]}function i(a,b,c){if(a.length)for(var d=0,f=a.length;d<f;d++){na=L=null;qa=ha=M=aa=Da=ta=Y=-1;ua=true;a[d].render(b,c,jb,Ma);na=L=null;qa=ha=M=aa=Da=ta=Y=-1;ua=true}}function j(a,b,c,d,f,e,g,h){var i,k,j,l;if(b){k=a.length-1;l=
-b=-1}else{k=0;b=a.length;l=1}for(var n=k;n!==b;n=n+l){i=a[n];if(i.render){k=i.object;j=i.buffer;if(h)i=h;else{i=i[c];if(!i)continue;g&&H.setBlending(i.blending,i.blendEquation,i.blendSrc,i.blendDst);H.setDepthTest(i.depthTest);H.setDepthWrite(i.depthWrite);t(i.polygonOffset,i.polygonOffsetFactor,i.polygonOffsetUnits)}H.setMaterialFaces(i);j instanceof THREE.BufferGeometry?H.renderBufferDirect(d,f,e,i,j,k):H.renderBuffer(d,f,e,i,j,k)}}}function l(a,b,c,d,f,e,g){for(var h,i,k=0,j=a.length;k<j;k++){h=
-a[k];i=h.object;if(i.visible){if(g)h=g;else{h=h[b];if(!h)continue;e&&H.setBlending(h.blending,h.blendEquation,h.blendSrc,h.blendDst);H.setDepthTest(h.depthTest);H.setDepthWrite(h.depthWrite);t(h.polygonOffset,h.polygonOffsetFactor,h.polygonOffsetUnits)}H.renderImmediateObject(c,d,f,h,i)}}}function m(a,b,c){a.push({buffer:b,object:c,opaque:null,transparent:null})}function n(a){for(var b in a.attributes)if(a.attributes[b].needsUpdate)return true;return false}function q(a){for(var b in a.attributes)a.attributes[b].needsUpdate=
-false}function o(a,b){for(var c=a.length-1;c>=0;c--)a[c].object===b&&a.splice(c,1)}function p(a,b){for(var c=a.length-1;c>=0;c--)a[c]===b&&a.splice(c,1)}function s(a,b,c,d,f){if(d.needsUpdate){d.program&&H.deallocateMaterial(d);H.initMaterial(d,b,c,f);d.needsUpdate=false}if(d.morphTargets&&!f.__webglMorphTargetInfluences)f.__webglMorphTargetInfluences=new Float32Array(H.maxMorphTargets);var e=false,g=d.program,h=g.uniforms,i=d.uniforms;if(g!==L){k.useProgram(g);L=g;e=true}if(d.id!==qa){qa=d.id;e=
-true}if(e||a!==na){k.uniformMatrix4fv(h.projectionMatrix,false,a._projectionMatrixArray);a!==na&&(na=a)}if(e){if(c&&d.fog){i.fogColor.value=c.color;if(c instanceof THREE.Fog){i.fogNear.value=c.near;i.fogFar.value=c.far}else if(c instanceof THREE.FogExp2)i.fogDensity.value=c.density}if(d instanceof THREE.MeshPhongMaterial||d instanceof THREE.MeshLambertMaterial||d.lights){if(ua){for(var j,l=0,n=0,m=0,o,p,q,r=fb,u=r.directional.colors,s=r.directional.positions,t=r.point.colors,v=r.point.positions,y=
-r.point.distances,B=r.spot.colors,C=r.spot.positions,G=r.spot.distances,E=r.spot.directions,I=r.spot.angles,J=r.spot.exponents,M=0,P=0,O=0,K=q=0,c=K=0,e=b.length;c<e;c++){j=b[c];if(!j.onlyShadow&&j.visible){o=j.color;p=j.intensity;q=j.distance;if(j instanceof THREE.AmbientLight)if(H.gammaInput){l=l+o.r*o.r;n=n+o.g*o.g;m=m+o.b*o.b}else{l=l+o.r;n=n+o.g;m=m+o.b}else if(j instanceof THREE.DirectionalLight){q=M*3;if(H.gammaInput){u[q]=o.r*o.r*p*p;u[q+1]=o.g*o.g*p*p;u[q+2]=o.b*o.b*p*p}else{u[q]=o.r*p;u[q+
-1]=o.g*p;u[q+2]=o.b*p}Ha.copy(j.matrixWorld.getPosition());Ha.subSelf(j.target.matrixWorld.getPosition());Ha.normalize();s[q]=Ha.x;s[q+1]=Ha.y;s[q+2]=Ha.z;M=M+1}else if(j instanceof THREE.PointLight){K=P*3;if(H.gammaInput){t[K]=o.r*o.r*p*p;t[K+1]=o.g*o.g*p*p;t[K+2]=o.b*o.b*p*p}else{t[K]=o.r*p;t[K+1]=o.g*p;t[K+2]=o.b*p}o=j.matrixWorld.getPosition();v[K]=o.x;v[K+1]=o.y;v[K+2]=o.z;y[P]=q;P=P+1}else if(j instanceof THREE.SpotLight){K=O*3;if(H.gammaInput){B[K]=o.r*o.r*p*p;B[K+1]=o.g*o.g*p*p;B[K+2]=o.b*
-o.b*p*p}else{B[K]=o.r*p;B[K+1]=o.g*p;B[K+2]=o.b*p}o=j.matrixWorld.getPosition();C[K]=o.x;C[K+1]=o.y;C[K+2]=o.z;G[O]=q;Ha.copy(o);Ha.subSelf(j.target.matrixWorld.getPosition());Ha.normalize();E[K]=Ha.x;E[K+1]=Ha.y;E[K+2]=Ha.z;I[O]=Math.cos(j.angle);J[O]=j.exponent;O=O+1}}}c=M*3;for(e=u.length;c<e;c++)u[c]=0;c=P*3;for(e=t.length;c<e;c++)t[c]=0;c=O*3;for(e=B.length;c<e;c++)B[c]=0;r.directional.length=M;r.point.length=P;r.spot.length=O;r.ambient[0]=l;r.ambient[1]=n;r.ambient[2]=m;ua=false}c=fb;i.ambientLightColor.value=
+a.__webglColorBuffer);k.bufferData(k.ARRAY_BUFFER,n,b)}if(q){i=0;for(j=q.length;i<j;i++){h=q[i];if(h.needsUpdate||c.sortParticles){k.bindBuffer(k.ARRAY_BUFFER,h.buffer);k.bufferData(k.ARRAY_BUFFER,h.array,b)}}}}function g(a,b){return b.z-a.z}function h(a,b){return b[1]-a[1]}function i(a,b,c){if(a.length)for(var d=0,f=a.length;d<f;d++){na=M=null;qa=ha=N=aa=Da=ta=Y=-1;ua=true;a[d].render(b,c,jb,Ma);na=M=null;qa=ha=N=aa=Da=ta=Y=-1;ua=true}}function j(a,b,c,d,f,e,g,h){var i,k,j,l;if(b){k=a.length-1;l=
+b=-1}else{k=0;b=a.length;l=1}for(var n=k;n!==b;n=n+l){i=a[n];if(i.render){k=i.object;j=i.buffer;if(h)i=h;else{i=i[c];if(!i)continue;g&&H.setBlending(i.blending,i.blendEquation,i.blendSrc,i.blendDst);H.setDepthTest(i.depthTest);H.setDepthWrite(i.depthWrite);u(i.polygonOffset,i.polygonOffsetFactor,i.polygonOffsetUnits)}H.setMaterialFaces(i);j instanceof THREE.BufferGeometry?H.renderBufferDirect(d,f,e,i,j,k):H.renderBuffer(d,f,e,i,j,k)}}}function l(a,b,c,d,f,e,g){for(var h,i,k=0,j=a.length;k<j;k++){h=
+a[k];i=h.object;if(i.visible){if(g)h=g;else{h=h[b];if(!h)continue;e&&H.setBlending(h.blending,h.blendEquation,h.blendSrc,h.blendDst);H.setDepthTest(h.depthTest);H.setDepthWrite(h.depthWrite);u(h.polygonOffset,h.polygonOffsetFactor,h.polygonOffsetUnits)}H.renderImmediateObject(c,d,f,h,i)}}}function m(a,b,c){a.push({buffer:b,object:c,opaque:null,transparent:null})}function n(a){for(var b in a.attributes)if(a.attributes[b].needsUpdate)return true;return false}function q(a){for(var b in a.attributes)a.attributes[b].needsUpdate=
+false}function o(a,b){for(var c=a.length-1;c>=0;c--)a[c].object===b&&a.splice(c,1)}function p(a,b){for(var c=a.length-1;c>=0;c--)a[c]===b&&a.splice(c,1)}function s(a,b,c,d,f){if(d.needsUpdate){d.program&&H.deallocateMaterial(d);H.initMaterial(d,b,c,f);d.needsUpdate=false}if(d.morphTargets&&!f.__webglMorphTargetInfluences)f.__webglMorphTargetInfluences=new Float32Array(H.maxMorphTargets);var e=false,g=d.program,h=g.uniforms,i=d.uniforms;if(g!==M){k.useProgram(g);M=g;e=true}if(d.id!==qa){qa=d.id;e=
+true}if(e||a!==na){k.uniformMatrix4fv(h.projectionMatrix,false,a._projectionMatrixArray);a!==na&&(na=a)}if(e){if(c&&d.fog){i.fogColor.value=c.color;if(c instanceof THREE.Fog){i.fogNear.value=c.near;i.fogFar.value=c.far}else if(c instanceof THREE.FogExp2)i.fogDensity.value=c.density}if(d instanceof THREE.MeshPhongMaterial||d instanceof THREE.MeshLambertMaterial||d.lights){if(ua){for(var j,l=0,n=0,m=0,o,p,q,t=fb,r=t.directional.colors,s=t.directional.positions,u=t.point.colors,v=t.point.positions,y=
+t.point.distances,B=t.spot.colors,C=t.spot.positions,G=t.spot.distances,F=t.spot.directions,I=t.spot.angles,J=t.spot.exponents,N=0,O=0,P=0,K=q=0,c=K=0,e=b.length;c<e;c++){j=b[c];if(!j.onlyShadow&&j.visible){o=j.color;p=j.intensity;q=j.distance;if(j instanceof THREE.AmbientLight)if(H.gammaInput){l=l+o.r*o.r;n=n+o.g*o.g;m=m+o.b*o.b}else{l=l+o.r;n=n+o.g;m=m+o.b}else if(j instanceof THREE.DirectionalLight){q=N*3;if(H.gammaInput){r[q]=o.r*o.r*p*p;r[q+1]=o.g*o.g*p*p;r[q+2]=o.b*o.b*p*p}else{r[q]=o.r*p;r[q+
+1]=o.g*p;r[q+2]=o.b*p}Ha.copy(j.matrixWorld.getPosition());Ha.subSelf(j.target.matrixWorld.getPosition());Ha.normalize();s[q]=Ha.x;s[q+1]=Ha.y;s[q+2]=Ha.z;N=N+1}else if(j instanceof THREE.PointLight){K=O*3;if(H.gammaInput){u[K]=o.r*o.r*p*p;u[K+1]=o.g*o.g*p*p;u[K+2]=o.b*o.b*p*p}else{u[K]=o.r*p;u[K+1]=o.g*p;u[K+2]=o.b*p}o=j.matrixWorld.getPosition();v[K]=o.x;v[K+1]=o.y;v[K+2]=o.z;y[O]=q;O=O+1}else if(j instanceof THREE.SpotLight){K=P*3;if(H.gammaInput){B[K]=o.r*o.r*p*p;B[K+1]=o.g*o.g*p*p;B[K+2]=o.b*
+o.b*p*p}else{B[K]=o.r*p;B[K+1]=o.g*p;B[K+2]=o.b*p}o=j.matrixWorld.getPosition();C[K]=o.x;C[K+1]=o.y;C[K+2]=o.z;G[P]=q;Ha.copy(o);Ha.subSelf(j.target.matrixWorld.getPosition());Ha.normalize();F[K]=Ha.x;F[K+1]=Ha.y;F[K+2]=Ha.z;I[P]=Math.cos(j.angle);J[P]=j.exponent;P=P+1}}}c=N*3;for(e=r.length;c<e;c++)r[c]=0;c=O*3;for(e=u.length;c<e;c++)u[c]=0;c=P*3;for(e=B.length;c<e;c++)B[c]=0;t.directional.length=N;t.point.length=O;t.spot.length=P;t.ambient[0]=l;t.ambient[1]=n;t.ambient[2]=m;ua=false}c=fb;i.ambientLightColor.value=
 c.ambient;i.directionalLightColor.value=c.directional.colors;i.directionalLightDirection.value=c.directional.positions;i.pointLightColor.value=c.point.colors;i.pointLightPosition.value=c.point.positions;i.pointLightDistance.value=c.point.distances;i.spotLightColor.value=c.spot.colors;i.spotLightPosition.value=c.spot.positions;i.spotLightDistance.value=c.spot.distances;i.spotLightDirection.value=c.spot.directions;i.spotLightAngle.value=c.spot.angles;i.spotLightExponent.value=c.spot.exponents}if(d instanceof
-THREE.MeshBasicMaterial||d instanceof THREE.MeshLambertMaterial||d instanceof THREE.MeshPhongMaterial){i.opacity.value=d.opacity;H.gammaInput?i.diffuse.value.copyGammaToLinear(d.color):i.diffuse.value=d.color;i.map.texture=d.map;i.lightMap.texture=d.lightMap;i.specularMap.texture=d.specularMap;if(d.bumpMap){i.bumpMap.texture=d.bumpMap;i.bumpScale.value=d.bumpScale}var N;if(d.map)N=d.map;else if(d.specularMap)N=d.specularMap;else if(d.bumpMap)N=d.bumpMap;if(N!==void 0){c=N.offset;N=N.repeat;i.offsetRepeat.value.set(c.x,
-c.y,N.x,N.y)}i.envMap.texture=d.envMap;i.flipEnvMap.value=d.envMap instanceof THREE.WebGLRenderTargetCube?1:-1;i.reflectivity.value=d.reflectivity;i.refractionRatio.value=d.refractionRatio;i.combine.value=d.combine;i.useRefract.value=d.envMap&&d.envMap.mapping instanceof THREE.CubeRefractionMapping}if(d instanceof THREE.LineBasicMaterial){i.diffuse.value=d.color;i.opacity.value=d.opacity}else if(d instanceof THREE.ParticleBasicMaterial){i.psColor.value=d.color;i.opacity.value=d.opacity;i.size.value=
-d.size;i.scale.value=x.height/2;i.map.texture=d.map}else if(d instanceof THREE.MeshPhongMaterial){i.shininess.value=d.shininess;if(H.gammaInput){i.ambient.value.copyGammaToLinear(d.ambient);i.emissive.value.copyGammaToLinear(d.emissive);i.specular.value.copyGammaToLinear(d.specular)}else{i.ambient.value=d.ambient;i.emissive.value=d.emissive;i.specular.value=d.specular}d.wrapAround&&i.wrapRGB.value.copy(d.wrapRGB)}else if(d instanceof THREE.MeshLambertMaterial){if(H.gammaInput){i.ambient.value.copyGammaToLinear(d.ambient);
-i.emissive.value.copyGammaToLinear(d.emissive)}else{i.ambient.value=d.ambient;i.emissive.value=d.emissive}d.wrapAround&&i.wrapRGB.value.copy(d.wrapRGB)}else if(d instanceof THREE.MeshDepthMaterial){i.mNear.value=a.near;i.mFar.value=a.far;i.opacity.value=d.opacity}else if(d instanceof THREE.MeshNormalMaterial)i.opacity.value=d.opacity;if(f.receiveShadow&&!d._shadowPass&&i.shadowMatrix){c=N=0;for(e=b.length;c<e;c++){j=b[c];if(j.castShadow&&(j instanceof THREE.SpotLight||j instanceof THREE.DirectionalLight&&
-!j.shadowCascade)){i.shadowMap.texture[N]=j.shadowMap;i.shadowMapSize.value[N]=j.shadowMapSize;i.shadowMatrix.value[N]=j.shadowMatrix;i.shadowDarkness.value[N]=j.shadowDarkness;i.shadowBias.value[N]=j.shadowBias;N++}}}b=d.uniformsList;i=0;for(N=b.length;i<N;i++)if(j=g.uniforms[b[i][1]]){c=b[i][0];l=c.type;e=c.value;if(l==="i")k.uniform1i(j,e);else if(l==="f")k.uniform1f(j,e);else if(l==="v2")k.uniform2f(j,e.x,e.y);else if(l==="v3")k.uniform3f(j,e.x,e.y,e.z);else if(l==="v4")k.uniform4f(j,e.x,e.y,
+THREE.MeshBasicMaterial||d instanceof THREE.MeshLambertMaterial||d instanceof THREE.MeshPhongMaterial){i.opacity.value=d.opacity;H.gammaInput?i.diffuse.value.copyGammaToLinear(d.color):i.diffuse.value=d.color;i.map.texture=d.map;i.lightMap.texture=d.lightMap;i.specularMap.texture=d.specularMap;if(d.bumpMap){i.bumpMap.texture=d.bumpMap;i.bumpScale.value=d.bumpScale}var L;if(d.map)L=d.map;else if(d.specularMap)L=d.specularMap;else if(d.bumpMap)L=d.bumpMap;if(L!==void 0){c=L.offset;L=L.repeat;i.offsetRepeat.value.set(c.x,
+c.y,L.x,L.y)}i.envMap.texture=d.envMap;i.flipEnvMap.value=d.envMap instanceof THREE.WebGLRenderTargetCube?1:-1;i.reflectivity.value=d.reflectivity;i.refractionRatio.value=d.refractionRatio;i.combine.value=d.combine;i.useRefract.value=d.envMap&&d.envMap.mapping instanceof THREE.CubeRefractionMapping}if(d instanceof THREE.LineBasicMaterial){i.diffuse.value=d.color;i.opacity.value=d.opacity}else if(d instanceof THREE.ParticleBasicMaterial){i.psColor.value=d.color;i.opacity.value=d.opacity;i.size.value=
+d.size;i.scale.value=w.height/2;i.map.texture=d.map}else if(d instanceof THREE.MeshPhongMaterial){i.shininess.value=d.shininess;if(H.gammaInput){i.ambient.value.copyGammaToLinear(d.ambient);i.emissive.value.copyGammaToLinear(d.emissive);i.specular.value.copyGammaToLinear(d.specular)}else{i.ambient.value=d.ambient;i.emissive.value=d.emissive;i.specular.value=d.specular}d.wrapAround&&i.wrapRGB.value.copy(d.wrapRGB)}else if(d instanceof THREE.MeshLambertMaterial){if(H.gammaInput){i.ambient.value.copyGammaToLinear(d.ambient);
+i.emissive.value.copyGammaToLinear(d.emissive)}else{i.ambient.value=d.ambient;i.emissive.value=d.emissive}d.wrapAround&&i.wrapRGB.value.copy(d.wrapRGB)}else if(d instanceof THREE.MeshDepthMaterial){i.mNear.value=a.near;i.mFar.value=a.far;i.opacity.value=d.opacity}else if(d instanceof THREE.MeshNormalMaterial)i.opacity.value=d.opacity;if(f.receiveShadow&&!d._shadowPass&&i.shadowMatrix){c=L=0;for(e=b.length;c<e;c++){j=b[c];if(j.castShadow&&(j instanceof THREE.SpotLight||j instanceof THREE.DirectionalLight&&
+!j.shadowCascade)){i.shadowMap.texture[L]=j.shadowMap;i.shadowMapSize.value[L]=j.shadowMapSize;i.shadowMatrix.value[L]=j.shadowMatrix;i.shadowDarkness.value[L]=j.shadowDarkness;i.shadowBias.value[L]=j.shadowBias;L++}}}b=d.uniformsList;i=0;for(L=b.length;i<L;i++)if(j=g.uniforms[b[i][1]]){c=b[i][0];l=c.type;e=c.value;if(l==="i")k.uniform1i(j,e);else if(l==="f")k.uniform1f(j,e);else if(l==="v2")k.uniform2f(j,e.x,e.y);else if(l==="v3")k.uniform3f(j,e.x,e.y,e.z);else if(l==="v4")k.uniform4f(j,e.x,e.y,
 e.z,e.w);else if(l==="c")k.uniform3f(j,e.r,e.g,e.b);else if(l==="iv1")k.uniform1iv(j,e);else if(l==="iv")k.uniform3iv(j,e);else if(l==="fv1")k.uniform1fv(j,e);else if(l==="fv")k.uniform3fv(j,e);else if(l==="v2v"){if(c._array===void 0)c._array=new Float32Array(2*e.length);l=0;for(n=e.length;l<n;l++){m=l*2;c._array[m]=e[l].x;c._array[m+1]=e[l].y}k.uniform2fv(j,c._array)}else if(l==="v3v"){if(c._array===void 0)c._array=new Float32Array(3*e.length);l=0;for(n=e.length;l<n;l++){m=l*3;c._array[m]=e[l].x;
 c._array[m+1]=e[l].y;c._array[m+2]=e[l].z}k.uniform3fv(j,c._array)}else if(l==="v4v"){if(c._array===void 0)c._array=new Float32Array(4*e.length);l=0;for(n=e.length;l<n;l++){m=l*4;c._array[m]=e[l].x;c._array[m+1]=e[l].y;c._array[m+2]=e[l].z;c._array[m+3]=e[l].w}k.uniform4fv(j,c._array)}else if(l==="m4"){if(c._array===void 0)c._array=new Float32Array(16);e.flattenToArray(c._array);k.uniformMatrix4fv(j,false,c._array)}else if(l==="m4v"){if(c._array===void 0)c._array=new Float32Array(16*e.length);l=0;
 for(n=e.length;l<n;l++)e[l].flattenToArrayOffset(c._array,l*16);k.uniformMatrix4fv(j,false,c._array)}else if(l==="t"){k.uniform1i(j,e);if(j=c.texture)if(j.image instanceof Array&&j.image.length===6){c=j;if(c.image.length===6)if(c.needsUpdate){if(!c.image.__webglTextureCube)c.image.__webglTextureCube=k.createTexture();k.activeTexture(k.TEXTURE0+e);k.bindTexture(k.TEXTURE_CUBE_MAP,c.image.__webglTextureCube);k.pixelStorei(k.UNPACK_FLIP_Y_WEBGL,c.flipY);e=[];for(j=0;j<6;j++)if(H.autoScaleCubemaps){l=
-e;n=j;m=c.image[j];u=hb;if(!(m.width<=u&&m.height<=u)){s=Math.max(m.width,m.height);r=Math.floor(m.width*u/s);u=Math.floor(m.height*u/s);s=document.createElement("canvas");s.width=r;s.height=u;s.getContext("2d").drawImage(m,0,0,m.width,m.height,0,0,r,u);m=s}l[n]=m}else e[j]=c.image[j];j=e[0];l=(j.width&j.width-1)===0&&(j.height&j.height-1)===0;n=F(c.format);m=F(c.type);A(k.TEXTURE_CUBE_MAP,c,l);for(j=0;j<6;j++)k.texImage2D(k.TEXTURE_CUBE_MAP_POSITIVE_X+j,0,n,n,m,e[j]);c.generateMipmaps&&l&&k.generateMipmap(k.TEXTURE_CUBE_MAP);
+e;n=j;m=c.image[j];r=hb;if(!(m.width<=r&&m.height<=r)){s=Math.max(m.width,m.height);t=Math.floor(m.width*r/s);r=Math.floor(m.height*r/s);s=document.createElement("canvas");s.width=t;s.height=r;s.getContext("2d").drawImage(m,0,0,m.width,m.height,0,0,t,r);m=s}l[n]=m}else e[j]=c.image[j];j=e[0];l=(j.width&j.width-1)===0&&(j.height&j.height-1)===0;n=E(c.format);m=E(c.type);A(k.TEXTURE_CUBE_MAP,c,l);for(j=0;j<6;j++)k.texImage2D(k.TEXTURE_CUBE_MAP_POSITIVE_X+j,0,n,n,m,e[j]);c.generateMipmaps&&l&&k.generateMipmap(k.TEXTURE_CUBE_MAP);
 c.needsUpdate=false;if(c.onUpdate)c.onUpdate()}else{k.activeTexture(k.TEXTURE0+e);k.bindTexture(k.TEXTURE_CUBE_MAP,c.image.__webglTextureCube)}}else if(j instanceof THREE.WebGLRenderTargetCube){c=j;k.activeTexture(k.TEXTURE0+e);k.bindTexture(k.TEXTURE_CUBE_MAP,c.__webglTexture)}else H.setTexture(j,e)}else if(l==="tv"){if(c._array===void 0){c._array=[];l=0;for(n=c.texture.length;l<n;l++)c._array[l]=e+l}k.uniform1iv(j,c._array);l=0;for(n=c.texture.length;l<n;l++)(j=c.texture[l])&&H.setTexture(j,c._array[l])}}if((d instanceof
 THREE.ShaderMaterial||d instanceof THREE.MeshPhongMaterial||d.envMap)&&h.cameraPosition!==null){b=a.matrixWorld.getPosition();k.uniform3f(h.cameraPosition,b.x,b.y,b.z)}(d instanceof THREE.MeshPhongMaterial||d instanceof THREE.MeshLambertMaterial||d instanceof THREE.ShaderMaterial||d.skinning)&&h.viewMatrix!==null&&k.uniformMatrix4fv(h.viewMatrix,false,a._viewMatrixArray)}if(d.skinning)if(cc&&f.useVertexTexture){if(h.boneTexture!==null){k.uniform1i(h.boneTexture,12);H.setTexture(f.boneTexture,12)}}else h.boneGlobalMatrices!==
-null&&k.uniformMatrix4fv(h.boneGlobalMatrices,false,f.boneMatrices);k.uniformMatrix4fv(h.modelViewMatrix,false,f._modelViewMatrix.elements);h.normalMatrix&&k.uniformMatrix3fv(h.normalMatrix,false,f._normalMatrix.elements);h.modelMatrix!==null&&k.uniformMatrix4fv(h.modelMatrix,false,f.matrixWorld.elements);return g}function r(a,b){a._modelViewMatrix.multiply(b.matrixWorldInverse,a.matrixWorld);a._normalMatrix.getInverse(a._modelViewMatrix);a._normalMatrix.transpose()}function t(a,b,c){if(Ja!==a){a?
-k.enable(k.POLYGON_OFFSET_FILL):k.disable(k.POLYGON_OFFSET_FILL);Ja=a}if(a&&(Sa!==b||wa!==c)){k.polygonOffset(b,c);Sa=b;wa=c}}function v(a){for(var a=a.split("\n"),b=0,c=a.length;b<c;b++)a[b]=b+1+": "+a[b];return a.join("\n")}function u(a,b){var c;a==="fragment"?c=k.createShader(k.FRAGMENT_SHADER):a==="vertex"&&(c=k.createShader(k.VERTEX_SHADER));k.shaderSource(c,b);k.compileShader(c);if(!k.getShaderParameter(c,k.COMPILE_STATUS)){console.error(k.getShaderInfoLog(c));console.error(v(b));return null}return c}
-function A(a,b,c){if(c){k.texParameteri(a,k.TEXTURE_WRAP_S,F(b.wrapS));k.texParameteri(a,k.TEXTURE_WRAP_T,F(b.wrapT));k.texParameteri(a,k.TEXTURE_MAG_FILTER,F(b.magFilter));k.texParameteri(a,k.TEXTURE_MIN_FILTER,F(b.minFilter))}else{k.texParameteri(a,k.TEXTURE_WRAP_S,k.CLAMP_TO_EDGE);k.texParameteri(a,k.TEXTURE_WRAP_T,k.CLAMP_TO_EDGE);k.texParameteri(a,k.TEXTURE_MAG_FILTER,B(b.magFilter));k.texParameteri(a,k.TEXTURE_MIN_FILTER,B(b.minFilter))}if(gb&&b.type!==THREE.FloatType&&(b.anisotropy>1||b.__oldAnisotropy)){k.texParameterf(a,
+null&&k.uniformMatrix4fv(h.boneGlobalMatrices,false,f.boneMatrices);k.uniformMatrix4fv(h.modelViewMatrix,false,f._modelViewMatrix.elements);h.normalMatrix&&k.uniformMatrix3fv(h.normalMatrix,false,f._normalMatrix.elements);h.modelMatrix!==null&&k.uniformMatrix4fv(h.modelMatrix,false,f.matrixWorld.elements);return g}function r(a,b){a._modelViewMatrix.multiply(b.matrixWorldInverse,a.matrixWorld);a._normalMatrix.getInverse(a._modelViewMatrix);a._normalMatrix.transpose()}function u(a,b,c){if(Ja!==a){a?
+k.enable(k.POLYGON_OFFSET_FILL):k.disable(k.POLYGON_OFFSET_FILL);Ja=a}if(a&&(Sa!==b||wa!==c)){k.polygonOffset(b,c);Sa=b;wa=c}}function v(a){for(var a=a.split("\n"),b=0,c=a.length;b<c;b++)a[b]=b+1+": "+a[b];return a.join("\n")}function t(a,b){var c;a==="fragment"?c=k.createShader(k.FRAGMENT_SHADER):a==="vertex"&&(c=k.createShader(k.VERTEX_SHADER));k.shaderSource(c,b);k.compileShader(c);if(!k.getShaderParameter(c,k.COMPILE_STATUS)){console.error(k.getShaderInfoLog(c));console.error(v(b));return null}return c}
+function A(a,b,c){if(c){k.texParameteri(a,k.TEXTURE_WRAP_S,E(b.wrapS));k.texParameteri(a,k.TEXTURE_WRAP_T,E(b.wrapT));k.texParameteri(a,k.TEXTURE_MAG_FILTER,E(b.magFilter));k.texParameteri(a,k.TEXTURE_MIN_FILTER,E(b.minFilter))}else{k.texParameteri(a,k.TEXTURE_WRAP_S,k.CLAMP_TO_EDGE);k.texParameteri(a,k.TEXTURE_WRAP_T,k.CLAMP_TO_EDGE);k.texParameteri(a,k.TEXTURE_MAG_FILTER,B(b.magFilter));k.texParameteri(a,k.TEXTURE_MIN_FILTER,B(b.minFilter))}if(gb&&b.type!==THREE.FloatType&&(b.anisotropy>1||b.__oldAnisotropy)){k.texParameterf(a,
 gb.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(b.anisotropy,ib));b.__oldAnisotropy=b.anisotropy}}function y(a,b){k.bindRenderbuffer(k.RENDERBUFFER,a);if(b.depthBuffer&&!b.stencilBuffer){k.renderbufferStorage(k.RENDERBUFFER,k.DEPTH_COMPONENT16,b.width,b.height);k.framebufferRenderbuffer(k.FRAMEBUFFER,k.DEPTH_ATTACHMENT,k.RENDERBUFFER,a)}else if(b.depthBuffer&&b.stencilBuffer){k.renderbufferStorage(k.RENDERBUFFER,k.DEPTH_STENCIL,b.width,b.height);k.framebufferRenderbuffer(k.FRAMEBUFFER,k.DEPTH_STENCIL_ATTACHMENT,
-k.RENDERBUFFER,a)}else k.renderbufferStorage(k.RENDERBUFFER,k.RGBA4,b.width,b.height)}function B(a){return a===THREE.NearestFilter||a===THREE.NearestMipMapNearestFilter||a===THREE.NearestMipMapLinearFilter?k.NEAREST:k.LINEAR}function F(a){return a===THREE.RepeatWrapping?k.REPEAT:a===THREE.ClampToEdgeWrapping?k.CLAMP_TO_EDGE:a===THREE.MirroredRepeatWrapping?k.MIRRORED_REPEAT:a===THREE.NearestFilter?k.NEAREST:a===THREE.NearestMipMapNearestFilter?k.NEAREST_MIPMAP_NEAREST:a===THREE.NearestMipMapLinearFilter?
+k.RENDERBUFFER,a)}else k.renderbufferStorage(k.RENDERBUFFER,k.RGBA4,b.width,b.height)}function B(a){return a===THREE.NearestFilter||a===THREE.NearestMipMapNearestFilter||a===THREE.NearestMipMapLinearFilter?k.NEAREST:k.LINEAR}function E(a){return a===THREE.RepeatWrapping?k.REPEAT:a===THREE.ClampToEdgeWrapping?k.CLAMP_TO_EDGE:a===THREE.MirroredRepeatWrapping?k.MIRRORED_REPEAT:a===THREE.NearestFilter?k.NEAREST:a===THREE.NearestMipMapNearestFilter?k.NEAREST_MIPMAP_NEAREST:a===THREE.NearestMipMapLinearFilter?
 k.NEAREST_MIPMAP_LINEAR:a===THREE.LinearFilter?k.LINEAR:a===THREE.LinearMipMapNearestFilter?k.LINEAR_MIPMAP_NEAREST:a===THREE.LinearMipMapLinearFilter?k.LINEAR_MIPMAP_LINEAR:a===THREE.UnsignedByteType?k.UNSIGNED_BYTE:a===THREE.UnsignedShort4444Type?k.UNSIGNED_SHORT_4_4_4_4:a===THREE.UnsignedShort5551Type?k.UNSIGNED_SHORT_5_5_5_1:a===THREE.UnsignedShort565Type?k.UNSIGNED_SHORT_5_6_5:a===THREE.ByteType?k.BYTE:a===THREE.ShortType?k.SHORT:a===THREE.UnsignedShortType?k.UNSIGNED_SHORT:a===THREE.IntType?
 k.INT:a===THREE.UnsignedIntType?k.UNSIGNED_INT:a===THREE.FloatType?k.FLOAT:a===THREE.AlphaFormat?k.ALPHA:a===THREE.RGBFormat?k.RGB:a===THREE.RGBAFormat?k.RGBA:a===THREE.LuminanceFormat?k.LUMINANCE:a===THREE.LuminanceAlphaFormat?k.LUMINANCE_ALPHA:a===THREE.AddEquation?k.FUNC_ADD:a===THREE.SubtractEquation?k.FUNC_SUBTRACT:a===THREE.ReverseSubtractEquation?k.FUNC_REVERSE_SUBTRACT:a===THREE.ZeroFactor?k.ZERO:a===THREE.OneFactor?k.ONE:a===THREE.SrcColorFactor?k.SRC_COLOR:a===THREE.OneMinusSrcColorFactor?
-k.ONE_MINUS_SRC_COLOR:a===THREE.SrcAlphaFactor?k.SRC_ALPHA:a===THREE.OneMinusSrcAlphaFactor?k.ONE_MINUS_SRC_ALPHA:a===THREE.DstAlphaFactor?k.DST_ALPHA:a===THREE.OneMinusDstAlphaFactor?k.ONE_MINUS_DST_ALPHA:a===THREE.DstColorFactor?k.DST_COLOR:a===THREE.OneMinusDstColorFactor?k.ONE_MINUS_DST_COLOR:a===THREE.SrcAlphaSaturateFactor?k.SRC_ALPHA_SATURATE:0}console.log("THREE.WebGLRenderer",THREE.REVISION);var a=a||{},x=a.canvas!==void 0?a.canvas:document.createElement("canvas"),E=a.precision!==void 0?
-a.precision:"highp",G=a.alpha!==void 0?a.alpha:true,O=a.premultipliedAlpha!==void 0?a.premultipliedAlpha:true,J=a.antialias!==void 0?a.antialias:false,N=a.stencil!==void 0?a.stencil:true,C=a.preserveDrawingBuffer!==void 0?a.preserveDrawingBuffer:false,I=a.clearColor!==void 0?new THREE.Color(a.clearColor):new THREE.Color(0),Q=a.clearAlpha!==void 0?a.clearAlpha:0,K=a.maxLights!==void 0?a.maxLights:4;this.domElement=x;this.context=null;this.autoUpdateScene=this.autoUpdateObjects=this.sortObjects=this.autoClearStencil=
+k.ONE_MINUS_SRC_COLOR:a===THREE.SrcAlphaFactor?k.SRC_ALPHA:a===THREE.OneMinusSrcAlphaFactor?k.ONE_MINUS_SRC_ALPHA:a===THREE.DstAlphaFactor?k.DST_ALPHA:a===THREE.OneMinusDstAlphaFactor?k.ONE_MINUS_DST_ALPHA:a===THREE.DstColorFactor?k.DST_COLOR:a===THREE.OneMinusDstColorFactor?k.ONE_MINUS_DST_COLOR:a===THREE.SrcAlphaSaturateFactor?k.SRC_ALPHA_SATURATE:0}console.log("THREE.WebGLRenderer",THREE.REVISION);var a=a||{},w=a.canvas!==void 0?a.canvas:document.createElement("canvas"),I=a.precision!==void 0?
+a.precision:"highp",G=a.alpha!==void 0?a.alpha:true,O=a.premultipliedAlpha!==void 0?a.premultipliedAlpha:true,F=a.antialias!==void 0?a.antialias:false,K=a.stencil!==void 0?a.stencil:true,C=a.preserveDrawingBuffer!==void 0?a.preserveDrawingBuffer:false,J=a.clearColor!==void 0?new THREE.Color(a.clearColor):new THREE.Color(0),Q=a.clearAlpha!==void 0?a.clearAlpha:0,L=a.maxLights!==void 0?a.maxLights:4;this.domElement=w;this.context=null;this.autoUpdateScene=this.autoUpdateObjects=this.sortObjects=this.autoClearStencil=
 this.autoClearDepth=this.autoClearColor=this.autoClear=true;this.shadowMapEnabled=this.physicallyBasedShading=this.gammaOutput=this.gammaInput=false;this.shadowMapCullFrontFaces=this.shadowMapSoft=this.shadowMapAutoUpdate=true;this.shadowMapCascade=this.shadowMapDebug=false;this.maxMorphTargets=8;this.maxMorphNormals=4;this.autoScaleCubemaps=true;this.renderPluginsPre=[];this.renderPluginsPost=[];this.info={memory:{programs:0,geometries:0,textures:0},render:{calls:0,vertices:0,faces:0,points:0}};
-var H=this,X=[],P=0,L=null,ea=null,qa=-1,ha=null,na=null,ba=0,aa=-1,M=-1,Y=-1,ga=-1,ra=-1,oa=-1,ta=-1,Da=-1,Ja=null,Sa=null,wa=null,db=null,Qa=0,Za=0,eb=0,kb=0,jb=0,Ma=0,Ca=new THREE.Frustum,tb=new THREE.Matrix4,Fa=new THREE.Matrix4,Wa=new THREE.Vector4,Ha=new THREE.Vector3,ua=true,fb={ambient:[0,0,0],directional:{length:0,colors:[],positions:[]},point:{length:0,colors:[],positions:[],distances:[]},spot:{length:0,colors:[],positions:[],distances:[],directions:[],angles:[],exponents:[]}},k,gb;try{if(!(k=
-x.getContext("experimental-webgl",{alpha:G,premultipliedAlpha:O,antialias:J,stencil:N,preserveDrawingBuffer:C})))throw"Error creating WebGL context.";}catch(Ya){console.error(Ya)}a=k.getExtension("OES_texture_float");G=k.getExtension("OES_standard_derivatives");gb=k.getExtension("EXT_texture_filter_anisotropic")||k.getExtension("MOZ_EXT_texture_filter_anisotropic")||k.getExtension("WEBKIT_EXT_texture_filter_anisotropic");a||console.log("THREE.WebGLRenderer: Float textures not supported.");G||console.log("THREE.WebGLRenderer: Standard derivatives not supported.");
-gb||console.log("THREE.WebGLRenderer: Anisotropic texture filtering not supported.");k.clearColor(0,0,0,1);k.clearDepth(1);k.clearStencil(0);k.enable(k.DEPTH_TEST);k.depthFunc(k.LEQUAL);k.frontFace(k.CCW);k.cullFace(k.BACK);k.enable(k.CULL_FACE);k.enable(k.BLEND);k.blendEquation(k.FUNC_ADD);k.blendFunc(k.SRC_ALPHA,k.ONE_MINUS_SRC_ALPHA);k.clearColor(I.r,I.g,I.b,Q);this.context=k;G=k.getParameter(k.MAX_VERTEX_TEXTURE_IMAGE_UNITS);k.getParameter(k.MAX_TEXTURE_SIZE);var hb=k.getParameter(k.MAX_CUBE_MAP_TEXTURE_SIZE),
-ib=gb?k.getParameter(gb.MAX_TEXTURE_MAX_ANISOTROPY_EXT):0,rc=G>0,cc=rc&&a;this.getContext=function(){return k};this.supportsVertexTextures=function(){return rc};this.getMaxAnisotropy=function(){return ib};this.setSize=function(a,b){x.width=a;x.height=b;this.setViewport(0,0,x.width,x.height)};this.setViewport=function(a,b,c,d){Qa=a!==void 0?a:0;Za=b!==void 0?b:0;eb=c!==void 0?c:x.width;kb=d!==void 0?d:x.height;k.viewport(Qa,Za,eb,kb)};this.setScissor=function(a,b,c,d){k.scissor(a,b,c,d)};this.enableScissorTest=
-function(a){a?k.enable(k.SCISSOR_TEST):k.disable(k.SCISSOR_TEST)};this.setClearColorHex=function(a,b){I.setHex(a);Q=b;k.clearColor(I.r,I.g,I.b,Q)};this.setClearColor=function(a,b){I.copy(a);Q=b;k.clearColor(I.r,I.g,I.b,Q)};this.getClearColor=function(){return I};this.getClearAlpha=function(){return Q};this.clear=function(a,b,c){var d=0;if(a===void 0||a)d=d|k.COLOR_BUFFER_BIT;if(b===void 0||b)d=d|k.DEPTH_BUFFER_BIT;if(c===void 0||c)d=d|k.STENCIL_BUFFER_BIT;k.clear(d)};this.clearTarget=function(a,b,
+var H=this,X=[],P=0,M=null,ea=null,qa=-1,ha=null,na=null,ba=0,aa=-1,N=-1,Y=-1,ga=-1,ra=-1,oa=-1,ta=-1,Da=-1,Ja=null,Sa=null,wa=null,db=null,Qa=0,Za=0,eb=0,kb=0,jb=0,Ma=0,Ca=new THREE.Frustum,tb=new THREE.Matrix4,Fa=new THREE.Matrix4,Wa=new THREE.Vector4,Ha=new THREE.Vector3,ua=true,fb={ambient:[0,0,0],directional:{length:0,colors:[],positions:[]},point:{length:0,colors:[],positions:[],distances:[]},spot:{length:0,colors:[],positions:[],distances:[],directions:[],angles:[],exponents:[]}},k,gb;try{if(!(k=
+w.getContext("experimental-webgl",{alpha:G,premultipliedAlpha:O,antialias:F,stencil:K,preserveDrawingBuffer:C})))throw"Error creating WebGL context.";}catch(Ya){console.error(Ya)}a=k.getExtension("OES_texture_float");G=k.getExtension("OES_standard_derivatives");gb=k.getExtension("EXT_texture_filter_anisotropic")||k.getExtension("MOZ_EXT_texture_filter_anisotropic")||k.getExtension("WEBKIT_EXT_texture_filter_anisotropic");a||console.log("THREE.WebGLRenderer: Float textures not supported.");G||console.log("THREE.WebGLRenderer: Standard derivatives not supported.");
+gb||console.log("THREE.WebGLRenderer: Anisotropic texture filtering not supported.");k.clearColor(0,0,0,1);k.clearDepth(1);k.clearStencil(0);k.enable(k.DEPTH_TEST);k.depthFunc(k.LEQUAL);k.frontFace(k.CCW);k.cullFace(k.BACK);k.enable(k.CULL_FACE);k.enable(k.BLEND);k.blendEquation(k.FUNC_ADD);k.blendFunc(k.SRC_ALPHA,k.ONE_MINUS_SRC_ALPHA);k.clearColor(J.r,J.g,J.b,Q);this.context=k;G=k.getParameter(k.MAX_VERTEX_TEXTURE_IMAGE_UNITS);k.getParameter(k.MAX_TEXTURE_SIZE);var hb=k.getParameter(k.MAX_CUBE_MAP_TEXTURE_SIZE),
+ib=gb?k.getParameter(gb.MAX_TEXTURE_MAX_ANISOTROPY_EXT):0,qc=G>0,cc=qc&&a;this.getContext=function(){return k};this.supportsVertexTextures=function(){return qc};this.getMaxAnisotropy=function(){return ib};this.setSize=function(a,b){w.width=a;w.height=b;this.setViewport(0,0,w.width,w.height)};this.setViewport=function(a,b,c,d){Qa=a!==void 0?a:0;Za=b!==void 0?b:0;eb=c!==void 0?c:w.width;kb=d!==void 0?d:w.height;k.viewport(Qa,Za,eb,kb)};this.setScissor=function(a,b,c,d){k.scissor(a,b,c,d)};this.enableScissorTest=
+function(a){a?k.enable(k.SCISSOR_TEST):k.disable(k.SCISSOR_TEST)};this.setClearColorHex=function(a,b){J.setHex(a);Q=b;k.clearColor(J.r,J.g,J.b,Q)};this.setClearColor=function(a,b){J.copy(a);Q=b;k.clearColor(J.r,J.g,J.b,Q)};this.getClearColor=function(){return J};this.getClearAlpha=function(){return Q};this.clear=function(a,b,c){var d=0;if(a===void 0||a)d=d|k.COLOR_BUFFER_BIT;if(b===void 0||b)d=d|k.DEPTH_BUFFER_BIT;if(c===void 0||c)d=d|k.STENCIL_BUFFER_BIT;k.clear(d)};this.clearTarget=function(a,b,
 c,d){this.setRenderTarget(a);this.clear(b,c,d)};this.addPostPlugin=function(a){a.init(this);this.renderPluginsPost.push(a)};this.addPrePlugin=function(a){a.init(this);this.renderPluginsPre.push(a)};this.deallocateObject=function(a){if(a.__webglInit){a.__webglInit=false;delete a._modelViewMatrix;delete a._normalMatrix;delete a._normalMatrixArray;delete a._modelViewMatrixArray;delete a._modelMatrixArray;if(a instanceof THREE.Mesh)for(var b in a.geometry.geometryGroups){var c=a.geometry.geometryGroups[b];
 k.deleteBuffer(c.__webglVertexBuffer);k.deleteBuffer(c.__webglNormalBuffer);k.deleteBuffer(c.__webglTangentBuffer);k.deleteBuffer(c.__webglColorBuffer);k.deleteBuffer(c.__webglUVBuffer);k.deleteBuffer(c.__webglUV2Buffer);k.deleteBuffer(c.__webglSkinIndicesBuffer);k.deleteBuffer(c.__webglSkinWeightsBuffer);k.deleteBuffer(c.__webglFaceBuffer);k.deleteBuffer(c.__webglLineBuffer);var d=void 0,e=void 0;if(c.numMorphTargets){d=0;for(e=c.numMorphTargets;d<e;d++)k.deleteBuffer(c.__webglMorphTargetsBuffers[d])}if(c.numMorphNormals){d=
 0;for(e=c.numMorphNormals;d<e;d++)k.deleteBuffer(c.__webglMorphNormalsBuffers[d])}if(c.__webglCustomAttributesList){d=void 0;for(d in c.__webglCustomAttributesList)k.deleteBuffer(c.__webglCustomAttributesList[d].buffer)}H.info.memory.geometries--}else if(a instanceof THREE.Ribbon){a=a.geometry;k.deleteBuffer(a.__webglVertexBuffer);k.deleteBuffer(a.__webglColorBuffer);H.info.memory.geometries--}else if(a instanceof THREE.Line){a=a.geometry;k.deleteBuffer(a.__webglVertexBuffer);k.deleteBuffer(a.__webglColorBuffer);
 H.info.memory.geometries--}else if(a instanceof THREE.ParticleSystem){a=a.geometry;k.deleteBuffer(a.__webglVertexBuffer);k.deleteBuffer(a.__webglColorBuffer);H.info.memory.geometries--}}};this.deallocateTexture=function(a){if(a.__webglInit){a.__webglInit=false;k.deleteTexture(a.__webglTexture);H.info.memory.textures--}};this.deallocateRenderTarget=function(a){if(a&&a.__webglTexture){k.deleteTexture(a.__webglTexture);if(a instanceof THREE.WebGLRenderTargetCube)for(var b=0;b<6;b++){k.deleteFramebuffer(a.__webglFramebuffer[b]);
-k.deleteRenderbuffer(a.__webglRenderbuffer[b])}else{k.deleteFramebuffer(a.__webglFramebuffer);k.deleteRenderbuffer(a.__webglRenderbuffer)}}};this.deallocateMaterial=function(a){var b=a.program;if(b){a.program=void 0;var c,d,e=false,a=0;for(c=X.length;a<c;a++){d=X[a];if(d.program===b){d.usedTimes--;d.usedTimes===0&&(e=true);break}}if(e){e=[];a=0;for(c=X.length;a<c;a++){d=X[a];d.program!==b&&e.push(d)}X=e;k.deleteProgram(b);H.info.memory.programs--}}};this.updateShadowMap=function(a,b){L=null;qa=ha=
-Da=ta=Y=-1;ua=true;M=aa=-1;this.shadowMapPlugin.update(a,b)};this.renderBufferImmediate=function(a,b,c){if(a.hasPositions&&!a.__webglVertexBuffer)a.__webglVertexBuffer=k.createBuffer();if(a.hasNormals&&!a.__webglNormalBuffer)a.__webglNormalBuffer=k.createBuffer();if(a.hasUvs&&!a.__webglUvBuffer)a.__webglUvBuffer=k.createBuffer();if(a.hasColors&&!a.__webglColorBuffer)a.__webglColorBuffer=k.createBuffer();if(a.hasPositions){k.bindBuffer(k.ARRAY_BUFFER,a.__webglVertexBuffer);k.bufferData(k.ARRAY_BUFFER,
+k.deleteRenderbuffer(a.__webglRenderbuffer[b])}else{k.deleteFramebuffer(a.__webglFramebuffer);k.deleteRenderbuffer(a.__webglRenderbuffer)}}};this.deallocateMaterial=function(a){var b=a.program;if(b){a.program=void 0;var c,d,e=false,a=0;for(c=X.length;a<c;a++){d=X[a];if(d.program===b){d.usedTimes--;d.usedTimes===0&&(e=true);break}}if(e){e=[];a=0;for(c=X.length;a<c;a++){d=X[a];d.program!==b&&e.push(d)}X=e;k.deleteProgram(b);H.info.memory.programs--}}};this.updateShadowMap=function(a,b){M=null;qa=ha=
+Da=ta=Y=-1;ua=true;N=aa=-1;this.shadowMapPlugin.update(a,b)};this.renderBufferImmediate=function(a,b,c){if(a.hasPositions&&!a.__webglVertexBuffer)a.__webglVertexBuffer=k.createBuffer();if(a.hasNormals&&!a.__webglNormalBuffer)a.__webglNormalBuffer=k.createBuffer();if(a.hasUvs&&!a.__webglUvBuffer)a.__webglUvBuffer=k.createBuffer();if(a.hasColors&&!a.__webglColorBuffer)a.__webglColorBuffer=k.createBuffer();if(a.hasPositions){k.bindBuffer(k.ARRAY_BUFFER,a.__webglVertexBuffer);k.bufferData(k.ARRAY_BUFFER,
 a.positionArray,k.DYNAMIC_DRAW);k.enableVertexAttribArray(b.attributes.position);k.vertexAttribPointer(b.attributes.position,3,k.FLOAT,false,0,0)}if(a.hasNormals){k.bindBuffer(k.ARRAY_BUFFER,a.__webglNormalBuffer);if(c.shading===THREE.FlatShading){var d,e,f,g,h,i,j,l,n,m,o,p=a.count*3;for(o=0;o<p;o=o+9){m=a.normalArray;d=m[o];e=m[o+1];f=m[o+2];g=m[o+3];i=m[o+4];l=m[o+5];h=m[o+6];j=m[o+7];n=m[o+8];d=(d+g+h)/3;e=(e+i+j)/3;f=(f+l+n)/3;m[o]=d;m[o+1]=e;m[o+2]=f;m[o+3]=d;m[o+4]=e;m[o+5]=f;m[o+6]=d;m[o+
 7]=e;m[o+8]=f}}k.bufferData(k.ARRAY_BUFFER,a.normalArray,k.DYNAMIC_DRAW);k.enableVertexAttribArray(b.attributes.normal);k.vertexAttribPointer(b.attributes.normal,3,k.FLOAT,false,0,0)}if(a.hasUvs&&c.map){k.bindBuffer(k.ARRAY_BUFFER,a.__webglUvBuffer);k.bufferData(k.ARRAY_BUFFER,a.uvArray,k.DYNAMIC_DRAW);k.enableVertexAttribArray(b.attributes.uv);k.vertexAttribPointer(b.attributes.uv,2,k.FLOAT,false,0,0)}if(a.hasColors&&c.vertexColors!==THREE.NoColors){k.bindBuffer(k.ARRAY_BUFFER,a.__webglColorBuffer);
 k.bufferData(k.ARRAY_BUFFER,a.colorArray,k.DYNAMIC_DRAW);k.enableVertexAttribArray(b.attributes.color);k.vertexAttribPointer(b.attributes.color,3,k.FLOAT,false,0,0)}k.drawArrays(k.TRIANGLES,0,a.count);a.count=0};this.renderBufferDirect=function(a,b,c,d,e,f){if(d.visible!==false){c=s(a,b,c,d,f);a=c.attributes;b=false;d=e.id*16777215+c.id*2+(d.wireframe?1:0);if(d!==ha){ha=d;b=true}if(f instanceof THREE.Mesh){f=e.offsets;f.length>1&&(b=true);d=0;for(c=f.length;d<c;++d){var g=f[d].index;if(b){var h=e.attributes.position,
@@ -387,78 +388,78 @@ e.__webglTangentBuffer);k.vertexAttribPointer(b.tangent,4,k.FLOAT,false,0,0)}if(
 e.__webglFaceBuffer);k.drawElements(k.TRIANGLES,e.__webglFaceCount,k.UNSIGNED_SHORT,0)}H.info.render.calls++;H.info.render.vertices=H.info.render.vertices+e.__webglFaceCount;H.info.render.faces=H.info.render.faces+e.__webglFaceCount/3}else if(f instanceof THREE.Line){f=f.type===THREE.LineStrip?k.LINE_STRIP:k.LINES;d=d.linewidth;if(d!==db){k.lineWidth(d);db=d}k.drawArrays(f,0,e.__webglLineCount);H.info.render.calls++}else if(f instanceof THREE.ParticleSystem){k.drawArrays(k.POINTS,0,e.__webglParticleCount);
 H.info.render.calls++;H.info.render.points=H.info.render.points+e.__webglParticleCount}else if(f instanceof THREE.Ribbon){k.drawArrays(k.TRIANGLE_STRIP,0,e.__webglVertexCount);H.info.render.calls++}}};this.render=function(a,b,c,d){if(b instanceof THREE.Camera===false)console.error("THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.");else{var e,f,h,m,n=a.__lights,o=a.fog;qa=-1;ua=true;this.autoUpdateScene&&a.updateMatrixWorld();b.parent===void 0&&b.updateMatrixWorld();if(!b._viewMatrixArray)b._viewMatrixArray=
 new Float32Array(16);if(!b._projectionMatrixArray)b._projectionMatrixArray=new Float32Array(16);b.matrixWorldInverse.getInverse(b.matrixWorld);b.matrixWorldInverse.flattenToArray(b._viewMatrixArray);b.projectionMatrix.flattenToArray(b._projectionMatrixArray);tb.multiply(b.projectionMatrix,b.matrixWorldInverse);Ca.setFromMatrix(tb);this.autoUpdateObjects&&this.initWebGLObjects(a);i(this.renderPluginsPre,a,b);H.info.render.calls=0;H.info.render.vertices=0;H.info.render.faces=0;H.info.render.points=
-0;this.setRenderTarget(c);(this.autoClear||d)&&this.clear(this.autoClearColor,this.autoClearDepth,this.autoClearStencil);m=a.__webglObjects;d=0;for(e=m.length;d<e;d++){f=m[d];h=f.object;f.render=false;if(h.visible&&(!(h instanceof THREE.Mesh||h instanceof THREE.ParticleSystem)||!h.frustumCulled||Ca.contains(h))){r(h,b);var p=f,q=p.object,u=p.buffer,s=void 0,s=s=void 0,s=q.material;if(s instanceof THREE.MeshFaceMaterial){s=u.materialIndex;if(s>=0){s=q.geometry.materials[s];if(s.transparent){p.transparent=
+0;this.setRenderTarget(c);(this.autoClear||d)&&this.clear(this.autoClearColor,this.autoClearDepth,this.autoClearStencil);m=a.__webglObjects;d=0;for(e=m.length;d<e;d++){f=m[d];h=f.object;f.render=false;if(h.visible&&(!(h instanceof THREE.Mesh||h instanceof THREE.ParticleSystem)||!h.frustumCulled||Ca.contains(h))){r(h,b);var p=f,q=p.object,t=p.buffer,s=void 0,s=s=void 0,s=q.material;if(s instanceof THREE.MeshFaceMaterial){s=t.materialIndex;if(s>=0){s=q.geometry.materials[s];if(s.transparent){p.transparent=
 s;p.opaque=null}else{p.opaque=s;p.transparent=null}}}else if(s)if(s.transparent){p.transparent=s;p.opaque=null}else{p.opaque=s;p.transparent=null}f.render=true;if(this.sortObjects)if(h.renderDepth)f.z=h.renderDepth;else{Wa.copy(h.matrixWorld.getPosition());tb.multiplyVector3(Wa);f.z=Wa.z}}}this.sortObjects&&m.sort(g);m=a.__webglObjectsImmediate;d=0;for(e=m.length;d<e;d++){f=m[d];h=f.object;if(h.visible){r(h,b);h=f.object.material;if(h.transparent){f.transparent=h;f.opaque=null}else{f.opaque=h;f.transparent=
-null}}}if(a.overrideMaterial){d=a.overrideMaterial;this.setBlending(d.blending,d.blendEquation,d.blendSrc,d.blendDst);this.setDepthTest(d.depthTest);this.setDepthWrite(d.depthWrite);t(d.polygonOffset,d.polygonOffsetFactor,d.polygonOffsetUnits);j(a.__webglObjects,false,"",b,n,o,true,d);l(a.__webglObjectsImmediate,"",b,n,o,false,d)}else{this.setBlending(THREE.NormalBlending);j(a.__webglObjects,true,"opaque",b,n,o,false);l(a.__webglObjectsImmediate,"opaque",b,n,o,false);j(a.__webglObjects,false,"transparent",
+null}}}if(a.overrideMaterial){d=a.overrideMaterial;this.setBlending(d.blending,d.blendEquation,d.blendSrc,d.blendDst);this.setDepthTest(d.depthTest);this.setDepthWrite(d.depthWrite);u(d.polygonOffset,d.polygonOffsetFactor,d.polygonOffsetUnits);j(a.__webglObjects,false,"",b,n,o,true,d);l(a.__webglObjectsImmediate,"",b,n,o,false,d)}else{this.setBlending(THREE.NormalBlending);j(a.__webglObjects,true,"opaque",b,n,o,false);l(a.__webglObjectsImmediate,"opaque",b,n,o,false);j(a.__webglObjects,false,"transparent",
 b,n,o,true);l(a.__webglObjectsImmediate,"transparent",b,n,o,true)}i(this.renderPluginsPost,a,b);if(c&&c.generateMipmaps&&c.minFilter!==THREE.NearestFilter&&c.minFilter!==THREE.LinearFilter)if(c instanceof THREE.WebGLRenderTargetCube){k.bindTexture(k.TEXTURE_CUBE_MAP,c.__webglTexture);k.generateMipmap(k.TEXTURE_CUBE_MAP);k.bindTexture(k.TEXTURE_CUBE_MAP,null)}else{k.bindTexture(k.TEXTURE_2D,c.__webglTexture);k.generateMipmap(k.TEXTURE_2D);k.bindTexture(k.TEXTURE_2D,null)}this.setDepthTest(true);this.setDepthWrite(true)}};
 this.renderImmediateObject=function(a,b,c,d,e){var f=s(a,b,c,d,e);ha=-1;H.setMaterialFaces(d);e.immediateRenderCallback?e.immediateRenderCallback(f,k,Ca):e.render(function(a){H.renderBufferImmediate(a,f,d)})};this.initWebGLObjects=function(a){if(!a.__webglObjects){a.__webglObjects=[];a.__webglObjectsImmediate=[];a.__webglSprites=[];a.__webglFlares=[]}for(;a.__objectsAdded.length;){var g=a.__objectsAdded[0],h=a,i=void 0,j=void 0,l=void 0;if(!g.__webglInit){g.__webglInit=true;g._modelViewMatrix=new THREE.Matrix4;
-g._normalMatrix=new THREE.Matrix3;if(g instanceof THREE.Mesh){j=g.geometry;if(j instanceof THREE.Geometry){if(j.geometryGroups===void 0){var r=j,u=void 0,s=void 0,t=void 0,v=void 0,x=void 0,y=void 0,A=void 0,B={},F=r.morphTargets.length,C=r.morphNormals.length;r.geometryGroups={};u=0;for(s=r.faces.length;u<s;u++){t=r.faces[u];v=t.materialIndex;y=v!==void 0?v:-1;B[y]===void 0&&(B[y]={hash:y,counter:0});A=B[y].hash+"_"+B[y].counter;r.geometryGroups[A]===void 0&&(r.geometryGroups[A]={faces3:[],faces4:[],
-materialIndex:v,vertices:0,numMorphTargets:F,numMorphNormals:C});x=t instanceof THREE.Face3?3:4;if(r.geometryGroups[A].vertices+x>65535){B[y].counter=B[y].counter+1;A=B[y].hash+"_"+B[y].counter;r.geometryGroups[A]===void 0&&(r.geometryGroups[A]={faces3:[],faces4:[],materialIndex:v,vertices:0,numMorphTargets:F,numMorphNormals:C})}t instanceof THREE.Face3?r.geometryGroups[A].faces3.push(u):r.geometryGroups[A].faces4.push(u);r.geometryGroups[A].vertices=r.geometryGroups[A].vertices+x}r.geometryGroupsList=
-[];var G=void 0;for(G in r.geometryGroups){r.geometryGroups[G].id=ba++;r.geometryGroupsList.push(r.geometryGroups[G])}}for(i in j.geometryGroups){l=j.geometryGroups[i];if(!l.__webglVertexBuffer){var E=l;E.__webglVertexBuffer=k.createBuffer();E.__webglNormalBuffer=k.createBuffer();E.__webglTangentBuffer=k.createBuffer();E.__webglColorBuffer=k.createBuffer();E.__webglUVBuffer=k.createBuffer();E.__webglUV2Buffer=k.createBuffer();E.__webglSkinIndicesBuffer=k.createBuffer();E.__webglSkinWeightsBuffer=
-k.createBuffer();E.__webglFaceBuffer=k.createBuffer();E.__webglLineBuffer=k.createBuffer();var I=void 0,J=void 0;if(E.numMorphTargets){E.__webglMorphTargetsBuffers=[];I=0;for(J=E.numMorphTargets;I<J;I++)E.__webglMorphTargetsBuffers.push(k.createBuffer())}if(E.numMorphNormals){E.__webglMorphNormalsBuffers=[];I=0;for(J=E.numMorphNormals;I<J;I++)E.__webglMorphNormalsBuffers.push(k.createBuffer())}H.info.memory.geometries++;var M=l,K=g,L=K.geometry,N=M.faces3,O=M.faces4,P=N.length*3+O.length*4,Q=N.length*
-1+O.length*2,Y=N.length*3+O.length*4,aa=c(K,M),X=f(aa),ga=d(aa),ea=aa.vertexColors?aa.vertexColors:false;M.__vertexArray=new Float32Array(P*3);if(ga)M.__normalArray=new Float32Array(P*3);if(L.hasTangents)M.__tangentArray=new Float32Array(P*4);if(ea)M.__colorArray=new Float32Array(P*3);if(X){if(L.faceUvs.length>0||L.faceVertexUvs.length>0)M.__uvArray=new Float32Array(P*2);if(L.faceUvs.length>1||L.faceVertexUvs.length>1)M.__uv2Array=new Float32Array(P*2)}if(K.geometry.skinWeights.length&&K.geometry.skinIndices.length){M.__skinIndexArray=
-new Float32Array(P*4);M.__skinWeightArray=new Float32Array(P*4)}M.__faceArray=new Uint16Array(Q*3);M.__lineArray=new Uint16Array(Y*2);var oa=void 0,ra=void 0;if(M.numMorphTargets){M.__morphTargetsArrays=[];oa=0;for(ra=M.numMorphTargets;oa<ra;oa++)M.__morphTargetsArrays.push(new Float32Array(P*3))}if(M.numMorphNormals){M.__morphNormalsArrays=[];oa=0;for(ra=M.numMorphNormals;oa<ra;oa++)M.__morphNormalsArrays.push(new Float32Array(P*3))}M.__webglFaceCount=Q*3;M.__webglLineCount=Y*2;if(aa.attributes){if(M.__webglCustomAttributesList===
-void 0)M.__webglCustomAttributesList=[];var qa=void 0;for(qa in aa.attributes){var ta=aa.attributes[qa],ha={},Da;for(Da in ta)ha[Da]=ta[Da];if(!ha.__webglInitialized||ha.createUniqueBuffers){ha.__webglInitialized=true;var na=1;ha.type==="v2"?na=2:ha.type==="v3"?na=3:ha.type==="v4"?na=4:ha.type==="c"&&(na=3);ha.size=na;ha.array=new Float32Array(P*na);ha.buffer=k.createBuffer();ha.buffer.belongsToAttribute=qa;ta.needsUpdate=true;ha.__original=ta}M.__webglCustomAttributesList.push(ha)}}M.__inittedArrays=
+g._normalMatrix=new THREE.Matrix3;if(g instanceof THREE.Mesh){j=g.geometry;if(j instanceof THREE.Geometry){if(j.geometryGroups===void 0){var t=j,s=void 0,r=void 0,u=void 0,v=void 0,w=void 0,y=void 0,A=void 0,B={},E=t.morphTargets.length,C=t.morphNormals.length;t.geometryGroups={};s=0;for(r=t.faces.length;s<r;s++){u=t.faces[s];v=u.materialIndex;y=v!==void 0?v:-1;B[y]===void 0&&(B[y]={hash:y,counter:0});A=B[y].hash+"_"+B[y].counter;t.geometryGroups[A]===void 0&&(t.geometryGroups[A]={faces3:[],faces4:[],
+materialIndex:v,vertices:0,numMorphTargets:E,numMorphNormals:C});w=u instanceof THREE.Face3?3:4;if(t.geometryGroups[A].vertices+w>65535){B[y].counter=B[y].counter+1;A=B[y].hash+"_"+B[y].counter;t.geometryGroups[A]===void 0&&(t.geometryGroups[A]={faces3:[],faces4:[],materialIndex:v,vertices:0,numMorphTargets:E,numMorphNormals:C})}u instanceof THREE.Face3?t.geometryGroups[A].faces3.push(s):t.geometryGroups[A].faces4.push(s);t.geometryGroups[A].vertices=t.geometryGroups[A].vertices+w}t.geometryGroupsList=
+[];var G=void 0;for(G in t.geometryGroups){t.geometryGroups[G].id=ba++;t.geometryGroupsList.push(t.geometryGroups[G])}}for(i in j.geometryGroups){l=j.geometryGroups[i];if(!l.__webglVertexBuffer){var F=l;F.__webglVertexBuffer=k.createBuffer();F.__webglNormalBuffer=k.createBuffer();F.__webglTangentBuffer=k.createBuffer();F.__webglColorBuffer=k.createBuffer();F.__webglUVBuffer=k.createBuffer();F.__webglUV2Buffer=k.createBuffer();F.__webglSkinIndicesBuffer=k.createBuffer();F.__webglSkinWeightsBuffer=
+k.createBuffer();F.__webglFaceBuffer=k.createBuffer();F.__webglLineBuffer=k.createBuffer();var I=void 0,J=void 0;if(F.numMorphTargets){F.__webglMorphTargetsBuffers=[];I=0;for(J=F.numMorphTargets;I<J;I++)F.__webglMorphTargetsBuffers.push(k.createBuffer())}if(F.numMorphNormals){F.__webglMorphNormalsBuffers=[];I=0;for(J=F.numMorphNormals;I<J;I++)F.__webglMorphNormalsBuffers.push(k.createBuffer())}H.info.memory.geometries++;var N=l,K=g,M=K.geometry,L=N.faces3,O=N.faces4,P=L.length*3+O.length*4,Q=L.length*
+1+O.length*2,Y=L.length*3+O.length*4,aa=c(K,N),X=f(aa),ga=d(aa),ea=aa.vertexColors?aa.vertexColors:false;N.__vertexArray=new Float32Array(P*3);if(ga)N.__normalArray=new Float32Array(P*3);if(M.hasTangents)N.__tangentArray=new Float32Array(P*4);if(ea)N.__colorArray=new Float32Array(P*3);if(X){if(M.faceUvs.length>0||M.faceVertexUvs.length>0)N.__uvArray=new Float32Array(P*2);if(M.faceUvs.length>1||M.faceVertexUvs.length>1)N.__uv2Array=new Float32Array(P*2)}if(K.geometry.skinWeights.length&&K.geometry.skinIndices.length){N.__skinIndexArray=
+new Float32Array(P*4);N.__skinWeightArray=new Float32Array(P*4)}N.__faceArray=new Uint16Array(Q*3);N.__lineArray=new Uint16Array(Y*2);var oa=void 0,ra=void 0;if(N.numMorphTargets){N.__morphTargetsArrays=[];oa=0;for(ra=N.numMorphTargets;oa<ra;oa++)N.__morphTargetsArrays.push(new Float32Array(P*3))}if(N.numMorphNormals){N.__morphNormalsArrays=[];oa=0;for(ra=N.numMorphNormals;oa<ra;oa++)N.__morphNormalsArrays.push(new Float32Array(P*3))}N.__webglFaceCount=Q*3;N.__webglLineCount=Y*2;if(aa.attributes){if(N.__webglCustomAttributesList===
+void 0)N.__webglCustomAttributesList=[];var qa=void 0;for(qa in aa.attributes){var ta=aa.attributes[qa],ha={},Da;for(Da in ta)ha[Da]=ta[Da];if(!ha.__webglInitialized||ha.createUniqueBuffers){ha.__webglInitialized=true;var na=1;ha.type==="v2"?na=2:ha.type==="v3"?na=3:ha.type==="v4"?na=4:ha.type==="c"&&(na=3);ha.size=na;ha.array=new Float32Array(P*na);ha.buffer=k.createBuffer();ha.buffer.belongsToAttribute=qa;ta.needsUpdate=true;ha.__original=ta}N.__webglCustomAttributesList.push(ha)}}N.__inittedArrays=
 true;j.verticesNeedUpdate=true;j.morphTargetsNeedUpdate=true;j.elementsNeedUpdate=true;j.uvsNeedUpdate=true;j.normalsNeedUpdate=true;j.tangentsNeedUpdate=true;j.colorsNeedUpdate=true}}}else if(j instanceof THREE.BufferGeometry){var ua=j,wa=void 0,Ja=void 0,Ca=void 0;for(wa in ua.attributes){Ca=wa==="index"?k.ELEMENT_ARRAY_BUFFER:k.ARRAY_BUFFER;Ja=ua.attributes[wa];Ja.buffer=k.createBuffer();k.bindBuffer(Ca,Ja.buffer);k.bufferData(Ca,Ja.array,k.STATIC_DRAW)}}}else if(g instanceof THREE.Ribbon){j=g.geometry;
 if(!j.__webglVertexBuffer){var Fa=j;Fa.__webglVertexBuffer=k.createBuffer();Fa.__webglColorBuffer=k.createBuffer();H.info.memory.geometries++;var Ha=j,Qa=Ha.vertices.length;Ha.__vertexArray=new Float32Array(Qa*3);Ha.__colorArray=new Float32Array(Qa*3);Ha.__webglVertexCount=Qa;j.verticesNeedUpdate=true;j.colorsNeedUpdate=true}}else if(g instanceof THREE.Line){j=g.geometry;if(!j.__webglVertexBuffer){var Ma=j;Ma.__webglVertexBuffer=k.createBuffer();Ma.__webglColorBuffer=k.createBuffer();H.info.memory.geometries++;
 var Sa=j,Ya=g,Wa=Sa.vertices.length;Sa.__vertexArray=new Float32Array(Wa*3);Sa.__colorArray=new Float32Array(Wa*3);Sa.__webglLineCount=Wa;b(Sa,Ya);j.verticesNeedUpdate=true;j.colorsNeedUpdate=true}}else if(g instanceof THREE.ParticleSystem){j=g.geometry;if(!j.__webglVertexBuffer){var db=j;db.__webglVertexBuffer=k.createBuffer();db.__webglColorBuffer=k.createBuffer();H.info.geometries++;var Za=j,jb=g,gb=Za.vertices.length;Za.__vertexArray=new Float32Array(gb*3);Za.__colorArray=new Float32Array(gb*
 3);Za.__sortArray=[];Za.__webglParticleCount=gb;b(Za,jb);j.verticesNeedUpdate=true;j.colorsNeedUpdate=true}}}if(!g.__webglActive){if(g instanceof THREE.Mesh){j=g.geometry;if(j instanceof THREE.BufferGeometry)m(h.__webglObjects,j,g);else for(i in j.geometryGroups){l=j.geometryGroups[i];m(h.__webglObjects,l,g)}}else if(g instanceof THREE.Ribbon||g instanceof THREE.Line||g instanceof THREE.ParticleSystem){j=g.geometry;m(h.__webglObjects,j,g)}else g instanceof THREE.ImmediateRenderObject||g.immediateRenderCallback?
 h.__webglObjectsImmediate.push({object:g,opaque:null,transparent:null}):g instanceof THREE.Sprite?h.__webglSprites.push(g):g instanceof THREE.LensFlare&&h.__webglFlares.push(g);g.__webglActive=true}a.__objectsAdded.splice(0,1)}for(;a.__objectsRemoved.length;){var nb=a.__objectsRemoved[0],eb=a;nb instanceof THREE.Mesh||nb instanceof THREE.ParticleSystem||nb instanceof THREE.Ribbon||nb instanceof THREE.Line?o(eb.__webglObjects,nb):nb instanceof THREE.Sprite?p(eb.__webglSprites,nb):nb instanceof THREE.LensFlare?
 p(eb.__webglFlares,nb):(nb instanceof THREE.ImmediateRenderObject||nb.immediateRenderCallback)&&o(eb.__webglObjectsImmediate,nb);nb.__webglActive=false;a.__objectsRemoved.splice(0,1)}for(var kb=0,tb=a.__webglObjects.length;kb<tb;kb++){var ub=a.__webglObjects[kb].object,ca=ub.geometry,fb=void 0,hb=void 0,$a=void 0;if(ub instanceof THREE.Mesh)if(ca instanceof THREE.BufferGeometry){if(ca.verticesNeedUpdate||ca.elementsNeedUpdate||ca.uvsNeedUpdate||ca.normalsNeedUpdate||ca.colorsNeedUpdate||ca.tangentsNeedUpdate){var Mb=
-ca,ib=k.DYNAMIC_DRAW,rc=!ca.dynamic,kc=Mb.attributes,cc=kc.index,Rc=kc.position,Sc=kc.normal,Tc=kc.uv,Uc=kc.color,Vc=kc.tangent;if(Mb.elementsNeedUpdate&&cc!==void 0){k.bindBuffer(k.ELEMENT_ARRAY_BUFFER,cc.buffer);k.bufferData(k.ELEMENT_ARRAY_BUFFER,cc.array,ib)}if(Mb.verticesNeedUpdate&&Rc!==void 0){k.bindBuffer(k.ARRAY_BUFFER,Rc.buffer);k.bufferData(k.ARRAY_BUFFER,Rc.array,ib)}if(Mb.normalsNeedUpdate&&Sc!==void 0){k.bindBuffer(k.ARRAY_BUFFER,Sc.buffer);k.bufferData(k.ARRAY_BUFFER,Sc.array,ib)}if(Mb.uvsNeedUpdate&&
-Tc!==void 0){k.bindBuffer(k.ARRAY_BUFFER,Tc.buffer);k.bufferData(k.ARRAY_BUFFER,Tc.array,ib)}if(Mb.colorsNeedUpdate&&Uc!==void 0){k.bindBuffer(k.ARRAY_BUFFER,Uc.buffer);k.bufferData(k.ARRAY_BUFFER,Uc.array,ib)}if(Mb.tangentsNeedUpdate&&Vc!==void 0){k.bindBuffer(k.ARRAY_BUFFER,Vc.buffer);k.bufferData(k.ARRAY_BUFFER,Vc.array,ib)}if(rc){var ed=void 0;for(ed in Mb.attributes)delete Mb.attributes[ed].array}}ca.verticesNeedUpdate=false;ca.elementsNeedUpdate=false;ca.uvsNeedUpdate=false;ca.normalsNeedUpdate=
-false;ca.colorsNeedUpdate=false;ca.tangentsNeedUpdate=false}else{for(var Wc=0,qd=ca.geometryGroupsList.length;Wc<qd;Wc++){fb=ca.geometryGroupsList[Wc];$a=c(ub,fb);hb=$a.attributes&&n($a);if(ca.verticesNeedUpdate||ca.morphTargetsNeedUpdate||ca.elementsNeedUpdate||ca.uvsNeedUpdate||ca.normalsNeedUpdate||ca.colorsNeedUpdate||ca.tangentsNeedUpdate||hb){var ka=fb,rd=ub,ob=k.DYNAMIC_DRAW,sd=!ca.dynamic,fc=$a;if(ka.__inittedArrays){var fd=d(fc),Xc=fc.vertexColors?fc.vertexColors:false,gd=f(fc),Ec=fd===THREE.SmoothShading,
-D=void 0,W=void 0,Vb=void 0,R=void 0,lc=void 0,Wb=void 0,vb=void 0,Fc=void 0,Nb=void 0,mc=void 0,nc=void 0,S=void 0,T=void 0,U=void 0,ia=void 0,wb=void 0,xb=void 0,yb=void 0,sc=void 0,zb=void 0,Ab=void 0,Bb=void 0,tc=void 0,Cb=void 0,Db=void 0,Eb=void 0,uc=void 0,Fb=void 0,Gb=void 0,Hb=void 0,vc=void 0,Ib=void 0,Jb=void 0,Kb=void 0,wc=void 0,pa=void 0,hd=void 0,Xb=void 0,oc=void 0,pc=void 0,Na=void 0,id=void 0,Ka=void 0,La=void 0,Yb=void 0,Ob=void 0,Ea=0,Ia=0,Pb=0,Qb=0,pb=0,Ta=0,va=0,Xa=0,Ga=0,$=
-0,da=0,z=0,sa=void 0,Oa=ka.__vertexArray,xc=ka.__uvArray,yc=ka.__uv2Array,qb=ka.__normalArray,ya=ka.__tangentArray,Pa=ka.__colorArray,za=ka.__skinIndexArray,Aa=ka.__skinWeightArray,Yc=ka.__morphTargetsArrays,Zc=ka.__morphNormalsArrays,$c=ka.__webglCustomAttributesList,w=void 0,Lb=ka.__faceArray,cb=ka.__lineArray,ab=rd.geometry,td=ab.elementsNeedUpdate,jd=ab.uvsNeedUpdate,ud=ab.normalsNeedUpdate,vd=ab.tangentsNeedUpdate,wd=ab.colorsNeedUpdate,xd=ab.morphTargetsNeedUpdate,gc=ab.vertices,la=ka.faces3,
-ma=ka.faces4,Ua=ab.faces,ad=ab.faceVertexUvs[0],bd=ab.faceVertexUvs[1],hc=ab.skinIndices,Zb=ab.skinWeights,$b=ab.morphTargets,Gc=ab.morphNormals;if(ab.verticesNeedUpdate){D=0;for(W=la.length;D<W;D++){R=Ua[la[D]];S=gc[R.a];T=gc[R.b];U=gc[R.c];Oa[Ia]=S.x;Oa[Ia+1]=S.y;Oa[Ia+2]=S.z;Oa[Ia+3]=T.x;Oa[Ia+4]=T.y;Oa[Ia+5]=T.z;Oa[Ia+6]=U.x;Oa[Ia+7]=U.y;Oa[Ia+8]=U.z;Ia=Ia+9}D=0;for(W=ma.length;D<W;D++){R=Ua[ma[D]];S=gc[R.a];T=gc[R.b];U=gc[R.c];ia=gc[R.d];Oa[Ia]=S.x;Oa[Ia+1]=S.y;Oa[Ia+2]=S.z;Oa[Ia+3]=T.x;Oa[Ia+
-4]=T.y;Oa[Ia+5]=T.z;Oa[Ia+6]=U.x;Oa[Ia+7]=U.y;Oa[Ia+8]=U.z;Oa[Ia+9]=ia.x;Oa[Ia+10]=ia.y;Oa[Ia+11]=ia.z;Ia=Ia+12}k.bindBuffer(k.ARRAY_BUFFER,ka.__webglVertexBuffer);k.bufferData(k.ARRAY_BUFFER,Oa,ob)}if(xd){Na=0;for(id=$b.length;Na<id;Na++){D=da=0;for(W=la.length;D<W;D++){Yb=la[D];R=Ua[Yb];S=$b[Na].vertices[R.a];T=$b[Na].vertices[R.b];U=$b[Na].vertices[R.c];Ka=Yc[Na];Ka[da]=S.x;Ka[da+1]=S.y;Ka[da+2]=S.z;Ka[da+3]=T.x;Ka[da+4]=T.y;Ka[da+5]=T.z;Ka[da+6]=U.x;Ka[da+7]=U.y;Ka[da+8]=U.z;if(fc.morphNormals){if(Ec){Ob=
+ca,ib=k.DYNAMIC_DRAW,qc=!ca.dynamic,jc=Mb.attributes,cc=jc.index,Rc=jc.position,Sc=jc.normal,Tc=jc.uv,Uc=jc.color,Vc=jc.tangent;if(Mb.elementsNeedUpdate&&cc!==void 0){k.bindBuffer(k.ELEMENT_ARRAY_BUFFER,cc.buffer);k.bufferData(k.ELEMENT_ARRAY_BUFFER,cc.array,ib)}if(Mb.verticesNeedUpdate&&Rc!==void 0){k.bindBuffer(k.ARRAY_BUFFER,Rc.buffer);k.bufferData(k.ARRAY_BUFFER,Rc.array,ib)}if(Mb.normalsNeedUpdate&&Sc!==void 0){k.bindBuffer(k.ARRAY_BUFFER,Sc.buffer);k.bufferData(k.ARRAY_BUFFER,Sc.array,ib)}if(Mb.uvsNeedUpdate&&
+Tc!==void 0){k.bindBuffer(k.ARRAY_BUFFER,Tc.buffer);k.bufferData(k.ARRAY_BUFFER,Tc.array,ib)}if(Mb.colorsNeedUpdate&&Uc!==void 0){k.bindBuffer(k.ARRAY_BUFFER,Uc.buffer);k.bufferData(k.ARRAY_BUFFER,Uc.array,ib)}if(Mb.tangentsNeedUpdate&&Vc!==void 0){k.bindBuffer(k.ARRAY_BUFFER,Vc.buffer);k.bufferData(k.ARRAY_BUFFER,Vc.array,ib)}if(qc){var ed=void 0;for(ed in Mb.attributes)delete Mb.attributes[ed].array}}ca.verticesNeedUpdate=false;ca.elementsNeedUpdate=false;ca.uvsNeedUpdate=false;ca.normalsNeedUpdate=
+false;ca.colorsNeedUpdate=false;ca.tangentsNeedUpdate=false}else{for(var Wc=0,qd=ca.geometryGroupsList.length;Wc<qd;Wc++){fb=ca.geometryGroupsList[Wc];$a=c(ub,fb);hb=$a.attributes&&n($a);if(ca.verticesNeedUpdate||ca.morphTargetsNeedUpdate||ca.elementsNeedUpdate||ca.uvsNeedUpdate||ca.normalsNeedUpdate||ca.colorsNeedUpdate||ca.tangentsNeedUpdate||hb){var ka=fb,rd=ub,ob=k.DYNAMIC_DRAW,sd=!ca.dynamic,ec=$a;if(ka.__inittedArrays){var fd=d(ec),Xc=ec.vertexColors?ec.vertexColors:false,gd=f(ec),Ec=fd===THREE.SmoothShading,
+D=void 0,W=void 0,Vb=void 0,R=void 0,kc=void 0,Wb=void 0,vb=void 0,Fc=void 0,Nb=void 0,lc=void 0,mc=void 0,S=void 0,T=void 0,U=void 0,ia=void 0,wb=void 0,xb=void 0,yb=void 0,sc=void 0,zb=void 0,Ab=void 0,Bb=void 0,tc=void 0,Cb=void 0,Db=void 0,Eb=void 0,uc=void 0,Fb=void 0,Gb=void 0,Hb=void 0,vc=void 0,Ib=void 0,Jb=void 0,Kb=void 0,wc=void 0,pa=void 0,hd=void 0,Xb=void 0,nc=void 0,oc=void 0,Na=void 0,id=void 0,Ka=void 0,La=void 0,Yb=void 0,Ob=void 0,Ea=0,Ia=0,Pb=0,Qb=0,pb=0,Ta=0,va=0,Xa=0,Ga=0,$=
+0,da=0,z=0,sa=void 0,Oa=ka.__vertexArray,xc=ka.__uvArray,yc=ka.__uv2Array,qb=ka.__normalArray,ya=ka.__tangentArray,Pa=ka.__colorArray,za=ka.__skinIndexArray,Aa=ka.__skinWeightArray,Yc=ka.__morphTargetsArrays,Zc=ka.__morphNormalsArrays,$c=ka.__webglCustomAttributesList,x=void 0,Lb=ka.__faceArray,cb=ka.__lineArray,ab=rd.geometry,td=ab.elementsNeedUpdate,jd=ab.uvsNeedUpdate,ud=ab.normalsNeedUpdate,vd=ab.tangentsNeedUpdate,wd=ab.colorsNeedUpdate,xd=ab.morphTargetsNeedUpdate,fc=ab.vertices,la=ka.faces3,
+ma=ka.faces4,Ua=ab.faces,ad=ab.faceVertexUvs[0],bd=ab.faceVertexUvs[1],gc=ab.skinIndices,Zb=ab.skinWeights,$b=ab.morphTargets,Gc=ab.morphNormals;if(ab.verticesNeedUpdate){D=0;for(W=la.length;D<W;D++){R=Ua[la[D]];S=fc[R.a];T=fc[R.b];U=fc[R.c];Oa[Ia]=S.x;Oa[Ia+1]=S.y;Oa[Ia+2]=S.z;Oa[Ia+3]=T.x;Oa[Ia+4]=T.y;Oa[Ia+5]=T.z;Oa[Ia+6]=U.x;Oa[Ia+7]=U.y;Oa[Ia+8]=U.z;Ia=Ia+9}D=0;for(W=ma.length;D<W;D++){R=Ua[ma[D]];S=fc[R.a];T=fc[R.b];U=fc[R.c];ia=fc[R.d];Oa[Ia]=S.x;Oa[Ia+1]=S.y;Oa[Ia+2]=S.z;Oa[Ia+3]=T.x;Oa[Ia+
+4]=T.y;Oa[Ia+5]=T.z;Oa[Ia+6]=U.x;Oa[Ia+7]=U.y;Oa[Ia+8]=U.z;Oa[Ia+9]=ia.x;Oa[Ia+10]=ia.y;Oa[Ia+11]=ia.z;Ia=Ia+12}k.bindBuffer(k.ARRAY_BUFFER,ka.__webglVertexBuffer);k.bufferData(k.ARRAY_BUFFER,Oa,ob)}if(xd){Na=0;for(id=$b.length;Na<id;Na++){D=da=0;for(W=la.length;D<W;D++){Yb=la[D];R=Ua[Yb];S=$b[Na].vertices[R.a];T=$b[Na].vertices[R.b];U=$b[Na].vertices[R.c];Ka=Yc[Na];Ka[da]=S.x;Ka[da+1]=S.y;Ka[da+2]=S.z;Ka[da+3]=T.x;Ka[da+4]=T.y;Ka[da+5]=T.z;Ka[da+6]=U.x;Ka[da+7]=U.y;Ka[da+8]=U.z;if(ec.morphNormals){if(Ec){Ob=
 Gc[Na].vertexNormals[Yb];zb=Ob.a;Ab=Ob.b;Bb=Ob.c}else Bb=Ab=zb=Gc[Na].faceNormals[Yb];La=Zc[Na];La[da]=zb.x;La[da+1]=zb.y;La[da+2]=zb.z;La[da+3]=Ab.x;La[da+4]=Ab.y;La[da+5]=Ab.z;La[da+6]=Bb.x;La[da+7]=Bb.y;La[da+8]=Bb.z}da=da+9}D=0;for(W=ma.length;D<W;D++){Yb=ma[D];R=Ua[Yb];S=$b[Na].vertices[R.a];T=$b[Na].vertices[R.b];U=$b[Na].vertices[R.c];ia=$b[Na].vertices[R.d];Ka=Yc[Na];Ka[da]=S.x;Ka[da+1]=S.y;Ka[da+2]=S.z;Ka[da+3]=T.x;Ka[da+4]=T.y;Ka[da+5]=T.z;Ka[da+6]=U.x;Ka[da+7]=U.y;Ka[da+8]=U.z;Ka[da+9]=
-ia.x;Ka[da+10]=ia.y;Ka[da+11]=ia.z;if(fc.morphNormals){if(Ec){Ob=Gc[Na].vertexNormals[Yb];zb=Ob.a;Ab=Ob.b;Bb=Ob.c;tc=Ob.d}else tc=Bb=Ab=zb=Gc[Na].faceNormals[Yb];La=Zc[Na];La[da]=zb.x;La[da+1]=zb.y;La[da+2]=zb.z;La[da+3]=Ab.x;La[da+4]=Ab.y;La[da+5]=Ab.z;La[da+6]=Bb.x;La[da+7]=Bb.y;La[da+8]=Bb.z;La[da+9]=tc.x;La[da+10]=tc.y;La[da+11]=tc.z}da=da+12}k.bindBuffer(k.ARRAY_BUFFER,ka.__webglMorphTargetsBuffers[Na]);k.bufferData(k.ARRAY_BUFFER,Yc[Na],ob);if(fc.morphNormals){k.bindBuffer(k.ARRAY_BUFFER,ka.__webglMorphNormalsBuffers[Na]);
-k.bufferData(k.ARRAY_BUFFER,Zc[Na],ob)}}}if(Zb.length){D=0;for(W=la.length;D<W;D++){R=Ua[la[D]];Fb=Zb[R.a];Gb=Zb[R.b];Hb=Zb[R.c];Aa[$]=Fb.x;Aa[$+1]=Fb.y;Aa[$+2]=Fb.z;Aa[$+3]=Fb.w;Aa[$+4]=Gb.x;Aa[$+5]=Gb.y;Aa[$+6]=Gb.z;Aa[$+7]=Gb.w;Aa[$+8]=Hb.x;Aa[$+9]=Hb.y;Aa[$+10]=Hb.z;Aa[$+11]=Hb.w;Ib=hc[R.a];Jb=hc[R.b];Kb=hc[R.c];za[$]=Ib.x;za[$+1]=Ib.y;za[$+2]=Ib.z;za[$+3]=Ib.w;za[$+4]=Jb.x;za[$+5]=Jb.y;za[$+6]=Jb.z;za[$+7]=Jb.w;za[$+8]=Kb.x;za[$+9]=Kb.y;za[$+10]=Kb.z;za[$+11]=Kb.w;$=$+12}D=0;for(W=ma.length;D<
-W;D++){R=Ua[ma[D]];Fb=Zb[R.a];Gb=Zb[R.b];Hb=Zb[R.c];vc=Zb[R.d];Aa[$]=Fb.x;Aa[$+1]=Fb.y;Aa[$+2]=Fb.z;Aa[$+3]=Fb.w;Aa[$+4]=Gb.x;Aa[$+5]=Gb.y;Aa[$+6]=Gb.z;Aa[$+7]=Gb.w;Aa[$+8]=Hb.x;Aa[$+9]=Hb.y;Aa[$+10]=Hb.z;Aa[$+11]=Hb.w;Aa[$+12]=vc.x;Aa[$+13]=vc.y;Aa[$+14]=vc.z;Aa[$+15]=vc.w;Ib=hc[R.a];Jb=hc[R.b];Kb=hc[R.c];wc=hc[R.d];za[$]=Ib.x;za[$+1]=Ib.y;za[$+2]=Ib.z;za[$+3]=Ib.w;za[$+4]=Jb.x;za[$+5]=Jb.y;za[$+6]=Jb.z;za[$+7]=Jb.w;za[$+8]=Kb.x;za[$+9]=Kb.y;za[$+10]=Kb.z;za[$+11]=Kb.w;za[$+12]=wc.x;za[$+13]=wc.y;
+ia.x;Ka[da+10]=ia.y;Ka[da+11]=ia.z;if(ec.morphNormals){if(Ec){Ob=Gc[Na].vertexNormals[Yb];zb=Ob.a;Ab=Ob.b;Bb=Ob.c;tc=Ob.d}else tc=Bb=Ab=zb=Gc[Na].faceNormals[Yb];La=Zc[Na];La[da]=zb.x;La[da+1]=zb.y;La[da+2]=zb.z;La[da+3]=Ab.x;La[da+4]=Ab.y;La[da+5]=Ab.z;La[da+6]=Bb.x;La[da+7]=Bb.y;La[da+8]=Bb.z;La[da+9]=tc.x;La[da+10]=tc.y;La[da+11]=tc.z}da=da+12}k.bindBuffer(k.ARRAY_BUFFER,ka.__webglMorphTargetsBuffers[Na]);k.bufferData(k.ARRAY_BUFFER,Yc[Na],ob);if(ec.morphNormals){k.bindBuffer(k.ARRAY_BUFFER,ka.__webglMorphNormalsBuffers[Na]);
+k.bufferData(k.ARRAY_BUFFER,Zc[Na],ob)}}}if(Zb.length){D=0;for(W=la.length;D<W;D++){R=Ua[la[D]];Fb=Zb[R.a];Gb=Zb[R.b];Hb=Zb[R.c];Aa[$]=Fb.x;Aa[$+1]=Fb.y;Aa[$+2]=Fb.z;Aa[$+3]=Fb.w;Aa[$+4]=Gb.x;Aa[$+5]=Gb.y;Aa[$+6]=Gb.z;Aa[$+7]=Gb.w;Aa[$+8]=Hb.x;Aa[$+9]=Hb.y;Aa[$+10]=Hb.z;Aa[$+11]=Hb.w;Ib=gc[R.a];Jb=gc[R.b];Kb=gc[R.c];za[$]=Ib.x;za[$+1]=Ib.y;za[$+2]=Ib.z;za[$+3]=Ib.w;za[$+4]=Jb.x;za[$+5]=Jb.y;za[$+6]=Jb.z;za[$+7]=Jb.w;za[$+8]=Kb.x;za[$+9]=Kb.y;za[$+10]=Kb.z;za[$+11]=Kb.w;$=$+12}D=0;for(W=ma.length;D<
+W;D++){R=Ua[ma[D]];Fb=Zb[R.a];Gb=Zb[R.b];Hb=Zb[R.c];vc=Zb[R.d];Aa[$]=Fb.x;Aa[$+1]=Fb.y;Aa[$+2]=Fb.z;Aa[$+3]=Fb.w;Aa[$+4]=Gb.x;Aa[$+5]=Gb.y;Aa[$+6]=Gb.z;Aa[$+7]=Gb.w;Aa[$+8]=Hb.x;Aa[$+9]=Hb.y;Aa[$+10]=Hb.z;Aa[$+11]=Hb.w;Aa[$+12]=vc.x;Aa[$+13]=vc.y;Aa[$+14]=vc.z;Aa[$+15]=vc.w;Ib=gc[R.a];Jb=gc[R.b];Kb=gc[R.c];wc=gc[R.d];za[$]=Ib.x;za[$+1]=Ib.y;za[$+2]=Ib.z;za[$+3]=Ib.w;za[$+4]=Jb.x;za[$+5]=Jb.y;za[$+6]=Jb.z;za[$+7]=Jb.w;za[$+8]=Kb.x;za[$+9]=Kb.y;za[$+10]=Kb.z;za[$+11]=Kb.w;za[$+12]=wc.x;za[$+13]=wc.y;
 za[$+14]=wc.z;za[$+15]=wc.w;$=$+16}if($>0){k.bindBuffer(k.ARRAY_BUFFER,ka.__webglSkinIndicesBuffer);k.bufferData(k.ARRAY_BUFFER,za,ob);k.bindBuffer(k.ARRAY_BUFFER,ka.__webglSkinWeightsBuffer);k.bufferData(k.ARRAY_BUFFER,Aa,ob)}}if(wd&&Xc){D=0;for(W=la.length;D<W;D++){R=Ua[la[D]];vb=R.vertexColors;Fc=R.color;if(vb.length===3&&Xc===THREE.VertexColors){Cb=vb[0];Db=vb[1];Eb=vb[2]}else Eb=Db=Cb=Fc;Pa[Ga]=Cb.r;Pa[Ga+1]=Cb.g;Pa[Ga+2]=Cb.b;Pa[Ga+3]=Db.r;Pa[Ga+4]=Db.g;Pa[Ga+5]=Db.b;Pa[Ga+6]=Eb.r;Pa[Ga+7]=
 Eb.g;Pa[Ga+8]=Eb.b;Ga=Ga+9}D=0;for(W=ma.length;D<W;D++){R=Ua[ma[D]];vb=R.vertexColors;Fc=R.color;if(vb.length===4&&Xc===THREE.VertexColors){Cb=vb[0];Db=vb[1];Eb=vb[2];uc=vb[3]}else uc=Eb=Db=Cb=Fc;Pa[Ga]=Cb.r;Pa[Ga+1]=Cb.g;Pa[Ga+2]=Cb.b;Pa[Ga+3]=Db.r;Pa[Ga+4]=Db.g;Pa[Ga+5]=Db.b;Pa[Ga+6]=Eb.r;Pa[Ga+7]=Eb.g;Pa[Ga+8]=Eb.b;Pa[Ga+9]=uc.r;Pa[Ga+10]=uc.g;Pa[Ga+11]=uc.b;Ga=Ga+12}if(Ga>0){k.bindBuffer(k.ARRAY_BUFFER,ka.__webglColorBuffer);k.bufferData(k.ARRAY_BUFFER,Pa,ob)}}if(vd&&ab.hasTangents){D=0;for(W=
 la.length;D<W;D++){R=Ua[la[D]];Nb=R.vertexTangents;wb=Nb[0];xb=Nb[1];yb=Nb[2];ya[va]=wb.x;ya[va+1]=wb.y;ya[va+2]=wb.z;ya[va+3]=wb.w;ya[va+4]=xb.x;ya[va+5]=xb.y;ya[va+6]=xb.z;ya[va+7]=xb.w;ya[va+8]=yb.x;ya[va+9]=yb.y;ya[va+10]=yb.z;ya[va+11]=yb.w;va=va+12}D=0;for(W=ma.length;D<W;D++){R=Ua[ma[D]];Nb=R.vertexTangents;wb=Nb[0];xb=Nb[1];yb=Nb[2];sc=Nb[3];ya[va]=wb.x;ya[va+1]=wb.y;ya[va+2]=wb.z;ya[va+3]=wb.w;ya[va+4]=xb.x;ya[va+5]=xb.y;ya[va+6]=xb.z;ya[va+7]=xb.w;ya[va+8]=yb.x;ya[va+9]=yb.y;ya[va+10]=yb.z;
-ya[va+11]=yb.w;ya[va+12]=sc.x;ya[va+13]=sc.y;ya[va+14]=sc.z;ya[va+15]=sc.w;va=va+16}k.bindBuffer(k.ARRAY_BUFFER,ka.__webglTangentBuffer);k.bufferData(k.ARRAY_BUFFER,ya,ob)}if(ud&&fd){D=0;for(W=la.length;D<W;D++){R=Ua[la[D]];lc=R.vertexNormals;Wb=R.normal;if(lc.length===3&&Ec)for(pa=0;pa<3;pa++){Xb=lc[pa];qb[Ta]=Xb.x;qb[Ta+1]=Xb.y;qb[Ta+2]=Xb.z;Ta=Ta+3}else for(pa=0;pa<3;pa++){qb[Ta]=Wb.x;qb[Ta+1]=Wb.y;qb[Ta+2]=Wb.z;Ta=Ta+3}}D=0;for(W=ma.length;D<W;D++){R=Ua[ma[D]];lc=R.vertexNormals;Wb=R.normal;if(lc.length===
-4&&Ec)for(pa=0;pa<4;pa++){Xb=lc[pa];qb[Ta]=Xb.x;qb[Ta+1]=Xb.y;qb[Ta+2]=Xb.z;Ta=Ta+3}else for(pa=0;pa<4;pa++){qb[Ta]=Wb.x;qb[Ta+1]=Wb.y;qb[Ta+2]=Wb.z;Ta=Ta+3}}k.bindBuffer(k.ARRAY_BUFFER,ka.__webglNormalBuffer);k.bufferData(k.ARRAY_BUFFER,qb,ob)}if(jd&&ad&&gd){D=0;for(W=la.length;D<W;D++){Vb=la[D];mc=ad[Vb];if(mc!==void 0)for(pa=0;pa<3;pa++){oc=mc[pa];xc[Pb]=oc.u;xc[Pb+1]=oc.v;Pb=Pb+2}}D=0;for(W=ma.length;D<W;D++){Vb=ma[D];mc=ad[Vb];if(mc!==void 0)for(pa=0;pa<4;pa++){oc=mc[pa];xc[Pb]=oc.u;xc[Pb+1]=
-oc.v;Pb=Pb+2}}if(Pb>0){k.bindBuffer(k.ARRAY_BUFFER,ka.__webglUVBuffer);k.bufferData(k.ARRAY_BUFFER,xc,ob)}}if(jd&&bd&&gd){D=0;for(W=la.length;D<W;D++){Vb=la[D];nc=bd[Vb];if(nc!==void 0)for(pa=0;pa<3;pa++){pc=nc[pa];yc[Qb]=pc.u;yc[Qb+1]=pc.v;Qb=Qb+2}}D=0;for(W=ma.length;D<W;D++){Vb=ma[D];nc=bd[Vb];if(nc!==void 0)for(pa=0;pa<4;pa++){pc=nc[pa];yc[Qb]=pc.u;yc[Qb+1]=pc.v;Qb=Qb+2}}if(Qb>0){k.bindBuffer(k.ARRAY_BUFFER,ka.__webglUV2Buffer);k.bufferData(k.ARRAY_BUFFER,yc,ob)}}if(td){D=0;for(W=la.length;D<
+ya[va+11]=yb.w;ya[va+12]=sc.x;ya[va+13]=sc.y;ya[va+14]=sc.z;ya[va+15]=sc.w;va=va+16}k.bindBuffer(k.ARRAY_BUFFER,ka.__webglTangentBuffer);k.bufferData(k.ARRAY_BUFFER,ya,ob)}if(ud&&fd){D=0;for(W=la.length;D<W;D++){R=Ua[la[D]];kc=R.vertexNormals;Wb=R.normal;if(kc.length===3&&Ec)for(pa=0;pa<3;pa++){Xb=kc[pa];qb[Ta]=Xb.x;qb[Ta+1]=Xb.y;qb[Ta+2]=Xb.z;Ta=Ta+3}else for(pa=0;pa<3;pa++){qb[Ta]=Wb.x;qb[Ta+1]=Wb.y;qb[Ta+2]=Wb.z;Ta=Ta+3}}D=0;for(W=ma.length;D<W;D++){R=Ua[ma[D]];kc=R.vertexNormals;Wb=R.normal;if(kc.length===
+4&&Ec)for(pa=0;pa<4;pa++){Xb=kc[pa];qb[Ta]=Xb.x;qb[Ta+1]=Xb.y;qb[Ta+2]=Xb.z;Ta=Ta+3}else for(pa=0;pa<4;pa++){qb[Ta]=Wb.x;qb[Ta+1]=Wb.y;qb[Ta+2]=Wb.z;Ta=Ta+3}}k.bindBuffer(k.ARRAY_BUFFER,ka.__webglNormalBuffer);k.bufferData(k.ARRAY_BUFFER,qb,ob)}if(jd&&ad&&gd){D=0;for(W=la.length;D<W;D++){Vb=la[D];lc=ad[Vb];if(lc!==void 0)for(pa=0;pa<3;pa++){nc=lc[pa];xc[Pb]=nc.u;xc[Pb+1]=nc.v;Pb=Pb+2}}D=0;for(W=ma.length;D<W;D++){Vb=ma[D];lc=ad[Vb];if(lc!==void 0)for(pa=0;pa<4;pa++){nc=lc[pa];xc[Pb]=nc.u;xc[Pb+1]=
+nc.v;Pb=Pb+2}}if(Pb>0){k.bindBuffer(k.ARRAY_BUFFER,ka.__webglUVBuffer);k.bufferData(k.ARRAY_BUFFER,xc,ob)}}if(jd&&bd&&gd){D=0;for(W=la.length;D<W;D++){Vb=la[D];mc=bd[Vb];if(mc!==void 0)for(pa=0;pa<3;pa++){oc=mc[pa];yc[Qb]=oc.u;yc[Qb+1]=oc.v;Qb=Qb+2}}D=0;for(W=ma.length;D<W;D++){Vb=ma[D];mc=bd[Vb];if(mc!==void 0)for(pa=0;pa<4;pa++){oc=mc[pa];yc[Qb]=oc.u;yc[Qb+1]=oc.v;Qb=Qb+2}}if(Qb>0){k.bindBuffer(k.ARRAY_BUFFER,ka.__webglUV2Buffer);k.bufferData(k.ARRAY_BUFFER,yc,ob)}}if(td){D=0;for(W=la.length;D<
 W;D++){Lb[pb]=Ea;Lb[pb+1]=Ea+1;Lb[pb+2]=Ea+2;pb=pb+3;cb[Xa]=Ea;cb[Xa+1]=Ea+1;cb[Xa+2]=Ea;cb[Xa+3]=Ea+2;cb[Xa+4]=Ea+1;cb[Xa+5]=Ea+2;Xa=Xa+6;Ea=Ea+3}D=0;for(W=ma.length;D<W;D++){Lb[pb]=Ea;Lb[pb+1]=Ea+1;Lb[pb+2]=Ea+3;Lb[pb+3]=Ea+1;Lb[pb+4]=Ea+2;Lb[pb+5]=Ea+3;pb=pb+6;cb[Xa]=Ea;cb[Xa+1]=Ea+1;cb[Xa+2]=Ea;cb[Xa+3]=Ea+3;cb[Xa+4]=Ea+1;cb[Xa+5]=Ea+2;cb[Xa+6]=Ea+2;cb[Xa+7]=Ea+3;Xa=Xa+8;Ea=Ea+4}k.bindBuffer(k.ELEMENT_ARRAY_BUFFER,ka.__webglFaceBuffer);k.bufferData(k.ELEMENT_ARRAY_BUFFER,Lb,ob);k.bindBuffer(k.ELEMENT_ARRAY_BUFFER,
-ka.__webglLineBuffer);k.bufferData(k.ELEMENT_ARRAY_BUFFER,cb,ob)}if($c){pa=0;for(hd=$c.length;pa<hd;pa++){w=$c[pa];if(w.__original.needsUpdate){z=0;if(w.size===1)if(w.boundTo===void 0||w.boundTo==="vertices"){D=0;for(W=la.length;D<W;D++){R=Ua[la[D]];w.array[z]=w.value[R.a];w.array[z+1]=w.value[R.b];w.array[z+2]=w.value[R.c];z=z+3}D=0;for(W=ma.length;D<W;D++){R=Ua[ma[D]];w.array[z]=w.value[R.a];w.array[z+1]=w.value[R.b];w.array[z+2]=w.value[R.c];w.array[z+3]=w.value[R.d];z=z+4}}else{if(w.boundTo===
-"faces"){D=0;for(W=la.length;D<W;D++){sa=w.value[la[D]];w.array[z]=sa;w.array[z+1]=sa;w.array[z+2]=sa;z=z+3}D=0;for(W=ma.length;D<W;D++){sa=w.value[ma[D]];w.array[z]=sa;w.array[z+1]=sa;w.array[z+2]=sa;w.array[z+3]=sa;z=z+4}}}else if(w.size===2)if(w.boundTo===void 0||w.boundTo==="vertices"){D=0;for(W=la.length;D<W;D++){R=Ua[la[D]];S=w.value[R.a];T=w.value[R.b];U=w.value[R.c];w.array[z]=S.x;w.array[z+1]=S.y;w.array[z+2]=T.x;w.array[z+3]=T.y;w.array[z+4]=U.x;w.array[z+5]=U.y;z=z+6}D=0;for(W=ma.length;D<
-W;D++){R=Ua[ma[D]];S=w.value[R.a];T=w.value[R.b];U=w.value[R.c];ia=w.value[R.d];w.array[z]=S.x;w.array[z+1]=S.y;w.array[z+2]=T.x;w.array[z+3]=T.y;w.array[z+4]=U.x;w.array[z+5]=U.y;w.array[z+6]=ia.x;w.array[z+7]=ia.y;z=z+8}}else{if(w.boundTo==="faces"){D=0;for(W=la.length;D<W;D++){U=T=S=sa=w.value[la[D]];w.array[z]=S.x;w.array[z+1]=S.y;w.array[z+2]=T.x;w.array[z+3]=T.y;w.array[z+4]=U.x;w.array[z+5]=U.y;z=z+6}D=0;for(W=ma.length;D<W;D++){ia=U=T=S=sa=w.value[ma[D]];w.array[z]=S.x;w.array[z+1]=S.y;w.array[z+
-2]=T.x;w.array[z+3]=T.y;w.array[z+4]=U.x;w.array[z+5]=U.y;w.array[z+6]=ia.x;w.array[z+7]=ia.y;z=z+8}}}else if(w.size===3){var Z;Z=w.type==="c"?["r","g","b"]:["x","y","z"];if(w.boundTo===void 0||w.boundTo==="vertices"){D=0;for(W=la.length;D<W;D++){R=Ua[la[D]];S=w.value[R.a];T=w.value[R.b];U=w.value[R.c];w.array[z]=S[Z[0]];w.array[z+1]=S[Z[1]];w.array[z+2]=S[Z[2]];w.array[z+3]=T[Z[0]];w.array[z+4]=T[Z[1]];w.array[z+5]=T[Z[2]];w.array[z+6]=U[Z[0]];w.array[z+7]=U[Z[1]];w.array[z+8]=U[Z[2]];z=z+9}D=0;
-for(W=ma.length;D<W;D++){R=Ua[ma[D]];S=w.value[R.a];T=w.value[R.b];U=w.value[R.c];ia=w.value[R.d];w.array[z]=S[Z[0]];w.array[z+1]=S[Z[1]];w.array[z+2]=S[Z[2]];w.array[z+3]=T[Z[0]];w.array[z+4]=T[Z[1]];w.array[z+5]=T[Z[2]];w.array[z+6]=U[Z[0]];w.array[z+7]=U[Z[1]];w.array[z+8]=U[Z[2]];w.array[z+9]=ia[Z[0]];w.array[z+10]=ia[Z[1]];w.array[z+11]=ia[Z[2]];z=z+12}}else if(w.boundTo==="faces"){D=0;for(W=la.length;D<W;D++){U=T=S=sa=w.value[la[D]];w.array[z]=S[Z[0]];w.array[z+1]=S[Z[1]];w.array[z+2]=S[Z[2]];
-w.array[z+3]=T[Z[0]];w.array[z+4]=T[Z[1]];w.array[z+5]=T[Z[2]];w.array[z+6]=U[Z[0]];w.array[z+7]=U[Z[1]];w.array[z+8]=U[Z[2]];z=z+9}D=0;for(W=ma.length;D<W;D++){ia=U=T=S=sa=w.value[ma[D]];w.array[z]=S[Z[0]];w.array[z+1]=S[Z[1]];w.array[z+2]=S[Z[2]];w.array[z+3]=T[Z[0]];w.array[z+4]=T[Z[1]];w.array[z+5]=T[Z[2]];w.array[z+6]=U[Z[0]];w.array[z+7]=U[Z[1]];w.array[z+8]=U[Z[2]];w.array[z+9]=ia[Z[0]];w.array[z+10]=ia[Z[1]];w.array[z+11]=ia[Z[2]];z=z+12}}else if(w.boundTo==="faceVertices"){D=0;for(W=la.length;D<
-W;D++){sa=w.value[la[D]];S=sa[0];T=sa[1];U=sa[2];w.array[z]=S[Z[0]];w.array[z+1]=S[Z[1]];w.array[z+2]=S[Z[2]];w.array[z+3]=T[Z[0]];w.array[z+4]=T[Z[1]];w.array[z+5]=T[Z[2]];w.array[z+6]=U[Z[0]];w.array[z+7]=U[Z[1]];w.array[z+8]=U[Z[2]];z=z+9}D=0;for(W=ma.length;D<W;D++){sa=w.value[ma[D]];S=sa[0];T=sa[1];U=sa[2];ia=sa[3];w.array[z]=S[Z[0]];w.array[z+1]=S[Z[1]];w.array[z+2]=S[Z[2]];w.array[z+3]=T[Z[0]];w.array[z+4]=T[Z[1]];w.array[z+5]=T[Z[2]];w.array[z+6]=U[Z[0]];w.array[z+7]=U[Z[1]];w.array[z+8]=
-U[Z[2]];w.array[z+9]=ia[Z[0]];w.array[z+10]=ia[Z[1]];w.array[z+11]=ia[Z[2]];z=z+12}}}else if(w.size===4)if(w.boundTo===void 0||w.boundTo==="vertices"){D=0;for(W=la.length;D<W;D++){R=Ua[la[D]];S=w.value[R.a];T=w.value[R.b];U=w.value[R.c];w.array[z]=S.x;w.array[z+1]=S.y;w.array[z+2]=S.z;w.array[z+3]=S.w;w.array[z+4]=T.x;w.array[z+5]=T.y;w.array[z+6]=T.z;w.array[z+7]=T.w;w.array[z+8]=U.x;w.array[z+9]=U.y;w.array[z+10]=U.z;w.array[z+11]=U.w;z=z+12}D=0;for(W=ma.length;D<W;D++){R=Ua[ma[D]];S=w.value[R.a];
-T=w.value[R.b];U=w.value[R.c];ia=w.value[R.d];w.array[z]=S.x;w.array[z+1]=S.y;w.array[z+2]=S.z;w.array[z+3]=S.w;w.array[z+4]=T.x;w.array[z+5]=T.y;w.array[z+6]=T.z;w.array[z+7]=T.w;w.array[z+8]=U.x;w.array[z+9]=U.y;w.array[z+10]=U.z;w.array[z+11]=U.w;w.array[z+12]=ia.x;w.array[z+13]=ia.y;w.array[z+14]=ia.z;w.array[z+15]=ia.w;z=z+16}}else if(w.boundTo==="faces"){D=0;for(W=la.length;D<W;D++){U=T=S=sa=w.value[la[D]];w.array[z]=S.x;w.array[z+1]=S.y;w.array[z+2]=S.z;w.array[z+3]=S.w;w.array[z+4]=T.x;w.array[z+
-5]=T.y;w.array[z+6]=T.z;w.array[z+7]=T.w;w.array[z+8]=U.x;w.array[z+9]=U.y;w.array[z+10]=U.z;w.array[z+11]=U.w;z=z+12}D=0;for(W=ma.length;D<W;D++){ia=U=T=S=sa=w.value[ma[D]];w.array[z]=S.x;w.array[z+1]=S.y;w.array[z+2]=S.z;w.array[z+3]=S.w;w.array[z+4]=T.x;w.array[z+5]=T.y;w.array[z+6]=T.z;w.array[z+7]=T.w;w.array[z+8]=U.x;w.array[z+9]=U.y;w.array[z+10]=U.z;w.array[z+11]=U.w;w.array[z+12]=ia.x;w.array[z+13]=ia.y;w.array[z+14]=ia.z;w.array[z+15]=ia.w;z=z+16}}else if(w.boundTo==="faceVertices"){D=0;
-for(W=la.length;D<W;D++){sa=w.value[la[D]];S=sa[0];T=sa[1];U=sa[2];w.array[z]=S.x;w.array[z+1]=S.y;w.array[z+2]=S.z;w.array[z+3]=S.w;w.array[z+4]=T.x;w.array[z+5]=T.y;w.array[z+6]=T.z;w.array[z+7]=T.w;w.array[z+8]=U.x;w.array[z+9]=U.y;w.array[z+10]=U.z;w.array[z+11]=U.w;z=z+12}D=0;for(W=ma.length;D<W;D++){sa=w.value[ma[D]];S=sa[0];T=sa[1];U=sa[2];ia=sa[3];w.array[z]=S.x;w.array[z+1]=S.y;w.array[z+2]=S.z;w.array[z+3]=S.w;w.array[z+4]=T.x;w.array[z+5]=T.y;w.array[z+6]=T.z;w.array[z+7]=T.w;w.array[z+
-8]=U.x;w.array[z+9]=U.y;w.array[z+10]=U.z;w.array[z+11]=U.w;w.array[z+12]=ia.x;w.array[z+13]=ia.y;w.array[z+14]=ia.z;w.array[z+15]=ia.w;z=z+16}}k.bindBuffer(k.ARRAY_BUFFER,w.buffer);k.bufferData(k.ARRAY_BUFFER,w.array,ob)}}}if(sd){delete ka.__inittedArrays;delete ka.__colorArray;delete ka.__normalArray;delete ka.__tangentArray;delete ka.__uvArray;delete ka.__uv2Array;delete ka.__faceArray;delete ka.__vertexArray;delete ka.__lineArray;delete ka.__skinIndexArray;delete ka.__skinWeightArray}}}}ca.verticesNeedUpdate=
+ka.__webglLineBuffer);k.bufferData(k.ELEMENT_ARRAY_BUFFER,cb,ob)}if($c){pa=0;for(hd=$c.length;pa<hd;pa++){x=$c[pa];if(x.__original.needsUpdate){z=0;if(x.size===1)if(x.boundTo===void 0||x.boundTo==="vertices"){D=0;for(W=la.length;D<W;D++){R=Ua[la[D]];x.array[z]=x.value[R.a];x.array[z+1]=x.value[R.b];x.array[z+2]=x.value[R.c];z=z+3}D=0;for(W=ma.length;D<W;D++){R=Ua[ma[D]];x.array[z]=x.value[R.a];x.array[z+1]=x.value[R.b];x.array[z+2]=x.value[R.c];x.array[z+3]=x.value[R.d];z=z+4}}else{if(x.boundTo===
+"faces"){D=0;for(W=la.length;D<W;D++){sa=x.value[la[D]];x.array[z]=sa;x.array[z+1]=sa;x.array[z+2]=sa;z=z+3}D=0;for(W=ma.length;D<W;D++){sa=x.value[ma[D]];x.array[z]=sa;x.array[z+1]=sa;x.array[z+2]=sa;x.array[z+3]=sa;z=z+4}}}else if(x.size===2)if(x.boundTo===void 0||x.boundTo==="vertices"){D=0;for(W=la.length;D<W;D++){R=Ua[la[D]];S=x.value[R.a];T=x.value[R.b];U=x.value[R.c];x.array[z]=S.x;x.array[z+1]=S.y;x.array[z+2]=T.x;x.array[z+3]=T.y;x.array[z+4]=U.x;x.array[z+5]=U.y;z=z+6}D=0;for(W=ma.length;D<
+W;D++){R=Ua[ma[D]];S=x.value[R.a];T=x.value[R.b];U=x.value[R.c];ia=x.value[R.d];x.array[z]=S.x;x.array[z+1]=S.y;x.array[z+2]=T.x;x.array[z+3]=T.y;x.array[z+4]=U.x;x.array[z+5]=U.y;x.array[z+6]=ia.x;x.array[z+7]=ia.y;z=z+8}}else{if(x.boundTo==="faces"){D=0;for(W=la.length;D<W;D++){U=T=S=sa=x.value[la[D]];x.array[z]=S.x;x.array[z+1]=S.y;x.array[z+2]=T.x;x.array[z+3]=T.y;x.array[z+4]=U.x;x.array[z+5]=U.y;z=z+6}D=0;for(W=ma.length;D<W;D++){ia=U=T=S=sa=x.value[ma[D]];x.array[z]=S.x;x.array[z+1]=S.y;x.array[z+
+2]=T.x;x.array[z+3]=T.y;x.array[z+4]=U.x;x.array[z+5]=U.y;x.array[z+6]=ia.x;x.array[z+7]=ia.y;z=z+8}}}else if(x.size===3){var Z;Z=x.type==="c"?["r","g","b"]:["x","y","z"];if(x.boundTo===void 0||x.boundTo==="vertices"){D=0;for(W=la.length;D<W;D++){R=Ua[la[D]];S=x.value[R.a];T=x.value[R.b];U=x.value[R.c];x.array[z]=S[Z[0]];x.array[z+1]=S[Z[1]];x.array[z+2]=S[Z[2]];x.array[z+3]=T[Z[0]];x.array[z+4]=T[Z[1]];x.array[z+5]=T[Z[2]];x.array[z+6]=U[Z[0]];x.array[z+7]=U[Z[1]];x.array[z+8]=U[Z[2]];z=z+9}D=0;
+for(W=ma.length;D<W;D++){R=Ua[ma[D]];S=x.value[R.a];T=x.value[R.b];U=x.value[R.c];ia=x.value[R.d];x.array[z]=S[Z[0]];x.array[z+1]=S[Z[1]];x.array[z+2]=S[Z[2]];x.array[z+3]=T[Z[0]];x.array[z+4]=T[Z[1]];x.array[z+5]=T[Z[2]];x.array[z+6]=U[Z[0]];x.array[z+7]=U[Z[1]];x.array[z+8]=U[Z[2]];x.array[z+9]=ia[Z[0]];x.array[z+10]=ia[Z[1]];x.array[z+11]=ia[Z[2]];z=z+12}}else if(x.boundTo==="faces"){D=0;for(W=la.length;D<W;D++){U=T=S=sa=x.value[la[D]];x.array[z]=S[Z[0]];x.array[z+1]=S[Z[1]];x.array[z+2]=S[Z[2]];
+x.array[z+3]=T[Z[0]];x.array[z+4]=T[Z[1]];x.array[z+5]=T[Z[2]];x.array[z+6]=U[Z[0]];x.array[z+7]=U[Z[1]];x.array[z+8]=U[Z[2]];z=z+9}D=0;for(W=ma.length;D<W;D++){ia=U=T=S=sa=x.value[ma[D]];x.array[z]=S[Z[0]];x.array[z+1]=S[Z[1]];x.array[z+2]=S[Z[2]];x.array[z+3]=T[Z[0]];x.array[z+4]=T[Z[1]];x.array[z+5]=T[Z[2]];x.array[z+6]=U[Z[0]];x.array[z+7]=U[Z[1]];x.array[z+8]=U[Z[2]];x.array[z+9]=ia[Z[0]];x.array[z+10]=ia[Z[1]];x.array[z+11]=ia[Z[2]];z=z+12}}else if(x.boundTo==="faceVertices"){D=0;for(W=la.length;D<
+W;D++){sa=x.value[la[D]];S=sa[0];T=sa[1];U=sa[2];x.array[z]=S[Z[0]];x.array[z+1]=S[Z[1]];x.array[z+2]=S[Z[2]];x.array[z+3]=T[Z[0]];x.array[z+4]=T[Z[1]];x.array[z+5]=T[Z[2]];x.array[z+6]=U[Z[0]];x.array[z+7]=U[Z[1]];x.array[z+8]=U[Z[2]];z=z+9}D=0;for(W=ma.length;D<W;D++){sa=x.value[ma[D]];S=sa[0];T=sa[1];U=sa[2];ia=sa[3];x.array[z]=S[Z[0]];x.array[z+1]=S[Z[1]];x.array[z+2]=S[Z[2]];x.array[z+3]=T[Z[0]];x.array[z+4]=T[Z[1]];x.array[z+5]=T[Z[2]];x.array[z+6]=U[Z[0]];x.array[z+7]=U[Z[1]];x.array[z+8]=
+U[Z[2]];x.array[z+9]=ia[Z[0]];x.array[z+10]=ia[Z[1]];x.array[z+11]=ia[Z[2]];z=z+12}}}else if(x.size===4)if(x.boundTo===void 0||x.boundTo==="vertices"){D=0;for(W=la.length;D<W;D++){R=Ua[la[D]];S=x.value[R.a];T=x.value[R.b];U=x.value[R.c];x.array[z]=S.x;x.array[z+1]=S.y;x.array[z+2]=S.z;x.array[z+3]=S.w;x.array[z+4]=T.x;x.array[z+5]=T.y;x.array[z+6]=T.z;x.array[z+7]=T.w;x.array[z+8]=U.x;x.array[z+9]=U.y;x.array[z+10]=U.z;x.array[z+11]=U.w;z=z+12}D=0;for(W=ma.length;D<W;D++){R=Ua[ma[D]];S=x.value[R.a];
+T=x.value[R.b];U=x.value[R.c];ia=x.value[R.d];x.array[z]=S.x;x.array[z+1]=S.y;x.array[z+2]=S.z;x.array[z+3]=S.w;x.array[z+4]=T.x;x.array[z+5]=T.y;x.array[z+6]=T.z;x.array[z+7]=T.w;x.array[z+8]=U.x;x.array[z+9]=U.y;x.array[z+10]=U.z;x.array[z+11]=U.w;x.array[z+12]=ia.x;x.array[z+13]=ia.y;x.array[z+14]=ia.z;x.array[z+15]=ia.w;z=z+16}}else if(x.boundTo==="faces"){D=0;for(W=la.length;D<W;D++){U=T=S=sa=x.value[la[D]];x.array[z]=S.x;x.array[z+1]=S.y;x.array[z+2]=S.z;x.array[z+3]=S.w;x.array[z+4]=T.x;x.array[z+
+5]=T.y;x.array[z+6]=T.z;x.array[z+7]=T.w;x.array[z+8]=U.x;x.array[z+9]=U.y;x.array[z+10]=U.z;x.array[z+11]=U.w;z=z+12}D=0;for(W=ma.length;D<W;D++){ia=U=T=S=sa=x.value[ma[D]];x.array[z]=S.x;x.array[z+1]=S.y;x.array[z+2]=S.z;x.array[z+3]=S.w;x.array[z+4]=T.x;x.array[z+5]=T.y;x.array[z+6]=T.z;x.array[z+7]=T.w;x.array[z+8]=U.x;x.array[z+9]=U.y;x.array[z+10]=U.z;x.array[z+11]=U.w;x.array[z+12]=ia.x;x.array[z+13]=ia.y;x.array[z+14]=ia.z;x.array[z+15]=ia.w;z=z+16}}else if(x.boundTo==="faceVertices"){D=0;
+for(W=la.length;D<W;D++){sa=x.value[la[D]];S=sa[0];T=sa[1];U=sa[2];x.array[z]=S.x;x.array[z+1]=S.y;x.array[z+2]=S.z;x.array[z+3]=S.w;x.array[z+4]=T.x;x.array[z+5]=T.y;x.array[z+6]=T.z;x.array[z+7]=T.w;x.array[z+8]=U.x;x.array[z+9]=U.y;x.array[z+10]=U.z;x.array[z+11]=U.w;z=z+12}D=0;for(W=ma.length;D<W;D++){sa=x.value[ma[D]];S=sa[0];T=sa[1];U=sa[2];ia=sa[3];x.array[z]=S.x;x.array[z+1]=S.y;x.array[z+2]=S.z;x.array[z+3]=S.w;x.array[z+4]=T.x;x.array[z+5]=T.y;x.array[z+6]=T.z;x.array[z+7]=T.w;x.array[z+
+8]=U.x;x.array[z+9]=U.y;x.array[z+10]=U.z;x.array[z+11]=U.w;x.array[z+12]=ia.x;x.array[z+13]=ia.y;x.array[z+14]=ia.z;x.array[z+15]=ia.w;z=z+16}}k.bindBuffer(k.ARRAY_BUFFER,x.buffer);k.bufferData(k.ARRAY_BUFFER,x.array,ob)}}}if(sd){delete ka.__inittedArrays;delete ka.__colorArray;delete ka.__normalArray;delete ka.__tangentArray;delete ka.__uvArray;delete ka.__uv2Array;delete ka.__faceArray;delete ka.__vertexArray;delete ka.__lineArray;delete ka.__skinIndexArray;delete ka.__skinWeightArray}}}}ca.verticesNeedUpdate=
 false;ca.morphTargetsNeedUpdate=false;ca.elementsNeedUpdate=false;ca.uvsNeedUpdate=false;ca.normalsNeedUpdate=false;ca.colorsNeedUpdate=false;ca.tangentsNeedUpdate=false;$a.attributes&&q($a)}else if(ub instanceof THREE.Ribbon){if(ca.verticesNeedUpdate||ca.colorsNeedUpdate){var ac=ca,kd=k.DYNAMIC_DRAW,zc=void 0,Ac=void 0,Hc=void 0,bc=void 0,Ic=void 0,ld=ac.vertices,md=ac.colors,yd=ld.length,zd=md.length,Jc=ac.__vertexArray,Kc=ac.__colorArray,Ad=ac.colorsNeedUpdate;if(ac.verticesNeedUpdate){for(zc=
 0;zc<yd;zc++){Hc=ld[zc];bc=zc*3;Jc[bc]=Hc.x;Jc[bc+1]=Hc.y;Jc[bc+2]=Hc.z}k.bindBuffer(k.ARRAY_BUFFER,ac.__webglVertexBuffer);k.bufferData(k.ARRAY_BUFFER,Jc,kd)}if(Ad){for(Ac=0;Ac<zd;Ac++){Ic=md[Ac];bc=Ac*3;Kc[bc]=Ic.r;Kc[bc+1]=Ic.g;Kc[bc+2]=Ic.b}k.bindBuffer(k.ARRAY_BUFFER,ac.__webglColorBuffer);k.bufferData(k.ARRAY_BUFFER,Kc,kd)}}ca.verticesNeedUpdate=false;ca.colorsNeedUpdate=false}else if(ub instanceof THREE.Line){$a=c(ub,fb);hb=$a.attributes&&n($a);if(ca.verticesNeedUpdate||ca.colorsNeedUpdate||
-hb){var Rb=ca,cd=k.DYNAMIC_DRAW,Bc=void 0,Cc=void 0,Lc=void 0,Ba=void 0,Mc=void 0,nd=Rb.vertices,od=Rb.colors,Bd=nd.length,Cd=od.length,Nc=Rb.__vertexArray,Oc=Rb.__colorArray,Dd=Rb.colorsNeedUpdate,dd=Rb.__webglCustomAttributesList,Pc=void 0,pd=void 0,Ra=void 0,qc=void 0,bb=void 0,xa=void 0;if(Rb.verticesNeedUpdate){for(Bc=0;Bc<Bd;Bc++){Lc=nd[Bc];Ba=Bc*3;Nc[Ba]=Lc.x;Nc[Ba+1]=Lc.y;Nc[Ba+2]=Lc.z}k.bindBuffer(k.ARRAY_BUFFER,Rb.__webglVertexBuffer);k.bufferData(k.ARRAY_BUFFER,Nc,cd)}if(Dd){for(Cc=0;Cc<
-Cd;Cc++){Mc=od[Cc];Ba=Cc*3;Oc[Ba]=Mc.r;Oc[Ba+1]=Mc.g;Oc[Ba+2]=Mc.b}k.bindBuffer(k.ARRAY_BUFFER,Rb.__webglColorBuffer);k.bufferData(k.ARRAY_BUFFER,Oc,cd)}if(dd){Pc=0;for(pd=dd.length;Pc<pd;Pc++){xa=dd[Pc];if(xa.needsUpdate&&(xa.boundTo===void 0||xa.boundTo==="vertices")){Ba=0;qc=xa.value.length;if(xa.size===1)for(Ra=0;Ra<qc;Ra++)xa.array[Ra]=xa.value[Ra];else if(xa.size===2)for(Ra=0;Ra<qc;Ra++){bb=xa.value[Ra];xa.array[Ba]=bb.x;xa.array[Ba+1]=bb.y;Ba=Ba+2}else if(xa.size===3)if(xa.type==="c")for(Ra=
-0;Ra<qc;Ra++){bb=xa.value[Ra];xa.array[Ba]=bb.r;xa.array[Ba+1]=bb.g;xa.array[Ba+2]=bb.b;Ba=Ba+3}else for(Ra=0;Ra<qc;Ra++){bb=xa.value[Ra];xa.array[Ba]=bb.x;xa.array[Ba+1]=bb.y;xa.array[Ba+2]=bb.z;Ba=Ba+3}else if(xa.size===4)for(Ra=0;Ra<qc;Ra++){bb=xa.value[Ra];xa.array[Ba]=bb.x;xa.array[Ba+1]=bb.y;xa.array[Ba+2]=bb.z;xa.array[Ba+3]=bb.w;Ba=Ba+4}k.bindBuffer(k.ARRAY_BUFFER,xa.buffer);k.bufferData(k.ARRAY_BUFFER,xa.array,cd)}}}}ca.verticesNeedUpdate=false;ca.colorsNeedUpdate=false;$a.attributes&&q($a)}else if(ub instanceof
+hb){var Rb=ca,cd=k.DYNAMIC_DRAW,Bc=void 0,Cc=void 0,Lc=void 0,Ba=void 0,Mc=void 0,nd=Rb.vertices,od=Rb.colors,Bd=nd.length,Cd=od.length,Nc=Rb.__vertexArray,Oc=Rb.__colorArray,Dd=Rb.colorsNeedUpdate,dd=Rb.__webglCustomAttributesList,Pc=void 0,pd=void 0,Ra=void 0,pc=void 0,bb=void 0,xa=void 0;if(Rb.verticesNeedUpdate){for(Bc=0;Bc<Bd;Bc++){Lc=nd[Bc];Ba=Bc*3;Nc[Ba]=Lc.x;Nc[Ba+1]=Lc.y;Nc[Ba+2]=Lc.z}k.bindBuffer(k.ARRAY_BUFFER,Rb.__webglVertexBuffer);k.bufferData(k.ARRAY_BUFFER,Nc,cd)}if(Dd){for(Cc=0;Cc<
+Cd;Cc++){Mc=od[Cc];Ba=Cc*3;Oc[Ba]=Mc.r;Oc[Ba+1]=Mc.g;Oc[Ba+2]=Mc.b}k.bindBuffer(k.ARRAY_BUFFER,Rb.__webglColorBuffer);k.bufferData(k.ARRAY_BUFFER,Oc,cd)}if(dd){Pc=0;for(pd=dd.length;Pc<pd;Pc++){xa=dd[Pc];if(xa.needsUpdate&&(xa.boundTo===void 0||xa.boundTo==="vertices")){Ba=0;pc=xa.value.length;if(xa.size===1)for(Ra=0;Ra<pc;Ra++)xa.array[Ra]=xa.value[Ra];else if(xa.size===2)for(Ra=0;Ra<pc;Ra++){bb=xa.value[Ra];xa.array[Ba]=bb.x;xa.array[Ba+1]=bb.y;Ba=Ba+2}else if(xa.size===3)if(xa.type==="c")for(Ra=
+0;Ra<pc;Ra++){bb=xa.value[Ra];xa.array[Ba]=bb.r;xa.array[Ba+1]=bb.g;xa.array[Ba+2]=bb.b;Ba=Ba+3}else for(Ra=0;Ra<pc;Ra++){bb=xa.value[Ra];xa.array[Ba]=bb.x;xa.array[Ba+1]=bb.y;xa.array[Ba+2]=bb.z;Ba=Ba+3}else if(xa.size===4)for(Ra=0;Ra<pc;Ra++){bb=xa.value[Ra];xa.array[Ba]=bb.x;xa.array[Ba+1]=bb.y;xa.array[Ba+2]=bb.z;xa.array[Ba+3]=bb.w;Ba=Ba+4}k.bindBuffer(k.ARRAY_BUFFER,xa.buffer);k.bufferData(k.ARRAY_BUFFER,xa.array,cd)}}}}ca.verticesNeedUpdate=false;ca.colorsNeedUpdate=false;$a.attributes&&q($a)}else if(ub instanceof
 THREE.ParticleSystem){$a=c(ub,fb);hb=$a.attributes&&n($a);(ca.verticesNeedUpdate||ca.colorsNeedUpdate||ub.sortParticles||hb)&&e(ca,k.DYNAMIC_DRAW,ub);ca.verticesNeedUpdate=false;ca.colorsNeedUpdate=false;$a.attributes&&q($a)}}};this.initMaterial=function(a,b,c,d){var e,f,g,h,i,j,l,m;a instanceof THREE.MeshDepthMaterial?m="depth":a instanceof THREE.MeshNormalMaterial?m="normal":a instanceof THREE.MeshBasicMaterial?m="basic":a instanceof THREE.MeshLambertMaterial?m="lambert":a instanceof THREE.MeshPhongMaterial?
-m="phong":a instanceof THREE.LineBasicMaterial?m="basic":a instanceof THREE.ParticleBasicMaterial&&(m="particle_basic");if(m){var n=THREE.ShaderLib[m];a.uniforms=THREE.UniformsUtils.clone(n.uniforms);a.vertexShader=n.vertexShader;a.fragmentShader=n.fragmentShader}var o,p;o=g=e=n=0;for(f=b.length;o<f;o++){p=b[o];if(!p.onlyShadow){p instanceof THREE.DirectionalLight&&g++;p instanceof THREE.PointLight&&e++;p instanceof THREE.SpotLight&&n++}}if(e+n+g<=K){o=g;f=e}else{o=Math.ceil(K*g/(e+g));n=f=K-o}e=
+m="phong":a instanceof THREE.LineBasicMaterial?m="basic":a instanceof THREE.ParticleBasicMaterial&&(m="particle_basic");if(m){var n=THREE.ShaderLib[m];a.uniforms=THREE.UniformsUtils.clone(n.uniforms);a.vertexShader=n.vertexShader;a.fragmentShader=n.fragmentShader}var o,p;o=g=e=n=0;for(f=b.length;o<f;o++){p=b[o];if(!p.onlyShadow){p instanceof THREE.DirectionalLight&&g++;p instanceof THREE.PointLight&&e++;p instanceof THREE.SpotLight&&n++}}if(e+n+g<=L){o=g;f=e}else{o=Math.ceil(L*g/(e+g));n=f=L-o}e=
 o;g=n;n=l=0;for(o=b.length;n<o;n++){p=b[n];if(p.castShadow){p instanceof THREE.SpotLight&&l++;p instanceof THREE.DirectionalLight&&!p.shadowCascade&&l++}}if(cc&&d&&d.useVertexTexture)j=1024;else{b=k.getParameter(k.MAX_VERTEX_UNIFORM_VECTORS);b=Math.floor((b-20)/4);if(d!==void 0&&d instanceof THREE.SkinnedMesh){b=Math.min(d.bones.length,b);b<d.bones.length&&console.warn("WebGLRenderer: too many bones - "+d.bones.length+", this GPU supports just "+b+" (try OpenGL instead of ANGLE)")}j=b}var q;a:{p=
 a.fragmentShader;o=a.vertexShader;var n=a.uniforms,b=a.attributes,c={map:!!a.map,envMap:!!a.envMap,lightMap:!!a.lightMap,bumpMap:!!a.bumpMap,specularMap:!!a.specularMap,vertexColors:a.vertexColors,fog:c,useFog:a.fog,sizeAttenuation:a.sizeAttenuation,skinning:a.skinning,maxBones:j,useVertexTexture:cc&&d&&d.useVertexTexture,boneTextureWidth:d&&d.boneTextureWidth,boneTextureHeight:d&&d.boneTextureHeight,morphTargets:a.morphTargets,morphNormals:a.morphNormals,maxMorphTargets:this.maxMorphTargets,maxMorphNormals:this.maxMorphNormals,
-maxDirLights:e,maxPointLights:f,maxSpotLights:g,maxShadows:l,shadowMapEnabled:this.shadowMapEnabled&&d.receiveShadow,shadowMapSoft:this.shadowMapSoft,shadowMapDebug:this.shadowMapDebug,shadowMapCascade:this.shadowMapCascade,alphaTest:a.alphaTest,metal:a.metal,perPixel:a.perPixel,wrapAround:a.wrapAround,doubleSided:a.side===THREE.DoubleSide},r,d=[];if(m)d.push(m);else{d.push(p);d.push(o)}for(r in c){d.push(r);d.push(c[r])}m=d.join();r=0;for(d=X.length;r<d;r++){e=X[r];if(e.code===m){e.usedTimes++;q=
-e.program;break a}}r=k.createProgram();d=["precision "+E+" float;",rc?"#define VERTEX_TEXTURES":"",H.gammaInput?"#define GAMMA_INPUT":"",H.gammaOutput?"#define GAMMA_OUTPUT":"",H.physicallyBasedShading?"#define PHYSICALLY_BASED_SHADING":"","#define MAX_DIR_LIGHTS "+c.maxDirLights,"#define MAX_POINT_LIGHTS "+c.maxPointLights,"#define MAX_SPOT_LIGHTS "+c.maxSpotLights,"#define MAX_SHADOWS "+c.maxShadows,"#define MAX_BONES "+c.maxBones,c.map?"#define USE_MAP":"",c.envMap?"#define USE_ENVMAP":"",c.lightMap?
+maxDirLights:e,maxPointLights:f,maxSpotLights:g,maxShadows:l,shadowMapEnabled:this.shadowMapEnabled&&d.receiveShadow,shadowMapSoft:this.shadowMapSoft,shadowMapDebug:this.shadowMapDebug,shadowMapCascade:this.shadowMapCascade,alphaTest:a.alphaTest,metal:a.metal,perPixel:a.perPixel,wrapAround:a.wrapAround,doubleSided:a.side===THREE.DoubleSide},s,d=[];if(m)d.push(m);else{d.push(p);d.push(o)}for(s in c){d.push(s);d.push(c[s])}m=d.join();s=0;for(d=X.length;s<d;s++){e=X[s];if(e.code===m){e.usedTimes++;q=
+e.program;break a}}s=k.createProgram();d=["precision "+I+" float;",qc?"#define VERTEX_TEXTURES":"",H.gammaInput?"#define GAMMA_INPUT":"",H.gammaOutput?"#define GAMMA_OUTPUT":"",H.physicallyBasedShading?"#define PHYSICALLY_BASED_SHADING":"","#define MAX_DIR_LIGHTS "+c.maxDirLights,"#define MAX_POINT_LIGHTS "+c.maxPointLights,"#define MAX_SPOT_LIGHTS "+c.maxSpotLights,"#define MAX_SHADOWS "+c.maxShadows,"#define MAX_BONES "+c.maxBones,c.map?"#define USE_MAP":"",c.envMap?"#define USE_ENVMAP":"",c.lightMap?
 "#define USE_LIGHTMAP":"",c.bumpMap?"#define USE_BUMPMAP":"",c.specularMap?"#define USE_SPECULARMAP":"",c.vertexColors?"#define USE_COLOR":"",c.skinning?"#define USE_SKINNING":"",c.useVertexTexture?"#define BONE_TEXTURE":"",c.boneTextureWidth?"#define N_BONE_PIXEL_X "+c.boneTextureWidth.toFixed(1):"",c.boneTextureHeight?"#define N_BONE_PIXEL_Y "+c.boneTextureHeight.toFixed(1):"",c.morphTargets?"#define USE_MORPHTARGETS":"",c.morphNormals?"#define USE_MORPHNORMALS":"",c.perPixel?"#define PHONG_PER_PIXEL":
 "",c.wrapAround?"#define WRAP_AROUND":"",c.doubleSided?"#define DOUBLE_SIDED":"",c.shadowMapEnabled?"#define USE_SHADOWMAP":"",c.shadowMapSoft?"#define SHADOWMAP_SOFT":"",c.shadowMapDebug?"#define SHADOWMAP_DEBUG":"",c.shadowMapCascade?"#define SHADOWMAP_CASCADE":"",c.sizeAttenuation?"#define USE_SIZEATTENUATION":"","uniform mat4 modelMatrix;\nuniform mat4 modelViewMatrix;\nuniform mat4 projectionMatrix;\nuniform mat4 viewMatrix;\nuniform mat3 normalMatrix;\nuniform vec3 cameraPosition;\nattribute vec3 position;\nattribute vec3 normal;\nattribute vec2 uv;\nattribute vec2 uv2;\n#ifdef USE_COLOR\nattribute vec3 color;\n#endif\n#ifdef USE_MORPHTARGETS\nattribute vec3 morphTarget0;\nattribute vec3 morphTarget1;\nattribute vec3 morphTarget2;\nattribute vec3 morphTarget3;\n#ifdef USE_MORPHNORMALS\nattribute vec3 morphNormal0;\nattribute vec3 morphNormal1;\nattribute vec3 morphNormal2;\nattribute vec3 morphNormal3;\n#else\nattribute vec3 morphTarget4;\nattribute vec3 morphTarget5;\nattribute vec3 morphTarget6;\nattribute vec3 morphTarget7;\n#endif\n#endif\n#ifdef USE_SKINNING\nattribute vec4 skinIndex;\nattribute vec4 skinWeight;\n#endif\n"].join("\n");
-e=["precision "+E+" float;",c.bumpMap?"#extension GL_OES_standard_derivatives : enable":"","#define MAX_DIR_LIGHTS "+c.maxDirLights,"#define MAX_POINT_LIGHTS "+c.maxPointLights,"#define MAX_SPOT_LIGHTS "+c.maxSpotLights,"#define MAX_SHADOWS "+c.maxShadows,c.alphaTest?"#define ALPHATEST "+c.alphaTest:"",H.gammaInput?"#define GAMMA_INPUT":"",H.gammaOutput?"#define GAMMA_OUTPUT":"",H.physicallyBasedShading?"#define PHYSICALLY_BASED_SHADING":"",c.useFog&&c.fog?"#define USE_FOG":"",c.useFog&&c.fog instanceof
+e=["precision "+I+" float;",c.bumpMap?"#extension GL_OES_standard_derivatives : enable":"","#define MAX_DIR_LIGHTS "+c.maxDirLights,"#define MAX_POINT_LIGHTS "+c.maxPointLights,"#define MAX_SPOT_LIGHTS "+c.maxSpotLights,"#define MAX_SHADOWS "+c.maxShadows,c.alphaTest?"#define ALPHATEST "+c.alphaTest:"",H.gammaInput?"#define GAMMA_INPUT":"",H.gammaOutput?"#define GAMMA_OUTPUT":"",H.physicallyBasedShading?"#define PHYSICALLY_BASED_SHADING":"",c.useFog&&c.fog?"#define USE_FOG":"",c.useFog&&c.fog instanceof
 THREE.FogExp2?"#define FOG_EXP2":"",c.map?"#define USE_MAP":"",c.envMap?"#define USE_ENVMAP":"",c.lightMap?"#define USE_LIGHTMAP":"",c.bumpMap?"#define USE_BUMPMAP":"",c.specularMap?"#define USE_SPECULARMAP":"",c.vertexColors?"#define USE_COLOR":"",c.metal?"#define METAL":"",c.perPixel?"#define PHONG_PER_PIXEL":"",c.wrapAround?"#define WRAP_AROUND":"",c.doubleSided?"#define DOUBLE_SIDED":"",c.shadowMapEnabled?"#define USE_SHADOWMAP":"",c.shadowMapSoft?"#define SHADOWMAP_SOFT":"",c.shadowMapDebug?
-"#define SHADOWMAP_DEBUG":"",c.shadowMapCascade?"#define SHADOWMAP_CASCADE":"","uniform mat4 viewMatrix;\nuniform vec3 cameraPosition;\n"].join("\n");e=u("fragment",e+p);d=u("vertex",d+o);k.attachShader(r,d);k.attachShader(r,e);k.linkProgram(r);k.getProgramParameter(r,k.LINK_STATUS)||console.error("Could not initialise shader\nVALIDATE_STATUS: "+k.getProgramParameter(r,k.VALIDATE_STATUS)+", gl error ["+k.getError()+"]");k.deleteShader(e);k.deleteShader(d);r.uniforms={};r.attributes={};var s,d=["viewMatrix",
-"modelViewMatrix","projectionMatrix","normalMatrix","modelMatrix","cameraPosition","morphTargetInfluences"];c.useVertexTexture?d.push("boneTexture"):d.push("boneGlobalMatrices");for(s in n)d.push(s);s=d;d=0;for(n=s.length;d<n;d++){e=s[d];r.uniforms[e]=k.getUniformLocation(r,e)}d=["position","normal","uv","uv2","tangent","color","skinIndex","skinWeight"];for(s=0;s<c.maxMorphTargets;s++)d.push("morphTarget"+s);for(s=0;s<c.maxMorphNormals;s++)d.push("morphNormal"+s);for(q in b)d.push(q);q=d;s=0;for(c=
-q.length;s<c;s++){d=q[s];r.attributes[d]=k.getAttribLocation(r,d)}r.id=P++;X.push({program:r,code:m,usedTimes:1});H.info.memory.programs=X.length;q=r}a.program=q;q=a.program.attributes;q.position>=0&&k.enableVertexAttribArray(q.position);q.color>=0&&k.enableVertexAttribArray(q.color);q.normal>=0&&k.enableVertexAttribArray(q.normal);q.tangent>=0&&k.enableVertexAttribArray(q.tangent);if(a.skinning&&q.skinIndex>=0&&q.skinWeight>=0){k.enableVertexAttribArray(q.skinIndex);k.enableVertexAttribArray(q.skinWeight)}if(a.attributes)for(i in a.attributes)q[i]!==
-void 0&&q[i]>=0&&k.enableVertexAttribArray(q[i]);if(a.morphTargets){a.numSupportedMorphTargets=0;r="morphTarget";for(i=0;i<this.maxMorphTargets;i++){s=r+i;if(q[s]>=0){k.enableVertexAttribArray(q[s]);a.numSupportedMorphTargets++}}}if(a.morphNormals){a.numSupportedMorphNormals=0;r="morphNormal";for(i=0;i<this.maxMorphNormals;i++){s=r+i;if(q[s]>=0){k.enableVertexAttribArray(q[s]);a.numSupportedMorphNormals++}}}a.uniformsList=[];for(h in a.uniforms)a.uniformsList.push([a.uniforms[h],h])};this.setFaceCulling=
-function(a,b){if(a){!b||b==="ccw"?k.frontFace(k.CCW):k.frontFace(k.CW);a==="back"?k.cullFace(k.BACK):a==="front"?k.cullFace(k.FRONT):k.cullFace(k.FRONT_AND_BACK);k.enable(k.CULL_FACE)}else k.disable(k.CULL_FACE)};this.setMaterialFaces=function(a){var b=a.side===THREE.DoubleSide,a=a.side===THREE.BackSide;if(aa!==b){b?k.disable(k.CULL_FACE):k.enable(k.CULL_FACE);aa=b}if(M!==a){a?k.frontFace(k.CW):k.frontFace(k.CCW);M=a}};this.setDepthTest=function(a){if(ta!==a){a?k.enable(k.DEPTH_TEST):k.disable(k.DEPTH_TEST);
+"#define SHADOWMAP_DEBUG":"",c.shadowMapCascade?"#define SHADOWMAP_CASCADE":"","uniform mat4 viewMatrix;\nuniform vec3 cameraPosition;\n"].join("\n");e=t("fragment",e+p);d=t("vertex",d+o);k.attachShader(s,d);k.attachShader(s,e);k.linkProgram(s);k.getProgramParameter(s,k.LINK_STATUS)||console.error("Could not initialise shader\nVALIDATE_STATUS: "+k.getProgramParameter(s,k.VALIDATE_STATUS)+", gl error ["+k.getError()+"]");k.deleteShader(e);k.deleteShader(d);s.uniforms={};s.attributes={};var r,d=["viewMatrix",
+"modelViewMatrix","projectionMatrix","normalMatrix","modelMatrix","cameraPosition","morphTargetInfluences"];c.useVertexTexture?d.push("boneTexture"):d.push("boneGlobalMatrices");for(r in n)d.push(r);r=d;d=0;for(n=r.length;d<n;d++){e=r[d];s.uniforms[e]=k.getUniformLocation(s,e)}d=["position","normal","uv","uv2","tangent","color","skinIndex","skinWeight"];for(r=0;r<c.maxMorphTargets;r++)d.push("morphTarget"+r);for(r=0;r<c.maxMorphNormals;r++)d.push("morphNormal"+r);for(q in b)d.push(q);q=d;r=0;for(c=
+q.length;r<c;r++){d=q[r];s.attributes[d]=k.getAttribLocation(s,d)}s.id=P++;X.push({program:s,code:m,usedTimes:1});H.info.memory.programs=X.length;q=s}a.program=q;q=a.program.attributes;q.position>=0&&k.enableVertexAttribArray(q.position);q.color>=0&&k.enableVertexAttribArray(q.color);q.normal>=0&&k.enableVertexAttribArray(q.normal);q.tangent>=0&&k.enableVertexAttribArray(q.tangent);if(a.skinning&&q.skinIndex>=0&&q.skinWeight>=0){k.enableVertexAttribArray(q.skinIndex);k.enableVertexAttribArray(q.skinWeight)}if(a.attributes)for(i in a.attributes)q[i]!==
+void 0&&q[i]>=0&&k.enableVertexAttribArray(q[i]);if(a.morphTargets){a.numSupportedMorphTargets=0;s="morphTarget";for(i=0;i<this.maxMorphTargets;i++){r=s+i;if(q[r]>=0){k.enableVertexAttribArray(q[r]);a.numSupportedMorphTargets++}}}if(a.morphNormals){a.numSupportedMorphNormals=0;s="morphNormal";for(i=0;i<this.maxMorphNormals;i++){r=s+i;if(q[r]>=0){k.enableVertexAttribArray(q[r]);a.numSupportedMorphNormals++}}}a.uniformsList=[];for(h in a.uniforms)a.uniformsList.push([a.uniforms[h],h])};this.setFaceCulling=
+function(a,b){if(a){!b||b==="ccw"?k.frontFace(k.CCW):k.frontFace(k.CW);a==="back"?k.cullFace(k.BACK):a==="front"?k.cullFace(k.FRONT):k.cullFace(k.FRONT_AND_BACK);k.enable(k.CULL_FACE)}else k.disable(k.CULL_FACE)};this.setMaterialFaces=function(a){var b=a.side===THREE.DoubleSide,a=a.side===THREE.BackSide;if(aa!==b){b?k.disable(k.CULL_FACE):k.enable(k.CULL_FACE);aa=b}if(N!==a){a?k.frontFace(k.CW):k.frontFace(k.CCW);N=a}};this.setDepthTest=function(a){if(ta!==a){a?k.enable(k.DEPTH_TEST):k.disable(k.DEPTH_TEST);
 ta=a}};this.setDepthWrite=function(a){if(Da!==a){k.depthMask(a);Da=a}};this.setBlending=function(a,b,c,d){if(a!==Y){if(a===THREE.NoBlending)k.disable(k.BLEND);else if(a===THREE.AdditiveBlending){k.enable(k.BLEND);k.blendEquation(k.FUNC_ADD);k.blendFunc(k.SRC_ALPHA,k.ONE)}else if(a===THREE.SubtractiveBlending){k.enable(k.BLEND);k.blendEquation(k.FUNC_ADD);k.blendFunc(k.ZERO,k.ONE_MINUS_SRC_COLOR)}else if(a===THREE.MultiplyBlending){k.enable(k.BLEND);k.blendEquation(k.FUNC_ADD);k.blendFunc(k.ZERO,k.SRC_COLOR)}else if(a===
-THREE.CustomBlending)k.enable(k.BLEND);else{k.enable(k.BLEND);k.blendEquationSeparate(k.FUNC_ADD,k.FUNC_ADD);k.blendFuncSeparate(k.SRC_ALPHA,k.ONE_MINUS_SRC_ALPHA,k.ONE,k.ONE_MINUS_SRC_ALPHA)}Y=a}if(a===THREE.CustomBlending){if(b!==ga){k.blendEquation(F(b));ga=b}if(c!==ra||d!==oa){k.blendFunc(F(c),F(d));ra=c;oa=d}}else oa=ra=ga=null};this.setTexture=function(a,b){if(a.needsUpdate){if(!a.__webglInit){a.__webglInit=true;a.__webglTexture=k.createTexture();H.info.memory.textures++}k.activeTexture(k.TEXTURE0+
-b);k.bindTexture(k.TEXTURE_2D,a.__webglTexture);k.pixelStorei(k.UNPACK_FLIP_Y_WEBGL,a.flipY);k.pixelStorei(k.UNPACK_PREMULTIPLY_ALPHA_WEBGL,a.premultiplyAlpha);var c=a.image,d=(c.width&c.width-1)===0&&(c.height&c.height-1)===0,e=F(a.format),f=F(a.type);A(k.TEXTURE_2D,a,d);a instanceof THREE.DataTexture?k.texImage2D(k.TEXTURE_2D,0,e,c.width,c.height,0,e,f,c.data):k.texImage2D(k.TEXTURE_2D,0,e,e,f,a.image);a.generateMipmaps&&d&&k.generateMipmap(k.TEXTURE_2D);a.needsUpdate=false;if(a.onUpdate)a.onUpdate()}else{k.activeTexture(k.TEXTURE0+
-b);k.bindTexture(k.TEXTURE_2D,a.__webglTexture)}};this.setRenderTarget=function(a){var b=a instanceof THREE.WebGLRenderTargetCube;if(a&&!a.__webglFramebuffer){if(a.depthBuffer===void 0)a.depthBuffer=true;if(a.stencilBuffer===void 0)a.stencilBuffer=true;a.__webglTexture=k.createTexture();var c=(a.width&a.width-1)===0&&(a.height&a.height-1)===0,d=F(a.format),e=F(a.type);if(b){a.__webglFramebuffer=[];a.__webglRenderbuffer=[];k.bindTexture(k.TEXTURE_CUBE_MAP,a.__webglTexture);A(k.TEXTURE_CUBE_MAP,a,c);
+THREE.CustomBlending)k.enable(k.BLEND);else{k.enable(k.BLEND);k.blendEquationSeparate(k.FUNC_ADD,k.FUNC_ADD);k.blendFuncSeparate(k.SRC_ALPHA,k.ONE_MINUS_SRC_ALPHA,k.ONE,k.ONE_MINUS_SRC_ALPHA)}Y=a}if(a===THREE.CustomBlending){if(b!==ga){k.blendEquation(E(b));ga=b}if(c!==ra||d!==oa){k.blendFunc(E(c),E(d));ra=c;oa=d}}else oa=ra=ga=null};this.setTexture=function(a,b){if(a.needsUpdate){if(!a.__webglInit){a.__webglInit=true;a.__webglTexture=k.createTexture();H.info.memory.textures++}k.activeTexture(k.TEXTURE0+
+b);k.bindTexture(k.TEXTURE_2D,a.__webglTexture);k.pixelStorei(k.UNPACK_FLIP_Y_WEBGL,a.flipY);k.pixelStorei(k.UNPACK_PREMULTIPLY_ALPHA_WEBGL,a.premultiplyAlpha);var c=a.image,d=(c.width&c.width-1)===0&&(c.height&c.height-1)===0,e=E(a.format),f=E(a.type);A(k.TEXTURE_2D,a,d);a instanceof THREE.DataTexture?k.texImage2D(k.TEXTURE_2D,0,e,c.width,c.height,0,e,f,c.data):k.texImage2D(k.TEXTURE_2D,0,e,e,f,a.image);a.generateMipmaps&&d&&k.generateMipmap(k.TEXTURE_2D);a.needsUpdate=false;if(a.onUpdate)a.onUpdate()}else{k.activeTexture(k.TEXTURE0+
+b);k.bindTexture(k.TEXTURE_2D,a.__webglTexture)}};this.setRenderTarget=function(a){var b=a instanceof THREE.WebGLRenderTargetCube;if(a&&!a.__webglFramebuffer){if(a.depthBuffer===void 0)a.depthBuffer=true;if(a.stencilBuffer===void 0)a.stencilBuffer=true;a.__webglTexture=k.createTexture();var c=(a.width&a.width-1)===0&&(a.height&a.height-1)===0,d=E(a.format),e=E(a.type);if(b){a.__webglFramebuffer=[];a.__webglRenderbuffer=[];k.bindTexture(k.TEXTURE_CUBE_MAP,a.__webglTexture);A(k.TEXTURE_CUBE_MAP,a,c);
 for(var f=0;f<6;f++){a.__webglFramebuffer[f]=k.createFramebuffer();a.__webglRenderbuffer[f]=k.createRenderbuffer();k.texImage2D(k.TEXTURE_CUBE_MAP_POSITIVE_X+f,0,d,a.width,a.height,0,d,e,null);var g=a,h=k.TEXTURE_CUBE_MAP_POSITIVE_X+f;k.bindFramebuffer(k.FRAMEBUFFER,a.__webglFramebuffer[f]);k.framebufferTexture2D(k.FRAMEBUFFER,k.COLOR_ATTACHMENT0,h,g.__webglTexture,0);y(a.__webglRenderbuffer[f],a)}c&&k.generateMipmap(k.TEXTURE_CUBE_MAP)}else{a.__webglFramebuffer=k.createFramebuffer();a.__webglRenderbuffer=
 k.createRenderbuffer();k.bindTexture(k.TEXTURE_2D,a.__webglTexture);A(k.TEXTURE_2D,a,c);k.texImage2D(k.TEXTURE_2D,0,d,a.width,a.height,0,d,e,null);d=k.TEXTURE_2D;k.bindFramebuffer(k.FRAMEBUFFER,a.__webglFramebuffer);k.framebufferTexture2D(k.FRAMEBUFFER,k.COLOR_ATTACHMENT0,d,a.__webglTexture,0);y(a.__webglRenderbuffer,a);c&&k.generateMipmap(k.TEXTURE_2D)}b?k.bindTexture(k.TEXTURE_CUBE_MAP,null):k.bindTexture(k.TEXTURE_2D,null);k.bindRenderbuffer(k.RENDERBUFFER,null);k.bindFramebuffer(k.FRAMEBUFFER,
 null)}if(a){b=b?a.__webglFramebuffer[a.activeCubeFace]:a.__webglFramebuffer;c=a.width;a=a.height;e=d=0}else{b=null;c=eb;a=kb;d=Qa;e=Za}if(b!==ea){k.bindFramebuffer(k.FRAMEBUFFER,b);k.viewport(d,e,c,a);ea=b}jb=c;Ma=a};this.shadowMapPlugin=new THREE.ShadowMapPlugin;this.addPrePlugin(this.shadowMapPlugin);this.addPostPlugin(new THREE.SpritePlugin);this.addPostPlugin(new THREE.LensFlarePlugin)};
@@ -472,7 +473,7 @@ THREE.RenderableObject=function(){this.z=this.object=null};THREE.RenderableParti
 THREE.ColorUtils={adjustHSV:function(a,b,c,d){var f=THREE.ColorUtils.__hsv;THREE.ColorUtils.rgbToHsv(a,f);f.h=THREE.Math.clamp(f.h+b,0,1);f.s=THREE.Math.clamp(f.s+c,0,1);f.v=THREE.Math.clamp(f.v+d,0,1);a.setHSV(f.h,f.s,f.v)},rgbToHsv:function(a,b){var c=a.r,d=a.g,f=a.b,e=Math.max(Math.max(c,d),f),g=Math.min(Math.min(c,d),f);if(g===e)g=c=0;else{var h=e-g,g=h/e,c=(c===e?(d-f)/h:d===e?2+(f-c)/h:4+(c-d)/h)/6;c<0&&(c=c+1);c>1&&(c=c-1)}b===void 0&&(b={h:0,s:0,v:0});b.h=c;b.s=g;b.v=e;return b}};
 THREE.ColorUtils.__hsv={h:0,s:0,v:0};
 THREE.GeometryUtils={merge:function(a,b){for(var c,d,f=a.vertices.length,e=b instanceof THREE.Mesh?b.geometry:b,g=a.vertices,h=e.vertices,i=a.faces,j=e.faces,l=a.faceVertexUvs[0],m=e.faceVertexUvs[0],n={},q=0;q<a.materials.length;q++)n[a.materials[q].id]=q;if(b instanceof THREE.Mesh){b.matrixAutoUpdate&&b.updateMatrix();c=b.matrix;d=new THREE.Matrix4;d.extractRotation(c,b.scale)}for(var q=0,o=h.length;q<o;q++){var p=h[q].clone();c&&c.multiplyVector3(p);g.push(p)}q=0;for(o=j.length;q<o;q++){var g=
-j[q],s,r,t=g.vertexNormals,v=g.vertexColors;g instanceof THREE.Face3?s=new THREE.Face3(g.a+f,g.b+f,g.c+f):g instanceof THREE.Face4&&(s=new THREE.Face4(g.a+f,g.b+f,g.c+f,g.d+f));s.normal.copy(g.normal);d&&d.multiplyVector3(s.normal);h=0;for(p=t.length;h<p;h++){r=t[h].clone();d&&d.multiplyVector3(r);s.vertexNormals.push(r)}s.color.copy(g.color);h=0;for(p=v.length;h<p;h++){r=v[h];s.vertexColors.push(r.clone())}if(g.materialIndex!==void 0){h=e.materials[g.materialIndex];p=h.id;v=n[p];if(v===void 0){v=
+j[q],s,r,u=g.vertexNormals,v=g.vertexColors;g instanceof THREE.Face3?s=new THREE.Face3(g.a+f,g.b+f,g.c+f):g instanceof THREE.Face4&&(s=new THREE.Face4(g.a+f,g.b+f,g.c+f,g.d+f));s.normal.copy(g.normal);d&&d.multiplyVector3(s.normal);h=0;for(p=u.length;h<p;h++){r=u[h].clone();d&&d.multiplyVector3(r);s.vertexNormals.push(r)}s.color.copy(g.color);h=0;for(p=v.length;h<p;h++){r=v[h];s.vertexColors.push(r.clone())}if(g.materialIndex!==void 0){h=e.materials[g.materialIndex];p=h.id;v=n[p];if(v===void 0){v=
 a.materials.length;n[p]=v;a.materials.push(h)}s.materialIndex=v}s.centroid.copy(g.centroid);c&&c.multiplyVector3(s.centroid);i.push(s)}q=0;for(o=m.length;q<o;q++){c=m[q];d=[];h=0;for(p=c.length;h<p;h++)d.push(new THREE.UV(c[h].u,c[h].v));l.push(d)}},clone:function(a){var b=new THREE.Geometry,c,d=a.vertices,f=a.faces,e=a.faceVertexUvs[0];if(a.materials)b.materials=a.materials.slice();a=0;for(c=d.length;a<c;a++)b.vertices.push(d[a].clone());a=0;for(c=f.length;a<c;a++)b.faces.push(f[a].clone());a=0;
 for(c=e.length;a<c;a++){for(var d=e[a],f=[],g=0,h=d.length;g<h;g++)f.push(new THREE.UV(d[g].u,d[g].v));b.faceVertexUvs[0].push(f)}return b},randomPointInTriangle:function(a,b,c){var d,f,e,g=new THREE.Vector3,h=THREE.GeometryUtils.__v1;d=THREE.GeometryUtils.random();f=THREE.GeometryUtils.random();if(d+f>1){d=1-d;f=1-f}e=1-d-f;g.copy(a);g.multiplyScalar(d);h.copy(b);h.multiplyScalar(f);g.addSelf(h);h.copy(c);h.multiplyScalar(e);g.addSelf(h);return g},randomPointInFace:function(a,b,c){var d,f,e;if(a instanceof
 THREE.Face3){d=b.vertices[a.a];f=b.vertices[a.b];e=b.vertices[a.c];return THREE.GeometryUtils.randomPointInTriangle(d,f,e)}if(a instanceof THREE.Face4){d=b.vertices[a.a];f=b.vertices[a.b];e=b.vertices[a.c];var b=b.vertices[a.d],g;if(c)if(a._area1&&a._area2){c=a._area1;g=a._area2}else{c=THREE.GeometryUtils.triangleArea(d,f,b);g=THREE.GeometryUtils.triangleArea(f,e,b);a._area1=c;a._area2=g}else{c=THREE.GeometryUtils.triangleArea(d,f,b);g=THREE.GeometryUtils.triangleArea(f,e,b)}return THREE.GeometryUtils.random()*
@@ -482,20 +483,20 @@ var b=a.boundingBox,c=new THREE.Vector3;c.add(b.min,b.max);c.multiplyScalar(-0.5
 c;b++)h[b]=[];b=0;for(c=a.faces.length;b<c;b++){d=a.faces[b];if(d instanceof THREE.Face4){f=d.a;var i=d.b,j=d.c,l=d.d,m=new THREE.Face3,n=new THREE.Face3;m.color.copy(d.color);n.color.copy(d.color);m.materialIndex=d.materialIndex;n.materialIndex=d.materialIndex;m.a=f;m.b=i;m.c=l;n.a=i;n.b=j;n.c=l;if(d.vertexColors.length===4){m.vertexColors[0]=d.vertexColors[0].clone();m.vertexColors[1]=d.vertexColors[1].clone();m.vertexColors[2]=d.vertexColors[3].clone();n.vertexColors[0]=d.vertexColors[1].clone();
 n.vertexColors[1]=d.vertexColors[2].clone();n.vertexColors[2]=d.vertexColors[3].clone()}e.push(m,n);d=0;for(f=a.faceVertexUvs.length;d<f;d++)if(a.faceVertexUvs[d].length){m=a.faceVertexUvs[d][b];i=m[1];j=m[2];l=m[3];m=[m[0].clone(),i.clone(),l.clone()];i=[i.clone(),j.clone(),l.clone()];h[d].push(m,i)}d=0;for(f=a.faceUvs.length;d<f;d++)if(a.faceUvs[d].length){i=a.faceUvs[d][b];g[d].push(i,i)}}else{e.push(d);d=0;for(f=a.faceUvs.length;d<f;d++)g[d].push(a.faceUvs[d]);d=0;for(f=a.faceVertexUvs.length;d<
 f;d++)h[d].push(a.faceVertexUvs[d])}}a.faces=e;a.faceUvs=g;a.faceVertexUvs=h;a.computeCentroids();a.computeFaceNormals();a.computeVertexNormals();a.hasTangents&&a.computeTangents()},explode:function(a){for(var b=[],c=0,d=a.faces.length;c<d;c++){var f=b.length,e=a.faces[c];if(e instanceof THREE.Face4){var g=e.a,h=e.b,i=e.c,g=a.vertices[g],h=a.vertices[h],i=a.vertices[i],j=a.vertices[e.d];b.push(g.clone());b.push(h.clone());b.push(i.clone());b.push(j.clone());e.a=f;e.b=f+1;e.c=f+2;e.d=f+3}else{g=e.a;
-h=e.b;i=e.c;g=a.vertices[g];h=a.vertices[h];i=a.vertices[i];b.push(g.clone());b.push(h.clone());b.push(i.clone());e.a=f;e.b=f+1;e.c=f+2}}a.vertices=b;delete a.__tmpVertices},tessellate:function(a,b){var c,d,f,e,g,h,i,j,l,m,n,q,o,p,s,r,t,v,u,A=[],y=[];c=0;for(d=a.faceVertexUvs.length;c<d;c++)y[c]=[];c=0;for(d=a.faces.length;c<d;c++){f=a.faces[c];if(f instanceof THREE.Face3){e=f.a;g=f.b;h=f.c;j=a.vertices[e];l=a.vertices[g];m=a.vertices[h];q=j.distanceTo(l);o=l.distanceTo(m);n=j.distanceTo(m);if(q>
-b||o>b||n>b){i=a.vertices.length;v=f.clone();u=f.clone();if(q>=o&&q>=n){j=j.clone();j.lerpSelf(l,0.5);v.a=e;v.b=i;v.c=h;u.a=i;u.b=g;u.c=h;if(f.vertexNormals.length===3){e=f.vertexNormals[0].clone();e.lerpSelf(f.vertexNormals[1],0.5);v.vertexNormals[1].copy(e);u.vertexNormals[0].copy(e)}if(f.vertexColors.length===3){e=f.vertexColors[0].clone();e.lerpSelf(f.vertexColors[1],0.5);v.vertexColors[1].copy(e);u.vertexColors[0].copy(e)}f=0}else if(o>=q&&o>=n){j=l.clone();j.lerpSelf(m,0.5);v.a=e;v.b=g;v.c=
-i;u.a=i;u.b=h;u.c=e;if(f.vertexNormals.length===3){e=f.vertexNormals[1].clone();e.lerpSelf(f.vertexNormals[2],0.5);v.vertexNormals[2].copy(e);u.vertexNormals[0].copy(e);u.vertexNormals[1].copy(f.vertexNormals[2]);u.vertexNormals[2].copy(f.vertexNormals[0])}if(f.vertexColors.length===3){e=f.vertexColors[1].clone();e.lerpSelf(f.vertexColors[2],0.5);v.vertexColors[2].copy(e);u.vertexColors[0].copy(e);u.vertexColors[1].copy(f.vertexColors[2]);u.vertexColors[2].copy(f.vertexColors[0])}f=1}else{j=j.clone();
-j.lerpSelf(m,0.5);v.a=e;v.b=g;v.c=i;u.a=i;u.b=g;u.c=h;if(f.vertexNormals.length===3){e=f.vertexNormals[0].clone();e.lerpSelf(f.vertexNormals[2],0.5);v.vertexNormals[2].copy(e);u.vertexNormals[0].copy(e)}if(f.vertexColors.length===3){e=f.vertexColors[0].clone();e.lerpSelf(f.vertexColors[2],0.5);v.vertexColors[2].copy(e);u.vertexColors[0].copy(e)}f=2}A.push(v,u);a.vertices.push(j);e=0;for(g=a.faceVertexUvs.length;e<g;e++)if(a.faceVertexUvs[e].length){j=a.faceVertexUvs[e][c];u=j[0];h=j[1];v=j[2];if(f===
-0){l=u.clone();l.lerpSelf(h,0.5);j=[u.clone(),l.clone(),v.clone()];h=[l.clone(),h.clone(),v.clone()]}else if(f===1){l=h.clone();l.lerpSelf(v,0.5);j=[u.clone(),h.clone(),l.clone()];h=[l.clone(),v.clone(),u.clone()]}else{l=u.clone();l.lerpSelf(v,0.5);j=[u.clone(),h.clone(),l.clone()];h=[l.clone(),h.clone(),v.clone()]}y[e].push(j,h)}}else{A.push(f);e=0;for(g=a.faceVertexUvs.length;e<g;e++)y[e].push(a.faceVertexUvs[e][c])}}else{e=f.a;g=f.b;h=f.c;i=f.d;j=a.vertices[e];l=a.vertices[g];m=a.vertices[h];n=
-a.vertices[i];q=j.distanceTo(l);o=l.distanceTo(m);p=m.distanceTo(n);s=j.distanceTo(n);if(q>b||o>b||p>b||s>b){r=a.vertices.length;t=a.vertices.length+1;v=f.clone();u=f.clone();if(q>=o&&q>=p&&q>=s||p>=o&&p>=q&&p>=s){q=j.clone();q.lerpSelf(l,0.5);l=m.clone();l.lerpSelf(n,0.5);v.a=e;v.b=r;v.c=t;v.d=i;u.a=r;u.b=g;u.c=h;u.d=t;if(f.vertexNormals.length===4){e=f.vertexNormals[0].clone();e.lerpSelf(f.vertexNormals[1],0.5);g=f.vertexNormals[2].clone();g.lerpSelf(f.vertexNormals[3],0.5);v.vertexNormals[1].copy(e);
-v.vertexNormals[2].copy(g);u.vertexNormals[0].copy(e);u.vertexNormals[3].copy(g)}if(f.vertexColors.length===4){e=f.vertexColors[0].clone();e.lerpSelf(f.vertexColors[1],0.5);g=f.vertexColors[2].clone();g.lerpSelf(f.vertexColors[3],0.5);v.vertexColors[1].copy(e);v.vertexColors[2].copy(g);u.vertexColors[0].copy(e);u.vertexColors[3].copy(g)}f=0}else{q=l.clone();q.lerpSelf(m,0.5);l=n.clone();l.lerpSelf(j,0.5);v.a=e;v.b=g;v.c=r;v.d=t;u.a=t;u.b=r;u.c=h;u.d=i;if(f.vertexNormals.length===4){e=f.vertexNormals[1].clone();
-e.lerpSelf(f.vertexNormals[2],0.5);g=f.vertexNormals[3].clone();g.lerpSelf(f.vertexNormals[0],0.5);v.vertexNormals[2].copy(e);v.vertexNormals[3].copy(g);u.vertexNormals[0].copy(g);u.vertexNormals[1].copy(e)}if(f.vertexColors.length===4){e=f.vertexColors[1].clone();e.lerpSelf(f.vertexColors[2],0.5);g=f.vertexColors[3].clone();g.lerpSelf(f.vertexColors[0],0.5);v.vertexColors[2].copy(e);v.vertexColors[3].copy(g);u.vertexColors[0].copy(g);u.vertexColors[1].copy(e)}f=1}A.push(v,u);a.vertices.push(q,l);
-e=0;for(g=a.faceVertexUvs.length;e<g;e++)if(a.faceVertexUvs[e].length){j=a.faceVertexUvs[e][c];u=j[0];h=j[1];v=j[2];j=j[3];if(f===0){l=u.clone();l.lerpSelf(h,0.5);m=v.clone();m.lerpSelf(j,0.5);u=[u.clone(),l.clone(),m.clone(),j.clone()];h=[l.clone(),h.clone(),v.clone(),m.clone()]}else{l=h.clone();l.lerpSelf(v,0.5);m=j.clone();m.lerpSelf(u,0.5);u=[u.clone(),h.clone(),l.clone(),m.clone()];h=[m.clone(),l.clone(),v.clone(),j.clone()]}y[e].push(u,h)}}else{A.push(f);e=0;for(g=a.faceVertexUvs.length;e<g;e++)y[e].push(a.faceVertexUvs[e][c])}}}a.faces=
+h=e.b;i=e.c;g=a.vertices[g];h=a.vertices[h];i=a.vertices[i];b.push(g.clone());b.push(h.clone());b.push(i.clone());e.a=f;e.b=f+1;e.c=f+2}}a.vertices=b;delete a.__tmpVertices},tessellate:function(a,b){var c,d,f,e,g,h,i,j,l,m,n,q,o,p,s,r,u,v,t,A=[],y=[];c=0;for(d=a.faceVertexUvs.length;c<d;c++)y[c]=[];c=0;for(d=a.faces.length;c<d;c++){f=a.faces[c];if(f instanceof THREE.Face3){e=f.a;g=f.b;h=f.c;j=a.vertices[e];l=a.vertices[g];m=a.vertices[h];q=j.distanceTo(l);o=l.distanceTo(m);n=j.distanceTo(m);if(q>
+b||o>b||n>b){i=a.vertices.length;v=f.clone();t=f.clone();if(q>=o&&q>=n){j=j.clone();j.lerpSelf(l,0.5);v.a=e;v.b=i;v.c=h;t.a=i;t.b=g;t.c=h;if(f.vertexNormals.length===3){e=f.vertexNormals[0].clone();e.lerpSelf(f.vertexNormals[1],0.5);v.vertexNormals[1].copy(e);t.vertexNormals[0].copy(e)}if(f.vertexColors.length===3){e=f.vertexColors[0].clone();e.lerpSelf(f.vertexColors[1],0.5);v.vertexColors[1].copy(e);t.vertexColors[0].copy(e)}f=0}else if(o>=q&&o>=n){j=l.clone();j.lerpSelf(m,0.5);v.a=e;v.b=g;v.c=
+i;t.a=i;t.b=h;t.c=e;if(f.vertexNormals.length===3){e=f.vertexNormals[1].clone();e.lerpSelf(f.vertexNormals[2],0.5);v.vertexNormals[2].copy(e);t.vertexNormals[0].copy(e);t.vertexNormals[1].copy(f.vertexNormals[2]);t.vertexNormals[2].copy(f.vertexNormals[0])}if(f.vertexColors.length===3){e=f.vertexColors[1].clone();e.lerpSelf(f.vertexColors[2],0.5);v.vertexColors[2].copy(e);t.vertexColors[0].copy(e);t.vertexColors[1].copy(f.vertexColors[2]);t.vertexColors[2].copy(f.vertexColors[0])}f=1}else{j=j.clone();
+j.lerpSelf(m,0.5);v.a=e;v.b=g;v.c=i;t.a=i;t.b=g;t.c=h;if(f.vertexNormals.length===3){e=f.vertexNormals[0].clone();e.lerpSelf(f.vertexNormals[2],0.5);v.vertexNormals[2].copy(e);t.vertexNormals[0].copy(e)}if(f.vertexColors.length===3){e=f.vertexColors[0].clone();e.lerpSelf(f.vertexColors[2],0.5);v.vertexColors[2].copy(e);t.vertexColors[0].copy(e)}f=2}A.push(v,t);a.vertices.push(j);e=0;for(g=a.faceVertexUvs.length;e<g;e++)if(a.faceVertexUvs[e].length){j=a.faceVertexUvs[e][c];t=j[0];h=j[1];v=j[2];if(f===
+0){l=t.clone();l.lerpSelf(h,0.5);j=[t.clone(),l.clone(),v.clone()];h=[l.clone(),h.clone(),v.clone()]}else if(f===1){l=h.clone();l.lerpSelf(v,0.5);j=[t.clone(),h.clone(),l.clone()];h=[l.clone(),v.clone(),t.clone()]}else{l=t.clone();l.lerpSelf(v,0.5);j=[t.clone(),h.clone(),l.clone()];h=[l.clone(),h.clone(),v.clone()]}y[e].push(j,h)}}else{A.push(f);e=0;for(g=a.faceVertexUvs.length;e<g;e++)y[e].push(a.faceVertexUvs[e][c])}}else{e=f.a;g=f.b;h=f.c;i=f.d;j=a.vertices[e];l=a.vertices[g];m=a.vertices[h];n=
+a.vertices[i];q=j.distanceTo(l);o=l.distanceTo(m);p=m.distanceTo(n);s=j.distanceTo(n);if(q>b||o>b||p>b||s>b){r=a.vertices.length;u=a.vertices.length+1;v=f.clone();t=f.clone();if(q>=o&&q>=p&&q>=s||p>=o&&p>=q&&p>=s){q=j.clone();q.lerpSelf(l,0.5);l=m.clone();l.lerpSelf(n,0.5);v.a=e;v.b=r;v.c=u;v.d=i;t.a=r;t.b=g;t.c=h;t.d=u;if(f.vertexNormals.length===4){e=f.vertexNormals[0].clone();e.lerpSelf(f.vertexNormals[1],0.5);g=f.vertexNormals[2].clone();g.lerpSelf(f.vertexNormals[3],0.5);v.vertexNormals[1].copy(e);
+v.vertexNormals[2].copy(g);t.vertexNormals[0].copy(e);t.vertexNormals[3].copy(g)}if(f.vertexColors.length===4){e=f.vertexColors[0].clone();e.lerpSelf(f.vertexColors[1],0.5);g=f.vertexColors[2].clone();g.lerpSelf(f.vertexColors[3],0.5);v.vertexColors[1].copy(e);v.vertexColors[2].copy(g);t.vertexColors[0].copy(e);t.vertexColors[3].copy(g)}f=0}else{q=l.clone();q.lerpSelf(m,0.5);l=n.clone();l.lerpSelf(j,0.5);v.a=e;v.b=g;v.c=r;v.d=u;t.a=u;t.b=r;t.c=h;t.d=i;if(f.vertexNormals.length===4){e=f.vertexNormals[1].clone();
+e.lerpSelf(f.vertexNormals[2],0.5);g=f.vertexNormals[3].clone();g.lerpSelf(f.vertexNormals[0],0.5);v.vertexNormals[2].copy(e);v.vertexNormals[3].copy(g);t.vertexNormals[0].copy(g);t.vertexNormals[1].copy(e)}if(f.vertexColors.length===4){e=f.vertexColors[1].clone();e.lerpSelf(f.vertexColors[2],0.5);g=f.vertexColors[3].clone();g.lerpSelf(f.vertexColors[0],0.5);v.vertexColors[2].copy(e);v.vertexColors[3].copy(g);t.vertexColors[0].copy(g);t.vertexColors[1].copy(e)}f=1}A.push(v,t);a.vertices.push(q,l);
+e=0;for(g=a.faceVertexUvs.length;e<g;e++)if(a.faceVertexUvs[e].length){j=a.faceVertexUvs[e][c];t=j[0];h=j[1];v=j[2];j=j[3];if(f===0){l=t.clone();l.lerpSelf(h,0.5);m=v.clone();m.lerpSelf(j,0.5);t=[t.clone(),l.clone(),m.clone(),j.clone()];h=[l.clone(),h.clone(),v.clone(),m.clone()]}else{l=h.clone();l.lerpSelf(v,0.5);m=j.clone();m.lerpSelf(t,0.5);t=[t.clone(),h.clone(),l.clone(),m.clone()];h=[m.clone(),l.clone(),v.clone(),j.clone()]}y[e].push(t,h)}}else{A.push(f);e=0;for(g=a.faceVertexUvs.length;e<g;e++)y[e].push(a.faceVertexUvs[e][c])}}}a.faces=
 A;a.faceVertexUvs=y}};THREE.GeometryUtils.random=THREE.Math.random16;THREE.GeometryUtils.__v1=new THREE.Vector3;
 THREE.ImageUtils={crossOrigin:"anonymous",loadTexture:function(a,b,c,d){var f=new Image,e=new THREE.Texture(f,b),b=new THREE.ImageLoader;b.addEventListener("load",function(a){e.image=a.content;e.needsUpdate=true;c&&c(e)});b.addEventListener("error",function(a){d&&d(a.message)});b.crossOrigin=this.crossOrigin;b.load(a,f);return e},loadTextureCube:function(a,b,c){var d,f=[],e=new THREE.Texture(f,b);e.flipY=false;b=f.loadCount=0;for(d=a.length;b<d;++b){f[b]=new Image;f[b].onload=function(){f.loadCount=
 f.loadCount+1;if(f.loadCount===6){e.needsUpdate=true;c&&c()}};f[b].crossOrigin=this.crossOrigin;f[b].src=a[b]}return e},getNormalMap:function(a,b){var c=function(a){var b=Math.sqrt(a[0]*a[0]+a[1]*a[1]+a[2]*a[2]);return[a[0]/b,a[1]/b,a[2]/b]},b=b|1,d=a.width,f=a.height,e=document.createElement("canvas");e.width=d;e.height=f;var g=e.getContext("2d");g.drawImage(a,0,0);for(var h=g.getImageData(0,0,d,f).data,i=g.createImageData(d,f),j=i.data,l=0;l<d;l++)for(var m=0;m<f;m++){var n=m-1<0?0:m-1,q=m+1>f-
-1?f-1:m+1,o=l-1<0?0:l-1,p=l+1>d-1?d-1:l+1,s=[],r=[0,0,h[(m*d+l)*4]/255*b];s.push([-1,0,h[(m*d+o)*4]/255*b]);s.push([-1,-1,h[(n*d+o)*4]/255*b]);s.push([0,-1,h[(n*d+l)*4]/255*b]);s.push([1,-1,h[(n*d+p)*4]/255*b]);s.push([1,0,h[(m*d+p)*4]/255*b]);s.push([1,1,h[(q*d+p)*4]/255*b]);s.push([0,1,h[(q*d+l)*4]/255*b]);s.push([-1,1,h[(q*d+o)*4]/255*b]);n=[];o=s.length;for(q=0;q<o;q++){var p=s[q],t=s[(q+1)%o],p=[p[0]-r[0],p[1]-r[1],p[2]-r[2]],t=[t[0]-r[0],t[1]-r[1],t[2]-r[2]];n.push(c([p[1]*t[2]-p[2]*t[1],p[2]*
-t[0]-p[0]*t[2],p[0]*t[1]-p[1]*t[0]]))}s=[0,0,0];for(q=0;q<n.length;q++){s[0]=s[0]+n[q][0];s[1]=s[1]+n[q][1];s[2]=s[2]+n[q][2]}s[0]=s[0]/n.length;s[1]=s[1]/n.length;s[2]=s[2]/n.length;r=(m*d+l)*4;j[r]=(s[0]+1)/2*255|0;j[r+1]=(s[1]+1)/2*255|0;j[r+2]=s[2]*255|0;j[r+3]=255}g.putImageData(i,0,0);return e},generateDataTexture:function(a,b,c){for(var d=a*b,f=new Uint8Array(3*d),e=Math.floor(c.r*255),g=Math.floor(c.g*255),c=Math.floor(c.b*255),h=0;h<d;h++){f[h*3]=e;f[h*3+1]=g;f[h*3+2]=c}a=new THREE.DataTexture(f,
+1?f-1:m+1,o=l-1<0?0:l-1,p=l+1>d-1?d-1:l+1,s=[],r=[0,0,h[(m*d+l)*4]/255*b];s.push([-1,0,h[(m*d+o)*4]/255*b]);s.push([-1,-1,h[(n*d+o)*4]/255*b]);s.push([0,-1,h[(n*d+l)*4]/255*b]);s.push([1,-1,h[(n*d+p)*4]/255*b]);s.push([1,0,h[(m*d+p)*4]/255*b]);s.push([1,1,h[(q*d+p)*4]/255*b]);s.push([0,1,h[(q*d+l)*4]/255*b]);s.push([-1,1,h[(q*d+o)*4]/255*b]);n=[];o=s.length;for(q=0;q<o;q++){var p=s[q],u=s[(q+1)%o],p=[p[0]-r[0],p[1]-r[1],p[2]-r[2]],u=[u[0]-r[0],u[1]-r[1],u[2]-r[2]];n.push(c([p[1]*u[2]-p[2]*u[1],p[2]*
+u[0]-p[0]*u[2],p[0]*u[1]-p[1]*u[0]]))}s=[0,0,0];for(q=0;q<n.length;q++){s[0]=s[0]+n[q][0];s[1]=s[1]+n[q][1];s[2]=s[2]+n[q][2]}s[0]=s[0]/n.length;s[1]=s[1]/n.length;s[2]=s[2]/n.length;r=(m*d+l)*4;j[r]=(s[0]+1)/2*255|0;j[r+1]=(s[1]+1)/2*255|0;j[r+2]=s[2]*255|0;j[r+3]=255}g.putImageData(i,0,0);return e},generateDataTexture:function(a,b,c){for(var d=a*b,f=new Uint8Array(3*d),e=Math.floor(c.r*255),g=Math.floor(c.g*255),c=Math.floor(c.b*255),h=0;h<d;h++){f[h*3]=e;f[h*3+1]=g;f[h*3+2]=c}a=new THREE.DataTexture(f,
 a,b,THREE.RGBFormat);a.needsUpdate=true;return a}};
 THREE.SceneUtils={showHierarchy:function(a,b){THREE.SceneUtils.traverseHierarchy(a,function(a){a.visible=b})},traverseHierarchy:function(a,b){var c,d,f=a.children.length;for(d=0;d<f;d++){c=a.children[d];b(c);THREE.SceneUtils.traverseHierarchy(c,b)}},createMultiMaterialObject:function(a,b){var c,d=b.length,f=new THREE.Object3D;for(c=0;c<d;c++){var e=new THREE.Mesh(a,b[c]);f.add(e)}return f},cloneObject:function(a){var b;if(a instanceof THREE.MorphAnimMesh){b=new THREE.MorphAnimMesh(a.geometry,a.material);
 b.duration=a.duration;b.mirroredLoop=a.mirroredLoop;b.time=a.time;b.lastKeyframe=a.lastKeyframe;b.currentKeyframe=a.currentKeyframe;b.direction=a.direction;b.directionBackwards=a.directionBackwards}else if(a instanceof THREE.SkinnedMesh)b=new THREE.SkinnedMesh(a.geometry,a.material);else if(a instanceof THREE.Mesh)b=new THREE.Mesh(a.geometry,a.material);else if(a instanceof THREE.Line)b=new THREE.Line(a.geometry,a.material,a.type);else if(a instanceof THREE.Ribbon)b=new THREE.Ribbon(a.geometry,a.material);
@@ -514,10 +515,10 @@ THREE.ShaderChunk.skinning_pars_vertex,THREE.ShaderChunk.shadowmap_pars_vertex,"
 cube:{uniforms:{tCube:{type:"t",value:1,texture:null},tFlip:{type:"f",value:-1}},vertexShader:"varying vec3 vViewPosition;\nvoid main() {\nvec4 mPosition = modelMatrix * vec4( position, 1.0 );\nvViewPosition = cameraPosition - mPosition.xyz;\ngl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}",fragmentShader:"uniform samplerCube tCube;\nuniform float tFlip;\nvarying vec3 vViewPosition;\nvoid main() {\nvec3 wPos = cameraPosition - vViewPosition;\ngl_FragColor = textureCube( tCube, vec3( tFlip * wPos.x, wPos.yz ) );\n}"}}});
 THREE.FontUtils={faces:{},face:"helvetiker",weight:"normal",style:"normal",size:150,divisions:10,getFace:function(){return this.faces[this.face][this.weight][this.style]},loadFace:function(a){var b=a.familyName.toLowerCase();this.faces[b]=this.faces[b]||{};this.faces[b][a.cssFontWeight]=this.faces[b][a.cssFontWeight]||{};this.faces[b][a.cssFontWeight][a.cssFontStyle]=a;return this.faces[b][a.cssFontWeight][a.cssFontStyle]=a},drawText:function(a){for(var b=this.getFace(),c=this.size/b.resolution,d=
 0,f=String(a).split(""),e=f.length,g=[],a=0;a<e;a++){var h=new THREE.Path,h=this.extractGlyphPoints(f[a],b,c,d,h),d=d+h.offset;g.push(h.path)}return{paths:g,offset:d/2}},extractGlyphPoints:function(a,b,c,d,f){var e=[],g,h,i,j,l,m,n,q,o,p,s,r=b.glyphs[a]||b.glyphs["?"];if(r){if(r.o){b=r._cachedOutline||(r._cachedOutline=r.o.split(" "));j=b.length;for(a=0;a<j;){i=b[a++];switch(i){case "m":i=b[a++]*c+d;l=b[a++]*c;f.moveTo(i,l);break;case "l":i=b[a++]*c+d;l=b[a++]*c;f.lineTo(i,l);break;case "q":i=b[a++]*
-c+d;l=b[a++]*c;q=b[a++]*c+d;o=b[a++]*c;f.quadraticCurveTo(q,o,i,l);if(g=e[e.length-1]){m=g.x;n=g.y;g=1;for(h=this.divisions;g<=h;g++){var t=g/h;THREE.Shape.Utils.b2(t,m,q,i);THREE.Shape.Utils.b2(t,n,o,l)}}break;case "b":i=b[a++]*c+d;l=b[a++]*c;q=b[a++]*c+d;o=b[a++]*-c;p=b[a++]*c+d;s=b[a++]*-c;f.bezierCurveTo(i,l,q,o,p,s);if(g=e[e.length-1]){m=g.x;n=g.y;g=1;for(h=this.divisions;g<=h;g++){t=g/h;THREE.Shape.Utils.b3(t,m,q,p,i);THREE.Shape.Utils.b3(t,n,o,s,l)}}}}}return{offset:r.ha*c,path:f}}}};
+c+d;l=b[a++]*c;q=b[a++]*c+d;o=b[a++]*c;f.quadraticCurveTo(q,o,i,l);if(g=e[e.length-1]){m=g.x;n=g.y;g=1;for(h=this.divisions;g<=h;g++){var u=g/h;THREE.Shape.Utils.b2(u,m,q,i);THREE.Shape.Utils.b2(u,n,o,l)}}break;case "b":i=b[a++]*c+d;l=b[a++]*c;q=b[a++]*c+d;o=b[a++]*-c;p=b[a++]*c+d;s=b[a++]*-c;f.bezierCurveTo(i,l,q,o,p,s);if(g=e[e.length-1]){m=g.x;n=g.y;g=1;for(h=this.divisions;g<=h;g++){u=g/h;THREE.Shape.Utils.b3(u,m,q,p,i);THREE.Shape.Utils.b3(u,n,o,s,l)}}}}}return{offset:r.ha*c,path:f}}}};
 THREE.FontUtils.generateShapes=function(a,b){var b=b||{},c=b.curveSegments!==void 0?b.curveSegments:4,d=b.font!==void 0?b.font:"helvetiker",f=b.weight!==void 0?b.weight:"normal",e=b.style!==void 0?b.style:"normal";THREE.FontUtils.size=b.size!==void 0?b.size:100;THREE.FontUtils.divisions=c;THREE.FontUtils.face=d;THREE.FontUtils.weight=f;THREE.FontUtils.style=e;c=THREE.FontUtils.drawText(a).paths;d=[];f=0;for(e=c.length;f<e;f++)Array.prototype.push.apply(d,c[f].toShapes());return d};
-(function(a){var b=function(a){for(var b=a.length,f=0,e=b-1,g=0;g<b;e=g++)f=f+(a[e].x*a[g].y-a[g].x*a[e].y);return f*0.5};a.Triangulate=function(a,d){var f=a.length;if(f<3)return null;var e=[],g=[],h=[],i,j,l;if(b(a)>0)for(j=0;j<f;j++)g[j]=j;else for(j=0;j<f;j++)g[j]=f-1-j;var m=2*f;for(j=f-1;f>2;){if(m--<=0){console.log("Warning, unable to triangulate polygon!");break}i=j;f<=i&&(i=0);j=i+1;f<=j&&(j=0);l=j+1;f<=l&&(l=0);var n;a:{n=a;var q=i,o=j,p=l,s=f,r=g,t=void 0,v=void 0,u=void 0,A=void 0,y=void 0,
-B=void 0,F=void 0,x=void 0,E=void 0,v=n[r[q]].x,u=n[r[q]].y,A=n[r[o]].x,y=n[r[o]].y,B=n[r[p]].x,F=n[r[p]].y;if(1E-10>(A-v)*(F-u)-(y-u)*(B-v))n=false;else{for(t=0;t<s;t++)if(!(t==q||t==o||t==p)){var x=n[r[t]].x,E=n[r[t]].y,G=void 0,O=void 0,J=void 0,N=void 0,C=void 0,I=void 0,Q=void 0,K=void 0,H=void 0,X=void 0,P=void 0,L=void 0,G=J=C=void 0,G=B-A,O=F-y,J=v-B,N=u-F,C=A-v,I=y-u,Q=x-v,K=E-u,H=x-A,X=E-y,P=x-B,L=E-F,G=G*X-O*H,C=C*K-I*Q,J=J*L-N*P;if(G>=0&&J>=0&&C>=0){n=false;break a}}n=true}}if(n){e.push([a[g[i]],
+(function(a){var b=function(a){for(var b=a.length,f=0,e=b-1,g=0;g<b;e=g++)f=f+(a[e].x*a[g].y-a[g].x*a[e].y);return f*0.5};a.Triangulate=function(a,d){var f=a.length;if(f<3)return null;var e=[],g=[],h=[],i,j,l;if(b(a)>0)for(j=0;j<f;j++)g[j]=j;else for(j=0;j<f;j++)g[j]=f-1-j;var m=2*f;for(j=f-1;f>2;){if(m--<=0){console.log("Warning, unable to triangulate polygon!");break}i=j;f<=i&&(i=0);j=i+1;f<=j&&(j=0);l=j+1;f<=l&&(l=0);var n;a:{n=a;var q=i,o=j,p=l,s=f,r=g,u=void 0,v=void 0,t=void 0,A=void 0,y=void 0,
+B=void 0,E=void 0,w=void 0,I=void 0,v=n[r[q]].x,t=n[r[q]].y,A=n[r[o]].x,y=n[r[o]].y,B=n[r[p]].x,E=n[r[p]].y;if(1E-10>(A-v)*(E-t)-(y-t)*(B-v))n=false;else{for(u=0;u<s;u++)if(!(u==q||u==o||u==p)){var w=n[r[u]].x,I=n[r[u]].y,G=void 0,O=void 0,F=void 0,K=void 0,C=void 0,J=void 0,Q=void 0,L=void 0,H=void 0,X=void 0,P=void 0,M=void 0,G=F=C=void 0,G=B-A,O=E-y,F=v-B,K=t-E,C=A-v,J=y-t,Q=w-v,L=I-t,H=w-A,X=I-y,P=w-B,M=I-E,G=G*X-O*H,C=C*L-J*Q,F=F*M-K*P;if(G>=0&&F>=0&&C>=0){n=false;break a}}n=true}}if(n){e.push([a[g[i]],
 a[g[j]],a[g[l]]]);h.push([g[i],g[j],g[l]]);i=j;for(l=j+1;l<f;i++,l++)g[i]=g[l];f--;m=2*f}}return d?h:e};a.Triangulate.area=b;return a})(THREE.FontUtils);self._typeface_js={faces:THREE.FontUtils.faces,loadFace:THREE.FontUtils.loadFace};THREE.Curve=function(){};THREE.Curve.prototype.getPoint=function(){console.log("Warning, getPoint() not implemented!");return null};THREE.Curve.prototype.getPointAt=function(a){a=this.getUtoTmapping(a);return this.getPoint(a)};
 THREE.Curve.prototype.getPoints=function(a){a||(a=5);var b,c=[];for(b=0;b<=a;b++)c.push(this.getPoint(b/a));return c};THREE.Curve.prototype.getSpacedPoints=function(a){a||(a=5);var b,c=[];for(b=0;b<=a;b++)c.push(this.getPointAt(b/a));return c};THREE.Curve.prototype.getLength=function(){var a=this.getLengths();return a[a.length-1]};
 THREE.Curve.prototype.getLengths=function(a){a||(a=this.__arcLengthDivisions?this.__arcLengthDivisions:200);if(this.cacheArcLengths&&this.cacheArcLengths.length==a+1&&!this.needsUpdate)return this.cacheArcLengths;this.needsUpdate=false;var b=[],c,d=this.getPoint(0),f,e=0;b.push(0);for(f=1;f<=a;f++){c=this.getPoint(f/a);e=e+c.distanceTo(d);b.push(e);d=c}return this.cacheArcLengths=b};THREE.Curve.prototype.updateArcLengths=function(){this.needsUpdate=true;this.getLengths()};
@@ -643,29 +644,29 @@ g.lengthSq()<c.minDistance*c.minDistance&&c.object.position.add(c.target,g.setLe
 this.domElement.addEventListener("mousemove",function(a){if(c.enabled){if(f){h=i=c.getMouseProjectionOnBall(a.clientX,a.clientY);j=l=c.getMouseOnScreen(a.clientX,a.clientY);m=n=c.getMouseOnScreen(a.clientX,a.clientY);f=false}e!==-1&&(e===0&&!c.noRotate?i=c.getMouseProjectionOnBall(a.clientX,a.clientY):e===1&&!c.noZoom?l=c.getMouseOnScreen(a.clientX,a.clientY):e===2&&!c.noPan&&(n=c.getMouseOnScreen(a.clientX,a.clientY)))}},false);this.domElement.addEventListener("mousedown",function(a){if(c.enabled){a.preventDefault();
 a.stopPropagation();if(e===-1){e=a.button;e===0&&!c.noRotate?h=i=c.getMouseProjectionOnBall(a.clientX,a.clientY):e===1&&!c.noZoom?j=l=c.getMouseOnScreen(a.clientX,a.clientY):this.noPan||(m=n=c.getMouseOnScreen(a.clientX,a.clientY))}}},false);this.domElement.addEventListener("mouseup",function(a){if(c.enabled){a.preventDefault();a.stopPropagation();e=-1}},false);window.addEventListener("keydown",function(a){if(c.enabled&&e===-1){a.keyCode===c.keys[0]&&!c.noRotate?e=0:a.keyCode===c.keys[1]&&!c.noZoom?
 e=1:a.keyCode===c.keys[2]&&!c.noPan&&(e=2);e!==-1&&(f=true)}},false);window.addEventListener("keyup",function(){c.enabled&&e!==-1&&(e=-1)},false);this.handleResize()};
-THREE.OrbitControls=function(a,b){function c(){return 2*Math.PI/60/60*e.autoRotateSpeed}function d(a){a.preventDefault();if(t===r.ROTATE){i.set(a.clientX,a.clientY);j.sub(i,h);e.rotateLeft(2*Math.PI*j.x/g*e.userRotateSpeed);e.rotateUp(2*Math.PI*j.y/g*e.userRotateSpeed);h.copy(i)}else if(t===r.ZOOM){m.set(a.clientX,a.clientY);n.sub(m,l);n.y>0?e.zoomIn():e.zoomOut();l.copy(m)}}function f(){if(e.userRotate){document.removeEventListener("mousemove",d,false);document.removeEventListener("mouseup",f,false);
-t=r.NONE}}THREE.EventTarget.call(this);this.object=a;this.domElement=b!==void 0?b:document;this.center=new THREE.Vector3;this.userZoom=true;this.userZoomSpeed=1;this.userRotate=true;this.userRotateSpeed=1;this.autoRotate=false;this.autoRotateSpeed=2;var e=this,g=1800,h=new THREE.Vector2,i=new THREE.Vector2,j=new THREE.Vector2,l=new THREE.Vector2,m=new THREE.Vector2,n=new THREE.Vector2,q=0,o=0,p=1,s=new THREE.Vector3,r={NONE:-1,ROTATE:0,ZOOM:1},t=r.NONE,v={type:"change"};this.rotateLeft=function(a){a===
+THREE.OrbitControls=function(a,b){function c(){return 2*Math.PI/60/60*e.autoRotateSpeed}function d(a){a.preventDefault();if(u===r.ROTATE){i.set(a.clientX,a.clientY);j.sub(i,h);e.rotateLeft(2*Math.PI*j.x/g*e.userRotateSpeed);e.rotateUp(2*Math.PI*j.y/g*e.userRotateSpeed);h.copy(i)}else if(u===r.ZOOM){m.set(a.clientX,a.clientY);n.sub(m,l);n.y>0?e.zoomIn():e.zoomOut();l.copy(m)}}function f(){if(e.userRotate){document.removeEventListener("mousemove",d,false);document.removeEventListener("mouseup",f,false);
+u=r.NONE}}THREE.EventTarget.call(this);this.object=a;this.domElement=b!==void 0?b:document;this.center=new THREE.Vector3;this.userZoom=true;this.userZoomSpeed=1;this.userRotate=true;this.userRotateSpeed=1;this.autoRotate=false;this.autoRotateSpeed=2;var e=this,g=1800,h=new THREE.Vector2,i=new THREE.Vector2,j=new THREE.Vector2,l=new THREE.Vector2,m=new THREE.Vector2,n=new THREE.Vector2,q=0,o=0,p=1,s=new THREE.Vector3,r={NONE:-1,ROTATE:0,ZOOM:1},u=r.NONE,v={type:"change"};this.rotateLeft=function(a){a===
 void 0&&(a=c());o=o-a};this.rotateRight=function(a){a===void 0&&(a=c());o=o+a};this.rotateUp=function(a){a===void 0&&(a=c());q=q-a};this.rotateDown=function(a){a===void 0&&(a=c());q=q+a};this.zoomIn=function(a){a===void 0&&(a=Math.pow(0.95,e.userZoomSpeed));p=p/a};this.zoomOut=function(a){a===void 0&&(a=Math.pow(0.95,e.userZoomSpeed));p=p*a};this.update=function(){var a=this.object.position,b=a.clone().subSelf(this.center),d=Math.atan2(b.x,b.z),e=Math.atan2(Math.sqrt(b.x*b.x+b.z*b.z),b.y);this.autoRotate&&
 this.rotateLeft(c());var d=d+o,e=e+q,e=Math.max(1E-6,Math.min(Math.PI-1E-6,e)),f=b.length();b.x=f*Math.sin(e)*Math.sin(d);b.y=f*Math.cos(e);b.z=f*Math.sin(e)*Math.cos(d);b.multiplyScalar(p);a.copy(this.center).addSelf(b);this.object.lookAt(this.center);q=o=0;p=1;if(s.distanceTo(this.object.position)>0){this.dispatchEvent(v);s.copy(this.object.position)}};this.domElement.addEventListener("contextmenu",function(a){a.preventDefault()},false);this.domElement.addEventListener("mousedown",function(a){if(e.userRotate){a.preventDefault();
-if(a.button===0||a.button===2){t=r.ROTATE;h.set(a.clientX,a.clientY)}else if(a.button===1){t=r.ZOOM;l.set(a.clientX,a.clientY)}document.addEventListener("mousemove",d,false);document.addEventListener("mouseup",f,false)}},false);this.domElement.addEventListener("mousewheel",function(a){e.userZoom&&(a.wheelDelta>0?e.zoomOut():e.zoomIn())},false)};
+if(a.button===0||a.button===2){u=r.ROTATE;h.set(a.clientX,a.clientY)}else if(a.button===1){u=r.ZOOM;l.set(a.clientX,a.clientY)}document.addEventListener("mousemove",d,false);document.addEventListener("mouseup",f,false)}},false);this.domElement.addEventListener("mousewheel",function(a){e.userZoom&&(a.wheelDelta>0?e.zoomOut():e.zoomIn())},false)};
 THREE.CircleGeometry=function(a,b,c,d){THREE.Geometry.call(this);var a=a||50,c=c!==void 0?c:0,d=d!==void 0?d:Math.PI*2,b=b!==void 0?Math.max(3,b):8,f,e=[];f=new THREE.Vector3;var g=new THREE.UV(0.5,0.5);this.vertices.push(f);e.push(g);for(f=0;f<=b;f++){var h=new THREE.Vector3;h.x=a*Math.cos(c+f/b*d);h.y=a*Math.sin(c+f/b*d);this.vertices.push(h);e.push(new THREE.UV((h.x/a+1)/2,-(h.y/a+1)/2+1))}c=new THREE.Vector3(0,0,-1);for(f=1;f<=b;f++){this.faces.push(new THREE.Face3(f,f+1,0,[c,c,c]));this.faceVertexUvs[0].push([e[f],
 e[f+1],g])}this.computeCentroids();this.computeFaceNormals();this.boundingSphere={radius:a}};THREE.CircleGeometry.prototype=Object.create(THREE.Geometry.prototype);
-THREE.CubeGeometry=function(a,b,c,d,f,e,g,h){function i(a,b,c,g,h,i,l,n){var m,o=d||1,p=f||1,q=h/2,r=i/2,s=j.vertices.length;if(a==="x"&&b==="y"||a==="y"&&b==="x")m="z";else if(a==="x"&&b==="z"||a==="z"&&b==="x"){m="y";p=e||1}else if(a==="z"&&b==="y"||a==="y"&&b==="z"){m="x";o=e||1}var t=o+1,v=p+1,X=h/o,P=i/p,L=new THREE.Vector3;L[m]=l>0?1:-1;for(h=0;h<v;h++)for(i=0;i<t;i++){var ea=new THREE.Vector3;ea[a]=(i*X-q)*c;ea[b]=(h*P-r)*g;ea[m]=l;j.vertices.push(ea)}for(h=0;h<p;h++)for(i=0;i<o;i++){a=new THREE.Face4(i+
-t*h+s,i+t*(h+1)+s,i+1+t*(h+1)+s,i+1+t*h+s);a.normal.copy(L);a.vertexNormals.push(L.clone(),L.clone(),L.clone(),L.clone());a.materialIndex=n;j.faces.push(a);j.faceVertexUvs[0].push([new THREE.UV(i/o,1-h/p),new THREE.UV(i/o,1-(h+1)/p),new THREE.UV((i+1)/o,1-(h+1)/p),new THREE.UV((i+1)/o,1-h/p)])}}THREE.Geometry.call(this);var j=this,l=a/2,m=b/2,n=c/2,q,o,p,s,r,t;if(g!==void 0){if(g instanceof Array)this.materials=g;else{this.materials=[];for(q=0;q<6;q++)this.materials.push(g)}q=0;s=1;o=2;r=3;p=4;t=
-5}else this.materials=[];this.sides={px:true,nx:true,py:true,ny:true,pz:true,nz:true};if(h!=void 0)for(var v in h)this.sides[v]!==void 0&&(this.sides[v]=h[v]);this.sides.px&&i("z","y",-1,-1,c,b,l,q);this.sides.nx&&i("z","y",1,-1,c,b,-l,s);this.sides.py&&i("x","z",1,1,a,c,m,o);this.sides.ny&&i("x","z",1,-1,a,c,-m,r);this.sides.pz&&i("x","y",1,-1,a,b,n,p);this.sides.nz&&i("x","y",-1,-1,a,b,-n,t);this.computeCentroids();this.mergeVertices()};THREE.CubeGeometry.prototype=Object.create(THREE.Geometry.prototype);
+THREE.CubeGeometry=function(a,b,c,d,f,e,g,h){function i(a,b,c,g,h,i,l,n){var m,o=d||1,p=f||1,q=h/2,r=i/2,s=j.vertices.length;if(a==="x"&&b==="y"||a==="y"&&b==="x")m="z";else if(a==="x"&&b==="z"||a==="z"&&b==="x"){m="y";p=e||1}else if(a==="z"&&b==="y"||a==="y"&&b==="z"){m="x";o=e||1}var u=o+1,v=p+1,X=h/o,P=i/p,M=new THREE.Vector3;M[m]=l>0?1:-1;for(h=0;h<v;h++)for(i=0;i<u;i++){var ea=new THREE.Vector3;ea[a]=(i*X-q)*c;ea[b]=(h*P-r)*g;ea[m]=l;j.vertices.push(ea)}for(h=0;h<p;h++)for(i=0;i<o;i++){a=new THREE.Face4(i+
+u*h+s,i+u*(h+1)+s,i+1+u*(h+1)+s,i+1+u*h+s);a.normal.copy(M);a.vertexNormals.push(M.clone(),M.clone(),M.clone(),M.clone());a.materialIndex=n;j.faces.push(a);j.faceVertexUvs[0].push([new THREE.UV(i/o,1-h/p),new THREE.UV(i/o,1-(h+1)/p),new THREE.UV((i+1)/o,1-(h+1)/p),new THREE.UV((i+1)/o,1-h/p)])}}THREE.Geometry.call(this);var j=this,l=a/2,m=b/2,n=c/2,q,o,p,s,r,u;if(g!==void 0){if(g instanceof Array)this.materials=g;else{this.materials=[];for(q=0;q<6;q++)this.materials.push(g)}q=0;s=1;o=2;r=3;p=4;u=
+5}else this.materials=[];this.sides={px:true,nx:true,py:true,ny:true,pz:true,nz:true};if(h!=void 0)for(var v in h)this.sides[v]!==void 0&&(this.sides[v]=h[v]);this.sides.px&&i("z","y",-1,-1,c,b,l,q);this.sides.nx&&i("z","y",1,-1,c,b,-l,s);this.sides.py&&i("x","z",1,1,a,c,m,o);this.sides.ny&&i("x","z",1,-1,a,c,-m,r);this.sides.pz&&i("x","y",1,-1,a,b,n,p);this.sides.nz&&i("x","y",-1,-1,a,b,-n,u);this.computeCentroids();this.mergeVertices()};THREE.CubeGeometry.prototype=Object.create(THREE.Geometry.prototype);
 THREE.CylinderGeometry=function(a,b,c,d,f,e){THREE.Geometry.call(this);var a=a!==void 0?a:20,b=b!==void 0?b:20,c=c!==void 0?c:100,g=c/2,d=d||8,f=f||1,h,i,j=[],l=[];for(i=0;i<=f;i++){var m=[],n=[],q=i/f,o=q*(b-a)+a;for(h=0;h<=d;h++){var p=h/d,s=new THREE.Vector3;s.x=o*Math.sin(p*Math.PI*2);s.y=-q*c+g;s.z=o*Math.cos(p*Math.PI*2);this.vertices.push(s);m.push(this.vertices.length-1);n.push(new THREE.UV(p,1-q))}j.push(m);l.push(n)}c=(b-a)/c;for(h=0;h<d;h++){if(a!==0){m=this.vertices[j[0][h]].clone();n=
-this.vertices[j[0][h+1]].clone()}else{m=this.vertices[j[1][h]].clone();n=this.vertices[j[1][h+1]].clone()}m.setY(Math.sqrt(m.x*m.x+m.z*m.z)*c).normalize();n.setY(Math.sqrt(n.x*n.x+n.z*n.z)*c).normalize();for(i=0;i<f;i++){var q=j[i][h],o=j[i+1][h],p=j[i+1][h+1],s=j[i][h+1],r=m.clone(),t=m.clone(),v=n.clone(),u=n.clone(),A=l[i][h].clone(),y=l[i+1][h].clone(),B=l[i+1][h+1].clone(),F=l[i][h+1].clone();this.faces.push(new THREE.Face4(q,o,p,s,[r,t,v,u]));this.faceVertexUvs[0].push([A,y,B,F])}}if(!e&&a>
-0){this.vertices.push(new THREE.Vector3(0,g,0));for(h=0;h<d;h++){q=j[0][h];o=j[0][h+1];p=this.vertices.length-1;r=new THREE.Vector3(0,1,0);t=new THREE.Vector3(0,1,0);v=new THREE.Vector3(0,1,0);A=l[0][h].clone();y=l[0][h+1].clone();B=new THREE.UV(y.u,0);this.faces.push(new THREE.Face3(q,o,p,[r,t,v]));this.faceVertexUvs[0].push([A,y,B])}}if(!e&&b>0){this.vertices.push(new THREE.Vector3(0,-g,0));for(h=0;h<d;h++){q=j[i][h+1];o=j[i][h];p=this.vertices.length-1;r=new THREE.Vector3(0,-1,0);t=new THREE.Vector3(0,
--1,0);v=new THREE.Vector3(0,-1,0);A=l[i][h+1].clone();y=l[i][h].clone();B=new THREE.UV(y.u,1);this.faces.push(new THREE.Face3(q,o,p,[r,t,v]));this.faceVertexUvs[0].push([A,y,B])}}this.computeCentroids();this.computeFaceNormals()};THREE.CylinderGeometry.prototype=Object.create(THREE.Geometry.prototype);
+this.vertices[j[0][h+1]].clone()}else{m=this.vertices[j[1][h]].clone();n=this.vertices[j[1][h+1]].clone()}m.setY(Math.sqrt(m.x*m.x+m.z*m.z)*c).normalize();n.setY(Math.sqrt(n.x*n.x+n.z*n.z)*c).normalize();for(i=0;i<f;i++){var q=j[i][h],o=j[i+1][h],p=j[i+1][h+1],s=j[i][h+1],r=m.clone(),u=m.clone(),v=n.clone(),t=n.clone(),A=l[i][h].clone(),y=l[i+1][h].clone(),B=l[i+1][h+1].clone(),E=l[i][h+1].clone();this.faces.push(new THREE.Face4(q,o,p,s,[r,u,v,t]));this.faceVertexUvs[0].push([A,y,B,E])}}if(!e&&a>
+0){this.vertices.push(new THREE.Vector3(0,g,0));for(h=0;h<d;h++){q=j[0][h];o=j[0][h+1];p=this.vertices.length-1;r=new THREE.Vector3(0,1,0);u=new THREE.Vector3(0,1,0);v=new THREE.Vector3(0,1,0);A=l[0][h].clone();y=l[0][h+1].clone();B=new THREE.UV(y.u,0);this.faces.push(new THREE.Face3(q,o,p,[r,u,v]));this.faceVertexUvs[0].push([A,y,B])}}if(!e&&b>0){this.vertices.push(new THREE.Vector3(0,-g,0));for(h=0;h<d;h++){q=j[i][h+1];o=j[i][h];p=this.vertices.length-1;r=new THREE.Vector3(0,-1,0);u=new THREE.Vector3(0,
+-1,0);v=new THREE.Vector3(0,-1,0);A=l[i][h+1].clone();y=l[i][h].clone();B=new THREE.UV(y.u,1);this.faces.push(new THREE.Face3(q,o,p,[r,u,v]));this.faceVertexUvs[0].push([A,y,B])}}this.computeCentroids();this.computeFaceNormals()};THREE.CylinderGeometry.prototype=Object.create(THREE.Geometry.prototype);
 THREE.ExtrudeGeometry=function(a,b){if(typeof a!=="undefined"){THREE.Geometry.call(this);a=a instanceof Array?a:[a];this.shapebb=a[a.length-1].getBoundingBox();this.addShapeList(a,b);this.computeCentroids();this.computeFaceNormals()}};THREE.ExtrudeGeometry.prototype=Object.create(THREE.Geometry.prototype);THREE.ExtrudeGeometry.prototype.addShapeList=function(a,b){for(var c=a.length,d=0;d<c;d++)this.addShape(a[d],b)};
 THREE.ExtrudeGeometry.prototype.addShape=function(a,b){function c(a,b,c){b||console.log("die");return b.clone().multiplyScalar(c).addSelf(a)}function d(a,b,c){var d=THREE.ExtrudeGeometry.__v1,e=THREE.ExtrudeGeometry.__v2,f=THREE.ExtrudeGeometry.__v3,g=THREE.ExtrudeGeometry.__v4,h=THREE.ExtrudeGeometry.__v5,i=THREE.ExtrudeGeometry.__v6;d.set(a.x-b.x,a.y-b.y);e.set(a.x-c.x,a.y-c.y);d=d.normalize();e=e.normalize();f.set(-d.y,d.x);g.set(e.y,-e.x);h.copy(a).addSelf(f);i.copy(a).addSelf(g);if(h.equals(i))return g.clone();
-h.copy(b).addSelf(f);i.copy(c).addSelf(g);f=d.dot(g);g=i.subSelf(h).dot(g);if(f===0){console.log("Either infinite or no solutions!");g===0?console.log("Its finite solutions."):console.log("Too bad, no solutions.")}g=g/f;if(g<0){b=Math.atan2(b.y-a.y,b.x-a.x);a=Math.atan2(c.y-a.y,c.x-a.x);b>a&&(a=a+Math.PI*2);c=(b+a)/2;a=-Math.cos(c);c=-Math.sin(c);return new THREE.Vector2(a,c)}return d.multiplyScalar(g).addSelf(h).subSelf(a).clone()}function f(c,d){var e,f;for(L=c.length;--L>=0;){e=L;f=L-1;f<0&&(f=
-c.length-1);for(var g=0,h=n+l*2,g=0;g<h;g++){var i=H*g,j=H*(g+1),m=d+e+i,i=d+f+i,o=d+f+j,j=d+e+j,p=c,q=g,r=h,s=e,u=f,m=m+O,i=i+O,o=o+O,j=j+O;G.faces.push(new THREE.Face4(m,i,o,j,null,null,t));m=v.generateSideWallUV(G,a,p,b,m,i,o,j,q,r,s,u);G.faceVertexUvs[0].push(m)}}}function e(a,b,c){G.vertices.push(new THREE.Vector3(a,b,c))}function g(c,d,e,f){c=c+O;d=d+O;e=e+O;G.faces.push(new THREE.Face3(c,d,e,null,null,r));c=f?v.generateBottomUV(G,a,b,c,d,e):v.generateTopUV(G,a,b,c,d,e);G.faceVertexUvs[0].push(c)}
-var h=b.amount!==void 0?b.amount:100,i=b.bevelThickness!==void 0?b.bevelThickness:6,j=b.bevelSize!==void 0?b.bevelSize:i-2,l=b.bevelSegments!==void 0?b.bevelSegments:3,m=b.bevelEnabled!==void 0?b.bevelEnabled:true,n=b.steps!==void 0?b.steps:1,q=b.bendPath,o=b.extrudePath,p,s=false,r=b.material,t=b.extrudeMaterial,v=b.UVGenerator!==void 0?b.UVGenerator:THREE.ExtrudeGeometry.WorldUVGenerator,u,A,y,B;if(o){p=o.getSpacedPoints(n);s=true;m=false;u=b.frames!==void 0?b.frames:new THREE.TubeGeometry.FrenetFrames(o,
-n,false);A=new THREE.Vector3;y=new THREE.Vector3;B=new THREE.Vector3}if(!m)j=i=l=0;var F,x,E,G=this,O=this.vertices.length;q&&a.addWrapPath(q);var q=a.extractPoints(),J=q.shape,q=q.holes;if(o=!THREE.Shape.Utils.isClockWise(J)){J=J.reverse();x=0;for(E=q.length;x<E;x++){F=q[x];THREE.Shape.Utils.isClockWise(F)&&(q[x]=F.reverse())}o=false}var N=THREE.Shape.Utils.triangulateShape(J,q),o=J;x=0;for(E=q.length;x<E;x++){F=q[x];J=J.concat(F)}var C,I,Q,K,H=J.length,X=N.length,P=[],L=0,ea=o.length;C=ea-1;for(I=
-L+1;L<ea;L++,C++,I++){C===ea&&(C=0);I===ea&&(I=0);P[L]=d(o[L],o[C],o[I])}var qa=[],ha,na=P.concat();x=0;for(E=q.length;x<E;x++){F=q[x];ha=[];L=0;ea=F.length;C=ea-1;for(I=L+1;L<ea;L++,C++,I++){C===ea&&(C=0);I===ea&&(I=0);ha[L]=d(F[L],F[C],F[I])}qa.push(ha);na=na.concat(ha)}for(C=0;C<l;C++){F=C/l;Q=i*(1-F);I=j*Math.sin(F*Math.PI/2);L=0;for(ea=o.length;L<ea;L++){K=c(o[L],P[L],I);e(K.x,K.y,-Q)}x=0;for(E=q.length;x<E;x++){F=q[x];ha=qa[x];L=0;for(ea=F.length;L<ea;L++){K=c(F[L],ha[L],I);e(K.x,K.y,-Q)}}}I=
-j;for(L=0;L<H;L++){K=m?c(J[L],na[L],I):J[L];if(s){y.copy(u.normals[0]).multiplyScalar(K.x);A.copy(u.binormals[0]).multiplyScalar(K.y);B.copy(p[0]).addSelf(y).addSelf(A);e(B.x,B.y,B.z)}else e(K.x,K.y,0)}for(F=1;F<=n;F++)for(L=0;L<H;L++){K=m?c(J[L],na[L],I):J[L];if(s){y.copy(u.normals[F]).multiplyScalar(K.x);A.copy(u.binormals[F]).multiplyScalar(K.y);B.copy(p[F]).addSelf(y).addSelf(A);e(B.x,B.y,B.z)}else e(K.x,K.y,h/n*F)}for(C=l-1;C>=0;C--){F=C/l;Q=i*(1-F);I=j*Math.sin(F*Math.PI/2);L=0;for(ea=o.length;L<
-ea;L++){K=c(o[L],P[L],I);e(K.x,K.y,h+Q)}x=0;for(E=q.length;x<E;x++){F=q[x];ha=qa[x];L=0;for(ea=F.length;L<ea;L++){K=c(F[L],ha[L],I);s?e(K.x,K.y+p[n-1].y,p[n-1].x+Q):e(K.x,K.y,h+Q)}}}if(m){i=H*0;for(L=0;L<X;L++){h=N[L];g(h[2]+i,h[1]+i,h[0]+i,true)}i=H*(n+l*2);for(L=0;L<X;L++){h=N[L];g(h[0]+i,h[1]+i,h[2]+i,false)}}else{for(L=0;L<X;L++){h=N[L];g(h[2],h[1],h[0],true)}for(L=0;L<X;L++){h=N[L];g(h[0]+H*n,h[1]+H*n,h[2]+H*n,false)}}h=0;f(o,h);h=h+o.length;x=0;for(E=q.length;x<E;x++){F=q[x];f(F,h);h=h+F.length}};
+h.copy(b).addSelf(f);i.copy(c).addSelf(g);f=d.dot(g);g=i.subSelf(h).dot(g);if(f===0){console.log("Either infinite or no solutions!");g===0?console.log("Its finite solutions."):console.log("Too bad, no solutions.")}g=g/f;if(g<0){b=Math.atan2(b.y-a.y,b.x-a.x);a=Math.atan2(c.y-a.y,c.x-a.x);b>a&&(a=a+Math.PI*2);c=(b+a)/2;a=-Math.cos(c);c=-Math.sin(c);return new THREE.Vector2(a,c)}return d.multiplyScalar(g).addSelf(h).subSelf(a).clone()}function f(c,d){var e,f;for(M=c.length;--M>=0;){e=M;f=M-1;f<0&&(f=
+c.length-1);for(var g=0,h=n+l*2,g=0;g<h;g++){var i=H*g,j=H*(g+1),m=d+e+i,i=d+f+i,o=d+f+j,j=d+e+j,p=c,q=g,r=h,s=e,t=f,m=m+O,i=i+O,o=o+O,j=j+O;G.faces.push(new THREE.Face4(m,i,o,j,null,null,u));m=v.generateSideWallUV(G,a,p,b,m,i,o,j,q,r,s,t);G.faceVertexUvs[0].push(m)}}}function e(a,b,c){G.vertices.push(new THREE.Vector3(a,b,c))}function g(c,d,e,f){c=c+O;d=d+O;e=e+O;G.faces.push(new THREE.Face3(c,d,e,null,null,r));c=f?v.generateBottomUV(G,a,b,c,d,e):v.generateTopUV(G,a,b,c,d,e);G.faceVertexUvs[0].push(c)}
+var h=b.amount!==void 0?b.amount:100,i=b.bevelThickness!==void 0?b.bevelThickness:6,j=b.bevelSize!==void 0?b.bevelSize:i-2,l=b.bevelSegments!==void 0?b.bevelSegments:3,m=b.bevelEnabled!==void 0?b.bevelEnabled:true,n=b.steps!==void 0?b.steps:1,q=b.bendPath,o=b.extrudePath,p,s=false,r=b.material,u=b.extrudeMaterial,v=b.UVGenerator!==void 0?b.UVGenerator:THREE.ExtrudeGeometry.WorldUVGenerator,t,A,y,B;if(o){p=o.getSpacedPoints(n);s=true;m=false;t=b.frames!==void 0?b.frames:new THREE.TubeGeometry.FrenetFrames(o,
+n,false);A=new THREE.Vector3;y=new THREE.Vector3;B=new THREE.Vector3}if(!m)j=i=l=0;var E,w,I,G=this,O=this.vertices.length;q&&a.addWrapPath(q);var q=a.extractPoints(),F=q.shape,q=q.holes;if(o=!THREE.Shape.Utils.isClockWise(F)){F=F.reverse();w=0;for(I=q.length;w<I;w++){E=q[w];THREE.Shape.Utils.isClockWise(E)&&(q[w]=E.reverse())}o=false}var K=THREE.Shape.Utils.triangulateShape(F,q),o=F;w=0;for(I=q.length;w<I;w++){E=q[w];F=F.concat(E)}var C,J,Q,L,H=F.length,X=K.length,P=[],M=0,ea=o.length;C=ea-1;for(J=
+M+1;M<ea;M++,C++,J++){C===ea&&(C=0);J===ea&&(J=0);P[M]=d(o[M],o[C],o[J])}var qa=[],ha,na=P.concat();w=0;for(I=q.length;w<I;w++){E=q[w];ha=[];M=0;ea=E.length;C=ea-1;for(J=M+1;M<ea;M++,C++,J++){C===ea&&(C=0);J===ea&&(J=0);ha[M]=d(E[M],E[C],E[J])}qa.push(ha);na=na.concat(ha)}for(C=0;C<l;C++){E=C/l;Q=i*(1-E);J=j*Math.sin(E*Math.PI/2);M=0;for(ea=o.length;M<ea;M++){L=c(o[M],P[M],J);e(L.x,L.y,-Q)}w=0;for(I=q.length;w<I;w++){E=q[w];ha=qa[w];M=0;for(ea=E.length;M<ea;M++){L=c(E[M],ha[M],J);e(L.x,L.y,-Q)}}}J=
+j;for(M=0;M<H;M++){L=m?c(F[M],na[M],J):F[M];if(s){y.copy(t.normals[0]).multiplyScalar(L.x);A.copy(t.binormals[0]).multiplyScalar(L.y);B.copy(p[0]).addSelf(y).addSelf(A);e(B.x,B.y,B.z)}else e(L.x,L.y,0)}for(E=1;E<=n;E++)for(M=0;M<H;M++){L=m?c(F[M],na[M],J):F[M];if(s){y.copy(t.normals[E]).multiplyScalar(L.x);A.copy(t.binormals[E]).multiplyScalar(L.y);B.copy(p[E]).addSelf(y).addSelf(A);e(B.x,B.y,B.z)}else e(L.x,L.y,h/n*E)}for(C=l-1;C>=0;C--){E=C/l;Q=i*(1-E);J=j*Math.sin(E*Math.PI/2);M=0;for(ea=o.length;M<
+ea;M++){L=c(o[M],P[M],J);e(L.x,L.y,h+Q)}w=0;for(I=q.length;w<I;w++){E=q[w];ha=qa[w];M=0;for(ea=E.length;M<ea;M++){L=c(E[M],ha[M],J);s?e(L.x,L.y+p[n-1].y,p[n-1].x+Q):e(L.x,L.y,h+Q)}}}if(m){i=H*0;for(M=0;M<X;M++){h=K[M];g(h[2]+i,h[1]+i,h[0]+i,true)}i=H*(n+l*2);for(M=0;M<X;M++){h=K[M];g(h[0]+i,h[1]+i,h[2]+i,false)}}else{for(M=0;M<X;M++){h=K[M];g(h[2],h[1],h[0],true)}for(M=0;M<X;M++){h=K[M];g(h[0]+H*n,h[1]+H*n,h[2]+H*n,false)}}h=0;f(o,h);h=h+o.length;w=0;for(I=q.length;w<I;w++){E=q[w];f(E,h);h=h+E.length}};
 THREE.ExtrudeGeometry.WorldUVGenerator={generateTopUV:function(a,b,c,d,f,e){b=a.vertices[f].x;f=a.vertices[f].y;c=a.vertices[e].x;e=a.vertices[e].y;return[new THREE.UV(a.vertices[d].x,a.vertices[d].y),new THREE.UV(b,f),new THREE.UV(c,e)]},generateBottomUV:function(a,b,c,d,f,e){return this.generateTopUV(a,b,c,d,f,e)},generateSideWallUV:function(a,b,c,d,f,e,g,h){var b=a.vertices[f].x,c=a.vertices[f].y,f=a.vertices[f].z,d=a.vertices[e].x,i=a.vertices[e].y,e=a.vertices[e].z,j=a.vertices[g].x,l=a.vertices[g].y,
 g=a.vertices[g].z,m=a.vertices[h].x,n=a.vertices[h].y,a=a.vertices[h].z;return Math.abs(c-i)<0.01?[new THREE.UV(b,1-f),new THREE.UV(d,1-e),new THREE.UV(j,1-g),new THREE.UV(m,1-a)]:[new THREE.UV(c,1-f),new THREE.UV(i,1-e),new THREE.UV(l,1-g),new THREE.UV(n,1-a)]}};THREE.ExtrudeGeometry.__v1=new THREE.Vector2;THREE.ExtrudeGeometry.__v2=new THREE.Vector2;THREE.ExtrudeGeometry.__v3=new THREE.Vector2;THREE.ExtrudeGeometry.__v4=new THREE.Vector2;THREE.ExtrudeGeometry.__v5=new THREE.Vector2;
 THREE.ExtrudeGeometry.__v6=new THREE.Vector2;
@@ -674,8 +675,8 @@ THREE.LatheGeometry=function(a,b,c){THREE.Geometry.call(this);for(var b=b||12,c=
 THREE.PlaneGeometry=function(a,b,c,d){THREE.Geometry.call(this);for(var f=a/2,e=b/2,c=c||1,d=d||1,g=c+1,h=d+1,i=a/c,j=b/d,l=new THREE.Vector3(0,0,1),a=0;a<h;a++)for(b=0;b<g;b++)this.vertices.push(new THREE.Vector3(b*i-f,-(a*j-e),0));for(a=0;a<d;a++)for(b=0;b<c;b++){f=new THREE.Face4(b+g*a,b+g*(a+1),b+1+g*(a+1),b+1+g*a);f.normal.copy(l);f.vertexNormals.push(l.clone(),l.clone(),l.clone(),l.clone());this.faces.push(f);this.faceVertexUvs[0].push([new THREE.UV(b/c,1-a/d),new THREE.UV(b/c,1-(a+1)/d),new THREE.UV((b+
 1)/c,1-(a+1)/d),new THREE.UV((b+1)/c,1-a/d)])}this.computeCentroids()};THREE.PlaneGeometry.prototype=Object.create(THREE.Geometry.prototype);
 THREE.SphereGeometry=function(a,b,c,d,f,e,g){THREE.Geometry.call(this);var a=a||50,d=d!==void 0?d:0,f=f!==void 0?f:Math.PI*2,e=e!==void 0?e:0,g=g!==void 0?g:Math.PI,b=Math.max(3,Math.floor(b)||8),c=Math.max(2,Math.floor(c)||6),h,i,j=[],l=[];for(i=0;i<=c;i++){var m=[],n=[];for(h=0;h<=b;h++){var q=h/b,o=i/c,p=new THREE.Vector3;p.x=-a*Math.cos(d+q*f)*Math.sin(e+o*g);p.y=a*Math.cos(e+o*g);p.z=a*Math.sin(d+q*f)*Math.sin(e+o*g);this.vertices.push(p);m.push(this.vertices.length-1);n.push(new THREE.UV(q,
-1-o))}j.push(m);l.push(n)}for(i=0;i<c;i++)for(h=0;h<b;h++){var d=j[i][h+1],f=j[i][h],e=j[i+1][h],g=j[i+1][h+1],m=this.vertices[d].clone().normalize(),n=this.vertices[f].clone().normalize(),q=this.vertices[e].clone().normalize(),o=this.vertices[g].clone().normalize(),p=l[i][h+1].clone(),s=l[i][h].clone(),r=l[i+1][h].clone(),t=l[i+1][h+1].clone();if(Math.abs(this.vertices[d].y)==a){this.faces.push(new THREE.Face3(d,e,g,[m,q,o]));this.faceVertexUvs[0].push([p,r,t])}else if(Math.abs(this.vertices[e].y)==
-a){this.faces.push(new THREE.Face3(d,f,e,[m,n,q]));this.faceVertexUvs[0].push([p,s,r])}else{this.faces.push(new THREE.Face4(d,f,e,g,[m,n,q,o]));this.faceVertexUvs[0].push([p,s,r,t])}}this.computeCentroids();this.computeFaceNormals();this.boundingSphere={radius:a}};THREE.SphereGeometry.prototype=Object.create(THREE.Geometry.prototype);
+1-o))}j.push(m);l.push(n)}for(i=0;i<c;i++)for(h=0;h<b;h++){var d=j[i][h+1],f=j[i][h],e=j[i+1][h],g=j[i+1][h+1],m=this.vertices[d].clone().normalize(),n=this.vertices[f].clone().normalize(),q=this.vertices[e].clone().normalize(),o=this.vertices[g].clone().normalize(),p=l[i][h+1].clone(),s=l[i][h].clone(),r=l[i+1][h].clone(),u=l[i+1][h+1].clone();if(Math.abs(this.vertices[d].y)==a){this.faces.push(new THREE.Face3(d,e,g,[m,q,o]));this.faceVertexUvs[0].push([p,r,u])}else if(Math.abs(this.vertices[e].y)==
+a){this.faces.push(new THREE.Face3(d,f,e,[m,n,q]));this.faceVertexUvs[0].push([p,s,r])}else{this.faces.push(new THREE.Face4(d,f,e,g,[m,n,q,o]));this.faceVertexUvs[0].push([p,s,r,u])}}this.computeCentroids();this.computeFaceNormals();this.boundingSphere={radius:a}};THREE.SphereGeometry.prototype=Object.create(THREE.Geometry.prototype);
 THREE.TextGeometry=function(a,b){var c=THREE.FontUtils.generateShapes(a,b);b.amount=b.height!==void 0?b.height:50;if(b.bevelThickness===void 0)b.bevelThickness=10;if(b.bevelSize===void 0)b.bevelSize=8;if(b.bevelEnabled===void 0)b.bevelEnabled=false;if(b.bend){var d=c[c.length-1].getBoundingBox().maxX;b.bendPath=new THREE.QuadraticBezierCurve(new THREE.Vector2(0,0),new THREE.Vector2(d/2,120),new THREE.Vector2(d,0))}THREE.ExtrudeGeometry.call(this,c,b)};THREE.TextGeometry.prototype=Object.create(THREE.ExtrudeGeometry.prototype);
 THREE.TorusGeometry=function(a,b,c,d,f){THREE.Geometry.call(this);this.radius=a||100;this.tube=b||40;this.segmentsR=c||8;this.segmentsT=d||6;this.arc=f||Math.PI*2;f=new THREE.Vector3;a=[];b=[];for(c=0;c<=this.segmentsR;c++)for(d=0;d<=this.segmentsT;d++){var e=d/this.segmentsT*this.arc,g=c/this.segmentsR*Math.PI*2;f.x=this.radius*Math.cos(e);f.y=this.radius*Math.sin(e);var h=new THREE.Vector3;h.x=(this.radius+this.tube*Math.cos(g))*Math.cos(e);h.y=(this.radius+this.tube*Math.cos(g))*Math.sin(e);h.z=
 this.tube*Math.sin(g);this.vertices.push(h);a.push(new THREE.UV(d/this.segmentsT,c/this.segmentsR));b.push(h.clone().subSelf(f).normalize())}for(c=1;c<=this.segmentsR;c++)for(d=1;d<=this.segmentsT;d++){var f=(this.segmentsT+1)*c+d-1,e=(this.segmentsT+1)*(c-1)+d-1,g=(this.segmentsT+1)*(c-1)+d,h=(this.segmentsT+1)*c+d,i=new THREE.Face4(f,e,g,h,[b[f],b[e],b[g],b[h]]);i.normal.addSelf(b[f]);i.normal.addSelf(b[e]);i.normal.addSelf(b[g]);i.normal.addSelf(b[h]);i.normal.normalize();this.faces.push(i);this.faceVertexUvs[0].push([a[f].clone(),
@@ -712,13 +713,13 @@ a("f2",1,-1,1);a("f3",-1,1,1);a("f4",1,1,1);a("u1",0.7,1.1,-1);a("u2",-0.7,1.1,-
 THREE.SubdivisionModifier=function(a){this.subdivisions=a===void 0?1:a;this.useOldVertexColors=false;this.supportUVs=true;this.debug=false};THREE.SubdivisionModifier.prototype.modify=function(a){for(var b=this.subdivisions;b-- >0;)this.smooth(a)};
 THREE.SubdivisionModifier.prototype.smooth=function(a){function b(){l.debug&&console.log.apply(console,arguments)}function c(){console&&console.log.apply(console,arguments)}function d(a,c,d,f,g,h,m){var n=new THREE.Face4(a,c,d,f,null,g.color,g.materialIndex);if(l.useOldVertexColors){n.vertexColors=[];for(var o,p,q,r=0;r<4;r++){q=h[r];o=new THREE.Color;o.setRGB(0,0,0);for(var s=0;s<q.length;s++){p=g.vertexColors[q[s]-1];o.r=o.r+p.r;o.g=o.g+p.g;o.b=o.b+p.b}o.r=o.r/q.length;o.g=o.g/q.length;o.b=o.b/
 q.length;n.vertexColors[r]=o}}i.push(n);if(l.supportUVs){g=[e(a,""),e(c,m),e(d,m),e(f,m)];g[0]?g[1]?g[2]?g[3]?j.push(g):b("d :( ",f+":"+m):b("c :( ",d+":"+m):b("b :( ",c+":"+m):b("a :( ",a+":"+m)}}function f(a,b){return Math.min(a,b)+"_"+Math.max(a,b)}function e(a,d){var e=a+":"+d,f=s[e];if(!f){a>=r&&a<r+n.length?b("face pt"):b("edge pt");c("warning, UV not found for",e);return null}return f}function g(a,b,d){var e=a+":"+b;e in s?c("dup vertexNo",a,"oldFaceNo",b,"value",d,"key",e,s[e]):s[e]=d}var h=
-[],i=[],j=[],l=this,m=a.vertices,n=a.faces,h=m.concat(),q=[],o={},p={},s={},r=m.length,t,v,u,A,y,B=a.faceVertexUvs[0];b("originalFaces, uvs, originalVerticesLength",n.length,B.length,r);if(l.supportUVs){t=0;for(v=B.length;t<v;t++){u=0;for(A=B[t].length;u<A;u++){y=n[t]["abcd".charAt(u)];g(y,t,B[t][u])}}}if(B.length==0)l.supportUVs=false;t=0;for(var F in s)t++;if(!t){l.supportUVs=false;b("no uvs")}b("-- Original Faces + Vertices UVs completed",s,"vs",B.length);var x;t=0;for(v=n.length;t<v;t++){y=n[t];
-q.push(y.centroid);h.push(y.centroid);if(l.supportUVs){x=new THREE.UV;if(y instanceof THREE.Face3){x.u=e(y.a,t).u+e(y.b,t).u+e(y.c,t).u;x.v=e(y.a,t).v+e(y.b,t).v+e(y.c,t).v;x.u=x.u/3;x.v=x.v/3}else if(y instanceof THREE.Face4){x.u=e(y.a,t).u+e(y.b,t).u+e(y.c,t).u+e(y.d,t).u;x.v=e(y.a,t).v+e(y.b,t).v+e(y.c,t).v+e(y.d,t).v;x.u=x.u/4;x.v=x.v/4}g(r+t,"",x)}}b("-- added UVs for new Faces",s);F=function(a,b){E[a]===void 0&&(E[a]=[]);E[a].push(b)};var E={},B=0;for(v=a.faces.length;B<v;B++){y=a.faces[B];
-if(y instanceof THREE.Face3){x=f(y.a,y.b);F(x,B);x=f(y.b,y.c);F(x,B);x=f(y.c,y.a);F(x,B)}else if(y instanceof THREE.Face4){x=f(y.a,y.b);F(x,B);x=f(y.b,y.c);F(x,B);x=f(y.c,y.d);F(x,B);x=f(y.d,y.a);F(x,B)}}v=E;var G=0,O,J;F={};B={};for(t in v){x=v[t];O=t.split("_");J=O[0];O=O[1];u=J;y=[J,O];F[u]===void 0&&(F[u]=[]);F[u].push(y);u=O;y=[J,O];F[u]===void 0&&(F[u]=[]);F[u].push(y);u=0;for(A=x.length;u<A;u++){y=x[u];var N=J,C=y,I=t;B[N]===void 0&&(B[N]={});B[N][C]=I;N=O;C=t;B[N]===void 0&&(B[N]={});B[N][y]=
-C}x.length<2&&(p[t]=true)}b("vertexEdgeMap",F,"vertexFaceMap",B);for(t in v){x=v[t];y=x[0];A=x[1];O=t.split("_");J=O[0];O=O[1];x=new THREE.Vector3;if(p[t]){x.addSelf(m[J]);x.addSelf(m[O]);x.multiplyScalar(0.5)}else{x.addSelf(q[y]);x.addSelf(q[A]);x.addSelf(m[J]);x.addSelf(m[O]);x.multiplyScalar(0.25)}o[t]=r+n.length+G;h.push(x);G++;if(l.supportUVs){x=new THREE.UV;x.u=e(J,y).u+e(O,y).u;x.v=e(J,y).v+e(O,y).v;x.u=x.u/2;x.v=x.v/2;g(o[t],y,x);if(!p[t]){x=new THREE.UV;x.u=e(J,A).u+e(O,A).u;x.v=e(J,A).v+
-e(O,A).v;x.u=x.u/2;x.v=x.v/2;g(o[t],A,x)}}}b("-- Step 2 done");var Q,K;O=["123","12","2","23"];A=["123","23","3","31"];var N=["123","31","1","12"],C=["1234","12","2","23"],I=["1234","23","3","34"],H=["1234","34","4","41"],X=["1234","41","1","12"];t=0;for(v=q.length;t<v;t++){y=n[t];x=r+t;if(y instanceof THREE.Face3){G=f(y.a,y.b);J=f(y.b,y.c);Q=f(y.c,y.a);d(x,o[G],y.b,o[J],y,O,t);d(x,o[J],y.c,o[Q],y,A,t);d(x,o[Q],y.a,o[G],y,N,t)}else if(y instanceof THREE.Face4){G=f(y.a,y.b);J=f(y.b,y.c);Q=f(y.c,y.d);
-K=f(y.d,y.a);d(x,o[G],y.b,o[J],y,C,t);d(x,o[J],y.c,o[Q],y,I,t);d(x,o[Q],y.d,o[K],y,H,t);d(x,o[K],y.a,o[G],y,X,t)}else b("face should be a face!",y)}o=new THREE.Vector3;y=new THREE.Vector3;t=0;for(v=m.length;t<v;t++)if(F[t]!==void 0){o.set(0,0,0);y.set(0,0,0);J=new THREE.Vector3(0,0,0);x=0;for(u in B[t]){o.addSelf(q[u]);x++}O=0;G=F[t].length;for(u=0;u<G;u++)p[f(F[t][u][0],F[t][u][1])]&&O++;if(O!=2){o.divideScalar(x);for(u=0;u<G;u++){x=F[t][u];x=m[x[0]].clone().addSelf(m[x[1]]).divideScalar(2);y.addSelf(x)}y.divideScalar(G);
-J.addSelf(m[t]);J.multiplyScalar(G-3);J.addSelf(o);J.addSelf(y.multiplyScalar(2));J.divideScalar(G);h[t]=J}}a.vertices=h;a.faces=i;a.faceVertexUvs[0]=j;delete a.__tmpVertices;a.computeCentroids();a.computeFaceNormals();a.computeVertexNormals()};THREE.ImmediateRenderObject=function(){THREE.Object3D.call(this);this.render=function(){}};THREE.ImmediateRenderObject.prototype=Object.create(THREE.Object3D.prototype);
+[],i=[],j=[],l=this,m=a.vertices,n=a.faces,h=m.concat(),q=[],o={},p={},s={},r=m.length,u,v,t,A,y,B=a.faceVertexUvs[0];b("originalFaces, uvs, originalVerticesLength",n.length,B.length,r);if(l.supportUVs){u=0;for(v=B.length;u<v;u++){t=0;for(A=B[u].length;t<A;t++){y=n[u]["abcd".charAt(t)];g(y,u,B[u][t])}}}if(B.length==0)l.supportUVs=false;u=0;for(var E in s)u++;if(!u){l.supportUVs=false;b("no uvs")}b("-- Original Faces + Vertices UVs completed",s,"vs",B.length);var w;u=0;for(v=n.length;u<v;u++){y=n[u];
+q.push(y.centroid);h.push(y.centroid);if(l.supportUVs){w=new THREE.UV;if(y instanceof THREE.Face3){w.u=e(y.a,u).u+e(y.b,u).u+e(y.c,u).u;w.v=e(y.a,u).v+e(y.b,u).v+e(y.c,u).v;w.u=w.u/3;w.v=w.v/3}else if(y instanceof THREE.Face4){w.u=e(y.a,u).u+e(y.b,u).u+e(y.c,u).u+e(y.d,u).u;w.v=e(y.a,u).v+e(y.b,u).v+e(y.c,u).v+e(y.d,u).v;w.u=w.u/4;w.v=w.v/4}g(r+u,"",w)}}b("-- added UVs for new Faces",s);E=function(a,b){I[a]===void 0&&(I[a]=[]);I[a].push(b)};var I={},B=0;for(v=a.faces.length;B<v;B++){y=a.faces[B];
+if(y instanceof THREE.Face3){w=f(y.a,y.b);E(w,B);w=f(y.b,y.c);E(w,B);w=f(y.c,y.a);E(w,B)}else if(y instanceof THREE.Face4){w=f(y.a,y.b);E(w,B);w=f(y.b,y.c);E(w,B);w=f(y.c,y.d);E(w,B);w=f(y.d,y.a);E(w,B)}}v=I;var G=0,O,F;E={};B={};for(u in v){w=v[u];O=u.split("_");F=O[0];O=O[1];t=F;y=[F,O];E[t]===void 0&&(E[t]=[]);E[t].push(y);t=O;y=[F,O];E[t]===void 0&&(E[t]=[]);E[t].push(y);t=0;for(A=w.length;t<A;t++){y=w[t];var K=F,C=y,J=u;B[K]===void 0&&(B[K]={});B[K][C]=J;K=O;C=u;B[K]===void 0&&(B[K]={});B[K][y]=
+C}w.length<2&&(p[u]=true)}b("vertexEdgeMap",E,"vertexFaceMap",B);for(u in v){w=v[u];y=w[0];A=w[1];O=u.split("_");F=O[0];O=O[1];w=new THREE.Vector3;if(p[u]){w.addSelf(m[F]);w.addSelf(m[O]);w.multiplyScalar(0.5)}else{w.addSelf(q[y]);w.addSelf(q[A]);w.addSelf(m[F]);w.addSelf(m[O]);w.multiplyScalar(0.25)}o[u]=r+n.length+G;h.push(w);G++;if(l.supportUVs){w=new THREE.UV;w.u=e(F,y).u+e(O,y).u;w.v=e(F,y).v+e(O,y).v;w.u=w.u/2;w.v=w.v/2;g(o[u],y,w);if(!p[u]){w=new THREE.UV;w.u=e(F,A).u+e(O,A).u;w.v=e(F,A).v+
+e(O,A).v;w.u=w.u/2;w.v=w.v/2;g(o[u],A,w)}}}b("-- Step 2 done");var Q,L;O=["123","12","2","23"];A=["123","23","3","31"];var K=["123","31","1","12"],C=["1234","12","2","23"],J=["1234","23","3","34"],H=["1234","34","4","41"],X=["1234","41","1","12"];u=0;for(v=q.length;u<v;u++){y=n[u];w=r+u;if(y instanceof THREE.Face3){G=f(y.a,y.b);F=f(y.b,y.c);Q=f(y.c,y.a);d(w,o[G],y.b,o[F],y,O,u);d(w,o[F],y.c,o[Q],y,A,u);d(w,o[Q],y.a,o[G],y,K,u)}else if(y instanceof THREE.Face4){G=f(y.a,y.b);F=f(y.b,y.c);Q=f(y.c,y.d);
+L=f(y.d,y.a);d(w,o[G],y.b,o[F],y,C,u);d(w,o[F],y.c,o[Q],y,J,u);d(w,o[Q],y.d,o[L],y,H,u);d(w,o[L],y.a,o[G],y,X,u)}else b("face should be a face!",y)}o=new THREE.Vector3;y=new THREE.Vector3;u=0;for(v=m.length;u<v;u++)if(E[u]!==void 0){o.set(0,0,0);y.set(0,0,0);F=new THREE.Vector3(0,0,0);w=0;for(t in B[u]){o.addSelf(q[t]);w++}O=0;G=E[u].length;for(t=0;t<G;t++)p[f(E[u][t][0],E[u][t][1])]&&O++;if(O!=2){o.divideScalar(w);for(t=0;t<G;t++){w=E[u][t];w=m[w[0]].clone().addSelf(m[w[1]]).divideScalar(2);y.addSelf(w)}y.divideScalar(G);
+F.addSelf(m[u]);F.multiplyScalar(G-3);F.addSelf(o);F.addSelf(y.multiplyScalar(2));F.divideScalar(G);h[u]=F}}a.vertices=h;a.faces=i;a.faceVertexUvs[0]=j;delete a.__tmpVertices;a.computeCentroids();a.computeFaceNormals();a.computeVertexNormals()};THREE.ImmediateRenderObject=function(){THREE.Object3D.call(this);this.render=function(){}};THREE.ImmediateRenderObject.prototype=Object.create(THREE.Object3D.prototype);
 THREE.LensFlare=function(a,b,c,d,f){THREE.Object3D.call(this);this.lensFlares=[];this.positionScreen=new THREE.Vector3;this.customUpdateCallback=void 0;a!==void 0&&this.add(a,b,c,d,f)};THREE.LensFlare.prototype=Object.create(THREE.Object3D.prototype);
 THREE.LensFlare.prototype.add=function(a,b,c,d,f,e){b===void 0&&(b=-1);c===void 0&&(c=0);e===void 0&&(e=1);f===void 0&&(f=new THREE.Color(16777215));if(d===void 0)d=THREE.NormalBlending;c=Math.min(c,Math.max(0,c));this.lensFlares.push({texture:a,size:b,distance:c,x:0,y:0,z:0,scale:1,rotation:1,opacity:e,color:f,blending:d})};
 THREE.LensFlare.prototype.updateLensFlares=function(){var a,b=this.lensFlares.length,c,d=-this.positionScreen.x*2,f=-this.positionScreen.y*2;for(a=0;a<b;a++){c=this.lensFlares[a];c.x=this.positionScreen.x+d*c.distance;c.y=this.positionScreen.y+f*c.distance;c.wantedRotation=c.x*Math.PI*0.25;c.rotation=c.rotation+(c.wantedRotation-c.rotation)*0.25}};
@@ -734,30 +735,30 @@ THREE.LensFlarePlugin=function(){function a(a){var c=b.createProgram(),d=b.creat
 0;d[o++]=1;d[o++]=1;d[o++]=1;d[o++]=1;d[o++]=-1;d[o++]=1;d[o++]=0;d[o++]=1;o=0;f[o++]=0;f[o++]=1;f[o++]=2;f[o++]=0;f[o++]=2;f[o++]=3;e=b.createBuffer();g=b.createBuffer();b.bindBuffer(b.ARRAY_BUFFER,e);b.bufferData(b.ARRAY_BUFFER,d,b.STATIC_DRAW);b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,g);b.bufferData(b.ELEMENT_ARRAY_BUFFER,f,b.STATIC_DRAW);h=b.createTexture();i=b.createTexture();b.bindTexture(b.TEXTURE_2D,h);b.texImage2D(b.TEXTURE_2D,0,b.RGB,16,16,0,b.RGB,b.UNSIGNED_BYTE,null);b.texParameteri(b.TEXTURE_2D,
 b.TEXTURE_WRAP_S,b.CLAMP_TO_EDGE);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_WRAP_T,b.CLAMP_TO_EDGE);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MAG_FILTER,b.NEAREST);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MIN_FILTER,b.NEAREST);b.bindTexture(b.TEXTURE_2D,i);b.texImage2D(b.TEXTURE_2D,0,b.RGBA,16,16,0,b.RGBA,b.UNSIGNED_BYTE,null);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_WRAP_S,b.CLAMP_TO_EDGE);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_WRAP_T,b.CLAMP_TO_EDGE);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MAG_FILTER,b.NEAREST);
 b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MIN_FILTER,b.NEAREST);if(b.getParameter(b.MAX_VERTEX_TEXTURE_IMAGE_UNITS)<=0){j=false;l=a(THREE.ShaderFlares.lensFlare)}else{j=true;l=a(THREE.ShaderFlares.lensFlareVertexTexture)}m={};n={};m.vertex=b.getAttribLocation(l,"position");m.uv=b.getAttribLocation(l,"uv");n.renderType=b.getUniformLocation(l,"renderType");n.map=b.getUniformLocation(l,"map");n.occlusionMap=b.getUniformLocation(l,"occlusionMap");n.opacity=b.getUniformLocation(l,"opacity");n.color=b.getUniformLocation(l,
-"color");n.scale=b.getUniformLocation(l,"scale");n.rotation=b.getUniformLocation(l,"rotation");n.screenPosition=b.getUniformLocation(l,"screenPosition");q=false};this.render=function(a,d,f,r){var a=a.__webglFlares,t=a.length;if(t){var v=new THREE.Vector3,u=r/f,A=f*0.5,y=r*0.5,B=16/r,F=new THREE.Vector2(B*u,B),x=new THREE.Vector3(1,1,0),E=new THREE.Vector2(1,1),G=n,B=m;b.useProgram(l);if(!q){b.enableVertexAttribArray(m.vertex);b.enableVertexAttribArray(m.uv);q=true}b.uniform1i(G.occlusionMap,0);b.uniform1i(G.map,
-1);b.bindBuffer(b.ARRAY_BUFFER,e);b.vertexAttribPointer(B.vertex,2,b.FLOAT,false,16,0);b.vertexAttribPointer(B.uv,2,b.FLOAT,false,16,8);b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,g);b.disable(b.CULL_FACE);b.depthMask(false);var O,J,N,C,I;for(O=0;O<t;O++){B=16/r;F.set(B*u,B);C=a[O];v.set(C.matrixWorld.elements[12],C.matrixWorld.elements[13],C.matrixWorld.elements[14]);d.matrixWorldInverse.multiplyVector3(v);d.projectionMatrix.multiplyVector3(v);x.copy(v);E.x=x.x*A+A;E.y=x.y*y+y;if(j||E.x>0&&E.x<f&&E.y>0&&
-E.y<r){b.activeTexture(b.TEXTURE1);b.bindTexture(b.TEXTURE_2D,h);b.copyTexImage2D(b.TEXTURE_2D,0,b.RGB,E.x-8,E.y-8,16,16,0);b.uniform1i(G.renderType,0);b.uniform2f(G.scale,F.x,F.y);b.uniform3f(G.screenPosition,x.x,x.y,x.z);b.disable(b.BLEND);b.enable(b.DEPTH_TEST);b.drawElements(b.TRIANGLES,6,b.UNSIGNED_SHORT,0);b.activeTexture(b.TEXTURE0);b.bindTexture(b.TEXTURE_2D,i);b.copyTexImage2D(b.TEXTURE_2D,0,b.RGBA,E.x-8,E.y-8,16,16,0);b.uniform1i(G.renderType,1);b.disable(b.DEPTH_TEST);b.activeTexture(b.TEXTURE1);
-b.bindTexture(b.TEXTURE_2D,h);b.drawElements(b.TRIANGLES,6,b.UNSIGNED_SHORT,0);C.positionScreen.copy(x);C.customUpdateCallback?C.customUpdateCallback(C):C.updateLensFlares();b.uniform1i(G.renderType,2);b.enable(b.BLEND);J=0;for(N=C.lensFlares.length;J<N;J++){I=C.lensFlares[J];if(I.opacity>0.001&&I.scale>0.001){x.x=I.x;x.y=I.y;x.z=I.z;B=I.size*I.scale/r;F.x=B*u;F.y=B;b.uniform3f(G.screenPosition,x.x,x.y,x.z);b.uniform2f(G.scale,F.x,F.y);b.uniform1f(G.rotation,I.rotation);b.uniform1f(G.opacity,I.opacity);
-b.uniform3f(G.color,I.color.r,I.color.g,I.color.b);c.setBlending(I.blending,I.blendEquation,I.blendSrc,I.blendDst);c.setTexture(I.texture,1);b.drawElements(b.TRIANGLES,6,b.UNSIGNED_SHORT,0)}}}}b.enable(b.CULL_FACE);b.enable(b.DEPTH_TEST);b.depthMask(true)}}};
+"color");n.scale=b.getUniformLocation(l,"scale");n.rotation=b.getUniformLocation(l,"rotation");n.screenPosition=b.getUniformLocation(l,"screenPosition");q=false};this.render=function(a,d,f,r){var a=a.__webglFlares,u=a.length;if(u){var v=new THREE.Vector3,t=r/f,A=f*0.5,y=r*0.5,B=16/r,E=new THREE.Vector2(B*t,B),w=new THREE.Vector3(1,1,0),I=new THREE.Vector2(1,1),G=n,B=m;b.useProgram(l);if(!q){b.enableVertexAttribArray(m.vertex);b.enableVertexAttribArray(m.uv);q=true}b.uniform1i(G.occlusionMap,0);b.uniform1i(G.map,
+1);b.bindBuffer(b.ARRAY_BUFFER,e);b.vertexAttribPointer(B.vertex,2,b.FLOAT,false,16,0);b.vertexAttribPointer(B.uv,2,b.FLOAT,false,16,8);b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,g);b.disable(b.CULL_FACE);b.depthMask(false);var O,F,K,C,J;for(O=0;O<u;O++){B=16/r;E.set(B*t,B);C=a[O];v.set(C.matrixWorld.elements[12],C.matrixWorld.elements[13],C.matrixWorld.elements[14]);d.matrixWorldInverse.multiplyVector3(v);d.projectionMatrix.multiplyVector3(v);w.copy(v);I.x=w.x*A+A;I.y=w.y*y+y;if(j||I.x>0&&I.x<f&&I.y>0&&
+I.y<r){b.activeTexture(b.TEXTURE1);b.bindTexture(b.TEXTURE_2D,h);b.copyTexImage2D(b.TEXTURE_2D,0,b.RGB,I.x-8,I.y-8,16,16,0);b.uniform1i(G.renderType,0);b.uniform2f(G.scale,E.x,E.y);b.uniform3f(G.screenPosition,w.x,w.y,w.z);b.disable(b.BLEND);b.enable(b.DEPTH_TEST);b.drawElements(b.TRIANGLES,6,b.UNSIGNED_SHORT,0);b.activeTexture(b.TEXTURE0);b.bindTexture(b.TEXTURE_2D,i);b.copyTexImage2D(b.TEXTURE_2D,0,b.RGBA,I.x-8,I.y-8,16,16,0);b.uniform1i(G.renderType,1);b.disable(b.DEPTH_TEST);b.activeTexture(b.TEXTURE1);
+b.bindTexture(b.TEXTURE_2D,h);b.drawElements(b.TRIANGLES,6,b.UNSIGNED_SHORT,0);C.positionScreen.copy(w);C.customUpdateCallback?C.customUpdateCallback(C):C.updateLensFlares();b.uniform1i(G.renderType,2);b.enable(b.BLEND);F=0;for(K=C.lensFlares.length;F<K;F++){J=C.lensFlares[F];if(J.opacity>0.001&&J.scale>0.001){w.x=J.x;w.y=J.y;w.z=J.z;B=J.size*J.scale/r;E.x=B*t;E.y=B;b.uniform3f(G.screenPosition,w.x,w.y,w.z);b.uniform2f(G.scale,E.x,E.y);b.uniform1f(G.rotation,J.rotation);b.uniform1f(G.opacity,J.opacity);
+b.uniform3f(G.color,J.color.r,J.color.g,J.color.b);c.setBlending(J.blending,J.blendEquation,J.blendSrc,J.blendDst);c.setTexture(J.texture,1);b.drawElements(b.TRIANGLES,6,b.UNSIGNED_SHORT,0)}}}}b.enable(b.CULL_FACE);b.enable(b.DEPTH_TEST);b.depthMask(true)}}};
 THREE.ShadowMapPlugin=function(){var a,b,c,d,f,e,g=new THREE.Frustum,h=new THREE.Matrix4,i=new THREE.Vector3,j=new THREE.Vector3;this.init=function(g){a=g.context;b=g;var g=THREE.ShaderLib.depthRGBA,h=THREE.UniformsUtils.clone(g.uniforms);c=new THREE.ShaderMaterial({fragmentShader:g.fragmentShader,vertexShader:g.vertexShader,uniforms:h});d=new THREE.ShaderMaterial({fragmentShader:g.fragmentShader,vertexShader:g.vertexShader,uniforms:h,morphTargets:true});f=new THREE.ShaderMaterial({fragmentShader:g.fragmentShader,
-vertexShader:g.vertexShader,uniforms:h,skinning:true});e=new THREE.ShaderMaterial({fragmentShader:g.fragmentShader,vertexShader:g.vertexShader,uniforms:h,morphTargets:true,skinning:true});c._shadowPass=true;d._shadowPass=true;f._shadowPass=true;e._shadowPass=true};this.render=function(a,c){b.shadowMapEnabled&&b.shadowMapAutoUpdate&&this.update(a,c)};this.update=function(l,m){var n,q,o,p,s,r,t,v,u,A=[];p=0;a.clearColor(1,1,1,1);a.disable(a.BLEND);a.enable(a.CULL_FACE);b.shadowMapCullFrontFaces?a.cullFace(a.FRONT):
-a.cullFace(a.BACK);b.setDepthTest(true);n=0;for(q=l.__lights.length;n<q;n++){o=l.__lights[n];if(o.castShadow)if(o instanceof THREE.DirectionalLight&&o.shadowCascade)for(s=0;s<o.shadowCascadeCount;s++){var y;if(o.shadowCascadeArray[s])y=o.shadowCascadeArray[s];else{u=o;t=s;y=new THREE.DirectionalLight;y.isVirtual=true;y.onlyShadow=true;y.castShadow=true;y.shadowCameraNear=u.shadowCameraNear;y.shadowCameraFar=u.shadowCameraFar;y.shadowCameraLeft=u.shadowCameraLeft;y.shadowCameraRight=u.shadowCameraRight;
-y.shadowCameraBottom=u.shadowCameraBottom;y.shadowCameraTop=u.shadowCameraTop;y.shadowCameraVisible=u.shadowCameraVisible;y.shadowDarkness=u.shadowDarkness;y.shadowBias=u.shadowCascadeBias[t];y.shadowMapWidth=u.shadowCascadeWidth[t];y.shadowMapHeight=u.shadowCascadeHeight[t];y.pointsWorld=[];y.pointsFrustum=[];v=y.pointsWorld;r=y.pointsFrustum;for(var B=0;B<8;B++){v[B]=new THREE.Vector3;r[B]=new THREE.Vector3}v=u.shadowCascadeNearZ[t];u=u.shadowCascadeFarZ[t];r[0].set(-1,-1,v);r[1].set(1,-1,v);r[2].set(-1,
-1,v);r[3].set(1,1,v);r[4].set(-1,-1,u);r[5].set(1,-1,u);r[6].set(-1,1,u);r[7].set(1,1,u);y.originalCamera=m;r=new THREE.Gyroscope;r.position=o.shadowCascadeOffset;r.add(y);r.add(y.target);m.add(r);o.shadowCascadeArray[s]=y;console.log("Created virtualLight",y)}t=o;v=s;u=t.shadowCascadeArray[v];u.position.copy(t.position);u.target.position.copy(t.target.position);u.lookAt(u.target);u.shadowCameraVisible=t.shadowCameraVisible;u.shadowDarkness=t.shadowDarkness;u.shadowBias=t.shadowCascadeBias[v];r=t.shadowCascadeNearZ[v];
-t=t.shadowCascadeFarZ[v];u=u.pointsFrustum;u[0].z=r;u[1].z=r;u[2].z=r;u[3].z=r;u[4].z=t;u[5].z=t;u[6].z=t;u[7].z=t;A[p]=y;p++}else{A[p]=o;p++}}n=0;for(q=A.length;n<q;n++){o=A[n];if(!o.shadowMap){o.shadowMap=new THREE.WebGLRenderTarget(o.shadowMapWidth,o.shadowMapHeight,{minFilter:THREE.LinearFilter,magFilter:THREE.LinearFilter,format:THREE.RGBAFormat});o.shadowMapSize=new THREE.Vector2(o.shadowMapWidth,o.shadowMapHeight);o.shadowMatrix=new THREE.Matrix4}if(!o.shadowCamera){if(o instanceof THREE.SpotLight)o.shadowCamera=
+vertexShader:g.vertexShader,uniforms:h,skinning:true});e=new THREE.ShaderMaterial({fragmentShader:g.fragmentShader,vertexShader:g.vertexShader,uniforms:h,morphTargets:true,skinning:true});c._shadowPass=true;d._shadowPass=true;f._shadowPass=true;e._shadowPass=true};this.render=function(a,c){b.shadowMapEnabled&&b.shadowMapAutoUpdate&&this.update(a,c)};this.update=function(l,m){var n,q,o,p,s,r,u,v,t,A=[];p=0;a.clearColor(1,1,1,1);a.disable(a.BLEND);a.enable(a.CULL_FACE);b.shadowMapCullFrontFaces?a.cullFace(a.FRONT):
+a.cullFace(a.BACK);b.setDepthTest(true);n=0;for(q=l.__lights.length;n<q;n++){o=l.__lights[n];if(o.castShadow)if(o instanceof THREE.DirectionalLight&&o.shadowCascade)for(s=0;s<o.shadowCascadeCount;s++){var y;if(o.shadowCascadeArray[s])y=o.shadowCascadeArray[s];else{t=o;u=s;y=new THREE.DirectionalLight;y.isVirtual=true;y.onlyShadow=true;y.castShadow=true;y.shadowCameraNear=t.shadowCameraNear;y.shadowCameraFar=t.shadowCameraFar;y.shadowCameraLeft=t.shadowCameraLeft;y.shadowCameraRight=t.shadowCameraRight;
+y.shadowCameraBottom=t.shadowCameraBottom;y.shadowCameraTop=t.shadowCameraTop;y.shadowCameraVisible=t.shadowCameraVisible;y.shadowDarkness=t.shadowDarkness;y.shadowBias=t.shadowCascadeBias[u];y.shadowMapWidth=t.shadowCascadeWidth[u];y.shadowMapHeight=t.shadowCascadeHeight[u];y.pointsWorld=[];y.pointsFrustum=[];v=y.pointsWorld;r=y.pointsFrustum;for(var B=0;B<8;B++){v[B]=new THREE.Vector3;r[B]=new THREE.Vector3}v=t.shadowCascadeNearZ[u];t=t.shadowCascadeFarZ[u];r[0].set(-1,-1,v);r[1].set(1,-1,v);r[2].set(-1,
+1,v);r[3].set(1,1,v);r[4].set(-1,-1,t);r[5].set(1,-1,t);r[6].set(-1,1,t);r[7].set(1,1,t);y.originalCamera=m;r=new THREE.Gyroscope;r.position=o.shadowCascadeOffset;r.add(y);r.add(y.target);m.add(r);o.shadowCascadeArray[s]=y;console.log("Created virtualLight",y)}u=o;v=s;t=u.shadowCascadeArray[v];t.position.copy(u.position);t.target.position.copy(u.target.position);t.lookAt(t.target);t.shadowCameraVisible=u.shadowCameraVisible;t.shadowDarkness=u.shadowDarkness;t.shadowBias=u.shadowCascadeBias[v];r=u.shadowCascadeNearZ[v];
+u=u.shadowCascadeFarZ[v];t=t.pointsFrustum;t[0].z=r;t[1].z=r;t[2].z=r;t[3].z=r;t[4].z=u;t[5].z=u;t[6].z=u;t[7].z=u;A[p]=y;p++}else{A[p]=o;p++}}n=0;for(q=A.length;n<q;n++){o=A[n];if(!o.shadowMap){o.shadowMap=new THREE.WebGLRenderTarget(o.shadowMapWidth,o.shadowMapHeight,{minFilter:THREE.LinearFilter,magFilter:THREE.LinearFilter,format:THREE.RGBAFormat});o.shadowMapSize=new THREE.Vector2(o.shadowMapWidth,o.shadowMapHeight);o.shadowMatrix=new THREE.Matrix4}if(!o.shadowCamera){if(o instanceof THREE.SpotLight)o.shadowCamera=
 new THREE.PerspectiveCamera(o.shadowCameraFov,o.shadowMapWidth/o.shadowMapHeight,o.shadowCameraNear,o.shadowCameraFar);else if(o instanceof THREE.DirectionalLight)o.shadowCamera=new THREE.OrthographicCamera(o.shadowCameraLeft,o.shadowCameraRight,o.shadowCameraTop,o.shadowCameraBottom,o.shadowCameraNear,o.shadowCameraFar);else{console.error("Unsupported light type for shadow");continue}l.add(o.shadowCamera);b.autoUpdateScene&&l.updateMatrixWorld()}if(o.shadowCameraVisible&&!o.cameraHelper){o.cameraHelper=
-new THREE.CameraHelper(o.shadowCamera);o.shadowCamera.add(o.cameraHelper)}if(o.isVirtual&&y.originalCamera==m){s=m;p=o.shadowCamera;r=o.pointsFrustum;u=o.pointsWorld;i.set(Infinity,Infinity,Infinity);j.set(-Infinity,-Infinity,-Infinity);for(t=0;t<8;t++){v=u[t];v.copy(r[t]);THREE.ShadowMapPlugin.__projector.unprojectVector(v,s);p.matrixWorldInverse.multiplyVector3(v);if(v.x<i.x)i.x=v.x;if(v.x>j.x)j.x=v.x;if(v.y<i.y)i.y=v.y;if(v.y>j.y)j.y=v.y;if(v.z<i.z)i.z=v.z;if(v.z>j.z)j.z=v.z}p.left=i.x;p.right=
+new THREE.CameraHelper(o.shadowCamera);o.shadowCamera.add(o.cameraHelper)}if(o.isVirtual&&y.originalCamera==m){s=m;p=o.shadowCamera;r=o.pointsFrustum;t=o.pointsWorld;i.set(Infinity,Infinity,Infinity);j.set(-Infinity,-Infinity,-Infinity);for(u=0;u<8;u++){v=t[u];v.copy(r[u]);THREE.ShadowMapPlugin.__projector.unprojectVector(v,s);p.matrixWorldInverse.multiplyVector3(v);if(v.x<i.x)i.x=v.x;if(v.x>j.x)j.x=v.x;if(v.y<i.y)i.y=v.y;if(v.y>j.y)j.y=v.y;if(v.z<i.z)i.z=v.z;if(v.z>j.z)j.z=v.z}p.left=i.x;p.right=
 j.x;p.top=j.y;p.bottom=i.y;p.updateProjectionMatrix()}p=o.shadowMap;r=o.shadowMatrix;s=o.shadowCamera;s.position.copy(o.matrixWorld.getPosition());s.lookAt(o.target.matrixWorld.getPosition());s.updateMatrixWorld();s.matrixWorldInverse.getInverse(s.matrixWorld);if(o.cameraHelper)o.cameraHelper.lines.visible=o.shadowCameraVisible;o.shadowCameraVisible&&o.cameraHelper.update();r.set(0.5,0,0,0.5,0,0.5,0,0.5,0,0,0.5,0.5,0,0,0,1);r.multiplySelf(s.projectionMatrix);r.multiplySelf(s.matrixWorldInverse);if(!s._viewMatrixArray)s._viewMatrixArray=
-new Float32Array(16);if(!s._projectionMatrixArray)s._projectionMatrixArray=new Float32Array(16);s.matrixWorldInverse.flattenToArray(s._viewMatrixArray);s.projectionMatrix.flattenToArray(s._projectionMatrixArray);h.multiply(s.projectionMatrix,s.matrixWorldInverse);g.setFromMatrix(h);b.setRenderTarget(p);b.clear();u=l.__webglObjects;o=0;for(p=u.length;o<p;o++){t=u[o];r=t.object;t.render=false;if(r.visible&&r.castShadow&&(!(r instanceof THREE.Mesh)||!r.frustumCulled||g.contains(r))){r._modelViewMatrix.multiply(s.matrixWorldInverse,
-r.matrixWorld);t.render=true}}o=0;for(p=u.length;o<p;o++){t=u[o];if(t.render){r=t.object;t=t.buffer;v=r.customDepthMaterial?r.customDepthMaterial:r instanceof THREE.SkinnedMesh?r.geometry.morphTargets.length?e:f:r.geometry.morphTargets.length?d:c;t instanceof THREE.BufferGeometry?b.renderBufferDirect(s,l.__lights,null,v,t,r):b.renderBuffer(s,l.__lights,null,v,t,r)}}u=l.__webglObjectsImmediate;o=0;for(p=u.length;o<p;o++){t=u[o];r=t.object;if(r.visible&&r.castShadow){r._modelViewMatrix.multiply(s.matrixWorldInverse,
+new Float32Array(16);if(!s._projectionMatrixArray)s._projectionMatrixArray=new Float32Array(16);s.matrixWorldInverse.flattenToArray(s._viewMatrixArray);s.projectionMatrix.flattenToArray(s._projectionMatrixArray);h.multiply(s.projectionMatrix,s.matrixWorldInverse);g.setFromMatrix(h);b.setRenderTarget(p);b.clear();t=l.__webglObjects;o=0;for(p=t.length;o<p;o++){u=t[o];r=u.object;u.render=false;if(r.visible&&r.castShadow&&(!(r instanceof THREE.Mesh)||!r.frustumCulled||g.contains(r))){r._modelViewMatrix.multiply(s.matrixWorldInverse,
+r.matrixWorld);u.render=true}}o=0;for(p=t.length;o<p;o++){u=t[o];if(u.render){r=u.object;u=u.buffer;v=r.customDepthMaterial?r.customDepthMaterial:r instanceof THREE.SkinnedMesh?r.geometry.morphTargets.length?e:f:r.geometry.morphTargets.length?d:c;u instanceof THREE.BufferGeometry?b.renderBufferDirect(s,l.__lights,null,v,u,r):b.renderBuffer(s,l.__lights,null,v,u,r)}}t=l.__webglObjectsImmediate;o=0;for(p=t.length;o<p;o++){u=t[o];r=u.object;if(r.visible&&r.castShadow){r._modelViewMatrix.multiply(s.matrixWorldInverse,
 r.matrixWorld);b.renderImmediateObject(s,l.__lights,null,c,r)}}}n=b.getClearColor();q=b.getClearAlpha();a.clearColor(n.r,n.g,n.b,q);a.enable(a.BLEND);b.shadowMapCullFrontFaces&&a.cullFace(a.BACK)}};THREE.ShadowMapPlugin.__projector=new THREE.Projector;
 THREE.SpritePlugin=function(){function a(a,b){return b.z-a.z}var b,c,d,f,e,g,h,i,j,l;this.init=function(a){b=a.context;c=a;d=new Float32Array(16);f=new Uint16Array(6);a=0;d[a++]=-1;d[a++]=-1;d[a++]=0;d[a++]=0;d[a++]=1;d[a++]=-1;d[a++]=1;d[a++]=0;d[a++]=1;d[a++]=1;d[a++]=1;d[a++]=1;d[a++]=-1;d[a++]=1;d[a++]=0;d[a++]=1;a=0;f[a++]=0;f[a++]=1;f[a++]=2;f[a++]=0;f[a++]=2;f[a++]=3;e=b.createBuffer();g=b.createBuffer();b.bindBuffer(b.ARRAY_BUFFER,e);b.bufferData(b.ARRAY_BUFFER,d,b.STATIC_DRAW);b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,
 g);b.bufferData(b.ELEMENT_ARRAY_BUFFER,f,b.STATIC_DRAW);var a=THREE.ShaderSprite.sprite,n=b.createProgram(),q=b.createShader(b.FRAGMENT_SHADER),o=b.createShader(b.VERTEX_SHADER);b.shaderSource(q,a.fragmentShader);b.shaderSource(o,a.vertexShader);b.compileShader(q);b.compileShader(o);b.attachShader(n,q);b.attachShader(n,o);b.linkProgram(n);h=n;i={};j={};i.position=b.getAttribLocation(h,"position");i.uv=b.getAttribLocation(h,"uv");j.uvOffset=b.getUniformLocation(h,"uvOffset");j.uvScale=b.getUniformLocation(h,
 "uvScale");j.rotation=b.getUniformLocation(h,"rotation");j.scale=b.getUniformLocation(h,"scale");j.alignment=b.getUniformLocation(h,"alignment");j.color=b.getUniformLocation(h,"color");j.map=b.getUniformLocation(h,"map");j.opacity=b.getUniformLocation(h,"opacity");j.useScreenCoordinates=b.getUniformLocation(h,"useScreenCoordinates");j.affectedByDistance=b.getUniformLocation(h,"affectedByDistance");j.screenPosition=b.getUniformLocation(h,"screenPosition");j.modelViewMatrix=b.getUniformLocation(h,"modelViewMatrix");
-j.projectionMatrix=b.getUniformLocation(h,"projectionMatrix");l=false};this.render=function(d,f,q,o){var d=d.__webglSprites,p=d.length;if(p){var s=i,r=j,t=o/q,q=q*0.5,v=o*0.5,u=true;b.useProgram(h);if(!l){b.enableVertexAttribArray(s.position);b.enableVertexAttribArray(s.uv);l=true}b.disable(b.CULL_FACE);b.enable(b.BLEND);b.depthMask(true);b.bindBuffer(b.ARRAY_BUFFER,e);b.vertexAttribPointer(s.position,2,b.FLOAT,false,16,0);b.vertexAttribPointer(s.uv,2,b.FLOAT,false,16,8);b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,
+j.projectionMatrix=b.getUniformLocation(h,"projectionMatrix");l=false};this.render=function(d,f,q,o){var d=d.__webglSprites,p=d.length;if(p){var s=i,r=j,u=o/q,q=q*0.5,v=o*0.5,t=true;b.useProgram(h);if(!l){b.enableVertexAttribArray(s.position);b.enableVertexAttribArray(s.uv);l=true}b.disable(b.CULL_FACE);b.enable(b.BLEND);b.depthMask(true);b.bindBuffer(b.ARRAY_BUFFER,e);b.vertexAttribPointer(s.position,2,b.FLOAT,false,16,0);b.vertexAttribPointer(s.uv,2,b.FLOAT,false,16,8);b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,
 g);b.uniformMatrix4fv(r.projectionMatrix,false,f._projectionMatrixArray);b.activeTexture(b.TEXTURE0);b.uniform1i(r.map,0);for(var A,y=[],s=0;s<p;s++){A=d[s];if(A.visible&&A.opacity!==0)if(A.useScreenCoordinates)A.z=-A.position.z;else{A._modelViewMatrix.multiply(f.matrixWorldInverse,A.matrixWorld);A.z=-A._modelViewMatrix.elements[14]}}d.sort(a);for(s=0;s<p;s++){A=d[s];if(A.visible&&A.opacity!==0&&A.map&&A.map.image&&A.map.image.width){if(A.useScreenCoordinates){b.uniform1i(r.useScreenCoordinates,1);
-b.uniform3f(r.screenPosition,(A.position.x-q)/q,(v-A.position.y)/v,Math.max(0,Math.min(1,A.position.z)))}else{b.uniform1i(r.useScreenCoordinates,0);b.uniform1i(r.affectedByDistance,A.affectedByDistance?1:0);b.uniformMatrix4fv(r.modelViewMatrix,false,A._modelViewMatrix.elements)}f=A.map.image.width/(A.scaleByViewport?o:1);y[0]=f*t*A.scale.x;y[1]=f*A.scale.y;b.uniform2f(r.uvScale,A.uvScale.x,A.uvScale.y);b.uniform2f(r.uvOffset,A.uvOffset.x,A.uvOffset.y);b.uniform2f(r.alignment,A.alignment.x,A.alignment.y);
-b.uniform1f(r.opacity,A.opacity);b.uniform3f(r.color,A.color.r,A.color.g,A.color.b);b.uniform1f(r.rotation,A.rotation);b.uniform2fv(r.scale,y);if(A.mergeWith3D&&!u){b.enable(b.DEPTH_TEST);u=true}else if(!A.mergeWith3D&&u){b.disable(b.DEPTH_TEST);u=false}c.setBlending(A.blending,A.blendEquation,A.blendSrc,A.blendDst);c.setTexture(A.map,0);b.drawElements(b.TRIANGLES,6,b.UNSIGNED_SHORT,0)}}b.enable(b.CULL_FACE);b.enable(b.DEPTH_TEST);b.depthMask(true)}}};
+b.uniform3f(r.screenPosition,(A.position.x-q)/q,(v-A.position.y)/v,Math.max(0,Math.min(1,A.position.z)))}else{b.uniform1i(r.useScreenCoordinates,0);b.uniform1i(r.affectedByDistance,A.affectedByDistance?1:0);b.uniformMatrix4fv(r.modelViewMatrix,false,A._modelViewMatrix.elements)}f=A.map.image.width/(A.scaleByViewport?o:1);y[0]=f*u*A.scale.x;y[1]=f*A.scale.y;b.uniform2f(r.uvScale,A.uvScale.x,A.uvScale.y);b.uniform2f(r.uvOffset,A.uvOffset.x,A.uvOffset.y);b.uniform2f(r.alignment,A.alignment.x,A.alignment.y);
+b.uniform1f(r.opacity,A.opacity);b.uniform3f(r.color,A.color.r,A.color.g,A.color.b);b.uniform1f(r.rotation,A.rotation);b.uniform2fv(r.scale,y);if(A.mergeWith3D&&!t){b.enable(b.DEPTH_TEST);t=true}else if(!A.mergeWith3D&&t){b.disable(b.DEPTH_TEST);t=false}c.setBlending(A.blending,A.blendEquation,A.blendSrc,A.blendDst);c.setTexture(A.map,0);b.drawElements(b.TRIANGLES,6,b.UNSIGNED_SHORT,0)}}b.enable(b.CULL_FACE);b.enable(b.DEPTH_TEST);b.depthMask(true)}}};
 THREE.DepthPassPlugin=function(){this.enabled=false;this.renderTarget=null;var a,b,c,d,f=new THREE.Frustum,e=new THREE.Matrix4;this.init=function(e){a=e.context;b=e;var e=THREE.ShaderLib.depthRGBA,f=THREE.UniformsUtils.clone(e.uniforms);c=new THREE.ShaderMaterial({fragmentShader:e.fragmentShader,vertexShader:e.vertexShader,uniforms:f});d=new THREE.ShaderMaterial({fragmentShader:e.fragmentShader,vertexShader:e.vertexShader,uniforms:f,morphTargets:true});c._shadowPass=true;d._shadowPass=true};this.render=
 function(a,b){this.enabled&&this.update(a,b)};this.update=function(g,h){var i,j,l,m,n,q;a.clearColor(1,1,1,1);a.disable(a.BLEND);b.setDepthTest(true);b.autoUpdateScene&&g.updateMatrixWorld();if(!h._viewMatrixArray)h._viewMatrixArray=new Float32Array(16);if(!h._projectionMatrixArray)h._projectionMatrixArray=new Float32Array(16);h.matrixWorldInverse.getInverse(h.matrixWorld);h.matrixWorldInverse.flattenToArray(h._viewMatrixArray);h.projectionMatrix.flattenToArray(h._projectionMatrixArray);e.multiply(h.projectionMatrix,
 h.matrixWorldInverse);f.setFromMatrix(e);b.setRenderTarget(this.renderTarget);b.clear();q=g.__webglObjects;i=0;for(j=q.length;i<j;i++){l=q[i];n=l.object;l.render=false;if(n.visible&&(!(n instanceof THREE.Mesh)||!n.frustumCulled||f.contains(n))){n._modelViewMatrix.multiply(h.matrixWorldInverse,n.matrixWorld);l.render=true}}i=0;for(j=q.length;i<j;i++){l=q[i];if(l.render){n=l.object;l=l.buffer;n.material&&b.setMaterialFaces(n.material);m=n.customDepthMaterial?n.customDepthMaterial:n.geometry.morphTargets.length?

+ 8 - 8
examples/webgl_interactive_cubes.html

@@ -57,7 +57,7 @@
 
 				var geometry = new THREE.CubeGeometry( 20, 20, 20 );
 
-				for ( var i = 0; i < 500; i ++ ) {
+				for ( var i = 0; i < 2000; i ++ ) {
 
 					var object = new THREE.Mesh( geometry, new THREE.MeshLambertMaterial( { color: Math.random() * 0xffffff } ) );
 
@@ -69,9 +69,9 @@
 					object.rotation.y = ( Math.random() * 360 ) * Math.PI / 180;
 					object.rotation.z = ( Math.random() * 360 ) * Math.PI / 180;
 
-					object.scale.x = Math.random() * 2 + 1;
-					object.scale.y = Math.random() * 2 + 1;
-					object.scale.z = Math.random() * 2 + 1;
+					object.scale.x = Math.random() + 0.5;
+					object.scale.y = Math.random() + 0.5;
+					object.scale.z = Math.random() + 0.5;
 
 					scene.add( object );
 
@@ -153,17 +153,17 @@
 
 					if ( INTERSECTED != intersects[ 0 ].object ) {
 
-						if ( INTERSECTED ) INTERSECTED.material.color.setHex( INTERSECTED.currentHex );
+						if ( INTERSECTED ) INTERSECTED.material.emissive.setHex( INTERSECTED.currentHex );
 
 						INTERSECTED = intersects[ 0 ].object;
-						INTERSECTED.currentHex = INTERSECTED.material.color.getHex();
-						INTERSECTED.material.color.setHex( 0xff0000 );
+						INTERSECTED.currentHex = INTERSECTED.material.emissive.getHex();
+						INTERSECTED.material.emissive.setHex( 0xff0000 );
 
 					}
 
 				} else {
 
-					if ( INTERSECTED ) INTERSECTED.material.color.setHex( INTERSECTED.currentHex );
+					if ( INTERSECTED ) INTERSECTED.material.emissive.setHex( INTERSECTED.currentHex );
 
 					INTERSECTED = null;
 

+ 148 - 160
src/core/Ray.js

@@ -1,298 +1,286 @@
 /**
  * @author mrdoob / http://mrdoob.com/
  */
-(function(THREE){
-		
+
+( function ( THREE ) {
+
 	THREE.Ray = function ( origin, direction, near, far ) {
-		
+
 		this.origin = origin || new THREE.Vector3();
 		this.direction = direction || new THREE.Vector3();
 		this.near = near || 0;
 		this.far = far || Infinity;
+
 	};
-	
+
 	var originCopy = new THREE.Vector3();
-	
+
 	var localOriginCopy = new THREE.Vector3();
 	var localDirectionCopy = new THREE.Vector3();
-	
+
 	var vector = new THREE.Vector3();
 	var normal = new THREE.Vector3();
 	var intersectPoint = new THREE.Vector3();
-	
+
 	var inverseMatrix = new THREE.Matrix4();
-	
+
 	var descSort = function ( a, b ) {
-	
+
 		return a.distance - b.distance;
-	
+
 	};
-	
-	
+
 	var v0 = new THREE.Vector3(), v1 = new THREE.Vector3(), v2 = new THREE.Vector3();
 
-	
 	var distanceFromIntersection = function ( origin, direction, position ) {
-		var dot, intersect, distance;
-			
+
 		v0.sub( position, origin );
-		dot = v0.dot( direction );
-	
-		intersect = v1.add( origin, v2.copy( direction ).multiplyScalar( dot ) );
-		distance = position.distanceTo( intersect );
-	
+
+		var dot = v0.dot( direction );
+
+		var intersect = v1.add( origin, v2.copy( direction ).multiplyScalar( dot ) );
+		var distance = position.distanceTo( intersect );
+
 		return distance;
-	
+
 	};
-	
+
 	// http://www.blackpawn.com/texts/pointinpoly/default.html
-	
 
-	
 	var pointInFace3 = function ( p, a, b, c ) {
-		
-		var dot00, dot01, dot02, dot11, dot12, invDenom, u, v;
-		
+
 		v0.sub( c, a );
 		v1.sub( b, a );
 		v2.sub( p, a );
-	
-		dot00 = v0.dot( v0 );
-		dot01 = v0.dot( v1 );
-		dot02 = v0.dot( v2 );
-		dot11 = v1.dot( v1 );
-		dot12 = v1.dot( v2 );
-	
-		invDenom = 1 / ( dot00 * dot11 - dot01 * dot01 );
-		u = ( dot11 * dot02 - dot01 * dot12 ) * invDenom;
-		v = ( dot00 * dot12 - dot01 * dot02 ) * invDenom;
-	
+
+		var dot00 = v0.dot( v0 );
+		var dot01 = v0.dot( v1 );
+		var dot02 = v0.dot( v2 );
+		var dot11 = v1.dot( v1 );
+		var dot12 = v1.dot( v2 );
+
+		var invDenom = 1 / ( dot00 * dot11 - dot01 * dot01 );
+		var u = ( dot11 * dot02 - dot01 * dot12 ) * invDenom;
+		var v = ( dot00 * dot12 - dot01 * dot02 ) * invDenom;
+
 		return ( u >= 0 ) && ( v >= 0 ) && ( u + v < 1 );
-	
+
 	};
-	
-	var intersectObject = function(object,ray,intersects){
+
+	var intersectObject = function ( object, ray, intersects ) {
+
 		var distance,intersect;
+
 		if ( object instanceof THREE.Particle ) {
-	
+
 			distance = distanceFromIntersection( ray.origin, ray.direction, object.matrixWorld.getPosition() );
-	
+
 			if ( distance > object.scale.x ) {
-	
-				return [];
-	
+
+				return intersects;
+
 			}
-	
+
 			intersect = {
-	
+
 				distance: distance,
 				point: object.position,
 				face: null,
 				object: object
-	
+
 			};
-	
+
 			intersects.push( intersect );
-	
+
 		} else if ( object instanceof THREE.Mesh ) {
-	
+
 			// Checking boundingSphere
-	
-			//var scale = THREE.Frustum.__v1.set( object.matrixWorld.getColumnX().length(), object.matrixWorld.getColumnY().length(), object.matrixWorld.getColumnZ().length() );
+
 			var scaledRadius = object.geometry.boundingSphere.radius * object.matrixWorld.getMaxScaleOnAxis();
-	
+
 			// Checking distance to ray
-	
+
 			distance = distanceFromIntersection( ray.origin, ray.direction, object.matrixWorld.getPosition() );
-	
+
 			if ( distance > scaledRadius) {
-	
+
 				return intersects;
-	
+
 			}
-	
+
 			// Checking faces
-	
+
 			var f, fl, face, dot, scalar,
 			geometry = object.geometry,
 			vertices = geometry.vertices,
 			objMatrix, geometryMaterials,
 			isFaceMaterial, material, side, point;
-	
+
 			geometryMaterials = object.geometry.materials;
 			isFaceMaterial = object.material instanceof THREE.MeshFaceMaterial;
 			side = object.material.side;
+
 			var a, b, c, d;
 			var precision = ray.precision;
-			
+
 			object.matrixRotationWorld.extractRotation( object.matrixWorld );
-			
+
 			originCopy.copy( ray.origin );
-	
+
 			objMatrix = object.matrixWorld;
-			inverseMatrix.getInverse(objMatrix);
-			
-			localOriginCopy.copy(originCopy);
-			inverseMatrix.multiplyVector3(localOriginCopy);
-			
-			localDirectionCopy.copy(ray.direction);
-			inverseMatrix.rotateAxis(localDirectionCopy).normalize();
-	
+			inverseMatrix.getInverse( objMatrix );
+
+			localOriginCopy.copy( originCopy );
+			inverseMatrix.multiplyVector3( localOriginCopy );
+
+			localDirectionCopy.copy( ray.direction );
+			inverseMatrix.rotateAxis( localDirectionCopy ).normalize();
+
 			for ( f = 0, fl = geometry.faces.length; f < fl; f ++ ) {
-	
+
 				face = geometry.faces[ f ];
-	
+
 				material = isFaceMaterial === true ? geometryMaterials[ face.materialIndex ] : object.material;
 				if ( material === undefined ) continue;
 				side = material.side;
-	
+
 				vector.sub( face.centroid, localOriginCopy );
 				normal = face.normal;
 				dot = localDirectionCopy.dot( normal );
-	
-	
+
 				// bail if ray and plane are parallel
-	
+
 				if ( Math.abs( dot ) < precision ) continue;
-	
+
 				// calc distance to plane
-	
+
 				scalar = normal.dot( vector ) / dot;
-	
+
 				// if negative distance, then plane is behind ray
-	
+
 				if ( scalar < 0 ) continue;
-	
+
 				if ( side === THREE.DoubleSide || ( side === THREE.FrontSide ? dot < 0 : dot > 0 ) ) {
-	
+
 					intersectPoint.add( localOriginCopy, localDirectionCopy.multiplyScalar( scalar ) );
-	
+
 					if ( face instanceof THREE.Face3 ) {
-	
+
 						a = vertices[ face.a ];
 						b = vertices[ face.b ];
 						c = vertices[ face.c ];
-	
+
 						if ( pointInFace3( intersectPoint, a, b, c ) ) {
-	
-							point = object.matrixWorld.multiplyVector3(intersectPoint.clone()); 
-							distance = originCopy.distanceTo( point);
-							
-							if ( distance < ray.near ) continue;
-							if ( distance > ray.far ) continue; 
-							
-							
+
+							point = object.matrixWorld.multiplyVector3( intersectPoint.clone() );
+							distance = originCopy.distanceTo( point );
+
+							if ( distance < ray.near || distance > ray.far ) continue;
+
 							intersect = {
-	
+
 								distance: distance,
 								point: point,
 								face: face,
 								faceIndex: f,
 								object: object
-	
+
 							};
-	
+
 							intersects.push( intersect );
-	
+
 						}
-	
+
 					} else if ( face instanceof THREE.Face4 ) {
-	
+
 						a = vertices[ face.a ];
 						b = vertices[ face.b ];
 						c = vertices[ face.c ];
 						d = vertices[ face.d ];
-	
+
 						if ( pointInFace3( intersectPoint, a, b, d ) || pointInFace3( intersectPoint, b, c, d ) ) {
-	
-							point = object.matrixWorld.multiplyVector3(intersectPoint.clone()); 
-							distance = originCopy.distanceTo( point);
-							
-							if ( distance < ray.near ) continue;
-							if ( distance > ray.far ) continue; 
-							
+
+							point = object.matrixWorld.multiplyVector3( intersectPoint.clone() );
+							distance = originCopy.distanceTo( point );
+
+							if ( distance < ray.near || distance > ray.far ) continue;
+
 							intersect = {
-	
+
 								distance: distance,
 								point: point,
 								face: face,
 								faceIndex: f,
 								object: object
-	
+
 							};
-	
+
 							intersects.push( intersect );
-	
+
 						}
-	
+
 					}
-	
+
 				}
-	
+
 			}
-	
+
 		}
-		
+
 	};
-	
-	var intersectDescendants= function(object,ray,intersects){
+
+	var intersectDescendants= function ( object, ray, intersects ) {
+
 		var descendants = object.getDescendants();
-		var length = descendants.length;
-		for ( var i = 0; i < length; i ++ ) {
-	
-			intersectObject(descendants[i],this,intersects);
-	
+
+		for ( var i = 0, l = descendants.length; i < l; i ++ ) {
+
+			intersectObject( descendants[ i ], this, intersects );
+
 		}
 	};
-	
+
 	//
-	
+
 	THREE.Ray.prototype.precision = 0.0001;
-/*
-	This has deemed to be unnessecary
-	THREE.Ray.prototype.setPrecision = function ( value ) {
-		
-		this.precision = value;
-		
-	};*/
-		
+
 	THREE.Ray.prototype.intersectObject = function ( object, recursive ) {
-	
+
 		var intersects = [];
-	
+
 		if ( recursive === true ) {
-			
-			intersectDescendants(object,this,intersects);
-	
+
+			intersectDescendants( object, this, intersects );
+
 		}
-	
+
 		intersectObject(object,this,intersects);
-	
+
 		intersects.sort( descSort );
-	
+
 		return intersects;
-	
+
 	};
-	
+
 	THREE.Ray.prototype.intersectObjects = function ( objects, recursive ) {
-	
+
 		var intersects = [];
-	
+
 		for ( var i = 0, l = objects.length; i < l; i ++ ) {
-			
-			intersectObject(objects[i],this,intersects);
-	
-			if ( recursive === true ) { 
-				
-				intersectDescendants(objects[i],this,intersects);
-	
+
+			intersectObject( objects[ i ], this, intersects );
+
+			if ( recursive === true ) {
+
+				intersectDescendants( objects[ i ], this, intersects );
+
 			}
 		}
-	
+
 		intersects.sort( descSort );
-	
+
 		return intersects;
-	
+
 	};
-	
-}(THREE));
+
+}( THREE ) );