Browse Source

Code clean up.
Removed old Blender exporters.
Slim exporter is now Normal exporter (needs some testing).

Mr.doob 14 years ago
parent
commit
34f802e392

+ 20 - 20
build/Three.js

@@ -80,12 +80,12 @@ THREE.ParticleDOMMaterial=function(a){this.domElement=a;this.toString=function()
 THREE.UVMapping=0;THREE.ReflectionMap=1;THREE.RefractionMap=2;THREE.Multiply=0;THREE.Mix=1;THREE.Repeat=0;THREE.ClampToEdge=1;THREE.MirroredRepeat=2;THREE.TextureCube=function(a,c){this.image=a;this.mapping=c?c:THREE.ReflectionMap;this.toString=function(){return"THREE.TextureCube (<br/>image: "+this.image+"<br/>mapping: "+this.mapping+"<br/>)"}};
 THREE.Scene=function(){this.objects=[];this.lights=[];this.addObject=function(a){this.objects.push(a)};this.removeObject=function(a){a=this.objects.indexOf(a);a!==-1&&this.objects.splice(a,1)};this.addLight=function(a){this.lights.push(a)};this.removeLight=function(a){a=this.lights.indexOf(a);a!==-1&&this.lights.splice(a,1)};this.toString=function(){return"THREE.Scene ( "+this.objects+" )"}};
 THREE.Projector=function(){function a(L,u){var w=0,H=1,A=L.z+L.w,I=u.z+u.w,p=-L.z+L.w,x=-u.z+u.w;if(A>=0&&I>=0&&p>=0&&x>=0)return true;else if(A<0&&I<0||p<0&&x<0)return false;else{if(A<0)w=Math.max(w,A/(A-I));else if(I<0)H=Math.min(H,A/(A-I));if(p<0)w=Math.max(w,p/(p-x));else if(x<0)H=Math.min(H,p/(p-x));if(H<w)return false;else{L.lerpSelf(u,w);u.lerpSelf(L,1-H);return true}}}var c=null,e,g,b,d=[],n,q,o=[],f,h,k=[],i=new THREE.Vector4,m=new THREE.Matrix4,l=new THREE.Matrix4,s=new THREE.Vector4,v=
-new THREE.Vector4,j;this.projectScene=function(L,u){var w,H,A,I,p,x,Y,C,Z,O,aa,ca,M,Q,r,E,K;c=[];b=_face4Count=q=h=0;u.autoUpdateMatrix&&u.updateMatrix();m.multiply(u.projectionMatrix,u.matrix);Y=L.objects;w=0;for(H=Y.length;w<H;w++){C=Y[w];C.autoUpdateMatrix&&C.updateMatrix();Z=C.matrix;O=C.rotationMatrix;aa=C.material;ca=C.overdraw;if(C instanceof THREE.Mesh){M=C.geometry.vertices;A=0;for(I=M.length;A<I;A++){Q=M[A];Q.positionWorld.copy(Q.position);Z.transform(Q.positionWorld);r=Q.positionScreen;
-r.copy(Q.positionWorld);m.transform(r);r.multiplyScalar(1/r.w);Q.__visible=r.z>0&&r.z<1}Q=C.geometry.faces;A=0;for(I=Q.length;A<I;A++){r=Q[A];if(r instanceof THREE.Face3){p=M[r.a];x=M[r.b];E=M[r.c];if(p.__visible&&x.__visible&&E.__visible)if(C.doubleSided||C.flipSided!=(E.positionScreen.x-p.positionScreen.x)*(x.positionScreen.y-p.positionScreen.y)-(E.positionScreen.y-p.positionScreen.y)*(x.positionScreen.x-p.positionScreen.x)<0){e=d[b]=d[b]||new THREE.RenderableFace3;e.v1.positionWorld.copy(p.positionWorld);
-e.v2.positionWorld.copy(x.positionWorld);e.v3.positionWorld.copy(E.positionWorld);e.v1.positionScreen.copy(p.positionScreen);e.v2.positionScreen.copy(x.positionScreen);e.v3.positionScreen.copy(E.positionScreen);e.normalWorld.copy(r.normal);O.transform(e.normalWorld);e.centroidWorld.copy(r.centroid);Z.transform(e.centroidWorld);e.centroidScreen.copy(e.centroidWorld);m.transform(e.centroidScreen);E=r.vertexNormals;j=e.vertexNormalsWorld;p=0;for(x=E.length;p<x;p++){K=j[p].copy(E[p]);O.transform(K)}e.z=
-e.centroidScreen.z;e.meshMaterial=aa;e.faceMaterial=r.material;e.overdraw=ca;if(C.geometry.uvs[A]){e.uvs[0]=C.geometry.uvs[A][0];e.uvs[1]=C.geometry.uvs[A][1];e.uvs[2]=C.geometry.uvs[A][2]}c.push(e);b++}}else if(r instanceof THREE.Face4){p=M[r.a];x=M[r.b];E=M[r.c];K=M[r.d];if(p.__visible&&x.__visible&&E.__visible&&K.__visible)if(C.doubleSided||C.flipSided!=((K.positionScreen.x-p.positionScreen.x)*(x.positionScreen.y-p.positionScreen.y)-(K.positionScreen.y-p.positionScreen.y)*(x.positionScreen.x-p.positionScreen.x)<
-0||(x.positionScreen.x-E.positionScreen.x)*(K.positionScreen.y-E.positionScreen.y)-(x.positionScreen.y-E.positionScreen.y)*(K.positionScreen.x-E.positionScreen.x)<0)){e=d[b]=d[b]||new THREE.RenderableFace3;e.v1.positionWorld.copy(p.positionWorld);e.v2.positionWorld.copy(x.positionWorld);e.v3.positionWorld.copy(K.positionWorld);e.v1.positionScreen.copy(p.positionScreen);e.v2.positionScreen.copy(x.positionScreen);e.v3.positionScreen.copy(K.positionScreen);e.normalWorld.copy(r.normal);O.transform(e.normalWorld);
-e.centroidWorld.copy(r.centroid);Z.transform(e.centroidWorld);e.centroidScreen.copy(e.centroidWorld);m.transform(e.centroidScreen);e.z=e.centroidScreen.z;e.meshMaterial=aa;e.faceMaterial=r.material;e.overdraw=ca;if(C.geometry.uvs[A]){e.uvs[0]=C.geometry.uvs[A][0];e.uvs[1]=C.geometry.uvs[A][1];e.uvs[2]=C.geometry.uvs[A][3]}c.push(e);b++;g=d[b]=d[b]||new THREE.RenderableFace3;g.v1.positionWorld.copy(x.positionWorld);g.v2.positionWorld.copy(E.positionWorld);g.v3.positionWorld.copy(K.positionWorld);g.v1.positionScreen.copy(x.positionScreen);
+new THREE.Vector4,j;this.projectScene=function(L,u){var w,H,A,I,p,x,Y,C,Z,O,aa,ca,M,Q,r,E,K;c=[];b=q=h=0;u.autoUpdateMatrix&&u.updateMatrix();m.multiply(u.projectionMatrix,u.matrix);Y=L.objects;w=0;for(H=Y.length;w<H;w++){C=Y[w];C.autoUpdateMatrix&&C.updateMatrix();Z=C.matrix;O=C.rotationMatrix;aa=C.material;ca=C.overdraw;if(C instanceof THREE.Mesh){M=C.geometry.vertices;A=0;for(I=M.length;A<I;A++){Q=M[A];Q.positionWorld.copy(Q.position);Z.transform(Q.positionWorld);r=Q.positionScreen;r.copy(Q.positionWorld);
+m.transform(r);r.multiplyScalar(1/r.w);Q.__visible=r.z>0&&r.z<1}Q=C.geometry.faces;A=0;for(I=Q.length;A<I;A++){r=Q[A];if(r instanceof THREE.Face3){p=M[r.a];x=M[r.b];E=M[r.c];if(p.__visible&&x.__visible&&E.__visible)if(C.doubleSided||C.flipSided!=(E.positionScreen.x-p.positionScreen.x)*(x.positionScreen.y-p.positionScreen.y)-(E.positionScreen.y-p.positionScreen.y)*(x.positionScreen.x-p.positionScreen.x)<0){e=d[b]=d[b]||new THREE.RenderableFace3;e.v1.positionWorld.copy(p.positionWorld);e.v2.positionWorld.copy(x.positionWorld);
+e.v3.positionWorld.copy(E.positionWorld);e.v1.positionScreen.copy(p.positionScreen);e.v2.positionScreen.copy(x.positionScreen);e.v3.positionScreen.copy(E.positionScreen);e.normalWorld.copy(r.normal);O.transform(e.normalWorld);e.centroidWorld.copy(r.centroid);Z.transform(e.centroidWorld);e.centroidScreen.copy(e.centroidWorld);m.transform(e.centroidScreen);E=r.vertexNormals;j=e.vertexNormalsWorld;p=0;for(x=E.length;p<x;p++){K=j[p].copy(E[p]);O.transform(K)}e.z=e.centroidScreen.z;e.meshMaterial=aa;e.faceMaterial=
+r.material;e.overdraw=ca;if(C.geometry.uvs[A]){e.uvs[0]=C.geometry.uvs[A][0];e.uvs[1]=C.geometry.uvs[A][1];e.uvs[2]=C.geometry.uvs[A][2]}c.push(e);b++}}else if(r instanceof THREE.Face4){p=M[r.a];x=M[r.b];E=M[r.c];K=M[r.d];if(p.__visible&&x.__visible&&E.__visible&&K.__visible)if(C.doubleSided||C.flipSided!=((K.positionScreen.x-p.positionScreen.x)*(x.positionScreen.y-p.positionScreen.y)-(K.positionScreen.y-p.positionScreen.y)*(x.positionScreen.x-p.positionScreen.x)<0||(x.positionScreen.x-E.positionScreen.x)*
+(K.positionScreen.y-E.positionScreen.y)-(x.positionScreen.y-E.positionScreen.y)*(K.positionScreen.x-E.positionScreen.x)<0)){e=d[b]=d[b]||new THREE.RenderableFace3;e.v1.positionWorld.copy(p.positionWorld);e.v2.positionWorld.copy(x.positionWorld);e.v3.positionWorld.copy(K.positionWorld);e.v1.positionScreen.copy(p.positionScreen);e.v2.positionScreen.copy(x.positionScreen);e.v3.positionScreen.copy(K.positionScreen);e.normalWorld.copy(r.normal);O.transform(e.normalWorld);e.centroidWorld.copy(r.centroid);
+Z.transform(e.centroidWorld);e.centroidScreen.copy(e.centroidWorld);m.transform(e.centroidScreen);e.z=e.centroidScreen.z;e.meshMaterial=aa;e.faceMaterial=r.material;e.overdraw=ca;if(C.geometry.uvs[A]){e.uvs[0]=C.geometry.uvs[A][0];e.uvs[1]=C.geometry.uvs[A][1];e.uvs[2]=C.geometry.uvs[A][3]}c.push(e);b++;g=d[b]=d[b]||new THREE.RenderableFace3;g.v1.positionWorld.copy(x.positionWorld);g.v2.positionWorld.copy(E.positionWorld);g.v3.positionWorld.copy(K.positionWorld);g.v1.positionScreen.copy(x.positionScreen);
 g.v2.positionScreen.copy(E.positionScreen);g.v3.positionScreen.copy(K.positionScreen);g.normalWorld.copy(e.normalWorld);g.centroidWorld.copy(e.centroidWorld);g.centroidScreen.copy(e.centroidScreen);g.z=g.centroidScreen.z;g.meshMaterial=aa;g.faceMaterial=r.material;g.overdraw=ca;if(C.geometry.uvs[A]){g.uvs[0]=C.geometry.uvs[A][1];g.uvs[1]=C.geometry.uvs[A][2];g.uvs[2]=C.geometry.uvs[A][3]}c.push(g);b++}}}}else if(C instanceof THREE.Line){l.multiply(m,Z);M=C.geometry.vertices;Q=M[0];Q.positionScreen.copy(Q.position);
 l.transform(Q.positionScreen);A=1;for(I=M.length;A<I;A++){p=M[A];p.positionScreen.copy(p.position);l.transform(p.positionScreen);x=M[A-1];s.copy(p.positionScreen);v.copy(x.positionScreen);if(a(s,v)){s.multiplyScalar(1/s.w);v.multiplyScalar(1/v.w);n=o[q]=o[q]||new THREE.RenderableLine;n.v1.positionScreen.copy(s);n.v2.positionScreen.copy(v);n.z=Math.max(s.z,v.z);n.material=C.material;c.push(n);q++}}}else if(C instanceof THREE.Particle){i.set(C.position.x,C.position.y,C.position.z,1);m.transform(i);
 i.z/=i.w;if(i.z>0&&i.z<1){f=k[h]=k[h]||new THREE.RenderableParticle;f.x=i.x/i.w;f.y=i.y/i.w;f.z=i.z;f.rotation=C.rotation.z;f.scale.x=C.scale.x*Math.abs(f.x-(i.x+u.projectionMatrix.n11)/(i.w+u.projectionMatrix.n14));f.scale.y=C.scale.y*Math.abs(f.y-(i.y+u.projectionMatrix.n22)/(i.w+u.projectionMatrix.n24));f.material=C.material;c.push(f);h++}}}c.sort(function(U,z){return z.z-U.z});return c};this.unprojectVector=function(L,u){var w=new THREE.Matrix4;w.multiply(THREE.Matrix4.makeInvert(u.matrix),THREE.Matrix4.makeInvert(u.projectionMatrix));
@@ -93,19 +93,19 @@ w.transform(L);return L}};
 THREE.DOMRenderer=function(){THREE.Renderer.call(this);var a=null,c=new THREE.Projector,e,g,b,d;this.domElement=document.createElement("div");this.setSize=function(n,q){e=n;g=q;b=e/2;d=g/2};this.render=function(n,q){var o,f,h,k,i,m,l,s;a=c.projectScene(n,q);o=0;for(f=a.length;o<f;o++){i=a[o];if(i instanceof THREE.RenderableParticle){l=i.x*b+b;s=i.y*d+d;h=0;for(k=i.material.length;h<k;h++){m=i.material[h];if(m instanceof THREE.ParticleDOMMaterial){m=m.domElement;m.style.left=l+"px";m.style.top=s+"px"}}}}}};
 THREE.CanvasRenderer=function(){function a(D,T,P,B){var t,F,W,N,S=D.lights;D=0;for(t=S.length;D<t;D++){F=S[D];W=F.color;N=F.intensity;if(F instanceof THREE.DirectionalLight){F=P.dot(F.position)*N;if(F>0){B.r+=W.r*F;B.g+=W.g*F;B.b+=W.b*F}}else if(F instanceof THREE.PointLight){ra.sub(F.position,T);ra.normalize();F=P.dot(ra)*N;if(F>0){B.r+=W.r*F;B.g+=W.g*F;B.b+=W.b*F}}}}function c(D,T,P,B,t,F){if(t.opacity!=0){d(t.opacity);n(t.blending);Y=D.positionScreen.x;C=D.positionScreen.y;Z=T.positionScreen.x;
 O=T.positionScreen.y;aa=P.positionScreen.x;ca=P.positionScreen.y;var W=Y,N=C,S=Z,X=O,V=aa,ba=ca;j.beginPath();j.moveTo(W,N);j.lineTo(S,X);j.lineTo(V,ba);j.lineTo(W,N);j.closePath();if(t instanceof THREE.MeshBasicMaterial)if(t.map)b(Y,C,Z,O,aa,ca,t.map.image,B.uvs[0].u,B.uvs[0].v,B.uvs[1].u,B.uvs[1].v,B.uvs[2].u,B.uvs[2].v);else t.wireframe?e(t.color.__styleString,t.wireframe_linewidth):g(t.color.__styleString);else if(t instanceof THREE.MeshLambertMaterial){if(t.map&&!t.wireframe){b(Y,C,Z,O,aa,ca,
-t.map.image,B.uvs[0].u,B.uvs[0].v,B.uvs[1].u,B.uvs[1].v,B.uvs[2].u,B.uvs[2].v);n(THREE.SubtractiveBlending)}if(da)if(t.shading==THREE.SmoothShading&&!t.wireframe){Q.r=r.r=E.r=ea.r;Q.g=r.g=E.g=ea.g;Q.b=r.b=E.b=ea.b;a(F,B.v1.positionWorld,B.vertexNormalsWorld[0],Q);a(F,B.v2.positionWorld,B.vertexNormalsWorld[1],r);a(F,B.v3.positionWorld,B.vertexNormalsWorld[2],E);K.r=(r.r+E.r)*0.5;K.g=(r.g+E.g)*0.5;K.b=(r.b+E.b)*0.5;R=q(Q,r,E,K);b(Y,C,Z,O,aa,ca,R,0,0,1,0,0,1)}else{fa.r=ea.r;fa.g=ea.g;fa.b=ea.b;a(F,
-B.centroidWorld,B.normalWorld,fa);M.r=t.color.r*fa.r;M.g=t.color.g*fa.g;M.b=t.color.b*fa.b;M.updateStyleString();t.wireframe?e(M.__styleString,t.wireframe_linewidth):g(M.__styleString)}else t.wireframe?e(t.color.__styleString,t.wireframe_linewidth):g(t.color.__styleString)}else if(t instanceof THREE.MeshDepthMaterial){U=t.__2near;z=t.__farPlusNear;y=t.__farMinusNear;Q.r=Q.g=Q.b=1-U/(z-D.positionScreen.z*y);r.r=r.g=r.b=1-U/(z-T.positionScreen.z*y);E.r=E.g=E.b=1-U/(z-P.positionScreen.z*y);K.r=(r.r+
-E.r)*0.5;K.g=(r.g+E.g)*0.5;K.b=(r.b+E.b)*0.5;R=q(Q,r,E,K);b(Y,C,Z,O,aa,ca,R,0,0,1,0,0,1)}else if(t instanceof THREE.MeshNormalMaterial){M.r=o(B.normalWorld.x);M.g=o(B.normalWorld.y);M.b=o(B.normalWorld.z);M.updateStyleString();t.wireframe?e(M.__styleString,t.wireframe_linewidth):g(M.__styleString)}}}function e(D,T){if(w!=D)j.strokeStyle=w=D;if(A!=T)j.lineWidth=A=T;j.stroke()}function g(D){if(H!=D)j.fillStyle=H=D;j.fill()}function b(D,T,P,B,t,F,W,N,S,X,V,ba,ja){var ia=W.width-1,ga=W.height-1;N*=ia;
-S*=ga;X*=ia;V*=ga;ba*=ia;ja*=ga;P-=D;B-=T;t-=D;F-=T;X-=N;V-=S;ba-=N;ja-=S;ga=1/(X*ja-ba*V);ia=(ja*P-V*t)*ga;V=(ja*B-V*F)*ga;P=(X*t-ba*P)*ga;B=(X*F-ba*B)*ga;D=D-ia*N-P*S;T=T-V*N-B*S;j.save();j.transform(ia,V,P,B,D,T);j.clip();j.drawImage(W,0,0);j.restore()}function d(D){if(L!=D)j.globalAlpha=L=D}function n(D){if(u!=D){switch(D){case THREE.NormalBlending:j.globalCompositeOperation="source-over";break;case THREE.AdditiveBlending:j.globalCompositeOperation="lighter";break;case THREE.SubtractiveBlending:j.globalCompositeOperation=
+t.map.image,B.uvs[0].u,B.uvs[0].v,B.uvs[1].u,B.uvs[1].v,B.uvs[2].u,B.uvs[2].v);n(THREE.SubtractiveBlending)}if(ea)if(t.shading==THREE.SmoothShading&&!t.wireframe){Q.r=r.r=E.r=fa.r;Q.g=r.g=E.g=fa.g;Q.b=r.b=E.b=fa.b;a(F,B.v1.positionWorld,B.vertexNormalsWorld[0],Q);a(F,B.v2.positionWorld,B.vertexNormalsWorld[1],r);a(F,B.v3.positionWorld,B.vertexNormalsWorld[2],E);K.r=(r.r+E.r)*0.5;K.g=(r.g+E.g)*0.5;K.b=(r.b+E.b)*0.5;R=q(Q,r,E,K);b(Y,C,Z,O,aa,ca,R,0,0,1,0,0,1)}else{ga.r=fa.r;ga.g=fa.g;ga.b=fa.b;a(F,
+B.centroidWorld,B.normalWorld,ga);M.r=t.color.r*ga.r;M.g=t.color.g*ga.g;M.b=t.color.b*ga.b;M.updateStyleString();t.wireframe?e(M.__styleString,t.wireframe_linewidth):g(M.__styleString)}else t.wireframe?e(t.color.__styleString,t.wireframe_linewidth):g(t.color.__styleString)}else if(t instanceof THREE.MeshDepthMaterial){U=t.__2near;z=t.__farPlusNear;y=t.__farMinusNear;Q.r=Q.g=Q.b=1-U/(z-D.positionScreen.z*y);r.r=r.g=r.b=1-U/(z-T.positionScreen.z*y);E.r=E.g=E.b=1-U/(z-P.positionScreen.z*y);K.r=(r.r+
+E.r)*0.5;K.g=(r.g+E.g)*0.5;K.b=(r.b+E.b)*0.5;R=q(Q,r,E,K);b(Y,C,Z,O,aa,ca,R,0,0,1,0,0,1)}else if(t instanceof THREE.MeshNormalMaterial){M.r=o(B.normalWorld.x);M.g=o(B.normalWorld.y);M.b=o(B.normalWorld.z);M.updateStyleString();t.wireframe?e(M.__styleString,t.wireframe_linewidth):g(M.__styleString)}}}function e(D,T){if(w!=D)j.strokeStyle=w=D;if(A!=T)j.lineWidth=A=T;j.stroke()}function g(D){if(H!=D)j.fillStyle=H=D;j.fill()}function b(D,T,P,B,t,F,W,N,S,X,V,ba,ja){var ia,da;ia=W.width-1;da=W.height-1;
+N*=ia;S*=da;X*=ia;V*=da;ba*=ia;ja*=da;P-=D;B-=T;t-=D;F-=T;X-=N;V-=S;ba-=N;ja-=S;da=1/(X*ja-ba*V);ia=(ja*P-V*t)*da;V=(ja*B-V*F)*da;P=(X*t-ba*P)*da;B=(X*F-ba*B)*da;D=D-ia*N-P*S;T=T-V*N-B*S;j.save();j.transform(ia,V,P,B,D,T);j.clip();j.drawImage(W,0,0);j.restore()}function d(D){if(L!=D)j.globalAlpha=L=D}function n(D){if(u!=D){switch(D){case THREE.NormalBlending:j.globalCompositeOperation="source-over";break;case THREE.AdditiveBlending:j.globalCompositeOperation="lighter";break;case THREE.SubtractiveBlending:j.globalCompositeOperation=
 "darker"}u=D}}function q(D,T,P,B){ha[0]=~~(D.r*255);ha[1]=~~(D.g*255);ha[2]=~~(D.b*255);ha[4]=~~(T.r*255);ha[5]=~~(T.g*255);ha[6]=~~(T.b*255);ha[8]=~~(P.r*255);ha[9]=~~(P.g*255);ha[10]=~~(P.b*255);ha[12]=~~(B.r*255);ha[13]=~~(B.g*255);ha[14]=~~(B.b*255);na.putImageData(sa,0,0);qa.drawImage(oa,0,0);return pa}function o(D){return D<0?Math.min((1+D)*0.5,0.5):0.5+Math.min(D*0.5,0.5)}function f(D,T){var P=T.x-D.x,B=T.y-D.y,t=1/Math.sqrt(P*P+B*B);P*=t;B*=t;T.x+=P;T.y+=B;D.x-=P;D.y-=B}var h=null,k=new THREE.Projector,
-i=document.createElement("canvas"),m,l,s,v,j=i.getContext("2d"),L=1,u=0,w=null,H=null,A=1,I,p,x,Y,C,Z,O,aa,ca,M=new THREE.Color,Q=new THREE.Color,r=new THREE.Color,E=new THREE.Color,K=new THREE.Color,U,z,y,R,$=new THREE.Rectangle,G=new THREE.Rectangle,J=new THREE.Rectangle,da=false,fa=new THREE.Color,ea=new THREE.Color,ka=new THREE.Color,la=new THREE.Color,va=Math.PI*2,ra=new THREE.Vector3;new THREE.UV;new THREE.UV;new THREE.UV;new THREE.UV;var oa,na,sa,ha,pa,qa,ma=16;oa=document.createElement("canvas");
-oa.width=oa.height=2;na=oa.getContext("2d");na.fillStyle="rgba(0,0,0,1)";na.fillRect(0,0,2,2);sa=na.getImageData(0,0,2,2);ha=sa.data;pa=document.createElement("canvas");pa.width=pa.height=ma;qa=pa.getContext("2d");qa.translate(-ma/2,-ma/2);qa.scale(ma,ma);ma--;this.domElement=i;this.autoClear=true;this.setSize=function(D,T){m=D;l=T;s=m/2;v=l/2;i.width=m;i.height=l;$.set(-s,-v,s,v)};this.clear=function(){if(!G.isEmpty()){G.inflate(1);G.minSelf($);j.clearRect(G.getX(),G.getY(),G.getWidth(),G.getHeight());
-G.empty()}};this.render=function(D,T){var P,B,t,F,W,N,S,X;j.setTransform(1,0,0,-1,s,v);this.autoClear&&this.clear();h=k.projectScene(D,T);if(da=D.lights.length>0){W=D.lights;ea.setRGB(0,0,0);ka.setRGB(0,0,0);la.setRGB(0,0,0);P=0;for(B=W.length;P<B;P++){t=W[P];F=t.color;if(t instanceof THREE.AmbientLight){ea.r+=F.r;ea.g+=F.g;ea.b+=F.b}else if(t instanceof THREE.DirectionalLight){ka.r+=F.r;ka.g+=F.g;ka.b+=F.b}else if(t instanceof THREE.PointLight){la.r+=F.r;la.g+=F.g;la.b+=F.b}}}P=0;for(B=h.length;P<
-B;P++){t=h[P];J.empty();if(t instanceof THREE.RenderableParticle){I=t;I.x*=s;I.y*=v;F=0;for(W=t.material.length;F<W;F++){N=I;S=t;var V=t.material[F];if(V.opacity!=0){d(V.opacity);n(V.blending);X=void 0;var ba=void 0,ja=void 0,ia=void 0,ga=void 0,ta=void 0,ua=void 0;if(V instanceof THREE.ParticleBasicMaterial){if(V.map){ga=V.map;ta=ga.width>>1;ua=ga.height>>1;ja=S.scale.x*s;ia=S.scale.y*v;X=ja*ta;ba=ia*ua;J.set(N.x-X,N.y-ba,N.x+X,N.y+ba);if($.instersects(J)){j.save();j.translate(N.x,N.y);j.rotate(-S.rotation);
-j.scale(ja,-ia);j.translate(-ta,-ua);j.drawImage(ga,0,0);j.restore()}}}else if(V instanceof THREE.ParticleCircleMaterial){if(da){fa.r=ea.r+ka.r+la.r;fa.g=ea.g+ka.g+la.g;fa.b=ea.b+ka.b+la.b;M.r=V.color.r*fa.r;M.g=V.color.g*fa.g;M.b=V.color.b*fa.b;M.updateStyleString()}else M.__styleString=V.color.__styleString;X=S.scale.x*s;ba=S.scale.y*v;J.set(N.x-X,N.y-ba,N.x+X,N.y+ba);if($.instersects(J)){V=M.__styleString;if(H!=V)j.fillStyle=H=V;j.save();j.translate(N.x,N.y);j.rotate(-S.rotation);j.scale(X,ba);
-j.beginPath();j.arc(0,0,1,0,va,true);j.closePath();j.fill();j.restore()}}}}}else if(t instanceof THREE.RenderableLine){I=t.v1;p=t.v2;I.positionScreen.x*=s;I.positionScreen.y*=v;p.positionScreen.x*=s;p.positionScreen.y*=v;J.addPoint(I.positionScreen.x,I.positionScreen.y);J.addPoint(p.positionScreen.x,p.positionScreen.y);if($.instersects(J)){F=0;for(W=t.material.length;F<W;){S=I;X=p;N=t.material[F++];if(N.opacity!=0){d(N.opacity);n(N.blending);j.beginPath();j.moveTo(S.positionScreen.x,S.positionScreen.y);
-j.lineTo(X.positionScreen.x,X.positionScreen.y);j.closePath();if(N instanceof THREE.LineBasicMaterial){M.__styleString=N.color.__styleString;S=N.linewidth;if(A!=S)j.lineWidth=A=S;S=M.__styleString;if(w!=S)j.strokeStyle=w=S;j.stroke();J.inflate(N.linewidth*2)}}}}}else if(t instanceof THREE.RenderableFace3){I=t.v1;p=t.v2;x=t.v3;I.positionScreen.x*=s;I.positionScreen.y*=v;p.positionScreen.x*=s;p.positionScreen.y*=v;x.positionScreen.x*=s;x.positionScreen.y*=v;if(t.overdraw){f(I.positionScreen,p.positionScreen);
-f(p.positionScreen,x.positionScreen);f(x.positionScreen,I.positionScreen)}J.addPoint(I.positionScreen.x,I.positionScreen.y);J.addPoint(p.positionScreen.x,p.positionScreen.y);J.addPoint(x.positionScreen.x,x.positionScreen.y);if($.instersects(J)){F=0;for(W=t.meshMaterial.length;F<W;){X=t.meshMaterial[F++];if(X instanceof THREE.MeshFaceMaterial){N=0;for(S=t.faceMaterial.length;N<S;)(X=t.faceMaterial[N++])&&c(I,p,x,t,X,D)}else c(I,p,x,t,X,D)}}}G.addRectangle(J)}j.setTransform(1,0,0,1,0,0)}};
+i=document.createElement("canvas"),m,l,s,v,j=i.getContext("2d"),L=1,u=0,w=null,H=null,A=1,I,p,x,Y,C,Z,O,aa,ca,M=new THREE.Color,Q=new THREE.Color,r=new THREE.Color,E=new THREE.Color,K=new THREE.Color,U,z,y,R,$=new THREE.Rectangle,G=new THREE.Rectangle,J=new THREE.Rectangle,ea=false,ga=new THREE.Color,fa=new THREE.Color,ka=new THREE.Color,la=new THREE.Color,va=Math.PI*2,ra=new THREE.Vector3,oa,na,sa,ha,pa,qa,ma=16;oa=document.createElement("canvas");oa.width=oa.height=2;na=oa.getContext("2d");na.fillStyle=
+"rgba(0,0,0,1)";na.fillRect(0,0,2,2);sa=na.getImageData(0,0,2,2);ha=sa.data;pa=document.createElement("canvas");pa.width=pa.height=ma;qa=pa.getContext("2d");qa.translate(-ma/2,-ma/2);qa.scale(ma,ma);ma--;this.domElement=i;this.autoClear=true;this.setSize=function(D,T){m=D;l=T;s=m/2;v=l/2;i.width=m;i.height=l;$.set(-s,-v,s,v)};this.clear=function(){if(!G.isEmpty()){G.inflate(1);G.minSelf($);j.clearRect(G.getX(),G.getY(),G.getWidth(),G.getHeight());G.empty()}};this.render=function(D,T){var P,B,t,F,
+W,N,S,X;j.setTransform(1,0,0,-1,s,v);this.autoClear&&this.clear();h=k.projectScene(D,T);if(ea=D.lights.length>0){W=D.lights;fa.setRGB(0,0,0);ka.setRGB(0,0,0);la.setRGB(0,0,0);P=0;for(B=W.length;P<B;P++){t=W[P];F=t.color;if(t instanceof THREE.AmbientLight){fa.r+=F.r;fa.g+=F.g;fa.b+=F.b}else if(t instanceof THREE.DirectionalLight){ka.r+=F.r;ka.g+=F.g;ka.b+=F.b}else if(t instanceof THREE.PointLight){la.r+=F.r;la.g+=F.g;la.b+=F.b}}}P=0;for(B=h.length;P<B;P++){t=h[P];J.empty();if(t instanceof THREE.RenderableParticle){I=
+t;I.x*=s;I.y*=v;F=0;for(W=t.material.length;F<W;F++){N=I;S=t;var V=t.material[F];if(V.opacity!=0){d(V.opacity);n(V.blending);X=void 0;var ba=void 0,ja=void 0,ia=void 0,da=void 0,ta=void 0,ua=void 0;if(V instanceof THREE.ParticleBasicMaterial){if(V.map){da=V.map;ta=da.width>>1;ua=da.height>>1;ja=S.scale.x*s;ia=S.scale.y*v;X=ja*ta;ba=ia*ua;J.set(N.x-X,N.y-ba,N.x+X,N.y+ba);if($.instersects(J)){j.save();j.translate(N.x,N.y);j.rotate(-S.rotation);j.scale(ja,-ia);j.translate(-ta,-ua);j.drawImage(da,0,0);
+j.restore()}}}else if(V instanceof THREE.ParticleCircleMaterial){if(ea){ga.r=fa.r+ka.r+la.r;ga.g=fa.g+ka.g+la.g;ga.b=fa.b+ka.b+la.b;M.r=V.color.r*ga.r;M.g=V.color.g*ga.g;M.b=V.color.b*ga.b;M.updateStyleString()}else M.__styleString=V.color.__styleString;X=S.scale.x*s;ba=S.scale.y*v;J.set(N.x-X,N.y-ba,N.x+X,N.y+ba);if($.instersects(J)){V=M.__styleString;if(H!=V)j.fillStyle=H=V;j.save();j.translate(N.x,N.y);j.rotate(-S.rotation);j.scale(X,ba);j.beginPath();j.arc(0,0,1,0,va,true);j.closePath();j.fill();
+j.restore()}}}}}else if(t instanceof THREE.RenderableLine){I=t.v1;p=t.v2;I.positionScreen.x*=s;I.positionScreen.y*=v;p.positionScreen.x*=s;p.positionScreen.y*=v;J.addPoint(I.positionScreen.x,I.positionScreen.y);J.addPoint(p.positionScreen.x,p.positionScreen.y);if($.instersects(J)){F=0;for(W=t.material.length;F<W;){S=I;X=p;N=t.material[F++];if(N.opacity!=0){d(N.opacity);n(N.blending);j.beginPath();j.moveTo(S.positionScreen.x,S.positionScreen.y);j.lineTo(X.positionScreen.x,X.positionScreen.y);j.closePath();
+if(N instanceof THREE.LineBasicMaterial){M.__styleString=N.color.__styleString;S=N.linewidth;if(A!=S)j.lineWidth=A=S;S=M.__styleString;if(w!=S)j.strokeStyle=w=S;j.stroke();J.inflate(N.linewidth*2)}}}}}else if(t instanceof THREE.RenderableFace3){I=t.v1;p=t.v2;x=t.v3;I.positionScreen.x*=s;I.positionScreen.y*=v;p.positionScreen.x*=s;p.positionScreen.y*=v;x.positionScreen.x*=s;x.positionScreen.y*=v;if(t.overdraw){f(I.positionScreen,p.positionScreen);f(p.positionScreen,x.positionScreen);f(x.positionScreen,
+I.positionScreen)}J.addPoint(I.positionScreen.x,I.positionScreen.y);J.addPoint(p.positionScreen.x,p.positionScreen.y);J.addPoint(x.positionScreen.x,x.positionScreen.y);if($.instersects(J)){F=0;for(W=t.meshMaterial.length;F<W;){X=t.meshMaterial[F++];if(X instanceof THREE.MeshFaceMaterial){N=0;for(S=t.faceMaterial.length;N<S;)(X=t.faceMaterial[N++])&&c(I,p,x,t,X,D)}else c(I,p,x,t,X,D)}}}G.addRectangle(J)}j.setTransform(1,0,0,1,0,0)}};
 THREE.SVGRenderer=function(){function a(r,E,K){var U,z,y,R;U=0;for(z=r.lights.length;U<z;U++){y=r.lights[U];if(y instanceof THREE.DirectionalLight){R=E.normalWorld.dot(y.position)*y.intensity;if(R>0){K.r+=y.color.r*R;K.g+=y.color.g*R;K.b+=y.color.b*R}}else if(y instanceof THREE.PointLight){x.sub(y.position,E.centroidWorld);x.normalize();R=E.normalWorld.dot(x)*y.intensity;if(R>0){K.r+=y.color.r*R;K.g+=y.color.g*R;K.b+=y.color.b*R}}}}function c(r,E,K,U,z,y){O=g(aa++);O.setAttribute("d","M "+r.positionScreen.x+
 " "+r.positionScreen.y+" L "+E.positionScreen.x+" "+E.positionScreen.y+" L "+K.positionScreen.x+","+K.positionScreen.y+"z");if(z instanceof THREE.MeshBasicMaterial)u.__styleString=z.color.__styleString;else if(z instanceof THREE.MeshLambertMaterial)if(L){w.r=H.r;w.g=H.g;w.b=H.b;a(y,U,w);u.r=z.color.r*w.r;u.g=z.color.g*w.g;u.b=z.color.b*w.b;u.updateStyleString()}else u.__styleString=z.color.__styleString;else if(z instanceof THREE.MeshDepthMaterial){p=1-z.__2near/(z.__farPlusNear-U.z*z.__farMinusNear);
 u.setRGB(p,p,p)}else z instanceof THREE.MeshNormalMaterial&&u.setRGB(b(U.normalWorld.x),b(U.normalWorld.y),b(U.normalWorld.z));z.wireframe?O.setAttribute("style","fill: none; stroke: "+u.__styleString+"; stroke-width: "+z.wireframe_linewidth+"; stroke-opacity: "+z.opacity+"; stroke-linecap: "+z.wireframe_linecap+"; stroke-linejoin: "+z.wireframe_linejoin):O.setAttribute("style","fill: "+u.__styleString+"; fill-opacity: "+z.opacity);q.appendChild(O)}function e(r,E,K,U,z,y,R){O=g(aa++);O.setAttribute("d",
@@ -114,8 +114,8 @@ u.setRGB(p,p,p)}else z instanceof THREE.MeshNormalMaterial&&u.setRGB(b(U.normalW
 function g(r){if(Y[r]==null){Y[r]=document.createElementNS("http://www.w3.org/2000/svg","path");Q==0&&Y[r].setAttribute("shape-rendering","crispEdges");return Y[r]}return Y[r]}function b(r){return r<0?Math.min((1+r)*0.5,0.5):0.5+Math.min(r*0.5,0.5)}var d=null,n=new THREE.Projector,q=document.createElementNS("http://www.w3.org/2000/svg","svg"),o,f,h,k,i,m,l,s,v=new THREE.Rectangle,j=new THREE.Rectangle,L=false,u=new THREE.Color(16777215),w=new THREE.Color(16777215),H=new THREE.Color(0),A=new THREE.Color(0),
 I=new THREE.Color(0),p,x=new THREE.Vector3,Y=[],C=[],Z=[],O,aa,ca,M,Q=1;this.domElement=q;this.autoClear=true;this.setQuality=function(r){switch(r){case "high":Q=1;break;case "low":Q=0}};this.setSize=function(r,E){o=r;f=E;h=o/2;k=f/2;q.setAttribute("viewBox",-h+" "+-k+" "+o+" "+f);q.setAttribute("width",o);q.setAttribute("height",f);v.set(-h,-k,h,k)};this.clear=function(){for(;q.childNodes.length>0;)q.removeChild(q.childNodes[0])};this.render=function(r,E){var K,U,z,y,R,$,G,J;this.autoClear&&this.clear();
 d=n.projectScene(r,E);M=ca=aa=0;if(L=r.lights.length>0){G=r.lights;H.setRGB(0,0,0);A.setRGB(0,0,0);I.setRGB(0,0,0);K=0;for(U=G.length;K<U;K++){z=G[K];y=z.color;if(z instanceof THREE.AmbientLight){H.r+=y.r;H.g+=y.g;H.b+=y.b}else if(z instanceof THREE.DirectionalLight){A.r+=y.r;A.g+=y.g;A.b+=y.b}else if(z instanceof THREE.PointLight){I.r+=y.r;I.g+=y.g;I.b+=y.b}}}K=0;for(U=d.length;K<U;K++){G=d[K];j.empty();if(G instanceof THREE.RenderableParticle){i=G;i.x*=h;i.y*=-k;z=0;for(y=G.material.length;z<y;z++)if(J=
-G.material[z]){R=i;$=G;J=J;var da=ca++;if(C[da]==null){C[da]=document.createElementNS("http://www.w3.org/2000/svg","circle");Q==0&&C[da].setAttribute("shape-rendering","crispEdges")}O=C[da];O.setAttribute("cx",R.x);O.setAttribute("cy",R.y);O.setAttribute("r",$.scale.x*h);if(J instanceof THREE.ParticleCircleMaterial){if(L){w.r=H.r+A.r+I.r;w.g=H.g+A.g+I.g;w.b=H.b+A.b+I.b;u.r=J.color.r*w.r;u.g=J.color.g*w.g;u.b=J.color.b*w.b;u.updateStyleString()}else u=J.color;O.setAttribute("style","fill: "+u.__styleString)}q.appendChild(O)}}else if(G instanceof
-THREE.RenderableLine){i=G.v1;m=G.v2;i.positionScreen.x*=h;i.positionScreen.y*=-k;m.positionScreen.x*=h;m.positionScreen.y*=-k;j.addPoint(i.positionScreen.x,i.positionScreen.y);j.addPoint(m.positionScreen.x,m.positionScreen.y);if(v.instersects(j)){z=0;for(y=G.material.length;z<y;)if(J=G.material[z++]){R=i;$=m;J=J;da=M++;if(Z[da]==null){Z[da]=document.createElementNS("http://www.w3.org/2000/svg","line");Q==0&&Z[da].setAttribute("shape-rendering","crispEdges")}O=Z[da];O.setAttribute("x1",R.positionScreen.x);
+G.material[z]){R=i;$=G;J=J;var ea=ca++;if(C[ea]==null){C[ea]=document.createElementNS("http://www.w3.org/2000/svg","circle");Q==0&&C[ea].setAttribute("shape-rendering","crispEdges")}O=C[ea];O.setAttribute("cx",R.x);O.setAttribute("cy",R.y);O.setAttribute("r",$.scale.x*h);if(J instanceof THREE.ParticleCircleMaterial){if(L){w.r=H.r+A.r+I.r;w.g=H.g+A.g+I.g;w.b=H.b+A.b+I.b;u.r=J.color.r*w.r;u.g=J.color.g*w.g;u.b=J.color.b*w.b;u.updateStyleString()}else u=J.color;O.setAttribute("style","fill: "+u.__styleString)}q.appendChild(O)}}else if(G instanceof
+THREE.RenderableLine){i=G.v1;m=G.v2;i.positionScreen.x*=h;i.positionScreen.y*=-k;m.positionScreen.x*=h;m.positionScreen.y*=-k;j.addPoint(i.positionScreen.x,i.positionScreen.y);j.addPoint(m.positionScreen.x,m.positionScreen.y);if(v.instersects(j)){z=0;for(y=G.material.length;z<y;)if(J=G.material[z++]){R=i;$=m;J=J;ea=M++;if(Z[ea]==null){Z[ea]=document.createElementNS("http://www.w3.org/2000/svg","line");Q==0&&Z[ea].setAttribute("shape-rendering","crispEdges")}O=Z[ea];O.setAttribute("x1",R.positionScreen.x);
 O.setAttribute("y1",R.positionScreen.y);O.setAttribute("x2",$.positionScreen.x);O.setAttribute("y2",$.positionScreen.y);if(J instanceof THREE.LineBasicMaterial){u.__styleString=J.color.__styleString;O.setAttribute("style","fill: none; stroke: "+u.__styleString+"; stroke-width: "+J.linewidth+"; stroke-opacity: "+J.opacity+"; stroke-linecap: "+J.linecap+"; stroke-linejoin: "+J.linejoin);q.appendChild(O)}}}}else if(G instanceof THREE.RenderableFace3){i=G.v1;m=G.v2;l=G.v3;i.positionScreen.x*=h;i.positionScreen.y*=
 -k;m.positionScreen.x*=h;m.positionScreen.y*=-k;l.positionScreen.x*=h;l.positionScreen.y*=-k;j.addPoint(i.positionScreen.x,i.positionScreen.y);j.addPoint(m.positionScreen.x,m.positionScreen.y);j.addPoint(l.positionScreen.x,l.positionScreen.y);if(v.instersects(j)){z=0;for(y=G.meshMaterial.length;z<y;){J=G.meshMaterial[z++];if(J instanceof THREE.MeshFaceMaterial){R=0;for($=G.faceMaterial.length;R<$;)(J=G.faceMaterial[R++])&&c(i,m,l,G,J,r)}else J&&c(i,m,l,G,J,r)}}}else if(G instanceof THREE.RenderableFace4){i=
 G.v1;m=G.v2;l=G.v3;s=G.v4;i.positionScreen.x*=h;i.positionScreen.y*=-k;m.positionScreen.x*=h;m.positionScreen.y*=-k;l.positionScreen.x*=h;l.positionScreen.y*=-k;s.positionScreen.x*=h;s.positionScreen.y*=-k;j.addPoint(i.positionScreen.x,i.positionScreen.y);j.addPoint(m.positionScreen.x,m.positionScreen.y);j.addPoint(l.positionScreen.x,l.positionScreen.y);j.addPoint(s.positionScreen.x,s.positionScreen.y);if(v.instersects(j)){z=0;for(y=G.meshMaterial.length;z<y;){J=G.meshMaterial[z++];if(J instanceof

+ 21 - 21
build/ThreeDebug.js

@@ -80,12 +80,12 @@ THREE.ParticleDOMMaterial=function(a){this.domElement=a;this.toString=function()
 THREE.UVMapping=0;THREE.ReflectionMap=1;THREE.RefractionMap=2;THREE.Multiply=0;THREE.Mix=1;THREE.Repeat=0;THREE.ClampToEdge=1;THREE.MirroredRepeat=2;THREE.TextureCube=function(a,c){this.image=a;this.mapping=c?c:THREE.ReflectionMap;this.toString=function(){return"THREE.TextureCube (<br/>image: "+this.image+"<br/>mapping: "+this.mapping+"<br/>)"}};
 THREE.Scene=function(){this.objects=[];this.lights=[];this.addObject=function(a){this.objects.push(a)};this.removeObject=function(a){a=this.objects.indexOf(a);a!==-1&&this.objects.splice(a,1)};this.addLight=function(a){this.lights.push(a)};this.removeLight=function(a){a=this.lights.indexOf(a);a!==-1&&this.lights.splice(a,1)};this.toString=function(){return"THREE.Scene ( "+this.objects+" )"}};
 THREE.Projector=function(){function a(M,u){var w=0,I=1,A=M.z+M.w,J=u.z+u.w,p=-M.z+M.w,x=-u.z+u.w;if(A>=0&&J>=0&&p>=0&&x>=0)return true;else if(A<0&&J<0||p<0&&x<0)return false;else{if(A<0)w=Math.max(w,A/(A-J));else if(J<0)I=Math.min(I,A/(A-J));if(p<0)w=Math.max(w,p/(p-x));else if(x<0)I=Math.min(I,p/(p-x));if(I<w)return false;else{M.lerpSelf(u,w);u.lerpSelf(M,1-I);return true}}}var c=null,e,g,b,d=[],n,q,o=[],f,h,k=[],i=new THREE.Vector4,m=new THREE.Matrix4,l=new THREE.Matrix4,s=new THREE.Vector4,v=
-new THREE.Vector4,j;this.projectScene=function(M,u){var w,I,A,J,p,x,Y,C,$,O,aa,ca,N,Q,r,F,L;c=[];b=_face4Count=q=h=0;u.autoUpdateMatrix&&u.updateMatrix();m.multiply(u.projectionMatrix,u.matrix);Y=M.objects;w=0;for(I=Y.length;w<I;w++){C=Y[w];C.autoUpdateMatrix&&C.updateMatrix();$=C.matrix;O=C.rotationMatrix;aa=C.material;ca=C.overdraw;if(C instanceof THREE.Mesh){N=C.geometry.vertices;A=0;for(J=N.length;A<J;A++){Q=N[A];Q.positionWorld.copy(Q.position);$.transform(Q.positionWorld);r=Q.positionScreen;
-r.copy(Q.positionWorld);m.transform(r);r.multiplyScalar(1/r.w);Q.__visible=r.z>0&&r.z<1}Q=C.geometry.faces;A=0;for(J=Q.length;A<J;A++){r=Q[A];if(r instanceof THREE.Face3){p=N[r.a];x=N[r.b];F=N[r.c];if(p.__visible&&x.__visible&&F.__visible)if(C.doubleSided||C.flipSided!=(F.positionScreen.x-p.positionScreen.x)*(x.positionScreen.y-p.positionScreen.y)-(F.positionScreen.y-p.positionScreen.y)*(x.positionScreen.x-p.positionScreen.x)<0){e=d[b]=d[b]||new THREE.RenderableFace3;e.v1.positionWorld.copy(p.positionWorld);
-e.v2.positionWorld.copy(x.positionWorld);e.v3.positionWorld.copy(F.positionWorld);e.v1.positionScreen.copy(p.positionScreen);e.v2.positionScreen.copy(x.positionScreen);e.v3.positionScreen.copy(F.positionScreen);e.normalWorld.copy(r.normal);O.transform(e.normalWorld);e.centroidWorld.copy(r.centroid);$.transform(e.centroidWorld);e.centroidScreen.copy(e.centroidWorld);m.transform(e.centroidScreen);F=r.vertexNormals;j=e.vertexNormalsWorld;p=0;for(x=F.length;p<x;p++){L=j[p].copy(F[p]);O.transform(L)}e.z=
-e.centroidScreen.z;e.meshMaterial=aa;e.faceMaterial=r.material;e.overdraw=ca;if(C.geometry.uvs[A]){e.uvs[0]=C.geometry.uvs[A][0];e.uvs[1]=C.geometry.uvs[A][1];e.uvs[2]=C.geometry.uvs[A][2]}c.push(e);b++}}else if(r instanceof THREE.Face4){p=N[r.a];x=N[r.b];F=N[r.c];L=N[r.d];if(p.__visible&&x.__visible&&F.__visible&&L.__visible)if(C.doubleSided||C.flipSided!=((L.positionScreen.x-p.positionScreen.x)*(x.positionScreen.y-p.positionScreen.y)-(L.positionScreen.y-p.positionScreen.y)*(x.positionScreen.x-p.positionScreen.x)<
-0||(x.positionScreen.x-F.positionScreen.x)*(L.positionScreen.y-F.positionScreen.y)-(x.positionScreen.y-F.positionScreen.y)*(L.positionScreen.x-F.positionScreen.x)<0)){e=d[b]=d[b]||new THREE.RenderableFace3;e.v1.positionWorld.copy(p.positionWorld);e.v2.positionWorld.copy(x.positionWorld);e.v3.positionWorld.copy(L.positionWorld);e.v1.positionScreen.copy(p.positionScreen);e.v2.positionScreen.copy(x.positionScreen);e.v3.positionScreen.copy(L.positionScreen);e.normalWorld.copy(r.normal);O.transform(e.normalWorld);
-e.centroidWorld.copy(r.centroid);$.transform(e.centroidWorld);e.centroidScreen.copy(e.centroidWorld);m.transform(e.centroidScreen);e.z=e.centroidScreen.z;e.meshMaterial=aa;e.faceMaterial=r.material;e.overdraw=ca;if(C.geometry.uvs[A]){e.uvs[0]=C.geometry.uvs[A][0];e.uvs[1]=C.geometry.uvs[A][1];e.uvs[2]=C.geometry.uvs[A][3]}c.push(e);b++;g=d[b]=d[b]||new THREE.RenderableFace3;g.v1.positionWorld.copy(x.positionWorld);g.v2.positionWorld.copy(F.positionWorld);g.v3.positionWorld.copy(L.positionWorld);g.v1.positionScreen.copy(x.positionScreen);
+new THREE.Vector4,j;this.projectScene=function(M,u){var w,I,A,J,p,x,Y,C,$,O,aa,ca,N,Q,r,F,L;c=[];b=q=h=0;u.autoUpdateMatrix&&u.updateMatrix();m.multiply(u.projectionMatrix,u.matrix);Y=M.objects;w=0;for(I=Y.length;w<I;w++){C=Y[w];C.autoUpdateMatrix&&C.updateMatrix();$=C.matrix;O=C.rotationMatrix;aa=C.material;ca=C.overdraw;if(C instanceof THREE.Mesh){N=C.geometry.vertices;A=0;for(J=N.length;A<J;A++){Q=N[A];Q.positionWorld.copy(Q.position);$.transform(Q.positionWorld);r=Q.positionScreen;r.copy(Q.positionWorld);
+m.transform(r);r.multiplyScalar(1/r.w);Q.__visible=r.z>0&&r.z<1}Q=C.geometry.faces;A=0;for(J=Q.length;A<J;A++){r=Q[A];if(r instanceof THREE.Face3){p=N[r.a];x=N[r.b];F=N[r.c];if(p.__visible&&x.__visible&&F.__visible)if(C.doubleSided||C.flipSided!=(F.positionScreen.x-p.positionScreen.x)*(x.positionScreen.y-p.positionScreen.y)-(F.positionScreen.y-p.positionScreen.y)*(x.positionScreen.x-p.positionScreen.x)<0){e=d[b]=d[b]||new THREE.RenderableFace3;e.v1.positionWorld.copy(p.positionWorld);e.v2.positionWorld.copy(x.positionWorld);
+e.v3.positionWorld.copy(F.positionWorld);e.v1.positionScreen.copy(p.positionScreen);e.v2.positionScreen.copy(x.positionScreen);e.v3.positionScreen.copy(F.positionScreen);e.normalWorld.copy(r.normal);O.transform(e.normalWorld);e.centroidWorld.copy(r.centroid);$.transform(e.centroidWorld);e.centroidScreen.copy(e.centroidWorld);m.transform(e.centroidScreen);F=r.vertexNormals;j=e.vertexNormalsWorld;p=0;for(x=F.length;p<x;p++){L=j[p].copy(F[p]);O.transform(L)}e.z=e.centroidScreen.z;e.meshMaterial=aa;e.faceMaterial=
+r.material;e.overdraw=ca;if(C.geometry.uvs[A]){e.uvs[0]=C.geometry.uvs[A][0];e.uvs[1]=C.geometry.uvs[A][1];e.uvs[2]=C.geometry.uvs[A][2]}c.push(e);b++}}else if(r instanceof THREE.Face4){p=N[r.a];x=N[r.b];F=N[r.c];L=N[r.d];if(p.__visible&&x.__visible&&F.__visible&&L.__visible)if(C.doubleSided||C.flipSided!=((L.positionScreen.x-p.positionScreen.x)*(x.positionScreen.y-p.positionScreen.y)-(L.positionScreen.y-p.positionScreen.y)*(x.positionScreen.x-p.positionScreen.x)<0||(x.positionScreen.x-F.positionScreen.x)*
+(L.positionScreen.y-F.positionScreen.y)-(x.positionScreen.y-F.positionScreen.y)*(L.positionScreen.x-F.positionScreen.x)<0)){e=d[b]=d[b]||new THREE.RenderableFace3;e.v1.positionWorld.copy(p.positionWorld);e.v2.positionWorld.copy(x.positionWorld);e.v3.positionWorld.copy(L.positionWorld);e.v1.positionScreen.copy(p.positionScreen);e.v2.positionScreen.copy(x.positionScreen);e.v3.positionScreen.copy(L.positionScreen);e.normalWorld.copy(r.normal);O.transform(e.normalWorld);e.centroidWorld.copy(r.centroid);
+$.transform(e.centroidWorld);e.centroidScreen.copy(e.centroidWorld);m.transform(e.centroidScreen);e.z=e.centroidScreen.z;e.meshMaterial=aa;e.faceMaterial=r.material;e.overdraw=ca;if(C.geometry.uvs[A]){e.uvs[0]=C.geometry.uvs[A][0];e.uvs[1]=C.geometry.uvs[A][1];e.uvs[2]=C.geometry.uvs[A][3]}c.push(e);b++;g=d[b]=d[b]||new THREE.RenderableFace3;g.v1.positionWorld.copy(x.positionWorld);g.v2.positionWorld.copy(F.positionWorld);g.v3.positionWorld.copy(L.positionWorld);g.v1.positionScreen.copy(x.positionScreen);
 g.v2.positionScreen.copy(F.positionScreen);g.v3.positionScreen.copy(L.positionScreen);g.normalWorld.copy(e.normalWorld);g.centroidWorld.copy(e.centroidWorld);g.centroidScreen.copy(e.centroidScreen);g.z=g.centroidScreen.z;g.meshMaterial=aa;g.faceMaterial=r.material;g.overdraw=ca;if(C.geometry.uvs[A]){g.uvs[0]=C.geometry.uvs[A][1];g.uvs[1]=C.geometry.uvs[A][2];g.uvs[2]=C.geometry.uvs[A][3]}c.push(g);b++}}}}else if(C instanceof THREE.Line){l.multiply(m,$);N=C.geometry.vertices;Q=N[0];Q.positionScreen.copy(Q.position);
 l.transform(Q.positionScreen);A=1;for(J=N.length;A<J;A++){p=N[A];p.positionScreen.copy(p.position);l.transform(p.positionScreen);x=N[A-1];s.copy(p.positionScreen);v.copy(x.positionScreen);if(a(s,v)){s.multiplyScalar(1/s.w);v.multiplyScalar(1/v.w);n=o[q]=o[q]||new THREE.RenderableLine;n.v1.positionScreen.copy(s);n.v2.positionScreen.copy(v);n.z=Math.max(s.z,v.z);n.material=C.material;c.push(n);q++}}}else if(C instanceof THREE.Particle){i.set(C.position.x,C.position.y,C.position.z,1);m.transform(i);
 i.z/=i.w;if(i.z>0&&i.z<1){f=k[h]=k[h]||new THREE.RenderableParticle;f.x=i.x/i.w;f.y=i.y/i.w;f.z=i.z;f.rotation=C.rotation.z;f.scale.x=C.scale.x*Math.abs(f.x-(i.x+u.projectionMatrix.n11)/(i.w+u.projectionMatrix.n14));f.scale.y=C.scale.y*Math.abs(f.y-(i.y+u.projectionMatrix.n22)/(i.w+u.projectionMatrix.n24));f.material=C.material;c.push(f);h++}}}c.sort(function(U,z){return z.z-U.z});return c};this.unprojectVector=function(M,u){var w=new THREE.Matrix4;w.multiply(THREE.Matrix4.makeInvert(u.matrix),THREE.Matrix4.makeInvert(u.projectionMatrix));
@@ -93,20 +93,20 @@ w.transform(M);return M}};
 THREE.DOMRenderer=function(){THREE.Renderer.call(this);var a=null,c=new THREE.Projector,e,g,b,d;this.domElement=document.createElement("div");this.setSize=function(n,q){e=n;g=q;b=e/2;d=g/2};this.render=function(n,q){var o,f,h,k,i,m,l,s;a=c.projectScene(n,q);o=0;for(f=a.length;o<f;o++){i=a[o];if(i instanceof THREE.RenderableParticle){l=i.x*b+b;s=i.y*d+d;h=0;for(k=i.material.length;h<k;h++){m=i.material[h];if(m instanceof THREE.ParticleDOMMaterial){m=m.domElement;m.style.left=l+"px";m.style.top=s+"px"}}}}}};
 THREE.CanvasRenderer=function(){function a(D,T,P,B){var t,G,W,H,S=D.lights;D=0;for(t=S.length;D<t;D++){G=S[D];W=G.color;H=G.intensity;if(G instanceof THREE.DirectionalLight){G=P.dot(G.position)*H;if(G>0){B.r+=W.r*G;B.g+=W.g*G;B.b+=W.b*G}}else if(G instanceof THREE.PointLight){ra.sub(G.position,T);ra.normalize();G=P.dot(ra)*H;if(G>0){B.r+=W.r*G;B.g+=W.g*G;B.b+=W.b*G}}}}function c(D,T,P,B,t,G){if(t.opacity!=0){d(t.opacity);n(t.blending);Y=D.positionScreen.x;C=D.positionScreen.y;$=T.positionScreen.x;
 O=T.positionScreen.y;aa=P.positionScreen.x;ca=P.positionScreen.y;var W=Y,H=C,S=$,X=O,V=aa,ba=ca;j.beginPath();j.moveTo(W,H);j.lineTo(S,X);j.lineTo(V,ba);j.lineTo(W,H);j.closePath();if(t instanceof THREE.MeshBasicMaterial)if(t.map)b(Y,C,$,O,aa,ca,t.map.image,B.uvs[0].u,B.uvs[0].v,B.uvs[1].u,B.uvs[1].v,B.uvs[2].u,B.uvs[2].v);else t.wireframe?e(t.color.__styleString,t.wireframe_linewidth):g(t.color.__styleString);else if(t instanceof THREE.MeshLambertMaterial){if(t.map&&!t.wireframe){b(Y,C,$,O,aa,ca,
-t.map.image,B.uvs[0].u,B.uvs[0].v,B.uvs[1].u,B.uvs[1].v,B.uvs[2].u,B.uvs[2].v);n(THREE.SubtractiveBlending)}if(da)if(t.shading==THREE.SmoothShading&&!t.wireframe){Q.r=r.r=F.r=ea.r;Q.g=r.g=F.g=ea.g;Q.b=r.b=F.b=ea.b;a(G,B.v1.positionWorld,B.vertexNormalsWorld[0],Q);a(G,B.v2.positionWorld,B.vertexNormalsWorld[1],r);a(G,B.v3.positionWorld,B.vertexNormalsWorld[2],F);L.r=(r.r+F.r)*0.5;L.g=(r.g+F.g)*0.5;L.b=(r.b+F.b)*0.5;R=q(Q,r,F,L);b(Y,C,$,O,aa,ca,R,0,0,1,0,0,1)}else{fa.r=ea.r;fa.g=ea.g;fa.b=ea.b;a(G,
-B.centroidWorld,B.normalWorld,fa);N.r=t.color.r*fa.r;N.g=t.color.g*fa.g;N.b=t.color.b*fa.b;N.updateStyleString();t.wireframe?e(N.__styleString,t.wireframe_linewidth):g(N.__styleString)}else t.wireframe?e(t.color.__styleString,t.wireframe_linewidth):g(t.color.__styleString)}else if(t instanceof THREE.MeshDepthMaterial){U=t.__2near;z=t.__farPlusNear;y=t.__farMinusNear;Q.r=Q.g=Q.b=1-U/(z-D.positionScreen.z*y);r.r=r.g=r.b=1-U/(z-T.positionScreen.z*y);F.r=F.g=F.b=1-U/(z-P.positionScreen.z*y);L.r=(r.r+
-F.r)*0.5;L.g=(r.g+F.g)*0.5;L.b=(r.b+F.b)*0.5;R=q(Q,r,F,L);b(Y,C,$,O,aa,ca,R,0,0,1,0,0,1)}else if(t instanceof THREE.MeshNormalMaterial){N.r=o(B.normalWorld.x);N.g=o(B.normalWorld.y);N.b=o(B.normalWorld.z);N.updateStyleString();t.wireframe?e(N.__styleString,t.wireframe_linewidth):g(N.__styleString)}}}function e(D,T){if(w!=D)j.strokeStyle=w=D;if(A!=T)j.lineWidth=A=T;j.stroke()}function g(D){if(I!=D)j.fillStyle=I=D;j.fill()}function b(D,T,P,B,t,G,W,H,S,X,V,ba,ja){var ia=W.width-1,ga=W.height-1;H*=ia;
-S*=ga;X*=ia;V*=ga;ba*=ia;ja*=ga;P-=D;B-=T;t-=D;G-=T;X-=H;V-=S;ba-=H;ja-=S;ga=1/(X*ja-ba*V);ia=(ja*P-V*t)*ga;V=(ja*B-V*G)*ga;P=(X*t-ba*P)*ga;B=(X*G-ba*B)*ga;D=D-ia*H-P*S;T=T-V*H-B*S;j.save();j.transform(ia,V,P,B,D,T);j.clip();j.drawImage(W,0,0);j.restore()}function d(D){if(M!=D)j.globalAlpha=M=D}function n(D){if(u!=D){switch(D){case THREE.NormalBlending:j.globalCompositeOperation="source-over";break;case THREE.AdditiveBlending:j.globalCompositeOperation="lighter";break;case THREE.SubtractiveBlending:j.globalCompositeOperation=
+t.map.image,B.uvs[0].u,B.uvs[0].v,B.uvs[1].u,B.uvs[1].v,B.uvs[2].u,B.uvs[2].v);n(THREE.SubtractiveBlending)}if(ea)if(t.shading==THREE.SmoothShading&&!t.wireframe){Q.r=r.r=F.r=fa.r;Q.g=r.g=F.g=fa.g;Q.b=r.b=F.b=fa.b;a(G,B.v1.positionWorld,B.vertexNormalsWorld[0],Q);a(G,B.v2.positionWorld,B.vertexNormalsWorld[1],r);a(G,B.v3.positionWorld,B.vertexNormalsWorld[2],F);L.r=(r.r+F.r)*0.5;L.g=(r.g+F.g)*0.5;L.b=(r.b+F.b)*0.5;R=q(Q,r,F,L);b(Y,C,$,O,aa,ca,R,0,0,1,0,0,1)}else{ga.r=fa.r;ga.g=fa.g;ga.b=fa.b;a(G,
+B.centroidWorld,B.normalWorld,ga);N.r=t.color.r*ga.r;N.g=t.color.g*ga.g;N.b=t.color.b*ga.b;N.updateStyleString();t.wireframe?e(N.__styleString,t.wireframe_linewidth):g(N.__styleString)}else t.wireframe?e(t.color.__styleString,t.wireframe_linewidth):g(t.color.__styleString)}else if(t instanceof THREE.MeshDepthMaterial){U=t.__2near;z=t.__farPlusNear;y=t.__farMinusNear;Q.r=Q.g=Q.b=1-U/(z-D.positionScreen.z*y);r.r=r.g=r.b=1-U/(z-T.positionScreen.z*y);F.r=F.g=F.b=1-U/(z-P.positionScreen.z*y);L.r=(r.r+
+F.r)*0.5;L.g=(r.g+F.g)*0.5;L.b=(r.b+F.b)*0.5;R=q(Q,r,F,L);b(Y,C,$,O,aa,ca,R,0,0,1,0,0,1)}else if(t instanceof THREE.MeshNormalMaterial){N.r=o(B.normalWorld.x);N.g=o(B.normalWorld.y);N.b=o(B.normalWorld.z);N.updateStyleString();t.wireframe?e(N.__styleString,t.wireframe_linewidth):g(N.__styleString)}}}function e(D,T){if(w!=D)j.strokeStyle=w=D;if(A!=T)j.lineWidth=A=T;j.stroke()}function g(D){if(I!=D)j.fillStyle=I=D;j.fill()}function b(D,T,P,B,t,G,W,H,S,X,V,ba,ja){var ia,da;ia=W.width-1;da=W.height-1;
+H*=ia;S*=da;X*=ia;V*=da;ba*=ia;ja*=da;P-=D;B-=T;t-=D;G-=T;X-=H;V-=S;ba-=H;ja-=S;da=1/(X*ja-ba*V);ia=(ja*P-V*t)*da;V=(ja*B-V*G)*da;P=(X*t-ba*P)*da;B=(X*G-ba*B)*da;D=D-ia*H-P*S;T=T-V*H-B*S;j.save();j.transform(ia,V,P,B,D,T);j.clip();j.drawImage(W,0,0);j.restore()}function d(D){if(M!=D)j.globalAlpha=M=D}function n(D){if(u!=D){switch(D){case THREE.NormalBlending:j.globalCompositeOperation="source-over";break;case THREE.AdditiveBlending:j.globalCompositeOperation="lighter";break;case THREE.SubtractiveBlending:j.globalCompositeOperation=
 "darker"}u=D}}function q(D,T,P,B){ha[0]=~~(D.r*255);ha[1]=~~(D.g*255);ha[2]=~~(D.b*255);ha[4]=~~(T.r*255);ha[5]=~~(T.g*255);ha[6]=~~(T.b*255);ha[8]=~~(P.r*255);ha[9]=~~(P.g*255);ha[10]=~~(P.b*255);ha[12]=~~(B.r*255);ha[13]=~~(B.g*255);ha[14]=~~(B.b*255);na.putImageData(sa,0,0);qa.drawImage(oa,0,0);return pa}function o(D){return D<0?Math.min((1+D)*0.5,0.5):0.5+Math.min(D*0.5,0.5)}function f(D,T){var P=T.x-D.x,B=T.y-D.y,t=1/Math.sqrt(P*P+B*B);P*=t;B*=t;T.x+=P;T.y+=B;D.x-=P;D.y-=B}var h=null,k=new THREE.Projector,
-i=document.createElement("canvas"),m,l,s,v,j=i.getContext("2d"),M=1,u=0,w=null,I=null,A=1,J,p,x,Y,C,$,O,aa,ca,N=new THREE.Color,Q=new THREE.Color,r=new THREE.Color,F=new THREE.Color,L=new THREE.Color,U,z,y,R,Z=new THREE.Rectangle,E=new THREE.Rectangle,K=new THREE.Rectangle,da=false,fa=new THREE.Color,ea=new THREE.Color,ka=new THREE.Color,la=new THREE.Color,va=Math.PI*2,ra=new THREE.Vector3;new THREE.UV;new THREE.UV;new THREE.UV;new THREE.UV;var oa,na,sa,ha,pa,qa,ma=16;oa=document.createElement("canvas");
-oa.width=oa.height=2;na=oa.getContext("2d");na.fillStyle="rgba(0,0,0,1)";na.fillRect(0,0,2,2);sa=na.getImageData(0,0,2,2);ha=sa.data;pa=document.createElement("canvas");pa.width=pa.height=ma;qa=pa.getContext("2d");qa.translate(-ma/2,-ma/2);qa.scale(ma,ma);ma--;this.domElement=i;this.autoClear=true;this.setSize=function(D,T){m=D;l=T;s=m/2;v=l/2;i.width=m;i.height=l;Z.set(-s,-v,s,v)};this.clear=function(){if(!E.isEmpty()){E.inflate(1);E.minSelf(Z);j.clearRect(E.getX(),E.getY(),E.getWidth(),E.getHeight());
-E.empty()}};this.render=function(D,T){var P,B,t,G,W,H,S,X;j.setTransform(1,0,0,-1,s,v);this.autoClear&&this.clear();h=k.projectScene(D,T);j.fillStyle="rgba(0, 255, 255, 0.5)";j.fillRect(Z.getX(),Z.getY(),Z.getWidth(),Z.getHeight());if(da=D.lights.length>0){W=D.lights;ea.setRGB(0,0,0);ka.setRGB(0,0,0);la.setRGB(0,0,0);P=0;for(B=W.length;P<B;P++){t=W[P];G=t.color;if(t instanceof THREE.AmbientLight){ea.r+=G.r;ea.g+=G.g;ea.b+=G.b}else if(t instanceof THREE.DirectionalLight){ka.r+=G.r;ka.g+=G.g;ka.b+=
-G.b}else if(t instanceof THREE.PointLight){la.r+=G.r;la.g+=G.g;la.b+=G.b}}}P=0;for(B=h.length;P<B;P++){t=h[P];K.empty();if(t instanceof THREE.RenderableParticle){J=t;J.x*=s;J.y*=v;G=0;for(W=t.material.length;G<W;G++)a:{H=J;S=t;var V=t.material[G];if(V.opacity!=0){d(V.opacity);n(V.blending);X=void 0;var ba=void 0,ja=void 0,ia=void 0,ga=void 0,ta=void 0,ua=void 0;if(V instanceof THREE.ParticleBasicMaterial){if(V.map){ga=V.map;ta=ga.width>>1;ua=ga.height>>1;ja=S.scale.x*s;ia=S.scale.y*v;X=ja*ta;ba=ia*
-ua;K.set(H.x-X,H.y-ba,H.x+X,H.y+ba);if(!Z.instersects(K))break a;j.save();j.translate(H.x,H.y);j.rotate(-S.rotation);j.scale(ja,-ia);j.translate(-ta,-ua);j.drawImage(ga,0,0);j.restore()}j.beginPath();j.moveTo(H.x-10,H.y);j.lineTo(H.x+10,H.y);j.moveTo(H.x,H.y-10);j.lineTo(H.x,H.y+10);j.closePath();j.strokeStyle="rgb(255,255,0)";j.stroke()}else if(V instanceof THREE.ParticleCircleMaterial){if(da){fa.r=ea.r+ka.r+la.r;fa.g=ea.g+ka.g+la.g;fa.b=ea.b+ka.b+la.b;N.r=V.color.r*fa.r;N.g=V.color.g*fa.g;N.b=V.color.b*
-fa.b;N.updateStyleString()}else N.__styleString=V.color.__styleString;X=S.scale.x*s;ba=S.scale.y*v;K.set(H.x-X,H.y-ba,H.x+X,H.y+ba);if(Z.instersects(K)){V=N.__styleString;if(I!=V)j.fillStyle=I=V;j.save();j.translate(H.x,H.y);j.rotate(-S.rotation);j.scale(X,ba);j.beginPath();j.arc(0,0,1,0,va,true);j.closePath();j.fill();j.restore()}}}}}else if(t instanceof THREE.RenderableLine){J=t.v1;p=t.v2;J.positionScreen.x*=s;J.positionScreen.y*=v;p.positionScreen.x*=s;p.positionScreen.y*=v;K.addPoint(J.positionScreen.x,
-J.positionScreen.y);K.addPoint(p.positionScreen.x,p.positionScreen.y);if(Z.instersects(K)){G=0;for(W=t.material.length;G<W;){S=J;X=p;H=t.material[G++];if(H.opacity!=0){d(H.opacity);n(H.blending);j.beginPath();j.moveTo(S.positionScreen.x,S.positionScreen.y);j.lineTo(X.positionScreen.x,X.positionScreen.y);j.closePath();if(H instanceof THREE.LineBasicMaterial){N.__styleString=H.color.__styleString;S=H.linewidth;if(A!=S)j.lineWidth=A=S;S=N.__styleString;if(w!=S)j.strokeStyle=w=S;j.stroke();K.inflate(H.linewidth*
-2)}}}}}else if(t instanceof THREE.RenderableFace3){J=t.v1;p=t.v2;x=t.v3;J.positionScreen.x*=s;J.positionScreen.y*=v;p.positionScreen.x*=s;p.positionScreen.y*=v;x.positionScreen.x*=s;x.positionScreen.y*=v;if(t.overdraw){f(J.positionScreen,p.positionScreen);f(p.positionScreen,x.positionScreen);f(x.positionScreen,J.positionScreen)}K.addPoint(J.positionScreen.x,J.positionScreen.y);K.addPoint(p.positionScreen.x,p.positionScreen.y);K.addPoint(x.positionScreen.x,x.positionScreen.y);if(Z.instersects(K)){G=
-0;for(W=t.meshMaterial.length;G<W;){X=t.meshMaterial[G++];if(X instanceof THREE.MeshFaceMaterial){H=0;for(S=t.faceMaterial.length;H<S;)(X=t.faceMaterial[H++])&&c(J,p,x,t,X,D)}else c(J,p,x,t,X,D)}}}E.addRectangle(K)}j.lineWidth=1;j.strokeStyle="rgba( 255, 0, 0, 0.5 )";j.strokeRect(E.getX(),E.getY(),E.getWidth(),E.getHeight());j.setTransform(1,0,0,1,0,0)}};
+i=document.createElement("canvas"),m,l,s,v,j=i.getContext("2d"),M=1,u=0,w=null,I=null,A=1,J,p,x,Y,C,$,O,aa,ca,N=new THREE.Color,Q=new THREE.Color,r=new THREE.Color,F=new THREE.Color,L=new THREE.Color,U,z,y,R,Z=new THREE.Rectangle,E=new THREE.Rectangle,K=new THREE.Rectangle,ea=false,ga=new THREE.Color,fa=new THREE.Color,ka=new THREE.Color,la=new THREE.Color,va=Math.PI*2,ra=new THREE.Vector3,oa,na,sa,ha,pa,qa,ma=16;oa=document.createElement("canvas");oa.width=oa.height=2;na=oa.getContext("2d");na.fillStyle=
+"rgba(0,0,0,1)";na.fillRect(0,0,2,2);sa=na.getImageData(0,0,2,2);ha=sa.data;pa=document.createElement("canvas");pa.width=pa.height=ma;qa=pa.getContext("2d");qa.translate(-ma/2,-ma/2);qa.scale(ma,ma);ma--;this.domElement=i;this.autoClear=true;this.setSize=function(D,T){m=D;l=T;s=m/2;v=l/2;i.width=m;i.height=l;Z.set(-s,-v,s,v)};this.clear=function(){if(!E.isEmpty()){E.inflate(1);E.minSelf(Z);j.clearRect(E.getX(),E.getY(),E.getWidth(),E.getHeight());E.empty()}};this.render=function(D,T){var P,B,t,G,
+W,H,S,X;j.setTransform(1,0,0,-1,s,v);this.autoClear&&this.clear();h=k.projectScene(D,T);j.fillStyle="rgba(0, 255, 255, 0.5)";j.fillRect(Z.getX(),Z.getY(),Z.getWidth(),Z.getHeight());if(ea=D.lights.length>0){W=D.lights;fa.setRGB(0,0,0);ka.setRGB(0,0,0);la.setRGB(0,0,0);P=0;for(B=W.length;P<B;P++){t=W[P];G=t.color;if(t instanceof THREE.AmbientLight){fa.r+=G.r;fa.g+=G.g;fa.b+=G.b}else if(t instanceof THREE.DirectionalLight){ka.r+=G.r;ka.g+=G.g;ka.b+=G.b}else if(t instanceof THREE.PointLight){la.r+=G.r;
+la.g+=G.g;la.b+=G.b}}}P=0;for(B=h.length;P<B;P++){t=h[P];K.empty();if(t instanceof THREE.RenderableParticle){J=t;J.x*=s;J.y*=v;G=0;for(W=t.material.length;G<W;G++)a:{H=J;S=t;var V=t.material[G];if(V.opacity!=0){d(V.opacity);n(V.blending);X=void 0;var ba=void 0,ja=void 0,ia=void 0,da=void 0,ta=void 0,ua=void 0;if(V instanceof THREE.ParticleBasicMaterial){if(V.map){da=V.map;ta=da.width>>1;ua=da.height>>1;ja=S.scale.x*s;ia=S.scale.y*v;X=ja*ta;ba=ia*ua;K.set(H.x-X,H.y-ba,H.x+X,H.y+ba);if(!Z.instersects(K))break a;
+j.save();j.translate(H.x,H.y);j.rotate(-S.rotation);j.scale(ja,-ia);j.translate(-ta,-ua);j.drawImage(da,0,0);j.restore()}j.beginPath();j.moveTo(H.x-10,H.y);j.lineTo(H.x+10,H.y);j.moveTo(H.x,H.y-10);j.lineTo(H.x,H.y+10);j.closePath();j.strokeStyle="rgb(255,255,0)";j.stroke()}else if(V instanceof THREE.ParticleCircleMaterial){if(ea){ga.r=fa.r+ka.r+la.r;ga.g=fa.g+ka.g+la.g;ga.b=fa.b+ka.b+la.b;N.r=V.color.r*ga.r;N.g=V.color.g*ga.g;N.b=V.color.b*ga.b;N.updateStyleString()}else N.__styleString=V.color.__styleString;
+X=S.scale.x*s;ba=S.scale.y*v;K.set(H.x-X,H.y-ba,H.x+X,H.y+ba);if(Z.instersects(K)){V=N.__styleString;if(I!=V)j.fillStyle=I=V;j.save();j.translate(H.x,H.y);j.rotate(-S.rotation);j.scale(X,ba);j.beginPath();j.arc(0,0,1,0,va,true);j.closePath();j.fill();j.restore()}}}}}else if(t instanceof THREE.RenderableLine){J=t.v1;p=t.v2;J.positionScreen.x*=s;J.positionScreen.y*=v;p.positionScreen.x*=s;p.positionScreen.y*=v;K.addPoint(J.positionScreen.x,J.positionScreen.y);K.addPoint(p.positionScreen.x,p.positionScreen.y);
+if(Z.instersects(K)){G=0;for(W=t.material.length;G<W;){S=J;X=p;H=t.material[G++];if(H.opacity!=0){d(H.opacity);n(H.blending);j.beginPath();j.moveTo(S.positionScreen.x,S.positionScreen.y);j.lineTo(X.positionScreen.x,X.positionScreen.y);j.closePath();if(H instanceof THREE.LineBasicMaterial){N.__styleString=H.color.__styleString;S=H.linewidth;if(A!=S)j.lineWidth=A=S;S=N.__styleString;if(w!=S)j.strokeStyle=w=S;j.stroke();K.inflate(H.linewidth*2)}}}}}else if(t instanceof THREE.RenderableFace3){J=t.v1;
+p=t.v2;x=t.v3;J.positionScreen.x*=s;J.positionScreen.y*=v;p.positionScreen.x*=s;p.positionScreen.y*=v;x.positionScreen.x*=s;x.positionScreen.y*=v;if(t.overdraw){f(J.positionScreen,p.positionScreen);f(p.positionScreen,x.positionScreen);f(x.positionScreen,J.positionScreen)}K.addPoint(J.positionScreen.x,J.positionScreen.y);K.addPoint(p.positionScreen.x,p.positionScreen.y);K.addPoint(x.positionScreen.x,x.positionScreen.y);if(Z.instersects(K)){G=0;for(W=t.meshMaterial.length;G<W;){X=t.meshMaterial[G++];
+if(X instanceof THREE.MeshFaceMaterial){H=0;for(S=t.faceMaterial.length;H<S;)(X=t.faceMaterial[H++])&&c(J,p,x,t,X,D)}else c(J,p,x,t,X,D)}}}E.addRectangle(K)}j.lineWidth=1;j.strokeStyle="rgba( 255, 0, 0, 0.5 )";j.strokeRect(E.getX(),E.getY(),E.getWidth(),E.getHeight());j.setTransform(1,0,0,1,0,0)}};
 THREE.SVGRenderer=function(){function a(r,F,L){var U,z,y,R;U=0;for(z=r.lights.length;U<z;U++){y=r.lights[U];if(y instanceof THREE.DirectionalLight){R=F.normalWorld.dot(y.position)*y.intensity;if(R>0){L.r+=y.color.r*R;L.g+=y.color.g*R;L.b+=y.color.b*R}}else if(y instanceof THREE.PointLight){x.sub(y.position,F.centroidWorld);x.normalize();R=F.normalWorld.dot(x)*y.intensity;if(R>0){L.r+=y.color.r*R;L.g+=y.color.g*R;L.b+=y.color.b*R}}}}function c(r,F,L,U,z,y){O=g(aa++);O.setAttribute("d","M "+r.positionScreen.x+
 " "+r.positionScreen.y+" L "+F.positionScreen.x+" "+F.positionScreen.y+" L "+L.positionScreen.x+","+L.positionScreen.y+"z");if(z instanceof THREE.MeshBasicMaterial)u.__styleString=z.color.__styleString;else if(z instanceof THREE.MeshLambertMaterial)if(M){w.r=I.r;w.g=I.g;w.b=I.b;a(y,U,w);u.r=z.color.r*w.r;u.g=z.color.g*w.g;u.b=z.color.b*w.b;u.updateStyleString()}else u.__styleString=z.color.__styleString;else if(z instanceof THREE.MeshDepthMaterial){p=1-z.__2near/(z.__farPlusNear-U.z*z.__farMinusNear);
 u.setRGB(p,p,p)}else z instanceof THREE.MeshNormalMaterial&&u.setRGB(b(U.normalWorld.x),b(U.normalWorld.y),b(U.normalWorld.z));z.wireframe?O.setAttribute("style","fill: none; stroke: "+u.__styleString+"; stroke-width: "+z.wireframe_linewidth+"; stroke-opacity: "+z.opacity+"; stroke-linecap: "+z.wireframe_linecap+"; stroke-linejoin: "+z.wireframe_linejoin):O.setAttribute("style","fill: "+u.__styleString+"; fill-opacity: "+z.opacity);q.appendChild(O)}function e(r,F,L,U,z,y,R){O=g(aa++);O.setAttribute("d",
@@ -115,8 +115,8 @@ u.setRGB(p,p,p)}else z instanceof THREE.MeshNormalMaterial&&u.setRGB(b(U.normalW
 function g(r){if(Y[r]==null){Y[r]=document.createElementNS("http://www.w3.org/2000/svg","path");Q==0&&Y[r].setAttribute("shape-rendering","crispEdges");return Y[r]}return Y[r]}function b(r){return r<0?Math.min((1+r)*0.5,0.5):0.5+Math.min(r*0.5,0.5)}var d=null,n=new THREE.Projector,q=document.createElementNS("http://www.w3.org/2000/svg","svg"),o,f,h,k,i,m,l,s,v=new THREE.Rectangle,j=new THREE.Rectangle,M=false,u=new THREE.Color(16777215),w=new THREE.Color(16777215),I=new THREE.Color(0),A=new THREE.Color(0),
 J=new THREE.Color(0),p,x=new THREE.Vector3,Y=[],C=[],$=[],O,aa,ca,N,Q=1;this.domElement=q;this.autoClear=true;this.setQuality=function(r){switch(r){case "high":Q=1;break;case "low":Q=0}};this.setSize=function(r,F){o=r;f=F;h=o/2;k=f/2;q.setAttribute("viewBox",-h+" "+-k+" "+o+" "+f);q.setAttribute("width",o);q.setAttribute("height",f);v.set(-h,-k,h,k)};this.clear=function(){for(;q.childNodes.length>0;)q.removeChild(q.childNodes[0])};this.render=function(r,F){var L,U,z,y,R,Z,E,K;this.autoClear&&this.clear();
 d=n.projectScene(r,F);N=ca=aa=0;if(M=r.lights.length>0){E=r.lights;I.setRGB(0,0,0);A.setRGB(0,0,0);J.setRGB(0,0,0);L=0;for(U=E.length;L<U;L++){z=E[L];y=z.color;if(z instanceof THREE.AmbientLight){I.r+=y.r;I.g+=y.g;I.b+=y.b}else if(z instanceof THREE.DirectionalLight){A.r+=y.r;A.g+=y.g;A.b+=y.b}else if(z instanceof THREE.PointLight){J.r+=y.r;J.g+=y.g;J.b+=y.b}}}L=0;for(U=d.length;L<U;L++){E=d[L];j.empty();if(E instanceof THREE.RenderableParticle){i=E;i.x*=h;i.y*=-k;z=0;for(y=E.material.length;z<y;z++)if(K=
-E.material[z]){R=i;Z=E;K=K;var da=ca++;if(C[da]==null){C[da]=document.createElementNS("http://www.w3.org/2000/svg","circle");Q==0&&C[da].setAttribute("shape-rendering","crispEdges")}O=C[da];O.setAttribute("cx",R.x);O.setAttribute("cy",R.y);O.setAttribute("r",Z.scale.x*h);if(K instanceof THREE.ParticleCircleMaterial){if(M){w.r=I.r+A.r+J.r;w.g=I.g+A.g+J.g;w.b=I.b+A.b+J.b;u.r=K.color.r*w.r;u.g=K.color.g*w.g;u.b=K.color.b*w.b;u.updateStyleString()}else u=K.color;O.setAttribute("style","fill: "+u.__styleString)}q.appendChild(O)}}else if(E instanceof
-THREE.RenderableLine){i=E.v1;m=E.v2;i.positionScreen.x*=h;i.positionScreen.y*=-k;m.positionScreen.x*=h;m.positionScreen.y*=-k;j.addPoint(i.positionScreen.x,i.positionScreen.y);j.addPoint(m.positionScreen.x,m.positionScreen.y);if(v.instersects(j)){z=0;for(y=E.material.length;z<y;)if(K=E.material[z++]){R=i;Z=m;K=K;da=N++;if($[da]==null){$[da]=document.createElementNS("http://www.w3.org/2000/svg","line");Q==0&&$[da].setAttribute("shape-rendering","crispEdges")}O=$[da];O.setAttribute("x1",R.positionScreen.x);
+E.material[z]){R=i;Z=E;K=K;var ea=ca++;if(C[ea]==null){C[ea]=document.createElementNS("http://www.w3.org/2000/svg","circle");Q==0&&C[ea].setAttribute("shape-rendering","crispEdges")}O=C[ea];O.setAttribute("cx",R.x);O.setAttribute("cy",R.y);O.setAttribute("r",Z.scale.x*h);if(K instanceof THREE.ParticleCircleMaterial){if(M){w.r=I.r+A.r+J.r;w.g=I.g+A.g+J.g;w.b=I.b+A.b+J.b;u.r=K.color.r*w.r;u.g=K.color.g*w.g;u.b=K.color.b*w.b;u.updateStyleString()}else u=K.color;O.setAttribute("style","fill: "+u.__styleString)}q.appendChild(O)}}else if(E instanceof
+THREE.RenderableLine){i=E.v1;m=E.v2;i.positionScreen.x*=h;i.positionScreen.y*=-k;m.positionScreen.x*=h;m.positionScreen.y*=-k;j.addPoint(i.positionScreen.x,i.positionScreen.y);j.addPoint(m.positionScreen.x,m.positionScreen.y);if(v.instersects(j)){z=0;for(y=E.material.length;z<y;)if(K=E.material[z++]){R=i;Z=m;K=K;ea=N++;if($[ea]==null){$[ea]=document.createElementNS("http://www.w3.org/2000/svg","line");Q==0&&$[ea].setAttribute("shape-rendering","crispEdges")}O=$[ea];O.setAttribute("x1",R.positionScreen.x);
 O.setAttribute("y1",R.positionScreen.y);O.setAttribute("x2",Z.positionScreen.x);O.setAttribute("y2",Z.positionScreen.y);if(K instanceof THREE.LineBasicMaterial){u.__styleString=K.color.__styleString;O.setAttribute("style","fill: none; stroke: "+u.__styleString+"; stroke-width: "+K.linewidth+"; stroke-opacity: "+K.opacity+"; stroke-linecap: "+K.linecap+"; stroke-linejoin: "+K.linejoin);q.appendChild(O)}}}}else if(E instanceof THREE.RenderableFace3){i=E.v1;m=E.v2;l=E.v3;i.positionScreen.x*=h;i.positionScreen.y*=
 -k;m.positionScreen.x*=h;m.positionScreen.y*=-k;l.positionScreen.x*=h;l.positionScreen.y*=-k;j.addPoint(i.positionScreen.x,i.positionScreen.y);j.addPoint(m.positionScreen.x,m.positionScreen.y);j.addPoint(l.positionScreen.x,l.positionScreen.y);if(v.instersects(j)){z=0;for(y=E.meshMaterial.length;z<y;){K=E.meshMaterial[z++];if(K instanceof THREE.MeshFaceMaterial){R=0;for(Z=E.faceMaterial.length;R<Z;)(K=E.faceMaterial[R++])&&c(i,m,l,E,K,r)}else K&&c(i,m,l,E,K,r)}}}else if(E instanceof THREE.RenderableFace4){i=
 E.v1;m=E.v2;l=E.v3;s=E.v4;i.positionScreen.x*=h;i.positionScreen.y*=-k;m.positionScreen.x*=h;m.positionScreen.y*=-k;l.positionScreen.x*=h;l.positionScreen.y*=-k;s.positionScreen.x*=h;s.positionScreen.y*=-k;j.addPoint(i.positionScreen.x,i.positionScreen.y);j.addPoint(m.positionScreen.x,m.positionScreen.y);j.addPoint(l.positionScreen.x,l.positionScreen.y);j.addPoint(s.positionScreen.x,s.positionScreen.y);if(v.instersects(j)){z=0;for(y=E.meshMaterial.length;z<y;){K=E.meshMaterial[z++];if(K instanceof

+ 12 - 12
examples/canvasrenderer_sandbox.html

@@ -239,23 +239,23 @@
 
 			function loop() {
 
-				if ( moveForward ) camera.position.z -= 5; // camera.moveZ( 5 );
-				if ( moveBackwards ) camera.position.z += 5; // camera.moveZ( - 5 );
+				if ( moveForward ) camera.position.z -= 5;
+				if ( moveBackwards ) camera.position.z += 5;
 
-				if ( moveUp ) camera.position.y += 5; // camera.moveZ( 5 );
-				if ( moveDown ) camera.position.y -= 5; // camera.moveZ( - 5 );
+				if ( moveUp ) camera.position.y += 5;
+				if ( moveDown ) camera.position.y -= 5;
 
-				if ( moveLeft ) camera.position.x -= 5; // camera.moveX( - 5 );
-				if ( moveRight ) camera.position.x += 5; // camera.moveX( 5 );
+				if ( moveLeft ) camera.position.x -= 5;
+				if ( moveRight ) camera.position.x += 5;
 
-				if ( pitchUp ) camera.rotation.x += 0.01; // camera.rotateX( 1 );
-				if ( pitchDown ) camera.rotation.x -= 0.01; // camera.rotateX( - 1 );
+				if ( pitchUp ) camera.rotation.x += 0.01;
+				if ( pitchDown ) camera.rotation.x -= 0.01;
 
-				if ( yawLeft ) camera.target.position.x -= 5; // camera.rotation.y += 0.01; // camera.rotateY( 1 );
-				if ( yawRight ) camera.target.position.x += 5; // camera.rotation.y -= 0.01; // camera.rotateY( - 1 );
+				if ( yawLeft ) camera.target.position.x -= 5;
+				if ( yawRight ) camera.target.position.x += 5;
 
-				if ( rollLeft ) camera.rotation.z += 0.01; // camera.rotateZ( 1 );
-				if ( rollRight ) camera.rotation.z -= 0.01; // camera.rotateZ( - 1 );
+				if ( rollLeft ) camera.rotation.z += 0.01;
+				if ( rollRight ) camera.rotation.z -= 0.01;
 
 				debugContext.clearRect( -256, -256, 512, 512 );
 

+ 6 - 4
src/renderers/CanvasRenderer.js

@@ -27,7 +27,7 @@ THREE.CanvasRenderer = function () {
 	_color4 = new THREE.Color(),
 	_2near, _farPlusNear, _farMinusNear,
 
-	_bitmap, _bitmapWidth, _bitmapHeight,
+	_bitmap,
 
 	_clipRect = new THREE.Rectangle(),
 	_clearRect = new THREE.Rectangle(),
@@ -41,7 +41,6 @@ THREE.CanvasRenderer = function () {
 
 	_pi2 = Math.PI * 2,
 	_vector3 = new THREE.Vector3(), // Needed for PointLight
-	_uv1 = new THREE.UV(), _uv2 = new THREE.UV(), _uv3 = new THREE.UV(), _uv4 = new THREE.UV(),
 
 	_pixelMap, _pixelMapContext, _pixelMapImage, _pixelMapData,
 	_gradientMap, _gradientMapContext, _gradientMapQuality = 16;
@@ -583,6 +582,7 @@ THREE.CanvasRenderer = function () {
 
 	}
 
+	/*
 	function drawQuad( x0, y0, x1, y1, x2, y2, x3, y3 ) {
 
 		_context.beginPath();
@@ -594,6 +594,7 @@ THREE.CanvasRenderer = function () {
 		_context.closePath();
 
 	}
+	*/
 
 	function strokePath( color, linewidth ) {
 
@@ -616,7 +617,8 @@ THREE.CanvasRenderer = function () {
 
 		// http://extremelysatisfactorytotalitarianism.com/blog/?p=2120
 
-		var width = bitmap.width - 1,
+		var a, b, c, d, e, f, det,
+		width = bitmap.width - 1,
 		height = bitmap.height - 1;
 
 		u0 *= width; v0 *= height;
@@ -629,7 +631,7 @@ THREE.CanvasRenderer = function () {
 		u1 -= u0; v1 -= v0;
 		u2 -= u0; v2 -= v0;
 
-		var det = 1 / ( u1 * v2 - u2 * v1 ),
+		det = 1 / ( u1 * v2 - u2 * v1 ),
 
 		a = ( v2 * x1 - v1 * x2 ) * det,
 		b = ( v2 * y1 - v1 * y2 ) * det,

+ 2 - 5
src/renderers/Projector.js

@@ -8,7 +8,6 @@ THREE.Projector = function() {
 
 	var _renderList = null,
 	_face3, _face32, _face3Count, _face3Pool = [],
-	//_face4, _face4Count, _face4Pool = [],
 	_line, _lineCount, _linePool = [],
 	_particle, _particleCount, _particlePool = [],
 
@@ -19,7 +18,7 @@ THREE.Projector = function() {
 	_clippedVertex1PositionScreen = new THREE.Vector4(),
 	_clippedVertex2PositionScreen = new THREE.Vector4(),
 
-	_face3VertexNormals, _face4VertexNormals;
+	_face3VertexNormals;
 
 	this.projectScene = function ( scene, camera ) {
 
@@ -29,7 +28,7 @@ THREE.Projector = function() {
 		faces, face, faceVertexNormals, normal, v1, v2, v3, v4;
 
 		_renderList = [];
-		_face3Count = _face4Count = _lineCount = _particleCount = 0;
+		_face3Count = _lineCount = _particleCount = 0;
 
 		camera.autoUpdateMatrix && camera.updateMatrix();
 
@@ -49,8 +48,6 @@ THREE.Projector = function() {
 
 			if ( object instanceof THREE.Mesh ) {
 
-				// _projScreenObjectMatrix.multiply( _projScreenMatrix, objectMatrix );
-
 				// vertices
 
 				vertices = object.geometry.vertices;

+ 0 - 80
utils/exporters/blender/2.54/scripts/op/io_mesh_threejs/__init__.py

@@ -1,80 +0,0 @@
-# ##### BEGIN GPL LICENSE BLOCK #####
-#
-#  This program is free software; you can redistribute it and/or
-#  modify it under the terms of the GNU General Public License
-#  as published by the Free Software Foundation; either version 2
-#  of the License, or (at your option) any later version.
-#
-#  This program is distributed in the hope that it will be useful,
-#  but WITHOUT ANY WARRANTY; without even the implied warranty of
-#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-#  GNU General Public License for more details.
-#
-#  You should have received a copy of the GNU General Public License
-#  along with this program; if not, write to the Free Software Foundation,
-#  Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# ##### END GPL LICENSE BLOCK #####
-
-# To support reload properly, try to access a package var, if it's there, reload everything
-if "bpy" in locals():
-    import sys
-    reload(sys.modules.get("io_mesh_threejs.export_threejs", sys))
-
-
-import bpy
-from bpy.props import *
-from io_utils import ExportHelper
-
-
-class ExportTHREEJS(bpy.types.Operator, ExportHelper):
-    '''This script exports the selected object for the three.js engine.'''
-    bl_idname = "export.threejs"
-    bl_label = "Export Three.js"
-    
-    filename_ext = ".js"
-
-    use_modifiers = BoolProperty(name="Apply Modifiers", description="Apply Modifiers to the exported mesh", default=True)
-    use_normals = BoolProperty(name="Normals", description="Export Normals for smooth and hard shaded faces", default=True)
-    use_uv_coords = BoolProperty(name="UVs", description="Exort the active UV layer", default=True)
-    use_colors = BoolProperty(name="Vertex Colors", description="Exort the active vertex color layer", default=True)
-
-    @classmethod
-    def poll(cls, context):
-        return context.active_object != None
-
-    def execute(self, context):
-        print("Selected: " + context.active_object.name)
-
-        if not self.properties.filepath:
-            raise Exception("filename not set")
-
-        filepath = self.filepath
-        import io_mesh_threejs.export_threejs
-        return io_mesh_threejs.export_threejs.save(self, context, **self.properties)
-
-    def draw(self, context):
-        layout = self.layout
-
-        row = layout.row()
-        row.prop(self.properties, "use_modifiers")
-        row.prop(self.properties, "use_normals")
-        row = layout.row()
-        row.prop(self.properties, "use_uv_coords")
-        row.prop(self.properties, "use_colors")
-
-
-def menu_func(self, context):
-    default_path = bpy.data.filepath.replace(".blend", ".js")
-    self.layout.operator(ExportTHREEJS.bl_idname, text="Three.js (.js)").filepath = default_path
-
-
-def register():
-    bpy.types.INFO_MT_file_export.append(menu_func)
-
-
-def unregister():
-    bpy.types.INFO_MT_file_export.remove(menu_func)
-
-if __name__ == "__main__":
-    register()

+ 0 - 182
utils/exporters/blender/2.54/scripts/op/io_mesh_threejs/export_threejs.py

@@ -1,182 +0,0 @@
-# ##### BEGIN GPL LICENSE BLOCK #####
-#
-#  This program is free software; you can redistribute it and/or
-#  modify it under the terms of the GNU General Public License
-#  as published by the Free Software Foundation; either version 2
-#  of the License, or (at your option) any later version.
-#
-#  This program is distributed in the hope that it will be useful,
-#  but WITHOUT ANY WARRANTY; without even the implied warranty of
-#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-#  GNU General Public License for more details.
-#
-#  You should have received a copy of the GNU General Public License
-#  along with this program; if not, write to the Free Software Foundation,
-#  Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# ##### END GPL LICENSE BLOCK #####
-
-# Based on export_ply.py
-# Contributors: Mr.doob, Kikko, alteredq
-
-"""
-This script exports the selected object for the three.js engine.
-"""
-
-import bpy
-import mathutils
-
-import os
-import os.path
-import math
-
-def save(operator, context, filepath="", use_modifiers=True, use_normals=True, use_uv_coords=True, use_colors=True):
-
-    def rvec3d(v):
-        return round(v[0], 6), round(v[1], 6), round(v[2], 6)
-
-    def rvec2d(v):
-        return round(v[0], 6), round(v[1], 6)
-
-    scene = context.scene
-    obj = context.object
-
-    if not filepath.lower().endswith('.js'):
-        filepath += '.js'
-
-    classname = os.path.basename(filepath).split(".")[0]
-
-    if not obj:
-        raise Exception("Error, Select 1 active object")
-
-    file = open(filepath, 'w')
-
-    if scene.objects.active:
-        bpy.ops.object.mode_set(mode='OBJECT')
-
-    if use_modifiers:
-        mesh = obj.create_mesh(scene, True, 'PREVIEW')
-    else:
-        mesh = obj.data
-
-    if not mesh:
-        raise Exception("Error, could not get mesh data from active object")
-
-    # that's what Blender's native export_obj.py does
-    x_rot = mathutils.Matrix.Rotation(-math.pi/2, 4, 'X')
-    mesh.transform(x_rot * obj.matrix_world)
-    mesh.calc_normals()
-    
-    faceUV = (len(mesh.uv_textures) > 0)
-    vertexUV = (len(mesh.sticky) > 0)
-    vertexColors = len(mesh.vertex_colors) > 0
-
-    if (not faceUV) and (not vertexUV):
-        use_uv_coords = False
-    if not vertexColors:
-        use_colors = False
-
-    if not use_uv_coords:
-        faceUV = vertexUV = False
-    if not use_colors:
-        vertexColors = False
-
-    if faceUV:
-        active_uv_layer = mesh.uv_textures.active
-        if not active_uv_layer:
-            use_uv_coords = False
-            faceUV = None
-        else:
-            active_uv_layer = active_uv_layer.data
-
-    if vertexColors:
-        active_col_layer = mesh.vertex_colors.active
-        if not active_col_layer:
-            use_colors = False
-            vertexColors = None
-        else:
-            active_col_layer = active_col_layer.data
-
-    # incase
-    color = uvcoord = uvcoord_key = normal = normal_key = None
-
-    file.write('// Generated with Blender exporter (compatible with Blender 2.54 / 2.55)\n')
-    file.write('// http://github.com/mrdoob/three.js/tree/master/utils/exporters/blender\n\n')
-
-    file.write('var %s = function () {\n\n' % classname)
-
-    file.write('\tvar scope = this;\n\n')
-
-    file.write('\tTHREE.Geometry.call( this );\n\n')
-
-    for v in mesh.vertices:
-        file.write('\tv( %.6f, %.6f, %.6f );\n' % (v.co.x, v.co.y, v.co.z)) # co
-
-    file.write('\n')
-
-    if use_normals:
-        for f in mesh.faces:
-            if len(f.vertices) == 3:
-                file.write('\tf3( %d, %d, %d, %.6f, %.6f, %.6f );\n' % (f.vertices[0], f.vertices[1], f.vertices[2], f.normal[0], f.normal[1], f.normal[2]))
-            else:
-                file.write('\tf4( %d, %d, %d, %d, %.6f, %.6f, %.6f );\n' % (f.vertices[0], f.vertices[1], f.vertices[2], f.vertices[3], f.normal[0], f.normal[1], f.normal[2]))
-
-    else:
-        for f in mesh.faces:
-            if len(f.vertices) == 3:
-                file.write('\tf3( %d, %d, %d );\n' % (f.vertices[0], f.vertices[1], f.vertices[2]))
-            else:
-                file.write('\tf4( %d, %d, %d, %d );\n' % (f.vertices[0], f.vertices[1], f.vertices[2], f.vertices[3]))
-
-    face_index_pairs = [ (face, index) for index, face in enumerate(mesh.faces)]
-
-    if use_uv_coords:
-        file.write('\n')
-        for f, f_index in face_index_pairs:
-            tface = mesh.uv_textures[0].data[f_index]
-            if len(f.vertices) == 3:
-                file.write('\tuv( %.6f, %.6f, %.6f, %.6f, %.6f, %.6f );\n' % (tface.uv1[0], 1.0-tface.uv1[1], tface.uv2[0], 1.0-tface.uv2[1], tface.uv3[0], 1.0-tface.uv3[1]))
-            else:
-                file.write('\tuv( %.6f, %.6f, %.6f, %.6f, %.6f, %.6f, %.6f, %.6f );\n' % (tface.uv1[0], 1.0-tface.uv1[1], tface.uv2[0], 1.0-tface.uv2[1], tface.uv3[0], 1.0-tface.uv3[1], tface.uv4[0], 1.0-tface.uv4[1]))
-
-    file.write('\n')
-
-    file.write('\tfunction v( x, y, z ) {\n\n')
-    file.write('\t\tscope.vertices.push( new THREE.Vertex( new THREE.Vector3( x, y, z ) ) );\n\n')
-    file.write('\t}\n\n')
-
-    file.write('\tfunction f3( a, b, c, nx, ny, nz ) {\n\n')
-    file.write('\t\tscope.faces.push( new THREE.Face3( a, b, c, (nx || ny || nz) ? new THREE.Vector3( nx, ny, nz ) : null ) );\n\n')
-    file.write('\t}\n\n')
-
-    file.write('\tfunction f4( a, b, c, d, nx, ny, nz ) {\n\n')
-    file.write('\t\tscope.faces.push( new THREE.Face4( a, b, c, d, (nx || ny || nz) ? new THREE.Vector3( nx, ny, nz ) : null ) );\n\n')
-    file.write('\t}\n\n')
-
-    file.write('\tfunction uv( u1, v1, u2, v2, u3, v3, u4, v4 ) {\n\n')
-    file.write('\t\tvar uv = [];\n')
-    file.write('\t\tuv.push( new THREE.UV( u1, v1 ) );\n')
-    file.write('\t\tuv.push( new THREE.UV( u2, v2 ) );\n')
-    file.write('\t\tuv.push( new THREE.UV( u3, v3 ) );\n')
-    file.write('\t\tif ( u4 && v4 ) uv.push( new THREE.UV( u4, v4 ) );\n')
-    file.write('\t\tscope.uvs.push( uv );\n')
-    file.write('\t}\n\n')
-
-    file.write('\tthis.computeCentroids();\n')
-
-    if not use_normals:
-        file.write('\tthis.computeNormals();\n')
-
-    file.write('\n}\n\n')
-
-    file.write('%s.prototype = new THREE.Geometry();\n' % classname)
-    file.write('%s.prototype.constructor = %s;' % (classname, classname))
-
-    file.close()
-
-    print("writing", filepath, "done")
-
-    if use_modifiers:
-        bpy.data.meshes.remove(mesh)
-
-    return {'FINISHED'}

+ 10 - 10
utils/exporters/blender/2.54/scripts/op/io_mesh_threejs_slim/__init__.py → utils/exporters/blender/2.55/scripts/op/io_mesh_threejs/__init__.py

@@ -19,7 +19,7 @@
 # To support reload properly, try to access a package var, if it's there, reload everything
 if "bpy" in locals():
     import sys
-    reload(sys.modules.get("io_mesh_threejs_slim.export_threejs_slim", sys))
+    reload(sys.modules.get("io_mesh_threejs.export_threejs", sys))
 
 
 import bpy
@@ -27,17 +27,17 @@ from bpy.props import *
 from io_utils import ExportHelper
 
 
-class ExportTHREEJSSlim(bpy.types.Operator, ExportHelper):
+class ExportTHREEJS(bpy.types.Operator, ExportHelper):
     '''Export selected object for Three.js (ASCII JSON format).'''
-    bl_idname = "export.threejs_slim"
-    bl_label = "Export Three.js Slim"
-    
+    bl_idname = "export.threejs"
+    bl_label = "Export Three.js"
+
     filename_ext = ".js"
 
     use_modifiers = BoolProperty(name="Apply Modifiers", description="Apply modifiers to the exported mesh", default=True)
     use_normals = BoolProperty(name="Normals", description="Export normals", default=True)
     use_uv_coords = BoolProperty(name="UVs", description="Export texture coordinates", default=True)
-    
+
     align_types = [("None","None","None"), ("Center","Center","Center"), ("Bottom","Bottom","Bottom"), ("Top","Top","Top")]
     align_model = EnumProperty(name="Align model", description="Align model", items=align_types, default="Center")
 
@@ -52,8 +52,8 @@ class ExportTHREEJSSlim(bpy.types.Operator, ExportHelper):
             raise Exception("filename not set")
 
         filepath = self.filepath
-        import io_mesh_threejs_slim.export_threejs_slim
-        return io_mesh_threejs_slim.export_threejs_slim.save(self, context, **self.properties)
+        import io_mesh_threejs.export_threejs
+        return io_mesh_threejs.export_threejs.save(self, context, **self.properties)
 
     def draw(self, context):
         layout = self.layout
@@ -66,11 +66,11 @@ class ExportTHREEJSSlim(bpy.types.Operator, ExportHelper):
         row.prop(self.properties, "use_uv_coords")
         row = layout.row()
         row.prop(self.properties, "align_model")
-        
+
 
 def menu_func(self, context):
     default_path = bpy.data.filepath.replace(".blend", ".js")
-    self.layout.operator(ExportTHREEJSSlim.bl_idname, text="Three.js (.js) Slim").filepath = default_path
+    self.layout.operator(ExportTHREEJS.bl_idname, text="Three.js (.js)").filepath = default_path
 
 
 def register():

+ 144 - 140
utils/exporters/blender/2.54/scripts/op/io_mesh_threejs_slim/export_threejs_slim.py → utils/exporters/blender/2.55/scripts/op/io_mesh_threejs/export_threejs.py

@@ -42,7 +42,7 @@ import random
 # Configuration
 # #####################################################
 
-# default colors for debugging (each material gets one distinct color): 
+# default colors for debugging (each material gets one distinct color):
 # white, red, green, blue, yellow, cyan, magenta
 COLORS = [0xeeeeee, 0xee0000, 0x00ee00, 0x0000ee, 0xeeee00, 0x00eeee, 0xee00ee]
 
@@ -51,36 +51,40 @@ COLORS = [0xeeeeee, 0xee0000, 0x00ee00, 0x0000ee, 0xeeee00, 0x00eeee, 0xee00ee]
 # Templates
 # #####################################################
 TEMPLATE_FILE_ASCII = """\
-//  vertices: %(nvertex)d
-//  faces: %(nface)d 
-//  materials: %(nmaterial)d
-//
-//  Generated with Blender slim exporter (compatible with Blender 2.54 / 2.55)
-//  https://github.com/alteredq/three.js/tree/master/utils/exporters/blender/
-
+/*
+ * File generated with Blender 2.55 Exporter
+ * https://github.com/mrdoob/three.js/tree/master/utils/exporters/blender/
+ *
+ * vertices: %(nvertex)d
+ * faces: %(nface)d
+ * materials: %(nmaterial)d
+ *
+ */
 
 var model = {
-    'materials': [%(materials)s],
 
-    'normals': [%(normals)s],
+	'materials': [%(materials)s],
 
-    'vertices': [%(vertices)s],
+	'normals': [%(normals)s],
 
-    'uvs': [%(uvs)s],
+	'vertices': [%(vertices)s],
 
-    'triangles': [%(triangles)s],
-    'triangles_n': [%(triangles_n)s],
-    'triangles_uv': [%(triangles_uv)s],
-    'triangles_n_uv': [%(triangles_n_uv)s],
+	'uvs': [%(uvs)s],
 
-    'quads': [%(quads)s],
-    'quads_n': [%(quads_n)s],
-    'quads_uv': [%(quads_uv)s],
-    'quads_n_uv': [%(quads_n_uv)s],
+	'triangles': [%(triangles)s],
+	'triangles_n': [%(triangles_n)s],
+	'triangles_uv': [%(triangles_uv)s],
+	'triangles_n_uv': [%(triangles_n_uv)s],
+
+	'quads': [%(quads)s],
+	'quads_n': [%(quads_n)s],
+	'quads_uv': [%(quads_uv)s],
+	'quads_n_uv': [%(quads_n_uv)s],
+
+	'end': (new Date).getTime()
+
+}
 
-    'end': (new Date).getTime()
-    }
-    
 postMessage( model );
 """
 
@@ -134,18 +138,18 @@ def get_uv_indices(f, uvs, mesh):
 def bbox(vertices):
     """Compute bounding box of vertex array.
     """
-    
+
     if len(vertices)>0:
         minx = maxx = vertices[0].co.x
         miny = maxy = vertices[0].co.y
         minz = maxz = vertices[0].co.z
-        
+
         for v in vertices[1:]:
             if v.co.x < minx:
                 minx = v.co.x
             elif v.co.x > maxx:
                 maxx = v.co.x
-            
+
             if v.co.y < miny:
                 miny = v.co.y
             elif v.co.y > maxy:
@@ -157,14 +161,14 @@ def bbox(vertices):
                 maxz = v.co.z
 
         return { 'x':[minx,maxx], 'y':[miny,maxy], 'z':[minz,maxz] }
-    
+
     else:
         return { 'x':[0,0], 'y':[0,0], 'z':[0,0] }
 
 def translate(vertices, t):
     """Translate array of vertices by vector t.
     """
-    
+
     for i in range(len(vertices)):
         vertices[i].co.x += t[0]
         vertices[i].co.y += t[1]
@@ -173,37 +177,37 @@ def translate(vertices, t):
 def center(vertices):
     """Center model (middle of bounding box).
     """
-    
+
     bb = bbox(vertices)
-    
+
     cx = bb['x'][0] + (bb['x'][1] - bb['x'][0])/2.0
     cy = bb['y'][0] + (bb['y'][1] - bb['y'][0])/2.0
     cz = bb['z'][0] + (bb['z'][1] - bb['z'][0])/2.0
-    
+
     translate(vertices, [-cx,-cy,-cz])
 
 def top(vertices):
     """Align top of the model with the floor (Y-axis) and center it around X and Z.
     """
-    
+
     bb = bbox(vertices)
-    
+
     cx = bb['x'][0] + (bb['x'][1] - bb['x'][0])/2.0
     cy = bb['y'][1]
     cz = bb['z'][0] + (bb['z'][1] - bb['z'][0])/2.0
-    
+
     translate(vertices, [-cx,-cy,-cz])
-    
+
 def bottom(vertices):
     """Align bottom of the model with the floor (Y-axis) and center it around X and Z.
     """
-    
+
     bb = bbox(vertices)
-    
+
     cx = bb['x'][0] + (bb['x'][1] - bb['x'][0])/2.0
-    cy = bb['y'][0] 
+    cy = bb['y'][0]
     cz = bb['z'][0] + (bb['z'][1] - bb['z'][0])/2.0
-    
+
     translate(vertices, [-cx,-cy,-cz])
 
 # #####################################################
@@ -221,73 +225,73 @@ def generate_uv(uv):
 def generate_triangle(f):
     v = f[0].vertices
     m = f[0].material_index
-    return TEMPLATE_TRI % (v[0], v[1], v[2], 
+    return TEMPLATE_TRI % (v[0], v[1], v[2],
                            m)
-    
+
 def generate_quad(f):
     v = f[0].vertices
     m = f[0].material_index
-    return TEMPLATE_QUAD % (v[0], v[1], v[2], v[3], 
+    return TEMPLATE_QUAD % (v[0], v[1], v[2], v[3],
                             m)
-    
-def generate_triangle_n(f, normals, mesh):    
+
+def generate_triangle_n(f, normals, mesh):
     v = f[0].vertices
     m = f[0].material_index
     n = get_normal_indices(v, normals, mesh)
-    
-    return TEMPLATE_TRI_N % (v[0], v[1], v[2], 
-                             m, 
+
+    return TEMPLATE_TRI_N % (v[0], v[1], v[2],
+                             m,
                              n[0], n[1], n[2])
-    
-def generate_quad_n(f, normals, mesh):    
+
+def generate_quad_n(f, normals, mesh):
     v = f[0].vertices
     m = f[0].material_index
     n = get_normal_indices(v, normals, mesh)
-    
+
     return TEMPLATE_QUAD_N % (v[0], v[1], v[2], v[3],
-                              m, 
+                              m,
                               n[0], n[1], n[2], n[3])
 
 def generate_triangle_uv(f, uvs, mesh):
-    v = f[0].vertices  
+    v = f[0].vertices
     m = f[0].material_index
     uv = get_uv_indices(f, uvs, mesh)
-    
-    return TEMPLATE_TRI_UV % (v[0], v[1], v[2], 
-                              m, 
+
+    return TEMPLATE_TRI_UV % (v[0], v[1], v[2],
+                              m,
                               uv[0], uv[1], uv[2])
-    
+
 def generate_quad_uv(f, uvs, mesh):
-    v = f[0].vertices  
+    v = f[0].vertices
     m = f[0].material_index
     uv = get_uv_indices(f, uvs, mesh)
-    
+
     return TEMPLATE_QUAD_UV % (v[0], v[1], v[2], v[3],
-                               m, 
+                               m,
                                uv[0], uv[1], uv[2], uv[3])
-                              
+
 def generate_triangle_n_uv(f, normals, uvs, mesh):
-    v = f[0].vertices    
+    v = f[0].vertices
     m = f[0].material_index
     n = get_normal_indices(v, normals, mesh)
-    uv = get_uv_indices(f, uvs, mesh)    
-    
-    return TEMPLATE_TRI_N_UV % (v[0], v[1], v[2], 
-                                m, 
-                                n[0], n[1], n[2], 
+    uv = get_uv_indices(f, uvs, mesh)
+
+    return TEMPLATE_TRI_N_UV % (v[0], v[1], v[2],
+                                m,
+                                n[0], n[1], n[2],
                                 uv[0], uv[1], uv[2])
-    
+
 def generate_quad_n_uv(f, normals, uvs, mesh):
-    v = f[0].vertices    
+    v = f[0].vertices
     m = f[0].material_index
     n = get_normal_indices(v, normals, mesh)
-    uv = get_uv_indices(f, uvs, mesh)    
-    
-    return TEMPLATE_QUAD_N_UV % (v[0], v[1], v[2], v[3], 
-                                 m, 
+    uv = get_uv_indices(f, uvs, mesh)
+
+    return TEMPLATE_QUAD_N_UV % (v[0], v[1], v[2], v[3],
+                                 m,
                                  n[0], n[1], n[2], n[3],
                                  uv[0], uv[1], uv[2], uv[3])
-                                
+
 # #####################################################
 # Faces
 # #####################################################
@@ -297,17 +301,17 @@ def sort_faces(faces, use_normals, use_uv_coords):
     'triangles_flat_uv': [],
     'triangles_smooth': [],
     'triangles_smooth_uv': [],
-    
+
     'quads_flat': [],
     'quads_flat_uv': [],
     'quads_smooth': [],
     'quads_smooth_uv': []
     }
-    
+
     for i, f in enumerate(faces):
-        
+
         if len(f.vertices) == 3:
-            
+
             if use_normals and use_uv_coords:
                 data['triangles_smooth_uv'].append([f,i])
             elif use_normals and not use_uv_coords:
@@ -316,9 +320,9 @@ def sort_faces(faces, use_normals, use_uv_coords):
                 data['triangles_flat_uv'].append([f,i])
             else:
                 data['triangles_flat'].append([f,i])
-        
+
         elif len(f.vertices) == 4:
-            
+
             if use_normals and use_uv_coords:
                 data['quads_smooth_uv'].append([f,i])
             elif use_normals and not use_uv_coords:
@@ -327,81 +331,81 @@ def sort_faces(faces, use_normals, use_uv_coords):
                 data['quads_flat_uv'].append([f,i])
             else:
                 data['quads_flat'].append([f,i])
-            
+
     return data
-    
+
 # #####################################################
 # Normals
 # #####################################################
 def extract_vertex_normals(mesh, use_normals):
     if not use_normals:
         return {}
-        
+
     count = 0
     normals = {}
-    
+
     for f in mesh.faces:
         for v in f.vertices:
             key = veckey3d(mesh.vertices[v].normal)
             if key not in normals:
                 normals[key] = count
                 count += 1
-    
+
     return normals
-    
+
 def generate_normals(normals, use_normals):
     if not use_normals:
         return ""
-    
+
     chunks = []
     for key, index in sorted(normals.items(), key=operator.itemgetter(1)):
         chunks.append(key)
-        
+
     return ",".join(generate_normal(n) for n in chunks)
-    
+
 # #####################################################
 # UVs
 # #####################################################
 def extract_uvs(mesh, use_uv_coords):
     if not use_uv_coords:
         return {}
-        
+
     count = 0
     uvs = {}
-    
+
     uv_layer = mesh.uv_textures.active.data
-    
+
     for face_index, face in enumerate(mesh.faces):
         for uv_index, uv in enumerate(uv_layer[face_index].uv):
             key = veckey2d(uv)
             if key not in uvs:
                 uvs[key] = count
                 count += 1
-            
+
     return uvs
-    
+
 def generate_uvs(uvs, use_uv_coords):
     if not use_uv_coords:
         return ""
-        
+
     chunks = []
     for key, index in sorted(uvs.items(), key=operator.itemgetter(1)):
         chunks.append(key)
-        
+
     return ",".join(generate_uv(n) for n in chunks)
-    
+
 # #####################################################
 # Materials
 # #####################################################
 def generate_color(i):
     """Generate hex color corresponding to integer.
-    
+
     Colors should have well defined ordering.
-    First N colors are hardcoded, then colors are random 
-    (must seed random number  generator with deterministic value 
+    First N colors are hardcoded, then colors are random
+    (must seed random number  generator with deterministic value
     before getting colors).
     """
-    
+
     if i < len(COLORS):
         return "0x%06x" % COLORS[i]
     else:
@@ -410,7 +414,7 @@ def generate_color(i):
 def generate_mtl(materials):
     """Generate dummy materials.
     """
-    
+
     mtl = {}
     for m in materials:
         index = materials[m]
@@ -425,15 +429,15 @@ def value2string(v):
     if type(v)==str and v[0] != "0":
         return '"%s"' % v
     return str(v)
-    
+
 def generate_materials(mtl, materials):
-    """Generate JS array of materials objects    
+    """Generate JS array of materials objects
     """
-    
+
     mtl_array = []
     for m in mtl:
         index = materials[m]
-        
+
         # add debug information
         #  materials should be sorted according to how
         #  they appeared in OBJ file (for the first time)
@@ -441,13 +445,13 @@ def generate_materials(mtl, materials):
         mtl[m]['a_dbg_name'] = m
         mtl[m]['a_dbg_index'] = index
         mtl[m]['a_dbg_color'] = generate_color(index)
-        
+
         mtl_raw = ",\n".join(['\t"%s" : %s' % (n, value2string(v)) for n,v in sorted(mtl[m].items())])
         mtl_string = "\t{\n%s\n\t}" % mtl_raw
         mtl_array.append([index, mtl_string])
-        
+
     return ",\n\n".join([m for i,m in sorted(mtl_array)])
-        
+
 def extract_materials(mesh, scene):
     world = scene.world
 
@@ -455,33 +459,33 @@ def extract_materials(mesh, scene):
     for m in mesh.materials:
         if m:
             materials[m.name] = {}
-            materials[m.name]['col_diffuse'] = [m.diffuse_intensity * m.diffuse_color[0], 
-                                                m.diffuse_intensity * m.diffuse_color[1], 
+            materials[m.name]['col_diffuse'] = [m.diffuse_intensity * m.diffuse_color[0],
+                                                m.diffuse_intensity * m.diffuse_color[1],
                                                 m.diffuse_intensity * m.diffuse_color[2]]
-                                                
-            materials[m.name]['col_specular'] = [m.specular_intensity * m.specular_color[0], 
-                                                 m.specular_intensity * m.specular_color[1], 
+
+            materials[m.name]['col_specular'] = [m.specular_intensity * m.specular_color[0],
+                                                 m.specular_intensity * m.specular_color[1],
                                                  m.specular_intensity * m.specular_color[2]]
-                                                 
-            materials[m.name]['col_ambient'] = [m.ambient * world.ambient_color[0], 
-                                                m.ambient * world.ambient_color[1], 
+
+            materials[m.name]['col_ambient'] = [m.ambient * world.ambient_color[0],
+                                                m.ambient * world.ambient_color[1],
                                                 m.ambient * world.ambient_color[2]]
-                                                
+
             materials[m.name]['transparency'] = m.alpha
-            
+
             # not sure about mapping values to Blinn-Phong shader
             # Blender uses INT from [1,511] with default 0
             # http://www.blender.org/documentation/blender_python_api_2_54_0/bpy.types.Material.html#bpy.types.Material.specular_hardness
-            materials[m.name]["specular_coef"] = m.specular_hardness 
-            
+            materials[m.name]["specular_coef"] = m.specular_hardness
+
             if m.active_texture and m.active_texture.type == 'IMAGE':
                 fn = bpy.path.abspath(m.active_texture.image.filepath)
                 fn = os.path.normpath(fn)
                 fn_strip = os.path.basename(fn)
                 materials[m.name]['map_diffuse'] = fn_strip
-            
+
     return materials
-        
+
 def generate_materials_string(mesh, scene):
 
     random.seed(42) # to get well defined color order for debug materials
@@ -493,61 +497,61 @@ def generate_materials_string(mesh, scene):
                 materials[m.name] = i
             else:
                 materials["undefined_dummy_%0d" % i] = i
-                
-    
+
+
     if not materials:
         materials = { 'default':0 }
-    
+
     # default dummy materials
     mtl = generate_mtl(materials)
-    
+
     # extract real materials from the mesh
     mtl.update(extract_materials(mesh, scene))
-    
+
     return generate_materials(mtl, materials)
-        
+
 # #####################################################
 # ASCII exporter
 # #####################################################
 def generate_ascii_model(mesh, scene, use_normals, use_uv_coords, align_model):
-    
+
     vertices = mesh.vertices[:]
-    
+
     if align_model == 1:
         center(vertices)
     elif align_model == 2:
         bottom(vertices)
     elif align_model == 3:
         top(vertices)
-    
+
     sfaces = sort_faces(mesh.faces, use_normals, use_uv_coords)
-    
+
     normals = extract_vertex_normals(mesh, use_normals)
     uvs = extract_uvs(mesh, use_uv_coords)
-    
+
     text = TEMPLATE_FILE_ASCII % {
     "vertices"      : ",".join(generate_vertex(v) for v in vertices),
-    
+
     "triangles"     : ",".join(generate_triangle(f) for f in sfaces['triangles_flat']),
     "triangles_n"   : ",".join(generate_triangle_n(f, normals, mesh) for f in sfaces['triangles_smooth']),
     "triangles_uv"  : ",".join(generate_triangle_uv(f, uvs, mesh) for f in sfaces['triangles_flat_uv']),
     "triangles_n_uv": ",".join(generate_triangle_n_uv(f, normals, uvs, mesh) for f in sfaces['triangles_smooth_uv']),
-    
+
     "quads"         : ",".join(generate_quad(f) for f in sfaces['quads_flat']),
     "quads_n"       : ",".join(generate_quad_n(f, normals, mesh) for f in sfaces['quads_smooth']),
     "quads_uv"      : ",".join(generate_quad_uv(f, uvs, mesh) for f in sfaces['quads_flat_uv']),
     "quads_n_uv"    : ",".join(generate_quad_n_uv(f, normals, uvs, mesh) for f in sfaces['quads_smooth_uv']),
-    
+
     "uvs"           : generate_uvs(uvs, use_uv_coords),
     "normals"       : generate_normals(normals, use_normals),
-    
+
     "materials" : generate_materials_string(mesh, scene),
-    
+
     "nvertex"   : len(mesh.vertices),
     "nface"     : len(mesh.faces),
     "nmaterial" : 0
     }
-    
+
     return text
 
 # #####################################################
@@ -587,7 +591,7 @@ def save(operator, context, filepath="", use_modifiers=True, use_normals=True, u
     x_rot = mathutils.Matrix.Rotation(-math.pi/2, 4, 'X')
     mesh.transform(x_rot * obj.matrix_world)
     mesh.calc_normals()
-    
+
     faceUV = (len(mesh.uv_textures) > 0)
     vertexUV = (len(mesh.sticky) > 0)
 

+ 0 - 212
utils/exporters/blender/export_threejs_2.53b.py

@@ -1,212 +0,0 @@
-__author__ = "Mr.doob, Kikko"
-__url__ = ['http://mrdoob.com', 'http://github.com/kikko']
-__version__ = "1"
-__bpydoc__ = """\
-This script exports the selected object for the three.js engine.
-"""
-
-import bpy
-
-def rvec3d(v):
-    return round(v[0], 6), round(v[1], 6), round(v[2], 6)
-
-def rvec2d(v):
-    return round(v[0], 6), round(v[1], 6)
-
-def write(filename, scene, ob, \
-        EXPORT_APPLY_MODIFIERS=True,\
-        EXPORT_NORMALS=True,\
-        EXPORT_UV=True,\
-        EXPORT_COLORS=True):
-
-    if not filename.lower().endswith('.js'):
-        filename += '.js'
-
-    classname = filename.split('/')[-1].replace('.js','')
-
-    if not ob:
-        raise Exception("Error, Select the object to export")
-        return
-
-    file = open(filename, 'w')
-
-    if EXPORT_APPLY_MODIFIERS:
-        mesh = ob.create_mesh(scene, True, 'PREVIEW')
-    else:
-        mesh = ob.data
-
-    if not mesh:
-        raise ("Error, could not get mesh data from selected object")
-        return
-
-    faceUV = len(mesh.uv_textures) > 0
-    vertexUV = len(mesh.sticky) > 0
-    vertexColors = len(mesh.vertex_colors) > 0
-
-    if (not faceUV) and (not vertexUV):
-        EXPORT_UV = False
-    if not vertexColors:
-        EXPORT_COLORS = False
-
-    if not EXPORT_UV:
-        faceUV = vertexUV = False
-    if not EXPORT_COLORS:
-        vertexColors = False
-
-    if faceUV:
-        active_uv_layer = mesh.active_uv_texture
-        if not active_uv_layer:
-            EXPORT_UV = False
-            faceUV = None
-        else:
-            active_uv_layer = active_uv_layer.data
-
-    if vertexColors:
-        active_col_layer = mesh.active_vertex_color
-        if not active_col_layer:
-            EXPORT_COLORS = False
-            vertexColors = None
-        else:
-            active_col_layer = active_col_layer.data
-
-    # incase
-    color = uvcoord = uvcoord_key = normal = normal_key = None
-
-    file.write('var %s = function () {\n\n' % classname)
-
-    file.write('\tvar scope = this;\n\n')
-
-    file.write('\tTHREE.Geometry.call(this);\n\n')
-
-    for v in mesh.verts:
-        file.write('\tv( %.6f, %.6f, %.6f );\n' % (v.co.x, v.co.z, -v.co.y)) # co
-
-    file.write('\n')
-
-    if EXPORT_NORMALS:
-        for f in mesh.faces:
-            if len(f.verts) == 3:
-                file.write('\tf3( %d, %d, %d, %.6f, %.6f, %.6f );\n' % (f.verts[0], f.verts[1], f.verts[2], f.normal[0], f.normal[1], f.normal[2]))
-            else:
-                file.write('\tf4( %d, %d, %d, %d, %.6f, %.6f, %.6f );\n' % (f.verts[0], f.verts[1], f.verts[2], f.verts[3], f.normal[0], f.normal[1], f.normal[2]))
-
-    else:
-        for f in mesh.faces:
-            if len(f.verts) == 3:
-                file.write('\tf3( %d, %d, %d );\n' % (f.verts[0], f.verts[1], f.verts[2]))
-            else:
-                file.write('\tf4( %d, %d, %d, %d );\n' % (f.verts[0], f.verts[1], f.verts[2], f.verts[3]))
-
-    face_index_pairs = [ (face, index) for index, face in enumerate(mesh.faces)]
-
-    if EXPORT_UV:
-        file.write('\n')
-        for f, f_index in face_index_pairs:
-            tface = mesh.uv_textures[0].data[f_index]
-            if len(f.verts) == 3:
-                file.write('\tuv( %.6f, %.6f, %.6f, %.6f, %.6f, %.6f );\n' % (tface.uv1[0], 1.0-tface.uv1[1], tface.uv2[0], 1.0-tface.uv2[1], tface.uv3[0], 1.0-tface.uv3[1]))
-            else:
-                file.write('\tuv( %.6f, %.6f, %.6f, %.6f, %.6f, %.6f, %.6f, %.6f );\n' % (tface.uv1[0], 1.0-tface.uv1[1], tface.uv2[0], 1.0-tface.uv2[1], tface.uv3[0], 1.0-tface.uv3[1], tface.uv4[0], 1.0-tface.uv4[1]))
-
-    file.write('\n')
-
-    file.write('\tfunction v( x, y, z ) {\n\n')
-    file.write('\t\tscope.vertices.push( new THREE.Vertex( new THREE.Vector3( x, y, z ) ) );\n\n')
-    file.write('\t}\n\n')
-
-    file.write('\tfunction f3( a, b, c, nx, ny, nz ) {\n\n')
-    file.write('\t\tscope.faces.push( new THREE.Face3( a, b, c, nx && ny && nz ? new THREE.Vector3( nx, ny, nz ) : null ) );\n\n')
-    file.write('\t}\n\n')
-
-    file.write('\tfunction f4( a, b, c, d, nx, ny, nz ) {\n\n')
-    file.write('\t\tscope.faces.push( new THREE.Face4( a, b, c, d, nx && ny && nz ? new THREE.Vector3( nx, ny, nz ) : null ) );\n\n')
-    file.write('\t}\n\n')
-
-    file.write('\tfunction uv( u1, v1, u2, v2, u3, v3, u4, v4 ) {\n\n')
-    file.write('\t\tvar uv = [];\n')
-    file.write('\t\tuv.push( new THREE.UV( u1, v1 ) );\n')
-    file.write('\t\tuv.push( new THREE.UV( u2, v2 ) );\n')
-    file.write('\t\tuv.push( new THREE.UV( u3, v3 ) );\n')
-    file.write('\t\tif ( u4 && v4 ) uv.push( new THREE.UV( u4, v4 ) );\n')
-    file.write('\t\tscope.uvs.push( uv );\n')
-    file.write('\t}\n\n')
-
-    file.write('}\n\n')
-
-    file.write('%s.prototype = new THREE.Geometry();\n' % classname)
-    file.write('%s.prototype.constructor = %s;' % (classname, classname))
-
-    file.close()
-
-    print("writing", filename, "done")
-
-    if EXPORT_APPLY_MODIFIERS:
-        bpy.data.meshes.remove(mesh)
-
-from bpy.props import *
-
-
-class ExportTHREEJS(bpy.types.Operator):
-    '''TODO'''
-    bl_idname = "export.three_js"
-    bl_label = "Export three.js"
-
-    # List of operator properties, the attributes will be assigned
-    # to the class instance from the operator settings before calling.
-
-    filepath = StringProperty(name="File Path", description="File path used for exporting the PLY file", maxlen=1024, default="")
-    check_existing = BoolProperty(name="Check Existing", description="Check and warn on overwriting existing files", default=True, options={'HIDDEN'})
-    use_modifiers = BoolProperty(name="Apply Modifiers", description="Apply Modifiers to the exported mesh", default=True)
-    use_normals = BoolProperty(name="Normals", description="Export Normals for smooth and hard shaded faces", default=True)
-    use_uvs = BoolProperty(name="UVs", description="Exort the active UV layer", default=True)
-    use_colors = BoolProperty(name="Vertex Colors", description="Exort the active vertex color layer", default=True)
-
-    def poll(self, context):
-        return context.active_object != None
-
-    def execute(self, context):
-        print("Selected: " + context.active_object.name)
-
-        if not self.properties.filepath:
-            raise Exception("filename not set")
-
-        write(self.properties.filepath, context.scene, context.active_object,\
-            EXPORT_APPLY_MODIFIERS=self.properties.use_modifiers,
-            EXPORT_NORMALS=self.properties.use_normals,
-            EXPORT_UV=self.properties.use_uvs,
-            EXPORT_COLORS=self.properties.use_colors,
-        )
-
-        return {'FINISHED'}
-
-    def invoke(self, context, event):
-        wm = context.manager
-        wm.add_fileselect(self)
-        return {'RUNNING_MODAL'}
-
-    def draw(self, context):
-        layout = self.layout
-        props = self.properties
-
-        row = layout.row()
-        row.prop(props, "use_modifiers")
-        row.prop(props, "use_normals")
-        row = layout.row()
-        row.prop(props, "use_uvs")
-        row.prop(props, "use_colors")
-
-def menu_func(self, context):
-    default_path = bpy.data.filepath.replace(".blend", ".js")
-    self.layout.operator(ExportTHREEJS.bl_idname, text="three.js (.js)").filepath = default_path
-
-def register():
-    bpy.types.register(ExportTHREEJS)
-    bpy.types.INFO_MT_file_export.append(menu_func)
-
-def unregister():
-    bpy.types.unregister(ExportTHREEJS)
-    bpy.types.INFO_MT_file_export.remove(menu_func)
-
-if __name__ == "__main__":
-    register()
-

+ 0 - 211
utils/exporters/blender/export_threejs_2.5a2.py

@@ -1,211 +0,0 @@
-__author__ = "Mr.doob, Kikko"
-__url__ = ['http://mrdoob.com', 'http://github.com/kikko']
-__version__ = "1"
-__bpydoc__ = """\
-This script exports the selected object for the three.js engine.
-"""
-
-import bpy
-
-def rvec3d(v):
-    return round(v[0], 6), round(v[1], 6), round(v[2], 6)
-
-def rvec2d(v):
-    return round(v[0], 6), round(v[1], 6)
-
-def write(filename, scene, ob, \
-        EXPORT_APPLY_MODIFIERS=True,\
-        EXPORT_NORMALS=True,\
-        EXPORT_UV=True,\
-        EXPORT_COLORS=True):
-
-    if not filename.lower().endswith('.js'):
-        filename += '.js'
-
-    classname = filename.split('/')[-1].replace('.js','')
-
-    if not ob:
-        raise Exception("Error, Select the object to export")
-        return
-
-    file = open(filename, 'w')
-
-    if EXPORT_APPLY_MODIFIERS:
-        mesh = ob.create_mesh(True, 'PREVIEW')
-    else:
-        mesh = ob.data
-
-    if not mesh:
-        raise ("Error, could not get mesh data from selected object")
-        return
-
-    faceUV = len(mesh.uv_textures) > 0
-    vertexUV = len(mesh.sticky) > 0
-    vertexColors = len(mesh.vertex_colors) > 0
-
-    if (not faceUV) and (not vertexUV):
-        EXPORT_UV = False
-    if not vertexColors:
-        EXPORT_COLORS = False
-
-    if not EXPORT_UV:
-        faceUV = vertexUV = False
-    if not EXPORT_COLORS:
-        vertexColors = False
-
-    if faceUV:
-        active_uv_layer = mesh.active_uv_texture
-        if not active_uv_layer:
-            EXPORT_UV = False
-            faceUV = None
-        else:
-            active_uv_layer = active_uv_layer.data
-
-    if vertexColors:
-        active_col_layer = mesh.active_vertex_color
-        if not active_col_layer:
-            EXPORT_COLORS = False
-            vertexColors = None
-        else:
-            active_col_layer = active_col_layer.data
-
-    # incase
-    color = uvcoord = uvcoord_key = normal = normal_key = None
-
-    file.write('var %s = function () {\n\n' % classname)
-
-    file.write('\tvar scope = this;\n\n')
-
-    file.write('\tTHREE.Geometry.call(this);\n\n')
-
-    for v in mesh.verts:
-        file.write('\tv( %.6f, %.6f, %.6f );\n' % (v.co.x, v.co.z, -v.co.y)) # co
-
-    file.write('\n')
-
-    if EXPORT_NORMALS:
-        for f in mesh.faces:
-            if len(f.verts) == 3:
-                file.write('\tf3( %d, %d, %d, %.6f, %.6f, %.6f );\n' % (f.verts[0], f.verts[1], f.verts[2], f.normal[0], f.normal[1], f.normal[2]))
-            else:
-                file.write('\tf4( %d, %d, %d, %d, %.6f, %.6f, %.6f );\n' % (f.verts[0], f.verts[1], f.verts[2], f.verts[3], f.normal[0], f.normal[1], f.normal[2]))
-
-    else:
-        for f in mesh.faces:
-            if len(f.verts) == 3:
-                file.write('\tf3( %d, %d, %d );\n' % (f.verts[0], f.verts[1], f.verts[2]))
-            else:
-                file.write('\tf4( %d, %d, %d, %d );\n' % (f.verts[0], f.verts[1], f.verts[2], f.verts[3]))
-
-    face_index_pairs = [ (face, index) for index, face in enumerate(mesh.faces)]
-
-    if EXPORT_UV:
-        file.write('\n')
-        for f, f_index in face_index_pairs:
-            tface = mesh.uv_textures[0].data[f_index]
-            if len(f.verts) == 3:
-                file.write('\tuv( %.6f, %.6f, %.6f, %.6f, %.6f, %.6f );\n' % (tface.uv1[0], 1.0-tface.uv1[1], tface.uv2[0], 1.0-tface.uv2[1], tface.uv3[0], 1.0-tface.uv3[1]))
-            else:
-                file.write('\tuv( %.6f, %.6f, %.6f, %.6f, %.6f, %.6f, %.6f, %.6f );\n' % (tface.uv1[0], 1.0-tface.uv1[1], tface.uv2[0], 1.0-tface.uv2[1], tface.uv3[0], 1.0-tface.uv3[1], tface.uv4[0], 1.0-tface.uv4[1]))
-
-    file.write('\n')
-
-    file.write('\tfunction v( x, y, z ) {\n\n')
-    file.write('\t\tscope.vertices.push( new THREE.Vertex( new THREE.Vector3( x, y, z ) ) );\n\n')
-    file.write('\t}\n\n')
-
-    file.write('\tfunction f3( a, b, c, nx, ny, nz ) {\n\n')
-    file.write('\t\tscope.faces.push( new THREE.Face3( a, b, c, nx && ny && nz ? new THREE.Vector3( nx, ny, nz ) : null ) );\n\n')
-    file.write('\t}\n\n')
-
-    file.write('\tfunction f4( a, b, c, d, nx, ny, nz ) {\n\n')
-    file.write('\t\tscope.faces.push( new THREE.Face4( a, b, c, d, nx && ny && nz ? new THREE.Vector3( nx, ny, nz ) : null ) );\n\n')
-    file.write('\t}\n\n')
-
-    file.write('\tfunction uv( u1, v1, u2, v2, u3, v3, u4, v4 ) {\n\n')
-    file.write('\t\tvar uv = [];\n')
-    file.write('\t\tuv.push( new THREE.UV( u1, v1 ) );\n')
-    file.write('\t\tuv.push( new THREE.UV( u2, v2 ) );\n')
-    file.write('\t\tuv.push( new THREE.UV( u3, v3 ) );\n')
-    file.write('\t\tif ( u4 && v4 ) uv.push( new THREE.UV( u4, v4 ) );\n')
-    file.write('\t\tscope.uvs.push( uv );\n')
-    file.write('\t}\n\n')
-
-    file.write('}\n\n')
-
-    file.write('%s.prototype = new THREE.Geometry();\n' % classname)
-    file.write('%s.prototype.constructor = %s;' % (classname, classname))
-
-    file.close()
-
-    print("writing", filename, "done")
-
-    if EXPORT_APPLY_MODIFIERS:
-        bpy.data.meshes.remove(mesh)
-
-from bpy.props import *
-
-
-class ExportTHREEJS(bpy.types.Operator):
-    '''TODO'''
-    bl_idname = "export.three_js"
-    bl_label = "Export three.js"
-
-    # List of operator properties, the attributes will be assigned
-    # to the class instance from the operator settings before calling.
-
-    path = StringProperty(name="File Path", description="File path used for exporting the PLY file", maxlen=1024, default="")
-    check_existing = BoolProperty(name="Check Existing", description="Check and warn on overwriting existing files", default=True, options={'HIDDEN'})
-    use_modifiers = BoolProperty(name="Apply Modifiers", description="Apply Modifiers to the exported mesh", default=True)
-    use_normals = BoolProperty(name="Normals", description="Export Normals for smooth and hard shaded faces", default=True)
-    use_uvs = BoolProperty(name="UVs", description="Exort the active UV layer", default=True)
-    use_colors = BoolProperty(name="Vertex Colors", description="Exort the active vertex color layer", default=True)
-
-    def poll(self, context):
-        return context.active_object != None
-
-    def execute(self, context):
-        print("Selected: " + context.active_object.name)
-
-        if not self.properties.path:
-            raise Exception("filename not set")
-
-        write(self.properties.path, context.scene, context.active_object,\
-            EXPORT_APPLY_MODIFIERS=self.properties.use_modifiers,
-            EXPORT_NORMALS=self.properties.use_normals,
-            EXPORT_UV=self.properties.use_uvs,
-            EXPORT_COLORS=self.properties.use_colors,
-        )
-
-        return {'FINISHED'}
-
-    def invoke(self, context, event):
-        wm = context.manager
-        wm.add_fileselect(self)
-        return {'RUNNING_MODAL'}
-
-    def draw(self, context):
-        layout = self.layout
-        props = self.properties
-
-        row = layout.row()
-        row.prop(props, "use_modifiers")
-        row.prop(props, "use_normals")
-        row = layout.row()
-        row.prop(props, "use_uvs")
-        row.prop(props, "use_colors")
-
-def menu_func(self, context):
-    default_path = bpy.data.filename.replace(".blend", ".js")
-    self.layout.operator(ExportTHREEJS.bl_idname, text="three.js (.js)").path = default_path
-
-def register():
-    bpy.types.register(ExportTHREEJS)
-    bpy.types.INFO_MT_file_export.append(menu_func)
-
-def unregister():
-    bpy.types.unregister(ExportTHREEJS)
-    bpy.types.INFO_MT_file_export.remove(menu_func)
-
-if __name__ == "__main__":
-    register()