Browse Source

Matrix4.transformVector3 ⟶ Matrix4.multiplyVector3
Matrix4.transformVector4 ⟶ Matrix4.multiplyVector4

Mr.doob 14 years ago
parent
commit
59304d8a6e

+ 14 - 14
build/Three.js

@@ -13,15 +13,15 @@ THREE.Vector4.prototype={set:function(a,b,d,g){this.x=a;this.y=b;this.z=d;this.w
 return this},multiplyScalar:function(a){this.x*=a;this.y*=a;this.z*=a;this.w*=a;return this},divideScalar:function(a){this.x/=a;this.y/=a;this.z/=a;this.w/=a;return this},lerpSelf:function(a,b){this.x+=(a.x-this.x)*b;this.y+=(a.y-this.y)*b;this.z+=(a.z-this.z)*b;this.w+=(a.w-this.w)*b},clone:function(){return new THREE.Vector4(this.x,this.y,this.z,this.w)},toString:function(){return"THREE.Vector4 ("+this.x+", "+this.y+", "+this.z+", "+this.w+")"}};
 THREE.Ray=function(a,b){this.origin=a||new THREE.Vector3;this.direction=b||new THREE.Vector3};
 THREE.Ray.prototype={intersectScene:function(a){var b,d,g=a.objects,h=[];a=0;for(b=g.length;a<b;a++){d=g[a];if(d instanceof THREE.Mesh)h=h.concat(this.intersectObject(d))}h.sort(function(n,m){return n.distance-m.distance});return h},intersectObject:function(a){function b(M,r,R,B){B=B.clone().subSelf(r);R=R.clone().subSelf(r);var e=M.clone().subSelf(r);M=B.dot(B);r=B.dot(R);B=B.dot(e);var f=R.dot(R);R=R.dot(e);e=1/(M*f-r*r);f=(f*B-r*R)*e;M=(M*R-r*B)*e;return f>0&&M>0&&f+M<1}var d,g,h,n,m,q,l,c,y,G,
-w,F=a.geometry,N=F.vertices,J=[];d=0;for(g=F.faces.length;d<g;d++){h=F.faces[d];G=this.origin.clone();w=this.direction.clone();n=a.matrix.transformVector3(N[h.a].position.clone());m=a.matrix.transformVector3(N[h.b].position.clone());q=a.matrix.transformVector3(N[h.c].position.clone());l=h instanceof THREE.Face4?a.matrix.transformVector3(N[h.d].position.clone()):null;c=a.rotationMatrix.transformVector3(h.normal.clone());y=w.dot(c);if(y<0){c=c.dot((new THREE.Vector3).sub(n,G))/y;G=G.addSelf(w.multiplyScalar(c));
+w,F=a.geometry,N=F.vertices,J=[];d=0;for(g=F.faces.length;d<g;d++){h=F.faces[d];G=this.origin.clone();w=this.direction.clone();n=a.matrix.multiplyVector3(N[h.a].position.clone());m=a.matrix.multiplyVector3(N[h.b].position.clone());q=a.matrix.multiplyVector3(N[h.c].position.clone());l=h instanceof THREE.Face4?a.matrix.multiplyVector3(N[h.d].position.clone()):null;c=a.rotationMatrix.multiplyVector3(h.normal.clone());y=w.dot(c);if(y<0){c=c.dot((new THREE.Vector3).sub(n,G))/y;G=G.addSelf(w.multiplyScalar(c));
 if(h instanceof THREE.Face3){if(b(G,n,m,q)){h={distance:this.origin.distanceTo(G),point:G,face:h,object:a};J.push(h)}}else if(h instanceof THREE.Face4)if(b(G,n,m,l)||b(G,m,q,l)){h={distance:this.origin.distanceTo(G),point:G,face:h,object:a};J.push(h)}}}return J}};
 THREE.Rectangle=function(){function a(){n=g-b;m=h-d}var b,d,g,h,n,m,q=true;this.getX=function(){return b};this.getY=function(){return d};this.getWidth=function(){return n};this.getHeight=function(){return m};this.getLeft=function(){return b};this.getTop=function(){return d};this.getRight=function(){return g};this.getBottom=function(){return h};this.set=function(l,c,y,G){q=false;b=l;d=c;g=y;h=G;a()};this.addPoint=function(l,c){if(q){q=false;b=l;d=c;g=l;h=c}else{b=Math.min(b,l);d=Math.min(d,c);g=Math.max(g,
 l);h=Math.max(h,c)}a()};this.addRectangle=function(l){if(q){q=false;b=l.getLeft();d=l.getTop();g=l.getRight();h=l.getBottom()}else{b=Math.min(b,l.getLeft());d=Math.min(d,l.getTop());g=Math.max(g,l.getRight());h=Math.max(h,l.getBottom())}a()};this.inflate=function(l){b-=l;d-=l;g+=l;h+=l;a()};this.minSelf=function(l){b=Math.max(b,l.getLeft());d=Math.max(d,l.getTop());g=Math.min(g,l.getRight());h=Math.min(h,l.getBottom());a()};this.instersects=function(l){return Math.min(g,l.getRight())-Math.max(b,l.getLeft())>=
 0&&Math.min(h,l.getBottom())-Math.max(d,l.getTop())>=0};this.empty=function(){q=true;h=g=d=b=0;a()};this.isEmpty=function(){return q};this.toString=function(){return"THREE.Rectangle ( left: "+b+", right: "+g+", top: "+d+", bottom: "+h+", width: "+n+", height: "+m+" )"}};THREE.Matrix3=function(){this.m=[]};THREE.Matrix3.prototype={transpose:function(){var a;a=this.m[1];this.m[1]=this.m[3];this.m[3]=a;a=this.m[2];this.m[2]=this.m[6];this.m[6]=a;a=this.m[5];this.m[5]=this.m[7];this.m[7]=a;return this}};
 THREE.Matrix4=function(){};
 THREE.Matrix4.prototype={n11:1,n12:0,n13:0,n14:0,n21:0,n22:1,n23:0,n24:0,n31:0,n32:0,n33:1,n34:0,n41:0,n42:0,n43:0,n44:1,identity:function(){this.n11=1;this.n21=this.n14=this.n13=this.n12=0;this.n22=1;this.n32=this.n31=this.n24=this.n23=0;this.n33=1;this.n43=this.n42=this.n41=this.n34=0;this.n44=1},copy:function(a){this.n11=a.n11;this.n12=a.n12;this.n13=a.n13;this.n14=a.n14;this.n21=a.n21;this.n22=a.n22;this.n23=a.n23;this.n24=a.n24;this.n31=a.n31;this.n32=a.n32;this.n33=a.n33;this.n34=a.n34;this.n41=
-a.n41;this.n42=a.n42;this.n43=a.n43;this.n44=a.n44},lookAt:function(a,b,d){var g=new THREE.Vector3,h=new THREE.Vector3,n=new THREE.Vector3;n.sub(a,b).normalize();g.cross(d,n).normalize();h.cross(n,g).normalize();this.n11=g.x;this.n12=g.y;this.n13=g.z;this.n14=-g.dot(a);this.n21=h.x;this.n22=h.y;this.n23=h.z;this.n24=-h.dot(a);this.n31=n.x;this.n32=n.y;this.n33=n.z;this.n34=-n.dot(a);this.n43=this.n42=this.n41=0;this.n44=1},transformVector3:function(a){var b=a.x,d=a.y,g=a.z,h=1/(this.n41*b+this.n42*
-d+this.n43*g+this.n44);a.x=(this.n11*b+this.n12*d+this.n13*g+this.n14)*h;a.y=(this.n21*b+this.n22*d+this.n23*g+this.n24)*h;a.z=(this.n31*b+this.n32*d+this.n33*g+this.n34)*h;return a},transformVector4:function(a){var b=a.x,d=a.y,g=a.z,h=a.w;a.x=this.n11*b+this.n12*d+this.n13*g+this.n14*h;a.y=this.n21*b+this.n22*d+this.n23*g+this.n24*h;a.z=this.n31*b+this.n32*d+this.n33*g+this.n34*h;a.w=this.n41*b+this.n42*d+this.n43*g+this.n44*h;return a},crossVector:function(a){var b=new THREE.Vector4;b.x=this.n11*
+a.n41;this.n42=a.n42;this.n43=a.n43;this.n44=a.n44},lookAt:function(a,b,d){var g=new THREE.Vector3,h=new THREE.Vector3,n=new THREE.Vector3;n.sub(a,b).normalize();g.cross(d,n).normalize();h.cross(n,g).normalize();this.n11=g.x;this.n12=g.y;this.n13=g.z;this.n14=-g.dot(a);this.n21=h.x;this.n22=h.y;this.n23=h.z;this.n24=-h.dot(a);this.n31=n.x;this.n32=n.y;this.n33=n.z;this.n34=-n.dot(a);this.n43=this.n42=this.n41=0;this.n44=1},multiplyVector3:function(a){var b=a.x,d=a.y,g=a.z,h=1/(this.n41*b+this.n42*
+d+this.n43*g+this.n44);a.x=(this.n11*b+this.n12*d+this.n13*g+this.n14)*h;a.y=(this.n21*b+this.n22*d+this.n23*g+this.n24)*h;a.z=(this.n31*b+this.n32*d+this.n33*g+this.n34)*h;return a},multiplyVector4:function(a){var b=a.x,d=a.y,g=a.z,h=a.w;a.x=this.n11*b+this.n12*d+this.n13*g+this.n14*h;a.y=this.n21*b+this.n22*d+this.n23*g+this.n24*h;a.z=this.n31*b+this.n32*d+this.n33*g+this.n34*h;a.w=this.n41*b+this.n42*d+this.n43*g+this.n44*h;return a},crossVector:function(a){var b=new THREE.Vector4;b.x=this.n11*
 a.x+this.n12*a.y+this.n13*a.z+this.n14*a.w;b.y=this.n21*a.x+this.n22*a.y+this.n23*a.z+this.n24*a.w;b.z=this.n31*a.x+this.n32*a.y+this.n33*a.z+this.n34*a.w;b.w=a.w?this.n41*a.x+this.n42*a.y+this.n43*a.z+this.n44*a.w:1;return b},multiply:function(a,b){var d=a.n11,g=a.n12,h=a.n13,n=a.n14,m=a.n21,q=a.n22,l=a.n23,c=a.n24,y=a.n31,G=a.n32,w=a.n33,F=a.n34,N=a.n41,J=a.n42,M=a.n43,r=a.n44,R=b.n11,B=b.n12,e=b.n13,f=b.n14,i=b.n21,o=b.n22,k=b.n23,j=b.n24,A=b.n31,s=b.n32,L=b.n33,u=b.n34,T=b.n41,P=b.n42,t=b.n43,
 H=b.n44;this.n11=d*R+g*i+h*A+n*T;this.n12=d*B+g*o+h*s+n*P;this.n13=d*e+g*k+h*L+n*t;this.n14=d*f+g*j+h*u+n*H;this.n21=m*R+q*i+l*A+c*T;this.n22=m*B+q*o+l*s+c*P;this.n23=m*e+q*k+l*L+c*t;this.n24=m*f+q*j+l*u+c*H;this.n31=y*R+G*i+w*A+F*T;this.n32=y*B+G*o+w*s+F*P;this.n33=y*e+G*k+w*L+F*t;this.n34=y*f+G*j+w*u+F*H;this.n41=N*R+J*i+M*A+r*T;this.n42=N*B+J*o+M*s+r*P;this.n43=N*e+J*k+M*L+r*t;this.n44=N*f+J*j+M*u+r*H},multiplySelf:function(a){var b=this.n11,d=this.n12,g=this.n13,h=this.n14,n=this.n21,m=this.n22,
 q=this.n23,l=this.n24,c=this.n31,y=this.n32,G=this.n33,w=this.n34,F=this.n41,N=this.n42,J=this.n43,M=this.n44;this.n11=b*a.n11+d*a.n21+g*a.n31+h*a.n41;this.n12=b*a.n12+d*a.n22+g*a.n32+h*a.n42;this.n13=b*a.n13+d*a.n23+g*a.n33+h*a.n43;this.n14=b*a.n14+d*a.n24+g*a.n34+h*a.n44;this.n21=n*a.n11+m*a.n21+q*a.n31+l*a.n41;this.n22=n*a.n12+m*a.n22+q*a.n32+l*a.n42;this.n23=n*a.n13+m*a.n23+q*a.n33+l*a.n43;this.n24=n*a.n14+m*a.n24+q*a.n34+l*a.n44;this.n31=c*a.n11+y*a.n21+G*a.n31+w*a.n41;this.n32=c*a.n12+y*a.n22+
@@ -44,9 +44,9 @@ THREE.Face3=function(a,b,d,g,h){this.a=a;this.b=b;this.c=d;this.centroid=new THR
 THREE.Face4=function(a,b,d,g,h,n){this.a=a;this.b=b;this.c=d;this.d=g;this.centroid=new THREE.Vector3;this.normal=h instanceof THREE.Vector3?h:new THREE.Vector3;this.vertexNormals=h instanceof Array?h:[];this.material=n instanceof Array?n:[n]};THREE.Face4.prototype={toString:function(){return"THREE.Face4 ( "+this.a+", "+this.b+", "+this.c+" "+this.d+" )"}};THREE.UV=function(a,b){this.u=a||0;this.v=b||0};
 THREE.UV.prototype={copy:function(a){this.u=a.u;this.v=a.v},toString:function(){return"THREE.UV ("+this.u+", "+this.v+")"}};THREE.Geometry=function(){this.vertices=[];this.faces=[];this.uvs=[]};
 THREE.Geometry.prototype={computeCentroids:function(){var a,b,d;a=0;for(b=this.faces.length;a<b;a++){d=this.faces[a];d.centroid.set(0,0,0);d.centroid.addSelf(this.vertices[d.a].position);d.centroid.addSelf(this.vertices[d.b].position);d.centroid.addSelf(this.vertices[d.c].position);if(d instanceof THREE.Face3)d.centroid.divideScalar(3);else if(d instanceof THREE.Face4){d.centroid.addSelf(this.vertices[d.d].position);d.centroid.divideScalar(4)}}},computeNormals:function(a){var b,d,g,h,n,m,q=new THREE.Vector3,
-l=new THREE.Vector3;g=0;for(h=this.vertices.length;g<h;g++){n=this.vertices[g];n.normal.set(0,0,0)}g=0;for(h=this.faces.length;g<h;g++){n=this.faces[g];if(a&&n.vertexNormals.length){q.set(0,0,0);b=0;for(d=n.normal.length;b<d;b++)q.addSelf(n.vertexNormals[b]);q.divideScalar(3)}else{b=this.vertices[n.a];d=this.vertices[n.b];m=this.vertices[n.c];q.sub(m.position,d.position);l.sub(b.position,d.position);q.crossSelf(l)}q.isZero()||q.normalize();n.normal.copy(q)}},computeBoundingBox:function(){if(this.vertices.length>
-0){this.bbox={x:[this.vertices[0].position.x,this.vertices[0].position.x],y:[this.vertices[0].position.y,this.vertices[0].position.y],z:[this.vertices[0].position.z,this.vertices[0].position.z]};for(var a=1,b=this.vertices.length;a<b;a++){vertex=this.vertices[a];if(vertex.position.x<this.bbox.x[0])this.bbox.x[0]=vertex.position.x;else if(vertex.position.x>this.bbox.x[1])this.bbox.x[1]=vertex.position.x;if(vertex.position.y<this.bbox.y[0])this.bbox.y[0]=vertex.position.y;else if(vertex.position.y>
-this.bbox.y[1])this.bbox.y[1]=vertex.position.y;if(vertex.position.z<this.bbox.z[0])this.bbox.z[0]=vertex.position.z;else if(vertex.position.z>this.bbox.z[1])this.bbox.z[1]=vertex.position.z}}},toString:function(){return"THREE.Geometry ( vertices: "+this.vertices+", faces: "+this.faces+" )"}};
+l=new THREE.Vector3;g=0;for(h=this.vertices.length;g<h;g++){n=this.vertices[g];n.normal.set(0,0,0)}g=0;for(h=this.faces.length;g<h;g++){n=this.faces[g];if(a&&n.vertexNormals.length){q.set(0,0,0);b=0;for(d=n.normal.length;b<d;b++)q.addSelf(n.vertexNormals[b]);q.divideScalar(3)}else{b=this.vertices[n.a];d=this.vertices[n.b];m=this.vertices[n.c];q.sub(m.position,d.position);l.sub(b.position,d.position);q.crossSelf(l)}q.isZero()||q.normalize();n.normal.copy(q)}},computeVertexNormals:function(){var a,
+b;a=0;for(b=this.faces.length;a<b;a++);},computeBoundingBox:function(){if(this.vertices.length>0){this.bbox={x:[this.vertices[0].position.x,this.vertices[0].position.x],y:[this.vertices[0].position.y,this.vertices[0].position.y],z:[this.vertices[0].position.z,this.vertices[0].position.z]};for(var a=1,b=this.vertices.length;a<b;a++){vertex=this.vertices[a];if(vertex.position.x<this.bbox.x[0])this.bbox.x[0]=vertex.position.x;else if(vertex.position.x>this.bbox.x[1])this.bbox.x[1]=vertex.position.x;
+if(vertex.position.y<this.bbox.y[0])this.bbox.y[0]=vertex.position.y;else if(vertex.position.y>this.bbox.y[1])this.bbox.y[1]=vertex.position.y;if(vertex.position.z<this.bbox.z[0])this.bbox.z[0]=vertex.position.z;else if(vertex.position.z>this.bbox.z[1])this.bbox.z[1]=vertex.position.z}}},toString:function(){return"THREE.Geometry ( vertices: "+this.vertices+", faces: "+this.faces+", uvs: "+this.uvs+" )"}};
 THREE.Camera=function(a,b,d,g){this.position=new THREE.Vector3(0,0,0);this.target={position:new THREE.Vector3(0,0,0)};this.up=new THREE.Vector3(0,1,0);this.matrix=new THREE.Matrix4;this.projectionMatrix=THREE.Matrix4.makePerspective(a,b,d,g);this.autoUpdateMatrix=true;this.updateMatrix=function(){this.matrix.lookAt(this.position,this.target.position,this.up)};this.toString=function(){return"THREE.Camera ( "+this.position+", "+this.target.position+" )"}};THREE.Light=function(a){this.color=new THREE.Color(a)};
 THREE.AmbientLight=function(a){THREE.Light.call(this,a)};THREE.AmbientLight.prototype=new THREE.Light;THREE.AmbientLight.prototype.constructor=THREE.AmbientLight;THREE.DirectionalLight=function(a,b){THREE.Light.call(this,a);this.position=new THREE.Vector3(0,1,0);this.intensity=b||1};THREE.DirectionalLight.prototype=new THREE.Light;THREE.DirectionalLight.prototype.constructor=THREE.DirectionalLight;
 THREE.PointLight=function(a,b){THREE.Light.call(this,a);this.position=new THREE.Vector3;this.intensity=b||1};THREE.DirectionalLight.prototype=new THREE.Light;THREE.DirectionalLight.prototype.constructor=THREE.PointLight;
@@ -84,16 +84,16 @@ THREE.ParticleDOMMaterial=function(a){this.domElement=a;this.toString=function()
 THREE.UVMapping=0;THREE.ReflectionMapping=1;THREE.RefractionMapping=2;THREE.Multiply=0;THREE.Mix=1;THREE.Repeat=0;THREE.ClampToEdge=1;THREE.MirroredRepeat=2;THREE.TextureCube=function(a,b){this.image=a;this.mapping=b?b: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(R,B){var e=0,f=1,i=R.z+R.w,o=B.z+B.w,k=-R.z+R.w,j=-B.z+B.w;if(i>=0&&o>=0&&k>=0&&j>=0)return true;else if(i<0&&o<0||k<0&&j<0)return false;else{if(i<0)e=Math.max(e,i/(i-o));else if(o<0)f=Math.min(f,i/(i-o));if(k<0)e=Math.max(e,k/(k-j));else if(j<0)f=Math.min(f,k/(k-j));if(f<e)return false;else{R.lerpSelf(B,e);B.lerpSelf(R,1-f);return true}}}var b=null,d,g,h,n=[],m,q,l=[],c,y,G=[],w=new THREE.Vector4,F=new THREE.Matrix4,N=new THREE.Matrix4,J=new THREE.Vector4,M=
-new THREE.Vector4,r;this.projectScene=function(R,B){var e,f,i,o,k,j,A,s,L,u,T,P,t,H,p,z,x;b=[];h=q=y=0;B.autoUpdateMatrix&&B.updateMatrix();F.multiply(B.projectionMatrix,B.matrix);A=R.objects;e=0;for(f=A.length;e<f;e++){s=A[e];s.autoUpdateMatrix&&s.updateMatrix();L=s.matrix;u=s.rotationMatrix;T=s.material;P=s.overdraw;if(s instanceof THREE.Mesh){t=s.geometry.vertices;i=0;for(o=t.length;i<o;i++){H=t[i];H.positionWorld.copy(H.position);L.transformVector3(H.positionWorld);p=H.positionScreen;p.copy(H.positionWorld);
-F.transformVector4(p);p.multiplyScalar(1/p.w);H.__visible=p.z>0&&p.z<1}H=s.geometry.faces;i=0;for(o=H.length;i<o;i++){p=H[i];if(p instanceof THREE.Face3){k=t[p.a];j=t[p.b];z=t[p.c];if(k.__visible&&j.__visible&&z.__visible)if(s.doubleSided||s.flipSided!=(z.positionScreen.x-k.positionScreen.x)*(j.positionScreen.y-k.positionScreen.y)-(z.positionScreen.y-k.positionScreen.y)*(j.positionScreen.x-k.positionScreen.x)<0){d=n[h]=n[h]||new THREE.RenderableFace3;d.v1.positionWorld.copy(k.positionWorld);d.v2.positionWorld.copy(j.positionWorld);
-d.v3.positionWorld.copy(z.positionWorld);d.v1.positionScreen.copy(k.positionScreen);d.v2.positionScreen.copy(j.positionScreen);d.v3.positionScreen.copy(z.positionScreen);d.normalWorld.copy(p.normal);u.transformVector3(d.normalWorld);d.centroidWorld.copy(p.centroid);L.transformVector3(d.centroidWorld);d.centroidScreen.copy(d.centroidWorld);F.transformVector3(d.centroidScreen);z=p.vertexNormals;r=d.vertexNormalsWorld;k=0;for(j=z.length;k<j;k++){x=r[k]=r[k]||new THREE.Vector3;x.copy(z[k]);u.transformVector3(x)}d.z=
+new THREE.Vector4,r;this.projectScene=function(R,B){var e,f,i,o,k,j,A,s,L,u,T,P,t,H,p,z,x;b=[];h=q=y=0;B.autoUpdateMatrix&&B.updateMatrix();F.multiply(B.projectionMatrix,B.matrix);A=R.objects;e=0;for(f=A.length;e<f;e++){s=A[e];s.autoUpdateMatrix&&s.updateMatrix();L=s.matrix;u=s.rotationMatrix;T=s.material;P=s.overdraw;if(s instanceof THREE.Mesh){t=s.geometry.vertices;i=0;for(o=t.length;i<o;i++){H=t[i];H.positionWorld.copy(H.position);L.multiplyVector3(H.positionWorld);p=H.positionScreen;p.copy(H.positionWorld);
+F.multiplyVector4(p);p.multiplyScalar(1/p.w);H.__visible=p.z>0&&p.z<1}H=s.geometry.faces;i=0;for(o=H.length;i<o;i++){p=H[i];if(p instanceof THREE.Face3){k=t[p.a];j=t[p.b];z=t[p.c];if(k.__visible&&j.__visible&&z.__visible)if(s.doubleSided||s.flipSided!=(z.positionScreen.x-k.positionScreen.x)*(j.positionScreen.y-k.positionScreen.y)-(z.positionScreen.y-k.positionScreen.y)*(j.positionScreen.x-k.positionScreen.x)<0){d=n[h]=n[h]||new THREE.RenderableFace3;d.v1.positionWorld.copy(k.positionWorld);d.v2.positionWorld.copy(j.positionWorld);
+d.v3.positionWorld.copy(z.positionWorld);d.v1.positionScreen.copy(k.positionScreen);d.v2.positionScreen.copy(j.positionScreen);d.v3.positionScreen.copy(z.positionScreen);d.normalWorld.copy(p.normal);u.multiplyVector3(d.normalWorld);d.centroidWorld.copy(p.centroid);L.multiplyVector3(d.centroidWorld);d.centroidScreen.copy(d.centroidWorld);F.multiplyVector3(d.centroidScreen);z=p.vertexNormals;r=d.vertexNormalsWorld;k=0;for(j=z.length;k<j;k++){x=r[k]=r[k]||new THREE.Vector3;x.copy(z[k]);u.multiplyVector3(x)}d.z=
 d.centroidScreen.z;d.meshMaterial=T;d.faceMaterial=p.material;d.overdraw=P;if(s.geometry.uvs[i]){d.uvs[0]=s.geometry.uvs[i][0];d.uvs[1]=s.geometry.uvs[i][1];d.uvs[2]=s.geometry.uvs[i][2]}b.push(d);h++}}else if(p instanceof THREE.Face4){k=t[p.a];j=t[p.b];z=t[p.c];x=t[p.d];if(k.__visible&&j.__visible&&z.__visible&&x.__visible)if(s.doubleSided||s.flipSided!=((x.positionScreen.x-k.positionScreen.x)*(j.positionScreen.y-k.positionScreen.y)-(x.positionScreen.y-k.positionScreen.y)*(j.positionScreen.x-k.positionScreen.x)<
-0||(j.positionScreen.x-z.positionScreen.x)*(x.positionScreen.y-z.positionScreen.y)-(j.positionScreen.y-z.positionScreen.y)*(x.positionScreen.x-z.positionScreen.x)<0)){d=n[h]=n[h]||new THREE.RenderableFace3;d.v1.positionWorld.copy(k.positionWorld);d.v2.positionWorld.copy(j.positionWorld);d.v3.positionWorld.copy(x.positionWorld);d.v1.positionScreen.copy(k.positionScreen);d.v2.positionScreen.copy(j.positionScreen);d.v3.positionScreen.copy(x.positionScreen);d.normalWorld.copy(p.normal);u.transformVector3(d.normalWorld);
-d.centroidWorld.copy(p.centroid);L.transformVector3(d.centroidWorld);d.centroidScreen.copy(d.centroidWorld);F.transformVector3(d.centroidScreen);d.z=d.centroidScreen.z;d.meshMaterial=T;d.faceMaterial=p.material;d.overdraw=P;if(s.geometry.uvs[i]){d.uvs[0]=s.geometry.uvs[i][0];d.uvs[1]=s.geometry.uvs[i][1];d.uvs[2]=s.geometry.uvs[i][3]}b.push(d);h++;g=n[h]=n[h]||new THREE.RenderableFace3;g.v1.positionWorld.copy(j.positionWorld);g.v2.positionWorld.copy(z.positionWorld);g.v3.positionWorld.copy(x.positionWorld);
+0||(j.positionScreen.x-z.positionScreen.x)*(x.positionScreen.y-z.positionScreen.y)-(j.positionScreen.y-z.positionScreen.y)*(x.positionScreen.x-z.positionScreen.x)<0)){d=n[h]=n[h]||new THREE.RenderableFace3;d.v1.positionWorld.copy(k.positionWorld);d.v2.positionWorld.copy(j.positionWorld);d.v3.positionWorld.copy(x.positionWorld);d.v1.positionScreen.copy(k.positionScreen);d.v2.positionScreen.copy(j.positionScreen);d.v3.positionScreen.copy(x.positionScreen);d.normalWorld.copy(p.normal);u.multiplyVector3(d.normalWorld);
+d.centroidWorld.copy(p.centroid);L.multiplyVector3(d.centroidWorld);d.centroidScreen.copy(d.centroidWorld);F.multiplyVector3(d.centroidScreen);d.z=d.centroidScreen.z;d.meshMaterial=T;d.faceMaterial=p.material;d.overdraw=P;if(s.geometry.uvs[i]){d.uvs[0]=s.geometry.uvs[i][0];d.uvs[1]=s.geometry.uvs[i][1];d.uvs[2]=s.geometry.uvs[i][3]}b.push(d);h++;g=n[h]=n[h]||new THREE.RenderableFace3;g.v1.positionWorld.copy(j.positionWorld);g.v2.positionWorld.copy(z.positionWorld);g.v3.positionWorld.copy(x.positionWorld);
 g.v1.positionScreen.copy(j.positionScreen);g.v2.positionScreen.copy(z.positionScreen);g.v3.positionScreen.copy(x.positionScreen);g.normalWorld.copy(d.normalWorld);g.centroidWorld.copy(d.centroidWorld);g.centroidScreen.copy(d.centroidScreen);g.z=g.centroidScreen.z;g.meshMaterial=T;g.faceMaterial=p.material;g.overdraw=P;if(s.geometry.uvs[i]){g.uvs[0]=s.geometry.uvs[i][1];g.uvs[1]=s.geometry.uvs[i][2];g.uvs[2]=s.geometry.uvs[i][3]}b.push(g);h++}}}}else if(s instanceof THREE.Line){N.multiply(F,L);t=s.geometry.vertices;
-H=t[0];H.positionScreen.copy(H.position);N.transformVector4(H.positionScreen);i=1;for(o=t.length;i<o;i++){k=t[i];k.positionScreen.copy(k.position);N.transformVector4(k.positionScreen);j=t[i-1];J.copy(k.positionScreen);M.copy(j.positionScreen);if(a(J,M)){J.multiplyScalar(1/J.w);M.multiplyScalar(1/M.w);m=l[q]=l[q]||new THREE.RenderableLine;m.v1.positionScreen.copy(J);m.v2.positionScreen.copy(M);m.z=Math.max(J.z,M.z);m.material=s.material;b.push(m);q++}}}else if(s instanceof THREE.Particle){w.set(s.position.x,
-s.position.y,s.position.z,1);F.transformVector4(w);w.z/=w.w;if(w.z>0&&w.z<1){c=G[y]=G[y]||new THREE.RenderableParticle;c.x=w.x/w.w;c.y=w.y/w.w;c.z=w.z;c.rotation=s.rotation.z;c.scale.x=s.scale.x*Math.abs(c.x-(w.x+B.projectionMatrix.n11)/(w.w+B.projectionMatrix.n14));c.scale.y=s.scale.y*Math.abs(c.y-(w.y+B.projectionMatrix.n22)/(w.w+B.projectionMatrix.n24));c.material=s.material;b.push(c);y++}}}b.sort(function(O,D){return D.z-O.z});return b};this.unprojectVector=function(R,B){var e=new THREE.Matrix4;
-e.multiply(THREE.Matrix4.makeInvert(B.matrix),THREE.Matrix4.makeInvert(B.projectionMatrix));e.transformVector3(R);return R}};
+H=t[0];H.positionScreen.copy(H.position);N.multiplyVector4(H.positionScreen);i=1;for(o=t.length;i<o;i++){k=t[i];k.positionScreen.copy(k.position);N.multiplyVector4(k.positionScreen);j=t[i-1];J.copy(k.positionScreen);M.copy(j.positionScreen);if(a(J,M)){J.multiplyScalar(1/J.w);M.multiplyScalar(1/M.w);m=l[q]=l[q]||new THREE.RenderableLine;m.v1.positionScreen.copy(J);m.v2.positionScreen.copy(M);m.z=Math.max(J.z,M.z);m.material=s.material;b.push(m);q++}}}else if(s instanceof THREE.Particle){w.set(s.position.x,
+s.position.y,s.position.z,1);F.multiplyVector4(w);w.z/=w.w;if(w.z>0&&w.z<1){c=G[y]=G[y]||new THREE.RenderableParticle;c.x=w.x/w.w;c.y=w.y/w.w;c.z=w.z;c.rotation=s.rotation.z;c.scale.x=s.scale.x*Math.abs(c.x-(w.x+B.projectionMatrix.n11)/(w.w+B.projectionMatrix.n14));c.scale.y=s.scale.y*Math.abs(c.y-(w.y+B.projectionMatrix.n22)/(w.w+B.projectionMatrix.n24));c.material=s.material;b.push(c);y++}}}b.sort(function(O,D){return D.z-O.z});return b};this.unprojectVector=function(R,B){var e=new THREE.Matrix4;
+e.multiply(THREE.Matrix4.makeInvert(B.matrix),THREE.Matrix4.makeInvert(B.projectionMatrix));e.multiplyVector3(R);return R}};
 THREE.DOMRenderer=function(){THREE.Renderer.call(this);var a=null,b=new THREE.Projector,d,g,h,n;this.domElement=document.createElement("div");this.setSize=function(m,q){d=m;g=q;h=d/2;n=g/2};this.render=function(m,q){var l,c,y,G,w,F,N,J;a=b.projectScene(m,q);l=0;for(c=a.length;l<c;l++){w=a[l];if(w instanceof THREE.RenderableParticle){N=w.x*h+h;J=w.y*n+n;y=0;for(G=w.material.length;y<G;y++){F=w.material[y];if(F instanceof THREE.ParticleDOMMaterial){F=F.domElement;F.style.left=N+"px";F.style.top=J+"px"}}}}}};
 THREE.CanvasRenderer=function(){function a(I,Y,U,E){var v,K,$,S,X=I.lights;I=0;for(v=X.length;I<v;I++){K=X[I];$=K.color;S=K.intensity;if(K instanceof THREE.DirectionalLight){K=U.dot(K.position)*S;if(K>0){E.r+=$.r*K;E.g+=$.g*K;E.b+=$.b*K}}else if(K instanceof THREE.PointLight){aa.sub(K.position,Y);aa.normalize();K=U.dot(aa)*S;if(K>0){E.r+=$.r*K;E.g+=$.g*K;E.b+=$.b*K}}}}function b(I,Y,U,E,v,K){if(v.opacity!=0){n(v.opacity);m(v.blending);L=I.positionScreen.x;u=I.positionScreen.y;T=Y.positionScreen.x;
 P=Y.positionScreen.y;t=U.positionScreen.x;H=U.positionScreen.y;var $=L,S=u,X=T,ba=P,Z=t,ca=H;r.beginPath();r.moveTo($,S);r.lineTo(X,ba);r.lineTo(Z,ca);r.lineTo($,S);r.closePath();if(v instanceof THREE.MeshBasicMaterial)if(v.map&&v.map.loaded)h(L,u,T,P,t,H,v.map.image,E.uvs[0].u,E.uvs[0].v,E.uvs[1].u,E.uvs[1].v,E.uvs[2].u,E.uvs[2].v);else if(v.env_map&&v.env_map.loaded){if(v.env_map.mapping==THREE.ReflectionMapping){aa.copy(E.vertexNormalsWorld[0]);V=(aa.x*camera.matrix.n11+aa.y*camera.matrix.n12+

+ 14 - 14
build/ThreeDebug.js

@@ -13,15 +13,15 @@ THREE.Vector4.prototype={set:function(a,b,d,g){this.x=a;this.y=b;this.z=d;this.w
 return this},multiplyScalar:function(a){this.x*=a;this.y*=a;this.z*=a;this.w*=a;return this},divideScalar:function(a){this.x/=a;this.y/=a;this.z/=a;this.w/=a;return this},lerpSelf:function(a,b){this.x+=(a.x-this.x)*b;this.y+=(a.y-this.y)*b;this.z+=(a.z-this.z)*b;this.w+=(a.w-this.w)*b},clone:function(){return new THREE.Vector4(this.x,this.y,this.z,this.w)},toString:function(){return"THREE.Vector4 ("+this.x+", "+this.y+", "+this.z+", "+this.w+")"}};
 THREE.Ray=function(a,b){this.origin=a||new THREE.Vector3;this.direction=b||new THREE.Vector3};
 THREE.Ray.prototype={intersectScene:function(a){var b,d,g=a.objects,h=[];a=0;for(b=g.length;a<b;a++){d=g[a];if(d instanceof THREE.Mesh)h=h.concat(this.intersectObject(d))}h.sort(function(o,m){return o.distance-m.distance});return h},intersectObject:function(a){function b(M,n,S,B){B=B.clone().subSelf(n);S=S.clone().subSelf(n);var e=M.clone().subSelf(n);M=B.dot(B);n=B.dot(S);B=B.dot(e);var f=S.dot(S);S=S.dot(e);e=1/(M*f-n*n);f=(f*B-n*S)*e;M=(M*S-n*B)*e;return f>0&&M>0&&f+M<1}var d,g,h,o,m,r,l,c,y,G,
-w,F=a.geometry,O=F.vertices,J=[];d=0;for(g=F.faces.length;d<g;d++){h=F.faces[d];G=this.origin.clone();w=this.direction.clone();o=a.matrix.transformVector3(O[h.a].position.clone());m=a.matrix.transformVector3(O[h.b].position.clone());r=a.matrix.transformVector3(O[h.c].position.clone());l=h instanceof THREE.Face4?a.matrix.transformVector3(O[h.d].position.clone()):null;c=a.rotationMatrix.transformVector3(h.normal.clone());y=w.dot(c);if(y<0){c=c.dot((new THREE.Vector3).sub(o,G))/y;G=G.addSelf(w.multiplyScalar(c));
+w,F=a.geometry,O=F.vertices,J=[];d=0;for(g=F.faces.length;d<g;d++){h=F.faces[d];G=this.origin.clone();w=this.direction.clone();o=a.matrix.multiplyVector3(O[h.a].position.clone());m=a.matrix.multiplyVector3(O[h.b].position.clone());r=a.matrix.multiplyVector3(O[h.c].position.clone());l=h instanceof THREE.Face4?a.matrix.multiplyVector3(O[h.d].position.clone()):null;c=a.rotationMatrix.multiplyVector3(h.normal.clone());y=w.dot(c);if(y<0){c=c.dot((new THREE.Vector3).sub(o,G))/y;G=G.addSelf(w.multiplyScalar(c));
 if(h instanceof THREE.Face3){if(b(G,o,m,r)){h={distance:this.origin.distanceTo(G),point:G,face:h,object:a};J.push(h)}}else if(h instanceof THREE.Face4)if(b(G,o,m,l)||b(G,m,r,l)){h={distance:this.origin.distanceTo(G),point:G,face:h,object:a};J.push(h)}}}return J}};
 THREE.Rectangle=function(){function a(){o=g-b;m=h-d}var b,d,g,h,o,m,r=true;this.getX=function(){return b};this.getY=function(){return d};this.getWidth=function(){return o};this.getHeight=function(){return m};this.getLeft=function(){return b};this.getTop=function(){return d};this.getRight=function(){return g};this.getBottom=function(){return h};this.set=function(l,c,y,G){r=false;b=l;d=c;g=y;h=G;a()};this.addPoint=function(l,c){if(r){r=false;b=l;d=c;g=l;h=c}else{b=Math.min(b,l);d=Math.min(d,c);g=Math.max(g,
 l);h=Math.max(h,c)}a()};this.addRectangle=function(l){if(r){r=false;b=l.getLeft();d=l.getTop();g=l.getRight();h=l.getBottom()}else{b=Math.min(b,l.getLeft());d=Math.min(d,l.getTop());g=Math.max(g,l.getRight());h=Math.max(h,l.getBottom())}a()};this.inflate=function(l){b-=l;d-=l;g+=l;h+=l;a()};this.minSelf=function(l){b=Math.max(b,l.getLeft());d=Math.max(d,l.getTop());g=Math.min(g,l.getRight());h=Math.min(h,l.getBottom());a()};this.instersects=function(l){return Math.min(g,l.getRight())-Math.max(b,l.getLeft())>=
 0&&Math.min(h,l.getBottom())-Math.max(d,l.getTop())>=0};this.empty=function(){r=true;h=g=d=b=0;a()};this.isEmpty=function(){return r};this.toString=function(){return"THREE.Rectangle ( left: "+b+", right: "+g+", top: "+d+", bottom: "+h+", width: "+o+", height: "+m+" )"}};THREE.Matrix3=function(){this.m=[]};THREE.Matrix3.prototype={transpose:function(){var a;a=this.m[1];this.m[1]=this.m[3];this.m[3]=a;a=this.m[2];this.m[2]=this.m[6];this.m[6]=a;a=this.m[5];this.m[5]=this.m[7];this.m[7]=a;return this}};
 THREE.Matrix4=function(){};
 THREE.Matrix4.prototype={n11:1,n12:0,n13:0,n14:0,n21:0,n22:1,n23:0,n24:0,n31:0,n32:0,n33:1,n34:0,n41:0,n42:0,n43:0,n44:1,identity:function(){this.n11=1;this.n21=this.n14=this.n13=this.n12=0;this.n22=1;this.n32=this.n31=this.n24=this.n23=0;this.n33=1;this.n43=this.n42=this.n41=this.n34=0;this.n44=1},copy:function(a){this.n11=a.n11;this.n12=a.n12;this.n13=a.n13;this.n14=a.n14;this.n21=a.n21;this.n22=a.n22;this.n23=a.n23;this.n24=a.n24;this.n31=a.n31;this.n32=a.n32;this.n33=a.n33;this.n34=a.n34;this.n41=
-a.n41;this.n42=a.n42;this.n43=a.n43;this.n44=a.n44},lookAt:function(a,b,d){var g=new THREE.Vector3,h=new THREE.Vector3,o=new THREE.Vector3;o.sub(a,b).normalize();g.cross(d,o).normalize();h.cross(o,g).normalize();this.n11=g.x;this.n12=g.y;this.n13=g.z;this.n14=-g.dot(a);this.n21=h.x;this.n22=h.y;this.n23=h.z;this.n24=-h.dot(a);this.n31=o.x;this.n32=o.y;this.n33=o.z;this.n34=-o.dot(a);this.n43=this.n42=this.n41=0;this.n44=1},transformVector3:function(a){var b=a.x,d=a.y,g=a.z,h=1/(this.n41*b+this.n42*
-d+this.n43*g+this.n44);a.x=(this.n11*b+this.n12*d+this.n13*g+this.n14)*h;a.y=(this.n21*b+this.n22*d+this.n23*g+this.n24)*h;a.z=(this.n31*b+this.n32*d+this.n33*g+this.n34)*h;return a},transformVector4:function(a){var b=a.x,d=a.y,g=a.z,h=a.w;a.x=this.n11*b+this.n12*d+this.n13*g+this.n14*h;a.y=this.n21*b+this.n22*d+this.n23*g+this.n24*h;a.z=this.n31*b+this.n32*d+this.n33*g+this.n34*h;a.w=this.n41*b+this.n42*d+this.n43*g+this.n44*h;return a},crossVector:function(a){var b=new THREE.Vector4;b.x=this.n11*
+a.n41;this.n42=a.n42;this.n43=a.n43;this.n44=a.n44},lookAt:function(a,b,d){var g=new THREE.Vector3,h=new THREE.Vector3,o=new THREE.Vector3;o.sub(a,b).normalize();g.cross(d,o).normalize();h.cross(o,g).normalize();this.n11=g.x;this.n12=g.y;this.n13=g.z;this.n14=-g.dot(a);this.n21=h.x;this.n22=h.y;this.n23=h.z;this.n24=-h.dot(a);this.n31=o.x;this.n32=o.y;this.n33=o.z;this.n34=-o.dot(a);this.n43=this.n42=this.n41=0;this.n44=1},multiplyVector3:function(a){var b=a.x,d=a.y,g=a.z,h=1/(this.n41*b+this.n42*
+d+this.n43*g+this.n44);a.x=(this.n11*b+this.n12*d+this.n13*g+this.n14)*h;a.y=(this.n21*b+this.n22*d+this.n23*g+this.n24)*h;a.z=(this.n31*b+this.n32*d+this.n33*g+this.n34)*h;return a},multiplyVector4:function(a){var b=a.x,d=a.y,g=a.z,h=a.w;a.x=this.n11*b+this.n12*d+this.n13*g+this.n14*h;a.y=this.n21*b+this.n22*d+this.n23*g+this.n24*h;a.z=this.n31*b+this.n32*d+this.n33*g+this.n34*h;a.w=this.n41*b+this.n42*d+this.n43*g+this.n44*h;return a},crossVector:function(a){var b=new THREE.Vector4;b.x=this.n11*
 a.x+this.n12*a.y+this.n13*a.z+this.n14*a.w;b.y=this.n21*a.x+this.n22*a.y+this.n23*a.z+this.n24*a.w;b.z=this.n31*a.x+this.n32*a.y+this.n33*a.z+this.n34*a.w;b.w=a.w?this.n41*a.x+this.n42*a.y+this.n43*a.z+this.n44*a.w:1;return b},multiply:function(a,b){var d=a.n11,g=a.n12,h=a.n13,o=a.n14,m=a.n21,r=a.n22,l=a.n23,c=a.n24,y=a.n31,G=a.n32,w=a.n33,F=a.n34,O=a.n41,J=a.n42,M=a.n43,n=a.n44,S=b.n11,B=b.n12,e=b.n13,f=b.n14,i=b.n21,p=b.n22,k=b.n23,j=b.n24,A=b.n31,s=b.n32,L=b.n33,u=b.n34,T=b.n41,Q=b.n42,t=b.n43,
 H=b.n44;this.n11=d*S+g*i+h*A+o*T;this.n12=d*B+g*p+h*s+o*Q;this.n13=d*e+g*k+h*L+o*t;this.n14=d*f+g*j+h*u+o*H;this.n21=m*S+r*i+l*A+c*T;this.n22=m*B+r*p+l*s+c*Q;this.n23=m*e+r*k+l*L+c*t;this.n24=m*f+r*j+l*u+c*H;this.n31=y*S+G*i+w*A+F*T;this.n32=y*B+G*p+w*s+F*Q;this.n33=y*e+G*k+w*L+F*t;this.n34=y*f+G*j+w*u+F*H;this.n41=O*S+J*i+M*A+n*T;this.n42=O*B+J*p+M*s+n*Q;this.n43=O*e+J*k+M*L+n*t;this.n44=O*f+J*j+M*u+n*H},multiplySelf:function(a){var b=this.n11,d=this.n12,g=this.n13,h=this.n14,o=this.n21,m=this.n22,
 r=this.n23,l=this.n24,c=this.n31,y=this.n32,G=this.n33,w=this.n34,F=this.n41,O=this.n42,J=this.n43,M=this.n44;this.n11=b*a.n11+d*a.n21+g*a.n31+h*a.n41;this.n12=b*a.n12+d*a.n22+g*a.n32+h*a.n42;this.n13=b*a.n13+d*a.n23+g*a.n33+h*a.n43;this.n14=b*a.n14+d*a.n24+g*a.n34+h*a.n44;this.n21=o*a.n11+m*a.n21+r*a.n31+l*a.n41;this.n22=o*a.n12+m*a.n22+r*a.n32+l*a.n42;this.n23=o*a.n13+m*a.n23+r*a.n33+l*a.n43;this.n24=o*a.n14+m*a.n24+r*a.n34+l*a.n44;this.n31=c*a.n11+y*a.n21+G*a.n31+w*a.n41;this.n32=c*a.n12+y*a.n22+
@@ -44,9 +44,9 @@ THREE.Face3=function(a,b,d,g,h){this.a=a;this.b=b;this.c=d;this.centroid=new THR
 THREE.Face4=function(a,b,d,g,h,o){this.a=a;this.b=b;this.c=d;this.d=g;this.centroid=new THREE.Vector3;this.normal=h instanceof THREE.Vector3?h:new THREE.Vector3;this.vertexNormals=h instanceof Array?h:[];this.material=o instanceof Array?o:[o]};THREE.Face4.prototype={toString:function(){return"THREE.Face4 ( "+this.a+", "+this.b+", "+this.c+" "+this.d+" )"}};THREE.UV=function(a,b){this.u=a||0;this.v=b||0};
 THREE.UV.prototype={copy:function(a){this.u=a.u;this.v=a.v},toString:function(){return"THREE.UV ("+this.u+", "+this.v+")"}};THREE.Geometry=function(){this.vertices=[];this.faces=[];this.uvs=[]};
 THREE.Geometry.prototype={computeCentroids:function(){var a,b,d;a=0;for(b=this.faces.length;a<b;a++){d=this.faces[a];d.centroid.set(0,0,0);d.centroid.addSelf(this.vertices[d.a].position);d.centroid.addSelf(this.vertices[d.b].position);d.centroid.addSelf(this.vertices[d.c].position);if(d instanceof THREE.Face3)d.centroid.divideScalar(3);else if(d instanceof THREE.Face4){d.centroid.addSelf(this.vertices[d.d].position);d.centroid.divideScalar(4)}}},computeNormals:function(a){var b,d,g,h,o,m,r=new THREE.Vector3,
-l=new THREE.Vector3;g=0;for(h=this.vertices.length;g<h;g++){o=this.vertices[g];o.normal.set(0,0,0)}g=0;for(h=this.faces.length;g<h;g++){o=this.faces[g];if(a&&o.vertexNormals.length){r.set(0,0,0);b=0;for(d=o.normal.length;b<d;b++)r.addSelf(o.vertexNormals[b]);r.divideScalar(3)}else{b=this.vertices[o.a];d=this.vertices[o.b];m=this.vertices[o.c];r.sub(m.position,d.position);l.sub(b.position,d.position);r.crossSelf(l)}r.isZero()||r.normalize();o.normal.copy(r)}},computeBoundingBox:function(){if(this.vertices.length>
-0){this.bbox={x:[this.vertices[0].position.x,this.vertices[0].position.x],y:[this.vertices[0].position.y,this.vertices[0].position.y],z:[this.vertices[0].position.z,this.vertices[0].position.z]};for(var a=1,b=this.vertices.length;a<b;a++){vertex=this.vertices[a];if(vertex.position.x<this.bbox.x[0])this.bbox.x[0]=vertex.position.x;else if(vertex.position.x>this.bbox.x[1])this.bbox.x[1]=vertex.position.x;if(vertex.position.y<this.bbox.y[0])this.bbox.y[0]=vertex.position.y;else if(vertex.position.y>
-this.bbox.y[1])this.bbox.y[1]=vertex.position.y;if(vertex.position.z<this.bbox.z[0])this.bbox.z[0]=vertex.position.z;else if(vertex.position.z>this.bbox.z[1])this.bbox.z[1]=vertex.position.z}}},toString:function(){return"THREE.Geometry ( vertices: "+this.vertices+", faces: "+this.faces+" )"}};
+l=new THREE.Vector3;g=0;for(h=this.vertices.length;g<h;g++){o=this.vertices[g];o.normal.set(0,0,0)}g=0;for(h=this.faces.length;g<h;g++){o=this.faces[g];if(a&&o.vertexNormals.length){r.set(0,0,0);b=0;for(d=o.normal.length;b<d;b++)r.addSelf(o.vertexNormals[b]);r.divideScalar(3)}else{b=this.vertices[o.a];d=this.vertices[o.b];m=this.vertices[o.c];r.sub(m.position,d.position);l.sub(b.position,d.position);r.crossSelf(l)}r.isZero()||r.normalize();o.normal.copy(r)}},computeVertexNormals:function(){var a,
+b;a=0;for(b=this.faces.length;a<b;a++);},computeBoundingBox:function(){if(this.vertices.length>0){this.bbox={x:[this.vertices[0].position.x,this.vertices[0].position.x],y:[this.vertices[0].position.y,this.vertices[0].position.y],z:[this.vertices[0].position.z,this.vertices[0].position.z]};for(var a=1,b=this.vertices.length;a<b;a++){vertex=this.vertices[a];if(vertex.position.x<this.bbox.x[0])this.bbox.x[0]=vertex.position.x;else if(vertex.position.x>this.bbox.x[1])this.bbox.x[1]=vertex.position.x;
+if(vertex.position.y<this.bbox.y[0])this.bbox.y[0]=vertex.position.y;else if(vertex.position.y>this.bbox.y[1])this.bbox.y[1]=vertex.position.y;if(vertex.position.z<this.bbox.z[0])this.bbox.z[0]=vertex.position.z;else if(vertex.position.z>this.bbox.z[1])this.bbox.z[1]=vertex.position.z}}},toString:function(){return"THREE.Geometry ( vertices: "+this.vertices+", faces: "+this.faces+", uvs: "+this.uvs+" )"}};
 THREE.Camera=function(a,b,d,g){this.position=new THREE.Vector3(0,0,0);this.target={position:new THREE.Vector3(0,0,0)};this.up=new THREE.Vector3(0,1,0);this.matrix=new THREE.Matrix4;this.projectionMatrix=THREE.Matrix4.makePerspective(a,b,d,g);this.autoUpdateMatrix=true;this.updateMatrix=function(){this.matrix.lookAt(this.position,this.target.position,this.up)};this.toString=function(){return"THREE.Camera ( "+this.position+", "+this.target.position+" )"}};THREE.Light=function(a){this.color=new THREE.Color(a)};
 THREE.AmbientLight=function(a){THREE.Light.call(this,a)};THREE.AmbientLight.prototype=new THREE.Light;THREE.AmbientLight.prototype.constructor=THREE.AmbientLight;THREE.DirectionalLight=function(a,b){THREE.Light.call(this,a);this.position=new THREE.Vector3(0,1,0);this.intensity=b||1};THREE.DirectionalLight.prototype=new THREE.Light;THREE.DirectionalLight.prototype.constructor=THREE.DirectionalLight;
 THREE.PointLight=function(a,b){THREE.Light.call(this,a);this.position=new THREE.Vector3;this.intensity=b||1};THREE.DirectionalLight.prototype=new THREE.Light;THREE.DirectionalLight.prototype.constructor=THREE.PointLight;
@@ -84,16 +84,16 @@ THREE.ParticleDOMMaterial=function(a){this.domElement=a;this.toString=function()
 THREE.UVMapping=0;THREE.ReflectionMapping=1;THREE.RefractionMapping=2;THREE.Multiply=0;THREE.Mix=1;THREE.Repeat=0;THREE.ClampToEdge=1;THREE.MirroredRepeat=2;THREE.TextureCube=function(a,b){this.image=a;this.mapping=b?b: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(S,B){var e=0,f=1,i=S.z+S.w,p=B.z+B.w,k=-S.z+S.w,j=-B.z+B.w;if(i>=0&&p>=0&&k>=0&&j>=0)return true;else if(i<0&&p<0||k<0&&j<0)return false;else{if(i<0)e=Math.max(e,i/(i-p));else if(p<0)f=Math.min(f,i/(i-p));if(k<0)e=Math.max(e,k/(k-j));else if(j<0)f=Math.min(f,k/(k-j));if(f<e)return false;else{S.lerpSelf(B,e);B.lerpSelf(S,1-f);return true}}}var b=null,d,g,h,o=[],m,r,l=[],c,y,G=[],w=new THREE.Vector4,F=new THREE.Matrix4,O=new THREE.Matrix4,J=new THREE.Vector4,M=
-new THREE.Vector4,n;this.projectScene=function(S,B){var e,f,i,p,k,j,A,s,L,u,T,Q,t,H,q,z,x;b=[];h=r=y=0;B.autoUpdateMatrix&&B.updateMatrix();F.multiply(B.projectionMatrix,B.matrix);A=S.objects;e=0;for(f=A.length;e<f;e++){s=A[e];s.autoUpdateMatrix&&s.updateMatrix();L=s.matrix;u=s.rotationMatrix;T=s.material;Q=s.overdraw;if(s instanceof THREE.Mesh){t=s.geometry.vertices;i=0;for(p=t.length;i<p;i++){H=t[i];H.positionWorld.copy(H.position);L.transformVector3(H.positionWorld);q=H.positionScreen;q.copy(H.positionWorld);
-F.transformVector4(q);q.multiplyScalar(1/q.w);H.__visible=q.z>0&&q.z<1}H=s.geometry.faces;i=0;for(p=H.length;i<p;i++){q=H[i];if(q instanceof THREE.Face3){k=t[q.a];j=t[q.b];z=t[q.c];if(k.__visible&&j.__visible&&z.__visible)if(s.doubleSided||s.flipSided!=(z.positionScreen.x-k.positionScreen.x)*(j.positionScreen.y-k.positionScreen.y)-(z.positionScreen.y-k.positionScreen.y)*(j.positionScreen.x-k.positionScreen.x)<0){d=o[h]=o[h]||new THREE.RenderableFace3;d.v1.positionWorld.copy(k.positionWorld);d.v2.positionWorld.copy(j.positionWorld);
-d.v3.positionWorld.copy(z.positionWorld);d.v1.positionScreen.copy(k.positionScreen);d.v2.positionScreen.copy(j.positionScreen);d.v3.positionScreen.copy(z.positionScreen);d.normalWorld.copy(q.normal);u.transformVector3(d.normalWorld);d.centroidWorld.copy(q.centroid);L.transformVector3(d.centroidWorld);d.centroidScreen.copy(d.centroidWorld);F.transformVector3(d.centroidScreen);z=q.vertexNormals;n=d.vertexNormalsWorld;k=0;for(j=z.length;k<j;k++){x=n[k]=n[k]||new THREE.Vector3;x.copy(z[k]);u.transformVector3(x)}d.z=
+new THREE.Vector4,n;this.projectScene=function(S,B){var e,f,i,p,k,j,A,s,L,u,T,Q,t,H,q,z,x;b=[];h=r=y=0;B.autoUpdateMatrix&&B.updateMatrix();F.multiply(B.projectionMatrix,B.matrix);A=S.objects;e=0;for(f=A.length;e<f;e++){s=A[e];s.autoUpdateMatrix&&s.updateMatrix();L=s.matrix;u=s.rotationMatrix;T=s.material;Q=s.overdraw;if(s instanceof THREE.Mesh){t=s.geometry.vertices;i=0;for(p=t.length;i<p;i++){H=t[i];H.positionWorld.copy(H.position);L.multiplyVector3(H.positionWorld);q=H.positionScreen;q.copy(H.positionWorld);
+F.multiplyVector4(q);q.multiplyScalar(1/q.w);H.__visible=q.z>0&&q.z<1}H=s.geometry.faces;i=0;for(p=H.length;i<p;i++){q=H[i];if(q instanceof THREE.Face3){k=t[q.a];j=t[q.b];z=t[q.c];if(k.__visible&&j.__visible&&z.__visible)if(s.doubleSided||s.flipSided!=(z.positionScreen.x-k.positionScreen.x)*(j.positionScreen.y-k.positionScreen.y)-(z.positionScreen.y-k.positionScreen.y)*(j.positionScreen.x-k.positionScreen.x)<0){d=o[h]=o[h]||new THREE.RenderableFace3;d.v1.positionWorld.copy(k.positionWorld);d.v2.positionWorld.copy(j.positionWorld);
+d.v3.positionWorld.copy(z.positionWorld);d.v1.positionScreen.copy(k.positionScreen);d.v2.positionScreen.copy(j.positionScreen);d.v3.positionScreen.copy(z.positionScreen);d.normalWorld.copy(q.normal);u.multiplyVector3(d.normalWorld);d.centroidWorld.copy(q.centroid);L.multiplyVector3(d.centroidWorld);d.centroidScreen.copy(d.centroidWorld);F.multiplyVector3(d.centroidScreen);z=q.vertexNormals;n=d.vertexNormalsWorld;k=0;for(j=z.length;k<j;k++){x=n[k]=n[k]||new THREE.Vector3;x.copy(z[k]);u.multiplyVector3(x)}d.z=
 d.centroidScreen.z;d.meshMaterial=T;d.faceMaterial=q.material;d.overdraw=Q;if(s.geometry.uvs[i]){d.uvs[0]=s.geometry.uvs[i][0];d.uvs[1]=s.geometry.uvs[i][1];d.uvs[2]=s.geometry.uvs[i][2]}b.push(d);h++}}else if(q instanceof THREE.Face4){k=t[q.a];j=t[q.b];z=t[q.c];x=t[q.d];if(k.__visible&&j.__visible&&z.__visible&&x.__visible)if(s.doubleSided||s.flipSided!=((x.positionScreen.x-k.positionScreen.x)*(j.positionScreen.y-k.positionScreen.y)-(x.positionScreen.y-k.positionScreen.y)*(j.positionScreen.x-k.positionScreen.x)<
-0||(j.positionScreen.x-z.positionScreen.x)*(x.positionScreen.y-z.positionScreen.y)-(j.positionScreen.y-z.positionScreen.y)*(x.positionScreen.x-z.positionScreen.x)<0)){d=o[h]=o[h]||new THREE.RenderableFace3;d.v1.positionWorld.copy(k.positionWorld);d.v2.positionWorld.copy(j.positionWorld);d.v3.positionWorld.copy(x.positionWorld);d.v1.positionScreen.copy(k.positionScreen);d.v2.positionScreen.copy(j.positionScreen);d.v3.positionScreen.copy(x.positionScreen);d.normalWorld.copy(q.normal);u.transformVector3(d.normalWorld);
-d.centroidWorld.copy(q.centroid);L.transformVector3(d.centroidWorld);d.centroidScreen.copy(d.centroidWorld);F.transformVector3(d.centroidScreen);d.z=d.centroidScreen.z;d.meshMaterial=T;d.faceMaterial=q.material;d.overdraw=Q;if(s.geometry.uvs[i]){d.uvs[0]=s.geometry.uvs[i][0];d.uvs[1]=s.geometry.uvs[i][1];d.uvs[2]=s.geometry.uvs[i][3]}b.push(d);h++;g=o[h]=o[h]||new THREE.RenderableFace3;g.v1.positionWorld.copy(j.positionWorld);g.v2.positionWorld.copy(z.positionWorld);g.v3.positionWorld.copy(x.positionWorld);
+0||(j.positionScreen.x-z.positionScreen.x)*(x.positionScreen.y-z.positionScreen.y)-(j.positionScreen.y-z.positionScreen.y)*(x.positionScreen.x-z.positionScreen.x)<0)){d=o[h]=o[h]||new THREE.RenderableFace3;d.v1.positionWorld.copy(k.positionWorld);d.v2.positionWorld.copy(j.positionWorld);d.v3.positionWorld.copy(x.positionWorld);d.v1.positionScreen.copy(k.positionScreen);d.v2.positionScreen.copy(j.positionScreen);d.v3.positionScreen.copy(x.positionScreen);d.normalWorld.copy(q.normal);u.multiplyVector3(d.normalWorld);
+d.centroidWorld.copy(q.centroid);L.multiplyVector3(d.centroidWorld);d.centroidScreen.copy(d.centroidWorld);F.multiplyVector3(d.centroidScreen);d.z=d.centroidScreen.z;d.meshMaterial=T;d.faceMaterial=q.material;d.overdraw=Q;if(s.geometry.uvs[i]){d.uvs[0]=s.geometry.uvs[i][0];d.uvs[1]=s.geometry.uvs[i][1];d.uvs[2]=s.geometry.uvs[i][3]}b.push(d);h++;g=o[h]=o[h]||new THREE.RenderableFace3;g.v1.positionWorld.copy(j.positionWorld);g.v2.positionWorld.copy(z.positionWorld);g.v3.positionWorld.copy(x.positionWorld);
 g.v1.positionScreen.copy(j.positionScreen);g.v2.positionScreen.copy(z.positionScreen);g.v3.positionScreen.copy(x.positionScreen);g.normalWorld.copy(d.normalWorld);g.centroidWorld.copy(d.centroidWorld);g.centroidScreen.copy(d.centroidScreen);g.z=g.centroidScreen.z;g.meshMaterial=T;g.faceMaterial=q.material;g.overdraw=Q;if(s.geometry.uvs[i]){g.uvs[0]=s.geometry.uvs[i][1];g.uvs[1]=s.geometry.uvs[i][2];g.uvs[2]=s.geometry.uvs[i][3]}b.push(g);h++}}}}else if(s instanceof THREE.Line){O.multiply(F,L);t=s.geometry.vertices;
-H=t[0];H.positionScreen.copy(H.position);O.transformVector4(H.positionScreen);i=1;for(p=t.length;i<p;i++){k=t[i];k.positionScreen.copy(k.position);O.transformVector4(k.positionScreen);j=t[i-1];J.copy(k.positionScreen);M.copy(j.positionScreen);if(a(J,M)){J.multiplyScalar(1/J.w);M.multiplyScalar(1/M.w);m=l[r]=l[r]||new THREE.RenderableLine;m.v1.positionScreen.copy(J);m.v2.positionScreen.copy(M);m.z=Math.max(J.z,M.z);m.material=s.material;b.push(m);r++}}}else if(s instanceof THREE.Particle){w.set(s.position.x,
-s.position.y,s.position.z,1);F.transformVector4(w);w.z/=w.w;if(w.z>0&&w.z<1){c=G[y]=G[y]||new THREE.RenderableParticle;c.x=w.x/w.w;c.y=w.y/w.w;c.z=w.z;c.rotation=s.rotation.z;c.scale.x=s.scale.x*Math.abs(c.x-(w.x+B.projectionMatrix.n11)/(w.w+B.projectionMatrix.n14));c.scale.y=s.scale.y*Math.abs(c.y-(w.y+B.projectionMatrix.n22)/(w.w+B.projectionMatrix.n24));c.material=s.material;b.push(c);y++}}}b.sort(function(P,D){return D.z-P.z});return b};this.unprojectVector=function(S,B){var e=new THREE.Matrix4;
-e.multiply(THREE.Matrix4.makeInvert(B.matrix),THREE.Matrix4.makeInvert(B.projectionMatrix));e.transformVector3(S);return S}};
+H=t[0];H.positionScreen.copy(H.position);O.multiplyVector4(H.positionScreen);i=1;for(p=t.length;i<p;i++){k=t[i];k.positionScreen.copy(k.position);O.multiplyVector4(k.positionScreen);j=t[i-1];J.copy(k.positionScreen);M.copy(j.positionScreen);if(a(J,M)){J.multiplyScalar(1/J.w);M.multiplyScalar(1/M.w);m=l[r]=l[r]||new THREE.RenderableLine;m.v1.positionScreen.copy(J);m.v2.positionScreen.copy(M);m.z=Math.max(J.z,M.z);m.material=s.material;b.push(m);r++}}}else if(s instanceof THREE.Particle){w.set(s.position.x,
+s.position.y,s.position.z,1);F.multiplyVector4(w);w.z/=w.w;if(w.z>0&&w.z<1){c=G[y]=G[y]||new THREE.RenderableParticle;c.x=w.x/w.w;c.y=w.y/w.w;c.z=w.z;c.rotation=s.rotation.z;c.scale.x=s.scale.x*Math.abs(c.x-(w.x+B.projectionMatrix.n11)/(w.w+B.projectionMatrix.n14));c.scale.y=s.scale.y*Math.abs(c.y-(w.y+B.projectionMatrix.n22)/(w.w+B.projectionMatrix.n24));c.material=s.material;b.push(c);y++}}}b.sort(function(P,D){return D.z-P.z});return b};this.unprojectVector=function(S,B){var e=new THREE.Matrix4;
+e.multiply(THREE.Matrix4.makeInvert(B.matrix),THREE.Matrix4.makeInvert(B.projectionMatrix));e.multiplyVector3(S);return S}};
 THREE.DOMRenderer=function(){THREE.Renderer.call(this);var a=null,b=new THREE.Projector,d,g,h,o;this.domElement=document.createElement("div");this.setSize=function(m,r){d=m;g=r;h=d/2;o=g/2};this.render=function(m,r){var l,c,y,G,w,F,O,J;a=b.projectScene(m,r);l=0;for(c=a.length;l<c;l++){w=a[l];if(w instanceof THREE.RenderableParticle){O=w.x*h+h;J=w.y*o+o;y=0;for(G=w.material.length;y<G;y++){F=w.material[y];if(F instanceof THREE.ParticleDOMMaterial){F=F.domElement;F.style.left=O+"px";F.style.top=J+"px"}}}}}};
 THREE.CanvasRenderer=function(){function a(I,Y,U,E){var v,K,$,N,X=I.lights;I=0;for(v=X.length;I<v;I++){K=X[I];$=K.color;N=K.intensity;if(K instanceof THREE.DirectionalLight){K=U.dot(K.position)*N;if(K>0){E.r+=$.r*K;E.g+=$.g*K;E.b+=$.b*K}}else if(K instanceof THREE.PointLight){aa.sub(K.position,Y);aa.normalize();K=U.dot(aa)*N;if(K>0){E.r+=$.r*K;E.g+=$.g*K;E.b+=$.b*K}}}}function b(I,Y,U,E,v,K){if(v.opacity!=0){o(v.opacity);m(v.blending);L=I.positionScreen.x;u=I.positionScreen.y;T=Y.positionScreen.x;
 Q=Y.positionScreen.y;t=U.positionScreen.x;H=U.positionScreen.y;var $=L,N=u,X=T,ba=Q,Z=t,ca=H;n.beginPath();n.moveTo($,N);n.lineTo(X,ba);n.lineTo(Z,ca);n.lineTo($,N);n.closePath();if(v instanceof THREE.MeshBasicMaterial)if(v.map&&v.map.loaded)h(L,u,T,Q,t,H,v.map.image,E.uvs[0].u,E.uvs[0].v,E.uvs[1].u,E.uvs[1].v,E.uvs[2].u,E.uvs[2].v);else if(v.env_map&&v.env_map.loaded){if(v.env_map.mapping==THREE.ReflectionMapping){aa.copy(E.vertexNormalsWorld[0]);V=(aa.x*camera.matrix.n11+aa.y*camera.matrix.n12+

+ 15 - 15
build/ThreeExtras.js

@@ -13,15 +13,15 @@ THREE.Vector4.prototype={set:function(a,b,d,e){this.x=a;this.y=b;this.z=d;this.w
 return this},multiplyScalar:function(a){this.x*=a;this.y*=a;this.z*=a;this.w*=a;return this},divideScalar:function(a){this.x/=a;this.y/=a;this.z/=a;this.w/=a;return this},lerpSelf:function(a,b){this.x+=(a.x-this.x)*b;this.y+=(a.y-this.y)*b;this.z+=(a.z-this.z)*b;this.w+=(a.w-this.w)*b},clone:function(){return new THREE.Vector4(this.x,this.y,this.z,this.w)},toString:function(){return"THREE.Vector4 ("+this.x+", "+this.y+", "+this.z+", "+this.w+")"}};
 THREE.Ray=function(a,b){this.origin=a||new THREE.Vector3;this.direction=b||new THREE.Vector3};
 THREE.Ray.prototype={intersectScene:function(a){var b,d,e=a.objects,f=[];a=0;for(b=e.length;a<b;a++){d=e[a];if(d instanceof THREE.Mesh)f=f.concat(this.intersectObject(d))}f.sort(function(j,k){return j.distance-k.distance});return f},intersectObject:function(a){function b(L,u,A,l){l=l.clone().subSelf(u);A=A.clone().subSelf(u);var h=L.clone().subSelf(u);L=l.dot(l);u=l.dot(A);l=l.dot(h);var i=A.dot(A);A=A.dot(h);h=1/(L*i-u*u);i=(i*l-u*A)*h;L=(L*A-u*l)*h;return i>0&&L>0&&i+L<1}var d,e,f,j,k,g,m,c,s,E,
-r,w=a.geometry,v=w.vertices,x=[];d=0;for(e=w.faces.length;d<e;d++){f=w.faces[d];E=this.origin.clone();r=this.direction.clone();j=a.matrix.transformVector3(v[f.a].position.clone());k=a.matrix.transformVector3(v[f.b].position.clone());g=a.matrix.transformVector3(v[f.c].position.clone());m=f instanceof THREE.Face4?a.matrix.transformVector3(v[f.d].position.clone()):null;c=a.rotationMatrix.transformVector3(f.normal.clone());s=r.dot(c);if(s<0){c=c.dot((new THREE.Vector3).sub(j,E))/s;E=E.addSelf(r.multiplyScalar(c));
+r,w=a.geometry,v=w.vertices,x=[];d=0;for(e=w.faces.length;d<e;d++){f=w.faces[d];E=this.origin.clone();r=this.direction.clone();j=a.matrix.multiplyVector3(v[f.a].position.clone());k=a.matrix.multiplyVector3(v[f.b].position.clone());g=a.matrix.multiplyVector3(v[f.c].position.clone());m=f instanceof THREE.Face4?a.matrix.multiplyVector3(v[f.d].position.clone()):null;c=a.rotationMatrix.multiplyVector3(f.normal.clone());s=r.dot(c);if(s<0){c=c.dot((new THREE.Vector3).sub(j,E))/s;E=E.addSelf(r.multiplyScalar(c));
 if(f instanceof THREE.Face3){if(b(E,j,k,g)){f={distance:this.origin.distanceTo(E),point:E,face:f,object:a};x.push(f)}}else if(f instanceof THREE.Face4)if(b(E,j,k,m)||b(E,k,g,m)){f={distance:this.origin.distanceTo(E),point:E,face:f,object:a};x.push(f)}}}return x}};
 THREE.Rectangle=function(){function a(){j=e-b;k=f-d}var b,d,e,f,j,k,g=true;this.getX=function(){return b};this.getY=function(){return d};this.getWidth=function(){return j};this.getHeight=function(){return k};this.getLeft=function(){return b};this.getTop=function(){return d};this.getRight=function(){return e};this.getBottom=function(){return f};this.set=function(m,c,s,E){g=false;b=m;d=c;e=s;f=E;a()};this.addPoint=function(m,c){if(g){g=false;b=m;d=c;e=m;f=c}else{b=Math.min(b,m);d=Math.min(d,c);e=Math.max(e,
 m);f=Math.max(f,c)}a()};this.addRectangle=function(m){if(g){g=false;b=m.getLeft();d=m.getTop();e=m.getRight();f=m.getBottom()}else{b=Math.min(b,m.getLeft());d=Math.min(d,m.getTop());e=Math.max(e,m.getRight());f=Math.max(f,m.getBottom())}a()};this.inflate=function(m){b-=m;d-=m;e+=m;f+=m;a()};this.minSelf=function(m){b=Math.max(b,m.getLeft());d=Math.max(d,m.getTop());e=Math.min(e,m.getRight());f=Math.min(f,m.getBottom());a()};this.instersects=function(m){return Math.min(e,m.getRight())-Math.max(b,m.getLeft())>=
 0&&Math.min(f,m.getBottom())-Math.max(d,m.getTop())>=0};this.empty=function(){g=true;f=e=d=b=0;a()};this.isEmpty=function(){return g};this.toString=function(){return"THREE.Rectangle ( left: "+b+", right: "+e+", top: "+d+", bottom: "+f+", width: "+j+", height: "+k+" )"}};THREE.Matrix3=function(){this.m=[]};THREE.Matrix3.prototype={transpose:function(){var a;a=this.m[1];this.m[1]=this.m[3];this.m[3]=a;a=this.m[2];this.m[2]=this.m[6];this.m[6]=a;a=this.m[5];this.m[5]=this.m[7];this.m[7]=a;return this}};
 THREE.Matrix4=function(){};
 THREE.Matrix4.prototype={n11:1,n12:0,n13:0,n14:0,n21:0,n22:1,n23:0,n24:0,n31:0,n32:0,n33:1,n34:0,n41:0,n42:0,n43:0,n44:1,identity:function(){this.n11=1;this.n21=this.n14=this.n13=this.n12=0;this.n22=1;this.n32=this.n31=this.n24=this.n23=0;this.n33=1;this.n43=this.n42=this.n41=this.n34=0;this.n44=1},copy:function(a){this.n11=a.n11;this.n12=a.n12;this.n13=a.n13;this.n14=a.n14;this.n21=a.n21;this.n22=a.n22;this.n23=a.n23;this.n24=a.n24;this.n31=a.n31;this.n32=a.n32;this.n33=a.n33;this.n34=a.n34;this.n41=
-a.n41;this.n42=a.n42;this.n43=a.n43;this.n44=a.n44},lookAt:function(a,b,d){var e=new THREE.Vector3,f=new THREE.Vector3,j=new THREE.Vector3;j.sub(a,b).normalize();e.cross(d,j).normalize();f.cross(j,e).normalize();this.n11=e.x;this.n12=e.y;this.n13=e.z;this.n14=-e.dot(a);this.n21=f.x;this.n22=f.y;this.n23=f.z;this.n24=-f.dot(a);this.n31=j.x;this.n32=j.y;this.n33=j.z;this.n34=-j.dot(a);this.n43=this.n42=this.n41=0;this.n44=1},transformVector3:function(a){var b=a.x,d=a.y,e=a.z,f=1/(this.n41*b+this.n42*
-d+this.n43*e+this.n44);a.x=(this.n11*b+this.n12*d+this.n13*e+this.n14)*f;a.y=(this.n21*b+this.n22*d+this.n23*e+this.n24)*f;a.z=(this.n31*b+this.n32*d+this.n33*e+this.n34)*f;return a},transformVector4:function(a){var b=a.x,d=a.y,e=a.z,f=a.w;a.x=this.n11*b+this.n12*d+this.n13*e+this.n14*f;a.y=this.n21*b+this.n22*d+this.n23*e+this.n24*f;a.z=this.n31*b+this.n32*d+this.n33*e+this.n34*f;a.w=this.n41*b+this.n42*d+this.n43*e+this.n44*f;return a},crossVector:function(a){var b=new THREE.Vector4;b.x=this.n11*
+a.n41;this.n42=a.n42;this.n43=a.n43;this.n44=a.n44},lookAt:function(a,b,d){var e=new THREE.Vector3,f=new THREE.Vector3,j=new THREE.Vector3;j.sub(a,b).normalize();e.cross(d,j).normalize();f.cross(j,e).normalize();this.n11=e.x;this.n12=e.y;this.n13=e.z;this.n14=-e.dot(a);this.n21=f.x;this.n22=f.y;this.n23=f.z;this.n24=-f.dot(a);this.n31=j.x;this.n32=j.y;this.n33=j.z;this.n34=-j.dot(a);this.n43=this.n42=this.n41=0;this.n44=1},multiplyVector3:function(a){var b=a.x,d=a.y,e=a.z,f=1/(this.n41*b+this.n42*
+d+this.n43*e+this.n44);a.x=(this.n11*b+this.n12*d+this.n13*e+this.n14)*f;a.y=(this.n21*b+this.n22*d+this.n23*e+this.n24)*f;a.z=(this.n31*b+this.n32*d+this.n33*e+this.n34)*f;return a},multiplyVector4:function(a){var b=a.x,d=a.y,e=a.z,f=a.w;a.x=this.n11*b+this.n12*d+this.n13*e+this.n14*f;a.y=this.n21*b+this.n22*d+this.n23*e+this.n24*f;a.z=this.n31*b+this.n32*d+this.n33*e+this.n34*f;a.w=this.n41*b+this.n42*d+this.n43*e+this.n44*f;return a},crossVector:function(a){var b=new THREE.Vector4;b.x=this.n11*
 a.x+this.n12*a.y+this.n13*a.z+this.n14*a.w;b.y=this.n21*a.x+this.n22*a.y+this.n23*a.z+this.n24*a.w;b.z=this.n31*a.x+this.n32*a.y+this.n33*a.z+this.n34*a.w;b.w=a.w?this.n41*a.x+this.n42*a.y+this.n43*a.z+this.n44*a.w:1;return b},multiply:function(a,b){var d=a.n11,e=a.n12,f=a.n13,j=a.n14,k=a.n21,g=a.n22,m=a.n23,c=a.n24,s=a.n31,E=a.n32,r=a.n33,w=a.n34,v=a.n41,x=a.n42,L=a.n43,u=a.n44,A=b.n11,l=b.n12,h=b.n13,i=b.n14,n=b.n21,y=b.n22,p=b.n23,o=b.n24,G=b.n31,B=b.n32,Q=b.n33,F=b.n34,V=b.n41,U=b.n42,D=b.n43,
 P=b.n44;this.n11=d*A+e*n+f*G+j*V;this.n12=d*l+e*y+f*B+j*U;this.n13=d*h+e*p+f*Q+j*D;this.n14=d*i+e*o+f*F+j*P;this.n21=k*A+g*n+m*G+c*V;this.n22=k*l+g*y+m*B+c*U;this.n23=k*h+g*p+m*Q+c*D;this.n24=k*i+g*o+m*F+c*P;this.n31=s*A+E*n+r*G+w*V;this.n32=s*l+E*y+r*B+w*U;this.n33=s*h+E*p+r*Q+w*D;this.n34=s*i+E*o+r*F+w*P;this.n41=v*A+x*n+L*G+u*V;this.n42=v*l+x*y+L*B+u*U;this.n43=v*h+x*p+L*Q+u*D;this.n44=v*i+x*o+L*F+u*P},multiplySelf:function(a){var b=this.n11,d=this.n12,e=this.n13,f=this.n14,j=this.n21,k=this.n22,
 g=this.n23,m=this.n24,c=this.n31,s=this.n32,E=this.n33,r=this.n34,w=this.n41,v=this.n42,x=this.n43,L=this.n44;this.n11=b*a.n11+d*a.n21+e*a.n31+f*a.n41;this.n12=b*a.n12+d*a.n22+e*a.n32+f*a.n42;this.n13=b*a.n13+d*a.n23+e*a.n33+f*a.n43;this.n14=b*a.n14+d*a.n24+e*a.n34+f*a.n44;this.n21=j*a.n11+k*a.n21+g*a.n31+m*a.n41;this.n22=j*a.n12+k*a.n22+g*a.n32+m*a.n42;this.n23=j*a.n13+k*a.n23+g*a.n33+m*a.n43;this.n24=j*a.n14+k*a.n24+g*a.n34+m*a.n44;this.n31=c*a.n11+s*a.n21+E*a.n31+r*a.n41;this.n32=c*a.n12+s*a.n22+
@@ -44,9 +44,9 @@ THREE.Face3=function(a,b,d,e,f){this.a=a;this.b=b;this.c=d;this.centroid=new THR
 THREE.Face4=function(a,b,d,e,f,j){this.a=a;this.b=b;this.c=d;this.d=e;this.centroid=new THREE.Vector3;this.normal=f instanceof THREE.Vector3?f:new THREE.Vector3;this.vertexNormals=f instanceof Array?f:[];this.material=j instanceof Array?j:[j]};THREE.Face4.prototype={toString:function(){return"THREE.Face4 ( "+this.a+", "+this.b+", "+this.c+" "+this.d+" )"}};THREE.UV=function(a,b){this.u=a||0;this.v=b||0};
 THREE.UV.prototype={copy:function(a){this.u=a.u;this.v=a.v},toString:function(){return"THREE.UV ("+this.u+", "+this.v+")"}};THREE.Geometry=function(){this.vertices=[];this.faces=[];this.uvs=[]};
 THREE.Geometry.prototype={computeCentroids:function(){var a,b,d;a=0;for(b=this.faces.length;a<b;a++){d=this.faces[a];d.centroid.set(0,0,0);d.centroid.addSelf(this.vertices[d.a].position);d.centroid.addSelf(this.vertices[d.b].position);d.centroid.addSelf(this.vertices[d.c].position);if(d instanceof THREE.Face3)d.centroid.divideScalar(3);else if(d instanceof THREE.Face4){d.centroid.addSelf(this.vertices[d.d].position);d.centroid.divideScalar(4)}}},computeNormals:function(a){var b,d,e,f,j,k,g=new THREE.Vector3,
-m=new THREE.Vector3;e=0;for(f=this.vertices.length;e<f;e++){j=this.vertices[e];j.normal.set(0,0,0)}e=0;for(f=this.faces.length;e<f;e++){j=this.faces[e];if(a&&j.vertexNormals.length){g.set(0,0,0);b=0;for(d=j.normal.length;b<d;b++)g.addSelf(j.vertexNormals[b]);g.divideScalar(3)}else{b=this.vertices[j.a];d=this.vertices[j.b];k=this.vertices[j.c];g.sub(k.position,d.position);m.sub(b.position,d.position);g.crossSelf(m)}g.isZero()||g.normalize();j.normal.copy(g)}},computeBoundingBox:function(){if(this.vertices.length>
-0){this.bbox={x:[this.vertices[0].position.x,this.vertices[0].position.x],y:[this.vertices[0].position.y,this.vertices[0].position.y],z:[this.vertices[0].position.z,this.vertices[0].position.z]};for(var a=1,b=this.vertices.length;a<b;a++){vertex=this.vertices[a];if(vertex.position.x<this.bbox.x[0])this.bbox.x[0]=vertex.position.x;else if(vertex.position.x>this.bbox.x[1])this.bbox.x[1]=vertex.position.x;if(vertex.position.y<this.bbox.y[0])this.bbox.y[0]=vertex.position.y;else if(vertex.position.y>
-this.bbox.y[1])this.bbox.y[1]=vertex.position.y;if(vertex.position.z<this.bbox.z[0])this.bbox.z[0]=vertex.position.z;else if(vertex.position.z>this.bbox.z[1])this.bbox.z[1]=vertex.position.z}}},toString:function(){return"THREE.Geometry ( vertices: "+this.vertices+", faces: "+this.faces+" )"}};
+m=new THREE.Vector3;e=0;for(f=this.vertices.length;e<f;e++){j=this.vertices[e];j.normal.set(0,0,0)}e=0;for(f=this.faces.length;e<f;e++){j=this.faces[e];if(a&&j.vertexNormals.length){g.set(0,0,0);b=0;for(d=j.normal.length;b<d;b++)g.addSelf(j.vertexNormals[b]);g.divideScalar(3)}else{b=this.vertices[j.a];d=this.vertices[j.b];k=this.vertices[j.c];g.sub(k.position,d.position);m.sub(b.position,d.position);g.crossSelf(m)}g.isZero()||g.normalize();j.normal.copy(g)}},computeVertexNormals:function(){var a,
+b;a=0;for(b=this.faces.length;a<b;a++);},computeBoundingBox:function(){if(this.vertices.length>0){this.bbox={x:[this.vertices[0].position.x,this.vertices[0].position.x],y:[this.vertices[0].position.y,this.vertices[0].position.y],z:[this.vertices[0].position.z,this.vertices[0].position.z]};for(var a=1,b=this.vertices.length;a<b;a++){vertex=this.vertices[a];if(vertex.position.x<this.bbox.x[0])this.bbox.x[0]=vertex.position.x;else if(vertex.position.x>this.bbox.x[1])this.bbox.x[1]=vertex.position.x;
+if(vertex.position.y<this.bbox.y[0])this.bbox.y[0]=vertex.position.y;else if(vertex.position.y>this.bbox.y[1])this.bbox.y[1]=vertex.position.y;if(vertex.position.z<this.bbox.z[0])this.bbox.z[0]=vertex.position.z;else if(vertex.position.z>this.bbox.z[1])this.bbox.z[1]=vertex.position.z}}},toString:function(){return"THREE.Geometry ( vertices: "+this.vertices+", faces: "+this.faces+", uvs: "+this.uvs+" )"}};
 THREE.Camera=function(a,b,d,e){this.position=new THREE.Vector3(0,0,0);this.target={position:new THREE.Vector3(0,0,0)};this.up=new THREE.Vector3(0,1,0);this.matrix=new THREE.Matrix4;this.projectionMatrix=THREE.Matrix4.makePerspective(a,b,d,e);this.autoUpdateMatrix=true;this.updateMatrix=function(){this.matrix.lookAt(this.position,this.target.position,this.up)};this.toString=function(){return"THREE.Camera ( "+this.position+", "+this.target.position+" )"}};THREE.Light=function(a){this.color=new THREE.Color(a)};
 THREE.AmbientLight=function(a){THREE.Light.call(this,a)};THREE.AmbientLight.prototype=new THREE.Light;THREE.AmbientLight.prototype.constructor=THREE.AmbientLight;THREE.DirectionalLight=function(a,b){THREE.Light.call(this,a);this.position=new THREE.Vector3(0,1,0);this.intensity=b||1};THREE.DirectionalLight.prototype=new THREE.Light;THREE.DirectionalLight.prototype.constructor=THREE.DirectionalLight;
 THREE.PointLight=function(a,b){THREE.Light.call(this,a);this.position=new THREE.Vector3;this.intensity=b||1};THREE.DirectionalLight.prototype=new THREE.Light;THREE.DirectionalLight.prototype.constructor=THREE.PointLight;
@@ -84,16 +84,16 @@ THREE.ParticleDOMMaterial=function(a){this.domElement=a;this.toString=function()
 THREE.UVMapping=0;THREE.ReflectionMapping=1;THREE.RefractionMapping=2;THREE.Multiply=0;THREE.Mix=1;THREE.Repeat=0;THREE.ClampToEdge=1;THREE.MirroredRepeat=2;THREE.TextureCube=function(a,b){this.image=a;this.mapping=b?b: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(A,l){var h=0,i=1,n=A.z+A.w,y=l.z+l.w,p=-A.z+A.w,o=-l.z+l.w;if(n>=0&&y>=0&&p>=0&&o>=0)return true;else if(n<0&&y<0||p<0&&o<0)return false;else{if(n<0)h=Math.max(h,n/(n-y));else if(y<0)i=Math.min(i,n/(n-y));if(p<0)h=Math.max(h,p/(p-o));else if(o<0)i=Math.min(i,p/(p-o));if(i<h)return false;else{A.lerpSelf(l,h);l.lerpSelf(A,1-i);return true}}}var b=null,d,e,f,j=[],k,g,m=[],c,s,E=[],r=new THREE.Vector4,w=new THREE.Matrix4,v=new THREE.Matrix4,x=new THREE.Vector4,L=
-new THREE.Vector4,u;this.projectScene=function(A,l){var h,i,n,y,p,o,G,B,Q,F,V,U,D,P,C,J,I;b=[];f=g=s=0;l.autoUpdateMatrix&&l.updateMatrix();w.multiply(l.projectionMatrix,l.matrix);G=A.objects;h=0;for(i=G.length;h<i;h++){B=G[h];B.autoUpdateMatrix&&B.updateMatrix();Q=B.matrix;F=B.rotationMatrix;V=B.material;U=B.overdraw;if(B instanceof THREE.Mesh){D=B.geometry.vertices;n=0;for(y=D.length;n<y;n++){P=D[n];P.positionWorld.copy(P.position);Q.transformVector3(P.positionWorld);C=P.positionScreen;C.copy(P.positionWorld);
-w.transformVector4(C);C.multiplyScalar(1/C.w);P.__visible=C.z>0&&C.z<1}P=B.geometry.faces;n=0;for(y=P.length;n<y;n++){C=P[n];if(C instanceof THREE.Face3){p=D[C.a];o=D[C.b];J=D[C.c];if(p.__visible&&o.__visible&&J.__visible)if(B.doubleSided||B.flipSided!=(J.positionScreen.x-p.positionScreen.x)*(o.positionScreen.y-p.positionScreen.y)-(J.positionScreen.y-p.positionScreen.y)*(o.positionScreen.x-p.positionScreen.x)<0){d=j[f]=j[f]||new THREE.RenderableFace3;d.v1.positionWorld.copy(p.positionWorld);d.v2.positionWorld.copy(o.positionWorld);
-d.v3.positionWorld.copy(J.positionWorld);d.v1.positionScreen.copy(p.positionScreen);d.v2.positionScreen.copy(o.positionScreen);d.v3.positionScreen.copy(J.positionScreen);d.normalWorld.copy(C.normal);F.transformVector3(d.normalWorld);d.centroidWorld.copy(C.centroid);Q.transformVector3(d.centroidWorld);d.centroidScreen.copy(d.centroidWorld);w.transformVector3(d.centroidScreen);J=C.vertexNormals;u=d.vertexNormalsWorld;p=0;for(o=J.length;p<o;p++){I=u[p]=u[p]||new THREE.Vector3;I.copy(J[p]);F.transformVector3(I)}d.z=
+new THREE.Vector4,u;this.projectScene=function(A,l){var h,i,n,y,p,o,G,B,Q,F,V,U,D,P,C,J,I;b=[];f=g=s=0;l.autoUpdateMatrix&&l.updateMatrix();w.multiply(l.projectionMatrix,l.matrix);G=A.objects;h=0;for(i=G.length;h<i;h++){B=G[h];B.autoUpdateMatrix&&B.updateMatrix();Q=B.matrix;F=B.rotationMatrix;V=B.material;U=B.overdraw;if(B instanceof THREE.Mesh){D=B.geometry.vertices;n=0;for(y=D.length;n<y;n++){P=D[n];P.positionWorld.copy(P.position);Q.multiplyVector3(P.positionWorld);C=P.positionScreen;C.copy(P.positionWorld);
+w.multiplyVector4(C);C.multiplyScalar(1/C.w);P.__visible=C.z>0&&C.z<1}P=B.geometry.faces;n=0;for(y=P.length;n<y;n++){C=P[n];if(C instanceof THREE.Face3){p=D[C.a];o=D[C.b];J=D[C.c];if(p.__visible&&o.__visible&&J.__visible)if(B.doubleSided||B.flipSided!=(J.positionScreen.x-p.positionScreen.x)*(o.positionScreen.y-p.positionScreen.y)-(J.positionScreen.y-p.positionScreen.y)*(o.positionScreen.x-p.positionScreen.x)<0){d=j[f]=j[f]||new THREE.RenderableFace3;d.v1.positionWorld.copy(p.positionWorld);d.v2.positionWorld.copy(o.positionWorld);
+d.v3.positionWorld.copy(J.positionWorld);d.v1.positionScreen.copy(p.positionScreen);d.v2.positionScreen.copy(o.positionScreen);d.v3.positionScreen.copy(J.positionScreen);d.normalWorld.copy(C.normal);F.multiplyVector3(d.normalWorld);d.centroidWorld.copy(C.centroid);Q.multiplyVector3(d.centroidWorld);d.centroidScreen.copy(d.centroidWorld);w.multiplyVector3(d.centroidScreen);J=C.vertexNormals;u=d.vertexNormalsWorld;p=0;for(o=J.length;p<o;p++){I=u[p]=u[p]||new THREE.Vector3;I.copy(J[p]);F.multiplyVector3(I)}d.z=
 d.centroidScreen.z;d.meshMaterial=V;d.faceMaterial=C.material;d.overdraw=U;if(B.geometry.uvs[n]){d.uvs[0]=B.geometry.uvs[n][0];d.uvs[1]=B.geometry.uvs[n][1];d.uvs[2]=B.geometry.uvs[n][2]}b.push(d);f++}}else if(C instanceof THREE.Face4){p=D[C.a];o=D[C.b];J=D[C.c];I=D[C.d];if(p.__visible&&o.__visible&&J.__visible&&I.__visible)if(B.doubleSided||B.flipSided!=((I.positionScreen.x-p.positionScreen.x)*(o.positionScreen.y-p.positionScreen.y)-(I.positionScreen.y-p.positionScreen.y)*(o.positionScreen.x-p.positionScreen.x)<
-0||(o.positionScreen.x-J.positionScreen.x)*(I.positionScreen.y-J.positionScreen.y)-(o.positionScreen.y-J.positionScreen.y)*(I.positionScreen.x-J.positionScreen.x)<0)){d=j[f]=j[f]||new THREE.RenderableFace3;d.v1.positionWorld.copy(p.positionWorld);d.v2.positionWorld.copy(o.positionWorld);d.v3.positionWorld.copy(I.positionWorld);d.v1.positionScreen.copy(p.positionScreen);d.v2.positionScreen.copy(o.positionScreen);d.v3.positionScreen.copy(I.positionScreen);d.normalWorld.copy(C.normal);F.transformVector3(d.normalWorld);
-d.centroidWorld.copy(C.centroid);Q.transformVector3(d.centroidWorld);d.centroidScreen.copy(d.centroidWorld);w.transformVector3(d.centroidScreen);d.z=d.centroidScreen.z;d.meshMaterial=V;d.faceMaterial=C.material;d.overdraw=U;if(B.geometry.uvs[n]){d.uvs[0]=B.geometry.uvs[n][0];d.uvs[1]=B.geometry.uvs[n][1];d.uvs[2]=B.geometry.uvs[n][3]}b.push(d);f++;e=j[f]=j[f]||new THREE.RenderableFace3;e.v1.positionWorld.copy(o.positionWorld);e.v2.positionWorld.copy(J.positionWorld);e.v3.positionWorld.copy(I.positionWorld);
+0||(o.positionScreen.x-J.positionScreen.x)*(I.positionScreen.y-J.positionScreen.y)-(o.positionScreen.y-J.positionScreen.y)*(I.positionScreen.x-J.positionScreen.x)<0)){d=j[f]=j[f]||new THREE.RenderableFace3;d.v1.positionWorld.copy(p.positionWorld);d.v2.positionWorld.copy(o.positionWorld);d.v3.positionWorld.copy(I.positionWorld);d.v1.positionScreen.copy(p.positionScreen);d.v2.positionScreen.copy(o.positionScreen);d.v3.positionScreen.copy(I.positionScreen);d.normalWorld.copy(C.normal);F.multiplyVector3(d.normalWorld);
+d.centroidWorld.copy(C.centroid);Q.multiplyVector3(d.centroidWorld);d.centroidScreen.copy(d.centroidWorld);w.multiplyVector3(d.centroidScreen);d.z=d.centroidScreen.z;d.meshMaterial=V;d.faceMaterial=C.material;d.overdraw=U;if(B.geometry.uvs[n]){d.uvs[0]=B.geometry.uvs[n][0];d.uvs[1]=B.geometry.uvs[n][1];d.uvs[2]=B.geometry.uvs[n][3]}b.push(d);f++;e=j[f]=j[f]||new THREE.RenderableFace3;e.v1.positionWorld.copy(o.positionWorld);e.v2.positionWorld.copy(J.positionWorld);e.v3.positionWorld.copy(I.positionWorld);
 e.v1.positionScreen.copy(o.positionScreen);e.v2.positionScreen.copy(J.positionScreen);e.v3.positionScreen.copy(I.positionScreen);e.normalWorld.copy(d.normalWorld);e.centroidWorld.copy(d.centroidWorld);e.centroidScreen.copy(d.centroidScreen);e.z=e.centroidScreen.z;e.meshMaterial=V;e.faceMaterial=C.material;e.overdraw=U;if(B.geometry.uvs[n]){e.uvs[0]=B.geometry.uvs[n][1];e.uvs[1]=B.geometry.uvs[n][2];e.uvs[2]=B.geometry.uvs[n][3]}b.push(e);f++}}}}else if(B instanceof THREE.Line){v.multiply(w,Q);D=B.geometry.vertices;
-P=D[0];P.positionScreen.copy(P.position);v.transformVector4(P.positionScreen);n=1;for(y=D.length;n<y;n++){p=D[n];p.positionScreen.copy(p.position);v.transformVector4(p.positionScreen);o=D[n-1];x.copy(p.positionScreen);L.copy(o.positionScreen);if(a(x,L)){x.multiplyScalar(1/x.w);L.multiplyScalar(1/L.w);k=m[g]=m[g]||new THREE.RenderableLine;k.v1.positionScreen.copy(x);k.v2.positionScreen.copy(L);k.z=Math.max(x.z,L.z);k.material=B.material;b.push(k);g++}}}else if(B instanceof THREE.Particle){r.set(B.position.x,
-B.position.y,B.position.z,1);w.transformVector4(r);r.z/=r.w;if(r.z>0&&r.z<1){c=E[s]=E[s]||new THREE.RenderableParticle;c.x=r.x/r.w;c.y=r.y/r.w;c.z=r.z;c.rotation=B.rotation.z;c.scale.x=B.scale.x*Math.abs(c.x-(r.x+l.projectionMatrix.n11)/(r.w+l.projectionMatrix.n14));c.scale.y=B.scale.y*Math.abs(c.y-(r.y+l.projectionMatrix.n22)/(r.w+l.projectionMatrix.n24));c.material=B.material;b.push(c);s++}}}b.sort(function(T,N){return N.z-T.z});return b};this.unprojectVector=function(A,l){var h=new THREE.Matrix4;
-h.multiply(THREE.Matrix4.makeInvert(l.matrix),THREE.Matrix4.makeInvert(l.projectionMatrix));h.transformVector3(A);return A}};
+P=D[0];P.positionScreen.copy(P.position);v.multiplyVector4(P.positionScreen);n=1;for(y=D.length;n<y;n++){p=D[n];p.positionScreen.copy(p.position);v.multiplyVector4(p.positionScreen);o=D[n-1];x.copy(p.positionScreen);L.copy(o.positionScreen);if(a(x,L)){x.multiplyScalar(1/x.w);L.multiplyScalar(1/L.w);k=m[g]=m[g]||new THREE.RenderableLine;k.v1.positionScreen.copy(x);k.v2.positionScreen.copy(L);k.z=Math.max(x.z,L.z);k.material=B.material;b.push(k);g++}}}else if(B instanceof THREE.Particle){r.set(B.position.x,
+B.position.y,B.position.z,1);w.multiplyVector4(r);r.z/=r.w;if(r.z>0&&r.z<1){c=E[s]=E[s]||new THREE.RenderableParticle;c.x=r.x/r.w;c.y=r.y/r.w;c.z=r.z;c.rotation=B.rotation.z;c.scale.x=B.scale.x*Math.abs(c.x-(r.x+l.projectionMatrix.n11)/(r.w+l.projectionMatrix.n14));c.scale.y=B.scale.y*Math.abs(c.y-(r.y+l.projectionMatrix.n22)/(r.w+l.projectionMatrix.n24));c.material=B.material;b.push(c);s++}}}b.sort(function(T,N){return N.z-T.z});return b};this.unprojectVector=function(A,l){var h=new THREE.Matrix4;
+h.multiply(THREE.Matrix4.makeInvert(l.matrix),THREE.Matrix4.makeInvert(l.projectionMatrix));h.multiplyVector3(A);return A}};
 THREE.DOMRenderer=function(){THREE.Renderer.call(this);var a=null,b=new THREE.Projector,d,e,f,j;this.domElement=document.createElement("div");this.setSize=function(k,g){d=k;e=g;f=d/2;j=e/2};this.render=function(k,g){var m,c,s,E,r,w,v,x;a=b.projectScene(k,g);m=0;for(c=a.length;m<c;m++){r=a[m];if(r instanceof THREE.RenderableParticle){v=r.x*f+f;x=r.y*j+j;s=0;for(E=r.material.length;s<E;s++){w=r.material[s];if(w instanceof THREE.ParticleDOMMaterial){w=w.domElement;w.style.left=v+"px";w.style.top=x+"px"}}}}}};
 THREE.CanvasRenderer=function(){function a(R,aa,Z,O){var H,S,ca,X,$=R.lights;R=0;for(H=$.length;R<H;R++){S=$[R];ca=S.color;X=S.intensity;if(S instanceof THREE.DirectionalLight){S=Z.dot(S.position)*X;if(S>0){O.r+=ca.r*S;O.g+=ca.g*S;O.b+=ca.b*S}}else if(S instanceof THREE.PointLight){da.sub(S.position,aa);da.normalize();S=Z.dot(da)*X;if(S>0){O.r+=ca.r*S;O.g+=ca.g*S;O.b+=ca.b*S}}}}function b(R,aa,Z,O,H,S){if(H.opacity!=0){j(H.opacity);k(H.blending);Q=R.positionScreen.x;F=R.positionScreen.y;V=aa.positionScreen.x;
 U=aa.positionScreen.y;D=Z.positionScreen.x;P=Z.positionScreen.y;var ca=Q,X=F,$=V,ea=U,ba=D,fa=P;u.beginPath();u.moveTo(ca,X);u.lineTo($,ea);u.lineTo(ba,fa);u.lineTo(ca,X);u.closePath();if(H instanceof THREE.MeshBasicMaterial)if(H.map&&H.map.loaded)f(Q,F,V,U,D,P,H.map.image,O.uvs[0].u,O.uvs[0].v,O.uvs[1].u,O.uvs[1].v,O.uvs[2].u,O.uvs[2].v);else if(H.env_map&&H.env_map.loaded){if(H.env_map.mapping==THREE.ReflectionMapping){da.copy(O.vertexNormalsWorld[0]);z=(da.x*camera.matrix.n11+da.y*camera.matrix.n12+
@@ -166,7 +166,7 @@ A.set(h.matrix.flatten())};this.loadMatrices=function(h){c.uniformMatrix4fv(h.un
 c.blendFunc(c.ONE,c.ONE);break;case THREE.SubtractiveBlending:c.blendFunc(c.DST_COLOR,c.ZERO);break;default:c.blendEquation(c.FUNC_ADD);c.blendFunc(c.ONE,c.ONE_MINUS_SRC_ALPHA)}};this.setFaceCulling=function(h,i){if(h){!i||i=="ccw"?c.frontFace(c.CCW):c.frontFace(c.CW);if(h=="back")c.cullFace(c.BACK);else h=="front"?c.cullFace(c.FRONT):c.cullFace(c.FRONT_AND_BACK);c.enable(c.CULL_FACE)}else c.disable(c.CULL_FACE)}};
 THREE.RenderableFace3=function(){this.z=null;this.v1=new THREE.Vertex;this.v2=new THREE.Vertex;this.v3=new THREE.Vertex;this.centroidWorld=new THREE.Vector3;this.centroidScreen=new THREE.Vector3;this.normalWorld=new THREE.Vector3;this.vertexNormalsWorld=[];this.faceMaterial=this.meshMaterial=null;this.overdraw=false;this.uvs=[null,null,null]};THREE.RenderableParticle=function(){this.rotation=this.z=this.y=this.x=null;this.scale=new THREE.Vector2;this.material=null};
 THREE.RenderableLine=function(){this.z=null;this.v1=new THREE.Vertex;this.v2=new THREE.Vertex;this.material=null};
-var GeometryUtils={merge:function(a,b){var d=b instanceof THREE.Mesh,e=a.vertices.length,f=d?b.geometry:b,j=a.vertices,k=f.vertices,g=a.faces,m=f.faces,c=a.uvs;f=f.uvs;d&&b.updateMatrix();for(var s=0,E=k.length;s<E;s++){var r=new THREE.Vertex(k[s].position.clone());d&&b.matrix.transformVector3(r.position);j.push(r)}s=0;for(E=m.length;s<E;s++){k=m[s];var w,v=k.vertexNormals;if(k instanceof THREE.Face3)w=new THREE.Face3(k.a+e,k.b+e,k.c+e);else if(k instanceof THREE.Face4)w=new THREE.Face4(k.a+e,k.b+
+var GeometryUtils={merge:function(a,b){var d=b instanceof THREE.Mesh,e=a.vertices.length,f=d?b.geometry:b,j=a.vertices,k=f.vertices,g=a.faces,m=f.faces,c=a.uvs;f=f.uvs;d&&b.updateMatrix();for(var s=0,E=k.length;s<E;s++){var r=new THREE.Vertex(k[s].position.clone());d&&b.matrix.multiplyVector3(r.position);j.push(r)}s=0;for(E=m.length;s<E;s++){k=m[s];var w,v=k.vertexNormals;if(k instanceof THREE.Face3)w=new THREE.Face3(k.a+e,k.b+e,k.c+e);else if(k instanceof THREE.Face4)w=new THREE.Face4(k.a+e,k.b+
 e,k.c+e,k.d+e);w.centroid.copy(k.centroid);w.normal.copy(k.normal);d=0;for(j=v.length;d<j;d++){r=v[d];w.vertexNormals.push(r.clone())}w.material=k.material.slice();g.push(w)}s=0;for(E=f.length;s<E;s++){e=f[s];g=[];d=0;for(j=e.length;d<j;d++)g.push(new THREE.UV(e[d].u,e[d].v));c.push(g)}}},ImageUtils={loadTexture:function(a,b){var d=new THREE.Texture(null,b),e=new Image;e.onload=function(){d.image=this;d.loaded=true};e.src=a;return d},loadArray:function(a){var b,d,e=[];b=e.loadCount=0;for(d=a.length;b<
 d;++b){e[b]=new Image;e[b].loaded=0;e[b].onload=function(){e.loadCount+=1;this.loaded=1};e[b].src=a[b]}return e}},SceneUtils={addMesh:function(a,b,d,e,f,j,k,g,m,c){b=new THREE.Mesh(b,c);b.scale.x=b.scale.y=b.scale.z=d;b.position.x=e;b.position.y=f;b.position.z=j;b.rotation.x=k;b.rotation.y=g;b.rotation.z=m;a.addObject(b);return b},addPanoramaCubeWebGL:function(a,b,d){d=new THREE.MeshCubeMaterial({env_map:d});b=new THREE.Mesh(new Cube(b,b,b,1,1,null,true),d);a.addObject(b);return b},addPanoramaCube:function(a,
 b,d){var e=[];e.push(new THREE.MeshBasicMaterial({map:new THREE.Texture(d[0])}));e.push(new THREE.MeshBasicMaterial({map:new THREE.Texture(d[1])}));e.push(new THREE.MeshBasicMaterial({map:new THREE.Texture(d[2])}));e.push(new THREE.MeshBasicMaterial({map:new THREE.Texture(d[3])}));e.push(new THREE.MeshBasicMaterial({map:new THREE.Texture(d[4])}));e.push(new THREE.MeshBasicMaterial({map:new THREE.Texture(d[5])}));mesh=new THREE.Mesh(new Cube(b,b,b,1,1,e,true),new THREE.MeshFaceMaterial);a.addObject(mesh);

+ 1 - 1
examples/interactive_voxelpainter.html

@@ -145,7 +145,7 @@
 
 					} else {
 
-						var position = new THREE.Vector3().add( intersects[ 0 ].point, intersects[ 0 ].object.rotationMatrix.transformVector3( intersects[ 0 ].face.normal.clone() ) );
+						var position = new THREE.Vector3().add( intersects[ 0 ].point, intersects[ 0 ].object.rotationMatrix.multiplyVector3( intersects[ 0 ].face.normal.clone() ) );
 
 						var voxel = new THREE.Mesh( new Cube( 50, 50, 50 ), [ new THREE.MeshLambertMaterial( { color: 0x00ff80, opacity: 1, shading: THREE.FlatShading } ), new THREE.MeshFaceMaterial() ] );
 						voxel.position.x = Math.floor( position.x / 50 ) * 50 + 25;

+ 14 - 2
src/core/Geometry.js

@@ -101,7 +101,19 @@ THREE.Geometry.prototype = {
 
 	},
 
-	computeBoundingBox: function ( ) {
+	computeVertexNormals: function () {
+
+		var f, fl;
+
+		for ( f = 0, fl = this.faces.length; f < fl; f++ ) {
+
+			
+
+		}
+
+	},
+
+	computeBoundingBox: function () {
 
 		if ( this.vertices.length > 0 ) {
 
@@ -151,7 +163,7 @@ THREE.Geometry.prototype = {
 
 	toString: function () {
 
-		return 'THREE.Geometry ( vertices: ' + this.vertices + ', faces: ' + this.faces + ' )';
+		return 'THREE.Geometry ( vertices: ' + this.vertices + ', faces: ' + this.faces + ', uvs: ' + this.uvs + ' )';
 
 	}
 

+ 2 - 2
src/core/Matrix4.js

@@ -50,7 +50,7 @@ THREE.Matrix4.prototype = {
 
 	},
 
-	transformVector3: function ( v ) {
+	multiplyVector3: function ( v ) {
 
 		var vx = v.x, vy = v.y, vz = v.z,
 		d = 1 / ( this.n41 * vx + this.n42 * vy + this.n43 * vz + this.n44 );
@@ -63,7 +63,7 @@ THREE.Matrix4.prototype = {
 
 	},
 
-	transformVector4: function ( v ) {
+	multiplyVector4: function ( v ) {
 
 		var vx = v.x, vy = v.y, vz = v.z, vw = v.w;
 

+ 5 - 5
src/core/Ray.js

@@ -52,12 +52,12 @@ THREE.Ray.prototype = {
 			origin = this.origin.clone();
 			direction = this.direction.clone();
 
-			a = object.matrix.transformVector3( vertices[ face.a ].position.clone() );
-			b = object.matrix.transformVector3( vertices[ face.b ].position.clone() );
-			c = object.matrix.transformVector3( vertices[ face.c ].position.clone() );
-			d = face instanceof THREE.Face4 ? object.matrix.transformVector3( vertices[ face.d ].position.clone() ) : null;
+			a = object.matrix.multiplyVector3( vertices[ face.a ].position.clone() );
+			b = object.matrix.multiplyVector3( vertices[ face.b ].position.clone() );
+			c = object.matrix.multiplyVector3( vertices[ face.c ].position.clone() );
+			d = face instanceof THREE.Face4 ? object.matrix.multiplyVector3( vertices[ face.d ].position.clone() ) : null;
 
-			normal = object.rotationMatrix.transformVector3( face.normal.clone() );
+			normal = object.rotationMatrix.multiplyVector3( face.normal.clone() );
 			dot = direction.dot( normal );
 
 			if ( dot < 0 ) { // Math.abs( dot ) > 0.0001

+ 1 - 1
src/extras/GeometryUtils.js

@@ -22,7 +22,7 @@ var GeometryUtils = {
 
 			var vertexCopy = new THREE.Vertex( vertex.position.clone() );
 
-			isMesh && object2.matrix.transformVector3( vertexCopy.position );
+			isMesh && object2.matrix.multiplyVector3( vertexCopy.position );
 
 			vertices1.push( vertexCopy );
 

+ 13 - 13
src/renderers/Projector.js

@@ -57,11 +57,11 @@ THREE.Projector = function() {
 					vertex = vertices[ v ];
 
 					vertex.positionWorld.copy( vertex.position );
-					objectMatrix.transformVector3( vertex.positionWorld );
+					objectMatrix.multiplyVector3( vertex.positionWorld );
 
 					vertexPositionScreen = vertex.positionScreen;
 					vertexPositionScreen.copy( vertex.positionWorld );
-					_projScreenMatrix.transformVector4( vertexPositionScreen );
+					_projScreenMatrix.multiplyVector4( vertexPositionScreen );
 
 					// Perform the perspective divide. TODO: This should be be performend 
 					// post clipping (imagine if the vertex lies at the same location as 
@@ -101,13 +101,13 @@ THREE.Projector = function() {
 								_face3.v3.positionScreen.copy( v3.positionScreen );
 
 								_face3.normalWorld.copy( face.normal );
-								objectRotationMatrix.transformVector3( _face3.normalWorld );
+								objectRotationMatrix.multiplyVector3( _face3.normalWorld );
 
 								_face3.centroidWorld.copy( face.centroid );
-								objectMatrix.transformVector3( _face3.centroidWorld );
+								objectMatrix.multiplyVector3( _face3.centroidWorld );
 
 								_face3.centroidScreen.copy( _face3.centroidWorld );
-								_projScreenMatrix.transformVector3( _face3.centroidScreen );
+								_projScreenMatrix.multiplyVector3( _face3.centroidScreen );
 
 								faceVertexNormals = face.vertexNormals;
 								_face3VertexNormals = _face3.vertexNormalsWorld;
@@ -116,7 +116,7 @@ THREE.Projector = function() {
 
 									normal = _face3VertexNormals[ n ] = _face3VertexNormals[ n ] || new THREE.Vector3();
 									normal.copy( faceVertexNormals[ n ] );
-									objectRotationMatrix.transformVector3( normal );
+									objectRotationMatrix.multiplyVector3( normal );
 
 								}
 
@@ -165,13 +165,13 @@ THREE.Projector = function() {
 								_face3.v3.positionScreen.copy( v4.positionScreen );
 
 								_face3.normalWorld.copy( face.normal );
-								objectRotationMatrix.transformVector3( _face3.normalWorld );
+								objectRotationMatrix.multiplyVector3( _face3.normalWorld );
 
 								_face3.centroidWorld.copy( face.centroid );
-								objectMatrix.transformVector3( _face3.centroidWorld );
+								objectMatrix.multiplyVector3( _face3.centroidWorld );
 
 								_face3.centroidScreen.copy( _face3.centroidWorld );
-								_projScreenMatrix.transformVector3( _face3.centroidScreen );
+								_projScreenMatrix.multiplyVector3( _face3.centroidScreen );
 
 								// TODO: Handle vertex normals
 
@@ -245,14 +245,14 @@ THREE.Projector = function() {
 
 				vertex = vertices[ 0 ];
 				vertex.positionScreen.copy( vertex.position );
-				_projScreenObjectMatrix.transformVector4( vertex.positionScreen );
+				_projScreenObjectMatrix.multiplyVector4( vertex.positionScreen );
 
 				for ( v = 1, vl = vertices.length; v < vl; v++ ) {
 
 					v1 = vertices[ v ];
 
 					v1.positionScreen.copy( v1.position );
-					_projScreenObjectMatrix.transformVector4( v1.positionScreen );
+					_projScreenObjectMatrix.multiplyVector4( v1.positionScreen );
 
 					v2 = vertices[ v - 1 ];
 
@@ -283,7 +283,7 @@ THREE.Projector = function() {
 
 				_vector4.set( object.position.x, object.position.y, object.position.z, 1 );
 
-				_projScreenMatrix.transformVector4( _vector4 );
+				_projScreenMatrix.multiplyVector4( _vector4 );
 
 				_vector4.z /= _vector4.w;
 
@@ -322,7 +322,7 @@ THREE.Projector = function() {
 		var matrix = new THREE.Matrix4();
 
 		matrix.multiply( THREE.Matrix4.makeInvert( camera.matrix ), THREE.Matrix4.makeInvert( camera.projectionMatrix ) );
-		matrix.transformVector3( vector );
+		matrix.multiplyVector3( vector );
 
 		return vector;