浏览代码

Fixed SceneLoader handling of cube textures (that got broken with recent ImageUtils changes).

alteredq 13 年之前
父节点
当前提交
168aab5e8a
共有 4 个文件被更改,包括 178 次插入160 次删除
  1. 60 59
      build/Three.js
  2. 38 37
      build/custom/ThreeCanvas.js
  3. 17 16
      build/custom/ThreeWebGL.js
  4. 63 48
      src/loaders/SceneLoader.js

+ 60 - 59
build/Three.js

@@ -29,9 +29,9 @@ THREE.EventTarget=function(){var a={};this.addEventListener=function(b,c){a[b]==
 THREE.Frustum.prototype.setFromMatrix=function(a){var b,c=this.planes,d=a.elements,a=d[0];b=d[1];var e=d[2],f=d[3],g=d[4],h=d[5],i=d[6],j=d[7],l=d[8],o=d[9],m=d[10],p=d[11],r=d[12],n=d[13],q=d[14],d=d[15];c[0].set(f-a,j-g,p-l,d-r);c[1].set(f+a,j+g,p+l,d+r);c[2].set(f+b,j+h,p+o,d+n);c[3].set(f-b,j-h,p-o,d-n);c[4].set(f-e,j-i,p-m,d-q);c[5].set(f+e,j+i,p+m,d+q);for(a=0;a<6;a++){b=c[a];b.divideScalar(Math.sqrt(b.x*b.x+b.y*b.y+b.z*b.z))}};
 THREE.Frustum.prototype.contains=function(a){for(var b=this.planes,c=a.matrixWorld,d=c.elements,c=-a.geometry.boundingSphere.radius*c.getMaxScaleOnAxis(),e=0;e<6;e++){a=b[e].x*d[12]+b[e].y*d[13]+b[e].z*d[14]+b[e].w;if(a<=c)return false}return true};THREE.Frustum.__v1=new THREE.Vector3;
 THREE.Ray=function(a,b,c,d){this.origin=a||new THREE.Vector3;this.direction=b||new THREE.Vector3;this.near=c||0;this.far=d||Infinity;var e=new THREE.Vector3,f=new THREE.Vector3,g=new THREE.Vector3,h=new THREE.Vector3,i=new THREE.Vector3,j=new THREE.Vector3,l=new THREE.Vector3,o=new THREE.Vector3,m=new THREE.Vector3,p=function(a,b){return a.distance-b.distance},r=new THREE.Vector3,n=new THREE.Vector3,q=new THREE.Vector3,t,u,w,s=function(a,b,c){r.sub(c,a);t=r.dot(b);u=n.add(a,q.copy(b).multiplyScalar(t));
-return w=c.distanceTo(u)},x,F,C,z,v,H,I,N,R=function(a,b,c,d){r.sub(d,b);n.sub(c,b);q.sub(a,b);x=r.dot(r);F=r.dot(n);C=r.dot(q);z=n.dot(n);v=n.dot(q);H=1/(x*z-F*F);I=(z*C-F*v)*H;N=(x*v-F*C)*H;return I>=0&&N>=0&&I+N<1},X=1.0E-4;this.setPrecision=function(a){X=a};this.intersectObject=function(a){var b,c=[];if(a instanceof THREE.Particle){w=s(this.origin,this.direction,a.matrixWorld.getPosition());if(w>a.scale.x)return[];b={distance:w,point:a.position,face:null,object:a};c.push(b)}else if(a instanceof
+return w=c.distanceTo(u)},x,F,C,z,v,H,I,N,R=function(a,b,c,d){r.sub(d,b);n.sub(c,b);q.sub(a,b);x=r.dot(r);F=r.dot(n);C=r.dot(q);z=n.dot(n);v=n.dot(q);H=1/(x*z-F*F);I=(z*C-F*v)*H;N=(x*v-F*C)*H;return I>=0&&N>=0&&I+N<1},Y=1.0E-4;this.setPrecision=function(a){Y=a};this.intersectObject=function(a){var b,c=[];if(a instanceof THREE.Particle){w=s(this.origin,this.direction,a.matrixWorld.getPosition());if(w>a.scale.x)return[];b={distance:w,point:a.position,face:null,object:a};c.push(b)}else if(a instanceof
 THREE.Mesh){var d=THREE.Frustum.__v1.set(a.matrixWorld.getColumnX().length(),a.matrixWorld.getColumnY().length(),a.matrixWorld.getColumnZ().length()),d=a.geometry.boundingSphere.radius*Math.max(d.x,Math.max(d.y,d.z));w=s(this.origin,this.direction,a.matrixWorld.getPosition());if(w>d)return c;var k,n,r,q=a.geometry,t=q.vertices,u;a.matrixRotationWorld.extractRotation(a.matrixWorld);d=0;for(k=q.faces.length;d<k;d++){b=q.faces[d];i.copy(this.origin);j.copy(this.direction);u=a.matrixWorld;l=u.multiplyVector3(l.copy(b.centroid)).subSelf(i);
-o=a.matrixRotationWorld.multiplyVector3(o.copy(b.normal));n=j.dot(o);if(!(Math.abs(n)<X)){r=o.dot(l)/n;if(!(r<0)&&(a.doubleSided||(a.flipSided?n>0:n<0))){m.add(i,j.multiplyScalar(r));w=i.distanceTo(m);if(!(w<this.near)&&!(w>this.far))if(b instanceof THREE.Face3){e=u.multiplyVector3(e.copy(t[b.a]));f=u.multiplyVector3(f.copy(t[b.b]));g=u.multiplyVector3(g.copy(t[b.c]));if(R(m,e,f,g)){b={distance:w,point:m.clone(),face:b,object:a};c.push(b)}}else if(b instanceof THREE.Face4){e=u.multiplyVector3(e.copy(t[b.a]));
+o=a.matrixRotationWorld.multiplyVector3(o.copy(b.normal));n=j.dot(o);if(!(Math.abs(n)<Y)){r=o.dot(l)/n;if(!(r<0)&&(a.doubleSided||(a.flipSided?n>0:n<0))){m.add(i,j.multiplyScalar(r));w=i.distanceTo(m);if(!(w<this.near)&&!(w>this.far))if(b instanceof THREE.Face3){e=u.multiplyVector3(e.copy(t[b.a]));f=u.multiplyVector3(f.copy(t[b.b]));g=u.multiplyVector3(g.copy(t[b.c]));if(R(m,e,f,g)){b={distance:w,point:m.clone(),face:b,object:a};c.push(b)}}else if(b instanceof THREE.Face4){e=u.multiplyVector3(e.copy(t[b.a]));
 f=u.multiplyVector3(f.copy(t[b.b]));g=u.multiplyVector3(g.copy(t[b.c]));h=u.multiplyVector3(h.copy(t[b.d]));if(R(m,e,f,h)||R(m,f,g,h)){b={distance:w,point:m.clone(),face:b,object:a};c.push(b)}}}}}}c.sort(p);return c};this.intersectObjects=function(a){for(var b=[],c=0,d=a.length;c<d;c++)Array.prototype.push.apply(b,this.intersectObject(a[c]));b.sort(p);return b}};
 THREE.Rectangle=function(){function a(){f=d-b;g=e-c}var b,c,d,e,f,g,h=true;this.getX=function(){return b};this.getY=function(){return c};this.getWidth=function(){return f};this.getHeight=function(){return g};this.getLeft=function(){return b};this.getTop=function(){return c};this.getRight=function(){return d};this.getBottom=function(){return e};this.set=function(f,g,l,o){h=false;b=f;c=g;d=l;e=o;a()};this.addPoint=function(f,g){if(h){h=false;b=f;c=g;d=f;e=g}else{b=b<f?b:f;c=c<g?c:g;d=d>f?d:f;e=e>g?
 e:g}a()};this.add3Points=function(f,g,l,o,m,p){if(h){h=false;b=f<l?f<m?f:m:l<m?l:m;c=g<o?g<p?g:p:o<p?o:p;d=f>l?f>m?f:m:l>m?l:m;e=g>o?g>p?g:p:o>p?o:p}else{b=f<l?f<m?f<b?f:b:m<b?m:b:l<m?l<b?l:b:m<b?m:b;c=g<o?g<p?g<c?g:c:p<c?p:c:o<p?o<c?o:c:p<c?p:c;d=f>l?f>m?f>d?f:d:m>d?m:d:l>m?l>d?l:d:m>d?m:d;e=g>o?g>p?g>e?g:e:p>e?p:e:o>p?o>e?o:e:p>e?p:e}a()};this.addRectangle=function(f){if(h){h=false;b=f.getLeft();c=f.getTop();d=f.getRight();e=f.getBottom()}else{b=b<f.getLeft()?b:f.getLeft();c=c<f.getTop()?c:f.getTop();
@@ -41,7 +41,7 @@ THREE.Matrix3.prototype={constructor:THREE.Matrix3,getInverse:function(a){var b=
 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,e,f,g,h,i,j,l,o,m,p,r,n){this.elements=new Float32Array(16);this.set(a!==void 0?a:1,b||0,c||0,d||0,e||0,f!==void 0?f:1,g||0,h||0,i||0,j||0,l!==void 0?l:1,o||0,m||0,p||0,r||0,n!==void 0?n:1)};
 THREE.Matrix4.prototype={constructor:THREE.Matrix4,set:function(a,b,c,d,e,f,g,h,i,j,l,o,m,p,r,n){var q=this.elements;q[0]=a;q[4]=b;q[8]=c;q[12]=d;q[1]=e;q[5]=f;q[9]=g;q[13]=h;q[2]=i;q[6]=j;q[10]=l;q[14]=o;q[3]=m;q[7]=p;q[11]=r;q[15]=n;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,
 e=THREE.Matrix4.__v1,f=THREE.Matrix4.__v2,g=THREE.Matrix4.__v3;g.sub(a,b).normalize();if(g.length()===0)g.z=1;e.cross(c,g).normalize();if(e.length()===0){g.x=g.x+1.0E-4;e.cross(c,g).normalize()}f.cross(g,e);d[0]=e.x;d[4]=f.x;d[8]=g.x;d[1]=e.y;d[5]=f.y;d[9]=g.y;d[2]=e.z;d[6]=f.z;d[10]=g.z;return this},multiply:function(a,b){var c=a.elements,d=b.elements,e=this.elements,f=c[0],g=c[4],h=c[8],i=c[12],j=c[1],l=c[5],o=c[9],m=c[13],p=c[2],r=c[6],n=c[10],q=c[14],t=c[3],u=c[7],w=c[11],c=c[15],s=d[0],x=d[4],
-F=d[8],C=d[12],z=d[1],v=d[5],H=d[9],I=d[13],N=d[2],R=d[6],X=d[10],B=d[14],G=d[3],Q=d[7],D=d[11],d=d[15];e[0]=f*s+g*z+h*N+i*G;e[4]=f*x+g*v+h*R+i*Q;e[8]=f*F+g*H+h*X+i*D;e[12]=f*C+g*I+h*B+i*d;e[1]=j*s+l*z+o*N+m*G;e[5]=j*x+l*v+o*R+m*Q;e[9]=j*F+l*H+o*X+m*D;e[13]=j*C+l*I+o*B+m*d;e[2]=p*s+r*z+n*N+q*G;e[6]=p*x+r*v+n*R+q*Q;e[10]=p*F+r*H+n*X+q*D;e[14]=p*C+r*I+n*B+q*d;e[3]=t*s+u*z+w*N+c*G;e[7]=t*x+u*v+w*R+c*Q;e[11]=t*F+u*H+w*X+c*D;e[15]=t*C+u*I+w*B+c*d;return this},multiplySelf:function(a){return this.multiply(this,
+F=d[8],C=d[12],z=d[1],v=d[5],H=d[9],I=d[13],N=d[2],R=d[6],Y=d[10],B=d[14],G=d[3],Q=d[7],D=d[11],d=d[15];e[0]=f*s+g*z+h*N+i*G;e[4]=f*x+g*v+h*R+i*Q;e[8]=f*F+g*H+h*Y+i*D;e[12]=f*C+g*I+h*B+i*d;e[1]=j*s+l*z+o*N+m*G;e[5]=j*x+l*v+o*R+m*Q;e[9]=j*F+l*H+o*Y+m*D;e[13]=j*C+l*I+o*B+m*d;e[2]=p*s+r*z+n*N+q*G;e[6]=p*x+r*v+n*R+q*Q;e[10]=p*F+r*H+n*Y+q*D;e[14]=p*C+r*I+n*B+q*d;e[3]=t*s+u*z+w*N+c*G;e[7]=t*x+u*v+w*R+c*Q;e[11]=t*F+u*H+w*Y+c*D;e[15]=t*C+u*I+w*B+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,e=a.z,f=1/(b[3]*c+b[7]*d+b[11]*e+b[15]);a.x=(b[0]*c+b[4]*d+b[8]*e+b[12])*f;a.y=(b[1]*c+b[5]*d+b[9]*e+b[13])*f;a.z=(b[2]*c+b[6]*d+b[10]*e+b[14])*f;return a},multiplyVector4:function(a){var b=this.elements,c=a.x,d=a.y,e=a.z,f=a.w;a.x=b[0]*c+b[4]*d+b[8]*e+b[12]*f;a.y=b[1]*c+b[5]*d+b[9]*e+b[13]*f;a.z=b[2]*c+b[6]*d+b[10]*e+b[14]*f;a.w=b[3]*c+b[7]*d+b[11]*e+b[15]*f;return a},rotateAxis:function(a){var b=this.elements,c=a.x,
 d=a.y,e=a.z;a.x=c*b[0]+d*b[4]+e*b[8];a.y=c*b[1]+d*b[5]+e*b[9];a.z=c*b[2]+d*b[6]+e*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]*a.z+b[15]*a.w:1;return c},determinant:function(){var a=this.elements,b=a[0],c=a[4],d=a[8],e=a[12],f=a[1],g=a[5],h=a[9],i=a[13],j=a[2],l=a[6],o=a[10],m=a[14],p=a[3],r=a[7],
@@ -73,13 +73,13 @@ this.matrix):this.matrixWorld.copy(this.matrix);this.matrixWorldNeedsUpdate=fals
 THREE.Projector=function(){function a(){var a=g[f]=g[f]||new THREE.RenderableObject;f++;return a}function b(){var a=j[i]=j[i]||new THREE.RenderableVertex;i++;return a}function c(a,b){return b.z-a.z}function d(a,b){var c=0,d=1,e=a.z+a.w,f=b.z+b.w,g=-a.z+a.w,h=-b.z+b.w;if(e>=0&&f>=0&&g>=0&&h>=0)return true;if(e<0&&f<0||g<0&&h<0)return false;e<0?c=Math.max(c,e/(e-f)):f<0&&(d=Math.min(d,e/(e-f)));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 e,f,g=[],h,i,j=[],l,o,m=[],p,r=[],n,q,t=[],u,w,s=[],x={objects:[],sprites:[],lights:[],elements:[]},F=new THREE.Vector3,C=new THREE.Vector4,z=new THREE.Matrix4,v=new THREE.Matrix4,H=new THREE.Frustum,I=new THREE.Vector4,N=new THREE.Vector4;this.projectVector=function(a,b){b.matrixWorldInverse.getInverse(b.matrixWorld);z.multiply(b.projectionMatrix,b.matrixWorldInverse);z.multiplyVector3(a);return a};this.unprojectVector=function(a,b){b.projectionMatrixInverse.getInverse(b.projectionMatrix);
 z.multiply(b.matrixWorld,b.projectionMatrixInverse);z.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.projectGraph=function(b,d){f=0;x.objects.length=0;x.sprites.length=0;x.lights.length=0;var g=function(b){if(b.visible!==false){if((b instanceof THREE.Mesh||b instanceof THREE.Line)&&(b.frustumCulled===false||H.contains(b))){F.copy(b.matrixWorld.getPosition());
-z.multiplyVector3(F);e=a();e.object=b;e.z=F.z;x.objects.push(e)}else if(b instanceof THREE.Sprite||b instanceof THREE.Particle){F.copy(b.matrixWorld.getPosition());z.multiplyVector3(F);e=a();e.object=b;e.z=F.z;x.sprites.push(e)}else b instanceof THREE.Light&&x.lights.push(b);for(var c=0,d=b.children.length;c<d;c++)g(b.children[c])}};g(b);d&&x.objects.sort(c);return x};this.projectScene=function(a,e,f){var g=e.near,F=e.far,D=false,k,P,M,S,aa,K,ca,fa,O,Z,$,Y,ha,Sa,La;w=q=p=o=0;x.elements.length=0;if(e.parent===
-void 0){console.warn("DEPRECATED: Camera hasn't been added to a Scene. Adding it...");a.add(e)}a.updateMatrixWorld();e.matrixWorldInverse.getInverse(e.matrixWorld);z.multiply(e.projectionMatrix,e.matrixWorldInverse);H.setFromMatrix(z);x=this.projectGraph(a,false);a=0;for(k=x.objects.length;a<k;a++){O=x.objects[a].object;Z=O.matrixWorld;i=0;if(O instanceof THREE.Mesh){$=O.geometry;Y=O.geometry.materials;S=$.vertices;ha=$.faces;Sa=$.faceVertexUvs;$=O.matrixRotationWorld.extractRotation(Z);P=0;for(M=
+z.multiplyVector3(F);e=a();e.object=b;e.z=F.z;x.objects.push(e)}else if(b instanceof THREE.Sprite||b instanceof THREE.Particle){F.copy(b.matrixWorld.getPosition());z.multiplyVector3(F);e=a();e.object=b;e.z=F.z;x.sprites.push(e)}else b instanceof THREE.Light&&x.lights.push(b);for(var c=0,d=b.children.length;c<d;c++)g(b.children[c])}};g(b);d&&x.objects.sort(c);return x};this.projectScene=function(a,e,f){var g=e.near,F=e.far,D=false,k,P,M,S,aa,K,ca,fa,O,Z,$,X,ha,Sa,La;w=q=p=o=0;x.elements.length=0;if(e.parent===
+void 0){console.warn("DEPRECATED: Camera hasn't been added to a Scene. Adding it...");a.add(e)}a.updateMatrixWorld();e.matrixWorldInverse.getInverse(e.matrixWorld);z.multiply(e.projectionMatrix,e.matrixWorldInverse);H.setFromMatrix(z);x=this.projectGraph(a,false);a=0;for(k=x.objects.length;a<k;a++){O=x.objects[a].object;Z=O.matrixWorld;i=0;if(O instanceof THREE.Mesh){$=O.geometry;X=O.geometry.materials;S=$.vertices;ha=$.faces;Sa=$.faceVertexUvs;$=O.matrixRotationWorld.extractRotation(Z);P=0;for(M=
 S.length;P<M;P++){h=b();h.positionWorld.copy(S[P]);Z.multiplyVector3(h.positionWorld);h.positionScreen.copy(h.positionWorld);z.multiplyVector4(h.positionScreen);h.positionScreen.x=h.positionScreen.x/h.positionScreen.w;h.positionScreen.y=h.positionScreen.y/h.positionScreen.w;h.visible=h.positionScreen.z>g&&h.positionScreen.z<F}S=0;for(P=ha.length;S<P;S++){M=ha[S];if(M instanceof THREE.Face3){aa=j[M.a];K=j[M.b];ca=j[M.c];if(aa.visible&&K.visible&&ca.visible){D=(ca.positionScreen.x-aa.positionScreen.x)*
 (K.positionScreen.y-aa.positionScreen.y)-(ca.positionScreen.y-aa.positionScreen.y)*(K.positionScreen.x-aa.positionScreen.x)<0;if(O.doubleSided||D!=O.flipSided){fa=m[o]=m[o]||new THREE.RenderableFace3;o++;l=fa;l.v1.copy(aa);l.v2.copy(K);l.v3.copy(ca)}else continue}else continue}else if(M instanceof THREE.Face4){aa=j[M.a];K=j[M.b];ca=j[M.c];fa=j[M.d];if(aa.visible&&K.visible&&ca.visible&&fa.visible){D=(fa.positionScreen.x-aa.positionScreen.x)*(K.positionScreen.y-aa.positionScreen.y)-(fa.positionScreen.y-
 aa.positionScreen.y)*(K.positionScreen.x-aa.positionScreen.x)<0||(K.positionScreen.x-ca.positionScreen.x)*(fa.positionScreen.y-ca.positionScreen.y)-(K.positionScreen.y-ca.positionScreen.y)*(fa.positionScreen.x-ca.positionScreen.x)<0;if(O.doubleSided||D!=O.flipSided){La=r[p]=r[p]||new THREE.RenderableFace4;p++;l=La;l.v1.copy(aa);l.v2.copy(K);l.v3.copy(ca);l.v4.copy(fa)}else continue}else continue}l.normalWorld.copy(M.normal);!D&&(O.flipSided||O.doubleSided)&&l.normalWorld.negate();$.multiplyVector3(l.normalWorld);
-l.centroidWorld.copy(M.centroid);Z.multiplyVector3(l.centroidWorld);l.centroidScreen.copy(l.centroidWorld);z.multiplyVector3(l.centroidScreen);ca=M.vertexNormals;aa=0;for(K=ca.length;aa<K;aa++){fa=l.vertexNormalsWorld[aa];fa.copy(ca[aa]);!D&&(O.flipSided||O.doubleSided)&&fa.negate();$.multiplyVector3(fa)}aa=0;for(K=Sa.length;aa<K;aa++)if(La=Sa[aa][S]){ca=0;for(fa=La.length;ca<fa;ca++)l.uvs[aa][ca]=La[ca]}l.material=O.material;l.faceMaterial=M.materialIndex!==null?Y[M.materialIndex]:null;l.z=l.centroidScreen.z;
-x.elements.push(l)}}else if(O instanceof THREE.Line){v.multiply(z,Z);S=O.geometry.vertices;aa=b();aa.positionScreen.copy(S[0]);v.multiplyVector4(aa.positionScreen);Z=O.type===THREE.LinePieces?2:1;P=1;for(M=S.length;P<M;P++){aa=b();aa.positionScreen.copy(S[P]);v.multiplyVector4(aa.positionScreen);if(!((P+1)%Z>0)){K=j[i-2];I.copy(aa.positionScreen);N.copy(K.positionScreen);if(d(I,N)){I.multiplyScalar(1/I.w);N.multiplyScalar(1/N.w);Y=t[q]=t[q]||new THREE.RenderableLine;q++;n=Y;n.v1.positionScreen.copy(I);
+l.centroidWorld.copy(M.centroid);Z.multiplyVector3(l.centroidWorld);l.centroidScreen.copy(l.centroidWorld);z.multiplyVector3(l.centroidScreen);ca=M.vertexNormals;aa=0;for(K=ca.length;aa<K;aa++){fa=l.vertexNormalsWorld[aa];fa.copy(ca[aa]);!D&&(O.flipSided||O.doubleSided)&&fa.negate();$.multiplyVector3(fa)}aa=0;for(K=Sa.length;aa<K;aa++)if(La=Sa[aa][S]){ca=0;for(fa=La.length;ca<fa;ca++)l.uvs[aa][ca]=La[ca]}l.material=O.material;l.faceMaterial=M.materialIndex!==null?X[M.materialIndex]:null;l.z=l.centroidScreen.z;
+x.elements.push(l)}}else if(O instanceof THREE.Line){v.multiply(z,Z);S=O.geometry.vertices;aa=b();aa.positionScreen.copy(S[0]);v.multiplyVector4(aa.positionScreen);Z=O.type===THREE.LinePieces?2:1;P=1;for(M=S.length;P<M;P++){aa=b();aa.positionScreen.copy(S[P]);v.multiplyVector4(aa.positionScreen);if(!((P+1)%Z>0)){K=j[i-2];I.copy(aa.positionScreen);N.copy(K.positionScreen);if(d(I,N)){I.multiplyScalar(1/I.w);N.multiplyScalar(1/N.w);X=t[q]=t[q]||new THREE.RenderableLine;q++;n=X;n.v1.positionScreen.copy(I);
 n.v2.positionScreen.copy(N);n.z=Math.max(I.z,N.z);n.material=O.material;x.elements.push(n)}}}}}a=0;for(k=x.sprites.length;a<k;a++){O=x.sprites[a].object;Z=O.matrixWorld;if(O instanceof THREE.Particle){C.set(Z.elements[12],Z.elements[13],Z.elements[14],1);z.multiplyVector4(C);C.z=C.z/C.w;if(C.z>0&&C.z<1){g=s[w]=s[w]||new THREE.RenderableParticle;w++;u=g;u.x=C.x/C.w;u.y=C.y/C.w;u.z=C.z;u.rotation=O.rotation.z;u.scale.x=O.scale.x*Math.abs(u.x-(C.x+e.projectionMatrix.elements[0])/(C.w+e.projectionMatrix.elements[12]));
 u.scale.y=O.scale.y*Math.abs(u.y-(C.y+e.projectionMatrix.elements[5])/(C.w+e.projectionMatrix.elements[13]));u.material=O.material;x.elements.push(u)}}}f&&x.elements.sort(c);return x}};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=b||"XYZ",d=Math.cos(a.x/2),e=Math.cos(a.y/2),f=Math.cos(a.z/2),g=Math.sin(a.x/2),h=Math.sin(a.y/2),i=Math.sin(a.z/2);switch(c){case "YXZ":this.x=g*e*f+d*h*i;this.y=d*h*f-g*e*i;this.z=d*e*i-g*h*f;this.w=d*e*f+g*h*i;break;case "ZXY":this.x=g*e*f-d*h*i;this.y=d*h*f+g*e*
@@ -104,9 +104,9 @@ for(b=this.vertices.length;a<b;a++)d[a].normalize();a=0;for(b=this.faces.length;
 e.__originalFaceNormal.copy(e.normal):e.__originalFaceNormal=e.normal.clone();if(!e.__originalVertexNormals)e.__originalVertexNormals=[];a=0;for(b=e.vertexNormals.length;a<b;a++)e.__originalVertexNormals[a]?e.__originalVertexNormals[a].copy(e.vertexNormals[a]):e.__originalVertexNormals[a]=e.vertexNormals[a].clone()}var f=new THREE.Geometry;f.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++){e=this.faces[c];i=new THREE.Vector3;j=e 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];f.vertices=this.morphTargets[a].vertices;f.computeFaceNormals();f.computeVertexNormals();c=0;for(d=this.faces.length;c<d;c++){e=this.faces[c];
 i=g.faceNormals[c];j=g.vertexNormals[c];i.copy(e.normal);if(e instanceof THREE.Face3){j.a.copy(e.vertexNormals[0]);j.b.copy(e.vertexNormals[1]);j.c.copy(e.vertexNormals[2])}else{j.a.copy(e.vertexNormals[0]);j.b.copy(e.vertexNormals[1]);j.c.copy(e.vertexNormals[2]);j.d.copy(e.vertexNormals[3])}}}c=0;for(d=this.faces.length;c<d;c++){e=this.faces[c];e.normal=e.__originalFaceNormal;e.vertexNormals=e.__originalVertexNormals}},computeTangents:function(){function a(a,b,c,d,e,f,z){h=a.vertices[b];i=a.vertices[c];
-j=a.vertices[d];l=g[e];o=g[f];m=g[z];p=i.x-h.x;r=j.x-h.x;n=i.y-h.y;q=j.y-h.y;t=i.z-h.z;u=j.z-h.z;w=o.u-l.u;s=m.u-l.u;x=o.v-l.v;F=m.v-l.v;C=1/(w*F-s*x);I.set((F*p-x*r)*C,(F*n-x*q)*C,(F*t-x*u)*C);N.set((w*r-s*p)*C,(w*q-s*n)*C,(w*u-s*t)*C);v[b].addSelf(I);v[c].addSelf(I);v[d].addSelf(I);H[b].addSelf(N);H[c].addSelf(N);H[d].addSelf(N)}var b,c,d,e,f,g,h,i,j,l,o,m,p,r,n,q,t,u,w,s,x,F,C,z,v=[],H=[],I=new THREE.Vector3,N=new THREE.Vector3,R=new THREE.Vector3,X=new THREE.Vector3,B=new THREE.Vector3;b=0;for(c=
+j=a.vertices[d];l=g[e];o=g[f];m=g[z];p=i.x-h.x;r=j.x-h.x;n=i.y-h.y;q=j.y-h.y;t=i.z-h.z;u=j.z-h.z;w=o.u-l.u;s=m.u-l.u;x=o.v-l.v;F=m.v-l.v;C=1/(w*F-s*x);I.set((F*p-x*r)*C,(F*n-x*q)*C,(F*t-x*u)*C);N.set((w*r-s*p)*C,(w*q-s*n)*C,(w*u-s*t)*C);v[b].addSelf(I);v[c].addSelf(I);v[d].addSelf(I);H[b].addSelf(N);H[c].addSelf(N);H[d].addSelf(N)}var b,c,d,e,f,g,h,i,j,l,o,m,p,r,n,q,t,u,w,s,x,F,C,z,v=[],H=[],I=new THREE.Vector3,N=new THREE.Vector3,R=new THREE.Vector3,Y=new THREE.Vector3,B=new THREE.Vector3;b=0;for(c=
 this.vertices.length;b<c;b++){v[b]=new THREE.Vector3;H[b]=new THREE.Vector3}b=0;for(c=this.faces.length;b<c;b++){f=this.faces[b];g=this.faceVertexUvs[0][b];if(f instanceof THREE.Face3)a(this,f.a,f.b,f.c,0,1,2);else if(f instanceof THREE.Face4){a(this,f.a,f.b,f.d,0,1,3);a(this,f.b,f.c,f.d,1,2,3)}}var G=["a","b","c","d"];b=0;for(c=this.faces.length;b<c;b++){f=this.faces[b];for(d=0;d<f.vertexNormals.length;d++){B.copy(f.vertexNormals[d]);e=f[G[d]];z=v[e];R.copy(z);R.subSelf(B.multiplyScalar(B.dot(z))).normalize();
-X.cross(f.vertexNormals[d],z);e=X.dot(H[e]);e=e<0?-1:1;f.vertexTangents[d]=new THREE.Vector4(R.x,R.y,R.z,e)}}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,e=this.vertices.length;d<e;d++){a=this.vertices[d];if(a.x<b.x)b.x=a.x;else if(a.x>c.x)c.x=
+Y.cross(f.vertexNormals[d],z);e=Y.dot(H[e]);e=e<0?-1:1;f.vertexTangents[d]=new THREE.Vector4(R.x,R.y,R.z,e)}}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,e=this.vertices.length;d<e;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(){if(!this.boundingSphere)this.boundingSphere={radius:0};for(var a,b=0,c=0,d=this.vertices.length;c<d;c++){a=this.vertices[c].length();a>b&&(b=a)}this.boundingSphere.radius=b},mergeVertices:function(){var a={},b=[],c=[],d,e=Math.pow(10,4),f,g,h;f=0;for(g=this.vertices.length;f<g;f++){d=this.vertices[f];d=[Math.round(d.x*
 e),Math.round(d.y*e),Math.round(d.z*e)].join("_");if(a[d]===void 0){a[d]=f;b.push(this.vertices[f]);c[f]=b.length-1}else c[f]=c[a[d]]}f=0;for(g=this.faces.length;f<g;f++){e=this.faces[f];if(e instanceof THREE.Face3){e.a=c[e.a];e.b=c[e.b];e.c=c[e.c]}else if(e instanceof THREE.Face4){e.a=c[e.a];e.b=c[e.b];e.c=c[e.c];e.d=c[e.d];d=[e.a,e.b,e.c,e.d];for(a=3;a>0;a--)if(d.indexOf(e["abcd"[a]])!=a){d.splice(a,1);this.faces[f]=new THREE.Face3(d[0],d[1],d[2]);e=0;for(d=this.faceVertexUvs.length;e<d;e++)(h=
 this.faceVertexUvs[e][f])&&h.splice(a,1);break}}}c=this.vertices.length-b.length;this.vertices=b;return c}};THREE.GeometryCount=0;
@@ -136,12 +136,12 @@ THREE.BinaryLoader.prototype=new THREE.Loader;THREE.BinaryLoader.prototype.const
 THREE.BinaryLoader.prototype.loadAjaxJSON=function(a,b,c,d,e,f){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,e,d,f)}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,e){var f=new XMLHttpRequest,g=c+"/"+a.buffers,h=0;f.onreadystatechange=function(){if(f.readyState==4)f.status==200||f.status==0?THREE.BinaryLoader.prototype.createBinModel(f.response,b,d,a.materials):console.error("THREE.BinaryLoader: Couldn't load ["+g+"] ["+f.status+"]");else if(f.readyState==3){if(e){h==0&&(h=f.getResponseHeader("Content-Length"));e({total:h,loaded:f.responseText.length})}}else f.readyState==2&&(h=f.getResponseHeader("Content-Length"))};
 f.open("GET",g,true);f.responseType="arraybuffer";f.send(null)};
-THREE.BinaryLoader.prototype.createBinModel=function(a,b,c,d){var e=function(b){var c,e,i,j,l,o,m,p,r,n,q,t,u,w,s;function x(a){return a%4?4-a%4:0}function F(a,b){return(new Uint8Array(a,b,1))[0]}function C(a,b){return(new Uint32Array(a,b,1))[0]}function z(b,c){var d,e,f,g,h,k,i,j,l=new Uint32Array(a,c,3*b);for(d=0;d<b;d++){e=l[d*3];f=l[d*3+1];g=l[d*3+2];h=Q[e*2];e=Q[e*2+1];k=Q[f*2];i=Q[f*2+1];f=Q[g*2];j=Q[g*2+1];g=X.faceVertexUvs[0];var m=[];m.push(new THREE.UV(h,e));m.push(new THREE.UV(k,i));m.push(new THREE.UV(f,
-j));g.push(m)}}function v(b,c){var d,e,f,g,h,k,i,j,l,m,n=new Uint32Array(a,c,4*b);for(d=0;d<b;d++){e=n[d*4];f=n[d*4+1];g=n[d*4+2];h=n[d*4+3];k=Q[e*2];e=Q[e*2+1];i=Q[f*2];l=Q[f*2+1];j=Q[g*2];m=Q[g*2+1];g=Q[h*2];f=Q[h*2+1];h=X.faceVertexUvs[0];var o=[];o.push(new THREE.UV(k,e));o.push(new THREE.UV(i,l));o.push(new THREE.UV(j,m));o.push(new THREE.UV(g,f));h.push(o)}}function H(b,c,d){for(var e,f,g,h,c=new Uint32Array(a,c,3*b),k=new Uint16Array(a,d,b),d=0;d<b;d++){e=c[d*3];f=c[d*3+1];g=c[d*3+2];h=k[d];
-X.faces.push(new THREE.Face3(e,f,g,null,null,h))}}function I(b,c,d){for(var e,f,g,h,k,c=new Uint32Array(a,c,4*b),i=new Uint16Array(a,d,b),d=0;d<b;d++){e=c[d*4];f=c[d*4+1];g=c[d*4+2];h=c[d*4+3];k=i[d];X.faces.push(new THREE.Face4(e,f,g,h,null,null,k))}}function N(b,c,d,e){for(var f,g,h,k,i,j,l,c=new Uint32Array(a,c,3*b),d=new Uint32Array(a,d,3*b),m=new Uint16Array(a,e,b),e=0;e<b;e++){f=c[e*3];g=c[e*3+1];h=c[e*3+2];i=d[e*3];j=d[e*3+1];l=d[e*3+2];k=m[e];var n=G[j*3],o=G[j*3+1];j=G[j*3+2];var p=G[l*3],
-r=G[l*3+1];l=G[l*3+2];X.faces.push(new THREE.Face3(f,g,h,[new THREE.Vector3(G[i*3],G[i*3+1],G[i*3+2]),new THREE.Vector3(n,o,j),new THREE.Vector3(p,r,l)],null,k))}}function R(b,c,d,e){for(var f,g,h,k,i,j,l,m,n,c=new Uint32Array(a,c,4*b),d=new Uint32Array(a,d,4*b),o=new Uint16Array(a,e,b),e=0;e<b;e++){f=c[e*4];g=c[e*4+1];h=c[e*4+2];k=c[e*4+3];j=d[e*4];l=d[e*4+1];m=d[e*4+2];n=d[e*4+3];i=o[e];var p=G[l*3],r=G[l*3+1];l=G[l*3+2];var q=G[m*3],t=G[m*3+1];m=G[m*3+2];var s=G[n*3],u=G[n*3+1];n=G[n*3+2];X.faces.push(new THREE.Face4(f,
-g,h,k,[new THREE.Vector3(G[j*3],G[j*3+1],G[j*3+2]),new THREE.Vector3(p,r,l),new THREE.Vector3(q,t,m),new THREE.Vector3(s,u,n)],null,i))}}var X=this,B=0,G=[],Q=[],D,k,P;THREE.Geometry.call(this);THREE.Loader.prototype.initMaterials(X,d,b);(function(a,b,c){for(var a=new Uint8Array(a,b,c),d="",e=0;e<c;e++)d=d+String.fromCharCode(a[b+e]);return d})(a,B,12);c=F(a,B+12);F(a,B+13);F(a,B+14);F(a,B+15);e=F(a,B+16);i=F(a,B+17);j=F(a,B+18);l=F(a,B+19);o=C(a,B+20);m=C(a,B+20+4);p=C(a,B+20+8);b=C(a,B+20+12);r=
-C(a,B+20+16);n=C(a,B+20+20);q=C(a,B+20+24);t=C(a,B+20+28);u=C(a,B+20+32);w=C(a,B+20+36);s=C(a,B+20+40);B=B+c;c=e*3+l;P=e*4+l;D=b*c;k=r*(c+i*3);e=n*(c+j*3);l=q*(c+i*3+j*3);c=t*P;i=u*(P+i*4);j=w*(P+j*4);B=B+function(b){var b=new Float32Array(a,b,o*3),c,d,e,f;for(c=0;c<o;c++){d=b[c*3];e=b[c*3+1];f=b[c*3+2];X.vertices.push(new THREE.Vector3(d,e,f))}return o*3*Float32Array.BYTES_PER_ELEMENT}(B);B=B+function(b){if(m){var b=new Int8Array(a,b,m*3),c,d,e,f;for(c=0;c<m;c++){d=b[c*3];e=b[c*3+1];f=b[c*3+2];G.push(d/
+THREE.BinaryLoader.prototype.createBinModel=function(a,b,c,d){var e=function(b){var c,e,i,j,l,o,m,p,r,n,q,t,u,w,s;function x(a){return a%4?4-a%4:0}function F(a,b){return(new Uint8Array(a,b,1))[0]}function C(a,b){return(new Uint32Array(a,b,1))[0]}function z(b,c){var d,e,f,g,h,k,i,j,l=new Uint32Array(a,c,3*b);for(d=0;d<b;d++){e=l[d*3];f=l[d*3+1];g=l[d*3+2];h=Q[e*2];e=Q[e*2+1];k=Q[f*2];i=Q[f*2+1];f=Q[g*2];j=Q[g*2+1];g=Y.faceVertexUvs[0];var m=[];m.push(new THREE.UV(h,e));m.push(new THREE.UV(k,i));m.push(new THREE.UV(f,
+j));g.push(m)}}function v(b,c){var d,e,f,g,h,k,i,j,l,m,n=new Uint32Array(a,c,4*b);for(d=0;d<b;d++){e=n[d*4];f=n[d*4+1];g=n[d*4+2];h=n[d*4+3];k=Q[e*2];e=Q[e*2+1];i=Q[f*2];l=Q[f*2+1];j=Q[g*2];m=Q[g*2+1];g=Q[h*2];f=Q[h*2+1];h=Y.faceVertexUvs[0];var o=[];o.push(new THREE.UV(k,e));o.push(new THREE.UV(i,l));o.push(new THREE.UV(j,m));o.push(new THREE.UV(g,f));h.push(o)}}function H(b,c,d){for(var e,f,g,h,c=new Uint32Array(a,c,3*b),k=new Uint16Array(a,d,b),d=0;d<b;d++){e=c[d*3];f=c[d*3+1];g=c[d*3+2];h=k[d];
+Y.faces.push(new THREE.Face3(e,f,g,null,null,h))}}function I(b,c,d){for(var e,f,g,h,k,c=new Uint32Array(a,c,4*b),i=new Uint16Array(a,d,b),d=0;d<b;d++){e=c[d*4];f=c[d*4+1];g=c[d*4+2];h=c[d*4+3];k=i[d];Y.faces.push(new THREE.Face4(e,f,g,h,null,null,k))}}function N(b,c,d,e){for(var f,g,h,k,i,j,l,c=new Uint32Array(a,c,3*b),d=new Uint32Array(a,d,3*b),m=new Uint16Array(a,e,b),e=0;e<b;e++){f=c[e*3];g=c[e*3+1];h=c[e*3+2];i=d[e*3];j=d[e*3+1];l=d[e*3+2];k=m[e];var n=G[j*3],o=G[j*3+1];j=G[j*3+2];var p=G[l*3],
+r=G[l*3+1];l=G[l*3+2];Y.faces.push(new THREE.Face3(f,g,h,[new THREE.Vector3(G[i*3],G[i*3+1],G[i*3+2]),new THREE.Vector3(n,o,j),new THREE.Vector3(p,r,l)],null,k))}}function R(b,c,d,e){for(var f,g,h,k,i,j,l,m,n,c=new Uint32Array(a,c,4*b),d=new Uint32Array(a,d,4*b),o=new Uint16Array(a,e,b),e=0;e<b;e++){f=c[e*4];g=c[e*4+1];h=c[e*4+2];k=c[e*4+3];j=d[e*4];l=d[e*4+1];m=d[e*4+2];n=d[e*4+3];i=o[e];var p=G[l*3],r=G[l*3+1];l=G[l*3+2];var q=G[m*3],t=G[m*3+1];m=G[m*3+2];var s=G[n*3],u=G[n*3+1];n=G[n*3+2];Y.faces.push(new THREE.Face4(f,
+g,h,k,[new THREE.Vector3(G[j*3],G[j*3+1],G[j*3+2]),new THREE.Vector3(p,r,l),new THREE.Vector3(q,t,m),new THREE.Vector3(s,u,n)],null,i))}}var Y=this,B=0,G=[],Q=[],D,k,P;THREE.Geometry.call(this);THREE.Loader.prototype.initMaterials(Y,d,b);(function(a,b,c){for(var a=new Uint8Array(a,b,c),d="",e=0;e<c;e++)d=d+String.fromCharCode(a[b+e]);return d})(a,B,12);c=F(a,B+12);F(a,B+13);F(a,B+14);F(a,B+15);e=F(a,B+16);i=F(a,B+17);j=F(a,B+18);l=F(a,B+19);o=C(a,B+20);m=C(a,B+20+4);p=C(a,B+20+8);b=C(a,B+20+12);r=
+C(a,B+20+16);n=C(a,B+20+20);q=C(a,B+20+24);t=C(a,B+20+28);u=C(a,B+20+32);w=C(a,B+20+36);s=C(a,B+20+40);B=B+c;c=e*3+l;P=e*4+l;D=b*c;k=r*(c+i*3);e=n*(c+j*3);l=q*(c+i*3+j*3);c=t*P;i=u*(P+i*4);j=w*(P+j*4);B=B+function(b){var b=new Float32Array(a,b,o*3),c,d,e,f;for(c=0;c<o;c++){d=b[c*3];e=b[c*3+1];f=b[c*3+2];Y.vertices.push(new THREE.Vector3(d,e,f))}return o*3*Float32Array.BYTES_PER_ELEMENT}(B);B=B+function(b){if(m){var b=new Int8Array(a,b,m*3),c,d,e,f;for(c=0;c<m;c++){d=b[c*3];e=b[c*3+1];f=b[c*3+2];G.push(d/
 127,e/127,f/127)}}return m*3*Int8Array.BYTES_PER_ELEMENT}(B);B=B+x(m*3);B=B+function(b){if(p){var b=new Float32Array(a,b,p*2),c,d,e;for(c=0;c<p;c++){d=b[c*2];e=b[c*2+1];Q.push(d,e)}}return p*2*Float32Array.BYTES_PER_ELEMENT}(B);D=B+D+x(b*2);k=D+k+x(r*2);e=k+e+x(n*2);l=e+l+x(q*2);c=l+c+x(t*2);i=c+i+x(u*2);j=i+j+x(w*2);(function(a){if(n){var b=a+n*Uint32Array.BYTES_PER_ELEMENT*3;H(n,a,b+n*Uint32Array.BYTES_PER_ELEMENT*3);z(n,b)}})(k);(function(a){if(q){var b=a+q*Uint32Array.BYTES_PER_ELEMENT*3,c=b+
 q*Uint32Array.BYTES_PER_ELEMENT*3;N(q,a,b,c+q*Uint32Array.BYTES_PER_ELEMENT*3);z(q,c)}})(e);(function(a){if(w){var b=a+w*Uint32Array.BYTES_PER_ELEMENT*4;I(w,a,b+w*Uint32Array.BYTES_PER_ELEMENT*4);v(w,b)}})(i);(function(a){if(s){var b=a+s*Uint32Array.BYTES_PER_ELEMENT*4,c=b+s*Uint32Array.BYTES_PER_ELEMENT*4;R(s,a,b,c+s*Uint32Array.BYTES_PER_ELEMENT*4);v(s,c)}})(j);b&&H(b,B,B+b*Uint32Array.BYTES_PER_ELEMENT*3);(function(a){if(r){var b=a+r*Uint32Array.BYTES_PER_ELEMENT*3;N(r,a,b,b+r*Uint32Array.BYTES_PER_ELEMENT*
 3)}})(D);t&&I(t,l,l+t*Uint32Array.BYTES_PER_ELEMENT*4);(function(a){if(u){var b=a+u*Uint32Array.BYTES_PER_ELEMENT*4;R(u,a,b,b+u*Uint32Array.BYTES_PER_ELEMENT*4)}})(c);this.computeCentroids();this.computeFaceNormals();THREE.Loader.prototype.hasNormals(this)&&this.computeTangents()};e.prototype=new THREE.Geometry;e.prototype.constructor=e;b(new e(c))};THREE.ImageLoader=function(){THREE.EventTarget.call(this);this.crossOrigin=null};
@@ -166,22 +166,23 @@ p;){var q=g[o++],t=q&2,f=q&4,u=q&8,w=q&16,r=q&32,s=q&64,n=q&128;if(q&1){q=new TH
 3;t=new THREE.Vector3;t.x=m[w++];t.y=m[w++];t.z=m[w];q.normal=t}if(r)for(f=0;f<x;f++){w=g[o++]*3;t=new THREE.Vector3;t.x=m[w++];t.y=m[w++];t.z=m[w];q.vertexNormals.push(t)}if(s){r=g[o++];q.color=new THREE.Color(j[r])}if(n)for(f=0;f<x;f++){r=g[o++];q.vertexColors.push(new THREE.Color(j[r]))}d.faces.push(q)}if(a.skinWeights){f=0;for(g=a.skinWeights.length;f<g;f=f+2)d.skinWeights.push(new THREE.Vector4(a.skinWeights[f],a.skinWeights[f+1],0,0))}if(a.skinIndices){f=0;for(g=a.skinIndices.length;f<g;f=f+
 2){m=0;d.skinIndices.push(new THREE.Vector4(a.skinIndices[f],a.skinIndices[f+1],m,0))}}d.bones=a.bones;d.animation=a.animation;if(a.morphTargets){f=0;for(g=a.morphTargets.length;f<g;f++){d.morphTargets[f]={};d.morphTargets[f].name=a.morphTargets[f].name;d.morphTargets[f].vertices=[];m=d.morphTargets[f].vertices;j=a.morphTargets[f].vertices;t=0;for(l=j.length;t<l;t=t+3){n=new THREE.Vector3;n.x=j[t]*e;n.y=j[t+1]*e;n.z=j[t+2]*e;m.push(n)}}}if(a.morphColors){f=0;for(g=a.morphColors.length;f<g;f++){d.morphColors[f]=
 {};d.morphColors[f].name=a.morphColors[f].name;d.morphColors[f].colors=[];e=d.morphColors[f].colors;j=a.morphColors[f].colors;m=0;for(l=j.length;m<l;m=m+3){o=new THREE.Color(16755200);o.setRGB(j[m],j[m+1],j[m+2]);e.push(o)}}}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 e=JSON.parse(d.responseText);c.createScene(e,b,a)}else console.error("THREE.SceneLoader: Couldn't load ["+a+"] ["+d.status+"]")};d.open("GET",a,true);d.overrideMimeType&&d.overrideMimeType("text/plain; charset=x-user-defined");d.setRequestHeader("Content-Type","text/plain");d.send(null)};
+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 e=JSON.parse(d.responseText);c.createScene(e,b,a)}else console.error("THREE.SceneLoader: Couldn't load ["+a+"] ["+d.status+"]")};d.open("GET",a,true);d.overrideMimeType&&d.overrideMimeType("text/plain; charset=x-user-defined");d.setRequestHeader("Content-Type","text/plain");d.send(null)};
 THREE.SceneLoader.prototype.createScene=function(a,b,c){function d(a,b){return b=="relativeToHTML"?a:j+"/"+a}function e(){var a;for(m in B.objects)if(!M.objects[m]){t=B.objects[m];if(t.geometry!==void 0){if(I=M.geometries[t.geometry]){a=false;N=M.materials[t.materials[0]];(a=N instanceof THREE.ShaderMaterial)&&I.computeTangents();x=t.position;F=t.rotation;C=t.quaternion;z=t.scale;u=t.matrix;C=0;t.materials.length==0&&(N=new THREE.MeshFaceMaterial);t.materials.length>1&&(N=new THREE.MeshFaceMaterial);
 a=new THREE.Mesh(I,N);a.name=m;if(u){a.matrixAutoUpdate=false;a.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{a.position.set(x[0],x[1],x[2]);if(C){a.quaternion.set(C[0],C[1],C[2],C[3]);a.useQuaternion=true}else a.rotation.set(F[0],F[1],F[2]);a.scale.set(z[0],z[1],z[2])}a.visible=t.visible;a.doubleSided=t.doubleSided;a.castShadow=t.castShadow;a.receiveShadow=t.receiveShadow;M.scene.add(a);M.objects[m]=a}}else{x=t.position;F=t.rotation;C=t.quaternion;
 z=t.scale;C=0;a=new THREE.Object3D;a.name=m;a.position.set(x[0],x[1],x[2]);if(C){a.quaternion.set(C[0],C[1],C[2],C[3]);a.useQuaternion=true}else a.rotation.set(F[0],F[1],F[2]);a.scale.set(z[0],z[1],z[2]);a.visible=t.visible!==void 0?t.visible:false;M.scene.add(a);M.objects[m]=a;M.empties[m]=a}}}function f(a){return function(b){M.geometries[a]=b;e();Q=Q-1;i.onLoadComplete();h()}}function g(a){return function(b){M.geometries[a]=b}}function h(){i.callbackProgress({totalModels:k,totalTextures:P,loadedModels:k-
-Q,loadedTextures:P-D},M);i.onLoadProgress();Q==0&&D==0&&b(M)}var i=this,j=THREE.Loader.prototype.extractUrlBase(c),l,o,m,p,r,n,q,t,u,w,s,x,F,C,z,v,H,I,N,R,X,B,G,Q,D,k,P,M;B=a;c=new THREE.BinaryLoader;G=new THREE.JSONLoader;D=Q=0;M={scene:new THREE.Scene,geometries:{},materials:{},textures:{},objects:{},cameras:{},lights:{},fogs:{},empties:{}};if(B.transform){a=B.transform.position;w=B.transform.rotation;v=B.transform.scale;a&&M.scene.position.set(a[0],a[1],a[2]);w&&M.scene.rotation.set(w[0],w[1],
-w[2]);v&&M.scene.scale.set(v[0],v[1],v[2]);if(a||w||v){M.scene.updateMatrix();M.scene.updateMatrixWorld()}}a=function(){D=D-1;h();i.onLoadComplete()};for(r in B.cameras){v=B.cameras[r];v.type=="perspective"?R=new THREE.PerspectiveCamera(v.fov,v.aspect,v.near,v.far):v.type=="ortho"&&(R=new THREE.OrthographicCamera(v.left,v.right,v.top,v.bottom,v.near,v.far));x=v.position;w=v.target;v=v.up;R.position.set(x[0],x[1],x[2]);R.target=new THREE.Vector3(w[0],w[1],w[2]);v&&R.up.set(v[0],v[1],v[2]);M.cameras[r]=
-R}for(p in B.lights){w=B.lights[p];r=w.color!==void 0?w.color:16777215;R=w.intensity!==void 0?w.intensity:1;if(w.type=="directional"){x=w.direction;s=new THREE.DirectionalLight(r,R);s.position.set(x[0],x[1],x[2]);s.position.normalize()}else if(w.type=="point"){x=w.position;s=w.distance;s=new THREE.PointLight(r,R,s);s.position.set(x[0],x[1],x[2])}else w.type=="ambient"&&(s=new THREE.AmbientLight(r));M.scene.add(s);M.lights[p]=s}for(n in B.fogs){p=B.fogs[n];p.type=="linear"?X=new THREE.Fog(0,p.near,
-p.far):p.type=="exp2"&&(X=new THREE.FogExp2(0,p.density));v=p.color;X.color.setRGB(v[0],v[1],v[2]);M.fogs[n]=X}if(M.cameras&&B.defaults.camera)M.currentCamera=M.cameras[B.defaults.camera];if(M.fogs&&B.defaults.fog)M.scene.fog=M.fogs[B.defaults.fog];v=B.defaults.bgcolor;M.bgColor=new THREE.Color;M.bgColor.setRGB(v[0],v[1],v[2]);M.bgColorAlpha=B.defaults.bgalpha;for(l in B.geometries){n=B.geometries[l];if(n.type=="bin_mesh"||n.type=="ascii_mesh"){Q=Q+1;i.onLoadStart()}}k=Q;for(l in B.geometries){n=
-B.geometries[l];if(n.type=="cube"){I=new THREE.CubeGeometry(n.width,n.height,n.depth,n.segmentsWidth,n.segmentsHeight,n.segmentsDepth,null,n.flipped,n.sides);M.geometries[l]=I}else if(n.type=="plane"){I=new THREE.PlaneGeometry(n.width,n.height,n.segmentsWidth,n.segmentsHeight);M.geometries[l]=I}else if(n.type=="sphere"){I=new THREE.SphereGeometry(n.radius,n.segmentsWidth,n.segmentsHeight);M.geometries[l]=I}else if(n.type=="cylinder"){I=new THREE.CylinderGeometry(n.topRad,n.botRad,n.height,n.radSegs,
-n.heightSegs);M.geometries[l]=I}else if(n.type=="torus"){I=new THREE.TorusGeometry(n.radius,n.tube,n.segmentsR,n.segmentsT);M.geometries[l]=I}else if(n.type=="icosahedron"){I=new THREE.IcosahedronGeometry(n.radius,n.subdivisions);M.geometries[l]=I}else if(n.type=="bin_mesh")c.load(d(n.url,B.urlBaseType),f(l));else if(n.type=="ascii_mesh")G.load(d(n.url,B.urlBaseType),f(l));else if(n.type=="embedded_mesh"){n=B.embeds[n.id];n.metadata=B.metadata;n&&G.createModel(n,g(l),"")}}for(q in B.textures){l=B.textures[q];
-if(l.url instanceof Array){D=D+l.url.length;for(n=0;n<l.url.length;n++)i.onLoadStart()}else{D=D+1;i.onLoadStart()}}P=D;for(q in B.textures){l=B.textures[q];if(l.mapping!=void 0&&THREE[l.mapping]!=void 0)l.mapping=new THREE[l.mapping];if(l.url instanceof Array){n=[];for(X=0;X<l.url.length;X++)n[X]=d(l.url[X],B.urlBaseType);n=THREE.ImageUtils.loadTextureCube(n,l.mapping,a)}else{n=THREE.ImageUtils.loadTexture(d(l.url,B.urlBaseType),l.mapping,a);if(THREE[l.minFilter]!=void 0)n.minFilter=THREE[l.minFilter];
-if(THREE[l.magFilter]!=void 0)n.magFilter=THREE[l.magFilter];if(l.repeat){n.repeat.set(l.repeat[0],l.repeat[1]);if(l.repeat[0]!=1)n.wrapS=THREE.RepeatWrapping;if(l.repeat[1]!=1)n.wrapT=THREE.RepeatWrapping}l.offset&&n.offset.set(l.offset[0],l.offset[1]);if(l.wrap){X={repeat:THREE.RepeatWrapping,mirror:THREE.MirroredRepeatWrapping};if(X[l.wrap[0]]!==void 0)n.wrapS=X[l.wrap[0]];if(X[l.wrap[1]]!==void 0)n.wrapT=X[l.wrap[1]]}}M.textures[q]=n}for(o in B.materials){u=B.materials[o];for(H in u.parameters)if(H==
-"envMap"||H=="map"||H=="lightMap")u.parameters[H]=M.textures[u.parameters[H]];else if(H=="shading")u.parameters[H]=u.parameters[H]=="flat"?THREE.FlatShading:THREE.SmoothShading;else if(H=="blending")u.parameters[H]=u.parameters[H]in THREE?THREE[u.parameters[H]]:THREE.NormalBlending;else if(H=="combine")u.parameters[H]=u.parameters[H]=="MixOperation"?THREE.MixOperation:THREE.MultiplyOperation;else if(H=="vertexColors")if(u.parameters[H]=="face")u.parameters[H]=THREE.FaceColors;else if(u.parameters[H])u.parameters[H]=
-THREE.VertexColors;if(u.parameters.opacity!==void 0&&u.parameters.opacity<1)u.parameters.transparent=true;if(u.parameters.normalMap){q=THREE.ShaderUtils.lib.normal;a=THREE.UniformsUtils.clone(q.uniforms);l=u.parameters.color;n=u.parameters.specular;X=u.parameters.ambient;c=u.parameters.shininess;a.tNormal.texture=M.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=M.textures[u.parameters.specularMap];a.enableSpecular.value=true}a.uDiffuseColor.value.setHex(l);a.uSpecularColor.value.setHex(n);a.uAmbientColor.value.setHex(X);a.uShininess.value=c;if(u.parameters.opacity)a.uOpacity.value=u.parameters.opacity;N=new THREE.ShaderMaterial({fragmentShader:q.fragmentShader,vertexShader:q.vertexShader,uniforms:a,lights:true,fog:true})}else N=
-new THREE[u.type](u.parameters);M.materials[o]=N}e();i.callbackSync(M);h()};THREE.TextureLoader=function(){THREE.EventTarget.call(this);this.crossOrigin=null};
+Q,loadedTextures:P-D},M);i.onLoadProgress();Q===0&&D===0&&b(M)}var i=this,j=THREE.Loader.prototype.extractUrlBase(c),l,o,m,p,r,n,q,t,u,w,s,x,F,C,z,v,H,I,N,R,Y,B,G,Q,D,k,P,M;B=a;c=new THREE.BinaryLoader;G=new THREE.JSONLoader;D=Q=0;M={scene:new THREE.Scene,geometries:{},materials:{},textures:{},objects:{},cameras:{},lights:{},fogs:{},empties:{}};if(B.transform){a=B.transform.position;w=B.transform.rotation;v=B.transform.scale;a&&M.scene.position.set(a[0],a[1],a[2]);w&&M.scene.rotation.set(w[0],w[1],
+w[2]);v&&M.scene.scale.set(v[0],v[1],v[2]);if(a||w||v){M.scene.updateMatrix();M.scene.updateMatrixWorld()}}a=function(a){return function(){D=D-a;h();i.onLoadComplete()}};for(r in B.cameras){v=B.cameras[r];v.type==="perspective"?R=new THREE.PerspectiveCamera(v.fov,v.aspect,v.near,v.far):v.type==="ortho"&&(R=new THREE.OrthographicCamera(v.left,v.right,v.top,v.bottom,v.near,v.far));x=v.position;w=v.target;v=v.up;R.position.set(x[0],x[1],x[2]);R.target=new THREE.Vector3(w[0],w[1],w[2]);v&&R.up.set(v[0],
+v[1],v[2]);M.cameras[r]=R}for(p in B.lights){w=B.lights[p];r=w.color!==void 0?w.color:16777215;R=w.intensity!==void 0?w.intensity:1;if(w.type==="directional"){x=w.direction;s=new THREE.DirectionalLight(r,R);s.position.set(x[0],x[1],x[2]);s.position.normalize()}else if(w.type==="point"){x=w.position;s=w.distance;s=new THREE.PointLight(r,R,s);s.position.set(x[0],x[1],x[2])}else w.type==="ambient"&&(s=new THREE.AmbientLight(r));M.scene.add(s);M.lights[p]=s}for(n in B.fogs){p=B.fogs[n];p.type==="linear"?
+Y=new THREE.Fog(0,p.near,p.far):p.type==="exp2"&&(Y=new THREE.FogExp2(0,p.density));v=p.color;Y.color.setRGB(v[0],v[1],v[2]);M.fogs[n]=Y}if(M.cameras&&B.defaults.camera)M.currentCamera=M.cameras[B.defaults.camera];if(M.fogs&&B.defaults.fog)M.scene.fog=M.fogs[B.defaults.fog];v=B.defaults.bgcolor;M.bgColor=new THREE.Color;M.bgColor.setRGB(v[0],v[1],v[2]);M.bgColorAlpha=B.defaults.bgalpha;for(l in B.geometries){n=B.geometries[l];if(n.type=="bin_mesh"||n.type=="ascii_mesh"){Q=Q+1;i.onLoadStart()}}k=Q;
+for(l in B.geometries){n=B.geometries[l];if(n.type==="cube"){I=new THREE.CubeGeometry(n.width,n.height,n.depth,n.segmentsWidth,n.segmentsHeight,n.segmentsDepth,null,n.flipped,n.sides);M.geometries[l]=I}else if(n.type==="plane"){I=new THREE.PlaneGeometry(n.width,n.height,n.segmentsWidth,n.segmentsHeight);M.geometries[l]=I}else if(n.type==="sphere"){I=new THREE.SphereGeometry(n.radius,n.segmentsWidth,n.segmentsHeight);M.geometries[l]=I}else if(n.type==="cylinder"){I=new THREE.CylinderGeometry(n.topRad,
+n.botRad,n.height,n.radSegs,n.heightSegs);M.geometries[l]=I}else if(n.type==="torus"){I=new THREE.TorusGeometry(n.radius,n.tube,n.segmentsR,n.segmentsT);M.geometries[l]=I}else if(n.type==="icosahedron"){I=new THREE.IcosahedronGeometry(n.radius,n.subdivisions);M.geometries[l]=I}else if(n.type==="bin_mesh")c.load(d(n.url,B.urlBaseType),f(l));else if(n.type==="ascii_mesh")G.load(d(n.url,B.urlBaseType),f(l));else if(n.type==="embedded_mesh"){n=B.embeds[n.id];n.metadata=B.metadata;n&&G.createModel(n,g(l),
+"")}}for(q in B.textures){l=B.textures[q];if(l.url instanceof Array){D=D+l.url.length;for(n=0;n<l.url.length;n++)i.onLoadStart()}else{D=D+1;i.onLoadStart()}}P=D;for(q in B.textures){l=B.textures[q];if(l.mapping!==void 0&&THREE[l.mapping]!==void 0)l.mapping=new THREE[l.mapping];if(l.url instanceof Array){n=l.url.length;Y=[];for(c=0;c<n;c++)Y[c]=d(l.url[c],B.urlBaseType);n=THREE.ImageUtils.loadTextureCube(Y,l.mapping,a(n))}else{n=THREE.ImageUtils.loadTexture(d(l.url,B.urlBaseType),l.mapping,a(1));if(THREE[l.minFilter]!==
+void 0)n.minFilter=THREE[l.minFilter];if(THREE[l.magFilter]!==void 0)n.magFilter=THREE[l.magFilter];if(l.repeat){n.repeat.set(l.repeat[0],l.repeat[1]);if(l.repeat[0]!==1)n.wrapS=THREE.RepeatWrapping;if(l.repeat[1]!==1)n.wrapT=THREE.RepeatWrapping}l.offset&&n.offset.set(l.offset[0],l.offset[1]);if(l.wrap){Y={repeat:THREE.RepeatWrapping,mirror:THREE.MirroredRepeatWrapping};if(Y[l.wrap[0]]!==void 0)n.wrapS=Y[l.wrap[0]];if(Y[l.wrap[1]]!==void 0)n.wrapT=Y[l.wrap[1]]}}M.textures[q]=n}for(o in B.materials){u=
+B.materials[o];for(H in u.parameters)if(H==="envMap"||H==="map"||H==="lightMap")u.parameters[H]=M.textures[u.parameters[H]];else if(H==="shading")u.parameters[H]=u.parameters[H]=="flat"?THREE.FlatShading:THREE.SmoothShading;else if(H==="blending")u.parameters[H]=u.parameters[H]in THREE?THREE[u.parameters[H]]:THREE.NormalBlending;else if(H==="combine")u.parameters[H]=u.parameters[H]=="MixOperation"?THREE.MixOperation:THREE.MultiplyOperation;else if(H==="vertexColors")if(u.parameters[H]=="face")u.parameters[H]=
+THREE.FaceColors;else if(u.parameters[H])u.parameters[H]=THREE.VertexColors;if(u.parameters.opacity!==void 0&&u.parameters.opacity<1)u.parameters.transparent=true;if(u.parameters.normalMap){q=THREE.ShaderUtils.lib.normal;a=THREE.UniformsUtils.clone(q.uniforms);l=u.parameters.color;n=u.parameters.specular;Y=u.parameters.ambient;c=u.parameters.shininess;a.tNormal.texture=M.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=M.textures[u.parameters.specularMap];a.enableSpecular.value=true}a.uDiffuseColor.value.setHex(l);a.uSpecularColor.value.setHex(n);a.uAmbientColor.value.setHex(Y);a.uShininess.value=c;if(u.parameters.opacity)a.uOpacity.value=u.parameters.opacity;N=new THREE.ShaderMaterial({fragmentShader:q.fragmentShader,vertexShader:q.vertexShader,
+uniforms:a,lights:true,fog:true})}else N=new THREE[u.type](u.parameters);M.materials[o]=N}e();i.callbackSync(M);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(a){a=a||{};this.id=THREE.MaterialCount++;this.name="";this.opacity=a.opacity!==void 0?a.opacity:1;this.transparent=a.transparent!==void 0?a.transparent:false;this.blending=a.blending!==void 0?a.blending:THREE.NormalBlending;this.blendSrc=a.blendSrc!==void 0?a.blendSrc:THREE.SrcAlphaFactor;this.blendDst=a.blendDst!==void 0?a.blendDst:THREE.OneMinusSrcAlphaFactor;this.blendEquation=a.blendEquation!==void 0?a.blendEquation:THREE.AddEquation;this.depthTest=a.depthTest!==void 0?
 a.depthTest:true;this.depthWrite=a.depthWrite!==void 0?a.depthWrite:true;this.polygonOffset=a.polygonOffset!==void 0?a.polygonOffset:false;this.polygonOffsetFactor=a.polygonOffsetFactor!==void 0?a.polygonOffsetFactor:0;this.polygonOffsetUnits=a.polygonOffsetUnits!==void 0?a.polygonOffsetUnits:0;this.alphaTest=a.alphaTest!==void 0?a.alphaTest:0;this.overdraw=a.overdraw!==void 0?a.overdraw:false;this.needsUpdate=this.visible=true};THREE.MaterialCount=0;THREE.NoShading=0;THREE.FlatShading=1;
@@ -238,7 +239,7 @@ THREE.Scene.prototype.__addObject=function(a){if(a instanceof THREE.Light)this._
 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(u!=a)n.globalAlpha=u=a}function c(a){if(w!=a){switch(a){case THREE.NormalBlending:n.globalCompositeOperation="source-over";break;case THREE.AdditiveBlending:n.globalCompositeOperation="lighter";break;case THREE.SubtractiveBlending:n.globalCompositeOperation="darker"}w=a}}function d(a){if(s!=a)n.strokeStyle=s=a}function e(a){if(x!=a)n.fillStyle=x=a}console.log("THREE.CanvasRenderer",THREE.REVISION);var a=a||{},f=this,g,h,i,j=new THREE.Projector,l=a.canvas!==
-void 0?a.canvas:document.createElement("canvas"),o,m,p,r,n=l.getContext("2d"),q=new THREE.Color(0),t=0,u=1,w=0,s=null,x=null,F=null,C=null,z=null,v,H,I,N,R=new THREE.RenderableVertex,X=new THREE.RenderableVertex,B,G,Q,D,k,P,M,S,aa,K,ca,fa,O=new THREE.Color,Z=new THREE.Color,$=new THREE.Color,Y=new THREE.Color,ha=new THREE.Color,Sa=[],La=[],Na,oa,Ta,eb,fb,Za,Lb,mb,jb,nb,ab=new THREE.Rectangle,Ba=new THREE.Rectangle,ya=new THREE.Rectangle,gb=false,wa=new THREE.Color,Oa=new THREE.Color,Da=new THREE.Color,
+void 0?a.canvas:document.createElement("canvas"),o,m,p,r,n=l.getContext("2d"),q=new THREE.Color(0),t=0,u=1,w=0,s=null,x=null,F=null,C=null,z=null,v,H,I,N,R=new THREE.RenderableVertex,Y=new THREE.RenderableVertex,B,G,Q,D,k,P,M,S,aa,K,ca,fa,O=new THREE.Color,Z=new THREE.Color,$=new THREE.Color,X=new THREE.Color,ha=new THREE.Color,Sa=[],La=[],Na,oa,Ta,eb,fb,Za,Lb,mb,jb,nb,ab=new THREE.Rectangle,Ba=new THREE.Rectangle,ya=new THREE.Rectangle,gb=false,wa=new THREE.Color,Oa=new THREE.Color,Da=new THREE.Color,
 la=new THREE.Vector3,ob,$a,ac,Ra,pc,Bc,a=16;ob=document.createElement("canvas");ob.width=ob.height=2;$a=ob.getContext("2d");$a.fillStyle="rgba(0,0,0,1)";$a.fillRect(0,0,2,2);ac=$a.getImageData(0,0,2,2);Ra=ac.data;pc=document.createElement("canvas");pc.width=pc.height=a;Bc=pc.getContext("2d");Bc.translate(-a/2,-a/2);Bc.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){o=a;m=b;p=Math.floor(o/2);
 r=Math.floor(m/2);l.width=o;l.height=m;ab.set(-p,-r,p,r);Ba.set(-p,-r,p,r);u=1;w=0;z=C=F=x=s=null};this.setClearColor=function(a,b){q.copy(a);t=b!==void 0?b:1;Ba.set(-p,-r,p,r)};this.setClearColorHex=function(a,b){q.setHex(a);t=b!==void 0?b:1;Ba.set(-p,-r,p,r)};this.clear=function(){n.setTransform(1,0,0,-1,p,r);if(!Ba.isEmpty()){Ba.minSelf(ab);Ba.inflate(2);t<1&&n.clearRect(Math.floor(Ba.getX()),Math.floor(Ba.getY()),Math.floor(Ba.getWidth()),Math.floor(Ba.getHeight()));if(t>0){c(THREE.NormalBlending);
 b(1);e("rgba("+Math.floor(q.r*255)+","+Math.floor(q.g*255)+","+Math.floor(q.b*255)+","+t+")");n.fillRect(Math.floor(Ba.getX()),Math.floor(Ba.getY()),Math.floor(Ba.getWidth()),Math.floor(Ba.getHeight()))}Ba.empty()}};this.render=function(a,l){function m(a){var b,c,d,e;wa.setRGB(0,0,0);Oa.setRGB(0,0,0);Da.setRGB(0,0,0);b=0;for(c=a.length;b<c;b++){d=a[b];e=d.color;if(d instanceof THREE.AmbientLight){wa.r=wa.r+e.r;wa.g=wa.g+e.g;wa.b=wa.b+e.b}else if(d instanceof THREE.DirectionalLight){Oa.r=Oa.r+e.r;
@@ -247,16 +248,16 @@ g.distance,1));if(i!=0){i=i*g.intensity;d.r=d.r+h.r*i;d.g=d.g+h.g*i;d.b=d.b+h.b*
 f.scale.x*p;k=f.scale.y*r;ya.set(a.x-h,a.y-k,a.x+h,a.y+k);if(ab.intersects(ya)){d(g.color.getContextStyle());e(g.color.getContextStyle());n.save();n.translate(a.x,a.y);n.rotate(-f.rotation);n.scale(h,k);g.program(n);n.restore()}}}function t(a,e,f,g){b(g.opacity);c(g.blending);n.beginPath();n.moveTo(a.positionScreen.x,a.positionScreen.y);n.lineTo(e.positionScreen.x,e.positionScreen.y);n.closePath();if(g instanceof THREE.LineBasicMaterial){a=g.linewidth;if(F!=a)n.lineWidth=F=a;a=g.linecap;if(C!=a)n.lineCap=
 C=a;a=g.linejoin;if(z!=a)n.lineJoin=z=a;d(g.color.getContextStyle());n.stroke();ya.inflate(g.linewidth*2)}}function s(a,d,e,g,h,j,m,n){f.info.render.vertices=f.info.render.vertices+3;f.info.render.faces++;b(n.opacity);c(n.blending);B=a.positionScreen.x;G=a.positionScreen.y;Q=d.positionScreen.x;D=d.positionScreen.y;k=e.positionScreen.x;P=e.positionScreen.y;w(B,G,Q,D,k,P);if(n instanceof THREE.MeshBasicMaterial)if(n.map){if(n.map.mapping instanceof THREE.UVMapping){eb=m.uvs[0];$c(B,G,Q,D,k,P,eb[g].u,
 eb[g].v,eb[h].u,eb[h].v,eb[j].u,eb[j].v,n.map)}}else if(n.envMap){if(n.envMap.mapping instanceof THREE.SphericalReflectionMapping){a=l.matrixWorldInverse;la.copy(m.vertexNormalsWorld[g]);fb=(la.x*a.elements[0]+la.y*a.elements[4]+la.z*a.elements[8])*0.5+0.5;Za=-(la.x*a.elements[1]+la.y*a.elements[5]+la.z*a.elements[9])*0.5+0.5;la.copy(m.vertexNormalsWorld[h]);Lb=(la.x*a.elements[0]+la.y*a.elements[4]+la.z*a.elements[8])*0.5+0.5;mb=-(la.x*a.elements[1]+la.y*a.elements[5]+la.z*a.elements[9])*0.5+0.5;
-la.copy(m.vertexNormalsWorld[j]);jb=(la.x*a.elements[0]+la.y*a.elements[4]+la.z*a.elements[8])*0.5+0.5;nb=-(la.x*a.elements[1]+la.y*a.elements[5]+la.z*a.elements[9])*0.5+0.5;$c(B,G,Q,D,k,P,fb,Za,Lb,mb,jb,nb,n.envMap)}}else n.wireframe?Mb(n.color,n.wireframeLinewidth,n.wireframeLinecap,n.wireframeLinejoin):Fb(n.color);else if(n instanceof THREE.MeshLambertMaterial)if(gb)if(!n.wireframe&&n.shading==THREE.SmoothShading&&m.vertexNormalsWorld.length==3){Z.r=$.r=Y.r=wa.r;Z.g=$.g=Y.g=wa.g;Z.b=$.b=Y.b=wa.b;
-o(i,m.v1.positionWorld,m.vertexNormalsWorld[0],Z);o(i,m.v2.positionWorld,m.vertexNormalsWorld[1],$);o(i,m.v3.positionWorld,m.vertexNormalsWorld[2],Y);Z.r=Math.max(0,Math.min(n.color.r*Z.r,1));Z.g=Math.max(0,Math.min(n.color.g*Z.g,1));Z.b=Math.max(0,Math.min(n.color.b*Z.b,1));$.r=Math.max(0,Math.min(n.color.r*$.r,1));$.g=Math.max(0,Math.min(n.color.g*$.g,1));$.b=Math.max(0,Math.min(n.color.b*$.b,1));Y.r=Math.max(0,Math.min(n.color.r*Y.r,1));Y.g=Math.max(0,Math.min(n.color.g*Y.g,1));Y.b=Math.max(0,
-Math.min(n.color.b*Y.b,1));ha.r=($.r+Y.r)*0.5;ha.g=($.g+Y.g)*0.5;ha.b=($.b+Y.b)*0.5;Ta=Cc(Z,$,Y,ha);hc(B,G,Q,D,k,P,0,0,1,0,0,1,Ta)}else{O.r=wa.r;O.g=wa.g;O.b=wa.b;o(i,m.centroidWorld,m.normalWorld,O);O.r=Math.max(0,Math.min(n.color.r*O.r,1));O.g=Math.max(0,Math.min(n.color.g*O.g,1));O.b=Math.max(0,Math.min(n.color.b*O.b,1));n.wireframe?Mb(O,n.wireframeLinewidth,n.wireframeLinecap,n.wireframeLinejoin):Fb(O)}else n.wireframe?Mb(n.color,n.wireframeLinewidth,n.wireframeLinecap,n.wireframeLinejoin):Fb(n.color);
-else if(n instanceof THREE.MeshDepthMaterial){Na=l.near;oa=l.far;Z.r=Z.g=Z.b=1-bc(a.positionScreen.z,Na,oa);$.r=$.g=$.b=1-bc(d.positionScreen.z,Na,oa);Y.r=Y.g=Y.b=1-bc(e.positionScreen.z,Na,oa);ha.r=($.r+Y.r)*0.5;ha.g=($.g+Y.g)*0.5;ha.b=($.b+Y.b)*0.5;Ta=Cc(Z,$,Y,ha);hc(B,G,Q,D,k,P,0,0,1,0,0,1,Ta)}else if(n instanceof THREE.MeshNormalMaterial){O.r=ic(m.normalWorld.x);O.g=ic(m.normalWorld.y);O.b=ic(m.normalWorld.z);n.wireframe?Mb(O,n.wireframeLinewidth,n.wireframeLinecap,n.wireframeLinejoin):Fb(O)}}
+la.copy(m.vertexNormalsWorld[j]);jb=(la.x*a.elements[0]+la.y*a.elements[4]+la.z*a.elements[8])*0.5+0.5;nb=-(la.x*a.elements[1]+la.y*a.elements[5]+la.z*a.elements[9])*0.5+0.5;$c(B,G,Q,D,k,P,fb,Za,Lb,mb,jb,nb,n.envMap)}}else n.wireframe?Mb(n.color,n.wireframeLinewidth,n.wireframeLinecap,n.wireframeLinejoin):Fb(n.color);else if(n instanceof THREE.MeshLambertMaterial)if(gb)if(!n.wireframe&&n.shading==THREE.SmoothShading&&m.vertexNormalsWorld.length==3){Z.r=$.r=X.r=wa.r;Z.g=$.g=X.g=wa.g;Z.b=$.b=X.b=wa.b;
+o(i,m.v1.positionWorld,m.vertexNormalsWorld[0],Z);o(i,m.v2.positionWorld,m.vertexNormalsWorld[1],$);o(i,m.v3.positionWorld,m.vertexNormalsWorld[2],X);Z.r=Math.max(0,Math.min(n.color.r*Z.r,1));Z.g=Math.max(0,Math.min(n.color.g*Z.g,1));Z.b=Math.max(0,Math.min(n.color.b*Z.b,1));$.r=Math.max(0,Math.min(n.color.r*$.r,1));$.g=Math.max(0,Math.min(n.color.g*$.g,1));$.b=Math.max(0,Math.min(n.color.b*$.b,1));X.r=Math.max(0,Math.min(n.color.r*X.r,1));X.g=Math.max(0,Math.min(n.color.g*X.g,1));X.b=Math.max(0,
+Math.min(n.color.b*X.b,1));ha.r=($.r+X.r)*0.5;ha.g=($.g+X.g)*0.5;ha.b=($.b+X.b)*0.5;Ta=Cc(Z,$,X,ha);hc(B,G,Q,D,k,P,0,0,1,0,0,1,Ta)}else{O.r=wa.r;O.g=wa.g;O.b=wa.b;o(i,m.centroidWorld,m.normalWorld,O);O.r=Math.max(0,Math.min(n.color.r*O.r,1));O.g=Math.max(0,Math.min(n.color.g*O.g,1));O.b=Math.max(0,Math.min(n.color.b*O.b,1));n.wireframe?Mb(O,n.wireframeLinewidth,n.wireframeLinecap,n.wireframeLinejoin):Fb(O)}else n.wireframe?Mb(n.color,n.wireframeLinewidth,n.wireframeLinecap,n.wireframeLinejoin):Fb(n.color);
+else if(n instanceof THREE.MeshDepthMaterial){Na=l.near;oa=l.far;Z.r=Z.g=Z.b=1-bc(a.positionScreen.z,Na,oa);$.r=$.g=$.b=1-bc(d.positionScreen.z,Na,oa);X.r=X.g=X.b=1-bc(e.positionScreen.z,Na,oa);ha.r=($.r+X.r)*0.5;ha.g=($.g+X.g)*0.5;ha.b=($.b+X.b)*0.5;Ta=Cc(Z,$,X,ha);hc(B,G,Q,D,k,P,0,0,1,0,0,1,Ta)}else if(n instanceof THREE.MeshNormalMaterial){O.r=ic(m.normalWorld.x);O.g=ic(m.normalWorld.y);O.b=ic(m.normalWorld.z);n.wireframe?Mb(O,n.wireframeLinewidth,n.wireframeLinecap,n.wireframeLinejoin):Fb(O)}}
 function u(a,d,e,g,h,j,m,n,p){f.info.render.vertices=f.info.render.vertices+4;f.info.render.faces++;b(n.opacity);c(n.blending);if(n.map||n.envMap){s(a,d,g,0,1,3,m,n,p);s(h,e,j,1,2,3,m,n,p)}else{B=a.positionScreen.x;G=a.positionScreen.y;Q=d.positionScreen.x;D=d.positionScreen.y;k=e.positionScreen.x;P=e.positionScreen.y;M=g.positionScreen.x;S=g.positionScreen.y;aa=h.positionScreen.x;K=h.positionScreen.y;ca=j.positionScreen.x;fa=j.positionScreen.y;if(n instanceof THREE.MeshBasicMaterial){x(B,G,Q,D,k,
-P,M,S);n.wireframe?Mb(n.color,n.wireframeLinewidth,n.wireframeLinecap,n.wireframeLinejoin):Fb(n.color)}else if(n instanceof THREE.MeshLambertMaterial)if(gb)if(!n.wireframe&&n.shading==THREE.SmoothShading&&m.vertexNormalsWorld.length==4){Z.r=$.r=Y.r=ha.r=wa.r;Z.g=$.g=Y.g=ha.g=wa.g;Z.b=$.b=Y.b=ha.b=wa.b;o(i,m.v1.positionWorld,m.vertexNormalsWorld[0],Z);o(i,m.v2.positionWorld,m.vertexNormalsWorld[1],$);o(i,m.v4.positionWorld,m.vertexNormalsWorld[3],Y);o(i,m.v3.positionWorld,m.vertexNormalsWorld[2],ha);
-Z.r=Math.max(0,Math.min(n.color.r*Z.r,1));Z.g=Math.max(0,Math.min(n.color.g*Z.g,1));Z.b=Math.max(0,Math.min(n.color.b*Z.b,1));$.r=Math.max(0,Math.min(n.color.r*$.r,1));$.g=Math.max(0,Math.min(n.color.g*$.g,1));$.b=Math.max(0,Math.min(n.color.b*$.b,1));Y.r=Math.max(0,Math.min(n.color.r*Y.r,1));Y.g=Math.max(0,Math.min(n.color.g*Y.g,1));Y.b=Math.max(0,Math.min(n.color.b*Y.b,1));ha.r=Math.max(0,Math.min(n.color.r*ha.r,1));ha.g=Math.max(0,Math.min(n.color.g*ha.g,1));ha.b=Math.max(0,Math.min(n.color.b*
-ha.b,1));Ta=Cc(Z,$,Y,ha);w(B,G,Q,D,M,S);hc(B,G,Q,D,M,S,0,0,1,0,0,1,Ta);w(aa,K,k,P,ca,fa);hc(aa,K,k,P,ca,fa,1,0,1,1,0,1,Ta)}else{O.r=wa.r;O.g=wa.g;O.b=wa.b;o(i,m.centroidWorld,m.normalWorld,O);O.r=Math.max(0,Math.min(n.color.r*O.r,1));O.g=Math.max(0,Math.min(n.color.g*O.g,1));O.b=Math.max(0,Math.min(n.color.b*O.b,1));x(B,G,Q,D,k,P,M,S);n.wireframe?Mb(O,n.wireframeLinewidth,n.wireframeLinecap,n.wireframeLinejoin):Fb(O)}else{x(B,G,Q,D,k,P,M,S);n.wireframe?Mb(n.color,n.wireframeLinewidth,n.wireframeLinecap,
-n.wireframeLinejoin):Fb(n.color)}else if(n instanceof THREE.MeshNormalMaterial){O.r=ic(m.normalWorld.x);O.g=ic(m.normalWorld.y);O.b=ic(m.normalWorld.z);x(B,G,Q,D,k,P,M,S);n.wireframe?Mb(O,n.wireframeLinewidth,n.wireframeLinecap,n.wireframeLinejoin):Fb(O)}else if(n instanceof THREE.MeshDepthMaterial){Na=l.near;oa=l.far;Z.r=Z.g=Z.b=1-bc(a.positionScreen.z,Na,oa);$.r=$.g=$.b=1-bc(d.positionScreen.z,Na,oa);Y.r=Y.g=Y.b=1-bc(g.positionScreen.z,Na,oa);ha.r=ha.g=ha.b=1-bc(e.positionScreen.z,Na,oa);Ta=Cc(Z,
-$,Y,ha);w(B,G,Q,D,M,S);hc(B,G,Q,D,M,S,0,0,1,0,0,1,Ta);w(aa,K,k,P,ca,fa);hc(aa,K,k,P,ca,fa,1,0,1,1,0,1,Ta)}}}function w(a,b,c,d,e,f){n.beginPath();n.moveTo(a,b);n.lineTo(c,d);n.lineTo(e,f);n.lineTo(a,b)}function x(a,b,c,d,e,f,g,h){n.beginPath();n.moveTo(a,b);n.lineTo(c,d);n.lineTo(e,f);n.lineTo(g,h);n.lineTo(a,b)}function Mb(a,b,c,e){if(F!=b)n.lineWidth=F=b;if(C!=c)n.lineCap=C=c;if(z!=e)n.lineJoin=z=e;d(a.getContextStyle());n.stroke();ya.inflate(b*2)}function Fb(a){e(a.getContextStyle());n.fill()}
+P,M,S);n.wireframe?Mb(n.color,n.wireframeLinewidth,n.wireframeLinecap,n.wireframeLinejoin):Fb(n.color)}else if(n instanceof THREE.MeshLambertMaterial)if(gb)if(!n.wireframe&&n.shading==THREE.SmoothShading&&m.vertexNormalsWorld.length==4){Z.r=$.r=X.r=ha.r=wa.r;Z.g=$.g=X.g=ha.g=wa.g;Z.b=$.b=X.b=ha.b=wa.b;o(i,m.v1.positionWorld,m.vertexNormalsWorld[0],Z);o(i,m.v2.positionWorld,m.vertexNormalsWorld[1],$);o(i,m.v4.positionWorld,m.vertexNormalsWorld[3],X);o(i,m.v3.positionWorld,m.vertexNormalsWorld[2],ha);
+Z.r=Math.max(0,Math.min(n.color.r*Z.r,1));Z.g=Math.max(0,Math.min(n.color.g*Z.g,1));Z.b=Math.max(0,Math.min(n.color.b*Z.b,1));$.r=Math.max(0,Math.min(n.color.r*$.r,1));$.g=Math.max(0,Math.min(n.color.g*$.g,1));$.b=Math.max(0,Math.min(n.color.b*$.b,1));X.r=Math.max(0,Math.min(n.color.r*X.r,1));X.g=Math.max(0,Math.min(n.color.g*X.g,1));X.b=Math.max(0,Math.min(n.color.b*X.b,1));ha.r=Math.max(0,Math.min(n.color.r*ha.r,1));ha.g=Math.max(0,Math.min(n.color.g*ha.g,1));ha.b=Math.max(0,Math.min(n.color.b*
+ha.b,1));Ta=Cc(Z,$,X,ha);w(B,G,Q,D,M,S);hc(B,G,Q,D,M,S,0,0,1,0,0,1,Ta);w(aa,K,k,P,ca,fa);hc(aa,K,k,P,ca,fa,1,0,1,1,0,1,Ta)}else{O.r=wa.r;O.g=wa.g;O.b=wa.b;o(i,m.centroidWorld,m.normalWorld,O);O.r=Math.max(0,Math.min(n.color.r*O.r,1));O.g=Math.max(0,Math.min(n.color.g*O.g,1));O.b=Math.max(0,Math.min(n.color.b*O.b,1));x(B,G,Q,D,k,P,M,S);n.wireframe?Mb(O,n.wireframeLinewidth,n.wireframeLinecap,n.wireframeLinejoin):Fb(O)}else{x(B,G,Q,D,k,P,M,S);n.wireframe?Mb(n.color,n.wireframeLinewidth,n.wireframeLinecap,
+n.wireframeLinejoin):Fb(n.color)}else if(n instanceof THREE.MeshNormalMaterial){O.r=ic(m.normalWorld.x);O.g=ic(m.normalWorld.y);O.b=ic(m.normalWorld.z);x(B,G,Q,D,k,P,M,S);n.wireframe?Mb(O,n.wireframeLinewidth,n.wireframeLinecap,n.wireframeLinejoin):Fb(O)}else if(n instanceof THREE.MeshDepthMaterial){Na=l.near;oa=l.far;Z.r=Z.g=Z.b=1-bc(a.positionScreen.z,Na,oa);$.r=$.g=$.b=1-bc(d.positionScreen.z,Na,oa);X.r=X.g=X.b=1-bc(g.positionScreen.z,Na,oa);ha.r=ha.g=ha.b=1-bc(e.positionScreen.z,Na,oa);Ta=Cc(Z,
+$,X,ha);w(B,G,Q,D,M,S);hc(B,G,Q,D,M,S,0,0,1,0,0,1,Ta);w(aa,K,k,P,ca,fa);hc(aa,K,k,P,ca,fa,1,0,1,1,0,1,Ta)}}}function w(a,b,c,d,e,f){n.beginPath();n.moveTo(a,b);n.lineTo(c,d);n.lineTo(e,f);n.lineTo(a,b)}function x(a,b,c,d,e,f,g,h){n.beginPath();n.moveTo(a,b);n.lineTo(c,d);n.lineTo(e,f);n.lineTo(g,h);n.lineTo(a,b)}function Mb(a,b,c,e){if(F!=b)n.lineWidth=F=b;if(C!=c)n.lineCap=C=c;if(z!=e)n.lineJoin=z=e;d(a.getContextStyle());n.stroke();ya.inflate(b*2)}function Fb(a){e(a.getContextStyle());n.fill()}
 function $c(a,b,c,d,f,g,h,k,i,j,l,m,o){if(!(o.image===void 0||o.image.width===0)){if(o.needsUpdate===true||Sa[o.id]===void 0){var p=o.wrapS==THREE.RepeatWrapping,r=o.wrapT==THREE.RepeatWrapping;Sa[o.id]=n.createPattern(o.image,p&&r?"repeat":p&&!r?"repeat-x":!p&&r?"repeat-y":"no-repeat");o.needsUpdate=false}e(Sa[o.id]);var p=o.offset.x/o.repeat.x,r=o.offset.y/o.repeat.y,Ra=o.image.width*o.repeat.x,q=o.image.height*o.repeat.y,h=(h+p)*Ra,k=(k+r)*q,c=c-a,d=d-b,f=f-a,g=g-b,i=(i+p)*Ra-h,j=(j+r)*q-k,l=(l+
 p)*Ra-h,m=(m+r)*q-k,p=i*m-l*j;if(p==0){if(La[o.id]===void 0){b=document.createElement("canvas");b.width=o.image.width;b.height=o.image.height;b=b.getContext("2d");b.drawImage(o.image,0,0);La[o.id]=b.getImageData(0,0,o.image.width,o.image.height).data}b=La[o.id];h=(Math.floor(h)+Math.floor(k)*o.image.width)*4;O.setRGB(b[h]/255,b[h+1]/255,b[h+2]/255);Fb(O)}else{p=1/p;o=(m*c-j*f)*p;j=(m*d-j*g)*p;c=(i*f-l*c)*p;d=(i*g-l*d)*p;a=a-o*h-c*k;h=b-j*h-d*k;n.save();n.transform(o,j,c,d,a,h);n.fill();n.restore()}}}
 function hc(a,b,c,d,e,f,g,h,k,i,j,l,m){var o,p;o=m.width-1;p=m.height-1;g=g*o;h=h*p;c=c-a;d=d-b;e=e-a;f=f-b;k=k*o-g;i=i*p-h;j=j*o-g;l=l*p-h;p=1/(k*l-j*i);o=(l*c-i*e)*p;i=(l*d-i*f)*p;c=(k*e-j*c)*p;d=(k*f-j*d)*p;a=a-o*g-c*h;b=b-i*g-d*h;n.save();n.transform(o,i,c,d,a,b);n.clip();n.drawImage(m,0,0);n.restore()}function Cc(a,b,c,d){var e=~~(a.r*255),f=~~(a.g*255),a=~~(a.b*255),g=~~(b.r*255),h=~~(b.g*255),b=~~(b.b*255),k=~~(c.r*255),i=~~(c.g*255),c=~~(c.b*255),j=~~(d.r*255),l=~~(d.g*255),d=~~(d.b*255);
@@ -264,8 +265,8 @@ Ra[0]=e<0?0:e>255?255:e;Ra[1]=f<0?0:f>255?255:f;Ra[2]=a<0?0:a>255?255:a;Ra[4]=g<
 0){e=1/Math.sqrt(e);c=c*e;d=d*e;b.x=b.x+c;b.y=b.y+d;a.x=a.x-c;a.y=a.y-d}}var Dc,ad,Ja,hb;this.autoClear?this.clear():n.setTransform(1,0,0,-1,p,r);f.info.render.vertices=0;f.info.render.faces=0;g=j.projectScene(a,l,this.sortElements);h=g.elements;i=g.lights;(gb=i.length>0)&&m(i);Dc=0;for(ad=h.length;Dc<ad;Dc++){Ja=h[Dc];hb=Ja.material;hb=hb instanceof THREE.MeshFaceMaterial?Ja.faceMaterial:hb;if(!(hb===void 0||hb.visible===false)){ya.empty();if(Ja instanceof THREE.RenderableParticle){v=Ja;v.x=v.x*
 p;v.y=v.y*r;q(v,Ja,hb,a)}else if(Ja instanceof THREE.RenderableLine){v=Ja.v1;H=Ja.v2;v.positionScreen.x=v.positionScreen.x*p;v.positionScreen.y=v.positionScreen.y*r;H.positionScreen.x=H.positionScreen.x*p;H.positionScreen.y=H.positionScreen.y*r;ya.addPoint(v.positionScreen.x,v.positionScreen.y);ya.addPoint(H.positionScreen.x,H.positionScreen.y);ab.intersects(ya)&&t(v,H,Ja,hb,a)}else if(Ja instanceof THREE.RenderableFace3){v=Ja.v1;H=Ja.v2;I=Ja.v3;v.positionScreen.x=v.positionScreen.x*p;v.positionScreen.y=
 v.positionScreen.y*r;H.positionScreen.x=H.positionScreen.x*p;H.positionScreen.y=H.positionScreen.y*r;I.positionScreen.x=I.positionScreen.x*p;I.positionScreen.y=I.positionScreen.y*r;if(hb.overdraw){Nb(v.positionScreen,H.positionScreen);Nb(H.positionScreen,I.positionScreen);Nb(I.positionScreen,v.positionScreen)}ya.add3Points(v.positionScreen.x,v.positionScreen.y,H.positionScreen.x,H.positionScreen.y,I.positionScreen.x,I.positionScreen.y);ab.intersects(ya)&&s(v,H,I,0,1,2,Ja,hb,a)}else if(Ja instanceof
-THREE.RenderableFace4){v=Ja.v1;H=Ja.v2;I=Ja.v3;N=Ja.v4;v.positionScreen.x=v.positionScreen.x*p;v.positionScreen.y=v.positionScreen.y*r;H.positionScreen.x=H.positionScreen.x*p;H.positionScreen.y=H.positionScreen.y*r;I.positionScreen.x=I.positionScreen.x*p;I.positionScreen.y=I.positionScreen.y*r;N.positionScreen.x=N.positionScreen.x*p;N.positionScreen.y=N.positionScreen.y*r;R.positionScreen.copy(H.positionScreen);X.positionScreen.copy(N.positionScreen);if(hb.overdraw){Nb(v.positionScreen,H.positionScreen);
-Nb(H.positionScreen,N.positionScreen);Nb(N.positionScreen,v.positionScreen);Nb(I.positionScreen,R.positionScreen);Nb(I.positionScreen,X.positionScreen)}ya.addPoint(v.positionScreen.x,v.positionScreen.y);ya.addPoint(H.positionScreen.x,H.positionScreen.y);ya.addPoint(I.positionScreen.x,I.positionScreen.y);ya.addPoint(N.positionScreen.x,N.positionScreen.y);ab.intersects(ya)&&u(v,H,I,N,R,X,Ja,hb,a)}Ba.addRectangle(ya)}}n.setTransform(1,0,0,1,0,0)}};
+THREE.RenderableFace4){v=Ja.v1;H=Ja.v2;I=Ja.v3;N=Ja.v4;v.positionScreen.x=v.positionScreen.x*p;v.positionScreen.y=v.positionScreen.y*r;H.positionScreen.x=H.positionScreen.x*p;H.positionScreen.y=H.positionScreen.y*r;I.positionScreen.x=I.positionScreen.x*p;I.positionScreen.y=I.positionScreen.y*r;N.positionScreen.x=N.positionScreen.x*p;N.positionScreen.y=N.positionScreen.y*r;R.positionScreen.copy(H.positionScreen);Y.positionScreen.copy(N.positionScreen);if(hb.overdraw){Nb(v.positionScreen,H.positionScreen);
+Nb(H.positionScreen,N.positionScreen);Nb(N.positionScreen,v.positionScreen);Nb(I.positionScreen,R.positionScreen);Nb(I.positionScreen,Y.positionScreen)}ya.addPoint(v.positionScreen.x,v.positionScreen.y);ya.addPoint(H.positionScreen.x,H.positionScreen.y);ya.addPoint(I.positionScreen.x,I.positionScreen.y);ya.addPoint(N.positionScreen.x,N.positionScreen.y);ab.intersects(ya)&&u(v,H,I,N,R,Y,Ja,hb,a)}Ba.addRectangle(ya)}}n.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\nvarying vec3 vReflect;\nuniform float reflectivity;\nuniform samplerCube envMap;\nuniform float flipEnvMap;\nuniform int combine;\n#endif",envmap_fragment:"#ifdef USE_ENVMAP\n#ifdef DOUBLE_SIDED\nfloat flipNormal = ( -1.0 + 2.0 * float( gl_FrontFacing ) );\nvec4 cubeColor = textureCube( envMap, flipNormal * vec3( flipEnvMap * vReflect.x, vReflect.yz ) );\n#else\nvec4 cubeColor = textureCube( envMap, vec3( flipEnvMap * vReflect.x, vReflect.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, reflectivity );\n} else {\ngl_FragColor.xyz = gl_FragColor.xyz * cubeColor.xyz;\n}\n#endif",
 envmap_pars_vertex:"#ifdef USE_ENVMAP\nvarying vec3 vReflect;\nuniform float refractionRatio;\nuniform bool useRefract;\n#endif",envmap_vertex:"#ifdef USE_ENVMAP\nvec4 mPosition = objectMatrix * vec4( position, 1.0 );\nvec3 nWorld = mat3( objectMatrix[ 0 ].xyz, objectMatrix[ 1 ].xyz, objectMatrix[ 2 ].xyz ) * normal;\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",
@@ -308,14 +309,14 @@ var i=a.colors,j=i.length,l=a.__vertexArray,m=a.__colorArray,n=a.__sortArray,o=a
 if(h.boundTo===void 0||h.boundTo==="vertices"){f=0;e=h.value.length;if(h.size===1)for(d=0;d<e;d++){g=n[d][1];h.array[d]=h.value[g]}else if(h.size===2)for(d=0;d<e;d++){g=n[d][1];g=h.value[g];h.array[f]=g.x;h.array[f+1]=g.y;f=f+2}else if(h.size===3)if(h.type==="c")for(d=0;d<e;d++){g=n[d][1];g=h.value[g];h.array[f]=g.r;h.array[f+1]=g.g;h.array[f+2]=g.b;f=f+3}else for(d=0;d<e;d++){g=n[d][1];g=h.value[g];h.array[f]=g.x;h.array[f+1]=g.y;h.array[f+2]=g.z;f=f+3}else if(h.size===4)for(d=0;d<e;d++){g=n[d][1];
 g=h.value[g];h.array[f]=g.x;h.array[f+1]=g.y;h.array[f+2]=g.z;h.array[f+3]=g.w;f=f+4}}}}}else{if(o)for(d=0;d<g;d++){e=h[d];f=d*3;l[f]=e.x;l[f+1]=e.y;l[f+2]=e.z}if(p)for(d=0;d<j;d++){e=i[d];f=d*3;m[f]=e.r;m[f+1]=e.g;m[f+2]=e.b}if(r){i=0;for(j=r.length;i<j;i++){h=r[i];if(h.needsUpdate&&(h.boundTo===void 0||h.boundTo==="vertices")){e=h.value.length;f=0;if(h.size===1)for(d=0;d<e;d++)h.array[d]=h.value[d];else if(h.size===2)for(d=0;d<e;d++){g=h.value[d];h.array[f]=g.x;h.array[f+1]=g.y;f=f+2}else if(h.size===
 3)if(h.type==="c")for(d=0;d<e;d++){g=h.value[d];h.array[f]=g.r;h.array[f+1]=g.g;h.array[f+2]=g.b;f=f+3}else for(d=0;d<e;d++){g=h.value[d];h.array[f]=g.x;h.array[f+1]=g.y;h.array[f+2]=g.z;f=f+3}else if(h.size===4)for(d=0;d<e;d++){g=h.value[d];h.array[f]=g.x;h.array[f+1]=g.y;h.array[f+2]=g.z;h.array[f+3]=g.w;f=f+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,
-m,b)}if(r){i=0;for(j=r.length;i<j;i++){h=r[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,e=a.length;d<e;d++){fa=S=null;K=ca=$=Z=oa=Na=Y=-1;la=true;a[d].render(b,c,ab,Ba);fa=S=null;K=ca=$=Z=oa=Na=Y=-1;la=true}}function j(a,b,c,d,e,f,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 m=k;m!==b;m=m+l){i=
+m,b)}if(r){i=0;for(j=r.length;i<j;i++){h=r[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,e=a.length;d<e;d++){fa=S=null;K=ca=$=Z=oa=Na=X=-1;la=true;a[d].render(b,c,ab,Ba);fa=S=null;K=ca=$=Z=oa=Na=X=-1;la=true}}function j(a,b,c,d,e,f,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 m=k;m!==b;m=m+l){i=
 a[m];if(i.render){k=i.object;j=i.buffer;if(h)i=h;else{i=i[c];if(!i)continue;g&&D.setBlending(i.blending,i.blendEquation,i.blendSrc,i.blendDst);D.setDepthTest(i.depthTest);D.setDepthWrite(i.depthWrite);u(i.polygonOffset,i.polygonOffsetFactor,i.polygonOffsetUnits)}D.setObjectFaces(k);j instanceof THREE.BufferGeometry?D.renderBufferDirect(d,e,f,i,j,k):D.renderBuffer(d,e,f,i,j,k)}}}function l(a,b,c,d,e,f,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;
 f&&D.setBlending(h.blending,h.blendEquation,h.blendSrc,h.blendDst);D.setDepthTest(h.depthTest);D.setDepthWrite(h.depthWrite);u(h.polygonOffset,h.polygonOffsetFactor,h.polygonOffsetUnits)}D.renderImmediateObject(c,d,e,h,i)}}}function o(a,b,c){a.push({buffer:b,object:c,opaque:null,transparent:null})}function m(a){for(var b in a.attributes)if(a.attributes[b].needsUpdate)return true;return false}function p(a){for(var b in a.attributes)a.attributes[b].needsUpdate=false}function r(a,b){for(var c=a.length-
 1;c>=0;c--)a[c].object===b&&a.splice(c,1)}function n(a,b){for(var c=a.length-1;c>=0;c--)a[c]===b&&a.splice(c,1)}function q(a,b,c,d,e){if(d.needsUpdate){d.program&&D.deallocateMaterial(d);D.initMaterial(d,b,c,e);d.needsUpdate=false}if(d.morphTargets&&!e.__webglMorphTargetInfluences)e.__webglMorphTargetInfluences=new Float32Array(D.maxMorphTargets);var f=false,g=d.program,h=g.uniforms,i=d.uniforms;if(g!==S){k.useProgram(g);S=g;f=true}if(d.id!==K){K=d.id;f=true}if(f||a!==fa){k.uniformMatrix4fv(h.projectionMatrix,
 false,a._projectionMatrixArray);a!==fa&&(fa=a)}if(f){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(la){for(var j,l=0,m=0,n=0,o,p,r,q=ob,t=q.directional.colors,u=q.directional.positions,v=q.point.colors,w=q.point.positions,x=q.point.distances,F=q.spot.colors,B=q.spot.positions,H=q.spot.distances,
-Z=q.spot.directions,I=q.spot.angles,G=q.spot.exponents,N=0,M=0,Y=0,O=r=0,c=O=0,f=b.length;c<f;c++){j=b[c];if(!j.onlyShadow&&j.visible){o=j.color;p=j.intensity;r=j.distance;if(j instanceof THREE.AmbientLight)if(D.gammaInput){l=l+o.r*o.r;m=m+o.g*o.g;n=n+o.b*o.b}else{l=l+o.r;m=m+o.g;n=n+o.b}else if(j instanceof THREE.DirectionalLight){r=N*3;if(D.gammaInput){t[r]=o.r*o.r*p*p;t[r+1]=o.g*o.g*p*p;t[r+2]=o.b*o.b*p*p}else{t[r]=o.r*p;t[r+1]=o.g*p;t[r+2]=o.b*p}Da.copy(j.matrixWorld.getPosition());Da.subSelf(j.target.matrixWorld.getPosition());
-Da.normalize();u[r]=Da.x;u[r+1]=Da.y;u[r+2]=Da.z;N=N+1}else if(j instanceof THREE.PointLight){O=M*3;if(D.gammaInput){v[O]=o.r*o.r*p*p;v[O+1]=o.g*o.g*p*p;v[O+2]=o.b*o.b*p*p}else{v[O]=o.r*p;v[O+1]=o.g*p;v[O+2]=o.b*p}o=j.matrixWorld.getPosition();w[O]=o.x;w[O+1]=o.y;w[O+2]=o.z;x[M]=r;M=M+1}else if(j instanceof THREE.SpotLight){O=Y*3;if(D.gammaInput){F[O]=o.r*o.r*p*p;F[O+1]=o.g*o.g*p*p;F[O+2]=o.b*o.b*p*p}else{F[O]=o.r*p;F[O+1]=o.g*p;F[O+2]=o.b*p}o=j.matrixWorld.getPosition();B[O]=o.x;B[O+1]=o.y;B[O+2]=
-o.z;H[Y]=r;Da.copy(o);Da.subSelf(j.target.matrixWorld.getPosition());Da.normalize();Z[O]=Da.x;Z[O+1]=Da.y;Z[O+2]=Da.z;I[Y]=Math.cos(j.angle);G[Y]=j.exponent;Y=Y+1}}}c=N*3;for(f=t.length;c<f;c++)t[c]=0;c=M*3;for(f=v.length;c<f;c++)v[c]=0;c=Y*3;for(f=F.length;c<f;c++)F[c]=0;q.directional.length=N;q.point.length=M;q.spot.length=Y;q.ambient[0]=l;q.ambient[1]=m;q.ambient[2]=n;la=false}c=ob;i.ambientLightColor.value=c.ambient;i.directionalLightColor.value=c.directional.colors;i.directionalLightDirection.value=
+Z=q.spot.directions,I=q.spot.angles,G=q.spot.exponents,N=0,M=0,X=0,O=r=0,c=O=0,f=b.length;c<f;c++){j=b[c];if(!j.onlyShadow&&j.visible){o=j.color;p=j.intensity;r=j.distance;if(j instanceof THREE.AmbientLight)if(D.gammaInput){l=l+o.r*o.r;m=m+o.g*o.g;n=n+o.b*o.b}else{l=l+o.r;m=m+o.g;n=n+o.b}else if(j instanceof THREE.DirectionalLight){r=N*3;if(D.gammaInput){t[r]=o.r*o.r*p*p;t[r+1]=o.g*o.g*p*p;t[r+2]=o.b*o.b*p*p}else{t[r]=o.r*p;t[r+1]=o.g*p;t[r+2]=o.b*p}Da.copy(j.matrixWorld.getPosition());Da.subSelf(j.target.matrixWorld.getPosition());
+Da.normalize();u[r]=Da.x;u[r+1]=Da.y;u[r+2]=Da.z;N=N+1}else if(j instanceof THREE.PointLight){O=M*3;if(D.gammaInput){v[O]=o.r*o.r*p*p;v[O+1]=o.g*o.g*p*p;v[O+2]=o.b*o.b*p*p}else{v[O]=o.r*p;v[O+1]=o.g*p;v[O+2]=o.b*p}o=j.matrixWorld.getPosition();w[O]=o.x;w[O+1]=o.y;w[O+2]=o.z;x[M]=r;M=M+1}else if(j instanceof THREE.SpotLight){O=X*3;if(D.gammaInput){F[O]=o.r*o.r*p*p;F[O+1]=o.g*o.g*p*p;F[O+2]=o.b*o.b*p*p}else{F[O]=o.r*p;F[O+1]=o.g*p;F[O+2]=o.b*p}o=j.matrixWorld.getPosition();B[O]=o.x;B[O+1]=o.y;B[O+2]=
+o.z;H[X]=r;Da.copy(o);Da.subSelf(j.target.matrixWorld.getPosition());Da.normalize();Z[O]=Da.x;Z[O+1]=Da.y;Z[O+2]=Da.z;I[X]=Math.cos(j.angle);G[X]=j.exponent;X=X+1}}}c=N*3;for(f=t.length;c<f;c++)t[c]=0;c=M*3;for(f=v.length;c<f;c++)v[c]=0;c=X*3;for(f=F.length;c<f;c++)F[c]=0;q.directional.length=N;q.point.length=M;q.spot.length=X;q.ambient[0]=l;q.ambient[1]=m;q.ambient[2]=n;la=false}c=ob;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;D.gammaInput?i.diffuse.value.copyGammaToLinear(d.color):i.diffuse.value=d.color;(i.map.texture=d.map)&&i.offsetRepeat.value.set(d.map.offset.x,d.map.offset.y,d.map.repeat.x,d.map.repeat.y);i.lightMap.texture=d.lightMap;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=z.height/2;i.map.texture=d.map}else if(d instanceof THREE.MeshPhongMaterial){i.shininess.value=d.shininess;if(D.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;
@@ -335,9 +336,9 @@ case THREE.NearestFilter:return k.NEAREST;case THREE.NearestMipMapNearestFilter:
 case THREE.UnsignedShort565Type:return k.UNSIGNED_SHORT_5_6_5;case THREE.ByteType:return k.BYTE;case THREE.ShortType:return k.SHORT;case THREE.UnsignedShortType:return k.UNSIGNED_SHORT;case THREE.IntType:return k.INT;case THREE.UnsignedIntType:return k.UNSIGNED_INT;case THREE.FloatType:return k.FLOAT;case THREE.AlphaFormat:return k.ALPHA;case THREE.RGBFormat:return k.RGB;case THREE.RGBAFormat:return k.RGBA;case THREE.LuminanceFormat:return k.LUMINANCE;case THREE.LuminanceAlphaFormat:return k.LUMINANCE_ALPHA;
 case THREE.AddEquation:return k.FUNC_ADD;case THREE.SubtractEquation:return k.FUNC_SUBTRACT;case THREE.ReverseSubtractEquation:return k.FUNC_REVERSE_SUBTRACT;case THREE.ZeroFactor:return k.ZERO;case THREE.OneFactor:return k.ONE;case THREE.SrcColorFactor:return k.SRC_COLOR;case THREE.OneMinusSrcColorFactor:return k.ONE_MINUS_SRC_COLOR;case THREE.SrcAlphaFactor:return k.SRC_ALPHA;case THREE.OneMinusSrcAlphaFactor:return k.ONE_MINUS_SRC_ALPHA;case THREE.DstAlphaFactor:return k.DST_ALPHA;case THREE.OneMinusDstAlphaFactor:return k.ONE_MINUS_DST_ALPHA;
 case THREE.DstColorFactor:return k.DST_COLOR;case THREE.OneMinusDstColorFactor:return k.ONE_MINUS_DST_COLOR;case THREE.SrcAlphaSaturateFactor:return k.SRC_ALPHA_SATURATE}return 0}console.log("THREE.WebGLRenderer",THREE.REVISION);var a=a||{},z=a.canvas!==void 0?a.canvas:document.createElement("canvas"),v=a.precision!==void 0?a.precision:"highp",H=a.alpha!==void 0?a.alpha:true,I=a.premultipliedAlpha!==void 0?a.premultipliedAlpha:true,N=a.antialias!==void 0?a.antialias:false,R=a.stencil!==void 0?a.stencil:
-true,X=a.preserveDrawingBuffer!==void 0?a.preserveDrawingBuffer:false,B=a.clearColor!==void 0?new THREE.Color(a.clearColor):new THREE.Color(0),G=a.clearAlpha!==void 0?a.clearAlpha:0,Q=a.maxLights!==void 0?a.maxLights:4;this.domElement=z;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 D=this,k,P=[],M=0,S=null,aa=null,K=-1,ca=null,fa=null,O=0,Z=-1,$=-1,Y=-1,ha=-1,Sa=-1,La=-1,Na=-1,oa=-1,Ta=null,eb=null,fb=null,Za=null,Lb=0,mb=0,jb=0,nb=0,ab=0,Ba=0,ya=new THREE.Frustum,
-gb=new THREE.Matrix4,wa=new THREE.Matrix4,Oa=new THREE.Vector4,Da=new THREE.Vector3,la=true,ob={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=function(){var a;try{if(!(a=z.getContext("experimental-webgl",{alpha:H,premultipliedAlpha:I,antialias:N,stencil:R,preserveDrawingBuffer:X})))throw"Error creating WebGL context.";}catch(b){console.error(b)}a.getExtension("OES_texture_float")||
+true,Y=a.preserveDrawingBuffer!==void 0?a.preserveDrawingBuffer:false,B=a.clearColor!==void 0?new THREE.Color(a.clearColor):new THREE.Color(0),G=a.clearAlpha!==void 0?a.clearAlpha:0,Q=a.maxLights!==void 0?a.maxLights:4;this.domElement=z;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 D=this,k,P=[],M=0,S=null,aa=null,K=-1,ca=null,fa=null,O=0,Z=-1,$=-1,X=-1,ha=-1,Sa=-1,La=-1,Na=-1,oa=-1,Ta=null,eb=null,fb=null,Za=null,Lb=0,mb=0,jb=0,nb=0,ab=0,Ba=0,ya=new THREE.Frustum,
+gb=new THREE.Matrix4,wa=new THREE.Matrix4,Oa=new THREE.Vector4,Da=new THREE.Vector3,la=true,ob={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=function(){var a;try{if(!(a=z.getContext("experimental-webgl",{alpha:H,premultipliedAlpha:I,antialias:N,stencil:R,preserveDrawingBuffer:Y})))throw"Error creating WebGL context.";}catch(b){console.error(b)}a.getExtension("OES_texture_float")||
 console.log("THREE.WebGLRenderer: Float textures not supported.");return a}();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(B.r,B.g,B.b,G);this.context=k;var $a=k.getParameter(k.MAX_VERTEX_TEXTURE_IMAGE_UNITS);k.getParameter(k.MAX_TEXTURE_SIZE);var ac=k.getParameter(k.MAX_CUBE_MAP_TEXTURE_SIZE);
 this.getContext=function(){return k};this.supportsVertexTextures=function(){return $a>0};this.setSize=function(a,b){z.width=a;z.height=b;this.setViewport(0,0,z.width,z.height)};this.setViewport=function(a,b,c,d){Lb=a;mb=b;jb=c;nb=d;k.viewport(Lb,mb,jb,nb)};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){B.setHex(a);G=b;k.clearColor(B.r,B.g,B.b,G)};this.setClearColor=function(a,
 b){B.copy(a);G=b;k.clearColor(B.r,B.g,B.b,G)};this.getClearColor=function(){return B};this.getClearAlpha=function(){return G};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)};
@@ -345,7 +346,7 @@ this.deallocateObject=function(a){if(a.__webglInit){a.__webglInit=false;delete a
 k.deleteBuffer(c.__webglSkinVertexABuffer);k.deleteBuffer(c.__webglSkinVertexBBuffer);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)}D.info.memory.geometries--}else if(a instanceof THREE.Ribbon){a=a.geometry;k.deleteBuffer(a.__webglVertexBuffer);k.deleteBuffer(a.__webglColorBuffer);D.info.memory.geometries--}else if(a instanceof THREE.Line){a=a.geometry;k.deleteBuffer(a.__webglVertexBuffer);k.deleteBuffer(a.__webglColorBuffer);D.info.memory.geometries--}else if(a instanceof THREE.ParticleSystem){a=a.geometry;k.deleteBuffer(a.__webglVertexBuffer);
 k.deleteBuffer(a.__webglColorBuffer);D.info.memory.geometries--}}};this.deallocateTexture=function(a){if(a.__webglInit){a.__webglInit=false;k.deleteTexture(a.__webglTexture);D.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=P.length;a<c;a++){d=P[a];if(d.program===b){d.usedTimes--;d.usedTimes===0&&(e=true);break}}if(e){e=[];a=0;for(c=P.length;a<c;a++){d=P[a];d.program!==b&&e.push(d)}P=e;k.deleteProgram(b);D.info.memory.programs--}}};this.updateShadowMap=function(a,b){S=null;K=ca=oa=Na=Y=-1;la=true;$=Z=-1;this.shadowMapPlugin.update(a,b)};this.renderBufferImmediate=function(a,
+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=P.length;a<c;a++){d=P[a];if(d.program===b){d.usedTimes--;d.usedTimes===0&&(e=true);break}}if(e){e=[];a=0;for(c=P.length;a<c;a++){d=P[a];d.program!==b&&e.push(d)}P=e;k.deleteProgram(b);D.info.memory.programs--}}};this.updateShadowMap=function(a,b){S=null;K=ca=oa=Na=X=-1;la=true;$=Z=-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,m,n,o,p=a.count*3;for(o=0;o<p;o=o+9){n=a.normalArray;d=n[o];e=n[o+1];f=n[o+2];g=n[o+3];i=n[o+4];l=n[o+5];h=n[o+6];j=n[o+7];m=n[o+8];d=(d+g+h)/3;e=(e+i+j)/3;f=(f+l+m)/3;n[o]=d;n[o+1]=e;n[o+2]=f;n[o+3]=d;n[o+4]=e;n[o+5]=f;n[o+6]=d;n[o+7]=e;n[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,
@@ -371,7 +372,7 @@ g._normalMatrix=new THREE.Matrix3;if(g instanceof THREE.Mesh){j=g.geometry;if(j
 materialIndex:v,vertices:0,numMorphTargets:C,numMorphNormals:B});w=u instanceof THREE.Face3?3:4;if(q.geometryGroups[z].vertices+w>65535){F[x].counter=F[x].counter+1;z=F[x].hash+"_"+F[x].counter;q.geometryGroups[z]===void 0&&(q.geometryGroups[z]={faces3:[],faces4:[],materialIndex:v,vertices:0,numMorphTargets:C,numMorphNormals:B})}u instanceof THREE.Face3?q.geometryGroups[z].faces3.push(s):q.geometryGroups[z].faces4.push(s);q.geometryGroups[z].vertices=q.geometryGroups[z].vertices+w}q.geometryGroupsList=
 [];var H=void 0;for(H in q.geometryGroups){q.geometryGroups[H].id=O++;q.geometryGroupsList.push(q.geometryGroups[H])}}for(i in j.geometryGroups){l=j.geometryGroups[i];if(!l.__webglVertexBuffer){var K=l;K.__webglVertexBuffer=k.createBuffer();K.__webglNormalBuffer=k.createBuffer();K.__webglTangentBuffer=k.createBuffer();K.__webglColorBuffer=k.createBuffer();K.__webglUVBuffer=k.createBuffer();K.__webglUV2Buffer=k.createBuffer();K.__webglSkinVertexABuffer=k.createBuffer();K.__webglSkinVertexBBuffer=k.createBuffer();
 K.__webglSkinIndicesBuffer=k.createBuffer();K.__webglSkinWeightsBuffer=k.createBuffer();K.__webglFaceBuffer=k.createBuffer();K.__webglLineBuffer=k.createBuffer();var Z=void 0,I=void 0;if(K.numMorphTargets){K.__webglMorphTargetsBuffers=[];Z=0;for(I=K.numMorphTargets;Z<I;Z++)K.__webglMorphTargetsBuffers.push(k.createBuffer())}if(K.numMorphNormals){K.__webglMorphNormalsBuffers=[];Z=0;for(I=K.numMorphNormals;Z<I;Z++)K.__webglMorphNormalsBuffers.push(k.createBuffer())}D.info.memory.geometries++;var G=
-l,N=g,Y=N.geometry,M=G.faces3,$=G.faces4,S=M.length*3+$.length*4,Q=M.length*1+$.length*2,R=M.length*3+$.length*4,P=c(N,G),aa=e(P),X=d(P),fa=P.vertexColors?P.vertexColors:false;G.__vertexArray=new Float32Array(S*3);if(X)G.__normalArray=new Float32Array(S*3);if(Y.hasTangents)G.__tangentArray=new Float32Array(S*4);if(fa)G.__colorArray=new Float32Array(S*3);if(aa){if(Y.faceUvs.length>0||Y.faceVertexUvs.length>0)G.__uvArray=new Float32Array(S*2);if(Y.faceUvs.length>1||Y.faceVertexUvs.length>1)G.__uv2Array=
+l,N=g,X=N.geometry,M=G.faces3,$=G.faces4,S=M.length*3+$.length*4,Q=M.length*1+$.length*2,R=M.length*3+$.length*4,P=c(N,G),aa=e(P),Y=d(P),fa=P.vertexColors?P.vertexColors:false;G.__vertexArray=new Float32Array(S*3);if(Y)G.__normalArray=new Float32Array(S*3);if(X.hasTangents)G.__tangentArray=new Float32Array(S*4);if(fa)G.__colorArray=new Float32Array(S*3);if(aa){if(X.faceUvs.length>0||X.faceVertexUvs.length>0)G.__uvArray=new Float32Array(S*2);if(X.faceUvs.length>1||X.faceVertexUvs.length>1)G.__uv2Array=
 new Float32Array(S*2)}if(N.geometry.skinWeights.length&&N.geometry.skinIndices.length){G.__skinVertexAArray=new Float32Array(S*4);G.__skinVertexBArray=new Float32Array(S*4);G.__skinIndexArray=new Float32Array(S*4);G.__skinWeightArray=new Float32Array(S*4)}G.__faceArray=new Uint16Array(Q*3);G.__lineArray=new Uint16Array(R*2);var ca=void 0,ha=void 0;if(G.numMorphTargets){G.__morphTargetsArrays=[];ca=0;for(ha=G.numMorphTargets;ca<ha;ca++)G.__morphTargetsArrays.push(new Float32Array(S*3))}if(G.numMorphNormals){G.__morphNormalsArrays=
 [];ca=0;for(ha=G.numMorphNormals;ca<ha;ca++)G.__morphNormalsArrays.push(new Float32Array(S*3))}G.__webglFaceCount=Q*3;G.__webglLineCount=R*2;if(P.attributes){if(G.__webglCustomAttributesList===void 0)G.__webglCustomAttributesList=[];var Na=void 0;for(Na in P.attributes){var Sa=P.attributes[Na],oa={},la;for(la in Sa)oa[la]=Sa[la];if(!oa.__webglInitialized||oa.createUniqueBuffers){oa.__webglInitialized=true;var La=1;oa.type==="v2"?La=2:oa.type==="v3"?La=3:oa.type==="v4"?La=4:oa.type==="c"&&(La=3);oa.size=
 La;oa.array=new Float32Array(S*La);oa.buffer=k.createBuffer();oa.buffer.belongsToAttribute=Na;Sa.needsUpdate=true;oa.__original=Sa}G.__webglCustomAttributesList.push(oa)}}G.__inittedArrays=true;j.verticesNeedUpdate=true;j.morphTargetsNeedUpdate=true;j.elementsNeedUpdate=true;j.uvsNeedUpdate=true;j.normalsNeedUpdate=true;j.tangetsNeedUpdate=true;j.colorsNeedUpdate=true}}}}else if(g instanceof THREE.Ribbon){j=g.geometry;if(!j.__webglVertexBuffer){var Ta=j;Ta.__webglVertexBuffer=k.createBuffer();Ta.__webglColorBuffer=
@@ -426,8 +427,8 @@ s=d;d=0;for(h=s.length;d<h;d++){n=s[d];q.uniforms[n]=k.getUniformLocation(q,n)}d
 r.position>=0&&k.enableVertexAttribArray(r.position);r.color>=0&&k.enableVertexAttribArray(r.color);r.normal>=0&&k.enableVertexAttribArray(r.normal);r.tangent>=0&&k.enableVertexAttribArray(r.tangent);if(a.skinning&&r.skinVertexA>=0&&r.skinVertexB>=0&&r.skinIndex>=0&&r.skinWeight>=0){k.enableVertexAttribArray(r.skinVertexA);k.enableVertexAttribArray(r.skinVertexB);k.enableVertexAttribArray(r.skinIndex);k.enableVertexAttribArray(r.skinWeight)}if(a.attributes)for(f in a.attributes)r[f]!==void 0&&r[f]>=
 0&&k.enableVertexAttribArray(r[f]);if(a.morphTargets){a.numSupportedMorphTargets=0;b="morphTarget";for(f=0;f<this.maxMorphTargets;f++){s=b+f;if(r[s]>=0){k.enableVertexAttribArray(r[s]);a.numSupportedMorphTargets++}}}if(a.morphNormals){a.numSupportedMorphNormals=0;b="morphNormal";for(f=0;f<this.maxMorphNormals;f++){s=b+f;if(r[s]>=0){k.enableVertexAttribArray(r[s]);a.numSupportedMorphNormals++}}}a.uniformsList=[];for(e in a.uniforms)a.uniformsList.push([a.uniforms[e],e])};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.setObjectFaces=function(a){if(Z!==a.doubleSided){a.doubleSided?k.disable(k.CULL_FACE):k.enable(k.CULL_FACE);Z=a.doubleSided}if($!==a.flipSided){a.flipSided?k.frontFace(k.CW):k.frontFace(k.CCW);$=a.flipSided}};this.setDepthTest=function(a){if(Na!==a){a?k.enable(k.DEPTH_TEST):k.disable(k.DEPTH_TEST);
-Na=a}};this.setDepthWrite=function(a){if(oa!==a){k.depthMask(a);oa=a}};this.setBlending=function(a,b,c,d){if(a!==Y){switch(a){case THREE.NoBlending:k.disable(k.BLEND);break;case THREE.AdditiveBlending:k.enable(k.BLEND);k.blendEquation(k.FUNC_ADD);k.blendFunc(k.SRC_ALPHA,k.ONE);break;case THREE.SubtractiveBlending:k.enable(k.BLEND);k.blendEquation(k.FUNC_ADD);k.blendFunc(k.ZERO,k.ONE_MINUS_SRC_COLOR);break;case THREE.MultiplyBlending:k.enable(k.BLEND);k.blendEquation(k.FUNC_ADD);k.blendFunc(k.ZERO,
-k.SRC_COLOR);break;case THREE.CustomBlending:k.enable(k.BLEND);break;default: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!==ha){k.blendEquation(C(b));ha=b}if(c!==Sa||d!==La){k.blendFunc(C(c),C(d));Sa=c;La=d}}else La=Sa=ha=null};this.setTexture=function(a,b){if(a.needsUpdate){if(!a.__webglInit){a.__webglInit=true;a.__webglTexture=k.createTexture();D.info.memory.textures++}k.activeTexture(k.TEXTURE0+
+Na=a}};this.setDepthWrite=function(a){if(oa!==a){k.depthMask(a);oa=a}};this.setBlending=function(a,b,c,d){if(a!==X){switch(a){case THREE.NoBlending:k.disable(k.BLEND);break;case THREE.AdditiveBlending:k.enable(k.BLEND);k.blendEquation(k.FUNC_ADD);k.blendFunc(k.SRC_ALPHA,k.ONE);break;case THREE.SubtractiveBlending:k.enable(k.BLEND);k.blendEquation(k.FUNC_ADD);k.blendFunc(k.ZERO,k.ONE_MINUS_SRC_COLOR);break;case THREE.MultiplyBlending:k.enable(k.BLEND);k.blendEquation(k.FUNC_ADD);k.blendFunc(k.ZERO,
+k.SRC_COLOR);break;case THREE.CustomBlending:k.enable(k.BLEND);break;default: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)}X=a}if(a===THREE.CustomBlending){if(b!==ha){k.blendEquation(C(b));ha=b}if(c!==Sa||d!==La){k.blendFunc(C(c),C(d));Sa=c;La=d}}else La=Sa=ha=null};this.setTexture=function(a,b){if(a.needsUpdate){if(!a.__webglInit){a.__webglInit=true;a.__webglTexture=k.createTexture();D.info.memory.textures++}k.activeTexture(k.TEXTURE0+
 b);k.bindTexture(k.TEXTURE_2D,a.__webglTexture);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=C(a.format),f=C(a.type);s(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=C(a.format),e=C(a.type);if(b){a.__webglFramebuffer=[];a.__webglRenderbuffer=[];k.bindTexture(k.TEXTURE_CUBE_MAP,a.__webglTexture);s(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);x(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,
@@ -488,7 +489,7 @@ THREE.FontUtils={faces:{},face:"helvetiker",weight:"normal",style:"normal",size:
 c+d;l=b[a++]*c;p=b[a++]*c+d;r=b[a++]*c;e.quadraticCurveTo(p,r,i,l);if(g=f[f.length-1]){o=g.x;m=g.y;g=1;for(h=this.divisions;g<=h;g++){var u=g/h;THREE.Shape.Utils.b2(u,o,p,i);THREE.Shape.Utils.b2(u,m,r,l)}}break;case "b":i=b[a++]*c+d;l=b[a++]*c;p=b[a++]*c+d;r=b[a++]*-c;n=b[a++]*c+d;q=b[a++]*-c;e.bezierCurveTo(i,l,p,r,n,q);if(g=f[f.length-1]){o=g.x;m=g.y;g=1;for(h=this.divisions;g<=h;g++){u=g/h;THREE.Shape.Utils.b3(u,o,p,n,i);THREE.Shape.Utils.b3(u,m,r,q,l)}}}}}return{offset:t.ha*c,path:e}}}};
 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",e=b.weight!==void 0?b.weight:"normal",f=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=e;THREE.FontUtils.style=f;c=THREE.FontUtils.drawText(a).paths;d=[];e=0;for(f=c.length;e<f;e++)Array.prototype.push.apply(d,c[e].toShapes());return d};
 (function(a){var b=function(a){for(var b=a.length,e=0,f=b-1,g=0;g<b;f=g++)e=e+(a[f].x*a[g].y-a[g].x*a[f].y);return e*0.5};a.Triangulate=function(a,d){var e=a.length;if(e<3)return null;var f=[],g=[],h=[],i,j,l;if(b(a)>0)for(j=0;j<e;j++)g[j]=j;else for(j=0;j<e;j++)g[j]=e-1-j;var o=2*e;for(j=e-1;e>2;){if(o--<=0){console.log("Warning, unable to triangulate polygon!");break}i=j;e<=i&&(i=0);j=i+1;e<=j&&(j=0);l=j+1;e<=l&&(l=0);var m;a:{m=a;var p=i,r=j,n=l,q=e,t=g,u=void 0,w=void 0,s=void 0,x=void 0,F=void 0,
-C=void 0,z=void 0,v=void 0,H=void 0,w=m[t[p]].x,s=m[t[p]].y,x=m[t[r]].x,F=m[t[r]].y,C=m[t[n]].x,z=m[t[n]].y;if(1.0E-10>(x-w)*(z-s)-(F-s)*(C-w))m=false;else{for(u=0;u<q;u++)if(!(u==p||u==r||u==n)){var v=m[t[u]].x,H=m[t[u]].y,I=void 0,N=void 0,R=void 0,X=void 0,B=void 0,G=void 0,Q=void 0,D=void 0,k=void 0,P=void 0,M=void 0,S=void 0,I=R=B=void 0,I=C-x,N=z-F,R=w-C,X=s-z,B=x-w,G=F-s,Q=v-w,D=H-s,k=v-x,P=H-F,M=v-C,S=H-z,I=I*P-N*k,B=B*D-G*Q,R=R*S-X*M;if(I>=0&&R>=0&&B>=0){m=false;break a}}m=true}}if(m){f.push([a[g[i]],
+C=void 0,z=void 0,v=void 0,H=void 0,w=m[t[p]].x,s=m[t[p]].y,x=m[t[r]].x,F=m[t[r]].y,C=m[t[n]].x,z=m[t[n]].y;if(1.0E-10>(x-w)*(z-s)-(F-s)*(C-w))m=false;else{for(u=0;u<q;u++)if(!(u==p||u==r||u==n)){var v=m[t[u]].x,H=m[t[u]].y,I=void 0,N=void 0,R=void 0,Y=void 0,B=void 0,G=void 0,Q=void 0,D=void 0,k=void 0,P=void 0,M=void 0,S=void 0,I=R=B=void 0,I=C-x,N=z-F,R=w-C,Y=s-z,B=x-w,G=F-s,Q=v-w,D=H-s,k=v-x,P=H-F,M=v-C,S=H-z,I=I*P-N*k,B=B*D-G*Q,R=R*S-Y*M;if(I>=0&&R>=0&&B>=0){m=false;break a}}m=true}}if(m){f.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<e;i++,l++)g[i]=g[l];e--;o=2*e}}return d?h:f};a.Triangulate.area=b;return a})(THREE.FontUtils);self._typeface_js={faces:THREE.FontUtils.faces,loadFace:THREE.FontUtils.loadFace};
 THREE.BufferGeometry=function(){this.id=THREE.GeometryCount++;this.vertexColorArray=this.vertexUvArray=this.vertexNormalArray=this.vertexPositionArray=this.vertexIndexArray=this.vertexColorBuffer=this.vertexUvBuffer=this.vertexNormalBuffer=this.vertexPositionBuffer=this.vertexIndexBuffer=null;this.dynamic=false;this.boundingSphere=this.boundingBox=null;this.morphTargets=[]};THREE.BufferGeometry.prototype={constructor:THREE.BufferGeometry,computeBoundingBox:function(){},computeBoundingSphere:function(){}};
 THREE.Curve=function(){};THREE.Curve.prototype.getPoint=function(){console.log("Warning, getPoint() not implemented!");return null};THREE.Curve.prototype.getPointAt=function(a){return this.getPoint(this.getUtoTmapping(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};
@@ -635,10 +636,10 @@ THREE.ExtrudeGeometry.prototype.addShape=function(a,b){function c(a,b,c){b||cons
 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 e(c,d){var e,f;for(K=c.length;--K>=0;){e=K;f=K-1;f<0&&(f=
 c.length-1);for(var g=0,h=m+l*2,g=0;g<h;g++){var i=M*g,j=M*(g+1),k=d+e+i,i=d+f+i,n=d+f+j,j=d+e+j,o=c,p=g,r=h,q=e,s=f,k=k+N,i=i+N,n=n+N,j=j+N;I.faces.push(new THREE.Face4(k,i,n,j,null,null,u));k=w.generateSideWallUV(I,a,o,b,k,i,n,j,p,r,q,s);I.faceVertexUvs[0].push(k)}}}function f(a,b,c){I.vertices.push(new THREE.Vector3(a,b,c))}function g(c,d,e,f){c=c+N;d=d+N;e=e+N;I.faces.push(new THREE.Face3(c,d,e,null,null,t));c=f?w.generateBottomUV(I,a,b,c,d,e):w.generateTopUV(I,a,b,c,d,e);I.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,o=b.bevelEnabled!==void 0?b.bevelEnabled:true,m=b.steps!==void 0?b.steps:1,p=b.bendPath,r=b.extrudePath,n,q=false,t=b.material,u=b.extrudeMaterial,w=b.UVGenerator!==void 0?b.UVGenerator:THREE.ExtrudeGeometry.WorldUVGenerator,s,x,F,C;if(r){n=r.getSpacedPoints(m);q=true;o=false;s=b.frames!==void 0?b.frames:new THREE.TubeGeometry.FrenetFrames(r,
-m,false);x=new THREE.Vector3;F=new THREE.Vector3;C=new THREE.Vector3}if(!o)j=i=l=0;var z,v,H,I=this,N=this.vertices.length;p&&a.addWrapPath(p);var r=a.extractPoints(),p=r.shape,R=r.holes;if(r=!THREE.Shape.Utils.isClockWise(p)){p=p.reverse();v=0;for(H=R.length;v<H;v++){z=R[v];THREE.Shape.Utils.isClockWise(z)&&(R[v]=z.reverse())}r=false}var X=THREE.Shape.Utils.triangulateShape(p,R),B=p;v=0;for(H=R.length;v<H;v++){z=R[v];p=p.concat(z)}var G,Q,D,k,P,M=p.length,S,aa=X.length,r=[],K=0;D=B.length;G=D-1;
+m,false);x=new THREE.Vector3;F=new THREE.Vector3;C=new THREE.Vector3}if(!o)j=i=l=0;var z,v,H,I=this,N=this.vertices.length;p&&a.addWrapPath(p);var r=a.extractPoints(),p=r.shape,R=r.holes;if(r=!THREE.Shape.Utils.isClockWise(p)){p=p.reverse();v=0;for(H=R.length;v<H;v++){z=R[v];THREE.Shape.Utils.isClockWise(z)&&(R[v]=z.reverse())}r=false}var Y=THREE.Shape.Utils.triangulateShape(p,R),B=p;v=0;for(H=R.length;v<H;v++){z=R[v];p=p.concat(z)}var G,Q,D,k,P,M=p.length,S,aa=Y.length,r=[],K=0;D=B.length;G=D-1;
 for(Q=K+1;K<D;K++,G++,Q++){G===D&&(G=0);Q===D&&(Q=0);r[K]=d(B[K],B[G],B[Q])}var ca=[],fa,O=r.concat();v=0;for(H=R.length;v<H;v++){z=R[v];fa=[];K=0;D=z.length;G=D-1;for(Q=K+1;K<D;K++,G++,Q++){G===D&&(G=0);Q===D&&(Q=0);fa[K]=d(z[K],z[G],z[Q])}ca.push(fa);O=O.concat(fa)}for(G=0;G<l;G++){D=G/l;k=i*(1-D);Q=j*Math.sin(D*Math.PI/2);K=0;for(D=B.length;K<D;K++){P=c(B[K],r[K],Q);f(P.x,P.y,-k)}v=0;for(H=R.length;v<H;v++){z=R[v];fa=ca[v];K=0;for(D=z.length;K<D;K++){P=c(z[K],fa[K],Q);f(P.x,P.y,-k)}}}Q=j;for(K=
 0;K<M;K++){P=o?c(p[K],O[K],Q):p[K];if(q){F.copy(s.normals[0]).multiplyScalar(P.x);x.copy(s.binormals[0]).multiplyScalar(P.y);C.copy(n[0]).addSelf(F).addSelf(x);f(C.x,C.y,C.z)}else f(P.x,P.y,0)}for(D=1;D<=m;D++)for(K=0;K<M;K++){P=o?c(p[K],O[K],Q):p[K];if(q){F.copy(s.normals[D]).multiplyScalar(P.x);x.copy(s.binormals[D]).multiplyScalar(P.y);C.copy(n[D]).addSelf(F).addSelf(x);f(C.x,C.y,C.z)}else f(P.x,P.y,h/m*D)}for(G=l-1;G>=0;G--){D=G/l;k=i*(1-D);Q=j*Math.sin(D*Math.PI/2);K=0;for(D=B.length;K<D;K++){P=
-c(B[K],r[K],Q);f(P.x,P.y,h+k)}v=0;for(H=R.length;v<H;v++){z=R[v];fa=ca[v];K=0;for(D=z.length;K<D;K++){P=c(z[K],fa[K],Q);q?f(P.x,P.y+n[m-1].y,n[m-1].x+k):f(P.x,P.y,h+k)}}}(function(){if(o){var a;a=M*0;for(K=0;K<aa;K++){S=X[K];g(S[2]+a,S[1]+a,S[0]+a,true)}a=m+l*2;a=M*a;for(K=0;K<aa;K++){S=X[K];g(S[0]+a,S[1]+a,S[2]+a,false)}}else{for(K=0;K<aa;K++){S=X[K];g(S[2],S[1],S[0],true)}for(K=0;K<aa;K++){S=X[K];g(S[0]+M*m,S[1]+M*m,S[2]+M*m,false)}}})();(function(){var a=0;e(B,a);a=a+B.length;v=0;for(H=R.length;v<
+c(B[K],r[K],Q);f(P.x,P.y,h+k)}v=0;for(H=R.length;v<H;v++){z=R[v];fa=ca[v];K=0;for(D=z.length;K<D;K++){P=c(z[K],fa[K],Q);q?f(P.x,P.y+n[m-1].y,n[m-1].x+k):f(P.x,P.y,h+k)}}}(function(){if(o){var a;a=M*0;for(K=0;K<aa;K++){S=Y[K];g(S[2]+a,S[1]+a,S[0]+a,true)}a=m+l*2;a=M*a;for(K=0;K<aa;K++){S=Y[K];g(S[0]+a,S[1]+a,S[2]+a,false)}}else{for(K=0;K<aa;K++){S=Y[K];g(S[2],S[1],S[0],true)}for(K=0;K<aa;K++){S=Y[K];g(S[0]+M*m,S[1]+M*m,S[2]+M*m,false)}}})();(function(){var a=0;e(B,a);a=a+B.length;v=0;for(H=R.length;v<
 H;v++){z=R[v];e(z,a);a=a+z.length}})()};
 THREE.ExtrudeGeometry.WorldUVGenerator={generateTopUV:function(a,b,c,d,e,f){b=a.vertices[e].x;e=a.vertices[e].y;c=a.vertices[f].x;f=a.vertices[f].y;return[new THREE.UV(a.vertices[d].x,1-a.vertices[d].y),new THREE.UV(b,1-e),new THREE.UV(c,1-f)]},generateBottomUV:function(a,b,c,d,e,f){return this.generateTopUV(a,b,c,d,e,f)},generateSideWallUV:function(a,b,c,d,e,f,g,h){var b=a.vertices[e].x,c=a.vertices[e].y,e=a.vertices[e].z,d=a.vertices[f].x,i=a.vertices[f].y,f=a.vertices[f].z,j=a.vertices[g].x,l=
 a.vertices[g].y,g=a.vertices[g].z,o=a.vertices[h].x,m=a.vertices[h].y,a=a.vertices[h].z;return Math.abs(c-i)<0.01?[new THREE.UV(b,e),new THREE.UV(d,f),new THREE.UV(j,g),new THREE.UV(o,a)]:[new THREE.UV(c,e),new THREE.UV(i,f),new THREE.UV(l,g),new THREE.UV(m,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;
@@ -689,12 +690,12 @@ THREE.CameraHelper.prototype.update=function(){function a(a,d,e,f){THREE.CameraH
 THREE.SubdivisionModifier=function(a){this.subdivisions=a===void 0?1:a;this.useOldVertexColors=false;this.supportUVs=true;this.debug=false};THREE.SubdivisionModifier.prototype.constructor=THREE.SubdivisionModifier;THREE.SubdivisionModifier.prototype.modify=function(a){for(var b=this.subdivisions;b-- >0;)this.smooth(a)};
 THREE.SubdivisionModifier.prototype.smooth=function(a){function b(){m.debug&&console.log.apply(console,arguments)}function c(){console&&console.log.apply(console,arguments)}function d(a,c,d,e,g,h,i){var j=new THREE.Face4(a,c,d,e,null,g.color,g.materialIndex);if(m.useOldVertexColors){j.vertexColors=[];for(var k,n,p,q=0;q<4;q++){p=h[q];k=new THREE.Color;k.setRGB(0,0,0);for(var r=0;r<p.length;r++){n=g.vertexColors[p[r]-1];k.r=k.r+n.r;k.g=k.g+n.g;k.b=k.b+n.b}k.r=k.r/p.length;k.g=k.g/p.length;k.b=k.b/
 p.length;j.vertexColors[q]=k}}l.push(j);if(m.supportUVs){g=[f(a,""),f(c,i),f(d,i),f(e,i)];g[0]?g[1]?g[2]?g[3]?o.push(g):b("d :( ",e+":"+i):b("c :( ",d+":"+i):b("b :( ",c+":"+i):b("a :( ",a+":"+i)}}function e(a,b){return Math.min(a,b)+"_"+Math.max(a,b)}function f(a,d){var e=a+":"+d,f=u[e];if(!f){a>=w&&a<w+r.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 u?c("dup vertexNo",a,"oldFaceNo",b,"value",d,"key",e,u[e]):u[e]=d}function h(a,
-b){R[a]===void 0&&(R[a]=[]);R[a].push(b)}function i(a,b,c){X[a]===void 0&&(X[a]={});X[a][b]=c}var j=[],l=[],o=[],m=this,p=a.vertices,r=a.faces,j=p.concat(),n=[],q={},t={},u={},w=p.length,s,x,F,C,z,v=a.faceVertexUvs[0],H;b("originalFaces, uvs, originalVerticesLength",r.length,v.length,w);if(m.supportUVs){s=0;for(x=v.length;s<x;s++){F=0;for(C=v[s].length;F<C;F++){H=r[s]["abcd".charAt(F)];g(H,s,v[s][F])}}}if(v.length==0)m.supportUVs=false;s=0;for(z in u)s++;if(!s){m.supportUVs=false;b("no uvs")}b("-- Original Faces + Vertices UVs completed",
+b){R[a]===void 0&&(R[a]=[]);R[a].push(b)}function i(a,b,c){Y[a]===void 0&&(Y[a]={});Y[a][b]=c}var j=[],l=[],o=[],m=this,p=a.vertices,r=a.faces,j=p.concat(),n=[],q={},t={},u={},w=p.length,s,x,F,C,z,v=a.faceVertexUvs[0],H;b("originalFaces, uvs, originalVerticesLength",r.length,v.length,w);if(m.supportUVs){s=0;for(x=v.length;s<x;s++){F=0;for(C=v[s].length;F<C;F++){H=r[s]["abcd".charAt(F)];g(H,s,v[s][F])}}}if(v.length==0)m.supportUVs=false;s=0;for(z in u)s++;if(!s){m.supportUVs=false;b("no uvs")}b("-- Original Faces + Vertices UVs completed",
 u,"vs",v.length);s=0;for(x=r.length;s<x;s++){z=r[s];n.push(z.centroid);j.push(z.centroid);if(m.supportUVs){v=new THREE.UV;if(z instanceof THREE.Face3){v.u=f(z.a,s).u+f(z.b,s).u+f(z.c,s).u;v.v=f(z.a,s).v+f(z.b,s).v+f(z.c,s).v;v.u=v.u/3;v.v=v.v/3}else if(z instanceof THREE.Face4){v.u=f(z.a,s).u+f(z.b,s).u+f(z.c,s).u+f(z.d,s).u;v.v=f(z.a,s).v+f(z.b,s).v+f(z.c,s).v+f(z.d,s).v;v.u=v.u/4;v.v=v.v/4}g(w+s,"",v)}}b("-- added UVs for new Faces",u);x=function(a){function b(a,c){h[a]===void 0&&(h[a]=[]);h[a].push(c)}
-var c,d,f,g,h={};c=0;for(d=a.faces.length;c<d;c++){f=a.faces[c];if(f instanceof THREE.Face3){g=e(f.a,f.b);b(g,c);g=e(f.b,f.c);b(g,c);g=e(f.c,f.a);b(g,c)}else if(f instanceof THREE.Face4){g=e(f.a,f.b);b(g,c);g=e(f.b,f.c);b(g,c);g=e(f.c,f.d);b(g,c);g=e(f.d,f.a);b(g,c)}}return h}(a);H=0;var I,N,R={},X={};for(s in x){v=x[s];I=s.split("_");N=I[0];I=I[1];h(N,[N,I]);h(I,[N,I]);F=0;for(C=v.length;F<C;F++){z=v[F];i(N,z,s);i(I,z,s)}v.length<2&&(t[s]=true)}b("vertexEdgeMap",R,"vertexFaceMap",X);for(s in x){v=
+var c,d,f,g,h={};c=0;for(d=a.faces.length;c<d;c++){f=a.faces[c];if(f instanceof THREE.Face3){g=e(f.a,f.b);b(g,c);g=e(f.b,f.c);b(g,c);g=e(f.c,f.a);b(g,c)}else if(f instanceof THREE.Face4){g=e(f.a,f.b);b(g,c);g=e(f.b,f.c);b(g,c);g=e(f.c,f.d);b(g,c);g=e(f.d,f.a);b(g,c)}}return h}(a);H=0;var I,N,R={},Y={};for(s in x){v=x[s];I=s.split("_");N=I[0];I=I[1];h(N,[N,I]);h(I,[N,I]);F=0;for(C=v.length;F<C;F++){z=v[F];i(N,z,s);i(I,z,s)}v.length<2&&(t[s]=true)}b("vertexEdgeMap",R,"vertexFaceMap",Y);for(s in x){v=
 x[s];z=v[0];C=v[1];I=s.split("_");N=I[0];I=I[1];v=new THREE.Vector3;if(t[s]){v.addSelf(p[N]);v.addSelf(p[I]);v.multiplyScalar(0.5)}else{v.addSelf(n[z]);v.addSelf(n[C]);v.addSelf(p[N]);v.addSelf(p[I]);v.multiplyScalar(0.25)}q[s]=w+r.length+H;j.push(v);H++;if(m.supportUVs){v=new THREE.UV;v.u=f(N,z).u+f(I,z).u;v.v=f(N,z).v+f(I,z).v;v.u=v.u/2;v.v=v.v/2;g(q[s],z,v);if(!t[s]){v=new THREE.UV;v.u=f(N,C).u+f(I,C).u;v.v=f(N,C).v+f(I,C).v;v.u=v.u/2;v.v=v.v/2;g(q[s],C,v)}}}b("-- Step 2 done");var B,G;C=["123",
 "12","2","23"];I=["123","23","3","31"];var Q=["123","31","1","12"],D=["1234","12","2","23"],k=["1234","23","3","34"],P=["1234","34","4","41"],M=["1234","41","1","12"];s=0;for(x=n.length;s<x;s++){z=r[s];v=w+s;if(z instanceof THREE.Face3){H=e(z.a,z.b);N=e(z.b,z.c);B=e(z.c,z.a);d(v,q[H],z.b,q[N],z,C,s);d(v,q[N],z.c,q[B],z,I,s);d(v,q[B],z.a,q[H],z,Q,s)}else if(z instanceof THREE.Face4){H=e(z.a,z.b);N=e(z.b,z.c);B=e(z.c,z.d);G=e(z.d,z.a);d(v,q[H],z.b,q[N],z,D,s);d(v,q[N],z.c,q[B],z,k,s);d(v,q[B],z.d,q[G],
-z,P,s);d(v,q[G],z.a,q[H],z,M,s)}else b("face should be a face!",z)}q=new THREE.Vector3;z=new THREE.Vector3;s=0;for(x=p.length;s<x;s++)if(R[s]!==void 0){q.set(0,0,0);z.set(0,0,0);N=new THREE.Vector3(0,0,0);v=0;for(F in X[s]){q.addSelf(n[F]);v++}C=0;H=R[s].length;for(F=0;F<H;F++)t[e(R[s][F][0],R[s][F][1])]&&C++;if(C!=2){q.divideScalar(v);for(F=0;F<H;F++){v=R[s][F];v=p[v[0]].clone().addSelf(p[v[1]]).divideScalar(2);z.addSelf(v)}z.divideScalar(H);N.addSelf(p[s]);N.multiplyScalar(H-3);N.addSelf(q);N.addSelf(z.multiplyScalar(2));
+z,P,s);d(v,q[G],z.a,q[H],z,M,s)}else b("face should be a face!",z)}q=new THREE.Vector3;z=new THREE.Vector3;s=0;for(x=p.length;s<x;s++)if(R[s]!==void 0){q.set(0,0,0);z.set(0,0,0);N=new THREE.Vector3(0,0,0);v=0;for(F in Y[s]){q.addSelf(n[F]);v++}C=0;H=R[s].length;for(F=0;F<H;F++)t[e(R[s][F][0],R[s][F][1])]&&C++;if(C!=2){q.divideScalar(v);for(F=0;F<H;F++){v=R[s][F];v=p[v[0]].clone().addSelf(p[v[1]]).divideScalar(2);z.addSelf(v)}z.divideScalar(H);N.addSelf(p[s]);N.multiplyScalar(H-3);N.addSelf(q);N.addSelf(z.multiplyScalar(2));
 N.divideScalar(H);j[s]=N}}a.vertices=j;a.faces=l;a.faceVertexUvs[0]=o;delete a.__tmpVertices;a.computeCentroids();a.computeFaceNormals();a.computeVertexNormals()};THREE.ImmediateRenderObject=function(){THREE.Object3D.call(this);this.render=function(){}};THREE.ImmediateRenderObject.prototype=new THREE.Object3D;THREE.ImmediateRenderObject.prototype.constructor=THREE.ImmediateRenderObject;
 THREE.LensFlare=function(a,b,c,d,e){THREE.Object3D.call(this);this.lensFlares=[];this.positionScreen=new THREE.Vector3;this.customUpdateCallback=void 0;a!==void 0&&this.add(a,b,c,d,e)};THREE.LensFlare.prototype=new THREE.Object3D;THREE.LensFlare.prototype.constructor=THREE.LensFlare;
 THREE.LensFlare.prototype.add=function(a,b,c,d,e,f){b===void 0&&(b=-1);c===void 0&&(c=0);f===void 0&&(f=1);e===void 0&&(e=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:f,color:e,blending:d})};
@@ -712,9 +713,9 @@ THREE.LensFlarePlugin=function(){function a(a){var c=b.createProgram(),d=b.creat
 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)}o={};m={};o.vertex=b.getAttribLocation(l,"position");o.uv=b.getAttribLocation(l,"uv");m.renderType=b.getUniformLocation(l,"renderType");m.map=b.getUniformLocation(l,"map");m.occlusionMap=b.getUniformLocation(l,"occlusionMap");m.opacity=b.getUniformLocation(l,"opacity");m.color=b.getUniformLocation(l,
 "color");m.scale=b.getUniformLocation(l,"scale");m.rotation=b.getUniformLocation(l,"rotation");m.screenPosition=b.getUniformLocation(l,"screenPosition");p=false};this.render=function(a,d,e,t){var a=a.__webglFlares,u=a.length;if(u){var w=new THREE.Vector3,s=t/e,x=e*0.5,F=t*0.5,C=16/t,z=new THREE.Vector2(C*s,C),v=new THREE.Vector3(1,1,0),H=new THREE.Vector2(1,1),I=m,C=o;b.useProgram(l);if(!p){b.enableVertexAttribArray(o.vertex);b.enableVertexAttribArray(o.uv);p=true}b.uniform1i(I.occlusionMap,0);b.uniform1i(I.map,
-1);b.bindBuffer(b.ARRAY_BUFFER,f);b.vertexAttribPointer(C.vertex,2,b.FLOAT,false,16,0);b.vertexAttribPointer(C.uv,2,b.FLOAT,false,16,8);b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,g);b.disable(b.CULL_FACE);b.depthMask(false);var N,R,X,B,G;for(N=0;N<u;N++){C=16/t;z.set(C*s,C);B=a[N];w.set(B.matrixWorld.elements[12],B.matrixWorld.elements[13],B.matrixWorld.elements[14]);d.matrixWorldInverse.multiplyVector3(w);d.projectionMatrix.multiplyVector3(w);v.copy(w);H.x=v.x*x+x;H.y=v.y*F+F;if(j||H.x>0&&H.x<e&&H.y>0&&
+1);b.bindBuffer(b.ARRAY_BUFFER,f);b.vertexAttribPointer(C.vertex,2,b.FLOAT,false,16,0);b.vertexAttribPointer(C.uv,2,b.FLOAT,false,16,8);b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,g);b.disable(b.CULL_FACE);b.depthMask(false);var N,R,Y,B,G;for(N=0;N<u;N++){C=16/t;z.set(C*s,C);B=a[N];w.set(B.matrixWorld.elements[12],B.matrixWorld.elements[13],B.matrixWorld.elements[14]);d.matrixWorldInverse.multiplyVector3(w);d.projectionMatrix.multiplyVector3(w);v.copy(w);H.x=v.x*x+x;H.y=v.y*F+F;if(j||H.x>0&&H.x<e&&H.y>0&&
 H.y<t){b.activeTexture(b.TEXTURE1);b.bindTexture(b.TEXTURE_2D,h);b.copyTexImage2D(b.TEXTURE_2D,0,b.RGB,H.x-8,H.y-8,16,16,0);b.uniform1i(I.renderType,0);b.uniform2f(I.scale,z.x,z.y);b.uniform3f(I.screenPosition,v.x,v.y,v.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,H.x-8,H.y-8,16,16,0);b.uniform1i(I.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);B.positionScreen.copy(v);B.customUpdateCallback?B.customUpdateCallback(B):B.updateLensFlares();b.uniform1i(I.renderType,2);b.enable(b.BLEND);R=0;for(X=B.lensFlares.length;R<X;R++){G=B.lensFlares[R];if(G.opacity>0.0010&&G.scale>0.0010){v.x=G.x;v.y=G.y;v.z=G.z;C=G.size*G.scale/t;z.x=C*s;z.y=C;b.uniform3f(I.screenPosition,v.x,v.y,v.z);b.uniform2f(I.scale,z.x,z.y);b.uniform1f(I.rotation,G.rotation);b.uniform1f(I.opacity,G.opacity);
+b.bindTexture(b.TEXTURE_2D,h);b.drawElements(b.TRIANGLES,6,b.UNSIGNED_SHORT,0);B.positionScreen.copy(v);B.customUpdateCallback?B.customUpdateCallback(B):B.updateLensFlares();b.uniform1i(I.renderType,2);b.enable(b.BLEND);R=0;for(Y=B.lensFlares.length;R<Y;R++){G=B.lensFlares[R];if(G.opacity>0.0010&&G.scale>0.0010){v.x=G.x;v.y=G.y;v.z=G.z;C=G.size*G.scale/t;z.x=C*s;z.y=C;b.uniform3f(I.screenPosition,v.x,v.y,v.z);b.uniform2f(I.scale,z.x,z.y);b.uniform1f(I.rotation,G.rotation);b.uniform1f(I.opacity,G.opacity);
 b.uniform3f(I.color,G.color.r,G.color.g,G.color.b);c.setBlending(G.blending,G.blendEquation,G.blendSrc,G.blendDst);c.setTexture(G.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,e=new THREE.Frustum,f=new THREE.Matrix4,g=new THREE.Vector3,h=new THREE.Vector3;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,c){b.shadowMapEnabled&&b.shadowMapAutoUpdate&&this.update(a,c)};this.update=function(i,j){var l,o,m,p,r,n,q,t,u,w=[];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);l=0;for(o=i.__lights.length;l<o;l++){m=i.__lights[l];if(m.castShadow)if(m instanceof THREE.DirectionalLight&&m.shadowCascade)for(r=0;r<m.shadowCascadeCount;r++){var s;if(m.shadowCascadeArray[r])s=m.shadowCascadeArray[r];

+ 38 - 37
build/custom/ThreeCanvas.js

@@ -28,9 +28,9 @@ THREE.EventTarget=function(){var a={};this.addEventListener=function(b,c){a[b]==
 THREE.Frustum.prototype.setFromMatrix=function(a){var b,c=this.planes,d=a.elements,a=d[0];b=d[1];var f=d[2],e=d[3],g=d[4],m=d[5],k=d[6],l=d[7],h=d[8],n=d[9],j=d[10],o=d[11],q=d[12],i=d[13],p=d[14],d=d[15];c[0].set(e-a,l-g,o-h,d-q);c[1].set(e+a,l+g,o+h,d+q);c[2].set(e+b,l+m,o+n,d+i);c[3].set(e-b,l-m,o-n,d-i);c[4].set(e-f,l-k,o-j,d-p);c[5].set(e+f,l+k,o+j,d+p);for(a=0;a<6;a++){b=c[a];b.divideScalar(Math.sqrt(b.x*b.x+b.y*b.y+b.z*b.z))}};
 THREE.Frustum.prototype.contains=function(a){for(var b=this.planes,c=a.matrixWorld,d=c.elements,c=-a.geometry.boundingSphere.radius*c.getMaxScaleOnAxis(),f=0;f<6;f++){a=b[f].x*d[12]+b[f].y*d[13]+b[f].z*d[14]+b[f].w;if(a<=c)return false}return true};THREE.Frustum.__v1=new THREE.Vector3;
 THREE.Ray=function(a,b,c,d){this.origin=a||new THREE.Vector3;this.direction=b||new THREE.Vector3;this.near=c||0;this.far=d||Infinity;var f=new THREE.Vector3,e=new THREE.Vector3,g=new THREE.Vector3,m=new THREE.Vector3,k=new THREE.Vector3,l=new THREE.Vector3,h=new THREE.Vector3,n=new THREE.Vector3,j=new THREE.Vector3,o=function(a,b){return a.distance-b.distance},q=new THREE.Vector3,i=new THREE.Vector3,p=new THREE.Vector3,r,s,v,A=function(a,b,c){q.sub(c,a);r=q.dot(b);s=i.add(a,p.copy(b).multiplyScalar(r));
-return v=c.distanceTo(s)},w,B,x,F,u,z,D,H,P=function(a,b,c,d){q.sub(d,b);i.sub(c,b);p.sub(a,b);w=q.dot(q);B=q.dot(i);x=q.dot(p);F=i.dot(i);u=i.dot(p);z=1/(w*F-B*B);D=(F*x-B*u)*z;H=(w*u-B*x)*z;return D>=0&&H>=0&&D+H<1},L=1.0E-4;this.setPrecision=function(a){L=a};this.intersectObject=function(a){var b,c=[];if(a instanceof THREE.Particle){v=A(this.origin,this.direction,a.matrixWorld.getPosition());if(v>a.scale.x)return[];b={distance:v,point:a.position,face:null,object:a};c.push(b)}else if(a instanceof
+return v=c.distanceTo(s)},w,B,x,F,u,z,D,H,P=function(a,b,c,d){q.sub(d,b);i.sub(c,b);p.sub(a,b);w=q.dot(q);B=q.dot(i);x=q.dot(p);F=i.dot(i);u=i.dot(p);z=1/(w*F-B*B);D=(F*x-B*u)*z;H=(w*u-B*x)*z;return D>=0&&H>=0&&D+H<1},M=1.0E-4;this.setPrecision=function(a){M=a};this.intersectObject=function(a){var b,c=[];if(a instanceof THREE.Particle){v=A(this.origin,this.direction,a.matrixWorld.getPosition());if(v>a.scale.x)return[];b={distance:v,point:a.position,face:null,object:a};c.push(b)}else if(a instanceof
 THREE.Mesh){var d=THREE.Frustum.__v1.set(a.matrixWorld.getColumnX().length(),a.matrixWorld.getColumnY().length(),a.matrixWorld.getColumnZ().length()),d=a.geometry.boundingSphere.radius*Math.max(d.x,Math.max(d.y,d.z));v=A(this.origin,this.direction,a.matrixWorld.getPosition());if(v>d)return c;var i,q,y,S=a.geometry,p=S.vertices,r;a.matrixRotationWorld.extractRotation(a.matrixWorld);d=0;for(i=S.faces.length;d<i;d++){b=S.faces[d];k.copy(this.origin);l.copy(this.direction);r=a.matrixWorld;h=r.multiplyVector3(h.copy(b.centroid)).subSelf(k);
-n=a.matrixRotationWorld.multiplyVector3(n.copy(b.normal));q=l.dot(n);if(!(Math.abs(q)<L)){y=n.dot(h)/q;if(!(y<0)&&(a.doubleSided||(a.flipSided?q>0:q<0))){j.add(k,l.multiplyScalar(y));v=k.distanceTo(j);if(!(v<this.near)&&!(v>this.far))if(b instanceof THREE.Face3){f=r.multiplyVector3(f.copy(p[b.a]));e=r.multiplyVector3(e.copy(p[b.b]));g=r.multiplyVector3(g.copy(p[b.c]));if(P(j,f,e,g)){b={distance:v,point:j.clone(),face:b,object:a};c.push(b)}}else if(b instanceof THREE.Face4){f=r.multiplyVector3(f.copy(p[b.a]));
+n=a.matrixRotationWorld.multiplyVector3(n.copy(b.normal));q=l.dot(n);if(!(Math.abs(q)<M)){y=n.dot(h)/q;if(!(y<0)&&(a.doubleSided||(a.flipSided?q>0:q<0))){j.add(k,l.multiplyScalar(y));v=k.distanceTo(j);if(!(v<this.near)&&!(v>this.far))if(b instanceof THREE.Face3){f=r.multiplyVector3(f.copy(p[b.a]));e=r.multiplyVector3(e.copy(p[b.b]));g=r.multiplyVector3(g.copy(p[b.c]));if(P(j,f,e,g)){b={distance:v,point:j.clone(),face:b,object:a};c.push(b)}}else if(b instanceof THREE.Face4){f=r.multiplyVector3(f.copy(p[b.a]));
 e=r.multiplyVector3(e.copy(p[b.b]));g=r.multiplyVector3(g.copy(p[b.c]));m=r.multiplyVector3(m.copy(p[b.d]));if(P(j,f,e,m)||P(j,e,g,m)){b={distance:v,point:j.clone(),face:b,object:a};c.push(b)}}}}}}c.sort(o);return c};this.intersectObjects=function(a){for(var b=[],c=0,d=a.length;c<d;c++)Array.prototype.push.apply(b,this.intersectObject(a[c]));b.sort(o);return b}};
 THREE.Rectangle=function(){function a(){e=d-b;g=f-c}var b,c,d,f,e,g,m=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,h,n){m=false;b=e;c=g;d=h;f=n;a()};this.addPoint=function(e,g){if(m){m=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,h,n,j,o){if(m){m=false;b=e<h?e<j?e:j:h<j?h:j;c=g<n?g<o?g:o:n<o?n:o;d=e>h?e>j?e:j:h>j?h:j;f=g>n?g>o?g:o:n>o?n:o}else{b=e<h?e<j?e<b?e:b:j<b?j:b:h<j?h<b?h:b:j<b?j:b;c=g<n?g<o?g<c?g:c:o<c?o:c:n<o?n<c?n:c:o<c?o:c;d=e>h?e>j?e>d?e:d:j>d?j:d:h>j?h>d?h:d:j>d?j:d;f=g>n?g>o?g>f?g:f:o>f?o:f:n>o?n>f?n:f:o>f?o:f}a()};this.addRectangle=function(e){if(m){m=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();
@@ -40,7 +40,7 @@ THREE.Matrix3.prototype={constructor:THREE.Matrix3,getInverse:function(a){var b=
 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,m,k,l,h,n,j,o,q,i){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,m||0,k||0,l||0,h!==void 0?h:1,n||0,j||0,o||0,q||0,i!==void 0?i:1)};
 THREE.Matrix4.prototype={constructor:THREE.Matrix4,set:function(a,b,c,d,f,e,g,m,k,l,h,n,j,o,q,i){var p=this.elements;p[0]=a;p[4]=b;p[8]=c;p[12]=d;p[1]=f;p[5]=e;p[9]=g;p[13]=m;p[2]=k;p[6]=l;p[10]=h;p[14]=n;p[3]=j;p[7]=o;p[11]=q;p[15]=i;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+1.0E-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],m=c[8],k=c[12],l=c[1],h=c[5],n=c[9],j=c[13],o=c[2],q=c[6],i=c[10],p=c[14],r=c[3],s=c[7],v=c[11],c=c[15],A=d[0],w=d[4],
-B=d[8],x=d[12],F=d[1],u=d[5],z=d[9],D=d[13],H=d[2],P=d[6],L=d[10],t=d[14],E=d[3],G=d[7],N=d[11],d=d[15];f[0]=e*A+g*F+m*H+k*E;f[4]=e*w+g*u+m*P+k*G;f[8]=e*B+g*z+m*L+k*N;f[12]=e*x+g*D+m*t+k*d;f[1]=l*A+h*F+n*H+j*E;f[5]=l*w+h*u+n*P+j*G;f[9]=l*B+h*z+n*L+j*N;f[13]=l*x+h*D+n*t+j*d;f[2]=o*A+q*F+i*H+p*E;f[6]=o*w+q*u+i*P+p*G;f[10]=o*B+q*z+i*L+p*N;f[14]=o*x+q*D+i*t+p*d;f[3]=r*A+s*F+v*H+c*E;f[7]=r*w+s*u+v*P+c*G;f[11]=r*B+s*z+v*L+c*N;f[15]=r*x+s*D+v*t+c*d;return this},multiplySelf:function(a){return this.multiply(this,
+B=d[8],x=d[12],F=d[1],u=d[5],z=d[9],D=d[13],H=d[2],P=d[6],M=d[10],t=d[14],E=d[3],G=d[7],N=d[11],d=d[15];f[0]=e*A+g*F+m*H+k*E;f[4]=e*w+g*u+m*P+k*G;f[8]=e*B+g*z+m*M+k*N;f[12]=e*x+g*D+m*t+k*d;f[1]=l*A+h*F+n*H+j*E;f[5]=l*w+h*u+n*P+j*G;f[9]=l*B+h*z+n*M+j*N;f[13]=l*x+h*D+n*t+j*d;f[2]=o*A+q*F+i*H+p*E;f[6]=o*w+q*u+i*P+p*G;f[10]=o*B+q*z+i*M+p*N;f[14]=o*x+q*D+i*t+p*d;f[3]=r*A+s*F+v*H+c*E;f[7]=r*w+s*u+v*P+c*G;f[11]=r*B+s*z+v*M+c*N;f[15]=r*x+s*D+v*t+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},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]*a.z+b[15]*a.w:1;return c},determinant:function(){var a=this.elements,b=a[0],c=a[4],d=a[8],f=a[12],e=a[1],g=a[5],m=a[9],k=a[13],l=a[2],h=a[6],n=a[10],j=a[14],o=a[3],q=a[7],
@@ -72,13 +72,13 @@ this.matrix):this.matrixWorld.copy(this.matrix);this.matrixWorldNeedsUpdate=fals
 THREE.Projector=function(){function a(){var a=g[e]=g[e]||new THREE.RenderableObject;e++;return a}function b(){var a=l[k]=l[k]||new THREE.RenderableVertex;k++;return a}function c(a,b){return b.z-a.z}function d(a,b){var c=0,d=1,e=a.z+a.w,g=b.z+b.w,f=-a.z+a.w,h=-b.z+b.w;if(e>=0&&g>=0&&f>=0&&h>=0)return true;if(e<0&&g<0||f<0&&h<0)return false;e<0?c=Math.max(c,e/(e-g)):g<0&&(d=Math.min(d,e/(e-g)));f<0?c=Math.max(c,f/(f-h)):h<0&&(d=Math.min(d,f/(f-h)));if(d<c)return false;a.lerpSelf(b,c);b.lerpSelf(a,1-
 d);return true}var f,e,g=[],m,k,l=[],h,n,j=[],o,q=[],i,p,r=[],s,v,A=[],w={objects:[],sprites:[],lights:[],elements:[]},B=new THREE.Vector3,x=new THREE.Vector4,F=new THREE.Matrix4,u=new THREE.Matrix4,z=new THREE.Frustum,D=new THREE.Vector4,H=new THREE.Vector4;this.projectVector=function(a,b){b.matrixWorldInverse.getInverse(b.matrixWorld);F.multiply(b.projectionMatrix,b.matrixWorldInverse);F.multiplyVector3(a);return a};this.unprojectVector=function(a,b){b.projectionMatrixInverse.getInverse(b.projectionMatrix);
 F.multiply(b.matrixWorld,b.projectionMatrixInverse);F.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.projectGraph=function(b,d){e=0;w.objects.length=0;w.sprites.length=0;w.lights.length=0;var g=function(b){if(b.visible!==false){if((b instanceof THREE.Mesh||b instanceof THREE.Line)&&(b.frustumCulled===false||z.contains(b))){B.copy(b.matrixWorld.getPosition());
-F.multiplyVector3(B);f=a();f.object=b;f.z=B.z;w.objects.push(f)}else if(b instanceof THREE.Sprite||b instanceof THREE.Particle){B.copy(b.matrixWorld.getPosition());F.multiplyVector3(B);f=a();f.object=b;f.z=B.z;w.sprites.push(f)}else b instanceof THREE.Light&&w.lights.push(b);for(var c=0,d=b.children.length;c<d;c++)g(b.children[c])}};g(b);d&&w.objects.sort(c);return w};this.projectScene=function(a,e,g){var f=e.near,G=e.far,B=false,Q,O,y,S,M,U,T,W,C,J,I,K,R,ja,da;v=p=o=n=0;w.elements.length=0;if(e.parent===
+F.multiplyVector3(B);f=a();f.object=b;f.z=B.z;w.objects.push(f)}else if(b instanceof THREE.Sprite||b instanceof THREE.Particle){B.copy(b.matrixWorld.getPosition());F.multiplyVector3(B);f=a();f.object=b;f.z=B.z;w.sprites.push(f)}else b instanceof THREE.Light&&w.lights.push(b);for(var c=0,d=b.children.length;c<d;c++)g(b.children[c])}};g(b);d&&w.objects.sort(c);return w};this.projectScene=function(a,e,g){var f=e.near,G=e.far,B=false,Q,O,y,S,L,U,T,W,C,J,I,K,R,ja,da;v=p=o=n=0;w.elements.length=0;if(e.parent===
 void 0){console.warn("DEPRECATED: Camera hasn't been added to a Scene. Adding it...");a.add(e)}a.updateMatrixWorld();e.matrixWorldInverse.getInverse(e.matrixWorld);F.multiply(e.projectionMatrix,e.matrixWorldInverse);z.setFromMatrix(F);w=this.projectGraph(a,false);a=0;for(Q=w.objects.length;a<Q;a++){C=w.objects[a].object;J=C.matrixWorld;k=0;if(C instanceof THREE.Mesh){I=C.geometry;K=C.geometry.materials;S=I.vertices;R=I.faces;ja=I.faceVertexUvs;I=C.matrixRotationWorld.extractRotation(J);O=0;for(y=
-S.length;O<y;O++){m=b();m.positionWorld.copy(S[O]);J.multiplyVector3(m.positionWorld);m.positionScreen.copy(m.positionWorld);F.multiplyVector4(m.positionScreen);m.positionScreen.x=m.positionScreen.x/m.positionScreen.w;m.positionScreen.y=m.positionScreen.y/m.positionScreen.w;m.visible=m.positionScreen.z>f&&m.positionScreen.z<G}S=0;for(O=R.length;S<O;S++){y=R[S];if(y instanceof THREE.Face3){M=l[y.a];U=l[y.b];T=l[y.c];if(M.visible&&U.visible&&T.visible){B=(T.positionScreen.x-M.positionScreen.x)*(U.positionScreen.y-
-M.positionScreen.y)-(T.positionScreen.y-M.positionScreen.y)*(U.positionScreen.x-M.positionScreen.x)<0;if(C.doubleSided||B!=C.flipSided){W=j[n]=j[n]||new THREE.RenderableFace3;n++;h=W;h.v1.copy(M);h.v2.copy(U);h.v3.copy(T)}else continue}else continue}else if(y instanceof THREE.Face4){M=l[y.a];U=l[y.b];T=l[y.c];W=l[y.d];if(M.visible&&U.visible&&T.visible&&W.visible){B=(W.positionScreen.x-M.positionScreen.x)*(U.positionScreen.y-M.positionScreen.y)-(W.positionScreen.y-M.positionScreen.y)*(U.positionScreen.x-
-M.positionScreen.x)<0||(U.positionScreen.x-T.positionScreen.x)*(W.positionScreen.y-T.positionScreen.y)-(U.positionScreen.y-T.positionScreen.y)*(W.positionScreen.x-T.positionScreen.x)<0;if(C.doubleSided||B!=C.flipSided){da=q[o]=q[o]||new THREE.RenderableFace4;o++;h=da;h.v1.copy(M);h.v2.copy(U);h.v3.copy(T);h.v4.copy(W)}else continue}else continue}h.normalWorld.copy(y.normal);!B&&(C.flipSided||C.doubleSided)&&h.normalWorld.negate();I.multiplyVector3(h.normalWorld);h.centroidWorld.copy(y.centroid);J.multiplyVector3(h.centroidWorld);
-h.centroidScreen.copy(h.centroidWorld);F.multiplyVector3(h.centroidScreen);T=y.vertexNormals;M=0;for(U=T.length;M<U;M++){W=h.vertexNormalsWorld[M];W.copy(T[M]);!B&&(C.flipSided||C.doubleSided)&&W.negate();I.multiplyVector3(W)}M=0;for(U=ja.length;M<U;M++)if(da=ja[M][S]){T=0;for(W=da.length;T<W;T++)h.uvs[M][T]=da[T]}h.material=C.material;h.faceMaterial=y.materialIndex!==null?K[y.materialIndex]:null;h.z=h.centroidScreen.z;w.elements.push(h)}}else if(C instanceof THREE.Line){u.multiply(F,J);S=C.geometry.vertices;
-M=b();M.positionScreen.copy(S[0]);u.multiplyVector4(M.positionScreen);J=C.type===THREE.LinePieces?2:1;O=1;for(y=S.length;O<y;O++){M=b();M.positionScreen.copy(S[O]);u.multiplyVector4(M.positionScreen);if(!((O+1)%J>0)){U=l[k-2];D.copy(M.positionScreen);H.copy(U.positionScreen);if(d(D,H)){D.multiplyScalar(1/D.w);H.multiplyScalar(1/H.w);K=r[p]=r[p]||new THREE.RenderableLine;p++;i=K;i.v1.positionScreen.copy(D);i.v2.positionScreen.copy(H);i.z=Math.max(D.z,H.z);i.material=C.material;w.elements.push(i)}}}}}a=
+S.length;O<y;O++){m=b();m.positionWorld.copy(S[O]);J.multiplyVector3(m.positionWorld);m.positionScreen.copy(m.positionWorld);F.multiplyVector4(m.positionScreen);m.positionScreen.x=m.positionScreen.x/m.positionScreen.w;m.positionScreen.y=m.positionScreen.y/m.positionScreen.w;m.visible=m.positionScreen.z>f&&m.positionScreen.z<G}S=0;for(O=R.length;S<O;S++){y=R[S];if(y instanceof THREE.Face3){L=l[y.a];U=l[y.b];T=l[y.c];if(L.visible&&U.visible&&T.visible){B=(T.positionScreen.x-L.positionScreen.x)*(U.positionScreen.y-
+L.positionScreen.y)-(T.positionScreen.y-L.positionScreen.y)*(U.positionScreen.x-L.positionScreen.x)<0;if(C.doubleSided||B!=C.flipSided){W=j[n]=j[n]||new THREE.RenderableFace3;n++;h=W;h.v1.copy(L);h.v2.copy(U);h.v3.copy(T)}else continue}else continue}else if(y instanceof THREE.Face4){L=l[y.a];U=l[y.b];T=l[y.c];W=l[y.d];if(L.visible&&U.visible&&T.visible&&W.visible){B=(W.positionScreen.x-L.positionScreen.x)*(U.positionScreen.y-L.positionScreen.y)-(W.positionScreen.y-L.positionScreen.y)*(U.positionScreen.x-
+L.positionScreen.x)<0||(U.positionScreen.x-T.positionScreen.x)*(W.positionScreen.y-T.positionScreen.y)-(U.positionScreen.y-T.positionScreen.y)*(W.positionScreen.x-T.positionScreen.x)<0;if(C.doubleSided||B!=C.flipSided){da=q[o]=q[o]||new THREE.RenderableFace4;o++;h=da;h.v1.copy(L);h.v2.copy(U);h.v3.copy(T);h.v4.copy(W)}else continue}else continue}h.normalWorld.copy(y.normal);!B&&(C.flipSided||C.doubleSided)&&h.normalWorld.negate();I.multiplyVector3(h.normalWorld);h.centroidWorld.copy(y.centroid);J.multiplyVector3(h.centroidWorld);
+h.centroidScreen.copy(h.centroidWorld);F.multiplyVector3(h.centroidScreen);T=y.vertexNormals;L=0;for(U=T.length;L<U;L++){W=h.vertexNormalsWorld[L];W.copy(T[L]);!B&&(C.flipSided||C.doubleSided)&&W.negate();I.multiplyVector3(W)}L=0;for(U=ja.length;L<U;L++)if(da=ja[L][S]){T=0;for(W=da.length;T<W;T++)h.uvs[L][T]=da[T]}h.material=C.material;h.faceMaterial=y.materialIndex!==null?K[y.materialIndex]:null;h.z=h.centroidScreen.z;w.elements.push(h)}}else if(C instanceof THREE.Line){u.multiply(F,J);S=C.geometry.vertices;
+L=b();L.positionScreen.copy(S[0]);u.multiplyVector4(L.positionScreen);J=C.type===THREE.LinePieces?2:1;O=1;for(y=S.length;O<y;O++){L=b();L.positionScreen.copy(S[O]);u.multiplyVector4(L.positionScreen);if(!((O+1)%J>0)){U=l[k-2];D.copy(L.positionScreen);H.copy(U.positionScreen);if(d(D,H)){D.multiplyScalar(1/D.w);H.multiplyScalar(1/H.w);K=r[p]=r[p]||new THREE.RenderableLine;p++;i=K;i.v1.positionScreen.copy(D);i.v2.positionScreen.copy(H);i.z=Math.max(D.z,H.z);i.material=C.material;w.elements.push(i)}}}}}a=
 0;for(Q=w.sprites.length;a<Q;a++){C=w.sprites[a].object;J=C.matrixWorld;if(C instanceof THREE.Particle){x.set(J.elements[12],J.elements[13],J.elements[14],1);F.multiplyVector4(x);x.z=x.z/x.w;if(x.z>0&&x.z<1){f=A[v]=A[v]||new THREE.RenderableParticle;v++;s=f;s.x=x.x/x.w;s.y=x.y/x.w;s.z=x.z;s.rotation=C.rotation.z;s.scale.x=C.scale.x*Math.abs(s.x-(x.x+e.projectionMatrix.elements[0])/(x.w+e.projectionMatrix.elements[12]));s.scale.y=C.scale.y*Math.abs(s.y-(x.y+e.projectionMatrix.elements[5])/(x.w+e.projectionMatrix.elements[13]));
 s.material=C.material;w.elements.push(s)}}}g&&w.elements.sort(c);return w}};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=b||"XYZ",d=Math.cos(a.x/2),f=Math.cos(a.y/2),e=Math.cos(a.z/2),g=Math.sin(a.x/2),m=Math.sin(a.y/2),k=Math.sin(a.z/2);switch(c){case "YXZ":this.x=g*f*e+d*m*k;this.y=d*m*e-g*f*k;this.z=d*f*k-g*m*e;this.w=d*f*e+g*m*k;break;case "ZXY":this.x=g*f*e-d*m*k;this.y=d*m*e+g*f*
@@ -102,10 +102,10 @@ 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,m=this.morphNormals[a].vertexNormals,k,l;c=0;for(d=this.faces.length;c<d;c++){f=this.faces[c];k=new THREE.Vector3;l=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(k);m.push(l)}}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];
-k=g.faceNormals[c];l=g.vertexNormals[c];k.copy(f.normal);if(f instanceof THREE.Face3){l.a.copy(f.vertexNormals[0]);l.b.copy(f.vertexNormals[1]);l.c.copy(f.vertexNormals[2])}else{l.a.copy(f.vertexNormals[0]);l.b.copy(f.vertexNormals[1]);l.c.copy(f.vertexNormals[2]);l.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,e,f,M){m=a.vertices[b];k=a.vertices[c];
-l=a.vertices[d];h=g[e];n=g[f];j=g[M];o=k.x-m.x;q=l.x-m.x;i=k.y-m.y;p=l.y-m.y;r=k.z-m.z;s=l.z-m.z;v=n.u-h.u;A=j.u-h.u;w=n.v-h.v;B=j.v-h.v;x=1/(v*B-A*w);D.set((B*o-w*q)*x,(B*i-w*p)*x,(B*r-w*s)*x);H.set((v*q-A*o)*x,(v*p-A*i)*x,(v*s-A*r)*x);u[b].addSelf(D);u[c].addSelf(D);u[d].addSelf(D);z[b].addSelf(H);z[c].addSelf(H);z[d].addSelf(H)}var b,c,d,f,e,g,m,k,l,h,n,j,o,q,i,p,r,s,v,A,w,B,x,F,u=[],z=[],D=new THREE.Vector3,H=new THREE.Vector3,P=new THREE.Vector3,L=new THREE.Vector3,t=new THREE.Vector3;b=0;for(c=
+k=g.faceNormals[c];l=g.vertexNormals[c];k.copy(f.normal);if(f instanceof THREE.Face3){l.a.copy(f.vertexNormals[0]);l.b.copy(f.vertexNormals[1]);l.c.copy(f.vertexNormals[2])}else{l.a.copy(f.vertexNormals[0]);l.b.copy(f.vertexNormals[1]);l.c.copy(f.vertexNormals[2]);l.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,e,f,L){m=a.vertices[b];k=a.vertices[c];
+l=a.vertices[d];h=g[e];n=g[f];j=g[L];o=k.x-m.x;q=l.x-m.x;i=k.y-m.y;p=l.y-m.y;r=k.z-m.z;s=l.z-m.z;v=n.u-h.u;A=j.u-h.u;w=n.v-h.v;B=j.v-h.v;x=1/(v*B-A*w);D.set((B*o-w*q)*x,(B*i-w*p)*x,(B*r-w*s)*x);H.set((v*q-A*o)*x,(v*p-A*i)*x,(v*s-A*r)*x);u[b].addSelf(D);u[c].addSelf(D);u[d].addSelf(D);z[b].addSelf(H);z[c].addSelf(H);z[d].addSelf(H)}var b,c,d,f,e,g,m,k,l,h,n,j,o,q,i,p,r,s,v,A,w,B,x,F,u=[],z=[],D=new THREE.Vector3,H=new THREE.Vector3,P=new THREE.Vector3,M=new THREE.Vector3,t=new THREE.Vector3;b=0;for(c=
 this.vertices.length;b<c;b++){u[b]=new THREE.Vector3;z[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 E=["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++){t.copy(e.vertexNormals[d]);f=e[E[d]];F=u[f];P.copy(F);P.subSelf(t.multiplyScalar(t.dot(F))).normalize();
-L.cross(e.vertexNormals[d],F);f=L.dot(z[f]);f=f<0?-1:1;e.vertexTangents[d]=new THREE.Vector4(P.x,P.y,P.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=
+M.cross(e.vertexNormals[d],F);f=M.dot(z[f]);f=f<0?-1:1;e.vertexTangents[d]=new THREE.Vector4(P.x,P.y,P.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(){if(!this.boundingSphere)this.boundingSphere={radius:0};for(var a,b=0,c=0,d=this.vertices.length;c<d;c++){a=this.vertices[c].length();a>b&&(b=a)}this.boundingSphere.radius=b},mergeVertices:function(){var a={},b=[],c=[],d,f=Math.pow(10,4),e,g,m;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++){f=this.faces[e];if(f instanceof THREE.Face3){f.a=c[f.a];f.b=c[f.b];f.c=c[f.c]}else if(f instanceof THREE.Face4){f.a=c[f.a];f.b=c[f.b];f.c=c[f.c];f.d=c[f.d];d=[f.a,f.b,f.c,f.d];for(a=3;a>0;a--)if(d.indexOf(f["abcd"[a]])!=a){d.splice(a,1);this.faces[e]=new THREE.Face3(d[0],d[1],d[2]);f=0;for(d=this.faceVertexUvs.length;f<d;f++)(m=
 this.faceVertexUvs[f][e])&&m.splice(a,1);break}}}c=this.vertices.length-b.length;this.vertices=b;return c}};THREE.GeometryCount=0;THREE.Camera=function(){THREE.Object3D.call(this);this.matrixWorldInverse=new THREE.Matrix4;this.projectionMatrix=new THREE.Matrix4;this.projectionMatrixInverse=new THREE.Matrix4};THREE.Camera.prototype=new THREE.Object3D;THREE.Camera.prototype.constructor=THREE.Camera;
@@ -129,12 +129,12 @@ THREE.BinaryLoader.prototype=new THREE.Loader;THREE.BinaryLoader.prototype.const
 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 m=JSON.parse(g.responseText);a.loadAjaxBuffers(m,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,m=0;e.onreadystatechange=function(){if(e.readyState==4)e.status==200||e.status==0?THREE.BinaryLoader.prototype.createBinModel(e.response,b,d,a.materials):console.error("THREE.BinaryLoader: Couldn't load ["+g+"] ["+e.status+"]");else if(e.readyState==3){if(f){m==0&&(m=e.getResponseHeader("Content-Length"));f({total:m,loaded:e.responseText.length})}}else e.readyState==2&&(m=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,k,l,h,n,j,o,q,i,p,r,s,v,A;function w(a){return a%4?4-a%4:0}function B(a,b){return(new Uint8Array(a,b,1))[0]}function x(a,b){return(new Uint32Array(a,b,1))[0]}function F(b,c){var d,e,f,g,h,m,l,k,i=new Uint32Array(a,c,3*b);for(d=0;d<b;d++){e=i[d*3];f=i[d*3+1];g=i[d*3+2];h=G[e*2];e=G[e*2+1];m=G[f*2];l=G[f*2+1];f=G[g*2];k=G[g*2+1];g=L.faceVertexUvs[0];var j=[];j.push(new THREE.UV(h,e));j.push(new THREE.UV(m,l));j.push(new THREE.UV(f,
-k));g.push(j)}}function u(b,c){var d,e,f,g,h,m,l,k,i,j,n=new Uint32Array(a,c,4*b);for(d=0;d<b;d++){e=n[d*4];f=n[d*4+1];g=n[d*4+2];h=n[d*4+3];m=G[e*2];e=G[e*2+1];l=G[f*2];i=G[f*2+1];k=G[g*2];j=G[g*2+1];g=G[h*2];f=G[h*2+1];h=L.faceVertexUvs[0];var o=[];o.push(new THREE.UV(m,e));o.push(new THREE.UV(l,i));o.push(new THREE.UV(k,j));o.push(new THREE.UV(g,f));h.push(o)}}function z(b,c,d){for(var e,f,g,h,c=new Uint32Array(a,c,3*b),m=new Uint16Array(a,d,b),d=0;d<b;d++){e=c[d*3];f=c[d*3+1];g=c[d*3+2];h=m[d];
-L.faces.push(new THREE.Face3(e,f,g,null,null,h))}}function D(b,c,d){for(var e,f,g,h,m,c=new Uint32Array(a,c,4*b),l=new Uint16Array(a,d,b),d=0;d<b;d++){e=c[d*4];f=c[d*4+1];g=c[d*4+2];h=c[d*4+3];m=l[d];L.faces.push(new THREE.Face4(e,f,g,h,null,null,m))}}function H(b,c,d,e){for(var f,g,h,m,l,k,i,c=new Uint32Array(a,c,3*b),d=new Uint32Array(a,d,3*b),j=new Uint16Array(a,e,b),e=0;e<b;e++){f=c[e*3];g=c[e*3+1];h=c[e*3+2];l=d[e*3];k=d[e*3+1];i=d[e*3+2];m=j[e];var n=E[k*3],o=E[k*3+1];k=E[k*3+2];var p=E[i*3],
-q=E[i*3+1];i=E[i*3+2];L.faces.push(new THREE.Face3(f,g,h,[new THREE.Vector3(E[l*3],E[l*3+1],E[l*3+2]),new THREE.Vector3(n,o,k),new THREE.Vector3(p,q,i)],null,m))}}function P(b,c,d,e){for(var f,g,h,m,l,k,i,j,n,c=new Uint32Array(a,c,4*b),d=new Uint32Array(a,d,4*b),o=new Uint16Array(a,e,b),e=0;e<b;e++){f=c[e*4];g=c[e*4+1];h=c[e*4+2];m=c[e*4+3];k=d[e*4];i=d[e*4+1];j=d[e*4+2];n=d[e*4+3];l=o[e];var p=E[i*3],q=E[i*3+1];i=E[i*3+2];var r=E[j*3],t=E[j*3+1];j=E[j*3+2];var s=E[n*3],z=E[n*3+1];n=E[n*3+2];L.faces.push(new THREE.Face4(f,
-g,h,m,[new THREE.Vector3(E[k*3],E[k*3+1],E[k*3+2]),new THREE.Vector3(p,q,i),new THREE.Vector3(r,t,j),new THREE.Vector3(s,z,n)],null,l))}}var L=this,t=0,E=[],G=[],N,Q,O;THREE.Geometry.call(this);THREE.Loader.prototype.initMaterials(L,d,b);(function(a,b,c){for(var a=new Uint8Array(a,b,c),d="",e=0;e<c;e++)d=d+String.fromCharCode(a[b+e]);return d})(a,t,12);c=B(a,t+12);B(a,t+13);B(a,t+14);B(a,t+15);f=B(a,t+16);k=B(a,t+17);l=B(a,t+18);h=B(a,t+19);n=x(a,t+20);j=x(a,t+20+4);o=x(a,t+20+8);b=x(a,t+20+12);q=
-x(a,t+20+16);i=x(a,t+20+20);p=x(a,t+20+24);r=x(a,t+20+28);s=x(a,t+20+32);v=x(a,t+20+36);A=x(a,t+20+40);t=t+c;c=f*3+h;O=f*4+h;N=b*c;Q=q*(c+k*3);f=i*(c+l*3);h=p*(c+k*3+l*3);c=r*O;k=s*(O+k*4);l=v*(O+l*4);t=t+function(b){var b=new Float32Array(a,b,n*3),c,d,e,f;for(c=0;c<n;c++){d=b[c*3];e=b[c*3+1];f=b[c*3+2];L.vertices.push(new THREE.Vector3(d,e,f))}return n*3*Float32Array.BYTES_PER_ELEMENT}(t);t=t+function(b){if(j){var b=new Int8Array(a,b,j*3),c,d,e,f;for(c=0;c<j;c++){d=b[c*3];e=b[c*3+1];f=b[c*3+2];E.push(d/
+THREE.BinaryLoader.prototype.createBinModel=function(a,b,c,d){var f=function(b){var c,f,k,l,h,n,j,o,q,i,p,r,s,v,A;function w(a){return a%4?4-a%4:0}function B(a,b){return(new Uint8Array(a,b,1))[0]}function x(a,b){return(new Uint32Array(a,b,1))[0]}function F(b,c){var d,e,f,g,h,m,l,k,i=new Uint32Array(a,c,3*b);for(d=0;d<b;d++){e=i[d*3];f=i[d*3+1];g=i[d*3+2];h=G[e*2];e=G[e*2+1];m=G[f*2];l=G[f*2+1];f=G[g*2];k=G[g*2+1];g=M.faceVertexUvs[0];var j=[];j.push(new THREE.UV(h,e));j.push(new THREE.UV(m,l));j.push(new THREE.UV(f,
+k));g.push(j)}}function u(b,c){var d,e,f,g,h,m,l,k,i,j,n=new Uint32Array(a,c,4*b);for(d=0;d<b;d++){e=n[d*4];f=n[d*4+1];g=n[d*4+2];h=n[d*4+3];m=G[e*2];e=G[e*2+1];l=G[f*2];i=G[f*2+1];k=G[g*2];j=G[g*2+1];g=G[h*2];f=G[h*2+1];h=M.faceVertexUvs[0];var o=[];o.push(new THREE.UV(m,e));o.push(new THREE.UV(l,i));o.push(new THREE.UV(k,j));o.push(new THREE.UV(g,f));h.push(o)}}function z(b,c,d){for(var e,f,g,h,c=new Uint32Array(a,c,3*b),m=new Uint16Array(a,d,b),d=0;d<b;d++){e=c[d*3];f=c[d*3+1];g=c[d*3+2];h=m[d];
+M.faces.push(new THREE.Face3(e,f,g,null,null,h))}}function D(b,c,d){for(var e,f,g,h,m,c=new Uint32Array(a,c,4*b),l=new Uint16Array(a,d,b),d=0;d<b;d++){e=c[d*4];f=c[d*4+1];g=c[d*4+2];h=c[d*4+3];m=l[d];M.faces.push(new THREE.Face4(e,f,g,h,null,null,m))}}function H(b,c,d,e){for(var f,g,h,m,l,k,i,c=new Uint32Array(a,c,3*b),d=new Uint32Array(a,d,3*b),j=new Uint16Array(a,e,b),e=0;e<b;e++){f=c[e*3];g=c[e*3+1];h=c[e*3+2];l=d[e*3];k=d[e*3+1];i=d[e*3+2];m=j[e];var n=E[k*3],o=E[k*3+1];k=E[k*3+2];var p=E[i*3],
+q=E[i*3+1];i=E[i*3+2];M.faces.push(new THREE.Face3(f,g,h,[new THREE.Vector3(E[l*3],E[l*3+1],E[l*3+2]),new THREE.Vector3(n,o,k),new THREE.Vector3(p,q,i)],null,m))}}function P(b,c,d,e){for(var f,g,h,m,l,k,i,j,n,c=new Uint32Array(a,c,4*b),d=new Uint32Array(a,d,4*b),o=new Uint16Array(a,e,b),e=0;e<b;e++){f=c[e*4];g=c[e*4+1];h=c[e*4+2];m=c[e*4+3];k=d[e*4];i=d[e*4+1];j=d[e*4+2];n=d[e*4+3];l=o[e];var p=E[i*3],q=E[i*3+1];i=E[i*3+2];var r=E[j*3],t=E[j*3+1];j=E[j*3+2];var s=E[n*3],z=E[n*3+1];n=E[n*3+2];M.faces.push(new THREE.Face4(f,
+g,h,m,[new THREE.Vector3(E[k*3],E[k*3+1],E[k*3+2]),new THREE.Vector3(p,q,i),new THREE.Vector3(r,t,j),new THREE.Vector3(s,z,n)],null,l))}}var M=this,t=0,E=[],G=[],N,Q,O;THREE.Geometry.call(this);THREE.Loader.prototype.initMaterials(M,d,b);(function(a,b,c){for(var a=new Uint8Array(a,b,c),d="",e=0;e<c;e++)d=d+String.fromCharCode(a[b+e]);return d})(a,t,12);c=B(a,t+12);B(a,t+13);B(a,t+14);B(a,t+15);f=B(a,t+16);k=B(a,t+17);l=B(a,t+18);h=B(a,t+19);n=x(a,t+20);j=x(a,t+20+4);o=x(a,t+20+8);b=x(a,t+20+12);q=
+x(a,t+20+16);i=x(a,t+20+20);p=x(a,t+20+24);r=x(a,t+20+28);s=x(a,t+20+32);v=x(a,t+20+36);A=x(a,t+20+40);t=t+c;c=f*3+h;O=f*4+h;N=b*c;Q=q*(c+k*3);f=i*(c+l*3);h=p*(c+k*3+l*3);c=r*O;k=s*(O+k*4);l=v*(O+l*4);t=t+function(b){var b=new Float32Array(a,b,n*3),c,d,e,f;for(c=0;c<n;c++){d=b[c*3];e=b[c*3+1];f=b[c*3+2];M.vertices.push(new THREE.Vector3(d,e,f))}return n*3*Float32Array.BYTES_PER_ELEMENT}(t);t=t+function(b){if(j){var b=new Int8Array(a,b,j*3),c,d,e,f;for(c=0;c<j;c++){d=b[c*3];e=b[c*3+1];f=b[c*3+2];E.push(d/
 127,e/127,f/127)}}return j*3*Int8Array.BYTES_PER_ELEMENT}(t);t=t+w(j*3);t=t+function(b){if(o){var b=new Float32Array(a,b,o*2),c,d,e;for(c=0;c<o;c++){d=b[c*2];e=b[c*2+1];G.push(d,e)}}return o*2*Float32Array.BYTES_PER_ELEMENT}(t);N=t+N+w(b*2);Q=N+Q+w(q*2);f=Q+f+w(i*2);h=f+h+w(p*2);c=h+c+w(r*2);k=c+k+w(s*2);l=k+l+w(v*2);(function(a){if(i){var b=a+i*Uint32Array.BYTES_PER_ELEMENT*3;z(i,a,b+i*Uint32Array.BYTES_PER_ELEMENT*3);F(i,b)}})(Q);(function(a){if(p){var b=a+p*Uint32Array.BYTES_PER_ELEMENT*3,c=b+
 p*Uint32Array.BYTES_PER_ELEMENT*3;H(p,a,b,c+p*Uint32Array.BYTES_PER_ELEMENT*3);F(p,c)}})(f);(function(a){if(v){var b=a+v*Uint32Array.BYTES_PER_ELEMENT*4;D(v,a,b+v*Uint32Array.BYTES_PER_ELEMENT*4);u(v,b)}})(k);(function(a){if(A){var b=a+A*Uint32Array.BYTES_PER_ELEMENT*4,c=b+A*Uint32Array.BYTES_PER_ELEMENT*4;P(A,a,b,c+A*Uint32Array.BYTES_PER_ELEMENT*4);u(A,c)}})(l);b&&z(b,t,t+b*Uint32Array.BYTES_PER_ELEMENT*3);(function(a){if(q){var b=a+q*Uint32Array.BYTES_PER_ELEMENT*3;H(q,a,b,b+q*Uint32Array.BYTES_PER_ELEMENT*
 3)}})(N);r&&D(r,h,h+r*Uint32Array.BYTES_PER_ELEMENT*4);(function(a){if(s){var b=a+s*Uint32Array.BYTES_PER_ELEMENT*4;P(s,a,b,b+s*Uint32Array.BYTES_PER_ELEMENT*4)}})(c);this.computeCentroids();this.computeFaceNormals();THREE.Loader.prototype.hasNormals(this)&&this.computeTangents()};f.prototype=new THREE.Geometry;f.prototype.constructor=f;b(new f(c))};THREE.ImageLoader=function(){THREE.EventTarget.call(this);this.crossOrigin=null};
@@ -159,22 +159,23 @@ o;){var p=g[n++],r=p&2,e=p&4,s=p&8,v=p&16,q=p&32,A=p&64,i=p&128;if(p&1){p=new TH
 3;r=new THREE.Vector3;r.x=j[v++];r.y=j[v++];r.z=j[v];p.normal=r}if(q)for(e=0;e<w;e++){v=g[n++]*3;r=new THREE.Vector3;r.x=j[v++];r.y=j[v++];r.z=j[v];p.vertexNormals.push(r)}if(A){q=g[n++];p.color=new THREE.Color(l[q])}if(i)for(e=0;e<w;e++){q=g[n++];p.vertexColors.push(new THREE.Color(l[q]))}d.faces.push(p)}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){j=0;d.skinIndices.push(new THREE.Vector4(a.skinIndices[e],a.skinIndices[e+1],j,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=[];j=d.morphTargets[e].vertices;l=a.morphTargets[e].vertices;r=0;for(h=l.length;r<h;r=r+3){i=new THREE.Vector3;i.x=l[r]*f;i.y=l[r+1]*f;i.z=l[r+2]*f;j.push(i)}}}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;l=a.morphColors[e].colors;j=0;for(h=l.length;j<h;j=j+3){n=new THREE.Color(16755200);n.setRGB(l[j],l[j+1],l[j+2]);f.push(n)}}}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("text/plain; charset=x-user-defined");d.setRequestHeader("Content-Type","text/plain");d.send(null)};
+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("text/plain; charset=x-user-defined");d.setRequestHeader("Content-Type","text/plain");d.send(null)};
 THREE.SceneLoader.prototype.createScene=function(a,b,c){function d(a,b){return b=="relativeToHTML"?a:l+"/"+a}function f(){var a;for(j in t.objects)if(!y.objects[j]){r=t.objects[j];if(r.geometry!==void 0){if(D=y.geometries[r.geometry]){a=false;H=y.materials[r.materials[0]];(a=H instanceof THREE.ShaderMaterial)&&D.computeTangents();w=r.position;B=r.rotation;x=r.quaternion;F=r.scale;s=r.matrix;x=0;r.materials.length==0&&(H=new THREE.MeshFaceMaterial);r.materials.length>1&&(H=new THREE.MeshFaceMaterial);
 a=new THREE.Mesh(D,H);a.name=j;if(s){a.matrixAutoUpdate=false;a.matrix.set(s[0],s[1],s[2],s[3],s[4],s[5],s[6],s[7],s[8],s[9],s[10],s[11],s[12],s[13],s[14],s[15])}else{a.position.set(w[0],w[1],w[2]);if(x){a.quaternion.set(x[0],x[1],x[2],x[3]);a.useQuaternion=true}else a.rotation.set(B[0],B[1],B[2]);a.scale.set(F[0],F[1],F[2])}a.visible=r.visible;a.doubleSided=r.doubleSided;a.castShadow=r.castShadow;a.receiveShadow=r.receiveShadow;y.scene.add(a);y.objects[j]=a}}else{w=r.position;B=r.rotation;x=r.quaternion;
 F=r.scale;x=0;a=new THREE.Object3D;a.name=j;a.position.set(w[0],w[1],w[2]);if(x){a.quaternion.set(x[0],x[1],x[2],x[3]);a.useQuaternion=true}else a.rotation.set(B[0],B[1],B[2]);a.scale.set(F[0],F[1],F[2]);a.visible=r.visible!==void 0?r.visible:false;y.scene.add(a);y.objects[j]=a;y.empties[j]=a}}}function e(a){return function(b){y.geometries[a]=b;f();G=G-1;k.onLoadComplete();m()}}function g(a){return function(b){y.geometries[a]=b}}function m(){k.callbackProgress({totalModels:Q,totalTextures:O,loadedModels:Q-
-G,loadedTextures:O-N},y);k.onLoadProgress();G==0&&N==0&&b(y)}var k=this,l=THREE.Loader.prototype.extractUrlBase(c),h,n,j,o,q,i,p,r,s,v,A,w,B,x,F,u,z,D,H,P,L,t,E,G,N,Q,O,y;t=a;c=new THREE.BinaryLoader;E=new THREE.JSONLoader;N=G=0;y={scene:new THREE.Scene,geometries:{},materials:{},textures:{},objects:{},cameras:{},lights:{},fogs:{},empties:{}};if(t.transform){a=t.transform.position;v=t.transform.rotation;u=t.transform.scale;a&&y.scene.position.set(a[0],a[1],a[2]);v&&y.scene.rotation.set(v[0],v[1],
-v[2]);u&&y.scene.scale.set(u[0],u[1],u[2]);if(a||v||u){y.scene.updateMatrix();y.scene.updateMatrixWorld()}}a=function(){N=N-1;m();k.onLoadComplete()};for(q in t.cameras){u=t.cameras[q];u.type=="perspective"?P=new THREE.PerspectiveCamera(u.fov,u.aspect,u.near,u.far):u.type=="ortho"&&(P=new THREE.OrthographicCamera(u.left,u.right,u.top,u.bottom,u.near,u.far));w=u.position;v=u.target;u=u.up;P.position.set(w[0],w[1],w[2]);P.target=new THREE.Vector3(v[0],v[1],v[2]);u&&P.up.set(u[0],u[1],u[2]);y.cameras[q]=
-P}for(o in t.lights){v=t.lights[o];q=v.color!==void 0?v.color:16777215;P=v.intensity!==void 0?v.intensity:1;if(v.type=="directional"){w=v.direction;A=new THREE.DirectionalLight(q,P);A.position.set(w[0],w[1],w[2]);A.position.normalize()}else if(v.type=="point"){w=v.position;A=v.distance;A=new THREE.PointLight(q,P,A);A.position.set(w[0],w[1],w[2])}else v.type=="ambient"&&(A=new THREE.AmbientLight(q));y.scene.add(A);y.lights[o]=A}for(i in t.fogs){o=t.fogs[i];o.type=="linear"?L=new THREE.Fog(0,o.near,
-o.far):o.type=="exp2"&&(L=new THREE.FogExp2(0,o.density));u=o.color;L.color.setRGB(u[0],u[1],u[2]);y.fogs[i]=L}if(y.cameras&&t.defaults.camera)y.currentCamera=y.cameras[t.defaults.camera];if(y.fogs&&t.defaults.fog)y.scene.fog=y.fogs[t.defaults.fog];u=t.defaults.bgcolor;y.bgColor=new THREE.Color;y.bgColor.setRGB(u[0],u[1],u[2]);y.bgColorAlpha=t.defaults.bgalpha;for(h in t.geometries){i=t.geometries[h];if(i.type=="bin_mesh"||i.type=="ascii_mesh"){G=G+1;k.onLoadStart()}}Q=G;for(h in t.geometries){i=
-t.geometries[h];if(i.type=="cube"){D=new THREE.CubeGeometry(i.width,i.height,i.depth,i.segmentsWidth,i.segmentsHeight,i.segmentsDepth,null,i.flipped,i.sides);y.geometries[h]=D}else if(i.type=="plane"){D=new THREE.PlaneGeometry(i.width,i.height,i.segmentsWidth,i.segmentsHeight);y.geometries[h]=D}else if(i.type=="sphere"){D=new THREE.SphereGeometry(i.radius,i.segmentsWidth,i.segmentsHeight);y.geometries[h]=D}else if(i.type=="cylinder"){D=new THREE.CylinderGeometry(i.topRad,i.botRad,i.height,i.radSegs,
-i.heightSegs);y.geometries[h]=D}else if(i.type=="torus"){D=new THREE.TorusGeometry(i.radius,i.tube,i.segmentsR,i.segmentsT);y.geometries[h]=D}else if(i.type=="icosahedron"){D=new THREE.IcosahedronGeometry(i.radius,i.subdivisions);y.geometries[h]=D}else if(i.type=="bin_mesh")c.load(d(i.url,t.urlBaseType),e(h));else if(i.type=="ascii_mesh")E.load(d(i.url,t.urlBaseType),e(h));else if(i.type=="embedded_mesh"){i=t.embeds[i.id];i.metadata=t.metadata;i&&E.createModel(i,g(h),"")}}for(p in t.textures){h=t.textures[p];
-if(h.url instanceof Array){N=N+h.url.length;for(i=0;i<h.url.length;i++)k.onLoadStart()}else{N=N+1;k.onLoadStart()}}O=N;for(p in t.textures){h=t.textures[p];if(h.mapping!=void 0&&THREE[h.mapping]!=void 0)h.mapping=new THREE[h.mapping];if(h.url instanceof Array){i=[];for(L=0;L<h.url.length;L++)i[L]=d(h.url[L],t.urlBaseType);i=THREE.ImageUtils.loadTextureCube(i,h.mapping,a)}else{i=THREE.ImageUtils.loadTexture(d(h.url,t.urlBaseType),h.mapping,a);if(THREE[h.minFilter]!=void 0)i.minFilter=THREE[h.minFilter];
-if(THREE[h.magFilter]!=void 0)i.magFilter=THREE[h.magFilter];if(h.repeat){i.repeat.set(h.repeat[0],h.repeat[1]);if(h.repeat[0]!=1)i.wrapS=THREE.RepeatWrapping;if(h.repeat[1]!=1)i.wrapT=THREE.RepeatWrapping}h.offset&&i.offset.set(h.offset[0],h.offset[1]);if(h.wrap){L={repeat:THREE.RepeatWrapping,mirror:THREE.MirroredRepeatWrapping};if(L[h.wrap[0]]!==void 0)i.wrapS=L[h.wrap[0]];if(L[h.wrap[1]]!==void 0)i.wrapT=L[h.wrap[1]]}}y.textures[p]=i}for(n in t.materials){s=t.materials[n];for(z in s.parameters)if(z==
-"envMap"||z=="map"||z=="lightMap")s.parameters[z]=y.textures[s.parameters[z]];else if(z=="shading")s.parameters[z]=s.parameters[z]=="flat"?THREE.FlatShading:THREE.SmoothShading;else if(z=="blending")s.parameters[z]=s.parameters[z]in THREE?THREE[s.parameters[z]]:THREE.NormalBlending;else if(z=="combine")s.parameters[z]=s.parameters[z]=="MixOperation"?THREE.MixOperation:THREE.MultiplyOperation;else if(z=="vertexColors")if(s.parameters[z]=="face")s.parameters[z]=THREE.FaceColors;else if(s.parameters[z])s.parameters[z]=
-THREE.VertexColors;if(s.parameters.opacity!==void 0&&s.parameters.opacity<1)s.parameters.transparent=true;if(s.parameters.normalMap){p=THREE.ShaderUtils.lib.normal;a=THREE.UniformsUtils.clone(p.uniforms);h=s.parameters.color;i=s.parameters.specular;L=s.parameters.ambient;c=s.parameters.shininess;a.tNormal.texture=y.textures[s.parameters.normalMap];if(s.parameters.normalMapFactor)a.uNormalScale.value=s.parameters.normalMapFactor;if(s.parameters.map){a.tDiffuse.texture=s.parameters.map;a.enableDiffuse.value=
-true}if(s.parameters.lightMap){a.tAO.texture=s.parameters.lightMap;a.enableAO.value=true}if(s.parameters.specularMap){a.tSpecular.texture=y.textures[s.parameters.specularMap];a.enableSpecular.value=true}a.uDiffuseColor.value.setHex(h);a.uSpecularColor.value.setHex(i);a.uAmbientColor.value.setHex(L);a.uShininess.value=c;if(s.parameters.opacity)a.uOpacity.value=s.parameters.opacity;H=new THREE.ShaderMaterial({fragmentShader:p.fragmentShader,vertexShader:p.vertexShader,uniforms:a,lights:true,fog:true})}else H=
-new THREE[s.type](s.parameters);y.materials[n]=H}f();k.callbackSync(y);m()};THREE.TextureLoader=function(){THREE.EventTarget.call(this);this.crossOrigin=null};
+G,loadedTextures:O-N},y);k.onLoadProgress();G===0&&N===0&&b(y)}var k=this,l=THREE.Loader.prototype.extractUrlBase(c),h,n,j,o,q,i,p,r,s,v,A,w,B,x,F,u,z,D,H,P,M,t,E,G,N,Q,O,y;t=a;c=new THREE.BinaryLoader;E=new THREE.JSONLoader;N=G=0;y={scene:new THREE.Scene,geometries:{},materials:{},textures:{},objects:{},cameras:{},lights:{},fogs:{},empties:{}};if(t.transform){a=t.transform.position;v=t.transform.rotation;u=t.transform.scale;a&&y.scene.position.set(a[0],a[1],a[2]);v&&y.scene.rotation.set(v[0],v[1],
+v[2]);u&&y.scene.scale.set(u[0],u[1],u[2]);if(a||v||u){y.scene.updateMatrix();y.scene.updateMatrixWorld()}}a=function(a){return function(){N=N-a;m();k.onLoadComplete()}};for(q in t.cameras){u=t.cameras[q];u.type==="perspective"?P=new THREE.PerspectiveCamera(u.fov,u.aspect,u.near,u.far):u.type==="ortho"&&(P=new THREE.OrthographicCamera(u.left,u.right,u.top,u.bottom,u.near,u.far));w=u.position;v=u.target;u=u.up;P.position.set(w[0],w[1],w[2]);P.target=new THREE.Vector3(v[0],v[1],v[2]);u&&P.up.set(u[0],
+u[1],u[2]);y.cameras[q]=P}for(o in t.lights){v=t.lights[o];q=v.color!==void 0?v.color:16777215;P=v.intensity!==void 0?v.intensity:1;if(v.type==="directional"){w=v.direction;A=new THREE.DirectionalLight(q,P);A.position.set(w[0],w[1],w[2]);A.position.normalize()}else if(v.type==="point"){w=v.position;A=v.distance;A=new THREE.PointLight(q,P,A);A.position.set(w[0],w[1],w[2])}else v.type==="ambient"&&(A=new THREE.AmbientLight(q));y.scene.add(A);y.lights[o]=A}for(i in t.fogs){o=t.fogs[i];o.type==="linear"?
+M=new THREE.Fog(0,o.near,o.far):o.type==="exp2"&&(M=new THREE.FogExp2(0,o.density));u=o.color;M.color.setRGB(u[0],u[1],u[2]);y.fogs[i]=M}if(y.cameras&&t.defaults.camera)y.currentCamera=y.cameras[t.defaults.camera];if(y.fogs&&t.defaults.fog)y.scene.fog=y.fogs[t.defaults.fog];u=t.defaults.bgcolor;y.bgColor=new THREE.Color;y.bgColor.setRGB(u[0],u[1],u[2]);y.bgColorAlpha=t.defaults.bgalpha;for(h in t.geometries){i=t.geometries[h];if(i.type=="bin_mesh"||i.type=="ascii_mesh"){G=G+1;k.onLoadStart()}}Q=G;
+for(h in t.geometries){i=t.geometries[h];if(i.type==="cube"){D=new THREE.CubeGeometry(i.width,i.height,i.depth,i.segmentsWidth,i.segmentsHeight,i.segmentsDepth,null,i.flipped,i.sides);y.geometries[h]=D}else if(i.type==="plane"){D=new THREE.PlaneGeometry(i.width,i.height,i.segmentsWidth,i.segmentsHeight);y.geometries[h]=D}else if(i.type==="sphere"){D=new THREE.SphereGeometry(i.radius,i.segmentsWidth,i.segmentsHeight);y.geometries[h]=D}else if(i.type==="cylinder"){D=new THREE.CylinderGeometry(i.topRad,
+i.botRad,i.height,i.radSegs,i.heightSegs);y.geometries[h]=D}else if(i.type==="torus"){D=new THREE.TorusGeometry(i.radius,i.tube,i.segmentsR,i.segmentsT);y.geometries[h]=D}else if(i.type==="icosahedron"){D=new THREE.IcosahedronGeometry(i.radius,i.subdivisions);y.geometries[h]=D}else if(i.type==="bin_mesh")c.load(d(i.url,t.urlBaseType),e(h));else if(i.type==="ascii_mesh")E.load(d(i.url,t.urlBaseType),e(h));else if(i.type==="embedded_mesh"){i=t.embeds[i.id];i.metadata=t.metadata;i&&E.createModel(i,g(h),
+"")}}for(p in t.textures){h=t.textures[p];if(h.url instanceof Array){N=N+h.url.length;for(i=0;i<h.url.length;i++)k.onLoadStart()}else{N=N+1;k.onLoadStart()}}O=N;for(p in t.textures){h=t.textures[p];if(h.mapping!==void 0&&THREE[h.mapping]!==void 0)h.mapping=new THREE[h.mapping];if(h.url instanceof Array){i=h.url.length;M=[];for(c=0;c<i;c++)M[c]=d(h.url[c],t.urlBaseType);i=THREE.ImageUtils.loadTextureCube(M,h.mapping,a(i))}else{i=THREE.ImageUtils.loadTexture(d(h.url,t.urlBaseType),h.mapping,a(1));if(THREE[h.minFilter]!==
+void 0)i.minFilter=THREE[h.minFilter];if(THREE[h.magFilter]!==void 0)i.magFilter=THREE[h.magFilter];if(h.repeat){i.repeat.set(h.repeat[0],h.repeat[1]);if(h.repeat[0]!==1)i.wrapS=THREE.RepeatWrapping;if(h.repeat[1]!==1)i.wrapT=THREE.RepeatWrapping}h.offset&&i.offset.set(h.offset[0],h.offset[1]);if(h.wrap){M={repeat:THREE.RepeatWrapping,mirror:THREE.MirroredRepeatWrapping};if(M[h.wrap[0]]!==void 0)i.wrapS=M[h.wrap[0]];if(M[h.wrap[1]]!==void 0)i.wrapT=M[h.wrap[1]]}}y.textures[p]=i}for(n in t.materials){s=
+t.materials[n];for(z in s.parameters)if(z==="envMap"||z==="map"||z==="lightMap")s.parameters[z]=y.textures[s.parameters[z]];else if(z==="shading")s.parameters[z]=s.parameters[z]=="flat"?THREE.FlatShading:THREE.SmoothShading;else if(z==="blending")s.parameters[z]=s.parameters[z]in THREE?THREE[s.parameters[z]]:THREE.NormalBlending;else if(z==="combine")s.parameters[z]=s.parameters[z]=="MixOperation"?THREE.MixOperation:THREE.MultiplyOperation;else if(z==="vertexColors")if(s.parameters[z]=="face")s.parameters[z]=
+THREE.FaceColors;else if(s.parameters[z])s.parameters[z]=THREE.VertexColors;if(s.parameters.opacity!==void 0&&s.parameters.opacity<1)s.parameters.transparent=true;if(s.parameters.normalMap){p=THREE.ShaderUtils.lib.normal;a=THREE.UniformsUtils.clone(p.uniforms);h=s.parameters.color;i=s.parameters.specular;M=s.parameters.ambient;c=s.parameters.shininess;a.tNormal.texture=y.textures[s.parameters.normalMap];if(s.parameters.normalMapFactor)a.uNormalScale.value=s.parameters.normalMapFactor;if(s.parameters.map){a.tDiffuse.texture=
+s.parameters.map;a.enableDiffuse.value=true}if(s.parameters.lightMap){a.tAO.texture=s.parameters.lightMap;a.enableAO.value=true}if(s.parameters.specularMap){a.tSpecular.texture=y.textures[s.parameters.specularMap];a.enableSpecular.value=true}a.uDiffuseColor.value.setHex(h);a.uSpecularColor.value.setHex(i);a.uAmbientColor.value.setHex(M);a.uShininess.value=c;if(s.parameters.opacity)a.uOpacity.value=s.parameters.opacity;H=new THREE.ShaderMaterial({fragmentShader:p.fragmentShader,vertexShader:p.vertexShader,
+uniforms:a,lights:true,fog:true})}else H=new THREE[s.type](s.parameters);y.materials[n]=H}f();k.callbackSync(y);m()};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(a){a=a||{};this.id=THREE.MaterialCount++;this.name="";this.opacity=a.opacity!==void 0?a.opacity:1;this.transparent=a.transparent!==void 0?a.transparent:false;this.blending=a.blending!==void 0?a.blending:THREE.NormalBlending;this.blendSrc=a.blendSrc!==void 0?a.blendSrc:THREE.SrcAlphaFactor;this.blendDst=a.blendDst!==void 0?a.blendDst:THREE.OneMinusSrcAlphaFactor;this.blendEquation=a.blendEquation!==void 0?a.blendEquation:THREE.AddEquation;this.depthTest=a.depthTest!==void 0?
 a.depthTest:true;this.depthWrite=a.depthWrite!==void 0?a.depthWrite:true;this.polygonOffset=a.polygonOffset!==void 0?a.polygonOffset:false;this.polygonOffsetFactor=a.polygonOffsetFactor!==void 0?a.polygonOffsetFactor:0;this.polygonOffsetUnits=a.polygonOffsetUnits!==void 0?a.polygonOffsetUnits:0;this.alphaTest=a.alphaTest!==void 0?a.alphaTest:0;this.overdraw=a.overdraw!==void 0?a.overdraw:false;this.needsUpdate=this.visible=true};THREE.MaterialCount=0;THREE.NoShading=0;THREE.FlatShading=1;
@@ -211,7 +212,7 @@ THREE.SpriteAlignment.bottomRight=new THREE.Vector2(-1,1);THREE.Scene=function()
 THREE.Scene.prototype.__addObject=function(a){if(a instanceof THREE.Light)this.__lights.indexOf(a)===-1&&this.__lights.push(a);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.CanvasRenderer=function(a){function b(a){if(s!=a)i.globalAlpha=s=a}function c(a){if(v!=a){switch(a){case THREE.NormalBlending:i.globalCompositeOperation="source-over";break;case THREE.AdditiveBlending:i.globalCompositeOperation="lighter";break;case THREE.SubtractiveBlending:i.globalCompositeOperation="darker"}v=a}}function d(a){if(A!=a)i.strokeStyle=A=a}function f(a){if(w!=a)i.fillStyle=w=a}console.log("THREE.CanvasRenderer",THREE.REVISION);var a=a||{},e=this,g,m,k,l=new THREE.Projector,h=a.canvas!==
-void 0?a.canvas:document.createElement("canvas"),n,j,o,q,i=h.getContext("2d"),p=new THREE.Color(0),r=0,s=1,v=0,A=null,w=null,B=null,x=null,F=null,u,z,D,H,P=new THREE.RenderableVertex,L=new THREE.RenderableVertex,t,E,G,N,Q,O,y,S,M,U,T,W,C=new THREE.Color,J=new THREE.Color,I=new THREE.Color,K=new THREE.Color,R=new THREE.Color,ja=[],da=[],ea,fa,ca,ka,za,Aa,Ba,Ca,Da,Ea,la=new THREE.Rectangle,$=new THREE.Rectangle,Z=new THREE.Rectangle,xa=false,Y=new THREE.Color,ma=new THREE.Color,na=new THREE.Color,V=
+void 0?a.canvas:document.createElement("canvas"),n,j,o,q,i=h.getContext("2d"),p=new THREE.Color(0),r=0,s=1,v=0,A=null,w=null,B=null,x=null,F=null,u,z,D,H,P=new THREE.RenderableVertex,M=new THREE.RenderableVertex,t,E,G,N,Q,O,y,S,L,U,T,W,C=new THREE.Color,J=new THREE.Color,I=new THREE.Color,K=new THREE.Color,R=new THREE.Color,ja=[],da=[],ea,fa,ca,ka,za,Aa,Ba,Ca,Da,Ea,la=new THREE.Rectangle,$=new THREE.Rectangle,Z=new THREE.Rectangle,xa=false,Y=new THREE.Color,ma=new THREE.Color,na=new THREE.Color,V=
 new THREE.Vector3,ra,sa,ya,aa,ta,ua,a=16;ra=document.createElement("canvas");ra.width=ra.height=2;sa=ra.getContext("2d");sa.fillStyle="rgba(0,0,0,1)";sa.fillRect(0,0,2,2);ya=sa.getImageData(0,0,2,2);aa=ya.data;ta=document.createElement("canvas");ta.width=ta.height=a;ua=ta.getContext("2d");ua.translate(-a/2,-a/2);ua.scale(a,a);a--;this.domElement=h;this.sortElements=this.sortObjects=this.autoClear=true;this.info={render:{vertices:0,faces:0}};this.setSize=function(a,b){n=a;j=b;o=Math.floor(n/2);q=Math.floor(j/
 2);h.width=n;h.height=j;la.set(-o,-q,o,q);$.set(-o,-q,o,q);s=1;v=0;F=x=B=w=A=null};this.setClearColor=function(a,b){p.copy(a);r=b!==void 0?b:1;$.set(-o,-q,o,q)};this.setClearColorHex=function(a,b){p.setHex(a);r=b!==void 0?b:1;$.set(-o,-q,o,q)};this.clear=function(){i.setTransform(1,0,0,-1,o,q);if(!$.isEmpty()){$.minSelf(la);$.inflate(2);r<1&&i.clearRect(Math.floor($.getX()),Math.floor($.getY()),Math.floor($.getWidth()),Math.floor($.getHeight()));if(r>0){c(THREE.NormalBlending);b(1);f("rgba("+Math.floor(p.r*
 255)+","+Math.floor(p.g*255)+","+Math.floor(p.b*255)+","+r+")");i.fillRect(Math.floor($.getX()),Math.floor($.getY()),Math.floor($.getWidth()),Math.floor($.getHeight()))}$.empty()}};this.render=function(a,h){function j(a){var b,c,d,e;Y.setRGB(0,0,0);ma.setRGB(0,0,0);na.setRGB(0,0,0);b=0;for(c=a.length;b<c;b++){d=a[b];e=d.color;if(d instanceof THREE.AmbientLight){Y.r=Y.r+e.r;Y.g=Y.g+e.g;Y.b=Y.b+e.b}else if(d instanceof THREE.DirectionalLight){ma.r=ma.r+e.r;ma.g=ma.g+e.g;ma.b=ma.b+e.b}else if(d instanceof
@@ -224,11 +225,11 @@ V.y*a.elements[4]+V.z*a.elements[8])*0.5+0.5;Ea=-(V.x*a.elements[1]+V.y*a.elemen
 i.vertexNormalsWorld[1],I);n(k,i.v3.positionWorld,i.vertexNormalsWorld[2],K);J.r=Math.max(0,Math.min(j.color.r*J.r,1));J.g=Math.max(0,Math.min(j.color.g*J.g,1));J.b=Math.max(0,Math.min(j.color.b*J.b,1));I.r=Math.max(0,Math.min(j.color.r*I.r,1));I.g=Math.max(0,Math.min(j.color.g*I.g,1));I.b=Math.max(0,Math.min(j.color.b*I.b,1));K.r=Math.max(0,Math.min(j.color.r*K.r,1));K.g=Math.max(0,Math.min(j.color.g*K.g,1));K.b=Math.max(0,Math.min(j.color.b*K.b,1));R.r=(I.r+K.r)*0.5;R.g=(I.g+K.g)*0.5;R.b=(I.b+K.b)*
 0.5;ca=va(J,I,K,R);pa(t,E,G,N,Q,O,0,0,1,0,0,1,ca)}else{C.r=Y.r;C.g=Y.g;C.b=Y.b;n(k,i.centroidWorld,i.normalWorld,C);C.r=Math.max(0,Math.min(j.color.r*C.r,1));C.g=Math.max(0,Math.min(j.color.g*C.g,1));C.b=Math.max(0,Math.min(j.color.b*C.b,1));j.wireframe?ha(C,j.wireframeLinewidth,j.wireframeLinecap,j.wireframeLinejoin):ga(C)}else j.wireframe?ha(j.color,j.wireframeLinewidth,j.wireframeLinecap,j.wireframeLinejoin):ga(j.color);else if(j instanceof THREE.MeshDepthMaterial){ea=h.near;fa=h.far;J.r=J.g=J.b=
 1-oa(a.positionScreen.z,ea,fa);I.r=I.g=I.b=1-oa(d.positionScreen.z,ea,fa);K.r=K.g=K.b=1-oa(f.positionScreen.z,ea,fa);R.r=(I.r+K.r)*0.5;R.g=(I.g+K.g)*0.5;R.b=(I.b+K.b)*0.5;ca=va(J,I,K,R);pa(t,E,G,N,Q,O,0,0,1,0,0,1,ca)}else if(j instanceof THREE.MeshNormalMaterial){C.r=qa(i.normalWorld.x);C.g=qa(i.normalWorld.y);C.b=qa(i.normalWorld.z);j.wireframe?ha(C,j.wireframeLinewidth,j.wireframeLinecap,j.wireframeLinejoin):ga(C)}}function w(a,d,f,g,l,m,j,i,o){e.info.render.vertices=e.info.render.vertices+4;e.info.render.faces++;
-b(i.opacity);c(i.blending);if(i.map||i.envMap){s(a,d,g,0,1,3,j,i,o);s(l,f,m,1,2,3,j,i,o)}else{t=a.positionScreen.x;E=a.positionScreen.y;G=d.positionScreen.x;N=d.positionScreen.y;Q=f.positionScreen.x;O=f.positionScreen.y;y=g.positionScreen.x;S=g.positionScreen.y;M=l.positionScreen.x;U=l.positionScreen.y;T=m.positionScreen.x;W=m.positionScreen.y;if(i instanceof THREE.MeshBasicMaterial){A(t,E,G,N,Q,O,y,S);i.wireframe?ha(i.color,i.wireframeLinewidth,i.wireframeLinecap,i.wireframeLinejoin):ga(i.color)}else if(i instanceof
+b(i.opacity);c(i.blending);if(i.map||i.envMap){s(a,d,g,0,1,3,j,i,o);s(l,f,m,1,2,3,j,i,o)}else{t=a.positionScreen.x;E=a.positionScreen.y;G=d.positionScreen.x;N=d.positionScreen.y;Q=f.positionScreen.x;O=f.positionScreen.y;y=g.positionScreen.x;S=g.positionScreen.y;L=l.positionScreen.x;U=l.positionScreen.y;T=m.positionScreen.x;W=m.positionScreen.y;if(i instanceof THREE.MeshBasicMaterial){A(t,E,G,N,Q,O,y,S);i.wireframe?ha(i.color,i.wireframeLinewidth,i.wireframeLinecap,i.wireframeLinejoin):ga(i.color)}else if(i instanceof
 THREE.MeshLambertMaterial)if(xa)if(!i.wireframe&&i.shading==THREE.SmoothShading&&j.vertexNormalsWorld.length==4){J.r=I.r=K.r=R.r=Y.r;J.g=I.g=K.g=R.g=Y.g;J.b=I.b=K.b=R.b=Y.b;n(k,j.v1.positionWorld,j.vertexNormalsWorld[0],J);n(k,j.v2.positionWorld,j.vertexNormalsWorld[1],I);n(k,j.v4.positionWorld,j.vertexNormalsWorld[3],K);n(k,j.v3.positionWorld,j.vertexNormalsWorld[2],R);J.r=Math.max(0,Math.min(i.color.r*J.r,1));J.g=Math.max(0,Math.min(i.color.g*J.g,1));J.b=Math.max(0,Math.min(i.color.b*J.b,1));I.r=
-Math.max(0,Math.min(i.color.r*I.r,1));I.g=Math.max(0,Math.min(i.color.g*I.g,1));I.b=Math.max(0,Math.min(i.color.b*I.b,1));K.r=Math.max(0,Math.min(i.color.r*K.r,1));K.g=Math.max(0,Math.min(i.color.g*K.g,1));K.b=Math.max(0,Math.min(i.color.b*K.b,1));R.r=Math.max(0,Math.min(i.color.r*R.r,1));R.g=Math.max(0,Math.min(i.color.g*R.g,1));R.b=Math.max(0,Math.min(i.color.b*R.b,1));ca=va(J,I,K,R);v(t,E,G,N,y,S);pa(t,E,G,N,y,S,0,0,1,0,0,1,ca);v(M,U,Q,O,T,W);pa(M,U,Q,O,T,W,1,0,1,1,0,1,ca)}else{C.r=Y.r;C.g=Y.g;
+Math.max(0,Math.min(i.color.r*I.r,1));I.g=Math.max(0,Math.min(i.color.g*I.g,1));I.b=Math.max(0,Math.min(i.color.b*I.b,1));K.r=Math.max(0,Math.min(i.color.r*K.r,1));K.g=Math.max(0,Math.min(i.color.g*K.g,1));K.b=Math.max(0,Math.min(i.color.b*K.b,1));R.r=Math.max(0,Math.min(i.color.r*R.r,1));R.g=Math.max(0,Math.min(i.color.g*R.g,1));R.b=Math.max(0,Math.min(i.color.b*R.b,1));ca=va(J,I,K,R);v(t,E,G,N,y,S);pa(t,E,G,N,y,S,0,0,1,0,0,1,ca);v(L,U,Q,O,T,W);pa(L,U,Q,O,T,W,1,0,1,1,0,1,ca)}else{C.r=Y.r;C.g=Y.g;
 C.b=Y.b;n(k,j.centroidWorld,j.normalWorld,C);C.r=Math.max(0,Math.min(i.color.r*C.r,1));C.g=Math.max(0,Math.min(i.color.g*C.g,1));C.b=Math.max(0,Math.min(i.color.b*C.b,1));A(t,E,G,N,Q,O,y,S);i.wireframe?ha(C,i.wireframeLinewidth,i.wireframeLinecap,i.wireframeLinejoin):ga(C)}else{A(t,E,G,N,Q,O,y,S);i.wireframe?ha(i.color,i.wireframeLinewidth,i.wireframeLinecap,i.wireframeLinejoin):ga(i.color)}else if(i instanceof THREE.MeshNormalMaterial){C.r=qa(j.normalWorld.x);C.g=qa(j.normalWorld.y);C.b=qa(j.normalWorld.z);
-A(t,E,G,N,Q,O,y,S);i.wireframe?ha(C,i.wireframeLinewidth,i.wireframeLinecap,i.wireframeLinejoin):ga(C)}else if(i instanceof THREE.MeshDepthMaterial){ea=h.near;fa=h.far;J.r=J.g=J.b=1-oa(a.positionScreen.z,ea,fa);I.r=I.g=I.b=1-oa(d.positionScreen.z,ea,fa);K.r=K.g=K.b=1-oa(g.positionScreen.z,ea,fa);R.r=R.g=R.b=1-oa(f.positionScreen.z,ea,fa);ca=va(J,I,K,R);v(t,E,G,N,y,S);pa(t,E,G,N,y,S,0,0,1,0,0,1,ca);v(M,U,Q,O,T,W);pa(M,U,Q,O,T,W,1,0,1,1,0,1,ca)}}}function v(a,b,c,d,e,f){i.beginPath();i.moveTo(a,b);
+A(t,E,G,N,Q,O,y,S);i.wireframe?ha(C,i.wireframeLinewidth,i.wireframeLinecap,i.wireframeLinejoin):ga(C)}else if(i instanceof THREE.MeshDepthMaterial){ea=h.near;fa=h.far;J.r=J.g=J.b=1-oa(a.positionScreen.z,ea,fa);I.r=I.g=I.b=1-oa(d.positionScreen.z,ea,fa);K.r=K.g=K.b=1-oa(g.positionScreen.z,ea,fa);R.r=R.g=R.b=1-oa(f.positionScreen.z,ea,fa);ca=va(J,I,K,R);v(t,E,G,N,y,S);pa(t,E,G,N,y,S,0,0,1,0,0,1,ca);v(L,U,Q,O,T,W);pa(L,U,Q,O,T,W,1,0,1,1,0,1,ca)}}}function v(a,b,c,d,e,f){i.beginPath();i.moveTo(a,b);
 i.lineTo(c,d);i.lineTo(e,f);i.lineTo(a,b)}function A(a,b,c,d,e,f,g,h){i.beginPath();i.moveTo(a,b);i.lineTo(c,d);i.lineTo(e,f);i.lineTo(g,h);i.lineTo(a,b)}function ha(a,b,c,e){if(B!=b)i.lineWidth=B=b;if(x!=c)i.lineCap=x=c;if(F!=e)i.lineJoin=F=e;d(a.getContextStyle());i.stroke();Z.inflate(b*2)}function ga(a){f(a.getContextStyle());i.fill()}function Fa(a,b,c,d,e,g,h,k,l,j,m,n,o){if(!(o.image===void 0||o.image.width===0)){if(o.needsUpdate===true||ja[o.id]===void 0){var p=o.wrapS==THREE.RepeatWrapping,
 q=o.wrapT==THREE.RepeatWrapping;ja[o.id]=i.createPattern(o.image,p&&q?"repeat":p&&!q?"repeat-x":!p&&q?"repeat-y":"no-repeat");o.needsUpdate=false}f(ja[o.id]);var p=o.offset.x/o.repeat.x,q=o.offset.y/o.repeat.y,r=o.image.width*o.repeat.x,s=o.image.height*o.repeat.y,h=(h+p)*r,k=(k+q)*s,c=c-a,d=d-b,e=e-a,g=g-b,l=(l+p)*r-h,j=(j+q)*s-k,m=(m+p)*r-h,n=(n+q)*s-k,p=l*n-m*j;if(p==0){if(da[o.id]===void 0){b=document.createElement("canvas");b.width=o.image.width;b.height=o.image.height;b=b.getContext("2d");b.drawImage(o.image,
 0,0);da[o.id]=b.getImageData(0,0,o.image.width,o.image.height).data}b=da[o.id];h=(Math.floor(h)+Math.floor(k)*o.image.width)*4;C.setRGB(b[h]/255,b[h+1]/255,b[h+2]/255);ga(C)}else{p=1/p;o=(n*c-j*e)*p;j=(n*d-j*g)*p;c=(l*e-m*c)*p;d=(l*g-m*d)*p;a=a-o*h-c*k;h=b-j*h-d*k;i.save();i.transform(o,j,c,d,a,h);i.fill();i.restore()}}}function pa(a,b,c,d,e,f,g,h,k,j,l,m,n){var o,p;o=n.width-1;p=n.height-1;g=g*o;h=h*p;c=c-a;d=d-b;e=e-a;f=f-b;k=k*o-g;j=j*p-h;l=l*o-g;m=m*p-h;p=1/(k*m-l*j);o=(m*c-j*e)*p;j=(m*d-j*f)*
@@ -237,8 +238,8 @@ j>255?255:j;aa[10]=c<0?0:c>255?255:c;aa[12]=k<0?0:k>255?255:k;aa[13]=l<0?0:l>255
 0;g=l.projectScene(a,h,this.sortElements);m=g.elements;k=g.lights;(xa=k.length>0)&&j(k);wa=0;for(Ga=m.length;wa<Ga;wa++){X=m[wa];ba=X.material;ba=ba instanceof THREE.MeshFaceMaterial?X.faceMaterial:ba;if(!(ba===void 0||ba.visible===false)){Z.empty();if(X instanceof THREE.RenderableParticle){u=X;u.x=u.x*o;u.y=u.y*q;p(u,X,ba,a)}else if(X instanceof THREE.RenderableLine){u=X.v1;z=X.v2;u.positionScreen.x=u.positionScreen.x*o;u.positionScreen.y=u.positionScreen.y*q;z.positionScreen.x=z.positionScreen.x*
 o;z.positionScreen.y=z.positionScreen.y*q;Z.addPoint(u.positionScreen.x,u.positionScreen.y);Z.addPoint(z.positionScreen.x,z.positionScreen.y);la.intersects(Z)&&r(u,z,X,ba,a)}else if(X instanceof THREE.RenderableFace3){u=X.v1;z=X.v2;D=X.v3;u.positionScreen.x=u.positionScreen.x*o;u.positionScreen.y=u.positionScreen.y*q;z.positionScreen.x=z.positionScreen.x*o;z.positionScreen.y=z.positionScreen.y*q;D.positionScreen.x=D.positionScreen.x*o;D.positionScreen.y=D.positionScreen.y*q;if(ba.overdraw){ia(u.positionScreen,
 z.positionScreen);ia(z.positionScreen,D.positionScreen);ia(D.positionScreen,u.positionScreen)}Z.add3Points(u.positionScreen.x,u.positionScreen.y,z.positionScreen.x,z.positionScreen.y,D.positionScreen.x,D.positionScreen.y);la.intersects(Z)&&s(u,z,D,0,1,2,X,ba,a)}else if(X instanceof THREE.RenderableFace4){u=X.v1;z=X.v2;D=X.v3;H=X.v4;u.positionScreen.x=u.positionScreen.x*o;u.positionScreen.y=u.positionScreen.y*q;z.positionScreen.x=z.positionScreen.x*o;z.positionScreen.y=z.positionScreen.y*q;D.positionScreen.x=
-D.positionScreen.x*o;D.positionScreen.y=D.positionScreen.y*q;H.positionScreen.x=H.positionScreen.x*o;H.positionScreen.y=H.positionScreen.y*q;P.positionScreen.copy(z.positionScreen);L.positionScreen.copy(H.positionScreen);if(ba.overdraw){ia(u.positionScreen,z.positionScreen);ia(z.positionScreen,H.positionScreen);ia(H.positionScreen,u.positionScreen);ia(D.positionScreen,P.positionScreen);ia(D.positionScreen,L.positionScreen)}Z.addPoint(u.positionScreen.x,u.positionScreen.y);Z.addPoint(z.positionScreen.x,
-z.positionScreen.y);Z.addPoint(D.positionScreen.x,D.positionScreen.y);Z.addPoint(H.positionScreen.x,H.positionScreen.y);la.intersects(Z)&&w(u,z,D,H,P,L,X,ba,a)}$.addRectangle(Z)}}i.setTransform(1,0,0,1,0,0)}};THREE.RenderableVertex=function(){this.positionWorld=new THREE.Vector3;this.positionScreen=new THREE.Vector4;this.visible=true};THREE.RenderableVertex.prototype.copy=function(a){this.positionWorld.copy(a.positionWorld);this.positionScreen.copy(a.positionScreen)};
+D.positionScreen.x*o;D.positionScreen.y=D.positionScreen.y*q;H.positionScreen.x=H.positionScreen.x*o;H.positionScreen.y=H.positionScreen.y*q;P.positionScreen.copy(z.positionScreen);M.positionScreen.copy(H.positionScreen);if(ba.overdraw){ia(u.positionScreen,z.positionScreen);ia(z.positionScreen,H.positionScreen);ia(H.positionScreen,u.positionScreen);ia(D.positionScreen,P.positionScreen);ia(D.positionScreen,M.positionScreen)}Z.addPoint(u.positionScreen.x,u.positionScreen.y);Z.addPoint(z.positionScreen.x,
+z.positionScreen.y);Z.addPoint(D.positionScreen.x,D.positionScreen.y);Z.addPoint(H.positionScreen.x,H.positionScreen.y);la.intersects(Z)&&w(u,z,D,H,P,M,X,ba,a)}$.addRectangle(Z)}}i.setTransform(1,0,0,1,0,0)}};THREE.RenderableVertex=function(){this.positionWorld=new THREE.Vector3;this.positionScreen=new THREE.Vector4;this.visible=true};THREE.RenderableVertex.prototype.copy=function(a){this.positionWorld.copy(a.positionWorld);this.positionScreen.copy(a.positionScreen)};
 THREE.RenderableFace3=function(){this.v1=new THREE.RenderableVertex;this.v2=new THREE.RenderableVertex;this.v3=new THREE.RenderableVertex;this.centroidWorld=new THREE.Vector3;this.centroidScreen=new THREE.Vector3;this.normalWorld=new THREE.Vector3;this.vertexNormalsWorld=[new THREE.Vector3,new THREE.Vector3,new THREE.Vector3];this.faceMaterial=this.material=null;this.uvs=[[]];this.z=null};
 THREE.RenderableFace4=function(){this.v1=new THREE.RenderableVertex;this.v2=new THREE.RenderableVertex;this.v3=new THREE.RenderableVertex;this.v4=new THREE.RenderableVertex;this.centroidWorld=new THREE.Vector3;this.centroidScreen=new THREE.Vector3;this.normalWorld=new THREE.Vector3;this.vertexNormalsWorld=[new THREE.Vector3,new THREE.Vector3,new THREE.Vector3,new THREE.Vector3];this.faceMaterial=this.material=null;this.uvs=[[]];this.z=null};THREE.RenderableObject=function(){this.z=this.object=null};
 THREE.RenderableParticle=function(){this.rotation=this.z=this.y=this.x=null;this.scale=new THREE.Vector2;this.material=null};THREE.RenderableLine=function(){this.z=null;this.v1=new THREE.RenderableVertex;this.v2=new THREE.RenderableVertex;this.material=null};

+ 17 - 16
build/custom/ThreeWebGL.js

@@ -165,22 +165,23 @@ w;){var q=h[o++],p=q&2,e=q&4,s=q&8,B=q&16,r=q&32,A=q&64,n=q&128;if(q&1){q=new TH
 3;p=new THREE.Vector3;p.x=j[B++];p.y=j[B++];p.z=j[B];q.normal=p}if(r)for(e=0;e<u;e++){B=h[o++]*3;p=new THREE.Vector3;p.x=j[B++];p.y=j[B++];p.z=j[B];q.vertexNormals.push(p)}if(A){r=h[o++];q.color=new THREE.Color(k[r])}if(n)for(e=0;e<u;e++){r=h[o++];q.vertexColors.push(new THREE.Color(k[r]))}d.faces.push(q)}if(a.skinWeights){e=0;for(h=a.skinWeights.length;e<h;e=e+2)d.skinWeights.push(new THREE.Vector4(a.skinWeights[e],a.skinWeights[e+1],0,0))}if(a.skinIndices){e=0;for(h=a.skinIndices.length;e<h;e=e+
 2){j=0;d.skinIndices.push(new THREE.Vector4(a.skinIndices[e],a.skinIndices[e+1],j,0))}}d.bones=a.bones;d.animation=a.animation;if(a.morphTargets){e=0;for(h=a.morphTargets.length;e<h;e++){d.morphTargets[e]={};d.morphTargets[e].name=a.morphTargets[e].name;d.morphTargets[e].vertices=[];j=d.morphTargets[e].vertices;k=a.morphTargets[e].vertices;p=0;for(i=k.length;p<i;p=p+3){n=new THREE.Vector3;n.x=k[p]*f;n.y=k[p+1]*f;n.z=k[p+2]*f;j.push(n)}}}if(a.morphColors){e=0;for(h=a.morphColors.length;e<h;e++){d.morphColors[e]=
 {};d.morphColors[e].name=a.morphColors[e].name;d.morphColors[e].colors=[];f=d.morphColors[e].colors;k=a.morphColors[e].colors;j=0;for(i=k.length;j<i;j=j+3){o=new THREE.Color(16755200);o.setRGB(k[j],k[j+1],k[j+2]);f.push(o)}}}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("text/plain; charset=x-user-defined");d.setRequestHeader("Content-Type","text/plain");d.send(null)};
+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("text/plain; charset=x-user-defined");d.setRequestHeader("Content-Type","text/plain");d.send(null)};
 THREE.SceneLoader.prototype.createScene=function(a,b,c){function d(a,b){return b=="relativeToHTML"?a:k+"/"+a}function f(){var a;for(j in y.objects)if(!I.objects[j]){p=y.objects[j];if(p.geometry!==void 0){if(G=I.geometries[p.geometry]){a=false;R=I.materials[p.materials[0]];(a=R instanceof THREE.ShaderMaterial)&&G.computeTangents();u=p.position;J=p.rotation;D=p.quaternion;M=p.scale;s=p.matrix;D=0;p.materials.length==0&&(R=new THREE.MeshFaceMaterial);p.materials.length>1&&(R=new THREE.MeshFaceMaterial);
 a=new THREE.Mesh(G,R);a.name=j;if(s){a.matrixAutoUpdate=false;a.matrix.set(s[0],s[1],s[2],s[3],s[4],s[5],s[6],s[7],s[8],s[9],s[10],s[11],s[12],s[13],s[14],s[15])}else{a.position.set(u[0],u[1],u[2]);if(D){a.quaternion.set(D[0],D[1],D[2],D[3]);a.useQuaternion=true}else a.rotation.set(J[0],J[1],J[2]);a.scale.set(M[0],M[1],M[2])}a.visible=p.visible;a.doubleSided=p.doubleSided;a.castShadow=p.castShadow;a.receiveShadow=p.receiveShadow;I.scene.add(a);I.objects[j]=a}}else{u=p.position;J=p.rotation;D=p.quaternion;
 M=p.scale;D=0;a=new THREE.Object3D;a.name=j;a.position.set(u[0],u[1],u[2]);if(D){a.quaternion.set(D[0],D[1],D[2],D[3]);a.useQuaternion=true}else a.rotation.set(J[0],J[1],J[2]);a.scale.set(M[0],M[1],M[2]);a.visible=p.visible!==void 0?p.visible:false;I.scene.add(a);I.objects[j]=a;I.empties[j]=a}}}function e(a){return function(b){I.geometries[a]=b;f();Z=Z-1;m.onLoadComplete();l()}}function h(a){return function(b){I.geometries[a]=b}}function l(){m.callbackProgress({totalModels:g,totalTextures:W,loadedModels:g-
-Z,loadedTextures:W-F},I);m.onLoadProgress();Z==0&&F==0&&b(I)}var m=this,k=THREE.Loader.prototype.extractUrlBase(c),i,o,j,w,r,n,q,p,s,B,A,u,J,D,M,E,Q,G,R,T,S,y,L,Z,F,g,W,I;y=a;c=new THREE.BinaryLoader;L=new THREE.JSONLoader;F=Z=0;I={scene:new THREE.Scene,geometries:{},materials:{},textures:{},objects:{},cameras:{},lights:{},fogs:{},empties:{}};if(y.transform){a=y.transform.position;B=y.transform.rotation;E=y.transform.scale;a&&I.scene.position.set(a[0],a[1],a[2]);B&&I.scene.rotation.set(B[0],B[1],
-B[2]);E&&I.scene.scale.set(E[0],E[1],E[2]);if(a||B||E){I.scene.updateMatrix();I.scene.updateMatrixWorld()}}a=function(){F=F-1;l();m.onLoadComplete()};for(r in y.cameras){E=y.cameras[r];E.type=="perspective"?T=new THREE.PerspectiveCamera(E.fov,E.aspect,E.near,E.far):E.type=="ortho"&&(T=new THREE.OrthographicCamera(E.left,E.right,E.top,E.bottom,E.near,E.far));u=E.position;B=E.target;E=E.up;T.position.set(u[0],u[1],u[2]);T.target=new THREE.Vector3(B[0],B[1],B[2]);E&&T.up.set(E[0],E[1],E[2]);I.cameras[r]=
-T}for(w in y.lights){B=y.lights[w];r=B.color!==void 0?B.color:16777215;T=B.intensity!==void 0?B.intensity:1;if(B.type=="directional"){u=B.direction;A=new THREE.DirectionalLight(r,T);A.position.set(u[0],u[1],u[2]);A.position.normalize()}else if(B.type=="point"){u=B.position;A=B.distance;A=new THREE.PointLight(r,T,A);A.position.set(u[0],u[1],u[2])}else B.type=="ambient"&&(A=new THREE.AmbientLight(r));I.scene.add(A);I.lights[w]=A}for(n in y.fogs){w=y.fogs[n];w.type=="linear"?S=new THREE.Fog(0,w.near,
-w.far):w.type=="exp2"&&(S=new THREE.FogExp2(0,w.density));E=w.color;S.color.setRGB(E[0],E[1],E[2]);I.fogs[n]=S}if(I.cameras&&y.defaults.camera)I.currentCamera=I.cameras[y.defaults.camera];if(I.fogs&&y.defaults.fog)I.scene.fog=I.fogs[y.defaults.fog];E=y.defaults.bgcolor;I.bgColor=new THREE.Color;I.bgColor.setRGB(E[0],E[1],E[2]);I.bgColorAlpha=y.defaults.bgalpha;for(i in y.geometries){n=y.geometries[i];if(n.type=="bin_mesh"||n.type=="ascii_mesh"){Z=Z+1;m.onLoadStart()}}g=Z;for(i in y.geometries){n=
-y.geometries[i];if(n.type=="cube"){G=new THREE.CubeGeometry(n.width,n.height,n.depth,n.segmentsWidth,n.segmentsHeight,n.segmentsDepth,null,n.flipped,n.sides);I.geometries[i]=G}else if(n.type=="plane"){G=new THREE.PlaneGeometry(n.width,n.height,n.segmentsWidth,n.segmentsHeight);I.geometries[i]=G}else if(n.type=="sphere"){G=new THREE.SphereGeometry(n.radius,n.segmentsWidth,n.segmentsHeight);I.geometries[i]=G}else if(n.type=="cylinder"){G=new THREE.CylinderGeometry(n.topRad,n.botRad,n.height,n.radSegs,
-n.heightSegs);I.geometries[i]=G}else if(n.type=="torus"){G=new THREE.TorusGeometry(n.radius,n.tube,n.segmentsR,n.segmentsT);I.geometries[i]=G}else if(n.type=="icosahedron"){G=new THREE.IcosahedronGeometry(n.radius,n.subdivisions);I.geometries[i]=G}else if(n.type=="bin_mesh")c.load(d(n.url,y.urlBaseType),e(i));else if(n.type=="ascii_mesh")L.load(d(n.url,y.urlBaseType),e(i));else if(n.type=="embedded_mesh"){n=y.embeds[n.id];n.metadata=y.metadata;n&&L.createModel(n,h(i),"")}}for(q in y.textures){i=y.textures[q];
-if(i.url instanceof Array){F=F+i.url.length;for(n=0;n<i.url.length;n++)m.onLoadStart()}else{F=F+1;m.onLoadStart()}}W=F;for(q in y.textures){i=y.textures[q];if(i.mapping!=void 0&&THREE[i.mapping]!=void 0)i.mapping=new THREE[i.mapping];if(i.url instanceof Array){n=[];for(S=0;S<i.url.length;S++)n[S]=d(i.url[S],y.urlBaseType);n=THREE.ImageUtils.loadTextureCube(n,i.mapping,a)}else{n=THREE.ImageUtils.loadTexture(d(i.url,y.urlBaseType),i.mapping,a);if(THREE[i.minFilter]!=void 0)n.minFilter=THREE[i.minFilter];
-if(THREE[i.magFilter]!=void 0)n.magFilter=THREE[i.magFilter];if(i.repeat){n.repeat.set(i.repeat[0],i.repeat[1]);if(i.repeat[0]!=1)n.wrapS=THREE.RepeatWrapping;if(i.repeat[1]!=1)n.wrapT=THREE.RepeatWrapping}i.offset&&n.offset.set(i.offset[0],i.offset[1]);if(i.wrap){S={repeat:THREE.RepeatWrapping,mirror:THREE.MirroredRepeatWrapping};if(S[i.wrap[0]]!==void 0)n.wrapS=S[i.wrap[0]];if(S[i.wrap[1]]!==void 0)n.wrapT=S[i.wrap[1]]}}I.textures[q]=n}for(o in y.materials){s=y.materials[o];for(Q in s.parameters)if(Q==
-"envMap"||Q=="map"||Q=="lightMap")s.parameters[Q]=I.textures[s.parameters[Q]];else if(Q=="shading")s.parameters[Q]=s.parameters[Q]=="flat"?THREE.FlatShading:THREE.SmoothShading;else if(Q=="blending")s.parameters[Q]=s.parameters[Q]in THREE?THREE[s.parameters[Q]]:THREE.NormalBlending;else if(Q=="combine")s.parameters[Q]=s.parameters[Q]=="MixOperation"?THREE.MixOperation:THREE.MultiplyOperation;else if(Q=="vertexColors")if(s.parameters[Q]=="face")s.parameters[Q]=THREE.FaceColors;else if(s.parameters[Q])s.parameters[Q]=
-THREE.VertexColors;if(s.parameters.opacity!==void 0&&s.parameters.opacity<1)s.parameters.transparent=true;if(s.parameters.normalMap){q=THREE.ShaderUtils.lib.normal;a=THREE.UniformsUtils.clone(q.uniforms);i=s.parameters.color;n=s.parameters.specular;S=s.parameters.ambient;c=s.parameters.shininess;a.tNormal.texture=I.textures[s.parameters.normalMap];if(s.parameters.normalMapFactor)a.uNormalScale.value=s.parameters.normalMapFactor;if(s.parameters.map){a.tDiffuse.texture=s.parameters.map;a.enableDiffuse.value=
-true}if(s.parameters.lightMap){a.tAO.texture=s.parameters.lightMap;a.enableAO.value=true}if(s.parameters.specularMap){a.tSpecular.texture=I.textures[s.parameters.specularMap];a.enableSpecular.value=true}a.uDiffuseColor.value.setHex(i);a.uSpecularColor.value.setHex(n);a.uAmbientColor.value.setHex(S);a.uShininess.value=c;if(s.parameters.opacity)a.uOpacity.value=s.parameters.opacity;R=new THREE.ShaderMaterial({fragmentShader:q.fragmentShader,vertexShader:q.vertexShader,uniforms:a,lights:true,fog:true})}else R=
-new THREE[s.type](s.parameters);I.materials[o]=R}f();m.callbackSync(I);l()};THREE.TextureLoader=function(){THREE.EventTarget.call(this);this.crossOrigin=null};
+Z,loadedTextures:W-F},I);m.onLoadProgress();Z===0&&F===0&&b(I)}var m=this,k=THREE.Loader.prototype.extractUrlBase(c),i,o,j,w,r,n,q,p,s,B,A,u,J,D,M,E,Q,G,R,T,S,y,L,Z,F,g,W,I;y=a;c=new THREE.BinaryLoader;L=new THREE.JSONLoader;F=Z=0;I={scene:new THREE.Scene,geometries:{},materials:{},textures:{},objects:{},cameras:{},lights:{},fogs:{},empties:{}};if(y.transform){a=y.transform.position;B=y.transform.rotation;E=y.transform.scale;a&&I.scene.position.set(a[0],a[1],a[2]);B&&I.scene.rotation.set(B[0],B[1],
+B[2]);E&&I.scene.scale.set(E[0],E[1],E[2]);if(a||B||E){I.scene.updateMatrix();I.scene.updateMatrixWorld()}}a=function(a){return function(){F=F-a;l();m.onLoadComplete()}};for(r in y.cameras){E=y.cameras[r];E.type==="perspective"?T=new THREE.PerspectiveCamera(E.fov,E.aspect,E.near,E.far):E.type==="ortho"&&(T=new THREE.OrthographicCamera(E.left,E.right,E.top,E.bottom,E.near,E.far));u=E.position;B=E.target;E=E.up;T.position.set(u[0],u[1],u[2]);T.target=new THREE.Vector3(B[0],B[1],B[2]);E&&T.up.set(E[0],
+E[1],E[2]);I.cameras[r]=T}for(w in y.lights){B=y.lights[w];r=B.color!==void 0?B.color:16777215;T=B.intensity!==void 0?B.intensity:1;if(B.type==="directional"){u=B.direction;A=new THREE.DirectionalLight(r,T);A.position.set(u[0],u[1],u[2]);A.position.normalize()}else if(B.type==="point"){u=B.position;A=B.distance;A=new THREE.PointLight(r,T,A);A.position.set(u[0],u[1],u[2])}else B.type==="ambient"&&(A=new THREE.AmbientLight(r));I.scene.add(A);I.lights[w]=A}for(n in y.fogs){w=y.fogs[n];w.type==="linear"?
+S=new THREE.Fog(0,w.near,w.far):w.type==="exp2"&&(S=new THREE.FogExp2(0,w.density));E=w.color;S.color.setRGB(E[0],E[1],E[2]);I.fogs[n]=S}if(I.cameras&&y.defaults.camera)I.currentCamera=I.cameras[y.defaults.camera];if(I.fogs&&y.defaults.fog)I.scene.fog=I.fogs[y.defaults.fog];E=y.defaults.bgcolor;I.bgColor=new THREE.Color;I.bgColor.setRGB(E[0],E[1],E[2]);I.bgColorAlpha=y.defaults.bgalpha;for(i in y.geometries){n=y.geometries[i];if(n.type=="bin_mesh"||n.type=="ascii_mesh"){Z=Z+1;m.onLoadStart()}}g=Z;
+for(i in y.geometries){n=y.geometries[i];if(n.type==="cube"){G=new THREE.CubeGeometry(n.width,n.height,n.depth,n.segmentsWidth,n.segmentsHeight,n.segmentsDepth,null,n.flipped,n.sides);I.geometries[i]=G}else if(n.type==="plane"){G=new THREE.PlaneGeometry(n.width,n.height,n.segmentsWidth,n.segmentsHeight);I.geometries[i]=G}else if(n.type==="sphere"){G=new THREE.SphereGeometry(n.radius,n.segmentsWidth,n.segmentsHeight);I.geometries[i]=G}else if(n.type==="cylinder"){G=new THREE.CylinderGeometry(n.topRad,
+n.botRad,n.height,n.radSegs,n.heightSegs);I.geometries[i]=G}else if(n.type==="torus"){G=new THREE.TorusGeometry(n.radius,n.tube,n.segmentsR,n.segmentsT);I.geometries[i]=G}else if(n.type==="icosahedron"){G=new THREE.IcosahedronGeometry(n.radius,n.subdivisions);I.geometries[i]=G}else if(n.type==="bin_mesh")c.load(d(n.url,y.urlBaseType),e(i));else if(n.type==="ascii_mesh")L.load(d(n.url,y.urlBaseType),e(i));else if(n.type==="embedded_mesh"){n=y.embeds[n.id];n.metadata=y.metadata;n&&L.createModel(n,h(i),
+"")}}for(q in y.textures){i=y.textures[q];if(i.url instanceof Array){F=F+i.url.length;for(n=0;n<i.url.length;n++)m.onLoadStart()}else{F=F+1;m.onLoadStart()}}W=F;for(q in y.textures){i=y.textures[q];if(i.mapping!==void 0&&THREE[i.mapping]!==void 0)i.mapping=new THREE[i.mapping];if(i.url instanceof Array){n=i.url.length;S=[];for(c=0;c<n;c++)S[c]=d(i.url[c],y.urlBaseType);n=THREE.ImageUtils.loadTextureCube(S,i.mapping,a(n))}else{n=THREE.ImageUtils.loadTexture(d(i.url,y.urlBaseType),i.mapping,a(1));if(THREE[i.minFilter]!==
+void 0)n.minFilter=THREE[i.minFilter];if(THREE[i.magFilter]!==void 0)n.magFilter=THREE[i.magFilter];if(i.repeat){n.repeat.set(i.repeat[0],i.repeat[1]);if(i.repeat[0]!==1)n.wrapS=THREE.RepeatWrapping;if(i.repeat[1]!==1)n.wrapT=THREE.RepeatWrapping}i.offset&&n.offset.set(i.offset[0],i.offset[1]);if(i.wrap){S={repeat:THREE.RepeatWrapping,mirror:THREE.MirroredRepeatWrapping};if(S[i.wrap[0]]!==void 0)n.wrapS=S[i.wrap[0]];if(S[i.wrap[1]]!==void 0)n.wrapT=S[i.wrap[1]]}}I.textures[q]=n}for(o in y.materials){s=
+y.materials[o];for(Q in s.parameters)if(Q==="envMap"||Q==="map"||Q==="lightMap")s.parameters[Q]=I.textures[s.parameters[Q]];else if(Q==="shading")s.parameters[Q]=s.parameters[Q]=="flat"?THREE.FlatShading:THREE.SmoothShading;else if(Q==="blending")s.parameters[Q]=s.parameters[Q]in THREE?THREE[s.parameters[Q]]:THREE.NormalBlending;else if(Q==="combine")s.parameters[Q]=s.parameters[Q]=="MixOperation"?THREE.MixOperation:THREE.MultiplyOperation;else if(Q==="vertexColors")if(s.parameters[Q]=="face")s.parameters[Q]=
+THREE.FaceColors;else if(s.parameters[Q])s.parameters[Q]=THREE.VertexColors;if(s.parameters.opacity!==void 0&&s.parameters.opacity<1)s.parameters.transparent=true;if(s.parameters.normalMap){q=THREE.ShaderUtils.lib.normal;a=THREE.UniformsUtils.clone(q.uniforms);i=s.parameters.color;n=s.parameters.specular;S=s.parameters.ambient;c=s.parameters.shininess;a.tNormal.texture=I.textures[s.parameters.normalMap];if(s.parameters.normalMapFactor)a.uNormalScale.value=s.parameters.normalMapFactor;if(s.parameters.map){a.tDiffuse.texture=
+s.parameters.map;a.enableDiffuse.value=true}if(s.parameters.lightMap){a.tAO.texture=s.parameters.lightMap;a.enableAO.value=true}if(s.parameters.specularMap){a.tSpecular.texture=I.textures[s.parameters.specularMap];a.enableSpecular.value=true}a.uDiffuseColor.value.setHex(i);a.uSpecularColor.value.setHex(n);a.uAmbientColor.value.setHex(S);a.uShininess.value=c;if(s.parameters.opacity)a.uOpacity.value=s.parameters.opacity;R=new THREE.ShaderMaterial({fragmentShader:q.fragmentShader,vertexShader:q.vertexShader,
+uniforms:a,lights:true,fog:true})}else R=new THREE[s.type](s.parameters);I.materials[o]=R}f();m.callbackSync(I);l()};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(a){a=a||{};this.id=THREE.MaterialCount++;this.name="";this.opacity=a.opacity!==void 0?a.opacity:1;this.transparent=a.transparent!==void 0?a.transparent:false;this.blending=a.blending!==void 0?a.blending:THREE.NormalBlending;this.blendSrc=a.blendSrc!==void 0?a.blendSrc:THREE.SrcAlphaFactor;this.blendDst=a.blendDst!==void 0?a.blendDst:THREE.OneMinusSrcAlphaFactor;this.blendEquation=a.blendEquation!==void 0?a.blendEquation:THREE.AddEquation;this.depthTest=a.depthTest!==void 0?
 a.depthTest:true;this.depthWrite=a.depthWrite!==void 0?a.depthWrite:true;this.polygonOffset=a.polygonOffset!==void 0?a.polygonOffset:false;this.polygonOffsetFactor=a.polygonOffsetFactor!==void 0?a.polygonOffsetFactor:0;this.polygonOffsetUnits=a.polygonOffsetUnits!==void 0?a.polygonOffsetUnits:0;this.alphaTest=a.alphaTest!==void 0?a.alphaTest:0;this.overdraw=a.overdraw!==void 0?a.overdraw:false;this.needsUpdate=this.visible=true};THREE.MaterialCount=0;THREE.NoShading=0;THREE.FlatShading=1;
@@ -277,9 +278,9 @@ b;m=m+k){i=a[m];if(i.render){j=i.object;l=i.buffer;if(h)i=h;else{i=i[c];if(!i)co
 h[b];if(!h)continue;f&&F.setBlending(h.blending,h.blendEquation,h.blendSrc,h.blendDst);F.setDepthTest(h.depthTest);F.setDepthWrite(h.depthWrite);s(h.polygonOffset,h.polygonOffsetFactor,h.polygonOffsetUnits)}F.renderImmediateObject(c,d,g,h,i)}}}function o(a,b,c){a.push({buffer:b,object:c,opaque:null,transparent:null})}function j(a){for(var b in a.attributes)if(a.attributes[b].needsUpdate)return true;return false}function w(a){for(var b in a.attributes)a.attributes[b].needsUpdate=false}function r(a,
 b){for(var c=a.length-1;c>=0;c--)a[c].object===b&&a.splice(c,1)}function n(a,b){for(var c=a.length-1;c>=0;c--)a[c]===b&&a.splice(c,1)}function q(a,b,c,d,f){if(d.needsUpdate){d.program&&F.deallocateMaterial(d);F.initMaterial(d,b,c,f);d.needsUpdate=false}if(d.morphTargets&&!f.__webglMorphTargetInfluences)f.__webglMorphTargetInfluences=new Float32Array(F.maxMorphTargets);var e=false,h=d.program,i=h.uniforms,j=d.uniforms;if(h!==za){g.useProgram(h);za=h;e=true}if(d.id!==na){na=d.id;e=true}if(e||a!==ga){g.uniformMatrix4fv(i.projectionMatrix,
 false,a._projectionMatrixArray);a!==ga&&(ga=a)}if(e){if(c&&d.fog){j.fogColor.value=c.color;if(c instanceof THREE.Fog){j.fogNear.value=c.near;j.fogFar.value=c.far}else if(c instanceof THREE.FogExp2)j.fogDensity.value=c.density}if(d instanceof THREE.MeshPhongMaterial||d instanceof THREE.MeshLambertMaterial||d.lights){if(ob){for(var l,k=0,m=0,o=0,n,q,r,p=bc,s=p.directional.colors,w=p.directional.positions,u=p.point.colors,y=p.point.positions,B=p.point.distances,E=p.spot.colors,I=p.spot.positions,J=p.spot.distances,
-L=p.spot.directions,Q=p.spot.angles,G=p.spot.exponents,S=0,R=0,T=0,H=r=0,c=H=0,e=b.length;c<e;c++){l=b[c];if(!l.onlyShadow&&l.visible){n=l.color;q=l.intensity;r=l.distance;if(l instanceof THREE.AmbientLight)if(F.gammaInput){k=k+n.r*n.r;m=m+n.g*n.g;o=o+n.b*n.b}else{k=k+n.r;m=m+n.g;o=o+n.b}else if(l instanceof THREE.DirectionalLight){r=S*3;if(F.gammaInput){s[r]=n.r*n.r*q*q;s[r+1]=n.g*n.g*q*q;s[r+2]=n.b*n.b*q*q}else{s[r]=n.r*q;s[r+1]=n.g*q;s[r+2]=n.b*q}Ca.copy(l.matrixWorld.getPosition());Ca.subSelf(l.target.matrixWorld.getPosition());
-Ca.normalize();w[r]=Ca.x;w[r+1]=Ca.y;w[r+2]=Ca.z;S=S+1}else if(l instanceof THREE.PointLight){H=R*3;if(F.gammaInput){u[H]=n.r*n.r*q*q;u[H+1]=n.g*n.g*q*q;u[H+2]=n.b*n.b*q*q}else{u[H]=n.r*q;u[H+1]=n.g*q;u[H+2]=n.b*q}n=l.matrixWorld.getPosition();y[H]=n.x;y[H+1]=n.y;y[H+2]=n.z;B[R]=r;R=R+1}else if(l instanceof THREE.SpotLight){H=T*3;if(F.gammaInput){E[H]=n.r*n.r*q*q;E[H+1]=n.g*n.g*q*q;E[H+2]=n.b*n.b*q*q}else{E[H]=n.r*q;E[H+1]=n.g*q;E[H+2]=n.b*q}n=l.matrixWorld.getPosition();I[H]=n.x;I[H+1]=n.y;I[H+2]=
-n.z;J[T]=r;Ca.copy(n);Ca.subSelf(l.target.matrixWorld.getPosition());Ca.normalize();L[H]=Ca.x;L[H+1]=Ca.y;L[H+2]=Ca.z;Q[T]=Math.cos(l.angle);G[T]=l.exponent;T=T+1}}}c=S*3;for(e=s.length;c<e;c++)s[c]=0;c=R*3;for(e=u.length;c<e;c++)u[c]=0;c=T*3;for(e=E.length;c<e;c++)E[c]=0;p.directional.length=S;p.point.length=R;p.spot.length=T;p.ambient[0]=k;p.ambient[1]=m;p.ambient[2]=o;ob=false}c=bc;j.ambientLightColor.value=c.ambient;j.directionalLightColor.value=c.directional.colors;j.directionalLightDirection.value=
+L=p.spot.directions,Q=p.spot.angles,G=p.spot.exponents,R=0,S=0,T=0,H=r=0,c=H=0,e=b.length;c<e;c++){l=b[c];if(!l.onlyShadow&&l.visible){n=l.color;q=l.intensity;r=l.distance;if(l instanceof THREE.AmbientLight)if(F.gammaInput){k=k+n.r*n.r;m=m+n.g*n.g;o=o+n.b*n.b}else{k=k+n.r;m=m+n.g;o=o+n.b}else if(l instanceof THREE.DirectionalLight){r=R*3;if(F.gammaInput){s[r]=n.r*n.r*q*q;s[r+1]=n.g*n.g*q*q;s[r+2]=n.b*n.b*q*q}else{s[r]=n.r*q;s[r+1]=n.g*q;s[r+2]=n.b*q}Ca.copy(l.matrixWorld.getPosition());Ca.subSelf(l.target.matrixWorld.getPosition());
+Ca.normalize();w[r]=Ca.x;w[r+1]=Ca.y;w[r+2]=Ca.z;R=R+1}else if(l instanceof THREE.PointLight){H=S*3;if(F.gammaInput){u[H]=n.r*n.r*q*q;u[H+1]=n.g*n.g*q*q;u[H+2]=n.b*n.b*q*q}else{u[H]=n.r*q;u[H+1]=n.g*q;u[H+2]=n.b*q}n=l.matrixWorld.getPosition();y[H]=n.x;y[H+1]=n.y;y[H+2]=n.z;B[S]=r;S=S+1}else if(l instanceof THREE.SpotLight){H=T*3;if(F.gammaInput){E[H]=n.r*n.r*q*q;E[H+1]=n.g*n.g*q*q;E[H+2]=n.b*n.b*q*q}else{E[H]=n.r*q;E[H+1]=n.g*q;E[H+2]=n.b*q}n=l.matrixWorld.getPosition();I[H]=n.x;I[H+1]=n.y;I[H+2]=
+n.z;J[T]=r;Ca.copy(n);Ca.subSelf(l.target.matrixWorld.getPosition());Ca.normalize();L[H]=Ca.x;L[H+1]=Ca.y;L[H+2]=Ca.z;Q[T]=Math.cos(l.angle);G[T]=l.exponent;T=T+1}}}c=R*3;for(e=s.length;c<e;c++)s[c]=0;c=S*3;for(e=u.length;c<e;c++)u[c]=0;c=T*3;for(e=E.length;c<e;c++)E[c]=0;p.directional.length=R;p.point.length=S;p.spot.length=T;p.ambient[0]=k;p.ambient[1]=m;p.ambient[2]=o;ob=false}c=bc;j.ambientLightColor.value=c.ambient;j.directionalLightColor.value=c.directional.colors;j.directionalLightDirection.value=
 c.directional.positions;j.pointLightColor.value=c.point.colors;j.pointLightPosition.value=c.point.positions;j.pointLightDistance.value=c.point.distances;j.spotLightColor.value=c.spot.colors;j.spotLightPosition.value=c.spot.positions;j.spotLightDistance.value=c.spot.distances;j.spotLightDirection.value=c.spot.directions;j.spotLightAngle.value=c.spot.angles;j.spotLightExponent.value=c.spot.exponents}if(d instanceof THREE.MeshBasicMaterial||d instanceof THREE.MeshLambertMaterial||d instanceof THREE.MeshPhongMaterial){j.opacity.value=
 d.opacity;F.gammaInput?j.diffuse.value.copyGammaToLinear(d.color):j.diffuse.value=d.color;(j.map.texture=d.map)&&j.offsetRepeat.value.set(d.map.offset.x,d.map.offset.y,d.map.repeat.x,d.map.repeat.y);j.lightMap.texture=d.lightMap;j.envMap.texture=d.envMap;j.flipEnvMap.value=d.envMap instanceof THREE.WebGLRenderTargetCube?1:-1;j.reflectivity.value=d.reflectivity;j.refractionRatio.value=d.refractionRatio;j.combine.value=d.combine;j.useRefract.value=d.envMap&&d.envMap.mapping instanceof THREE.CubeRefractionMapping}if(d instanceof
 THREE.LineBasicMaterial){j.diffuse.value=d.color;j.opacity.value=d.opacity}else if(d instanceof THREE.ParticleBasicMaterial){j.psColor.value=d.color;j.opacity.value=d.opacity;j.size.value=d.size;j.scale.value=M.height/2;j.map.texture=d.map}else if(d instanceof THREE.MeshPhongMaterial){j.shininess.value=d.shininess;if(F.gammaInput){j.ambient.value.copyGammaToLinear(d.ambient);j.emissive.value.copyGammaToLinear(d.emissive);j.specular.value.copyGammaToLinear(d.specular)}else{j.ambient.value=d.ambient;

+ 63 - 48
src/loaders/SceneLoader.js

@@ -23,9 +23,9 @@ THREE.SceneLoader.prototype.load = function( url, callbackFinished ) {
 
 	xhr.onreadystatechange = function () {
 
-		if ( xhr.readyState == 4 ) {
+		if ( xhr.readyState === 4 ) {
 
-			if ( xhr.status == 200 || xhr.status == 0 ) {
+			if ( xhr.status === 200 || xhr.status === 0 ) {
 
 				var json = JSON.parse( xhr.responseText );
 				context.createScene( json, callbackFinished, url );
@@ -182,32 +182,32 @@ THREE.SceneLoader.prototype.createScene = function ( json, callbackFinished, url
 
 						object = new THREE.Mesh( geometry, material );
 						object.name = dd;
-						
+
 						if ( m ) {
-							
+
 							object.matrixAutoUpdate = false;
 							object.matrix.set( m[0], m[1], m[2], m[3],
 											   m[4], m[5], m[6], m[7],
 											   m[8], m[9], m[10], m[11],
 											   m[12], m[13], m[14], m[15]);
-							
+
 						} else {
-							
+
 							object.position.set( p[0], p[1], p[2] );
-	
+
 							if ( q ) {
-	
+
 								object.quaternion.set( q[0], q[1], q[2], q[3] );
 								object.useQuaternion = true;
-	
+
 							} else {
-	
+
 								object.rotation.set( r[0], r[1], r[2] );
-	
+
 							}
-	
+
 							object.scale.set( s[0], s[1], s[2] );
-							
+
 						}
 
 						object.visible = o.visible;
@@ -313,7 +313,7 @@ THREE.SceneLoader.prototype.createScene = function ( json, callbackFinished, url
 
 		scope.onLoadProgress();
 
-		if( counter_models == 0 && counter_textures == 0 ) {
+		if( counter_models === 0 && counter_textures === 0 ) {
 
 			callbackFinished( result );
 
@@ -321,15 +321,28 @@ THREE.SceneLoader.prototype.createScene = function ( json, callbackFinished, url
 
 	};
 
-	var callbackTexture = function( images ) {
+	var callbackTexture = function ( count ) {
 
-		counter_textures -= 1;
+		counter_textures -= count;
 		async_callback_gate();
 
 		scope.onLoadComplete();
 
 	};
 
+	// must use this instead of just directly calling callbackTexture
+	// because of closure in the calling context loop
+
+	var generateTextureCallback = function ( count ) {
+
+		return function() {
+
+			callbackTexture( count );
+
+		};
+
+	};
+
 	// first go synchronous elements
 
 	// cameras
@@ -338,11 +351,11 @@ THREE.SceneLoader.prototype.createScene = function ( json, callbackFinished, url
 
 		c = data.cameras[ dc ];
 
-		if ( c.type == "perspective" ) {
+		if ( c.type === "perspective" ) {
 
 			camera = new THREE.PerspectiveCamera( c.fov, c.aspect, c.near, c.far );
 
-		} else if ( c.type == "ortho" ) {
+		} else if ( c.type === "ortho" ) {
 
 			camera = new THREE.OrthographicCamera( c.left, c.right, c.top, c.bottom, c.near, c.far );
 
@@ -371,7 +384,7 @@ THREE.SceneLoader.prototype.createScene = function ( json, callbackFinished, url
 		hex = ( l.color !== undefined ) ? l.color : 0xffffff;
 		intensity = ( l.intensity !== undefined ) ? l.intensity : 1;
 
-		if ( l.type == "directional" ) {
+		if ( l.type === "directional" ) {
 
 			p = l.direction;
 
@@ -379,7 +392,7 @@ THREE.SceneLoader.prototype.createScene = function ( json, callbackFinished, url
 			light.position.set( p[0], p[1], p[2] );
 			light.position.normalize();
 
-		} else if ( l.type == "point" ) {
+		} else if ( l.type === "point" ) {
 
 			p = l.position;
 			d = l.distance;
@@ -387,7 +400,7 @@ THREE.SceneLoader.prototype.createScene = function ( json, callbackFinished, url
 			light = new THREE.PointLight( hex, intensity, d );
 			light.position.set( p[0], p[1], p[2] );
 
-		} else if ( l.type == "ambient" ) {
+		} else if ( l.type === "ambient" ) {
 
 			light = new THREE.AmbientLight( hex );
 
@@ -405,11 +418,11 @@ THREE.SceneLoader.prototype.createScene = function ( json, callbackFinished, url
 
 		f = data.fogs[ df ];
 
-		if ( f.type == "linear" ) {
+		if ( f.type === "linear" ) {
 
 			fog = new THREE.Fog( 0x000000, f.near, f.far );
 
-		} else if ( f.type == "exp2" ) {
+		} else if ( f.type === "exp2" ) {
 
 			fog = new THREE.FogExp2( 0x000000, f.density );
 
@@ -468,50 +481,51 @@ THREE.SceneLoader.prototype.createScene = function ( json, callbackFinished, url
 
 		g = data.geometries[ dg ];
 
-		if ( g.type == "cube" ) {
+		if ( g.type === "cube" ) {
 
 			geometry = new THREE.CubeGeometry( g.width, g.height, g.depth, g.segmentsWidth, g.segmentsHeight, g.segmentsDepth, null, g.flipped, g.sides );
 			result.geometries[ dg ] = geometry;
 
-		} else if ( g.type == "plane" ) {
+		} else if ( g.type === "plane" ) {
 
 			geometry = new THREE.PlaneGeometry( g.width, g.height, g.segmentsWidth, g.segmentsHeight );
 			result.geometries[ dg ] = geometry;
 
-		} else if ( g.type == "sphere" ) {
+		} else if ( g.type === "sphere" ) {
 
 			geometry = new THREE.SphereGeometry( g.radius, g.segmentsWidth, g.segmentsHeight );
 			result.geometries[ dg ] = geometry;
 
-		} else if ( g.type == "cylinder" ) {
+		} else if ( g.type === "cylinder" ) {
 
 			geometry = new THREE.CylinderGeometry( g.topRad, g.botRad, g.height, g.radSegs, g.heightSegs );
 			result.geometries[ dg ] = geometry;
 
-		} else if ( g.type == "torus" ) {
+		} else if ( g.type === "torus" ) {
 
 			geometry = new THREE.TorusGeometry( g.radius, g.tube, g.segmentsR, g.segmentsT );
 			result.geometries[ dg ] = geometry;
 
-		} else if ( g.type == "icosahedron" ) {
+		} else if ( g.type === "icosahedron" ) {
 
 			geometry = new THREE.IcosahedronGeometry( g.radius, g.subdivisions );
 			result.geometries[ dg ] = geometry;
 
-		} else if ( g.type == "bin_mesh" ) {
+		} else if ( g.type === "bin_mesh" ) {
 
 			binLoader.load( get_url( g.url, data.urlBaseType ), create_callback( dg ) );
 
-		} else if ( g.type == "ascii_mesh" ) {
+		} else if ( g.type === "ascii_mesh" ) {
 
 			jsonLoader.load( get_url( g.url, data.urlBaseType ), create_callback( dg ) );
 
-		} else if ( g.type == "embedded_mesh" ) {
+		} else if ( g.type === "embedded_mesh" ) {
 
 			var modelJson = data.embeds[ g.id ],
 				texture_path = "";
 
-			// Pass metadata along to jsonLoader so it knows the format version.
+			// pass metadata along to jsonLoader so it knows the format version
+
 			modelJson.metadata = data.metadata;
 
 			if ( modelJson ) {
@@ -558,7 +572,7 @@ THREE.SceneLoader.prototype.createScene = function ( json, callbackFinished, url
 
 		tt = data.textures[ dt ];
 
-		if ( tt.mapping != undefined && THREE[ tt.mapping ] != undefined  ) {
+		if ( tt.mapping !== undefined && THREE[ tt.mapping ] !== undefined  ) {
 
 			tt.mapping = new THREE[ tt.mapping ]();
 
@@ -566,24 +580,25 @@ THREE.SceneLoader.prototype.createScene = function ( json, callbackFinished, url
 
 		if( tt.url instanceof Array ) {
 
+			var count = tt.url.length;
 			var url_array = [];
 
-			for( var i = 0; i < tt.url.length; i ++ ) {
+			for( var i = 0; i < count; i ++ ) {
 
 				url_array[ i ] = get_url( tt.url[ i ], data.urlBaseType );
 
 			}
 
-			texture = THREE.ImageUtils.loadTextureCube( url_array, tt.mapping, callbackTexture );
+			texture = THREE.ImageUtils.loadTextureCube( url_array, tt.mapping, generateTextureCallback( count ) );
 
 		} else {
 
-			texture = THREE.ImageUtils.loadTexture( get_url( tt.url, data.urlBaseType ), tt.mapping, callbackTexture );
+			texture = THREE.ImageUtils.loadTexture( get_url( tt.url, data.urlBaseType ), tt.mapping, generateTextureCallback( 1 ) );
 
-			if ( THREE[ tt.minFilter ] != undefined )
+			if ( THREE[ tt.minFilter ] !== undefined )
 				texture.minFilter = THREE[ tt.minFilter ];
 
-			if ( THREE[ tt.magFilter ] != undefined )
+			if ( THREE[ tt.magFilter ] !== undefined )
 				texture.magFilter = THREE[ tt.magFilter ];
 
 
@@ -591,8 +606,8 @@ THREE.SceneLoader.prototype.createScene = function ( json, callbackFinished, url
 
 				texture.repeat.set( tt.repeat[ 0 ], tt.repeat[ 1 ] );
 
-				if ( tt.repeat[ 0 ] != 1 ) texture.wrapS = THREE.RepeatWrapping;
-				if ( tt.repeat[ 1 ] != 1 ) texture.wrapT = THREE.RepeatWrapping;
+				if ( tt.repeat[ 0 ] !== 1 ) texture.wrapS = THREE.RepeatWrapping;
+				if ( tt.repeat[ 1 ] !== 1 ) texture.wrapT = THREE.RepeatWrapping;
 
 			}
 
@@ -630,23 +645,23 @@ THREE.SceneLoader.prototype.createScene = function ( json, callbackFinished, url
 
 		for ( pp in m.parameters ) {
 
-			if ( pp == "envMap" || pp == "map" || pp == "lightMap" ) {
+			if ( pp === "envMap" || pp === "map" || pp === "lightMap" ) {
 
 				m.parameters[ pp ] = result.textures[ m.parameters[ pp ] ];
 
-			} else if ( pp == "shading" ) {
+			} else if ( pp === "shading" ) {
 
 				m.parameters[ pp ] = ( m.parameters[ pp ] == "flat" ) ? THREE.FlatShading : THREE.SmoothShading;
 
-			} else if ( pp == "blending" ) {
+			} else if ( pp === "blending" ) {
 
 				m.parameters[ pp ] = m.parameters[ pp ] in THREE ? THREE[ m.parameters[ pp ] ] : THREE.NormalBlending;
 
-			} else if ( pp == "combine" ) {
+			} else if ( pp === "combine" ) {
 
 				m.parameters[ pp ] = ( m.parameters[ pp ] == "MixOperation" ) ? THREE.MixOperation : THREE.MultiplyOperation;
 
-			} else if ( pp == "vertexColors" ) {
+			} else if ( pp === "vertexColors" ) {
 
 				if ( m.parameters[ pp ] == "face" ) {
 
@@ -743,8 +758,8 @@ THREE.SceneLoader.prototype.createScene = function ( json, callbackFinished, url
 
 	scope.callbackSync( result );
 
-	// just in case there are no async elements:
-	async_callback_gate();
+	// just in case there are no async elements
 
+	async_callback_gate();
 
 };