Bläddra i källkod

Made the cloth example "work" with CanvasRenderer.
Required some tweaking to CanvasRenderer material logic.

Mr.doob 13 år sedan
förälder
incheckning
48fa575eab
3 ändrade filer med 122 tillägg och 117 borttagningar
  1. 52 52
      build/three.min.js
  2. 6 9
      examples/webgl_animation_cloth.html
  3. 64 56
      src/renderers/CanvasRenderer.js

+ 52 - 52
build/three.min.js

@@ -258,36 +258,36 @@ THREE.Scene.prototype.__addObject=function(a){if(a instanceof THREE.Light){this.
 THREE.Scene.prototype.__removeObject=function(a){if(a instanceof THREE.Light){var b=this.__lights.indexOf(a);b!==-1&&this.__lights.splice(b,1)}else if(!(a instanceof THREE.Camera)){b=this.__objects.indexOf(a);if(b!==-1){this.__objects.splice(b,1);this.__objectsRemoved.push(a);b=this.__objectsAdded.indexOf(a);b!==-1&&this.__objectsAdded.splice(b,1)}}for(b=0;b<a.children.length;b++)this.__removeObject(a.children[b])};
 THREE.Fog=function(a,b,c){this.color=new THREE.Color(a);this.near=b!==void 0?b:1;this.far=c!==void 0?c:1E3};THREE.FogExp2=function(a,b){this.color=new THREE.Color(a);this.density=b!==void 0?b:2.5E-4};
 THREE.CanvasRenderer=function(a){function b(a){if(u!==a)u=n.globalAlpha=a}function c(a){if(v!==a){if(a===THREE.NormalBlending)n.globalCompositeOperation="source-over";else if(a===THREE.AdditiveBlending)n.globalCompositeOperation="lighter";else if(a===THREE.SubtractiveBlending)n.globalCompositeOperation="darker";v=a}}function d(a){if(s!==a)s=n.strokeStyle=a}function f(a){if(A!==a)A=n.fillStyle=a}console.log("THREE.CanvasRenderer",THREE.REVISION);var a=a||{},e=this,g,h,i,j=new THREE.Projector,l=a.canvas!==
-void 0?a.canvas:document.createElement("canvas"),o,m,p,q,n=l.getContext("2d"),t=new THREE.Color(0),r=0,u=1,v=0,s=null,A=null,y=null,B=null,G=null,x,I,F,L,H=new THREE.RenderableVertex,M=new THREE.RenderableVertex,C,E,P,N,Q,Z,J,K,ea,O,qa,ua,ca=new THREE.Color,ba=new THREE.Color,W=new THREE.Color,V=new THREE.Color,ga=new THREE.Color,ha=[],oa=[],sa,Ca,Ha,Wa,ja,ob,Ma,Xa,pb,wb,eb=new THREE.Rectangle,Ea=new THREE.Rectangle,xa=new THREE.Rectangle,xb=false,Fa=new THREE.Color,Za=new THREE.Color,qb=new THREE.Color,
+void 0?a.canvas:document.createElement("canvas"),o,m,p,q,n=l.getContext("2d"),t=new THREE.Color(0),r=0,u=1,v=0,s=null,A=null,y=null,B=null,G=null,x,I,F,L,H=new THREE.RenderableVertex,M=new THREE.RenderableVertex,C,E,P,N,Q,Z,J,K,ea,O,qa,ua,ca=new THREE.Color,ba=new THREE.Color,W=new THREE.Color,V=new THREE.Color,ga=new THREE.Color,ha={},oa={},sa,Ca,Ha,Wa,ja,ob,Ma,Xa,pb,wb,eb=new THREE.Rectangle,Ea=new THREE.Rectangle,xa=new THREE.Rectangle,xb=false,Fa=new THREE.Color,Za=new THREE.Color,qb=new THREE.Color,
 Da=new THREE.Vector3,$a,ab,fb,Na,Oa,gb,a=16;$a=document.createElement("canvas");$a.width=$a.height=2;ab=$a.getContext("2d");ab.fillStyle="rgba(0,0,0,1)";ab.fillRect(0,0,2,2);fb=ab.getImageData(0,0,2,2);Na=fb.data;Oa=document.createElement("canvas");Oa.width=Oa.height=a;gb=Oa.getContext("2d");gb.translate(-a/2,-a/2);gb.scale(a,a);a--;this.domElement=l;this.sortElements=this.sortObjects=this.autoClear=true;this.info={render:{vertices:0,faces:0}};this.setSize=function(a,b){o=a;m=b;p=Math.floor(o/2);
 q=Math.floor(m/2);l.width=o;l.height=m;eb.set(-p,-q,p,q);Ea.set(-p,-q,p,q);u=1;v=0;G=B=y=A=s=null};this.setClearColor=function(a,b){t.copy(a);r=b!==void 0?b:1;Ea.set(-p,-q,p,q)};this.setClearColorHex=function(a,b){t.setHex(a);r=b!==void 0?b:1;Ea.set(-p,-q,p,q)};this.clear=function(){n.setTransform(1,0,0,-1,p,q);if(Ea.isEmpty()===false){Ea.minSelf(eb);Ea.inflate(2);r<1&&n.clearRect(Math.floor(Ea.getX()),Math.floor(Ea.getY()),Math.floor(Ea.getWidth()),Math.floor(Ea.getHeight()));if(r>0){c(THREE.NormalBlending);
 b(1);f("rgba("+Math.floor(t.r*255)+","+Math.floor(t.g*255)+","+Math.floor(t.b*255)+","+r+")");n.fillRect(Math.floor(Ea.getX()),Math.floor(Ea.getY()),Math.floor(Ea.getWidth()),Math.floor(Ea.getHeight()))}Ea.empty()}};this.render=function(a,k){function l(a,b,c){for(var d=0,f=i.length;d<f;d++){var e=i[d],g=e.color;if(e instanceof THREE.DirectionalLight){var h=e.matrixWorld.getPosition().normalize(),k=b.dot(h);if(!(k<=0)){k=k*e.intensity;c.r=c.r+g.r*k;c.g=c.g+g.g*k;c.b=c.b+g.b*k}}else if(e instanceof
-THREE.PointLight){h=e.matrixWorld.getPosition();k=b.dot(Da.sub(h,a).normalize());if(!(k<=0)){k=k*(e.distance==0?1:1-Math.min(a.distanceTo(h)/e.distance,1));if(k!=0){k=k*e.intensity;c.r=c.r+g.r*k;c.g=c.g+g.g*k;c.b=c.b+g.b*k}}}}}function o(a,d,f,g,h,i,j,n){e.info.render.vertices=e.info.render.vertices+3;e.info.render.faces++;b(n.opacity);c(n.blending);C=a.positionScreen.x;E=a.positionScreen.y;P=d.positionScreen.x;N=d.positionScreen.y;Q=f.positionScreen.x;Z=f.positionScreen.y;m(C,E,P,N,Q,Z);if(n instanceof
-THREE.MeshBasicMaterial)if(n.map!==null){if(n.map.mapping instanceof THREE.UVMapping){Wa=j.uvs[0];u(C,E,P,N,Q,Z,Wa[g].u,Wa[g].v,Wa[h].u,Wa[h].v,Wa[i].u,Wa[i].v,n.map)}}else if(n.envMap!==null){if(n.envMap.mapping instanceof THREE.SphericalReflectionMapping){a=k.matrixWorldInverse;Da.copy(j.vertexNormalsWorld[g]);ja=(Da.x*a.elements[0]+Da.y*a.elements[4]+Da.z*a.elements[8])*0.5+0.5;ob=(Da.x*a.elements[1]+Da.y*a.elements[5]+Da.z*a.elements[9])*0.5+0.5;Da.copy(j.vertexNormalsWorld[h]);Ma=(Da.x*a.elements[0]+
-Da.y*a.elements[4]+Da.z*a.elements[8])*0.5+0.5;Xa=(Da.x*a.elements[1]+Da.y*a.elements[5]+Da.z*a.elements[9])*0.5+0.5;Da.copy(j.vertexNormalsWorld[i]);pb=(Da.x*a.elements[0]+Da.y*a.elements[4]+Da.z*a.elements[8])*0.5+0.5;wb=(Da.x*a.elements[1]+Da.y*a.elements[5]+Da.z*a.elements[9])*0.5+0.5;u(C,E,P,N,Q,Z,ja,ob,Ma,Xa,pb,wb,n.envMap)}}else n.wireframe===true?r(n.color,n.wireframeLinewidth,n.wireframeLinecap,n.wireframeLinejoin):t(n.color);else if(n instanceof THREE.MeshLambertMaterial)if(xb===true)if(n.wireframe===
-false&&n.shading==THREE.SmoothShading&&j.vertexNormalsLength==3){ba.r=W.r=V.r=Fa.r;ba.g=W.g=V.g=Fa.g;ba.b=W.b=V.b=Fa.b;l(j.v1.positionWorld,j.vertexNormalsWorld[0],ba);l(j.v2.positionWorld,j.vertexNormalsWorld[1],W);l(j.v3.positionWorld,j.vertexNormalsWorld[2],V);ba.r=Math.max(0,Math.min(n.color.r*ba.r,1));ba.g=Math.max(0,Math.min(n.color.g*ba.g,1));ba.b=Math.max(0,Math.min(n.color.b*ba.b,1));W.r=Math.max(0,Math.min(n.color.r*W.r,1));W.g=Math.max(0,Math.min(n.color.g*W.g,1));W.b=Math.max(0,Math.min(n.color.b*
-W.b,1));V.r=Math.max(0,Math.min(n.color.r*V.r,1));V.g=Math.max(0,Math.min(n.color.g*V.g,1));V.b=Math.max(0,Math.min(n.color.b*V.b,1));ga.r=(W.r+V.r)*0.5;ga.g=(W.g+V.g)*0.5;ga.b=(W.b+V.b)*0.5;Ha=va(ba,W,V,ga);v(C,E,P,N,Q,Z,0,0,1,0,0,1,Ha)}else{ca.r=Fa.r;ca.g=Fa.g;ca.b=Fa.b;l(j.centroidWorld,j.normalWorld,ca);ca.r=Math.max(0,Math.min(n.color.r*ca.r,1));ca.g=Math.max(0,Math.min(n.color.g*ca.g,1));ca.b=Math.max(0,Math.min(n.color.b*ca.b,1));n.wireframe===true?r(ca,n.wireframeLinewidth,n.wireframeLinecap,
-n.wireframeLinejoin):t(ca)}else n.wireframe===true?r(n.color,n.wireframeLinewidth,n.wireframeLinecap,n.wireframeLinejoin):t(n.color);else if(n instanceof THREE.MeshDepthMaterial){sa=k.near;Ca=k.far;ba.r=ba.g=ba.b=1-ec(a.positionScreen.z,sa,Ca);W.r=W.g=W.b=1-ec(d.positionScreen.z,sa,Ca);V.r=V.g=V.b=1-ec(f.positionScreen.z,sa,Ca);ga.r=(W.r+V.r)*0.5;ga.g=(W.g+V.g)*0.5;ga.b=(W.b+V.b)*0.5;Ha=va(ba,W,V,ga);v(C,E,P,N,Q,Z,0,0,1,0,0,1,Ha)}else if(n instanceof THREE.MeshNormalMaterial){ca.r=ic(j.normalWorld.x);
-ca.g=ic(j.normalWorld.y);ca.b=ic(j.normalWorld.z);n.wireframe===true?r(ca,n.wireframeLinewidth,n.wireframeLinecap,n.wireframeLinejoin):t(ca)}}function m(a,b,c,d,f,e){n.beginPath();n.moveTo(a,b);n.lineTo(c,d);n.lineTo(f,e);n.closePath()}function s(a,b,c,d,f,e,g,h){n.beginPath();n.moveTo(a,b);n.lineTo(c,d);n.lineTo(f,e);n.lineTo(g,h);n.closePath()}function r(a,b,c,f){if(y!==b)y=n.lineWidth=b;if(B!==c)B=n.lineCap=c;if(G!==f)G=n.lineJoin=f;d(a.getContextStyle());n.stroke();xa.inflate(b*2)}function t(a){f(a.getContextStyle());
-n.fill()}function u(a,b,c,d,e,g,h,i,k,j,l,o,m){if(!(m.image===void 0||m.image.width===0)){if(m.needsUpdate===true||ha[m.id]===void 0){var va=m.wrapS==THREE.RepeatWrapping,q=m.wrapT==THREE.RepeatWrapping;ha[m.id]=n.createPattern(m.image,va===true&&q===true?"repeat":va===true&&q===false?"repeat-x":va===false&&q===true?"repeat-y":"no-repeat");m.needsUpdate=false}f(ha[m.id]);var va=m.offset.x/m.repeat.x,q=m.offset.y/m.repeat.y,p=m.image.width*m.repeat.x,rb=m.image.height*m.repeat.y,h=(h+va)*p,i=(1-i+
-q)*rb,c=c-a,d=d-b,e=e-a,g=g-b,k=(k+va)*p-h,j=(1-j+q)*rb-i,l=(l+va)*p-h,o=(1-o+q)*rb-i,va=k*o-l*j;if(va===0){if(oa[m.id]===void 0){b=document.createElement("canvas");b.width=m.image.width;b.height=m.image.height;b=b.getContext("2d");b.drawImage(m.image,0,0);oa[m.id]=b.getImageData(0,0,m.image.width,m.image.height).data}b=oa[m.id];h=(Math.floor(h)+Math.floor(i)*m.image.width)*4;ca.setRGB(b[h]/255,b[h+1]/255,b[h+2]/255);t(ca)}else{va=1/va;m=(o*c-j*e)*va;j=(o*d-j*g)*va;c=(k*e-l*c)*va;d=(k*g-l*d)*va;a=
-a-m*h-c*i;h=b-j*h-d*i;n.save();n.transform(m,j,c,d,a,h);n.fill();n.restore()}}}function v(a,b,c,d,f,e,g,h,i,k,j,l,m){var o,va;o=m.width-1;va=m.height-1;g=g*o;h=h*va;c=c-a;d=d-b;f=f-a;e=e-b;i=i*o-g;k=k*va-h;j=j*o-g;l=l*va-h;va=1/(i*l-j*k);o=(l*c-k*f)*va;k=(l*d-k*e)*va;c=(i*f-j*c)*va;d=(i*e-j*d)*va;a=a-o*g-c*h;b=b-k*g-d*h;n.save();n.transform(o,k,c,d,a,b);n.clip();n.drawImage(m,0,0);n.restore()}function va(a,b,c,d){var f=a.r*255|0,e=a.g*255|0,a=a.b*255|0,g=b.r*255|0,h=b.g*255|0,b=b.b*255|0,i=c.r*255|
-0,k=c.g*255|0,c=c.b*255|0,j=d.r*255|0,l=d.g*255|0,d=d.b*255|0;Na[0]=f<0?0:f>255?255:f;Na[1]=e<0?0:e>255?255:e;Na[2]=a<0?0:a>255?255:a;Na[4]=g<0?0:g>255?255:g;Na[5]=h<0?0:h>255?255:h;Na[6]=b<0?0:b>255?255:b;Na[8]=i<0?0:i>255?255:i;Na[9]=k<0?0:k>255?255:k;Na[10]=c<0?0:c>255?255:c;Na[12]=j<0?0:j>255?255:j;Na[13]=l<0?0:l>255?255:l;Na[14]=d<0?0:d>255?255:d;ab.putImageData(fb,0,0);gb.drawImage($a,0,0);return Oa}function ec(a,b,c){a=(a-b)/(c-b);return a*a*(3-2*a)}function ic(a){a=(a+1)*0.5;return a<0?0:
-a>1?1:a}function rb(a,b){var c=b.x-a.x,d=b.y-a.y,f=c*c+d*d;if(f!==0){f=1/Math.sqrt(f);c=c*f;d=d*f;b.x=b.x+c;b.y=b.y+d;a.x=a.x-c;a.y=a.y-d}}if(k instanceof THREE.Camera===false)console.error("THREE.CanvasRenderer.render: camera is not an instance of THREE.Camera.");else{var Vb,Ec,A,X;this.autoClear===true?this.clear():n.setTransform(1,0,0,-1,p,q);e.info.render.vertices=0;e.info.render.faces=0;g=j.projectScene(a,k,this.sortElements);h=g.elements;i=g.lights;xb=i.length>0;if(xb===true){Fa.setRGB(0,0,
-0);Za.setRGB(0,0,0);qb.setRGB(0,0,0);Vb=0;for(Ec=i.length;Vb<Ec;Vb++){X=i[Vb];var ia=X.color;if(X instanceof THREE.AmbientLight){Fa.r=Fa.r+ia.r;Fa.g=Fa.g+ia.g;Fa.b=Fa.b+ia.b}else if(X instanceof THREE.DirectionalLight){Za.r=Za.r+ia.r;Za.g=Za.g+ia.g;Za.b=Za.b+ia.b}else if(X instanceof THREE.PointLight){qb.r=qb.r+ia.r;qb.g=qb.g+ia.g;qb.b=qb.b+ia.b}}}Vb=0;for(Ec=h.length;Vb<Ec;Vb++){A=h[Vb];X=A.material;if(!(X===void 0||X.visible===false)){xa.empty();if(A instanceof THREE.RenderableParticle){x=A;x.x=
-x.x*p;x.y=x.y*q;var ia=x,Va=A;b(X.opacity);c(X.blending);var sb=void 0,tb=void 0,ib=void 0,jb=void 0,jc=A=void 0,Tc=void 0;if(X instanceof THREE.ParticleBasicMaterial)if(X.map===null){ib=Va.object.scale.x;jb=Va.object.scale.y;ib=ib*Va.scale.x*p;jb=jb*Va.scale.y*q;xa.set(ia.x-ib,ia.y-jb,ia.x+ib,ia.y+jb);if(eb.intersects(xa)!==false){f(X.color.getContextStyle());n.save();n.translate(ia.x,ia.y);n.rotate(-Va.rotation);n.scale(ib,jb);n.fillRect(-1,-1,2,2);n.restore()}}else{A=X.map.image;jc=A.width>>1;
-Tc=A.height>>1;ib=Va.scale.x*p;jb=Va.scale.y*q;sb=ib*jc;tb=jb*Tc;xa.set(ia.x-sb,ia.y-tb,ia.x+sb,ia.y+tb);if(eb.intersects(xa)!==false){n.save();n.translate(ia.x,ia.y);n.rotate(-Va.rotation);n.scale(ib,-jb);n.translate(-jc,-Tc);n.drawImage(A,0,0);n.restore()}}else if(X instanceof THREE.ParticleCanvasMaterial){sb=Va.scale.x*p;tb=Va.scale.y*q;xa.set(ia.x-sb,ia.y-tb,ia.x+sb,ia.y+tb);if(eb.intersects(xa)!==false){d(X.color.getContextStyle());f(X.color.getContextStyle());n.save();n.translate(ia.x,ia.y);
-n.rotate(-Va.rotation);n.scale(sb,tb);X.program(n);n.restore()}}}else if(A instanceof THREE.RenderableLine){x=A.v1;I=A.v2;x.positionScreen.x=x.positionScreen.x*p;x.positionScreen.y=x.positionScreen.y*q;I.positionScreen.x=I.positionScreen.x*p;I.positionScreen.y=I.positionScreen.y*q;xa.addPoint(x.positionScreen.x,x.positionScreen.y);xa.addPoint(I.positionScreen.x,I.positionScreen.y);if(eb.intersects(xa)===true){ia=x;Va=I;b(X.opacity);c(X.blending);n.beginPath();n.moveTo(ia.positionScreen.x,ia.positionScreen.y);
-n.lineTo(Va.positionScreen.x,Va.positionScreen.y);if(X instanceof THREE.LineBasicMaterial){ia=X.linewidth;if(y!==ia)y=n.lineWidth=ia;ia=X.linecap;if(B!==ia)B=n.lineCap=ia;ia=X.linejoin;if(G!==ia)G=n.lineJoin=ia;d(X.color.getContextStyle());n.stroke();xa.inflate(X.linewidth*2)}}}else if(A instanceof THREE.RenderableFace3){x=A.v1;I=A.v2;F=A.v3;x.positionScreen.x=x.positionScreen.x*p;x.positionScreen.y=x.positionScreen.y*q;I.positionScreen.x=I.positionScreen.x*p;I.positionScreen.y=I.positionScreen.y*
-q;F.positionScreen.x=F.positionScreen.x*p;F.positionScreen.y=F.positionScreen.y*q;if(X.overdraw===true){rb(x.positionScreen,I.positionScreen);rb(I.positionScreen,F.positionScreen);rb(F.positionScreen,x.positionScreen)}xa.add3Points(x.positionScreen.x,x.positionScreen.y,I.positionScreen.x,I.positionScreen.y,F.positionScreen.x,F.positionScreen.y);eb.intersects(xa)===true&&o(x,I,F,0,1,2,A,X,a)}else if(A instanceof THREE.RenderableFace4){x=A.v1;I=A.v2;F=A.v3;L=A.v4;x.positionScreen.x=x.positionScreen.x*
-p;x.positionScreen.y=x.positionScreen.y*q;I.positionScreen.x=I.positionScreen.x*p;I.positionScreen.y=I.positionScreen.y*q;F.positionScreen.x=F.positionScreen.x*p;F.positionScreen.y=F.positionScreen.y*q;L.positionScreen.x=L.positionScreen.x*p;L.positionScreen.y=L.positionScreen.y*q;H.positionScreen.copy(I.positionScreen);M.positionScreen.copy(L.positionScreen);if(X.overdraw===true){rb(x.positionScreen,I.positionScreen);rb(I.positionScreen,L.positionScreen);rb(L.positionScreen,x.positionScreen);rb(F.positionScreen,
-H.positionScreen);rb(F.positionScreen,M.positionScreen)}xa.addPoint(x.positionScreen.x,x.positionScreen.y);xa.addPoint(I.positionScreen.x,I.positionScreen.y);xa.addPoint(F.positionScreen.x,F.positionScreen.y);xa.addPoint(L.positionScreen.x,L.positionScreen.y);if(eb.intersects(xa)===true){ia=x;Va=I;sb=F;tb=L;ib=H;jb=M;jc=a;e.info.render.vertices=e.info.render.vertices+4;e.info.render.faces++;b(X.opacity);c(X.blending);if(X.map!==void 0&&X.map!==null||X.envMap!==void 0&&X.envMap!==null){o(ia,Va,tb,
-0,1,3,A,X,jc);o(ib,sb,jb,1,2,3,A,X,jc)}else{C=ia.positionScreen.x;E=ia.positionScreen.y;P=Va.positionScreen.x;N=Va.positionScreen.y;Q=sb.positionScreen.x;Z=sb.positionScreen.y;J=tb.positionScreen.x;K=tb.positionScreen.y;ea=ib.positionScreen.x;O=ib.positionScreen.y;qa=jb.positionScreen.x;ua=jb.positionScreen.y;if(X instanceof THREE.MeshBasicMaterial){s(C,E,P,N,Q,Z,J,K);X.wireframe===true?r(X.color,X.wireframeLinewidth,X.wireframeLinecap,X.wireframeLinejoin):t(X.color)}else if(X instanceof THREE.MeshLambertMaterial)if(xb===
-true)if(X.wireframe===false&&X.shading==THREE.SmoothShading&&A.vertexNormalsLength==4){ba.r=W.r=V.r=ga.r=Fa.r;ba.g=W.g=V.g=ga.g=Fa.g;ba.b=W.b=V.b=ga.b=Fa.b;l(A.v1.positionWorld,A.vertexNormalsWorld[0],ba);l(A.v2.positionWorld,A.vertexNormalsWorld[1],W);l(A.v4.positionWorld,A.vertexNormalsWorld[3],V);l(A.v3.positionWorld,A.vertexNormalsWorld[2],ga);ba.r=Math.max(0,Math.min(X.color.r*ba.r,1));ba.g=Math.max(0,Math.min(X.color.g*ba.g,1));ba.b=Math.max(0,Math.min(X.color.b*ba.b,1));W.r=Math.max(0,Math.min(X.color.r*
-W.r,1));W.g=Math.max(0,Math.min(X.color.g*W.g,1));W.b=Math.max(0,Math.min(X.color.b*W.b,1));V.r=Math.max(0,Math.min(X.color.r*V.r,1));V.g=Math.max(0,Math.min(X.color.g*V.g,1));V.b=Math.max(0,Math.min(X.color.b*V.b,1));ga.r=Math.max(0,Math.min(X.color.r*ga.r,1));ga.g=Math.max(0,Math.min(X.color.g*ga.g,1));ga.b=Math.max(0,Math.min(X.color.b*ga.b,1));Ha=va(ba,W,V,ga);m(C,E,P,N,J,K);v(C,E,P,N,J,K,0,0,1,0,0,1,Ha);m(ea,O,Q,Z,qa,ua);v(ea,O,Q,Z,qa,ua,1,0,1,1,0,1,Ha)}else{ca.r=Fa.r;ca.g=Fa.g;ca.b=Fa.b;l(A.centroidWorld,
-A.normalWorld,ca);ca.r=Math.max(0,Math.min(X.color.r*ca.r,1));ca.g=Math.max(0,Math.min(X.color.g*ca.g,1));ca.b=Math.max(0,Math.min(X.color.b*ca.b,1));s(C,E,P,N,Q,Z,J,K);X.wireframe===true?r(ca,X.wireframeLinewidth,X.wireframeLinecap,X.wireframeLinejoin):t(ca)}else{s(C,E,P,N,Q,Z,J,K);X.wireframe===true?r(X.color,X.wireframeLinewidth,X.wireframeLinecap,X.wireframeLinejoin):t(X.color)}else if(X instanceof THREE.MeshNormalMaterial){ca.r=ic(A.normalWorld.x);ca.g=ic(A.normalWorld.y);ca.b=ic(A.normalWorld.z);
-s(C,E,P,N,Q,Z,J,K);X.wireframe===true?r(ca,X.wireframeLinewidth,X.wireframeLinecap,X.wireframeLinejoin):t(ca)}else if(X instanceof THREE.MeshDepthMaterial){sa=k.near;Ca=k.far;ba.r=ba.g=ba.b=1-ec(ia.positionScreen.z,sa,Ca);W.r=W.g=W.b=1-ec(Va.positionScreen.z,sa,Ca);V.r=V.g=V.b=1-ec(tb.positionScreen.z,sa,Ca);ga.r=ga.g=ga.b=1-ec(sb.positionScreen.z,sa,Ca);Ha=va(ba,W,V,ga);m(C,E,P,N,J,K);v(C,E,P,N,J,K,0,0,1,0,0,1,Ha);m(ea,O,Q,Z,qa,ua);v(ea,O,Q,Z,qa,ua,1,0,1,1,0,1,Ha)}}}}Ea.addRectangle(xa)}}n.setTransform(1,
-0,0,1,0,0)}}};
+THREE.PointLight){h=e.matrixWorld.getPosition();k=b.dot(Da.sub(h,a).normalize());if(!(k<=0)){k=k*(e.distance==0?1:1-Math.min(a.distanceTo(h)/e.distance,1));if(k!=0){k=k*e.intensity;c.r=c.r+g.r*k;c.g=c.g+g.g*k;c.b=c.b+g.b*k}}}}}function o(a,d,f,g,h,i,j,n){e.info.render.vertices=e.info.render.vertices+3;e.info.render.faces++;b(n.opacity);c(n.blending);C=a.positionScreen.x;E=a.positionScreen.y;P=d.positionScreen.x;N=d.positionScreen.y;Q=f.positionScreen.x;Z=f.positionScreen.y;m(C,E,P,N,Q,Z);if((n instanceof
+THREE.MeshLambertMaterial||n instanceof THREE.MeshPhongMaterial)&&n.map===null&&n.map===null)if(xb===true)if(n.wireframe===false&&n.shading==THREE.SmoothShading&&j.vertexNormalsLength==3){ba.r=W.r=V.r=Fa.r;ba.g=W.g=V.g=Fa.g;ba.b=W.b=V.b=Fa.b;l(j.v1.positionWorld,j.vertexNormalsWorld[0],ba);l(j.v2.positionWorld,j.vertexNormalsWorld[1],W);l(j.v3.positionWorld,j.vertexNormalsWorld[2],V);ba.r=Math.max(0,Math.min(n.color.r*ba.r,1));ba.g=Math.max(0,Math.min(n.color.g*ba.g,1));ba.b=Math.max(0,Math.min(n.color.b*
+ba.b,1));W.r=Math.max(0,Math.min(n.color.r*W.r,1));W.g=Math.max(0,Math.min(n.color.g*W.g,1));W.b=Math.max(0,Math.min(n.color.b*W.b,1));V.r=Math.max(0,Math.min(n.color.r*V.r,1));V.g=Math.max(0,Math.min(n.color.g*V.g,1));V.b=Math.max(0,Math.min(n.color.b*V.b,1));ga.r=(W.r+V.r)*0.5;ga.g=(W.g+V.g)*0.5;ga.b=(W.b+V.b)*0.5;Ha=va(ba,W,V,ga);v(C,E,P,N,Q,Z,0,0,1,0,0,1,Ha)}else{ca.r=Fa.r;ca.g=Fa.g;ca.b=Fa.b;l(j.centroidWorld,j.normalWorld,ca);ca.r=Math.max(0,Math.min(n.color.r*ca.r,1));ca.g=Math.max(0,Math.min(n.color.g*
+ca.g,1));ca.b=Math.max(0,Math.min(n.color.b*ca.b,1));n.wireframe===true?r(ca,n.wireframeLinewidth,n.wireframeLinecap,n.wireframeLinejoin):t(ca)}else n.wireframe===true?r(n.color,n.wireframeLinewidth,n.wireframeLinecap,n.wireframeLinejoin):t(n.color);else if(n instanceof THREE.MeshBasicMaterial||n instanceof THREE.MeshLambertMaterial||n instanceof THREE.MeshPhongMaterial)if(n.map!==null){if(n.map.mapping instanceof THREE.UVMapping){Wa=j.uvs[0];u(C,E,P,N,Q,Z,Wa[g].u,Wa[g].v,Wa[h].u,Wa[h].v,Wa[i].u,
+Wa[i].v,n.map)}}else if(n.envMap!==null){if(n.envMap.mapping instanceof THREE.SphericalReflectionMapping){a=k.matrixWorldInverse;Da.copy(j.vertexNormalsWorld[g]);ja=(Da.x*a.elements[0]+Da.y*a.elements[4]+Da.z*a.elements[8])*0.5+0.5;ob=(Da.x*a.elements[1]+Da.y*a.elements[5]+Da.z*a.elements[9])*0.5+0.5;Da.copy(j.vertexNormalsWorld[h]);Ma=(Da.x*a.elements[0]+Da.y*a.elements[4]+Da.z*a.elements[8])*0.5+0.5;Xa=(Da.x*a.elements[1]+Da.y*a.elements[5]+Da.z*a.elements[9])*0.5+0.5;Da.copy(j.vertexNormalsWorld[i]);
+pb=(Da.x*a.elements[0]+Da.y*a.elements[4]+Da.z*a.elements[8])*0.5+0.5;wb=(Da.x*a.elements[1]+Da.y*a.elements[5]+Da.z*a.elements[9])*0.5+0.5;u(C,E,P,N,Q,Z,ja,ob,Ma,Xa,pb,wb,n.envMap)}}else n.wireframe===true?r(n.color,n.wireframeLinewidth,n.wireframeLinecap,n.wireframeLinejoin):t(n.color);else if(n instanceof THREE.MeshDepthMaterial){sa=k.near;Ca=k.far;ba.r=ba.g=ba.b=1-ec(a.positionScreen.z,sa,Ca);W.r=W.g=W.b=1-ec(d.positionScreen.z,sa,Ca);V.r=V.g=V.b=1-ec(f.positionScreen.z,sa,Ca);ga.r=(W.r+V.r)*
+0.5;ga.g=(W.g+V.g)*0.5;ga.b=(W.b+V.b)*0.5;Ha=va(ba,W,V,ga);v(C,E,P,N,Q,Z,0,0,1,0,0,1,Ha)}else if(n instanceof THREE.MeshNormalMaterial){ca.r=ic(j.normalWorld.x);ca.g=ic(j.normalWorld.y);ca.b=ic(j.normalWorld.z);n.wireframe===true?r(ca,n.wireframeLinewidth,n.wireframeLinecap,n.wireframeLinejoin):t(ca)}}function m(a,b,c,d,f,e){n.beginPath();n.moveTo(a,b);n.lineTo(c,d);n.lineTo(f,e);n.closePath()}function s(a,b,c,d,f,e,g,h){n.beginPath();n.moveTo(a,b);n.lineTo(c,d);n.lineTo(f,e);n.lineTo(g,h);n.closePath()}
+function r(a,b,c,f){if(y!==b)y=n.lineWidth=b;if(B!==c)B=n.lineCap=c;if(G!==f)G=n.lineJoin=f;d(a.getContextStyle());n.stroke();xa.inflate(b*2)}function t(a){f(a.getContextStyle());n.fill()}function u(a,b,c,d,e,g,h,i,k,j,l,o,m){if(!(m instanceof THREE.DataTexture||m.image===void 0||m.image.width==0)){if(m.needsUpdate===true||ha[m.id]===void 0){var va=m.wrapS==THREE.RepeatWrapping,q=m.wrapT==THREE.RepeatWrapping;ha[m.id]=n.createPattern(m.image,va===true&&q===true?"repeat":va===true&&q===false?"repeat-x":
+va===false&&q===true?"repeat-y":"no-repeat");m.needsUpdate=false}f(ha[m.id]);var va=m.offset.x/m.repeat.x,q=m.offset.y/m.repeat.y,p=m.image.width*m.repeat.x,rb=m.image.height*m.repeat.y,h=(h+va)*p,i=(1-i+q)*rb,c=c-a,d=d-b,e=e-a,g=g-b,k=(k+va)*p-h,j=(1-j+q)*rb-i,l=(l+va)*p-h,o=(1-o+q)*rb-i,va=k*o-l*j;if(va===0){if(oa[m.id]===void 0){b=document.createElement("canvas");b.width=m.image.width;b.height=m.image.height;b=b.getContext("2d");b.drawImage(m.image,0,0);oa[m.id]=b.getImageData(0,0,m.image.width,
+m.image.height).data}b=oa[m.id];h=(Math.floor(h)+Math.floor(i)*m.image.width)*4;ca.setRGB(b[h]/255,b[h+1]/255,b[h+2]/255);t(ca)}else{va=1/va;m=(o*c-j*e)*va;j=(o*d-j*g)*va;c=(k*e-l*c)*va;d=(k*g-l*d)*va;a=a-m*h-c*i;h=b-j*h-d*i;n.save();n.transform(m,j,c,d,a,h);n.fill();n.restore()}}}function v(a,b,c,d,f,e,g,h,i,k,j,l,m){var o,va;o=m.width-1;va=m.height-1;g=g*o;h=h*va;c=c-a;d=d-b;f=f-a;e=e-b;i=i*o-g;k=k*va-h;j=j*o-g;l=l*va-h;va=1/(i*l-j*k);o=(l*c-k*f)*va;k=(l*d-k*e)*va;c=(i*f-j*c)*va;d=(i*e-j*d)*va;
+a=a-o*g-c*h;b=b-k*g-d*h;n.save();n.transform(o,k,c,d,a,b);n.clip();n.drawImage(m,0,0);n.restore()}function va(a,b,c,d){var f=a.r*255|0,e=a.g*255|0,a=a.b*255|0,g=b.r*255|0,h=b.g*255|0,b=b.b*255|0,i=c.r*255|0,k=c.g*255|0,c=c.b*255|0,j=d.r*255|0,l=d.g*255|0,d=d.b*255|0;Na[0]=f<0?0:f>255?255:f;Na[1]=e<0?0:e>255?255:e;Na[2]=a<0?0:a>255?255:a;Na[4]=g<0?0:g>255?255:g;Na[5]=h<0?0:h>255?255:h;Na[6]=b<0?0:b>255?255:b;Na[8]=i<0?0:i>255?255:i;Na[9]=k<0?0:k>255?255:k;Na[10]=c<0?0:c>255?255:c;Na[12]=j<0?0:j>255?
+255:j;Na[13]=l<0?0:l>255?255:l;Na[14]=d<0?0:d>255?255:d;ab.putImageData(fb,0,0);gb.drawImage($a,0,0);return Oa}function ec(a,b,c){a=(a-b)/(c-b);return a*a*(3-2*a)}function ic(a){a=(a+1)*0.5;return a<0?0:a>1?1:a}function rb(a,b){var c=b.x-a.x,d=b.y-a.y,f=c*c+d*d;if(f!==0){f=1/Math.sqrt(f);c=c*f;d=d*f;b.x=b.x+c;b.y=b.y+d;a.x=a.x-c;a.y=a.y-d}}if(k instanceof THREE.Camera===false)console.error("THREE.CanvasRenderer.render: camera is not an instance of THREE.Camera.");else{var Vb,Ec,A,X;this.autoClear===
+true?this.clear():n.setTransform(1,0,0,-1,p,q);e.info.render.vertices=0;e.info.render.faces=0;g=j.projectScene(a,k,this.sortElements);h=g.elements;i=g.lights;xb=i.length>0;if(xb===true){Fa.setRGB(0,0,0);Za.setRGB(0,0,0);qb.setRGB(0,0,0);Vb=0;for(Ec=i.length;Vb<Ec;Vb++){X=i[Vb];var ia=X.color;if(X instanceof THREE.AmbientLight){Fa.r=Fa.r+ia.r;Fa.g=Fa.g+ia.g;Fa.b=Fa.b+ia.b}else if(X instanceof THREE.DirectionalLight){Za.r=Za.r+ia.r;Za.g=Za.g+ia.g;Za.b=Za.b+ia.b}else if(X instanceof THREE.PointLight){qb.r=
+qb.r+ia.r;qb.g=qb.g+ia.g;qb.b=qb.b+ia.b}}}Vb=0;for(Ec=h.length;Vb<Ec;Vb++){A=h[Vb];X=A.material;if(!(X===void 0||X.visible===false)){xa.empty();if(A instanceof THREE.RenderableParticle){x=A;x.x=x.x*p;x.y=x.y*q;var ia=x,Va=A;b(X.opacity);c(X.blending);var sb=void 0,tb=void 0,ib=void 0,jb=void 0,jc=A=void 0,Tc=void 0;if(X instanceof THREE.ParticleBasicMaterial)if(X.map===null){ib=Va.object.scale.x;jb=Va.object.scale.y;ib=ib*Va.scale.x*p;jb=jb*Va.scale.y*q;xa.set(ia.x-ib,ia.y-jb,ia.x+ib,ia.y+jb);if(eb.intersects(xa)!==
+false){f(X.color.getContextStyle());n.save();n.translate(ia.x,ia.y);n.rotate(-Va.rotation);n.scale(ib,jb);n.fillRect(-1,-1,2,2);n.restore()}}else{A=X.map.image;jc=A.width>>1;Tc=A.height>>1;ib=Va.scale.x*p;jb=Va.scale.y*q;sb=ib*jc;tb=jb*Tc;xa.set(ia.x-sb,ia.y-tb,ia.x+sb,ia.y+tb);if(eb.intersects(xa)!==false){n.save();n.translate(ia.x,ia.y);n.rotate(-Va.rotation);n.scale(ib,-jb);n.translate(-jc,-Tc);n.drawImage(A,0,0);n.restore()}}else if(X instanceof THREE.ParticleCanvasMaterial){sb=Va.scale.x*p;tb=
+Va.scale.y*q;xa.set(ia.x-sb,ia.y-tb,ia.x+sb,ia.y+tb);if(eb.intersects(xa)!==false){d(X.color.getContextStyle());f(X.color.getContextStyle());n.save();n.translate(ia.x,ia.y);n.rotate(-Va.rotation);n.scale(sb,tb);X.program(n);n.restore()}}}else if(A instanceof THREE.RenderableLine){x=A.v1;I=A.v2;x.positionScreen.x=x.positionScreen.x*p;x.positionScreen.y=x.positionScreen.y*q;I.positionScreen.x=I.positionScreen.x*p;I.positionScreen.y=I.positionScreen.y*q;xa.addPoint(x.positionScreen.x,x.positionScreen.y);
+xa.addPoint(I.positionScreen.x,I.positionScreen.y);if(eb.intersects(xa)===true){ia=x;Va=I;b(X.opacity);c(X.blending);n.beginPath();n.moveTo(ia.positionScreen.x,ia.positionScreen.y);n.lineTo(Va.positionScreen.x,Va.positionScreen.y);if(X instanceof THREE.LineBasicMaterial){ia=X.linewidth;if(y!==ia)y=n.lineWidth=ia;ia=X.linecap;if(B!==ia)B=n.lineCap=ia;ia=X.linejoin;if(G!==ia)G=n.lineJoin=ia;d(X.color.getContextStyle());n.stroke();xa.inflate(X.linewidth*2)}}}else if(A instanceof THREE.RenderableFace3){x=
+A.v1;I=A.v2;F=A.v3;x.positionScreen.x=x.positionScreen.x*p;x.positionScreen.y=x.positionScreen.y*q;I.positionScreen.x=I.positionScreen.x*p;I.positionScreen.y=I.positionScreen.y*q;F.positionScreen.x=F.positionScreen.x*p;F.positionScreen.y=F.positionScreen.y*q;if(X.overdraw===true){rb(x.positionScreen,I.positionScreen);rb(I.positionScreen,F.positionScreen);rb(F.positionScreen,x.positionScreen)}xa.add3Points(x.positionScreen.x,x.positionScreen.y,I.positionScreen.x,I.positionScreen.y,F.positionScreen.x,
+F.positionScreen.y);eb.intersects(xa)===true&&o(x,I,F,0,1,2,A,X,a)}else if(A instanceof THREE.RenderableFace4){x=A.v1;I=A.v2;F=A.v3;L=A.v4;x.positionScreen.x=x.positionScreen.x*p;x.positionScreen.y=x.positionScreen.y*q;I.positionScreen.x=I.positionScreen.x*p;I.positionScreen.y=I.positionScreen.y*q;F.positionScreen.x=F.positionScreen.x*p;F.positionScreen.y=F.positionScreen.y*q;L.positionScreen.x=L.positionScreen.x*p;L.positionScreen.y=L.positionScreen.y*q;H.positionScreen.copy(I.positionScreen);M.positionScreen.copy(L.positionScreen);
+if(X.overdraw===true){rb(x.positionScreen,I.positionScreen);rb(I.positionScreen,L.positionScreen);rb(L.positionScreen,x.positionScreen);rb(F.positionScreen,H.positionScreen);rb(F.positionScreen,M.positionScreen)}xa.addPoint(x.positionScreen.x,x.positionScreen.y);xa.addPoint(I.positionScreen.x,I.positionScreen.y);xa.addPoint(F.positionScreen.x,F.positionScreen.y);xa.addPoint(L.positionScreen.x,L.positionScreen.y);if(eb.intersects(xa)===true){ia=x;Va=I;sb=F;tb=L;ib=H;jb=M;jc=a;e.info.render.vertices=
+e.info.render.vertices+4;e.info.render.faces++;b(X.opacity);c(X.blending);if(X.map!==void 0&&X.map!==null||X.envMap!==void 0&&X.envMap!==null){o(ia,Va,tb,0,1,3,A,X,jc);o(ib,sb,jb,1,2,3,A,X,jc)}else{C=ia.positionScreen.x;E=ia.positionScreen.y;P=Va.positionScreen.x;N=Va.positionScreen.y;Q=sb.positionScreen.x;Z=sb.positionScreen.y;J=tb.positionScreen.x;K=tb.positionScreen.y;ea=ib.positionScreen.x;O=ib.positionScreen.y;qa=jb.positionScreen.x;ua=jb.positionScreen.y;if(X instanceof THREE.MeshLambertMaterial||
+X instanceof THREE.MeshPhongMaterial)if(xb===true)if(X.wireframe===false&&X.shading==THREE.SmoothShading&&A.vertexNormalsLength==4){ba.r=W.r=V.r=ga.r=Fa.r;ba.g=W.g=V.g=ga.g=Fa.g;ba.b=W.b=V.b=ga.b=Fa.b;l(A.v1.positionWorld,A.vertexNormalsWorld[0],ba);l(A.v2.positionWorld,A.vertexNormalsWorld[1],W);l(A.v4.positionWorld,A.vertexNormalsWorld[3],V);l(A.v3.positionWorld,A.vertexNormalsWorld[2],ga);ba.r=Math.max(0,Math.min(X.color.r*ba.r,1));ba.g=Math.max(0,Math.min(X.color.g*ba.g,1));ba.b=Math.max(0,Math.min(X.color.b*
+ba.b,1));W.r=Math.max(0,Math.min(X.color.r*W.r,1));W.g=Math.max(0,Math.min(X.color.g*W.g,1));W.b=Math.max(0,Math.min(X.color.b*W.b,1));V.r=Math.max(0,Math.min(X.color.r*V.r,1));V.g=Math.max(0,Math.min(X.color.g*V.g,1));V.b=Math.max(0,Math.min(X.color.b*V.b,1));ga.r=Math.max(0,Math.min(X.color.r*ga.r,1));ga.g=Math.max(0,Math.min(X.color.g*ga.g,1));ga.b=Math.max(0,Math.min(X.color.b*ga.b,1));Ha=va(ba,W,V,ga);m(C,E,P,N,J,K);v(C,E,P,N,J,K,0,0,1,0,0,1,Ha);m(ea,O,Q,Z,qa,ua);v(ea,O,Q,Z,qa,ua,1,0,1,1,0,1,
+Ha)}else{ca.r=Fa.r;ca.g=Fa.g;ca.b=Fa.b;l(A.centroidWorld,A.normalWorld,ca);ca.r=Math.max(0,Math.min(X.color.r*ca.r,1));ca.g=Math.max(0,Math.min(X.color.g*ca.g,1));ca.b=Math.max(0,Math.min(X.color.b*ca.b,1));s(C,E,P,N,Q,Z,J,K);X.wireframe===true?r(ca,X.wireframeLinewidth,X.wireframeLinecap,X.wireframeLinejoin):t(ca)}else{s(C,E,P,N,Q,Z,J,K);X.wireframe===true?r(X.color,X.wireframeLinewidth,X.wireframeLinecap,X.wireframeLinejoin):t(X.color)}else if(X instanceof THREE.MeshBasicMaterial){s(C,E,P,N,Q,Z,
+J,K);X.wireframe===true?r(X.color,X.wireframeLinewidth,X.wireframeLinecap,X.wireframeLinejoin):t(X.color)}else if(X instanceof THREE.MeshNormalMaterial){ca.r=ic(A.normalWorld.x);ca.g=ic(A.normalWorld.y);ca.b=ic(A.normalWorld.z);s(C,E,P,N,Q,Z,J,K);X.wireframe===true?r(ca,X.wireframeLinewidth,X.wireframeLinecap,X.wireframeLinejoin):t(ca)}else if(X instanceof THREE.MeshDepthMaterial){sa=k.near;Ca=k.far;ba.r=ba.g=ba.b=1-ec(ia.positionScreen.z,sa,Ca);W.r=W.g=W.b=1-ec(Va.positionScreen.z,sa,Ca);V.r=V.g=
+V.b=1-ec(tb.positionScreen.z,sa,Ca);ga.r=ga.g=ga.b=1-ec(sb.positionScreen.z,sa,Ca);Ha=va(ba,W,V,ga);m(C,E,P,N,J,K);v(C,E,P,N,J,K,0,0,1,0,0,1,Ha);m(ea,O,Q,Z,qa,ua);v(ea,O,Q,Z,qa,ua,1,0,1,1,0,1,Ha)}}}}Ea.addRectangle(xa)}}n.setTransform(1,0,0,1,0,0)}}};
 THREE.ShaderChunk={fog_pars_fragment:"#ifdef USE_FOG\nuniform vec3 fogColor;\n#ifdef FOG_EXP2\nuniform float fogDensity;\n#else\nuniform float fogNear;\nuniform float fogFar;\n#endif\n#endif",fog_fragment:"#ifdef USE_FOG\nfloat depth = gl_FragCoord.z / gl_FragCoord.w;\n#ifdef FOG_EXP2\nconst float LOG2 = 1.442695;\nfloat fogFactor = exp2( - fogDensity * fogDensity * depth * depth * LOG2 );\nfogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );\n#else\nfloat fogFactor = smoothstep( fogNear, fogFar, depth );\n#endif\ngl_FragColor = mix( gl_FragColor, vec4( fogColor, gl_FragColor.w ), fogFactor );\n#endif",envmap_pars_fragment:"#ifdef USE_ENVMAP\nuniform float reflectivity;\nuniform samplerCube envMap;\nuniform float flipEnvMap;\nuniform int combine;\n#ifdef USE_BUMPMAP\nuniform bool useRefract;\nuniform float refractionRatio;\n#else\nvarying vec3 vReflect;\n#endif\n#endif",
 envmap_fragment:"#ifdef USE_ENVMAP\nvec3 reflectVec;\n#ifdef USE_BUMPMAP\nvec3 cameraToVertex = normalize( vWorldPosition - cameraPosition );\nif ( useRefract ) {\nreflectVec = refract( cameraToVertex, normal, refractionRatio );\n} else { \nreflectVec = reflect( cameraToVertex, normal );\n}\n#else\nreflectVec = vReflect;\n#endif\n#ifdef DOUBLE_SIDED\nfloat flipNormal = ( -1.0 + 2.0 * float( gl_FrontFacing ) );\nvec4 cubeColor = textureCube( envMap, flipNormal * vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n#else\nvec4 cubeColor = textureCube( envMap, vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n#endif\n#ifdef GAMMA_INPUT\ncubeColor.xyz *= cubeColor.xyz;\n#endif\nif ( combine == 1 ) {\ngl_FragColor.xyz = mix( gl_FragColor.xyz, cubeColor.xyz, specularStrength * reflectivity );\n} else {\ngl_FragColor.xyz = mix( gl_FragColor.xyz, gl_FragColor.xyz * cubeColor.xyz, specularStrength * reflectivity );\n}\n#endif",
 envmap_pars_vertex:"#if defined( USE_ENVMAP ) && ! defined( USE_BUMPMAP )\nvarying vec3 vReflect;\nuniform float refractionRatio;\nuniform bool useRefract;\n#endif",worldpos_vertex:"#if defined( USE_ENVMAP ) || defined( PHONG ) || defined( LAMBERT ) || defined ( USE_SHADOWMAP )\n#ifdef USE_SKINNING\nvec4 mPosition = modelMatrix * skinned;\n#endif\n#if defined( USE_MORPHTARGETS ) && ! defined( USE_SKINNING )\nvec4 mPosition = modelMatrix * vec4( morphed, 1.0 );\n#endif\n#if ! defined( USE_MORPHTARGETS ) && ! defined( USE_SKINNING )\nvec4 mPosition = modelMatrix * vec4( position, 1.0 );\n#endif\n#endif",
@@ -331,32 +331,32 @@ THREE.ShaderChunk.fog_pars_fragment,THREE.ShaderChunk.shadowmap_pars_fragment,"v
 THREE.ShaderChunk.skinning_vertex,THREE.ShaderChunk.default_vertex,"}"].join("\n"),fragmentShader:"vec4 pack_depth( const in float depth ) {\nconst vec4 bit_shift = vec4( 256.0 * 256.0 * 256.0, 256.0 * 256.0, 256.0, 1.0 );\nconst vec4 bit_mask  = vec4( 0.0, 1.0 / 256.0, 1.0 / 256.0, 1.0 / 256.0 );\nvec4 res = fract( depth * bit_shift );\nres -= res.xxyz * bit_mask;\nreturn res;\n}\nvoid main() {\ngl_FragData[ 0 ] = pack_depth( gl_FragCoord.z );\n}"}};
 THREE.WebGLRenderer=function(a){function b(a,b){var c=a.vertices.length,d=b.material;if(d.attributes){if(a.__webglCustomAttributesList===void 0)a.__webglCustomAttributesList=[];for(var f in d.attributes){var e=d.attributes[f];if(!e.__webglInitialized||e.createUniqueBuffers){e.__webglInitialized=true;var g=1;e.type==="v2"?g=2:e.type==="v3"?g=3:e.type==="v4"?g=4:e.type==="c"&&(g=3);e.size=g;e.array=new Float32Array(c*g);e.buffer=k.createBuffer();e.buffer.belongsToAttribute=f;e.needsUpdate=true}a.__webglCustomAttributesList.push(e)}}}
 function c(a,b){if(a.material&&!(a.material instanceof THREE.MeshFaceMaterial))return a.material;if(b.materialIndex>=0)return a.geometry.materials[b.materialIndex]}function d(a){return a instanceof THREE.MeshBasicMaterial&&!a.envMap||a instanceof THREE.MeshDepthMaterial?false:a&&a.shading!==void 0&&a.shading===THREE.SmoothShading?THREE.SmoothShading:THREE.FlatShading}function f(a){return a.map||a.lightMap||a.bumpMap||a.specularMap||a instanceof THREE.ShaderMaterial?true:false}function e(a){var b,
-c,d;for(b in a.attributes){d=b==="index"?k.ELEMENT_ARRAY_BUFFER:k.ARRAY_BUFFER;c=a.attributes[b];c.buffer=k.createBuffer();k.bindBuffer(d,c.buffer);k.bufferData(d,c.array,k.STATIC_DRAW)}}function g(a,b,c){var d,f,e,g,h=a.vertices;g=h.length;var i=a.colors,j=i.length,l=a.__vertexArray,m=a.__colorArray,o=a.__sortArray,n=a.verticesNeedUpdate,q=a.colorsNeedUpdate,p=a.__webglCustomAttributesList;if(c.sortParticles){fb.copy(ab);fb.multiplySelf(c.matrixWorld);for(d=0;d<g;d++){f=h[d];Na.copy(f);fb.multiplyVector3(Na);
-o[d]=[Na.z,d]}o.sort(function(a,b){return b[0]-a[0]});for(d=0;d<g;d++){f=h[o[d][1]];e=d*3;l[e]=f.x;l[e+1]=f.y;l[e+2]=f.z}for(d=0;d<j;d++){e=d*3;f=i[o[d][1]];m[e]=f.r;m[e+1]=f.g;m[e+2]=f.b}if(p){i=0;for(j=p.length;i<j;i++){h=p[i];if(h.boundTo===void 0||h.boundTo==="vertices"){e=0;f=h.value.length;if(h.size===1)for(d=0;d<f;d++){g=o[d][1];h.array[d]=h.value[g]}else if(h.size===2)for(d=0;d<f;d++){g=o[d][1];g=h.value[g];h.array[e]=g.x;h.array[e+1]=g.y;e=e+2}else if(h.size===3)if(h.type==="c")for(d=0;d<
-f;d++){g=o[d][1];g=h.value[g];h.array[e]=g.r;h.array[e+1]=g.g;h.array[e+2]=g.b;e=e+3}else for(d=0;d<f;d++){g=o[d][1];g=h.value[g];h.array[e]=g.x;h.array[e+1]=g.y;h.array[e+2]=g.z;e=e+3}else if(h.size===4)for(d=0;d<f;d++){g=o[d][1];g=h.value[g];h.array[e]=g.x;h.array[e+1]=g.y;h.array[e+2]=g.z;h.array[e+3]=g.w;e=e+4}}}}}else{if(n)for(d=0;d<g;d++){f=h[d];e=d*3;l[e]=f.x;l[e+1]=f.y;l[e+2]=f.z}if(q)for(d=0;d<j;d++){f=i[d];e=d*3;m[e]=f.r;m[e+1]=f.g;m[e+2]=f.b}if(p){i=0;for(j=p.length;i<j;i++){h=p[i];if(h.needsUpdate&&
+c,d;for(b in a.attributes){d=b==="index"?k.ELEMENT_ARRAY_BUFFER:k.ARRAY_BUFFER;c=a.attributes[b];c.buffer=k.createBuffer();k.bindBuffer(d,c.buffer);k.bufferData(d,c.array,k.STATIC_DRAW)}}function g(a,b,c){var d,f,e,g,h=a.vertices;g=h.length;var i=a.colors,j=i.length,l=a.__vertexArray,m=a.__colorArray,n=a.__sortArray,o=a.verticesNeedUpdate,q=a.colorsNeedUpdate,p=a.__webglCustomAttributesList;if(c.sortParticles){fb.copy(ab);fb.multiplySelf(c.matrixWorld);for(d=0;d<g;d++){f=h[d];Na.copy(f);fb.multiplyVector3(Na);
+n[d]=[Na.z,d]}n.sort(function(a,b){return b[0]-a[0]});for(d=0;d<g;d++){f=h[n[d][1]];e=d*3;l[e]=f.x;l[e+1]=f.y;l[e+2]=f.z}for(d=0;d<j;d++){e=d*3;f=i[n[d][1]];m[e]=f.r;m[e+1]=f.g;m[e+2]=f.b}if(p){i=0;for(j=p.length;i<j;i++){h=p[i];if(h.boundTo===void 0||h.boundTo==="vertices"){e=0;f=h.value.length;if(h.size===1)for(d=0;d<f;d++){g=n[d][1];h.array[d]=h.value[g]}else if(h.size===2)for(d=0;d<f;d++){g=n[d][1];g=h.value[g];h.array[e]=g.x;h.array[e+1]=g.y;e=e+2}else if(h.size===3)if(h.type==="c")for(d=0;d<
+f;d++){g=n[d][1];g=h.value[g];h.array[e]=g.r;h.array[e+1]=g.g;h.array[e+2]=g.b;e=e+3}else for(d=0;d<f;d++){g=n[d][1];g=h.value[g];h.array[e]=g.x;h.array[e+1]=g.y;h.array[e+2]=g.z;e=e+3}else if(h.size===4)for(d=0;d<f;d++){g=n[d][1];g=h.value[g];h.array[e]=g.x;h.array[e+1]=g.y;h.array[e+2]=g.z;h.array[e+3]=g.w;e=e+4}}}}}else{if(o)for(d=0;d<g;d++){f=h[d];e=d*3;l[e]=f.x;l[e+1]=f.y;l[e+2]=f.z}if(q)for(d=0;d<j;d++){f=i[d];e=d*3;m[e]=f.r;m[e+1]=f.g;m[e+2]=f.b}if(p){i=0;for(j=p.length;i<j;i++){h=p[i];if(h.needsUpdate&&
 (h.boundTo===void 0||h.boundTo==="vertices")){f=h.value.length;e=0;if(h.size===1)for(d=0;d<f;d++)h.array[d]=h.value[d];else if(h.size===2)for(d=0;d<f;d++){g=h.value[d];h.array[e]=g.x;h.array[e+1]=g.y;e=e+2}else if(h.size===3)if(h.type==="c")for(d=0;d<f;d++){g=h.value[d];h.array[e]=g.r;h.array[e+1]=g.g;h.array[e+2]=g.b;e=e+3}else for(d=0;d<f;d++){g=h.value[d];h.array[e]=g.x;h.array[e+1]=g.y;h.array[e+2]=g.z;e=e+3}else if(h.size===4)for(d=0;d<f;d++){g=h.value[d];h.array[e]=g.x;h.array[e+1]=g.y;h.array[e+
-2]=g.z;h.array[e+3]=g.w;e=e+4}}}}}if(n||c.sortParticles){k.bindBuffer(k.ARRAY_BUFFER,a.__webglVertexBuffer);k.bufferData(k.ARRAY_BUFFER,l,b)}if(q||c.sortParticles){k.bindBuffer(k.ARRAY_BUFFER,a.__webglColorBuffer);k.bufferData(k.ARRAY_BUFFER,m,b)}if(p){i=0;for(j=p.length;i<j;i++){h=p[i];if(h.needsUpdate||c.sortParticles){k.bindBuffer(k.ARRAY_BUFFER,h.buffer);k.bufferData(k.ARRAY_BUFFER,h.array,b)}}}}function h(a,b,c){var d=a.attributes,f=d.index,e=d.position,g=d.normal,h=d.uv,i=d.color,d=d.tangent;
+2]=g.z;h.array[e+3]=g.w;e=e+4}}}}}if(o||c.sortParticles){k.bindBuffer(k.ARRAY_BUFFER,a.__webglVertexBuffer);k.bufferData(k.ARRAY_BUFFER,l,b)}if(q||c.sortParticles){k.bindBuffer(k.ARRAY_BUFFER,a.__webglColorBuffer);k.bufferData(k.ARRAY_BUFFER,m,b)}if(p){i=0;for(j=p.length;i<j;i++){h=p[i];if(h.needsUpdate||c.sortParticles){k.bindBuffer(k.ARRAY_BUFFER,h.buffer);k.bufferData(k.ARRAY_BUFFER,h.array,b)}}}}function h(a,b,c){var d=a.attributes,f=d.index,e=d.position,g=d.normal,h=d.uv,i=d.color,d=d.tangent;
 if(a.elementsNeedUpdate&&f!==void 0){k.bindBuffer(k.ELEMENT_ARRAY_BUFFER,f.buffer);k.bufferData(k.ELEMENT_ARRAY_BUFFER,f.array,b)}if(a.verticesNeedUpdate&&e!==void 0){k.bindBuffer(k.ARRAY_BUFFER,e.buffer);k.bufferData(k.ARRAY_BUFFER,e.array,b)}if(a.normalsNeedUpdate&&g!==void 0){k.bindBuffer(k.ARRAY_BUFFER,g.buffer);k.bufferData(k.ARRAY_BUFFER,g.array,b)}if(a.uvsNeedUpdate&&h!==void 0){k.bindBuffer(k.ARRAY_BUFFER,h.buffer);k.bufferData(k.ARRAY_BUFFER,h.array,b)}if(a.colorsNeedUpdate&&i!==void 0){k.bindBuffer(k.ARRAY_BUFFER,
 i.buffer);k.bufferData(k.ARRAY_BUFFER,i.array,b)}if(a.tangentsNeedUpdate&&d!==void 0){k.bindBuffer(k.ARRAY_BUFFER,d.buffer);k.bufferData(k.ARRAY_BUFFER,d.array,b)}if(c)for(var j in a.attributes)delete a.attributes[j].array}function i(a,b){return b.z-a.z}function j(a,b){return b[1]-a[1]}function l(a,b,c){if(a.length)for(var d=0,f=a.length;d<f;d++){ga=ca=null;W=V=Ca=sa=Xa=Ma=Ha=-1;gb=true;a[d].render(b,c,qb,Da);ga=ca=null;W=V=Ca=sa=Xa=Ma=Ha=-1;gb=true}}function o(a,b,c,d,f,e,g,h){var i,k,j,l;if(b){k=
 a.length-1;l=b=-1}else{k=0;b=a.length;l=1}for(var m=k;m!==b;m=m+l){i=a[m];if(i.render){k=i.object;j=i.buffer;if(h)i=h;else{i=i[c];if(!i)continue;g&&O.setBlending(i.blending,i.blendEquation,i.blendSrc,i.blendDst);O.setDepthTest(i.depthTest);O.setDepthWrite(i.depthWrite);B(i.polygonOffset,i.polygonOffsetFactor,i.polygonOffsetUnits)}O.setMaterialFaces(i);j instanceof THREE.BufferGeometry?O.renderBufferDirect(d,f,e,i,j,k):O.renderBuffer(d,f,e,i,j,k)}}}function m(a,b,c,d,f,e,g){for(var h,i,k=0,j=a.length;k<
 j;k++){h=a[k];i=h.object;if(i.visible){if(g)h=g;else{h=h[b];if(!h)continue;e&&O.setBlending(h.blending,h.blendEquation,h.blendSrc,h.blendDst);O.setDepthTest(h.depthTest);O.setDepthWrite(h.depthWrite);B(h.polygonOffset,h.polygonOffsetFactor,h.polygonOffsetUnits)}O.renderImmediateObject(c,d,f,h,i)}}}function p(a,b,c){a.push({buffer:b,object:c,opaque:null,transparent:null})}function q(a){for(var b in a.attributes)if(a.attributes[b].needsUpdate)return true;return false}function n(a){for(var b in a.attributes)a.attributes[b].needsUpdate=
 false}function t(a,b){for(var c=a.length-1;c>=0;c--)a[c].object===b&&a.splice(c,1)}function r(a,b){for(var c=a.length-1;c>=0;c--)a[c]===b&&a.splice(c,1)}function u(a,b,c,d,f){oa=0;if(d.needsUpdate){d.program&&O.deallocateMaterial(d);O.initMaterial(d,b,c,f);d.needsUpdate=false}if(d.morphTargets&&!f.__webglMorphTargetInfluences)f.__webglMorphTargetInfluences=new Float32Array(O.maxMorphTargets);var e=false,g=d.program,h=g.uniforms,i=d.uniforms;if(g!==ca){k.useProgram(g);ca=g;e=true}if(d.id!==W){W=d.id;
-e=true}if(e||a!==ga){k.uniformMatrix4fv(h.projectionMatrix,false,a._projectionMatrixArray);a!==ga&&(ga=a)}if(d.skinning)if(hc&&f.useVertexTexture){if(h.boneTexture!==null){var j=v();k.uniform1i(h.boneTexture,j);O.setTexture(f.boneTexture,j)}}else h.boneGlobalMatrices!==null&&k.uniformMatrix4fv(h.boneGlobalMatrices,false,f.boneMatrices);if(e){if(c&&d.fog){i.fogColor.value=c.color;if(c instanceof THREE.Fog){i.fogNear.value=c.near;i.fogFar.value=c.far}else if(c instanceof THREE.FogExp2)i.fogDensity.value=
-c.density}if(d instanceof THREE.MeshPhongMaterial||d instanceof THREE.MeshLambertMaterial||d.lights){if(gb){for(var l=0,m=0,o=0,n,q,p,s,r=qc,t=r.directional.colors,u=r.directional.positions,x=r.point.colors,B=r.point.positions,C=r.point.distances,G=r.spot.colors,F=r.spot.positions,K=r.spot.distances,E=r.spot.directions,J=r.spot.angles,L=r.spot.exponents,N=r.hemi.skyColors,V=r.hemi.groundColors,P=r.hemi.positions,Q=0,ba=0,Z=0,ea=0,c=n=p=p=q=0,e=b.length;c<e;c++){j=b[c];if(!j.onlyShadow&&j.visible){n=
-j.color;s=j.intensity;q=j.distance;if(j instanceof THREE.AmbientLight)if(O.gammaInput){l=l+n.r*n.r;m=m+n.g*n.g;o=o+n.b*n.b}else{l=l+n.r;m=m+n.g;o=o+n.b}else if(j instanceof THREE.DirectionalLight){q=Q*3;O.gammaInput?A(t,q,n,s*s):y(t,q,n,s);Oa.copy(j.matrixWorld.getPosition());Oa.subSelf(j.target.matrixWorld.getPosition());Oa.normalize();u[q]=Oa.x;u[q+1]=Oa.y;u[q+2]=Oa.z;Q=Q+1}else if(j instanceof THREE.PointLight){p=ba*3;O.gammaInput?A(x,p,n,s*s):y(x,p,n,s);s=j.matrixWorld.getPosition();B[p]=s.x;
-B[p+1]=s.y;B[p+2]=s.z;C[ba]=q;ba=ba+1}else if(j instanceof THREE.SpotLight){p=Z*3;O.gammaInput?A(G,p,n,s*s):y(G,p,n,s);s=j.matrixWorld.getPosition();F[p]=s.x;F[p+1]=s.y;F[p+2]=s.z;K[Z]=q;Oa.copy(s);Oa.subSelf(j.target.matrixWorld.getPosition());Oa.normalize();E[p]=Oa.x;E[p+1]=Oa.y;E[p+2]=Oa.z;J[Z]=Math.cos(j.angle);L[Z]=j.exponent;Z=Z+1}else if(j instanceof THREE.HemisphereLight){q=j.color;p=j.groundColor;n=ea*3;if(O.gammaInput){s=s*s;A(N,n,q,s);A(V,n,p,s)}else{y(N,n,q,s);y(V,n,p,s)}s=j.matrixWorld.getPosition();
-P[n]=s.x;P[n+1]=s.y;P[n+2]=s.z;ea=ea+1}}}c=Q*3;for(e=t.length;c<e;c++)t[c]=0;c=ba*3;for(e=x.length;c<e;c++)x[c]=0;c=Z*3;for(e=G.length;c<e;c++)G[c]=0;c=ea*3;for(e=N.length;c<e;c++)N[c]=0;c=ea*3;for(e=V.length;c<e;c++)V[c]=0;r.directional.length=Q;r.point.length=ba;r.spot.length=Z;r.hemi.length=ea;r.ambient[0]=l;r.ambient[1]=m;r.ambient[2]=o;gb=false}c=qc;i.ambientLightColor.value=c.ambient;i.directionalLightColor.value=c.directional.colors;i.directionalLightDirection.value=c.directional.positions;
+e=true}if(e||a!==ga){k.uniformMatrix4fv(h.projectionMatrix,false,a._projectionMatrixArray);a!==ga&&(ga=a)}if(d.skinning)if(dc&&f.useVertexTexture){if(h.boneTexture!==null){var j=v();k.uniform1i(h.boneTexture,j);O.setTexture(f.boneTexture,j)}}else h.boneGlobalMatrices!==null&&k.uniformMatrix4fv(h.boneGlobalMatrices,false,f.boneMatrices);if(e){if(c&&d.fog){i.fogColor.value=c.color;if(c instanceof THREE.Fog){i.fogNear.value=c.near;i.fogFar.value=c.far}else if(c instanceof THREE.FogExp2)i.fogDensity.value=
+c.density}if(d instanceof THREE.MeshPhongMaterial||d instanceof THREE.MeshLambertMaterial||d.lights){if(gb){for(var l=0,m=0,n=0,o,q,p,s,r=qc,t=r.directional.colors,u=r.directional.positions,x=r.point.colors,B=r.point.positions,C=r.point.distances,G=r.spot.colors,F=r.spot.positions,K=r.spot.distances,E=r.spot.directions,J=r.spot.angles,L=r.spot.exponents,N=r.hemi.skyColors,V=r.hemi.groundColors,P=r.hemi.positions,Q=0,ba=0,Z=0,ea=0,c=o=p=p=q=0,e=b.length;c<e;c++){j=b[c];if(!j.onlyShadow&&j.visible){o=
+j.color;s=j.intensity;q=j.distance;if(j instanceof THREE.AmbientLight)if(O.gammaInput){l=l+o.r*o.r;m=m+o.g*o.g;n=n+o.b*o.b}else{l=l+o.r;m=m+o.g;n=n+o.b}else if(j instanceof THREE.DirectionalLight){q=Q*3;O.gammaInput?A(t,q,o,s*s):y(t,q,o,s);Oa.copy(j.matrixWorld.getPosition());Oa.subSelf(j.target.matrixWorld.getPosition());Oa.normalize();u[q]=Oa.x;u[q+1]=Oa.y;u[q+2]=Oa.z;Q=Q+1}else if(j instanceof THREE.PointLight){p=ba*3;O.gammaInput?A(x,p,o,s*s):y(x,p,o,s);s=j.matrixWorld.getPosition();B[p]=s.x;
+B[p+1]=s.y;B[p+2]=s.z;C[ba]=q;ba=ba+1}else if(j instanceof THREE.SpotLight){p=Z*3;O.gammaInput?A(G,p,o,s*s):y(G,p,o,s);s=j.matrixWorld.getPosition();F[p]=s.x;F[p+1]=s.y;F[p+2]=s.z;K[Z]=q;Oa.copy(s);Oa.subSelf(j.target.matrixWorld.getPosition());Oa.normalize();E[p]=Oa.x;E[p+1]=Oa.y;E[p+2]=Oa.z;J[Z]=Math.cos(j.angle);L[Z]=j.exponent;Z=Z+1}else if(j instanceof THREE.HemisphereLight){q=j.color;p=j.groundColor;o=ea*3;if(O.gammaInput){s=s*s;A(N,o,q,s);A(V,o,p,s)}else{y(N,o,q,s);y(V,o,p,s)}s=j.matrixWorld.getPosition();
+P[o]=s.x;P[o+1]=s.y;P[o+2]=s.z;ea=ea+1}}}c=Q*3;for(e=t.length;c<e;c++)t[c]=0;c=ba*3;for(e=x.length;c<e;c++)x[c]=0;c=Z*3;for(e=G.length;c<e;c++)G[c]=0;c=ea*3;for(e=N.length;c<e;c++)N[c]=0;c=ea*3;for(e=V.length;c<e;c++)V[c]=0;r.directional.length=Q;r.point.length=ba;r.spot.length=Z;r.hemi.length=ea;r.ambient[0]=l;r.ambient[1]=m;r.ambient[2]=n;gb=false}c=qc;i.ambientLightColor.value=c.ambient;i.directionalLightColor.value=c.directional.colors;i.directionalLightDirection.value=c.directional.positions;
 i.pointLightColor.value=c.point.colors;i.pointLightPosition.value=c.point.positions;i.pointLightDistance.value=c.point.distances;i.spotLightColor.value=c.spot.colors;i.spotLightPosition.value=c.spot.positions;i.spotLightDistance.value=c.spot.distances;i.spotLightDirection.value=c.spot.directions;i.spotLightAngle.value=c.spot.angles;i.spotLightExponent.value=c.spot.exponents;i.hemisphereLightSkyColor.value=c.hemi.skyColors;i.hemisphereLightGroundColor.value=c.hemi.groundColors;i.hemisphereLightPosition.value=
 c.hemi.positions}if(d instanceof THREE.MeshBasicMaterial||d instanceof THREE.MeshLambertMaterial||d instanceof THREE.MeshPhongMaterial){i.opacity.value=d.opacity;O.gammaInput?i.diffuse.value.copyGammaToLinear(d.color):i.diffuse.value=d.color;i.map.value=d.map;i.lightMap.value=d.lightMap;i.specularMap.value=d.specularMap;if(d.bumpMap){i.bumpMap.value=d.bumpMap;i.bumpScale.value=d.bumpScale}var ha;if(d.map)ha=d.map;else if(d.specularMap)ha=d.specularMap;else if(d.bumpMap)ha=d.bumpMap;if(ha!==void 0){c=
 ha.offset;ha=ha.repeat;i.offsetRepeat.value.set(c.x,c.y,ha.x,ha.y)}i.envMap.value=d.envMap;i.flipEnvMap.value=d.envMap instanceof THREE.WebGLRenderTargetCube?1:-1;i.reflectivity.value=d.reflectivity;i.refractionRatio.value=d.refractionRatio;i.combine.value=d.combine;i.useRefract.value=d.envMap&&d.envMap.mapping instanceof THREE.CubeRefractionMapping}if(d instanceof THREE.LineBasicMaterial){i.diffuse.value=d.color;i.opacity.value=d.opacity}else if(d instanceof THREE.ParticleBasicMaterial){i.psColor.value=
 d.color;i.opacity.value=d.opacity;i.size.value=d.size;i.scale.value=M.height/2;i.map.value=d.map}else if(d instanceof THREE.MeshPhongMaterial){i.shininess.value=d.shininess;if(O.gammaInput){i.ambient.value.copyGammaToLinear(d.ambient);i.emissive.value.copyGammaToLinear(d.emissive);i.specular.value.copyGammaToLinear(d.specular)}else{i.ambient.value=d.ambient;i.emissive.value=d.emissive;i.specular.value=d.specular}d.wrapAround&&i.wrapRGB.value.copy(d.wrapRGB)}else if(d instanceof THREE.MeshLambertMaterial){if(O.gammaInput){i.ambient.value.copyGammaToLinear(d.ambient);
 i.emissive.value.copyGammaToLinear(d.emissive)}else{i.ambient.value=d.ambient;i.emissive.value=d.emissive}d.wrapAround&&i.wrapRGB.value.copy(d.wrapRGB)}else if(d instanceof THREE.MeshDepthMaterial){i.mNear.value=a.near;i.mFar.value=a.far;i.opacity.value=d.opacity}else if(d instanceof THREE.MeshNormalMaterial)i.opacity.value=d.opacity;if(f.receiveShadow&&!d._shadowPass&&i.shadowMatrix){c=ha=0;for(e=b.length;c<e;c++){j=b[c];if(j.castShadow&&(j instanceof THREE.SpotLight||j instanceof THREE.DirectionalLight&&
 !j.shadowCascade)){i.shadowMap.value[ha]=j.shadowMap;i.shadowMapSize.value[ha]=j.shadowMapSize;i.shadowMatrix.value[ha]=j.shadowMatrix;i.shadowDarkness.value[ha]=j.shadowDarkness;i.shadowBias.value[ha]=j.shadowBias;ha++}}}b=d.uniformsList;i=0;for(ha=b.length;i<ha;i++)if(e=g.uniforms[b[i][1]]){c=b[i][0];l=c.type;j=c.value;if(l==="i")k.uniform1i(e,j);else if(l==="f")k.uniform1f(e,j);else if(l==="v2")k.uniform2f(e,j.x,j.y);else if(l==="v3")k.uniform3f(e,j.x,j.y,j.z);else if(l==="v4")k.uniform4f(e,j.x,
-j.y,j.z,j.w);else if(l==="c")k.uniform3f(e,j.r,j.g,j.b);else if(l==="iv1")k.uniform1iv(e,j);else if(l==="iv")k.uniform3iv(e,j);else if(l==="fv1")k.uniform1fv(e,j);else if(l==="fv")k.uniform3fv(e,j);else if(l==="v2v"){if(c._array===void 0)c._array=new Float32Array(2*j.length);l=0;for(m=j.length;l<m;l++){o=l*2;c._array[o]=j[l].x;c._array[o+1]=j[l].y}k.uniform2fv(e,c._array)}else if(l==="v3v"){if(c._array===void 0)c._array=new Float32Array(3*j.length);l=0;for(m=j.length;l<m;l++){o=l*3;c._array[o]=j[l].x;
-c._array[o+1]=j[l].y;c._array[o+2]=j[l].z}k.uniform3fv(e,c._array)}else if(l==="v4v"){if(c._array===void 0)c._array=new Float32Array(4*j.length);l=0;for(m=j.length;l<m;l++){o=l*4;c._array[o]=j[l].x;c._array[o+1]=j[l].y;c._array[o+2]=j[l].z;c._array[o+3]=j[l].w}k.uniform4fv(e,c._array)}else if(l==="m4"){if(c._array===void 0)c._array=new Float32Array(16);j.flattenToArray(c._array);k.uniformMatrix4fv(e,false,c._array)}else if(l==="m4v"){if(c._array===void 0)c._array=new Float32Array(16*j.length);l=0;
-for(m=j.length;l<m;l++)j[l].flattenToArrayOffset(c._array,l*16);k.uniformMatrix4fv(e,false,c._array)}else if(l==="t"){o=j;j=v();k.uniform1i(e,j);if(o)if(o.image instanceof Array&&o.image.length===6){c=o;e=j;if(c.image.length===6)if(c.needsUpdate){if(!c.image.__webglTextureCube)c.image.__webglTextureCube=k.createTexture();k.activeTexture(k.TEXTURE0+e);k.bindTexture(k.TEXTURE_CUBE_MAP,c.image.__webglTextureCube);k.pixelStorei(k.UNPACK_FLIP_Y_WEBGL,c.flipY);e=[];for(j=0;j<6;j++)if(O.autoScaleCubemaps){l=
-e;m=j;o=c.image[j];t=Sc;if(!(o.width<=t&&o.height<=t)){u=Math.max(o.width,o.height);r=Math.floor(o.width*t/u);t=Math.floor(o.height*t/u);u=document.createElement("canvas");u.width=r;u.height=t;u.getContext("2d").drawImage(o,0,0,o.width,o.height,0,0,r,t);o=u}l[m]=o}else e[j]=c.image[j];j=e[0];l=(j.width&j.width-1)===0&&(j.height&j.height-1)===0;m=H(c.format);o=H(c.type);I(k.TEXTURE_CUBE_MAP,c,l);for(j=0;j<6;j++)k.texImage2D(k.TEXTURE_CUBE_MAP_POSITIVE_X+j,0,m,m,o,e[j]);c.generateMipmaps&&l&&k.generateMipmap(k.TEXTURE_CUBE_MAP);
-c.needsUpdate=false;if(c.onUpdate)c.onUpdate()}else{k.activeTexture(k.TEXTURE0+e);k.bindTexture(k.TEXTURE_CUBE_MAP,c.image.__webglTextureCube)}}else if(o instanceof THREE.WebGLRenderTargetCube){c=o;k.activeTexture(k.TEXTURE0+j);k.bindTexture(k.TEXTURE_CUBE_MAP,c.__webglTexture)}else O.setTexture(o,j)}else if(l==="tv"){if(c._array===void 0)c._array=[];l=0;for(m=c.value.length;l<m;l++)c._array[l]=v();k.uniform1iv(e,c._array);l=0;for(m=c.value.length;l<m;l++){o=c.value[l];j=c._array[l];o&&O.setTexture(o,
+j.y,j.z,j.w);else if(l==="c")k.uniform3f(e,j.r,j.g,j.b);else if(l==="iv1")k.uniform1iv(e,j);else if(l==="iv")k.uniform3iv(e,j);else if(l==="fv1")k.uniform1fv(e,j);else if(l==="fv")k.uniform3fv(e,j);else if(l==="v2v"){if(c._array===void 0)c._array=new Float32Array(2*j.length);l=0;for(m=j.length;l<m;l++){n=l*2;c._array[n]=j[l].x;c._array[n+1]=j[l].y}k.uniform2fv(e,c._array)}else if(l==="v3v"){if(c._array===void 0)c._array=new Float32Array(3*j.length);l=0;for(m=j.length;l<m;l++){n=l*3;c._array[n]=j[l].x;
+c._array[n+1]=j[l].y;c._array[n+2]=j[l].z}k.uniform3fv(e,c._array)}else if(l==="v4v"){if(c._array===void 0)c._array=new Float32Array(4*j.length);l=0;for(m=j.length;l<m;l++){n=l*4;c._array[n]=j[l].x;c._array[n+1]=j[l].y;c._array[n+2]=j[l].z;c._array[n+3]=j[l].w}k.uniform4fv(e,c._array)}else if(l==="m4"){if(c._array===void 0)c._array=new Float32Array(16);j.flattenToArray(c._array);k.uniformMatrix4fv(e,false,c._array)}else if(l==="m4v"){if(c._array===void 0)c._array=new Float32Array(16*j.length);l=0;
+for(m=j.length;l<m;l++)j[l].flattenToArrayOffset(c._array,l*16);k.uniformMatrix4fv(e,false,c._array)}else if(l==="t"){n=j;j=v();k.uniform1i(e,j);if(n)if(n.image instanceof Array&&n.image.length===6){c=n;e=j;if(c.image.length===6)if(c.needsUpdate){if(!c.image.__webglTextureCube)c.image.__webglTextureCube=k.createTexture();k.activeTexture(k.TEXTURE0+e);k.bindTexture(k.TEXTURE_CUBE_MAP,c.image.__webglTextureCube);k.pixelStorei(k.UNPACK_FLIP_Y_WEBGL,c.flipY);e=[];for(j=0;j<6;j++)if(O.autoScaleCubemaps){l=
+e;m=j;n=c.image[j];t=Sc;if(!(n.width<=t&&n.height<=t)){u=Math.max(n.width,n.height);r=Math.floor(n.width*t/u);t=Math.floor(n.height*t/u);u=document.createElement("canvas");u.width=r;u.height=t;u.getContext("2d").drawImage(n,0,0,n.width,n.height,0,0,r,t);n=u}l[m]=n}else e[j]=c.image[j];j=e[0];l=(j.width&j.width-1)===0&&(j.height&j.height-1)===0;m=H(c.format);n=H(c.type);I(k.TEXTURE_CUBE_MAP,c,l);for(j=0;j<6;j++)k.texImage2D(k.TEXTURE_CUBE_MAP_POSITIVE_X+j,0,m,m,n,e[j]);c.generateMipmaps&&l&&k.generateMipmap(k.TEXTURE_CUBE_MAP);
+c.needsUpdate=false;if(c.onUpdate)c.onUpdate()}else{k.activeTexture(k.TEXTURE0+e);k.bindTexture(k.TEXTURE_CUBE_MAP,c.image.__webglTextureCube)}}else if(n instanceof THREE.WebGLRenderTargetCube){c=n;k.activeTexture(k.TEXTURE0+j);k.bindTexture(k.TEXTURE_CUBE_MAP,c.__webglTexture)}else O.setTexture(n,j)}else if(l==="tv"){if(c._array===void 0)c._array=[];l=0;for(m=c.value.length;l<m;l++)c._array[l]=v();k.uniform1iv(e,c._array);l=0;for(m=c.value.length;l<m;l++){n=c.value[l];j=c._array[l];n&&O.setTexture(n,
 j)}}}if((d instanceof THREE.ShaderMaterial||d instanceof THREE.MeshPhongMaterial||d.envMap)&&h.cameraPosition!==null){b=a.matrixWorld.getPosition();k.uniform3f(h.cameraPosition,b.x,b.y,b.z)}(d instanceof THREE.MeshPhongMaterial||d instanceof THREE.MeshLambertMaterial||d instanceof THREE.ShaderMaterial||d.skinning)&&h.viewMatrix!==null&&k.uniformMatrix4fv(h.viewMatrix,false,a._viewMatrixArray)}k.uniformMatrix4fv(h.modelViewMatrix,false,f._modelViewMatrix.elements);h.normalMatrix&&k.uniformMatrix3fv(h.normalMatrix,
 false,f._normalMatrix.elements);h.modelMatrix!==null&&k.uniformMatrix4fv(h.modelMatrix,false,f.matrixWorld.elements);return g}function v(){var a=oa;a>=Dc&&console.warn("Trying to use "+a+" texture units while this GPU supports only "+Dc);oa=oa+1;return a}function s(a,b){a._modelViewMatrix.multiply(b.matrixWorldInverse,a.matrixWorld);a._normalMatrix.getInverse(a._modelViewMatrix);a._normalMatrix.transpose()}function A(a,b,c,d){a[b]=c.r*c.r*d;a[b+1]=c.g*c.g*d;a[b+2]=c.b*c.b*d}function y(a,b,c,d){a[b]=
 c.r*d;a[b+1]=c.g*d;a[b+2]=c.b*d}function B(a,b,c){if(pb!==a){a?k.enable(k.POLYGON_OFFSET_FILL):k.disable(k.POLYGON_OFFSET_FILL);pb=a}if(a&&(wb!==b||eb!==c)){k.polygonOffset(b,c);wb=b;eb=c}}function G(a){for(var a=a.split("\n"),b=0,c=a.length;b<c;b++)a[b]=b+1+": "+a[b];return a.join("\n")}function x(a,b){var c;a==="fragment"?c=k.createShader(k.FRAGMENT_SHADER):a==="vertex"&&(c=k.createShader(k.VERTEX_SHADER));k.shaderSource(c,b);k.compileShader(c);if(!k.getShaderParameter(c,k.COMPILE_STATUS)){console.error(k.getShaderInfoLog(c));
@@ -373,7 +373,7 @@ true;this.renderPluginsPre=[];this.renderPluginsPost=[];this.info={memory:{progr
 point:{length:0,colors:[],positions:[],distances:[]},spot:{length:0,colors:[],positions:[],distances:[],directions:[],angles:[],exponents:[]},hemi:{length:0,skyColors:[],groundColors:[],positions:[]}},k,Pb,yb;try{if(!(k=M.getContext("experimental-webgl",{alpha:E,premultipliedAlpha:P,antialias:N,stencil:Q,preserveDrawingBuffer:Z})))throw"Error creating WebGL context.";}catch(Rc){console.error(Rc)}a=k.getExtension("OES_texture_float");E=k.getExtension("OES_standard_derivatives");Pb=k.getExtension("EXT_texture_filter_anisotropic")||
 k.getExtension("MOZ_EXT_texture_filter_anisotropic")||k.getExtension("WEBKIT_EXT_texture_filter_anisotropic");yb=k.getExtension("WEBGL_compressed_texture_s3tc")||k.getExtension("MOZ_WEBGL_compressed_texture_s3tc")||k.getExtension("WEBKIT_WEBGL_compressed_texture_s3tc");a||console.log("THREE.WebGLRenderer: Float textures not supported.");E||console.log("THREE.WebGLRenderer: Standard derivatives not supported.");Pb||console.log("THREE.WebGLRenderer: Anisotropic texture filtering not supported.");yb||
 console.log("THREE.WebGLRenderer: S3TC compressed textures not supported.");k.clearColor(0,0,0,1);k.clearDepth(1);k.clearStencil(0);k.enable(k.DEPTH_TEST);k.depthFunc(k.LEQUAL);k.frontFace(k.CCW);k.cullFace(k.BACK);k.enable(k.CULL_FACE);k.enable(k.BLEND);k.blendEquation(k.FUNC_ADD);k.blendFunc(k.SRC_ALPHA,k.ONE_MINUS_SRC_ALPHA);k.clearColor(J.r,J.g,J.b,K);this.context=k;var Dc=k.getParameter(k.MAX_TEXTURE_IMAGE_UNITS),E=k.getParameter(k.MAX_VERTEX_TEXTURE_IMAGE_UNITS);k.getParameter(k.MAX_TEXTURE_SIZE);
-var Sc=k.getParameter(k.MAX_CUBE_MAP_TEXTURE_SIZE),rc=Pb?k.getParameter(Pb.MAX_TEXTURE_MAX_ANISOTROPY_EXT):0,dc=E>0,hc=dc&&a;yb&&k.getParameter(k.COMPRESSED_TEXTURE_FORMATS);this.getContext=function(){return k};this.supportsVertexTextures=function(){return dc};this.getMaxAnisotropy=function(){return rc};this.setSize=function(a,b){M.width=a;M.height=b;this.setViewport(0,0,M.width,M.height)};this.setViewport=function(a,b,c,d){xa=a!==void 0?a:0;xb=b!==void 0?b:0;Fa=c!==void 0?c:M.width;Za=d!==void 0?
+var Sc=k.getParameter(k.MAX_CUBE_MAP_TEXTURE_SIZE),rc=Pb?k.getParameter(Pb.MAX_TEXTURE_MAX_ANISOTROPY_EXT):0,hc=E>0,dc=hc&&a;yb&&k.getParameter(k.COMPRESSED_TEXTURE_FORMATS);this.getContext=function(){return k};this.supportsVertexTextures=function(){return hc};this.getMaxAnisotropy=function(){return rc};this.setSize=function(a,b){M.width=a;M.height=b;this.setViewport(0,0,M.width,M.height)};this.setViewport=function(a,b,c,d){xa=a!==void 0?a:0;xb=b!==void 0?b:0;Fa=c!==void 0?c:M.width;Za=d!==void 0?
 d:M.height;k.viewport(xa,xb,Fa,Za)};this.setScissor=function(a,b,c,d){k.scissor(a,b,c,d)};this.enableScissorTest=function(a){a?k.enable(k.SCISSOR_TEST):k.disable(k.SCISSOR_TEST)};this.setClearColorHex=function(a,b){J.setHex(a);K=b;k.clearColor(J.r,J.g,J.b,K)};this.setClearColor=function(a,b){J.copy(a);K=b;k.clearColor(J.r,J.g,J.b,K)};this.getClearColor=function(){return J};this.getClearAlpha=function(){return K};this.clear=function(a,b,c){var d=0;if(a===void 0||a)d=d|k.COLOR_BUFFER_BIT;if(b===void 0||
 b)d=d|k.DEPTH_BUFFER_BIT;if(c===void 0||c)d=d|k.STENCIL_BUFFER_BIT;k.clear(d)};this.clearTarget=function(a,b,c,d){this.setRenderTarget(a);this.clear(b,c,d)};this.addPostPlugin=function(a){a.init(this);this.renderPluginsPost.push(a)};this.addPrePlugin=function(a){a.init(this);this.renderPluginsPre.push(a)};this.deallocateObject=function(a){if(a.__webglInit){a.__webglInit=false;delete a._modelViewMatrix;delete a._normalMatrix;delete a._normalMatrixArray;delete a._modelViewMatrixArray;delete a._modelMatrixArray;
 if(a instanceof THREE.Mesh)for(var b in a.geometry.geometryGroups){var c=a.geometry.geometryGroups[b];k.deleteBuffer(c.__webglVertexBuffer);k.deleteBuffer(c.__webglNormalBuffer);k.deleteBuffer(c.__webglTangentBuffer);k.deleteBuffer(c.__webglColorBuffer);k.deleteBuffer(c.__webglUVBuffer);k.deleteBuffer(c.__webglUV2Buffer);k.deleteBuffer(c.__webglSkinIndicesBuffer);k.deleteBuffer(c.__webglSkinWeightsBuffer);k.deleteBuffer(c.__webglFaceBuffer);k.deleteBuffer(c.__webglLineBuffer);var d=void 0,f=void 0;
@@ -381,8 +381,8 @@ if(c.numMorphTargets){d=0;for(f=c.numMorphTargets;d<f;d++)k.deleteBuffer(c.__web
 THREE.Line){a=a.geometry;k.deleteBuffer(a.__webglVertexBuffer);k.deleteBuffer(a.__webglColorBuffer);O.info.memory.geometries--}else if(a instanceof THREE.ParticleSystem){a=a.geometry;k.deleteBuffer(a.__webglVertexBuffer);k.deleteBuffer(a.__webglColorBuffer);O.info.memory.geometries--}}};this.deallocateTexture=function(a){if(a.__webglInit){a.__webglInit=false;k.deleteTexture(a.__webglTexture);O.info.memory.textures--}};this.deallocateRenderTarget=function(a){if(a&&a.__webglTexture){k.deleteTexture(a.__webglTexture);
 if(a instanceof THREE.WebGLRenderTargetCube)for(var b=0;b<6;b++){k.deleteFramebuffer(a.__webglFramebuffer[b]);k.deleteRenderbuffer(a.__webglRenderbuffer[b])}else{k.deleteFramebuffer(a.__webglFramebuffer);k.deleteRenderbuffer(a.__webglRenderbuffer)}}};this.deallocateMaterial=function(a){var b=a.program;if(b){a.program=void 0;var c,d,f=false,a=0;for(c=qa.length;a<c;a++){d=qa[a];if(d.program===b){d.usedTimes--;d.usedTimes===0&&(f=true);break}}if(f){f=[];a=0;for(c=qa.length;a<c;a++){d=qa[a];d.program!==
 b&&f.push(d)}qa=f;k.deleteProgram(b);O.info.memory.programs--}}};this.updateShadowMap=function(a,b){ca=null;W=V=Xa=Ma=Ha=-1;gb=true;Ca=sa=-1;this.shadowMapPlugin.update(a,b)};this.renderBufferImmediate=function(a,b,c){if(a.hasPositions&&!a.__webglVertexBuffer)a.__webglVertexBuffer=k.createBuffer();if(a.hasNormals&&!a.__webglNormalBuffer)a.__webglNormalBuffer=k.createBuffer();if(a.hasUvs&&!a.__webglUvBuffer)a.__webglUvBuffer=k.createBuffer();if(a.hasColors&&!a.__webglColorBuffer)a.__webglColorBuffer=
-k.createBuffer();if(a.hasPositions){k.bindBuffer(k.ARRAY_BUFFER,a.__webglVertexBuffer);k.bufferData(k.ARRAY_BUFFER,a.positionArray,k.DYNAMIC_DRAW);k.enableVertexAttribArray(b.attributes.position);k.vertexAttribPointer(b.attributes.position,3,k.FLOAT,false,0,0)}if(a.hasNormals){k.bindBuffer(k.ARRAY_BUFFER,a.__webglNormalBuffer);if(c.shading===THREE.FlatShading){var d,f,e,g,h,i,j,l,o,m,n,q=a.count*3;for(n=0;n<q;n=n+9){m=a.normalArray;d=m[n];f=m[n+1];e=m[n+2];g=m[n+3];i=m[n+4];l=m[n+5];h=m[n+6];j=m[n+
-7];o=m[n+8];d=(d+g+h)/3;f=(f+i+j)/3;e=(e+l+o)/3;m[n]=d;m[n+1]=f;m[n+2]=e;m[n+3]=d;m[n+4]=f;m[n+5]=e;m[n+6]=d;m[n+7]=f;m[n+8]=e}}k.bufferData(k.ARRAY_BUFFER,a.normalArray,k.DYNAMIC_DRAW);k.enableVertexAttribArray(b.attributes.normal);k.vertexAttribPointer(b.attributes.normal,3,k.FLOAT,false,0,0)}if(a.hasUvs&&c.map){k.bindBuffer(k.ARRAY_BUFFER,a.__webglUvBuffer);k.bufferData(k.ARRAY_BUFFER,a.uvArray,k.DYNAMIC_DRAW);k.enableVertexAttribArray(b.attributes.uv);k.vertexAttribPointer(b.attributes.uv,2,k.FLOAT,
+k.createBuffer();if(a.hasPositions){k.bindBuffer(k.ARRAY_BUFFER,a.__webglVertexBuffer);k.bufferData(k.ARRAY_BUFFER,a.positionArray,k.DYNAMIC_DRAW);k.enableVertexAttribArray(b.attributes.position);k.vertexAttribPointer(b.attributes.position,3,k.FLOAT,false,0,0)}if(a.hasNormals){k.bindBuffer(k.ARRAY_BUFFER,a.__webglNormalBuffer);if(c.shading===THREE.FlatShading){var d,f,e,g,h,i,j,l,n,m,o,q=a.count*3;for(o=0;o<q;o=o+9){m=a.normalArray;d=m[o];f=m[o+1];e=m[o+2];g=m[o+3];i=m[o+4];l=m[o+5];h=m[o+6];j=m[o+
+7];n=m[o+8];d=(d+g+h)/3;f=(f+i+j)/3;e=(e+l+n)/3;m[o]=d;m[o+1]=f;m[o+2]=e;m[o+3]=d;m[o+4]=f;m[o+5]=e;m[o+6]=d;m[o+7]=f;m[o+8]=e}}k.bufferData(k.ARRAY_BUFFER,a.normalArray,k.DYNAMIC_DRAW);k.enableVertexAttribArray(b.attributes.normal);k.vertexAttribPointer(b.attributes.normal,3,k.FLOAT,false,0,0)}if(a.hasUvs&&c.map){k.bindBuffer(k.ARRAY_BUFFER,a.__webglUvBuffer);k.bufferData(k.ARRAY_BUFFER,a.uvArray,k.DYNAMIC_DRAW);k.enableVertexAttribArray(b.attributes.uv);k.vertexAttribPointer(b.attributes.uv,2,k.FLOAT,
 false,0,0)}if(a.hasColors&&c.vertexColors!==THREE.NoColors){k.bindBuffer(k.ARRAY_BUFFER,a.__webglColorBuffer);k.bufferData(k.ARRAY_BUFFER,a.colorArray,k.DYNAMIC_DRAW);k.enableVertexAttribArray(b.attributes.color);k.vertexAttribPointer(b.attributes.color,3,k.FLOAT,false,0,0)}k.drawArrays(k.TRIANGLES,0,a.count);a.count=0};this.renderBufferDirect=function(a,b,c,d,f,e){if(d.visible!==false){c=u(a,b,c,d,e);a=c.attributes;b=false;d=f.id*16777215+c.id*2+(d.wireframe?1:0);if(d!==V){V=d;b=true}if(e instanceof
 THREE.Mesh){e=f.offsets;e.length>1&&(b=true);d=0;for(c=e.length;d<c;++d){var g=e[d].index;if(b){var h=f.attributes.position,i=h.itemSize;k.bindBuffer(k.ARRAY_BUFFER,h.buffer);k.vertexAttribPointer(a.position,i,k.FLOAT,false,0,g*i*4);h=f.attributes.normal;if(a.normal>=0&&h){i=h.itemSize;k.bindBuffer(k.ARRAY_BUFFER,h.buffer);k.vertexAttribPointer(a.normal,i,k.FLOAT,false,0,g*i*4)}h=f.attributes.uv;if(a.uv>=0&&h)if(h.buffer){i=h.itemSize;k.bindBuffer(k.ARRAY_BUFFER,h.buffer);k.vertexAttribPointer(a.uv,
 i,k.FLOAT,false,0,g*i*4);k.enableVertexAttribArray(a.uv)}else k.disableVertexAttribArray(a.uv);i=f.attributes.color;if(a.color>=0&&i){var j=i.itemSize;k.bindBuffer(k.ARRAY_BUFFER,i.buffer);k.vertexAttribPointer(a.color,j,k.FLOAT,false,0,g*j*4)}h=f.attributes.tangent;if(a.tangent>=0&&h){i=h.itemSize;k.bindBuffer(k.ARRAY_BUFFER,h.buffer);k.vertexAttribPointer(a.tangent,i,k.FLOAT,false,0,g*i*4)}k.bindBuffer(k.ELEMENT_ARRAY_BUFFER,f.attributes.index.buffer)}k.drawElements(k.TRIANGLES,e[d].count,k.UNSIGNED_SHORT,
@@ -449,19 +449,19 @@ bc.__webglColorBuffer);k.bufferData(k.ARRAY_BUFFER,Lc,bd)}}da.verticesNeedUpdate
 db=void 0,wa=void 0;if(Ub.verticesNeedUpdate){for(Bc=0;Bc<md;Bc++){Mc=ed[Bc];Ba=Bc*3;Oc[Ba]=Mc.x;Oc[Ba+1]=Mc.y;Oc[Ba+2]=Mc.z}k.bindBuffer(k.ARRAY_BUFFER,Ub.__webglVertexBuffer);k.bufferData(k.ARRAY_BUFFER,Oc,Zc)}if(od){for(Cc=0;Cc<nd;Cc++){Nc=fd[Cc];Ba=Cc*3;Pc[Ba]=Nc.r;Pc[Ba+1]=Nc.g;Pc[Ba+2]=Nc.b}k.bindBuffer(k.ARRAY_BUFFER,Ub.__webglColorBuffer);k.bufferData(k.ARRAY_BUFFER,Pc,Zc)}if($c){Qc=0;for(gd=$c.length;Qc<gd;Qc++){wa=$c[Qc];if(wa.needsUpdate&&(wa.boundTo===void 0||wa.boundTo==="vertices")){Ba=
 0;pc=wa.value.length;if(wa.size===1)for(Sa=0;Sa<pc;Sa++)wa.array[Sa]=wa.value[Sa];else if(wa.size===2)for(Sa=0;Sa<pc;Sa++){db=wa.value[Sa];wa.array[Ba]=db.x;wa.array[Ba+1]=db.y;Ba=Ba+2}else if(wa.size===3)if(wa.type==="c")for(Sa=0;Sa<pc;Sa++){db=wa.value[Sa];wa.array[Ba]=db.r;wa.array[Ba+1]=db.g;wa.array[Ba+2]=db.b;Ba=Ba+3}else for(Sa=0;Sa<pc;Sa++){db=wa.value[Sa];wa.array[Ba]=db.x;wa.array[Ba+1]=db.y;wa.array[Ba+2]=db.z;Ba=Ba+3}else if(wa.size===4)for(Sa=0;Sa<pc;Sa++){db=wa.value[Sa];wa.array[Ba]=
 db.x;wa.array[Ba+1]=db.y;wa.array[Ba+2]=db.z;wa.array[Ba+3]=db.w;Ba=Ba+4}k.bindBuffer(k.ARRAY_BUFFER,wa.buffer);k.bufferData(k.ARRAY_BUFFER,wa.array,Zc)}}}}da.verticesNeedUpdate=false;da.colorsNeedUpdate=false;bb.attributes&&n(bb)}else if(ub instanceof THREE.ParticleSystem)if(da instanceof THREE.BufferGeometry){(da.verticesNeedUpdate||da.colorsNeedUpdate)&&h(da,k.DYNAMIC_DRAW,!da.dynamic);da.verticesNeedUpdate=false;da.colorsNeedUpdate=false}else{bb=c(ub,ab);$a=bb.attributes&&q(bb);(da.verticesNeedUpdate||
-da.colorsNeedUpdate||ub.sortParticles||$a)&&g(da,k.DYNAMIC_DRAW,ub);da.verticesNeedUpdate=false;da.colorsNeedUpdate=false;bb.attributes&&n(bb)}}};this.initMaterial=function(a,b,c,d){var f,e,g,h,i,j,l,m,o;a instanceof THREE.MeshDepthMaterial?o="depth":a instanceof THREE.MeshNormalMaterial?o="normal":a instanceof THREE.MeshBasicMaterial?o="basic":a instanceof THREE.MeshLambertMaterial?o="lambert":a instanceof THREE.MeshPhongMaterial?o="phong":a instanceof THREE.LineBasicMaterial?o="basic":a instanceof
-THREE.ParticleBasicMaterial&&(o="particle_basic");if(o){var n=THREE.ShaderLib[o];a.uniforms=THREE.UniformsUtils.clone(n.uniforms);a.vertexShader=n.vertexShader;a.fragmentShader=n.fragmentShader}var q,p;q=h=e=f=n=0;for(g=b.length;q<g;q++){p=b[q];if(!p.onlyShadow){p instanceof THREE.DirectionalLight&&h++;p instanceof THREE.PointLight&&e++;p instanceof THREE.SpotLight&&f++;p instanceof THREE.HemisphereLight&&n++}}if(e+f+h+n<=ea){q=h;g=f}else{q=Math.ceil(ea*h/(e+h));g=e=ea-q;n=q}f=q;h=n;n=m=0;for(q=b.length;n<
-q;n++){p=b[n];if(p.castShadow){p instanceof THREE.SpotLight&&m++;p instanceof THREE.DirectionalLight&&!p.shadowCascade&&m++}}if(hc&&d&&d.useVertexTexture)l=1024;else{b=k.getParameter(k.MAX_VERTEX_UNIFORM_VECTORS);b=Math.floor((b-20)/4);if(d!==void 0&&d instanceof THREE.SkinnedMesh){b=Math.min(d.bones.length,b);b<d.bones.length&&console.warn("WebGLRenderer: too many bones - "+d.bones.length+", this GPU supports just "+b+" (try OpenGL instead of ANGLE)")}l=b}var s;a:{p=a.fragmentShader;q=a.vertexShader;
-var n=a.uniforms,b=a.attributes,c={map:!!a.map,envMap:!!a.envMap,lightMap:!!a.lightMap,bumpMap:!!a.bumpMap,specularMap:!!a.specularMap,vertexColors:a.vertexColors,fog:c,useFog:a.fog,sizeAttenuation:a.sizeAttenuation,skinning:a.skinning,maxBones:l,useVertexTexture:hc&&d&&d.useVertexTexture,boneTextureWidth:d&&d.boneTextureWidth,boneTextureHeight:d&&d.boneTextureHeight,morphTargets:a.morphTargets,morphNormals:a.morphNormals,maxMorphTargets:this.maxMorphTargets,maxMorphNormals:this.maxMorphNormals,maxDirLights:f,
-maxPointLights:e,maxSpotLights:g,maxHemiLights:h,maxShadows:m,shadowMapEnabled:this.shadowMapEnabled&&d.receiveShadow,shadowMapSoft:this.shadowMapSoft,shadowMapDebug:this.shadowMapDebug,shadowMapCascade:this.shadowMapCascade,alphaTest:a.alphaTest,metal:a.metal,perPixel:a.perPixel,wrapAround:a.wrapAround,doubleSided:a.side===THREE.DoubleSide,flipSided:a.side===THREE.BackSide},r,d=[];if(o)d.push(o);else{d.push(p);d.push(q)}for(r in c){d.push(r);d.push(c[r])}o=d.join();r=0;for(d=qa.length;r<d;r++){f=
-qa[r];if(f.code===o){f.usedTimes++;s=f.program;break a}}r=k.createProgram();d=["precision "+C+" float;",dc?"#define VERTEX_TEXTURES":"",O.gammaInput?"#define GAMMA_INPUT":"",O.gammaOutput?"#define GAMMA_OUTPUT":"",O.physicallyBasedShading?"#define PHYSICALLY_BASED_SHADING":"","#define MAX_DIR_LIGHTS "+c.maxDirLights,"#define MAX_POINT_LIGHTS "+c.maxPointLights,"#define MAX_SPOT_LIGHTS "+c.maxSpotLights,"#define MAX_HEMI_LIGHTS "+c.maxHemiLights,"#define MAX_SHADOWS "+c.maxShadows,"#define MAX_BONES "+
+da.colorsNeedUpdate||ub.sortParticles||$a)&&g(da,k.DYNAMIC_DRAW,ub);da.verticesNeedUpdate=false;da.colorsNeedUpdate=false;bb.attributes&&n(bb)}}};this.initMaterial=function(a,b,c,d){var f,e,g,h,i,j,l,m,n;a instanceof THREE.MeshDepthMaterial?n="depth":a instanceof THREE.MeshNormalMaterial?n="normal":a instanceof THREE.MeshBasicMaterial?n="basic":a instanceof THREE.MeshLambertMaterial?n="lambert":a instanceof THREE.MeshPhongMaterial?n="phong":a instanceof THREE.LineBasicMaterial?n="basic":a instanceof
+THREE.ParticleBasicMaterial&&(n="particle_basic");if(n){var o=THREE.ShaderLib[n];a.uniforms=THREE.UniformsUtils.clone(o.uniforms);a.vertexShader=o.vertexShader;a.fragmentShader=o.fragmentShader}var q,p;q=h=e=f=o=0;for(g=b.length;q<g;q++){p=b[q];if(!p.onlyShadow){p instanceof THREE.DirectionalLight&&h++;p instanceof THREE.PointLight&&e++;p instanceof THREE.SpotLight&&f++;p instanceof THREE.HemisphereLight&&o++}}if(e+f+h+o<=ea){q=h;g=f}else{q=Math.ceil(ea*h/(e+h));g=e=ea-q;o=q}f=q;h=o;o=m=0;for(q=b.length;o<
+q;o++){p=b[o];if(p.castShadow){p instanceof THREE.SpotLight&&m++;p instanceof THREE.DirectionalLight&&!p.shadowCascade&&m++}}if(dc&&d&&d.useVertexTexture)l=1024;else{b=k.getParameter(k.MAX_VERTEX_UNIFORM_VECTORS);b=Math.floor((b-20)/4);if(d!==void 0&&d instanceof THREE.SkinnedMesh){b=Math.min(d.bones.length,b);b<d.bones.length&&console.warn("WebGLRenderer: too many bones - "+d.bones.length+", this GPU supports just "+b+" (try OpenGL instead of ANGLE)")}l=b}var s;a:{p=a.fragmentShader;q=a.vertexShader;
+var o=a.uniforms,b=a.attributes,c={map:!!a.map,envMap:!!a.envMap,lightMap:!!a.lightMap,bumpMap:!!a.bumpMap,specularMap:!!a.specularMap,vertexColors:a.vertexColors,fog:c,useFog:a.fog,sizeAttenuation:a.sizeAttenuation,skinning:a.skinning,maxBones:l,useVertexTexture:dc&&d&&d.useVertexTexture,boneTextureWidth:d&&d.boneTextureWidth,boneTextureHeight:d&&d.boneTextureHeight,morphTargets:a.morphTargets,morphNormals:a.morphNormals,maxMorphTargets:this.maxMorphTargets,maxMorphNormals:this.maxMorphNormals,maxDirLights:f,
+maxPointLights:e,maxSpotLights:g,maxHemiLights:h,maxShadows:m,shadowMapEnabled:this.shadowMapEnabled&&d.receiveShadow,shadowMapSoft:this.shadowMapSoft,shadowMapDebug:this.shadowMapDebug,shadowMapCascade:this.shadowMapCascade,alphaTest:a.alphaTest,metal:a.metal,perPixel:a.perPixel,wrapAround:a.wrapAround,doubleSided:a.side===THREE.DoubleSide,flipSided:a.side===THREE.BackSide},r,d=[];if(n)d.push(n);else{d.push(p);d.push(q)}for(r in c){d.push(r);d.push(c[r])}n=d.join();r=0;for(d=qa.length;r<d;r++){f=
+qa[r];if(f.code===n){f.usedTimes++;s=f.program;break a}}r=k.createProgram();d=["precision "+C+" float;",hc?"#define VERTEX_TEXTURES":"",O.gammaInput?"#define GAMMA_INPUT":"",O.gammaOutput?"#define GAMMA_OUTPUT":"",O.physicallyBasedShading?"#define PHYSICALLY_BASED_SHADING":"","#define MAX_DIR_LIGHTS "+c.maxDirLights,"#define MAX_POINT_LIGHTS "+c.maxPointLights,"#define MAX_SPOT_LIGHTS "+c.maxSpotLights,"#define MAX_HEMI_LIGHTS "+c.maxHemiLights,"#define MAX_SHADOWS "+c.maxShadows,"#define MAX_BONES "+
 c.maxBones,c.map?"#define USE_MAP":"",c.envMap?"#define USE_ENVMAP":"",c.lightMap?"#define USE_LIGHTMAP":"",c.bumpMap?"#define USE_BUMPMAP":"",c.specularMap?"#define USE_SPECULARMAP":"",c.vertexColors?"#define USE_COLOR":"",c.skinning?"#define USE_SKINNING":"",c.useVertexTexture?"#define BONE_TEXTURE":"",c.boneTextureWidth?"#define N_BONE_PIXEL_X "+c.boneTextureWidth.toFixed(1):"",c.boneTextureHeight?"#define N_BONE_PIXEL_Y "+c.boneTextureHeight.toFixed(1):"",c.morphTargets?"#define USE_MORPHTARGETS":
 "",c.morphNormals?"#define USE_MORPHNORMALS":"",c.perPixel?"#define PHONG_PER_PIXEL":"",c.wrapAround?"#define WRAP_AROUND":"",c.doubleSided?"#define DOUBLE_SIDED":"",c.flipSided?"#define FLIP_SIDED":"",c.shadowMapEnabled?"#define USE_SHADOWMAP":"",c.shadowMapSoft?"#define SHADOWMAP_SOFT":"",c.shadowMapDebug?"#define SHADOWMAP_DEBUG":"",c.shadowMapCascade?"#define SHADOWMAP_CASCADE":"",c.sizeAttenuation?"#define USE_SIZEATTENUATION":"","uniform mat4 modelMatrix;\nuniform mat4 modelViewMatrix;\nuniform mat4 projectionMatrix;\nuniform mat4 viewMatrix;\nuniform mat3 normalMatrix;\nuniform vec3 cameraPosition;\nattribute vec3 position;\nattribute vec3 normal;\nattribute vec2 uv;\nattribute vec2 uv2;\n#ifdef USE_COLOR\nattribute vec3 color;\n#endif\n#ifdef USE_MORPHTARGETS\nattribute vec3 morphTarget0;\nattribute vec3 morphTarget1;\nattribute vec3 morphTarget2;\nattribute vec3 morphTarget3;\n#ifdef USE_MORPHNORMALS\nattribute vec3 morphNormal0;\nattribute vec3 morphNormal1;\nattribute vec3 morphNormal2;\nattribute vec3 morphNormal3;\n#else\nattribute vec3 morphTarget4;\nattribute vec3 morphTarget5;\nattribute vec3 morphTarget6;\nattribute vec3 morphTarget7;\n#endif\n#endif\n#ifdef USE_SKINNING\nattribute vec4 skinIndex;\nattribute vec4 skinWeight;\n#endif\n"].join("\n");
 f=["precision "+C+" float;",c.bumpMap?"#extension GL_OES_standard_derivatives : enable":"","#define MAX_DIR_LIGHTS "+c.maxDirLights,"#define MAX_POINT_LIGHTS "+c.maxPointLights,"#define MAX_SPOT_LIGHTS "+c.maxSpotLights,"#define MAX_HEMI_LIGHTS "+c.maxHemiLights,"#define MAX_SHADOWS "+c.maxShadows,c.alphaTest?"#define ALPHATEST "+c.alphaTest:"",O.gammaInput?"#define GAMMA_INPUT":"",O.gammaOutput?"#define GAMMA_OUTPUT":"",O.physicallyBasedShading?"#define PHYSICALLY_BASED_SHADING":"",c.useFog&&c.fog?
 "#define USE_FOG":"",c.useFog&&c.fog instanceof THREE.FogExp2?"#define FOG_EXP2":"",c.map?"#define USE_MAP":"",c.envMap?"#define USE_ENVMAP":"",c.lightMap?"#define USE_LIGHTMAP":"",c.bumpMap?"#define USE_BUMPMAP":"",c.specularMap?"#define USE_SPECULARMAP":"",c.vertexColors?"#define USE_COLOR":"",c.metal?"#define METAL":"",c.perPixel?"#define PHONG_PER_PIXEL":"",c.wrapAround?"#define WRAP_AROUND":"",c.doubleSided?"#define DOUBLE_SIDED":"",c.flipSided?"#define FLIP_SIDED":"",c.shadowMapEnabled?"#define USE_SHADOWMAP":
 "",c.shadowMapSoft?"#define SHADOWMAP_SOFT":"",c.shadowMapDebug?"#define SHADOWMAP_DEBUG":"",c.shadowMapCascade?"#define SHADOWMAP_CASCADE":"","uniform mat4 viewMatrix;\nuniform vec3 cameraPosition;\n"].join("\n");f=x("fragment",f+p);d=x("vertex",d+q);k.attachShader(r,d);k.attachShader(r,f);k.linkProgram(r);k.getProgramParameter(r,k.LINK_STATUS)||console.error("Could not initialise shader\nVALIDATE_STATUS: "+k.getProgramParameter(r,k.VALIDATE_STATUS)+", gl error ["+k.getError()+"]");k.deleteShader(f);
-k.deleteShader(d);r.uniforms={};r.attributes={};var t,d=["viewMatrix","modelViewMatrix","projectionMatrix","normalMatrix","modelMatrix","cameraPosition","morphTargetInfluences"];c.useVertexTexture?d.push("boneTexture"):d.push("boneGlobalMatrices");for(t in n)d.push(t);t=d;d=0;for(n=t.length;d<n;d++){f=t[d];r.uniforms[f]=k.getUniformLocation(r,f)}d=["position","normal","uv","uv2","tangent","color","skinIndex","skinWeight"];for(t=0;t<c.maxMorphTargets;t++)d.push("morphTarget"+t);for(t=0;t<c.maxMorphNormals;t++)d.push("morphNormal"+
-t);for(s in b)d.push(s);s=d;t=0;for(c=s.length;t<c;t++){d=s[t];r.attributes[d]=k.getAttribLocation(r,d)}r.id=ua++;qa.push({program:r,code:o,usedTimes:1});O.info.memory.programs=qa.length;s=r}a.program=s;s=a.program.attributes;s.position>=0&&k.enableVertexAttribArray(s.position);s.color>=0&&k.enableVertexAttribArray(s.color);s.normal>=0&&k.enableVertexAttribArray(s.normal);s.tangent>=0&&k.enableVertexAttribArray(s.tangent);if(a.skinning&&s.skinIndex>=0&&s.skinWeight>=0){k.enableVertexAttribArray(s.skinIndex);
+k.deleteShader(d);r.uniforms={};r.attributes={};var t,d=["viewMatrix","modelViewMatrix","projectionMatrix","normalMatrix","modelMatrix","cameraPosition","morphTargetInfluences"];c.useVertexTexture?d.push("boneTexture"):d.push("boneGlobalMatrices");for(t in o)d.push(t);t=d;d=0;for(o=t.length;d<o;d++){f=t[d];r.uniforms[f]=k.getUniformLocation(r,f)}d=["position","normal","uv","uv2","tangent","color","skinIndex","skinWeight"];for(t=0;t<c.maxMorphTargets;t++)d.push("morphTarget"+t);for(t=0;t<c.maxMorphNormals;t++)d.push("morphNormal"+
+t);for(s in b)d.push(s);s=d;t=0;for(c=s.length;t<c;t++){d=s[t];r.attributes[d]=k.getAttribLocation(r,d)}r.id=ua++;qa.push({program:r,code:n,usedTimes:1});O.info.memory.programs=qa.length;s=r}a.program=s;s=a.program.attributes;s.position>=0&&k.enableVertexAttribArray(s.position);s.color>=0&&k.enableVertexAttribArray(s.color);s.normal>=0&&k.enableVertexAttribArray(s.normal);s.tangent>=0&&k.enableVertexAttribArray(s.tangent);if(a.skinning&&s.skinIndex>=0&&s.skinWeight>=0){k.enableVertexAttribArray(s.skinIndex);
 k.enableVertexAttribArray(s.skinWeight)}if(a.attributes)for(j in a.attributes)s[j]!==void 0&&s[j]>=0&&k.enableVertexAttribArray(s[j]);if(a.morphTargets){a.numSupportedMorphTargets=0;r="morphTarget";for(j=0;j<this.maxMorphTargets;j++){t=r+j;if(s[t]>=0){k.enableVertexAttribArray(s[t]);a.numSupportedMorphTargets++}}}if(a.morphNormals){a.numSupportedMorphNormals=0;r="morphNormal";for(j=0;j<this.maxMorphNormals;j++){t=r+j;if(s[t]>=0){k.enableVertexAttribArray(s[t]);a.numSupportedMorphNormals++}}}a.uniformsList=
 [];for(i in a.uniforms)a.uniformsList.push([a.uniforms[i],i])};this.setFaceCulling=function(a,b){if(a){!b||b==="ccw"?k.frontFace(k.CCW):k.frontFace(k.CW);a==="back"?k.cullFace(k.BACK):a==="front"?k.cullFace(k.FRONT):k.cullFace(k.FRONT_AND_BACK);k.enable(k.CULL_FACE)}else k.disable(k.CULL_FACE)};this.setMaterialFaces=function(a){var b=a.side===THREE.DoubleSide,a=a.side===THREE.BackSide;if(sa!==b){b?k.disable(k.CULL_FACE):k.enable(k.CULL_FACE);sa=b}if(Ca!==a){a?k.frontFace(k.CW):k.frontFace(k.CCW);
 Ca=a}};this.setDepthTest=function(a){if(Ma!==a){a?k.enable(k.DEPTH_TEST):k.disable(k.DEPTH_TEST);Ma=a}};this.setDepthWrite=function(a){if(Xa!==a){k.depthMask(a);Xa=a}};this.setBlending=function(a,b,c,d){if(a!==Ha){if(a===THREE.NoBlending)k.disable(k.BLEND);else if(a===THREE.AdditiveBlending){k.enable(k.BLEND);k.blendEquation(k.FUNC_ADD);k.blendFunc(k.SRC_ALPHA,k.ONE)}else if(a===THREE.SubtractiveBlending){k.enable(k.BLEND);k.blendEquation(k.FUNC_ADD);k.blendFunc(k.ZERO,k.ONE_MINUS_SRC_COLOR)}else if(a===

+ 6 - 9
examples/webgl_animation_cloth.html

@@ -190,10 +190,7 @@
 				clothTexture.wrapS = clothTexture.wrapT = THREE.RepeatWrapping;
 				clothTexture.anisotropy = 16;
 
-				materials = [
-					new THREE.MeshPhongMaterial( { alphaTest: 0.5, ambient: 0xffffff, color: 0xffffff, specular: 0x030303, emissive: 0x111111, shiness: 10, perPixel: true, metal: false, map: clothTexture, side: THREE.DoubleSide } ),
-					new THREE.MeshBasicMaterial( { color: 0xff0000, wireframe: true, transparent: true, opacity: 0.9 } )
-				];
+				var clothMaterial = new THREE.MeshPhongMaterial( { alphaTest: 0.5, ambient: 0xffffff, color: 0xffffff, specular: 0x030303, emissive: 0x111111, shiness: 10, perPixel: true, metal: false, map: clothTexture, side: THREE.DoubleSide } );
 
 				// cloth geometry
 				clothGeometry = new THREE.ParametricGeometry( clothFunction, cloth.w, cloth.h, true );
@@ -206,7 +203,7 @@
 
 				// cloth mesh
 
-				object = new THREE.Mesh( clothGeometry, materials[ 0 ] );
+				object = new THREE.Mesh( clothGeometry, clothMaterial );
 				object.position.set( 0, 0, 0 );
 				object.castShadow = true;
 				object.receiveShadow = true;
@@ -257,19 +254,19 @@
 
 				// poles
 
-				var poleGeo = new THREE.CubeGeometry( 5, 750, 5 );
+				var poleGeo = new THREE.CubeGeometry( 5, 375, 5 );
 				var poleMat = new THREE.MeshPhongMaterial( { color: 0xffffff, specular: 0x111111, shiness: 100, perPixel: true } );
 
 				var mesh = new THREE.Mesh( poleGeo, poleMat );
-				mesh.position.y = -250;
 				mesh.position.x = -125;
+				mesh.position.y = -62;
 				mesh.receiveShadow = true;
 				mesh.castShadow = true;
 				scene.add( mesh );
 
 				var mesh = new THREE.Mesh( poleGeo, poleMat );
-				mesh.position.y = -250;
 				mesh.position.x = 125;
+				mesh.position.y = -62;
 				mesh.receiveShadow = true;
 				mesh.castShadow = true;
 				scene.add( mesh );
@@ -394,4 +391,4 @@
 
 		</script>
 	</body>
-</html>
+</html>

+ 64 - 56
src/renderers/CanvasRenderer.js

@@ -41,7 +41,7 @@ THREE.CanvasRenderer = function ( parameters ) {
 	_color3 = new THREE.Color(),
 	_color4 = new THREE.Color(),
 
-	_patterns = [], _imagedatas = [],
+	_patterns = {}, _imagedatas = {},
 
 	_near, _far,
 
@@ -553,52 +553,7 @@ THREE.CanvasRenderer = function ( parameters ) {
 
 			drawTriangle( _v1x, _v1y, _v2x, _v2y, _v3x, _v3y );
 
-			if ( material instanceof THREE.MeshBasicMaterial ) {
-
-				if ( material.map !== null ) {
-
-					if ( material.map.mapping instanceof THREE.UVMapping ) {
-
-						_uvs = element.uvs[ 0 ];
-						patternPath( _v1x, _v1y, _v2x, _v2y, _v3x, _v3y, _uvs[ uv1 ].u, _uvs[ uv1 ].v, _uvs[ uv2 ].u, _uvs[ uv2 ].v, _uvs[ uv3 ].u, _uvs[ uv3 ].v, material.map );
-
-					}
-
-
-				} else if ( material.envMap !== null ) {
-
-					if ( material.envMap.mapping instanceof THREE.SphericalReflectionMapping ) {
-
-						var cameraMatrix = camera.matrixWorldInverse;
-
-						_vector3.copy( element.vertexNormalsWorld[ uv1 ] );
-						_uv1x = ( _vector3.x * cameraMatrix.elements[0] + _vector3.y * cameraMatrix.elements[4] + _vector3.z * cameraMatrix.elements[8] ) * 0.5 + 0.5;
-						_uv1y = ( _vector3.x * cameraMatrix.elements[1] + _vector3.y * cameraMatrix.elements[5] + _vector3.z * cameraMatrix.elements[9] ) * 0.5 + 0.5;
-
-						_vector3.copy( element.vertexNormalsWorld[ uv2 ] );
-						_uv2x = ( _vector3.x * cameraMatrix.elements[0] + _vector3.y * cameraMatrix.elements[4] + _vector3.z * cameraMatrix.elements[8] ) * 0.5 + 0.5;
-						_uv2y = ( _vector3.x * cameraMatrix.elements[1] + _vector3.y * cameraMatrix.elements[5] + _vector3.z * cameraMatrix.elements[9] ) * 0.5 + 0.5;
-
-						_vector3.copy( element.vertexNormalsWorld[ uv3 ] );
-						_uv3x = ( _vector3.x * cameraMatrix.elements[0] + _vector3.y * cameraMatrix.elements[4] + _vector3.z * cameraMatrix.elements[8] ) * 0.5 + 0.5;
-						_uv3y = ( _vector3.x * cameraMatrix.elements[1] + _vector3.y * cameraMatrix.elements[5] + _vector3.z * cameraMatrix.elements[9] ) * 0.5 + 0.5;
-
-						patternPath( _v1x, _v1y, _v2x, _v2y, _v3x, _v3y, _uv1x, _uv1y, _uv2x, _uv2y, _uv3x, _uv3y, material.envMap );
-
-					}/* else if ( material.envMap.mapping == THREE.SphericalRefractionMapping ) {
-
-
-
-					}*/
-
-
-				} else {
-
-					material.wireframe === true ? strokePath( material.color, material.wireframeLinewidth, material.wireframeLinecap, material.wireframeLinejoin ) : fillPath( material.color );
-
-				}
-
-			} else if ( material instanceof THREE.MeshLambertMaterial ) {
+			if ( ( material instanceof THREE.MeshLambertMaterial || material instanceof THREE.MeshPhongMaterial ) && material.map === null && material.map === null ) {
 
 				if ( _enableLighting === true ) {
 
@@ -654,6 +609,51 @@ THREE.CanvasRenderer = function ( parameters ) {
 
 				}
 
+			} else if ( material instanceof THREE.MeshBasicMaterial || material instanceof THREE.MeshLambertMaterial || material instanceof THREE.MeshPhongMaterial ) {
+
+				if ( material.map !== null ) {
+
+					if ( material.map.mapping instanceof THREE.UVMapping ) {
+
+						_uvs = element.uvs[ 0 ];
+						patternPath( _v1x, _v1y, _v2x, _v2y, _v3x, _v3y, _uvs[ uv1 ].u, _uvs[ uv1 ].v, _uvs[ uv2 ].u, _uvs[ uv2 ].v, _uvs[ uv3 ].u, _uvs[ uv3 ].v, material.map );
+
+					}
+
+
+				} else if ( material.envMap !== null ) {
+
+					if ( material.envMap.mapping instanceof THREE.SphericalReflectionMapping ) {
+
+						var cameraMatrix = camera.matrixWorldInverse;
+
+						_vector3.copy( element.vertexNormalsWorld[ uv1 ] );
+						_uv1x = ( _vector3.x * cameraMatrix.elements[0] + _vector3.y * cameraMatrix.elements[4] + _vector3.z * cameraMatrix.elements[8] ) * 0.5 + 0.5;
+						_uv1y = ( _vector3.x * cameraMatrix.elements[1] + _vector3.y * cameraMatrix.elements[5] + _vector3.z * cameraMatrix.elements[9] ) * 0.5 + 0.5;
+
+						_vector3.copy( element.vertexNormalsWorld[ uv2 ] );
+						_uv2x = ( _vector3.x * cameraMatrix.elements[0] + _vector3.y * cameraMatrix.elements[4] + _vector3.z * cameraMatrix.elements[8] ) * 0.5 + 0.5;
+						_uv2y = ( _vector3.x * cameraMatrix.elements[1] + _vector3.y * cameraMatrix.elements[5] + _vector3.z * cameraMatrix.elements[9] ) * 0.5 + 0.5;
+
+						_vector3.copy( element.vertexNormalsWorld[ uv3 ] );
+						_uv3x = ( _vector3.x * cameraMatrix.elements[0] + _vector3.y * cameraMatrix.elements[4] + _vector3.z * cameraMatrix.elements[8] ) * 0.5 + 0.5;
+						_uv3y = ( _vector3.x * cameraMatrix.elements[1] + _vector3.y * cameraMatrix.elements[5] + _vector3.z * cameraMatrix.elements[9] ) * 0.5 + 0.5;
+
+						patternPath( _v1x, _v1y, _v2x, _v2y, _v3x, _v3y, _uv1x, _uv1y, _uv2x, _uv2y, _uv3x, _uv3y, material.envMap );
+
+					}/* else if ( material.envMap.mapping == THREE.SphericalRefractionMapping ) {
+
+
+
+					}*/
+
+
+				} else {
+
+					material.wireframe === true ? strokePath( material.color, material.wireframeLinewidth, material.wireframeLinecap, material.wireframeLinejoin ) : fillPath( material.color );
+
+				}
+
 			} else if ( material instanceof THREE.MeshDepthMaterial ) {
 
 				_near = camera.near;
@@ -709,13 +709,7 @@ THREE.CanvasRenderer = function ( parameters ) {
 			_v5x = v5.positionScreen.x; _v5y = v5.positionScreen.y;
 			_v6x = v6.positionScreen.x; _v6y = v6.positionScreen.y;
 
-			if ( material instanceof THREE.MeshBasicMaterial ) {
-
-				drawQuad( _v1x, _v1y, _v2x, _v2y, _v3x, _v3y, _v4x, _v4y );
-
-				material.wireframe === true ? strokePath( material.color, material.wireframeLinewidth, material.wireframeLinecap, material.wireframeLinejoin ) : fillPath( material.color );
-
-			} else if ( material instanceof THREE.MeshLambertMaterial ) {
+			if ( material instanceof THREE.MeshLambertMaterial || material instanceof THREE.MeshPhongMaterial ) {
 
 				if ( _enableLighting === true ) {
 
@@ -782,6 +776,12 @@ THREE.CanvasRenderer = function ( parameters ) {
 
 				}
 
+			} else if ( material instanceof THREE.MeshBasicMaterial ) {
+
+				drawQuad( _v1x, _v1y, _v2x, _v2y, _v3x, _v3y, _v4x, _v4y );
+
+				material.wireframe === true ? strokePath( material.color, material.wireframeLinewidth, material.wireframeLinecap, material.wireframeLinejoin ) : fillPath( material.color );
+
 			} else if ( material instanceof THREE.MeshNormalMaterial ) {
 
 				_color.r = normalToComponent( element.normalWorld.x );
@@ -861,14 +861,22 @@ THREE.CanvasRenderer = function ( parameters ) {
 
 		function patternPath( x0, y0, x1, y1, x2, y2, u0, v0, u1, v1, u2, v2, texture ) {
 
-			if ( texture.image === undefined || texture.image.width === 0 ) return;
+			if ( texture instanceof THREE.DataTexture || texture.image === undefined || texture.image.width == 0 ) return;
 
 			if ( texture.needsUpdate === true || _patterns[ texture.id ] === undefined ) {
 
 				var repeatX = texture.wrapS == THREE.RepeatWrapping;
 				var repeatY = texture.wrapT == THREE.RepeatWrapping;
 
-				_patterns[ texture.id ] = _context.createPattern( texture.image, repeatX === true && repeatY === true ? 'repeat' : repeatX === true && repeatY === false ? 'repeat-x' : repeatX === false && repeatY === true ? 'repeat-y' : 'no-repeat' );
+				_patterns[ texture.id ] = _context.createPattern(
+					texture.image, repeatX === true && repeatY === true
+						? 'repeat'
+						: repeatX === true && repeatY === false
+							? 'repeat-x'
+							: repeatX === false && repeatY === true
+								? 'repeat-y'
+								: 'no-repeat'
+				);
 
 				texture.needsUpdate = false;