Przeglądaj źródła

Updated canvas examples with the material.side parameter.
Interestingly, I realised that the sphere using MeshFaceMaterial in canvas_materials.html has been broken for aaaages.

Mr.doob 13 lat temu
rodzic
commit
27aa531d03

+ 8 - 8
build/Three.js

@@ -79,14 +79,14 @@ THREE.Light&&C.lights.push(a);for(var c=0,d=a.children.length;c<d;c++)e(a.childr
 f<0?c=Math.max(c,f/(f-e)):e<0&&(d=Math.min(d,f/(f-e)));g<0?c=Math.max(c,g/(g-h)):h<0&&(d=Math.min(d,g/(g-h)));if(d<c)return false;a.lerpSelf(b,c);b.lerpSelf(a,1-d);return true}var f,g,h=[],i,j,l=[],m,n,p=[],r,o=[],q,s,x=[],t,w,z=[],C={objects:[],sprites:[],lights:[],elements:[]},E=new THREE.Vector3,A=new THREE.Vector4,u=new THREE.Matrix4,H=new THREE.Matrix4,J=new THREE.Frustum,M=new THREE.Vector4,O=new THREE.Vector4;this.projectVector=function(a,b){b.matrixWorldInverse.getInverse(b.matrixWorld);u.multiply(b.projectionMatrix,
 b.matrixWorldInverse);u.multiplyVector3(a);return a};this.unprojectVector=function(a,b){b.projectionMatrixInverse.getInverse(b.projectionMatrix);u.multiply(b.matrixWorld,b.projectionMatrixInverse);u.multiplyVector3(a);return a};this.pickingRay=function(a,b){var c;a.z=-1;c=new THREE.Vector3(a.x,a.y,1);this.unprojectVector(a,b);this.unprojectVector(c,b);c.subSelf(a).normalize();return new THREE.Ray(a,c)};this.projectScene=function(b,f,g){var h=f.near,F=f.far,E=false,X,N,aa,ca,I,da,na,V,W,P,Y,ga,Fa,
 ja,ma,oa,Ja;w=s=r=n=0;C.elements.length=0;b.updateMatrixWorld();f.parent===void 0&&f.updateMatrixWorld();f.matrixWorldInverse.getInverse(f.matrixWorld);u.multiply(f.projectionMatrix,f.matrixWorldInverse);J.setFromMatrix(u);C=a(b,false);b=0;for(X=C.objects.length;b<X;b++){W=C.objects[b].object;P=W.matrixWorld;j=0;if(W instanceof THREE.Mesh){Y=W.geometry;ga=W.geometry.materials;ca=Y.vertices;Fa=Y.faces;ma=Y.faceVertexUvs;Y=W.matrixRotationWorld.extractRotation(P);Ja=W.material instanceof THREE.MeshFaceMaterial;
-N=0;for(aa=ca.length;N<aa;N++){i=c();i.positionWorld.copy(ca[N]);P.multiplyVector3(i.positionWorld);i.positionScreen.copy(i.positionWorld);u.multiplyVector4(i.positionScreen);i.positionScreen.x=i.positionScreen.x/i.positionScreen.w;i.positionScreen.y=i.positionScreen.y/i.positionScreen.w;i.visible=i.positionScreen.z>h&&i.positionScreen.z<F}ca=0;for(N=Fa.length;ca<N;ca++){V=Fa[ca];aa=Ja===true?ga[V.materialIndex]:W.material;na=aa.side;if(V instanceof THREE.Face3){I=l[V.a];da=l[V.b];ja=l[V.c];if(I.visible===
-true&&da.visible===true&&ja.visible===true){E=(ja.positionScreen.x-I.positionScreen.x)*(da.positionScreen.y-I.positionScreen.y)-(ja.positionScreen.y-I.positionScreen.y)*(da.positionScreen.x-I.positionScreen.x)<0;if(na===THREE.DoubleSide||E===(na===THREE.FrontSide)){oa=void 0;if(n===p.length){oa=new THREE.RenderableFace3;p.push(oa)}else oa=p[n];n++;m=oa;m.v1.copy(I);m.v2.copy(da);m.v3.copy(ja)}else continue}else continue}else if(V instanceof THREE.Face4){I=l[V.a];da=l[V.b];ja=l[V.c];oa=l[V.d];if(I.visible===
-true&&da.visible===true&&ja.visible===true&&oa.visible===true){E=(oa.positionScreen.x-I.positionScreen.x)*(da.positionScreen.y-I.positionScreen.y)-(oa.positionScreen.y-I.positionScreen.y)*(da.positionScreen.x-I.positionScreen.x)<0||(da.positionScreen.x-ja.positionScreen.x)*(oa.positionScreen.y-ja.positionScreen.y)-(da.positionScreen.y-ja.positionScreen.y)*(oa.positionScreen.x-ja.positionScreen.x)<0;if(na===THREE.DoubleSide||E===(na===THREE.FrontSide)){var Sa=void 0;if(r===o.length){Sa=new THREE.RenderableFace4;
-o.push(Sa)}else Sa=o[r];r++;m=Sa;m.v1.copy(I);m.v2.copy(da);m.v3.copy(ja);m.v4.copy(oa)}else continue}else continue}m.normalWorld.copy(V.normal);E===false&&(na===THREE.BackSide||na===THREE.DoubleSide)&&m.normalWorld.negate();Y.multiplyVector3(m.normalWorld);m.centroidWorld.copy(V.centroid);P.multiplyVector3(m.centroidWorld);m.centroidScreen.copy(m.centroidWorld);u.multiplyVector3(m.centroidScreen);V=V.vertexNormals;I=0;for(da=V.length;I<da;I++){ja=m.vertexNormalsWorld[I];ja.copy(V[I]);E===false&&
-(na===THREE.BackSide||na===THREE.DoubleSide)&&ja.negate();Y.multiplyVector3(ja)}I=0;for(da=ma.length;I<da;I++){ja=ma[I][ca];if(ja!==void 0){na=0;for(V=ja.length;na<V;na++)m.uvs[I][na]=ja[na]}}m.material=aa;m.z=m.centroidScreen.z;C.elements.push(m)}}else if(W instanceof THREE.Line){H.multiply(u,P);ca=W.geometry.vertices;I=c();I.positionScreen.copy(ca[0]);H.multiplyVector4(I.positionScreen);P=W.type===THREE.LinePieces?2:1;N=1;for(aa=ca.length;N<aa;N++){I=c();I.positionScreen.copy(ca[N]);H.multiplyVector4(I.positionScreen);
-if(!((N+1)%P>0)){da=l[j-2];M.copy(I.positionScreen);O.copy(da.positionScreen);if(e(M,O)===true){M.multiplyScalar(1/M.w);O.multiplyScalar(1/O.w);ga=void 0;if(s===x.length){ga=new THREE.RenderableLine;x.push(ga)}else ga=x[s];s++;q=ga;q.v1.positionScreen.copy(M);q.v2.positionScreen.copy(O);q.z=Math.max(M.z,O.z);q.material=W.material;C.elements.push(q)}}}}}b=0;for(X=C.sprites.length;b<X;b++){W=C.sprites[b].object;P=W.matrixWorld;if(W instanceof THREE.Particle){A.set(P.elements[12],P.elements[13],P.elements[14],
-1);u.multiplyVector4(A);A.z=A.z/A.w;if(A.z>0&&A.z<1){h=void 0;if(w===z.length){h=new THREE.RenderableParticle;z.push(h)}else h=z[w];w++;t=h;t.object=W;t.x=A.x/A.w;t.y=A.y/A.w;t.z=A.z;t.rotation=W.rotation.z;t.scale.x=W.scale.x*Math.abs(t.x-(A.x+f.projectionMatrix.elements[0])/(A.w+f.projectionMatrix.elements[12]));t.scale.y=W.scale.y*Math.abs(t.y-(A.y+f.projectionMatrix.elements[5])/(A.w+f.projectionMatrix.elements[13]));t.material=W.material;C.elements.push(t)}}}g&&C.elements.sort(d);return C}};
-THREE.Quaternion=function(a,b,c,d){this.x=a||0;this.y=b||0;this.z=c||0;this.w=d!==void 0?d:1};
+N=0;for(aa=ca.length;N<aa;N++){i=c();i.positionWorld.copy(ca[N]);P.multiplyVector3(i.positionWorld);i.positionScreen.copy(i.positionWorld);u.multiplyVector4(i.positionScreen);i.positionScreen.x=i.positionScreen.x/i.positionScreen.w;i.positionScreen.y=i.positionScreen.y/i.positionScreen.w;i.visible=i.positionScreen.z>h&&i.positionScreen.z<F}ca=0;for(N=Fa.length;ca<N;ca++){V=Fa[ca];aa=Ja===true?ga[V.materialIndex]:W.material;if(aa!==void 0){na=aa.side;if(V instanceof THREE.Face3){I=l[V.a];da=l[V.b];
+ja=l[V.c];if(I.visible===true&&da.visible===true&&ja.visible===true){E=(ja.positionScreen.x-I.positionScreen.x)*(da.positionScreen.y-I.positionScreen.y)-(ja.positionScreen.y-I.positionScreen.y)*(da.positionScreen.x-I.positionScreen.x)<0;if(na===THREE.DoubleSide||E===(na===THREE.FrontSide)){oa=void 0;if(n===p.length){oa=new THREE.RenderableFace3;p.push(oa)}else oa=p[n];n++;m=oa;m.v1.copy(I);m.v2.copy(da);m.v3.copy(ja)}else continue}else continue}else if(V instanceof THREE.Face4){I=l[V.a];da=l[V.b];
+ja=l[V.c];oa=l[V.d];if(I.visible===true&&da.visible===true&&ja.visible===true&&oa.visible===true){E=(oa.positionScreen.x-I.positionScreen.x)*(da.positionScreen.y-I.positionScreen.y)-(oa.positionScreen.y-I.positionScreen.y)*(da.positionScreen.x-I.positionScreen.x)<0||(da.positionScreen.x-ja.positionScreen.x)*(oa.positionScreen.y-ja.positionScreen.y)-(da.positionScreen.y-ja.positionScreen.y)*(oa.positionScreen.x-ja.positionScreen.x)<0;if(na===THREE.DoubleSide||E===(na===THREE.FrontSide)){var Sa=void 0;
+if(r===o.length){Sa=new THREE.RenderableFace4;o.push(Sa)}else Sa=o[r];r++;m=Sa;m.v1.copy(I);m.v2.copy(da);m.v3.copy(ja);m.v4.copy(oa)}else continue}else continue}m.normalWorld.copy(V.normal);E===false&&(na===THREE.BackSide||na===THREE.DoubleSide)&&m.normalWorld.negate();Y.multiplyVector3(m.normalWorld);m.centroidWorld.copy(V.centroid);P.multiplyVector3(m.centroidWorld);m.centroidScreen.copy(m.centroidWorld);u.multiplyVector3(m.centroidScreen);V=V.vertexNormals;I=0;for(da=V.length;I<da;I++){ja=m.vertexNormalsWorld[I];
+ja.copy(V[I]);E===false&&(na===THREE.BackSide||na===THREE.DoubleSide)&&ja.negate();Y.multiplyVector3(ja)}I=0;for(da=ma.length;I<da;I++){ja=ma[I][ca];if(ja!==void 0){na=0;for(V=ja.length;na<V;na++)m.uvs[I][na]=ja[na]}}m.material=aa;m.z=m.centroidScreen.z;C.elements.push(m)}}}else if(W instanceof THREE.Line){H.multiply(u,P);ca=W.geometry.vertices;I=c();I.positionScreen.copy(ca[0]);H.multiplyVector4(I.positionScreen);P=W.type===THREE.LinePieces?2:1;N=1;for(aa=ca.length;N<aa;N++){I=c();I.positionScreen.copy(ca[N]);
+H.multiplyVector4(I.positionScreen);if(!((N+1)%P>0)){da=l[j-2];M.copy(I.positionScreen);O.copy(da.positionScreen);if(e(M,O)===true){M.multiplyScalar(1/M.w);O.multiplyScalar(1/O.w);ga=void 0;if(s===x.length){ga=new THREE.RenderableLine;x.push(ga)}else ga=x[s];s++;q=ga;q.v1.positionScreen.copy(M);q.v2.positionScreen.copy(O);q.z=Math.max(M.z,O.z);q.material=W.material;C.elements.push(q)}}}}}b=0;for(X=C.sprites.length;b<X;b++){W=C.sprites[b].object;P=W.matrixWorld;if(W instanceof THREE.Particle){A.set(P.elements[12],
+P.elements[13],P.elements[14],1);u.multiplyVector4(A);A.z=A.z/A.w;if(A.z>0&&A.z<1){h=void 0;if(w===z.length){h=new THREE.RenderableParticle;z.push(h)}else h=z[w];w++;t=h;t.object=W;t.x=A.x/A.w;t.y=A.y/A.w;t.z=A.z;t.rotation=W.rotation.z;t.scale.x=W.scale.x*Math.abs(t.x-(A.x+f.projectionMatrix.elements[0])/(A.w+f.projectionMatrix.elements[12]));t.scale.y=W.scale.y*Math.abs(t.y-(A.y+f.projectionMatrix.elements[5])/(A.w+f.projectionMatrix.elements[13]));t.material=W.material;C.elements.push(t)}}}g&&
+C.elements.sort(d);return C}};THREE.Quaternion=function(a,b,c,d){this.x=a||0;this.y=b||0;this.z=c||0;this.w=d!==void 0?d:1};
 THREE.Quaternion.prototype={constructor:THREE.Quaternion,set:function(a,b,c,d){this.x=a;this.y=b;this.z=c;this.w=d;return this},copy:function(a){this.x=a.x;this.y=a.y;this.z=a.z;this.w=a.w;return this},setFromEuler:function(a,b){var c=Math.cos(a.x/2),d=Math.cos(a.y/2),e=Math.cos(a.z/2),f=Math.sin(a.x/2),g=Math.sin(a.y/2),h=Math.sin(a.z/2);if(b===void 0||b==="XYZ"){this.x=f*d*e+c*g*h;this.y=c*g*e-f*d*h;this.z=c*d*h+f*g*e;this.w=c*d*e-f*g*h}else if(b==="YXZ"){this.x=f*d*e+c*g*h;this.y=c*g*e-f*d*h;this.z=
 c*d*h-f*g*e;this.w=c*d*e+f*g*h}else if(b==="ZXY"){this.x=f*d*e-c*g*h;this.y=c*g*e+f*d*h;this.z=c*d*h+f*g*e;this.w=c*d*e-f*g*h}else if(b==="ZYX"){this.x=f*d*e-c*g*h;this.y=c*g*e+f*d*h;this.z=c*d*h-f*g*e;this.w=c*d*e+f*g*h}else if(b==="YZX"){this.x=f*d*e+c*g*h;this.y=c*g*e+f*d*h;this.z=c*d*h-f*g*e;this.w=c*d*e-f*g*h}else if(b==="XZY"){this.x=f*d*e-c*g*h;this.y=c*g*e-f*d*h;this.z=c*d*h+f*g*e;this.w=c*d*e+f*g*h}return this},setFromAxisAngle:function(a,b){var c=b/2,d=Math.sin(c);this.x=a.x*d;this.y=a.y*
 d;this.z=a.z*d;this.w=Math.cos(c);return this},setFromRotationMatrix:function(a){var b=a.elements,c=b[0],a=b[4],d=b[8],e=b[1],f=b[5],g=b[9],h=b[2],i=b[6],b=b[10],j=c+f+b;if(j>0){c=0.5/Math.sqrt(j+1);this.w=0.25/c;this.x=(i-g)*c;this.y=(d-h)*c;this.z=(e-a)*c}else if(c>f&&c>b){c=2*Math.sqrt(1+c-f-b);this.w=(i-g)/c;this.x=0.25*c;this.y=(a+e)/c;this.z=(d+h)/c}else if(f>b){c=2*Math.sqrt(1+f-c-b);this.w=(d-h)/c;this.x=(a+e)/c;this.y=0.25*c;this.z=(g+i)/c}else{c=2*Math.sqrt(1+b-c-f);this.w=(e-a)/c;this.x=

+ 12 - 12
build/custom/ThreeCanvas.js

@@ -76,13 +76,13 @@ this.matrix):this.matrixWorld.copy(this.matrix);this.matrixWorldNeedsUpdate=fals
 THREE.Projector=function(){function a(a,c){g=0;A.objects.length=0;A.sprites.length=0;A.lights.length=0;var f=function(a){if(a.visible!==false){if((a instanceof THREE.Mesh||a instanceof THREE.Line)&&(a.frustumCulled===false||C.contains(a)===true)){y.copy(a.matrixWorld.getPosition());s.multiplyVector3(y);e=b();e.object=a;e.z=y.z;A.objects.push(e)}else if(a instanceof THREE.Sprite||a instanceof THREE.Particle){y.copy(a.matrixWorld.getPosition());s.multiplyVector3(y);e=b();e.object=a;e.z=y.z;A.sprites.push(e)}else a instanceof
 THREE.Light&&A.lights.push(a);for(var c=0,d=a.children.length;c<d;c++)f(a.children[c])}};f(a);c===true&&A.objects.sort(d);return A}function b(){var a;if(g===j.length){a=new THREE.RenderableObject;j.push(a)}else a=j[g];g++;return a}function c(){var a;if(k===h.length){a=new THREE.RenderableVertex;h.push(a)}else a=h[k];k++;return a}function d(a,b){return b.z-a.z}function f(a,b){var c=0,d=1,e=a.z+a.w,g=b.z+b.w,f=-a.z+a.w,h=-b.z+b.w;if(e>=0&&g>=0&&f>=0&&h>=0)return true;if(e<0&&g<0||f<0&&h<0)return false;
 e<0?c=Math.max(c,e/(e-g)):g<0&&(d=Math.min(d,e/(e-g)));f<0?c=Math.max(c,f/(f-h)):h<0&&(d=Math.min(d,f/(f-h)));if(d<c)return false;a.lerpSelf(b,c);b.lerpSelf(a,1-d);return true}var e,g,j=[],m,k,h=[],n,i,o=[],q,l=[],p,r,u=[],v,B,x=[],A={objects:[],sprites:[],lights:[],elements:[]},y=new THREE.Vector3,E=new THREE.Vector4,s=new THREE.Matrix4,w=new THREE.Matrix4,C=new THREE.Frustum,K=new THREE.Vector4,M=new THREE.Vector4;this.projectVector=function(a,b){b.matrixWorldInverse.getInverse(b.matrixWorld);s.multiply(b.projectionMatrix,
-b.matrixWorldInverse);s.multiplyVector3(a);return a};this.unprojectVector=function(a,b){b.projectionMatrixInverse.getInverse(b.projectionMatrix);s.multiply(b.matrixWorld,b.projectionMatrixInverse);s.multiplyVector3(a);return a};this.pickingRay=function(a,b){var c;a.z=-1;c=new THREE.Vector3(a.x,a.y,1);this.unprojectVector(a,b);this.unprojectVector(c,b);c.subSelf(a).normalize();return new THREE.Ray(a,c)};this.projectScene=function(b,e,g){var j=e.near,y=e.far,P=false,R,z,aa,$,J,S,W,D,F,H,L,Q,la,T,ca,
-U,da;B=r=q=i=0;A.elements.length=0;b.updateMatrixWorld();e.parent===void 0&&e.updateMatrixWorld();e.matrixWorldInverse.getInverse(e.matrixWorld);s.multiply(e.projectionMatrix,e.matrixWorldInverse);C.setFromMatrix(s);A=a(b,false);b=0;for(R=A.objects.length;b<R;b++){F=A.objects[b].object;H=F.matrixWorld;k=0;if(F instanceof THREE.Mesh){L=F.geometry;Q=F.geometry.materials;$=L.vertices;la=L.faces;ca=L.faceVertexUvs;L=F.matrixRotationWorld.extractRotation(H);da=F.material instanceof THREE.MeshFaceMaterial;
-z=0;for(aa=$.length;z<aa;z++){m=c();m.positionWorld.copy($[z]);H.multiplyVector3(m.positionWorld);m.positionScreen.copy(m.positionWorld);s.multiplyVector4(m.positionScreen);m.positionScreen.x=m.positionScreen.x/m.positionScreen.w;m.positionScreen.y=m.positionScreen.y/m.positionScreen.w;m.visible=m.positionScreen.z>j&&m.positionScreen.z<y}$=0;for(z=la.length;$<z;$++){D=la[$];aa=da===true?Q[D.materialIndex]:F.material;W=aa.side;if(D instanceof THREE.Face3){J=h[D.a];S=h[D.b];T=h[D.c];if(J.visible===
-true&&S.visible===true&&T.visible===true){P=(T.positionScreen.x-J.positionScreen.x)*(S.positionScreen.y-J.positionScreen.y)-(T.positionScreen.y-J.positionScreen.y)*(S.positionScreen.x-J.positionScreen.x)<0;if(W===THREE.DoubleSide||P===(W===THREE.FrontSide)){U=void 0;if(i===o.length){U=new THREE.RenderableFace3;o.push(U)}else U=o[i];i++;n=U;n.v1.copy(J);n.v2.copy(S);n.v3.copy(T)}else continue}else continue}else if(D instanceof THREE.Face4){J=h[D.a];S=h[D.b];T=h[D.c];U=h[D.d];if(J.visible===true&&S.visible===
-true&&T.visible===true&&U.visible===true){P=(U.positionScreen.x-J.positionScreen.x)*(S.positionScreen.y-J.positionScreen.y)-(U.positionScreen.y-J.positionScreen.y)*(S.positionScreen.x-J.positionScreen.x)<0||(S.positionScreen.x-T.positionScreen.x)*(U.positionScreen.y-T.positionScreen.y)-(S.positionScreen.y-T.positionScreen.y)*(U.positionScreen.x-T.positionScreen.x)<0;if(W===THREE.DoubleSide||P===(W===THREE.FrontSide)){var fa=void 0;if(q===l.length){fa=new THREE.RenderableFace4;l.push(fa)}else fa=l[q];
-q++;n=fa;n.v1.copy(J);n.v2.copy(S);n.v3.copy(T);n.v4.copy(U)}else continue}else continue}n.normalWorld.copy(D.normal);P===false&&(W===THREE.BackSide||W===THREE.DoubleSide)&&n.normalWorld.negate();L.multiplyVector3(n.normalWorld);n.centroidWorld.copy(D.centroid);H.multiplyVector3(n.centroidWorld);n.centroidScreen.copy(n.centroidWorld);s.multiplyVector3(n.centroidScreen);D=D.vertexNormals;J=0;for(S=D.length;J<S;J++){T=n.vertexNormalsWorld[J];T.copy(D[J]);P===false&&(W===THREE.BackSide||W===THREE.DoubleSide)&&
-T.negate();L.multiplyVector3(T)}J=0;for(S=ca.length;J<S;J++){T=ca[J][$];if(T!==void 0){W=0;for(D=T.length;W<D;W++)n.uvs[J][W]=T[W]}}n.material=aa;n.z=n.centroidScreen.z;A.elements.push(n)}}else if(F instanceof THREE.Line){w.multiply(s,H);$=F.geometry.vertices;J=c();J.positionScreen.copy($[0]);w.multiplyVector4(J.positionScreen);H=F.type===THREE.LinePieces?2:1;z=1;for(aa=$.length;z<aa;z++){J=c();J.positionScreen.copy($[z]);w.multiplyVector4(J.positionScreen);if(!((z+1)%H>0)){S=h[k-2];K.copy(J.positionScreen);
+b.matrixWorldInverse);s.multiplyVector3(a);return a};this.unprojectVector=function(a,b){b.projectionMatrixInverse.getInverse(b.projectionMatrix);s.multiply(b.matrixWorld,b.projectionMatrixInverse);s.multiplyVector3(a);return a};this.pickingRay=function(a,b){var c;a.z=-1;c=new THREE.Vector3(a.x,a.y,1);this.unprojectVector(a,b);this.unprojectVector(c,b);c.subSelf(a).normalize();return new THREE.Ray(a,c)};this.projectScene=function(b,e,g){var j=e.near,y=e.far,P=false,R,z,$,aa,J,S,W,D,F,H,L,Q,la,T,ca,
+U,da;B=r=q=i=0;A.elements.length=0;b.updateMatrixWorld();e.parent===void 0&&e.updateMatrixWorld();e.matrixWorldInverse.getInverse(e.matrixWorld);s.multiply(e.projectionMatrix,e.matrixWorldInverse);C.setFromMatrix(s);A=a(b,false);b=0;for(R=A.objects.length;b<R;b++){F=A.objects[b].object;H=F.matrixWorld;k=0;if(F instanceof THREE.Mesh){L=F.geometry;Q=F.geometry.materials;aa=L.vertices;la=L.faces;ca=L.faceVertexUvs;L=F.matrixRotationWorld.extractRotation(H);da=F.material instanceof THREE.MeshFaceMaterial;
+z=0;for($=aa.length;z<$;z++){m=c();m.positionWorld.copy(aa[z]);H.multiplyVector3(m.positionWorld);m.positionScreen.copy(m.positionWorld);s.multiplyVector4(m.positionScreen);m.positionScreen.x=m.positionScreen.x/m.positionScreen.w;m.positionScreen.y=m.positionScreen.y/m.positionScreen.w;m.visible=m.positionScreen.z>j&&m.positionScreen.z<y}aa=0;for(z=la.length;aa<z;aa++){D=la[aa];$=da===true?Q[D.materialIndex]:F.material;if($!==void 0){W=$.side;if(D instanceof THREE.Face3){J=h[D.a];S=h[D.b];T=h[D.c];
+if(J.visible===true&&S.visible===true&&T.visible===true){P=(T.positionScreen.x-J.positionScreen.x)*(S.positionScreen.y-J.positionScreen.y)-(T.positionScreen.y-J.positionScreen.y)*(S.positionScreen.x-J.positionScreen.x)<0;if(W===THREE.DoubleSide||P===(W===THREE.FrontSide)){U=void 0;if(i===o.length){U=new THREE.RenderableFace3;o.push(U)}else U=o[i];i++;n=U;n.v1.copy(J);n.v2.copy(S);n.v3.copy(T)}else continue}else continue}else if(D instanceof THREE.Face4){J=h[D.a];S=h[D.b];T=h[D.c];U=h[D.d];if(J.visible===
+true&&S.visible===true&&T.visible===true&&U.visible===true){P=(U.positionScreen.x-J.positionScreen.x)*(S.positionScreen.y-J.positionScreen.y)-(U.positionScreen.y-J.positionScreen.y)*(S.positionScreen.x-J.positionScreen.x)<0||(S.positionScreen.x-T.positionScreen.x)*(U.positionScreen.y-T.positionScreen.y)-(S.positionScreen.y-T.positionScreen.y)*(U.positionScreen.x-T.positionScreen.x)<0;if(W===THREE.DoubleSide||P===(W===THREE.FrontSide)){var fa=void 0;if(q===l.length){fa=new THREE.RenderableFace4;l.push(fa)}else fa=
+l[q];q++;n=fa;n.v1.copy(J);n.v2.copy(S);n.v3.copy(T);n.v4.copy(U)}else continue}else continue}n.normalWorld.copy(D.normal);P===false&&(W===THREE.BackSide||W===THREE.DoubleSide)&&n.normalWorld.negate();L.multiplyVector3(n.normalWorld);n.centroidWorld.copy(D.centroid);H.multiplyVector3(n.centroidWorld);n.centroidScreen.copy(n.centroidWorld);s.multiplyVector3(n.centroidScreen);D=D.vertexNormals;J=0;for(S=D.length;J<S;J++){T=n.vertexNormalsWorld[J];T.copy(D[J]);P===false&&(W===THREE.BackSide||W===THREE.DoubleSide)&&
+T.negate();L.multiplyVector3(T)}J=0;for(S=ca.length;J<S;J++){T=ca[J][aa];if(T!==void 0){W=0;for(D=T.length;W<D;W++)n.uvs[J][W]=T[W]}}n.material=$;n.z=n.centroidScreen.z;A.elements.push(n)}}}else if(F instanceof THREE.Line){w.multiply(s,H);aa=F.geometry.vertices;J=c();J.positionScreen.copy(aa[0]);w.multiplyVector4(J.positionScreen);H=F.type===THREE.LinePieces?2:1;z=1;for($=aa.length;z<$;z++){J=c();J.positionScreen.copy(aa[z]);w.multiplyVector4(J.positionScreen);if(!((z+1)%H>0)){S=h[k-2];K.copy(J.positionScreen);
 M.copy(S.positionScreen);if(f(K,M)===true){K.multiplyScalar(1/K.w);M.multiplyScalar(1/M.w);Q=void 0;if(r===u.length){Q=new THREE.RenderableLine;u.push(Q)}else Q=u[r];r++;p=Q;p.v1.positionScreen.copy(K);p.v2.positionScreen.copy(M);p.z=Math.max(K.z,M.z);p.material=F.material;A.elements.push(p)}}}}}b=0;for(R=A.sprites.length;b<R;b++){F=A.sprites[b].object;H=F.matrixWorld;if(F instanceof THREE.Particle){E.set(H.elements[12],H.elements[13],H.elements[14],1);s.multiplyVector4(E);E.z=E.z/E.w;if(E.z>0&&E.z<
 1){j=void 0;if(B===x.length){j=new THREE.RenderableParticle;x.push(j)}else j=x[B];B++;v=j;v.object=F;v.x=E.x/E.w;v.y=E.y/E.w;v.z=E.z;v.rotation=F.rotation.z;v.scale.x=F.scale.x*Math.abs(v.x-(E.x+e.projectionMatrix.elements[0])/(E.w+e.projectionMatrix.elements[12]));v.scale.y=F.scale.y*Math.abs(v.y-(E.y+e.projectionMatrix.elements[5])/(E.w+e.projectionMatrix.elements[13]));v.material=F.material;A.elements.push(v)}}}g&&A.elements.sort(d);return A}};
 THREE.Quaternion=function(a,b,c,d){this.x=a||0;this.y=b||0;this.z=c||0;this.w=d!==void 0?d:1};
@@ -213,7 +213,7 @@ THREE.Scene=function(){THREE.Object3D.call(this);this.overrideMaterial=this.fog=
 THREE.Scene.prototype.__addObject=function(a){if(a instanceof THREE.Light){this.__lights.indexOf(a)===-1&&this.__lights.push(a);a.target&&a.target.parent===void 0&&this.add(a.target)}else if(!(a instanceof THREE.Camera||a instanceof THREE.Bone)&&this.__objects.indexOf(a)===-1){this.__objects.push(a);this.__objectsAdded.push(a);var b=this.__objectsRemoved.indexOf(a);b!==-1&&this.__objectsRemoved.splice(b,1)}for(b=0;b<a.children.length;b++)this.__addObject(a.children[b])};
 THREE.Scene.prototype.__removeObject=function(a){if(a instanceof THREE.Light){var b=this.__lights.indexOf(a);b!==-1&&this.__lights.splice(b,1)}else if(!(a instanceof THREE.Camera)){b=this.__objects.indexOf(a);if(b!==-1){this.__objects.splice(b,1);this.__objectsRemoved.push(a);b=this.__objectsAdded.indexOf(a);b!==-1&&this.__objectsAdded.splice(b,1)}}for(b=0;b<a.children.length;b++)this.__removeObject(a.children[b])};
 THREE.CanvasRenderer=function(a){function b(a){if(u!==a)u=l.globalAlpha=a}function c(a){if(v!==a){if(a===THREE.NormalBlending)l.globalCompositeOperation="source-over";else if(a===THREE.AdditiveBlending)l.globalCompositeOperation="lighter";else if(a===THREE.SubtractiveBlending)l.globalCompositeOperation="darker";v=a}}function d(a){if(B!==a)B=l.strokeStyle=a}function f(a){if(x!==a)x=l.fillStyle=a}console.log("THREE.CanvasRenderer",THREE.REVISION);var a=a||{},e=this,g,j,m,k=new THREE.Projector,h=a.canvas!==
-void 0?a.canvas:document.createElement("canvas"),n,i,o,q,l=h.getContext("2d"),p=new THREE.Color(0),r=0,u=1,v=0,B=null,x=null,A=null,y=null,E=null,s,w,C,K,M=new THREE.RenderableVertex,N=new THREE.RenderableVertex,t,G,I,O,P,R,z,aa,$,J,S,W,D=new THREE.Color,F=new THREE.Color,H=new THREE.Color,L=new THREE.Color,Q=new THREE.Color,la=[],T=[],ca,U,da,fa,za,Aa,Ba,Ca,Da,Ea,ia=new THREE.Rectangle,ba=new THREE.Rectangle,X=new THREE.Rectangle,ua=false,Z=new THREE.Color,ma=new THREE.Color,na=new THREE.Color,V=
+void 0?a.canvas:document.createElement("canvas"),n,i,o,q,l=h.getContext("2d"),p=new THREE.Color(0),r=0,u=1,v=0,B=null,x=null,A=null,y=null,E=null,s,w,C,K,M=new THREE.RenderableVertex,N=new THREE.RenderableVertex,t,G,I,O,P,R,z,$,aa,J,S,W,D=new THREE.Color,F=new THREE.Color,H=new THREE.Color,L=new THREE.Color,Q=new THREE.Color,la=[],T=[],ca,U,da,fa,za,Aa,Ba,Ca,Da,Ea,ia=new THREE.Rectangle,ba=new THREE.Rectangle,X=new THREE.Rectangle,ua=false,Z=new THREE.Color,ma=new THREE.Color,na=new THREE.Color,V=
 new THREE.Vector3,ra,sa,ya,ea,ta,va,a=16;ra=document.createElement("canvas");ra.width=ra.height=2;sa=ra.getContext("2d");sa.fillStyle="rgba(0,0,0,1)";sa.fillRect(0,0,2,2);ya=sa.getImageData(0,0,2,2);ea=ya.data;ta=document.createElement("canvas");ta.width=ta.height=a;va=ta.getContext("2d");va.translate(-a/2,-a/2);va.scale(a,a);a--;this.domElement=h;this.sortElements=this.sortObjects=this.autoClear=true;this.info={render:{vertices:0,faces:0}};this.setSize=function(a,b){n=a;i=b;o=Math.floor(n/2);q=Math.floor(i/
 2);h.width=n;h.height=i;ia.set(-o,-q,o,q);ba.set(-o,-q,o,q);u=1;v=0;E=y=A=x=B=null};this.setClearColor=function(a,b){p.copy(a);r=b!==void 0?b:1;ba.set(-o,-q,o,q)};this.setClearColorHex=function(a,b){p.setHex(a);r=b!==void 0?b:1;ba.set(-o,-q,o,q)};this.clear=function(){l.setTransform(1,0,0,-1,o,q);if(ba.isEmpty()===false){ba.minSelf(ia);ba.inflate(2);r<1&&l.clearRect(Math.floor(ba.getX()),Math.floor(ba.getY()),Math.floor(ba.getWidth()),Math.floor(ba.getHeight()));if(r>0){c(THREE.NormalBlending);b(1);
 f("rgba("+Math.floor(p.r*255)+","+Math.floor(p.g*255)+","+Math.floor(p.b*255)+","+r+")");l.fillRect(Math.floor(ba.getX()),Math.floor(ba.getY()),Math.floor(ba.getWidth()),Math.floor(ba.getHeight()))}ba.empty()}};this.render=function(a,h){function i(a){var b,c,d,e;Z.setRGB(0,0,0);ma.setRGB(0,0,0);na.setRGB(0,0,0);b=0;for(c=a.length;b<c;b++){d=a[b];e=d.color;if(d instanceof THREE.AmbientLight){Z.r=Z.r+e.r;Z.g=Z.g+e.g;Z.b=Z.b+e.b}else if(d instanceof THREE.DirectionalLight){ma.r=ma.r+e.r;ma.g=ma.g+e.g;
@@ -227,11 +227,11 @@ i.wireframeLinewidth,i.wireframeLinecap,i.wireframeLinejoin):ga(i.color);else if
 F.b=Math.max(0,Math.min(i.color.b*F.b,1));H.r=Math.max(0,Math.min(i.color.r*H.r,1));H.g=Math.max(0,Math.min(i.color.g*H.g,1));H.b=Math.max(0,Math.min(i.color.b*H.b,1));L.r=Math.max(0,Math.min(i.color.r*L.r,1));L.g=Math.max(0,Math.min(i.color.g*L.g,1));L.b=Math.max(0,Math.min(i.color.b*L.b,1));Q.r=(H.r+L.r)*0.5;Q.g=(H.g+L.g)*0.5;Q.b=(H.b+L.b)*0.5;da=wa(F,H,L,Q);pa(t,G,I,O,P,R,0,0,1,0,0,1,da)}else{D.r=Z.r;D.g=Z.g;D.b=Z.b;n(m,l.centroidWorld,l.normalWorld,D);D.r=Math.max(0,Math.min(i.color.r*D.r,1));
 D.g=Math.max(0,Math.min(i.color.g*D.g,1));D.b=Math.max(0,Math.min(i.color.b*D.b,1));i.wireframe===true?ja(D,i.wireframeLinewidth,i.wireframeLinecap,i.wireframeLinejoin):ga(D)}else i.wireframe===true?ja(i.color,i.wireframeLinewidth,i.wireframeLinecap,i.wireframeLinejoin):ga(i.color);else if(i instanceof THREE.MeshDepthMaterial){ca=h.near;U=h.far;F.r=F.g=F.b=1-oa(a.positionScreen.z,ca,U);H.r=H.g=H.b=1-oa(d.positionScreen.z,ca,U);L.r=L.g=L.b=1-oa(f.positionScreen.z,ca,U);Q.r=(H.r+L.r)*0.5;Q.g=(H.g+L.g)*
 0.5;Q.b=(H.b+L.b)*0.5;da=wa(F,H,L,Q);pa(t,G,I,O,P,R,0,0,1,0,0,1,da)}else if(i instanceof THREE.MeshNormalMaterial){D.r=qa(l.normalWorld.x);D.g=qa(l.normalWorld.y);D.b=qa(l.normalWorld.z);i.wireframe===true?ja(D,i.wireframeLinewidth,i.wireframeLinecap,i.wireframeLinejoin):ga(D)}}function v(a,d,f,g,k,j,l,i,o){e.info.render.vertices=e.info.render.vertices+4;e.info.render.faces++;b(i.opacity);c(i.blending);if(i.map!==void 0&&i.map!==null||i.envMap!==void 0&&i.envMap!==null){u(a,d,g,0,1,3,l,i,o);u(k,f,
-j,1,2,3,l,i,o)}else{t=a.positionScreen.x;G=a.positionScreen.y;I=d.positionScreen.x;O=d.positionScreen.y;P=f.positionScreen.x;R=f.positionScreen.y;z=g.positionScreen.x;aa=g.positionScreen.y;$=k.positionScreen.x;J=k.positionScreen.y;S=j.positionScreen.x;W=j.positionScreen.y;if(i instanceof THREE.MeshBasicMaterial){B(t,G,I,O,P,R,z,aa);i.wireframe===true?ja(i.color,i.wireframeLinewidth,i.wireframeLinecap,i.wireframeLinejoin):ga(i.color)}else if(i instanceof THREE.MeshLambertMaterial)if(ua===true)if(!i.wireframe&&
+j,1,2,3,l,i,o)}else{t=a.positionScreen.x;G=a.positionScreen.y;I=d.positionScreen.x;O=d.positionScreen.y;P=f.positionScreen.x;R=f.positionScreen.y;z=g.positionScreen.x;$=g.positionScreen.y;aa=k.positionScreen.x;J=k.positionScreen.y;S=j.positionScreen.x;W=j.positionScreen.y;if(i instanceof THREE.MeshBasicMaterial){B(t,G,I,O,P,R,z,$);i.wireframe===true?ja(i.color,i.wireframeLinewidth,i.wireframeLinecap,i.wireframeLinejoin):ga(i.color)}else if(i instanceof THREE.MeshLambertMaterial)if(ua===true)if(!i.wireframe&&
 i.shading==THREE.SmoothShading&&l.vertexNormalsWorld.length==4){F.r=H.r=L.r=Q.r=Z.r;F.g=H.g=L.g=Q.g=Z.g;F.b=H.b=L.b=Q.b=Z.b;n(m,l.v1.positionWorld,l.vertexNormalsWorld[0],F);n(m,l.v2.positionWorld,l.vertexNormalsWorld[1],H);n(m,l.v4.positionWorld,l.vertexNormalsWorld[3],L);n(m,l.v3.positionWorld,l.vertexNormalsWorld[2],Q);F.r=Math.max(0,Math.min(i.color.r*F.r,1));F.g=Math.max(0,Math.min(i.color.g*F.g,1));F.b=Math.max(0,Math.min(i.color.b*F.b,1));H.r=Math.max(0,Math.min(i.color.r*H.r,1));H.g=Math.max(0,
-Math.min(i.color.g*H.g,1));H.b=Math.max(0,Math.min(i.color.b*H.b,1));L.r=Math.max(0,Math.min(i.color.r*L.r,1));L.g=Math.max(0,Math.min(i.color.g*L.g,1));L.b=Math.max(0,Math.min(i.color.b*L.b,1));Q.r=Math.max(0,Math.min(i.color.r*Q.r,1));Q.g=Math.max(0,Math.min(i.color.g*Q.g,1));Q.b=Math.max(0,Math.min(i.color.b*Q.b,1));da=wa(F,H,L,Q);x(t,G,I,O,z,aa);pa(t,G,I,O,z,aa,0,0,1,0,0,1,da);x($,J,P,R,S,W);pa($,J,P,R,S,W,1,0,1,1,0,1,da)}else{D.r=Z.r;D.g=Z.g;D.b=Z.b;n(m,l.centroidWorld,l.normalWorld,D);D.r=Math.max(0,
-Math.min(i.color.r*D.r,1));D.g=Math.max(0,Math.min(i.color.g*D.g,1));D.b=Math.max(0,Math.min(i.color.b*D.b,1));B(t,G,I,O,P,R,z,aa);i.wireframe===true?ja(D,i.wireframeLinewidth,i.wireframeLinecap,i.wireframeLinejoin):ga(D)}else{B(t,G,I,O,P,R,z,aa);i.wireframe===true?ja(i.color,i.wireframeLinewidth,i.wireframeLinecap,i.wireframeLinejoin):ga(i.color)}else if(i instanceof THREE.MeshNormalMaterial){D.r=qa(l.normalWorld.x);D.g=qa(l.normalWorld.y);D.b=qa(l.normalWorld.z);B(t,G,I,O,P,R,z,aa);i.wireframe===
-true?ja(D,i.wireframeLinewidth,i.wireframeLinecap,i.wireframeLinejoin):ga(D)}else if(i instanceof THREE.MeshDepthMaterial){ca=h.near;U=h.far;F.r=F.g=F.b=1-oa(a.positionScreen.z,ca,U);H.r=H.g=H.b=1-oa(d.positionScreen.z,ca,U);L.r=L.g=L.b=1-oa(g.positionScreen.z,ca,U);Q.r=Q.g=Q.b=1-oa(f.positionScreen.z,ca,U);da=wa(F,H,L,Q);x(t,G,I,O,z,aa);pa(t,G,I,O,z,aa,0,0,1,0,0,1,da);x($,J,P,R,S,W);pa($,J,P,R,S,W,1,0,1,1,0,1,da)}}}function x(a,b,c,d,e,f){l.beginPath();l.moveTo(a,b);l.lineTo(c,d);l.lineTo(e,f);l.lineTo(a,
+Math.min(i.color.g*H.g,1));H.b=Math.max(0,Math.min(i.color.b*H.b,1));L.r=Math.max(0,Math.min(i.color.r*L.r,1));L.g=Math.max(0,Math.min(i.color.g*L.g,1));L.b=Math.max(0,Math.min(i.color.b*L.b,1));Q.r=Math.max(0,Math.min(i.color.r*Q.r,1));Q.g=Math.max(0,Math.min(i.color.g*Q.g,1));Q.b=Math.max(0,Math.min(i.color.b*Q.b,1));da=wa(F,H,L,Q);x(t,G,I,O,z,$);pa(t,G,I,O,z,$,0,0,1,0,0,1,da);x(aa,J,P,R,S,W);pa(aa,J,P,R,S,W,1,0,1,1,0,1,da)}else{D.r=Z.r;D.g=Z.g;D.b=Z.b;n(m,l.centroidWorld,l.normalWorld,D);D.r=Math.max(0,
+Math.min(i.color.r*D.r,1));D.g=Math.max(0,Math.min(i.color.g*D.g,1));D.b=Math.max(0,Math.min(i.color.b*D.b,1));B(t,G,I,O,P,R,z,$);i.wireframe===true?ja(D,i.wireframeLinewidth,i.wireframeLinecap,i.wireframeLinejoin):ga(D)}else{B(t,G,I,O,P,R,z,$);i.wireframe===true?ja(i.color,i.wireframeLinewidth,i.wireframeLinecap,i.wireframeLinejoin):ga(i.color)}else if(i instanceof THREE.MeshNormalMaterial){D.r=qa(l.normalWorld.x);D.g=qa(l.normalWorld.y);D.b=qa(l.normalWorld.z);B(t,G,I,O,P,R,z,$);i.wireframe===true?
+ja(D,i.wireframeLinewidth,i.wireframeLinecap,i.wireframeLinejoin):ga(D)}else if(i instanceof THREE.MeshDepthMaterial){ca=h.near;U=h.far;F.r=F.g=F.b=1-oa(a.positionScreen.z,ca,U);H.r=H.g=H.b=1-oa(d.positionScreen.z,ca,U);L.r=L.g=L.b=1-oa(g.positionScreen.z,ca,U);Q.r=Q.g=Q.b=1-oa(f.positionScreen.z,ca,U);da=wa(F,H,L,Q);x(t,G,I,O,z,$);pa(t,G,I,O,z,$,0,0,1,0,0,1,da);x(aa,J,P,R,S,W);pa(aa,J,P,R,S,W,1,0,1,1,0,1,da)}}}function x(a,b,c,d,e,f){l.beginPath();l.moveTo(a,b);l.lineTo(c,d);l.lineTo(e,f);l.lineTo(a,
 b)}function B(a,b,c,d,e,f,g,h){l.beginPath();l.moveTo(a,b);l.lineTo(c,d);l.lineTo(e,f);l.lineTo(g,h);l.lineTo(a,b)}function ja(a,b,c,e){if(A!==b)A=l.lineWidth=b;if(y!==c)y=l.lineCap=c;if(E!==e)E=l.lineJoin=e;d(a.getContextStyle());l.stroke();X.inflate(b*2)}function ga(a){f(a.getContextStyle());l.fill()}function Fa(a,b,c,d,e,g,h,i,k,j,m,n,o){if(!(o.image===void 0||o.image.width===0)){if(o.needsUpdate===true||la[o.id]===void 0){var p=o.wrapS==THREE.RepeatWrapping,q=o.wrapT==THREE.RepeatWrapping;la[o.id]=
 l.createPattern(o.image,p===true&&q===true?"repeat":p===true&&q===false?"repeat-x":p===false&&q===true?"repeat-y":"no-repeat");o.needsUpdate=false}f(la[o.id]);var p=o.offset.x/o.repeat.x,q=o.offset.y/o.repeat.y,r=o.image.width*o.repeat.x,s=o.image.height*o.repeat.y,h=(h+p)*r,i=(1-i+q)*s,c=c-a,d=d-b,e=e-a,g=g-b,k=(k+p)*r-h,j=(1-j+q)*s-i,m=(m+p)*r-h,n=(1-n+q)*s-i,p=k*n-m*j;if(p===0){if(T[o.id]===void 0){b=document.createElement("canvas");b.width=o.image.width;b.height=o.image.height;b=b.getContext("2d");
 b.drawImage(o.image,0,0);T[o.id]=b.getImageData(0,0,o.image.width,o.image.height).data}b=T[o.id];h=(Math.floor(h)+Math.floor(i)*o.image.width)*4;D.setRGB(b[h]/255,b[h+1]/255,b[h+2]/255);ga(D)}else{p=1/p;o=(n*c-j*e)*p;j=(n*d-j*g)*p;c=(k*e-m*c)*p;d=(k*g-m*d)*p;a=a-o*h-c*i;h=b-j*h-d*i;l.save();l.transform(o,j,c,d,a,h);l.fill();l.restore()}}}function pa(a,b,c,d,e,f,g,h,i,j,k,m,n){var o,p;o=n.width-1;p=n.height-1;g=g*o;h=h*p;c=c-a;d=d-b;e=e-a;f=f-b;i=i*o-g;j=j*p-h;k=k*o-g;m=m*p-h;p=1/(i*m-k*j);o=(m*c-

+ 21 - 21
build/custom/ThreeWebGL.js

@@ -76,14 +76,14 @@ this.matrix):this.matrixWorld.copy(this.matrix);this.matrixWorldNeedsUpdate=fals
 THREE.Projector=function(){function a(a,c){h=0;E.objects.length=0;E.sprites.length=0;E.lights.length=0;var e=function(a){if(a.visible!==false){if((a instanceof THREE.Mesh||a instanceof THREE.Line)&&(a.frustumCulled===false||I.contains(a)===true)){A.copy(a.matrixWorld.getPosition());C.multiplyVector3(A);f=b();f.object=a;f.z=A.z;E.objects.push(f)}else if(a instanceof THREE.Sprite||a instanceof THREE.Particle){A.copy(a.matrixWorld.getPosition());C.multiplyVector3(A);f=b();f.object=a;f.z=A.z;E.sprites.push(f)}else a instanceof
 THREE.Light&&E.lights.push(a);for(var c=0,d=a.children.length;c<d;c++)e(a.children[c])}};e(a);c===true&&E.objects.sort(d);return E}function b(){var a;if(h===j.length){a=new THREE.RenderableObject;j.push(a)}else a=j[h];h++;return a}function c(){var a;if(k===i.length){a=new THREE.RenderableVertex;i.push(a)}else a=i[k];k++;return a}function d(a,b){return b.z-a.z}function e(a,b){var c=0,d=1,f=a.z+a.w,h=b.z+b.w,e=-a.z+a.w,j=-b.z+b.w;if(f>=0&&h>=0&&e>=0&&j>=0)return true;if(f<0&&h<0||e<0&&j<0)return false;
 f<0?c=Math.max(c,f/(f-h)):h<0&&(d=Math.min(d,f/(f-h)));e<0?c=Math.max(c,e/(e-j)):j<0&&(d=Math.min(d,e/(e-j)));if(d<c)return false;a.lerpSelf(b,c);b.lerpSelf(a,1-d);return true}var f,h,j=[],l,k,i=[],m,n,o=[],u,q=[],r,p,x=[],w,H,v=[],E={objects:[],sprites:[],lights:[],elements:[]},A=new THREE.Vector3,G=new THREE.Vector4,C=new THREE.Matrix4,P=new THREE.Matrix4,I=new THREE.Frustum,U=new THREE.Vector4,V=new THREE.Vector4;this.projectVector=function(a,b){b.matrixWorldInverse.getInverse(b.matrixWorld);C.multiply(b.projectionMatrix,
-b.matrixWorldInverse);C.multiplyVector3(a);return a};this.unprojectVector=function(a,b){b.projectionMatrixInverse.getInverse(b.projectionMatrix);C.multiply(b.matrixWorld,b.projectionMatrixInverse);C.multiplyVector3(a);return a};this.pickingRay=function(a,b){var c;a.z=-1;c=new THREE.Vector3(a.x,a.y,1);this.unprojectVector(a,b);this.unprojectVector(c,b);c.subSelf(a).normalize();return new THREE.Ray(a,c)};this.projectScene=function(b,f,h){var j=f.near,A=f.far,ea=false,sa,N,ka,aa,T,da,Fa,ha,W,ta,Ba,Ja,
-Ga,ja,Pa,ya,Xa;H=p=u=n=0;E.elements.length=0;b.updateMatrixWorld();f.parent===void 0&&f.updateMatrixWorld();f.matrixWorldInverse.getInverse(f.matrixWorld);C.multiply(f.projectionMatrix,f.matrixWorldInverse);I.setFromMatrix(C);E=a(b,false);b=0;for(sa=E.objects.length;b<sa;b++){W=E.objects[b].object;ta=W.matrixWorld;k=0;if(W instanceof THREE.Mesh){Ba=W.geometry;Ja=W.geometry.materials;aa=Ba.vertices;Ga=Ba.faces;Pa=Ba.faceVertexUvs;Ba=W.matrixRotationWorld.extractRotation(ta);Xa=W.material instanceof
-THREE.MeshFaceMaterial;N=0;for(ka=aa.length;N<ka;N++){l=c();l.positionWorld.copy(aa[N]);ta.multiplyVector3(l.positionWorld);l.positionScreen.copy(l.positionWorld);C.multiplyVector4(l.positionScreen);l.positionScreen.x=l.positionScreen.x/l.positionScreen.w;l.positionScreen.y=l.positionScreen.y/l.positionScreen.w;l.visible=l.positionScreen.z>j&&l.positionScreen.z<A}aa=0;for(N=Ga.length;aa<N;aa++){ha=Ga[aa];ka=Xa===true?Ja[ha.materialIndex]:W.material;Fa=ka.side;if(ha instanceof THREE.Face3){T=i[ha.a];
-da=i[ha.b];ja=i[ha.c];if(T.visible===true&&da.visible===true&&ja.visible===true){ea=(ja.positionScreen.x-T.positionScreen.x)*(da.positionScreen.y-T.positionScreen.y)-(ja.positionScreen.y-T.positionScreen.y)*(da.positionScreen.x-T.positionScreen.x)<0;if(Fa===THREE.DoubleSide||ea===(Fa===THREE.FrontSide)){ya=void 0;if(n===o.length){ya=new THREE.RenderableFace3;o.push(ya)}else ya=o[n];n++;m=ya;m.v1.copy(T);m.v2.copy(da);m.v3.copy(ja)}else continue}else continue}else if(ha instanceof THREE.Face4){T=i[ha.a];
-da=i[ha.b];ja=i[ha.c];ya=i[ha.d];if(T.visible===true&&da.visible===true&&ja.visible===true&&ya.visible===true){ea=(ya.positionScreen.x-T.positionScreen.x)*(da.positionScreen.y-T.positionScreen.y)-(ya.positionScreen.y-T.positionScreen.y)*(da.positionScreen.x-T.positionScreen.x)<0||(da.positionScreen.x-ja.positionScreen.x)*(ya.positionScreen.y-ja.positionScreen.y)-(da.positionScreen.y-ja.positionScreen.y)*(ya.positionScreen.x-ja.positionScreen.x)<0;if(Fa===THREE.DoubleSide||ea===(Fa===THREE.FrontSide)){var Sa=
-void 0;if(u===q.length){Sa=new THREE.RenderableFace4;q.push(Sa)}else Sa=q[u];u++;m=Sa;m.v1.copy(T);m.v2.copy(da);m.v3.copy(ja);m.v4.copy(ya)}else continue}else continue}m.normalWorld.copy(ha.normal);ea===false&&(Fa===THREE.BackSide||Fa===THREE.DoubleSide)&&m.normalWorld.negate();Ba.multiplyVector3(m.normalWorld);m.centroidWorld.copy(ha.centroid);ta.multiplyVector3(m.centroidWorld);m.centroidScreen.copy(m.centroidWorld);C.multiplyVector3(m.centroidScreen);ha=ha.vertexNormals;T=0;for(da=ha.length;T<
-da;T++){ja=m.vertexNormalsWorld[T];ja.copy(ha[T]);ea===false&&(Fa===THREE.BackSide||Fa===THREE.DoubleSide)&&ja.negate();Ba.multiplyVector3(ja)}T=0;for(da=Pa.length;T<da;T++){ja=Pa[T][aa];if(ja!==void 0){Fa=0;for(ha=ja.length;Fa<ha;Fa++)m.uvs[T][Fa]=ja[Fa]}}m.material=ka;m.z=m.centroidScreen.z;E.elements.push(m)}}else if(W instanceof THREE.Line){P.multiply(C,ta);aa=W.geometry.vertices;T=c();T.positionScreen.copy(aa[0]);P.multiplyVector4(T.positionScreen);ta=W.type===THREE.LinePieces?2:1;N=1;for(ka=
-aa.length;N<ka;N++){T=c();T.positionScreen.copy(aa[N]);P.multiplyVector4(T.positionScreen);if(!((N+1)%ta>0)){da=i[k-2];U.copy(T.positionScreen);V.copy(da.positionScreen);if(e(U,V)===true){U.multiplyScalar(1/U.w);V.multiplyScalar(1/V.w);Ja=void 0;if(p===x.length){Ja=new THREE.RenderableLine;x.push(Ja)}else Ja=x[p];p++;r=Ja;r.v1.positionScreen.copy(U);r.v2.positionScreen.copy(V);r.z=Math.max(U.z,V.z);r.material=W.material;E.elements.push(r)}}}}}b=0;for(sa=E.sprites.length;b<sa;b++){W=E.sprites[b].object;
+b.matrixWorldInverse);C.multiplyVector3(a);return a};this.unprojectVector=function(a,b){b.projectionMatrixInverse.getInverse(b.projectionMatrix);C.multiply(b.matrixWorld,b.projectionMatrixInverse);C.multiplyVector3(a);return a};this.pickingRay=function(a,b){var c;a.z=-1;c=new THREE.Vector3(a.x,a.y,1);this.unprojectVector(a,b);this.unprojectVector(c,b);c.subSelf(a).normalize();return new THREE.Ray(a,c)};this.projectScene=function(b,f,h){var j=f.near,A=f.far,ea=false,sa,N,ja,aa,T,da,Fa,ha,W,ta,Ba,Ja,
+Ga,ka,Pa,ya,Xa;H=p=u=n=0;E.elements.length=0;b.updateMatrixWorld();f.parent===void 0&&f.updateMatrixWorld();f.matrixWorldInverse.getInverse(f.matrixWorld);C.multiply(f.projectionMatrix,f.matrixWorldInverse);I.setFromMatrix(C);E=a(b,false);b=0;for(sa=E.objects.length;b<sa;b++){W=E.objects[b].object;ta=W.matrixWorld;k=0;if(W instanceof THREE.Mesh){Ba=W.geometry;Ja=W.geometry.materials;aa=Ba.vertices;Ga=Ba.faces;Pa=Ba.faceVertexUvs;Ba=W.matrixRotationWorld.extractRotation(ta);Xa=W.material instanceof
+THREE.MeshFaceMaterial;N=0;for(ja=aa.length;N<ja;N++){l=c();l.positionWorld.copy(aa[N]);ta.multiplyVector3(l.positionWorld);l.positionScreen.copy(l.positionWorld);C.multiplyVector4(l.positionScreen);l.positionScreen.x=l.positionScreen.x/l.positionScreen.w;l.positionScreen.y=l.positionScreen.y/l.positionScreen.w;l.visible=l.positionScreen.z>j&&l.positionScreen.z<A}aa=0;for(N=Ga.length;aa<N;aa++){ha=Ga[aa];ja=Xa===true?Ja[ha.materialIndex]:W.material;if(ja!==void 0){Fa=ja.side;if(ha instanceof THREE.Face3){T=
+i[ha.a];da=i[ha.b];ka=i[ha.c];if(T.visible===true&&da.visible===true&&ka.visible===true){ea=(ka.positionScreen.x-T.positionScreen.x)*(da.positionScreen.y-T.positionScreen.y)-(ka.positionScreen.y-T.positionScreen.y)*(da.positionScreen.x-T.positionScreen.x)<0;if(Fa===THREE.DoubleSide||ea===(Fa===THREE.FrontSide)){ya=void 0;if(n===o.length){ya=new THREE.RenderableFace3;o.push(ya)}else ya=o[n];n++;m=ya;m.v1.copy(T);m.v2.copy(da);m.v3.copy(ka)}else continue}else continue}else if(ha instanceof THREE.Face4){T=
+i[ha.a];da=i[ha.b];ka=i[ha.c];ya=i[ha.d];if(T.visible===true&&da.visible===true&&ka.visible===true&&ya.visible===true){ea=(ya.positionScreen.x-T.positionScreen.x)*(da.positionScreen.y-T.positionScreen.y)-(ya.positionScreen.y-T.positionScreen.y)*(da.positionScreen.x-T.positionScreen.x)<0||(da.positionScreen.x-ka.positionScreen.x)*(ya.positionScreen.y-ka.positionScreen.y)-(da.positionScreen.y-ka.positionScreen.y)*(ya.positionScreen.x-ka.positionScreen.x)<0;if(Fa===THREE.DoubleSide||ea===(Fa===THREE.FrontSide)){var Sa=
+void 0;if(u===q.length){Sa=new THREE.RenderableFace4;q.push(Sa)}else Sa=q[u];u++;m=Sa;m.v1.copy(T);m.v2.copy(da);m.v3.copy(ka);m.v4.copy(ya)}else continue}else continue}m.normalWorld.copy(ha.normal);ea===false&&(Fa===THREE.BackSide||Fa===THREE.DoubleSide)&&m.normalWorld.negate();Ba.multiplyVector3(m.normalWorld);m.centroidWorld.copy(ha.centroid);ta.multiplyVector3(m.centroidWorld);m.centroidScreen.copy(m.centroidWorld);C.multiplyVector3(m.centroidScreen);ha=ha.vertexNormals;T=0;for(da=ha.length;T<
+da;T++){ka=m.vertexNormalsWorld[T];ka.copy(ha[T]);ea===false&&(Fa===THREE.BackSide||Fa===THREE.DoubleSide)&&ka.negate();Ba.multiplyVector3(ka)}T=0;for(da=Pa.length;T<da;T++){ka=Pa[T][aa];if(ka!==void 0){Fa=0;for(ha=ka.length;Fa<ha;Fa++)m.uvs[T][Fa]=ka[Fa]}}m.material=ja;m.z=m.centroidScreen.z;E.elements.push(m)}}}else if(W instanceof THREE.Line){P.multiply(C,ta);aa=W.geometry.vertices;T=c();T.positionScreen.copy(aa[0]);P.multiplyVector4(T.positionScreen);ta=W.type===THREE.LinePieces?2:1;N=1;for(ja=
+aa.length;N<ja;N++){T=c();T.positionScreen.copy(aa[N]);P.multiplyVector4(T.positionScreen);if(!((N+1)%ta>0)){da=i[k-2];U.copy(T.positionScreen);V.copy(da.positionScreen);if(e(U,V)===true){U.multiplyScalar(1/U.w);V.multiplyScalar(1/V.w);Ja=void 0;if(p===x.length){Ja=new THREE.RenderableLine;x.push(Ja)}else Ja=x[p];p++;r=Ja;r.v1.positionScreen.copy(U);r.v2.positionScreen.copy(V);r.z=Math.max(U.z,V.z);r.material=W.material;E.elements.push(r)}}}}}b=0;for(sa=E.sprites.length;b<sa;b++){W=E.sprites[b].object;
 ta=W.matrixWorld;if(W instanceof THREE.Particle){G.set(ta.elements[12],ta.elements[13],ta.elements[14],1);C.multiplyVector4(G);G.z=G.z/G.w;if(G.z>0&&G.z<1){j=void 0;if(H===v.length){j=new THREE.RenderableParticle;v.push(j)}else j=v[H];H++;w=j;w.object=W;w.x=G.x/G.w;w.y=G.y/G.w;w.z=G.z;w.rotation=W.rotation.z;w.scale.x=W.scale.x*Math.abs(w.x-(G.x+f.projectionMatrix.elements[0])/(G.w+f.projectionMatrix.elements[12]));w.scale.y=W.scale.y*Math.abs(w.y-(G.y+f.projectionMatrix.elements[5])/(G.w+f.projectionMatrix.elements[13]));
 w.material=W.material;E.elements.push(w)}}}h&&E.elements.sort(d);return E}};THREE.Quaternion=function(a,b,c,d){this.x=a||0;this.y=b||0;this.z=c||0;this.w=d!==void 0?d:1};
 THREE.Quaternion.prototype={constructor:THREE.Quaternion,set:function(a,b,c,d){this.x=a;this.y=b;this.z=c;this.w=d;return this},copy:function(a){this.x=a.x;this.y=a.y;this.z=a.z;this.w=a.w;return this},setFromEuler:function(a,b){var c=Math.cos(a.x/2),d=Math.cos(a.y/2),e=Math.cos(a.z/2),f=Math.sin(a.x/2),h=Math.sin(a.y/2),j=Math.sin(a.z/2);if(b===void 0||b==="XYZ"){this.x=f*d*e+c*h*j;this.y=c*h*e-f*d*j;this.z=c*d*j+f*h*e;this.w=c*d*e-f*h*j}else if(b==="YXZ"){this.x=f*d*e+c*h*j;this.y=c*h*e-f*d*j;this.z=
@@ -275,7 +275,7 @@ var j=a.colors,k=j.length,m=a.__vertexArray,l=a.__colorArray,n=a.__sortArray,o=a
 if(i.boundTo===void 0||i.boundTo==="vertices"){e=0;f=i.value.length;if(i.size===1)for(d=0;d<f;d++){h=n[d][1];i.array[d]=i.value[h]}else if(i.size===2)for(d=0;d<f;d++){h=n[d][1];h=i.value[h];i.array[e]=h.x;i.array[e+1]=h.y;e=e+2}else if(i.size===3)if(i.type==="c")for(d=0;d<f;d++){h=n[d][1];h=i.value[h];i.array[e]=h.r;i.array[e+1]=h.g;i.array[e+2]=h.b;e=e+3}else for(d=0;d<f;d++){h=n[d][1];h=i.value[h];i.array[e]=h.x;i.array[e+1]=h.y;i.array[e+2]=h.z;e=e+3}else if(i.size===4)for(d=0;d<f;d++){h=n[d][1];
 h=i.value[h];i.array[e]=h.x;i.array[e+1]=h.y;i.array[e+2]=h.z;i.array[e+3]=h.w;e=e+4}}}}}else{if(o)for(d=0;d<h;d++){f=i[d];e=d*3;m[e]=f.x;m[e+1]=f.y;m[e+2]=f.z}if(q)for(d=0;d<k;d++){f=j[d];e=d*3;l[e]=f.r;l[e+1]=f.g;l[e+2]=f.b}if(r){j=0;for(k=r.length;j<k;j++){i=r[j];if(i.needsUpdate&&(i.boundTo===void 0||i.boundTo==="vertices")){f=i.value.length;e=0;if(i.size===1)for(d=0;d<f;d++)i.array[d]=i.value[d];else if(i.size===2)for(d=0;d<f;d++){h=i.value[d];i.array[e]=h.x;i.array[e+1]=h.y;e=e+2}else if(i.size===
 3)if(i.type==="c")for(d=0;d<f;d++){h=i.value[d];i.array[e]=h.r;i.array[e+1]=h.g;i.array[e+2]=h.b;e=e+3}else for(d=0;d<f;d++){h=i.value[d];i.array[e]=h.x;i.array[e+1]=h.y;i.array[e+2]=h.z;e=e+3}else if(i.size===4)for(d=0;d<f;d++){h=i.value[d];i.array[e]=h.x;i.array[e+1]=h.y;i.array[e+2]=h.z;i.array[e+3]=h.w;e=e+4}}}}}if(o||c.sortParticles){g.bindBuffer(g.ARRAY_BUFFER,a.__webglVertexBuffer);g.bufferData(g.ARRAY_BUFFER,m,b)}if(q||c.sortParticles){g.bindBuffer(g.ARRAY_BUFFER,a.__webglColorBuffer);g.bufferData(g.ARRAY_BUFFER,
-l,b)}if(r){j=0;for(k=r.length;j<k;j++){i=r[j];if(i.needsUpdate||c.sortParticles){g.bindBuffer(g.ARRAY_BUFFER,i.buffer);g.bufferData(g.ARRAY_BUFFER,i.array,b)}}}}function h(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,g=a.length;d<g;d++){da=N=null;aa=T=W=ha=Pa=ja=ta=-1;ab=true;a[d].render(b,c,gc,xc);da=N=null;aa=T=W=ha=Pa=ja=ta=-1;ab=true}}function k(a,b,c,d,g,f,e,h){var i,j,k,m;if(b){j=a.length-1;m=b=-1}else{j=0;b=a.length;m=1}for(var l=j;l!==b;l=
+l,b)}if(r){j=0;for(k=r.length;j<k;j++){i=r[j];if(i.needsUpdate||c.sortParticles){g.bindBuffer(g.ARRAY_BUFFER,i.buffer);g.bufferData(g.ARRAY_BUFFER,i.array,b)}}}}function h(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,g=a.length;d<g;d++){da=N=null;aa=T=W=ha=Pa=ka=ta=-1;ab=true;a[d].render(b,c,gc,xc);da=N=null;aa=T=W=ha=Pa=ka=ta=-1;ab=true}}function k(a,b,c,d,g,f,e,h){var i,j,k,m;if(b){j=a.length-1;m=b=-1}else{j=0;b=a.length;m=1}for(var l=j;l!==b;l=
 l+m){i=a[l];if(i.render){j=i.object;k=i.buffer;if(h)i=h;else{i=i[c];if(!i)continue;e&&F.setBlending(i.blending,i.blendEquation,i.blendSrc,i.blendDst);F.setDepthTest(i.depthTest);F.setDepthWrite(i.depthWrite);x(i.polygonOffset,i.polygonOffsetFactor,i.polygonOffsetUnits)}F.setMaterialFaces(i);k instanceof THREE.BufferGeometry?F.renderBufferDirect(d,g,f,i,k,j):F.renderBuffer(d,g,f,i,k,j)}}}function i(a,b,c,d,g,f,e){for(var h,i,j=0,k=a.length;j<k;j++){h=a[j];i=h.object;if(i.visible){if(e)h=e;else{h=h[b];
 if(!h)continue;f&&F.setBlending(h.blending,h.blendEquation,h.blendSrc,h.blendDst);F.setDepthTest(h.depthTest);F.setDepthWrite(h.depthWrite);x(h.polygonOffset,h.polygonOffsetFactor,h.polygonOffsetUnits)}F.renderImmediateObject(c,d,g,h,i)}}}function m(a,b,c){a.push({buffer:b,object:c,opaque:null,transparent:null})}function n(a){for(var b in a.attributes)if(a.attributes[b].needsUpdate)return true;return false}function o(a){for(var b in a.attributes)a.attributes[b].needsUpdate=false}function u(a,b){for(var c=
 a.length-1;c>=0;c--)a[c].object===b&&a.splice(c,1)}function q(a,b){for(var c=a.length-1;c>=0;c--)a[c]===b&&a.splice(c,1)}function r(a,b,c,d,f){if(d.needsUpdate){d.program&&F.deallocateMaterial(d);F.initMaterial(d,b,c,f);d.needsUpdate=false}if(d.morphTargets&&!f.__webglMorphTargetInfluences)f.__webglMorphTargetInfluences=new Float32Array(F.maxMorphTargets);var e=false,h=d.program,i=h.uniforms,j=d.uniforms;if(h!==N){g.useProgram(h);N=h;e=true}if(d.id!==aa){aa=d.id;e=true}if(e||a!==da){g.uniformMatrix4fv(i.projectionMatrix,
@@ -304,7 +304,7 @@ g.BYTE:a===THREE.ShortType?g.SHORT:a===THREE.UnsignedShortType?g.UNSIGNED_SHORT:
 a===THREE.OneFactor?g.ONE:a===THREE.SrcColorFactor?g.SRC_COLOR:a===THREE.OneMinusSrcColorFactor?g.ONE_MINUS_SRC_COLOR:a===THREE.SrcAlphaFactor?g.SRC_ALPHA:a===THREE.OneMinusSrcAlphaFactor?g.ONE_MINUS_SRC_ALPHA:a===THREE.DstAlphaFactor?g.DST_ALPHA:a===THREE.OneMinusDstAlphaFactor?g.ONE_MINUS_DST_ALPHA:a===THREE.DstColorFactor?g.DST_COLOR:a===THREE.OneMinusDstColorFactor?g.ONE_MINUS_DST_COLOR:a===THREE.SrcAlphaSaturateFactor?g.SRC_ALPHA_SATURATE:0}console.log("THREE.WebGLRenderer",THREE.REVISION);var a=
 a||{},G=a.canvas!==void 0?a.canvas:document.createElement("canvas"),C=a.precision!==void 0?a.precision:"highp",P=a.alpha!==void 0?a.alpha:true,I=a.premultipliedAlpha!==void 0?a.premultipliedAlpha:true,U=a.antialias!==void 0?a.antialias:false,V=a.stencil!==void 0?a.stencil:true,S=a.preserveDrawingBuffer!==void 0?a.preserveDrawingBuffer:false,z=a.clearColor!==void 0?new THREE.Color(a.clearColor):new THREE.Color(0),O=a.clearAlpha!==void 0?a.clearAlpha:0,Q=a.maxLights!==void 0?a.maxLights:4;this.domElement=
 G;this.context=null;this.autoUpdateScene=this.autoUpdateObjects=this.sortObjects=this.autoClearStencil=this.autoClearDepth=this.autoClearColor=this.autoClear=true;this.shadowMapEnabled=this.physicallyBasedShading=this.gammaOutput=this.gammaInput=false;this.shadowMapCullFrontFaces=this.shadowMapSoft=this.shadowMapAutoUpdate=true;this.shadowMapCascade=this.shadowMapDebug=false;this.maxMorphTargets=8;this.maxMorphNormals=4;this.autoScaleCubemaps=true;this.renderPluginsPre=[];this.renderPluginsPost=[];
-this.info={memory:{programs:0,geometries:0,textures:0},render:{calls:0,vertices:0,faces:0,points:0}};var F=this,ea=[],sa=0,N=null,ka=null,aa=-1,T=null,da=null,Fa=0,ha=-1,W=-1,ta=-1,Ba=-1,Ja=-1,Ga=-1,ja=-1,Pa=-1,ya=null,Xa=null,Sa=null,yb=null,Mb=0,Nb=0,Ob=0,Pb=0,gc=0,xc=0,ic=new THREE.Frustum,Wb=new THREE.Matrix4,Vb=new THREE.Matrix4,Ya=new THREE.Vector4,Ma=new THREE.Vector3,ab=true,yc={ambient:[0,0,0],directional:{length:0,colors:[],positions:[]},point:{length:0,colors:[],positions:[],distances:[]},
+this.info={memory:{programs:0,geometries:0,textures:0},render:{calls:0,vertices:0,faces:0,points:0}};var F=this,ea=[],sa=0,N=null,ja=null,aa=-1,T=null,da=null,Fa=0,ha=-1,W=-1,ta=-1,Ba=-1,Ja=-1,Ga=-1,ka=-1,Pa=-1,ya=null,Xa=null,Sa=null,yb=null,Mb=0,Nb=0,Ob=0,Pb=0,gc=0,xc=0,ic=new THREE.Frustum,Wb=new THREE.Matrix4,Vb=new THREE.Matrix4,Ya=new THREE.Vector4,Ma=new THREE.Vector3,ab=true,yc={ambient:[0,0,0],directional:{length:0,colors:[],positions:[]},point:{length:0,colors:[],positions:[],distances:[]},
 spot:{length:0,colors:[],positions:[],distances:[],directions:[],angles:[],exponents:[]}},g,rb;try{if(!(g=G.getContext("experimental-webgl",{alpha:P,premultipliedAlpha:I,antialias:U,stencil:V,preserveDrawingBuffer:S})))throw"Error creating WebGL context.";}catch(Qc){console.error(Qc)}a=g.getExtension("OES_texture_float");P=g.getExtension("OES_standard_derivatives");rb=g.getExtension("EXT_texture_filter_anisotropic")||g.getExtension("MOZ_EXT_texture_filter_anisotropic")||g.getExtension("WEBKIT_EXT_texture_filter_anisotropic");
 a||console.log("THREE.WebGLRenderer: Float textures not supported.");P||console.log("THREE.WebGLRenderer: Standard derivatives not supported.");rb||console.log("THREE.WebGLRenderer: Anisotropic texture filtering not supported.");g.clearColor(0,0,0,1);g.clearDepth(1);g.clearStencil(0);g.enable(g.DEPTH_TEST);g.depthFunc(g.LEQUAL);g.frontFace(g.CCW);g.cullFace(g.BACK);g.enable(g.CULL_FACE);g.enable(g.BLEND);g.blendEquation(g.FUNC_ADD);g.blendFunc(g.SRC_ALPHA,g.ONE_MINUS_SRC_ALPHA);g.clearColor(z.r,z.g,
 z.b,O);this.context=g;P=g.getParameter(g.MAX_VERTEX_TEXTURE_IMAGE_UNITS);g.getParameter(g.MAX_TEXTURE_SIZE);var Pc=g.getParameter(g.MAX_CUBE_MAP_TEXTURE_SIZE),zc=rb?g.getParameter(rb.MAX_TEXTURE_MAX_ANISOTROPY_EXT):0,jc=P>0,hc=jc&&a;this.getContext=function(){return g};this.supportsVertexTextures=function(){return jc};this.getMaxAnisotropy=function(){return zc};this.setSize=function(a,b){G.width=a;G.height=b;this.setViewport(0,0,G.width,G.height)};this.setViewport=function(a,b,c,d){Mb=a!==void 0?
@@ -314,7 +314,7 @@ delete a._modelViewMatrixArray;delete a._modelMatrixArray;if(a instanceof THREE.
 g.deleteBuffer(c.__webglSkinWeightsBuffer);g.deleteBuffer(c.__webglFaceBuffer);g.deleteBuffer(c.__webglLineBuffer);var d=void 0,e=void 0;if(c.numMorphTargets){d=0;for(e=c.numMorphTargets;d<e;d++)g.deleteBuffer(c.__webglMorphTargetsBuffers[d])}if(c.numMorphNormals){d=0;for(e=c.numMorphNormals;d<e;d++)g.deleteBuffer(c.__webglMorphNormalsBuffers[d])}if(c.__webglCustomAttributesList){d=void 0;for(d in c.__webglCustomAttributesList)g.deleteBuffer(c.__webglCustomAttributesList[d].buffer)}F.info.memory.geometries--}else if(a instanceof
 THREE.Ribbon){a=a.geometry;g.deleteBuffer(a.__webglVertexBuffer);g.deleteBuffer(a.__webglColorBuffer);F.info.memory.geometries--}else if(a instanceof THREE.Line){a=a.geometry;g.deleteBuffer(a.__webglVertexBuffer);g.deleteBuffer(a.__webglColorBuffer);F.info.memory.geometries--}else if(a instanceof THREE.ParticleSystem){a=a.geometry;g.deleteBuffer(a.__webglVertexBuffer);g.deleteBuffer(a.__webglColorBuffer);F.info.memory.geometries--}}};this.deallocateTexture=function(a){if(a.__webglInit){a.__webglInit=
 false;g.deleteTexture(a.__webglTexture);F.info.memory.textures--}};this.deallocateRenderTarget=function(a){if(a&&a.__webglTexture){g.deleteTexture(a.__webglTexture);if(a instanceof THREE.WebGLRenderTargetCube)for(var b=0;b<6;b++){g.deleteFramebuffer(a.__webglFramebuffer[b]);g.deleteRenderbuffer(a.__webglRenderbuffer[b])}else{g.deleteFramebuffer(a.__webglFramebuffer);g.deleteRenderbuffer(a.__webglRenderbuffer)}}};this.deallocateMaterial=function(a){var b=a.program;if(b){a.program=void 0;var c,d,e=
-false,a=0;for(c=ea.length;a<c;a++){d=ea[a];if(d.program===b){d.usedTimes--;d.usedTimes===0&&(e=true);break}}if(e){e=[];a=0;for(c=ea.length;a<c;a++){d=ea[a];d.program!==b&&e.push(d)}ea=e;g.deleteProgram(b);F.info.memory.programs--}}};this.updateShadowMap=function(a,b){N=null;aa=T=Pa=ja=ta=-1;ab=true;W=ha=-1;this.shadowMapPlugin.update(a,b)};this.renderBufferImmediate=function(a,b,c){if(a.hasPositions&&!a.__webglVertexBuffer)a.__webglVertexBuffer=g.createBuffer();if(a.hasNormals&&!a.__webglNormalBuffer)a.__webglNormalBuffer=
+false,a=0;for(c=ea.length;a<c;a++){d=ea[a];if(d.program===b){d.usedTimes--;d.usedTimes===0&&(e=true);break}}if(e){e=[];a=0;for(c=ea.length;a<c;a++){d=ea[a];d.program!==b&&e.push(d)}ea=e;g.deleteProgram(b);F.info.memory.programs--}}};this.updateShadowMap=function(a,b){N=null;aa=T=Pa=ka=ta=-1;ab=true;W=ha=-1;this.shadowMapPlugin.update(a,b)};this.renderBufferImmediate=function(a,b,c){if(a.hasPositions&&!a.__webglVertexBuffer)a.__webglVertexBuffer=g.createBuffer();if(a.hasNormals&&!a.__webglNormalBuffer)a.__webglNormalBuffer=
 g.createBuffer();if(a.hasUvs&&!a.__webglUvBuffer)a.__webglUvBuffer=g.createBuffer();if(a.hasColors&&!a.__webglColorBuffer)a.__webglColorBuffer=g.createBuffer();if(a.hasPositions){g.bindBuffer(g.ARRAY_BUFFER,a.__webglVertexBuffer);g.bufferData(g.ARRAY_BUFFER,a.positionArray,g.DYNAMIC_DRAW);g.enableVertexAttribArray(b.attributes.position);g.vertexAttribPointer(b.attributes.position,3,g.FLOAT,false,0,0)}if(a.hasNormals){g.bindBuffer(g.ARRAY_BUFFER,a.__webglNormalBuffer);if(c.shading===THREE.FlatShading){var d,
 e,f,h,i,j,k,l,m,n,o,q=a.count*3;for(o=0;o<q;o=o+9){n=a.normalArray;d=n[o];e=n[o+1];f=n[o+2];h=n[o+3];j=n[o+4];l=n[o+5];i=n[o+6];k=n[o+7];m=n[o+8];d=(d+h+i)/3;e=(e+j+k)/3;f=(f+l+m)/3;n[o]=d;n[o+1]=e;n[o+2]=f;n[o+3]=d;n[o+4]=e;n[o+5]=f;n[o+6]=d;n[o+7]=e;n[o+8]=f}}g.bufferData(g.ARRAY_BUFFER,a.normalArray,g.DYNAMIC_DRAW);g.enableVertexAttribArray(b.attributes.normal);g.vertexAttribPointer(b.attributes.normal,3,g.FLOAT,false,0,0)}if(a.hasUvs&&c.map){g.bindBuffer(g.ARRAY_BUFFER,a.__webglUvBuffer);g.bufferData(g.ARRAY_BUFFER,
 a.uvArray,g.DYNAMIC_DRAW);g.enableVertexAttribArray(b.attributes.uv);g.vertexAttribPointer(b.attributes.uv,2,g.FLOAT,false,0,0)}if(a.hasColors&&c.vertexColors!==THREE.NoColors){g.bindBuffer(g.ARRAY_BUFFER,a.__webglColorBuffer);g.bufferData(g.ARRAY_BUFFER,a.colorArray,g.DYNAMIC_DRAW);g.enableVertexAttribArray(b.attributes.color);g.vertexAttribPointer(b.attributes.color,3,g.FLOAT,false,0,0)}g.drawArrays(g.TRIANGLES,0,a.count);a.count=0};this.renderBufferDirect=function(a,b,c,d,e,f){if(d.visible!==false){c=
@@ -339,11 +339,11 @@ g,ic):e.render(function(a){F.renderBufferImmediate(a,f,d)})};this.initWebGLObjec
 k,r=void 0,v=void 0,w=void 0,x=void 0,z=void 0,A=void 0,C=void 0,E={},H=p.morphTargets.length,P=p.morphNormals.length;p.geometryGroups={};r=0;for(v=p.faces.length;r<v;r++){w=p.faces[r];x=w.materialIndex;A=x!==void 0?x:-1;E[A]===void 0&&(E[A]={hash:A,counter:0});C=E[A].hash+"_"+E[A].counter;p.geometryGroups[C]===void 0&&(p.geometryGroups[C]={faces3:[],faces4:[],materialIndex:x,vertices:0,numMorphTargets:H,numMorphNormals:P});z=w instanceof THREE.Face3?3:4;if(p.geometryGroups[C].vertices+z>65535){E[A].counter=
 E[A].counter+1;C=E[A].hash+"_"+E[A].counter;p.geometryGroups[C]===void 0&&(p.geometryGroups[C]={faces3:[],faces4:[],materialIndex:x,vertices:0,numMorphTargets:H,numMorphNormals:P})}w instanceof THREE.Face3?p.geometryGroups[C].faces3.push(r):p.geometryGroups[C].faces4.push(r);p.geometryGroups[C].vertices=p.geometryGroups[C].vertices+z}p.geometryGroupsList=[];var O=void 0;for(O in p.geometryGroups){p.geometryGroups[O].id=Fa++;p.geometryGroupsList.push(p.geometryGroups[O])}}for(j in k.geometryGroups){l=
 k.geometryGroups[j];if(!l.__webglVertexBuffer){var G=l;G.__webglVertexBuffer=g.createBuffer();G.__webglNormalBuffer=g.createBuffer();G.__webglTangentBuffer=g.createBuffer();G.__webglColorBuffer=g.createBuffer();G.__webglUVBuffer=g.createBuffer();G.__webglUV2Buffer=g.createBuffer();G.__webglSkinVertexABuffer=g.createBuffer();G.__webglSkinVertexBBuffer=g.createBuffer();G.__webglSkinIndicesBuffer=g.createBuffer();G.__webglSkinWeightsBuffer=g.createBuffer();G.__webglFaceBuffer=g.createBuffer();G.__webglLineBuffer=
-g.createBuffer();var N=void 0,Q=void 0;if(G.numMorphTargets){G.__webglMorphTargetsBuffers=[];N=0;for(Q=G.numMorphTargets;N<Q;N++)G.__webglMorphTargetsBuffers.push(g.createBuffer())}if(G.numMorphNormals){G.__webglMorphNormalsBuffers=[];N=0;for(Q=G.numMorphNormals;N<Q;N++)G.__webglMorphNormalsBuffers.push(g.createBuffer())}F.info.memory.geometries++;var I=l,S=h,T=S.geometry,U=I.faces3,V=I.faces4,W=U.length*3+V.length*4,da=U.length*1+V.length*2,ea=U.length*3+V.length*4,aa=c(S,I),ha=e(aa),ja=d(aa),ta=
-aa.vertexColors?aa.vertexColors:false;I.__vertexArray=new Float32Array(W*3);if(ja)I.__normalArray=new Float32Array(W*3);if(T.hasTangents)I.__tangentArray=new Float32Array(W*4);if(ta)I.__colorArray=new Float32Array(W*3);if(ha){if(T.faceUvs.length>0||T.faceVertexUvs.length>0)I.__uvArray=new Float32Array(W*2);if(T.faceUvs.length>1||T.faceVertexUvs.length>1)I.__uv2Array=new Float32Array(W*2)}if(S.geometry.skinWeights.length&&S.geometry.skinIndices.length){I.__skinVertexAArray=new Float32Array(W*4);I.__skinVertexBArray=
+g.createBuffer();var N=void 0,Q=void 0;if(G.numMorphTargets){G.__webglMorphTargetsBuffers=[];N=0;for(Q=G.numMorphTargets;N<Q;N++)G.__webglMorphTargetsBuffers.push(g.createBuffer())}if(G.numMorphNormals){G.__webglMorphNormalsBuffers=[];N=0;for(Q=G.numMorphNormals;N<Q;N++)G.__webglMorphNormalsBuffers.push(g.createBuffer())}F.info.memory.geometries++;var I=l,S=h,T=S.geometry,U=I.faces3,V=I.faces4,W=U.length*3+V.length*4,da=U.length*1+V.length*2,ea=U.length*3+V.length*4,aa=c(S,I),ha=e(aa),ka=d(aa),ta=
+aa.vertexColors?aa.vertexColors:false;I.__vertexArray=new Float32Array(W*3);if(ka)I.__normalArray=new Float32Array(W*3);if(T.hasTangents)I.__tangentArray=new Float32Array(W*4);if(ta)I.__colorArray=new Float32Array(W*3);if(ha){if(T.faceUvs.length>0||T.faceVertexUvs.length>0)I.__uvArray=new Float32Array(W*2);if(T.faceUvs.length>1||T.faceVertexUvs.length>1)I.__uv2Array=new Float32Array(W*2)}if(S.geometry.skinWeights.length&&S.geometry.skinIndices.length){I.__skinVertexAArray=new Float32Array(W*4);I.__skinVertexBArray=
 new Float32Array(W*4);I.__skinIndexArray=new Float32Array(W*4);I.__skinWeightArray=new Float32Array(W*4)}I.__faceArray=new Uint16Array(da*3);I.__lineArray=new Uint16Array(ea*2);var Sa=void 0,sa=void 0;if(I.numMorphTargets){I.__morphTargetsArrays=[];Sa=0;for(sa=I.numMorphTargets;Sa<sa;Sa++)I.__morphTargetsArrays.push(new Float32Array(W*3))}if(I.numMorphNormals){I.__morphNormalsArrays=[];Sa=0;for(sa=I.numMorphNormals;Sa<sa;Sa++)I.__morphNormalsArrays.push(new Float32Array(W*3))}I.__webglFaceCount=da*
-3;I.__webglLineCount=ea*2;if(aa.attributes){if(I.__webglCustomAttributesList===void 0)I.__webglCustomAttributesList=[];var ya=void 0;for(ya in aa.attributes){var Ba=aa.attributes[ya],ka={},Ja;for(Ja in Ba)ka[Ja]=Ba[Ja];if(!ka.__webglInitialized||ka.createUniqueBuffers){ka.__webglInitialized=true;var Ga=1;ka.type==="v2"?Ga=2:ka.type==="v3"?Ga=3:ka.type==="v4"?Ga=4:ka.type==="c"&&(Ga=3);ka.size=Ga;ka.array=new Float32Array(W*Ga);ka.buffer=g.createBuffer();ka.buffer.belongsToAttribute=ya;Ba.needsUpdate=
-true;ka.__original=Ba}I.__webglCustomAttributesList.push(ka)}}I.__inittedArrays=true;k.verticesNeedUpdate=true;k.morphTargetsNeedUpdate=true;k.elementsNeedUpdate=true;k.uvsNeedUpdate=true;k.normalsNeedUpdate=true;k.tangentsNeedUpdate=true;k.colorsNeedUpdate=true}}}else if(k instanceof THREE.BufferGeometry){var Pa=k,yb=void 0,Ma=void 0,Mb=void 0;for(yb in Pa.attributes){Mb=yb==="index"?g.ELEMENT_ARRAY_BUFFER:g.ARRAY_BUFFER;Ma=Pa.attributes[yb];Ma.buffer=g.createBuffer();g.bindBuffer(Mb,Ma.buffer);
+3;I.__webglLineCount=ea*2;if(aa.attributes){if(I.__webglCustomAttributesList===void 0)I.__webglCustomAttributesList=[];var ya=void 0;for(ya in aa.attributes){var Ba=aa.attributes[ya],ja={},Ja;for(Ja in Ba)ja[Ja]=Ba[Ja];if(!ja.__webglInitialized||ja.createUniqueBuffers){ja.__webglInitialized=true;var Ga=1;ja.type==="v2"?Ga=2:ja.type==="v3"?Ga=3:ja.type==="v4"?Ga=4:ja.type==="c"&&(Ga=3);ja.size=Ga;ja.array=new Float32Array(W*Ga);ja.buffer=g.createBuffer();ja.buffer.belongsToAttribute=ya;Ba.needsUpdate=
+true;ja.__original=Ba}I.__webglCustomAttributesList.push(ja)}}I.__inittedArrays=true;k.verticesNeedUpdate=true;k.morphTargetsNeedUpdate=true;k.elementsNeedUpdate=true;k.uvsNeedUpdate=true;k.normalsNeedUpdate=true;k.tangentsNeedUpdate=true;k.colorsNeedUpdate=true}}}else if(k instanceof THREE.BufferGeometry){var Pa=k,yb=void 0,Ma=void 0,Mb=void 0;for(yb in Pa.attributes){Mb=yb==="index"?g.ELEMENT_ARRAY_BUFFER:g.ARRAY_BUFFER;Ma=Pa.attributes[yb];Ma.buffer=g.createBuffer();g.bindBuffer(Mb,Ma.buffer);
 g.bufferData(Mb,Ma.array,g.STATIC_DRAW)}}}else if(h instanceof THREE.Ribbon){k=h.geometry;if(!k.__webglVertexBuffer){var Xa=k;Xa.__webglVertexBuffer=g.createBuffer();Xa.__webglColorBuffer=g.createBuffer();F.info.memory.geometries++;var Ya=k,ab=Ya.vertices.length;Ya.__vertexArray=new Float32Array(ab*3);Ya.__colorArray=new Float32Array(ab*3);Ya.__webglVertexCount=ab;k.verticesNeedUpdate=true;k.colorsNeedUpdate=true}}else if(h instanceof THREE.Line){k=h.geometry;if(!k.__webglVertexBuffer){var rb=k;rb.__webglVertexBuffer=
 g.createBuffer();rb.__webglColorBuffer=g.createBuffer();F.info.memory.geometries++;var kc=k,Wb=h,Nb=kc.vertices.length;kc.__vertexArray=new Float32Array(Nb*3);kc.__colorArray=new Float32Array(Nb*3);kc.__webglLineCount=Nb;b(kc,Wb);k.verticesNeedUpdate=true;k.colorsNeedUpdate=true}}else if(h instanceof THREE.ParticleSystem){k=h.geometry;if(!k.__webglVertexBuffer){var Vb=k;Vb.__webglVertexBuffer=g.createBuffer();Vb.__webglColorBuffer=g.createBuffer();F.info.geometries++;var Xb=k,hc=h,Ob=Xb.vertices.length;
 Xb.__vertexArray=new Float32Array(Ob*3);Xb.__colorArray=new Float32Array(Ob*3);Xb.__sortArray=[];Xb.__webglParticleCount=Ob;b(Xb,hc);k.verticesNeedUpdate=true;k.colorsNeedUpdate=true}}}if(!h.__webglActive){if(h instanceof THREE.Mesh){k=h.geometry;if(k instanceof THREE.BufferGeometry)m(i.__webglObjects,k,h);else for(j in k.geometryGroups){l=k.geometryGroups[j];m(i.__webglObjects,l,h)}}else if(h instanceof THREE.Ribbon||h instanceof THREE.Line||h instanceof THREE.ParticleSystem){k=h.geometry;m(i.__webglObjects,
@@ -400,14 +400,14 @@ e=w("fragment",e+q);d=w("vertex",d+o);g.attachShader(r,d);g.attachShader(r,e);g.
 d.push("boneGlobalMatrices");for(u in n)d.push(u);u=d;d=0;for(n=u.length;d<n;d++){e=u[d];r.uniforms[e]=g.getUniformLocation(r,e)}d=["position","normal","uv","uv2","tangent","color","skinVertexA","skinVertexB","skinIndex","skinWeight"];for(u=0;u<c.maxMorphTargets;u++)d.push("morphTarget"+u);for(u=0;u<c.maxMorphNormals;u++)d.push("morphNormal"+u);for(p in b)d.push(p);p=d;u=0;for(c=p.length;u<c;u++){d=p[u];r.attributes[d]=g.getAttribLocation(r,d)}r.id=sa++;ea.push({program:r,code:m,usedTimes:1});F.info.memory.programs=
 ea.length;p=r}a.program=p;p=a.program.attributes;p.position>=0&&g.enableVertexAttribArray(p.position);p.color>=0&&g.enableVertexAttribArray(p.color);p.normal>=0&&g.enableVertexAttribArray(p.normal);p.tangent>=0&&g.enableVertexAttribArray(p.tangent);if(a.skinning&&p.skinVertexA>=0&&p.skinVertexB>=0&&p.skinIndex>=0&&p.skinWeight>=0){g.enableVertexAttribArray(p.skinVertexA);g.enableVertexAttribArray(p.skinVertexB);g.enableVertexAttribArray(p.skinIndex);g.enableVertexAttribArray(p.skinWeight)}if(a.attributes)for(j in a.attributes)p[j]!==
 void 0&&p[j]>=0&&g.enableVertexAttribArray(p[j]);if(a.morphTargets){a.numSupportedMorphTargets=0;r="morphTarget";for(j=0;j<this.maxMorphTargets;j++){u=r+j;if(p[u]>=0){g.enableVertexAttribArray(p[u]);a.numSupportedMorphTargets++}}}if(a.morphNormals){a.numSupportedMorphNormals=0;r="morphNormal";for(j=0;j<this.maxMorphNormals;j++){u=r+j;if(p[u]>=0){g.enableVertexAttribArray(p[u]);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"?g.frontFace(g.CCW):g.frontFace(g.CW);a==="back"?g.cullFace(g.BACK):a==="front"?g.cullFace(g.FRONT):g.cullFace(g.FRONT_AND_BACK);g.enable(g.CULL_FACE)}else g.disable(g.CULL_FACE)};this.setMaterialFaces=function(a){if(ha!==a.doubleSided){a.doubleSided?g.disable(g.CULL_FACE):g.enable(g.CULL_FACE);ha=a.doubleSided}if(W!==a.flipSided){a.flipSided?g.frontFace(g.CW):g.frontFace(g.CCW);W=a.flipSided}};this.setDepthTest=function(a){if(ja!==a){a?g.enable(g.DEPTH_TEST):g.disable(g.DEPTH_TEST);
-ja=a}};this.setDepthWrite=function(a){if(Pa!==a){g.depthMask(a);Pa=a}};this.setBlending=function(a,b,c,d){if(a!==ta){if(a===THREE.NoBlending)g.disable(g.BLEND);else if(a===THREE.AdditiveBlending){g.enable(g.BLEND);g.blendEquation(g.FUNC_ADD);g.blendFunc(g.SRC_ALPHA,g.ONE)}else if(a===THREE.SubtractiveBlending){g.enable(g.BLEND);g.blendEquation(g.FUNC_ADD);g.blendFunc(g.ZERO,g.ONE_MINUS_SRC_COLOR)}else if(a===THREE.MultiplyBlending){g.enable(g.BLEND);g.blendEquation(g.FUNC_ADD);g.blendFunc(g.ZERO,
+function(a,b){if(a){!b||b==="ccw"?g.frontFace(g.CCW):g.frontFace(g.CW);a==="back"?g.cullFace(g.BACK):a==="front"?g.cullFace(g.FRONT):g.cullFace(g.FRONT_AND_BACK);g.enable(g.CULL_FACE)}else g.disable(g.CULL_FACE)};this.setMaterialFaces=function(a){if(ha!==a.doubleSided){a.doubleSided?g.disable(g.CULL_FACE):g.enable(g.CULL_FACE);ha=a.doubleSided}if(W!==a.flipSided){a.flipSided?g.frontFace(g.CW):g.frontFace(g.CCW);W=a.flipSided}};this.setDepthTest=function(a){if(ka!==a){a?g.enable(g.DEPTH_TEST):g.disable(g.DEPTH_TEST);
+ka=a}};this.setDepthWrite=function(a){if(Pa!==a){g.depthMask(a);Pa=a}};this.setBlending=function(a,b,c,d){if(a!==ta){if(a===THREE.NoBlending)g.disable(g.BLEND);else if(a===THREE.AdditiveBlending){g.enable(g.BLEND);g.blendEquation(g.FUNC_ADD);g.blendFunc(g.SRC_ALPHA,g.ONE)}else if(a===THREE.SubtractiveBlending){g.enable(g.BLEND);g.blendEquation(g.FUNC_ADD);g.blendFunc(g.ZERO,g.ONE_MINUS_SRC_COLOR)}else if(a===THREE.MultiplyBlending){g.enable(g.BLEND);g.blendEquation(g.FUNC_ADD);g.blendFunc(g.ZERO,
 g.SRC_COLOR)}else if(a===THREE.CustomBlending)g.enable(g.BLEND);else{g.enable(g.BLEND);g.blendEquationSeparate(g.FUNC_ADD,g.FUNC_ADD);g.blendFuncSeparate(g.SRC_ALPHA,g.ONE_MINUS_SRC_ALPHA,g.ONE,g.ONE_MINUS_SRC_ALPHA)}ta=a}if(a===THREE.CustomBlending){if(b!==Ba){g.blendEquation(A(b));Ba=b}if(c!==Ja||d!==Ga){g.blendFunc(A(c),A(d));Ja=c;Ga=d}}else Ga=Ja=Ba=null};this.setTexture=function(a,b){if(a.needsUpdate){if(!a.__webglInit){a.__webglInit=true;a.__webglTexture=g.createTexture();F.info.memory.textures++}g.activeTexture(g.TEXTURE0+
 b);g.bindTexture(g.TEXTURE_2D,a.__webglTexture);g.pixelStorei(g.UNPACK_FLIP_Y_WEBGL,a.flipY);g.pixelStorei(g.UNPACK_PREMULTIPLY_ALPHA_WEBGL,a.premultiplyAlpha);var c=a.image,d=(c.width&c.width-1)===0&&(c.height&c.height-1)===0,e=A(a.format),f=A(a.type);H(g.TEXTURE_2D,a,d);a instanceof THREE.DataTexture?g.texImage2D(g.TEXTURE_2D,0,e,c.width,c.height,0,e,f,c.data):g.texImage2D(g.TEXTURE_2D,0,e,e,f,a.image);a.generateMipmaps&&d&&g.generateMipmap(g.TEXTURE_2D);a.needsUpdate=false;if(a.onUpdate)a.onUpdate()}else{g.activeTexture(g.TEXTURE0+
 b);g.bindTexture(g.TEXTURE_2D,a.__webglTexture)}};this.setRenderTarget=function(a){var b=a instanceof THREE.WebGLRenderTargetCube;if(a&&!a.__webglFramebuffer){if(a.depthBuffer===void 0)a.depthBuffer=true;if(a.stencilBuffer===void 0)a.stencilBuffer=true;a.__webglTexture=g.createTexture();var c=(a.width&a.width-1)===0&&(a.height&a.height-1)===0,d=A(a.format),e=A(a.type);if(b){a.__webglFramebuffer=[];a.__webglRenderbuffer=[];g.bindTexture(g.TEXTURE_CUBE_MAP,a.__webglTexture);H(g.TEXTURE_CUBE_MAP,a,c);
 for(var f=0;f<6;f++){a.__webglFramebuffer[f]=g.createFramebuffer();a.__webglRenderbuffer[f]=g.createRenderbuffer();g.texImage2D(g.TEXTURE_CUBE_MAP_POSITIVE_X+f,0,d,a.width,a.height,0,d,e,null);var h=a,i=g.TEXTURE_CUBE_MAP_POSITIVE_X+f;g.bindFramebuffer(g.FRAMEBUFFER,a.__webglFramebuffer[f]);g.framebufferTexture2D(g.FRAMEBUFFER,g.COLOR_ATTACHMENT0,i,h.__webglTexture,0);v(a.__webglRenderbuffer[f],a)}c&&g.generateMipmap(g.TEXTURE_CUBE_MAP)}else{a.__webglFramebuffer=g.createFramebuffer();a.__webglRenderbuffer=
 g.createRenderbuffer();g.bindTexture(g.TEXTURE_2D,a.__webglTexture);H(g.TEXTURE_2D,a,c);g.texImage2D(g.TEXTURE_2D,0,d,a.width,a.height,0,d,e,null);d=g.TEXTURE_2D;g.bindFramebuffer(g.FRAMEBUFFER,a.__webglFramebuffer);g.framebufferTexture2D(g.FRAMEBUFFER,g.COLOR_ATTACHMENT0,d,a.__webglTexture,0);v(a.__webglRenderbuffer,a);c&&g.generateMipmap(g.TEXTURE_2D)}b?g.bindTexture(g.TEXTURE_CUBE_MAP,null):g.bindTexture(g.TEXTURE_2D,null);g.bindRenderbuffer(g.RENDERBUFFER,null);g.bindFramebuffer(g.FRAMEBUFFER,
-null)}if(a){b=b?a.__webglFramebuffer[a.activeCubeFace]:a.__webglFramebuffer;c=a.width;a=a.height;e=d=0}else{b=null;c=Ob;a=Pb;d=Mb;e=Nb}if(b!==ka){g.bindFramebuffer(g.FRAMEBUFFER,b);g.viewport(d,e,c,a);ka=b}gc=c;xc=a};this.shadowMapPlugin=new THREE.ShadowMapPlugin;this.addPrePlugin(this.shadowMapPlugin);this.addPostPlugin(new THREE.SpritePlugin);this.addPostPlugin(new THREE.LensFlarePlugin)};
+null)}if(a){b=b?a.__webglFramebuffer[a.activeCubeFace]:a.__webglFramebuffer;c=a.width;a=a.height;e=d=0}else{b=null;c=Ob;a=Pb;d=Mb;e=Nb}if(b!==ja){g.bindFramebuffer(g.FRAMEBUFFER,b);g.viewport(d,e,c,a);ja=b}gc=c;xc=a};this.shadowMapPlugin=new THREE.ShadowMapPlugin;this.addPrePlugin(this.shadowMapPlugin);this.addPostPlugin(new THREE.SpritePlugin);this.addPostPlugin(new THREE.LensFlarePlugin)};
 THREE.WebGLRenderTarget=function(a,b,c){this.width=a;this.height=b;c=c||{};this.wrapS=c.wrapS!==void 0?c.wrapS:THREE.ClampToEdgeWrapping;this.wrapT=c.wrapT!==void 0?c.wrapT:THREE.ClampToEdgeWrapping;this.magFilter=c.magFilter!==void 0?c.magFilter:THREE.LinearFilter;this.minFilter=c.minFilter!==void 0?c.minFilter:THREE.LinearMipMapLinearFilter;this.anisotropy=c.anisotropy!==void 0?c.anisotropy:1;this.offset=new THREE.Vector2(0,0);this.repeat=new THREE.Vector2(1,1);this.format=c.format!==void 0?c.format:
 THREE.RGBAFormat;this.type=c.type!==void 0?c.type:THREE.UnsignedByteType;this.depthBuffer=c.depthBuffer!==void 0?c.depthBuffer:true;this.stencilBuffer=c.stencilBuffer!==void 0?c.stencilBuffer:true;this.generateMipmaps=true};
 THREE.WebGLRenderTarget.prototype.clone=function(){var a=new THREE.WebGLRenderTarget(this.width,this.height);a.wrapS=this.wrapS;a.wrapT=this.wrapT;a.magFilter=this.magFilter;a.anisotropy=this.anisotropy;a.minFilter=this.minFilter;a.offset.copy(this.offset);a.repeat.copy(this.repeat);a.format=this.format;a.type=this.type;a.depthBuffer=this.depthBuffer;a.stencilBuffer=this.stencilBuffer;a.generateMipmaps=this.generateMipmaps;return a};
@@ -420,10 +420,10 @@ Infinity),max:new THREE.Vector3(-Infinity,-Infinity,-Infinity)};var a=this.attri
 {radius:0};var a=this.attributes.position.array;if(a){for(var b,c=0,d,e,f=0,h=a.length;f<h;f=f+3){b=a[f];d=a[f+1];e=a[f+2];b=Math.sqrt(b*b+d*d+e*e);b>c&&(c=b)}this.boundingSphere.radius=c}},computeVertexNormals:function(){if(this.attributes.position&&this.attributes.index){var a,b,c,d;a=this.attributes.position.array.length;if(this.attributes.normal===void 0)this.attributes.normal={itemSize:3,array:new Float32Array(a),numItems:a};else{a=0;for(b=this.attributes.normal.array.length;a<b;a++)this.attributes.normal.array[a]=
 0}var e=this.offsets,f=this.attributes.index.array,h=this.attributes.position.array,j=this.attributes.normal.array,l,k,i,m,n,o,u=new THREE.Vector3,q=new THREE.Vector3,r=new THREE.Vector3,p=new THREE.Vector3,x=new THREE.Vector3;c=0;for(d=e.length;c<d;++c){b=e[c].start;l=e[c].count;var w=e[c].index;a=b;for(b=b+l;a<b;a=a+3){l=w+f[a];k=w+f[a+1];i=w+f[a+2];m=h[l*3];n=h[l*3+1];o=h[l*3+2];u.set(m,n,o);m=h[k*3];n=h[k*3+1];o=h[k*3+2];q.set(m,n,o);m=h[i*3];n=h[i*3+1];o=h[i*3+2];r.set(m,n,o);p.sub(r,q);x.sub(u,
 q);p.crossSelf(x);j[l*3]=j[l*3]+p.x;j[l*3+1]=j[l*3+1]+p.y;j[l*3+2]=j[l*3+2]+p.z;j[k*3]=j[k*3]+p.x;j[k*3+1]=j[k*3+1]+p.y;j[k*3+2]=j[k*3+2]+p.z;j[i*3]=j[i*3]+p.x;j[i*3+1]=j[i*3+1]+p.y;j[i*3+2]=j[i*3+2]+p.z}}a=0;for(b=j.length;a<b;a=a+3){m=j[a];n=j[a+1];o=j[a+2];c=1/Math.sqrt(m*m+n*n+o*o);j[a]=j[a]*c;j[a+1]=j[a+1]*c;j[a+2]=j[a+2]*c}this.normalsNeedUpdate=true}},computeTangents:function(){function a(a,b,c){m=d[a*3];n=d[a*3+1];o=d[a*3+2];u=d[b*3];q=d[b*3+1];r=d[b*3+2];p=d[c*3];x=d[c*3+1];w=d[c*3+2];H=
-f[a*2];v=f[a*2+1];E=f[b*2];A=f[b*2+1];G=f[c*2];C=f[c*2+1];P=u-m;I=p-m;U=q-n;V=x-n;S=r-o;z=w-o;O=E-H;Q=G-H;F=A-v;ea=C-v;sa=1/(O*ea-Q*F);N.set((ea*P-F*I)*sa,(ea*U-F*V)*sa,(ea*S-F*z)*sa);ka.set((O*I-Q*P)*sa,(O*V-Q*U)*sa,(O*z-Q*S)*sa);k[a].addSelf(N);k[b].addSelf(N);k[c].addSelf(N);i[a].addSelf(ka);i[b].addSelf(ka);i[c].addSelf(ka)}function b(a){Ga.x=e[a*3];Ga.y=e[a*3+1];Ga.z=e[a*3+2];ja.copy(Ga);ya=k[a];Ba.copy(ya);Ba.subSelf(Ga.multiplyScalar(Ga.dot(ya))).normalize();Ja.cross(ja,ya);Xa=Ja.dot(i[a]);
+f[a*2];v=f[a*2+1];E=f[b*2];A=f[b*2+1];G=f[c*2];C=f[c*2+1];P=u-m;I=p-m;U=q-n;V=x-n;S=r-o;z=w-o;O=E-H;Q=G-H;F=A-v;ea=C-v;sa=1/(O*ea-Q*F);N.set((ea*P-F*I)*sa,(ea*U-F*V)*sa,(ea*S-F*z)*sa);ja.set((O*I-Q*P)*sa,(O*V-Q*U)*sa,(O*z-Q*S)*sa);k[a].addSelf(N);k[b].addSelf(N);k[c].addSelf(N);i[a].addSelf(ja);i[b].addSelf(ja);i[c].addSelf(ja)}function b(a){Ga.x=e[a*3];Ga.y=e[a*3+1];Ga.z=e[a*3+2];ka.copy(Ga);ya=k[a];Ba.copy(ya);Ba.subSelf(Ga.multiplyScalar(Ga.dot(ya))).normalize();Ja.cross(ka,ya);Xa=Ja.dot(i[a]);
 Pa=Xa<0?-1:1;l[a*4]=Ba.x;l[a*4+1]=Ba.y;l[a*4+2]=Ba.z;l[a*4+3]=Pa}if(this.attributes.index===void 0||this.attributes.position===void 0||this.attributes.normal===void 0||this.attributes.uv===void 0)console.warn("Missing required attributes (index, position, normal or uv) in BufferGeometry.computeTangents()");else{var c=this.attributes.index.array,d=this.attributes.position.array,e=this.attributes.normal.array,f=this.attributes.uv.array,h=d.length/3;if(this.attributes.tangent===void 0){var j=4*h;this.attributes.tangent=
-{itemSize:4,array:new Float32Array(j),numItems:j}}for(var l=this.attributes.tangent.array,k=[],i=[],j=0;j<h;j++){k[j]=new THREE.Vector3;i[j]=new THREE.Vector3}var m,n,o,u,q,r,p,x,w,H,v,E,A,G,C,P,I,U,V,S,z,O,Q,F,ea,sa,N=new THREE.Vector3,ka=new THREE.Vector3,aa,T,da,Fa,ha,W=this.offsets,j=0;for(T=W.length;j<T;++j){aa=W[j].start;da=W[j].count;var ta=W[j].index,h=aa;for(aa=aa+da;h<aa;h=h+3){da=ta+c[h];Fa=ta+c[h+1];ha=ta+c[h+2];a(da,Fa,ha)}}var Ba=new THREE.Vector3,Ja=new THREE.Vector3,Ga=new THREE.Vector3,
-ja=new THREE.Vector3,Pa,ya,Xa,j=0;for(T=W.length;j<T;++j){aa=W[j].start;da=W[j].count;ta=W[j].index;h=aa;for(aa=aa+da;h<aa;h=h+3){da=ta+c[h];Fa=ta+c[h+1];ha=ta+c[h+2];b(da);b(Fa);b(ha)}}this.tangentsNeedUpdate=this.hasTangents=true}}};THREE.Gyroscope=function(){THREE.Object3D.call(this)};THREE.Gyroscope.prototype=Object.create(THREE.Object3D.prototype);
+{itemSize:4,array:new Float32Array(j),numItems:j}}for(var l=this.attributes.tangent.array,k=[],i=[],j=0;j<h;j++){k[j]=new THREE.Vector3;i[j]=new THREE.Vector3}var m,n,o,u,q,r,p,x,w,H,v,E,A,G,C,P,I,U,V,S,z,O,Q,F,ea,sa,N=new THREE.Vector3,ja=new THREE.Vector3,aa,T,da,Fa,ha,W=this.offsets,j=0;for(T=W.length;j<T;++j){aa=W[j].start;da=W[j].count;var ta=W[j].index,h=aa;for(aa=aa+da;h<aa;h=h+3){da=ta+c[h];Fa=ta+c[h+1];ha=ta+c[h+2];a(da,Fa,ha)}}var Ba=new THREE.Vector3,Ja=new THREE.Vector3,Ga=new THREE.Vector3,
+ka=new THREE.Vector3,Pa,ya,Xa,j=0;for(T=W.length;j<T;++j){aa=W[j].start;da=W[j].count;ta=W[j].index;h=aa;for(aa=aa+da;h<aa;h=h+3){da=ta+c[h];Fa=ta+c[h+1];ha=ta+c[h+2];b(da);b(Fa);b(ha)}}this.tangentsNeedUpdate=this.hasTangents=true}}};THREE.Gyroscope=function(){THREE.Object3D.call(this)};THREE.Gyroscope.prototype=Object.create(THREE.Object3D.prototype);
 THREE.Gyroscope.prototype.updateMatrixWorld=function(a){this.matrixAutoUpdate&&this.updateMatrix();if(this.matrixWorldNeedsUpdate||a){if(this.parent){this.matrixWorld.multiply(this.parent.matrixWorld,this.matrix);this.matrixWorld.decompose(this.translationWorld,this.rotationWorld,this.scaleWorld);this.matrix.decompose(this.translationObject,this.rotationObject,this.scaleObject);this.matrixWorld.compose(this.translationWorld,this.rotationObject,this.scaleWorld)}else this.matrixWorld.copy(this.matrix);
 this.matrixWorldNeedsUpdate=false;a=true}for(var b=0,c=this.children.length;b<c;b++)this.children[b].updateMatrixWorld(a)};THREE.Gyroscope.prototype.translationWorld=new THREE.Vector3;THREE.Gyroscope.prototype.translationObject=new THREE.Vector3;THREE.Gyroscope.prototype.rotationWorld=new THREE.Quaternion;THREE.Gyroscope.prototype.rotationObject=new THREE.Quaternion;THREE.Gyroscope.prototype.scaleWorld=new THREE.Vector3;THREE.Gyroscope.prototype.scaleObject=new THREE.Vector3;
 THREE.CameraHelper=function(a){function b(a,b,d){c(a,d);c(b,d)}function c(a,b){d.lineGeometry.vertices.push(new THREE.Vector3);d.lineGeometry.colors.push(new THREE.Color(b));d.pointMap[a]===void 0&&(d.pointMap[a]=[]);d.pointMap[a].push(d.lineGeometry.vertices.length-1)}THREE.Object3D.call(this);var d=this;this.lineGeometry=new THREE.Geometry;this.lineMaterial=new THREE.LineBasicMaterial({color:16777215,vertexColors:THREE.FaceColors});this.pointMap={};b("n1","n2",16755200);b("n2","n4",16755200);b("n4",

+ 1 - 1
examples/canvas_geometry_birds.html

@@ -357,7 +357,7 @@
 					boid.setAvoidWalls( true );
 					boid.setWorldSize( 500, 500, 400 );
 
-					bird = birds[ i ] = new THREE.Mesh( new Bird(), new THREE.MeshBasicMaterial( { color:Math.random() * 0xffffff, doubleSided: true } ) );
+					bird = birds[ i ] = new THREE.Mesh( new Bird(), new THREE.MeshBasicMaterial( { color:Math.random() * 0xffffff, side: THREE.DoubleSide } ) );
 					bird.phase = Math.floor( Math.random() * 62.83 );
 					bird.position = boids[ i ].position;
 					scene.add( bird );

+ 13 - 13
examples/canvas_materials.html

@@ -66,33 +66,33 @@
 
 				var geometry = new THREE.SphereGeometry( 100, 14, 7, false );
 
-				var materials = [
+				geometry.materials = [
 
-					{ material: new THREE.MeshBasicMaterial( { color: 0x00ffff, wireframe: true, oubleSided: true } ) },
-					{ material: new THREE.MeshBasicMaterial( { color: 0xff0000, blending: THREE.AdditiveBlending, doubleSided: true } ) },
-					{ material: new THREE.MeshLambertMaterial( { color: 0xffffff, shading: THREE.FlatShading, doubleSided: false, overdraw: true } ) },
-					{ material: new THREE.MeshLambertMaterial( { color: 0xffffff, shading: THREE.SmoothShading, doubleSided: false, overdraw: true } ) },
-					{ material: new THREE.MeshDepthMaterial( { doubleSided: false, overdraw: true } ) },
-					{ material: new THREE.MeshNormalMaterial( { doubleSided: false, overdraw: true } ) },
-					{ material: new THREE.MeshBasicMaterial( { map: THREE.ImageUtils.loadTexture( 'textures/land_ocean_ice_cloud_2048.jpg' ), doubleSided: false } ) },
-					{ material: new THREE.MeshBasicMaterial( { envMap: THREE.ImageUtils.loadTexture( 'textures/envmap.png', new THREE.SphericalReflectionMapping() ), doubleSided: false } ) }
+					new THREE.MeshBasicMaterial( { color: 0x00ffff, wireframe: true, side: THREE.DoubleSide } ),
+					new THREE.MeshBasicMaterial( { color: 0xff0000, blending: THREE.AdditiveBlending, side: THREE.DoubleSide } ),
+					new THREE.MeshLambertMaterial( { color: 0xffffff, shading: THREE.FlatShading, side: THREE.DoubleSide, overdraw: true } ),
+					new THREE.MeshLambertMaterial( { color: 0xffffff, shading: THREE.SmoothShading, overdraw: true } ),
+					new THREE.MeshDepthMaterial( { overdraw: true } ),
+					new THREE.MeshNormalMaterial( { overdraw: true } ),
+					new THREE.MeshBasicMaterial( { map: THREE.ImageUtils.loadTexture( 'textures/land_ocean_ice_cloud_2048.jpg' ) } ),
+					new THREE.MeshBasicMaterial( { envMap: THREE.ImageUtils.loadTexture( 'textures/envmap.png', new THREE.SphericalReflectionMapping() ) } )
 
 				];
 
 				for ( var i = 0, l = geometry.faces.length; i < l; i ++ ) {
 
 					var face = geometry.faces[ i ];
-					if ( Math.random() > 0.7 ) face.material = [ materials[ Math.floor( Math.random() * materials.length )  ].material ];
+					if ( Math.random() > 0.5 ) face.materialIndex = Math.floor( Math.random() * geometry.materials.length );
 
 				}
 
-				materials.push( { material: new THREE.MeshFaceMaterial(), overdraw: false, doubleSided: true } );
+				geometry.materials.push( new THREE.MeshFaceMaterial() );
 
 				objects = [];
 
-				for ( var i = 0, l = materials.length; i < l; i ++ ) {
+				for ( var i = 0, l = geometry.materials.length; i < l; i ++ ) {
 
-					var sphere = new THREE.Mesh( geometry, materials[ i ].material );
+					var sphere = new THREE.Mesh( geometry, geometry.materials[ i ] );
 
 					sphere.position.x = ( i % 5 ) * 200 - 400;
 					sphere.position.z = Math.floor( i / 5 ) * 200 - 200;

+ 1 - 1
examples/canvas_materials_depth.html

@@ -61,7 +61,7 @@
 
 				// Plane
 
-				var material = new THREE.MeshDepthMaterial( { doubleSided: true, overdraw: true } );
+				var material = new THREE.MeshDepthMaterial( { side: THREE.DoubleSide, overdraw: true } );
 
 				plane = new THREE.Mesh( new THREE.PlaneGeometry( 1000, 1000, 10, 10 ), material );
 				plane.position.y = - 100;

+ 2 - 7
examples/misc_ubiquity_test.html

@@ -79,7 +79,7 @@
 
 				// PLANE
 
-				mesh = new THREE.Mesh( new THREE.PlaneGeometry( 100, 100 ), new THREE.MeshBasicMaterial( { color: Math.random() * 0xffffff, doubleSided: true } ) );
+				mesh = new THREE.Mesh( new THREE.PlaneGeometry( 100, 100 ), new THREE.MeshBasicMaterial( { color: Math.random() * 0xffffff, side: THREE.DoubleSide } ) );
 				mesh.position.y = -500;
 				mesh.scale.x = mesh.scale.y = mesh.scale.z = 2;
 				scene.add( mesh );
@@ -110,7 +110,7 @@
 
 					var face = new THREE.Face3( geometry.vertices.push( v0 ) - 1, geometry.vertices.push( v1 ) - 1, geometry.vertices.push( v2 ) - 1, null, null, geometry.materials.length );
 
-					geometry.materials.push( new THREE.MeshBasicMaterial( { color: Math.random() * 0xffffff, doubleSided: true } ) );
+					geometry.materials.push( new THREE.MeshBasicMaterial( { color: Math.random() * 0xffffff, side: THREE.DoubleSide } ) );
 
 					geometry.faces.push( face );
 
@@ -126,11 +126,6 @@
 				mesh = new THREE.Mesh( geometry, new THREE.MeshFaceMaterial() );
 				group.add( mesh );
 
-				/*
-				mesh = new THREE.Mesh( geometry, new THREE.MeshBasicMaterial( { color: 0xff0000, opacity: 0.5, transparent: true, wireframe: true, wireframeLinewidth: 10, doubleSided: true } ) );
-				group.add( mesh );
-				*/
-
 				// LIGHTS
 
 				var ambient = new THREE.AmbientLight( 0x80ffff );

+ 3 - 0
src/core/Projector.js

@@ -195,6 +195,9 @@ THREE.Projector = function() {
 					face = faces[ f ];
 
 					material = isFaceMaterial === true ? geometryMaterials[ face.materialIndex ] : object.material;
+
+					if ( material === undefined ) continue;
+
 					side = material.side;
 
 					if ( face instanceof THREE.Face3 ) {