Browse Source

Synced with mrdoob's branch.

alteredq 14 years ago
parent
commit
b4a177f326
5 changed files with 68 additions and 54 deletions
  1. 15 15
      build/Three.js
  2. 16 16
      build/ThreeDebug.js
  3. 14 14
      build/ThreeExtras.js
  4. 8 8
      src/renderers/CanvasRenderer.js
  5. 15 1
      src/renderers/WebGLRenderer2.js

+ 15 - 15
build/Three.js

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

+ 16 - 16
build/ThreeDebug.js

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

+ 14 - 14
build/ThreeExtras.js

@@ -111,21 +111,21 @@ R;k.faceMaterials=H.materials;k.overdraw=T;if(P.geometry.uvs[z]){k.uvs[0]=P.geom
 j.w);o.multiplyScalar(1/o.w);l=B[t]=B[t]||new THREE.RenderableLine;l.v1.positionScreen.copy(j);l.v2.positionScreen.copy(o);l.z=Math.max(j.z,o.z);l.materials=P.materials;w.push(l);t++}}}else if(P instanceof THREE.Particle){G.set(P.position.x,P.position.y,P.position.z,1);n.multiplyVector4(G);G.z/=G.w;if(G.z>0&&G.z<1){p=u[v]=u[v]||new THREE.RenderableParticle;p.x=G.x/G.w;p.y=G.y/G.w;p.z=G.z;p.rotation=P.rotation.z;p.scale.x=P.scale.x*Math.abs(p.x-(G.x+y.projectionMatrix.n11)/(G.w+y.projectionMatrix.n14));
 p.scale.y=P.scale.y*Math.abs(p.y-(G.y+y.projectionMatrix.n22)/(G.w+y.projectionMatrix.n24));p.materials=P.materials;w.push(p);v++}}}}K&&w.sort(a);return w};this.unprojectVector=function(q,y){var K=THREE.Matrix4.makeInvert(y.matrix);K.multiplySelf(THREE.Matrix4.makeInvert(y.projectionMatrix));K.multiplyVector3(q);return q}};
 THREE.DOMRenderer=function(){THREE.Renderer.call(this);var a=null,b=new THREE.Projector,d,e,f,g;this.domElement=document.createElement("div");this.setSize=function(k,c){d=k;e=c;f=d/2;g=e/2};this.render=function(k,c){var h,l,t,B,p,v,u,D;a=b.projectScene(k,c);h=0;for(l=a.length;h<l;h++){p=a[h];if(p instanceof THREE.RenderableParticle){u=p.x*f+f;D=p.y*g+g;t=0;for(B=p.material.length;t<B;t++){v=p.material[t];if(v instanceof THREE.ParticleDOMMaterial){v=v.domElement;v.style.left=u+"px";v.style.top=D+"px"}}}}}};
-THREE.CanvasRenderer=function(){function a(ma){if(p!=ma)l.globalAlpha=p=ma}function b(ma){if(v!=ma){switch(ma){case THREE.NormalBlending:l.globalCompositeOperation="source-over";break;case THREE.AdditiveBlending:l.globalCompositeOperation="lighter";break;case THREE.SubtractiveBlending:l.globalCompositeOperation="darker"}v=ma}}var d=null,e=new THREE.Projector,f=document.createElement("canvas"),g,k,c,h,l=f.getContext("2d"),t=null,B=null,p=1,v=0,u=null,D=null,G=1,n,I,m,j,o,C,q,y,K,w=new THREE.Color,
+THREE.CanvasRenderer=function(){function a(ma){if(p!=ma)l.globalAlpha=p=ma}function b(ma){if(v!=ma){switch(ma){case THREE.NormalBlending:l.globalCompositeOperation="source-over";break;case THREE.AdditiveBlending:l.globalCompositeOperation="lighter";break;case THREE.SubtractiveBlending:l.globalCompositeOperation="darker"}v=ma}}var d=null,e=new THREE.Projector,f=document.createElement("canvas"),g,k,c,h,l=f.getContext("2d"),t=new THREE.Color(0),B=0,p=1,v=0,u=null,D=null,G=1,n,I,m,j,o,C,q,y,K,w=new THREE.Color,
 E=new THREE.Color,A=new THREE.Color,F=new THREE.Color,z=new THREE.Color,O,L,U,W,P,da,X,R,T,ba=new THREE.Rectangle,Y=new THREE.Rectangle,H=new THREE.Rectangle,S=false,V=new THREE.Color,ia=new THREE.Color,ha=new THREE.Color,x=new THREE.Color,M=Math.PI*2,J=new THREE.Vector3,Z,ca,ga,ja,qa,sa,ya=16;Z=document.createElement("canvas");Z.width=Z.height=2;ca=Z.getContext("2d");ca.fillStyle="rgba(0,0,0,1)";ca.fillRect(0,0,2,2);ga=ca.getImageData(0,0,2,2);ja=ga.data;qa=document.createElement("canvas");qa.width=
-qa.height=ya;sa=qa.getContext("2d");sa.translate(-ya/2,-ya/2);sa.scale(ya,ya);ya--;this.domElement=f;this.sortElements=this.sortObjects=this.autoClear=true;this.setSize=function(ma,wa){g=ma;k=wa;c=g/2;h=k/2;f.width=g;f.height=k;ba.set(-c,-h,c,h);p=1;v=0;D=u=null;G=1};this.setClearColor=function(ma,wa){t=ma!==null?new THREE.Color(ma):null;B=wa;Y.set(-c,-h,c,h);l.setTransform(1,0,0,-1,c,h);this.clear()};this.clear=function(){if(!Y.isEmpty()){Y.inflate(1);Y.minSelf(ba);if(t!==null){b(THREE.NormalBlending);
-a(1);l.fillStyle="rgba("+Math.floor(t.r*255)+","+Math.floor(t.g*255)+","+Math.floor(t.b*255)+","+B+")";l.fillRect(Y.getX(),Y.getY(),Y.getWidth(),Y.getHeight())}else l.clearRect(Y.getX(),Y.getY(),Y.getWidth(),Y.getHeight());Y.empty()}};this.render=function(ma,wa){function Pa(N){var ea,aa,Q,$=N.lights;ia.setRGB(0,0,0);ha.setRGB(0,0,0);x.setRGB(0,0,0);N=0;for(ea=$.length;N<ea;N++){aa=$[N];Q=aa.color;if(aa instanceof THREE.AmbientLight){ia.r+=Q.r;ia.g+=Q.g;ia.b+=Q.b}else if(aa instanceof THREE.DirectionalLight){ha.r+=
-Q.r;ha.g+=Q.g;ha.b+=Q.b}else if(aa instanceof THREE.PointLight){x.r+=Q.r;x.g+=Q.g;x.b+=Q.b}}}function Da(N,ea,aa,Q){var $,fa,la,na,oa=N.lights;N=0;for($=oa.length;N<$;N++){fa=oa[N];la=fa.color;na=fa.intensity;if(fa instanceof THREE.DirectionalLight){fa=aa.dot(fa.position)*na;if(fa>0){Q.r+=la.r*fa;Q.g+=la.g*fa;Q.b+=la.b*fa}}else if(fa instanceof THREE.PointLight){J.sub(fa.position,ea);J.normalize();fa=aa.dot(J)*na;if(fa>0){Q.r+=la.r*fa;Q.g+=la.g*fa;Q.b+=la.b*fa}}}}function Qa(N,ea,aa){if(aa.opacity!=
-0){a(aa.opacity);b(aa.blending);var Q,$,fa,la,na,oa;if(aa instanceof THREE.ParticleBasicMaterial){if(aa.map){la=aa.map;na=la.width>>1;oa=la.height>>1;$=ea.scale.x*c;fa=ea.scale.y*h;aa=$*na;Q=fa*oa;H.set(N.x-aa,N.y-Q,N.x+aa,N.y+Q);if(ba.instersects(H)){l.save();l.translate(N.x,N.y);l.rotate(-ea.rotation);l.scale($,-fa);l.translate(-na,-oa);l.drawImage(la,0,0);l.restore()}}}else if(aa instanceof THREE.ParticleCircleMaterial){if(S){V.r=ia.r+ha.r+x.r;V.g=ia.g+ha.g+x.g;V.b=ia.b+ha.b+x.b;w.r=aa.color.r*
-V.r;w.g=aa.color.g*V.g;w.b=aa.color.b*V.b;w.updateStyleString()}else w.__styleString=aa.color.__styleString;aa=ea.scale.x*c;Q=ea.scale.y*h;H.set(N.x-aa,N.y-Q,N.x+aa,N.y+Q);if(ba.instersects(H)){$=w.__styleString;if(D!=$)l.fillStyle=D=$;l.save();l.translate(N.x,N.y);l.rotate(-ea.rotation);l.scale(aa,Q);l.beginPath();l.arc(0,0,1,0,M,true);l.closePath();l.fill();l.restore()}}}}function Ra(N,ea,aa,Q){if(Q.opacity!=0){a(Q.opacity);b(Q.blending);l.beginPath();l.moveTo(N.positionScreen.x,N.positionScreen.y);
-l.lineTo(ea.positionScreen.x,ea.positionScreen.y);l.closePath();if(Q instanceof THREE.LineBasicMaterial){w.__styleString=Q.color.__styleString;N=Q.linewidth;if(G!=N)l.lineWidth=G=N;N=w.__styleString;if(u!=N)l.strokeStyle=u=N;l.stroke();H.inflate(Q.linewidth*2)}}}function La(N,ea,aa,Q,$,fa){if($.opacity!=0){a($.opacity);b($.blending);j=N.positionScreen.x;o=N.positionScreen.y;C=ea.positionScreen.x;q=ea.positionScreen.y;y=aa.positionScreen.x;K=aa.positionScreen.y;l.beginPath();l.moveTo(j,o);l.lineTo(C,
-q);l.lineTo(y,K);l.lineTo(j,o);l.closePath();if($ instanceof THREE.MeshBasicMaterial)if($.map)$.map.image.loaded&&$.map.mapping instanceof THREE.UVMapping&&Aa(j,o,C,q,y,K,$.map.image,Q.uvs[0].u,Q.uvs[0].v,Q.uvs[1].u,Q.uvs[1].v,Q.uvs[2].u,Q.uvs[2].v);else if($.env_map){if($.env_map.image.loaded)if($.env_map.mapping instanceof THREE.SphericalReflectionMapping){N=wa.matrix;J.copy(Q.vertexNormalsWorld[0]);W=(J.x*N.n11+J.y*N.n12+J.z*N.n13)*0.5+0.5;P=-(J.x*N.n21+J.y*N.n22+J.z*N.n23)*0.5+0.5;J.copy(Q.vertexNormalsWorld[1]);
-da=(J.x*N.n11+J.y*N.n12+J.z*N.n13)*0.5+0.5;X=-(J.x*N.n21+J.y*N.n22+J.z*N.n23)*0.5+0.5;J.copy(Q.vertexNormalsWorld[2]);R=(J.x*N.n11+J.y*N.n12+J.z*N.n13)*0.5+0.5;T=-(J.x*N.n21+J.y*N.n22+J.z*N.n23)*0.5+0.5;Aa(j,o,C,q,y,K,$.env_map.image,W,P,da,X,R,T)}}else $.wireframe?Ea($.color.__styleString,$.wireframe_linewidth):Fa($.color.__styleString);else if($ instanceof THREE.MeshLambertMaterial){if($.map&&!$.wireframe){$.map.mapping instanceof THREE.UVMapping&&Aa(j,o,C,q,y,K,$.map.image,Q.uvs[0].u,Q.uvs[0].v,
-Q.uvs[1].u,Q.uvs[1].v,Q.uvs[2].u,Q.uvs[2].v);b(THREE.SubtractiveBlending)}if(S)if(!$.wireframe&&$.shading==THREE.SmoothShading&&Q.vertexNormalsWorld.length==3){E.r=A.r=F.r=ia.r;E.g=A.g=F.g=ia.g;E.b=A.b=F.b=ia.b;Da(fa,Q.v1.positionWorld,Q.vertexNormalsWorld[0],E);Da(fa,Q.v2.positionWorld,Q.vertexNormalsWorld[1],A);Da(fa,Q.v3.positionWorld,Q.vertexNormalsWorld[2],F);z.r=(A.r+F.r)*0.5;z.g=(A.g+F.g)*0.5;z.b=(A.b+F.b)*0.5;U=Ma(E,A,F,z);Aa(j,o,C,q,y,K,U,0,0,1,0,0,1)}else{V.r=ia.r;V.g=ia.g;V.b=ia.b;Da(fa,
-Q.centroidWorld,Q.normalWorld,V);w.r=$.color.r*V.r;w.g=$.color.g*V.g;w.b=$.color.b*V.b;w.updateStyleString();$.wireframe?Ea(w.__styleString,$.wireframe_linewidth):Fa(w.__styleString)}else $.wireframe?Ea($.color.__styleString,$.wireframe_linewidth):Fa($.color.__styleString)}else if($ instanceof THREE.MeshDepthMaterial){O=wa.near;L=wa.far;E.r=E.g=E.b=1-Ha(N.positionScreen.z,O,L);A.r=A.g=A.b=1-Ha(ea.positionScreen.z,O,L);F.r=F.g=F.b=1-Ha(aa.positionScreen.z,O,L);z.r=(A.r+F.r)*0.5;z.g=(A.g+F.g)*0.5;z.b=
-(A.b+F.b)*0.5;U=Ma(E,A,F,z);Aa(j,o,C,q,y,K,U,0,0,1,0,0,1)}else if($ instanceof THREE.MeshNormalMaterial){w.r=Ia(Q.normalWorld.x);w.g=Ia(Q.normalWorld.y);w.b=Ia(Q.normalWorld.z);w.updateStyleString();$.wireframe?Ea(w.__styleString,$.wireframe_linewidth):Fa(w.__styleString)}}}function Ea(N,ea){if(u!=N)l.strokeStyle=u=N;if(G!=ea)l.lineWidth=G=ea;l.stroke();H.inflate(ea*2)}function Fa(N){if(D!=N)l.fillStyle=D=N;l.fill()}function Aa(N,ea,aa,Q,$,fa,la,na,oa,ta,pa,ua,Ba){var xa,va;xa=la.width-1;va=la.height-
-1;na*=xa;oa*=va;ta*=xa;pa*=va;ua*=xa;Ba*=va;aa-=N;Q-=ea;$-=N;fa-=ea;ta-=na;pa-=oa;ua-=na;Ba-=oa;va=1/(ta*Ba-ua*pa);xa=(Ba*aa-pa*$)*va;pa=(Ba*Q-pa*fa)*va;aa=(ta*$-ua*aa)*va;Q=(ta*fa-ua*Q)*va;N=N-xa*na-aa*oa;ea=ea-pa*na-Q*oa;l.save();l.transform(xa,pa,aa,Q,N,ea);l.clip();l.drawImage(la,0,0);l.restore()}function Ma(N,ea,aa,Q){var $=~~(N.r*255),fa=~~(N.g*255);N=~~(N.b*255);var la=~~(ea.r*255),na=~~(ea.g*255);ea=~~(ea.b*255);var oa=~~(aa.r*255),ta=~~(aa.g*255);aa=~~(aa.b*255);var pa=~~(Q.r*255),ua=~~(Q.g*
-255);Q=~~(Q.b*255);ja[0]=$<0?0:$>255?255:$;ja[1]=fa<0?0:fa>255?255:fa;ja[2]=N<0?0:N>255?255:N;ja[4]=la<0?0:la>255?255:la;ja[5]=na<0?0:na>255?255:na;ja[6]=ea<0?0:ea>255?255:ea;ja[8]=oa<0?0:oa>255?255:oa;ja[9]=ta<0?0:ta>255?255:ta;ja[10]=aa<0?0:aa>255?255:aa;ja[12]=pa<0?0:pa>255?255:pa;ja[13]=ua<0?0:ua>255?255:ua;ja[14]=Q<0?0:Q>255?255:Q;ca.putImageData(ga,0,0);sa.drawImage(Z,0,0);return qa}function Ha(N,ea,aa){N=(N-ea)/(aa-ea);return N*N*(3-2*N)}function Ia(N){N=(N+1)*0.5;return N<0?0:N>1?1:N}function Ja(N,
+qa.height=ya;sa=qa.getContext("2d");sa.translate(-ya/2,-ya/2);sa.scale(ya,ya);ya--;this.domElement=f;this.sortElements=this.sortObjects=this.autoClear=true;this.setSize=function(ma,wa){g=ma;k=wa;c=g/2;h=k/2;f.width=g;f.height=k;ba.set(-c,-h,c,h);p=1;v=0;D=u=null;G=1};this.setClearColor=function(ma,wa){t.setHex(ma);B=wa;Y.set(-c,-h,c,h);l.setTransform(1,0,0,-1,c,h);this.clear()};this.clear=function(){if(!Y.isEmpty()){Y.inflate(1);Y.minSelf(ba);if(t.hex==0&&B==0)l.clearRect(Y.getX(),Y.getY(),Y.getWidth(),
+Y.getHeight());else{b(THREE.NormalBlending);a(1);l.fillStyle="rgba("+Math.floor(t.r*255)+","+Math.floor(t.g*255)+","+Math.floor(t.b*255)+","+B+")";l.fillRect(Y.getX(),Y.getY(),Y.getWidth(),Y.getHeight())}Y.empty()}};this.render=function(ma,wa){function Pa(N){var ea,aa,Q,$=N.lights;ia.setRGB(0,0,0);ha.setRGB(0,0,0);x.setRGB(0,0,0);N=0;for(ea=$.length;N<ea;N++){aa=$[N];Q=aa.color;if(aa instanceof THREE.AmbientLight){ia.r+=Q.r;ia.g+=Q.g;ia.b+=Q.b}else if(aa instanceof THREE.DirectionalLight){ha.r+=Q.r;
+ha.g+=Q.g;ha.b+=Q.b}else if(aa instanceof THREE.PointLight){x.r+=Q.r;x.g+=Q.g;x.b+=Q.b}}}function Da(N,ea,aa,Q){var $,fa,la,na,oa=N.lights;N=0;for($=oa.length;N<$;N++){fa=oa[N];la=fa.color;na=fa.intensity;if(fa instanceof THREE.DirectionalLight){fa=aa.dot(fa.position)*na;if(fa>0){Q.r+=la.r*fa;Q.g+=la.g*fa;Q.b+=la.b*fa}}else if(fa instanceof THREE.PointLight){J.sub(fa.position,ea);J.normalize();fa=aa.dot(J)*na;if(fa>0){Q.r+=la.r*fa;Q.g+=la.g*fa;Q.b+=la.b*fa}}}}function Qa(N,ea,aa){if(aa.opacity!=0){a(aa.opacity);
+b(aa.blending);var Q,$,fa,la,na,oa;if(aa instanceof THREE.ParticleBasicMaterial){if(aa.map){la=aa.map;na=la.width>>1;oa=la.height>>1;$=ea.scale.x*c;fa=ea.scale.y*h;aa=$*na;Q=fa*oa;H.set(N.x-aa,N.y-Q,N.x+aa,N.y+Q);if(ba.instersects(H)){l.save();l.translate(N.x,N.y);l.rotate(-ea.rotation);l.scale($,-fa);l.translate(-na,-oa);l.drawImage(la,0,0);l.restore()}}}else if(aa instanceof THREE.ParticleCircleMaterial){if(S){V.r=ia.r+ha.r+x.r;V.g=ia.g+ha.g+x.g;V.b=ia.b+ha.b+x.b;w.r=aa.color.r*V.r;w.g=aa.color.g*
+V.g;w.b=aa.color.b*V.b;w.updateStyleString()}else w.__styleString=aa.color.__styleString;aa=ea.scale.x*c;Q=ea.scale.y*h;H.set(N.x-aa,N.y-Q,N.x+aa,N.y+Q);if(ba.instersects(H)){$=w.__styleString;if(D!=$)l.fillStyle=D=$;l.save();l.translate(N.x,N.y);l.rotate(-ea.rotation);l.scale(aa,Q);l.beginPath();l.arc(0,0,1,0,M,true);l.closePath();l.fill();l.restore()}}}}function Ra(N,ea,aa,Q){if(Q.opacity!=0){a(Q.opacity);b(Q.blending);l.beginPath();l.moveTo(N.positionScreen.x,N.positionScreen.y);l.lineTo(ea.positionScreen.x,
+ea.positionScreen.y);l.closePath();if(Q instanceof THREE.LineBasicMaterial){w.__styleString=Q.color.__styleString;N=Q.linewidth;if(G!=N)l.lineWidth=G=N;N=w.__styleString;if(u!=N)l.strokeStyle=u=N;l.stroke();H.inflate(Q.linewidth*2)}}}function La(N,ea,aa,Q,$,fa){if($.opacity!=0){a($.opacity);b($.blending);j=N.positionScreen.x;o=N.positionScreen.y;C=ea.positionScreen.x;q=ea.positionScreen.y;y=aa.positionScreen.x;K=aa.positionScreen.y;l.beginPath();l.moveTo(j,o);l.lineTo(C,q);l.lineTo(y,K);l.lineTo(j,
+o);l.closePath();if($ instanceof THREE.MeshBasicMaterial)if($.map)$.map.image.loaded&&$.map.mapping instanceof THREE.UVMapping&&Aa(j,o,C,q,y,K,$.map.image,Q.uvs[0].u,Q.uvs[0].v,Q.uvs[1].u,Q.uvs[1].v,Q.uvs[2].u,Q.uvs[2].v);else if($.env_map){if($.env_map.image.loaded)if($.env_map.mapping instanceof THREE.SphericalReflectionMapping){N=wa.matrix;J.copy(Q.vertexNormalsWorld[0]);W=(J.x*N.n11+J.y*N.n12+J.z*N.n13)*0.5+0.5;P=-(J.x*N.n21+J.y*N.n22+J.z*N.n23)*0.5+0.5;J.copy(Q.vertexNormalsWorld[1]);da=(J.x*
+N.n11+J.y*N.n12+J.z*N.n13)*0.5+0.5;X=-(J.x*N.n21+J.y*N.n22+J.z*N.n23)*0.5+0.5;J.copy(Q.vertexNormalsWorld[2]);R=(J.x*N.n11+J.y*N.n12+J.z*N.n13)*0.5+0.5;T=-(J.x*N.n21+J.y*N.n22+J.z*N.n23)*0.5+0.5;Aa(j,o,C,q,y,K,$.env_map.image,W,P,da,X,R,T)}}else $.wireframe?Ea($.color.__styleString,$.wireframe_linewidth):Fa($.color.__styleString);else if($ instanceof THREE.MeshLambertMaterial){if($.map&&!$.wireframe){$.map.mapping instanceof THREE.UVMapping&&Aa(j,o,C,q,y,K,$.map.image,Q.uvs[0].u,Q.uvs[0].v,Q.uvs[1].u,
+Q.uvs[1].v,Q.uvs[2].u,Q.uvs[2].v);b(THREE.SubtractiveBlending)}if(S)if(!$.wireframe&&$.shading==THREE.SmoothShading&&Q.vertexNormalsWorld.length==3){E.r=A.r=F.r=ia.r;E.g=A.g=F.g=ia.g;E.b=A.b=F.b=ia.b;Da(fa,Q.v1.positionWorld,Q.vertexNormalsWorld[0],E);Da(fa,Q.v2.positionWorld,Q.vertexNormalsWorld[1],A);Da(fa,Q.v3.positionWorld,Q.vertexNormalsWorld[2],F);z.r=(A.r+F.r)*0.5;z.g=(A.g+F.g)*0.5;z.b=(A.b+F.b)*0.5;U=Ma(E,A,F,z);Aa(j,o,C,q,y,K,U,0,0,1,0,0,1)}else{V.r=ia.r;V.g=ia.g;V.b=ia.b;Da(fa,Q.centroidWorld,
+Q.normalWorld,V);w.r=$.color.r*V.r;w.g=$.color.g*V.g;w.b=$.color.b*V.b;w.updateStyleString();$.wireframe?Ea(w.__styleString,$.wireframe_linewidth):Fa(w.__styleString)}else $.wireframe?Ea($.color.__styleString,$.wireframe_linewidth):Fa($.color.__styleString)}else if($ instanceof THREE.MeshDepthMaterial){O=wa.near;L=wa.far;E.r=E.g=E.b=1-Ha(N.positionScreen.z,O,L);A.r=A.g=A.b=1-Ha(ea.positionScreen.z,O,L);F.r=F.g=F.b=1-Ha(aa.positionScreen.z,O,L);z.r=(A.r+F.r)*0.5;z.g=(A.g+F.g)*0.5;z.b=(A.b+F.b)*0.5;
+U=Ma(E,A,F,z);Aa(j,o,C,q,y,K,U,0,0,1,0,0,1)}else if($ instanceof THREE.MeshNormalMaterial){w.r=Ia(Q.normalWorld.x);w.g=Ia(Q.normalWorld.y);w.b=Ia(Q.normalWorld.z);w.updateStyleString();$.wireframe?Ea(w.__styleString,$.wireframe_linewidth):Fa(w.__styleString)}}}function Ea(N,ea){if(u!=N)l.strokeStyle=u=N;if(G!=ea)l.lineWidth=G=ea;l.stroke();H.inflate(ea*2)}function Fa(N){if(D!=N)l.fillStyle=D=N;l.fill()}function Aa(N,ea,aa,Q,$,fa,la,na,oa,ta,pa,ua,Ba){var xa,va;xa=la.width-1;va=la.height-1;na*=xa;
+oa*=va;ta*=xa;pa*=va;ua*=xa;Ba*=va;aa-=N;Q-=ea;$-=N;fa-=ea;ta-=na;pa-=oa;ua-=na;Ba-=oa;va=1/(ta*Ba-ua*pa);xa=(Ba*aa-pa*$)*va;pa=(Ba*Q-pa*fa)*va;aa=(ta*$-ua*aa)*va;Q=(ta*fa-ua*Q)*va;N=N-xa*na-aa*oa;ea=ea-pa*na-Q*oa;l.save();l.transform(xa,pa,aa,Q,N,ea);l.clip();l.drawImage(la,0,0);l.restore()}function Ma(N,ea,aa,Q){var $=~~(N.r*255),fa=~~(N.g*255);N=~~(N.b*255);var la=~~(ea.r*255),na=~~(ea.g*255);ea=~~(ea.b*255);var oa=~~(aa.r*255),ta=~~(aa.g*255);aa=~~(aa.b*255);var pa=~~(Q.r*255),ua=~~(Q.g*255);
+Q=~~(Q.b*255);ja[0]=$<0?0:$>255?255:$;ja[1]=fa<0?0:fa>255?255:fa;ja[2]=N<0?0:N>255?255:N;ja[4]=la<0?0:la>255?255:la;ja[5]=na<0?0:na>255?255:na;ja[6]=ea<0?0:ea>255?255:ea;ja[8]=oa<0?0:oa>255?255:oa;ja[9]=ta<0?0:ta>255?255:ta;ja[10]=aa<0?0:aa>255?255:aa;ja[12]=pa<0?0:pa>255?255:pa;ja[13]=ua<0?0:ua>255?255:ua;ja[14]=Q<0?0:Q>255?255:Q;ca.putImageData(ga,0,0);sa.drawImage(Z,0,0);return qa}function Ha(N,ea,aa){N=(N-ea)/(aa-ea);return N*N*(3-2*N)}function Ia(N){N=(N+1)*0.5;return N<0?0:N>1?1:N}function Ja(N,
 ea){var aa=ea.x-N.x,Q=ea.y-N.y,$=1/Math.sqrt(aa*aa+Q*Q);aa*=$;Q*=$;ea.x+=aa;ea.y+=Q;N.x-=aa;N.y-=Q}var Ga,Na,ka,ra,za,Ka,Oa,Ca;l.setTransform(1,0,0,-1,c,h);this.autoClear&&this.clear();d=e.projectScene(ma,wa,this.sortElements);(S=ma.lights.length>0)&&Pa(ma);Ga=0;for(Na=d.length;Ga<Na;Ga++){ka=d[Ga];H.empty();if(ka instanceof THREE.RenderableParticle){n=ka;n.x*=c;n.y*=h;ra=0;for(za=ka.materials.length;ra<za;ra++)Qa(n,ka,ka.materials[ra],ma)}else if(ka instanceof THREE.RenderableLine){n=ka.v1;I=ka.v2;
 n.positionScreen.x*=c;n.positionScreen.y*=h;I.positionScreen.x*=c;I.positionScreen.y*=h;H.addPoint(n.positionScreen.x,n.positionScreen.y);H.addPoint(I.positionScreen.x,I.positionScreen.y);if(ba.instersects(H)){ra=0;for(za=ka.materials.length;ra<za;)Ra(n,I,ka,ka.materials[ra++],ma)}}else if(ka instanceof THREE.RenderableFace3){n=ka.v1;I=ka.v2;m=ka.v3;n.positionScreen.x*=c;n.positionScreen.y*=h;I.positionScreen.x*=c;I.positionScreen.y*=h;m.positionScreen.x*=c;m.positionScreen.y*=h;if(ka.overdraw){Ja(n.positionScreen,
 I.positionScreen);Ja(I.positionScreen,m.positionScreen);Ja(m.positionScreen,n.positionScreen)}H.add3Points(n.positionScreen.x,n.positionScreen.y,I.positionScreen.x,I.positionScreen.y,m.positionScreen.x,m.positionScreen.y);if(ba.instersects(H)){ra=0;for(za=ka.meshMaterials.length;ra<za;){Ca=ka.meshMaterials[ra++];if(Ca instanceof THREE.MeshFaceMaterial){Ka=0;for(Oa=ka.faceMaterials.length;Ka<Oa;)(Ca=ka.faceMaterials[Ka++])&&La(n,I,m,ka,Ca,ma)}else La(n,I,m,ka,Ca,ma)}}}Y.addRectangle(H)}l.setTransform(1,

+ 8 - 8
src/renderers/CanvasRenderer.js

@@ -11,8 +11,8 @@ THREE.CanvasRenderer = function () {
 	_canvasWidth, _canvasHeight, _canvasWidthHalf, _canvasHeightHalf,
 	_context = _canvas.getContext( '2d' ),
 
-	_clearColor = null,
-	_clearOpacity = null,
+	_clearColor = new THREE.Color( 0x000000 ),
+	_clearOpacity = 0,
 
 	_contextGlobalAlpha = 1,
 	_contextGlobalCompositeOperation = 0,
@@ -96,7 +96,7 @@ THREE.CanvasRenderer = function () {
 
 	this.setClearColor = function( hex, opacity ) {
 
-		_clearColor = hex !== null ? new THREE.Color( hex ) : null;
+		_clearColor.setHex( hex );
 		_clearOpacity = opacity;
 
 		_clearRect.set( - _canvasWidthHalf, - _canvasHeightHalf, _canvasWidthHalf, _canvasHeightHalf );
@@ -111,7 +111,11 @@ THREE.CanvasRenderer = function () {
 			_clearRect.inflate( 1 );
 			_clearRect.minSelf( _clipRect );
 
-			if ( _clearColor !== null ) {
+			if ( _clearColor.hex == 0x000000 && _clearOpacity == 0 ) {
+
+				_context.clearRect( _clearRect.getX(), _clearRect.getY(), _clearRect.getWidth(), _clearRect.getHeight() );
+
+			} else {
 
 				setBlending( THREE.NormalBlending );
 				setOpacity( 1 );
@@ -119,10 +123,6 @@ THREE.CanvasRenderer = function () {
 				_context.fillStyle = 'rgba(' + Math.floor( _clearColor.r * 255 ) + ',' + Math.floor( _clearColor.g * 255 ) + ',' + Math.floor( _clearColor.b * 255 ) + ',' + _clearOpacity + ')';
 				_context.fillRect( _clearRect.getX(), _clearRect.getY(), _clearRect.getWidth(), _clearRect.getHeight() );
 
-			} else {
-
-				_context.clearRect( _clearRect.getX(), _clearRect.getY(), _clearRect.getWidth(), _clearRect.getHeight() );
-
 			}
 
 			_clearRect.empty();

+ 15 - 1
src/renderers/WebGLRenderer2.js

@@ -12,7 +12,12 @@ THREE.WebGLRenderer2 = function ( antialias ) {
 	_projector = new THREE.Projector(),
 
 	_canvas = document.createElement( 'canvas' ),
+
+	_clearColor = new THREE.Color( 0x000000 ),
+	_clearOpacity = 0,
+
 	_gl, _currentProgram,
+
 	_modelViewMatrix = new THREE.Matrix4(),
 	_normalMatrix = new THREE.Matrix4(),
 	_viewMatrixArray = new Float32Array( 16 ),
@@ -47,7 +52,7 @@ THREE.WebGLRenderer2 = function ( antialias ) {
 
 	_gl.enable( _gl.BLEND );
 	_gl.blendFunc( _gl.ONE, _gl.ONE_MINUS_SRC_ALPHA );
-	_gl.clearColor( 0, 0, 0, 0 );
+	_gl.clearColor( _clearColor.r, _clearColor.g, _clearColor.b, _clearOpacity );
 
 	this.domElement = _canvas;
 
@@ -62,6 +67,15 @@ THREE.WebGLRenderer2 = function ( antialias ) {
 
 	};
 
+	this.setClearColor = function( hex, opacity ) {
+
+		_clearColor = hex.setHex( hex );
+		_clearOpacity = opacity;
+
+		_gl.clearColor( _clearColor.r, _clearColor.g, _clearColor.b, _clearOpacity );
+
+	};
+
 	this.clear = function () {
 
 		_gl.clear( _gl.COLOR_BUFFER_BIT | _gl.DEPTH_BUFFER_BIT );