2
0
Эх сурвалжийг харах

Fixed bug in morph target shader and added example

Mikael Emtinger 14 жил өмнө
parent
commit
24c7590169

+ 88 - 88
build/Three.js

@@ -24,7 +24,7 @@ THREE.Matrix4.prototype={set:function(a,c,b,d,f,g,h,j,k,n,q,x,u,t,y,C){this.n11=
 f=THREE.Matrix4.__v2,g=THREE.Matrix4.__v3;g.sub(a,c).normalize();if(g.length()===0)g.z=1;d.cross(b,g).normalize();if(d.length()===0){g.x+=1.0E-4;d.cross(b,g).normalize()}f.cross(g,d).normalize();this.n11=d.x;this.n12=f.x;this.n13=g.x;this.n21=d.y;this.n22=f.y;this.n23=g.y;this.n31=d.z;this.n32=f.z;this.n33=g.z;return this},multiplyVector3:function(a){var c=a.x,b=a.y,d=a.z,f=1/(this.n41*c+this.n42*b+this.n43*d+this.n44);a.x=(this.n11*c+this.n12*b+this.n13*d+this.n14)*f;a.y=(this.n21*c+this.n22*b+this.n23*
 d+this.n24)*f;a.z=(this.n31*c+this.n32*b+this.n33*d+this.n34)*f;return a},multiplyVector4:function(a){var c=a.x,b=a.y,d=a.z,f=a.w;a.x=this.n11*c+this.n12*b+this.n13*d+this.n14*f;a.y=this.n21*c+this.n22*b+this.n23*d+this.n24*f;a.z=this.n31*c+this.n32*b+this.n33*d+this.n34*f;a.w=this.n41*c+this.n42*b+this.n43*d+this.n44*f;return a},rotateAxis:function(a){var c=a.x,b=a.y,d=a.z;a.x=c*this.n11+b*this.n12+d*this.n13;a.y=c*this.n21+b*this.n22+d*this.n23;a.z=c*this.n31+b*this.n32+d*this.n33;a.normalize();
 return a},crossVector:function(a){var c=new THREE.Vector4;c.x=this.n11*a.x+this.n12*a.y+this.n13*a.z+this.n14*a.w;c.y=this.n21*a.x+this.n22*a.y+this.n23*a.z+this.n24*a.w;c.z=this.n31*a.x+this.n32*a.y+this.n33*a.z+this.n34*a.w;c.w=a.w?this.n41*a.x+this.n42*a.y+this.n43*a.z+this.n44*a.w:1;return c},multiply:function(a,c){var b=a.n11,d=a.n12,f=a.n13,g=a.n14,h=a.n21,j=a.n22,k=a.n23,n=a.n24,q=a.n31,x=a.n32,u=a.n33,t=a.n34,y=a.n41,C=a.n42,F=a.n43,v=a.n44,G=c.n11,w=c.n12,N=c.n13,L=c.n14,Y=c.n21,M=c.n22,
-e=c.n23,X=c.n24,R=c.n31,da=c.n32,ga=c.n33,I=c.n34;this.n11=b*G+d*Y+f*R;this.n12=b*w+d*M+f*da;this.n13=b*N+d*e+f*ga;this.n14=b*L+d*X+f*I+g;this.n21=h*G+j*Y+k*R;this.n22=h*w+j*M+k*da;this.n23=h*N+j*e+k*ga;this.n24=h*L+j*X+k*I+n;this.n31=q*G+x*Y+u*R;this.n32=q*w+x*M+u*da;this.n33=q*N+x*e+u*ga;this.n34=q*L+x*X+u*I+t;this.n41=y*G+C*Y+F*R;this.n42=y*w+C*M+F*da;this.n43=y*N+C*e+F*ga;this.n44=y*L+C*X+F*I+v;return this},multiplyToArray:function(a,c,b){this.multiply(a,c);b[0]=this.n11;b[1]=this.n21;b[2]=this.n31;
+e=c.n23,W=c.n24,R=c.n31,da=c.n32,ga=c.n33,I=c.n34;this.n11=b*G+d*Y+f*R;this.n12=b*w+d*M+f*da;this.n13=b*N+d*e+f*ga;this.n14=b*L+d*W+f*I+g;this.n21=h*G+j*Y+k*R;this.n22=h*w+j*M+k*da;this.n23=h*N+j*e+k*ga;this.n24=h*L+j*W+k*I+n;this.n31=q*G+x*Y+u*R;this.n32=q*w+x*M+u*da;this.n33=q*N+x*e+u*ga;this.n34=q*L+x*W+u*I+t;this.n41=y*G+C*Y+F*R;this.n42=y*w+C*M+F*da;this.n43=y*N+C*e+F*ga;this.n44=y*L+C*W+F*I+v;return this},multiplyToArray:function(a,c,b){this.multiply(a,c);b[0]=this.n11;b[1]=this.n21;b[2]=this.n31;
 b[3]=this.n41;b[4]=this.n12;b[5]=this.n22;b[6]=this.n32;b[7]=this.n42;b[8]=this.n13;b[9]=this.n23;b[10]=this.n33;b[11]=this.n43;b[12]=this.n14;b[13]=this.n24;b[14]=this.n34;b[15]=this.n44;return this},multiplySelf:function(a){this.multiply(this,a);return this},multiplyScalar:function(a){this.n11*=a;this.n12*=a;this.n13*=a;this.n14*=a;this.n21*=a;this.n22*=a;this.n23*=a;this.n24*=a;this.n31*=a;this.n32*=a;this.n33*=a;this.n34*=a;this.n41*=a;this.n42*=a;this.n43*=a;this.n44*=a;return this},determinant:function(){var a=
 this.n11,c=this.n12,b=this.n13,d=this.n14,f=this.n21,g=this.n22,h=this.n23,j=this.n24,k=this.n31,n=this.n32,q=this.n33,x=this.n34,u=this.n41,t=this.n42,y=this.n43,C=this.n44;return d*h*n*u-b*j*n*u-d*g*q*u+c*j*q*u+b*g*x*u-c*h*x*u-d*h*k*t+b*j*k*t+d*f*q*t-a*j*q*t-b*f*x*t+a*h*x*t+d*g*k*y-c*j*k*y-d*f*n*y+a*j*n*y+c*f*x*y-a*g*x*y-b*g*k*C+c*h*k*C+b*f*n*C-a*h*n*C-c*f*q*C+a*g*q*C},transpose:function(){var a;a=this.n21;this.n21=this.n12;this.n12=a;a=this.n31;this.n31=this.n13;this.n13=a;a=this.n32;this.n32=
 this.n23;this.n23=a;a=this.n41;this.n41=this.n14;this.n14=a;a=this.n42;this.n42=this.n24;this.n24=a;a=this.n43;this.n43=this.n34;this.n43=a;return this},clone:function(){var a=new THREE.Matrix4;a.n11=this.n11;a.n12=this.n12;a.n13=this.n13;a.n14=this.n14;a.n21=this.n21;a.n22=this.n22;a.n23=this.n23;a.n24=this.n24;a.n31=this.n31;a.n32=this.n32;a.n33=this.n33;a.n34=this.n34;a.n41=this.n41;a.n42=this.n42;a.n43=this.n43;a.n44=this.n44;return a},flatten:function(){this.flat[0]=this.n11;this.flat[1]=this.n21;
@@ -57,7 +57,7 @@ b.centroid.addSelf(this.vertices[b.d].position);b.centroid.divideScalar(4)}}},co
 b.position);k.sub(c.position,b.position);j.crossSelf(k)}j.isZero()||j.normalize();g.normal.copy(j)}},computeVertexNormals:function(){var a,c,b,d;if(this.__tmpVertices==undefined){d=this.__tmpVertices=Array(this.vertices.length);a=0;for(c=this.vertices.length;a<c;a++)d[a]=new THREE.Vector3;a=0;for(c=this.faces.length;a<c;a++){b=this.faces[a];if(b instanceof THREE.Face3)b.vertexNormals=[new THREE.Vector3,new THREE.Vector3,new THREE.Vector3];else if(b instanceof THREE.Face4)b.vertexNormals=[new THREE.Vector3,
 new THREE.Vector3,new THREE.Vector3,new THREE.Vector3]}}else{d=this.__tmpVertices;a=0;for(c=this.vertices.length;a<c;a++)d[a].set(0,0,0)}a=0;for(c=this.faces.length;a<c;a++){b=this.faces[a];if(b instanceof THREE.Face3){d[b.a].addSelf(b.normal);d[b.b].addSelf(b.normal);d[b.c].addSelf(b.normal)}else if(b instanceof THREE.Face4){d[b.a].addSelf(b.normal);d[b.b].addSelf(b.normal);d[b.c].addSelf(b.normal);d[b.d].addSelf(b.normal)}}a=0;for(c=this.vertices.length;a<c;a++)d[a].normalize();a=0;for(c=this.faces.length;a<
 c;a++){b=this.faces[a];if(b instanceof THREE.Face3){b.vertexNormals[0].copy(d[b.a]);b.vertexNormals[1].copy(d[b.b]);b.vertexNormals[2].copy(d[b.c])}else if(b instanceof THREE.Face4){b.vertexNormals[0].copy(d[b.a]);b.vertexNormals[1].copy(d[b.b]);b.vertexNormals[2].copy(d[b.c]);b.vertexNormals[3].copy(d[b.d])}}},computeTangents:function(){function a(I,ca,za,ea,xa,ja,ha){g=I.vertices[ca].position;h=I.vertices[za].position;j=I.vertices[ea].position;k=f[xa];n=f[ja];q=f[ha];x=h.x-g.x;u=j.x-g.x;t=h.y-g.y;
-y=j.y-g.y;C=h.z-g.z;F=j.z-g.z;v=n.u-k.u;G=q.u-k.u;w=n.v-k.v;N=q.v-k.v;L=1/(v*N-G*w);e.set((N*x-w*u)*L,(N*t-w*y)*L,(N*C-w*F)*L);X.set((v*u-G*x)*L,(v*y-G*t)*L,(v*F-G*C)*L);Y[ca].addSelf(e);Y[za].addSelf(e);Y[ea].addSelf(e);M[ca].addSelf(X);M[za].addSelf(X);M[ea].addSelf(X)}var c,b,d,f,g,h,j,k,n,q,x,u,t,y,C,F,v,G,w,N,L,Y=[],M=[],e=new THREE.Vector3,X=new THREE.Vector3,R=new THREE.Vector3,da=new THREE.Vector3,ga=new THREE.Vector3;c=0;for(b=this.vertices.length;c<b;c++){Y[c]=new THREE.Vector3;M[c]=new THREE.Vector3}c=
+y=j.y-g.y;C=h.z-g.z;F=j.z-g.z;v=n.u-k.u;G=q.u-k.u;w=n.v-k.v;N=q.v-k.v;L=1/(v*N-G*w);e.set((N*x-w*u)*L,(N*t-w*y)*L,(N*C-w*F)*L);W.set((v*u-G*x)*L,(v*y-G*t)*L,(v*F-G*C)*L);Y[ca].addSelf(e);Y[za].addSelf(e);Y[ea].addSelf(e);M[ca].addSelf(W);M[za].addSelf(W);M[ea].addSelf(W)}var c,b,d,f,g,h,j,k,n,q,x,u,t,y,C,F,v,G,w,N,L,Y=[],M=[],e=new THREE.Vector3,W=new THREE.Vector3,R=new THREE.Vector3,da=new THREE.Vector3,ga=new THREE.Vector3;c=0;for(b=this.vertices.length;c<b;c++){Y[c]=new THREE.Vector3;M[c]=new THREE.Vector3}c=
 0;for(b=this.faces.length;c<b;c++){d=this.faces[c];f=this.uvs[c];if(d instanceof THREE.Face3){a(this,d.a,d.b,d.c,0,1,2);this.vertices[d.a].normal.copy(d.vertexNormals[0]);this.vertices[d.b].normal.copy(d.vertexNormals[1]);this.vertices[d.c].normal.copy(d.vertexNormals[2])}else if(d instanceof THREE.Face4){a(this,d.a,d.b,d.c,0,1,2);a(this,d.a,d.b,d.d,0,1,3);this.vertices[d.a].normal.copy(d.vertexNormals[0]);this.vertices[d.b].normal.copy(d.vertexNormals[1]);this.vertices[d.c].normal.copy(d.vertexNormals[2]);
 this.vertices[d.d].normal.copy(d.vertexNormals[3])}}c=0;for(b=this.vertices.length;c<b;c++){ga.copy(this.vertices[c].normal);d=Y[c];R.copy(d);R.subSelf(ga.multiplyScalar(ga.dot(d))).normalize();da.cross(this.vertices[c].normal,d);d=da.dot(M[c]);d=d<0?-1:1;this.vertices[c].tangent.set(R.x,R.y,R.z,d)}this.hasTangents=!0},computeBoundingBox:function(){var a;if(this.vertices.length>0){this.boundingBox={x:[this.vertices[0].position.x,this.vertices[0].position.x],y:[this.vertices[0].position.y,this.vertices[0].position.y],
 z:[this.vertices[0].position.z,this.vertices[0].position.z]};for(var c=1,b=this.vertices.length;c<b;c++){a=this.vertices[c];if(a.position.x<this.boundingBox.x[0])this.boundingBox.x[0]=a.position.x;else if(a.position.x>this.boundingBox.x[1])this.boundingBox.x[1]=a.position.x;if(a.position.y<this.boundingBox.y[0])this.boundingBox.y[0]=a.position.y;else if(a.position.y>this.boundingBox.y[1])this.boundingBox.y[1]=a.position.y;if(a.position.z<this.boundingBox.z[0])this.boundingBox.z[0]=a.position.z;else if(a.position.z>
@@ -145,9 +145,9 @@ THREE.LOD.prototype.update=function(a,c,b){this.matrixAutoUpdate&&(c|=this.updat
 THREE.Scene.prototype.addChild=function(a){this.supr.addChild.call(this,a);this.addChildRecurse(a)};THREE.Scene.prototype.addChildRecurse=function(a){if(a instanceof THREE.Light)this.lights.indexOf(a)===-1&&this.lights.push(a);else if(a instanceof THREE.Sound)this.sounds.indexOf(a)===-1&&this.sounds.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)}for(var c=0;c<a.children.length;c++)this.addChildRecurse(a.children[c])};
 THREE.Scene.prototype.removeChild=function(a){this.supr.removeChild.call(this,a);this.removeChildRecurse(a)};THREE.Scene.prototype.removeChildRecurse=function(a){if(a instanceof THREE.Light){var c=this.lights.indexOf(a);c!==-1&&this.lights.splice(c,1)}else if(a instanceof THREE.Sound){c=this.sounds.indexOf(a);c!==-1&&this.sounds.splice(c,1)}else if(!(a instanceof THREE.Camera)){c=this.objects.indexOf(a);if(c!==-1){this.objects.splice(c,1);this.__objectsRemoved.push(a)}}for(c=0;c<a.children.length;c++)this.removeChildRecurse(a.children[c])};
 THREE.Scene.prototype.addObject=THREE.Scene.prototype.addChild;THREE.Scene.prototype.removeObject=THREE.Scene.prototype.removeChild;THREE.Scene.prototype.addLight=THREE.Scene.prototype.addChild;THREE.Scene.prototype.removeLight=THREE.Scene.prototype.removeChild;THREE.Fog=function(a,c,b){this.color=new THREE.Color(a);this.near=c||1;this.far=b||1E3};THREE.FogExp2=function(a,c){this.color=new THREE.Color(a);this.density=c!==undefined?c:2.5E-4};
-THREE.Projector=function(){function a(M,e){return e.z-M.z}function c(M,e){var X=0,R=1,da=M.z+M.w,ga=e.z+e.w,I=-M.z+M.w,ca=-e.z+e.w;if(da>=0&&ga>=0&&I>=0&&ca>=0)return!0;else if(da<0&&ga<0||I<0&&ca<0)return!1;else{if(da<0)X=Math.max(X,da/(da-ga));else ga<0&&(R=Math.min(R,da/(da-ga)));if(I<0)X=Math.max(X,I/(I-ca));else ca<0&&(R=Math.min(R,I/(I-ca)));if(R<X)return!1;else{M.lerpSelf(e,X);e.lerpSelf(M,1-R);return!0}}}var b,d,f=[],g,h,j,k=[],n,q,x=[],u,t,y=[],C=new THREE.Vector4,F=new THREE.Vector4,v=new THREE.Matrix4,
-G=new THREE.Matrix4,w=[new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4],N=new THREE.Vector4,L=new THREE.Vector4,Y;this.projectObjects=function(M,e,X){e=[];var R,da,ga;d=0;da=M.objects;M=0;for(R=da.length;M<R;M++){ga=da[M];var I;if(!(I=!ga.visible))if(I=ga instanceof THREE.Mesh){a:{I=void 0;for(var ca=ga.matrixWorld,za=-ga.geometry.boundingSphere.radius*Math.max(ga.scale.x,Math.max(ga.scale.y,ga.scale.z)),ea=0;ea<6;ea++){I=w[ea].x*ca.n14+
-w[ea].y*ca.n24+w[ea].z*ca.n34+w[ea].w;if(I<=za){I=!1;break a}}I=!0}I=!I}if(!I){b=f[d]=f[d]||new THREE.RenderableObject;C.copy(ga.position);v.multiplyVector3(C);b.object=ga;b.z=C.z;e.push(b);d++}}X&&e.sort(a);return e};this.projectScene=function(M,e,X){var R=[],da=e.near,ga=e.far,I,ca,za,ea,xa,ja,ha,va,Aa,ia,$,qa,ra,Q,ma,ta;j=q=t=0;e.matrixAutoUpdate&&e.update();v.multiply(e.projectionMatrix,e.matrixWorldInverse);w[0].set(v.n41-v.n11,v.n42-v.n12,v.n43-v.n13,v.n44-v.n14);w[1].set(v.n41+v.n11,v.n42+
+THREE.Projector=function(){function a(M,e){return e.z-M.z}function c(M,e){var W=0,R=1,da=M.z+M.w,ga=e.z+e.w,I=-M.z+M.w,ca=-e.z+e.w;if(da>=0&&ga>=0&&I>=0&&ca>=0)return!0;else if(da<0&&ga<0||I<0&&ca<0)return!1;else{if(da<0)W=Math.max(W,da/(da-ga));else ga<0&&(R=Math.min(R,da/(da-ga)));if(I<0)W=Math.max(W,I/(I-ca));else ca<0&&(R=Math.min(R,I/(I-ca)));if(R<W)return!1;else{M.lerpSelf(e,W);e.lerpSelf(M,1-R);return!0}}}var b,d,f=[],g,h,j,k=[],n,q,x=[],u,t,y=[],C=new THREE.Vector4,F=new THREE.Vector4,v=new THREE.Matrix4,
+G=new THREE.Matrix4,w=[new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4],N=new THREE.Vector4,L=new THREE.Vector4,Y;this.projectObjects=function(M,e,W){e=[];var R,da,ga;d=0;da=M.objects;M=0;for(R=da.length;M<R;M++){ga=da[M];var I;if(!(I=!ga.visible))if(I=ga instanceof THREE.Mesh){a:{I=void 0;for(var ca=ga.matrixWorld,za=-ga.geometry.boundingSphere.radius*Math.max(ga.scale.x,Math.max(ga.scale.y,ga.scale.z)),ea=0;ea<6;ea++){I=w[ea].x*ca.n14+
+w[ea].y*ca.n24+w[ea].z*ca.n34+w[ea].w;if(I<=za){I=!1;break a}}I=!0}I=!I}if(!I){b=f[d]=f[d]||new THREE.RenderableObject;C.copy(ga.position);v.multiplyVector3(C);b.object=ga;b.z=C.z;e.push(b);d++}}W&&e.sort(a);return e};this.projectScene=function(M,e,W){var R=[],da=e.near,ga=e.far,I,ca,za,ea,xa,ja,ha,va,Aa,ia,$,qa,ra,Q,ma,ta;j=q=t=0;e.matrixAutoUpdate&&e.update();v.multiply(e.projectionMatrix,e.matrixWorldInverse);w[0].set(v.n41-v.n11,v.n42-v.n12,v.n43-v.n13,v.n44-v.n14);w[1].set(v.n41+v.n11,v.n42+
 v.n12,v.n43+v.n13,v.n44+v.n14);w[2].set(v.n41+v.n21,v.n42+v.n22,v.n43+v.n23,v.n44+v.n24);w[3].set(v.n41-v.n21,v.n42-v.n22,v.n43-v.n23,v.n44-v.n24);w[4].set(v.n41-v.n31,v.n42-v.n32,v.n43-v.n33,v.n44-v.n34);w[5].set(v.n41+v.n31,v.n42+v.n32,v.n43+v.n33,v.n44+v.n34);for(I=0;I<6;I++){ja=w[I];ja.divideScalar(Math.sqrt(ja.x*ja.x+ja.y*ja.y+ja.z*ja.z))}M.update(undefined,!1,e);ja=this.projectObjects(M,e,!0);M=0;for(I=ja.length;M<I;M++){ha=ja[M].object;if(ha.visible){va=ha.matrixWorld;$=ha.matrixRotationWorld;
 Aa=ha.materials;ia=ha.overdraw;if(ha instanceof THREE.Mesh){qa=ha.geometry;ra=qa.vertices;ca=0;for(za=ra.length;ca<za;ca++){Q=ra[ca];Q.positionWorld.copy(Q.position);va.multiplyVector3(Q.positionWorld);ea=Q.positionScreen;ea.copy(Q.positionWorld);v.multiplyVector4(ea);ea.x/=ea.w;ea.y/=ea.w;Q.__visible=ea.z>da&&ea.z<ga}qa=qa.faces;ca=0;for(za=qa.length;ca<za;ca++){Q=qa[ca];if(Q instanceof THREE.Face3){ea=ra[Q.a];xa=ra[Q.b];ma=ra[Q.c];if(ea.__visible&&xa.__visible&&ma.__visible&&(ha.doubleSided||ha.flipSided!=
 (ma.positionScreen.x-ea.positionScreen.x)*(xa.positionScreen.y-ea.positionScreen.y)-(ma.positionScreen.y-ea.positionScreen.y)*(xa.positionScreen.x-ea.positionScreen.x)<0)){g=k[j]=k[j]||new THREE.RenderableFace3;g.v1.positionWorld.copy(ea.positionWorld);g.v2.positionWorld.copy(xa.positionWorld);g.v3.positionWorld.copy(ma.positionWorld);g.v1.positionScreen.copy(ea.positionScreen);g.v2.positionScreen.copy(xa.positionScreen);g.v3.positionScreen.copy(ma.positionScreen);g.normalWorld.copy(Q.normal);$.multiplyVector3(g.normalWorld);
@@ -157,34 +157,34 @@ j++}}else if(Q instanceof THREE.Face4){ea=ra[Q.a];xa=ra[Q.b];ma=ra[Q.c];ta=ra[Q.
 g.z=g.centroidScreen.z;g.meshMaterials=Aa;g.faceMaterials=Q.materials;g.overdraw=ia;if(ha.geometry.uvs[ca]){g.uvs[0]=ha.geometry.uvs[ca][0];g.uvs[1]=ha.geometry.uvs[ca][1];g.uvs[2]=ha.geometry.uvs[ca][3]}R.push(g);j++;h=k[j]=k[j]||new THREE.RenderableFace3;h.v1.positionWorld.copy(xa.positionWorld);h.v2.positionWorld.copy(ma.positionWorld);h.v3.positionWorld.copy(ta.positionWorld);h.v1.positionScreen.copy(xa.positionScreen);h.v2.positionScreen.copy(ma.positionScreen);h.v3.positionScreen.copy(ta.positionScreen);
 h.normalWorld.copy(g.normalWorld);h.centroidWorld.copy(g.centroidWorld);h.centroidScreen.copy(g.centroidScreen);h.z=h.centroidScreen.z;h.meshMaterials=Aa;h.faceMaterials=Q.materials;h.overdraw=ia;if(ha.geometry.uvs[ca]){h.uvs[0]=ha.geometry.uvs[ca][1];h.uvs[1]=ha.geometry.uvs[ca][2];h.uvs[2]=ha.geometry.uvs[ca][3]}R.push(h);j++}}}}else if(ha instanceof THREE.Line){G.multiply(v,va);ra=ha.geometry.vertices;Q=ra[0];Q.positionScreen.copy(Q.position);G.multiplyVector4(Q.positionScreen);ca=1;for(za=ra.length;ca<
 za;ca++){ea=ra[ca];ea.positionScreen.copy(ea.position);G.multiplyVector4(ea.positionScreen);xa=ra[ca-1];N.copy(ea.positionScreen);L.copy(xa.positionScreen);if(c(N,L)){N.multiplyScalar(1/N.w);L.multiplyScalar(1/L.w);n=x[q]=x[q]||new THREE.RenderableLine;n.v1.positionScreen.copy(N);n.v2.positionScreen.copy(L);n.z=Math.max(N.z,L.z);n.materials=ha.materials;R.push(n);q++}}}else if(ha instanceof THREE.Particle){F.set(ha.position.x,ha.position.y,ha.position.z,1);v.multiplyVector4(F);F.z/=F.w;if(F.z>0&&
-F.z<1){u=y[t]=y[t]||new THREE.RenderableParticle;u.x=F.x/F.w;u.y=F.y/F.w;u.z=F.z;u.rotation=ha.rotation.z;u.scale.x=ha.scale.x*Math.abs(u.x-(F.x+e.projectionMatrix.n11)/(F.w+e.projectionMatrix.n14));u.scale.y=ha.scale.y*Math.abs(u.y-(F.y+e.projectionMatrix.n22)/(F.w+e.projectionMatrix.n24));u.materials=ha.materials;R.push(u);t++}}}}X&&R.sort(a);return R};this.unprojectVector=function(M,e){var X=e.matrixWorld.clone();X.multiplySelf(THREE.Matrix4.makeInvert(e.projectionMatrix));X.multiplyVector3(M);
+F.z<1){u=y[t]=y[t]||new THREE.RenderableParticle;u.x=F.x/F.w;u.y=F.y/F.w;u.z=F.z;u.rotation=ha.rotation.z;u.scale.x=ha.scale.x*Math.abs(u.x-(F.x+e.projectionMatrix.n11)/(F.w+e.projectionMatrix.n14));u.scale.y=ha.scale.y*Math.abs(u.y-(F.y+e.projectionMatrix.n22)/(F.w+e.projectionMatrix.n24));u.materials=ha.materials;R.push(u);t++}}}}W&&R.sort(a);return R};this.unprojectVector=function(M,e){var W=e.matrixWorld.clone();W.multiplySelf(THREE.Matrix4.makeInvert(e.projectionMatrix));W.multiplyVector3(M);
 return M}};
 THREE.DOMRenderer=function(){THREE.Renderer.call(this);var a=null,c=new THREE.Projector,b,d,f,g;this.domElement=document.createElement("div");this.setSize=function(h,j){b=h;d=j;f=b/2;g=d/2};this.render=function(h,j){var k,n,q,x,u,t,y,C;a=c.projectScene(h,j);k=0;for(n=a.length;k<n;k++){u=a[k];if(u instanceof THREE.RenderableParticle){y=u.x*f+f;C=u.y*g+g;q=0;for(x=u.material.length;q<x;q++){t=u.material[q];if(t instanceof THREE.ParticleDOMMaterial){t=t.domElement;t.style.left=y+"px";t.style.top=C+"px"}}}}}};
-THREE.CanvasRenderer=function(){function a(ka){if(u!=ka)n.globalAlpha=u=ka}function c(ka){if(t!=ka){switch(ka){case THREE.NormalBlending:n.globalCompositeOperation="source-over";break;case THREE.AdditiveBlending:n.globalCompositeOperation="lighter";break;case THREE.SubtractiveBlending:n.globalCompositeOperation="darker"}t=ka}}var b=null,d=new THREE.Projector,f=document.createElement("canvas"),g,h,j,k,n=f.getContext("2d"),q=new THREE.Color(0),x=0,u=1,t=0,y=null,C=null,F=1,v,G,w,N,L,Y,M,e,X,R=new THREE.Color,
-da=new THREE.Color,ga=new THREE.Color,I=new THREE.Color,ca=new THREE.Color,za,ea,xa,ja,ha,va,Aa,ia,$,qa=new THREE.Rectangle,ra=new THREE.Rectangle,Q=new THREE.Rectangle,ma=!1,ta=new THREE.Color,l=new THREE.Color,z=new THREE.Color,p=new THREE.Color,m=Math.PI*2,o=new THREE.Vector3,B,A,D,P,U,E,aa=16;B=document.createElement("canvas");B.width=B.height=2;A=B.getContext("2d");A.fillStyle="rgba(0,0,0,1)";A.fillRect(0,0,2,2);D=A.getImageData(0,0,2,2);P=D.data;U=document.createElement("canvas");U.width=U.height=
-aa;E=U.getContext("2d");E.translate(-aa/2,-aa/2);E.scale(aa,aa);aa--;this.domElement=f;this.autoClear=!0;this.sortObjects=!0;this.sortElements=!0;this.setSize=function(ka,na){g=ka;h=na;j=g/2;k=h/2;f.width=g;f.height=h;qa.set(-j,-k,j,k);u=1;t=0;C=y=null;F=1};this.setClearColor=function(ka,na){q=ka;x=na};this.setClearColorHex=function(ka,na){q.setHex(ka);x=na};this.clear=function(){n.setTransform(1,0,0,-1,j,k);if(!ra.isEmpty()){ra.inflate(1);ra.minSelf(qa);if(q.hex==0&&x==0)n.clearRect(ra.getX(),ra.getY(),
-ra.getWidth(),ra.getHeight());else{c(THREE.NormalBlending);a(1);n.fillStyle="rgba("+Math.floor(q.r*255)+","+Math.floor(q.g*255)+","+Math.floor(q.b*255)+","+x+")";n.fillRect(ra.getX(),ra.getY(),ra.getWidth(),ra.getHeight())}ra.empty()}};this.render=function(ka,na){function wa(O){var oa,Z,J,T=O.lights;l.setRGB(0,0,0);z.setRGB(0,0,0);p.setRGB(0,0,0);O=0;for(oa=T.length;O<oa;O++){Z=T[O];J=Z.color;if(Z instanceof THREE.AmbientLight){l.r+=J.r;l.g+=J.g;l.b+=J.b}else if(Z instanceof THREE.DirectionalLight){z.r+=
-J.r;z.g+=J.g;z.b+=J.b}else if(Z instanceof THREE.PointLight){p.r+=J.r;p.g+=J.g;p.b+=J.b}}}function la(O,oa,Z,J){var T,fa,pa,sa,ua=O.lights;O=0;for(T=ua.length;O<T;O++){fa=ua[O];pa=fa.color;sa=fa.intensity;if(fa instanceof THREE.DirectionalLight){fa=Z.dot(fa.position)*sa;if(fa>0){J.r+=pa.r*fa;J.g+=pa.g*fa;J.b+=pa.b*fa}}else if(fa instanceof THREE.PointLight){o.sub(fa.position,oa);o.normalize();fa=Z.dot(o)*sa;if(fa>0){J.r+=pa.r*fa;J.g+=pa.g*fa;J.b+=pa.b*fa}}}}function Ca(O,oa,Z){if(Z.opacity!=0){a(Z.opacity);
-c(Z.blending);var J,T,fa,pa,sa,ua;if(Z instanceof THREE.ParticleBasicMaterial){if(Z.map){pa=Z.map.image;sa=pa.width>>1;ua=pa.height>>1;T=oa.scale.x*j;fa=oa.scale.y*k;Z=T*sa;J=fa*ua;Q.set(O.x-Z,O.y-J,O.x+Z,O.y+J);if(qa.instersects(Q)){n.save();n.translate(O.x,O.y);n.rotate(-oa.rotation);n.scale(T,-fa);n.translate(-sa,-ua);n.drawImage(pa,0,0);n.restore()}}}else if(Z instanceof THREE.ParticleCircleMaterial){if(ma){ta.r=l.r+z.r+p.r;ta.g=l.g+z.g+p.g;ta.b=l.b+z.b+p.b;R.r=Z.color.r*ta.r;R.g=Z.color.g*ta.g;
-R.b=Z.color.b*ta.b;R.updateStyleString()}else R.__styleString=Z.color.__styleString;Z=oa.scale.x*j;J=oa.scale.y*k;Q.set(O.x-Z,O.y-J,O.x+Z,O.y+J);if(qa.instersects(Q)){T=R.__styleString;if(C!=T)n.fillStyle=C=T;n.save();n.translate(O.x,O.y);n.rotate(-oa.rotation);n.scale(Z,J);n.beginPath();n.arc(0,0,1,0,m,!0);n.closePath();n.fill();n.restore()}}}}function Da(O,oa,Z,J){if(J.opacity!=0){a(J.opacity);c(J.blending);n.beginPath();n.moveTo(O.positionScreen.x,O.positionScreen.y);n.lineTo(oa.positionScreen.x,
-oa.positionScreen.y);n.closePath();if(J instanceof THREE.LineBasicMaterial){R.__styleString=J.color.__styleString;O=J.linewidth;if(F!=O)n.lineWidth=F=O;O=R.__styleString;if(y!=O)n.strokeStyle=y=O;n.stroke();Q.inflate(J.linewidth*2)}}}function Pa(O,oa,Z,J,T,fa){if(T.opacity!=0){a(T.opacity);c(T.blending);N=O.positionScreen.x;L=O.positionScreen.y;Y=oa.positionScreen.x;M=oa.positionScreen.y;e=Z.positionScreen.x;X=Z.positionScreen.y;n.beginPath();n.moveTo(N,L);n.lineTo(Y,M);n.lineTo(e,X);n.lineTo(N,L);
-n.closePath();if(T instanceof THREE.MeshBasicMaterial)if(T.map)T.map.mapping instanceof THREE.UVMapping&&Ia(N,L,Y,M,e,X,T.map.image,J.uvs[0].u,J.uvs[0].v,J.uvs[1].u,J.uvs[1].v,J.uvs[2].u,J.uvs[2].v);else if(T.envMap){if(T.envMap.mapping instanceof THREE.SphericalReflectionMapping){O=na.matrixWorldInverse;o.copy(J.vertexNormalsWorld[0]);ja=(o.x*O.n11+o.y*O.n12+o.z*O.n13)*0.5+0.5;ha=-(o.x*O.n21+o.y*O.n22+o.z*O.n23)*0.5+0.5;o.copy(J.vertexNormalsWorld[1]);va=(o.x*O.n11+o.y*O.n12+o.z*O.n13)*0.5+0.5;Aa=
--(o.x*O.n21+o.y*O.n22+o.z*O.n23)*0.5+0.5;o.copy(J.vertexNormalsWorld[2]);ia=(o.x*O.n11+o.y*O.n12+o.z*O.n13)*0.5+0.5;$=-(o.x*O.n21+o.y*O.n22+o.z*O.n23)*0.5+0.5;Ia(N,L,Y,M,e,X,T.envMap.image,ja,ha,va,Aa,ia,$)}}else T.wireframe?K(T.color.__styleString,T.wireframeLinewidth):Na(T.color.__styleString);else if(T instanceof THREE.MeshLambertMaterial){if(T.map&&!T.wireframe){T.map.mapping instanceof THREE.UVMapping&&Ia(N,L,Y,M,e,X,T.map.image,J.uvs[0].u,J.uvs[0].v,J.uvs[1].u,J.uvs[1].v,J.uvs[2].u,J.uvs[2].v);
-c(THREE.SubtractiveBlending)}if(ma)if(!T.wireframe&&T.shading==THREE.SmoothShading&&J.vertexNormalsWorld.length==3){da.r=ga.r=I.r=l.r;da.g=ga.g=I.g=l.g;da.b=ga.b=I.b=l.b;la(fa,J.v1.positionWorld,J.vertexNormalsWorld[0],da);la(fa,J.v2.positionWorld,J.vertexNormalsWorld[1],ga);la(fa,J.v3.positionWorld,J.vertexNormalsWorld[2],I);ca.r=(ga.r+I.r)*0.5;ca.g=(ga.g+I.g)*0.5;ca.b=(ga.b+I.b)*0.5;xa=Oa(da,ga,I,ca);Ia(N,L,Y,M,e,X,xa,0,0,1,0,0,1)}else{ta.r=l.r;ta.g=l.g;ta.b=l.b;la(fa,J.centroidWorld,J.normalWorld,
-ta);R.r=T.color.r*ta.r;R.g=T.color.g*ta.g;R.b=T.color.b*ta.b;R.updateStyleString();T.wireframe?K(R.__styleString,T.wireframeLinewidth):Na(R.__styleString)}else T.wireframe?K(T.color.__styleString,T.wireframeLinewidth):Na(T.color.__styleString)}else if(T instanceof THREE.MeshDepthMaterial){za=na.near;ea=na.far;da.r=da.g=da.b=1-S(O.positionScreen.z,za,ea);ga.r=ga.g=ga.b=1-S(oa.positionScreen.z,za,ea);I.r=I.g=I.b=1-S(Z.positionScreen.z,za,ea);ca.r=(ga.r+I.r)*0.5;ca.g=(ga.g+I.g)*0.5;ca.b=(ga.b+I.b)*0.5;
-xa=Oa(da,ga,I,ca);Ia(N,L,Y,M,e,X,xa,0,0,1,0,0,1)}else if(T instanceof THREE.MeshNormalMaterial){R.r=V(J.normalWorld.x);R.g=V(J.normalWorld.y);R.b=V(J.normalWorld.z);R.updateStyleString();T.wireframe?K(R.__styleString,T.wireframeLinewidth):Na(R.__styleString)}}}function K(O,oa){if(y!=O)n.strokeStyle=y=O;if(F!=oa)n.lineWidth=F=oa;n.stroke();Q.inflate(oa*2)}function Na(O){if(C!=O)n.fillStyle=C=O;n.fill()}function Ia(O,oa,Z,J,T,fa,pa,sa,ua,Ra,La,Ka,Wa){var Ea,Sa;Ea=pa.width-1;Sa=pa.height-1;sa*=Ea;ua*=
-Sa;Ra*=Ea;La*=Sa;Ka*=Ea;Wa*=Sa;Z-=O;J-=oa;T-=O;fa-=oa;Ra-=sa;La-=ua;Ka-=sa;Wa-=ua;Ea=Ra*Wa-Ka*La;if(Ea!=0){Sa=1/Ea;Ea=(Wa*Z-La*T)*Sa;La=(Wa*J-La*fa)*Sa;Z=(Ra*T-Ka*Z)*Sa;J=(Ra*fa-Ka*J)*Sa;O=O-Ea*sa-Z*ua;oa=oa-La*sa-J*ua;n.save();n.transform(Ea,La,Z,J,O,oa);n.clip();n.drawImage(pa,0,0);n.restore()}}function Oa(O,oa,Z,J){var T=~~(O.r*255),fa=~~(O.g*255);O=~~(O.b*255);var pa=~~(oa.r*255),sa=~~(oa.g*255);oa=~~(oa.b*255);var ua=~~(Z.r*255),Ra=~~(Z.g*255);Z=~~(Z.b*255);var La=~~(J.r*255),Ka=~~(J.g*255);
-J=~~(J.b*255);P[0]=T<0?0:T>255?255:T;P[1]=fa<0?0:fa>255?255:fa;P[2]=O<0?0:O>255?255:O;P[4]=pa<0?0:pa>255?255:pa;P[5]=sa<0?0:sa>255?255:sa;P[6]=oa<0?0:oa>255?255:oa;P[8]=ua<0?0:ua>255?255:ua;P[9]=Ra<0?0:Ra>255?255:Ra;P[10]=Z<0?0:Z>255?255:Z;P[12]=La<0?0:La>255?255:La;P[13]=Ka<0?0:Ka>255?255:Ka;P[14]=J<0?0:J>255?255:J;A.putImageData(D,0,0);E.drawImage(B,0,0);return U}function S(O,oa,Z){O=(O-oa)/(Z-oa);return O*O*(3-2*O)}function V(O){O=(O+1)*0.5;return O<0?0:O>1?1:O}function W(O,oa){var Z=oa.x-O.x,
-J=oa.y-O.y,T=1/Math.sqrt(Z*Z+J*J);Z*=T;J*=T;oa.x+=Z;oa.y+=J;O.x-=Z;O.y-=J}var ya,Ma,Fa,Ba,Ga,H,Ja,Ha;this.autoClear?this.clear():n.setTransform(1,0,0,-1,j,k);b=d.projectScene(ka,na,this.sortElements);(ma=ka.lights.length>0)&&wa(ka);ya=0;for(Ma=b.length;ya<Ma;ya++){Fa=b[ya];Q.empty();if(Fa instanceof THREE.RenderableParticle){v=Fa;v.x*=j;v.y*=k;Ba=0;for(Ga=Fa.materials.length;Ba<Ga;Ba++)Ca(v,Fa,Fa.materials[Ba],ka)}else if(Fa instanceof THREE.RenderableLine){v=Fa.v1;G=Fa.v2;v.positionScreen.x*=j;v.positionScreen.y*=
-k;G.positionScreen.x*=j;G.positionScreen.y*=k;Q.addPoint(v.positionScreen.x,v.positionScreen.y);Q.addPoint(G.positionScreen.x,G.positionScreen.y);if(qa.instersects(Q)){Ba=0;for(Ga=Fa.materials.length;Ba<Ga;)Da(v,G,Fa,Fa.materials[Ba++],ka)}}else if(Fa instanceof THREE.RenderableFace3){v=Fa.v1;G=Fa.v2;w=Fa.v3;v.positionScreen.x*=j;v.positionScreen.y*=k;G.positionScreen.x*=j;G.positionScreen.y*=k;w.positionScreen.x*=j;w.positionScreen.y*=k;if(Fa.overdraw){W(v.positionScreen,G.positionScreen);W(G.positionScreen,
-w.positionScreen);W(w.positionScreen,v.positionScreen)}Q.add3Points(v.positionScreen.x,v.positionScreen.y,G.positionScreen.x,G.positionScreen.y,w.positionScreen.x,w.positionScreen.y);if(qa.instersects(Q)){Ba=0;for(Ga=Fa.meshMaterials.length;Ba<Ga;){Ha=Fa.meshMaterials[Ba++];if(Ha instanceof THREE.MeshFaceMaterial){H=0;for(Ja=Fa.faceMaterials.length;H<Ja;)(Ha=Fa.faceMaterials[H++])&&Pa(v,G,w,Fa,Ha,ka)}else Pa(v,G,w,Fa,Ha,ka)}}}ra.addRectangle(Q)}n.setTransform(1,0,0,1,0,0)}};
-THREE.SVGRenderer=function(){function a(ja,ha,va){var Aa,ia,$,qa;Aa=0;for(ia=ja.lights.length;Aa<ia;Aa++){$=ja.lights[Aa];if($ instanceof THREE.DirectionalLight){qa=ha.normalWorld.dot($.position)*$.intensity;if(qa>0){va.r+=$.color.r*qa;va.g+=$.color.g*qa;va.b+=$.color.b*qa}}else if($ instanceof THREE.PointLight){X.sub($.position,ha.centroidWorld);X.normalize();qa=ha.normalWorld.dot(X)*$.intensity;if(qa>0){va.r+=$.color.r*qa;va.g+=$.color.g*qa;va.b+=$.color.b*qa}}}}function c(ja,ha,va,Aa,ia,$){I=d(ca++);
+THREE.CanvasRenderer=function(){function a(ka){if(u!=ka)n.globalAlpha=u=ka}function c(ka){if(t!=ka){switch(ka){case THREE.NormalBlending:n.globalCompositeOperation="source-over";break;case THREE.AdditiveBlending:n.globalCompositeOperation="lighter";break;case THREE.SubtractiveBlending:n.globalCompositeOperation="darker"}t=ka}}var b=null,d=new THREE.Projector,f=document.createElement("canvas"),g,h,j,k,n=f.getContext("2d"),q=new THREE.Color(0),x=0,u=1,t=0,y=null,C=null,F=1,v,G,w,N,L,Y,M,e,W,R=new THREE.Color,
+da=new THREE.Color,ga=new THREE.Color,I=new THREE.Color,ca=new THREE.Color,za,ea,xa,ja,ha,va,Aa,ia,$,qa=new THREE.Rectangle,ra=new THREE.Rectangle,Q=new THREE.Rectangle,ma=!1,ta=new THREE.Color,l=new THREE.Color,z=new THREE.Color,p=new THREE.Color,m=Math.PI*2,o=new THREE.Vector3,B,A,D,O,X,E,aa=16;B=document.createElement("canvas");B.width=B.height=2;A=B.getContext("2d");A.fillStyle="rgba(0,0,0,1)";A.fillRect(0,0,2,2);D=A.getImageData(0,0,2,2);O=D.data;X=document.createElement("canvas");X.width=X.height=
+aa;E=X.getContext("2d");E.translate(-aa/2,-aa/2);E.scale(aa,aa);aa--;this.domElement=f;this.autoClear=!0;this.sortObjects=!0;this.sortElements=!0;this.setSize=function(ka,na){g=ka;h=na;j=g/2;k=h/2;f.width=g;f.height=h;qa.set(-j,-k,j,k);u=1;t=0;C=y=null;F=1};this.setClearColor=function(ka,na){q=ka;x=na};this.setClearColorHex=function(ka,na){q.setHex(ka);x=na};this.clear=function(){n.setTransform(1,0,0,-1,j,k);if(!ra.isEmpty()){ra.inflate(1);ra.minSelf(qa);if(q.hex==0&&x==0)n.clearRect(ra.getX(),ra.getY(),
+ra.getWidth(),ra.getHeight());else{c(THREE.NormalBlending);a(1);n.fillStyle="rgba("+Math.floor(q.r*255)+","+Math.floor(q.g*255)+","+Math.floor(q.b*255)+","+x+")";n.fillRect(ra.getX(),ra.getY(),ra.getWidth(),ra.getHeight())}ra.empty()}};this.render=function(ka,na){function wa(P){var oa,Z,J,T=P.lights;l.setRGB(0,0,0);z.setRGB(0,0,0);p.setRGB(0,0,0);P=0;for(oa=T.length;P<oa;P++){Z=T[P];J=Z.color;if(Z instanceof THREE.AmbientLight){l.r+=J.r;l.g+=J.g;l.b+=J.b}else if(Z instanceof THREE.DirectionalLight){z.r+=
+J.r;z.g+=J.g;z.b+=J.b}else if(Z instanceof THREE.PointLight){p.r+=J.r;p.g+=J.g;p.b+=J.b}}}function la(P,oa,Z,J){var T,fa,pa,sa,ua=P.lights;P=0;for(T=ua.length;P<T;P++){fa=ua[P];pa=fa.color;sa=fa.intensity;if(fa instanceof THREE.DirectionalLight){fa=Z.dot(fa.position)*sa;if(fa>0){J.r+=pa.r*fa;J.g+=pa.g*fa;J.b+=pa.b*fa}}else if(fa instanceof THREE.PointLight){o.sub(fa.position,oa);o.normalize();fa=Z.dot(o)*sa;if(fa>0){J.r+=pa.r*fa;J.g+=pa.g*fa;J.b+=pa.b*fa}}}}function Ca(P,oa,Z){if(Z.opacity!=0){a(Z.opacity);
+c(Z.blending);var J,T,fa,pa,sa,ua;if(Z instanceof THREE.ParticleBasicMaterial){if(Z.map){pa=Z.map.image;sa=pa.width>>1;ua=pa.height>>1;T=oa.scale.x*j;fa=oa.scale.y*k;Z=T*sa;J=fa*ua;Q.set(P.x-Z,P.y-J,P.x+Z,P.y+J);if(qa.instersects(Q)){n.save();n.translate(P.x,P.y);n.rotate(-oa.rotation);n.scale(T,-fa);n.translate(-sa,-ua);n.drawImage(pa,0,0);n.restore()}}}else if(Z instanceof THREE.ParticleCircleMaterial){if(ma){ta.r=l.r+z.r+p.r;ta.g=l.g+z.g+p.g;ta.b=l.b+z.b+p.b;R.r=Z.color.r*ta.r;R.g=Z.color.g*ta.g;
+R.b=Z.color.b*ta.b;R.updateStyleString()}else R.__styleString=Z.color.__styleString;Z=oa.scale.x*j;J=oa.scale.y*k;Q.set(P.x-Z,P.y-J,P.x+Z,P.y+J);if(qa.instersects(Q)){T=R.__styleString;if(C!=T)n.fillStyle=C=T;n.save();n.translate(P.x,P.y);n.rotate(-oa.rotation);n.scale(Z,J);n.beginPath();n.arc(0,0,1,0,m,!0);n.closePath();n.fill();n.restore()}}}}function Da(P,oa,Z,J){if(J.opacity!=0){a(J.opacity);c(J.blending);n.beginPath();n.moveTo(P.positionScreen.x,P.positionScreen.y);n.lineTo(oa.positionScreen.x,
+oa.positionScreen.y);n.closePath();if(J instanceof THREE.LineBasicMaterial){R.__styleString=J.color.__styleString;P=J.linewidth;if(F!=P)n.lineWidth=F=P;P=R.__styleString;if(y!=P)n.strokeStyle=y=P;n.stroke();Q.inflate(J.linewidth*2)}}}function Pa(P,oa,Z,J,T,fa){if(T.opacity!=0){a(T.opacity);c(T.blending);N=P.positionScreen.x;L=P.positionScreen.y;Y=oa.positionScreen.x;M=oa.positionScreen.y;e=Z.positionScreen.x;W=Z.positionScreen.y;n.beginPath();n.moveTo(N,L);n.lineTo(Y,M);n.lineTo(e,W);n.lineTo(N,L);
+n.closePath();if(T instanceof THREE.MeshBasicMaterial)if(T.map)T.map.mapping instanceof THREE.UVMapping&&Ia(N,L,Y,M,e,W,T.map.image,J.uvs[0].u,J.uvs[0].v,J.uvs[1].u,J.uvs[1].v,J.uvs[2].u,J.uvs[2].v);else if(T.envMap){if(T.envMap.mapping instanceof THREE.SphericalReflectionMapping){P=na.matrixWorldInverse;o.copy(J.vertexNormalsWorld[0]);ja=(o.x*P.n11+o.y*P.n12+o.z*P.n13)*0.5+0.5;ha=-(o.x*P.n21+o.y*P.n22+o.z*P.n23)*0.5+0.5;o.copy(J.vertexNormalsWorld[1]);va=(o.x*P.n11+o.y*P.n12+o.z*P.n13)*0.5+0.5;Aa=
+-(o.x*P.n21+o.y*P.n22+o.z*P.n23)*0.5+0.5;o.copy(J.vertexNormalsWorld[2]);ia=(o.x*P.n11+o.y*P.n12+o.z*P.n13)*0.5+0.5;$=-(o.x*P.n21+o.y*P.n22+o.z*P.n23)*0.5+0.5;Ia(N,L,Y,M,e,W,T.envMap.image,ja,ha,va,Aa,ia,$)}}else T.wireframe?K(T.color.__styleString,T.wireframeLinewidth):Na(T.color.__styleString);else if(T instanceof THREE.MeshLambertMaterial){if(T.map&&!T.wireframe){T.map.mapping instanceof THREE.UVMapping&&Ia(N,L,Y,M,e,W,T.map.image,J.uvs[0].u,J.uvs[0].v,J.uvs[1].u,J.uvs[1].v,J.uvs[2].u,J.uvs[2].v);
+c(THREE.SubtractiveBlending)}if(ma)if(!T.wireframe&&T.shading==THREE.SmoothShading&&J.vertexNormalsWorld.length==3){da.r=ga.r=I.r=l.r;da.g=ga.g=I.g=l.g;da.b=ga.b=I.b=l.b;la(fa,J.v1.positionWorld,J.vertexNormalsWorld[0],da);la(fa,J.v2.positionWorld,J.vertexNormalsWorld[1],ga);la(fa,J.v3.positionWorld,J.vertexNormalsWorld[2],I);ca.r=(ga.r+I.r)*0.5;ca.g=(ga.g+I.g)*0.5;ca.b=(ga.b+I.b)*0.5;xa=Oa(da,ga,I,ca);Ia(N,L,Y,M,e,W,xa,0,0,1,0,0,1)}else{ta.r=l.r;ta.g=l.g;ta.b=l.b;la(fa,J.centroidWorld,J.normalWorld,
+ta);R.r=T.color.r*ta.r;R.g=T.color.g*ta.g;R.b=T.color.b*ta.b;R.updateStyleString();T.wireframe?K(R.__styleString,T.wireframeLinewidth):Na(R.__styleString)}else T.wireframe?K(T.color.__styleString,T.wireframeLinewidth):Na(T.color.__styleString)}else if(T instanceof THREE.MeshDepthMaterial){za=na.near;ea=na.far;da.r=da.g=da.b=1-S(P.positionScreen.z,za,ea);ga.r=ga.g=ga.b=1-S(oa.positionScreen.z,za,ea);I.r=I.g=I.b=1-S(Z.positionScreen.z,za,ea);ca.r=(ga.r+I.r)*0.5;ca.g=(ga.g+I.g)*0.5;ca.b=(ga.b+I.b)*0.5;
+xa=Oa(da,ga,I,ca);Ia(N,L,Y,M,e,W,xa,0,0,1,0,0,1)}else if(T instanceof THREE.MeshNormalMaterial){R.r=U(J.normalWorld.x);R.g=U(J.normalWorld.y);R.b=U(J.normalWorld.z);R.updateStyleString();T.wireframe?K(R.__styleString,T.wireframeLinewidth):Na(R.__styleString)}}}function K(P,oa){if(y!=P)n.strokeStyle=y=P;if(F!=oa)n.lineWidth=F=oa;n.stroke();Q.inflate(oa*2)}function Na(P){if(C!=P)n.fillStyle=C=P;n.fill()}function Ia(P,oa,Z,J,T,fa,pa,sa,ua,Ra,La,Ka,Wa){var Ea,Sa;Ea=pa.width-1;Sa=pa.height-1;sa*=Ea;ua*=
+Sa;Ra*=Ea;La*=Sa;Ka*=Ea;Wa*=Sa;Z-=P;J-=oa;T-=P;fa-=oa;Ra-=sa;La-=ua;Ka-=sa;Wa-=ua;Ea=Ra*Wa-Ka*La;if(Ea!=0){Sa=1/Ea;Ea=(Wa*Z-La*T)*Sa;La=(Wa*J-La*fa)*Sa;Z=(Ra*T-Ka*Z)*Sa;J=(Ra*fa-Ka*J)*Sa;P=P-Ea*sa-Z*ua;oa=oa-La*sa-J*ua;n.save();n.transform(Ea,La,Z,J,P,oa);n.clip();n.drawImage(pa,0,0);n.restore()}}function Oa(P,oa,Z,J){var T=~~(P.r*255),fa=~~(P.g*255);P=~~(P.b*255);var pa=~~(oa.r*255),sa=~~(oa.g*255);oa=~~(oa.b*255);var ua=~~(Z.r*255),Ra=~~(Z.g*255);Z=~~(Z.b*255);var La=~~(J.r*255),Ka=~~(J.g*255);
+J=~~(J.b*255);O[0]=T<0?0:T>255?255:T;O[1]=fa<0?0:fa>255?255:fa;O[2]=P<0?0:P>255?255:P;O[4]=pa<0?0:pa>255?255:pa;O[5]=sa<0?0:sa>255?255:sa;O[6]=oa<0?0:oa>255?255:oa;O[8]=ua<0?0:ua>255?255:ua;O[9]=Ra<0?0:Ra>255?255:Ra;O[10]=Z<0?0:Z>255?255:Z;O[12]=La<0?0:La>255?255:La;O[13]=Ka<0?0:Ka>255?255:Ka;O[14]=J<0?0:J>255?255:J;A.putImageData(D,0,0);E.drawImage(B,0,0);return X}function S(P,oa,Z){P=(P-oa)/(Z-oa);return P*P*(3-2*P)}function U(P){P=(P+1)*0.5;return P<0?0:P>1?1:P}function V(P,oa){var Z=oa.x-P.x,
+J=oa.y-P.y,T=1/Math.sqrt(Z*Z+J*J);Z*=T;J*=T;oa.x+=Z;oa.y+=J;P.x-=Z;P.y-=J}var ya,Ma,Fa,Ba,Ga,H,Ja,Ha;this.autoClear?this.clear():n.setTransform(1,0,0,-1,j,k);b=d.projectScene(ka,na,this.sortElements);(ma=ka.lights.length>0)&&wa(ka);ya=0;for(Ma=b.length;ya<Ma;ya++){Fa=b[ya];Q.empty();if(Fa instanceof THREE.RenderableParticle){v=Fa;v.x*=j;v.y*=k;Ba=0;for(Ga=Fa.materials.length;Ba<Ga;Ba++)Ca(v,Fa,Fa.materials[Ba],ka)}else if(Fa instanceof THREE.RenderableLine){v=Fa.v1;G=Fa.v2;v.positionScreen.x*=j;v.positionScreen.y*=
+k;G.positionScreen.x*=j;G.positionScreen.y*=k;Q.addPoint(v.positionScreen.x,v.positionScreen.y);Q.addPoint(G.positionScreen.x,G.positionScreen.y);if(qa.instersects(Q)){Ba=0;for(Ga=Fa.materials.length;Ba<Ga;)Da(v,G,Fa,Fa.materials[Ba++],ka)}}else if(Fa instanceof THREE.RenderableFace3){v=Fa.v1;G=Fa.v2;w=Fa.v3;v.positionScreen.x*=j;v.positionScreen.y*=k;G.positionScreen.x*=j;G.positionScreen.y*=k;w.positionScreen.x*=j;w.positionScreen.y*=k;if(Fa.overdraw){V(v.positionScreen,G.positionScreen);V(G.positionScreen,
+w.positionScreen);V(w.positionScreen,v.positionScreen)}Q.add3Points(v.positionScreen.x,v.positionScreen.y,G.positionScreen.x,G.positionScreen.y,w.positionScreen.x,w.positionScreen.y);if(qa.instersects(Q)){Ba=0;for(Ga=Fa.meshMaterials.length;Ba<Ga;){Ha=Fa.meshMaterials[Ba++];if(Ha instanceof THREE.MeshFaceMaterial){H=0;for(Ja=Fa.faceMaterials.length;H<Ja;)(Ha=Fa.faceMaterials[H++])&&Pa(v,G,w,Fa,Ha,ka)}else Pa(v,G,w,Fa,Ha,ka)}}}ra.addRectangle(Q)}n.setTransform(1,0,0,1,0,0)}};
+THREE.SVGRenderer=function(){function a(ja,ha,va){var Aa,ia,$,qa;Aa=0;for(ia=ja.lights.length;Aa<ia;Aa++){$=ja.lights[Aa];if($ instanceof THREE.DirectionalLight){qa=ha.normalWorld.dot($.position)*$.intensity;if(qa>0){va.r+=$.color.r*qa;va.g+=$.color.g*qa;va.b+=$.color.b*qa}}else if($ instanceof THREE.PointLight){W.sub($.position,ha.centroidWorld);W.normalize();qa=ha.normalWorld.dot(W)*$.intensity;if(qa>0){va.r+=$.color.r*qa;va.g+=$.color.g*qa;va.b+=$.color.b*qa}}}}function c(ja,ha,va,Aa,ia,$){I=d(ca++);
 I.setAttribute("d","M "+ja.positionScreen.x+" "+ja.positionScreen.y+" L "+ha.positionScreen.x+" "+ha.positionScreen.y+" L "+va.positionScreen.x+","+va.positionScreen.y+"z");if(ia instanceof THREE.MeshBasicMaterial)w.__styleString=ia.color.__styleString;else if(ia instanceof THREE.MeshLambertMaterial)if(G){N.r=L.r;N.g=L.g;N.b=L.b;a($,Aa,N);w.r=ia.color.r*N.r;w.g=ia.color.g*N.g;w.b=ia.color.b*N.b;w.updateStyleString()}else w.__styleString=ia.color.__styleString;else if(ia instanceof THREE.MeshDepthMaterial){e=
 1-ia.__2near/(ia.__farPlusNear-Aa.z*ia.__farMinusNear);w.setRGB(e,e,e)}else ia instanceof THREE.MeshNormalMaterial&&w.setRGB(f(Aa.normalWorld.x),f(Aa.normalWorld.y),f(Aa.normalWorld.z));ia.wireframe?I.setAttribute("style","fill: none; stroke: "+w.__styleString+"; stroke-width: "+ia.wireframeLinewidth+"; stroke-opacity: "+ia.opacity+"; stroke-linecap: "+ia.wireframeLinecap+"; stroke-linejoin: "+ia.wireframeLinejoin):I.setAttribute("style","fill: "+w.__styleString+"; fill-opacity: "+ia.opacity);j.appendChild(I)}
 function b(ja,ha,va,Aa,ia,$,qa){I=d(ca++);I.setAttribute("d","M "+ja.positionScreen.x+" "+ja.positionScreen.y+" L "+ha.positionScreen.x+" "+ha.positionScreen.y+" L "+va.positionScreen.x+","+va.positionScreen.y+" L "+Aa.positionScreen.x+","+Aa.positionScreen.y+"z");if($ instanceof THREE.MeshBasicMaterial)w.__styleString=$.color.__styleString;else if($ instanceof THREE.MeshLambertMaterial)if(G){N.r=L.r;N.g=L.g;N.b=L.b;a(qa,ia,N);w.r=$.color.r*N.r;w.g=$.color.g*N.g;w.b=$.color.b*N.b;w.updateStyleString()}else w.__styleString=
 $.color.__styleString;else if($ instanceof THREE.MeshDepthMaterial){e=1-$.__2near/($.__farPlusNear-ia.z*$.__farMinusNear);w.setRGB(e,e,e)}else $ instanceof THREE.MeshNormalMaterial&&w.setRGB(f(ia.normalWorld.x),f(ia.normalWorld.y),f(ia.normalWorld.z));$.wireframe?I.setAttribute("style","fill: none; stroke: "+w.__styleString+"; stroke-width: "+$.wireframeLinewidth+"; stroke-opacity: "+$.opacity+"; stroke-linecap: "+$.wireframeLinecap+"; stroke-linejoin: "+$.wireframeLinejoin):I.setAttribute("style",
 "fill: "+w.__styleString+"; fill-opacity: "+$.opacity);j.appendChild(I)}function d(ja){if(R[ja]==null){R[ja]=document.createElementNS("http://www.w3.org/2000/svg","path");xa==0&&R[ja].setAttribute("shape-rendering","crispEdges")}return R[ja]}function f(ja){return ja<0?Math.min((1+ja)*0.5,0.5):0.5+Math.min(ja*0.5,0.5)}var g=null,h=new THREE.Projector,j=document.createElementNS("http://www.w3.org/2000/svg","svg"),k,n,q,x,u,t,y,C,F=new THREE.Rectangle,v=new THREE.Rectangle,G=!1,w=new THREE.Color(16777215),
-N=new THREE.Color(16777215),L=new THREE.Color(0),Y=new THREE.Color(0),M=new THREE.Color(0),e,X=new THREE.Vector3,R=[],da=[],ga=[],I,ca,za,ea,xa=1;this.domElement=j;this.autoClear=!0;this.sortObjects=!0;this.sortElements=!0;this.setQuality=function(ja){switch(ja){case "high":xa=1;break;case "low":xa=0}};this.setSize=function(ja,ha){k=ja;n=ha;q=k/2;x=n/2;j.setAttribute("viewBox",-q+" "+-x+" "+k+" "+n);j.setAttribute("width",k);j.setAttribute("height",n);F.set(-q,-x,q,x)};this.clear=function(){for(;j.childNodes.length>
+N=new THREE.Color(16777215),L=new THREE.Color(0),Y=new THREE.Color(0),M=new THREE.Color(0),e,W=new THREE.Vector3,R=[],da=[],ga=[],I,ca,za,ea,xa=1;this.domElement=j;this.autoClear=!0;this.sortObjects=!0;this.sortElements=!0;this.setQuality=function(ja){switch(ja){case "high":xa=1;break;case "low":xa=0}};this.setSize=function(ja,ha){k=ja;n=ha;q=k/2;x=n/2;j.setAttribute("viewBox",-q+" "+-x+" "+k+" "+n);j.setAttribute("width",k);j.setAttribute("height",n);F.set(-q,-x,q,x)};this.clear=function(){for(;j.childNodes.length>
 0;)j.removeChild(j.childNodes[0])};this.render=function(ja,ha){var va,Aa,ia,$,qa,ra,Q,ma;this.autoClear&&this.clear();g=h.projectScene(ja,ha,this.sortElements);ea=za=ca=0;if(G=ja.lights.length>0){Q=ja.lights;L.setRGB(0,0,0);Y.setRGB(0,0,0);M.setRGB(0,0,0);va=0;for(Aa=Q.length;va<Aa;va++){ia=Q[va];$=ia.color;if(ia instanceof THREE.AmbientLight){L.r+=$.r;L.g+=$.g;L.b+=$.b}else if(ia instanceof THREE.DirectionalLight){Y.r+=$.r;Y.g+=$.g;Y.b+=$.b}else if(ia instanceof THREE.PointLight){M.r+=$.r;M.g+=$.g;
 M.b+=$.b}}}va=0;for(Aa=g.length;va<Aa;va++){Q=g[va];v.empty();if(Q instanceof THREE.RenderableParticle){u=Q;u.x*=q;u.y*=-x;ia=0;for($=Q.materials.length;ia<$;ia++)if(ma=Q.materials[ia]){qa=u;ra=Q;var ta=za++;if(da[ta]==null){da[ta]=document.createElementNS("http://www.w3.org/2000/svg","circle");xa==0&&da[ta].setAttribute("shape-rendering","crispEdges")}I=da[ta];I.setAttribute("cx",qa.x);I.setAttribute("cy",qa.y);I.setAttribute("r",ra.scale.x*q);if(ma instanceof THREE.ParticleCircleMaterial){if(G){N.r=
 L.r+Y.r+M.r;N.g=L.g+Y.g+M.g;N.b=L.b+Y.b+M.b;w.r=ma.color.r*N.r;w.g=ma.color.g*N.g;w.b=ma.color.b*N.b;w.updateStyleString()}else w=ma.color;I.setAttribute("style","fill: "+w.__styleString)}j.appendChild(I)}}else if(Q instanceof THREE.RenderableLine){u=Q.v1;t=Q.v2;u.positionScreen.x*=q;u.positionScreen.y*=-x;t.positionScreen.x*=q;t.positionScreen.y*=-x;v.addPoint(u.positionScreen.x,u.positionScreen.y);v.addPoint(t.positionScreen.x,t.positionScreen.y);if(F.instersects(v)){ia=0;for($=Q.materials.length;ia<
@@ -213,42 +213,42 @@ THREE.ShaderChunk.lightmap_pars_fragment,THREE.ShaderChunk.envmap_pars_fragment,
 THREE.ShaderChunk.map_pars_vertex,THREE.ShaderChunk.lightmap_pars_vertex,THREE.ShaderChunk.envmap_pars_vertex,THREE.ShaderChunk.lights_pars_vertex,THREE.ShaderChunk.color_pars_vertex,THREE.ShaderChunk.skinning_pars_vertex,"void main() {\nvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );",THREE.ShaderChunk.map_vertex,THREE.ShaderChunk.lightmap_vertex,THREE.ShaderChunk.envmap_vertex,THREE.ShaderChunk.color_vertex,"#ifndef USE_ENVMAP\nvec4 mPosition = objectMatrix * vec4( position, 1.0 );\n#endif\nvViewPosition = cameraPosition - mPosition.xyz;\nvec3 transformedNormal = normalize( normalMatrix * normal );\nvNormal = transformedNormal;",
 THREE.ShaderChunk.lights_vertex,THREE.ShaderChunk.skinning_vertex,"}"].join("\n")},particle_basic:{uniforms:THREE.UniformsLib.particle,fragmentShader:["uniform vec3 psColor;\nuniform float opacity;",THREE.ShaderChunk.color_pars_fragment,THREE.ShaderChunk.map_particle_pars_fragment,THREE.ShaderChunk.fog_pars_fragment,"void main() {\ngl_FragColor = vec4( psColor, opacity );",THREE.ShaderChunk.map_particle_fragment,THREE.ShaderChunk.color_fragment,THREE.ShaderChunk.fog_fragment,"}"].join("\n"),vertexShader:["uniform float size;\nuniform float scale;",
 THREE.ShaderChunk.color_pars_vertex,"void main() {",THREE.ShaderChunk.color_vertex,"vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\n#ifdef USE_SIZEATTENUATION\ngl_PointSize = size * ( scale / length( mvPosition.xyz ) );\n#else\ngl_PointSize = size;\n#endif\ngl_Position = projectionMatrix * mvPosition;\n}"].join("\n")}};
-THREE.WebGLRenderer=function(a){function c(l,z,p){var m,o,B,A=l.vertices,D=A.length,P=l.colors,U=P.length,E=l.__vertexArray,aa=l.__colorArray,ka=l.__sortArray,na=l.__dirtyVertices,wa=l.__dirtyColors;if(p.sortParticles){Aa.multiplySelf(p.matrixWorld);for(m=0;m<D;m++){o=A[m].position;qa.copy(o);Aa.multiplyVector3(qa);ka[m]=[qa.z,m]}ka.sort(function(la,Ca){return Ca[0]-la[0]});for(m=0;m<D;m++){o=A[ka[m][1]].position;B=m*3;E[B]=o.x;E[B+1]=o.y;E[B+2]=o.z}for(m=0;m<U;m++){B=m*3;color=P[ka[m][1]];aa[B]=
-color.r;aa[B+1]=color.g;aa[B+2]=color.b}}else{if(na)for(m=0;m<D;m++){o=A[m].position;B=m*3;E[B]=o.x;E[B+1]=o.y;E[B+2]=o.z}if(wa)for(m=0;m<U;m++){color=P[m];B=m*3;aa[B]=color.r;aa[B+1]=color.g;aa[B+2]=color.b}}if(na||p.sortParticles){e.bindBuffer(e.ARRAY_BUFFER,l.__webGLVertexBuffer);e.bufferData(e.ARRAY_BUFFER,E,z)}if(wa||p.sortParticles){e.bindBuffer(e.ARRAY_BUFFER,l.__webGLColorBuffer);e.bufferData(e.ARRAY_BUFFER,aa,z)}}function b(l,z){l.fragmentShader=z.fragmentShader;l.vertexShader=z.vertexShader;
-l.uniforms=Uniforms.clone(z.uniforms)}function d(l,z,p,m,o){m.program||da.initMaterial(m,z,p,o);var B=m.program,A=B.uniforms,D=m.uniforms;if(B!=X){e.useProgram(B);X=B}e.uniformMatrix4fv(A.projectionMatrix,!1,ia);if(p&&(m instanceof THREE.MeshBasicMaterial||m instanceof THREE.MeshLambertMaterial||m instanceof THREE.MeshPhongMaterial||m instanceof THREE.LineBasicMaterial||m instanceof THREE.ParticleBasicMaterial)){D.fogColor.value.setHex(p.color.hex);if(p instanceof THREE.Fog){D.fogNear.value=p.near;
-D.fogFar.value=p.far}else if(p instanceof THREE.FogExp2)D.fogDensity.value=p.density}if(m instanceof THREE.MeshPhongMaterial||m instanceof THREE.MeshLambertMaterial){var P,U,E=0,aa=0,ka=0,na,wa,la,Ca=ra,Da=Ca.directional.colors,Pa=Ca.directional.positions,K=Ca.point.colors,Na=Ca.point.positions,Ia=0,Oa=0;p=U=U=0;for(P=z.length;p<P;p++){U=z[p];na=U.color;wa=U.position;la=U.intensity;if(U instanceof THREE.AmbientLight){E+=na.r;aa+=na.g;ka+=na.b}else if(U instanceof THREE.DirectionalLight){U=Ia*3;Da[U]=
-na.r*la;Da[U+1]=na.g*la;Da[U+2]=na.b*la;Pa[U]=wa.x;Pa[U+1]=wa.y;Pa[U+2]=wa.z;Ia+=1}else if(U instanceof THREE.PointLight){U=Oa*3;K[U]=na.r*la;K[U+1]=na.g*la;K[U+2]=na.b*la;Na[U]=wa.x;Na[U+1]=wa.y;Na[U+2]=wa.z;Oa+=1}}for(p=Ia*3;p<Da.length;p++)Da[p]=0;for(p=Oa*3;p<K.length;p++)K[p]=0;Ca.point.length=Oa;Ca.directional.length=Ia;Ca.ambient[0]=E;Ca.ambient[1]=aa;Ca.ambient[2]=ka;z=ra;D.enableLighting.value=z.directional.length+z.point.length;D.ambientLightColor.value=z.ambient;D.directionalLightColor.value=
+THREE.WebGLRenderer=function(a){function c(l,z,p){var m,o,B,A=l.vertices,D=A.length,O=l.colors,X=O.length,E=l.__vertexArray,aa=l.__colorArray,ka=l.__sortArray,na=l.__dirtyVertices,wa=l.__dirtyColors;if(p.sortParticles){Aa.multiplySelf(p.matrixWorld);for(m=0;m<D;m++){o=A[m].position;qa.copy(o);Aa.multiplyVector3(qa);ka[m]=[qa.z,m]}ka.sort(function(la,Ca){return Ca[0]-la[0]});for(m=0;m<D;m++){o=A[ka[m][1]].position;B=m*3;E[B]=o.x;E[B+1]=o.y;E[B+2]=o.z}for(m=0;m<X;m++){B=m*3;color=O[ka[m][1]];aa[B]=
+color.r;aa[B+1]=color.g;aa[B+2]=color.b}}else{if(na)for(m=0;m<D;m++){o=A[m].position;B=m*3;E[B]=o.x;E[B+1]=o.y;E[B+2]=o.z}if(wa)for(m=0;m<X;m++){color=O[m];B=m*3;aa[B]=color.r;aa[B+1]=color.g;aa[B+2]=color.b}}if(na||p.sortParticles){e.bindBuffer(e.ARRAY_BUFFER,l.__webGLVertexBuffer);e.bufferData(e.ARRAY_BUFFER,E,z)}if(wa||p.sortParticles){e.bindBuffer(e.ARRAY_BUFFER,l.__webGLColorBuffer);e.bufferData(e.ARRAY_BUFFER,aa,z)}}function b(l,z){l.fragmentShader=z.fragmentShader;l.vertexShader=z.vertexShader;
+l.uniforms=Uniforms.clone(z.uniforms)}function d(l,z,p,m,o){m.program||da.initMaterial(m,z,p,o);var B=m.program,A=B.uniforms,D=m.uniforms;if(B!=W){e.useProgram(B);W=B}e.uniformMatrix4fv(A.projectionMatrix,!1,ia);if(p&&(m instanceof THREE.MeshBasicMaterial||m instanceof THREE.MeshLambertMaterial||m instanceof THREE.MeshPhongMaterial||m instanceof THREE.LineBasicMaterial||m instanceof THREE.ParticleBasicMaterial)){D.fogColor.value.setHex(p.color.hex);if(p instanceof THREE.Fog){D.fogNear.value=p.near;
+D.fogFar.value=p.far}else if(p instanceof THREE.FogExp2)D.fogDensity.value=p.density}if(m instanceof THREE.MeshPhongMaterial||m instanceof THREE.MeshLambertMaterial){var O,X,E=0,aa=0,ka=0,na,wa,la,Ca=ra,Da=Ca.directional.colors,Pa=Ca.directional.positions,K=Ca.point.colors,Na=Ca.point.positions,Ia=0,Oa=0;p=X=X=0;for(O=z.length;p<O;p++){X=z[p];na=X.color;wa=X.position;la=X.intensity;if(X instanceof THREE.AmbientLight){E+=na.r;aa+=na.g;ka+=na.b}else if(X instanceof THREE.DirectionalLight){X=Ia*3;Da[X]=
+na.r*la;Da[X+1]=na.g*la;Da[X+2]=na.b*la;Pa[X]=wa.x;Pa[X+1]=wa.y;Pa[X+2]=wa.z;Ia+=1}else if(X instanceof THREE.PointLight){X=Oa*3;K[X]=na.r*la;K[X+1]=na.g*la;K[X+2]=na.b*la;Na[X]=wa.x;Na[X+1]=wa.y;Na[X+2]=wa.z;Oa+=1}}for(p=Ia*3;p<Da.length;p++)Da[p]=0;for(p=Oa*3;p<K.length;p++)K[p]=0;Ca.point.length=Oa;Ca.directional.length=Ia;Ca.ambient[0]=E;Ca.ambient[1]=aa;Ca.ambient[2]=ka;z=ra;D.enableLighting.value=z.directional.length+z.point.length;D.ambientLightColor.value=z.ambient;D.directionalLightColor.value=
 z.directional.colors;D.directionalLightDirection.value=z.directional.positions;D.pointLightColor.value=z.point.colors;D.pointLightPosition.value=z.point.positions}if(m instanceof THREE.MeshBasicMaterial||m instanceof THREE.MeshLambertMaterial||m instanceof THREE.MeshPhongMaterial){D.diffuse.value.setRGB(m.color.r*m.opacity,m.color.g*m.opacity,m.color.b*m.opacity);D.opacity.value=m.opacity;D.map.texture=m.map;D.lightMap.texture=m.lightMap;D.envMap.texture=m.envMap;D.reflectivity.value=m.reflectivity;
 D.refractionRatio.value=m.refractionRatio;D.combine.value=m.combine;D.useRefract.value=m.envMap&&m.envMap.mapping instanceof THREE.CubeRefractionMapping}if(m instanceof THREE.LineBasicMaterial){D.diffuse.value.setRGB(m.color.r*m.opacity,m.color.g*m.opacity,m.color.b*m.opacity);D.opacity.value=m.opacity}else if(m instanceof THREE.ParticleBasicMaterial){D.psColor.value.setRGB(m.color.r*m.opacity,m.color.g*m.opacity,m.color.b*m.opacity);D.opacity.value=m.opacity;D.size.value=m.size;D.scale.value=M.height/
-2;D.map.texture=m.map}else if(m instanceof THREE.MeshPhongMaterial){D.ambient.value.setRGB(m.ambient.r,m.ambient.g,m.ambient.b);D.specular.value.setRGB(m.specular.r,m.specular.g,m.specular.b);D.shininess.value=m.shininess}else if(m instanceof THREE.MeshDepthMaterial){D.mNear.value=l.near;D.mFar.value=l.far;D.opacity.value=m.opacity}else if(m instanceof THREE.MeshNormalMaterial)D.opacity.value=m.opacity;for(var S in D)if(E=B.uniforms[S]){p=D[S];P=p.type;z=p.value;if(P=="i")e.uniform1i(E,z);else if(P==
-"f")e.uniform1f(E,z);else if(P=="fv1")e.uniform1fv(E,z);else if(P=="fv")e.uniform3fv(E,z);else if(P=="v2")e.uniform2f(E,z.x,z.y);else if(P=="v3")e.uniform3f(E,z.x,z.y,z.z);else if(P=="c")e.uniform3f(E,z.r,z.g,z.b);else if(P=="t"){e.uniform1i(E,z);if(p=p.texture)if(p.image instanceof Array&&p.image.length==6){if(p.image.length==6){if(p.needsUpdate){if(p.__wasSetOnce){e.bindTexture(e.TEXTURE_CUBE_MAP,p.image.__webGLTextureCube);for(P=0;P<6;++P)e.texSubImage2D(e.TEXTURE_CUBE_MAP_POSITIVE_X+P,0,0,0,e.RGBA,
-e.UNSIGNED_BYTE,p.image[P])}else{p.image.__webGLTextureCube=e.createTexture();e.bindTexture(e.TEXTURE_CUBE_MAP,p.image.__webGLTextureCube);for(P=0;P<6;++P)e.texImage2D(e.TEXTURE_CUBE_MAP_POSITIVE_X+P,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,p.image[P]);p.__wasSetOnce=!0}G(e.TEXTURE_CUBE_MAP,p,p.image[0]);e.bindTexture(e.TEXTURE_CUBE_MAP,null);p.needsUpdate=!1}e.activeTexture(e.TEXTURE0+z);e.bindTexture(e.TEXTURE_CUBE_MAP,p.image.__webGLTextureCube)}}else{if(p.needsUpdate){if(p.__wasSetOnce){e.bindTexture(e.TEXTURE_2D,
+2;D.map.texture=m.map}else if(m instanceof THREE.MeshPhongMaterial){D.ambient.value.setRGB(m.ambient.r,m.ambient.g,m.ambient.b);D.specular.value.setRGB(m.specular.r,m.specular.g,m.specular.b);D.shininess.value=m.shininess}else if(m instanceof THREE.MeshDepthMaterial){D.mNear.value=l.near;D.mFar.value=l.far;D.opacity.value=m.opacity}else if(m instanceof THREE.MeshNormalMaterial)D.opacity.value=m.opacity;for(var S in D)if(E=B.uniforms[S]){p=D[S];O=p.type;z=p.value;if(O=="i")e.uniform1i(E,z);else if(O==
+"f")e.uniform1f(E,z);else if(O=="fv1")e.uniform1fv(E,z);else if(O=="fv")e.uniform3fv(E,z);else if(O=="v2")e.uniform2f(E,z.x,z.y);else if(O=="v3")e.uniform3f(E,z.x,z.y,z.z);else if(O=="c")e.uniform3f(E,z.r,z.g,z.b);else if(O=="t"){e.uniform1i(E,z);if(p=p.texture)if(p.image instanceof Array&&p.image.length==6){if(p.image.length==6){if(p.needsUpdate){if(p.__wasSetOnce){e.bindTexture(e.TEXTURE_CUBE_MAP,p.image.__webGLTextureCube);for(O=0;O<6;++O)e.texSubImage2D(e.TEXTURE_CUBE_MAP_POSITIVE_X+O,0,0,0,e.RGBA,
+e.UNSIGNED_BYTE,p.image[O])}else{p.image.__webGLTextureCube=e.createTexture();e.bindTexture(e.TEXTURE_CUBE_MAP,p.image.__webGLTextureCube);for(O=0;O<6;++O)e.texImage2D(e.TEXTURE_CUBE_MAP_POSITIVE_X+O,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,p.image[O]);p.__wasSetOnce=!0}G(e.TEXTURE_CUBE_MAP,p,p.image[0]);e.bindTexture(e.TEXTURE_CUBE_MAP,null);p.needsUpdate=!1}e.activeTexture(e.TEXTURE0+z);e.bindTexture(e.TEXTURE_CUBE_MAP,p.image.__webGLTextureCube)}}else{if(p.needsUpdate){if(p.__wasSetOnce){e.bindTexture(e.TEXTURE_2D,
 p.__webGLTexture);e.texSubImage2D(e.TEXTURE_2D,0,0,0,e.RGBA,e.UNSIGNED_BYTE,p.image)}else{p.__webGLTexture=e.createTexture();e.bindTexture(e.TEXTURE_2D,p.__webGLTexture);e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,p.image);p.__wasSetOnce=!0}G(e.TEXTURE_2D,p,p.image);e.bindTexture(e.TEXTURE_2D,null);p.needsUpdate=!1}e.activeTexture(e.TEXTURE0+z);e.bindTexture(e.TEXTURE_2D,p.__webGLTexture)}}}e.uniformMatrix4fv(A.modelViewMatrix,!1,o._modelViewMatrixArray);e.uniformMatrix3fv(A.normalMatrix,
 !1,o._normalMatrixArray);(m instanceof THREE.MeshShaderMaterial||m instanceof THREE.MeshPhongMaterial||m.envMap)&&e.uniform3f(A.cameraPosition,l.position.x,l.position.y,l.position.z);(m instanceof THREE.MeshShaderMaterial||m.envMap||m.skinning)&&e.uniformMatrix4fv(A.objectMatrix,!1,o._objectMatrixArray);(m instanceof THREE.MeshPhongMaterial||m instanceof THREE.MeshLambertMaterial||m instanceof THREE.MeshShaderMaterial||m.skinning)&&e.uniformMatrix4fv(A.viewMatrix,!1,$);if(m.skinning){e.uniformMatrix4fv(A.cameraInverseMatrix,
-!1,$);e.uniformMatrix4fv(A.boneGlobalMatrices,!1,o.boneMatrices)}return B}function f(l,z,p,m,o,B){if(m.opacity!=0){l=d(l,z,p,m,B).attributes;if(m.morphTargets){B.morphTargetBase!==-1?e.bindBuffer(e.ARRAY_BUFFER,o.__webGLMorphTargetsBuffers[B.morphTargetBase]):e.bindBuffer(e.ARRAY_BUFFER,o.__webGLVertexBuffer);e.vertexAttribPointer(l.position,3,e.FLOAT,!1,0,0);z=-1;p=0;for(var A=B.morphTargetInfluences,D,P=A.length,U=0;U<m.numSupportedMorphTargets;){for(D=0;D<P;D++)if(D!=B.morphTargetBase&&A[D]>z){p=
-D;z=A[p]}e.bindBuffer(e.ARRAY_BUFFER,o.__webGLMorphTargetsBuffers[p]);e.vertexAttribPointer(l["morphTarget"+U],3,e.FLOAT,!1,0,0);B.__webGLMorphTargetInfluences[U]=z;z=-1;U++}e.uniform1fv(m.program.uniforms.morphTargetInfluences,B.__webGLMorphTargetInfluences)}else{e.bindBuffer(e.ARRAY_BUFFER,o.__webGLVertexBuffer);e.vertexAttribPointer(l.position,3,e.FLOAT,!1,0,0)}if(l.color>=0){e.bindBuffer(e.ARRAY_BUFFER,o.__webGLColorBuffer);e.vertexAttribPointer(l.color,3,e.FLOAT,!1,0,0)}if(l.normal>=0){e.bindBuffer(e.ARRAY_BUFFER,
-o.__webGLNormalBuffer);e.vertexAttribPointer(l.normal,3,e.FLOAT,!1,0,0)}if(l.tangent>=0){e.bindBuffer(e.ARRAY_BUFFER,o.__webGLTangentBuffer);e.vertexAttribPointer(l.tangent,4,e.FLOAT,!1,0,0)}if(l.uv>=0)if(o.__webGLUVBuffer){e.bindBuffer(e.ARRAY_BUFFER,o.__webGLUVBuffer);e.vertexAttribPointer(l.uv,2,e.FLOAT,!1,0,0);e.enableVertexAttribArray(l.uv)}else e.disableVertexAttribArray(l.uv);if(l.uv2>=0)if(o.__webGLUV2Buffer){e.bindBuffer(e.ARRAY_BUFFER,o.__webGLUV2Buffer);e.vertexAttribPointer(l.uv2,2,e.FLOAT,
-!1,0,0);e.enableVertexAttribArray(l.uv2)}else e.disableVertexAttribArray(l.uv2);if(m.skinning&&l.skinVertexA>=0&&l.skinVertexB>=0&&l.skinIndex>=0&&l.skinWeight>=0){e.bindBuffer(e.ARRAY_BUFFER,o.__webGLSkinVertexABuffer);e.vertexAttribPointer(l.skinVertexA,4,e.FLOAT,!1,0,0);e.bindBuffer(e.ARRAY_BUFFER,o.__webGLSkinVertexBBuffer);e.vertexAttribPointer(l.skinVertexB,4,e.FLOAT,!1,0,0);e.bindBuffer(e.ARRAY_BUFFER,o.__webGLSkinIndicesBuffer);e.vertexAttribPointer(l.skinIndex,4,e.FLOAT,!1,0,0);e.bindBuffer(e.ARRAY_BUFFER,
-o.__webGLSkinWeightsBuffer);e.vertexAttribPointer(l.skinWeight,4,e.FLOAT,!1,0,0)}if(B instanceof THREE.Mesh)if(m.wireframe){e.lineWidth(m.wireframeLinewidth);e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,o.__webGLLineBuffer);e.drawElements(e.LINES,o.__webGLLineCount,e.UNSIGNED_SHORT,0)}else{e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,o.__webGLFaceBuffer);e.drawElements(e.TRIANGLES,o.__webGLFaceCount,e.UNSIGNED_SHORT,0)}else if(B instanceof THREE.Line){B=B.type==THREE.LineStrip?e.LINE_STRIP:e.LINES;e.lineWidth(m.linewidth);
-e.drawArrays(B,0,o.__webGLLineCount)}else if(B instanceof THREE.ParticleSystem)e.drawArrays(e.POINTS,0,o.__webGLParticleCount);else B instanceof THREE.Ribbon&&e.drawArrays(e.TRIANGLE_STRIP,0,o.__webGLVertexCount)}}function g(l,z){if(!l.__webGLVertexBuffer)l.__webGLVertexBuffer=e.createBuffer();if(!l.__webGLNormalBuffer)l.__webGLNormalBuffer=e.createBuffer();if(l.hasPos){e.bindBuffer(e.ARRAY_BUFFER,l.__webGLVertexBuffer);e.bufferData(e.ARRAY_BUFFER,l.positionArray,e.DYNAMIC_DRAW);e.enableVertexAttribArray(z.attributes.position);
-e.vertexAttribPointer(z.attributes.position,3,e.FLOAT,!1,0,0)}if(l.hasNormal){e.bindBuffer(e.ARRAY_BUFFER,l.__webGLNormalBuffer);e.bufferData(e.ARRAY_BUFFER,l.normalArray,e.DYNAMIC_DRAW);e.enableVertexAttribArray(z.attributes.normal);e.vertexAttribPointer(z.attributes.normal,3,e.FLOAT,!1,0,0)}e.drawArrays(e.TRIANGLES,0,l.count);l.count=0}function h(l){if(ga!=l.doubleSided){l.doubleSided?e.disable(e.CULL_FACE):e.enable(e.CULL_FACE);ga=l.doubleSided}if(I!=l.flipSided){l.flipSided?e.frontFace(e.CW):
-e.frontFace(e.CCW);I=l.flipSided}}function j(l){if(za!=l){l?e.enable(e.DEPTH_TEST):e.disable(e.DEPTH_TEST);za=l}}function k(l){va[0].set(l.n41-l.n11,l.n42-l.n12,l.n43-l.n13,l.n44-l.n14);va[1].set(l.n41+l.n11,l.n42+l.n12,l.n43+l.n13,l.n44+l.n14);va[2].set(l.n41+l.n21,l.n42+l.n22,l.n43+l.n23,l.n44+l.n24);va[3].set(l.n41-l.n21,l.n42-l.n22,l.n43-l.n23,l.n44-l.n24);va[4].set(l.n41-l.n31,l.n42-l.n32,l.n43-l.n33,l.n44-l.n34);va[5].set(l.n41+l.n31,l.n42+l.n32,l.n43+l.n33,l.n44+l.n34);var z;for(l=0;l<6;l++){z=
-va[l];z.divideScalar(Math.sqrt(z.x*z.x+z.y*z.y+z.z*z.z))}}function n(l){for(var z=l.matrixWorld,p=-l.geometry.boundingSphere.radius*Math.max(l.scale.x,Math.max(l.scale.y,l.scale.z)),m=0;m<6;m++){l=va[m].x*z.n14+va[m].y*z.n24+va[m].z*z.n34+va[m].w;if(l<=p)return!1}return!0}function q(l,z){l.list[l.count]=z;l.count+=1}function x(l){var z,p,m=l.object,o=l.opaque,B=l.transparent;B.count=0;l=o.count=0;for(z=m.materials.length;l<z;l++){p=m.materials[l];p.opacity&&p.opacity<1||p.blending!=THREE.NormalBlending?
-q(B,p):q(o,p)}}function u(l){var z,p,m,o,B=l.object,A=l.buffer,D=l.opaque,P=l.transparent;P.count=0;l=D.count=0;for(m=B.materials.length;l<m;l++){z=B.materials[l];if(z instanceof THREE.MeshFaceMaterial){z=0;for(p=A.materials.length;z<p;z++)(o=A.materials[z])&&(o.opacity&&o.opacity<1||o.blending!=THREE.NormalBlending?q(P,o):q(D,o))}else{o=z;o.opacity&&o.opacity<1||o.blending!=THREE.NormalBlending?q(P,o):q(D,o)}}}function t(l,z){return z.z-l.z}function y(l,z){l._modelViewMatrix.multiplyToArray(z.matrixWorldInverse,
-l.matrixWorld,l._modelViewMatrixArray);THREE.Matrix4.makeInvert3x3(l._modelViewMatrix).transposeIntoArray(l._normalMatrixArray)}function C(l){function z(ka){var na=[];p=0;for(m=ka.length;p<m;p++)ka[p]==undefined?na.push("undefined"):na.push(ka[p].id);return na.join("_")}var p,m,o,B,A,D,P,U,E={},aa=l.morphTargets!==undefined?l.morphTargets.length:0;l.geometryGroups={};o=0;for(B=l.faces.length;o<B;o++){A=l.faces[o];D=A.materials;P=z(D);E[P]==undefined&&(E[P]={hash:P,counter:0});U=E[P].hash+"_"+E[P].counter;
-l.geometryGroups[U]==undefined&&(l.geometryGroups[U]={faces:[],materials:D,vertices:0,numMorphTargets:aa});A=A instanceof THREE.Face3?3:4;if(l.geometryGroups[U].vertices+A>65535){E[P].counter+=1;U=E[P].hash+"_"+E[P].counter;l.geometryGroups[U]==undefined&&(l.geometryGroups[U]={faces:[],materials:D,vertices:0,numMorphTargets:aa})}l.geometryGroups[U].faces.push(o);l.geometryGroups[U].vertices+=A}}function F(l,z,p){l.push({buffer:z,object:p,opaque:{list:[],count:0},transparent:{list:[],count:0}})}function v(l){if(l!=
-ca){switch(l){case THREE.AdditiveBlending:e.blendEquation(e.FUNC_ADD);e.blendFunc(e.ONE,e.ONE);break;case THREE.SubtractiveBlending:e.blendFunc(e.DST_COLOR,e.ZERO);break;case THREE.BillboardBlending:e.blendEquation(e.FUNC_ADD);e.blendFunc(e.SRC_ALPHA,e.ONE_MINUS_SRC_ALPHA);break;case THREE.ReverseSubtractiveBlending:e.blendEquation(e.FUNC_REVERSE_SUBTRACT);e.blendFunc(e.ONE,e.ONE);break;default:e.blendEquation(e.FUNC_ADD);e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA)}ca=l}}function G(l,z,p){if((p.width&
-p.width-1)==0&&(p.height&p.height-1)==0){e.texParameteri(l,e.TEXTURE_WRAP_S,Y(z.wrapS));e.texParameteri(l,e.TEXTURE_WRAP_T,Y(z.wrapT));e.texParameteri(l,e.TEXTURE_MAG_FILTER,Y(z.magFilter));e.texParameteri(l,e.TEXTURE_MIN_FILTER,Y(z.minFilter));e.generateMipmap(l)}else{e.texParameteri(l,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE);e.texParameteri(l,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE);e.texParameteri(l,e.TEXTURE_MAG_FILTER,L(z.magFilter));e.texParameteri(l,e.TEXTURE_MIN_FILTER,L(z.minFilter))}}function w(l){if(l&&
-!l.__webGLFramebuffer){l.__webGLFramebuffer=e.createFramebuffer();l.__webGLRenderbuffer=e.createRenderbuffer();l.__webGLTexture=e.createTexture();e.bindRenderbuffer(e.RENDERBUFFER,l.__webGLRenderbuffer);e.renderbufferStorage(e.RENDERBUFFER,e.DEPTH_COMPONENT16,l.width,l.height);e.bindTexture(e.TEXTURE_2D,l.__webGLTexture);e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,Y(l.wrapS));e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,Y(l.wrapT));e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,Y(l.magFilter));
-e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,Y(l.minFilter));e.texImage2D(e.TEXTURE_2D,0,Y(l.format),l.width,l.height,0,Y(l.format),Y(l.type),null);e.bindFramebuffer(e.FRAMEBUFFER,l.__webGLFramebuffer);e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,l.__webGLTexture,0);e.framebufferRenderbuffer(e.FRAMEBUFFER,e.DEPTH_ATTACHMENT,e.RENDERBUFFER,l.__webGLRenderbuffer);e.bindTexture(e.TEXTURE_2D,null);e.bindRenderbuffer(e.RENDERBUFFER,null);e.bindFramebuffer(e.FRAMEBUFFER,null)}var z,
-p;if(l){z=l.__webGLFramebuffer;p=l.width;l=l.height}else{z=null;p=ja;l=ha}if(z!=R){e.bindFramebuffer(e.FRAMEBUFFER,z);e.viewport(ea,xa,p,l);R=z}}function N(l,z){var p;if(l=="fragment")p=e.createShader(e.FRAGMENT_SHADER);else l=="vertex"&&(p=e.createShader(e.VERTEX_SHADER));e.shaderSource(p,z);e.compileShader(p);if(!e.getShaderParameter(p,e.COMPILE_STATUS)){alert(e.getShaderInfoLog(p));return null}return p}function L(l){switch(l){case THREE.NearestFilter:case THREE.NearestMipMapNearestFilter:case THREE.NearestMipMapLinearFilter:return e.NEAREST;
+!1,$);e.uniformMatrix4fv(A.boneGlobalMatrices,!1,o.boneMatrices)}return B}function f(l,z,p,m,o,B){if(m.opacity!=0){l=d(l,z,p,m,B).attributes;if(m.morphTargets){B.morphTargetBase!==-1?e.bindBuffer(e.ARRAY_BUFFER,o.__webGLMorphTargetsBuffers[B.morphTargetBase]):e.bindBuffer(e.ARRAY_BUFFER,o.__webGLVertexBuffer);e.vertexAttribPointer(l.position,3,e.FLOAT,!1,0,0);z=[];p=-1;var A=0,D=B.morphTargetInfluences,O,X=D.length,E=0;for(B.morphTargetBase!==-1&&(z[B.morphTargetBase]=!0);E<m.numSupportedMorphTargets;){for(O=
+0;O<X;O++)if(!z[O]&&D[O]>p){A=O;p=D[A]}e.bindBuffer(e.ARRAY_BUFFER,o.__webGLMorphTargetsBuffers[A]);e.vertexAttribPointer(l["morphTarget"+E],3,e.FLOAT,!1,0,0);B.__webGLMorphTargetInfluences[E]=p;z[A]=1;p=-1;E++}e.uniform1fv(m.program.uniforms.morphTargetInfluences,B.__webGLMorphTargetInfluences)}else{e.bindBuffer(e.ARRAY_BUFFER,o.__webGLVertexBuffer);e.vertexAttribPointer(l.position,3,e.FLOAT,!1,0,0)}if(l.color>=0){e.bindBuffer(e.ARRAY_BUFFER,o.__webGLColorBuffer);e.vertexAttribPointer(l.color,3,
+e.FLOAT,!1,0,0)}if(l.normal>=0){e.bindBuffer(e.ARRAY_BUFFER,o.__webGLNormalBuffer);e.vertexAttribPointer(l.normal,3,e.FLOAT,!1,0,0)}if(l.tangent>=0){e.bindBuffer(e.ARRAY_BUFFER,o.__webGLTangentBuffer);e.vertexAttribPointer(l.tangent,4,e.FLOAT,!1,0,0)}if(l.uv>=0)if(o.__webGLUVBuffer){e.bindBuffer(e.ARRAY_BUFFER,o.__webGLUVBuffer);e.vertexAttribPointer(l.uv,2,e.FLOAT,!1,0,0);e.enableVertexAttribArray(l.uv)}else e.disableVertexAttribArray(l.uv);if(l.uv2>=0)if(o.__webGLUV2Buffer){e.bindBuffer(e.ARRAY_BUFFER,
+o.__webGLUV2Buffer);e.vertexAttribPointer(l.uv2,2,e.FLOAT,!1,0,0);e.enableVertexAttribArray(l.uv2)}else e.disableVertexAttribArray(l.uv2);if(m.skinning&&l.skinVertexA>=0&&l.skinVertexB>=0&&l.skinIndex>=0&&l.skinWeight>=0){e.bindBuffer(e.ARRAY_BUFFER,o.__webGLSkinVertexABuffer);e.vertexAttribPointer(l.skinVertexA,4,e.FLOAT,!1,0,0);e.bindBuffer(e.ARRAY_BUFFER,o.__webGLSkinVertexBBuffer);e.vertexAttribPointer(l.skinVertexB,4,e.FLOAT,!1,0,0);e.bindBuffer(e.ARRAY_BUFFER,o.__webGLSkinIndicesBuffer);e.vertexAttribPointer(l.skinIndex,
+4,e.FLOAT,!1,0,0);e.bindBuffer(e.ARRAY_BUFFER,o.__webGLSkinWeightsBuffer);e.vertexAttribPointer(l.skinWeight,4,e.FLOAT,!1,0,0)}if(B instanceof THREE.Mesh)if(m.wireframe){e.lineWidth(m.wireframeLinewidth);e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,o.__webGLLineBuffer);e.drawElements(e.LINES,o.__webGLLineCount,e.UNSIGNED_SHORT,0)}else{e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,o.__webGLFaceBuffer);e.drawElements(e.TRIANGLES,o.__webGLFaceCount,e.UNSIGNED_SHORT,0)}else if(B instanceof THREE.Line){B=B.type==THREE.LineStrip?
+e.LINE_STRIP:e.LINES;e.lineWidth(m.linewidth);e.drawArrays(B,0,o.__webGLLineCount)}else if(B instanceof THREE.ParticleSystem)e.drawArrays(e.POINTS,0,o.__webGLParticleCount);else B instanceof THREE.Ribbon&&e.drawArrays(e.TRIANGLE_STRIP,0,o.__webGLVertexCount)}}function g(l,z){if(!l.__webGLVertexBuffer)l.__webGLVertexBuffer=e.createBuffer();if(!l.__webGLNormalBuffer)l.__webGLNormalBuffer=e.createBuffer();if(l.hasPos){e.bindBuffer(e.ARRAY_BUFFER,l.__webGLVertexBuffer);e.bufferData(e.ARRAY_BUFFER,l.positionArray,
+e.DYNAMIC_DRAW);e.enableVertexAttribArray(z.attributes.position);e.vertexAttribPointer(z.attributes.position,3,e.FLOAT,!1,0,0)}if(l.hasNormal){e.bindBuffer(e.ARRAY_BUFFER,l.__webGLNormalBuffer);e.bufferData(e.ARRAY_BUFFER,l.normalArray,e.DYNAMIC_DRAW);e.enableVertexAttribArray(z.attributes.normal);e.vertexAttribPointer(z.attributes.normal,3,e.FLOAT,!1,0,0)}e.drawArrays(e.TRIANGLES,0,l.count);l.count=0}function h(l){if(ga!=l.doubleSided){l.doubleSided?e.disable(e.CULL_FACE):e.enable(e.CULL_FACE);ga=
+l.doubleSided}if(I!=l.flipSided){l.flipSided?e.frontFace(e.CW):e.frontFace(e.CCW);I=l.flipSided}}function j(l){if(za!=l){l?e.enable(e.DEPTH_TEST):e.disable(e.DEPTH_TEST);za=l}}function k(l){va[0].set(l.n41-l.n11,l.n42-l.n12,l.n43-l.n13,l.n44-l.n14);va[1].set(l.n41+l.n11,l.n42+l.n12,l.n43+l.n13,l.n44+l.n14);va[2].set(l.n41+l.n21,l.n42+l.n22,l.n43+l.n23,l.n44+l.n24);va[3].set(l.n41-l.n21,l.n42-l.n22,l.n43-l.n23,l.n44-l.n24);va[4].set(l.n41-l.n31,l.n42-l.n32,l.n43-l.n33,l.n44-l.n34);va[5].set(l.n41+
+l.n31,l.n42+l.n32,l.n43+l.n33,l.n44+l.n34);var z;for(l=0;l<6;l++){z=va[l];z.divideScalar(Math.sqrt(z.x*z.x+z.y*z.y+z.z*z.z))}}function n(l){for(var z=l.matrixWorld,p=-l.geometry.boundingSphere.radius*Math.max(l.scale.x,Math.max(l.scale.y,l.scale.z)),m=0;m<6;m++){l=va[m].x*z.n14+va[m].y*z.n24+va[m].z*z.n34+va[m].w;if(l<=p)return!1}return!0}function q(l,z){l.list[l.count]=z;l.count+=1}function x(l){var z,p,m=l.object,o=l.opaque,B=l.transparent;B.count=0;l=o.count=0;for(z=m.materials.length;l<z;l++){p=
+m.materials[l];p.opacity&&p.opacity<1||p.blending!=THREE.NormalBlending?q(B,p):q(o,p)}}function u(l){var z,p,m,o,B=l.object,A=l.buffer,D=l.opaque,O=l.transparent;O.count=0;l=D.count=0;for(m=B.materials.length;l<m;l++){z=B.materials[l];if(z instanceof THREE.MeshFaceMaterial){z=0;for(p=A.materials.length;z<p;z++)(o=A.materials[z])&&(o.opacity&&o.opacity<1||o.blending!=THREE.NormalBlending?q(O,o):q(D,o))}else{o=z;o.opacity&&o.opacity<1||o.blending!=THREE.NormalBlending?q(O,o):q(D,o)}}}function t(l,z){return z.z-
+l.z}function y(l,z){l._modelViewMatrix.multiplyToArray(z.matrixWorldInverse,l.matrixWorld,l._modelViewMatrixArray);THREE.Matrix4.makeInvert3x3(l._modelViewMatrix).transposeIntoArray(l._normalMatrixArray)}function C(l){function z(ka){var na=[];p=0;for(m=ka.length;p<m;p++)ka[p]==undefined?na.push("undefined"):na.push(ka[p].id);return na.join("_")}var p,m,o,B,A,D,O,X,E={},aa=l.morphTargets!==undefined?l.morphTargets.length:0;l.geometryGroups={};o=0;for(B=l.faces.length;o<B;o++){A=l.faces[o];D=A.materials;
+O=z(D);E[O]==undefined&&(E[O]={hash:O,counter:0});X=E[O].hash+"_"+E[O].counter;l.geometryGroups[X]==undefined&&(l.geometryGroups[X]={faces:[],materials:D,vertices:0,numMorphTargets:aa});A=A instanceof THREE.Face3?3:4;if(l.geometryGroups[X].vertices+A>65535){E[O].counter+=1;X=E[O].hash+"_"+E[O].counter;l.geometryGroups[X]==undefined&&(l.geometryGroups[X]={faces:[],materials:D,vertices:0,numMorphTargets:aa})}l.geometryGroups[X].faces.push(o);l.geometryGroups[X].vertices+=A}}function F(l,z,p){l.push({buffer:z,
+object:p,opaque:{list:[],count:0},transparent:{list:[],count:0}})}function v(l){if(l!=ca){switch(l){case THREE.AdditiveBlending:e.blendEquation(e.FUNC_ADD);e.blendFunc(e.ONE,e.ONE);break;case THREE.SubtractiveBlending:e.blendFunc(e.DST_COLOR,e.ZERO);break;case THREE.BillboardBlending:e.blendEquation(e.FUNC_ADD);e.blendFunc(e.SRC_ALPHA,e.ONE_MINUS_SRC_ALPHA);break;case THREE.ReverseSubtractiveBlending:e.blendEquation(e.FUNC_REVERSE_SUBTRACT);e.blendFunc(e.ONE,e.ONE);break;default:e.blendEquation(e.FUNC_ADD);
+e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA)}ca=l}}function G(l,z,p){if((p.width&p.width-1)==0&&(p.height&p.height-1)==0){e.texParameteri(l,e.TEXTURE_WRAP_S,Y(z.wrapS));e.texParameteri(l,e.TEXTURE_WRAP_T,Y(z.wrapT));e.texParameteri(l,e.TEXTURE_MAG_FILTER,Y(z.magFilter));e.texParameteri(l,e.TEXTURE_MIN_FILTER,Y(z.minFilter));e.generateMipmap(l)}else{e.texParameteri(l,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE);e.texParameteri(l,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE);e.texParameteri(l,e.TEXTURE_MAG_FILTER,L(z.magFilter));
+e.texParameteri(l,e.TEXTURE_MIN_FILTER,L(z.minFilter))}}function w(l){if(l&&!l.__webGLFramebuffer){l.__webGLFramebuffer=e.createFramebuffer();l.__webGLRenderbuffer=e.createRenderbuffer();l.__webGLTexture=e.createTexture();e.bindRenderbuffer(e.RENDERBUFFER,l.__webGLRenderbuffer);e.renderbufferStorage(e.RENDERBUFFER,e.DEPTH_COMPONENT16,l.width,l.height);e.bindTexture(e.TEXTURE_2D,l.__webGLTexture);e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,Y(l.wrapS));e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,
+Y(l.wrapT));e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,Y(l.magFilter));e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,Y(l.minFilter));e.texImage2D(e.TEXTURE_2D,0,Y(l.format),l.width,l.height,0,Y(l.format),Y(l.type),null);e.bindFramebuffer(e.FRAMEBUFFER,l.__webGLFramebuffer);e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,l.__webGLTexture,0);e.framebufferRenderbuffer(e.FRAMEBUFFER,e.DEPTH_ATTACHMENT,e.RENDERBUFFER,l.__webGLRenderbuffer);e.bindTexture(e.TEXTURE_2D,null);
+e.bindRenderbuffer(e.RENDERBUFFER,null);e.bindFramebuffer(e.FRAMEBUFFER,null)}var z,p;if(l){z=l.__webGLFramebuffer;p=l.width;l=l.height}else{z=null;p=ja;l=ha}if(z!=R){e.bindFramebuffer(e.FRAMEBUFFER,z);e.viewport(ea,xa,p,l);R=z}}function N(l,z){var p;if(l=="fragment")p=e.createShader(e.FRAGMENT_SHADER);else l=="vertex"&&(p=e.createShader(e.VERTEX_SHADER));e.shaderSource(p,z);e.compileShader(p);if(!e.getShaderParameter(p,e.COMPILE_STATUS)){alert(e.getShaderInfoLog(p));return null}return p}function L(l){switch(l){case THREE.NearestFilter:case THREE.NearestMipMapNearestFilter:case THREE.NearestMipMapLinearFilter:return e.NEAREST;
 case THREE.LinearFilter:case THREE.LinearMipMapNearestFilter:case THREE.LinearMipMapLinearFilter:return e.LINEAR}}function Y(l){switch(l){case THREE.RepeatWrapping:return e.REPEAT;case THREE.ClampToEdgeWrapping:return e.CLAMP_TO_EDGE;case THREE.MirroredRepeatWrapping:return e.MIRRORED_REPEAT;case THREE.NearestFilter:return e.NEAREST;case THREE.NearestMipMapNearestFilter:return e.NEAREST_MIPMAP_NEAREST;case THREE.NearestMipMapLinearFilter:return e.NEAREST_MIPMAP_LINEAR;case THREE.LinearFilter:return e.LINEAR;
 case THREE.LinearMipMapNearestFilter:return e.LINEAR_MIPMAP_NEAREST;case THREE.LinearMipMapLinearFilter:return e.LINEAR_MIPMAP_LINEAR;case THREE.ByteType:return e.BYTE;case THREE.UnsignedByteType:return e.UNSIGNED_BYTE;case THREE.ShortType:return e.SHORT;case THREE.UnsignedShortType:return e.UNSIGNED_SHORT;case THREE.IntType:return e.INT;case THREE.UnsignedShortType:return e.UNSIGNED_INT;case THREE.FloatType:return e.FLOAT;case THREE.AlphaFormat:return e.ALPHA;case THREE.RGBFormat:return e.RGB;case THREE.RGBAFormat:return e.RGBA;
-case THREE.LuminanceFormat:return e.LUMINANCE;case THREE.LuminanceAlphaFormat:return e.LUMINANCE_ALPHA}return 0}var M=document.createElement("canvas"),e,X=null,R=null,da=this,ga=null,I=null,ca=null,za=null,ea=0,xa=0,ja=0,ha=0,va=[new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4],Aa=new THREE.Matrix4,ia=new Float32Array(16),$=new Float32Array(16),qa=new THREE.Vector4,ra={ambient:[0,0,0],directional:{length:0,colors:[],positions:[]},point:{length:0,
+case THREE.LuminanceFormat:return e.LUMINANCE;case THREE.LuminanceAlphaFormat:return e.LUMINANCE_ALPHA}return 0}var M=document.createElement("canvas"),e,W=null,R=null,da=this,ga=null,I=null,ca=null,za=null,ea=0,xa=0,ja=0,ha=0,va=[new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4],Aa=new THREE.Matrix4,ia=new Float32Array(16),$=new Float32Array(16),qa=new THREE.Vector4,ra={ambient:[0,0,0],directional:{length:0,colors:[],positions:[]},point:{length:0,
 colors:[],positions:[]}},Q=!0,ma=new THREE.Color(0),ta=0;if(a){if(a.antialias!==undefined)Q=a.antialias;a.clearColor!==undefined&&ma.setHex(a.clearColor);if(a.clearAlpha!==undefined)ta=a.clearAlpha}this.maxMorphTargets=8;this.domElement=M;this.autoClear=!0;this.sortObjects=!0;(function(l,z,p){try{if(!(e=M.getContext("experimental-webgl",{antialias:l})))throw"Error creating WebGL context.";}catch(m){console.error(m)}e.clearColor(0,0,0,1);e.clearDepth(1);e.enable(e.DEPTH_TEST);e.depthFunc(e.LEQUAL);
 e.frontFace(e.CCW);e.cullFace(e.BACK);e.enable(e.CULL_FACE);e.enable(e.BLEND);e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA);e.clearColor(z.r,z.g,z.b,p);_cullEnabled=!0})(Q,ma,ta);this.context=e;this.setSize=function(l,z){M.width=l;M.height=z;this.setViewport(0,0,M.width,M.height)};this.setViewport=function(l,z,p,m){ea=l;xa=z;ja=p;ha=m;e.viewport(ea,xa,ja,ha)};this.setScissor=function(l,z,p,m){e.scissor(l,z,p,m)};this.enableScissorTest=function(l){l?e.enable(e.SCISSOR_TEST):e.disable(e.SCISSOR_TEST)};this.enableDepthBufferWrite=
 function(l){e.depthMask(l)};this.setClearColorHex=function(l,z){var p=new THREE.Color(l);e.clearColor(p.r,p.g,p.b,z)};this.setClearColor=function(l,z){e.clearColor(l.r,l.g,l.b,z)};this.clear=function(){e.clear(e.COLOR_BUFFER_BIT|e.DEPTH_BUFFER_BIT)};this.initMaterial=function(l,z,p,m){var o,B,A;if(l instanceof THREE.MeshDepthMaterial)b(l,THREE.ShaderLib.depth);else if(l instanceof THREE.MeshNormalMaterial)b(l,THREE.ShaderLib.normal);else if(l instanceof THREE.MeshBasicMaterial)b(l,THREE.ShaderLib.basic);
-else if(l instanceof THREE.MeshLambertMaterial)b(l,THREE.ShaderLib.lambert);else if(l instanceof THREE.MeshPhongMaterial)b(l,THREE.ShaderLib.phong);else if(l instanceof THREE.LineBasicMaterial)b(l,THREE.ShaderLib.basic);else l instanceof THREE.ParticleBasicMaterial&&b(l,THREE.ShaderLib.particle_basic);var D,P,U,E;A=U=E=0;for(D=z.length;A<D;A++){P=z[A];P instanceof THREE.DirectionalLight&&U++;P instanceof THREE.PointLight&&E++}if(E+U<=4)z=U;else{z=Math.ceil(4*U/(E+U));E=4-z}A={directional:z,point:E};
+else if(l instanceof THREE.MeshLambertMaterial)b(l,THREE.ShaderLib.lambert);else if(l instanceof THREE.MeshPhongMaterial)b(l,THREE.ShaderLib.phong);else if(l instanceof THREE.LineBasicMaterial)b(l,THREE.ShaderLib.basic);else l instanceof THREE.ParticleBasicMaterial&&b(l,THREE.ShaderLib.particle_basic);var D,O,X,E;A=X=E=0;for(D=z.length;A<D;A++){O=z[A];O instanceof THREE.DirectionalLight&&X++;O instanceof THREE.PointLight&&E++}if(E+X<=4)z=X;else{z=Math.ceil(4*X/(E+X));E=4-z}A={directional:z,point:E};
 D=50;if(m!==undefined&&m instanceof THREE.SkinnedMesh)D=m.bones.length;E=l.fragmentShader;z=l.vertexShader;D={fog:p,map:l.map,envMap:l.envMap,lightMap:l.lightMap,vertexColors:l.vertexColors,skinning:l.skinning,morphTargets:l.morphTargets,maxDirLights:A.directional,maxPointLights:A.point,maxBones:D};p=e.createProgram();A=["#ifdef GL_ES\nprecision highp float;\n#endif","#define MAX_DIR_LIGHTS "+D.maxDirLights,"#define MAX_POINT_LIGHTS "+D.maxPointLights,D.fog?"#define USE_FOG":"",D.fog instanceof THREE.FogExp2?
 "#define FOG_EXP2":"",D.map?"#define USE_MAP":"",D.envMap?"#define USE_ENVMAP":"",D.lightMap?"#define USE_LIGHTMAP":"",D.vertexColors?"#define USE_COLOR":"","uniform mat4 viewMatrix;\nuniform vec3 cameraPosition;\n"].join("\n");D=[e.getParameter(e.MAX_VERTEX_TEXTURE_IMAGE_UNITS)>0?"#define VERTEX_TEXTURES":"","#define MAX_DIR_LIGHTS "+D.maxDirLights,"#define MAX_POINT_LIGHTS "+D.maxPointLights,"#define MAX_BONES "+D.maxBones,D.map?"#define USE_MAP":"",D.envMap?"#define USE_ENVMAP":"",D.lightMap?"#define USE_LIGHTMAP":
 "",D.vertexColors?"#define USE_COLOR":"",D.skinning?"#define USE_SKINNING":"",D.morphTargets?"#define USE_MORPHTARGETS":"",D.sizeAttenuation?"#define USE_SIZEATTENUATION":"","uniform mat4 objectMatrix;\nuniform mat4 modelViewMatrix;\nuniform mat4 projectionMatrix;\nuniform mat4 viewMatrix;\nuniform mat3 normalMatrix;\nuniform vec3 cameraPosition;\nuniform mat4 cameraInverseMatrix;\nattribute vec3 position;\nattribute vec3 morphTarget0;\nattribute vec3 morphTarget1;\nattribute vec3 morphTarget2;\nattribute vec3 morphTarget3;\nattribute vec3 morphTarget4;\nattribute vec3 morphTarget5;\nattribute vec3 morphTarget6;\nattribute vec3 morphTarget7;\nattribute vec3 normal;\nattribute vec3 color;\nattribute vec2 uv;\nattribute vec2 uv2;\nattribute vec4 skinVertexA;\nattribute vec4 skinVertexB;\nattribute vec4 skinIndex;\nattribute vec4 skinWeight;\n"].join("\n");
@@ -256,36 +256,36 @@ e.attachShader(p,N("fragment",A+E));e.attachShader(p,N("vertex",D+z));e.linkProg
 l.program;E=0;for(z=p.length;E<z;E++){A=p[E];o.uniforms[A]=e.getUniformLocation(o,A)}p=["position","normal","uv","uv2","tangent","color","skinVertexA","skinVertexB","skinIndex","skinWeight"];for(o=0;o<this.maxMorphTargets;o++)p.push("morphTarget"+o);for(B in l.attributes)p.push(B);B=l.program;o=p;p=0;for(E=o.length;p<E;p++){z=o[p];B.attributes[z]=e.getAttribLocation(B,z)}B=l.program.attributes;e.enableVertexAttribArray(B.position);B.color>=0&&e.enableVertexAttribArray(B.color);B.normal>=0&&e.enableVertexAttribArray(B.normal);
 B.tangent>=0&&e.enableVertexAttribArray(B.tangent);if(l.skinning&&B.skinVertexA>=0&&B.skinVertexB>=0&&B.skinIndex>=0&&B.skinWeight>=0){e.enableVertexAttribArray(B.skinVertexA);e.enableVertexAttribArray(B.skinVertexB);e.enableVertexAttribArray(B.skinIndex);e.enableVertexAttribArray(B.skinWeight)}if(l.morphTargets){l.numSupportedMorphTargets=0;if(B.morphTarget0>=0){e.enableVertexAttribArray(B.morphTarget0);l.numSupportedMorphTargets++}if(B.morphTarget1>=0){e.enableVertexAttribArray(B.morphTarget1);
 l.numSupportedMorphTargets++}if(B.morphTarget2>=0){e.enableVertexAttribArray(B.morphTarget2);l.numSupportedMorphTargets++}if(B.morphTarget3>=0){e.enableVertexAttribArray(B.morphTarget3);l.numSupportedMorphTargets++}if(B.morphTarget4>=0){e.enableVertexAttribArray(B.morphTarget4);l.numSupportedMorphTargets++}if(B.morphTarget5>=0){e.enableVertexAttribArray(B.morphTarget5);l.numSupportedMorphTargets++}if(B.morphTarget6>=0){e.enableVertexAttribArray(B.morphTarget6);l.numSupportedMorphTargets++}if(B.morphTarget7>=
-0){e.enableVertexAttribArray(B.morphTarget7);l.numSupportedMorphTargets++}m.__webGLMorphTargetInfluences=new Float32Array(this.maxMorphTargets);for(o=0;o<this.maxMorphTargets;o++)m.__webGLMorphTargetInfluences[o]=0}};this.render=function(l,z,p,m){var o,B,A,D,P,U,E,aa,ka=l.lights,na=l.fog;z.matrixAutoUpdate&&z.update();z.matrixWorldInverse.flattenToArray($);z.projectionMatrix.flattenToArray(ia);Aa.multiply(z.projectionMatrix,z.matrixWorldInverse);k(Aa);l.update(undefined,!1,z);this.initWebGLObjects(l);
-w(p);(this.autoClear||m)&&this.clear();P=l.__webglObjects.length;for(m=0;m<P;m++){o=l.__webglObjects[m];E=o.object;if(E.visible)if(!(E instanceof THREE.Mesh)||n(E)){E.matrixWorld.flattenToArray(E._objectMatrixArray);y(E,z);u(o);o.render=!0;if(this.sortObjects){qa.copy(E.position);Aa.multiplyVector3(qa);o.z=qa.z}}else o.render=!1;else o.render=!1}this.sortObjects&&l.__webglObjects.sort(t);U=l.__webglObjectsImmediate.length;for(m=0;m<U;m++){o=l.__webglObjectsImmediate[m];E=o.object;if(E.visible){E.matrixAutoUpdate&&
-E.matrixWorld.flattenToArray(E._objectMatrixArray);y(E,z);x(o)}}v(THREE.NormalBlending);for(m=0;m<P;m++){o=l.__webglObjects[m];if(o.render){E=o.object;aa=o.buffer;A=o.opaque;h(E);for(o=0;o<A.count;o++){D=A.list[o];j(D.depthTest);f(z,ka,na,D,aa,E)}}}for(m=0;m<U;m++){o=l.__webglObjectsImmediate[m];E=o.object;if(E.visible){A=o.opaque;h(E);for(o=0;o<A.count;o++){D=A.list[o];j(D.depthTest);B=d(z,ka,na,D,E);E.render(function(wa){g(wa,B)})}}}for(m=0;m<P;m++){o=l.__webglObjects[m];if(o.render){E=o.object;
-aa=o.buffer;A=o.transparent;h(E);for(o=0;o<A.count;o++){D=A.list[o];v(D.blending);j(D.depthTest);f(z,ka,na,D,aa,E)}}}for(m=0;m<U;m++){o=l.__webglObjectsImmediate[m];E=o.object;if(E.visible){A=o.transparent;h(E);for(o=0;o<A.count;o++){D=A.list[o];v(D.blending);j(D.depthTest);B=d(z,ka,na,D,E);E.render(function(wa){g(wa,B)})}}}if(p&&p.minFilter!==THREE.NearestFilter&&p.minFilter!==THREE.LinearFilter){e.bindTexture(e.TEXTURE_2D,p.__webGLTexture);e.generateMipmap(e.TEXTURE_2D);e.bindTexture(e.TEXTURE_2D,
+0){e.enableVertexAttribArray(B.morphTarget7);l.numSupportedMorphTargets++}m.__webGLMorphTargetInfluences=new Float32Array(this.maxMorphTargets);for(o=0;o<this.maxMorphTargets;o++)m.__webGLMorphTargetInfluences[o]=0}};this.render=function(l,z,p,m){var o,B,A,D,O,X,E,aa,ka=l.lights,na=l.fog;z.matrixAutoUpdate&&z.update();z.matrixWorldInverse.flattenToArray($);z.projectionMatrix.flattenToArray(ia);Aa.multiply(z.projectionMatrix,z.matrixWorldInverse);k(Aa);l.update(undefined,!1,z);this.initWebGLObjects(l);
+w(p);(this.autoClear||m)&&this.clear();O=l.__webglObjects.length;for(m=0;m<O;m++){o=l.__webglObjects[m];E=o.object;if(E.visible)if(!(E instanceof THREE.Mesh)||n(E)){E.matrixWorld.flattenToArray(E._objectMatrixArray);y(E,z);u(o);o.render=!0;if(this.sortObjects){qa.copy(E.position);Aa.multiplyVector3(qa);o.z=qa.z}}else o.render=!1;else o.render=!1}this.sortObjects&&l.__webglObjects.sort(t);X=l.__webglObjectsImmediate.length;for(m=0;m<X;m++){o=l.__webglObjectsImmediate[m];E=o.object;if(E.visible){E.matrixAutoUpdate&&
+E.matrixWorld.flattenToArray(E._objectMatrixArray);y(E,z);x(o)}}v(THREE.NormalBlending);for(m=0;m<O;m++){o=l.__webglObjects[m];if(o.render){E=o.object;aa=o.buffer;A=o.opaque;h(E);for(o=0;o<A.count;o++){D=A.list[o];j(D.depthTest);f(z,ka,na,D,aa,E)}}}for(m=0;m<X;m++){o=l.__webglObjectsImmediate[m];E=o.object;if(E.visible){A=o.opaque;h(E);for(o=0;o<A.count;o++){D=A.list[o];j(D.depthTest);B=d(z,ka,na,D,E);E.render(function(wa){g(wa,B)})}}}for(m=0;m<O;m++){o=l.__webglObjects[m];if(o.render){E=o.object;
+aa=o.buffer;A=o.transparent;h(E);for(o=0;o<A.count;o++){D=A.list[o];v(D.blending);j(D.depthTest);f(z,ka,na,D,aa,E)}}}for(m=0;m<X;m++){o=l.__webglObjectsImmediate[m];E=o.object;if(E.visible){A=o.transparent;h(E);for(o=0;o<A.count;o++){D=A.list[o];v(D.blending);j(D.depthTest);B=d(z,ka,na,D,E);E.render(function(wa){g(wa,B)})}}}if(p&&p.minFilter!==THREE.NearestFilter&&p.minFilter!==THREE.LinearFilter){e.bindTexture(e.TEXTURE_2D,p.__webGLTexture);e.generateMipmap(e.TEXTURE_2D);e.bindTexture(e.TEXTURE_2D,
 null)}};this.initWebGLObjects=function(l){if(!l.__webglObjects){l.__webglObjects=[];l.__webglObjectsImmediate=[]}for(;l.__objectsAdded.length;){var z=l.__objectsAdded[0],p=l,m=void 0,o=void 0,B=void 0;if(z._modelViewMatrix==undefined){z._modelViewMatrix=new THREE.Matrix4;z._normalMatrixArray=new Float32Array(9);z._modelViewMatrixArray=new Float32Array(16);z._objectMatrixArray=new Float32Array(16);z.matrixWorld.flattenToArray(z._objectMatrixArray)}if(z instanceof THREE.Mesh){o=z.geometry;o.geometryGroups==
 undefined&&C(o);for(m in o.geometryGroups){B=o.geometryGroups[m];if(!B.__webGLVertexBuffer){var A=B;A.__webGLVertexBuffer=e.createBuffer();A.__webGLNormalBuffer=e.createBuffer();A.__webGLTangentBuffer=e.createBuffer();A.__webGLColorBuffer=e.createBuffer();A.__webGLUVBuffer=e.createBuffer();A.__webGLUV2Buffer=e.createBuffer();A.__webGLSkinVertexABuffer=e.createBuffer();A.__webGLSkinVertexBBuffer=e.createBuffer();A.__webGLSkinIndicesBuffer=e.createBuffer();A.__webGLSkinWeightsBuffer=e.createBuffer();
-A.__webGLFaceBuffer=e.createBuffer();A.__webGLLineBuffer=e.createBuffer();if(A.numMorphTargets){var D=void 0,P=void 0;A.__webGLMorphTargetsBuffers=[];D=0;for(P=A.numMorphTargets;D<P;D++)A.__webGLMorphTargetsBuffers.push(e.createBuffer())}A=B;var U=z,E=void 0,aa=void 0,ka=P=D=0,na=U.geometry.faces,wa=A.faces;E=0;for(aa=wa.length;E<aa;E++){fi=wa[E];face=na[fi];if(face instanceof THREE.Face3){D+=3;P+=1;ka+=3}else if(face instanceof THREE.Face4){D+=4;P+=2;ka+=4}}A.__vertexArray=new Float32Array(D*3);
-A.__normalArray=new Float32Array(D*3);A.__tangentArray=new Float32Array(D*4);A.__colorArray=new Float32Array(D*3);A.__uvArray=new Float32Array(D*2);A.__uv2Array=new Float32Array(D*2);A.__skinVertexAArray=new Float32Array(D*4);A.__skinVertexBArray=new Float32Array(D*4);A.__skinIndexArray=new Float32Array(D*4);A.__skinWeightArray=new Float32Array(D*4);A.__faceArray=new Uint16Array(P*3);A.__lineArray=new Uint16Array(ka*2);aa=E=A;na=void 0;wa=void 0;var la=void 0,Ca=void 0;la=void 0;var Da=!1;na=0;for(wa=
-U.materials.length;na<wa;na++){la=U.materials[na];if(la instanceof THREE.MeshFaceMaterial){la=0;for(Ca=aa.materials.length;la<Ca;la++)if(aa.materials[la]&&aa.materials[la].shading!=undefined&&aa.materials[la].shading==THREE.SmoothShading){Da=!0;break}}else if(la&&la.shading!=undefined&&la.shading==THREE.SmoothShading){Da=!0;break}if(Da)break}E.__needsSmoothNormals=Da;A.__webGLFaceCount=P*3;A.__webGLLineCount=ka*2;if(A.numMorphTargets){P=void 0;ka=void 0;A.__morphTargetsArrays=[];P=0;for(ka=A.numMorphTargets;P<
-ka;P++)A.__morphTargetsArrays.push(new Float32Array(D*3))}o.__dirtyVertices=!0;o.__dirtyMorphTargets=!0;o.__dirtyElements=!0;o.__dirtyUvs=!0;o.__dirtyNormals=!0;o.__dirtyTangents=!0;o.__dirtyColors=!0}F(p.__webglObjects,B,z)}}else if(z instanceof THREE.Ribbon){o=z.geometry;if(!o.__webGLVertexBuffer){m=o;m.__webGLVertexBuffer=e.createBuffer();m.__webGLColorBuffer=e.createBuffer();m=o;B=m.vertices.length;m.__vertexArray=new Float32Array(B*3);m.__colorArray=new Float32Array(B*3);m.__webGLVertexCount=
+A.__webGLFaceBuffer=e.createBuffer();A.__webGLLineBuffer=e.createBuffer();if(A.numMorphTargets){var D=void 0,O=void 0;A.__webGLMorphTargetsBuffers=[];D=0;for(O=A.numMorphTargets;D<O;D++)A.__webGLMorphTargetsBuffers.push(e.createBuffer())}A=B;var X=z,E=void 0,aa=void 0,ka=O=D=0,na=X.geometry.faces,wa=A.faces;E=0;for(aa=wa.length;E<aa;E++){fi=wa[E];face=na[fi];if(face instanceof THREE.Face3){D+=3;O+=1;ka+=3}else if(face instanceof THREE.Face4){D+=4;O+=2;ka+=4}}A.__vertexArray=new Float32Array(D*3);
+A.__normalArray=new Float32Array(D*3);A.__tangentArray=new Float32Array(D*4);A.__colorArray=new Float32Array(D*3);A.__uvArray=new Float32Array(D*2);A.__uv2Array=new Float32Array(D*2);A.__skinVertexAArray=new Float32Array(D*4);A.__skinVertexBArray=new Float32Array(D*4);A.__skinIndexArray=new Float32Array(D*4);A.__skinWeightArray=new Float32Array(D*4);A.__faceArray=new Uint16Array(O*3);A.__lineArray=new Uint16Array(ka*2);aa=E=A;na=void 0;wa=void 0;var la=void 0,Ca=void 0;la=void 0;var Da=!1;na=0;for(wa=
+X.materials.length;na<wa;na++){la=X.materials[na];if(la instanceof THREE.MeshFaceMaterial){la=0;for(Ca=aa.materials.length;la<Ca;la++)if(aa.materials[la]&&aa.materials[la].shading!=undefined&&aa.materials[la].shading==THREE.SmoothShading){Da=!0;break}}else if(la&&la.shading!=undefined&&la.shading==THREE.SmoothShading){Da=!0;break}if(Da)break}E.__needsSmoothNormals=Da;A.__webGLFaceCount=O*3;A.__webGLLineCount=ka*2;if(A.numMorphTargets){O=void 0;ka=void 0;A.__morphTargetsArrays=[];O=0;for(ka=A.numMorphTargets;O<
+ka;O++)A.__morphTargetsArrays.push(new Float32Array(D*3))}o.__dirtyVertices=!0;o.__dirtyMorphTargets=!0;o.__dirtyElements=!0;o.__dirtyUvs=!0;o.__dirtyNormals=!0;o.__dirtyTangents=!0;o.__dirtyColors=!0}F(p.__webglObjects,B,z)}}else if(z instanceof THREE.Ribbon){o=z.geometry;if(!o.__webGLVertexBuffer){m=o;m.__webGLVertexBuffer=e.createBuffer();m.__webGLColorBuffer=e.createBuffer();m=o;B=m.vertices.length;m.__vertexArray=new Float32Array(B*3);m.__colorArray=new Float32Array(B*3);m.__webGLVertexCount=
 B;o.__dirtyVertices=!0;o.__dirtyColors=!0}F(p.__webglObjects,o,z)}else if(z instanceof THREE.Line){o=z.geometry;if(!o.__webGLVertexBuffer){m=o;m.__webGLVertexBuffer=e.createBuffer();m.__webGLColorBuffer=e.createBuffer();m=o;B=m.vertices.length;m.__vertexArray=new Float32Array(B*3);m.__colorArray=new Float32Array(B*3);m.__webGLLineCount=B;o.__dirtyVertices=!0;o.__dirtyColors=!0}F(p.__webglObjects,o,z)}else if(z instanceof THREE.ParticleSystem){o=z.geometry;if(!o.__webGLVertexBuffer){m=o;m.__webGLVertexBuffer=
 e.createBuffer();m.__webGLColorBuffer=e.createBuffer();m=o;B=m.vertices.length;m.__vertexArray=new Float32Array(B*3);m.__colorArray=new Float32Array(B*3);m.__sortArray=[];m.__webGLParticleCount=B;o.__dirtyVertices=!0;o.__dirtyColors=!0}F(p.__webglObjects,o,z)}else THREE.MarchingCubes!==undefined&&z instanceof THREE.MarchingCubes&&p.__webglObjectsImmediate.push({object:z,opaque:{list:[],count:0},transparent:{list:[],count:0}});l.__objectsAdded.splice(0,1)}for(;l.__objectsRemoved.length;){z=l.__objectsRemoved[0];
-p=l;o=void 0;m=void 0;for(o=p.__webglObjects.length-1;o>=0;o--){m=p.__webglObjects[o].object;z==m&&p.__webglObjects.splice(o,1)}l.__objectsRemoved.splice(0,1)}z=0;for(p=l.__webglObjects.length;z<p;z++){m=l.__webglObjects[z].object;B=void 0;o=void 0;A=void 0;if(m instanceof THREE.Mesh){o=m.geometry;for(B in o.geometryGroups){A=o.geometryGroups[B];if(o.__dirtyVertices||o.__dirtyMorphTargets||o.__dirtyElements||o.__dirtyUvs||o.__dirtyNormals||o.__dirtyColors||o.__dirtyTangents){D=e.DYNAMIC_DRAW;P=void 0;
-ka=void 0;var Pa=void 0,K=void 0,Na=void 0,Ia=void 0,Oa=void 0;Pa=void 0;var S=void 0,V=void 0,W=void 0,ya=void 0;S=void 0;V=void 0;W=void 0;K=void 0;S=void 0;V=void 0;W=void 0;ya=void 0;S=void 0;V=void 0;W=void 0;ya=void 0;S=void 0;V=void 0;W=void 0;ya=void 0;S=void 0;V=void 0;W=void 0;ya=void 0;S=void 0;V=void 0;W=void 0;ya=void 0;K=void 0;Ia=void 0;Na=void 0;Oa=void 0;var Ma=void 0,Fa=void 0,Ba=void 0,Ga=Ca=la=Da=wa=na=U=aa=E=0,H=0,Ja=0,Ha=A.__vertexArray,O=A.__uvArray,oa=A.__uv2Array,Z=A.__normalArray,
+p=l;o=void 0;m=void 0;for(o=p.__webglObjects.length-1;o>=0;o--){m=p.__webglObjects[o].object;z==m&&p.__webglObjects.splice(o,1)}l.__objectsRemoved.splice(0,1)}z=0;for(p=l.__webglObjects.length;z<p;z++){m=l.__webglObjects[z].object;B=void 0;o=void 0;A=void 0;if(m instanceof THREE.Mesh){o=m.geometry;for(B in o.geometryGroups){A=o.geometryGroups[B];if(o.__dirtyVertices||o.__dirtyMorphTargets||o.__dirtyElements||o.__dirtyUvs||o.__dirtyNormals||o.__dirtyColors||o.__dirtyTangents){D=e.DYNAMIC_DRAW;O=void 0;
+ka=void 0;var Pa=void 0,K=void 0,Na=void 0,Ia=void 0,Oa=void 0;Pa=void 0;var S=void 0,U=void 0,V=void 0,ya=void 0;S=void 0;U=void 0;V=void 0;K=void 0;S=void 0;U=void 0;V=void 0;ya=void 0;S=void 0;U=void 0;V=void 0;ya=void 0;S=void 0;U=void 0;V=void 0;ya=void 0;S=void 0;U=void 0;V=void 0;ya=void 0;S=void 0;U=void 0;V=void 0;ya=void 0;K=void 0;Ia=void 0;Na=void 0;Oa=void 0;var Ma=void 0,Fa=void 0,Ba=void 0,Ga=Ca=la=Da=wa=na=X=aa=E=0,H=0,Ja=0,Ha=A.__vertexArray,P=A.__uvArray,oa=A.__uv2Array,Z=A.__normalArray,
 J=A.__tangentArray,T=A.__colorArray,fa=A.__skinVertexAArray,pa=A.__skinVertexBArray,sa=A.__skinIndexArray,ua=A.__skinWeightArray,Ra=A.__morphTargetsArrays,La=A.__faceArray,Ka=A.__lineArray,Wa=A.__needsSmoothNormals,Ea=m.geometry,Sa=Ea.__dirtyVertices,ab=Ea.__dirtyElements,$a=Ea.__dirtyUvs,bb=Ea.__dirtyNormals,cb=Ea.__dirtyTangents,db=Ea.__dirtyColors,eb=Ea.__dirtyMorphTargets,Qa=Ea.vertices,fb=A.faces,gb=Ea.faces,hb=Ea.uvs,ib=Ea.uvs2,Ta=Ea.colors,Xa=Ea.skinVerticesA,Ya=Ea.skinVerticesB,Za=Ea.skinIndices,
-Va=Ea.skinWeights,Ua=Ea.morphTargets;P=0;for(ka=fb.length;P<ka;P++){Pa=fb[P];K=gb[Pa];Oa=hb[Pa];Pa=ib[Pa];Na=K.vertexNormals;Ia=K.normal;if(K instanceof THREE.Face3){if(Sa){S=Qa[K.a].position;V=Qa[K.b].position;W=Qa[K.c].position;Ha[aa]=S.x;Ha[aa+1]=S.y;Ha[aa+2]=S.z;Ha[aa+3]=V.x;Ha[aa+4]=V.y;Ha[aa+5]=V.z;Ha[aa+6]=W.x;Ha[aa+7]=W.y;Ha[aa+8]=W.z;aa+=9}if(eb){Ma=0;for(Fa=Ua.length;Ma<Fa;Ma++){S=Ua[Ma].vertices[K.a].position;V=Ua[Ma].vertices[K.b].position;W=Ua[Ma].vertices[K.c].position;Ba=Ra[Ma];Ba[Ja+
-0]=S.x;Ba[Ja+1]=S.y;Ba[Ja+2]=S.z;Ba[Ja+3]=V.x;Ba[Ja+4]=V.y;Ba[Ja+5]=V.z;Ba[Ja+6]=W.x;Ba[Ja+7]=W.y;Ba[Ja+8]=W.z}Ja+=9}if(Va.length){S=Va[K.a];V=Va[K.b];W=Va[K.c];ua[H]=S.x;ua[H+1]=S.y;ua[H+2]=S.z;ua[H+3]=S.w;ua[H+4]=V.x;ua[H+5]=V.y;ua[H+6]=V.z;ua[H+7]=V.w;ua[H+8]=W.x;ua[H+9]=W.y;ua[H+10]=W.z;ua[H+11]=W.w;S=Za[K.a];V=Za[K.b];W=Za[K.c];sa[H]=S.x;sa[H+1]=S.y;sa[H+2]=S.z;sa[H+3]=S.w;sa[H+4]=V.x;sa[H+5]=V.y;sa[H+6]=V.z;sa[H+7]=V.w;sa[H+8]=W.x;sa[H+9]=W.y;sa[H+10]=W.z;sa[H+11]=W.w;S=Xa[K.a];V=Xa[K.b];W=
-Xa[K.c];fa[H]=S.x;fa[H+1]=S.y;fa[H+2]=S.z;fa[H+3]=1;fa[H+4]=V.x;fa[H+5]=V.y;fa[H+6]=V.z;fa[H+7]=1;fa[H+8]=W.x;fa[H+9]=W.y;fa[H+10]=W.z;fa[H+11]=1;S=Ya[K.a];V=Ya[K.b];W=Ya[K.c];pa[H]=S.x;pa[H+1]=S.y;pa[H+2]=S.z;pa[H+3]=1;pa[H+4]=V.x;pa[H+5]=V.y;pa[H+6]=V.z;pa[H+7]=1;pa[H+8]=W.x;pa[H+9]=W.y;pa[H+10]=W.z;pa[H+11]=1;H+=12}if(db&&Ta.length){S=Ta[K.a];V=Ta[K.b];W=Ta[K.c];T[Ga]=S.r;T[Ga+1]=S.g;T[Ga+2]=S.b;T[Ga+3]=V.r;T[Ga+4]=V.g;T[Ga+5]=V.b;T[Ga+6]=W.r;T[Ga+7]=W.g;T[Ga+8]=W.b;Ga+=9}if(cb&&Ea.hasTangents){S=
-Qa[K.a].tangent;V=Qa[K.b].tangent;W=Qa[K.c].tangent;J[la]=S.x;J[la+1]=S.y;J[la+2]=S.z;J[la+3]=S.w;J[la+4]=V.x;J[la+5]=V.y;J[la+6]=V.z;J[la+7]=V.w;J[la+8]=W.x;J[la+9]=W.y;J[la+10]=W.z;J[la+11]=W.w;la+=12}if(bb)if(Na.length==3&&Wa)for(K=0;K<3;K++){Ia=Na[K];Z[Da]=Ia.x;Z[Da+1]=Ia.y;Z[Da+2]=Ia.z;Da+=3}else for(K=0;K<3;K++){Z[Da]=Ia.x;Z[Da+1]=Ia.y;Z[Da+2]=Ia.z;Da+=3}if($a&&Oa)for(K=0;K<3;K++){Na=Oa[K];O[U]=Na.u;O[U+1]=Na.v;U+=2}if($a&&Pa)for(K=0;K<3;K++){Oa=Pa[K];oa[na]=Oa.u;oa[na+1]=Oa.v;na+=2}if(ab){La[wa]=
-E;La[wa+1]=E+1;La[wa+2]=E+2;wa+=3;Ka[Ca]=E;Ka[Ca+1]=E+1;Ka[Ca+2]=E;Ka[Ca+3]=E+2;Ka[Ca+4]=E+1;Ka[Ca+5]=E+2;Ca+=6;E+=3}}else if(K instanceof THREE.Face4){if(Sa){S=Qa[K.a].position;V=Qa[K.b].position;W=Qa[K.c].position;ya=Qa[K.d].position;Ha[aa]=S.x;Ha[aa+1]=S.y;Ha[aa+2]=S.z;Ha[aa+3]=V.x;Ha[aa+4]=V.y;Ha[aa+5]=V.z;Ha[aa+6]=W.x;Ha[aa+7]=W.y;Ha[aa+8]=W.z;Ha[aa+9]=ya.x;Ha[aa+10]=ya.y;Ha[aa+11]=ya.z;aa+=12}if(eb){Ma=0;for(Fa=Ua.length;Ma<Fa;Ma++){S=Ua[Ma].vertices[K.a].position;V=Ua[Ma].vertices[K.b].position;
-W=Ua[Ma].vertices[K.c].position;ya=Ua[Ma].vertices[K.d].position;Ba=Ra[Ma];Ba[Ja+0]=S.x;Ba[Ja+1]=S.y;Ba[Ja+2]=S.z;Ba[Ja+3]=V.x;Ba[Ja+4]=V.y;Ba[Ja+5]=V.z;Ba[Ja+6]=W.x;Ba[Ja+7]=W.y;Ba[Ja+8]=W.z;Ba[Ja+9]=ya.x;Ba[Ja+10]=ya.y;Ba[Ja+11]=ya.z}Ja+=12}if(Va.length){S=Va[K.a];V=Va[K.b];W=Va[K.c];ya=Va[K.d];ua[H]=S.x;ua[H+1]=S.y;ua[H+2]=S.z;ua[H+3]=S.w;ua[H+4]=V.x;ua[H+5]=V.y;ua[H+6]=V.z;ua[H+7]=V.w;ua[H+8]=W.x;ua[H+9]=W.y;ua[H+10]=W.z;ua[H+11]=W.w;ua[H+12]=ya.x;ua[H+13]=ya.y;ua[H+14]=ya.z;ua[H+15]=ya.w;S=Za[K.a];
-V=Za[K.b];W=Za[K.c];ya=Za[K.d];sa[H]=S.x;sa[H+1]=S.y;sa[H+2]=S.z;sa[H+3]=S.w;sa[H+4]=V.x;sa[H+5]=V.y;sa[H+6]=V.z;sa[H+7]=V.w;sa[H+8]=W.x;sa[H+9]=W.y;sa[H+10]=W.z;sa[H+11]=W.w;sa[H+12]=ya.x;sa[H+13]=ya.y;sa[H+14]=ya.z;sa[H+15]=ya.w;S=Xa[K.a];V=Xa[K.b];W=Xa[K.c];ya=Xa[K.d];fa[H]=S.x;fa[H+1]=S.y;fa[H+2]=S.z;fa[H+3]=1;fa[H+4]=V.x;fa[H+5]=V.y;fa[H+6]=V.z;fa[H+7]=1;fa[H+8]=W.x;fa[H+9]=W.y;fa[H+10]=W.z;fa[H+11]=1;fa[H+12]=ya.x;fa[H+13]=ya.y;fa[H+14]=ya.z;fa[H+15]=1;S=Ya[K.a];V=Ya[K.b];W=Ya[K.c];ya=Ya[K.d];
-pa[H]=S.x;pa[H+1]=S.y;pa[H+2]=S.z;pa[H+3]=1;pa[H+4]=V.x;pa[H+5]=V.y;pa[H+6]=V.z;pa[H+7]=1;pa[H+8]=W.x;pa[H+9]=W.y;pa[H+10]=W.z;pa[H+11]=1;pa[H+12]=ya.x;pa[H+13]=ya.y;pa[H+14]=ya.z;pa[H+15]=1;H+=16}if(db&&Ta.length){S=Ta[K.a];V=Ta[K.b];W=Ta[K.c];ya=Ta[K.d];T[Ga]=S.r;T[Ga+1]=S.g;T[Ga+2]=S.b;T[Ga+3]=V.r;T[Ga+4]=V.g;T[Ga+5]=V.b;T[Ga+6]=W.r;T[Ga+7]=W.g;T[Ga+8]=W.b;T[Ga+9]=ya.r;T[Ga+10]=ya.g;T[Ga+11]=ya.b;Ga+=12}if(cb&&Ea.hasTangents){S=Qa[K.a].tangent;V=Qa[K.b].tangent;W=Qa[K.c].tangent;K=Qa[K.d].tangent;
-J[la]=S.x;J[la+1]=S.y;J[la+2]=S.z;J[la+3]=S.w;J[la+4]=V.x;J[la+5]=V.y;J[la+6]=V.z;J[la+7]=V.w;J[la+8]=W.x;J[la+9]=W.y;J[la+10]=W.z;J[la+11]=W.w;J[la+12]=K.x;J[la+13]=K.y;J[la+14]=K.z;J[la+15]=K.w;la+=16}if(bb)if(Na.length==4&&Wa)for(K=0;K<4;K++){Ia=Na[K];Z[Da]=Ia.x;Z[Da+1]=Ia.y;Z[Da+2]=Ia.z;Da+=3}else for(K=0;K<4;K++){Z[Da]=Ia.x;Z[Da+1]=Ia.y;Z[Da+2]=Ia.z;Da+=3}if($a&&Oa)for(K=0;K<4;K++){Na=Oa[K];O[U]=Na.u;O[U+1]=Na.v;U+=2}if($a&&Pa)for(K=0;K<4;K++){Oa=Pa[K];oa[na]=Oa.u;oa[na+1]=Oa.v;na+=2}if(ab){La[wa]=
+Va=Ea.skinWeights,Ua=Ea.morphTargets;O=0;for(ka=fb.length;O<ka;O++){Pa=fb[O];K=gb[Pa];Oa=hb[Pa];Pa=ib[Pa];Na=K.vertexNormals;Ia=K.normal;if(K instanceof THREE.Face3){if(Sa){S=Qa[K.a].position;U=Qa[K.b].position;V=Qa[K.c].position;Ha[aa]=S.x;Ha[aa+1]=S.y;Ha[aa+2]=S.z;Ha[aa+3]=U.x;Ha[aa+4]=U.y;Ha[aa+5]=U.z;Ha[aa+6]=V.x;Ha[aa+7]=V.y;Ha[aa+8]=V.z;aa+=9}if(eb){Ma=0;for(Fa=Ua.length;Ma<Fa;Ma++){S=Ua[Ma].vertices[K.a].position;U=Ua[Ma].vertices[K.b].position;V=Ua[Ma].vertices[K.c].position;Ba=Ra[Ma];Ba[Ja+
+0]=S.x;Ba[Ja+1]=S.y;Ba[Ja+2]=S.z;Ba[Ja+3]=U.x;Ba[Ja+4]=U.y;Ba[Ja+5]=U.z;Ba[Ja+6]=V.x;Ba[Ja+7]=V.y;Ba[Ja+8]=V.z}Ja+=9}if(Va.length){S=Va[K.a];U=Va[K.b];V=Va[K.c];ua[H]=S.x;ua[H+1]=S.y;ua[H+2]=S.z;ua[H+3]=S.w;ua[H+4]=U.x;ua[H+5]=U.y;ua[H+6]=U.z;ua[H+7]=U.w;ua[H+8]=V.x;ua[H+9]=V.y;ua[H+10]=V.z;ua[H+11]=V.w;S=Za[K.a];U=Za[K.b];V=Za[K.c];sa[H]=S.x;sa[H+1]=S.y;sa[H+2]=S.z;sa[H+3]=S.w;sa[H+4]=U.x;sa[H+5]=U.y;sa[H+6]=U.z;sa[H+7]=U.w;sa[H+8]=V.x;sa[H+9]=V.y;sa[H+10]=V.z;sa[H+11]=V.w;S=Xa[K.a];U=Xa[K.b];V=
+Xa[K.c];fa[H]=S.x;fa[H+1]=S.y;fa[H+2]=S.z;fa[H+3]=1;fa[H+4]=U.x;fa[H+5]=U.y;fa[H+6]=U.z;fa[H+7]=1;fa[H+8]=V.x;fa[H+9]=V.y;fa[H+10]=V.z;fa[H+11]=1;S=Ya[K.a];U=Ya[K.b];V=Ya[K.c];pa[H]=S.x;pa[H+1]=S.y;pa[H+2]=S.z;pa[H+3]=1;pa[H+4]=U.x;pa[H+5]=U.y;pa[H+6]=U.z;pa[H+7]=1;pa[H+8]=V.x;pa[H+9]=V.y;pa[H+10]=V.z;pa[H+11]=1;H+=12}if(db&&Ta.length){S=Ta[K.a];U=Ta[K.b];V=Ta[K.c];T[Ga]=S.r;T[Ga+1]=S.g;T[Ga+2]=S.b;T[Ga+3]=U.r;T[Ga+4]=U.g;T[Ga+5]=U.b;T[Ga+6]=V.r;T[Ga+7]=V.g;T[Ga+8]=V.b;Ga+=9}if(cb&&Ea.hasTangents){S=
+Qa[K.a].tangent;U=Qa[K.b].tangent;V=Qa[K.c].tangent;J[la]=S.x;J[la+1]=S.y;J[la+2]=S.z;J[la+3]=S.w;J[la+4]=U.x;J[la+5]=U.y;J[la+6]=U.z;J[la+7]=U.w;J[la+8]=V.x;J[la+9]=V.y;J[la+10]=V.z;J[la+11]=V.w;la+=12}if(bb)if(Na.length==3&&Wa)for(K=0;K<3;K++){Ia=Na[K];Z[Da]=Ia.x;Z[Da+1]=Ia.y;Z[Da+2]=Ia.z;Da+=3}else for(K=0;K<3;K++){Z[Da]=Ia.x;Z[Da+1]=Ia.y;Z[Da+2]=Ia.z;Da+=3}if($a&&Oa)for(K=0;K<3;K++){Na=Oa[K];P[X]=Na.u;P[X+1]=Na.v;X+=2}if($a&&Pa)for(K=0;K<3;K++){Oa=Pa[K];oa[na]=Oa.u;oa[na+1]=Oa.v;na+=2}if(ab){La[wa]=
+E;La[wa+1]=E+1;La[wa+2]=E+2;wa+=3;Ka[Ca]=E;Ka[Ca+1]=E+1;Ka[Ca+2]=E;Ka[Ca+3]=E+2;Ka[Ca+4]=E+1;Ka[Ca+5]=E+2;Ca+=6;E+=3}}else if(K instanceof THREE.Face4){if(Sa){S=Qa[K.a].position;U=Qa[K.b].position;V=Qa[K.c].position;ya=Qa[K.d].position;Ha[aa]=S.x;Ha[aa+1]=S.y;Ha[aa+2]=S.z;Ha[aa+3]=U.x;Ha[aa+4]=U.y;Ha[aa+5]=U.z;Ha[aa+6]=V.x;Ha[aa+7]=V.y;Ha[aa+8]=V.z;Ha[aa+9]=ya.x;Ha[aa+10]=ya.y;Ha[aa+11]=ya.z;aa+=12}if(eb){Ma=0;for(Fa=Ua.length;Ma<Fa;Ma++){S=Ua[Ma].vertices[K.a].position;U=Ua[Ma].vertices[K.b].position;
+V=Ua[Ma].vertices[K.c].position;ya=Ua[Ma].vertices[K.d].position;Ba=Ra[Ma];Ba[Ja+0]=S.x;Ba[Ja+1]=S.y;Ba[Ja+2]=S.z;Ba[Ja+3]=U.x;Ba[Ja+4]=U.y;Ba[Ja+5]=U.z;Ba[Ja+6]=V.x;Ba[Ja+7]=V.y;Ba[Ja+8]=V.z;Ba[Ja+9]=ya.x;Ba[Ja+10]=ya.y;Ba[Ja+11]=ya.z}Ja+=12}if(Va.length){S=Va[K.a];U=Va[K.b];V=Va[K.c];ya=Va[K.d];ua[H]=S.x;ua[H+1]=S.y;ua[H+2]=S.z;ua[H+3]=S.w;ua[H+4]=U.x;ua[H+5]=U.y;ua[H+6]=U.z;ua[H+7]=U.w;ua[H+8]=V.x;ua[H+9]=V.y;ua[H+10]=V.z;ua[H+11]=V.w;ua[H+12]=ya.x;ua[H+13]=ya.y;ua[H+14]=ya.z;ua[H+15]=ya.w;S=Za[K.a];
+U=Za[K.b];V=Za[K.c];ya=Za[K.d];sa[H]=S.x;sa[H+1]=S.y;sa[H+2]=S.z;sa[H+3]=S.w;sa[H+4]=U.x;sa[H+5]=U.y;sa[H+6]=U.z;sa[H+7]=U.w;sa[H+8]=V.x;sa[H+9]=V.y;sa[H+10]=V.z;sa[H+11]=V.w;sa[H+12]=ya.x;sa[H+13]=ya.y;sa[H+14]=ya.z;sa[H+15]=ya.w;S=Xa[K.a];U=Xa[K.b];V=Xa[K.c];ya=Xa[K.d];fa[H]=S.x;fa[H+1]=S.y;fa[H+2]=S.z;fa[H+3]=1;fa[H+4]=U.x;fa[H+5]=U.y;fa[H+6]=U.z;fa[H+7]=1;fa[H+8]=V.x;fa[H+9]=V.y;fa[H+10]=V.z;fa[H+11]=1;fa[H+12]=ya.x;fa[H+13]=ya.y;fa[H+14]=ya.z;fa[H+15]=1;S=Ya[K.a];U=Ya[K.b];V=Ya[K.c];ya=Ya[K.d];
+pa[H]=S.x;pa[H+1]=S.y;pa[H+2]=S.z;pa[H+3]=1;pa[H+4]=U.x;pa[H+5]=U.y;pa[H+6]=U.z;pa[H+7]=1;pa[H+8]=V.x;pa[H+9]=V.y;pa[H+10]=V.z;pa[H+11]=1;pa[H+12]=ya.x;pa[H+13]=ya.y;pa[H+14]=ya.z;pa[H+15]=1;H+=16}if(db&&Ta.length){S=Ta[K.a];U=Ta[K.b];V=Ta[K.c];ya=Ta[K.d];T[Ga]=S.r;T[Ga+1]=S.g;T[Ga+2]=S.b;T[Ga+3]=U.r;T[Ga+4]=U.g;T[Ga+5]=U.b;T[Ga+6]=V.r;T[Ga+7]=V.g;T[Ga+8]=V.b;T[Ga+9]=ya.r;T[Ga+10]=ya.g;T[Ga+11]=ya.b;Ga+=12}if(cb&&Ea.hasTangents){S=Qa[K.a].tangent;U=Qa[K.b].tangent;V=Qa[K.c].tangent;K=Qa[K.d].tangent;
+J[la]=S.x;J[la+1]=S.y;J[la+2]=S.z;J[la+3]=S.w;J[la+4]=U.x;J[la+5]=U.y;J[la+6]=U.z;J[la+7]=U.w;J[la+8]=V.x;J[la+9]=V.y;J[la+10]=V.z;J[la+11]=V.w;J[la+12]=K.x;J[la+13]=K.y;J[la+14]=K.z;J[la+15]=K.w;la+=16}if(bb)if(Na.length==4&&Wa)for(K=0;K<4;K++){Ia=Na[K];Z[Da]=Ia.x;Z[Da+1]=Ia.y;Z[Da+2]=Ia.z;Da+=3}else for(K=0;K<4;K++){Z[Da]=Ia.x;Z[Da+1]=Ia.y;Z[Da+2]=Ia.z;Da+=3}if($a&&Oa)for(K=0;K<4;K++){Na=Oa[K];P[X]=Na.u;P[X+1]=Na.v;X+=2}if($a&&Pa)for(K=0;K<4;K++){Oa=Pa[K];oa[na]=Oa.u;oa[na+1]=Oa.v;na+=2}if(ab){La[wa]=
 E;La[wa+1]=E+1;La[wa+2]=E+2;La[wa+3]=E;La[wa+4]=E+2;La[wa+5]=E+3;wa+=6;Ka[Ca]=E;Ka[Ca+1]=E+1;Ka[Ca+2]=E;Ka[Ca+3]=E+3;Ka[Ca+4]=E+1;Ka[Ca+5]=E+2;Ka[Ca+6]=E+2;Ka[Ca+7]=E+3;Ca+=8;E+=4}}}if(Sa){e.bindBuffer(e.ARRAY_BUFFER,A.__webGLVertexBuffer);e.bufferData(e.ARRAY_BUFFER,Ha,D)}if(eb){Ma=0;for(Fa=Ua.length;Ma<Fa;Ma++){e.bindBuffer(e.ARRAY_BUFFER,A.__webGLMorphTargetsBuffers[Ma]);e.bufferData(e.ARRAY_BUFFER,Ra[Ma],D)}}if(db&&Ta.length){e.bindBuffer(e.ARRAY_BUFFER,A.__webGLColorBuffer);e.bufferData(e.ARRAY_BUFFER,
-T,D)}if(bb){e.bindBuffer(e.ARRAY_BUFFER,A.__webGLNormalBuffer);e.bufferData(e.ARRAY_BUFFER,Z,D)}if(cb&&Ea.hasTangents){e.bindBuffer(e.ARRAY_BUFFER,A.__webGLTangentBuffer);e.bufferData(e.ARRAY_BUFFER,J,D)}if($a&&U>0){e.bindBuffer(e.ARRAY_BUFFER,A.__webGLUVBuffer);e.bufferData(e.ARRAY_BUFFER,O,D)}if($a&&na>0){e.bindBuffer(e.ARRAY_BUFFER,A.__webGLUV2Buffer);e.bufferData(e.ARRAY_BUFFER,oa,D)}if(ab){e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,A.__webGLFaceBuffer);e.bufferData(e.ELEMENT_ARRAY_BUFFER,La,D);e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,
+T,D)}if(bb){e.bindBuffer(e.ARRAY_BUFFER,A.__webGLNormalBuffer);e.bufferData(e.ARRAY_BUFFER,Z,D)}if(cb&&Ea.hasTangents){e.bindBuffer(e.ARRAY_BUFFER,A.__webGLTangentBuffer);e.bufferData(e.ARRAY_BUFFER,J,D)}if($a&&X>0){e.bindBuffer(e.ARRAY_BUFFER,A.__webGLUVBuffer);e.bufferData(e.ARRAY_BUFFER,P,D)}if($a&&na>0){e.bindBuffer(e.ARRAY_BUFFER,A.__webGLUV2Buffer);e.bufferData(e.ARRAY_BUFFER,oa,D)}if(ab){e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,A.__webGLFaceBuffer);e.bufferData(e.ELEMENT_ARRAY_BUFFER,La,D);e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,
 A.__webGLLineBuffer);e.bufferData(e.ELEMENT_ARRAY_BUFFER,Ka,D)}if(H>0){e.bindBuffer(e.ARRAY_BUFFER,A.__webGLSkinVertexABuffer);e.bufferData(e.ARRAY_BUFFER,fa,D);e.bindBuffer(e.ARRAY_BUFFER,A.__webGLSkinVertexBBuffer);e.bufferData(e.ARRAY_BUFFER,pa,D);e.bindBuffer(e.ARRAY_BUFFER,A.__webGLSkinIndicesBuffer);e.bufferData(e.ARRAY_BUFFER,sa,D);e.bindBuffer(e.ARRAY_BUFFER,A.__webGLSkinWeightsBuffer);e.bufferData(e.ARRAY_BUFFER,ua,D)}}}o.__dirtyVertices=!1;o.__dirtyMorphTargets=!1;o.__dirtyElements=!1;o.__dirtyUvs=
-!1;o.__dirtyNormals=!1;o.__dirtyTangents=!1;o.__dirtyColors=!1}else if(m instanceof THREE.Ribbon){o=m.geometry;if(o.__dirtyVertices||o.__dirtyColors){m=o;B=e.DYNAMIC_DRAW;E=void 0;E=void 0;aa=void 0;A=void 0;U=m.vertices;D=m.colors;na=U.length;P=D.length;wa=m.__vertexArray;ka=m.__colorArray;Da=m.__dirtyColors;if(m.__dirtyVertices){for(E=0;E<na;E++){aa=U[E].position;A=E*3;wa[A]=aa.x;wa[A+1]=aa.y;wa[A+2]=aa.z}e.bindBuffer(e.ARRAY_BUFFER,m.__webGLVertexBuffer);e.bufferData(e.ARRAY_BUFFER,wa,B)}if(Da){for(E=
-0;E<P;E++){color=D[E];A=E*3;ka[A]=color.r;ka[A+1]=color.g;ka[A+2]=color.b}e.bindBuffer(e.ARRAY_BUFFER,m.__webGLColorBuffer);e.bufferData(e.ARRAY_BUFFER,ka,B)}}o.__dirtyVertices=!1;o.__dirtyColors=!1}else if(m instanceof THREE.Line){o=m.geometry;if(o.__dirtyVertices||o.__dirtyColors){m=o;B=e.DYNAMIC_DRAW;E=void 0;E=void 0;aa=void 0;A=void 0;U=m.vertices;D=m.colors;na=U.length;P=D.length;wa=m.__vertexArray;ka=m.__colorArray;Da=m.__dirtyColors;if(m.__dirtyVertices){for(E=0;E<na;E++){aa=U[E].position;
-A=E*3;wa[A]=aa.x;wa[A+1]=aa.y;wa[A+2]=aa.z}e.bindBuffer(e.ARRAY_BUFFER,m.__webGLVertexBuffer);e.bufferData(e.ARRAY_BUFFER,wa,B)}if(Da){for(E=0;E<P;E++){color=D[E];A=E*3;ka[A]=color.r;ka[A+1]=color.g;ka[A+2]=color.b}e.bindBuffer(e.ARRAY_BUFFER,m.__webGLColorBuffer);e.bufferData(e.ARRAY_BUFFER,ka,B)}}o.__dirtyVertices=!1;o.__dirtyColors=!1}else if(m instanceof THREE.ParticleSystem){o=m.geometry;(o.__dirtyVertices||o.__dirtyColors||m.sortParticles)&&c(o,e.DYNAMIC_DRAW,m);o.__dirtyVertices=!1;o.__dirtyColors=
+!1;o.__dirtyNormals=!1;o.__dirtyTangents=!1;o.__dirtyColors=!1}else if(m instanceof THREE.Ribbon){o=m.geometry;if(o.__dirtyVertices||o.__dirtyColors){m=o;B=e.DYNAMIC_DRAW;E=void 0;E=void 0;aa=void 0;A=void 0;X=m.vertices;D=m.colors;na=X.length;O=D.length;wa=m.__vertexArray;ka=m.__colorArray;Da=m.__dirtyColors;if(m.__dirtyVertices){for(E=0;E<na;E++){aa=X[E].position;A=E*3;wa[A]=aa.x;wa[A+1]=aa.y;wa[A+2]=aa.z}e.bindBuffer(e.ARRAY_BUFFER,m.__webGLVertexBuffer);e.bufferData(e.ARRAY_BUFFER,wa,B)}if(Da){for(E=
+0;E<O;E++){color=D[E];A=E*3;ka[A]=color.r;ka[A+1]=color.g;ka[A+2]=color.b}e.bindBuffer(e.ARRAY_BUFFER,m.__webGLColorBuffer);e.bufferData(e.ARRAY_BUFFER,ka,B)}}o.__dirtyVertices=!1;o.__dirtyColors=!1}else if(m instanceof THREE.Line){o=m.geometry;if(o.__dirtyVertices||o.__dirtyColors){m=o;B=e.DYNAMIC_DRAW;E=void 0;E=void 0;aa=void 0;A=void 0;X=m.vertices;D=m.colors;na=X.length;O=D.length;wa=m.__vertexArray;ka=m.__colorArray;Da=m.__dirtyColors;if(m.__dirtyVertices){for(E=0;E<na;E++){aa=X[E].position;
+A=E*3;wa[A]=aa.x;wa[A+1]=aa.y;wa[A+2]=aa.z}e.bindBuffer(e.ARRAY_BUFFER,m.__webGLVertexBuffer);e.bufferData(e.ARRAY_BUFFER,wa,B)}if(Da){for(E=0;E<O;E++){color=D[E];A=E*3;ka[A]=color.r;ka[A+1]=color.g;ka[A+2]=color.b}e.bindBuffer(e.ARRAY_BUFFER,m.__webGLColorBuffer);e.bufferData(e.ARRAY_BUFFER,ka,B)}}o.__dirtyVertices=!1;o.__dirtyColors=!1}else if(m instanceof THREE.ParticleSystem){o=m.geometry;(o.__dirtyVertices||o.__dirtyColors||m.sortParticles)&&c(o,e.DYNAMIC_DRAW,m);o.__dirtyVertices=!1;o.__dirtyColors=
 !1}}};this.setFaceCulling=function(l,z){if(l){!z||z=="ccw"?e.frontFace(e.CCW):e.frontFace(e.CW);if(l=="back")e.cullFace(e.BACK);else l=="front"?e.cullFace(e.FRONT):e.cullFace(e.FRONT_AND_BACK);e.enable(e.CULL_FACE)}else e.disable(e.CULL_FACE)};this.supportsVertexTextures=function(){return e.getParameter(e.MAX_VERTEX_TEXTURE_IMAGE_UNITS)>0}};
 THREE.Snippets={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 int combine;\n#endif",envmap_fragment:"#ifdef USE_ENVMAP\nvec4 cubeColor = textureCube( envMap, vec3( -vReflect.x, vReflect.yz ) );\nif ( combine == 1 ) {\ngl_FragColor = vec4( mix( gl_FragColor.xyz, cubeColor.xyz, reflectivity ), opacity );\n} else {\ngl_FragColor = gl_FragColor * cubeColor;\n}\n#endif",envmap_pars_vertex:"#ifdef USE_ENVMAP\nvarying vec3 vReflect;\nuniform float refractionRatio;\nuniform bool useRefract;\n#endif",
@@ -295,7 +295,7 @@ lightmap_fragment:"#ifdef USE_LIGHTMAP\ngl_FragColor = gl_FragColor * texture2D(
 lights_vertex:"if ( !enableLighting ) {\nvLightWeighting = vec3( 1.0 );\n} else {\nvLightWeighting = ambientLightColor;\n#if MAX_DIR_LIGHTS > 0\nfor( int i = 0; i < MAX_DIR_LIGHTS; i++ ) {\nvec4 lDirection = viewMatrix * vec4( directionalLightDirection[ i ], 0.0 );\nfloat directionalLightWeighting = max( dot( transformedNormal, normalize( lDirection.xyz ) ), 0.0 );\nvLightWeighting += directionalLightColor[ i ] * directionalLightWeighting;\n}\n#endif\n#if MAX_POINT_LIGHTS > 0\nfor( int i = 0; i < MAX_POINT_LIGHTS; i++ ) {\nvec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );\nvec3 pointLightVector = normalize( lPosition.xyz - mvPosition.xyz );\nfloat pointLightWeighting = max( dot( transformedNormal, pointLightVector ), 0.0 );\nvLightWeighting += pointLightColor[ i ] * pointLightWeighting;\n#ifdef PHONG\nvPointLightVector[ i ] = pointLightVector;\n#endif\n}\n#endif\n}",
 lights_pars_fragment:"#if MAX_DIR_LIGHTS > 0\nuniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];\n#endif\n#if MAX_POINT_LIGHTS > 0\nvarying vec3 vPointLightVector[ MAX_POINT_LIGHTS ];\n#endif\nvarying vec3 vViewPosition;\nvarying vec3 vNormal;",lights_fragment:"vec3 normal = normalize( vNormal );\nvec3 viewPosition = normalize( vViewPosition );\nvec4 mColor = vec4( diffuse, opacity );\nvec4 mSpecular = vec4( specular, opacity );\n#if MAX_POINT_LIGHTS > 0\nvec4 pointDiffuse  = vec4( 0.0 );\nvec4 pointSpecular = vec4( 0.0 );\nfor( int i = 0; i < MAX_POINT_LIGHTS; i++ ) {\nvec3 pointVector = normalize( vPointLightVector[ i ] );\nvec3 pointHalfVector = normalize( vPointLightVector[ i ] + vViewPosition );\nfloat pointDotNormalHalf = dot( normal, pointHalfVector );\nfloat pointDiffuseWeight = max( dot( normal, pointVector ), 0.0 );\nfloat pointSpecularWeight = 0.0;\nif ( pointDotNormalHalf >= 0.0 )\npointSpecularWeight = pow( pointDotNormalHalf, shininess );\npointDiffuse  += mColor * pointDiffuseWeight;\npointSpecular += mSpecular * pointSpecularWeight;\n}\n#endif\n#if MAX_DIR_LIGHTS > 0\nvec4 dirDiffuse  = vec4( 0.0 );\nvec4 dirSpecular = vec4( 0.0 );\nfor( int i = 0; i < MAX_DIR_LIGHTS; i++ ) {\nvec4 lDirection = viewMatrix * vec4( directionalLightDirection[ i ], 0.0 );\nvec3 dirVector = normalize( lDirection.xyz );\nvec3 dirHalfVector = normalize( lDirection.xyz + vViewPosition );\nfloat dirDotNormalHalf = dot( normal, dirHalfVector );\nfloat dirDiffuseWeight = max( dot( normal, dirVector ), 0.0 );\nfloat dirSpecularWeight = 0.0;\nif ( dirDotNormalHalf >= 0.0 )\ndirSpecularWeight = pow( dirDotNormalHalf, shininess );\ndirDiffuse  += mColor * dirDiffuseWeight;\ndirSpecular += mSpecular * dirSpecularWeight;\n}\n#endif\nvec4 totalLight = vec4( ambient, opacity );\n#if MAX_DIR_LIGHTS > 0\ntotalLight += dirDiffuse + dirSpecular;\n#endif\n#if MAX_POINT_LIGHTS > 0\ntotalLight += pointDiffuse + pointSpecular;\n#endif\ngl_FragColor = gl_FragColor * totalLight;",
 color_pars_fragment:"#ifdef USE_COLOR\nvarying vec3 vColor;\n#endif",color_fragment:"#ifdef USE_COLOR\ngl_FragColor = gl_FragColor * vec4( vColor, opacity );\n#endif",color_pars_vertex:"#ifdef USE_COLOR\nvarying vec3 vColor;\n#endif",color_vertex:"#ifdef USE_COLOR\nvColor = color;\n#endif",skinning_pars_vertex:"#ifdef USE_SKINNING\nuniform mat4 boneGlobalMatrices[ MAX_BONES ];\n#endif",skinning_vertex:"#ifdef USE_SKINNING\ngl_Position  = ( boneGlobalMatrices[ int( skinIndex.x ) ] * skinVertexA ) * skinWeight.x;\ngl_Position += ( boneGlobalMatrices[ int( skinIndex.y ) ] * skinVertexB ) * skinWeight.y;\ngl_Position  = projectionMatrix * viewMatrix * objectMatrix * gl_Position;\n#else\ngl_Position = projectionMatrix * mvPosition;\n#endif",
-morphtarget_pars_vertex:"#ifdef USE_MORPHTARGETS\nuniform float morphTargetInfluences[8];\n#endif",morphtarget_vertex:"#ifdef USE_MORPHTARGETS\nvec3 morphed = vec3( 0, 0, 0 );\nmorphed += ( morphTarget0 - position ) * morphTargetInfluences[ 0 ];\nmorphed += ( morphTarget1 - position ) * morphTargetInfluences[ 1 ];\nmorphed += ( morphTarget2 - position ) * morphTargetInfluences[ 2 ];\nmorphed += ( morphTarget3 - position ) * morphTargetInfluences[ 3 ];\nmorphed *= 0.25;\nmorphed += position;\ngl_Position = projectionMatrix * modelViewMatrix * vec4( morphed, 1.0 );\n#else\ngl_Position = projectionMatrix * mvPosition;\n#endif"};
+morphtarget_pars_vertex:"#ifdef USE_MORPHTARGETS\nuniform float morphTargetInfluences[8];\n#endif",morphtarget_vertex:"#ifdef USE_MORPHTARGETS\nvec3 morphed = vec3( 0, 0, 0 );\nmorphed += ( morphTarget0 - position ) * morphTargetInfluences[ 0 ];\nmorphed += ( morphTarget1 - position ) * morphTargetInfluences[ 1 ];\nmorphed += ( morphTarget2 - position ) * morphTargetInfluences[ 2 ];\nmorphed += ( morphTarget3 - position ) * morphTargetInfluences[ 3 ];\nmorphed += ( morphTarget4 - position ) * morphTargetInfluences[ 4 ];\nmorphed += ( morphTarget5 - position ) * morphTargetInfluences[ 5 ];\nmorphed += ( morphTarget6 - position ) * morphTargetInfluences[ 6 ];\nmorphed += ( morphTarget7 - position ) * morphTargetInfluences[ 7 ];\nmorphed += position;\ngl_Position = projectionMatrix * modelViewMatrix * vec4( morphed, 1.0 );\n#else\ngl_Position = projectionMatrix * mvPosition;\n#endif"};
 THREE.UniformsLib={common:{diffuse:{type:"c",value:new THREE.Color(15658734)},opacity:{type:"f",value:1},map:{type:"t",value:0,texture:null},lightMap:{type:"t",value:2,texture:null},envMap:{type:"t",value:1,texture:null},useRefract:{type:"i",value:0},reflectivity:{type:"f",value:1},refractionRatio:{type:"f",value:0.98},combine:{type:"i",value:0},fogDensity:{type:"f",value:2.5E-4},fogNear:{type:"f",value:1},fogFar:{type:"f",value:2E3},fogColor:{type:"c",value:new THREE.Color(16777215)},morphTargetInfluences:{type:"f",
 value:0}},lights:{enableLighting:{type:"i",value:1},ambientLightColor:{type:"fv",value:[]},directionalLightDirection:{type:"fv",value:[]},directionalLightColor:{type:"fv",value:[]},pointLightPosition:{type:"fv",value:[]},pointLightColor:{type:"fv",value:[]}},particle:{psColor:{type:"c",value:new THREE.Color(15658734)},opacity:{type:"f",value:1},size:{type:"f",value:1},map:{type:"t",value:0,texture:null},fogDensity:{type:"f",value:2.5E-4},fogNear:{type:"f",value:1},fogFar:{type:"f",value:2E3},fogColor:{type:"c",
 value:new THREE.Color(16777215)}}};
@@ -316,10 +316,10 @@ THREE.RenderableParticle=function(){this.rotation=this.z=this.y=this.x=null;this
 var GeometryUtils={merge:function(a,c){var b=c instanceof THREE.Mesh,d=a.vertices.length,f=b?c.geometry:c,g=a.vertices,h=f.vertices,j=a.faces,k=f.faces,n=a.uvs;f=f.uvs;b&&c.matrixAutoUpdate&&c.updateMatrix();for(var q=0,x=h.length;q<x;q++){var u=new THREE.Vertex(h[q].position.clone());b&&c.matrix.multiplyVector3(u.position);g.push(u)}q=0;for(x=k.length;q<x;q++){h=k[q];var t,y=h.vertexNormals;if(h instanceof THREE.Face3)t=new THREE.Face3(h.a+d,h.b+d,h.c+d);else h instanceof THREE.Face4&&(t=new THREE.Face4(h.a+
 d,h.b+d,h.c+d,h.d+d));t.centroid.copy(h.centroid);t.normal.copy(h.normal);b=0;for(g=y.length;b<g;b++){u=y[b];t.vertexNormals.push(u.clone())}t.materials=h.materials.slice();j.push(t)}q=0;for(x=f.length;q<x;q++){d=f[q];j=[];b=0;for(g=d.length;b<g;b++)j.push(new THREE.UV(d[b].u,d[b].v));n.push(j)}}},ImageUtils={loadTexture:function(a,c,b){var d=new Image,f=new THREE.Texture(d,c);d.onload=function(){f.needsUpdate=!0;b&&b(this)};d.src=a;return f},loadTextureCube:function(a,c,b){var d,f=[],g=new THREE.Texture(f,
 c);c=f.loadCount=0;for(d=a.length;c<d;++c){f[c]=new Image;f[c].onload=function(){f.loadCount+=1;if(f.loadCount==6)g.needsUpdate=!0;b&&b(this)};f[c].src=a[c]}return g}},SceneUtils={loadScene:function(a,c,b,d){a=new Worker(a);a.postMessage(0);a.onmessage=function(f){function g(){for(q in M.objects)if(!I.objects[q]){C=M.objects[q];if(w=I.geometries[C.geometry]){Y=[];for(i=0;i<C.materials.length;i++)Y[i]=I.materials[C.materials[i]];F=C.position;r=C.rotation;s=C.scale;object=new THREE.Mesh(w,Y);object.position.set(F[0],
-F[1],F[2]);object.rotation.set(r[0],r[1],r[2]);object.scale.set(s[0],s[1],s[2]);object.visible=C.visible;I.scene.addObject(object);I.objects[q]=object}}}function h(ca){return function(za){I.geometries[ca]=za;g();X-=1;j()}}function j(){d({total_models:da,total_textures:ga,loaded_models:da-X,loaded_textures:ga-R},I);X==0&&R==0&&b(I)}var k,n,q,x,u,t,y,C,F,v,G,w,N,L,Y,M,e,X,R,da,ga,I;M=f.data;e=new THREE.Loader;R=X=0;I={scene:new THREE.Scene,geometries:{},materials:{},textures:{},objects:{},cameras:{},
+F[1],F[2]);object.rotation.set(r[0],r[1],r[2]);object.scale.set(s[0],s[1],s[2]);object.visible=C.visible;I.scene.addObject(object);I.objects[q]=object}}}function h(ca){return function(za){I.geometries[ca]=za;g();W-=1;j()}}function j(){d({total_models:da,total_textures:ga,loaded_models:da-W,loaded_textures:ga-R},I);W==0&&R==0&&b(I)}var k,n,q,x,u,t,y,C,F,v,G,w,N,L,Y,M,e,W,R,da,ga,I;M=f.data;e=new THREE.Loader;R=W=0;I={scene:new THREE.Scene,geometries:{},materials:{},textures:{},objects:{},cameras:{},
 lights:{},fogs:{}};f=function(){R-=1;j()};for(u in M.cameras){v=M.cameras[u];if(v.type=="perspective")N=new THREE.Camera(v.fov,v.aspect,v.near,v.far);else if(v.type=="ortho"){N=new THREE.Camera;N.projectionMatrix=THREE.Matrix4.makeOrtho(v.left,v.right,v.top,v.bottom,v.near,v.far)}F=v.position;v=v.target;N.position.set(F[0],F[1],F[2]);N.target.position.set(v[0],v[1],v[2]);I.cameras[u]=N}for(x in M.lights){u=M.lights[x];if(u.type=="directional"){F=u.direction;light=new THREE.DirectionalLight;light.position.set(F[0],
 F[1],F[2]);light.position.normalize()}else if(u.type=="point"){F=u.position;light=new THREE.PointLight;light.position.set(F[0],F[1],F[2])}v=u.color;i=u.intensity||1;light.color.setRGB(v[0]*i,v[1]*i,v[2]*i);I.scene.addLight(light);I.lights[x]=light}for(t in M.fogs){x=M.fogs[t];if(x.type=="linear")L=new THREE.Fog(0,x.near,x.far);else x.type=="exp2"&&(L=new THREE.FogExp2(0,x.density));v=x.color;L.color.setRGB(v[0],v[1],v[2]);I.fogs[t]=L}if(I.cameras&&M.defaults.camera)I.currentCamera=I.cameras[M.defaults.camera];
-if(I.fogs&&M.defaults.fog)I.scene.fog=I.fogs[M.defaults.fog];v=M.defaults.bgcolor;I.bgColor=new THREE.Color;I.bgColor.setRGB(v[0],v[1],v[2]);I.bgColorAlpha=M.defaults.bgalpha;for(k in M.geometries){t=M.geometries[k];if(t.type=="bin_mesh"||t.type=="ascii_mesh")X+=1}da=X;for(k in M.geometries){t=M.geometries[k];if(t.type=="cube"){w=new Cube(t.width,t.height,t.depth,t.segmentsWidth,t.segmentsHeight,t.segmentsDepth,null,t.flipped,t.sides);I.geometries[k]=w}else if(t.type=="plane"){w=new Plane(t.width,
+if(I.fogs&&M.defaults.fog)I.scene.fog=I.fogs[M.defaults.fog];v=M.defaults.bgcolor;I.bgColor=new THREE.Color;I.bgColor.setRGB(v[0],v[1],v[2]);I.bgColorAlpha=M.defaults.bgalpha;for(k in M.geometries){t=M.geometries[k];if(t.type=="bin_mesh"||t.type=="ascii_mesh")W+=1}da=W;for(k in M.geometries){t=M.geometries[k];if(t.type=="cube"){w=new Cube(t.width,t.height,t.depth,t.segmentsWidth,t.segmentsHeight,t.segmentsDepth,null,t.flipped,t.sides);I.geometries[k]=w}else if(t.type=="plane"){w=new Plane(t.width,
 t.height,t.segmentsWidth,t.segmentsHeight);I.geometries[k]=w}else if(t.type=="sphere"){w=new Sphere(t.radius,t.segmentsWidth,t.segmentsHeight);I.geometries[k]=w}else if(t.type=="cylinder"){w=new Cylinder(t.numSegs,t.topRad,t.botRad,t.height,t.topOffset,t.botOffset);I.geometries[k]=w}else if(t.type=="torus"){w=new Torus(t.radius,t.tube,t.segmentsR,t.segmentsT);I.geometries[k]=w}else if(t.type=="icosahedron"){w=new Icosahedron(t.subdivisions);I.geometries[k]=w}else if(t.type=="bin_mesh")e.loadBinary({model:t.url,
 callback:h(k)});else t.type=="ascii_mesh"&&e.loadAscii({model:t.url,callback:h(k)})}for(y in M.textures){k=M.textures[y];R+=k.url instanceof Array?k.url.length:1}ga=R;for(y in M.textures){k=M.textures[y];if(k.mapping!=undefined&&THREE[k.mapping]!=undefined)k.mapping=new THREE[k.mapping];if(k.url instanceof Array)t=ImageUtils.loadTextureCube(k.url,k.mapping,f);else{t=ImageUtils.loadTexture(k.url,k.mapping,f);if(THREE[k.minFilter]!=undefined)t.minFilter=THREE[k.minFilter];if(THREE[k.magFilter]!=undefined)t.magFilter=
 THREE[k.magFilter]}I.textures[y]=t}for(n in M.materials){y=M.materials[n];for(G in y.parameters)if(G=="envMap"||G=="map"||G=="lightMap")y.parameters[G]=I.textures[y.parameters[G]];else if(G=="shading")y.parameters[G]=y.parameters[G]=="flat"?THREE.FlatShading:THREE.SmoothShading;else if(G=="blending")y.parameters[G]=THREE[y.parameters[G]]?THREE[y.parameters[G]]:THREE.NormalBlending;else G=="combine"&&(y.parameters[G]=y.parameters[G]=="MixOperation"?THREE.MixOperation:THREE.MultiplyOperation);y=new THREE[y.type](y.parameters);
@@ -335,8 +335,8 @@ cube:{uniforms:{tCube:{type:"t",value:1,texture:null}},vertexShader:"varying vec
 value:0,texture:null},uImageIncrement:{type:"v2",value:new THREE.Vector2(0.001953125,0)},cKernel:{type:"fv1",value:[]}},vertexShader:"varying vec2 vUv;\nuniform vec2 uImageIncrement;\nvoid main(void) {\nvUv = uv - ((KERNEL_SIZE - 1.0) / 2.0) * uImageIncrement;\ngl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}",fragmentShader:"varying vec2 vUv;\nuniform sampler2D tDiffuse;\nuniform vec2 uImageIncrement;\nuniform float cKernel[KERNEL_SIZE];\nvoid main(void) {\nvec2 imageCoord = vUv;\nvec4 sum = vec4( 0.0, 0.0, 0.0, 0.0 );\nfor( int i=0; i<KERNEL_SIZE; ++i ) {\nsum += texture2D( tDiffuse, imageCoord ) * cKernel[i];\nimageCoord += uImageIncrement;\n}\ngl_FragColor = sum;\n}"},
 film:{uniforms:{tDiffuse:{type:"t",value:0,texture:null},time:{type:"f",value:0},nIntensity:{type:"f",value:0.5},sIntensity:{type:"f",value:0.05},sCount:{type:"f",value:4096},grayscale:{type:"i",value:1}},vertexShader:"varying vec2 vUv;\nvoid main() {\nvUv = vec2( uv.x, 1.0 - uv.y );\ngl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}",fragmentShader:"varying vec2 vUv;\nuniform sampler2D tDiffuse;\nuniform float time;\nuniform bool grayscale;\nuniform float nIntensity;\nuniform float sIntensity;\nuniform float sCount;\nvoid main() {\nvec4 cTextureScreen = texture2D( tDiffuse, vUv );\nfloat x = vUv.x * vUv.y * time *  1000.0;\nx = mod( x, 13.0 ) * mod( x, 123.0 );\nfloat dx = mod( x, 0.01 );\nvec3 cResult = cTextureScreen.rgb + cTextureScreen.rgb * clamp( 0.1 + dx * 100.0, 0.0, 1.0 );\nvec2 sc = vec2( sin( vUv.y * sCount ), cos( vUv.y * sCount ) );\ncResult += cTextureScreen.rgb * vec3( sc.x, sc.y, sc.x ) * sIntensity;\ncResult = cTextureScreen.rgb + clamp( nIntensity, 0.0,1.0 ) * ( cResult - cTextureScreen.rgb );\nif( grayscale ) {\ncResult = vec3( cResult.r * 0.3 + cResult.g * 0.59 + cResult.b * 0.11 );\n}\ngl_FragColor =  vec4( cResult, cTextureScreen.a );\n}"},
 screen:{uniforms:{tDiffuse:{type:"t",value:0,texture:null},opacity:{type:"f",value:1}},vertexShader:"varying vec2 vUv;\nvoid main() {\nvUv = vec2( uv.x, 1.0 - uv.y );\ngl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}",fragmentShader:"varying vec2 vUv;\nuniform sampler2D tDiffuse;\nuniform float opacity;\nvoid main() {\nvec4 texel = texture2D( tDiffuse, vUv );\ngl_FragColor = opacity * texel;\n}"},basic:{uniforms:{},vertexShader:"void main() {\ngl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}",
-fragmentShader:"void main() {\ngl_FragColor = vec4( 1.0, 0.0, 0.0, 0.5 );\n}"}},buildKernel:function(a){var c,b,d,f,g=2*Math.ceil(a*3)+1;g>25&&(g=25);f=(g-1)*0.5;b=Array(g);for(c=d=0;c<g;++c){b[c]=Math.exp(-((c-f)*(c-f))/(2*a*a));d+=b[c]}for(c=0;c<g;++c)b[c]/=d;return b}},Cube=function(a,c,b,d,f,g,h,j,k){function n(F,v,G,w,N,L,Y,M){var e,X,R=d||1,da=f||1,ga=N/2,I=L/2,ca=q.vertices.length;if(F=="x"&&v=="y"||F=="y"&&v=="x")e="z";else if(F=="x"&&v=="z"||F=="z"&&v=="x"){e="y";da=g||1}else if(F=="z"&&
-v=="y"||F=="y"&&v=="z"){e="x";R=g||1}var za=R+1,ea=da+1;N/=R;var xa=L/da;for(X=0;X<ea;X++)for(L=0;L<za;L++){var ja=new THREE.Vector3;ja[F]=(L*N-ga)*G;ja[v]=(X*xa-I)*w;ja[e]=Y;q.vertices.push(new THREE.Vertex(ja))}for(X=0;X<da;X++)for(L=0;L<R;L++){q.faces.push(new THREE.Face4(L+za*X+ca,L+za*(X+1)+ca,L+1+za*(X+1)+ca,L+1+za*X+ca,null,M));q.uvs.push([new THREE.UV(L/R,X/da),new THREE.UV(L/R,(X+1)/da),new THREE.UV((L+1)/R,(X+1)/da),new THREE.UV((L+1)/R,X/da)])}}THREE.Geometry.call(this);var q=this,x=a/
+fragmentShader:"void main() {\ngl_FragColor = vec4( 1.0, 0.0, 0.0, 0.5 );\n}"}},buildKernel:function(a){var c,b,d,f,g=2*Math.ceil(a*3)+1;g>25&&(g=25);f=(g-1)*0.5;b=Array(g);for(c=d=0;c<g;++c){b[c]=Math.exp(-((c-f)*(c-f))/(2*a*a));d+=b[c]}for(c=0;c<g;++c)b[c]/=d;return b}},Cube=function(a,c,b,d,f,g,h,j,k){function n(F,v,G,w,N,L,Y,M){var e,W,R=d||1,da=f||1,ga=N/2,I=L/2,ca=q.vertices.length;if(F=="x"&&v=="y"||F=="y"&&v=="x")e="z";else if(F=="x"&&v=="z"||F=="z"&&v=="x"){e="y";da=g||1}else if(F=="z"&&
+v=="y"||F=="y"&&v=="z"){e="x";R=g||1}var za=R+1,ea=da+1;N/=R;var xa=L/da;for(W=0;W<ea;W++)for(L=0;L<za;L++){var ja=new THREE.Vector3;ja[F]=(L*N-ga)*G;ja[v]=(W*xa-I)*w;ja[e]=Y;q.vertices.push(new THREE.Vertex(ja))}for(W=0;W<da;W++)for(L=0;L<R;L++){q.faces.push(new THREE.Face4(L+za*W+ca,L+za*(W+1)+ca,L+1+za*(W+1)+ca,L+1+za*W+ca,null,M));q.uvs.push([new THREE.UV(L/R,W/da),new THREE.UV(L/R,(W+1)/da),new THREE.UV((L+1)/R,(W+1)/da),new THREE.UV((L+1)/R,W/da)])}}THREE.Geometry.call(this);var q=this,x=a/
 2,u=c/2,t=b/2;j=j?-1:1;if(h!==undefined)if(h instanceof Array)this.materials=h;else{this.materials=[];for(var y=0;y<6;y++)this.materials.push([h])}else this.materials=[];this.sides={px:!0,nx:!0,py:!0,ny:!0,pz:!0,nz:!0};if(k!=undefined)for(var C in k)this.sides[C]!=undefined&&(this.sides[C]=k[C]);this.sides.px&&n("z","y",1*j,-1,b,c,-x,this.materials[0]);this.sides.nx&&n("z","y",-1*j,-1,b,c,x,this.materials[1]);this.sides.py&&n("x","z",1*j,1,a,b,u,this.materials[2]);this.sides.ny&&n("x","z",1*j,-1,
 a,b,-u,this.materials[3]);this.sides.pz&&n("x","y",1*j,-1,a,c,t,this.materials[4]);this.sides.nz&&n("x","y",-1*j,-1,a,c,-t,this.materials[5]);(function(){for(var F=[],v=[],G=0,w=q.vertices.length;G<w;G++){for(var N=q.vertices[G],L=!1,Y=0,M=F.length;Y<M;Y++){var e=F[Y];if(N.position.x==e.position.x&&N.position.y==e.position.y&&N.position.z==e.position.z){v[G]=Y;L=!0;break}}if(!L){v[G]=F.length;F.push(new THREE.Vertex(N.position.clone()))}}G=0;for(w=q.faces.length;G<w;G++){N=q.faces[G];N.a=v[N.a];N.b=
 v[N.b];N.c=v[N.c];N.d=v[N.d]}q.vertices=F})();this.computeCentroids();this.computeFaceNormals()};Cube.prototype=new THREE.Geometry;Cube.prototype.constructor=Cube;
@@ -359,8 +359,8 @@ THREE.MarchingCubes=function(a,c){THREE.Object3D.call(this);this.materials=c ins
 0;this.hasPos=!1;this.hasNormal=!1;this.positionArray=new Float32Array(this.maxCount*3);this.normalArray=new Float32Array(this.maxCount*3)};this.lerp=function(b,d,f){return b+(d-b)*f};this.VIntX=function(b,d,f,g,h,j,k,n,q,x){h=(h-q)/(x-q);q=this.normal_cache;d[g]=j+h*this.delta;d[g+1]=k;d[g+2]=n;f[g]=this.lerp(q[b],q[b+3],h);f[g+1]=this.lerp(q[b+1],q[b+4],h);f[g+2]=this.lerp(q[b+2],q[b+5],h)};this.VIntY=function(b,d,f,g,h,j,k,n,q,x){h=(h-q)/(x-q);q=this.normal_cache;d[g]=j;d[g+1]=k+h*this.delta;d[g+
 2]=n;d=b+this.yd*3;f[g]=this.lerp(q[b],q[d],h);f[g+1]=this.lerp(q[b+1],q[d+1],h);f[g+2]=this.lerp(q[b+2],q[d+2],h)};this.VIntZ=function(b,d,f,g,h,j,k,n,q,x){h=(h-q)/(x-q);q=this.normal_cache;d[g]=j;d[g+1]=k;d[g+2]=n+h*this.delta;d=b+this.zd*3;f[g]=this.lerp(q[b],q[d],h);f[g+1]=this.lerp(q[b+1],q[d+1],h);f[g+2]=this.lerp(q[b+2],q[d+2],h)};this.compNorm=function(b){var d=b*3;if(this.normal_cache[d]==0){this.normal_cache[d]=this.field[b-1]-this.field[b+1];this.normal_cache[d+1]=this.field[b-this.yd]-
 this.field[b+this.yd];this.normal_cache[d+2]=this.field[b-this.zd]-this.field[b+this.zd]}};this.polygonize=function(b,d,f,g,h,j){var k=g+1,n=g+this.yd,q=g+this.zd,x=k+this.yd,u=k+this.zd,t=g+this.yd+this.zd,y=k+this.yd+this.zd,C=0,F=this.field[g],v=this.field[k],G=this.field[n],w=this.field[x],N=this.field[q],L=this.field[u],Y=this.field[t],M=this.field[y];F<h&&(C|=1);v<h&&(C|=2);G<h&&(C|=8);w<h&&(C|=4);N<h&&(C|=16);L<h&&(C|=32);Y<h&&(C|=128);M<h&&(C|=64);var e=THREE.edgeTable[C];if(e==0)return 0;
-var X=this.delta,R=b+X,da=d+X;X=f+X;if(e&1){this.compNorm(g);this.compNorm(k);this.VIntX(g*3,this.vlist,this.nlist,0,h,b,d,f,F,v)}if(e&2){this.compNorm(k);this.compNorm(x);this.VIntY(k*3,this.vlist,this.nlist,3,h,R,d,f,v,w)}if(e&4){this.compNorm(n);this.compNorm(x);this.VIntX(n*3,this.vlist,this.nlist,6,h,b,da,f,G,w)}if(e&8){this.compNorm(g);this.compNorm(n);this.VIntY(g*3,this.vlist,this.nlist,9,h,b,d,f,F,G)}if(e&16){this.compNorm(q);this.compNorm(u);this.VIntX(q*3,this.vlist,this.nlist,12,h,b,d,
-X,N,L)}if(e&32){this.compNorm(u);this.compNorm(y);this.VIntY(u*3,this.vlist,this.nlist,15,h,R,d,X,L,M)}if(e&64){this.compNorm(t);this.compNorm(y);this.VIntX(t*3,this.vlist,this.nlist,18,h,b,da,X,Y,M)}if(e&128){this.compNorm(q);this.compNorm(t);this.VIntY(q*3,this.vlist,this.nlist,21,h,b,d,X,N,Y)}if(e&256){this.compNorm(g);this.compNorm(q);this.VIntZ(g*3,this.vlist,this.nlist,24,h,b,d,f,F,N)}if(e&512){this.compNorm(k);this.compNorm(u);this.VIntZ(k*3,this.vlist,this.nlist,27,h,R,d,f,v,L)}if(e&1024){this.compNorm(x);
+var W=this.delta,R=b+W,da=d+W;W=f+W;if(e&1){this.compNorm(g);this.compNorm(k);this.VIntX(g*3,this.vlist,this.nlist,0,h,b,d,f,F,v)}if(e&2){this.compNorm(k);this.compNorm(x);this.VIntY(k*3,this.vlist,this.nlist,3,h,R,d,f,v,w)}if(e&4){this.compNorm(n);this.compNorm(x);this.VIntX(n*3,this.vlist,this.nlist,6,h,b,da,f,G,w)}if(e&8){this.compNorm(g);this.compNorm(n);this.VIntY(g*3,this.vlist,this.nlist,9,h,b,d,f,F,G)}if(e&16){this.compNorm(q);this.compNorm(u);this.VIntX(q*3,this.vlist,this.nlist,12,h,b,d,
+W,N,L)}if(e&32){this.compNorm(u);this.compNorm(y);this.VIntY(u*3,this.vlist,this.nlist,15,h,R,d,W,L,M)}if(e&64){this.compNorm(t);this.compNorm(y);this.VIntX(t*3,this.vlist,this.nlist,18,h,b,da,W,Y,M)}if(e&128){this.compNorm(q);this.compNorm(t);this.VIntY(q*3,this.vlist,this.nlist,21,h,b,d,W,N,Y)}if(e&256){this.compNorm(g);this.compNorm(q);this.VIntZ(g*3,this.vlist,this.nlist,24,h,b,d,f,F,N)}if(e&512){this.compNorm(k);this.compNorm(u);this.VIntZ(k*3,this.vlist,this.nlist,27,h,R,d,f,v,L)}if(e&1024){this.compNorm(x);
 this.compNorm(y);this.VIntZ(x*3,this.vlist,this.nlist,30,h,R,da,f,w,M)}if(e&2048){this.compNorm(n);this.compNorm(t);this.VIntZ(n*3,this.vlist,this.nlist,33,h,b,da,f,G,Y)}C<<=4;for(h=g=0;THREE.triTable[C+h]!=-1;){b=C+h;d=b+1;f=b+2;this.posnormtriv(this.vlist,this.nlist,3*THREE.triTable[b],3*THREE.triTable[d],3*THREE.triTable[f],j);h+=3;g++}return g};this.posnormtriv=function(b,d,f,g,h,j){var k=this.count*3;this.positionArray[k]=b[f];this.positionArray[k+1]=b[f+1];this.positionArray[k+2]=b[f+2];this.positionArray[k+
 3]=b[g];this.positionArray[k+4]=b[g+1];this.positionArray[k+5]=b[g+2];this.positionArray[k+6]=b[h];this.positionArray[k+7]=b[h+1];this.positionArray[k+8]=b[h+2];this.normalArray[k]=d[f];this.normalArray[k+1]=d[f+1];this.normalArray[k+2]=d[f+2];this.normalArray[k+3]=d[g];this.normalArray[k+4]=d[g+1];this.normalArray[k+5]=d[g+2];this.normalArray[k+6]=d[h];this.normalArray[k+7]=d[h+1];this.normalArray[k+8]=d[h+2];this.hasPos=!0;this.hasNormal=!0;this.count+=3;this.count>=this.maxCount-3&&j(this)};this.begin=
 function(){this.count=0;this.hasPos=!1;this.hasNormal=!1};this.end=function(b){if(this.count!=0){for(var d=this.count*3;d<this.positionArray.length;d++)this.positionArray[d]=0;b(this)}};this.addBall=function(b,d,f,g,h){var j=this.size*Math.sqrt(g/h),k=f*this.size,n=d*this.size,q=b*this.size,x=Math.floor(k-j);x<1&&(x=1);k=Math.floor(k+j);k>this.size-1&&(k=this.size-1);var u=Math.floor(n-j);u<1&&(u=1);n=Math.floor(n+j);n>this.size-1&&(n=this.size-1);var t=Math.floor(q-j);t<1&&(t=1);j=Math.floor(q+j);
@@ -397,11 +397,11 @@ THREE.Loader.prototype={addStatusElement:function(){var a=document.createElement
 c},loadAsciiOld:function(a,c){var b=document.createElement("script");b.type="text/javascript";b.onload=c;b.src=a;document.getElementsByTagName("head")[0].appendChild(b)},loadAscii:function(a){var c=a.model,b=a.callback,d=a.texture_path?a.texture_path:THREE.Loader.prototype.extractUrlbase(c);a=(new Date).getTime();c=new Worker(c);c.onmessage=function(f){THREE.Loader.prototype.createModel(f.data,b,d)};c.postMessage(a)},loadBinary:function(a){var c=a.model,b=a.callback,d=a.texture_path?a.texture_path:
 THREE.Loader.prototype.extractUrlbase(c),f=a.bin_path?a.bin_path:THREE.Loader.prototype.extractUrlbase(c);a=(new Date).getTime();c=new Worker(c);var g=this.showProgress?THREE.Loader.prototype.updateProgress:null;c.onmessage=function(h){THREE.Loader.prototype.loadAjaxBuffers(h.data.buffers,h.data.materials,b,f,d,g)};c.onerror=function(h){alert("worker.onerror: "+h.message+"\n"+h.data);h.preventDefault()};c.postMessage(a)},loadAjaxBuffers:function(a,c,b,d,f,g){var h=new XMLHttpRequest,j=d+"/"+a,k=0;
 h.onreadystatechange=function(){if(h.readyState==4)h.status==200||h.status==0?THREE.Loader.prototype.createBinModel(h.responseText,b,f,c):alert("Couldn't load ["+j+"] ["+h.status+"]");else if(h.readyState==3){if(g){k==0&&(k=h.getResponseHeader("Content-Length"));g({total:k,loaded:h.responseText.length})}}else h.readyState==2&&(k=h.getResponseHeader("Content-Length"))};h.open("GET",j,!0);h.overrideMimeType("text/plain; charset=x-user-defined");h.setRequestHeader("Content-Type","text/plain");h.send(null)},
-createBinModel:function(a,c,b,d){var f=function(g){function h(p,m){var o=q(p,m),B=q(p,m+1),A=q(p,m+2),D=q(p,m+3),P=(D<<1&255|A>>7)-127;o|=(A&127)<<16|B<<8;if(o==0&&P==-127)return 0;return(1-2*(D>>7))*(1+o*Math.pow(2,-23))*Math.pow(2,P)}function j(p,m){var o=q(p,m),B=q(p,m+1),A=q(p,m+2);return(q(p,m+3)<<24)+(A<<16)+(B<<8)+o}function k(p,m){var o=q(p,m);return(q(p,m+1)<<8)+o}function n(p,m){var o=q(p,m);return o>127?o-256:o}function q(p,m){return p.charCodeAt(m)&255}function x(p){var m,o,B;m=j(a,p);
-o=j(a,p+Y);B=j(a,p+M);p=k(a,p+e);THREE.Loader.prototype.f3(v,m,o,B,p)}function u(p){var m,o,B,A,D,P;m=j(a,p);o=j(a,p+Y);B=j(a,p+M);A=k(a,p+e);D=j(a,p+X);P=j(a,p+R);p=j(a,p+da);THREE.Loader.prototype.f3n(v,N,m,o,B,A,D,P,p)}function t(p){var m,o,B,A;m=j(a,p);o=j(a,p+ga);B=j(a,p+I);A=j(a,p+ca);p=k(a,p+za);THREE.Loader.prototype.f4(v,m,o,B,A,p)}function y(p){var m,o,B,A,D,P,U,E;m=j(a,p);o=j(a,p+ga);B=j(a,p+I);A=j(a,p+ca);D=k(a,p+za);P=j(a,p+ea);U=j(a,p+xa);E=j(a,p+ja);p=j(a,p+ha);THREE.Loader.prototype.f4n(v,
-N,m,o,B,A,D,P,U,E,p)}function C(p){var m,o;m=j(a,p);o=j(a,p+va);p=j(a,p+Aa);THREE.Loader.prototype.uv3(v.uvs,L[m*2],L[m*2+1],L[o*2],L[o*2+1],L[p*2],L[p*2+1])}function F(p){var m,o,B;m=j(a,p);o=j(a,p+ia);B=j(a,p+$);p=j(a,p+qa);THREE.Loader.prototype.uv4(v.uvs,L[m*2],L[m*2+1],L[o*2],L[o*2+1],L[B*2],L[B*2+1],L[p*2],L[p*2+1])}var v=this,G=0,w,N=[],L=[],Y,M,e,X,R,da,ga,I,ca,za,ea,xa,ja,ha,va,Aa,ia,$,qa,ra,Q,ma,ta,l,z;THREE.Geometry.call(this);THREE.Loader.prototype.init_materials(v,d,g);w={signature:a.substr(G,
+createBinModel:function(a,c,b,d){var f=function(g){function h(p,m){var o=q(p,m),B=q(p,m+1),A=q(p,m+2),D=q(p,m+3),O=(D<<1&255|A>>7)-127;o|=(A&127)<<16|B<<8;if(o==0&&O==-127)return 0;return(1-2*(D>>7))*(1+o*Math.pow(2,-23))*Math.pow(2,O)}function j(p,m){var o=q(p,m),B=q(p,m+1),A=q(p,m+2);return(q(p,m+3)<<24)+(A<<16)+(B<<8)+o}function k(p,m){var o=q(p,m);return(q(p,m+1)<<8)+o}function n(p,m){var o=q(p,m);return o>127?o-256:o}function q(p,m){return p.charCodeAt(m)&255}function x(p){var m,o,B;m=j(a,p);
+o=j(a,p+Y);B=j(a,p+M);p=k(a,p+e);THREE.Loader.prototype.f3(v,m,o,B,p)}function u(p){var m,o,B,A,D,O;m=j(a,p);o=j(a,p+Y);B=j(a,p+M);A=k(a,p+e);D=j(a,p+W);O=j(a,p+R);p=j(a,p+da);THREE.Loader.prototype.f3n(v,N,m,o,B,A,D,O,p)}function t(p){var m,o,B,A;m=j(a,p);o=j(a,p+ga);B=j(a,p+I);A=j(a,p+ca);p=k(a,p+za);THREE.Loader.prototype.f4(v,m,o,B,A,p)}function y(p){var m,o,B,A,D,O,X,E;m=j(a,p);o=j(a,p+ga);B=j(a,p+I);A=j(a,p+ca);D=k(a,p+za);O=j(a,p+ea);X=j(a,p+xa);E=j(a,p+ja);p=j(a,p+ha);THREE.Loader.prototype.f4n(v,
+N,m,o,B,A,D,O,X,E,p)}function C(p){var m,o;m=j(a,p);o=j(a,p+va);p=j(a,p+Aa);THREE.Loader.prototype.uv3(v.uvs,L[m*2],L[m*2+1],L[o*2],L[o*2+1],L[p*2],L[p*2+1])}function F(p){var m,o,B;m=j(a,p);o=j(a,p+ia);B=j(a,p+$);p=j(a,p+qa);THREE.Loader.prototype.uv4(v.uvs,L[m*2],L[m*2+1],L[o*2],L[o*2+1],L[B*2],L[B*2+1],L[p*2],L[p*2+1])}var v=this,G=0,w,N=[],L=[],Y,M,e,W,R,da,ga,I,ca,za,ea,xa,ja,ha,va,Aa,ia,$,qa,ra,Q,ma,ta,l,z;THREE.Geometry.call(this);THREE.Loader.prototype.init_materials(v,d,g);w={signature:a.substr(G,
 8),header_bytes:q(a,G+8),vertex_coordinate_bytes:q(a,G+9),normal_coordinate_bytes:q(a,G+10),uv_coordinate_bytes:q(a,G+11),vertex_index_bytes:q(a,G+12),normal_index_bytes:q(a,G+13),uv_index_bytes:q(a,G+14),material_index_bytes:q(a,G+15),nvertices:j(a,G+16),nnormals:j(a,G+16+4),nuvs:j(a,G+16+8),ntri_flat:j(a,G+16+12),ntri_smooth:j(a,G+16+16),ntri_flat_uv:j(a,G+16+20),ntri_smooth_uv:j(a,G+16+24),nquad_flat:j(a,G+16+28),nquad_smooth:j(a,G+16+32),nquad_flat_uv:j(a,G+16+36),nquad_smooth_uv:j(a,G+16+40)};
-G+=w.header_bytes;Y=w.vertex_index_bytes;M=w.vertex_index_bytes*2;e=w.vertex_index_bytes*3;X=w.vertex_index_bytes*3+w.material_index_bytes;R=w.vertex_index_bytes*3+w.material_index_bytes+w.normal_index_bytes;da=w.vertex_index_bytes*3+w.material_index_bytes+w.normal_index_bytes*2;ga=w.vertex_index_bytes;I=w.vertex_index_bytes*2;ca=w.vertex_index_bytes*3;za=w.vertex_index_bytes*4;ea=w.vertex_index_bytes*4+w.material_index_bytes;xa=w.vertex_index_bytes*4+w.material_index_bytes+w.normal_index_bytes;ja=
+G+=w.header_bytes;Y=w.vertex_index_bytes;M=w.vertex_index_bytes*2;e=w.vertex_index_bytes*3;W=w.vertex_index_bytes*3+w.material_index_bytes;R=w.vertex_index_bytes*3+w.material_index_bytes+w.normal_index_bytes;da=w.vertex_index_bytes*3+w.material_index_bytes+w.normal_index_bytes*2;ga=w.vertex_index_bytes;I=w.vertex_index_bytes*2;ca=w.vertex_index_bytes*3;za=w.vertex_index_bytes*4;ea=w.vertex_index_bytes*4+w.material_index_bytes;xa=w.vertex_index_bytes*4+w.material_index_bytes+w.normal_index_bytes;ja=
 w.vertex_index_bytes*4+w.material_index_bytes+w.normal_index_bytes*2;ha=w.vertex_index_bytes*4+w.material_index_bytes+w.normal_index_bytes*3;va=w.uv_index_bytes;Aa=w.uv_index_bytes*2;ia=w.uv_index_bytes;$=w.uv_index_bytes*2;qa=w.uv_index_bytes*3;g=w.vertex_index_bytes*3+w.material_index_bytes;z=w.vertex_index_bytes*4+w.material_index_bytes;ra=w.ntri_flat*g;Q=w.ntri_smooth*(g+w.normal_index_bytes*3);ma=w.ntri_flat_uv*(g+w.uv_index_bytes*3);ta=w.ntri_smooth_uv*(g+w.normal_index_bytes*3+w.uv_index_bytes*
 3);l=w.nquad_flat*z;g=w.nquad_smooth*(z+w.normal_index_bytes*4);z=w.nquad_flat_uv*(z+w.uv_index_bytes*4);G+=function(p){for(var m,o,B,A=w.vertex_coordinate_bytes*3,D=p+w.nvertices*A;p<D;p+=A){m=h(a,p);o=h(a,p+w.vertex_coordinate_bytes);B=h(a,p+w.vertex_coordinate_bytes*2);THREE.Loader.prototype.v(v,m,o,B)}return w.nvertices*A}(G);G+=function(p){for(var m,o,B,A=w.normal_coordinate_bytes*3,D=p+w.nnormals*A;p<D;p+=A){m=n(a,p);o=n(a,p+w.normal_coordinate_bytes);B=n(a,p+w.normal_coordinate_bytes*2);N.push(m/
 127,o/127,B/127)}return w.nnormals*A}(G);G+=function(p){for(var m,o,B=w.uv_coordinate_bytes*2,A=p+w.nuvs*B;p<A;p+=B){m=h(a,p);o=h(a,p+w.uv_coordinate_bytes);L.push(m,o)}return w.nuvs*B}(G);ra=G+ra;Q=ra+Q;ma=Q+ma;ta=ma+ta;l=ta+l;g=l+g;z=g+z;(function(p){var m,o=w.vertex_index_bytes*3+w.material_index_bytes,B=o+w.uv_index_bytes*3,A=p+w.ntri_flat_uv*B;for(m=p;m<A;m+=B){x(m);C(m+o)}return A-p})(Q);(function(p){var m,o=w.vertex_index_bytes*3+w.material_index_bytes+w.normal_index_bytes*3,B=o+w.uv_index_bytes*
@@ -410,7 +410,7 @@ p;m<B;m+=o)x(m);return B-p})(G);(function(p){var m,o=w.vertex_index_bytes*3+w.ma
 f.prototype=new THREE.Geometry;f.prototype.constructor=f;c(new f(b))},createModel:function(a,c,b){var d=function(f){var g=this;THREE.Geometry.call(this);THREE.Loader.prototype.init_materials(g,a.materials,f);(function(){var h,j,k,n,q,x;h=0;for(j=a.vertices.length;h<j;h+=3){k=a.vertices[h];n=a.vertices[h+1];q=a.vertices[h+2];THREE.Loader.prototype.v(g,k,n,q)}if(a.morphTargets!==undefined){h=0;for(j=a.morphTargets.length;h<j;h++){g.morphTargets[h]={};g.morphTargets[h].name=a.morphTargets[h].name;g.morphTargets[h].vertices=
 [];x=g.morphTargets[h].vertices;q=a.morphTargets[h].vertices;k=0;for(n=q.length;k<n;k+=3)x.push(new THREE.Vertex(new THREE.Vector3(q[k],q[k+1],q[k+2])))}}if(a.colors){h=0;for(j=a.colors.length;h<j;h+=3){k=a.colors[h];n=a.colors[h+1];q=a.colors[h+2];THREE.Loader.prototype.vc(g,k,n,q)}}})();(function(){function h(y,C){THREE.Loader.prototype.f3(g,y[C],y[C+1],y[C+2],y[C+3])}function j(y,C){THREE.Loader.prototype.f3n(g,a.normals,y[C],y[C+1],y[C+2],y[C+3],y[C+4],y[C+5],y[C+6])}function k(y,C){THREE.Loader.prototype.f4(g,
 y[C],y[C+1],y[C+2],y[C+3],y[C+4])}function n(y,C){THREE.Loader.prototype.f4n(g,a.normals,y[C],y[C+1],y[C+2],y[C+3],y[C+4],y[C+5],y[C+6],y[C+7],y[C+8])}function q(y,C){var F,v,G,w,N,L,Y,M,e;F=y[C];v=y[C+1];G=y[C+2];w=a.uvs[F*2];Y=a.uvs[F*2+1];N=a.uvs[v*2];M=a.uvs[v*2+1];L=a.uvs[G*2];e=a.uvs[G*2+1];THREE.Loader.prototype.uv3(g.uvs,w,Y,N,M,L,e);if(a.uvs2&&a.uvs2.length){w=a.uvs2[F*2];Y=a.uvs2[F*2+1];N=a.uvs2[v*2];M=a.uvs2[v*2+1];L=a.uvs2[G*2];e=a.uvs2[G*2+1];THREE.Loader.prototype.uv3(g.uvs2,w,1-Y,N,
-1-M,L,1-e)}}function x(y,C){var F,v,G,w,N,L,Y,M,e,X,R,da;F=y[C];v=y[C+1];G=y[C+2];w=y[C+3];N=a.uvs[F*2];e=a.uvs[F*2+1];L=a.uvs[v*2];X=a.uvs[v*2+1];Y=a.uvs[G*2];R=a.uvs[G*2+1];M=a.uvs[w*2];da=a.uvs[w*2+1];THREE.Loader.prototype.uv4(g.uvs,N,e,L,X,Y,R,M,da);if(a.uvs2){N=a.uvs2[F*2];e=a.uvs2[F*2+1];L=a.uvs2[v*2];X=a.uvs2[v*2+1];Y=a.uvs2[G*2];R=a.uvs2[G*2+1];M=a.uvs2[w*2];da=a.uvs2[w*2+1];THREE.Loader.prototype.uv4(g.uvs2,N,1-e,L,1-X,Y,1-R,M,1-da)}}var u,t;u=0;for(t=a.trianglesUvs.length;u<t;u+=7){h(a.trianglesUvs,
+1-M,L,1-e)}}function x(y,C){var F,v,G,w,N,L,Y,M,e,W,R,da;F=y[C];v=y[C+1];G=y[C+2];w=y[C+3];N=a.uvs[F*2];e=a.uvs[F*2+1];L=a.uvs[v*2];W=a.uvs[v*2+1];Y=a.uvs[G*2];R=a.uvs[G*2+1];M=a.uvs[w*2];da=a.uvs[w*2+1];THREE.Loader.prototype.uv4(g.uvs,N,e,L,W,Y,R,M,da);if(a.uvs2){N=a.uvs2[F*2];e=a.uvs2[F*2+1];L=a.uvs2[v*2];W=a.uvs2[v*2+1];Y=a.uvs2[G*2];R=a.uvs2[G*2+1];M=a.uvs2[w*2];da=a.uvs2[w*2+1];THREE.Loader.prototype.uv4(g.uvs2,N,1-e,L,1-W,Y,1-R,M,1-da)}}var u,t;u=0;for(t=a.trianglesUvs.length;u<t;u+=7){h(a.trianglesUvs,
 u);q(a.trianglesUvs,u+4)}u=0;for(t=a.trianglesNormalsUvs.length;u<t;u+=10){j(a.trianglesNormalsUvs,u);q(a.trianglesNormalsUvs,u+7)}u=0;for(t=a.quadsUvs.length;u<t;u+=9){k(a.quadsUvs,u);x(a.quadsUvs,u+5)}u=0;for(t=a.quadsNormalsUvs.length;u<t;u+=13){n(a.quadsNormalsUvs,u);x(a.quadsNormalsUvs,u+9)}u=0;for(t=a.triangles.length;u<t;u+=4)h(a.triangles,u);u=0;for(t=a.trianglesNormals.length;u<t;u+=7)j(a.trianglesNormals,u);u=0;for(t=a.quads.length;u<t;u+=5)k(a.quads,u);u=0;for(t=a.quadsNormals.length;u<
 t;u+=9)n(a.quadsNormals,u)})();(function(){var h,j,k,n;if(a.skinWeights){h=0;for(j=a.skinWeights.length;h<j;h+=2){k=a.skinWeights[h];n=a.skinWeights[h+1];THREE.Loader.prototype.sw(g,k,n,0,0)}}if(a.skinIndices){h=0;for(j=a.skinIndices.length;h<j;h+=2){k=a.skinIndices[h];n=a.skinIndices[h+1];THREE.Loader.prototype.si(g,k,n,0,0)}}THREE.Loader.prototype.bones(g,a.bones);THREE.Loader.prototype.animation(g,a.animation)})();this.computeCentroids();this.computeFaceNormals()};d.prototype=new THREE.Geometry;
 d.prototype.constructor=d;c(new d(b))},bones:function(a,c){a.bones=c},animation:function(a,c){a.animation=c},si:function(a,c,b,d,f){a.skinIndices.push(new THREE.Vector4(c,b,d,f))},sw:function(a,c,b,d,f){a.skinWeights.push(new THREE.Vector4(c,b,d,f))},v:function(a,c,b,d){a.vertices.push(new THREE.Vertex(new THREE.Vector3(c,b,d)))},vc:function(a,c,b,d){var f=new THREE.Color(16777215);f.setRGB(c,b,d);a.colors.push(f)},f3:function(a,c,b,d,f){a.faces.push(new THREE.Face3(c,b,d,null,a.materials[f]))},f4:function(a,

+ 188 - 0
examples/webgl_morphtargets.html

@@ -0,0 +1,188 @@
+<!DOCTYPE HTML>
+<html lang="en">
+	<head>
+		<title>three.js webgl - morph targets</title>
+		<meta charset="utf-8">
+		<style type="text/css">
+			body {
+				background:#000;
+				color:#fff;
+				padding:0;
+				margin:0;
+				font-weight: bold;
+				overflow:hidden;
+			}
+
+			#info {
+				position: absolute;
+				top: 0px; width: 100%;
+				color: #ffffff;
+				padding: 5px;
+				font-family: Monospace;
+				font-size: 13px;
+				text-align: center;
+				z-index:100;
+			}
+
+			#ctrl {
+				position: absolute;
+				top: 0px; 
+				left: 0px;
+				width: 200px;
+				color: #ffffff;
+				padding: 5px;
+				font-family: Monospace;
+				font-size: 13px;
+				z-index:100;
+			}
+
+
+			a { color:red }
+
+		</style>
+	</head>
+
+	<body>
+		<div id="info">
+			<a href="http://github.com/mrdoob/three.js" target="_blank">three.js</a> - WebGL morph target example
+		</div>
+
+
+		<div id="ctrl">
+			Use controls to change morph target influences:<br/>
+			<input type="range" value="0" min="0" max="100" onchange="mesh.morphTargetInfluences[ 0 ] = this.value/100;" />
+			<input type="range" value="0" min="0" max="100" onchange="mesh.morphTargetInfluences[ 1 ] = this.value/100;" />
+			<input type="range" value="0" min="0" max="100" onchange="mesh.morphTargetInfluences[ 2 ] = this.value/100;" />
+			<input type="range" value="0" min="0" max="100" onchange="mesh.morphTargetInfluences[ 3 ] = this.value/100;" />
+			<input type="range" value="0" min="0" max="100" onchange="mesh.morphTargetInfluences[ 4 ] = this.value/100;" />
+			<input type="range" value="0" min="0" max="100" onchange="mesh.morphTargetInfluences[ 5 ] = this.value/100;" />
+			<input type="range" value="0" min="0" max="100" onchange="mesh.morphTargetInfluences[ 6 ] = this.value/100;" />
+			<input type="range" value="0" min="0" max="100" onchange="mesh.morphTargetInfluences[ 7 ] = this.value/100;" />
+		</div>
+		
+
+		<script type="text/javascript" src="../build/Three.js"></script>
+
+		<script type="text/javascript" src="js/Detector.js"></script>
+		<script type="text/javascript" src="js/RequestAnimationFrame.js"></script>
+		<script type="text/javascript" src="js/Stats.js"></script>
+
+		<script type="text/javascript">
+
+			if ( ! Detector.webgl ) Detector.addGetWebGLMessage();
+
+			var container, stats;
+
+			var camera, scene, renderer;
+
+			var geometry, objects;
+
+			var mouseX = 0, mouseY = 0;
+
+			var mesh;
+			var windowHalfX = window.innerWidth / 2;
+			var windowHalfY = window.innerHeight / 2;
+
+			document.addEventListener( 'mousemove', onDocumentMouseMove, false );
+
+			init();
+			animate();
+
+			function init() {
+
+				container = document.createElement( 'div' );
+				document.body.appendChild( container );
+
+				camera = new THREE.Camera( 45, window.innerWidth / window.innerHeight, 1, 15000 );
+				camera.position.z = 500;
+
+
+				scene = new THREE.Scene();
+				scene.fog = new THREE.Fog( 0x000000, 1, 15000 );
+
+
+				var light = new THREE.PointLight( 0xff2200 );
+				light.position.set( 100, 100, 100 );
+				scene.addLight( light );
+
+				var light = new THREE.AmbientLight( 0x333333 );
+				scene.addLight( light );
+
+
+				var material = new THREE.MeshLambertMaterial( { color: 0xffffff, morphTargets: true } );
+				var geometry = new Cube( 100, 100, 100 );
+
+				// construct 8 blend shapes
+				
+				for( var i = 0; i < geometry.vertices.length; i++ ) {
+					
+					var vertices = [];
+					
+					for( var v = 0; v < geometry.vertices.length; v++ ) {
+						
+						vertices.push( new THREE.Vertex( geometry.vertices[ v ].position.clone(), geometry.vertices[ v ].normal.clone()))
+						
+						if( v === i ) {
+							
+							vertices[ vertices.length -1 ].position.x *= 2;
+							vertices[ vertices.length -1 ].position.y *= 2;
+							vertices[ vertices.length -1 ].position.z *= 2;
+							
+						}
+						
+					}
+					
+					geometry.morphTargets.push( { name: "target" + i, vertices: vertices } );
+					
+				}
+
+				mesh = new THREE.Mesh( geometry, material );
+
+				scene.addChild( mesh );
+
+
+				renderer = new THREE.WebGLRenderer( { clearColor:0x222222, clearAlpha: 1 } );
+				renderer.setSize( window.innerWidth, window.innerHeight );
+				renderer.sortObjects = false;
+				container.appendChild( renderer.domElement );
+
+			}
+
+			function onDocumentMouseMove(event) {
+
+				mouseX = ( event.clientX - windowHalfX );
+				mouseY = ( event.clientY - windowHalfY ) * 2;
+
+			}
+
+			function animate() {
+
+				requestAnimationFrame( animate );
+				render();
+
+			}
+
+			function render() {
+
+				mesh.rotation.y += 0.01;
+
+				//mesh.morphTargetInfluences[ 0 ] = Math.sin( mesh.rotation.y ) * 0.5 + 0.5;
+
+				//camera.position.x += ( mouseX - camera.position.x ) * .005;
+				camera.position.y += ( - mouseY - camera.position.y ) * .01;
+
+				renderer.render( scene, camera );
+
+			}
+			
+			function log( text ) {
+
+				var e = document.getElementById("log");
+				e.innerHTML = text + "<br/>" + e.innerHTML;
+
+			}
+
+		</script>
+
+	</body>
+</html>

+ 13 - 2
src/renderers/WebGLRenderer.js

@@ -1729,17 +1729,24 @@ THREE.WebGLRenderer = function ( parameters ) {
 			
 			// find most influencing
 			
+			var used = [];
 			var candidateInfluence = -1;
 			var candidate = 0;
 			var influences = object.morphTargetInfluences;
 			var i, il = influences.length;
 			var m = 0;
 
+			if( object.morphTargetBase !== -1 ) {
+				
+				used[ object.morphTargetBase ] = true;
+				
+			}
+
 			while( m < material.numSupportedMorphTargets ) {
 				
 				for( i = 0; i < il; i++ ) {
 					
-					if( i != object.morphTargetBase && influences[ i ] > candidateInfluence ) {
+					if( !used[ i ] && influences[ i ] > candidateInfluence ) {
 						
 						candidate = i;
 						candidateInfluence = influences[ candidate ];
@@ -1751,6 +1758,7 @@ THREE.WebGLRenderer = function ( parameters ) {
 				
 				object.__webGLMorphTargetInfluences[ m ] = candidateInfluence;
 
+				used[ candidate ] = 1;
 				candidateInfluence = -1;
 				m++;
 			}
@@ -3877,7 +3885,10 @@ THREE.Snippets = {
 		"morphed += ( morphTarget1 - position ) * morphTargetInfluences[ 1 ];",
 		"morphed += ( morphTarget2 - position ) * morphTargetInfluences[ 2 ];",
 		"morphed += ( morphTarget3 - position ) * morphTargetInfluences[ 3 ];",
-		"morphed *= 0.25;",
+		"morphed += ( morphTarget4 - position ) * morphTargetInfluences[ 4 ];",
+		"morphed += ( morphTarget5 - position ) * morphTargetInfluences[ 5 ];",
+		"morphed += ( morphTarget6 - position ) * morphTargetInfluences[ 6 ];",
+		"morphed += ( morphTarget7 - position ) * morphTargetInfluences[ 7 ];",
 		"morphed += position;",
 		
 		"gl_Position = projectionMatrix * modelViewMatrix * vec4( morphed, 1.0 );",