Browse Source

Synced with mrdoob's branch.

alteredq 14 years ago
parent
commit
abfa966fb9
4 changed files with 47 additions and 42 deletions
  1. 14 13
      build/Three.js
  2. 13 13
      build/ThreeDebug.js
  3. 9 9
      build/ThreeExtras.js
  4. 11 7
      src/renderers/CanvasRenderer.js

+ 14 - 13
build/Three.js

@@ -117,8 +117,8 @@ k.w);l.multiplyScalar(1/l.w);p=A[B]=A[B]||new THREE.RenderableLine;p.v1.position
 u.scale.y=F.scale.y*Math.abs(u.y-(e.y+n.projectionMatrix.n22)/(e.w+n.projectionMatrix.n24));u.materials=F.materials;s.push(u);y++}}}}z&&s.sort(a);return s};this.unprojectVector=function(q,n){var z=THREE.Matrix4.makeInvert(n.matrix);z.multiplySelf(THREE.Matrix4.makeInvert(n.projectionMatrix));z.multiplyVector3(q);return q}};
 u.scale.y=F.scale.y*Math.abs(u.y-(e.y+n.projectionMatrix.n22)/(e.w+n.projectionMatrix.n24));u.materials=F.materials;s.push(u);y++}}}}z&&s.sort(a);return s};this.unprojectVector=function(q,n){var z=THREE.Matrix4.makeInvert(n.matrix);z.multiplySelf(THREE.Matrix4.makeInvert(n.projectionMatrix));z.multiplyVector3(q);return q}};
 THREE.DOMRenderer=function(){THREE.Renderer.call(this);var a=null,c=new THREE.Projector,d,h,j,m;this.domElement=document.createElement("div");this.setSize=function(b,r){d=b;h=r;j=d/2;m=h/2};this.render=function(b,r){var o,p,B,A,u,y,H,L;a=c.projectScene(b,r);o=0;for(p=a.length;o<p;o++){u=a[o];if(u instanceof THREE.RenderableParticle){H=u.x*j+j;L=u.y*m+m;B=0;for(A=u.material.length;B<A;B++){y=u.material[B];if(y instanceof THREE.ParticleDOMMaterial){y=y.domElement;y.style.left=H+"px";y.style.top=L+"px"}}}}}};
 THREE.DOMRenderer=function(){THREE.Renderer.call(this);var a=null,c=new THREE.Projector,d,h,j,m;this.domElement=document.createElement("div");this.setSize=function(b,r){d=b;h=r;j=d/2;m=h/2};this.render=function(b,r){var o,p,B,A,u,y,H,L;a=c.projectScene(b,r);o=0;for(p=a.length;o<p;o++){u=a[o];if(u instanceof THREE.RenderableParticle){H=u.x*j+j;L=u.y*m+m;B=0;for(A=u.material.length;B<A;B++){y=u.material[B];if(y instanceof THREE.ParticleDOMMaterial){y=y.domElement;y.style.left=H+"px";y.style.top=L+"px"}}}}}};
 THREE.CanvasRenderer=function(){function a(ba){if(u!=ba)p.globalAlpha=u=ba}function c(ba){if(y!=ba){switch(ba){case THREE.NormalBlending:p.globalCompositeOperation="source-over";break;case THREE.AdditiveBlending:p.globalCompositeOperation="lighter";break;case THREE.SubtractiveBlending:p.globalCompositeOperation="darker"}y=ba}}var d=null,h=new THREE.Projector,j=document.createElement("canvas"),m,b,r,o,p=j.getContext("2d"),B=new THREE.Color(0),A=0,u=1,y=0,H=null,L=null,e=1,g,i,f,k,l,t,q,n,z,s=new THREE.Color,
 THREE.CanvasRenderer=function(){function a(ba){if(u!=ba)p.globalAlpha=u=ba}function c(ba){if(y!=ba){switch(ba){case THREE.NormalBlending:p.globalCompositeOperation="source-over";break;case THREE.AdditiveBlending:p.globalCompositeOperation="lighter";break;case THREE.SubtractiveBlending:p.globalCompositeOperation="darker"}y=ba}}var d=null,h=new THREE.Projector,j=document.createElement("canvas"),m,b,r,o,p=j.getContext("2d"),B=new THREE.Color(0),A=0,u=1,y=0,H=null,L=null,e=1,g,i,f,k,l,t,q,n,z,s=new THREE.Color,
-w=new THREE.Color,E=new THREE.Color,v=new THREE.Color,C=new THREE.Color,W,J,P,O,F,U,S,I,M,V=new THREE.Rectangle,R=new THREE.Rectangle,x=new THREE.Rectangle,K=false,T=new THREE.Color,Z=new THREE.Color,ma=new THREE.Color,ca=new THREE.Color,xa=Math.PI*2,$=new THREE.Vector3,ia,oa,ta,fa,da,ua,sa=16;ia=document.createElement("canvas");ia.width=ia.height=2;oa=ia.getContext("2d");oa.fillStyle="rgba(0,0,0,1)";oa.fillRect(0,0,2,2);ta=oa.getImageData(0,0,2,2);fa=ta.data;da=document.createElement("canvas");da.width=
-da.height=sa;ua=da.getContext("2d");ua.translate(-sa/2,-sa/2);ua.scale(sa,sa);sa--;this.domElement=j;this.sortElements=this.sortObjects=this.autoClear=true;this.setSize=function(ba,ja){m=ba;b=ja;r=m/2;o=b/2;j.width=m;j.height=b;V.set(-r,-o,r,o);u=1;y=0;L=H=null;e=1};this.setClearColor=function(ba,ja){B=ba;A=ja;R.set(-r,-o,r,o);p.setTransform(1,0,0,-1,r,o);this.clear()};this.setClearColorHex=function(ba,ja){B.setHex(ba);A=ja;R.set(-r,-o,r,o);p.setTransform(1,0,0,-1,r,o);this.clear()};this.clear=function(){p.setTransform(1,
+w=new THREE.Color,E=new THREE.Color,v=new THREE.Color,C=new THREE.Color,W,J,P,O,F,U,S,I,M,V=new THREE.Rectangle,R=new THREE.Rectangle,x=new THREE.Rectangle,K=false,T=new THREE.Color,Z=new THREE.Color,ma=new THREE.Color,ca=new THREE.Color,xa=Math.PI*2,$=new THREE.Vector3,ia,pa,ua,fa,da,va,ta=16;ia=document.createElement("canvas");ia.width=ia.height=2;pa=ia.getContext("2d");pa.fillStyle="rgba(0,0,0,1)";pa.fillRect(0,0,2,2);ua=pa.getImageData(0,0,2,2);fa=ua.data;da=document.createElement("canvas");da.width=
+da.height=ta;va=da.getContext("2d");va.translate(-ta/2,-ta/2);va.scale(ta,ta);ta--;this.domElement=j;this.sortElements=this.sortObjects=this.autoClear=true;this.setSize=function(ba,ja){m=ba;b=ja;r=m/2;o=b/2;j.width=m;j.height=b;V.set(-r,-o,r,o);u=1;y=0;L=H=null;e=1};this.setClearColor=function(ba,ja){B=ba;A=ja;R.set(-r,-o,r,o);p.setTransform(1,0,0,-1,r,o);this.clear()};this.setClearColorHex=function(ba,ja){B.setHex(ba);A=ja;R.set(-r,-o,r,o);p.setTransform(1,0,0,-1,r,o);this.clear()};this.clear=function(){p.setTransform(1,
 0,0,-1,r,o);if(!R.isEmpty()){R.inflate(1);R.minSelf(V);if(B.hex==0&&A==0)p.clearRect(R.getX(),R.getY(),R.getWidth(),R.getHeight());else{c(THREE.NormalBlending);a(1);p.fillStyle="rgba("+Math.floor(B.r*255)+","+Math.floor(B.g*255)+","+Math.floor(B.b*255)+","+A+")";p.fillRect(R.getX(),R.getY(),R.getWidth(),R.getHeight())}R.empty()}};this.render=function(ba,ja){function la(D){var X,Q,G,N=D.lights;Z.setRGB(0,0,0);ma.setRGB(0,0,0);ca.setRGB(0,0,0);D=0;for(X=N.length;D<X;D++){Q=N[D];G=Q.color;if(Q instanceof
 0,0,-1,r,o);if(!R.isEmpty()){R.inflate(1);R.minSelf(V);if(B.hex==0&&A==0)p.clearRect(R.getX(),R.getY(),R.getWidth(),R.getHeight());else{c(THREE.NormalBlending);a(1);p.fillStyle="rgba("+Math.floor(B.r*255)+","+Math.floor(B.g*255)+","+Math.floor(B.b*255)+","+A+")";p.fillRect(R.getX(),R.getY(),R.getWidth(),R.getHeight())}R.empty()}};this.render=function(ba,ja){function la(D){var X,Q,G,N=D.lights;Z.setRGB(0,0,0);ma.setRGB(0,0,0);ca.setRGB(0,0,0);D=0;for(X=N.length;D<X;D++){Q=N[D];G=Q.color;if(Q instanceof
 THREE.AmbientLight){Z.r+=G.r;Z.g+=G.g;Z.b+=G.b}else if(Q instanceof THREE.DirectionalLight){ma.r+=G.r;ma.g+=G.g;ma.b+=G.b}else if(Q instanceof THREE.PointLight){ca.r+=G.r;ca.g+=G.g;ca.b+=G.b}}}function Ba(D,X,Q,G){var N,Y,ea,ga,ha=D.lights;D=0;for(N=ha.length;D<N;D++){Y=ha[D];ea=Y.color;ga=Y.intensity;if(Y instanceof THREE.DirectionalLight){Y=Q.dot(Y.position)*ga;if(Y>0){G.r+=ea.r*Y;G.g+=ea.g*Y;G.b+=ea.b*Y}}else if(Y instanceof THREE.PointLight){$.sub(Y.position,X);$.normalize();Y=Q.dot($)*ga;if(Y>
 THREE.AmbientLight){Z.r+=G.r;Z.g+=G.g;Z.b+=G.b}else if(Q instanceof THREE.DirectionalLight){ma.r+=G.r;ma.g+=G.g;ma.b+=G.b}else if(Q instanceof THREE.PointLight){ca.r+=G.r;ca.g+=G.g;ca.b+=G.b}}}function Ba(D,X,Q,G){var N,Y,ea,ga,ha=D.lights;D=0;for(N=ha.length;D<N;D++){Y=ha[D];ea=Y.color;ga=Y.intensity;if(Y instanceof THREE.DirectionalLight){Y=Q.dot(Y.position)*ga;if(Y>0){G.r+=ea.r*Y;G.g+=ea.g*Y;G.b+=ea.b*Y}}else if(Y instanceof THREE.PointLight){$.sub(Y.position,X);$.normalize();Y=Q.dot($)*ga;if(Y>
 0){G.r+=ea.r*Y;G.g+=ea.g*Y;G.b+=ea.b*Y}}}}function Na(D,X,Q){if(Q.opacity!=0){a(Q.opacity);c(Q.blending);var G,N,Y,ea,ga,ha;if(Q instanceof THREE.ParticleBasicMaterial){if(Q.map&&Q.map.image.loaded){ea=Q.map.image;ga=ea.width>>1;ha=ea.height>>1;N=X.scale.x*r;Y=X.scale.y*o;Q=N*ga;G=Y*ha;x.set(D.x-Q,D.y-G,D.x+Q,D.y+G);if(V.instersects(x)){p.save();p.translate(D.x,D.y);p.rotate(-X.rotation);p.scale(N,-Y);p.translate(-ga,-ha);p.drawImage(ea,0,0);p.restore()}}}else if(Q instanceof THREE.ParticleCircleMaterial){if(K){T.r=
 0){G.r+=ea.r*Y;G.g+=ea.g*Y;G.b+=ea.b*Y}}}}function Na(D,X,Q){if(Q.opacity!=0){a(Q.opacity);c(Q.blending);var G,N,Y,ea,ga,ha;if(Q instanceof THREE.ParticleBasicMaterial){if(Q.map&&Q.map.image.loaded){ea=Q.map.image;ga=ea.width>>1;ha=ea.height>>1;N=X.scale.x*r;Y=X.scale.y*o;Q=N*ga;G=Y*ha;x.set(D.x-Q,D.y-G,D.x+Q,D.y+G);if(V.instersects(x)){p.save();p.translate(D.x,D.y);p.rotate(-X.rotation);p.scale(N,-Y);p.translate(-ga,-ha);p.drawImage(ea,0,0);p.restore()}}}else if(Q instanceof THREE.ParticleCircleMaterial){if(K){T.r=
@@ -128,12 +128,13 @@ p.beginPath();p.moveTo(k,l);p.lineTo(t,q);p.lineTo(n,z);p.lineTo(k,l);p.closePat
 D.n22+$.z*D.n23)*0.5+0.5;$.copy(G.vertexNormalsWorld[1]);U=($.x*D.n11+$.y*D.n12+$.z*D.n13)*0.5+0.5;S=-($.x*D.n21+$.y*D.n22+$.z*D.n23)*0.5+0.5;$.copy(G.vertexNormalsWorld[2]);I=($.x*D.n11+$.y*D.n12+$.z*D.n13)*0.5+0.5;M=-($.x*D.n21+$.y*D.n22+$.z*D.n23)*0.5+0.5;ya(k,l,t,q,n,z,N.env_map.image,O,F,U,S,I,M)}}else N.wireframe?Ca(N.color.__styleString,N.wireframe_linewidth):Da(N.color.__styleString);else if(N instanceof THREE.MeshLambertMaterial){if(N.map&&!N.wireframe){N.map.mapping instanceof THREE.UVMapping&&
 D.n22+$.z*D.n23)*0.5+0.5;$.copy(G.vertexNormalsWorld[1]);U=($.x*D.n11+$.y*D.n12+$.z*D.n13)*0.5+0.5;S=-($.x*D.n21+$.y*D.n22+$.z*D.n23)*0.5+0.5;$.copy(G.vertexNormalsWorld[2]);I=($.x*D.n11+$.y*D.n12+$.z*D.n13)*0.5+0.5;M=-($.x*D.n21+$.y*D.n22+$.z*D.n23)*0.5+0.5;ya(k,l,t,q,n,z,N.env_map.image,O,F,U,S,I,M)}}else N.wireframe?Ca(N.color.__styleString,N.wireframe_linewidth):Da(N.color.__styleString);else if(N instanceof THREE.MeshLambertMaterial){if(N.map&&!N.wireframe){N.map.mapping instanceof THREE.UVMapping&&
 ya(k,l,t,q,n,z,N.map.image,G.uvs[0].u,G.uvs[0].v,G.uvs[1].u,G.uvs[1].v,G.uvs[2].u,G.uvs[2].v);c(THREE.SubtractiveBlending)}if(K)if(!N.wireframe&&N.shading==THREE.SmoothShading&&G.vertexNormalsWorld.length==3){w.r=E.r=v.r=Z.r;w.g=E.g=v.g=Z.g;w.b=E.b=v.b=Z.b;Ba(Y,G.v1.positionWorld,G.vertexNormalsWorld[0],w);Ba(Y,G.v2.positionWorld,G.vertexNormalsWorld[1],E);Ba(Y,G.v3.positionWorld,G.vertexNormalsWorld[2],v);C.r=(E.r+v.r)*0.5;C.g=(E.g+v.g)*0.5;C.b=(E.b+v.b)*0.5;P=Ka(w,E,v,C);ya(k,l,t,q,n,z,P,0,0,1,
 ya(k,l,t,q,n,z,N.map.image,G.uvs[0].u,G.uvs[0].v,G.uvs[1].u,G.uvs[1].v,G.uvs[2].u,G.uvs[2].v);c(THREE.SubtractiveBlending)}if(K)if(!N.wireframe&&N.shading==THREE.SmoothShading&&G.vertexNormalsWorld.length==3){w.r=E.r=v.r=Z.r;w.g=E.g=v.g=Z.g;w.b=E.b=v.b=Z.b;Ba(Y,G.v1.positionWorld,G.vertexNormalsWorld[0],w);Ba(Y,G.v2.positionWorld,G.vertexNormalsWorld[1],E);Ba(Y,G.v3.positionWorld,G.vertexNormalsWorld[2],v);C.r=(E.r+v.r)*0.5;C.g=(E.g+v.g)*0.5;C.b=(E.b+v.b)*0.5;P=Ka(w,E,v,C);ya(k,l,t,q,n,z,P,0,0,1,
 0,0,1)}else{T.r=Z.r;T.g=Z.g;T.b=Z.b;Ba(Y,G.centroidWorld,G.normalWorld,T);s.r=N.color.r*T.r;s.g=N.color.g*T.g;s.b=N.color.b*T.b;s.updateStyleString();N.wireframe?Ca(s.__styleString,N.wireframe_linewidth):Da(s.__styleString)}else N.wireframe?Ca(N.color.__styleString,N.wireframe_linewidth):Da(N.color.__styleString)}else if(N instanceof THREE.MeshDepthMaterial){W=ja.near;J=ja.far;w.r=w.g=w.b=1-Fa(D.positionScreen.z,W,J);E.r=E.g=E.b=1-Fa(X.positionScreen.z,W,J);v.r=v.g=v.b=1-Fa(Q.positionScreen.z,W,J);
 0,0,1)}else{T.r=Z.r;T.g=Z.g;T.b=Z.b;Ba(Y,G.centroidWorld,G.normalWorld,T);s.r=N.color.r*T.r;s.g=N.color.g*T.g;s.b=N.color.b*T.b;s.updateStyleString();N.wireframe?Ca(s.__styleString,N.wireframe_linewidth):Da(s.__styleString)}else N.wireframe?Ca(N.color.__styleString,N.wireframe_linewidth):Da(N.color.__styleString)}else if(N instanceof THREE.MeshDepthMaterial){W=ja.near;J=ja.far;w.r=w.g=w.b=1-Fa(D.positionScreen.z,W,J);E.r=E.g=E.b=1-Fa(X.positionScreen.z,W,J);v.r=v.g=v.b=1-Fa(Q.positionScreen.z,W,J);
-C.r=(E.r+v.r)*0.5;C.g=(E.g+v.g)*0.5;C.b=(E.b+v.b)*0.5;P=Ka(w,E,v,C);ya(k,l,t,q,n,z,P,0,0,1,0,0,1)}else if(N instanceof THREE.MeshNormalMaterial){s.r=Ga(G.normalWorld.x);s.g=Ga(G.normalWorld.y);s.b=Ga(G.normalWorld.z);s.updateStyleString();N.wireframe?Ca(s.__styleString,N.wireframe_linewidth):Da(s.__styleString)}}}function Ca(D,X){if(H!=D)p.strokeStyle=H=D;if(e!=X)p.lineWidth=e=X;p.stroke();x.inflate(X*2)}function Da(D){if(L!=D)p.fillStyle=L=D;p.fill()}function ya(D,X,Q,G,N,Y,ea,ga,ha,pa,ka,qa,za){var va,
-ra;va=ea.width-1;ra=ea.height-1;ga*=va;ha*=ra;pa*=va;ka*=ra;qa*=va;za*=ra;Q-=D;G-=X;N-=D;Y-=X;pa-=ga;ka-=ha;qa-=ga;za-=ha;ra=1/(pa*za-qa*ka);va=(za*Q-ka*N)*ra;ka=(za*G-ka*Y)*ra;Q=(pa*N-qa*Q)*ra;G=(pa*Y-qa*G)*ra;D=D-va*ga-Q*ha;X=X-ka*ga-G*ha;p.save();p.transform(va,ka,Q,G,D,X);p.clip();p.drawImage(ea,0,0);p.restore()}function Ka(D,X,Q,G){var N=~~(D.r*255),Y=~~(D.g*255);D=~~(D.b*255);var ea=~~(X.r*255),ga=~~(X.g*255);X=~~(X.b*255);var ha=~~(Q.r*255),pa=~~(Q.g*255);Q=~~(Q.b*255);var ka=~~(G.r*255),qa=
-~~(G.g*255);G=~~(G.b*255);fa[0]=N<0?0:N>255?255:N;fa[1]=Y<0?0:Y>255?255:Y;fa[2]=D<0?0:D>255?255:D;fa[4]=ea<0?0:ea>255?255:ea;fa[5]=ga<0?0:ga>255?255:ga;fa[6]=X<0?0:X>255?255:X;fa[8]=ha<0?0:ha>255?255:ha;fa[9]=pa<0?0:pa>255?255:pa;fa[10]=Q<0?0:Q>255?255:Q;fa[12]=ka<0?0:ka>255?255:ka;fa[13]=qa<0?0:qa>255?255:qa;fa[14]=G<0?0:G>255?255:G;oa.putImageData(ta,0,0);ua.drawImage(ia,0,0);return da}function Fa(D,X,Q){D=(D-X)/(Q-X);return D*D*(3-2*D)}function Ga(D){D=(D+1)*0.5;return D<0?0:D>1?1:D}function Ha(D,
-X){var Q=X.x-D.x,G=X.y-D.y,N=1/Math.sqrt(Q*Q+G*G);Q*=N;G*=N;X.x+=Q;X.y+=G;D.x-=Q;D.y-=G}var Ea,La,aa,na,wa,Ia,Ma,Aa;this.autoClear?this.clear():p.setTransform(1,0,0,-1,r,o);d=h.projectScene(ba,ja,this.sortElements);(K=ba.lights.length>0)&&la(ba);Ea=0;for(La=d.length;Ea<La;Ea++){aa=d[Ea];x.empty();if(aa instanceof THREE.RenderableParticle){g=aa;g.x*=r;g.y*=o;na=0;for(wa=aa.materials.length;na<wa;na++)Na(g,aa,aa.materials[na],ba)}else if(aa instanceof THREE.RenderableLine){g=aa.v1;i=aa.v2;g.positionScreen.x*=
-r;g.positionScreen.y*=o;i.positionScreen.x*=r;i.positionScreen.y*=o;x.addPoint(g.positionScreen.x,g.positionScreen.y);x.addPoint(i.positionScreen.x,i.positionScreen.y);if(V.instersects(x)){na=0;for(wa=aa.materials.length;na<wa;)Oa(g,i,aa,aa.materials[na++],ba)}}else if(aa instanceof THREE.RenderableFace3){g=aa.v1;i=aa.v2;f=aa.v3;g.positionScreen.x*=r;g.positionScreen.y*=o;i.positionScreen.x*=r;i.positionScreen.y*=o;f.positionScreen.x*=r;f.positionScreen.y*=o;if(aa.overdraw){Ha(g.positionScreen,i.positionScreen);
-Ha(i.positionScreen,f.positionScreen);Ha(f.positionScreen,g.positionScreen)}x.add3Points(g.positionScreen.x,g.positionScreen.y,i.positionScreen.x,i.positionScreen.y,f.positionScreen.x,f.positionScreen.y);if(V.instersects(x)){na=0;for(wa=aa.meshMaterials.length;na<wa;){Aa=aa.meshMaterials[na++];if(Aa instanceof THREE.MeshFaceMaterial){Ia=0;for(Ma=aa.faceMaterials.length;Ia<Ma;)(Aa=aa.faceMaterials[Ia++])&&Ja(g,i,f,aa,Aa,ba)}else Ja(g,i,f,aa,Aa,ba)}}}R.addRectangle(x)}p.setTransform(1,0,0,1,0,0)}};
+C.r=(E.r+v.r)*0.5;C.g=(E.g+v.g)*0.5;C.b=(E.b+v.b)*0.5;P=Ka(w,E,v,C);ya(k,l,t,q,n,z,P,0,0,1,0,0,1)}else if(N instanceof THREE.MeshNormalMaterial){s.r=Ga(G.normalWorld.x);s.g=Ga(G.normalWorld.y);s.b=Ga(G.normalWorld.z);s.updateStyleString();N.wireframe?Ca(s.__styleString,N.wireframe_linewidth):Da(s.__styleString)}}}function Ca(D,X){if(H!=D)p.strokeStyle=H=D;if(e!=X)p.lineWidth=e=X;p.stroke();x.inflate(X*2)}function Da(D){if(L!=D)p.fillStyle=L=D;p.fill()}function ya(D,X,Q,G,N,Y,ea,ga,ha,qa,ka,ra,za){var na,
+sa;na=ea.width-1;sa=ea.height-1;ga*=na;ha*=sa;qa*=na;ka*=sa;ra*=na;za*=sa;Q-=D;G-=X;N-=D;Y-=X;qa-=ga;ka-=ha;ra-=ga;za-=ha;na=qa*za-ra*ka;if(na!=0){sa=1/na;na=(za*Q-ka*N)*sa;ka=(za*G-ka*Y)*sa;Q=(qa*N-ra*Q)*sa;G=(qa*Y-ra*G)*sa;D=D-na*ga-Q*ha;X=X-ka*ga-G*ha;p.save();p.transform(na,ka,Q,G,D,X);p.clip();p.drawImage(ea,0,0);p.restore()}}function Ka(D,X,Q,G){var N=~~(D.r*255),Y=~~(D.g*255);D=~~(D.b*255);var ea=~~(X.r*255),ga=~~(X.g*255);X=~~(X.b*255);var ha=~~(Q.r*255),qa=~~(Q.g*255);Q=~~(Q.b*255);var ka=
+~~(G.r*255),ra=~~(G.g*255);G=~~(G.b*255);fa[0]=N<0?0:N>255?255:N;fa[1]=Y<0?0:Y>255?255:Y;fa[2]=D<0?0:D>255?255:D;fa[4]=ea<0?0:ea>255?255:ea;fa[5]=ga<0?0:ga>255?255:ga;fa[6]=X<0?0:X>255?255:X;fa[8]=ha<0?0:ha>255?255:ha;fa[9]=qa<0?0:qa>255?255:qa;fa[10]=Q<0?0:Q>255?255:Q;fa[12]=ka<0?0:ka>255?255:ka;fa[13]=ra<0?0:ra>255?255:ra;fa[14]=G<0?0:G>255?255:G;pa.putImageData(ua,0,0);va.drawImage(ia,0,0);return da}function Fa(D,X,Q){D=(D-X)/(Q-X);return D*D*(3-2*D)}function Ga(D){D=(D+1)*0.5;return D<0?0:D>1?
+1:D}function Ha(D,X){var Q=X.x-D.x,G=X.y-D.y,N=1/Math.sqrt(Q*Q+G*G);Q*=N;G*=N;X.x+=Q;X.y+=G;D.x-=Q;D.y-=G}var Ea,La,aa,oa,wa,Ia,Ma,Aa;this.autoClear?this.clear():p.setTransform(1,0,0,-1,r,o);d=h.projectScene(ba,ja,this.sortElements);(K=ba.lights.length>0)&&la(ba);Ea=0;for(La=d.length;Ea<La;Ea++){aa=d[Ea];x.empty();if(aa instanceof THREE.RenderableParticle){g=aa;g.x*=r;g.y*=o;oa=0;for(wa=aa.materials.length;oa<wa;oa++)Na(g,aa,aa.materials[oa],ba)}else if(aa instanceof THREE.RenderableLine){g=aa.v1;
+i=aa.v2;g.positionScreen.x*=r;g.positionScreen.y*=o;i.positionScreen.x*=r;i.positionScreen.y*=o;x.addPoint(g.positionScreen.x,g.positionScreen.y);x.addPoint(i.positionScreen.x,i.positionScreen.y);if(V.instersects(x)){oa=0;for(wa=aa.materials.length;oa<wa;)Oa(g,i,aa,aa.materials[oa++],ba)}}else if(aa instanceof THREE.RenderableFace3){g=aa.v1;i=aa.v2;f=aa.v3;g.positionScreen.x*=r;g.positionScreen.y*=o;i.positionScreen.x*=r;i.positionScreen.y*=o;f.positionScreen.x*=r;f.positionScreen.y*=o;if(aa.overdraw){Ha(g.positionScreen,
+i.positionScreen);Ha(i.positionScreen,f.positionScreen);Ha(f.positionScreen,g.positionScreen)}x.add3Points(g.positionScreen.x,g.positionScreen.y,i.positionScreen.x,i.positionScreen.y,f.positionScreen.x,f.positionScreen.y);if(V.instersects(x)){oa=0;for(wa=aa.meshMaterials.length;oa<wa;){Aa=aa.meshMaterials[oa++];if(Aa instanceof THREE.MeshFaceMaterial){Ia=0;for(Ma=aa.faceMaterials.length;Ia<Ma;)(Aa=aa.faceMaterials[Ia++])&&Ja(g,i,f,aa,Aa,ba)}else Ja(g,i,f,aa,Aa,ba)}}}R.addRectangle(x)}p.setTransform(1,
+0,0,1,0,0)}};
 THREE.SVGRenderer=function(){function a(O,F,U){var S,I,M,V;S=0;for(I=O.lights.length;S<I;S++){M=O.lights[S];if(M instanceof THREE.DirectionalLight){V=F.normalWorld.dot(M.position)*M.intensity;if(V>0){U.r+=M.color.r*V;U.g+=M.color.g*V;U.b+=M.color.b*V}}else if(M instanceof THREE.PointLight){z.sub(M.position,F.centroidWorld);z.normalize();V=F.normalWorld.dot(z)*M.intensity;if(V>0){U.r+=M.color.r*V;U.g+=M.color.g*V;U.b+=M.color.b*V}}}}function c(O,F,U,S,I,M){v=h(C++);v.setAttribute("d","M "+O.positionScreen.x+
 THREE.SVGRenderer=function(){function a(O,F,U){var S,I,M,V;S=0;for(I=O.lights.length;S<I;S++){M=O.lights[S];if(M instanceof THREE.DirectionalLight){V=F.normalWorld.dot(M.position)*M.intensity;if(V>0){U.r+=M.color.r*V;U.g+=M.color.g*V;U.b+=M.color.b*V}}else if(M instanceof THREE.PointLight){z.sub(M.position,F.centroidWorld);z.normalize();V=F.normalWorld.dot(z)*M.intensity;if(V>0){U.r+=M.color.r*V;U.g+=M.color.g*V;U.b+=M.color.b*V}}}}function c(O,F,U,S,I,M){v=h(C++);v.setAttribute("d","M "+O.positionScreen.x+
 " "+O.positionScreen.y+" L "+F.positionScreen.x+" "+F.positionScreen.y+" L "+U.positionScreen.x+","+U.positionScreen.y+"z");if(I instanceof THREE.MeshBasicMaterial)f.__styleString=I.color.__styleString;else if(I instanceof THREE.MeshLambertMaterial)if(i){k.r=l.r;k.g=l.g;k.b=l.b;a(M,S,k);f.r=I.color.r*k.r;f.g=I.color.g*k.g;f.b=I.color.b*k.b;f.updateStyleString()}else f.__styleString=I.color.__styleString;else if(I instanceof THREE.MeshDepthMaterial){n=1-I.__2near/(I.__farPlusNear-S.z*I.__farMinusNear);
 " "+O.positionScreen.y+" L "+F.positionScreen.x+" "+F.positionScreen.y+" L "+U.positionScreen.x+","+U.positionScreen.y+"z");if(I instanceof THREE.MeshBasicMaterial)f.__styleString=I.color.__styleString;else if(I instanceof THREE.MeshLambertMaterial)if(i){k.r=l.r;k.g=l.g;k.b=l.b;a(M,S,k);f.r=I.color.r*k.r;f.g=I.color.g*k.g;f.b=I.color.b*k.b;f.updateStyleString()}else f.__styleString=I.color.__styleString;else if(I instanceof THREE.MeshDepthMaterial){n=1-I.__2near/(I.__farPlusNear-S.z*I.__farMinusNear);
 f.setRGB(n,n,n)}else I instanceof THREE.MeshNormalMaterial&&f.setRGB(j(S.normalWorld.x),j(S.normalWorld.y),j(S.normalWorld.z));I.wireframe?v.setAttribute("style","fill: none; stroke: "+f.__styleString+"; stroke-width: "+I.wireframe_linewidth+"; stroke-opacity: "+I.opacity+"; stroke-linecap: "+I.wireframe_linecap+"; stroke-linejoin: "+I.wireframe_linejoin):v.setAttribute("style","fill: "+f.__styleString+"; fill-opacity: "+I.opacity);r.appendChild(v)}function d(O,F,U,S,I,M,V){v=h(C++);v.setAttribute("d",
 f.setRGB(n,n,n)}else I instanceof THREE.MeshNormalMaterial&&f.setRGB(j(S.normalWorld.x),j(S.normalWorld.y),j(S.normalWorld.z));I.wireframe?v.setAttribute("style","fill: none; stroke: "+f.__styleString+"; stroke-width: "+I.wireframe_linewidth+"; stroke-opacity: "+I.opacity+"; stroke-linecap: "+I.wireframe_linecap+"; stroke-linejoin: "+I.wireframe_linejoin):v.setAttribute("style","fill: "+f.__styleString+"; fill-opacity: "+I.opacity);r.appendChild(v)}function d(O,F,U,S,I,M,V){v=h(C++);v.setAttribute("d",
@@ -159,12 +160,12 @@ this.createLineBuffers=function(e){e.__webGLVertexBuffer=b.createBuffer();e.__we
 function(e){var g=e.vertices.length;e.__vertexArray=new Float32Array(g*3);e.__colorArray=new Float32Array(g*3);e.__lineArray=new Uint16Array(g);e.__webGLLineCount=g};this.initParticleBuffers=function(e){var g=e.vertices.length;e.__vertexArray=new Float32Array(g*3);e.__colorArray=new Float32Array(g*3);e.__particleArray=new Uint16Array(g);e.__sortArray=[];e.__webGLParticleCount=g};this.initMeshBuffers=function(e,g){var i,f,k=0,l=0,t=0,q=g.geometry.faces,n=e.faces;i=0;for(f=n.length;i<f;i++){fi=n[i];
 function(e){var g=e.vertices.length;e.__vertexArray=new Float32Array(g*3);e.__colorArray=new Float32Array(g*3);e.__lineArray=new Uint16Array(g);e.__webGLLineCount=g};this.initParticleBuffers=function(e){var g=e.vertices.length;e.__vertexArray=new Float32Array(g*3);e.__colorArray=new Float32Array(g*3);e.__particleArray=new Uint16Array(g);e.__sortArray=[];e.__webGLParticleCount=g};this.initMeshBuffers=function(e,g){var i,f,k=0,l=0,t=0,q=g.geometry.faces,n=e.faces;i=0;for(f=n.length;i<f;i++){fi=n[i];
 face=q[fi];if(face instanceof THREE.Face3){k+=3;l+=1;t+=3}else if(face instanceof THREE.Face4){k+=4;l+=2;t+=4}}e.__vertexArray=new Float32Array(k*3);e.__normalArray=new Float32Array(k*3);e.__tangentArray=new Float32Array(k*4);e.__colorArray=new Float32Array(k*3);e.__uvArray=new Float32Array(k*2);e.__uv2Array=new Float32Array(k*2);e.__faceArray=new Uint16Array(l*3);e.__lineArray=new Uint16Array(t*2);k=false;i=0;for(f=g.materials.length;i<f;i++){q=g.materials[i];if(q instanceof THREE.MeshFaceMaterial){q=
 face=q[fi];if(face instanceof THREE.Face3){k+=3;l+=1;t+=3}else if(face instanceof THREE.Face4){k+=4;l+=2;t+=4}}e.__vertexArray=new Float32Array(k*3);e.__normalArray=new Float32Array(k*3);e.__tangentArray=new Float32Array(k*4);e.__colorArray=new Float32Array(k*3);e.__uvArray=new Float32Array(k*2);e.__uv2Array=new Float32Array(k*2);e.__faceArray=new Uint16Array(l*3);e.__lineArray=new Uint16Array(t*2);k=false;i=0;for(f=g.materials.length;i<f;i++){q=g.materials[i];if(q instanceof THREE.MeshFaceMaterial){q=
 0;for(n=e.materials.length;q<n;q++)if(e.materials[q]&&e.materials[q].shading!=undefined&&e.materials[q].shading==THREE.SmoothShading){k=true;break}}else if(q&&q.shading!=undefined&&q.shading==THREE.SmoothShading){k=true;break}if(k)break}e.__needsSmoothNormals=k;e.__webGLFaceCount=l*3;e.__webGLLineCount=t*2};this.setMeshBuffers=function(e,g,i){var f,k,l,t,q,n,z,s,w,E,v=0,C=0,W=0,J=0,P=0,O=0,F=0,U=0,S=0,I=e.__vertexArray,M=e.__uvArray,V=e.__uv2Array,R=e.__normalArray,x=e.__tangentArray,K=e.__colorArray,
 0;for(n=e.materials.length;q<n;q++)if(e.materials[q]&&e.materials[q].shading!=undefined&&e.materials[q].shading==THREE.SmoothShading){k=true;break}}else if(q&&q.shading!=undefined&&q.shading==THREE.SmoothShading){k=true;break}if(k)break}e.__needsSmoothNormals=k;e.__webGLFaceCount=l*3;e.__webGLLineCount=t*2};this.setMeshBuffers=function(e,g,i){var f,k,l,t,q,n,z,s,w,E,v=0,C=0,W=0,J=0,P=0,O=0,F=0,U=0,S=0,I=e.__vertexArray,M=e.__uvArray,V=e.__uv2Array,R=e.__normalArray,x=e.__tangentArray,K=e.__colorArray,
-T=e.__faceArray,Z=e.__lineArray,ma=e.__needsSmoothNormals,ca=g.geometry,xa=ca.__dirtyVertices,$=ca.__dirtyElements,ia=ca.__dirtyUvs,oa=ca.__dirtyNormals,ta=ca.__dirtyTangents,fa=ca.__dirtyColors,da=ca.vertices,ua=e.faces,sa=ca.faces,ba=ca.uvs,ja=ca.uvs2,la=ca.colors;g=0;for(f=ua.length;g<f;g++){k=ua[g];l=sa[k];n=ba[k];k=ja[k];t=l.vertexNormals;q=l.normal;if(l instanceof THREE.Face3){if(xa){z=da[l.a].position;s=da[l.b].position;w=da[l.c].position;I[C]=z.x;I[C+1]=z.y;I[C+2]=z.z;I[C+3]=s.x;I[C+4]=s.y;
-I[C+5]=s.z;I[C+6]=w.x;I[C+7]=w.y;I[C+8]=w.z;C+=9}if(fa&&la.length){z=la[l.a];s=la[l.b];w=la[l.c];K[S]=z.r;K[S+1]=z.g;K[S+2]=z.b;K[S+3]=s.r;K[S+4]=s.g;K[S+5]=s.b;K[S+6]=w.r;K[S+7]=w.g;K[S+8]=w.b;S+=9}if(ta&&ca.hasTangents){z=da[l.a].tangent;s=da[l.b].tangent;w=da[l.c].tangent;x[F]=z.x;x[F+1]=z.y;x[F+2]=z.z;x[F+3]=z.w;x[F+4]=s.x;x[F+5]=s.y;x[F+6]=s.z;x[F+7]=s.w;x[F+8]=w.x;x[F+9]=w.y;x[F+10]=w.z;x[F+11]=w.w;F+=12}if(oa)if(t.length==3&&ma)for(l=0;l<3;l++){q=t[l];R[O]=q.x;R[O+1]=q.y;R[O+2]=q.z;O+=3}else for(l=
+T=e.__faceArray,Z=e.__lineArray,ma=e.__needsSmoothNormals,ca=g.geometry,xa=ca.__dirtyVertices,$=ca.__dirtyElements,ia=ca.__dirtyUvs,pa=ca.__dirtyNormals,ua=ca.__dirtyTangents,fa=ca.__dirtyColors,da=ca.vertices,va=e.faces,ta=ca.faces,ba=ca.uvs,ja=ca.uvs2,la=ca.colors;g=0;for(f=va.length;g<f;g++){k=va[g];l=ta[k];n=ba[k];k=ja[k];t=l.vertexNormals;q=l.normal;if(l instanceof THREE.Face3){if(xa){z=da[l.a].position;s=da[l.b].position;w=da[l.c].position;I[C]=z.x;I[C+1]=z.y;I[C+2]=z.z;I[C+3]=s.x;I[C+4]=s.y;
+I[C+5]=s.z;I[C+6]=w.x;I[C+7]=w.y;I[C+8]=w.z;C+=9}if(fa&&la.length){z=la[l.a];s=la[l.b];w=la[l.c];K[S]=z.r;K[S+1]=z.g;K[S+2]=z.b;K[S+3]=s.r;K[S+4]=s.g;K[S+5]=s.b;K[S+6]=w.r;K[S+7]=w.g;K[S+8]=w.b;S+=9}if(ua&&ca.hasTangents){z=da[l.a].tangent;s=da[l.b].tangent;w=da[l.c].tangent;x[F]=z.x;x[F+1]=z.y;x[F+2]=z.z;x[F+3]=z.w;x[F+4]=s.x;x[F+5]=s.y;x[F+6]=s.z;x[F+7]=s.w;x[F+8]=w.x;x[F+9]=w.y;x[F+10]=w.z;x[F+11]=w.w;F+=12}if(pa)if(t.length==3&&ma)for(l=0;l<3;l++){q=t[l];R[O]=q.x;R[O+1]=q.y;R[O+2]=q.z;O+=3}else for(l=
 0;l<3;l++){R[O]=q.x;R[O+1]=q.y;R[O+2]=q.z;O+=3}if(ia&&n)for(l=0;l<3;l++){t=n[l];M[W]=t.u;M[W+1]=t.v;W+=2}if(ia&&k)for(l=0;l<3;l++){n=k[l];V[J]=n.u;V[J+1]=n.v;J+=2}if($){T[P]=v;T[P+1]=v+1;T[P+2]=v+2;P+=3;Z[U]=v;Z[U+1]=v+1;Z[U+2]=v;Z[U+3]=v+2;Z[U+4]=v+1;Z[U+5]=v+2;U+=6;v+=3}}else if(l instanceof THREE.Face4){if(xa){z=da[l.a].position;s=da[l.b].position;w=da[l.c].position;E=da[l.d].position;I[C]=z.x;I[C+1]=z.y;I[C+2]=z.z;I[C+3]=s.x;I[C+4]=s.y;I[C+5]=s.z;I[C+6]=w.x;I[C+7]=w.y;I[C+8]=w.z;I[C+9]=E.x;I[C+
 0;l<3;l++){R[O]=q.x;R[O+1]=q.y;R[O+2]=q.z;O+=3}if(ia&&n)for(l=0;l<3;l++){t=n[l];M[W]=t.u;M[W+1]=t.v;W+=2}if(ia&&k)for(l=0;l<3;l++){n=k[l];V[J]=n.u;V[J+1]=n.v;J+=2}if($){T[P]=v;T[P+1]=v+1;T[P+2]=v+2;P+=3;Z[U]=v;Z[U+1]=v+1;Z[U+2]=v;Z[U+3]=v+2;Z[U+4]=v+1;Z[U+5]=v+2;U+=6;v+=3}}else if(l instanceof THREE.Face4){if(xa){z=da[l.a].position;s=da[l.b].position;w=da[l.c].position;E=da[l.d].position;I[C]=z.x;I[C+1]=z.y;I[C+2]=z.z;I[C+3]=s.x;I[C+4]=s.y;I[C+5]=s.z;I[C+6]=w.x;I[C+7]=w.y;I[C+8]=w.z;I[C+9]=E.x;I[C+
-10]=E.y;I[C+11]=E.z;C+=12}if(fa&&la.length){z=la[l.a];s=la[l.b];w=la[l.d];K[S]=z.r;K[S+1]=z.g;K[S+2]=z.b;K[S+3]=s.r;K[S+4]=s.g;K[S+5]=s.b;K[S+6]=w.r;K[S+7]=w.g;K[S+8]=w.b;K[S+9]=(void 0).r;K[S+10]=(void 0).g;K[S+11]=(void 0).b;S+=12}if(ta&&ca.hasTangents){z=da[l.a].tangent;s=da[l.b].tangent;w=da[l.c].tangent;l=da[l.d].tangent;x[F]=z.x;x[F+1]=z.y;x[F+2]=z.z;x[F+3]=z.w;x[F+4]=s.x;x[F+5]=s.y;x[F+6]=s.z;x[F+7]=s.w;x[F+8]=w.x;x[F+9]=w.y;x[F+10]=w.z;x[F+11]=w.w;x[F+12]=l.x;x[F+13]=l.y;x[F+14]=l.z;x[F+15]=
-l.w;F+=16}if(oa)if(t.length==4&&ma)for(l=0;l<4;l++){q=t[l];R[O]=q.x;R[O+1]=q.y;R[O+2]=q.z;O+=3}else for(l=0;l<4;l++){R[O]=q.x;R[O+1]=q.y;R[O+2]=q.z;O+=3}if(ia&&n)for(l=0;l<4;l++){t=n[l];M[W]=t.u;M[W+1]=t.v;W+=2}if(ia&&k)for(l=0;l<4;l++){n=k[l];V[J]=n.u;V[J+1]=n.v;J+=2}if($){T[P]=v;T[P+1]=v+1;T[P+2]=v+2;T[P+3]=v;T[P+4]=v+2;T[P+5]=v+3;P+=6;Z[U]=v;Z[U+1]=v+1;Z[U+2]=v;Z[U+3]=v+3;Z[U+4]=v+1;Z[U+5]=v+2;Z[U+6]=v+2;Z[U+7]=v+3;U+=8;v+=4}}}if(xa){b.bindBuffer(b.ARRAY_BUFFER,e.__webGLVertexBuffer);b.bufferData(b.ARRAY_BUFFER,
-I,i)}if(fa&&la.length){b.bindBuffer(b.ARRAY_BUFFER,e.__webGLColorBuffer);b.bufferData(b.ARRAY_BUFFER,K,i)}if(oa){b.bindBuffer(b.ARRAY_BUFFER,e.__webGLNormalBuffer);b.bufferData(b.ARRAY_BUFFER,R,i)}if(ta&&ca.hasTangents){b.bindBuffer(b.ARRAY_BUFFER,e.__webGLTangentBuffer);b.bufferData(b.ARRAY_BUFFER,x,i)}if(ia&&W>0){b.bindBuffer(b.ARRAY_BUFFER,e.__webGLUVBuffer);b.bufferData(b.ARRAY_BUFFER,M,i)}if(ia&&J>0){b.bindBuffer(b.ARRAY_BUFFER,e.__webGLUV2Buffer);b.bufferData(b.ARRAY_BUFFER,V,i)}if($){b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,
+10]=E.y;I[C+11]=E.z;C+=12}if(fa&&la.length){z=la[l.a];s=la[l.b];w=la[l.d];K[S]=z.r;K[S+1]=z.g;K[S+2]=z.b;K[S+3]=s.r;K[S+4]=s.g;K[S+5]=s.b;K[S+6]=w.r;K[S+7]=w.g;K[S+8]=w.b;K[S+9]=(void 0).r;K[S+10]=(void 0).g;K[S+11]=(void 0).b;S+=12}if(ua&&ca.hasTangents){z=da[l.a].tangent;s=da[l.b].tangent;w=da[l.c].tangent;l=da[l.d].tangent;x[F]=z.x;x[F+1]=z.y;x[F+2]=z.z;x[F+3]=z.w;x[F+4]=s.x;x[F+5]=s.y;x[F+6]=s.z;x[F+7]=s.w;x[F+8]=w.x;x[F+9]=w.y;x[F+10]=w.z;x[F+11]=w.w;x[F+12]=l.x;x[F+13]=l.y;x[F+14]=l.z;x[F+15]=
+l.w;F+=16}if(pa)if(t.length==4&&ma)for(l=0;l<4;l++){q=t[l];R[O]=q.x;R[O+1]=q.y;R[O+2]=q.z;O+=3}else for(l=0;l<4;l++){R[O]=q.x;R[O+1]=q.y;R[O+2]=q.z;O+=3}if(ia&&n)for(l=0;l<4;l++){t=n[l];M[W]=t.u;M[W+1]=t.v;W+=2}if(ia&&k)for(l=0;l<4;l++){n=k[l];V[J]=n.u;V[J+1]=n.v;J+=2}if($){T[P]=v;T[P+1]=v+1;T[P+2]=v+2;T[P+3]=v;T[P+4]=v+2;T[P+5]=v+3;P+=6;Z[U]=v;Z[U+1]=v+1;Z[U+2]=v;Z[U+3]=v+3;Z[U+4]=v+1;Z[U+5]=v+2;Z[U+6]=v+2;Z[U+7]=v+3;U+=8;v+=4}}}if(xa){b.bindBuffer(b.ARRAY_BUFFER,e.__webGLVertexBuffer);b.bufferData(b.ARRAY_BUFFER,
+I,i)}if(fa&&la.length){b.bindBuffer(b.ARRAY_BUFFER,e.__webGLColorBuffer);b.bufferData(b.ARRAY_BUFFER,K,i)}if(pa){b.bindBuffer(b.ARRAY_BUFFER,e.__webGLNormalBuffer);b.bufferData(b.ARRAY_BUFFER,R,i)}if(ua&&ca.hasTangents){b.bindBuffer(b.ARRAY_BUFFER,e.__webGLTangentBuffer);b.bufferData(b.ARRAY_BUFFER,x,i)}if(ia&&W>0){b.bindBuffer(b.ARRAY_BUFFER,e.__webGLUVBuffer);b.bufferData(b.ARRAY_BUFFER,M,i)}if(ia&&J>0){b.bindBuffer(b.ARRAY_BUFFER,e.__webGLUV2Buffer);b.bufferData(b.ARRAY_BUFFER,V,i)}if($){b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,
 e.__webGLFaceBuffer);b.bufferData(b.ELEMENT_ARRAY_BUFFER,T,i);b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,e.__webGLLineBuffer);b.bufferData(b.ELEMENT_ARRAY_BUFFER,Z,i)}};this.setLineBuffers=function(e,g){var i,f,k,l=e.vertices,t=e.colors,q=l.length,n=t.length,z=e.__vertexArray,s=e.__colorArray,w=e.__lineArray,E=e.__dirtyColors,v=e.__dirtyElements;if(e.__dirtyVertices){for(i=0;i<q;i++){f=l[i].position;k=i*3;z[k]=f.x;z[k+1]=f.y;z[k+2]=f.z}b.bindBuffer(b.ARRAY_BUFFER,e.__webGLVertexBuffer);b.bufferData(b.ARRAY_BUFFER,
 e.__webGLFaceBuffer);b.bufferData(b.ELEMENT_ARRAY_BUFFER,T,i);b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,e.__webGLLineBuffer);b.bufferData(b.ELEMENT_ARRAY_BUFFER,Z,i)}};this.setLineBuffers=function(e,g){var i,f,k,l=e.vertices,t=e.colors,q=l.length,n=t.length,z=e.__vertexArray,s=e.__colorArray,w=e.__lineArray,E=e.__dirtyColors,v=e.__dirtyElements;if(e.__dirtyVertices){for(i=0;i<q;i++){f=l[i].position;k=i*3;z[k]=f.x;z[k+1]=f.y;z[k+2]=f.z}b.bindBuffer(b.ARRAY_BUFFER,e.__webGLVertexBuffer);b.bufferData(b.ARRAY_BUFFER,
 z,g)}if(E){for(i=0;i<n;i++){color=t[i];k=i*3;s[k]=color.r;s[k+1]=color.g;s[k+2]=color.b}b.bindBuffer(b.ARRAY_BUFFER,e.__webGLColorBuffer);b.bufferData(b.ARRAY_BUFFER,s,g)}if(v){for(i=0;i<q;i++)w[i]=i;b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,e.__webGLLineBuffer);b.bufferData(b.ELEMENT_ARRAY_BUFFER,w,g)}};this.setParticleBuffers=function(e,g,i,f){var k,l,t;l=e.vertices;var q=l.length,n=e.colors,z=n.length,s=e.__vertexArray,w=e.__particleArray,E=e.__colorArray,v=e.__sortArray,C=e.__dirtyVertices,W=e.__dirtyElements,
 z,g)}if(E){for(i=0;i<n;i++){color=t[i];k=i*3;s[k]=color.r;s[k+1]=color.g;s[k+2]=color.b}b.bindBuffer(b.ARRAY_BUFFER,e.__webGLColorBuffer);b.bufferData(b.ARRAY_BUFFER,s,g)}if(v){for(i=0;i<q;i++)w[i]=i;b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,e.__webGLLineBuffer);b.bufferData(b.ELEMENT_ARRAY_BUFFER,w,g)}};this.setParticleBuffers=function(e,g,i,f){var k,l,t;l=e.vertices;var q=l.length,n=e.colors,z=n.length,s=e.__vertexArray,w=e.__particleArray,E=e.__colorArray,v=e.__sortArray,C=e.__dirtyVertices,W=e.__dirtyElements,
 J=e.__dirtyColors;if(i.sortParticles){p.multiply(f.projectionMatrix,f.matrix);p.multiplySelf(i.matrix);for(k=0;k<q;k++){t=l[k].position;u.copy(t);p.multiplyVector3(u);v[k]=[u.z,k]}v.sort(function(P,O){return O[0]-P[0]});for(k=0;k<q;k++){t=l[v[k][1]].position;f=k*3;s[f]=t.x;s[f+1]=t.y;s[f+2]=t.z}for(l=0;l<z;l++){f=l*3;color=n[v[l][1]];E[f]=color.r;E[f+1]=color.g;E[f+2]=color.b}}else{if(C)for(k=0;k<q;k++){t=l[k].position;f=k*3;s[f]=t.x;s[f+1]=t.y;s[f+2]=t.z}if(J)for(l=0;l<z;l++){color=n[l];f=l*3;E[f]=
 J=e.__dirtyColors;if(i.sortParticles){p.multiply(f.projectionMatrix,f.matrix);p.multiplySelf(i.matrix);for(k=0;k<q;k++){t=l[k].position;u.copy(t);p.multiplyVector3(u);v[k]=[u.z,k]}v.sort(function(P,O){return O[0]-P[0]});for(k=0;k<q;k++){t=l[v[k][1]].position;f=k*3;s[f]=t.x;s[f+1]=t.y;s[f+2]=t.z}for(l=0;l<z;l++){f=l*3;color=n[v[l][1]];E[f]=color.r;E[f+1]=color.g;E[f+2]=color.b}}else{if(C)for(k=0;k<q;k++){t=l[k].position;f=k*3;s[f]=t.x;s[f+1]=t.y;s[f+2]=t.z}if(J)for(l=0;l<z;l++){color=n[l];f=l*3;E[f]=

+ 13 - 13
build/ThreeDebug.js

@@ -117,8 +117,8 @@ k.w);l.multiplyScalar(1/l.w);p=A[B]=A[B]||new THREE.RenderableLine;p.v1.position
 u.scale.y=F.scale.y*Math.abs(u.y-(e.y+n.projectionMatrix.n22)/(e.w+n.projectionMatrix.n24));u.materials=F.materials;s.push(u);y++}}}}z&&s.sort(a);return s};this.unprojectVector=function(q,n){var z=THREE.Matrix4.makeInvert(n.matrix);z.multiplySelf(THREE.Matrix4.makeInvert(n.projectionMatrix));z.multiplyVector3(q);return q}};
 u.scale.y=F.scale.y*Math.abs(u.y-(e.y+n.projectionMatrix.n22)/(e.w+n.projectionMatrix.n24));u.materials=F.materials;s.push(u);y++}}}}z&&s.sort(a);return s};this.unprojectVector=function(q,n){var z=THREE.Matrix4.makeInvert(n.matrix);z.multiplySelf(THREE.Matrix4.makeInvert(n.projectionMatrix));z.multiplyVector3(q);return q}};
 THREE.DOMRenderer=function(){THREE.Renderer.call(this);var a=null,c=new THREE.Projector,d,h,j,m;this.domElement=document.createElement("div");this.setSize=function(b,r){d=b;h=r;j=d/2;m=h/2};this.render=function(b,r){var o,p,B,A,u,y,H,L;a=c.projectScene(b,r);o=0;for(p=a.length;o<p;o++){u=a[o];if(u instanceof THREE.RenderableParticle){H=u.x*j+j;L=u.y*m+m;B=0;for(A=u.material.length;B<A;B++){y=u.material[B];if(y instanceof THREE.ParticleDOMMaterial){y=y.domElement;y.style.left=H+"px";y.style.top=L+"px"}}}}}};
 THREE.DOMRenderer=function(){THREE.Renderer.call(this);var a=null,c=new THREE.Projector,d,h,j,m;this.domElement=document.createElement("div");this.setSize=function(b,r){d=b;h=r;j=d/2;m=h/2};this.render=function(b,r){var o,p,B,A,u,y,H,L;a=c.projectScene(b,r);o=0;for(p=a.length;o<p;o++){u=a[o];if(u instanceof THREE.RenderableParticle){H=u.x*j+j;L=u.y*m+m;B=0;for(A=u.material.length;B<A;B++){y=u.material[B];if(y instanceof THREE.ParticleDOMMaterial){y=y.domElement;y.style.left=H+"px";y.style.top=L+"px"}}}}}};
 THREE.CanvasRenderer=function(){function a(ba){if(u!=ba)p.globalAlpha=u=ba}function c(ba){if(y!=ba){switch(ba){case THREE.NormalBlending:p.globalCompositeOperation="source-over";break;case THREE.AdditiveBlending:p.globalCompositeOperation="lighter";break;case THREE.SubtractiveBlending:p.globalCompositeOperation="darker"}y=ba}}var d=null,h=new THREE.Projector,j=document.createElement("canvas"),m,b,r,o,p=j.getContext("2d"),B=new THREE.Color(0),A=0,u=1,y=0,H=null,L=null,e=1,g,i,f,k,l,t,q,n,z,s=new THREE.Color,
 THREE.CanvasRenderer=function(){function a(ba){if(u!=ba)p.globalAlpha=u=ba}function c(ba){if(y!=ba){switch(ba){case THREE.NormalBlending:p.globalCompositeOperation="source-over";break;case THREE.AdditiveBlending:p.globalCompositeOperation="lighter";break;case THREE.SubtractiveBlending:p.globalCompositeOperation="darker"}y=ba}}var d=null,h=new THREE.Projector,j=document.createElement("canvas"),m,b,r,o,p=j.getContext("2d"),B=new THREE.Color(0),A=0,u=1,y=0,H=null,L=null,e=1,g,i,f,k,l,t,q,n,z,s=new THREE.Color,
-w=new THREE.Color,E=new THREE.Color,v=new THREE.Color,D=new THREE.Color,W,J,Q,P,F,V,S,I,M,T=new THREE.Rectangle,O=new THREE.Rectangle,x=new THREE.Rectangle,K=false,U=new THREE.Color,Z=new THREE.Color,ma=new THREE.Color,ca=new THREE.Color,xa=Math.PI*2,$=new THREE.Vector3,ia,oa,ta,fa,da,ua,sa=16;ia=document.createElement("canvas");ia.width=ia.height=2;oa=ia.getContext("2d");oa.fillStyle="rgba(0,0,0,1)";oa.fillRect(0,0,2,2);ta=oa.getImageData(0,0,2,2);fa=ta.data;da=document.createElement("canvas");da.width=
-da.height=sa;ua=da.getContext("2d");ua.translate(-sa/2,-sa/2);ua.scale(sa,sa);sa--;this.domElement=j;this.sortElements=this.sortObjects=this.autoClear=true;this.setSize=function(ba,ja){m=ba;b=ja;r=m/2;o=b/2;j.width=m;j.height=b;T.set(-r,-o,r,o);u=1;y=0;L=H=null;e=1};this.setClearColor=function(ba,ja){B=ba;A=ja;O.set(-r,-o,r,o);p.setTransform(1,0,0,-1,r,o);this.clear()};this.setClearColorHex=function(ba,ja){B.setHex(ba);A=ja;O.set(-r,-o,r,o);p.setTransform(1,0,0,-1,r,o);this.clear()};this.clear=function(){p.setTransform(1,
+w=new THREE.Color,E=new THREE.Color,v=new THREE.Color,D=new THREE.Color,W,J,Q,P,F,V,S,I,M,T=new THREE.Rectangle,O=new THREE.Rectangle,x=new THREE.Rectangle,K=false,U=new THREE.Color,Z=new THREE.Color,ma=new THREE.Color,ca=new THREE.Color,xa=Math.PI*2,$=new THREE.Vector3,ia,pa,ua,fa,da,va,ta=16;ia=document.createElement("canvas");ia.width=ia.height=2;pa=ia.getContext("2d");pa.fillStyle="rgba(0,0,0,1)";pa.fillRect(0,0,2,2);ua=pa.getImageData(0,0,2,2);fa=ua.data;da=document.createElement("canvas");da.width=
+da.height=ta;va=da.getContext("2d");va.translate(-ta/2,-ta/2);va.scale(ta,ta);ta--;this.domElement=j;this.sortElements=this.sortObjects=this.autoClear=true;this.setSize=function(ba,ja){m=ba;b=ja;r=m/2;o=b/2;j.width=m;j.height=b;T.set(-r,-o,r,o);u=1;y=0;L=H=null;e=1};this.setClearColor=function(ba,ja){B=ba;A=ja;O.set(-r,-o,r,o);p.setTransform(1,0,0,-1,r,o);this.clear()};this.setClearColorHex=function(ba,ja){B.setHex(ba);A=ja;O.set(-r,-o,r,o);p.setTransform(1,0,0,-1,r,o);this.clear()};this.clear=function(){p.setTransform(1,
 0,0,-1,r,o);if(!O.isEmpty()){O.inflate(1);O.minSelf(T);if(B.hex==0&&A==0)p.clearRect(O.getX(),O.getY(),O.getWidth(),O.getHeight());else{c(THREE.NormalBlending);a(1);p.fillStyle="rgba("+Math.floor(B.r*255)+","+Math.floor(B.g*255)+","+Math.floor(B.b*255)+","+A+")";p.fillRect(O.getX(),O.getY(),O.getWidth(),O.getHeight())}O.empty()}};this.render=function(ba,ja){function la(C){var X,R,G,N=C.lights;Z.setRGB(0,0,0);ma.setRGB(0,0,0);ca.setRGB(0,0,0);C=0;for(X=N.length;C<X;C++){R=N[C];G=R.color;if(R instanceof
 0,0,-1,r,o);if(!O.isEmpty()){O.inflate(1);O.minSelf(T);if(B.hex==0&&A==0)p.clearRect(O.getX(),O.getY(),O.getWidth(),O.getHeight());else{c(THREE.NormalBlending);a(1);p.fillStyle="rgba("+Math.floor(B.r*255)+","+Math.floor(B.g*255)+","+Math.floor(B.b*255)+","+A+")";p.fillRect(O.getX(),O.getY(),O.getWidth(),O.getHeight())}O.empty()}};this.render=function(ba,ja){function la(C){var X,R,G,N=C.lights;Z.setRGB(0,0,0);ma.setRGB(0,0,0);ca.setRGB(0,0,0);C=0;for(X=N.length;C<X;C++){R=N[C];G=R.color;if(R instanceof
 THREE.AmbientLight){Z.r+=G.r;Z.g+=G.g;Z.b+=G.b}else if(R instanceof THREE.DirectionalLight){ma.r+=G.r;ma.g+=G.g;ma.b+=G.b}else if(R instanceof THREE.PointLight){ca.r+=G.r;ca.g+=G.g;ca.b+=G.b}}}function Ba(C,X,R,G){var N,Y,ea,ga,ha=C.lights;C=0;for(N=ha.length;C<N;C++){Y=ha[C];ea=Y.color;ga=Y.intensity;if(Y instanceof THREE.DirectionalLight){Y=R.dot(Y.position)*ga;if(Y>0){G.r+=ea.r*Y;G.g+=ea.g*Y;G.b+=ea.b*Y}}else if(Y instanceof THREE.PointLight){$.sub(Y.position,X);$.normalize();Y=R.dot($)*ga;if(Y>
 THREE.AmbientLight){Z.r+=G.r;Z.g+=G.g;Z.b+=G.b}else if(R instanceof THREE.DirectionalLight){ma.r+=G.r;ma.g+=G.g;ma.b+=G.b}else if(R instanceof THREE.PointLight){ca.r+=G.r;ca.g+=G.g;ca.b+=G.b}}}function Ba(C,X,R,G){var N,Y,ea,ga,ha=C.lights;C=0;for(N=ha.length;C<N;C++){Y=ha[C];ea=Y.color;ga=Y.intensity;if(Y instanceof THREE.DirectionalLight){Y=R.dot(Y.position)*ga;if(Y>0){G.r+=ea.r*Y;G.g+=ea.g*Y;G.b+=ea.b*Y}}else if(Y instanceof THREE.PointLight){$.sub(Y.position,X);$.normalize();Y=R.dot($)*ga;if(Y>
 0){G.r+=ea.r*Y;G.g+=ea.g*Y;G.b+=ea.b*Y}}}}function Na(C,X,R){if(R.opacity!=0){a(R.opacity);c(R.blending);var G,N,Y,ea,ga,ha;if(R instanceof THREE.ParticleBasicMaterial){if(R.map&&R.map.image.loaded){ea=R.map.image;ga=ea.width>>1;ha=ea.height>>1;N=X.scale.x*r;Y=X.scale.y*o;R=N*ga;G=Y*ha;x.set(C.x-R,C.y-G,C.x+R,C.y+G);if(!T.instersects(x))return;p.save();p.translate(C.x,C.y);p.rotate(-X.rotation);p.scale(N,-Y);p.translate(-ga,-ha);p.drawImage(ea,0,0);p.restore()}p.beginPath();p.moveTo(C.x-10,C.y);p.lineTo(C.x+
 0){G.r+=ea.r*Y;G.g+=ea.g*Y;G.b+=ea.b*Y}}}}function Na(C,X,R){if(R.opacity!=0){a(R.opacity);c(R.blending);var G,N,Y,ea,ga,ha;if(R instanceof THREE.ParticleBasicMaterial){if(R.map&&R.map.image.loaded){ea=R.map.image;ga=ea.width>>1;ha=ea.height>>1;N=X.scale.x*r;Y=X.scale.y*o;R=N*ga;G=Y*ha;x.set(C.x-R,C.y-G,C.x+R,C.y+G);if(!T.instersects(x))return;p.save();p.translate(C.x,C.y);p.rotate(-X.rotation);p.scale(N,-Y);p.translate(-ga,-ha);p.drawImage(ea,0,0);p.restore()}p.beginPath();p.moveTo(C.x-10,C.y);p.lineTo(C.x+
@@ -129,12 +129,12 @@ THREE.SphericalReflectionMapping){C=ja.matrix;$.copy(G.vertexNormalsWorld[0]);P=
 Da(N.color.__styleString);else if(N instanceof THREE.MeshLambertMaterial){if(N.map&&!N.wireframe){N.map.mapping instanceof THREE.UVMapping&&ya(k,l,t,q,n,z,N.map.image,G.uvs[0].u,G.uvs[0].v,G.uvs[1].u,G.uvs[1].v,G.uvs[2].u,G.uvs[2].v);c(THREE.SubtractiveBlending)}if(K)if(!N.wireframe&&N.shading==THREE.SmoothShading&&G.vertexNormalsWorld.length==3){w.r=E.r=v.r=Z.r;w.g=E.g=v.g=Z.g;w.b=E.b=v.b=Z.b;Ba(Y,G.v1.positionWorld,G.vertexNormalsWorld[0],w);Ba(Y,G.v2.positionWorld,G.vertexNormalsWorld[1],E);Ba(Y,
 Da(N.color.__styleString);else if(N instanceof THREE.MeshLambertMaterial){if(N.map&&!N.wireframe){N.map.mapping instanceof THREE.UVMapping&&ya(k,l,t,q,n,z,N.map.image,G.uvs[0].u,G.uvs[0].v,G.uvs[1].u,G.uvs[1].v,G.uvs[2].u,G.uvs[2].v);c(THREE.SubtractiveBlending)}if(K)if(!N.wireframe&&N.shading==THREE.SmoothShading&&G.vertexNormalsWorld.length==3){w.r=E.r=v.r=Z.r;w.g=E.g=v.g=Z.g;w.b=E.b=v.b=Z.b;Ba(Y,G.v1.positionWorld,G.vertexNormalsWorld[0],w);Ba(Y,G.v2.positionWorld,G.vertexNormalsWorld[1],E);Ba(Y,
 G.v3.positionWorld,G.vertexNormalsWorld[2],v);D.r=(E.r+v.r)*0.5;D.g=(E.g+v.g)*0.5;D.b=(E.b+v.b)*0.5;Q=Ka(w,E,v,D);ya(k,l,t,q,n,z,Q,0,0,1,0,0,1)}else{U.r=Z.r;U.g=Z.g;U.b=Z.b;Ba(Y,G.centroidWorld,G.normalWorld,U);s.r=N.color.r*U.r;s.g=N.color.g*U.g;s.b=N.color.b*U.b;s.updateStyleString();N.wireframe?Ca(s.__styleString,N.wireframe_linewidth):Da(s.__styleString)}else N.wireframe?Ca(N.color.__styleString,N.wireframe_linewidth):Da(N.color.__styleString)}else if(N instanceof THREE.MeshDepthMaterial){W=ja.near;
 G.v3.positionWorld,G.vertexNormalsWorld[2],v);D.r=(E.r+v.r)*0.5;D.g=(E.g+v.g)*0.5;D.b=(E.b+v.b)*0.5;Q=Ka(w,E,v,D);ya(k,l,t,q,n,z,Q,0,0,1,0,0,1)}else{U.r=Z.r;U.g=Z.g;U.b=Z.b;Ba(Y,G.centroidWorld,G.normalWorld,U);s.r=N.color.r*U.r;s.g=N.color.g*U.g;s.b=N.color.b*U.b;s.updateStyleString();N.wireframe?Ca(s.__styleString,N.wireframe_linewidth):Da(s.__styleString)}else N.wireframe?Ca(N.color.__styleString,N.wireframe_linewidth):Da(N.color.__styleString)}else if(N instanceof THREE.MeshDepthMaterial){W=ja.near;
 J=ja.far;w.r=w.g=w.b=1-Fa(C.positionScreen.z,W,J);E.r=E.g=E.b=1-Fa(X.positionScreen.z,W,J);v.r=v.g=v.b=1-Fa(R.positionScreen.z,W,J);D.r=(E.r+v.r)*0.5;D.g=(E.g+v.g)*0.5;D.b=(E.b+v.b)*0.5;Q=Ka(w,E,v,D);ya(k,l,t,q,n,z,Q,0,0,1,0,0,1)}else if(N instanceof THREE.MeshNormalMaterial){s.r=Ga(G.normalWorld.x);s.g=Ga(G.normalWorld.y);s.b=Ga(G.normalWorld.z);s.updateStyleString();N.wireframe?Ca(s.__styleString,N.wireframe_linewidth):Da(s.__styleString)}}}function Ca(C,X){if(H!=C)p.strokeStyle=H=C;if(e!=X)p.lineWidth=
 J=ja.far;w.r=w.g=w.b=1-Fa(C.positionScreen.z,W,J);E.r=E.g=E.b=1-Fa(X.positionScreen.z,W,J);v.r=v.g=v.b=1-Fa(R.positionScreen.z,W,J);D.r=(E.r+v.r)*0.5;D.g=(E.g+v.g)*0.5;D.b=(E.b+v.b)*0.5;Q=Ka(w,E,v,D);ya(k,l,t,q,n,z,Q,0,0,1,0,0,1)}else if(N instanceof THREE.MeshNormalMaterial){s.r=Ga(G.normalWorld.x);s.g=Ga(G.normalWorld.y);s.b=Ga(G.normalWorld.z);s.updateStyleString();N.wireframe?Ca(s.__styleString,N.wireframe_linewidth):Da(s.__styleString)}}}function Ca(C,X){if(H!=C)p.strokeStyle=H=C;if(e!=X)p.lineWidth=
-e=X;p.stroke();x.inflate(X*2)}function Da(C){if(L!=C)p.fillStyle=L=C;p.fill()}function ya(C,X,R,G,N,Y,ea,ga,ha,pa,ka,qa,za){var va,ra;va=ea.width-1;ra=ea.height-1;ga*=va;ha*=ra;pa*=va;ka*=ra;qa*=va;za*=ra;R-=C;G-=X;N-=C;Y-=X;pa-=ga;ka-=ha;qa-=ga;za-=ha;ra=1/(pa*za-qa*ka);va=(za*R-ka*N)*ra;ka=(za*G-ka*Y)*ra;R=(pa*N-qa*R)*ra;G=(pa*Y-qa*G)*ra;C=C-va*ga-R*ha;X=X-ka*ga-G*ha;p.save();p.transform(va,ka,R,G,C,X);p.clip();p.drawImage(ea,0,0);p.restore()}function Ka(C,X,R,G){var N=~~(C.r*255),Y=~~(C.g*255);
-C=~~(C.b*255);var ea=~~(X.r*255),ga=~~(X.g*255);X=~~(X.b*255);var ha=~~(R.r*255),pa=~~(R.g*255);R=~~(R.b*255);var ka=~~(G.r*255),qa=~~(G.g*255);G=~~(G.b*255);fa[0]=N<0?0:N>255?255:N;fa[1]=Y<0?0:Y>255?255:Y;fa[2]=C<0?0:C>255?255:C;fa[4]=ea<0?0:ea>255?255:ea;fa[5]=ga<0?0:ga>255?255:ga;fa[6]=X<0?0:X>255?255:X;fa[8]=ha<0?0:ha>255?255:ha;fa[9]=pa<0?0:pa>255?255:pa;fa[10]=R<0?0:R>255?255:R;fa[12]=ka<0?0:ka>255?255:ka;fa[13]=qa<0?0:qa>255?255:qa;fa[14]=G<0?0:G>255?255:G;oa.putImageData(ta,0,0);ua.drawImage(ia,
-0,0);return da}function Fa(C,X,R){C=(C-X)/(R-X);return C*C*(3-2*C)}function Ga(C){C=(C+1)*0.5;return C<0?0:C>1?1:C}function Ha(C,X){var R=X.x-C.x,G=X.y-C.y,N=1/Math.sqrt(R*R+G*G);R*=N;G*=N;X.x+=R;X.y+=G;C.x-=R;C.y-=G}var Ea,La,aa,na,wa,Ia,Ma,Aa;this.autoClear?this.clear():p.setTransform(1,0,0,-1,r,o);d=h.projectScene(ba,ja,this.sortElements);p.fillStyle="rgba( 0, 255, 255, 0.5 )";p.fillRect(T.getX(),T.getY(),T.getWidth(),T.getHeight());(K=ba.lights.length>0)&&la(ba);Ea=0;for(La=d.length;Ea<La;Ea++){aa=
-d[Ea];x.empty();if(aa instanceof THREE.RenderableParticle){g=aa;g.x*=r;g.y*=o;na=0;for(wa=aa.materials.length;na<wa;na++)Na(g,aa,aa.materials[na],ba)}else if(aa instanceof THREE.RenderableLine){g=aa.v1;i=aa.v2;g.positionScreen.x*=r;g.positionScreen.y*=o;i.positionScreen.x*=r;i.positionScreen.y*=o;x.addPoint(g.positionScreen.x,g.positionScreen.y);x.addPoint(i.positionScreen.x,i.positionScreen.y);if(T.instersects(x)){na=0;for(wa=aa.materials.length;na<wa;)Oa(g,i,aa,aa.materials[na++],ba)}}else if(aa instanceof
-THREE.RenderableFace3){g=aa.v1;i=aa.v2;f=aa.v3;g.positionScreen.x*=r;g.positionScreen.y*=o;i.positionScreen.x*=r;i.positionScreen.y*=o;f.positionScreen.x*=r;f.positionScreen.y*=o;if(aa.overdraw){Ha(g.positionScreen,i.positionScreen);Ha(i.positionScreen,f.positionScreen);Ha(f.positionScreen,g.positionScreen)}x.add3Points(g.positionScreen.x,g.positionScreen.y,i.positionScreen.x,i.positionScreen.y,f.positionScreen.x,f.positionScreen.y);if(T.instersects(x)){na=0;for(wa=aa.meshMaterials.length;na<wa;){Aa=
-aa.meshMaterials[na++];if(Aa instanceof THREE.MeshFaceMaterial){Ia=0;for(Ma=aa.faceMaterials.length;Ia<Ma;)(Aa=aa.faceMaterials[Ia++])&&Ja(g,i,f,aa,Aa,ba)}else Ja(g,i,f,aa,Aa,ba)}}}O.addRectangle(x)}p.lineWidth=1;p.strokeStyle="rgba( 255, 0, 0, 0.5 )";p.strokeRect(O.getX(),O.getY(),O.getWidth(),O.getHeight());p.setTransform(1,0,0,1,0,0)}};
+e=X;p.stroke();x.inflate(X*2)}function Da(C){if(L!=C)p.fillStyle=L=C;p.fill()}function ya(C,X,R,G,N,Y,ea,ga,ha,qa,ka,ra,za){var na,sa;na=ea.width-1;sa=ea.height-1;ga*=na;ha*=sa;qa*=na;ka*=sa;ra*=na;za*=sa;R-=C;G-=X;N-=C;Y-=X;qa-=ga;ka-=ha;ra-=ga;za-=ha;na=qa*za-ra*ka;if(na!=0){sa=1/na;na=(za*R-ka*N)*sa;ka=(za*G-ka*Y)*sa;R=(qa*N-ra*R)*sa;G=(qa*Y-ra*G)*sa;C=C-na*ga-R*ha;X=X-ka*ga-G*ha;p.save();p.transform(na,ka,R,G,C,X);p.clip();p.drawImage(ea,0,0);p.restore()}}function Ka(C,X,R,G){var N=~~(C.r*255),
+Y=~~(C.g*255);C=~~(C.b*255);var ea=~~(X.r*255),ga=~~(X.g*255);X=~~(X.b*255);var ha=~~(R.r*255),qa=~~(R.g*255);R=~~(R.b*255);var ka=~~(G.r*255),ra=~~(G.g*255);G=~~(G.b*255);fa[0]=N<0?0:N>255?255:N;fa[1]=Y<0?0:Y>255?255:Y;fa[2]=C<0?0:C>255?255:C;fa[4]=ea<0?0:ea>255?255:ea;fa[5]=ga<0?0:ga>255?255:ga;fa[6]=X<0?0:X>255?255:X;fa[8]=ha<0?0:ha>255?255:ha;fa[9]=qa<0?0:qa>255?255:qa;fa[10]=R<0?0:R>255?255:R;fa[12]=ka<0?0:ka>255?255:ka;fa[13]=ra<0?0:ra>255?255:ra;fa[14]=G<0?0:G>255?255:G;pa.putImageData(ua,
+0,0);va.drawImage(ia,0,0);return da}function Fa(C,X,R){C=(C-X)/(R-X);return C*C*(3-2*C)}function Ga(C){C=(C+1)*0.5;return C<0?0:C>1?1:C}function Ha(C,X){var R=X.x-C.x,G=X.y-C.y,N=1/Math.sqrt(R*R+G*G);R*=N;G*=N;X.x+=R;X.y+=G;C.x-=R;C.y-=G}var Ea,La,aa,oa,wa,Ia,Ma,Aa;this.autoClear?this.clear():p.setTransform(1,0,0,-1,r,o);d=h.projectScene(ba,ja,this.sortElements);p.fillStyle="rgba( 0, 255, 255, 0.5 )";p.fillRect(T.getX(),T.getY(),T.getWidth(),T.getHeight());(K=ba.lights.length>0)&&la(ba);Ea=0;for(La=
+d.length;Ea<La;Ea++){aa=d[Ea];x.empty();if(aa instanceof THREE.RenderableParticle){g=aa;g.x*=r;g.y*=o;oa=0;for(wa=aa.materials.length;oa<wa;oa++)Na(g,aa,aa.materials[oa],ba)}else if(aa instanceof THREE.RenderableLine){g=aa.v1;i=aa.v2;g.positionScreen.x*=r;g.positionScreen.y*=o;i.positionScreen.x*=r;i.positionScreen.y*=o;x.addPoint(g.positionScreen.x,g.positionScreen.y);x.addPoint(i.positionScreen.x,i.positionScreen.y);if(T.instersects(x)){oa=0;for(wa=aa.materials.length;oa<wa;)Oa(g,i,aa,aa.materials[oa++],
+ba)}}else if(aa instanceof THREE.RenderableFace3){g=aa.v1;i=aa.v2;f=aa.v3;g.positionScreen.x*=r;g.positionScreen.y*=o;i.positionScreen.x*=r;i.positionScreen.y*=o;f.positionScreen.x*=r;f.positionScreen.y*=o;if(aa.overdraw){Ha(g.positionScreen,i.positionScreen);Ha(i.positionScreen,f.positionScreen);Ha(f.positionScreen,g.positionScreen)}x.add3Points(g.positionScreen.x,g.positionScreen.y,i.positionScreen.x,i.positionScreen.y,f.positionScreen.x,f.positionScreen.y);if(T.instersects(x)){oa=0;for(wa=aa.meshMaterials.length;oa<
+wa;){Aa=aa.meshMaterials[oa++];if(Aa instanceof THREE.MeshFaceMaterial){Ia=0;for(Ma=aa.faceMaterials.length;Ia<Ma;)(Aa=aa.faceMaterials[Ia++])&&Ja(g,i,f,aa,Aa,ba)}else Ja(g,i,f,aa,Aa,ba)}}}O.addRectangle(x)}p.lineWidth=1;p.strokeStyle="rgba( 255, 0, 0, 0.5 )";p.strokeRect(O.getX(),O.getY(),O.getWidth(),O.getHeight());p.setTransform(1,0,0,1,0,0)}};
 THREE.SVGRenderer=function(){function a(P,F,V){var S,I,M,T;S=0;for(I=P.lights.length;S<I;S++){M=P.lights[S];if(M instanceof THREE.DirectionalLight){T=F.normalWorld.dot(M.position)*M.intensity;if(T>0){V.r+=M.color.r*T;V.g+=M.color.g*T;V.b+=M.color.b*T}}else if(M instanceof THREE.PointLight){z.sub(M.position,F.centroidWorld);z.normalize();T=F.normalWorld.dot(z)*M.intensity;if(T>0){V.r+=M.color.r*T;V.g+=M.color.g*T;V.b+=M.color.b*T}}}}function c(P,F,V,S,I,M){v=h(D++);v.setAttribute("d","M "+P.positionScreen.x+
 THREE.SVGRenderer=function(){function a(P,F,V){var S,I,M,T;S=0;for(I=P.lights.length;S<I;S++){M=P.lights[S];if(M instanceof THREE.DirectionalLight){T=F.normalWorld.dot(M.position)*M.intensity;if(T>0){V.r+=M.color.r*T;V.g+=M.color.g*T;V.b+=M.color.b*T}}else if(M instanceof THREE.PointLight){z.sub(M.position,F.centroidWorld);z.normalize();T=F.normalWorld.dot(z)*M.intensity;if(T>0){V.r+=M.color.r*T;V.g+=M.color.g*T;V.b+=M.color.b*T}}}}function c(P,F,V,S,I,M){v=h(D++);v.setAttribute("d","M "+P.positionScreen.x+
 " "+P.positionScreen.y+" L "+F.positionScreen.x+" "+F.positionScreen.y+" L "+V.positionScreen.x+","+V.positionScreen.y+"z");if(I instanceof THREE.MeshBasicMaterial)f.__styleString=I.color.__styleString;else if(I instanceof THREE.MeshLambertMaterial)if(i){k.r=l.r;k.g=l.g;k.b=l.b;a(M,S,k);f.r=I.color.r*k.r;f.g=I.color.g*k.g;f.b=I.color.b*k.b;f.updateStyleString()}else f.__styleString=I.color.__styleString;else if(I instanceof THREE.MeshDepthMaterial){n=1-I.__2near/(I.__farPlusNear-S.z*I.__farMinusNear);
 " "+P.positionScreen.y+" L "+F.positionScreen.x+" "+F.positionScreen.y+" L "+V.positionScreen.x+","+V.positionScreen.y+"z");if(I instanceof THREE.MeshBasicMaterial)f.__styleString=I.color.__styleString;else if(I instanceof THREE.MeshLambertMaterial)if(i){k.r=l.r;k.g=l.g;k.b=l.b;a(M,S,k);f.r=I.color.r*k.r;f.g=I.color.g*k.g;f.b=I.color.b*k.b;f.updateStyleString()}else f.__styleString=I.color.__styleString;else if(I instanceof THREE.MeshDepthMaterial){n=1-I.__2near/(I.__farPlusNear-S.z*I.__farMinusNear);
 f.setRGB(n,n,n)}else I instanceof THREE.MeshNormalMaterial&&f.setRGB(j(S.normalWorld.x),j(S.normalWorld.y),j(S.normalWorld.z));I.wireframe?v.setAttribute("style","fill: none; stroke: "+f.__styleString+"; stroke-width: "+I.wireframe_linewidth+"; stroke-opacity: "+I.opacity+"; stroke-linecap: "+I.wireframe_linecap+"; stroke-linejoin: "+I.wireframe_linejoin):v.setAttribute("style","fill: "+f.__styleString+"; fill-opacity: "+I.opacity);r.appendChild(v)}function d(P,F,V,S,I,M,T){v=h(D++);v.setAttribute("d",
 f.setRGB(n,n,n)}else I instanceof THREE.MeshNormalMaterial&&f.setRGB(j(S.normalWorld.x),j(S.normalWorld.y),j(S.normalWorld.z));I.wireframe?v.setAttribute("style","fill: none; stroke: "+f.__styleString+"; stroke-width: "+I.wireframe_linewidth+"; stroke-opacity: "+I.opacity+"; stroke-linecap: "+I.wireframe_linecap+"; stroke-linejoin: "+I.wireframe_linejoin):v.setAttribute("style","fill: "+f.__styleString+"; fill-opacity: "+I.opacity);r.appendChild(v)}function d(P,F,V,S,I,M,T){v=h(D++);v.setAttribute("d",
@@ -160,12 +160,12 @@ this.createLineBuffers=function(e){e.__webGLVertexBuffer=b.createBuffer();e.__we
 function(e){var g=e.vertices.length;e.__vertexArray=new Float32Array(g*3);e.__colorArray=new Float32Array(g*3);e.__lineArray=new Uint16Array(g);e.__webGLLineCount=g};this.initParticleBuffers=function(e){var g=e.vertices.length;e.__vertexArray=new Float32Array(g*3);e.__colorArray=new Float32Array(g*3);e.__particleArray=new Uint16Array(g);e.__sortArray=[];e.__webGLParticleCount=g};this.initMeshBuffers=function(e,g){var i,f,k=0,l=0,t=0,q=g.geometry.faces,n=e.faces;i=0;for(f=n.length;i<f;i++){fi=n[i];
 function(e){var g=e.vertices.length;e.__vertexArray=new Float32Array(g*3);e.__colorArray=new Float32Array(g*3);e.__lineArray=new Uint16Array(g);e.__webGLLineCount=g};this.initParticleBuffers=function(e){var g=e.vertices.length;e.__vertexArray=new Float32Array(g*3);e.__colorArray=new Float32Array(g*3);e.__particleArray=new Uint16Array(g);e.__sortArray=[];e.__webGLParticleCount=g};this.initMeshBuffers=function(e,g){var i,f,k=0,l=0,t=0,q=g.geometry.faces,n=e.faces;i=0;for(f=n.length;i<f;i++){fi=n[i];
 face=q[fi];if(face instanceof THREE.Face3){k+=3;l+=1;t+=3}else if(face instanceof THREE.Face4){k+=4;l+=2;t+=4}}e.__vertexArray=new Float32Array(k*3);e.__normalArray=new Float32Array(k*3);e.__tangentArray=new Float32Array(k*4);e.__colorArray=new Float32Array(k*3);e.__uvArray=new Float32Array(k*2);e.__uv2Array=new Float32Array(k*2);e.__faceArray=new Uint16Array(l*3);e.__lineArray=new Uint16Array(t*2);k=false;i=0;for(f=g.materials.length;i<f;i++){q=g.materials[i];if(q instanceof THREE.MeshFaceMaterial){q=
 face=q[fi];if(face instanceof THREE.Face3){k+=3;l+=1;t+=3}else if(face instanceof THREE.Face4){k+=4;l+=2;t+=4}}e.__vertexArray=new Float32Array(k*3);e.__normalArray=new Float32Array(k*3);e.__tangentArray=new Float32Array(k*4);e.__colorArray=new Float32Array(k*3);e.__uvArray=new Float32Array(k*2);e.__uv2Array=new Float32Array(k*2);e.__faceArray=new Uint16Array(l*3);e.__lineArray=new Uint16Array(t*2);k=false;i=0;for(f=g.materials.length;i<f;i++){q=g.materials[i];if(q instanceof THREE.MeshFaceMaterial){q=
 0;for(n=e.materials.length;q<n;q++)if(e.materials[q]&&e.materials[q].shading!=undefined&&e.materials[q].shading==THREE.SmoothShading){k=true;break}}else if(q&&q.shading!=undefined&&q.shading==THREE.SmoothShading){k=true;break}if(k)break}e.__needsSmoothNormals=k;e.__webGLFaceCount=l*3;e.__webGLLineCount=t*2};this.setMeshBuffers=function(e,g,i){var f,k,l,t,q,n,z,s,w,E,v=0,D=0,W=0,J=0,Q=0,P=0,F=0,V=0,S=0,I=e.__vertexArray,M=e.__uvArray,T=e.__uv2Array,O=e.__normalArray,x=e.__tangentArray,K=e.__colorArray,
 0;for(n=e.materials.length;q<n;q++)if(e.materials[q]&&e.materials[q].shading!=undefined&&e.materials[q].shading==THREE.SmoothShading){k=true;break}}else if(q&&q.shading!=undefined&&q.shading==THREE.SmoothShading){k=true;break}if(k)break}e.__needsSmoothNormals=k;e.__webGLFaceCount=l*3;e.__webGLLineCount=t*2};this.setMeshBuffers=function(e,g,i){var f,k,l,t,q,n,z,s,w,E,v=0,D=0,W=0,J=0,Q=0,P=0,F=0,V=0,S=0,I=e.__vertexArray,M=e.__uvArray,T=e.__uv2Array,O=e.__normalArray,x=e.__tangentArray,K=e.__colorArray,
-U=e.__faceArray,Z=e.__lineArray,ma=e.__needsSmoothNormals,ca=g.geometry,xa=ca.__dirtyVertices,$=ca.__dirtyElements,ia=ca.__dirtyUvs,oa=ca.__dirtyNormals,ta=ca.__dirtyTangents,fa=ca.__dirtyColors,da=ca.vertices,ua=e.faces,sa=ca.faces,ba=ca.uvs,ja=ca.uvs2,la=ca.colors;g=0;for(f=ua.length;g<f;g++){k=ua[g];l=sa[k];n=ba[k];k=ja[k];t=l.vertexNormals;q=l.normal;if(l instanceof THREE.Face3){if(xa){z=da[l.a].position;s=da[l.b].position;w=da[l.c].position;I[D]=z.x;I[D+1]=z.y;I[D+2]=z.z;I[D+3]=s.x;I[D+4]=s.y;
-I[D+5]=s.z;I[D+6]=w.x;I[D+7]=w.y;I[D+8]=w.z;D+=9}if(fa&&la.length){z=la[l.a];s=la[l.b];w=la[l.c];K[S]=z.r;K[S+1]=z.g;K[S+2]=z.b;K[S+3]=s.r;K[S+4]=s.g;K[S+5]=s.b;K[S+6]=w.r;K[S+7]=w.g;K[S+8]=w.b;S+=9}if(ta&&ca.hasTangents){z=da[l.a].tangent;s=da[l.b].tangent;w=da[l.c].tangent;x[F]=z.x;x[F+1]=z.y;x[F+2]=z.z;x[F+3]=z.w;x[F+4]=s.x;x[F+5]=s.y;x[F+6]=s.z;x[F+7]=s.w;x[F+8]=w.x;x[F+9]=w.y;x[F+10]=w.z;x[F+11]=w.w;F+=12}if(oa)if(t.length==3&&ma)for(l=0;l<3;l++){q=t[l];O[P]=q.x;O[P+1]=q.y;O[P+2]=q.z;P+=3}else for(l=
+U=e.__faceArray,Z=e.__lineArray,ma=e.__needsSmoothNormals,ca=g.geometry,xa=ca.__dirtyVertices,$=ca.__dirtyElements,ia=ca.__dirtyUvs,pa=ca.__dirtyNormals,ua=ca.__dirtyTangents,fa=ca.__dirtyColors,da=ca.vertices,va=e.faces,ta=ca.faces,ba=ca.uvs,ja=ca.uvs2,la=ca.colors;g=0;for(f=va.length;g<f;g++){k=va[g];l=ta[k];n=ba[k];k=ja[k];t=l.vertexNormals;q=l.normal;if(l instanceof THREE.Face3){if(xa){z=da[l.a].position;s=da[l.b].position;w=da[l.c].position;I[D]=z.x;I[D+1]=z.y;I[D+2]=z.z;I[D+3]=s.x;I[D+4]=s.y;
+I[D+5]=s.z;I[D+6]=w.x;I[D+7]=w.y;I[D+8]=w.z;D+=9}if(fa&&la.length){z=la[l.a];s=la[l.b];w=la[l.c];K[S]=z.r;K[S+1]=z.g;K[S+2]=z.b;K[S+3]=s.r;K[S+4]=s.g;K[S+5]=s.b;K[S+6]=w.r;K[S+7]=w.g;K[S+8]=w.b;S+=9}if(ua&&ca.hasTangents){z=da[l.a].tangent;s=da[l.b].tangent;w=da[l.c].tangent;x[F]=z.x;x[F+1]=z.y;x[F+2]=z.z;x[F+3]=z.w;x[F+4]=s.x;x[F+5]=s.y;x[F+6]=s.z;x[F+7]=s.w;x[F+8]=w.x;x[F+9]=w.y;x[F+10]=w.z;x[F+11]=w.w;F+=12}if(pa)if(t.length==3&&ma)for(l=0;l<3;l++){q=t[l];O[P]=q.x;O[P+1]=q.y;O[P+2]=q.z;P+=3}else for(l=
 0;l<3;l++){O[P]=q.x;O[P+1]=q.y;O[P+2]=q.z;P+=3}if(ia&&n)for(l=0;l<3;l++){t=n[l];M[W]=t.u;M[W+1]=t.v;W+=2}if(ia&&k)for(l=0;l<3;l++){n=k[l];T[J]=n.u;T[J+1]=n.v;J+=2}if($){U[Q]=v;U[Q+1]=v+1;U[Q+2]=v+2;Q+=3;Z[V]=v;Z[V+1]=v+1;Z[V+2]=v;Z[V+3]=v+2;Z[V+4]=v+1;Z[V+5]=v+2;V+=6;v+=3}}else if(l instanceof THREE.Face4){if(xa){z=da[l.a].position;s=da[l.b].position;w=da[l.c].position;E=da[l.d].position;I[D]=z.x;I[D+1]=z.y;I[D+2]=z.z;I[D+3]=s.x;I[D+4]=s.y;I[D+5]=s.z;I[D+6]=w.x;I[D+7]=w.y;I[D+8]=w.z;I[D+9]=E.x;I[D+
 0;l<3;l++){O[P]=q.x;O[P+1]=q.y;O[P+2]=q.z;P+=3}if(ia&&n)for(l=0;l<3;l++){t=n[l];M[W]=t.u;M[W+1]=t.v;W+=2}if(ia&&k)for(l=0;l<3;l++){n=k[l];T[J]=n.u;T[J+1]=n.v;J+=2}if($){U[Q]=v;U[Q+1]=v+1;U[Q+2]=v+2;Q+=3;Z[V]=v;Z[V+1]=v+1;Z[V+2]=v;Z[V+3]=v+2;Z[V+4]=v+1;Z[V+5]=v+2;V+=6;v+=3}}else if(l instanceof THREE.Face4){if(xa){z=da[l.a].position;s=da[l.b].position;w=da[l.c].position;E=da[l.d].position;I[D]=z.x;I[D+1]=z.y;I[D+2]=z.z;I[D+3]=s.x;I[D+4]=s.y;I[D+5]=s.z;I[D+6]=w.x;I[D+7]=w.y;I[D+8]=w.z;I[D+9]=E.x;I[D+
-10]=E.y;I[D+11]=E.z;D+=12}if(fa&&la.length){z=la[l.a];s=la[l.b];w=la[l.d];K[S]=z.r;K[S+1]=z.g;K[S+2]=z.b;K[S+3]=s.r;K[S+4]=s.g;K[S+5]=s.b;K[S+6]=w.r;K[S+7]=w.g;K[S+8]=w.b;K[S+9]=(void 0).r;K[S+10]=(void 0).g;K[S+11]=(void 0).b;S+=12}if(ta&&ca.hasTangents){z=da[l.a].tangent;s=da[l.b].tangent;w=da[l.c].tangent;l=da[l.d].tangent;x[F]=z.x;x[F+1]=z.y;x[F+2]=z.z;x[F+3]=z.w;x[F+4]=s.x;x[F+5]=s.y;x[F+6]=s.z;x[F+7]=s.w;x[F+8]=w.x;x[F+9]=w.y;x[F+10]=w.z;x[F+11]=w.w;x[F+12]=l.x;x[F+13]=l.y;x[F+14]=l.z;x[F+15]=
-l.w;F+=16}if(oa)if(t.length==4&&ma)for(l=0;l<4;l++){q=t[l];O[P]=q.x;O[P+1]=q.y;O[P+2]=q.z;P+=3}else for(l=0;l<4;l++){O[P]=q.x;O[P+1]=q.y;O[P+2]=q.z;P+=3}if(ia&&n)for(l=0;l<4;l++){t=n[l];M[W]=t.u;M[W+1]=t.v;W+=2}if(ia&&k)for(l=0;l<4;l++){n=k[l];T[J]=n.u;T[J+1]=n.v;J+=2}if($){U[Q]=v;U[Q+1]=v+1;U[Q+2]=v+2;U[Q+3]=v;U[Q+4]=v+2;U[Q+5]=v+3;Q+=6;Z[V]=v;Z[V+1]=v+1;Z[V+2]=v;Z[V+3]=v+3;Z[V+4]=v+1;Z[V+5]=v+2;Z[V+6]=v+2;Z[V+7]=v+3;V+=8;v+=4}}}if(xa){b.bindBuffer(b.ARRAY_BUFFER,e.__webGLVertexBuffer);b.bufferData(b.ARRAY_BUFFER,
-I,i)}if(fa&&la.length){b.bindBuffer(b.ARRAY_BUFFER,e.__webGLColorBuffer);b.bufferData(b.ARRAY_BUFFER,K,i)}if(oa){b.bindBuffer(b.ARRAY_BUFFER,e.__webGLNormalBuffer);b.bufferData(b.ARRAY_BUFFER,O,i)}if(ta&&ca.hasTangents){b.bindBuffer(b.ARRAY_BUFFER,e.__webGLTangentBuffer);b.bufferData(b.ARRAY_BUFFER,x,i)}if(ia&&W>0){b.bindBuffer(b.ARRAY_BUFFER,e.__webGLUVBuffer);b.bufferData(b.ARRAY_BUFFER,M,i)}if(ia&&J>0){b.bindBuffer(b.ARRAY_BUFFER,e.__webGLUV2Buffer);b.bufferData(b.ARRAY_BUFFER,T,i)}if($){b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,
+10]=E.y;I[D+11]=E.z;D+=12}if(fa&&la.length){z=la[l.a];s=la[l.b];w=la[l.d];K[S]=z.r;K[S+1]=z.g;K[S+2]=z.b;K[S+3]=s.r;K[S+4]=s.g;K[S+5]=s.b;K[S+6]=w.r;K[S+7]=w.g;K[S+8]=w.b;K[S+9]=(void 0).r;K[S+10]=(void 0).g;K[S+11]=(void 0).b;S+=12}if(ua&&ca.hasTangents){z=da[l.a].tangent;s=da[l.b].tangent;w=da[l.c].tangent;l=da[l.d].tangent;x[F]=z.x;x[F+1]=z.y;x[F+2]=z.z;x[F+3]=z.w;x[F+4]=s.x;x[F+5]=s.y;x[F+6]=s.z;x[F+7]=s.w;x[F+8]=w.x;x[F+9]=w.y;x[F+10]=w.z;x[F+11]=w.w;x[F+12]=l.x;x[F+13]=l.y;x[F+14]=l.z;x[F+15]=
+l.w;F+=16}if(pa)if(t.length==4&&ma)for(l=0;l<4;l++){q=t[l];O[P]=q.x;O[P+1]=q.y;O[P+2]=q.z;P+=3}else for(l=0;l<4;l++){O[P]=q.x;O[P+1]=q.y;O[P+2]=q.z;P+=3}if(ia&&n)for(l=0;l<4;l++){t=n[l];M[W]=t.u;M[W+1]=t.v;W+=2}if(ia&&k)for(l=0;l<4;l++){n=k[l];T[J]=n.u;T[J+1]=n.v;J+=2}if($){U[Q]=v;U[Q+1]=v+1;U[Q+2]=v+2;U[Q+3]=v;U[Q+4]=v+2;U[Q+5]=v+3;Q+=6;Z[V]=v;Z[V+1]=v+1;Z[V+2]=v;Z[V+3]=v+3;Z[V+4]=v+1;Z[V+5]=v+2;Z[V+6]=v+2;Z[V+7]=v+3;V+=8;v+=4}}}if(xa){b.bindBuffer(b.ARRAY_BUFFER,e.__webGLVertexBuffer);b.bufferData(b.ARRAY_BUFFER,
+I,i)}if(fa&&la.length){b.bindBuffer(b.ARRAY_BUFFER,e.__webGLColorBuffer);b.bufferData(b.ARRAY_BUFFER,K,i)}if(pa){b.bindBuffer(b.ARRAY_BUFFER,e.__webGLNormalBuffer);b.bufferData(b.ARRAY_BUFFER,O,i)}if(ua&&ca.hasTangents){b.bindBuffer(b.ARRAY_BUFFER,e.__webGLTangentBuffer);b.bufferData(b.ARRAY_BUFFER,x,i)}if(ia&&W>0){b.bindBuffer(b.ARRAY_BUFFER,e.__webGLUVBuffer);b.bufferData(b.ARRAY_BUFFER,M,i)}if(ia&&J>0){b.bindBuffer(b.ARRAY_BUFFER,e.__webGLUV2Buffer);b.bufferData(b.ARRAY_BUFFER,T,i)}if($){b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,
 e.__webGLFaceBuffer);b.bufferData(b.ELEMENT_ARRAY_BUFFER,U,i);b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,e.__webGLLineBuffer);b.bufferData(b.ELEMENT_ARRAY_BUFFER,Z,i)}};this.setLineBuffers=function(e,g){var i,f,k,l=e.vertices,t=e.colors,q=l.length,n=t.length,z=e.__vertexArray,s=e.__colorArray,w=e.__lineArray,E=e.__dirtyColors,v=e.__dirtyElements;if(e.__dirtyVertices){for(i=0;i<q;i++){f=l[i].position;k=i*3;z[k]=f.x;z[k+1]=f.y;z[k+2]=f.z}b.bindBuffer(b.ARRAY_BUFFER,e.__webGLVertexBuffer);b.bufferData(b.ARRAY_BUFFER,
 e.__webGLFaceBuffer);b.bufferData(b.ELEMENT_ARRAY_BUFFER,U,i);b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,e.__webGLLineBuffer);b.bufferData(b.ELEMENT_ARRAY_BUFFER,Z,i)}};this.setLineBuffers=function(e,g){var i,f,k,l=e.vertices,t=e.colors,q=l.length,n=t.length,z=e.__vertexArray,s=e.__colorArray,w=e.__lineArray,E=e.__dirtyColors,v=e.__dirtyElements;if(e.__dirtyVertices){for(i=0;i<q;i++){f=l[i].position;k=i*3;z[k]=f.x;z[k+1]=f.y;z[k+2]=f.z}b.bindBuffer(b.ARRAY_BUFFER,e.__webGLVertexBuffer);b.bufferData(b.ARRAY_BUFFER,
 z,g)}if(E){for(i=0;i<n;i++){color=t[i];k=i*3;s[k]=color.r;s[k+1]=color.g;s[k+2]=color.b}b.bindBuffer(b.ARRAY_BUFFER,e.__webGLColorBuffer);b.bufferData(b.ARRAY_BUFFER,s,g)}if(v){for(i=0;i<q;i++)w[i]=i;b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,e.__webGLLineBuffer);b.bufferData(b.ELEMENT_ARRAY_BUFFER,w,g)}};this.setParticleBuffers=function(e,g,i,f){var k,l,t;l=e.vertices;var q=l.length,n=e.colors,z=n.length,s=e.__vertexArray,w=e.__particleArray,E=e.__colorArray,v=e.__sortArray,D=e.__dirtyVertices,W=e.__dirtyElements,
 z,g)}if(E){for(i=0;i<n;i++){color=t[i];k=i*3;s[k]=color.r;s[k+1]=color.g;s[k+2]=color.b}b.bindBuffer(b.ARRAY_BUFFER,e.__webGLColorBuffer);b.bufferData(b.ARRAY_BUFFER,s,g)}if(v){for(i=0;i<q;i++)w[i]=i;b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,e.__webGLLineBuffer);b.bufferData(b.ELEMENT_ARRAY_BUFFER,w,g)}};this.setParticleBuffers=function(e,g,i,f){var k,l,t;l=e.vertices;var q=l.length,n=e.colors,z=n.length,s=e.__vertexArray,w=e.__particleArray,E=e.__colorArray,v=e.__sortArray,D=e.__dirtyVertices,W=e.__dirtyElements,
 J=e.__dirtyColors;if(i.sortParticles){p.multiply(f.projectionMatrix,f.matrix);p.multiplySelf(i.matrix);for(k=0;k<q;k++){t=l[k].position;u.copy(t);p.multiplyVector3(u);v[k]=[u.z,k]}v.sort(function(Q,P){return P[0]-Q[0]});for(k=0;k<q;k++){t=l[v[k][1]].position;f=k*3;s[f]=t.x;s[f+1]=t.y;s[f+2]=t.z}for(l=0;l<z;l++){f=l*3;color=n[v[l][1]];E[f]=color.r;E[f+1]=color.g;E[f+2]=color.b}}else{if(D)for(k=0;k<q;k++){t=l[k].position;f=k*3;s[f]=t.x;s[f+1]=t.y;s[f+2]=t.z}if(J)for(l=0;l<z;l++){color=n[l];f=l*3;E[f]=
 J=e.__dirtyColors;if(i.sortParticles){p.multiply(f.projectionMatrix,f.matrix);p.multiplySelf(i.matrix);for(k=0;k<q;k++){t=l[k].position;u.copy(t);p.multiplyVector3(u);v[k]=[u.z,k]}v.sort(function(Q,P){return P[0]-Q[0]});for(k=0;k<q;k++){t=l[v[k][1]].position;f=k*3;s[f]=t.x;s[f+1]=t.y;s[f+2]=t.z}for(l=0;l<z;l++){f=l*3;color=n[v[l][1]];E[f]=color.r;E[f+1]=color.g;E[f+2]=color.b}}else{if(D)for(k=0;k<q;k++){t=l[k].position;f=k*3;s[f]=t.x;s[f+1]=t.y;s[f+2]=t.z}if(J)for(l=0;l<z;l++){color=n[l];f=l*3;E[f]=

+ 9 - 9
build/ThreeExtras.js

@@ -117,8 +117,8 @@ p.w);q.multiplyScalar(1/q.w);o=y[t]=y[t]||new THREE.RenderableLine;o.v1.position
 w.scale.y=N.scale.y*Math.abs(w.y-(j.y+v.projectionMatrix.n22)/(j.w+v.projectionMatrix.n24));w.materials=N.materials;B.push(w);u++}}}}F&&B.sort(a);return B};this.unprojectVector=function(x,v){var F=THREE.Matrix4.makeInvert(v.matrix);F.multiplySelf(THREE.Matrix4.makeInvert(v.projectionMatrix));F.multiplyVector3(x);return x}};
 w.scale.y=N.scale.y*Math.abs(w.y-(j.y+v.projectionMatrix.n22)/(j.w+v.projectionMatrix.n24));w.materials=N.materials;B.push(w);u++}}}}F&&B.sort(a);return B};this.unprojectVector=function(x,v){var F=THREE.Matrix4.makeInvert(v.matrix);F.multiplySelf(THREE.Matrix4.makeInvert(v.projectionMatrix));F.multiplyVector3(x);return x}};
 THREE.DOMRenderer=function(){THREE.Renderer.call(this);var a=null,c=new THREE.Projector,d,e,h,g;this.domElement=document.createElement("div");this.setSize=function(b,m){d=b;e=m;h=d/2;g=e/2};this.render=function(b,m){var k,o,t,y,w,u,z,A;a=c.projectScene(b,m);k=0;for(o=a.length;k<o;k++){w=a[k];if(w instanceof THREE.RenderableParticle){z=w.x*h+h;A=w.y*g+g;t=0;for(y=w.material.length;t<y;t++){u=w.material[t];if(u instanceof THREE.ParticleDOMMaterial){u=u.domElement;u.style.left=z+"px";u.style.top=A+"px"}}}}}};
 THREE.DOMRenderer=function(){THREE.Renderer.call(this);var a=null,c=new THREE.Projector,d,e,h,g;this.domElement=document.createElement("div");this.setSize=function(b,m){d=b;e=m;h=d/2;g=e/2};this.render=function(b,m){var k,o,t,y,w,u,z,A;a=c.projectScene(b,m);k=0;for(o=a.length;k<o;k++){w=a[k];if(w instanceof THREE.RenderableParticle){z=w.x*h+h;A=w.y*g+g;t=0;for(y=w.material.length;t<y;t++){u=w.material[t];if(u instanceof THREE.ParticleDOMMaterial){u=u.domElement;u.style.left=z+"px";u.style.top=A+"px"}}}}}};
 THREE.CanvasRenderer=function(){function a(ka){if(w!=ka)o.globalAlpha=w=ka}function c(ka){if(u!=ka){switch(ka){case THREE.NormalBlending:o.globalCompositeOperation="source-over";break;case THREE.AdditiveBlending:o.globalCompositeOperation="lighter";break;case THREE.SubtractiveBlending:o.globalCompositeOperation="darker"}u=ka}}var d=null,e=new THREE.Projector,h=document.createElement("canvas"),g,b,m,k,o=h.getContext("2d"),t=new THREE.Color(0),y=0,w=1,u=0,z=null,A=null,j=1,l,n,f,p,q,E,x,v,F,B=new THREE.Color,
 THREE.CanvasRenderer=function(){function a(ka){if(w!=ka)o.globalAlpha=w=ka}function c(ka){if(u!=ka){switch(ka){case THREE.NormalBlending:o.globalCompositeOperation="source-over";break;case THREE.AdditiveBlending:o.globalCompositeOperation="lighter";break;case THREE.SubtractiveBlending:o.globalCompositeOperation="darker"}u=ka}}var d=null,e=new THREE.Projector,h=document.createElement("canvas"),g,b,m,k,o=h.getContext("2d"),t=new THREE.Color(0),y=0,w=1,u=0,z=null,A=null,j=1,l,n,f,p,q,E,x,v,F,B=new THREE.Color,
-G=new THREE.Color,J=new THREE.Color,C=new THREE.Color,I=new THREE.Color,aa,O,U,V,N,ba,$,Q,S,ca=new THREE.Rectangle,W=new THREE.Rectangle,H=new THREE.Rectangle,R=false,Z=new THREE.Color,fa=new THREE.Color,na=new THREE.Color,D=new THREE.Color,K=Math.PI*2,L=new THREE.Vector3,T,da,la,ha,ia,ta,ya=16;T=document.createElement("canvas");T.width=T.height=2;da=T.getContext("2d");da.fillStyle="rgba(0,0,0,1)";da.fillRect(0,0,2,2);la=da.getImageData(0,0,2,2);ha=la.data;ia=document.createElement("canvas");ia.width=
-ia.height=ya;ta=ia.getContext("2d");ta.translate(-ya/2,-ya/2);ta.scale(ya,ya);ya--;this.domElement=h;this.sortElements=this.sortObjects=this.autoClear=true;this.setSize=function(ka,qa){g=ka;b=qa;m=g/2;k=b/2;h.width=g;h.height=b;ca.set(-m,-k,m,k);w=1;u=0;A=z=null;j=1};this.setClearColor=function(ka,qa){t=ka;y=qa;W.set(-m,-k,m,k);o.setTransform(1,0,0,-1,m,k);this.clear()};this.setClearColorHex=function(ka,qa){t.setHex(ka);y=qa;W.set(-m,-k,m,k);o.setTransform(1,0,0,-1,m,k);this.clear()};this.clear=function(){o.setTransform(1,
+G=new THREE.Color,J=new THREE.Color,C=new THREE.Color,I=new THREE.Color,aa,O,U,V,N,ba,$,Q,S,ca=new THREE.Rectangle,W=new THREE.Rectangle,H=new THREE.Rectangle,R=false,Z=new THREE.Color,fa=new THREE.Color,na=new THREE.Color,D=new THREE.Color,K=Math.PI*2,L=new THREE.Vector3,T,da,la,ha,ia,ta,za=16;T=document.createElement("canvas");T.width=T.height=2;da=T.getContext("2d");da.fillStyle="rgba(0,0,0,1)";da.fillRect(0,0,2,2);la=da.getImageData(0,0,2,2);ha=la.data;ia=document.createElement("canvas");ia.width=
+ia.height=za;ta=ia.getContext("2d");ta.translate(-za/2,-za/2);ta.scale(za,za);za--;this.domElement=h;this.sortElements=this.sortObjects=this.autoClear=true;this.setSize=function(ka,qa){g=ka;b=qa;m=g/2;k=b/2;h.width=g;h.height=b;ca.set(-m,-k,m,k);w=1;u=0;A=z=null;j=1};this.setClearColor=function(ka,qa){t=ka;y=qa;W.set(-m,-k,m,k);o.setTransform(1,0,0,-1,m,k);this.clear()};this.setClearColorHex=function(ka,qa){t.setHex(ka);y=qa;W.set(-m,-k,m,k);o.setTransform(1,0,0,-1,m,k);this.clear()};this.clear=function(){o.setTransform(1,
 0,0,-1,m,k);if(!W.isEmpty()){W.inflate(1);W.minSelf(ca);if(t.hex==0&&y==0)o.clearRect(W.getX(),W.getY(),W.getWidth(),W.getHeight());else{c(THREE.NormalBlending);a(1);o.fillStyle="rgba("+Math.floor(t.r*255)+","+Math.floor(t.g*255)+","+Math.floor(t.b*255)+","+y+")";o.fillRect(W.getX(),W.getY(),W.getWidth(),W.getHeight())}W.empty()}};this.render=function(ka,qa){function sa(M){var ea,Y,P,X=M.lights;fa.setRGB(0,0,0);na.setRGB(0,0,0);D.setRGB(0,0,0);M=0;for(ea=X.length;M<ea;M++){Y=X[M];P=Y.color;if(Y instanceof
 0,0,-1,m,k);if(!W.isEmpty()){W.inflate(1);W.minSelf(ca);if(t.hex==0&&y==0)o.clearRect(W.getX(),W.getY(),W.getWidth(),W.getHeight());else{c(THREE.NormalBlending);a(1);o.fillStyle="rgba("+Math.floor(t.r*255)+","+Math.floor(t.g*255)+","+Math.floor(t.b*255)+","+y+")";o.fillRect(W.getX(),W.getY(),W.getWidth(),W.getHeight())}W.empty()}};this.render=function(ka,qa){function sa(M){var ea,Y,P,X=M.lights;fa.setRGB(0,0,0);na.setRGB(0,0,0);D.setRGB(0,0,0);M=0;for(ea=X.length;M<ea;M++){Y=X[M];P=Y.color;if(Y instanceof
 THREE.AmbientLight){fa.r+=P.r;fa.g+=P.g;fa.b+=P.b}else if(Y instanceof THREE.DirectionalLight){na.r+=P.r;na.g+=P.g;na.b+=P.b}else if(Y instanceof THREE.PointLight){D.r+=P.r;D.g+=P.g;D.b+=P.b}}}function Ea(M,ea,Y,P){var X,ga,ma,oa,pa=M.lights;M=0;for(X=pa.length;M<X;M++){ga=pa[M];ma=ga.color;oa=ga.intensity;if(ga instanceof THREE.DirectionalLight){ga=Y.dot(ga.position)*oa;if(ga>0){P.r+=ma.r*ga;P.g+=ma.g*ga;P.b+=ma.b*ga}}else if(ga instanceof THREE.PointLight){L.sub(ga.position,ea);L.normalize();ga=
 THREE.AmbientLight){fa.r+=P.r;fa.g+=P.g;fa.b+=P.b}else if(Y instanceof THREE.DirectionalLight){na.r+=P.r;na.g+=P.g;na.b+=P.b}else if(Y instanceof THREE.PointLight){D.r+=P.r;D.g+=P.g;D.b+=P.b}}}function Ea(M,ea,Y,P){var X,ga,ma,oa,pa=M.lights;M=0;for(X=pa.length;M<X;M++){ga=pa[M];ma=ga.color;oa=ga.intensity;if(ga instanceof THREE.DirectionalLight){ga=Y.dot(ga.position)*oa;if(ga>0){P.r+=ma.r*ga;P.g+=ma.g*ga;P.b+=ma.b*ga}}else if(ga instanceof THREE.PointLight){L.sub(ga.position,ea);L.normalize();ga=
 Y.dot(L)*oa;if(ga>0){P.r+=ma.r*ga;P.g+=ma.g*ga;P.b+=ma.b*ga}}}}function Qa(M,ea,Y){if(Y.opacity!=0){a(Y.opacity);c(Y.blending);var P,X,ga,ma,oa,pa;if(Y instanceof THREE.ParticleBasicMaterial){if(Y.map&&Y.map.image.loaded){ma=Y.map.image;oa=ma.width>>1;pa=ma.height>>1;X=ea.scale.x*m;ga=ea.scale.y*k;Y=X*oa;P=ga*pa;H.set(M.x-Y,M.y-P,M.x+Y,M.y+P);if(ca.instersects(H)){o.save();o.translate(M.x,M.y);o.rotate(-ea.rotation);o.scale(X,-ga);o.translate(-oa,-pa);o.drawImage(ma,0,0);o.restore()}}}else if(Y instanceof
 Y.dot(L)*oa;if(ga>0){P.r+=ma.r*ga;P.g+=ma.g*ga;P.b+=ma.b*ga}}}}function Qa(M,ea,Y){if(Y.opacity!=0){a(Y.opacity);c(Y.blending);var P,X,ga,ma,oa,pa;if(Y instanceof THREE.ParticleBasicMaterial){if(Y.map&&Y.map.image.loaded){ma=Y.map.image;oa=ma.width>>1;pa=ma.height>>1;X=ea.scale.x*m;ga=ea.scale.y*k;Y=X*oa;P=ga*pa;H.set(M.x-Y,M.y-P,M.x+Y,M.y+P);if(ca.instersects(H)){o.save();o.translate(M.x,M.y);o.rotate(-ea.rotation);o.scale(X,-ga);o.translate(-oa,-pa);o.drawImage(ma,0,0);o.restore()}}}else if(Y instanceof
@@ -129,12 +129,12 @@ M.n12+L.z*M.n13)*0.5+0.5;N=-(L.x*M.n21+L.y*M.n22+L.z*M.n23)*0.5+0.5;L.copy(P.ver
 THREE.UVMapping&&Ba(p,q,E,x,v,F,X.map.image,P.uvs[0].u,P.uvs[0].v,P.uvs[1].u,P.uvs[1].v,P.uvs[2].u,P.uvs[2].v);c(THREE.SubtractiveBlending)}if(R)if(!X.wireframe&&X.shading==THREE.SmoothShading&&P.vertexNormalsWorld.length==3){G.r=J.r=C.r=fa.r;G.g=J.g=C.g=fa.g;G.b=J.b=C.b=fa.b;Ea(ga,P.v1.positionWorld,P.vertexNormalsWorld[0],G);Ea(ga,P.v2.positionWorld,P.vertexNormalsWorld[1],J);Ea(ga,P.v3.positionWorld,P.vertexNormalsWorld[2],C);I.r=(J.r+C.r)*0.5;I.g=(J.g+C.g)*0.5;I.b=(J.b+C.b)*0.5;U=Na(G,J,C,I);
 THREE.UVMapping&&Ba(p,q,E,x,v,F,X.map.image,P.uvs[0].u,P.uvs[0].v,P.uvs[1].u,P.uvs[1].v,P.uvs[2].u,P.uvs[2].v);c(THREE.SubtractiveBlending)}if(R)if(!X.wireframe&&X.shading==THREE.SmoothShading&&P.vertexNormalsWorld.length==3){G.r=J.r=C.r=fa.r;G.g=J.g=C.g=fa.g;G.b=J.b=C.b=fa.b;Ea(ga,P.v1.positionWorld,P.vertexNormalsWorld[0],G);Ea(ga,P.v2.positionWorld,P.vertexNormalsWorld[1],J);Ea(ga,P.v3.positionWorld,P.vertexNormalsWorld[2],C);I.r=(J.r+C.r)*0.5;I.g=(J.g+C.g)*0.5;I.b=(J.b+C.b)*0.5;U=Na(G,J,C,I);
 Ba(p,q,E,x,v,F,U,0,0,1,0,0,1)}else{Z.r=fa.r;Z.g=fa.g;Z.b=fa.b;Ea(ga,P.centroidWorld,P.normalWorld,Z);B.r=X.color.r*Z.r;B.g=X.color.g*Z.g;B.b=X.color.b*Z.b;B.updateStyleString();X.wireframe?Fa(B.__styleString,X.wireframe_linewidth):Ga(B.__styleString)}else X.wireframe?Fa(X.color.__styleString,X.wireframe_linewidth):Ga(X.color.__styleString)}else if(X instanceof THREE.MeshDepthMaterial){aa=qa.near;O=qa.far;G.r=G.g=G.b=1-Ia(M.positionScreen.z,aa,O);J.r=J.g=J.b=1-Ia(ea.positionScreen.z,aa,O);C.r=C.g=
 Ba(p,q,E,x,v,F,U,0,0,1,0,0,1)}else{Z.r=fa.r;Z.g=fa.g;Z.b=fa.b;Ea(ga,P.centroidWorld,P.normalWorld,Z);B.r=X.color.r*Z.r;B.g=X.color.g*Z.g;B.b=X.color.b*Z.b;B.updateStyleString();X.wireframe?Fa(B.__styleString,X.wireframe_linewidth):Ga(B.__styleString)}else X.wireframe?Fa(X.color.__styleString,X.wireframe_linewidth):Ga(X.color.__styleString)}else if(X instanceof THREE.MeshDepthMaterial){aa=qa.near;O=qa.far;G.r=G.g=G.b=1-Ia(M.positionScreen.z,aa,O);J.r=J.g=J.b=1-Ia(ea.positionScreen.z,aa,O);C.r=C.g=
 C.b=1-Ia(Y.positionScreen.z,aa,O);I.r=(J.r+C.r)*0.5;I.g=(J.g+C.g)*0.5;I.b=(J.b+C.b)*0.5;U=Na(G,J,C,I);Ba(p,q,E,x,v,F,U,0,0,1,0,0,1)}else if(X instanceof THREE.MeshNormalMaterial){B.r=Ja(P.normalWorld.x);B.g=Ja(P.normalWorld.y);B.b=Ja(P.normalWorld.z);B.updateStyleString();X.wireframe?Fa(B.__styleString,X.wireframe_linewidth):Ga(B.__styleString)}}}function Fa(M,ea){if(z!=M)o.strokeStyle=z=M;if(j!=ea)o.lineWidth=j=ea;o.stroke();H.inflate(ea*2)}function Ga(M){if(A!=M)o.fillStyle=A=M;o.fill()}function Ba(M,
 C.b=1-Ia(Y.positionScreen.z,aa,O);I.r=(J.r+C.r)*0.5;I.g=(J.g+C.g)*0.5;I.b=(J.b+C.b)*0.5;U=Na(G,J,C,I);Ba(p,q,E,x,v,F,U,0,0,1,0,0,1)}else if(X instanceof THREE.MeshNormalMaterial){B.r=Ja(P.normalWorld.x);B.g=Ja(P.normalWorld.y);B.b=Ja(P.normalWorld.z);B.updateStyleString();X.wireframe?Fa(B.__styleString,X.wireframe_linewidth):Ga(B.__styleString)}}}function Fa(M,ea){if(z!=M)o.strokeStyle=z=M;if(j!=ea)o.lineWidth=j=ea;o.stroke();H.inflate(ea*2)}function Ga(M){if(A!=M)o.fillStyle=A=M;o.fill()}function Ba(M,
-ea,Y,P,X,ga,ma,oa,pa,va,ra,wa,Ca){var za,xa;za=ma.width-1;xa=ma.height-1;oa*=za;pa*=xa;va*=za;ra*=xa;wa*=za;Ca*=xa;Y-=M;P-=ea;X-=M;ga-=ea;va-=oa;ra-=pa;wa-=oa;Ca-=pa;xa=1/(va*Ca-wa*ra);za=(Ca*Y-ra*X)*xa;ra=(Ca*P-ra*ga)*xa;Y=(va*X-wa*Y)*xa;P=(va*ga-wa*P)*xa;M=M-za*oa-Y*pa;ea=ea-ra*oa-P*pa;o.save();o.transform(za,ra,Y,P,M,ea);o.clip();o.drawImage(ma,0,0);o.restore()}function Na(M,ea,Y,P){var X=~~(M.r*255),ga=~~(M.g*255);M=~~(M.b*255);var ma=~~(ea.r*255),oa=~~(ea.g*255);ea=~~(ea.b*255);var pa=~~(Y.r*
-255),va=~~(Y.g*255);Y=~~(Y.b*255);var ra=~~(P.r*255),wa=~~(P.g*255);P=~~(P.b*255);ha[0]=X<0?0:X>255?255:X;ha[1]=ga<0?0:ga>255?255:ga;ha[2]=M<0?0:M>255?255:M;ha[4]=ma<0?0:ma>255?255:ma;ha[5]=oa<0?0:oa>255?255:oa;ha[6]=ea<0?0:ea>255?255:ea;ha[8]=pa<0?0:pa>255?255:pa;ha[9]=va<0?0:va>255?255:va;ha[10]=Y<0?0:Y>255?255:Y;ha[12]=ra<0?0:ra>255?255:ra;ha[13]=wa<0?0:wa>255?255:wa;ha[14]=P<0?0:P>255?255:P;da.putImageData(la,0,0);ta.drawImage(T,0,0);return ia}function Ia(M,ea,Y){M=(M-ea)/(Y-ea);return M*M*(3-
-2*M)}function Ja(M){M=(M+1)*0.5;return M<0?0:M>1?1:M}function Ka(M,ea){var Y=ea.x-M.x,P=ea.y-M.y,X=1/Math.sqrt(Y*Y+P*P);Y*=X;P*=X;ea.x+=Y;ea.y+=P;M.x-=Y;M.y-=P}var Ha,Oa,ja,ua,Aa,La,Pa,Da;this.autoClear?this.clear():o.setTransform(1,0,0,-1,m,k);d=e.projectScene(ka,qa,this.sortElements);(R=ka.lights.length>0)&&sa(ka);Ha=0;for(Oa=d.length;Ha<Oa;Ha++){ja=d[Ha];H.empty();if(ja instanceof THREE.RenderableParticle){l=ja;l.x*=m;l.y*=k;ua=0;for(Aa=ja.materials.length;ua<Aa;ua++)Qa(l,ja,ja.materials[ua],ka)}else if(ja instanceof
-THREE.RenderableLine){l=ja.v1;n=ja.v2;l.positionScreen.x*=m;l.positionScreen.y*=k;n.positionScreen.x*=m;n.positionScreen.y*=k;H.addPoint(l.positionScreen.x,l.positionScreen.y);H.addPoint(n.positionScreen.x,n.positionScreen.y);if(ca.instersects(H)){ua=0;for(Aa=ja.materials.length;ua<Aa;)Ra(l,n,ja,ja.materials[ua++],ka)}}else if(ja instanceof THREE.RenderableFace3){l=ja.v1;n=ja.v2;f=ja.v3;l.positionScreen.x*=m;l.positionScreen.y*=k;n.positionScreen.x*=m;n.positionScreen.y*=k;f.positionScreen.x*=m;f.positionScreen.y*=
-k;if(ja.overdraw){Ka(l.positionScreen,n.positionScreen);Ka(n.positionScreen,f.positionScreen);Ka(f.positionScreen,l.positionScreen)}H.add3Points(l.positionScreen.x,l.positionScreen.y,n.positionScreen.x,n.positionScreen.y,f.positionScreen.x,f.positionScreen.y);if(ca.instersects(H)){ua=0;for(Aa=ja.meshMaterials.length;ua<Aa;){Da=ja.meshMaterials[ua++];if(Da instanceof THREE.MeshFaceMaterial){La=0;for(Pa=ja.faceMaterials.length;La<Pa;)(Da=ja.faceMaterials[La++])&&Ma(l,n,f,ja,Da,ka)}else Ma(l,n,f,ja,
-Da,ka)}}}W.addRectangle(H)}o.setTransform(1,0,0,1,0,0)}};
+ea,Y,P,X,ga,ma,oa,pa,wa,ra,xa,Ca){var ua,ya;ua=ma.width-1;ya=ma.height-1;oa*=ua;pa*=ya;wa*=ua;ra*=ya;xa*=ua;Ca*=ya;Y-=M;P-=ea;X-=M;ga-=ea;wa-=oa;ra-=pa;xa-=oa;Ca-=pa;ua=wa*Ca-xa*ra;if(ua!=0){ya=1/ua;ua=(Ca*Y-ra*X)*ya;ra=(Ca*P-ra*ga)*ya;Y=(wa*X-xa*Y)*ya;P=(wa*ga-xa*P)*ya;M=M-ua*oa-Y*pa;ea=ea-ra*oa-P*pa;o.save();o.transform(ua,ra,Y,P,M,ea);o.clip();o.drawImage(ma,0,0);o.restore()}}function Na(M,ea,Y,P){var X=~~(M.r*255),ga=~~(M.g*255);M=~~(M.b*255);var ma=~~(ea.r*255),oa=~~(ea.g*255);ea=~~(ea.b*255);
+var pa=~~(Y.r*255),wa=~~(Y.g*255);Y=~~(Y.b*255);var ra=~~(P.r*255),xa=~~(P.g*255);P=~~(P.b*255);ha[0]=X<0?0:X>255?255:X;ha[1]=ga<0?0:ga>255?255:ga;ha[2]=M<0?0:M>255?255:M;ha[4]=ma<0?0:ma>255?255:ma;ha[5]=oa<0?0:oa>255?255:oa;ha[6]=ea<0?0:ea>255?255:ea;ha[8]=pa<0?0:pa>255?255:pa;ha[9]=wa<0?0:wa>255?255:wa;ha[10]=Y<0?0:Y>255?255:Y;ha[12]=ra<0?0:ra>255?255:ra;ha[13]=xa<0?0:xa>255?255:xa;ha[14]=P<0?0:P>255?255:P;da.putImageData(la,0,0);ta.drawImage(T,0,0);return ia}function Ia(M,ea,Y){M=(M-ea)/(Y-ea);
+return M*M*(3-2*M)}function Ja(M){M=(M+1)*0.5;return M<0?0:M>1?1:M}function Ka(M,ea){var Y=ea.x-M.x,P=ea.y-M.y,X=1/Math.sqrt(Y*Y+P*P);Y*=X;P*=X;ea.x+=Y;ea.y+=P;M.x-=Y;M.y-=P}var Ha,Oa,ja,va,Aa,La,Pa,Da;this.autoClear?this.clear():o.setTransform(1,0,0,-1,m,k);d=e.projectScene(ka,qa,this.sortElements);(R=ka.lights.length>0)&&sa(ka);Ha=0;for(Oa=d.length;Ha<Oa;Ha++){ja=d[Ha];H.empty();if(ja instanceof THREE.RenderableParticle){l=ja;l.x*=m;l.y*=k;va=0;for(Aa=ja.materials.length;va<Aa;va++)Qa(l,ja,ja.materials[va],
+ka)}else if(ja instanceof THREE.RenderableLine){l=ja.v1;n=ja.v2;l.positionScreen.x*=m;l.positionScreen.y*=k;n.positionScreen.x*=m;n.positionScreen.y*=k;H.addPoint(l.positionScreen.x,l.positionScreen.y);H.addPoint(n.positionScreen.x,n.positionScreen.y);if(ca.instersects(H)){va=0;for(Aa=ja.materials.length;va<Aa;)Ra(l,n,ja,ja.materials[va++],ka)}}else if(ja instanceof THREE.RenderableFace3){l=ja.v1;n=ja.v2;f=ja.v3;l.positionScreen.x*=m;l.positionScreen.y*=k;n.positionScreen.x*=m;n.positionScreen.y*=
+k;f.positionScreen.x*=m;f.positionScreen.y*=k;if(ja.overdraw){Ka(l.positionScreen,n.positionScreen);Ka(n.positionScreen,f.positionScreen);Ka(f.positionScreen,l.positionScreen)}H.add3Points(l.positionScreen.x,l.positionScreen.y,n.positionScreen.x,n.positionScreen.y,f.positionScreen.x,f.positionScreen.y);if(ca.instersects(H)){va=0;for(Aa=ja.meshMaterials.length;va<Aa;){Da=ja.meshMaterials[va++];if(Da instanceof THREE.MeshFaceMaterial){La=0;for(Pa=ja.faceMaterials.length;La<Pa;)(Da=ja.faceMaterials[La++])&&
+Ma(l,n,f,ja,Da,ka)}else Ma(l,n,f,ja,Da,ka)}}}W.addRectangle(H)}o.setTransform(1,0,0,1,0,0)}};
 THREE.SVGRenderer=function(){function a(V,N,ba){var $,Q,S,ca;$=0;for(Q=V.lights.length;$<Q;$++){S=V.lights[$];if(S instanceof THREE.DirectionalLight){ca=N.normalWorld.dot(S.position)*S.intensity;if(ca>0){ba.r+=S.color.r*ca;ba.g+=S.color.g*ca;ba.b+=S.color.b*ca}}else if(S instanceof THREE.PointLight){F.sub(S.position,N.centroidWorld);F.normalize();ca=N.normalWorld.dot(F)*S.intensity;if(ca>0){ba.r+=S.color.r*ca;ba.g+=S.color.g*ca;ba.b+=S.color.b*ca}}}}function c(V,N,ba,$,Q,S){C=e(I++);C.setAttribute("d",
 THREE.SVGRenderer=function(){function a(V,N,ba){var $,Q,S,ca;$=0;for(Q=V.lights.length;$<Q;$++){S=V.lights[$];if(S instanceof THREE.DirectionalLight){ca=N.normalWorld.dot(S.position)*S.intensity;if(ca>0){ba.r+=S.color.r*ca;ba.g+=S.color.g*ca;ba.b+=S.color.b*ca}}else if(S instanceof THREE.PointLight){F.sub(S.position,N.centroidWorld);F.normalize();ca=N.normalWorld.dot(F)*S.intensity;if(ca>0){ba.r+=S.color.r*ca;ba.g+=S.color.g*ca;ba.b+=S.color.b*ca}}}}function c(V,N,ba,$,Q,S){C=e(I++);C.setAttribute("d",
 "M "+V.positionScreen.x+" "+V.positionScreen.y+" L "+N.positionScreen.x+" "+N.positionScreen.y+" L "+ba.positionScreen.x+","+ba.positionScreen.y+"z");if(Q instanceof THREE.MeshBasicMaterial)f.__styleString=Q.color.__styleString;else if(Q instanceof THREE.MeshLambertMaterial)if(n){p.r=q.r;p.g=q.g;p.b=q.b;a(S,$,p);f.r=Q.color.r*p.r;f.g=Q.color.g*p.g;f.b=Q.color.b*p.b;f.updateStyleString()}else f.__styleString=Q.color.__styleString;else if(Q instanceof THREE.MeshDepthMaterial){v=1-Q.__2near/(Q.__farPlusNear-
 "M "+V.positionScreen.x+" "+V.positionScreen.y+" L "+N.positionScreen.x+" "+N.positionScreen.y+" L "+ba.positionScreen.x+","+ba.positionScreen.y+"z");if(Q instanceof THREE.MeshBasicMaterial)f.__styleString=Q.color.__styleString;else if(Q instanceof THREE.MeshLambertMaterial)if(n){p.r=q.r;p.g=q.g;p.b=q.b;a(S,$,p);f.r=Q.color.r*p.r;f.g=Q.color.g*p.g;f.b=Q.color.b*p.b;f.updateStyleString()}else f.__styleString=Q.color.__styleString;else if(Q instanceof THREE.MeshDepthMaterial){v=1-Q.__2near/(Q.__farPlusNear-
 $.z*Q.__farMinusNear);f.setRGB(v,v,v)}else Q instanceof THREE.MeshNormalMaterial&&f.setRGB(h($.normalWorld.x),h($.normalWorld.y),h($.normalWorld.z));Q.wireframe?C.setAttribute("style","fill: none; stroke: "+f.__styleString+"; stroke-width: "+Q.wireframe_linewidth+"; stroke-opacity: "+Q.opacity+"; stroke-linecap: "+Q.wireframe_linecap+"; stroke-linejoin: "+Q.wireframe_linejoin):C.setAttribute("style","fill: "+f.__styleString+"; fill-opacity: "+Q.opacity);m.appendChild(C)}function d(V,N,ba,$,Q,S,ca){C=
 $.z*Q.__farMinusNear);f.setRGB(v,v,v)}else Q instanceof THREE.MeshNormalMaterial&&f.setRGB(h($.normalWorld.x),h($.normalWorld.y),h($.normalWorld.z));Q.wireframe?C.setAttribute("style","fill: none; stroke: "+f.__styleString+"; stroke-width: "+Q.wireframe_linewidth+"; stroke-opacity: "+Q.opacity+"; stroke-linecap: "+Q.wireframe_linecap+"; stroke-linejoin: "+Q.wireframe_linejoin):C.setAttribute("style","fill: "+f.__styleString+"; fill-opacity: "+Q.opacity);m.appendChild(C)}function d(V,N,ba,$,Q,S,ca){C=
@@ -160,7 +160,7 @@ this.createLineBuffers=function(j){j.__webGLVertexBuffer=b.createBuffer();j.__we
 function(j){var l=j.vertices.length;j.__vertexArray=new Float32Array(l*3);j.__colorArray=new Float32Array(l*3);j.__lineArray=new Uint16Array(l);j.__webGLLineCount=l};this.initParticleBuffers=function(j){var l=j.vertices.length;j.__vertexArray=new Float32Array(l*3);j.__colorArray=new Float32Array(l*3);j.__particleArray=new Uint16Array(l);j.__sortArray=[];j.__webGLParticleCount=l};this.initMeshBuffers=function(j,l){var n,f,p=0,q=0,E=0,x=l.geometry.faces,v=j.faces;n=0;for(f=v.length;n<f;n++){fi=v[n];
 function(j){var l=j.vertices.length;j.__vertexArray=new Float32Array(l*3);j.__colorArray=new Float32Array(l*3);j.__lineArray=new Uint16Array(l);j.__webGLLineCount=l};this.initParticleBuffers=function(j){var l=j.vertices.length;j.__vertexArray=new Float32Array(l*3);j.__colorArray=new Float32Array(l*3);j.__particleArray=new Uint16Array(l);j.__sortArray=[];j.__webGLParticleCount=l};this.initMeshBuffers=function(j,l){var n,f,p=0,q=0,E=0,x=l.geometry.faces,v=j.faces;n=0;for(f=v.length;n<f;n++){fi=v[n];
 face=x[fi];if(face instanceof THREE.Face3){p+=3;q+=1;E+=3}else if(face instanceof THREE.Face4){p+=4;q+=2;E+=4}}j.__vertexArray=new Float32Array(p*3);j.__normalArray=new Float32Array(p*3);j.__tangentArray=new Float32Array(p*4);j.__colorArray=new Float32Array(p*3);j.__uvArray=new Float32Array(p*2);j.__uv2Array=new Float32Array(p*2);j.__faceArray=new Uint16Array(q*3);j.__lineArray=new Uint16Array(E*2);p=false;n=0;for(f=l.materials.length;n<f;n++){x=l.materials[n];if(x instanceof THREE.MeshFaceMaterial){x=
 face=x[fi];if(face instanceof THREE.Face3){p+=3;q+=1;E+=3}else if(face instanceof THREE.Face4){p+=4;q+=2;E+=4}}j.__vertexArray=new Float32Array(p*3);j.__normalArray=new Float32Array(p*3);j.__tangentArray=new Float32Array(p*4);j.__colorArray=new Float32Array(p*3);j.__uvArray=new Float32Array(p*2);j.__uv2Array=new Float32Array(p*2);j.__faceArray=new Uint16Array(q*3);j.__lineArray=new Uint16Array(E*2);p=false;n=0;for(f=l.materials.length;n<f;n++){x=l.materials[n];if(x instanceof THREE.MeshFaceMaterial){x=
 0;for(v=j.materials.length;x<v;x++)if(j.materials[x]&&j.materials[x].shading!=undefined&&j.materials[x].shading==THREE.SmoothShading){p=true;break}}else if(x&&x.shading!=undefined&&x.shading==THREE.SmoothShading){p=true;break}if(p)break}j.__needsSmoothNormals=p;j.__webGLFaceCount=q*3;j.__webGLLineCount=E*2};this.setMeshBuffers=function(j,l,n){var f,p,q,E,x,v,F,B,G,J,C=0,I=0,aa=0,O=0,U=0,V=0,N=0,ba=0,$=0,Q=j.__vertexArray,S=j.__uvArray,ca=j.__uv2Array,W=j.__normalArray,H=j.__tangentArray,R=j.__colorArray,
 0;for(v=j.materials.length;x<v;x++)if(j.materials[x]&&j.materials[x].shading!=undefined&&j.materials[x].shading==THREE.SmoothShading){p=true;break}}else if(x&&x.shading!=undefined&&x.shading==THREE.SmoothShading){p=true;break}if(p)break}j.__needsSmoothNormals=p;j.__webGLFaceCount=q*3;j.__webGLLineCount=E*2};this.setMeshBuffers=function(j,l,n){var f,p,q,E,x,v,F,B,G,J,C=0,I=0,aa=0,O=0,U=0,V=0,N=0,ba=0,$=0,Q=j.__vertexArray,S=j.__uvArray,ca=j.__uv2Array,W=j.__normalArray,H=j.__tangentArray,R=j.__colorArray,
-Z=j.__faceArray,fa=j.__lineArray,na=j.__needsSmoothNormals,D=l.geometry,K=D.__dirtyVertices,L=D.__dirtyElements,T=D.__dirtyUvs,da=D.__dirtyNormals,la=D.__dirtyTangents,ha=D.__dirtyColors,ia=D.vertices,ta=j.faces,ya=D.faces,ka=D.uvs,qa=D.uvs2,sa=D.colors;l=0;for(f=ta.length;l<f;l++){p=ta[l];q=ya[p];v=ka[p];p=qa[p];E=q.vertexNormals;x=q.normal;if(q instanceof THREE.Face3){if(K){F=ia[q.a].position;B=ia[q.b].position;G=ia[q.c].position;Q[I]=F.x;Q[I+1]=F.y;Q[I+2]=F.z;Q[I+3]=B.x;Q[I+4]=B.y;Q[I+5]=B.z;Q[I+
+Z=j.__faceArray,fa=j.__lineArray,na=j.__needsSmoothNormals,D=l.geometry,K=D.__dirtyVertices,L=D.__dirtyElements,T=D.__dirtyUvs,da=D.__dirtyNormals,la=D.__dirtyTangents,ha=D.__dirtyColors,ia=D.vertices,ta=j.faces,za=D.faces,ka=D.uvs,qa=D.uvs2,sa=D.colors;l=0;for(f=ta.length;l<f;l++){p=ta[l];q=za[p];v=ka[p];p=qa[p];E=q.vertexNormals;x=q.normal;if(q instanceof THREE.Face3){if(K){F=ia[q.a].position;B=ia[q.b].position;G=ia[q.c].position;Q[I]=F.x;Q[I+1]=F.y;Q[I+2]=F.z;Q[I+3]=B.x;Q[I+4]=B.y;Q[I+5]=B.z;Q[I+
 6]=G.x;Q[I+7]=G.y;Q[I+8]=G.z;I+=9}if(ha&&sa.length){F=sa[q.a];B=sa[q.b];G=sa[q.c];R[$]=F.r;R[$+1]=F.g;R[$+2]=F.b;R[$+3]=B.r;R[$+4]=B.g;R[$+5]=B.b;R[$+6]=G.r;R[$+7]=G.g;R[$+8]=G.b;$+=9}if(la&&D.hasTangents){F=ia[q.a].tangent;B=ia[q.b].tangent;G=ia[q.c].tangent;H[N]=F.x;H[N+1]=F.y;H[N+2]=F.z;H[N+3]=F.w;H[N+4]=B.x;H[N+5]=B.y;H[N+6]=B.z;H[N+7]=B.w;H[N+8]=G.x;H[N+9]=G.y;H[N+10]=G.z;H[N+11]=G.w;N+=12}if(da)if(E.length==3&&na)for(q=0;q<3;q++){x=E[q];W[V]=x.x;W[V+1]=x.y;W[V+2]=x.z;V+=3}else for(q=0;q<3;q++){W[V]=
 6]=G.x;Q[I+7]=G.y;Q[I+8]=G.z;I+=9}if(ha&&sa.length){F=sa[q.a];B=sa[q.b];G=sa[q.c];R[$]=F.r;R[$+1]=F.g;R[$+2]=F.b;R[$+3]=B.r;R[$+4]=B.g;R[$+5]=B.b;R[$+6]=G.r;R[$+7]=G.g;R[$+8]=G.b;$+=9}if(la&&D.hasTangents){F=ia[q.a].tangent;B=ia[q.b].tangent;G=ia[q.c].tangent;H[N]=F.x;H[N+1]=F.y;H[N+2]=F.z;H[N+3]=F.w;H[N+4]=B.x;H[N+5]=B.y;H[N+6]=B.z;H[N+7]=B.w;H[N+8]=G.x;H[N+9]=G.y;H[N+10]=G.z;H[N+11]=G.w;N+=12}if(da)if(E.length==3&&na)for(q=0;q<3;q++){x=E[q];W[V]=x.x;W[V+1]=x.y;W[V+2]=x.z;V+=3}else for(q=0;q<3;q++){W[V]=
 x.x;W[V+1]=x.y;W[V+2]=x.z;V+=3}if(T&&v)for(q=0;q<3;q++){E=v[q];S[aa]=E.u;S[aa+1]=E.v;aa+=2}if(T&&p)for(q=0;q<3;q++){v=p[q];ca[O]=v.u;ca[O+1]=v.v;O+=2}if(L){Z[U]=C;Z[U+1]=C+1;Z[U+2]=C+2;U+=3;fa[ba]=C;fa[ba+1]=C+1;fa[ba+2]=C;fa[ba+3]=C+2;fa[ba+4]=C+1;fa[ba+5]=C+2;ba+=6;C+=3}}else if(q instanceof THREE.Face4){if(K){F=ia[q.a].position;B=ia[q.b].position;G=ia[q.c].position;J=ia[q.d].position;Q[I]=F.x;Q[I+1]=F.y;Q[I+2]=F.z;Q[I+3]=B.x;Q[I+4]=B.y;Q[I+5]=B.z;Q[I+6]=G.x;Q[I+7]=G.y;Q[I+8]=G.z;Q[I+9]=J.x;Q[I+
 x.x;W[V+1]=x.y;W[V+2]=x.z;V+=3}if(T&&v)for(q=0;q<3;q++){E=v[q];S[aa]=E.u;S[aa+1]=E.v;aa+=2}if(T&&p)for(q=0;q<3;q++){v=p[q];ca[O]=v.u;ca[O+1]=v.v;O+=2}if(L){Z[U]=C;Z[U+1]=C+1;Z[U+2]=C+2;U+=3;fa[ba]=C;fa[ba+1]=C+1;fa[ba+2]=C;fa[ba+3]=C+2;fa[ba+4]=C+1;fa[ba+5]=C+2;ba+=6;C+=3}}else if(q instanceof THREE.Face4){if(K){F=ia[q.a].position;B=ia[q.b].position;G=ia[q.c].position;J=ia[q.d].position;Q[I]=F.x;Q[I+1]=F.y;Q[I+2]=F.z;Q[I+3]=B.x;Q[I+4]=B.y;Q[I+5]=B.z;Q[I+6]=G.x;Q[I+7]=G.y;Q[I+8]=G.z;Q[I+9]=J.x;Q[I+
 10]=J.y;Q[I+11]=J.z;I+=12}if(ha&&sa.length){F=sa[q.a];B=sa[q.b];G=sa[q.d];R[$]=F.r;R[$+1]=F.g;R[$+2]=F.b;R[$+3]=B.r;R[$+4]=B.g;R[$+5]=B.b;R[$+6]=G.r;R[$+7]=G.g;R[$+8]=G.b;R[$+9]=(void 0).r;R[$+10]=(void 0).g;R[$+11]=(void 0).b;$+=12}if(la&&D.hasTangents){F=ia[q.a].tangent;B=ia[q.b].tangent;G=ia[q.c].tangent;q=ia[q.d].tangent;H[N]=F.x;H[N+1]=F.y;H[N+2]=F.z;H[N+3]=F.w;H[N+4]=B.x;H[N+5]=B.y;H[N+6]=B.z;H[N+7]=B.w;H[N+8]=G.x;H[N+9]=G.y;H[N+10]=G.z;H[N+11]=G.w;H[N+12]=q.x;H[N+13]=q.y;H[N+14]=q.z;H[N+15]=
 10]=J.y;Q[I+11]=J.z;I+=12}if(ha&&sa.length){F=sa[q.a];B=sa[q.b];G=sa[q.d];R[$]=F.r;R[$+1]=F.g;R[$+2]=F.b;R[$+3]=B.r;R[$+4]=B.g;R[$+5]=B.b;R[$+6]=G.r;R[$+7]=G.g;R[$+8]=G.b;R[$+9]=(void 0).r;R[$+10]=(void 0).g;R[$+11]=(void 0).b;$+=12}if(la&&D.hasTangents){F=ia[q.a].tangent;B=ia[q.b].tangent;G=ia[q.c].tangent;q=ia[q.d].tangent;H[N]=F.x;H[N+1]=F.y;H[N+2]=F.z;H[N+3]=F.w;H[N+4]=B.x;H[N+5]=B.y;H[N+6]=B.z;H[N+7]=B.w;H[N+8]=G.x;H[N+9]=G.y;H[N+10]=G.z;H[N+11]=G.w;H[N+12]=q.x;H[N+13]=q.y;H[N+14]=q.z;H[N+15]=

+ 11 - 7
src/renderers/CanvasRenderer.js

@@ -697,7 +697,7 @@ THREE.CanvasRenderer = function () {
 
 
 			// http://extremelysatisfactorytotalitarianism.com/blog/?p=2120
 			// http://extremelysatisfactorytotalitarianism.com/blog/?p=2120
 
 
-			var a, b, c, d, e, f, det,
+			var a, b, c, d, e, f, det, idet,
 			width = bitmap.width - 1,
 			width = bitmap.width - 1,
 			height = bitmap.height - 1;
 			height = bitmap.height - 1;
 
 
@@ -711,14 +711,18 @@ THREE.CanvasRenderer = function () {
 			u1 -= u0; v1 -= v0;
 			u1 -= u0; v1 -= v0;
 			u2 -= u0; v2 -= v0;
 			u2 -= u0; v2 -= v0;
 
 
-			det = 1 / ( u1 * v2 - u2 * v1 ),
+			det = u1 * v2 - u2 * v1;
 
 
-			a = ( v2 * x1 - v1 * x2 ) * det,
-			b = ( v2 * y1 - v1 * y2 ) * det,
-			c = ( u1 * x2 - u2 * x1 ) * det,
-			d = ( u1 * y2 - u2 * y1 ) * det,
+			if ( det == 0 ) return;
 
 
-			e = x0 - a * u0 - c * v0,
+			idet = 1 / det;
+
+			a = ( v2 * x1 - v1 * x2 ) * idet;
+			b = ( v2 * y1 - v1 * y2 ) * idet;
+			c = ( u1 * x2 - u2 * x1 ) * idet;
+			d = ( u1 * y2 - u2 * y1 ) * idet;
+
+			e = x0 - a * u0 - c * v0;
 			f = y0 - b * u0 - d * v0;
 			f = y0 - b * u0 - d * v0;
 
 
 			_context.save();
 			_context.save();