diff --git a/build/Three.js b/build/Three.js index 040a1246..bbad20dc 100644 --- a/build/Three.js +++ b/build/Three.js @@ -11,40 +11,40 @@ distanceToSquared:function(a){var c=this.x-a.x,f=this.y-a.y;a=this.z-a.z;return THREE.Vector4.prototype={set:function(a,c,f,b){this.x=a;this.y=c;this.z=f;this.w=b;return this},copy:function(a){this.x=a.x;this.y=a.y;this.z=a.z;this.w=a.w||1;return this},add:function(a,c){this.x=a.x+c.x;this.y=a.y+c.y;this.z=a.z+c.z;this.w=a.w+c.w;return this},addSelf:function(a){this.x+=a.x;this.y+=a.y;this.z+=a.z;this.w+=a.w;return this},sub:function(a,c){this.x=a.x-c.x;this.y=a.y-c.y;this.z=a.z-c.z;this.w=a.w-c.w;return this},subSelf:function(a){this.x-=a.x;this.y-=a.y;this.z-=a.z;this.w-=a.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,c){this.x+=(a.x-this.x)*c;this.y+=(a.y-this.y)*c;this.z+=(a.z-this.z)*c;this.w+=(a.w-this.w)*c},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,c){this.origin=a||new THREE.Vector3;this.direction=c||new THREE.Vector3}; -THREE.Ray.prototype={intersectScene:function(a){var c,f,b=a.objects,d=[];a=0;for(c=b.length;a0&&A>0&&i+A<1}var f,b,d,j,o,r,e,g,n,h, -l,q=a.geometry,p=q.vertices,s=[];f=0;for(b=q.faces.length;f= -0&&Math.min(d,e.getBottom())-Math.max(f,e.getTop())>=0};this.empty=function(){r=true;d=b=f=c=0;a()};this.isEmpty=function(){return r};this.toString=function(){return"THREE.Rectangle ( left: "+c+", right: "+b+", top: "+f+", bottom: "+d+", width: "+j+", height: "+o+" )"}};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.Ray.prototype={intersectScene:function(a){var c,f,b=a.objects,d=[];a=0;for(c=b.length;a0&&A>0&&k+A<1}var f,b,d,j,n,q,e,g,m,h, +o,i=a.geometry,r=i.vertices,w=[];f=0;for(b=i.faces.length;f= +0&&Math.min(d,e.getBottom())-Math.max(f,e.getTop())>=0};this.empty=function(){q=true;d=b=f=c=0;a()};this.isEmpty=function(){return q};this.toString=function(){return"THREE.Rectangle ( left: "+c+", right: "+b+", top: "+f+", bottom: "+d+", width: "+j+", height: "+n+" )"}};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(){this._x=new THREE.Vector3;this._y=new THREE.Vector3;this._z=new THREE.Vector3}; 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,c,f){var b=this._x,d=this._y,j=this._z;j.sub(a,c);j.normalize();b.cross(f,j);b.normalize();d.cross(j,b);d.normalize();this.n11=b.x;this.n12=b.y;this.n13=b.z;this.n14=-b.dot(a);this.n21=d.x;this.n22=d.y;this.n23=d.z;this.n24=-d.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},transform:function(a){var c=a.x,f=a.y,b=a.z,d=a.w?a.w:1;a.x=this.n11*c+this.n12*f+this.n13*b+this.n14* d;a.y=this.n21*c+this.n22*f+this.n23*b+this.n24*d;a.z=this.n31*c+this.n32*f+this.n33*b+this.n34*d;d=this.n41*c+this.n42*f+this.n43*b+this.n44*d;if(a.w)a.w=d;else{a.x/=d;a.y/=d;a.z/=d}return a},crossVector:function(a){var c=new THREE.Vector4;c.x=this.n11*a.x+this.n12*a.y+this.n13*a.z+this.n14*a.w;c.y=this.n21*a.x+this.n22*a.y+this.n23*a.z+this.n24*a.w;c.z=this.n31*a.x+this.n32*a.y+this.n33*a.z+this.n34*a.w;c.w=a.w?this.n41*a.x+this.n42*a.y+this.n43*a.z+this.n44*a.w:1;return c},multiply:function(a, c){this.n11=a.n11*c.n11+a.n12*c.n21+a.n13*c.n31+a.n14*c.n41;this.n12=a.n11*c.n12+a.n12*c.n22+a.n13*c.n32+a.n14*c.n42;this.n13=a.n11*c.n13+a.n12*c.n23+a.n13*c.n33+a.n14*c.n43;this.n14=a.n11*c.n14+a.n12*c.n24+a.n13*c.n34+a.n14*c.n44;this.n21=a.n21*c.n11+a.n22*c.n21+a.n23*c.n31+a.n24*c.n41;this.n22=a.n21*c.n12+a.n22*c.n22+a.n23*c.n32+a.n24*c.n42;this.n23=a.n21*c.n13+a.n22*c.n23+a.n23*c.n33+a.n24*c.n43;this.n24=a.n21*c.n14+a.n22*c.n24+a.n23*c.n34+a.n24*c.n44;this.n31=a.n31*c.n11+a.n32*c.n21+a.n33*c.n31+ -a.n34*c.n41;this.n32=a.n31*c.n12+a.n32*c.n22+a.n33*c.n32+a.n34*c.n42;this.n33=a.n31*c.n13+a.n32*c.n23+a.n33*c.n33+a.n34*c.n43;this.n34=a.n31*c.n14+a.n32*c.n24+a.n33*c.n34+a.n34*c.n44;this.n41=a.n41*c.n11+a.n42*c.n21+a.n43*c.n31+a.n44*c.n41;this.n42=a.n41*c.n12+a.n42*c.n22+a.n43*c.n32+a.n44*c.n42;this.n43=a.n41*c.n13+a.n42*c.n23+a.n43*c.n33+a.n44*c.n43;this.n44=a.n41*c.n14+a.n42*c.n24+a.n43*c.n34+a.n44*c.n44},multiplySelf:function(a){var c=this.n11,f=this.n12,b=this.n13,d=this.n14,j=this.n21,o=this.n22, -r=this.n23,e=this.n24,g=this.n31,n=this.n32,h=this.n33,l=this.n34,q=this.n41,p=this.n42,s=this.n43,A=this.n44;this.n11=c*a.n11+f*a.n21+b*a.n31+d*a.n41;this.n12=c*a.n12+f*a.n22+b*a.n32+d*a.n42;this.n13=c*a.n13+f*a.n23+b*a.n33+d*a.n43;this.n14=c*a.n14+f*a.n24+b*a.n34+d*a.n44;this.n21=j*a.n11+o*a.n21+r*a.n31+e*a.n41;this.n22=j*a.n12+o*a.n22+r*a.n32+e*a.n42;this.n23=j*a.n13+o*a.n23+r*a.n33+e*a.n43;this.n24=j*a.n14+o*a.n24+r*a.n34+e*a.n44;this.n31=g*a.n11+n*a.n21+h*a.n31+l*a.n41;this.n32=g*a.n12+n*a.n22+ -h*a.n32+l*a.n42;this.n33=g*a.n13+n*a.n23+h*a.n33+l*a.n43;this.n34=g*a.n14+n*a.n24+h*a.n34+l*a.n44;this.n41=q*a.n11+p*a.n21+s*a.n31+A*a.n41;this.n42=q*a.n12+p*a.n22+s*a.n32+A*a.n42;this.n43=q*a.n13+p*a.n23+s*a.n33+A*a.n43;this.n44=q*a.n14+p*a.n24+s*a.n34+A*a.n44},multiplyScalar:function(a){this.n11*=a;this.n12*=a;this.n13*=a;this.n14*=a;this.n21*=a;this.n22*=a;this.n23*=a;this.n24*=a;this.n31*=a;this.n32*=a;this.n33*=a;this.n34*=a;this.n41*=a;this.n42*=a;this.n43*=a;this.n44*=a},determinant:function(){return this.n14* +a.n34*c.n41;this.n32=a.n31*c.n12+a.n32*c.n22+a.n33*c.n32+a.n34*c.n42;this.n33=a.n31*c.n13+a.n32*c.n23+a.n33*c.n33+a.n34*c.n43;this.n34=a.n31*c.n14+a.n32*c.n24+a.n33*c.n34+a.n34*c.n44;this.n41=a.n41*c.n11+a.n42*c.n21+a.n43*c.n31+a.n44*c.n41;this.n42=a.n41*c.n12+a.n42*c.n22+a.n43*c.n32+a.n44*c.n42;this.n43=a.n41*c.n13+a.n42*c.n23+a.n43*c.n33+a.n44*c.n43;this.n44=a.n41*c.n14+a.n42*c.n24+a.n43*c.n34+a.n44*c.n44},multiplySelf:function(a){var c=this.n11,f=this.n12,b=this.n13,d=this.n14,j=this.n21,n=this.n22, +q=this.n23,e=this.n24,g=this.n31,m=this.n32,h=this.n33,o=this.n34,i=this.n41,r=this.n42,w=this.n43,A=this.n44;this.n11=c*a.n11+f*a.n21+b*a.n31+d*a.n41;this.n12=c*a.n12+f*a.n22+b*a.n32+d*a.n42;this.n13=c*a.n13+f*a.n23+b*a.n33+d*a.n43;this.n14=c*a.n14+f*a.n24+b*a.n34+d*a.n44;this.n21=j*a.n11+n*a.n21+q*a.n31+e*a.n41;this.n22=j*a.n12+n*a.n22+q*a.n32+e*a.n42;this.n23=j*a.n13+n*a.n23+q*a.n33+e*a.n43;this.n24=j*a.n14+n*a.n24+q*a.n34+e*a.n44;this.n31=g*a.n11+m*a.n21+h*a.n31+o*a.n41;this.n32=g*a.n12+m*a.n22+ +h*a.n32+o*a.n42;this.n33=g*a.n13+m*a.n23+h*a.n33+o*a.n43;this.n34=g*a.n14+m*a.n24+h*a.n34+o*a.n44;this.n41=i*a.n11+r*a.n21+w*a.n31+A*a.n41;this.n42=i*a.n12+r*a.n22+w*a.n32+A*a.n42;this.n43=i*a.n13+r*a.n23+w*a.n33+A*a.n43;this.n44=i*a.n14+r*a.n24+w*a.n34+A*a.n44},multiplyScalar:function(a){this.n11*=a;this.n12*=a;this.n13*=a;this.n14*=a;this.n21*=a;this.n22*=a;this.n23*=a;this.n24*=a;this.n31*=a;this.n32*=a;this.n33*=a;this.n34*=a;this.n41*=a;this.n42*=a;this.n43*=a;this.n44*=a},determinant:function(){return this.n14* this.n23*this.n32*this.n41-this.n13*this.n24*this.n32*this.n41-this.n14*this.n22*this.n33*this.n41+this.n12*this.n24*this.n33*this.n41+this.n13*this.n22*this.n34*this.n41-this.n12*this.n23*this.n34*this.n41-this.n14*this.n23*this.n31*this.n42+this.n13*this.n24*this.n31*this.n42+this.n14*this.n21*this.n33*this.n42-this.n11*this.n24*this.n33*this.n42-this.n13*this.n21*this.n34*this.n42+this.n11*this.n23*this.n34*this.n42+this.n14*this.n22*this.n31*this.n43-this.n12*this.n24*this.n31*this.n43-this.n14* this.n21*this.n32*this.n43+this.n11*this.n24*this.n32*this.n43+this.n12*this.n21*this.n34*this.n43-this.n11*this.n22*this.n34*this.n43-this.n13*this.n22*this.n31*this.n44+this.n12*this.n23*this.n31*this.n44+this.n13*this.n21*this.n32*this.n44-this.n11*this.n23*this.n32*this.n44-this.n12*this.n21*this.n33*this.n44+this.n11*this.n22*this.n33*this.n44},transpose:function(){function a(c,f,b){var d=c[f];c[f]=c[b];c[b]=d}a(this,"n21","n12");a(this,"n31","n13");a(this,"n32","n23");a(this,"n41","n14");a(this, "n42","n24");a(this,"n43","n34");return this},clone:function(){var a=new THREE.Matrix4;a.n11=this.n11;a.n12=this.n12;a.n13=this.n13;a.n14=this.n14;a.n21=this.n21;a.n22=this.n22;a.n23=this.n23;a.n24=this.n24;a.n31=this.n31;a.n32=this.n32;a.n33=this.n33;a.n34=this.n34;a.n41=this.n41;a.n42=this.n42;a.n43=this.n43;a.n44=this.n44;return a},flatten:function(){return[this.n11,this.n21,this.n31,this.n41,this.n12,this.n22,this.n32,this.n42,this.n13,this.n23,this.n33,this.n43,this.n14,this.n24,this.n34,this.n44]}, toString:function(){return"| "+this.n11+" "+this.n12+" "+this.n13+" "+this.n14+" |\n| "+this.n21+" "+this.n22+" "+this.n23+" "+this.n24+" |\n| "+this.n31+" "+this.n32+" "+this.n33+" "+this.n34+" |\n| "+this.n41+" "+this.n42+" "+this.n43+" "+this.n44+" |"}};THREE.Matrix4.translationMatrix=function(a,c,f){var b=new THREE.Matrix4;b.n14=a;b.n24=c;b.n34=f;return b};THREE.Matrix4.scaleMatrix=function(a,c,f){var b=new THREE.Matrix4;b.n11=a;b.n22=c;b.n33=f;return b}; THREE.Matrix4.rotationXMatrix=function(a){var c=new THREE.Matrix4;c.n22=c.n33=Math.cos(a);c.n32=Math.sin(a);c.n23=-c.n32;return c};THREE.Matrix4.rotationYMatrix=function(a){var c=new THREE.Matrix4;c.n11=c.n33=Math.cos(a);c.n13=Math.sin(a);c.n31=-c.n13;return c};THREE.Matrix4.rotationZMatrix=function(a){var c=new THREE.Matrix4;c.n11=c.n22=Math.cos(a);c.n21=Math.sin(a);c.n12=-c.n21;return c}; -THREE.Matrix4.rotationAxisAngleMatrix=function(a,c){var f=new THREE.Matrix4,b=Math.cos(c),d=Math.sin(c),j=1-b,o=a.x,r=a.y,e=a.z;f.n11=j*o*o+b;f.n12=j*o*r-d*e;f.n13=j*o*e+d*r;f.n21=j*o*r+d*e;f.n22=j*r*r+b;f.n23=j*r*e-d*o;f.n31=j*o*e-d*r;f.n32=j*r*e+d*o;f.n33=j*e*e+b;return f}; +THREE.Matrix4.rotationAxisAngleMatrix=function(a,c){var f=new THREE.Matrix4,b=Math.cos(c),d=Math.sin(c),j=1-b,n=a.x,q=a.y,e=a.z;f.n11=j*n*n+b;f.n12=j*n*q-d*e;f.n13=j*n*e+d*q;f.n21=j*n*q+d*e;f.n22=j*q*q+b;f.n23=j*q*e-d*n;f.n31=j*n*e-d*q;f.n32=j*q*e+d*n;f.n33=j*e*e+b;return f}; THREE.Matrix4.makeInvert=function(a){var c=new THREE.Matrix4;c.n11=a.n23*a.n34*a.n42-a.n24*a.n33*a.n42+a.n24*a.n32*a.n43-a.n22*a.n34*a.n43-a.n23*a.n32*a.n44+a.n22*a.n33*a.n44;c.n12=a.n14*a.n33*a.n42-a.n13*a.n34*a.n42-a.n14*a.n32*a.n43+a.n12*a.n34*a.n43+a.n13*a.n32*a.n44-a.n12*a.n33*a.n44;c.n13=a.n13*a.n24*a.n42-a.n14*a.n23*a.n42+a.n14*a.n22*a.n43-a.n12*a.n24*a.n43-a.n13*a.n22*a.n44+a.n12*a.n23*a.n44;c.n14=a.n14*a.n23*a.n32-a.n13*a.n24*a.n32-a.n14*a.n22*a.n33+a.n12*a.n24*a.n33+a.n13*a.n22*a.n34-a.n12* a.n23*a.n34;c.n21=a.n24*a.n33*a.n41-a.n23*a.n34*a.n41-a.n24*a.n31*a.n43+a.n21*a.n34*a.n43+a.n23*a.n31*a.n44-a.n21*a.n33*a.n44;c.n22=a.n13*a.n34*a.n41-a.n14*a.n33*a.n41+a.n14*a.n31*a.n43-a.n11*a.n34*a.n43-a.n13*a.n31*a.n44+a.n11*a.n33*a.n44;c.n23=a.n14*a.n23*a.n41-a.n13*a.n24*a.n41-a.n14*a.n21*a.n43+a.n11*a.n24*a.n43+a.n13*a.n21*a.n44-a.n11*a.n23*a.n44;c.n24=a.n13*a.n24*a.n31-a.n14*a.n23*a.n31+a.n14*a.n21*a.n33-a.n11*a.n24*a.n33-a.n13*a.n21*a.n34+a.n11*a.n23*a.n34;c.n31=a.n22*a.n34*a.n41-a.n24*a.n32* a.n41+a.n24*a.n31*a.n42-a.n21*a.n34*a.n42-a.n22*a.n31*a.n44+a.n21*a.n32*a.n44;c.n32=a.n14*a.n32*a.n41-a.n12*a.n34*a.n41-a.n14*a.n31*a.n42+a.n11*a.n34*a.n42+a.n12*a.n31*a.n44-a.n11*a.n32*a.n44;c.n33=a.n13*a.n24*a.n41-a.n14*a.n22*a.n41+a.n14*a.n21*a.n42-a.n11*a.n24*a.n42-a.n12*a.n21*a.n44+a.n11*a.n22*a.n44;c.n34=a.n14*a.n22*a.n31-a.n12*a.n24*a.n31-a.n14*a.n21*a.n32+a.n11*a.n24*a.n32+a.n12*a.n21*a.n34-a.n11*a.n22*a.n34;c.n41=a.n23*a.n32*a.n41-a.n22*a.n33*a.n41-a.n23*a.n31*a.n42+a.n21*a.n33*a.n42+a.n22* a.n31*a.n43-a.n21*a.n32*a.n43;c.n42=a.n12*a.n33*a.n41-a.n13*a.n32*a.n41+a.n13*a.n31*a.n42-a.n11*a.n33*a.n42-a.n12*a.n31*a.n43+a.n11*a.n32*a.n43;c.n43=a.n13*a.n22*a.n41-a.n12*a.n23*a.n41-a.n13*a.n21*a.n42+a.n11*a.n23*a.n42+a.n12*a.n21*a.n43-a.n11*a.n22*a.n43;c.n44=a.n12*a.n23*a.n31-a.n13*a.n22*a.n31+a.n13*a.n21*a.n32-a.n11*a.n23*a.n32-a.n12*a.n21*a.n33+a.n11*a.n22*a.n33;c.multiplyScalar(1/a.determinant());return c}; -THREE.Matrix4.makeInvert3x3=function(a){var c=a.flatten();a=new THREE.Matrix3;var f=c[10]*c[5]-c[6]*c[9],b=-c[10]*c[1]+c[2]*c[9],d=c[6]*c[1]-c[2]*c[5],j=-c[10]*c[4]+c[6]*c[8],o=c[10]*c[0]-c[2]*c[8],r=-c[6]*c[0]+c[2]*c[4],e=c[9]*c[4]-c[5]*c[8],g=-c[9]*c[0]+c[1]*c[8],n=c[5]*c[0]-c[1]*c[4];c=c[0]*f+c[1]*j+c[2]*e;if(c==0)throw"matrix not invertible";c=1/c;a.m[0]=c*f;a.m[1]=c*b;a.m[2]=c*d;a.m[3]=c*j;a.m[4]=c*o;a.m[5]=c*r;a.m[6]=c*e;a.m[7]=c*g;a.m[8]=c*n;return a}; -THREE.Matrix4.makeFrustum=function(a,c,f,b,d,j){var o,r,e;o=new THREE.Matrix4;r=2*d/(c-a);e=2*d/(b-f);a=(c+a)/(c-a);f=(b+f)/(b-f);b=-(j+d)/(j-d);d=-2*j*d/(j-d);o.n11=r;o.n12=0;o.n13=a;o.n14=0;o.n21=0;o.n22=e;o.n23=f;o.n24=0;o.n31=0;o.n32=0;o.n33=b;o.n34=d;o.n41=0;o.n42=0;o.n43=-1;o.n44=0;return o};THREE.Matrix4.makePerspective=function(a,c,f,b){var d;a=f*Math.tan(a*Math.PI/360);d=-a;return THREE.Matrix4.makeFrustum(d*c,a*c,d,a,f,b)}; -THREE.Matrix4.makeOrtho=function(a,c,f,b,d,j){var o,r,e,g;o=new THREE.Matrix4;r=c-a;e=f-b;g=j-d;a=(c+a)/r;f=(f+b)/e;d=(j+d)/g;o.n11=2/r;o.n12=0;o.n13=0;o.n14=-a;o.n21=0;o.n22=2/e;o.n23=0;o.n24=-f;o.n31=0;o.n32=0;o.n33=-2/g;o.n34=-d;o.n41=0;o.n42=0;o.n43=0;o.n44=1;return o}; +THREE.Matrix4.makeInvert3x3=function(a){var c=a.flatten();a=new THREE.Matrix3;var f=c[10]*c[5]-c[6]*c[9],b=-c[10]*c[1]+c[2]*c[9],d=c[6]*c[1]-c[2]*c[5],j=-c[10]*c[4]+c[6]*c[8],n=c[10]*c[0]-c[2]*c[8],q=-c[6]*c[0]+c[2]*c[4],e=c[9]*c[4]-c[5]*c[8],g=-c[9]*c[0]+c[1]*c[8],m=c[5]*c[0]-c[1]*c[4];c=c[0]*f+c[1]*j+c[2]*e;if(c==0)throw"matrix not invertible";c=1/c;a.m[0]=c*f;a.m[1]=c*b;a.m[2]=c*d;a.m[3]=c*j;a.m[4]=c*n;a.m[5]=c*q;a.m[6]=c*e;a.m[7]=c*g;a.m[8]=c*m;return a}; +THREE.Matrix4.makeFrustum=function(a,c,f,b,d,j){var n,q,e;n=new THREE.Matrix4;q=2*d/(c-a);e=2*d/(b-f);a=(c+a)/(c-a);f=(b+f)/(b-f);b=-(j+d)/(j-d);d=-2*j*d/(j-d);n.n11=q;n.n12=0;n.n13=a;n.n14=0;n.n21=0;n.n22=e;n.n23=f;n.n24=0;n.n31=0;n.n32=0;n.n33=b;n.n34=d;n.n41=0;n.n42=0;n.n43=-1;n.n44=0;return n};THREE.Matrix4.makePerspective=function(a,c,f,b){var d;a=f*Math.tan(a*Math.PI/360);d=-a;return THREE.Matrix4.makeFrustum(d*c,a*c,d,a,f,b)}; +THREE.Matrix4.makeOrtho=function(a,c,f,b,d,j){var n,q,e,g;n=new THREE.Matrix4;q=c-a;e=f-b;g=j-d;a=(c+a)/q;f=(f+b)/e;d=(j+d)/g;n.n11=2/q;n.n12=0;n.n13=0;n.n14=-a;n.n21=0;n.n22=2/e;n.n23=0;n.n24=-f;n.n31=0;n.n32=0;n.n33=-2/g;n.n34=-d;n.n41=0;n.n42=0;n.n43=0;n.n44=1;return n}; THREE.Vertex=function(a,c){this.position=a||new THREE.Vector3;this.positionWorld=new THREE.Vector3;this.positionScreen=new THREE.Vector4;this.normal=c||new THREE.Vector3;this.normalWorld=new THREE.Vector3;this.normalScreen=new THREE.Vector3;this.__visible=true};THREE.Vertex.prototype={toString:function(){return"THREE.Vertex ( position: "+this.position+", normal: "+this.normal+" )"}}; THREE.Face3=function(a,c,f,b,d){this.a=a;this.b=c;this.c=f;this.centroid=new THREE.Vector3;this.normal=b instanceof THREE.Vector3?b:new THREE.Vector3;this.vertexNormals=b instanceof Array?b:[];this.material=d instanceof Array?d:[d]};THREE.Face3.prototype={toString:function(){return"THREE.Face3 ( "+this.a+", "+this.b+", "+this.c+" )"}}; THREE.Face4=function(a,c,f,b,d,j){this.a=a;this.b=c;this.c=f;this.d=b;this.centroid=new THREE.Vector3;this.normal=d instanceof THREE.Vector3?d:new THREE.Vector3;this.vertexNormals=d instanceof Array?d:[];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,c){this.u=a||0;this.v=c||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,c,f;a=0;for(c=this.faces.length;a0){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,c=this.vertices.length;a +f.centroid.addSelf(this.vertices[f.d].position);f.centroid.divideScalar(4)}}},computeNormals:function(a){var c,f,b,d,j,n,q=new THREE.Vector3,e=new THREE.Vector3;b=0;for(d=this.vertices.length;b0){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,c=this.vertices.length;a this.bbox.x[1])this.bbox.x[1]=vertex.position.x;if(vertex.position.ythis.bbox.y[1])this.bbox.y[1]=vertex.position.y;if(vertex.position.zthis.bbox.z[1])this.bbox.z[1]=vertex.position.z}}},toString:function(){return"THREE.Geometry ( vertices: "+this.vertices+", faces: "+this.faces+" )"}}; THREE.Camera=function(a,c,f,b){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,c,f,b);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(-16777216|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,c){THREE.Light.call(this,a);this.position=new THREE.Vector3(0,1,0);this.intensity=c||1};THREE.DirectionalLight.prototype=new THREE.Light;THREE.DirectionalLight.prototype.constructor=THREE.DirectionalLight; @@ -53,8 +53,8 @@ THREE.Object3D=function(){this.position=new THREE.Vector3;this.rotation=new THRE this.matrixRotation.multiplySelf(THREE.Matrix4.rotationYMatrix(this.rotation.y));this.matrixRotation.multiplySelf(THREE.Matrix4.rotationZMatrix(this.rotation.z));this.matrixScale=THREE.Matrix4.scaleMatrix(this.scale.x,this.scale.y,this.scale.z);this.matrix.copy(this.matrixPosition);this.matrix.multiplySelf(this.matrixRotation);this.matrix.multiplySelf(this.matrixScale)}};THREE.Particle=function(a){THREE.Object3D.call(this);this.material=a instanceof Array?a:[a];this.autoUpdateMatrix=false}; THREE.Particle.prototype=new THREE.Object3D;THREE.Particle.prototype.constructor=THREE.Particle;THREE.Line=function(a,c){THREE.Object3D.call(this);this.geometry=a;this.material=c instanceof Array?c:[c]};THREE.Line.prototype=new THREE.Object3D;THREE.Line.prototype.constructor=THREE.Line; THREE.Mesh=function(a,c,f){THREE.Object3D.call(this);this.geometry=a;this.material=c instanceof Array?c:[c];this.overdraw=this.doubleSided=this.flipSided=false;this.materialFaceGroup={};this.sortFacesByMaterial();f&&this.normalizeUVs();this.geometry.computeBoundingBox()};THREE.Mesh.prototype=new THREE.Object3D;THREE.Mesh.prototype.constructor=THREE.Mesh; -THREE.Mesh.prototype.sortFacesByMaterial=function(){function a(n){var h=[];c=0;for(f=n.length;c65535){g[r].counter+=1;e=g[r].hash+"_"+g[r].counter;if(this.materialFaceGroup[e]==undefined)this.materialFaceGroup[e]={faces:[],material:o,vertices:0}}this.materialFaceGroup[e].faces.push(b);this.materialFaceGroup[e].vertices+=j}};THREE.Mesh.prototype.normalizeUVs=function(){var a,c,f,b,d;a=0;for(c=this.geometry.uvs.length;a65535){g[q].counter+=1;e=g[q].hash+"_"+g[q].counter;if(this.materialFaceGroup[e]==undefined)this.materialFaceGroup[e]={faces:[],material:n,vertices:0}}this.materialFaceGroup[e].faces.push(b);this.materialFaceGroup[e].vertices+=j}};THREE.Mesh.prototype.normalizeUVs=function(){var a,c,f,b,d;a=0;for(c=this.geometry.uvs.length;acolor: "+this.color+"
opacity: "+this.opacity+"
blending: "+this.blending+"
linewidth: "+ this.linewidth+"
)"}}; @@ -74,52 +74,53 @@ THREE.MeshCubeMaterial=function(a){this.id=THREE.MeshCubeMaterial.value++;this.e THREE.ParticleBasicMaterial=function(a){this.color=new THREE.Color(16711680);this.map=null;this.opacity=1;this.blending=THREE.NormalBlending;this.offset=new THREE.Vector2;if(a){a.color!==undefined&&this.color.setHex(a.color);if(a.map!==undefined)this.map=a.map;if(a.opacity!==undefined)this.opacity=a.opacity;if(a.blending!==undefined)this.blending=a.blending}this.toString=function(){return"THREE.ParticleBasicMaterial (
color: "+this.color+"
map: "+this.map+"
opacity: "+this.opacity+"
blending: "+ this.blending+"
)"}};THREE.ParticleCircleMaterial=function(a){this.color=new THREE.Color(16711680);this.opacity=1;this.blending=THREE.NormalBlending;if(a){a.color!==undefined&&this.color.setHex(a.color);if(a.opacity!==undefined)this.opacity=a.opacity;if(a.blending!==undefined)this.blending=a.blending}this.toString=function(){return"THREE.ParticleCircleMaterial (
color: "+this.color+"
opacity: "+this.opacity+"
blending: "+this.blending+"
)"}}; THREE.ParticleDOMMaterial=function(a){this.domElement=a;this.toString=function(){return"THREE.ParticleDOMMaterial ( domElement: "+this.domElement+" )"}};THREE.Texture=function(a,c){this.image=a;this.mapping=c!==undefined?c:THREE.UVMapping;this.toString=function(){return"THREE.Texture (
image: "+this.image+"
mapping: "+this.mapping+"
)"}};THREE.UVMapping=0;THREE.ReflectionMap=1;THREE.RefractionMap=2;THREE.Multiply=0;THREE.Mix=1; -THREE.TextureCube=function(a,c){this.image=a;this.mapping=c?c:THREE.ReflectionMap;this.toString=function(){return"THREE.TextureCube (
image: "+this.image+"
mapping: "+this.mapping+"
)"}};THREE.loadImageArray=function(a){var c,f=[];for(c=f.loadCount=0;cimage: "+this.image+"
mapping: "+this.mapping+"
)"}}; 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(C,B){var m;m=0;var v=1,i=C.z+C.w,P=B.z+B.w,M=-C.z+C.w,x=-B.z+B.w;if(i>=0&&P>=0&&M>=0&&x>=0)m=true;else if(i<0&&P<0||M<0&&x<0)m=false;else{if(i<0)m=Math.max(m,i/(i-P));else if(P<0)v=Math.min(v,i/(i-P));if(M<0)m=Math.max(m,M/(M-x));else if(x<0)v=Math.min(v,M/(M-x));if(v0&&t.z<1}E=x.geometry.faces;i=0;for(P=E.length;i< -P;i++){t=E[i];if(t instanceof THREE.Face3){X=S[t.a];D=S[t.b];L=S[t.c];if(X.__visible&&D.__visible&&L.__visible)if(x.doubleSided||x.flipSided!=(L.positionScreen.x-X.positionScreen.x)*(D.positionScreen.y-X.positionScreen.y)-(L.positionScreen.y-X.positionScreen.y)*(D.positionScreen.x-X.positionScreen.x)<0){f=d[b]=d[b]||new THREE.RenderableFace3;f.v1.positionScreen.copy(X.positionScreen);f.v2.positionScreen.copy(D.positionScreen);f.v3.positionScreen.copy(L.positionScreen);f.normalWorld.copy(t.normal); -x.matrixRotation.transform(f.normalWorld);f.centroidWorld.copy(t.centroid);J.transform(f.centroidWorld);f.centroidScreen.copy(f.centroidWorld);s.transform(f.centroidScreen);f.z=f.centroidScreen.z;f.meshMaterial=x.material;f.faceMaterial=t.material;f.overdraw=x.overdraw;f.uvs=x.geometry.uvs[i];f.color=t.color;c.push(f);b++}}else if(t instanceof THREE.Face4){X=S[t.a];D=S[t.b];L=S[t.c];K=S[t.d];if(X.__visible&&D.__visible&&L.__visible&&K.__visible)if(x.doubleSided||x.flipSided!=((K.positionScreen.x- -X.positionScreen.x)*(D.positionScreen.y-X.positionScreen.y)-(K.positionScreen.y-X.positionScreen.y)*(D.positionScreen.x-X.positionScreen.x)<0||(D.positionScreen.x-L.positionScreen.x)*(K.positionScreen.y-L.positionScreen.y)-(D.positionScreen.y-L.positionScreen.y)*(K.positionScreen.x-L.positionScreen.x)<0)){j=r[o]=r[o]||new THREE.RenderableFace4;j.v1.positionScreen.copy(X.positionScreen);j.v2.positionScreen.copy(D.positionScreen);j.v3.positionScreen.copy(L.positionScreen);j.v4.positionScreen.copy(K.positionScreen); -j.normalWorld.copy(t.normal);x.matrixRotation.transform(j.normalWorld);j.centroidWorld.copy(t.centroid);J.transform(j.centroidWorld);j.centroidScreen.copy(j.centroidWorld);s.transform(j.centroidScreen);j.z=j.centroidScreen.z;j.meshMaterial=x.material;j.faceMaterial=t.material;j.overdraw=x.overdraw;j.uvs=x.geometry.uvs[i];j.color=t.color;c.push(j);o++}}}}else if(x instanceof THREE.Line){A.multiply(s,J);S=x.geometry.vertices;i=0;for(P=S.length;i0&&p.z<1){h=q[l]=q[l]||new THREE.RenderableParticle;h.x=p.x/p.w;h.y=p.y/p.w; -h.z=p.z;h.rotation=x.rotation.z;h.scale.x=x.scale.x*Math.abs(h.x-(p.x+B.projectionMatrix.n11)/(p.w+B.projectionMatrix.n14));h.scale.y=x.scale.y*Math.abs(h.y-(p.y+B.projectionMatrix.n22)/(p.w+B.projectionMatrix.n24));h.material=x.material;c.push(h);l++}}}c.sort(function(R,y){return y.z-R.z});return c};this.unprojectVector=function(C,B){var m=new THREE.Matrix4;m.multiply(THREE.Matrix4.makeInvert(B.matrix),THREE.Matrix4.makeInvert(B.projectionMatrix));m.transform(C);return C}}; -THREE.DOMRenderer=function(){THREE.Renderer.call(this);var a=null,c=new THREE.Projector,f,b,d,j;this.domElement=document.createElement("div");this.setSize=function(o,r){f=o;b=r;d=f/2;j=b/2};this.render=function(o,r){var e,g,n,h,l,q,p,s;a=c.projectScene(o,r);e=0;for(g=a.length;e0){H.r+=G.r*k;H.g+=G.g*k;H.b+=G.b*k}}else if(k instanceof THREE.PointLight){Ja.sub(k.position,N.centroidWorld);Ja.normalize();k=N.normalWorld.dot(Ja)*k.intensity;if(k>0){H.r+=G.r*k;H.g+=G.g*k;H.b+=G.b*k}}}}function c(w,N,H,I,k,G){if(k.opacity!=0){o(k.opacity);r(k.blending);L=w.positionScreen.x; -K=w.positionScreen.y;R=N.positionScreen.x;y=N.positionScreen.y;u=H.positionScreen.x;Q=H.positionScreen.y;if(k.map){fa=k.map.image;na=fa.width-1;oa=fa.height-1;da.u=I.uvs[0].u*na;da.v=I.uvs[0].v*oa;Z.u=I.uvs[1].u*na;Z.v=I.uvs[1].v*oa;ea.u=I.uvs[2].u*na;ea.v=I.uvs[2].v*oa;j(fa,L,K,R,y,u,Q,da.u,da.v,Z.u,Z.v,ea.u,ea.v)}else if(k instanceof THREE.MeshBasicMaterial)b(L,K,R,y,u,Q,k.color,k.wireframe,k.wireframe_linewidth);else if(k instanceof THREE.MeshLambertMaterial){if(Fa){ba.r=ga.r;ba.g=ga.g;ba.b=ga.b; -a(G,I,ba);T.r=k.color.r*ba.r;T.g=k.color.g*ba.g;T.b=k.color.b*ba.b;T.updateStyleString()}else T.__styleString=k.color.__styleString;b(L,K,R,y,u,Q,T,k.wireframe,k.wireframe_linewidth)}else if(k instanceof THREE.MeshDepthMaterial){pa=k.__2near;qa=k.__farPlusNear;ra=k.__farMinusNear;va=~~((1-pa/(qa-w.positionScreen.z*ra))*255);wa=~~((1-pa/(qa-N.positionScreen.z*ra))*255);ma=~~((1-pa/(qa-H.positionScreen.z*ra))*255);fa=h([va,va,va],[wa,wa,wa],[ma,ma,ma],[ma,ma,ma]);da.u=0;da.v=0;Z.u=ka;Z.v=0;ea.u=0;ea.v= -ka;j(fa,L,K,R,y,u,Q,da.u,da.v,Z.u,Z.v,ea.u,ea.v)}else if(k instanceof THREE.MeshNormalMaterial){T.r=l(I.normalWorld.x);T.g=l(I.normalWorld.y);T.b=l(I.normalWorld.z);T.updateStyleString();b(L,K,R,y,u,Q,T,k.wireframe,k.wireframe_linewidth)}}}function f(w,N,H,I,k,G,U,z,W){if(z.opacity!=0){o(z.opacity);r(z.blending);L=w.positionScreen.x;K=w.positionScreen.y;R=N.positionScreen.x;y=N.positionScreen.y;u=H.positionScreen.x;Q=H.positionScreen.y;ha=I.positionScreen.x;O=I.positionScreen.y;Y=k.positionScreen.x; -xa=k.positionScreen.y;Ka=G.positionScreen.x;La=G.positionScreen.y;if(z.map){fa=z.map.image;na=fa.width-1;oa=fa.height-1;da.copy(U.uvs[0]);Z.copy(U.uvs[1]);ea.copy(U.uvs[2]);ia.copy(U.uvs[3]);da.u*=na;da.v*=oa;Z.u*=na;Z.v*=oa;ea.u*=na;ea.v*=oa;ia.u*=na;ia.v*=oa;j(fa,L,K,R,y,ha,O,da.u,da.v,Z.u,Z.v,ia.u,ia.v);j(fa,Y,xa,u,Q,Ka,La,Z.u,Z.v,ea.u,ea.v,ia.u,ia.v)}else if(z instanceof THREE.MeshBasicMaterial)d(L,K,R,y,u,Q,ha,O,z.color,z.wireframe,z.wireframe_linewidth);else if(z instanceof THREE.MeshLambertMaterial){if(Fa){ba.r= -ga.r;ba.g=ga.g;ba.b=ga.b;a(W,U,ba);T.r=z.color.r*ba.r;T.g=z.color.g*ba.g;T.b=z.color.b*ba.b;T.updateStyleString()}else T.__styleString=z.color.__styleString;d(L,K,R,y,u,Q,ha,O,T,z.wireframe,z.wireframe_linewidth)}else if(z instanceof THREE.MeshDepthMaterial){pa=z.__2near;qa=z.__farPlusNear;ra=z.__farMinusNear;va=~~((1-pa/(qa-w.positionScreen.z*ra))*255);wa=~~((1-pa/(qa-N.positionScreen.z*ra))*255);ma=~~((1-pa/(qa-H.positionScreen.z*ra))*255);Ga=~~((1-pa/(qa-I.positionScreen.z*ra))*255);fa=h([va,va, -va],[wa,wa,wa],[Ga,Ga,Ga],[ma,ma,ma]);da.u=0;da.v=0;Z.u=ka;Z.v=0;ea.u=ka;ea.v=ka;ia.u=0;ia.v=ka;j(fa,L,K,R,y,ha,O,da.u,da.v,Z.u,Z.v,ia.u,ia.v);j(fa,Y,xa,u,Q,Ka,La,Z.u,Z.v,ea.u,ea.v,ia.u,ia.v)}else if(z instanceof THREE.MeshNormalMaterial){T.r=l(U.normalWorld.x);T.g=l(U.normalWorld.y);T.b=l(U.normalWorld.z);T.updateStyleString();d(L,K,R,y,u,Q,ha,O,T,z.wireframe,z.wireframe_linewidth)}}}function b(w,N,H,I,k,G,U,z,W){i.beginPath();i.moveTo(w,N);i.lineTo(H,I);i.lineTo(k,G);i.lineTo(w,N);i.closePath(); -if(z){e(W);g(U.__styleString);i.stroke();$.inflate(W*2)}else{n(U.__styleString);i.fill()}}function d(w,N,H,I,k,G,U,z,W,F,ca){i.beginPath();i.moveTo(w,N);i.lineTo(H,I);i.lineTo(k,G);i.lineTo(U,z);i.lineTo(w,N);i.closePath();if(F){e(ca);g(W.__styleString);i.stroke();$.inflate(ca*2)}else{n(W.__styleString);i.fill()}}function j(w,N,H,I,k,G,U,z,W,F,ca,la,sa){i.beginPath();i.moveTo(N,H);i.lineTo(I,k);i.lineTo(G,U);i.closePath();I-=N;k-=H;G-=N;U-=H;F-=z;ca-=W;la-=z;sa-=W;var ta=1/(F*sa-la*ca),Ba=(sa*I-ca* -G)*ta;ca=(sa*k-ca*U)*ta;I=(F*G-la*I)*ta;k=(F*U-la*k)*ta;N=N-Ba*z-I*W;H=H-ca*z-k*W;i.save();i.transform(Ba,ca,I,k,N,H);i.clip();i.drawImage(w,0,0);i.restore()}function o(w){if(P!=w)i.globalAlpha=P=w}function r(w){if(M!=w){switch(w){case THREE.NormalBlending:i.globalCompositeOperation="source-over";break;case THREE.AdditiveBlending:i.globalCompositeOperation="lighter";break;case THREE.SubtractiveBlending:i.globalCompositeOperation="darker"}M=w}}function e(w){if(S!=w)i.lineWidth=S=w}function g(w){if(x!= -w)i.strokeStyle=x=w}function n(w){if(J!=w)i.fillStyle=J=w}function h(w,N,H,I){ja[0]=w[0];ja[1]=w[1];ja[2]=w[2];ja[4]=N[0];ja[5]=N[1];ja[6]=N[2];ja[8]=H[0];ja[9]=H[1];ja[10]=H[2];ja[12]=I[0];ja[13]=I[1];ja[14]=I[2];Ca.putImageData(Ma,0,0);Ha.drawImage(Da,0,0);return Ea}function l(w){return w<0?Math.min((1+w)*0.5,0.5):0.5+Math.min(w*0.5,0.5)}function q(w,N){var H=N.x-w.x,I=N.y-w.y,k=1/Math.sqrt(H*H+I*I);H*=k;I*=k;N.x+=H;N.y+=I;w.x-=H;w.y-=I}var p=null,s=new THREE.Projector,A=document.createElement("canvas"), -C,B,m,v,i=A.getContext("2d"),P=1,M=0,x=null,J=null,S=1,E,t,V,aa,X=new THREE.Vertex,D=new THREE.Vertex,L,K,R,y,u,Q,ha,O,Y,xa,Ka,La,va,wa,ma,Ga,pa,qa,ra,fa,na,oa,ya=new THREE.Rectangle,ua=new THREE.Rectangle,$=new THREE.Rectangle,Fa=false,T=new THREE.Color(4294967295),ba=new THREE.Color(4294967295),ga=new THREE.Color(4278190080),za=new THREE.Color(4278190080),Aa=new THREE.Color(4278190080),Qa=Math.PI*2,Ja=new THREE.Vector3,da=new THREE.UV,Z=new THREE.UV,ea=new THREE.UV,ia=new THREE.UV,Da,Ca,Ma,ja,Ea, -Ha,ka=16;Da=document.createElement("canvas");Da.width=Da.height=2;Ca=Da.getContext("2d");Ca.fillStyle="rgba(0,0,0,1)";Ca.fillRect(0,0,2,2);Ma=Ca.getImageData(0,0,2,2);ja=Ma.data;Ea=document.createElement("canvas");Ea.width=Ea.height=ka;Ha=Ea.getContext("2d");Ha.translate(-ka/2,-ka/2);Ha.scale(ka,ka);ka--;this.domElement=A;this.autoClear=true;this.setSize=function(w,N){C=w;B=N;m=C/2;v=B/2;A.width=C;A.height=B;i.lineJoin="round";i.lineCap="round";ya.set(-m,-v,m,v)};this.clear=function(){if(!ua.isEmpty()){ua.inflate(1); -ua.minSelf(ya);i.setTransform(1,0,0,-1,m,v);i.clearRect(ua.getX(),ua.getY(),ua.getWidth(),ua.getHeight());ua.empty()}};this.render=function(w,N){var H,I,k,G,U,z,W,F;this.autoClear&&this.clear();p=s.projectScene(w,N);i.setTransform(1,0,0,-1,m,v);if(Fa=w.lights.length>0){U=w.lights;ga.setRGB(0,0,0);za.setRGB(0,0,0);Aa.setRGB(0,0,0);H=0;for(I=U.length;H0){K.r+=u.color.r*Q;K.g+=u.color.g*Q;K.b+=u.color.b*Q}}else if(u instanceof THREE.PointLight){J.sub(u.position,L.centroidWorld);J.normalize();Q=L.normalWorld.dot(J)*u.intensity;if(Q>0){K.r+=u.color.r*Q;K.g+=u.color.g*Q;K.b+=u.color.b*Q}}}}function c(D,L,K,R,y,u){t=b(V++);t.setAttribute("d","M "+D.positionScreen.x+ -" "+D.positionScreen.y+" L "+L.positionScreen.x+" "+L.positionScreen.y+" L "+K.positionScreen.x+","+K.positionScreen.y+"z");if(y instanceof THREE.MeshBasicMaterial)m.__styleString=y.color.__styleString;else if(y instanceof THREE.MeshLambertMaterial)if(B){v.r=i.r;v.g=i.g;v.b=i.b;a(u,R,v);m.r=y.color.r*v.r;m.g=y.color.g*v.g;m.b=y.color.b*v.b;m.updateStyleString()}else m.__styleString=y.color.__styleString;else if(y instanceof THREE.MeshDepthMaterial){x=1-y.__2near/(y.__farPlusNear-R.z*y.__farMinusNear); -m.setRGB(x,x,x)}else y instanceof THREE.MeshNormalMaterial&&m.setRGB(d(R.normalWorld.x),d(R.normalWorld.y),d(R.normalWorld.z));y.wireframe?t.setAttribute("style","fill: none; stroke: "+m.__styleString+"; stroke-width: "+y.wireframe_linewidth+"; stroke-opacity: "+y.opacity+"; stroke-linecap: round; stroke-linejoin: round"):t.setAttribute("style","fill: "+m.__styleString+"; fill-opacity: "+y.opacity);r.appendChild(t)}function f(D,L,K,R,y,u,Q){t=b(V++);t.setAttribute("d","M "+D.positionScreen.x+" "+ -D.positionScreen.y+" L "+L.positionScreen.x+" "+L.positionScreen.y+" L "+K.positionScreen.x+","+K.positionScreen.y+" L "+R.positionScreen.x+","+R.positionScreen.y+"z");if(u instanceof THREE.MeshBasicMaterial)m.__styleString=u.color.__styleString;else if(u instanceof THREE.MeshLambertMaterial)if(B){v.r=i.r;v.g=i.g;v.b=i.b;a(Q,y,v);m.r=u.color.r*v.r;m.g=u.color.g*v.g;m.b=u.color.b*v.b;m.updateStyleString()}else m.__styleString=u.color.__styleString;else if(u instanceof THREE.MeshDepthMaterial){x=1- -u.__2near/(u.__farPlusNear-y.z*u.__farMinusNear);m.setRGB(x,x,x)}else u instanceof THREE.MeshNormalMaterial&&m.setRGB(d(y.normalWorld.x),d(y.normalWorld.y),d(y.normalWorld.z));u.wireframe?t.setAttribute("style","fill: none; stroke: "+m.__styleString+"; stroke-width: "+u.wireframe_linewidth+"; stroke-opacity: "+u.opacity+"; stroke-linecap: round; stroke-linejoin: round"):t.setAttribute("style","fill: "+m.__styleString+"; fill-opacity: "+u.opacity);r.appendChild(t)}function b(D){if(S[D]==null){S[D]= -document.createElementNS("http://www.w3.org/2000/svg","path");X==0&&S[D].setAttribute("shape-rendering","crispEdges");return S[D]}return S[D]}function d(D){return D<0?Math.min((1+D)*0.5,0.5):0.5+Math.min(D*0.5,0.5)}var j=null,o=new THREE.Projector,r=document.createElementNS("http://www.w3.org/2000/svg","svg"),e,g,n,h,l,q,p,s,A=new THREE.Rectangle,C=new THREE.Rectangle,B=false,m=new THREE.Color(4294967295),v=new THREE.Color(4294967295),i=new THREE.Color(4278190080),P=new THREE.Color(4278190080),M= -new THREE.Color(4278190080),x,J=new THREE.Vector3,S=[],E=[],t,V,aa,X=1;this.domElement=r;this.autoClear=true;this.setQuality=function(D){switch(D){case "high":X=1;break;case "low":X=0}};this.setSize=function(D,L){e=D;g=L;n=e/2;h=g/2;r.setAttribute("viewBox",-n+" "+-h+" "+e+" "+g);r.setAttribute("width",e);r.setAttribute("height",g);A.set(-n,-h,n,h)};this.clear=function(){for(;r.childNodes.length>0;)r.removeChild(r.childNodes[0])};this.render=function(D,L){var K,R,y,u,Q,ha,O,Y;this.autoClear&&this.clear(); -j=o.projectScene(D,L);aa=V=0;if(B=D.lights.length>0){O=D.lights;i.setRGB(0,0,0);P.setRGB(0,0,0);M.setRGB(0,0,0);K=0;for(R=O.length;K=0&&W>=0&&D>=0&&B>=0)return true;else if(K<0&&W<0||D<0&&B<0)return false;else{if(K<0)k=Math.max(k,K/(K-W));else if(W<0)T=Math.min(T,K/(K-W));if(D<0)k=Math.max(k,D/(D-B));else if(B<0)T=Math.min(T,D/(D-B));if(T0&&Q.z<1}fa=B.geometry.faces;K=0;for(W= +fa.length;K0&&r.z<1){h=i[o]=i[o]|| +new THREE.RenderableParticle;h.x=r.x/r.w;h.y=r.y/r.w;h.z=r.z;h.rotation=B.rotation.z;h.scale.x=B.scale.x*Math.abs(h.x-(r.x+s.projectionMatrix.n11)/(r.w+s.projectionMatrix.n14));h.scale.y=B.scale.y*Math.abs(h.y-(r.y+s.projectionMatrix.n22)/(r.w+s.projectionMatrix.n24));h.material=B.material;c.push(h);o++}}}c.sort(function(S,x){return x.z-S.z});return c};this.unprojectVector=function(p,s){var k=new THREE.Matrix4;k.multiply(THREE.Matrix4.makeInvert(s.matrix),THREE.Matrix4.makeInvert(s.projectionMatrix)); +k.transform(p);return p}}; +THREE.DOMRenderer=function(){THREE.Renderer.call(this);var a=null,c=new THREE.Projector,f,b,d,j;this.domElement=document.createElement("div");this.setSize=function(n,q){f=n;b=q;d=f/2;j=b/2};this.render=function(n,q){var e,g,m,h,o,i,r,w;a=c.projectScene(n,q);e=0;for(g=a.length;e0){G.r+=F.r*l;G.g+=F.g*l;G.b+=F.b*l}}else if(l instanceof THREE.PointLight){Ja.sub(l.position,O.centroidWorld);Ja.normalize();l=O.normalWorld.dot(Ja)*l.intensity;if(l>0){G.r+=F.r*l;G.g+=F.g*l;G.b+=F.b*l}}}}function c(u,O,G,H,l,F){if(l.opacity!=0){n(l.opacity);q(l.blending);M=u.positionScreen.x; +J=u.positionScreen.y;S=O.positionScreen.x;x=O.positionScreen.y;t=G.positionScreen.x;R=G.positionScreen.y;if(l.map){ea=l.map.image;na=ea.width-1;oa=ea.height-1;ca.u=H.uvs[0].u*na;ca.v=H.uvs[0].v*oa;Z.u=H.uvs[1].u*na;Z.v=H.uvs[1].v*oa;da.u=H.uvs[2].u*na;da.v=H.uvs[2].v*oa;j(ea,M,J,S,x,t,R,ca.u,ca.v,Z.u,Z.v,da.u,da.v)}else if(l instanceof THREE.MeshBasicMaterial)b(M,J,S,x,t,R,l.color,l.wireframe,l.wireframe_linewidth);else if(l instanceof THREE.MeshLambertMaterial){if(Fa){aa.r=ga.r;aa.g=ga.g;aa.b=ga.b; +a(F,H,aa);U.r=l.color.r*aa.r;U.g=l.color.g*aa.g;U.b=l.color.b*aa.b;U.updateStyleString()}else U.__styleString=l.color.__styleString;b(M,J,S,x,t,R,U,l.wireframe,l.wireframe_linewidth)}else if(l instanceof THREE.MeshDepthMaterial){pa=l.__2near;qa=l.__farPlusNear;ra=l.__farMinusNear;va=~~((1-pa/(qa-u.positionScreen.z*ra))*255);wa=~~((1-pa/(qa-O.positionScreen.z*ra))*255);ma=~~((1-pa/(qa-G.positionScreen.z*ra))*255);ea=h([va,va,va],[wa,wa,wa],[ma,ma,ma],[ma,ma,ma]);ca.u=0;ca.v=0;Z.u=ka;Z.v=0;da.u=0;da.v= +ka;j(ea,M,J,S,x,t,R,ca.u,ca.v,Z.u,Z.v,da.u,da.v)}else if(l instanceof THREE.MeshNormalMaterial){U.r=o(H.normalWorld.x);U.g=o(H.normalWorld.y);U.b=o(H.normalWorld.z);U.updateStyleString();b(M,J,S,x,t,R,U,l.wireframe,l.wireframe_linewidth)}}}function f(u,O,G,H,l,F,V,y,X){if(y.opacity!=0){n(y.opacity);q(y.blending);M=u.positionScreen.x;J=u.positionScreen.y;S=O.positionScreen.x;x=O.positionScreen.y;t=G.positionScreen.x;R=G.positionScreen.y;ha=H.positionScreen.x;P=H.positionScreen.y;Y=l.positionScreen.x; +xa=l.positionScreen.y;Ka=F.positionScreen.x;La=F.positionScreen.y;if(y.map){ea=y.map.image;na=ea.width-1;oa=ea.height-1;ca.copy(V.uvs[0]);Z.copy(V.uvs[1]);da.copy(V.uvs[2]);ia.copy(V.uvs[3]);ca.u*=na;ca.v*=oa;Z.u*=na;Z.v*=oa;da.u*=na;da.v*=oa;ia.u*=na;ia.v*=oa;j(ea,M,J,S,x,ha,P,ca.u,ca.v,Z.u,Z.v,ia.u,ia.v);j(ea,Y,xa,t,R,Ka,La,Z.u,Z.v,da.u,da.v,ia.u,ia.v)}else if(y instanceof THREE.MeshBasicMaterial)d(M,J,S,x,t,R,ha,P,y.color,y.wireframe,y.wireframe_linewidth);else if(y instanceof THREE.MeshLambertMaterial){if(Fa){aa.r= +ga.r;aa.g=ga.g;aa.b=ga.b;a(X,V,aa);U.r=y.color.r*aa.r;U.g=y.color.g*aa.g;U.b=y.color.b*aa.b;U.updateStyleString()}else U.__styleString=y.color.__styleString;d(M,J,S,x,t,R,ha,P,U,y.wireframe,y.wireframe_linewidth)}else if(y instanceof THREE.MeshDepthMaterial){pa=y.__2near;qa=y.__farPlusNear;ra=y.__farMinusNear;va=~~((1-pa/(qa-u.positionScreen.z*ra))*255);wa=~~((1-pa/(qa-O.positionScreen.z*ra))*255);ma=~~((1-pa/(qa-G.positionScreen.z*ra))*255);Ga=~~((1-pa/(qa-H.positionScreen.z*ra))*255);ea=h([va,va, +va],[wa,wa,wa],[Ga,Ga,Ga],[ma,ma,ma]);ca.u=0;ca.v=0;Z.u=ka;Z.v=0;da.u=ka;da.v=ka;ia.u=0;ia.v=ka;j(ea,M,J,S,x,ha,P,ca.u,ca.v,Z.u,Z.v,ia.u,ia.v);j(ea,Y,xa,t,R,Ka,La,Z.u,Z.v,da.u,da.v,ia.u,ia.v)}else if(y instanceof THREE.MeshNormalMaterial){U.r=o(V.normalWorld.x);U.g=o(V.normalWorld.y);U.b=o(V.normalWorld.z);U.updateStyleString();d(M,J,S,x,t,R,ha,P,U,y.wireframe,y.wireframe_linewidth)}}}function b(u,O,G,H,l,F,V,y,X){k.beginPath();k.moveTo(u,O);k.lineTo(G,H);k.lineTo(l,F);k.lineTo(u,O);k.closePath(); +if(y){e(X);g(V.__styleString);k.stroke();$.inflate(X*2)}else{m(V.__styleString);k.fill()}}function d(u,O,G,H,l,F,V,y,X,E,ba){k.beginPath();k.moveTo(u,O);k.lineTo(G,H);k.lineTo(l,F);k.lineTo(V,y);k.lineTo(u,O);k.closePath();if(E){e(ba);g(X.__styleString);k.stroke();$.inflate(ba*2)}else{m(X.__styleString);k.fill()}}function j(u,O,G,H,l,F,V,y,X,E,ba,la,sa){k.beginPath();k.moveTo(O,G);k.lineTo(H,l);k.lineTo(F,V);k.closePath();H-=O;l-=G;F-=O;V-=G;E-=y;ba-=X;la-=y;sa-=X;var ta=1/(E*sa-la*ba),Ba=(sa*H-ba* +F)*ta;ba=(sa*l-ba*V)*ta;H=(E*F-la*H)*ta;l=(E*V-la*l)*ta;O=O-Ba*y-H*X;G=G-ba*y-l*X;k.save();k.transform(Ba,ba,H,l,O,G);k.clip();k.drawImage(u,0,0);k.restore()}function n(u){if(T!=u)k.globalAlpha=T=u}function q(u){if(K!=u){switch(u){case THREE.NormalBlending:k.globalCompositeOperation="source-over";break;case THREE.AdditiveBlending:k.globalCompositeOperation="lighter";break;case THREE.SubtractiveBlending:k.globalCompositeOperation="darker"}K=u}}function e(u){if(B!=u)k.lineWidth=B=u}function g(u){if(W!= +u)k.strokeStyle=W=u}function m(u){if(D!=u)k.fillStyle=D=u}function h(u,O,G,H){ja[0]=u[0];ja[1]=u[1];ja[2]=u[2];ja[4]=O[0];ja[5]=O[1];ja[6]=O[2];ja[8]=G[0];ja[9]=G[1];ja[10]=G[2];ja[12]=H[0];ja[13]=H[1];ja[14]=H[2];Ca.putImageData(Ma,0,0);Ha.drawImage(Da,0,0);return Ea}function o(u){return u<0?Math.min((1+u)*0.5,0.5):0.5+Math.min(u*0.5,0.5)}function i(u,O){var G=O.x-u.x,H=O.y-u.y,l=1/Math.sqrt(G*G+H*H);G*=l;H*=l;O.x+=G;O.y+=H;u.x-=G;u.y-=H}var r=null,w=new THREE.Projector,A=document.createElement("canvas"), +I,N,p,s,k=A.getContext("2d"),T=1,K=0,W=null,D=null,B=1,L,v,C,Q,fa=new THREE.Vertex,z=new THREE.Vertex,M,J,S,x,t,R,ha,P,Y,xa,Ka,La,va,wa,ma,Ga,pa,qa,ra,ea,na,oa,ya=new THREE.Rectangle,ua=new THREE.Rectangle,$=new THREE.Rectangle,Fa=false,U=new THREE.Color(16777215),aa=new THREE.Color(16777215),ga=new THREE.Color(0),za=new THREE.Color(0),Aa=new THREE.Color(0),Qa=Math.PI*2,Ja=new THREE.Vector3,ca=new THREE.UV,Z=new THREE.UV,da=new THREE.UV,ia=new THREE.UV,Da,Ca,Ma,ja,Ea,Ha,ka=16;Da=document.createElement("canvas"); +Da.width=Da.height=2;Ca=Da.getContext("2d");Ca.fillStyle="rgba(0,0,0,1)";Ca.fillRect(0,0,2,2);Ma=Ca.getImageData(0,0,2,2);ja=Ma.data;Ea=document.createElement("canvas");Ea.width=Ea.height=ka;Ha=Ea.getContext("2d");Ha.translate(-ka/2,-ka/2);Ha.scale(ka,ka);ka--;this.domElement=A;this.autoClear=true;this.setSize=function(u,O){I=u;N=O;p=I/2;s=N/2;A.width=I;A.height=N;k.lineJoin="round";k.lineCap="round";ya.set(-p,-s,p,s)};this.clear=function(){if(!ua.isEmpty()){ua.inflate(1);ua.minSelf(ya);k.setTransform(1, +0,0,-1,p,s);k.clearRect(ua.getX(),ua.getY(),ua.getWidth(),ua.getHeight());ua.empty()}};this.render=function(u,O){var G,H,l,F,V,y,X,E;this.autoClear&&this.clear();r=w.projectScene(u,O);k.setTransform(1,0,0,-1,p,s);if(Fa=u.lights.length>0){V=u.lights;ga.setRGB(0,0,0);za.setRGB(0,0,0);Aa.setRGB(0,0,0);G=0;for(H=V.length;G0){J.r+=t.color.r*R;J.g+=t.color.g*R;J.b+=t.color.b*R}}else if(t instanceof THREE.PointLight){D.sub(t.position,M.centroidWorld);D.normalize();R=M.normalWorld.dot(D)*t.intensity;if(R>0){J.r+=t.color.r*R;J.g+=t.color.g*R;J.b+=t.color.b*R}}}}function c(z,M,J,S,x,t){v=b(C++);v.setAttribute("d","M "+z.positionScreen.x+ +" "+z.positionScreen.y+" L "+M.positionScreen.x+" "+M.positionScreen.y+" L "+J.positionScreen.x+","+J.positionScreen.y+"z");if(x instanceof THREE.MeshBasicMaterial)p.__styleString=x.color.__styleString;else if(x instanceof THREE.MeshLambertMaterial)if(N){s.r=k.r;s.g=k.g;s.b=k.b;a(t,S,s);p.r=x.color.r*s.r;p.g=x.color.g*s.g;p.b=x.color.b*s.b;p.updateStyleString()}else p.__styleString=x.color.__styleString;else if(x instanceof THREE.MeshDepthMaterial){W=1-x.__2near/(x.__farPlusNear-S.z*x.__farMinusNear); +p.setRGB(W,W,W)}else x instanceof THREE.MeshNormalMaterial&&p.setRGB(d(S.normalWorld.x),d(S.normalWorld.y),d(S.normalWorld.z));x.wireframe?v.setAttribute("style","fill: none; stroke: "+p.__styleString+"; stroke-width: "+x.wireframe_linewidth+"; stroke-opacity: "+x.opacity+"; stroke-linecap: round; stroke-linejoin: round"):v.setAttribute("style","fill: "+p.__styleString+"; fill-opacity: "+x.opacity);q.appendChild(v)}function f(z,M,J,S,x,t,R){v=b(C++);v.setAttribute("d","M "+z.positionScreen.x+" "+ +z.positionScreen.y+" L "+M.positionScreen.x+" "+M.positionScreen.y+" L "+J.positionScreen.x+","+J.positionScreen.y+" L "+S.positionScreen.x+","+S.positionScreen.y+"z");if(t instanceof THREE.MeshBasicMaterial)p.__styleString=t.color.__styleString;else if(t instanceof THREE.MeshLambertMaterial)if(N){s.r=k.r;s.g=k.g;s.b=k.b;a(R,x,s);p.r=t.color.r*s.r;p.g=t.color.g*s.g;p.b=t.color.b*s.b;p.updateStyleString()}else p.__styleString=t.color.__styleString;else if(t instanceof THREE.MeshDepthMaterial){W=1- +t.__2near/(t.__farPlusNear-x.z*t.__farMinusNear);p.setRGB(W,W,W)}else t instanceof THREE.MeshNormalMaterial&&p.setRGB(d(x.normalWorld.x),d(x.normalWorld.y),d(x.normalWorld.z));t.wireframe?v.setAttribute("style","fill: none; stroke: "+p.__styleString+"; stroke-width: "+t.wireframe_linewidth+"; stroke-opacity: "+t.opacity+"; stroke-linecap: round; stroke-linejoin: round"):v.setAttribute("style","fill: "+p.__styleString+"; fill-opacity: "+t.opacity);q.appendChild(v)}function b(z){if(B[z]==null){B[z]= +document.createElementNS("http://www.w3.org/2000/svg","path");fa==0&&B[z].setAttribute("shape-rendering","crispEdges");return B[z]}return B[z]}function d(z){return z<0?Math.min((1+z)*0.5,0.5):0.5+Math.min(z*0.5,0.5)}var j=null,n=new THREE.Projector,q=document.createElementNS("http://www.w3.org/2000/svg","svg"),e,g,m,h,o,i,r,w,A=new THREE.Rectangle,I=new THREE.Rectangle,N=false,p=new THREE.Color(16777215),s=new THREE.Color(16777215),k=new THREE.Color(0),T=new THREE.Color(0),K=new THREE.Color(0),W, +D=new THREE.Vector3,B=[],L=[],v,C,Q,fa=1;this.domElement=q;this.autoClear=true;this.setQuality=function(z){switch(z){case "high":fa=1;break;case "low":fa=0}};this.setSize=function(z,M){e=z;g=M;m=e/2;h=g/2;q.setAttribute("viewBox",-m+" "+-h+" "+e+" "+g);q.setAttribute("width",e);q.setAttribute("height",g);A.set(-m,-h,m,h)};this.clear=function(){for(;q.childNodes.length>0;)q.removeChild(q.childNodes[0])};this.render=function(z,M){var J,S,x,t,R,ha,P,Y;this.autoClear&&this.clear();j=n.projectScene(z, +M);Q=C=0;if(N=z.lights.length>0){P=z.lights;k.setRGB(0,0,0);T.setRGB(0,0,0);K.setRGB(0,0,0);J=0;for(S=P.length;J= 0.0 )": @@ -135,26 +136,25 @@ b.linkProgram(d);if(!b.getProgramParameter(d,b.LINK_STATUS)){alert("Could not in b.getUniformLocation(d,"pointLightPosition")}d.material=b.getUniformLocation(d,"material");d.mColor=b.getUniformLocation(d,"mColor");d.mOpacity=b.getUniformLocation(d,"mOpacity");d.mReflectivity=b.getUniformLocation(d,"mReflectivity");d.mAmbient=b.getUniformLocation(d,"mAmbient");d.mSpecular=b.getUniformLocation(d,"mSpecular");d.mShininess=b.getUniformLocation(d,"mShininess");d.enableMap=b.getUniformLocation(d,"enableMap");b.uniform1i(d.enableMap,0);d.tMap=b.getUniformLocation(d,"tMap");b.uniform1i(d.tMap, 0);d.enableCubeMap=b.getUniformLocation(d,"enableCubeMap");b.uniform1i(d.enableCubeMap,0);d.tCube=b.getUniformLocation(d,"tCube");b.uniform1i(d.tCube,1);d.mixEnvMap=b.getUniformLocation(d,"mixEnvMap");b.uniform1i(d.mixEnvMap,0);d.mRefractionRatio=b.getUniformLocation(d,"mRefractionRatio");d.useRefract=b.getUniformLocation(d,"useRefract");b.uniform1i(d.useRefract,0);d.m2Near=b.getUniformLocation(d,"m2Near");d.mFarPlusNear=b.getUniformLocation(d,"mFarPlusNear");d.mFarMinusNear=b.getUniformLocation(d, "mFarMinusNear");d.position=b.getAttribLocation(d,"position");b.enableVertexAttribArray(d.position);d.normal=b.getAttribLocation(d,"normal");b.enableVertexAttribArray(d.normal);d.uv=b.getAttribLocation(d,"uv");b.enableVertexAttribArray(d.uv);d.viewMatrixArray=new Float32Array(16);d.modelViewMatrixArray=new Float32Array(16);d.projectionMatrixArray=new Float32Array(16)})(a.directional,a.point);this.setSize=function(e,g){f.width=e;f.height=g;b.viewport(0,0,f.width,f.height)};this.clear=function(){b.clear(b.COLOR_BUFFER_BIT| -b.DEPTH_BUFFER_BIT)};this.setupLights=function(e){var g,n,h,l,q=[],p=[],s=[];l=[];var A=[];b.uniform1i(d.enableLighting,e.lights.length);g=0;for(n=e.lights.length;g0&&A>0&&h+A<1}var f,b,d,j,o,r,e,g,n,i, -l,q=a.geometry,p=q.vertices,s=[];f=0;for(b=q.faces.length;f= -0&&Math.min(d,e.getBottom())-Math.max(f,e.getTop())>=0};this.empty=function(){r=true;d=b=f=c=0;a()};this.isEmpty=function(){return r};this.toString=function(){return"THREE.Rectangle ( left: "+c+", right: "+b+", top: "+f+", bottom: "+d+", width: "+j+", height: "+o+" )"}};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.Ray.prototype={intersectScene:function(a){var c,f,b=a.objects,d=[];a=0;for(c=b.length;a0&&A>0&&i+A<1}var f,b,d,k,n,q,e,g,m,h, +o,j=a.geometry,r=j.vertices,x=[];f=0;for(b=j.faces.length;f= +0&&Math.min(d,e.getBottom())-Math.max(f,e.getTop())>=0};this.empty=function(){q=true;d=b=f=c=0;a()};this.isEmpty=function(){return q};this.toString=function(){return"THREE.Rectangle ( left: "+c+", right: "+b+", top: "+f+", bottom: "+d+", width: "+k+", height: "+n+" )"}};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(){this._x=new THREE.Vector3;this._y=new THREE.Vector3;this._z=new THREE.Vector3}; 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,c,f){var b=this._x,d=this._y,j=this._z;j.sub(a,c);j.normalize();b.cross(f,j);b.normalize();d.cross(j,b);d.normalize();this.n11=b.x;this.n12=b.y;this.n13=b.z;this.n14=-b.dot(a);this.n21=d.x;this.n22=d.y;this.n23=d.z;this.n24=-d.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},transform:function(a){var c=a.x,f=a.y,b=a.z,d=a.w?a.w:1;a.x=this.n11*c+this.n12*f+this.n13*b+this.n14* +a.n41;this.n42=a.n42;this.n43=a.n43;this.n44=a.n44},lookAt:function(a,c,f){var b=this._x,d=this._y,k=this._z;k.sub(a,c);k.normalize();b.cross(f,k);b.normalize();d.cross(k,b);d.normalize();this.n11=b.x;this.n12=b.y;this.n13=b.z;this.n14=-b.dot(a);this.n21=d.x;this.n22=d.y;this.n23=d.z;this.n24=-d.dot(a);this.n31=k.x;this.n32=k.y;this.n33=k.z;this.n34=-k.dot(a);this.n43=this.n42=this.n41=0;this.n44=1},transform:function(a){var c=a.x,f=a.y,b=a.z,d=a.w?a.w:1;a.x=this.n11*c+this.n12*f+this.n13*b+this.n14* d;a.y=this.n21*c+this.n22*f+this.n23*b+this.n24*d;a.z=this.n31*c+this.n32*f+this.n33*b+this.n34*d;d=this.n41*c+this.n42*f+this.n43*b+this.n44*d;if(a.w)a.w=d;else{a.x/=d;a.y/=d;a.z/=d}return a},crossVector:function(a){var c=new THREE.Vector4;c.x=this.n11*a.x+this.n12*a.y+this.n13*a.z+this.n14*a.w;c.y=this.n21*a.x+this.n22*a.y+this.n23*a.z+this.n24*a.w;c.z=this.n31*a.x+this.n32*a.y+this.n33*a.z+this.n34*a.w;c.w=a.w?this.n41*a.x+this.n42*a.y+this.n43*a.z+this.n44*a.w:1;return c},multiply:function(a, c){this.n11=a.n11*c.n11+a.n12*c.n21+a.n13*c.n31+a.n14*c.n41;this.n12=a.n11*c.n12+a.n12*c.n22+a.n13*c.n32+a.n14*c.n42;this.n13=a.n11*c.n13+a.n12*c.n23+a.n13*c.n33+a.n14*c.n43;this.n14=a.n11*c.n14+a.n12*c.n24+a.n13*c.n34+a.n14*c.n44;this.n21=a.n21*c.n11+a.n22*c.n21+a.n23*c.n31+a.n24*c.n41;this.n22=a.n21*c.n12+a.n22*c.n22+a.n23*c.n32+a.n24*c.n42;this.n23=a.n21*c.n13+a.n22*c.n23+a.n23*c.n33+a.n24*c.n43;this.n24=a.n21*c.n14+a.n22*c.n24+a.n23*c.n34+a.n24*c.n44;this.n31=a.n31*c.n11+a.n32*c.n21+a.n33*c.n31+ -a.n34*c.n41;this.n32=a.n31*c.n12+a.n32*c.n22+a.n33*c.n32+a.n34*c.n42;this.n33=a.n31*c.n13+a.n32*c.n23+a.n33*c.n33+a.n34*c.n43;this.n34=a.n31*c.n14+a.n32*c.n24+a.n33*c.n34+a.n34*c.n44;this.n41=a.n41*c.n11+a.n42*c.n21+a.n43*c.n31+a.n44*c.n41;this.n42=a.n41*c.n12+a.n42*c.n22+a.n43*c.n32+a.n44*c.n42;this.n43=a.n41*c.n13+a.n42*c.n23+a.n43*c.n33+a.n44*c.n43;this.n44=a.n41*c.n14+a.n42*c.n24+a.n43*c.n34+a.n44*c.n44},multiplySelf:function(a){var c=this.n11,f=this.n12,b=this.n13,d=this.n14,j=this.n21,o=this.n22, -r=this.n23,e=this.n24,g=this.n31,n=this.n32,i=this.n33,l=this.n34,q=this.n41,p=this.n42,s=this.n43,A=this.n44;this.n11=c*a.n11+f*a.n21+b*a.n31+d*a.n41;this.n12=c*a.n12+f*a.n22+b*a.n32+d*a.n42;this.n13=c*a.n13+f*a.n23+b*a.n33+d*a.n43;this.n14=c*a.n14+f*a.n24+b*a.n34+d*a.n44;this.n21=j*a.n11+o*a.n21+r*a.n31+e*a.n41;this.n22=j*a.n12+o*a.n22+r*a.n32+e*a.n42;this.n23=j*a.n13+o*a.n23+r*a.n33+e*a.n43;this.n24=j*a.n14+o*a.n24+r*a.n34+e*a.n44;this.n31=g*a.n11+n*a.n21+i*a.n31+l*a.n41;this.n32=g*a.n12+n*a.n22+ -i*a.n32+l*a.n42;this.n33=g*a.n13+n*a.n23+i*a.n33+l*a.n43;this.n34=g*a.n14+n*a.n24+i*a.n34+l*a.n44;this.n41=q*a.n11+p*a.n21+s*a.n31+A*a.n41;this.n42=q*a.n12+p*a.n22+s*a.n32+A*a.n42;this.n43=q*a.n13+p*a.n23+s*a.n33+A*a.n43;this.n44=q*a.n14+p*a.n24+s*a.n34+A*a.n44},multiplyScalar:function(a){this.n11*=a;this.n12*=a;this.n13*=a;this.n14*=a;this.n21*=a;this.n22*=a;this.n23*=a;this.n24*=a;this.n31*=a;this.n32*=a;this.n33*=a;this.n34*=a;this.n41*=a;this.n42*=a;this.n43*=a;this.n44*=a},determinant:function(){return this.n14* +a.n34*c.n41;this.n32=a.n31*c.n12+a.n32*c.n22+a.n33*c.n32+a.n34*c.n42;this.n33=a.n31*c.n13+a.n32*c.n23+a.n33*c.n33+a.n34*c.n43;this.n34=a.n31*c.n14+a.n32*c.n24+a.n33*c.n34+a.n34*c.n44;this.n41=a.n41*c.n11+a.n42*c.n21+a.n43*c.n31+a.n44*c.n41;this.n42=a.n41*c.n12+a.n42*c.n22+a.n43*c.n32+a.n44*c.n42;this.n43=a.n41*c.n13+a.n42*c.n23+a.n43*c.n33+a.n44*c.n43;this.n44=a.n41*c.n14+a.n42*c.n24+a.n43*c.n34+a.n44*c.n44},multiplySelf:function(a){var c=this.n11,f=this.n12,b=this.n13,d=this.n14,k=this.n21,n=this.n22, +q=this.n23,e=this.n24,g=this.n31,m=this.n32,h=this.n33,o=this.n34,j=this.n41,r=this.n42,x=this.n43,A=this.n44;this.n11=c*a.n11+f*a.n21+b*a.n31+d*a.n41;this.n12=c*a.n12+f*a.n22+b*a.n32+d*a.n42;this.n13=c*a.n13+f*a.n23+b*a.n33+d*a.n43;this.n14=c*a.n14+f*a.n24+b*a.n34+d*a.n44;this.n21=k*a.n11+n*a.n21+q*a.n31+e*a.n41;this.n22=k*a.n12+n*a.n22+q*a.n32+e*a.n42;this.n23=k*a.n13+n*a.n23+q*a.n33+e*a.n43;this.n24=k*a.n14+n*a.n24+q*a.n34+e*a.n44;this.n31=g*a.n11+m*a.n21+h*a.n31+o*a.n41;this.n32=g*a.n12+m*a.n22+ +h*a.n32+o*a.n42;this.n33=g*a.n13+m*a.n23+h*a.n33+o*a.n43;this.n34=g*a.n14+m*a.n24+h*a.n34+o*a.n44;this.n41=j*a.n11+r*a.n21+x*a.n31+A*a.n41;this.n42=j*a.n12+r*a.n22+x*a.n32+A*a.n42;this.n43=j*a.n13+r*a.n23+x*a.n33+A*a.n43;this.n44=j*a.n14+r*a.n24+x*a.n34+A*a.n44},multiplyScalar:function(a){this.n11*=a;this.n12*=a;this.n13*=a;this.n14*=a;this.n21*=a;this.n22*=a;this.n23*=a;this.n24*=a;this.n31*=a;this.n32*=a;this.n33*=a;this.n34*=a;this.n41*=a;this.n42*=a;this.n43*=a;this.n44*=a},determinant:function(){return this.n14* this.n23*this.n32*this.n41-this.n13*this.n24*this.n32*this.n41-this.n14*this.n22*this.n33*this.n41+this.n12*this.n24*this.n33*this.n41+this.n13*this.n22*this.n34*this.n41-this.n12*this.n23*this.n34*this.n41-this.n14*this.n23*this.n31*this.n42+this.n13*this.n24*this.n31*this.n42+this.n14*this.n21*this.n33*this.n42-this.n11*this.n24*this.n33*this.n42-this.n13*this.n21*this.n34*this.n42+this.n11*this.n23*this.n34*this.n42+this.n14*this.n22*this.n31*this.n43-this.n12*this.n24*this.n31*this.n43-this.n14* this.n21*this.n32*this.n43+this.n11*this.n24*this.n32*this.n43+this.n12*this.n21*this.n34*this.n43-this.n11*this.n22*this.n34*this.n43-this.n13*this.n22*this.n31*this.n44+this.n12*this.n23*this.n31*this.n44+this.n13*this.n21*this.n32*this.n44-this.n11*this.n23*this.n32*this.n44-this.n12*this.n21*this.n33*this.n44+this.n11*this.n22*this.n33*this.n44},transpose:function(){function a(c,f,b){var d=c[f];c[f]=c[b];c[b]=d}a(this,"n21","n12");a(this,"n31","n13");a(this,"n32","n23");a(this,"n41","n14");a(this, "n42","n24");a(this,"n43","n34");return this},clone:function(){var a=new THREE.Matrix4;a.n11=this.n11;a.n12=this.n12;a.n13=this.n13;a.n14=this.n14;a.n21=this.n21;a.n22=this.n22;a.n23=this.n23;a.n24=this.n24;a.n31=this.n31;a.n32=this.n32;a.n33=this.n33;a.n34=this.n34;a.n41=this.n41;a.n42=this.n42;a.n43=this.n43;a.n44=this.n44;return a},flatten:function(){return[this.n11,this.n21,this.n31,this.n41,this.n12,this.n22,this.n32,this.n42,this.n13,this.n23,this.n33,this.n43,this.n14,this.n24,this.n34,this.n44]}, toString:function(){return"| "+this.n11+" "+this.n12+" "+this.n13+" "+this.n14+" |\n| "+this.n21+" "+this.n22+" "+this.n23+" "+this.n24+" |\n| "+this.n31+" "+this.n32+" "+this.n33+" "+this.n34+" |\n| "+this.n41+" "+this.n42+" "+this.n43+" "+this.n44+" |"}};THREE.Matrix4.translationMatrix=function(a,c,f){var b=new THREE.Matrix4;b.n14=a;b.n24=c;b.n34=f;return b};THREE.Matrix4.scaleMatrix=function(a,c,f){var b=new THREE.Matrix4;b.n11=a;b.n22=c;b.n33=f;return b}; THREE.Matrix4.rotationXMatrix=function(a){var c=new THREE.Matrix4;c.n22=c.n33=Math.cos(a);c.n32=Math.sin(a);c.n23=-c.n32;return c};THREE.Matrix4.rotationYMatrix=function(a){var c=new THREE.Matrix4;c.n11=c.n33=Math.cos(a);c.n13=Math.sin(a);c.n31=-c.n13;return c};THREE.Matrix4.rotationZMatrix=function(a){var c=new THREE.Matrix4;c.n11=c.n22=Math.cos(a);c.n21=Math.sin(a);c.n12=-c.n21;return c}; -THREE.Matrix4.rotationAxisAngleMatrix=function(a,c){var f=new THREE.Matrix4,b=Math.cos(c),d=Math.sin(c),j=1-b,o=a.x,r=a.y,e=a.z;f.n11=j*o*o+b;f.n12=j*o*r-d*e;f.n13=j*o*e+d*r;f.n21=j*o*r+d*e;f.n22=j*r*r+b;f.n23=j*r*e-d*o;f.n31=j*o*e-d*r;f.n32=j*r*e+d*o;f.n33=j*e*e+b;return f}; +THREE.Matrix4.rotationAxisAngleMatrix=function(a,c){var f=new THREE.Matrix4,b=Math.cos(c),d=Math.sin(c),k=1-b,n=a.x,q=a.y,e=a.z;f.n11=k*n*n+b;f.n12=k*n*q-d*e;f.n13=k*n*e+d*q;f.n21=k*n*q+d*e;f.n22=k*q*q+b;f.n23=k*q*e-d*n;f.n31=k*n*e-d*q;f.n32=k*q*e+d*n;f.n33=k*e*e+b;return f}; THREE.Matrix4.makeInvert=function(a){var c=new THREE.Matrix4;c.n11=a.n23*a.n34*a.n42-a.n24*a.n33*a.n42+a.n24*a.n32*a.n43-a.n22*a.n34*a.n43-a.n23*a.n32*a.n44+a.n22*a.n33*a.n44;c.n12=a.n14*a.n33*a.n42-a.n13*a.n34*a.n42-a.n14*a.n32*a.n43+a.n12*a.n34*a.n43+a.n13*a.n32*a.n44-a.n12*a.n33*a.n44;c.n13=a.n13*a.n24*a.n42-a.n14*a.n23*a.n42+a.n14*a.n22*a.n43-a.n12*a.n24*a.n43-a.n13*a.n22*a.n44+a.n12*a.n23*a.n44;c.n14=a.n14*a.n23*a.n32-a.n13*a.n24*a.n32-a.n14*a.n22*a.n33+a.n12*a.n24*a.n33+a.n13*a.n22*a.n34-a.n12* a.n23*a.n34;c.n21=a.n24*a.n33*a.n41-a.n23*a.n34*a.n41-a.n24*a.n31*a.n43+a.n21*a.n34*a.n43+a.n23*a.n31*a.n44-a.n21*a.n33*a.n44;c.n22=a.n13*a.n34*a.n41-a.n14*a.n33*a.n41+a.n14*a.n31*a.n43-a.n11*a.n34*a.n43-a.n13*a.n31*a.n44+a.n11*a.n33*a.n44;c.n23=a.n14*a.n23*a.n41-a.n13*a.n24*a.n41-a.n14*a.n21*a.n43+a.n11*a.n24*a.n43+a.n13*a.n21*a.n44-a.n11*a.n23*a.n44;c.n24=a.n13*a.n24*a.n31-a.n14*a.n23*a.n31+a.n14*a.n21*a.n33-a.n11*a.n24*a.n33-a.n13*a.n21*a.n34+a.n11*a.n23*a.n34;c.n31=a.n22*a.n34*a.n41-a.n24*a.n32* a.n41+a.n24*a.n31*a.n42-a.n21*a.n34*a.n42-a.n22*a.n31*a.n44+a.n21*a.n32*a.n44;c.n32=a.n14*a.n32*a.n41-a.n12*a.n34*a.n41-a.n14*a.n31*a.n42+a.n11*a.n34*a.n42+a.n12*a.n31*a.n44-a.n11*a.n32*a.n44;c.n33=a.n13*a.n24*a.n41-a.n14*a.n22*a.n41+a.n14*a.n21*a.n42-a.n11*a.n24*a.n42-a.n12*a.n21*a.n44+a.n11*a.n22*a.n44;c.n34=a.n14*a.n22*a.n31-a.n12*a.n24*a.n31-a.n14*a.n21*a.n32+a.n11*a.n24*a.n32+a.n12*a.n21*a.n34-a.n11*a.n22*a.n34;c.n41=a.n23*a.n32*a.n41-a.n22*a.n33*a.n41-a.n23*a.n31*a.n42+a.n21*a.n33*a.n42+a.n22* a.n31*a.n43-a.n21*a.n32*a.n43;c.n42=a.n12*a.n33*a.n41-a.n13*a.n32*a.n41+a.n13*a.n31*a.n42-a.n11*a.n33*a.n42-a.n12*a.n31*a.n43+a.n11*a.n32*a.n43;c.n43=a.n13*a.n22*a.n41-a.n12*a.n23*a.n41-a.n13*a.n21*a.n42+a.n11*a.n23*a.n42+a.n12*a.n21*a.n43-a.n11*a.n22*a.n43;c.n44=a.n12*a.n23*a.n31-a.n13*a.n22*a.n31+a.n13*a.n21*a.n32-a.n11*a.n23*a.n32-a.n12*a.n21*a.n33+a.n11*a.n22*a.n33;c.multiplyScalar(1/a.determinant());return c}; -THREE.Matrix4.makeInvert3x3=function(a){var c=a.flatten();a=new THREE.Matrix3;var f=c[10]*c[5]-c[6]*c[9],b=-c[10]*c[1]+c[2]*c[9],d=c[6]*c[1]-c[2]*c[5],j=-c[10]*c[4]+c[6]*c[8],o=c[10]*c[0]-c[2]*c[8],r=-c[6]*c[0]+c[2]*c[4],e=c[9]*c[4]-c[5]*c[8],g=-c[9]*c[0]+c[1]*c[8],n=c[5]*c[0]-c[1]*c[4];c=c[0]*f+c[1]*j+c[2]*e;if(c==0)throw"matrix not invertible";c=1/c;a.m[0]=c*f;a.m[1]=c*b;a.m[2]=c*d;a.m[3]=c*j;a.m[4]=c*o;a.m[5]=c*r;a.m[6]=c*e;a.m[7]=c*g;a.m[8]=c*n;return a}; -THREE.Matrix4.makeFrustum=function(a,c,f,b,d,j){var o,r,e;o=new THREE.Matrix4;r=2*d/(c-a);e=2*d/(b-f);a=(c+a)/(c-a);f=(b+f)/(b-f);b=-(j+d)/(j-d);d=-2*j*d/(j-d);o.n11=r;o.n12=0;o.n13=a;o.n14=0;o.n21=0;o.n22=e;o.n23=f;o.n24=0;o.n31=0;o.n32=0;o.n33=b;o.n34=d;o.n41=0;o.n42=0;o.n43=-1;o.n44=0;return o};THREE.Matrix4.makePerspective=function(a,c,f,b){var d;a=f*Math.tan(a*Math.PI/360);d=-a;return THREE.Matrix4.makeFrustum(d*c,a*c,d,a,f,b)}; -THREE.Matrix4.makeOrtho=function(a,c,f,b,d,j){var o,r,e,g;o=new THREE.Matrix4;r=c-a;e=f-b;g=j-d;a=(c+a)/r;f=(f+b)/e;d=(j+d)/g;o.n11=2/r;o.n12=0;o.n13=0;o.n14=-a;o.n21=0;o.n22=2/e;o.n23=0;o.n24=-f;o.n31=0;o.n32=0;o.n33=-2/g;o.n34=-d;o.n41=0;o.n42=0;o.n43=0;o.n44=1;return o}; +THREE.Matrix4.makeInvert3x3=function(a){var c=a.flatten();a=new THREE.Matrix3;var f=c[10]*c[5]-c[6]*c[9],b=-c[10]*c[1]+c[2]*c[9],d=c[6]*c[1]-c[2]*c[5],k=-c[10]*c[4]+c[6]*c[8],n=c[10]*c[0]-c[2]*c[8],q=-c[6]*c[0]+c[2]*c[4],e=c[9]*c[4]-c[5]*c[8],g=-c[9]*c[0]+c[1]*c[8],m=c[5]*c[0]-c[1]*c[4];c=c[0]*f+c[1]*k+c[2]*e;if(c==0)throw"matrix not invertible";c=1/c;a.m[0]=c*f;a.m[1]=c*b;a.m[2]=c*d;a.m[3]=c*k;a.m[4]=c*n;a.m[5]=c*q;a.m[6]=c*e;a.m[7]=c*g;a.m[8]=c*m;return a}; +THREE.Matrix4.makeFrustum=function(a,c,f,b,d,k){var n,q,e;n=new THREE.Matrix4;q=2*d/(c-a);e=2*d/(b-f);a=(c+a)/(c-a);f=(b+f)/(b-f);b=-(k+d)/(k-d);d=-2*k*d/(k-d);n.n11=q;n.n12=0;n.n13=a;n.n14=0;n.n21=0;n.n22=e;n.n23=f;n.n24=0;n.n31=0;n.n32=0;n.n33=b;n.n34=d;n.n41=0;n.n42=0;n.n43=-1;n.n44=0;return n};THREE.Matrix4.makePerspective=function(a,c,f,b){var d;a=f*Math.tan(a*Math.PI/360);d=-a;return THREE.Matrix4.makeFrustum(d*c,a*c,d,a,f,b)}; +THREE.Matrix4.makeOrtho=function(a,c,f,b,d,k){var n,q,e,g;n=new THREE.Matrix4;q=c-a;e=f-b;g=k-d;a=(c+a)/q;f=(f+b)/e;d=(k+d)/g;n.n11=2/q;n.n12=0;n.n13=0;n.n14=-a;n.n21=0;n.n22=2/e;n.n23=0;n.n24=-f;n.n31=0;n.n32=0;n.n33=-2/g;n.n34=-d;n.n41=0;n.n42=0;n.n43=0;n.n44=1;return n}; THREE.Vertex=function(a,c){this.position=a||new THREE.Vector3;this.positionWorld=new THREE.Vector3;this.positionScreen=new THREE.Vector4;this.normal=c||new THREE.Vector3;this.normalWorld=new THREE.Vector3;this.normalScreen=new THREE.Vector3;this.__visible=true};THREE.Vertex.prototype={toString:function(){return"THREE.Vertex ( position: "+this.position+", normal: "+this.normal+" )"}}; THREE.Face3=function(a,c,f,b,d){this.a=a;this.b=c;this.c=f;this.centroid=new THREE.Vector3;this.normal=b instanceof THREE.Vector3?b:new THREE.Vector3;this.vertexNormals=b instanceof Array?b:[];this.material=d instanceof Array?d:[d]};THREE.Face3.prototype={toString:function(){return"THREE.Face3 ( "+this.a+", "+this.b+", "+this.c+" )"}}; -THREE.Face4=function(a,c,f,b,d,j){this.a=a;this.b=c;this.c=f;this.d=b;this.centroid=new THREE.Vector3;this.normal=d instanceof THREE.Vector3?d:new THREE.Vector3;this.vertexNormals=d instanceof Array?d:[];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,c){this.u=a||0;this.v=c||0}; +THREE.Face4=function(a,c,f,b,d,k){this.a=a;this.b=c;this.c=f;this.d=b;this.centroid=new THREE.Vector3;this.normal=d instanceof THREE.Vector3?d:new THREE.Vector3;this.vertexNormals=d instanceof Array?d:[];this.material=k instanceof Array?k:[k]};THREE.Face4.prototype={toString:function(){return"THREE.Face4 ( "+this.a+", "+this.b+", "+this.c+" "+this.d+" )"}};THREE.UV=function(a,c){this.u=a||0;this.v=c||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,c,f;a=0;for(c=this.faces.length;a0){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,c=this.vertices.length;a +f.centroid.addSelf(this.vertices[f.d].position);f.centroid.divideScalar(4)}}},computeNormals:function(a){var c,f,b,d,k,n,q=new THREE.Vector3,e=new THREE.Vector3;b=0;for(d=this.vertices.length;b0){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,c=this.vertices.length;a this.bbox.x[1])this.bbox.x[1]=vertex.position.x;if(vertex.position.ythis.bbox.y[1])this.bbox.y[1]=vertex.position.y;if(vertex.position.zthis.bbox.z[1])this.bbox.z[1]=vertex.position.z}}},toString:function(){return"THREE.Geometry ( vertices: "+this.vertices+", faces: "+this.faces+" )"}}; THREE.Camera=function(a,c,f,b){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,c,f,b);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(-16777216|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,c){THREE.Light.call(this,a);this.position=new THREE.Vector3(0,1,0);this.intensity=c||1};THREE.DirectionalLight.prototype=new THREE.Light;THREE.DirectionalLight.prototype.constructor=THREE.DirectionalLight; @@ -53,8 +53,8 @@ THREE.Object3D=function(){this.position=new THREE.Vector3;this.rotation=new THRE this.matrixRotation.multiplySelf(THREE.Matrix4.rotationYMatrix(this.rotation.y));this.matrixRotation.multiplySelf(THREE.Matrix4.rotationZMatrix(this.rotation.z));this.matrixScale=THREE.Matrix4.scaleMatrix(this.scale.x,this.scale.y,this.scale.z);this.matrix.copy(this.matrixPosition);this.matrix.multiplySelf(this.matrixRotation);this.matrix.multiplySelf(this.matrixScale)}};THREE.Particle=function(a){THREE.Object3D.call(this);this.material=a instanceof Array?a:[a];this.autoUpdateMatrix=false}; THREE.Particle.prototype=new THREE.Object3D;THREE.Particle.prototype.constructor=THREE.Particle;THREE.Line=function(a,c){THREE.Object3D.call(this);this.geometry=a;this.material=c instanceof Array?c:[c]};THREE.Line.prototype=new THREE.Object3D;THREE.Line.prototype.constructor=THREE.Line; THREE.Mesh=function(a,c,f){THREE.Object3D.call(this);this.geometry=a;this.material=c instanceof Array?c:[c];this.overdraw=this.doubleSided=this.flipSided=false;this.materialFaceGroup={};this.sortFacesByMaterial();f&&this.normalizeUVs();this.geometry.computeBoundingBox()};THREE.Mesh.prototype=new THREE.Object3D;THREE.Mesh.prototype.constructor=THREE.Mesh; -THREE.Mesh.prototype.sortFacesByMaterial=function(){function a(n){var i=[];c=0;for(f=n.length;c65535){g[r].counter+=1;e=g[r].hash+"_"+g[r].counter;if(this.materialFaceGroup[e]==undefined)this.materialFaceGroup[e]={faces:[],material:o,vertices:0}}this.materialFaceGroup[e].faces.push(b);this.materialFaceGroup[e].vertices+=j}};THREE.Mesh.prototype.normalizeUVs=function(){var a,c,f,b,d;a=0;for(c=this.geometry.uvs.length;a65535){g[q].counter+=1;e=g[q].hash+"_"+g[q].counter;if(this.materialFaceGroup[e]==undefined)this.materialFaceGroup[e]={faces:[],material:n,vertices:0}}this.materialFaceGroup[e].faces.push(b);this.materialFaceGroup[e].vertices+=k}};THREE.Mesh.prototype.normalizeUVs=function(){var a,c,f,b,d;a=0;for(c=this.geometry.uvs.length;acolor: "+this.color+"
opacity: "+this.opacity+"
blending: "+this.blending+"
linewidth: "+ this.linewidth+"
)"}}; @@ -74,52 +74,53 @@ THREE.MeshCubeMaterial=function(a){this.id=THREE.MeshCubeMaterial.value++;this.e THREE.ParticleBasicMaterial=function(a){this.color=new THREE.Color(16711680);this.map=null;this.opacity=1;this.blending=THREE.NormalBlending;this.offset=new THREE.Vector2;if(a){a.color!==undefined&&this.color.setHex(a.color);if(a.map!==undefined)this.map=a.map;if(a.opacity!==undefined)this.opacity=a.opacity;if(a.blending!==undefined)this.blending=a.blending}this.toString=function(){return"THREE.ParticleBasicMaterial (
color: "+this.color+"
map: "+this.map+"
opacity: "+this.opacity+"
blending: "+ this.blending+"
)"}};THREE.ParticleCircleMaterial=function(a){this.color=new THREE.Color(16711680);this.opacity=1;this.blending=THREE.NormalBlending;if(a){a.color!==undefined&&this.color.setHex(a.color);if(a.opacity!==undefined)this.opacity=a.opacity;if(a.blending!==undefined)this.blending=a.blending}this.toString=function(){return"THREE.ParticleCircleMaterial (
color: "+this.color+"
opacity: "+this.opacity+"
blending: "+this.blending+"
)"}}; THREE.ParticleDOMMaterial=function(a){this.domElement=a;this.toString=function(){return"THREE.ParticleDOMMaterial ( domElement: "+this.domElement+" )"}};THREE.Texture=function(a,c){this.image=a;this.mapping=c!==undefined?c:THREE.UVMapping;this.toString=function(){return"THREE.Texture (
image: "+this.image+"
mapping: "+this.mapping+"
)"}};THREE.UVMapping=0;THREE.ReflectionMap=1;THREE.RefractionMap=2;THREE.Multiply=0;THREE.Mix=1; -THREE.TextureCube=function(a,c){this.image=a;this.mapping=c?c:THREE.ReflectionMap;this.toString=function(){return"THREE.TextureCube (
image: "+this.image+"
mapping: "+this.mapping+"
)"}};THREE.loadImageArray=function(a){var c,f=[];for(c=f.loadCount=0;cimage: "+this.image+"
mapping: "+this.mapping+"
)"}}; 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(C,B){var m;m=0;var w=1,h=C.z+C.w,P=B.z+B.w,M=-C.z+C.w,y=-B.z+B.w;if(h>=0&&P>=0&&M>=0&&y>=0)m=true;else if(h<0&&P<0||M<0&&y<0)m=false;else{if(h<0)m=Math.max(m,h/(h-P));else if(P<0)w=Math.min(w,h/(h-P));if(M<0)m=Math.max(m,M/(M-y));else if(y<0)w=Math.min(w,M/(M-y));if(w0&&t.z<1}E=y.geometry.faces;h=0;for(P=E.length;h< -P;h++){t=E[h];if(t instanceof THREE.Face3){X=S[t.a];D=S[t.b];L=S[t.c];if(X.__visible&&D.__visible&&L.__visible)if(y.doubleSided||y.flipSided!=(L.positionScreen.x-X.positionScreen.x)*(D.positionScreen.y-X.positionScreen.y)-(L.positionScreen.y-X.positionScreen.y)*(D.positionScreen.x-X.positionScreen.x)<0){f=d[b]=d[b]||new THREE.RenderableFace3;f.v1.positionScreen.copy(X.positionScreen);f.v2.positionScreen.copy(D.positionScreen);f.v3.positionScreen.copy(L.positionScreen);f.normalWorld.copy(t.normal); -y.matrixRotation.transform(f.normalWorld);f.centroidWorld.copy(t.centroid);J.transform(f.centroidWorld);f.centroidScreen.copy(f.centroidWorld);s.transform(f.centroidScreen);f.z=f.centroidScreen.z;f.meshMaterial=y.material;f.faceMaterial=t.material;f.overdraw=y.overdraw;f.uvs=y.geometry.uvs[h];f.color=t.color;c.push(f);b++}}else if(t instanceof THREE.Face4){X=S[t.a];D=S[t.b];L=S[t.c];K=S[t.d];if(X.__visible&&D.__visible&&L.__visible&&K.__visible)if(y.doubleSided||y.flipSided!=((K.positionScreen.x- -X.positionScreen.x)*(D.positionScreen.y-X.positionScreen.y)-(K.positionScreen.y-X.positionScreen.y)*(D.positionScreen.x-X.positionScreen.x)<0||(D.positionScreen.x-L.positionScreen.x)*(K.positionScreen.y-L.positionScreen.y)-(D.positionScreen.y-L.positionScreen.y)*(K.positionScreen.x-L.positionScreen.x)<0)){j=r[o]=r[o]||new THREE.RenderableFace4;j.v1.positionScreen.copy(X.positionScreen);j.v2.positionScreen.copy(D.positionScreen);j.v3.positionScreen.copy(L.positionScreen);j.v4.positionScreen.copy(K.positionScreen); -j.normalWorld.copy(t.normal);y.matrixRotation.transform(j.normalWorld);j.centroidWorld.copy(t.centroid);J.transform(j.centroidWorld);j.centroidScreen.copy(j.centroidWorld);s.transform(j.centroidScreen);j.z=j.centroidScreen.z;j.meshMaterial=y.material;j.faceMaterial=t.material;j.overdraw=y.overdraw;j.uvs=y.geometry.uvs[h];j.color=t.color;c.push(j);o++}}}}else if(y instanceof THREE.Line){A.multiply(s,J);S=y.geometry.vertices;h=0;for(P=S.length;h0&&p.z<1){i=q[l]=q[l]||new THREE.RenderableParticle;i.x=p.x/p.w;i.y=p.y/p.w; -i.z=p.z;i.rotation=y.rotation.z;i.scale.x=y.scale.x*Math.abs(i.x-(p.x+B.projectionMatrix.n11)/(p.w+B.projectionMatrix.n14));i.scale.y=y.scale.y*Math.abs(i.y-(p.y+B.projectionMatrix.n22)/(p.w+B.projectionMatrix.n24));i.material=y.material;c.push(i);l++}}}c.sort(function(R,z){return z.z-R.z});return c};this.unprojectVector=function(C,B){var m=new THREE.Matrix4;m.multiply(THREE.Matrix4.makeInvert(B.matrix),THREE.Matrix4.makeInvert(B.projectionMatrix));m.transform(C);return C}}; -THREE.DOMRenderer=function(){THREE.Renderer.call(this);var a=null,c=new THREE.Projector,f,b,d,j;this.domElement=document.createElement("div");this.setSize=function(o,r){f=o;b=r;d=f/2;j=b/2};this.render=function(o,r){var e,g,n,i,l,q,p,s;a=c.projectScene(o,r);e=0;for(g=a.length;e0){H.r+=G.r*k;H.g+=G.g*k;H.b+=G.b*k}}else if(k instanceof THREE.PointLight){Ja.sub(k.position,N.centroidWorld);Ja.normalize();k=N.normalWorld.dot(Ja)*k.intensity;if(k>0){H.r+=G.r*k;H.g+=G.g*k;H.b+=G.b*k}}}}function c(x,N,H,I,k,G){if(k.opacity!=0){o(k.opacity);r(k.blending);L=x.positionScreen.x; -K=x.positionScreen.y;R=N.positionScreen.x;z=N.positionScreen.y;v=H.positionScreen.x;Q=H.positionScreen.y;if(k.map){fa=k.map.image;pa=fa.width-1;qa=fa.height-1;da.u=I.uvs[0].u*pa;da.v=I.uvs[0].v*qa;Z.u=I.uvs[1].u*pa;Z.v=I.uvs[1].v*qa;ea.u=I.uvs[2].u*pa;ea.v=I.uvs[2].v*qa;j(fa,L,K,R,z,v,Q,da.u,da.v,Z.u,Z.v,ea.u,ea.v)}else if(k instanceof THREE.MeshBasicMaterial)b(L,K,R,z,v,Q,k.color,k.wireframe,k.wireframe_linewidth);else if(k instanceof THREE.MeshLambertMaterial){if(Fa){ba.r=ga.r;ba.g=ga.g;ba.b=ga.b; -a(G,I,ba);T.r=k.color.r*ba.r;T.g=k.color.g*ba.g;T.b=k.color.b*ba.b;T.updateStyleString()}else T.__styleString=k.color.__styleString;b(L,K,R,z,v,Q,T,k.wireframe,k.wireframe_linewidth)}else if(k instanceof THREE.MeshDepthMaterial){ra=k.__2near;sa=k.__farPlusNear;ta=k.__farMinusNear;wa=~~((1-ra/(sa-x.positionScreen.z*ta))*255);xa=~~((1-ra/(sa-N.positionScreen.z*ta))*255);na=~~((1-ra/(sa-H.positionScreen.z*ta))*255);fa=i([wa,wa,wa],[xa,xa,xa],[na,na,na],[na,na,na]);da.u=0;da.v=0;Z.u=la;Z.v=0;ea.u=0;ea.v= -la;j(fa,L,K,R,z,v,Q,da.u,da.v,Z.u,Z.v,ea.u,ea.v)}else if(k instanceof THREE.MeshNormalMaterial){T.r=l(I.normalWorld.x);T.g=l(I.normalWorld.y);T.b=l(I.normalWorld.z);T.updateStyleString();b(L,K,R,z,v,Q,T,k.wireframe,k.wireframe_linewidth)}}}function f(x,N,H,I,k,G,U,u,W){if(u.opacity!=0){o(u.opacity);r(u.blending);L=x.positionScreen.x;K=x.positionScreen.y;R=N.positionScreen.x;z=N.positionScreen.y;v=H.positionScreen.x;Q=H.positionScreen.y;ha=I.positionScreen.x;O=I.positionScreen.y;Y=k.positionScreen.x; -ya=k.positionScreen.y;Ka=G.positionScreen.x;La=G.positionScreen.y;if(u.map){fa=u.map.image;pa=fa.width-1;qa=fa.height-1;da.copy(U.uvs[0]);Z.copy(U.uvs[1]);ea.copy(U.uvs[2]);ia.copy(U.uvs[3]);da.u*=pa;da.v*=qa;Z.u*=pa;Z.v*=qa;ea.u*=pa;ea.v*=qa;ia.u*=pa;ia.v*=qa;j(fa,L,K,R,z,ha,O,da.u,da.v,Z.u,Z.v,ia.u,ia.v);j(fa,Y,ya,v,Q,Ka,La,Z.u,Z.v,ea.u,ea.v,ia.u,ia.v)}else if(u instanceof THREE.MeshBasicMaterial)d(L,K,R,z,v,Q,ha,O,u.color,u.wireframe,u.wireframe_linewidth);else if(u instanceof THREE.MeshLambertMaterial){if(Fa){ba.r= -ga.r;ba.g=ga.g;ba.b=ga.b;a(W,U,ba);T.r=u.color.r*ba.r;T.g=u.color.g*ba.g;T.b=u.color.b*ba.b;T.updateStyleString()}else T.__styleString=u.color.__styleString;d(L,K,R,z,v,Q,ha,O,T,u.wireframe,u.wireframe_linewidth)}else if(u instanceof THREE.MeshDepthMaterial){ra=u.__2near;sa=u.__farPlusNear;ta=u.__farMinusNear;wa=~~((1-ra/(sa-x.positionScreen.z*ta))*255);xa=~~((1-ra/(sa-N.positionScreen.z*ta))*255);na=~~((1-ra/(sa-H.positionScreen.z*ta))*255);Ga=~~((1-ra/(sa-I.positionScreen.z*ta))*255);fa=i([wa,wa, -wa],[xa,xa,xa],[Ga,Ga,Ga],[na,na,na]);da.u=0;da.v=0;Z.u=la;Z.v=0;ea.u=la;ea.v=la;ia.u=0;ia.v=la;j(fa,L,K,R,z,ha,O,da.u,da.v,Z.u,Z.v,ia.u,ia.v);j(fa,Y,ya,v,Q,Ka,La,Z.u,Z.v,ea.u,ea.v,ia.u,ia.v)}else if(u instanceof THREE.MeshNormalMaterial){T.r=l(U.normalWorld.x);T.g=l(U.normalWorld.y);T.b=l(U.normalWorld.z);T.updateStyleString();d(L,K,R,z,v,Q,ha,O,T,u.wireframe,u.wireframe_linewidth)}}}function b(x,N,H,I,k,G,U,u,W){h.beginPath();h.moveTo(x,N);h.lineTo(H,I);h.lineTo(k,G);h.lineTo(x,N);h.closePath(); -if(u){e(W);g(U.__styleString);h.stroke();$.inflate(W*2)}else{n(U.__styleString);h.fill()}}function d(x,N,H,I,k,G,U,u,W,F,ca){h.beginPath();h.moveTo(x,N);h.lineTo(H,I);h.lineTo(k,G);h.lineTo(U,u);h.lineTo(x,N);h.closePath();if(F){e(ca);g(W.__styleString);h.stroke();$.inflate(ca*2)}else{n(W.__styleString);h.fill()}}function j(x,N,H,I,k,G,U,u,W,F,ca,ma,ua){h.beginPath();h.moveTo(N,H);h.lineTo(I,k);h.lineTo(G,U);h.closePath();I-=N;k-=H;G-=N;U-=H;F-=u;ca-=W;ma-=u;ua-=W;var va=1/(F*ua-ma*ca),Ba=(ua*I-ca* -G)*va;ca=(ua*k-ca*U)*va;I=(F*G-ma*I)*va;k=(F*U-ma*k)*va;N=N-Ba*u-I*W;H=H-ca*u-k*W;h.save();h.transform(Ba,ca,I,k,N,H);h.clip();h.drawImage(x,0,0);h.restore()}function o(x){if(P!=x)h.globalAlpha=P=x}function r(x){if(M!=x){switch(x){case THREE.NormalBlending:h.globalCompositeOperation="source-over";break;case THREE.AdditiveBlending:h.globalCompositeOperation="lighter";break;case THREE.SubtractiveBlending:h.globalCompositeOperation="darker"}M=x}}function e(x){if(S!=x)h.lineWidth=S=x}function g(x){if(y!= -x)h.strokeStyle=y=x}function n(x){if(J!=x)h.fillStyle=J=x}function i(x,N,H,I){ja[0]=x[0];ja[1]=x[1];ja[2]=x[2];ja[4]=N[0];ja[5]=N[1];ja[6]=N[2];ja[8]=H[0];ja[9]=H[1];ja[10]=H[2];ja[12]=I[0];ja[13]=I[1];ja[14]=I[2];Ca.putImageData(Ma,0,0);Ha.drawImage(Da,0,0);return Ea}function l(x){return x<0?Math.min((1+x)*0.5,0.5):0.5+Math.min(x*0.5,0.5)}function q(x,N){var H=N.x-x.x,I=N.y-x.y,k=1/Math.sqrt(H*H+I*I);H*=k;I*=k;N.x+=H;N.y+=I;x.x-=H;x.y-=I}var p=null,s=new THREE.Projector,A=document.createElement("canvas"), -C,B,m,w,h=A.getContext("2d"),P=1,M=0,y=null,J=null,S=1,E,t,V,aa,X=new THREE.Vertex,D=new THREE.Vertex,L,K,R,z,v,Q,ha,O,Y,ya,Ka,La,wa,xa,na,Ga,ra,sa,ta,fa,pa,qa,oa=new THREE.Rectangle,ka=new THREE.Rectangle,$=new THREE.Rectangle,Fa=false,T=new THREE.Color(4294967295),ba=new THREE.Color(4294967295),ga=new THREE.Color(4278190080),za=new THREE.Color(4278190080),Aa=new THREE.Color(4278190080),Qa=Math.PI*2,Ja=new THREE.Vector3,da=new THREE.UV,Z=new THREE.UV,ea=new THREE.UV,ia=new THREE.UV,Da,Ca,Ma,ja,Ea, -Ha,la=16;Da=document.createElement("canvas");Da.width=Da.height=2;Ca=Da.getContext("2d");Ca.fillStyle="rgba(0,0,0,1)";Ca.fillRect(0,0,2,2);Ma=Ca.getImageData(0,0,2,2);ja=Ma.data;Ea=document.createElement("canvas");Ea.width=Ea.height=la;Ha=Ea.getContext("2d");Ha.translate(-la/2,-la/2);Ha.scale(la,la);la--;this.domElement=A;this.autoClear=true;this.setSize=function(x,N){C=x;B=N;m=C/2;w=B/2;A.width=C;A.height=B;h.lineJoin="round";h.lineCap="round";oa.set(-m,-w,m,w)};this.clear=function(){if(!ka.isEmpty()){ka.inflate(1); -ka.minSelf(oa);h.setTransform(1,0,0,-1,m,w);h.clearRect(ka.getX(),ka.getY(),ka.getWidth(),ka.getHeight());ka.empty()}};this.render=function(x,N){var H,I,k,G,U,u,W,F;this.autoClear&&this.clear();p=s.projectScene(x,N);h.setTransform(1,0,0,-1,m,w);h.fillStyle="rgba(0, 255, 255, 0.5)";h.fillRect(oa.getX(),oa.getY(),oa.getWidth(),oa.getHeight());if(Fa=x.lights.length>0){U=x.lights;ga.setRGB(0,0,0);za.setRGB(0,0,0);Aa.setRGB(0,0,0);H=0;for(I=U.length;H0){K.r+=v.color.r*Q;K.g+=v.color.g*Q;K.b+=v.color.b*Q}}else if(v instanceof THREE.PointLight){J.sub(v.position,L.centroidWorld);J.normalize();Q=L.normalWorld.dot(J)*v.intensity;if(Q>0){K.r+=v.color.r*Q;K.g+=v.color.g*Q;K.b+=v.color.b*Q}}}}function c(D,L,K,R,z,v){t=b(V++);t.setAttribute("d","M "+D.positionScreen.x+ -" "+D.positionScreen.y+" L "+L.positionScreen.x+" "+L.positionScreen.y+" L "+K.positionScreen.x+","+K.positionScreen.y+"z");if(z instanceof THREE.MeshBasicMaterial)m.__styleString=z.color.__styleString;else if(z instanceof THREE.MeshLambertMaterial)if(B){w.r=h.r;w.g=h.g;w.b=h.b;a(v,R,w);m.r=z.color.r*w.r;m.g=z.color.g*w.g;m.b=z.color.b*w.b;m.updateStyleString()}else m.__styleString=z.color.__styleString;else if(z instanceof THREE.MeshDepthMaterial){y=1-z.__2near/(z.__farPlusNear-R.z*z.__farMinusNear); -m.setRGB(y,y,y)}else z instanceof THREE.MeshNormalMaterial&&m.setRGB(d(R.normalWorld.x),d(R.normalWorld.y),d(R.normalWorld.z));z.wireframe?t.setAttribute("style","fill: none; stroke: "+m.__styleString+"; stroke-width: "+z.wireframe_linewidth+"; stroke-opacity: "+z.opacity+"; stroke-linecap: round; stroke-linejoin: round"):t.setAttribute("style","fill: "+m.__styleString+"; fill-opacity: "+z.opacity);r.appendChild(t)}function f(D,L,K,R,z,v,Q){t=b(V++);t.setAttribute("d","M "+D.positionScreen.x+" "+ -D.positionScreen.y+" L "+L.positionScreen.x+" "+L.positionScreen.y+" L "+K.positionScreen.x+","+K.positionScreen.y+" L "+R.positionScreen.x+","+R.positionScreen.y+"z");if(v instanceof THREE.MeshBasicMaterial)m.__styleString=v.color.__styleString;else if(v instanceof THREE.MeshLambertMaterial)if(B){w.r=h.r;w.g=h.g;w.b=h.b;a(Q,z,w);m.r=v.color.r*w.r;m.g=v.color.g*w.g;m.b=v.color.b*w.b;m.updateStyleString()}else m.__styleString=v.color.__styleString;else if(v instanceof THREE.MeshDepthMaterial){y=1- -v.__2near/(v.__farPlusNear-z.z*v.__farMinusNear);m.setRGB(y,y,y)}else v instanceof THREE.MeshNormalMaterial&&m.setRGB(d(z.normalWorld.x),d(z.normalWorld.y),d(z.normalWorld.z));v.wireframe?t.setAttribute("style","fill: none; stroke: "+m.__styleString+"; stroke-width: "+v.wireframe_linewidth+"; stroke-opacity: "+v.opacity+"; stroke-linecap: round; stroke-linejoin: round"):t.setAttribute("style","fill: "+m.__styleString+"; fill-opacity: "+v.opacity);r.appendChild(t)}function b(D){if(S[D]==null){S[D]= -document.createElementNS("http://www.w3.org/2000/svg","path");X==0&&S[D].setAttribute("shape-rendering","crispEdges");return S[D]}return S[D]}function d(D){return D<0?Math.min((1+D)*0.5,0.5):0.5+Math.min(D*0.5,0.5)}var j=null,o=new THREE.Projector,r=document.createElementNS("http://www.w3.org/2000/svg","svg"),e,g,n,i,l,q,p,s,A=new THREE.Rectangle,C=new THREE.Rectangle,B=false,m=new THREE.Color(4294967295),w=new THREE.Color(4294967295),h=new THREE.Color(4278190080),P=new THREE.Color(4278190080),M= -new THREE.Color(4278190080),y,J=new THREE.Vector3,S=[],E=[],t,V,aa,X=1;this.domElement=r;this.autoClear=true;this.setQuality=function(D){switch(D){case "high":X=1;break;case "low":X=0}};this.setSize=function(D,L){e=D;g=L;n=e/2;i=g/2;r.setAttribute("viewBox",-n+" "+-i+" "+e+" "+g);r.setAttribute("width",e);r.setAttribute("height",g);A.set(-n,-i,n,i)};this.clear=function(){for(;r.childNodes.length>0;)r.removeChild(r.childNodes[0])};this.render=function(D,L){var K,R,z,v,Q,ha,O,Y;this.autoClear&&this.clear(); -j=o.projectScene(D,L);aa=V=0;if(B=D.lights.length>0){O=D.lights;h.setRGB(0,0,0);P.setRGB(0,0,0);M.setRGB(0,0,0);K=0;for(R=O.length;K=0&&W>=0&&D>=0&&B>=0)return true;else if(K<0&&W<0||D<0&&B<0)return false;else{if(K<0)i=Math.max(i,K/(K-W));else if(W<0)T=Math.min(T,K/(K-W));if(D<0)i=Math.max(i,D/(D-B));else if(B<0)T=Math.min(T,D/(D-B));if(T0&&Q.z<1}fa=B.geometry.faces;K=0;for(W= +fa.length;K0&&r.z<1){h=j[o]=j[o]|| +new THREE.RenderableParticle;h.x=r.x/r.w;h.y=r.y/r.w;h.z=r.z;h.rotation=B.rotation.z;h.scale.x=B.scale.x*Math.abs(h.x-(r.x+s.projectionMatrix.n11)/(r.w+s.projectionMatrix.n14));h.scale.y=B.scale.y*Math.abs(h.y-(r.y+s.projectionMatrix.n22)/(r.w+s.projectionMatrix.n24));h.material=B.material;c.push(h);o++}}}c.sort(function(S,y){return y.z-S.z});return c};this.unprojectVector=function(p,s){var i=new THREE.Matrix4;i.multiply(THREE.Matrix4.makeInvert(s.matrix),THREE.Matrix4.makeInvert(s.projectionMatrix)); +i.transform(p);return p}}; +THREE.DOMRenderer=function(){THREE.Renderer.call(this);var a=null,c=new THREE.Projector,f,b,d,k;this.domElement=document.createElement("div");this.setSize=function(n,q){f=n;b=q;d=f/2;k=b/2};this.render=function(n,q){var e,g,m,h,o,j,r,x;a=c.projectScene(n,q);e=0;for(g=a.length;e0){G.r+=F.r*l;G.g+=F.g*l;G.b+=F.b*l}}else if(l instanceof THREE.PointLight){Ja.sub(l.position,O.centroidWorld);Ja.normalize();l=O.normalWorld.dot(Ja)*l.intensity;if(l>0){G.r+=F.r*l;G.g+=F.g*l;G.b+=F.b*l}}}}function c(v,O,G,H,l,F){if(l.opacity!=0){n(l.opacity);q(l.blending);M=v.positionScreen.x; +J=v.positionScreen.y;S=O.positionScreen.x;y=O.positionScreen.y;u=G.positionScreen.x;R=G.positionScreen.y;if(l.map){ea=l.map.image;pa=ea.width-1;qa=ea.height-1;ca.u=H.uvs[0].u*pa;ca.v=H.uvs[0].v*qa;Z.u=H.uvs[1].u*pa;Z.v=H.uvs[1].v*qa;da.u=H.uvs[2].u*pa;da.v=H.uvs[2].v*qa;k(ea,M,J,S,y,u,R,ca.u,ca.v,Z.u,Z.v,da.u,da.v)}else if(l instanceof THREE.MeshBasicMaterial)b(M,J,S,y,u,R,l.color,l.wireframe,l.wireframe_linewidth);else if(l instanceof THREE.MeshLambertMaterial){if(Fa){aa.r=ga.r;aa.g=ga.g;aa.b=ga.b; +a(F,H,aa);U.r=l.color.r*aa.r;U.g=l.color.g*aa.g;U.b=l.color.b*aa.b;U.updateStyleString()}else U.__styleString=l.color.__styleString;b(M,J,S,y,u,R,U,l.wireframe,l.wireframe_linewidth)}else if(l instanceof THREE.MeshDepthMaterial){ra=l.__2near;sa=l.__farPlusNear;ta=l.__farMinusNear;wa=~~((1-ra/(sa-v.positionScreen.z*ta))*255);xa=~~((1-ra/(sa-O.positionScreen.z*ta))*255);na=~~((1-ra/(sa-G.positionScreen.z*ta))*255);ea=h([wa,wa,wa],[xa,xa,xa],[na,na,na],[na,na,na]);ca.u=0;ca.v=0;Z.u=la;Z.v=0;da.u=0;da.v= +la;k(ea,M,J,S,y,u,R,ca.u,ca.v,Z.u,Z.v,da.u,da.v)}else if(l instanceof THREE.MeshNormalMaterial){U.r=o(H.normalWorld.x);U.g=o(H.normalWorld.y);U.b=o(H.normalWorld.z);U.updateStyleString();b(M,J,S,y,u,R,U,l.wireframe,l.wireframe_linewidth)}}}function f(v,O,G,H,l,F,V,t,X){if(t.opacity!=0){n(t.opacity);q(t.blending);M=v.positionScreen.x;J=v.positionScreen.y;S=O.positionScreen.x;y=O.positionScreen.y;u=G.positionScreen.x;R=G.positionScreen.y;ha=H.positionScreen.x;P=H.positionScreen.y;Y=l.positionScreen.x; +ya=l.positionScreen.y;Ka=F.positionScreen.x;La=F.positionScreen.y;if(t.map){ea=t.map.image;pa=ea.width-1;qa=ea.height-1;ca.copy(V.uvs[0]);Z.copy(V.uvs[1]);da.copy(V.uvs[2]);ia.copy(V.uvs[3]);ca.u*=pa;ca.v*=qa;Z.u*=pa;Z.v*=qa;da.u*=pa;da.v*=qa;ia.u*=pa;ia.v*=qa;k(ea,M,J,S,y,ha,P,ca.u,ca.v,Z.u,Z.v,ia.u,ia.v);k(ea,Y,ya,u,R,Ka,La,Z.u,Z.v,da.u,da.v,ia.u,ia.v)}else if(t instanceof THREE.MeshBasicMaterial)d(M,J,S,y,u,R,ha,P,t.color,t.wireframe,t.wireframe_linewidth);else if(t instanceof THREE.MeshLambertMaterial){if(Fa){aa.r= +ga.r;aa.g=ga.g;aa.b=ga.b;a(X,V,aa);U.r=t.color.r*aa.r;U.g=t.color.g*aa.g;U.b=t.color.b*aa.b;U.updateStyleString()}else U.__styleString=t.color.__styleString;d(M,J,S,y,u,R,ha,P,U,t.wireframe,t.wireframe_linewidth)}else if(t instanceof THREE.MeshDepthMaterial){ra=t.__2near;sa=t.__farPlusNear;ta=t.__farMinusNear;wa=~~((1-ra/(sa-v.positionScreen.z*ta))*255);xa=~~((1-ra/(sa-O.positionScreen.z*ta))*255);na=~~((1-ra/(sa-G.positionScreen.z*ta))*255);Ga=~~((1-ra/(sa-H.positionScreen.z*ta))*255);ea=h([wa,wa, +wa],[xa,xa,xa],[Ga,Ga,Ga],[na,na,na]);ca.u=0;ca.v=0;Z.u=la;Z.v=0;da.u=la;da.v=la;ia.u=0;ia.v=la;k(ea,M,J,S,y,ha,P,ca.u,ca.v,Z.u,Z.v,ia.u,ia.v);k(ea,Y,ya,u,R,Ka,La,Z.u,Z.v,da.u,da.v,ia.u,ia.v)}else if(t instanceof THREE.MeshNormalMaterial){U.r=o(V.normalWorld.x);U.g=o(V.normalWorld.y);U.b=o(V.normalWorld.z);U.updateStyleString();d(M,J,S,y,u,R,ha,P,U,t.wireframe,t.wireframe_linewidth)}}}function b(v,O,G,H,l,F,V,t,X){i.beginPath();i.moveTo(v,O);i.lineTo(G,H);i.lineTo(l,F);i.lineTo(v,O);i.closePath(); +if(t){e(X);g(V.__styleString);i.stroke();$.inflate(X*2)}else{m(V.__styleString);i.fill()}}function d(v,O,G,H,l,F,V,t,X,E,ba){i.beginPath();i.moveTo(v,O);i.lineTo(G,H);i.lineTo(l,F);i.lineTo(V,t);i.lineTo(v,O);i.closePath();if(E){e(ba);g(X.__styleString);i.stroke();$.inflate(ba*2)}else{m(X.__styleString);i.fill()}}function k(v,O,G,H,l,F,V,t,X,E,ba,ma,ua){i.beginPath();i.moveTo(O,G);i.lineTo(H,l);i.lineTo(F,V);i.closePath();H-=O;l-=G;F-=O;V-=G;E-=t;ba-=X;ma-=t;ua-=X;var va=1/(E*ua-ma*ba),Ba=(ua*H-ba* +F)*va;ba=(ua*l-ba*V)*va;H=(E*F-ma*H)*va;l=(E*V-ma*l)*va;O=O-Ba*t-H*X;G=G-ba*t-l*X;i.save();i.transform(Ba,ba,H,l,O,G);i.clip();i.drawImage(v,0,0);i.restore()}function n(v){if(T!=v)i.globalAlpha=T=v}function q(v){if(K!=v){switch(v){case THREE.NormalBlending:i.globalCompositeOperation="source-over";break;case THREE.AdditiveBlending:i.globalCompositeOperation="lighter";break;case THREE.SubtractiveBlending:i.globalCompositeOperation="darker"}K=v}}function e(v){if(B!=v)i.lineWidth=B=v}function g(v){if(W!= +v)i.strokeStyle=W=v}function m(v){if(D!=v)i.fillStyle=D=v}function h(v,O,G,H){ja[0]=v[0];ja[1]=v[1];ja[2]=v[2];ja[4]=O[0];ja[5]=O[1];ja[6]=O[2];ja[8]=G[0];ja[9]=G[1];ja[10]=G[2];ja[12]=H[0];ja[13]=H[1];ja[14]=H[2];Ca.putImageData(Ma,0,0);Ha.drawImage(Da,0,0);return Ea}function o(v){return v<0?Math.min((1+v)*0.5,0.5):0.5+Math.min(v*0.5,0.5)}function j(v,O){var G=O.x-v.x,H=O.y-v.y,l=1/Math.sqrt(G*G+H*H);G*=l;H*=l;O.x+=G;O.y+=H;v.x-=G;v.y-=H}var r=null,x=new THREE.Projector,A=document.createElement("canvas"), +I,N,p,s,i=A.getContext("2d"),T=1,K=0,W=null,D=null,B=1,L,w,C,Q,fa=new THREE.Vertex,z=new THREE.Vertex,M,J,S,y,u,R,ha,P,Y,ya,Ka,La,wa,xa,na,Ga,ra,sa,ta,ea,pa,qa,oa=new THREE.Rectangle,ka=new THREE.Rectangle,$=new THREE.Rectangle,Fa=false,U=new THREE.Color(16777215),aa=new THREE.Color(16777215),ga=new THREE.Color(0),za=new THREE.Color(0),Aa=new THREE.Color(0),Qa=Math.PI*2,Ja=new THREE.Vector3,ca=new THREE.UV,Z=new THREE.UV,da=new THREE.UV,ia=new THREE.UV,Da,Ca,Ma,ja,Ea,Ha,la=16;Da=document.createElement("canvas"); +Da.width=Da.height=2;Ca=Da.getContext("2d");Ca.fillStyle="rgba(0,0,0,1)";Ca.fillRect(0,0,2,2);Ma=Ca.getImageData(0,0,2,2);ja=Ma.data;Ea=document.createElement("canvas");Ea.width=Ea.height=la;Ha=Ea.getContext("2d");Ha.translate(-la/2,-la/2);Ha.scale(la,la);la--;this.domElement=A;this.autoClear=true;this.setSize=function(v,O){I=v;N=O;p=I/2;s=N/2;A.width=I;A.height=N;i.lineJoin="round";i.lineCap="round";oa.set(-p,-s,p,s)};this.clear=function(){if(!ka.isEmpty()){ka.inflate(1);ka.minSelf(oa);i.setTransform(1, +0,0,-1,p,s);i.clearRect(ka.getX(),ka.getY(),ka.getWidth(),ka.getHeight());ka.empty()}};this.render=function(v,O){var G,H,l,F,V,t,X,E;this.autoClear&&this.clear();r=x.projectScene(v,O);i.setTransform(1,0,0,-1,p,s);i.fillStyle="rgba(0, 255, 255, 0.5)";i.fillRect(oa.getX(),oa.getY(),oa.getWidth(),oa.getHeight());if(Fa=v.lights.length>0){V=v.lights;ga.setRGB(0,0,0);za.setRGB(0,0,0);Aa.setRGB(0,0,0);G=0;for(H=V.length;G0){J.r+=u.color.r*R;J.g+=u.color.g*R;J.b+=u.color.b*R}}else if(u instanceof THREE.PointLight){D.sub(u.position,M.centroidWorld);D.normalize();R=M.normalWorld.dot(D)*u.intensity;if(R>0){J.r+=u.color.r*R;J.g+=u.color.g*R;J.b+=u.color.b*R}}}}function c(z,M,J,S,y,u){w=b(C++);w.setAttribute("d","M "+z.positionScreen.x+ +" "+z.positionScreen.y+" L "+M.positionScreen.x+" "+M.positionScreen.y+" L "+J.positionScreen.x+","+J.positionScreen.y+"z");if(y instanceof THREE.MeshBasicMaterial)p.__styleString=y.color.__styleString;else if(y instanceof THREE.MeshLambertMaterial)if(N){s.r=i.r;s.g=i.g;s.b=i.b;a(u,S,s);p.r=y.color.r*s.r;p.g=y.color.g*s.g;p.b=y.color.b*s.b;p.updateStyleString()}else p.__styleString=y.color.__styleString;else if(y instanceof THREE.MeshDepthMaterial){W=1-y.__2near/(y.__farPlusNear-S.z*y.__farMinusNear); +p.setRGB(W,W,W)}else y instanceof THREE.MeshNormalMaterial&&p.setRGB(d(S.normalWorld.x),d(S.normalWorld.y),d(S.normalWorld.z));y.wireframe?w.setAttribute("style","fill: none; stroke: "+p.__styleString+"; stroke-width: "+y.wireframe_linewidth+"; stroke-opacity: "+y.opacity+"; stroke-linecap: round; stroke-linejoin: round"):w.setAttribute("style","fill: "+p.__styleString+"; fill-opacity: "+y.opacity);q.appendChild(w)}function f(z,M,J,S,y,u,R){w=b(C++);w.setAttribute("d","M "+z.positionScreen.x+" "+ +z.positionScreen.y+" L "+M.positionScreen.x+" "+M.positionScreen.y+" L "+J.positionScreen.x+","+J.positionScreen.y+" L "+S.positionScreen.x+","+S.positionScreen.y+"z");if(u instanceof THREE.MeshBasicMaterial)p.__styleString=u.color.__styleString;else if(u instanceof THREE.MeshLambertMaterial)if(N){s.r=i.r;s.g=i.g;s.b=i.b;a(R,y,s);p.r=u.color.r*s.r;p.g=u.color.g*s.g;p.b=u.color.b*s.b;p.updateStyleString()}else p.__styleString=u.color.__styleString;else if(u instanceof THREE.MeshDepthMaterial){W=1- +u.__2near/(u.__farPlusNear-y.z*u.__farMinusNear);p.setRGB(W,W,W)}else u instanceof THREE.MeshNormalMaterial&&p.setRGB(d(y.normalWorld.x),d(y.normalWorld.y),d(y.normalWorld.z));u.wireframe?w.setAttribute("style","fill: none; stroke: "+p.__styleString+"; stroke-width: "+u.wireframe_linewidth+"; stroke-opacity: "+u.opacity+"; stroke-linecap: round; stroke-linejoin: round"):w.setAttribute("style","fill: "+p.__styleString+"; fill-opacity: "+u.opacity);q.appendChild(w)}function b(z){if(B[z]==null){B[z]= +document.createElementNS("http://www.w3.org/2000/svg","path");fa==0&&B[z].setAttribute("shape-rendering","crispEdges");return B[z]}return B[z]}function d(z){return z<0?Math.min((1+z)*0.5,0.5):0.5+Math.min(z*0.5,0.5)}var k=null,n=new THREE.Projector,q=document.createElementNS("http://www.w3.org/2000/svg","svg"),e,g,m,h,o,j,r,x,A=new THREE.Rectangle,I=new THREE.Rectangle,N=false,p=new THREE.Color(16777215),s=new THREE.Color(16777215),i=new THREE.Color(0),T=new THREE.Color(0),K=new THREE.Color(0),W, +D=new THREE.Vector3,B=[],L=[],w,C,Q,fa=1;this.domElement=q;this.autoClear=true;this.setQuality=function(z){switch(z){case "high":fa=1;break;case "low":fa=0}};this.setSize=function(z,M){e=z;g=M;m=e/2;h=g/2;q.setAttribute("viewBox",-m+" "+-h+" "+e+" "+g);q.setAttribute("width",e);q.setAttribute("height",g);A.set(-m,-h,m,h)};this.clear=function(){for(;q.childNodes.length>0;)q.removeChild(q.childNodes[0])};this.render=function(z,M){var J,S,y,u,R,ha,P,Y;this.autoClear&&this.clear();k=n.projectScene(z, +M);Q=C=0;if(N=z.lights.length>0){P=z.lights;i.setRGB(0,0,0);T.setRGB(0,0,0);K.setRGB(0,0,0);J=0;for(S=P.length;J= 0.0 )": @@ -135,26 +136,25 @@ b.linkProgram(d);if(!b.getProgramParameter(d,b.LINK_STATUS)){alert("Could not in b.getUniformLocation(d,"pointLightPosition")}d.material=b.getUniformLocation(d,"material");d.mColor=b.getUniformLocation(d,"mColor");d.mOpacity=b.getUniformLocation(d,"mOpacity");d.mReflectivity=b.getUniformLocation(d,"mReflectivity");d.mAmbient=b.getUniformLocation(d,"mAmbient");d.mSpecular=b.getUniformLocation(d,"mSpecular");d.mShininess=b.getUniformLocation(d,"mShininess");d.enableMap=b.getUniformLocation(d,"enableMap");b.uniform1i(d.enableMap,0);d.tMap=b.getUniformLocation(d,"tMap");b.uniform1i(d.tMap, 0);d.enableCubeMap=b.getUniformLocation(d,"enableCubeMap");b.uniform1i(d.enableCubeMap,0);d.tCube=b.getUniformLocation(d,"tCube");b.uniform1i(d.tCube,1);d.mixEnvMap=b.getUniformLocation(d,"mixEnvMap");b.uniform1i(d.mixEnvMap,0);d.mRefractionRatio=b.getUniformLocation(d,"mRefractionRatio");d.useRefract=b.getUniformLocation(d,"useRefract");b.uniform1i(d.useRefract,0);d.m2Near=b.getUniformLocation(d,"m2Near");d.mFarPlusNear=b.getUniformLocation(d,"mFarPlusNear");d.mFarMinusNear=b.getUniformLocation(d, "mFarMinusNear");d.position=b.getAttribLocation(d,"position");b.enableVertexAttribArray(d.position);d.normal=b.getAttribLocation(d,"normal");b.enableVertexAttribArray(d.normal);d.uv=b.getAttribLocation(d,"uv");b.enableVertexAttribArray(d.uv);d.viewMatrixArray=new Float32Array(16);d.modelViewMatrixArray=new Float32Array(16);d.projectionMatrixArray=new Float32Array(16)})(a.directional,a.point);this.setSize=function(e,g){f.width=e;f.height=g;b.viewport(0,0,f.width,f.height)};this.clear=function(){b.clear(b.COLOR_BUFFER_BIT| -b.DEPTH_BUFFER_BIT)};this.setupLights=function(e){var g,n,i,l,q=[],p=[],s=[];l=[];var A=[];b.uniform1i(d.enableLighting,e.lights.length);g=0;for(n=e.lights.length;g - + + - + @@ -92,24 +92,29 @@ // Merging spheres in a single geometry GeometryUtils.merge( geometry, sphere ); - } - var r = "textures/skymap_"; - var urls = [ r + "px.jpg", r + "nx.jpg", - r + "py.jpg", r + "ny.jpg", - r + "pz.jpg", r + "nz.jpg" ]; + var path = "textures/cube/pisa/"; + var format = '.png'; + var urls = [ + path + 'px' + format, path + 'nx' + format, + path + 'py' + format, path + 'ny' + format, + path + 'pz' + format, path + 'nz' + format + ]; - var images = THREE.loadImageArray( urls ); + var images = ImageUtils.loadArray( urls ); var textureCube = new THREE.TextureCube( images ); + // var textureCube = new THREE.TextureCube( images, THREE.RefractionMap ); + var material = new THREE.MeshBasicMaterial( { color: 0xffffff, env_map: textureCube } ); var mesh = new THREE.Mesh( geometry, material ); + mesh.position.x = 100; scene.addObject( mesh ); //createCubePlanes( 100000, images ); - createCube( 100000, images ); - //createCubeWebGL( 100000, textureCube ); + //createCube( 100000, images ); + createCubeWebGL( 100000, textureCube ); webglRenderer = new THREE.WebGLRenderer( scene ); webglRenderer.setSize( window.innerWidth, window.innerHeight ); diff --git a/examples/materials_cubemap_sky_refraction.html b/examples/materials_cubemap_balls_refraction.html similarity index 94% rename from examples/materials_cubemap_sky_refraction.html rename to examples/materials_cubemap_balls_refraction.html index 729475e7..33120cfb 100644 --- a/examples/materials_cubemap_sky_refraction.html +++ b/examples/materials_cubemap_balls_refraction.html @@ -38,6 +38,7 @@ + @@ -92,12 +93,15 @@ GeometryUtils.merge( geometry, sphere ); } - var r = "textures/skymap_"; - var urls = [ r + "px.jpg", r + "nx.jpg", - r + "py.jpg", r + "ny.jpg", - r + "pz.jpg", r + "nz.jpg" ]; + var path = "textures/cube/skybox/"; + var format = '.jpg'; + var urls = [ + path + 'px' + format, path + 'nx' + format, + path + 'py' + format, path + 'ny' + format, + path + 'pz' + format, path + 'nz' + format + ]; - var images = THREE.loadImageArray( urls ); + var images = ImageUtils.loadArray( urls ); var textureCube = new THREE.TextureCube( images, THREE.RefractionMap ); var material = new THREE.MeshBasicMaterial( { color: 0xffffff, env_map: textureCube, refraction_ratio: 0.75 } ); diff --git a/examples/materials_cubemap_escher.html b/examples/materials_cubemap_escher.html index c417a1ae..88be4402 100644 --- a/examples/materials_cubemap_escher.html +++ b/examples/materials_cubemap_escher.html @@ -35,6 +35,7 @@ + @@ -78,7 +79,7 @@ r + "py.jpg", r + "ny.jpg", r + "pz.jpg", r + "nz.jpg" ]; - var images = THREE.loadImageArray( urls ); + var images = ImageUtils.loadArray( urls ); var textureCube = new THREE.TextureCube( images ); var material = new THREE.MeshBasicMaterial( { color: 0xffffff, env_map: textureCube } ) @@ -89,8 +90,8 @@ scene.addObject( mesh ); //createCubePlanes( 6000, images ); - createCube( 6000, images ); - //createCubeWebGL( 6000, textureCube ); + //createCube( 6000, images ); + createCubeWebGL( 6000, textureCube ); webglRenderer = new THREE.WebGLRenderer( scene ); webglRenderer.setSize( window.innerWidth, window.innerHeight ); diff --git a/examples/materials_cubemap_refraction.html b/examples/materials_cubemap_refraction.html index 5ba72d83..e93cace1 100644 --- a/examples/materials_cubemap_refraction.html +++ b/examples/materials_cubemap_refraction.html @@ -39,6 +39,7 @@ + @@ -102,7 +103,7 @@ r + "py.jpg", r + "ny.jpg", r + "pz.jpg", r + "nz.jpg" ]; - var images = THREE.loadImageArray( urls ); + var images = ImageUtils.loadArray( urls ); var textureCube = new THREE.TextureCube( images, THREE.RefractionMap ); var cubeMaterial3 = new THREE.MeshBasicMaterial( { color: 0xccddff, env_map: textureCube, refraction_ratio: 0.98, reflectivity:0.9 } ); @@ -181,12 +182,12 @@ function createCube( size, images ) { var materials = []; - materials.push( new THREE.MeshBasicMaterial( { map: new THREE.Texture( images[1] ) } ) ); materials.push( new THREE.MeshBasicMaterial( { map: new THREE.Texture( images[0] ) } ) ); - materials.push( new THREE.MeshBasicMaterial( { map: new THREE.Texture( images[4] ) } ) ); - materials.push( new THREE.MeshBasicMaterial( { map: new THREE.Texture( images[5] ) } ) ); + materials.push( new THREE.MeshBasicMaterial( { map: new THREE.Texture( images[1] ) } ) ); materials.push( new THREE.MeshBasicMaterial( { map: new THREE.Texture( images[2] ) } ) ); materials.push( new THREE.MeshBasicMaterial( { map: new THREE.Texture( images[3] ) } ) ); + materials.push( new THREE.MeshBasicMaterial( { map: new THREE.Texture( images[4] ) } ) ); + materials.push( new THREE.MeshBasicMaterial( { map: new THREE.Texture( images[5] ) } ) ); mesh = new THREE.Mesh( new Cube( size, size, size, 1, 1, materials, true ), new THREE.MeshFaceMaterial() ); sceneCube.addObject( mesh ); diff --git a/examples/textures/cube/Park3Med/readme.txt b/examples/textures/cube/Park3Med/readme.txt new file mode 100644 index 00000000..7d39a08a --- /dev/null +++ b/examples/textures/cube/Park3Med/readme.txt @@ -0,0 +1,20 @@ +Author +====== + +This is the work of Emil Persson, aka Humus. +http://www.humus.name +humus@comhem.se + + + +Legal stuff +=========== + +This work is free and may be used by anyone for any purpose +and may be distributed freely to anyone using any distribution +media or distribution method as long as this file is included. +Distribution without this file is allowed if it's distributed +with free non-commercial software; however, fair credit of the +original author is expected. +Any commercial distribution of this software requires the written +approval of Emil Persson. diff --git a/examples/textures/cube/SwedishRoyalCastle/readme.txt b/examples/textures/cube/SwedishRoyalCastle/readme.txt new file mode 100644 index 00000000..7d39a08a --- /dev/null +++ b/examples/textures/cube/SwedishRoyalCastle/readme.txt @@ -0,0 +1,20 @@ +Author +====== + +This is the work of Emil Persson, aka Humus. +http://www.humus.name +humus@comhem.se + + + +Legal stuff +=========== + +This work is free and may be used by anyone for any purpose +and may be distributed freely to anyone using any distribution +media or distribution method as long as this file is included. +Distribution without this file is allowed if it's distributed +with free non-commercial software; however, fair credit of the +original author is expected. +Any commercial distribution of this software requires the written +approval of Emil Persson. diff --git a/examples/textures/cube/pisa/nx.png b/examples/textures/cube/pisa/nx.png new file mode 100644 index 00000000..d55788cd Binary files /dev/null and b/examples/textures/cube/pisa/nx.png differ diff --git a/examples/textures/cube/pisa/ny.png b/examples/textures/cube/pisa/ny.png new file mode 100644 index 00000000..8b1facd7 Binary files /dev/null and b/examples/textures/cube/pisa/ny.png differ diff --git a/examples/textures/cube/pisa/nz.png b/examples/textures/cube/pisa/nz.png new file mode 100644 index 00000000..0aeb5b9e Binary files /dev/null and b/examples/textures/cube/pisa/nz.png differ diff --git a/examples/textures/cube/pisa/px.png b/examples/textures/cube/pisa/px.png new file mode 100644 index 00000000..87f4d1ca Binary files /dev/null and b/examples/textures/cube/pisa/px.png differ diff --git a/examples/textures/cube/pisa/py.png b/examples/textures/cube/pisa/py.png new file mode 100644 index 00000000..83389825 Binary files /dev/null and b/examples/textures/cube/pisa/py.png differ diff --git a/examples/textures/cube/pisa/pz.png b/examples/textures/cube/pisa/pz.png new file mode 100644 index 00000000..341b8b8b Binary files /dev/null and b/examples/textures/cube/pisa/pz.png differ diff --git a/examples/textures/skymap_nx.jpg b/examples/textures/cube/skybox/nx.jpg similarity index 100% rename from examples/textures/skymap_nx.jpg rename to examples/textures/cube/skybox/nx.jpg diff --git a/examples/textures/skymap_ny.jpg b/examples/textures/cube/skybox/ny.jpg similarity index 100% rename from examples/textures/skymap_ny.jpg rename to examples/textures/cube/skybox/ny.jpg diff --git a/examples/textures/skymap_pz.jpg b/examples/textures/cube/skybox/nz.jpg similarity index 100% rename from examples/textures/skymap_pz.jpg rename to examples/textures/cube/skybox/nz.jpg diff --git a/examples/textures/skymap_px.jpg b/examples/textures/cube/skybox/px.jpg similarity index 100% rename from examples/textures/skymap_px.jpg rename to examples/textures/cube/skybox/px.jpg diff --git a/examples/textures/skymap_py.jpg b/examples/textures/cube/skybox/py.jpg similarity index 100% rename from examples/textures/skymap_py.jpg rename to examples/textures/cube/skybox/py.jpg diff --git a/examples/textures/skymap_nz.jpg b/examples/textures/cube/skybox/pz.jpg similarity index 100% rename from examples/textures/skymap_nz.jpg rename to examples/textures/cube/skybox/pz.jpg diff --git a/examples/textures/cube/skybox_test/nx.jpg b/examples/textures/cube/skybox_test/nx.jpg new file mode 100644 index 00000000..b7959350 Binary files /dev/null and b/examples/textures/cube/skybox_test/nx.jpg differ diff --git a/examples/textures/cube/skybox_test/ny.jpg b/examples/textures/cube/skybox_test/ny.jpg new file mode 100644 index 00000000..2e94424a Binary files /dev/null and b/examples/textures/cube/skybox_test/ny.jpg differ diff --git a/examples/textures/cube/skybox_test/nz.jpg b/examples/textures/cube/skybox_test/nz.jpg new file mode 100644 index 00000000..86f543dc Binary files /dev/null and b/examples/textures/cube/skybox_test/nz.jpg differ diff --git a/examples/textures/cube/skybox_test/px.jpg b/examples/textures/cube/skybox_test/px.jpg new file mode 100644 index 00000000..a6907d16 Binary files /dev/null and b/examples/textures/cube/skybox_test/px.jpg differ diff --git a/examples/textures/cube/skybox_test/py.jpg b/examples/textures/cube/skybox_test/py.jpg new file mode 100644 index 00000000..645ca666 Binary files /dev/null and b/examples/textures/cube/skybox_test/py.jpg differ diff --git a/examples/textures/cube/skybox_test/pz.jpg b/examples/textures/cube/skybox_test/pz.jpg new file mode 100644 index 00000000..f195dff1 Binary files /dev/null and b/examples/textures/cube/skybox_test/pz.jpg differ diff --git a/src/extras/ImageUtils.js b/src/extras/ImageUtils.js new file mode 100644 index 00000000..b6b3e98c --- /dev/null +++ b/src/extras/ImageUtils.js @@ -0,0 +1,22 @@ +var ImageUtils = { + + loadArray: function ( array ) { + + var i, l, images = []; + + images.loadCount = 0; + + for ( i = 0, l = array.length; i < l; ++i ) { + + images[ i ] = new Image(); + images[ i ].loaded = 0; + images[ i ].onload = function () { images.loadCount += 1; this.loaded = 1; } + images[ i ].src = array[ i ]; + + } + + return images; + + } + +} diff --git a/src/extras/primitives/Cube.js b/src/extras/primitives/Cube.js index aa193ecf..a197ac26 100644 --- a/src/extras/primitives/Cube.js +++ b/src/extras/primitives/Cube.js @@ -37,14 +37,12 @@ var Cube = function ( width, height, depth, segments_width, segments_height, mat } - buildPlane( 'z', 'y', - 1 * flip, - 1, depth, height, width_half, this.materials[ 0 ] ); // right - buildPlane( 'z', 'y', 1 * flip, - 1, depth, height, - width_half, this.materials[ 1 ] ); // left - - buildPlane( 'x', 'z', - 1 * flip, - 1, width, depth, height_half, this.materials[ 2 ] ); // top - buildPlane( 'x', 'z', - 1 * flip, 1, width, depth, - height_half, this.materials[ 3 ] ); // bottom - - buildPlane( 'x', 'y', 1 * flip, - 1, width, height, depth_half, this.materials[ 4 ] ); // back - buildPlane( 'x', 'y', - 1 * flip, - 1, width, height, - depth_half, this.materials[ 5 ] ); // front + buildPlane( 'z', 'y', 1 * flip, - 1, depth, height, - width_half, this.materials[ 0 ] ); // px + buildPlane( 'z', 'y', - 1 * flip, - 1, depth, height, width_half, this.materials[ 1 ] ); // nx + buildPlane( 'x', 'z', 1 * flip, 1, width, depth, height_half, this.materials[ 2 ] ); // py + buildPlane( 'x', 'z', 1 * flip, - 1, width, depth, - height_half, this.materials[ 3 ] ); // ny + buildPlane( 'x', 'y', 1 * flip, - 1, width, height, depth_half, this.materials[ 4 ] ); // pz + buildPlane( 'x', 'y', - 1 * flip, - 1, width, height, - depth_half, this.materials[ 5 ] ); // nz mergeVertices(); diff --git a/src/materials/textures/TextureCube.js b/src/materials/textures/TextureCube.js index 190b3a8b..d0297492 100644 --- a/src/materials/textures/TextureCube.js +++ b/src/materials/textures/TextureCube.js @@ -19,23 +19,3 @@ THREE.TextureCube = function ( image, mapping ) { }; }; - -THREE.loadImageArray = function ( urls ) { - - var i, images = []; - - images.loadCount = 0; - - for ( i = 0; i < urls.length; ++i ) { - - images[i] = new Image(); - images[i].loaded = 0; - images[i].onload = function() { images.loadCount += 1; this.loaded = 1; } - images[i].src = urls[i]; - - } - - return images; - -}; - diff --git a/src/renderers/CanvasRenderer.js b/src/renderers/CanvasRenderer.js index 3e754fc6..c51267b5 100644 --- a/src/renderers/CanvasRenderer.js +++ b/src/renderers/CanvasRenderer.js @@ -33,11 +33,11 @@ THREE.CanvasRenderer = function () { _bboxRect = new THREE.Rectangle(), _enableLighting = false, - _color = new THREE.Color( 0xffffffff ), - _light = new THREE.Color( 0xffffffff ), - _ambientLight = new THREE.Color( 0xff000000 ), - _directionalLights = new THREE.Color( 0xff000000 ), - _pointLights = new THREE.Color( 0xff000000 ), + _color = new THREE.Color( 0xffffff ), + _light = new THREE.Color( 0xffffff ), + _ambientLight = new THREE.Color( 0x000000 ), + _directionalLights = new THREE.Color( 0x000000 ), + _pointLights = new THREE.Color( 0x000000 ), _pi2 = Math.PI * 2, _vector3 = new THREE.Vector3(), // Needed for PointLight diff --git a/src/renderers/Projector.js b/src/renderers/Projector.js index c0ff1e86..dad22c81 100644 --- a/src/renderers/Projector.js +++ b/src/renderers/Projector.js @@ -14,14 +14,15 @@ THREE.Projector = function() { _vector4 = new THREE.Vector4(), _projScreenMatrix = new THREE.Matrix4(), - _projScreenObjectMatrix = new THREE.Matrix4(); + _projScreenObjectMatrix = new THREE.Matrix4(), + + _clippedVertex1PositionScreen = new THREE.Vector4(), + _clippedVertex2PositionScreen = new THREE.Vector4(); this.projectScene = function ( scene, camera ) { var o, ol, v, vl, f, fl, objects, object, objectMatrix, - vertices, vertex, vertex0, vertex1, vertexPositionScreen, - clippedVertexPositionScreen0 = new THREE.Vector4(), - clippedVertexPositionScreen1 = new THREE.Vector4(), + vertices, vertex, vertexPositionScreen, faces, face, v1, v2, v3, v4; _renderList = []; @@ -70,7 +71,7 @@ THREE.Projector = function() { // Perform the perspective divide. TODO: This should be be performend // post clipping (imagine if the vertex lies at the same location as // the camera, causing a divide by w = 0). - vertexPositionScreen.multiplyScalar( 1.0 / vertexPositionScreen.w ); + vertexPositionScreen.multiplyScalar( 1 / vertexPositionScreen.w ); vertex.__visible = vertexPositionScreen.z > 0 && vertexPositionScreen.z < 1; @@ -177,34 +178,33 @@ THREE.Projector = function() { vertices = object.geometry.vertices; - for ( v = 0, vl = vertices.length; v < vl; v++ ) { - - vertex = vertices[ v ]; - - vertex.positionScreen.copy( vertex.position ); - _projScreenObjectMatrix.transform( vertex.positionScreen ); - } + vertex = vertices[ 0 ]; + vertex.positionScreen.copy( vertex.position ); + _projScreenObjectMatrix.transform( vertex.positionScreen ); for ( v = 1, vl = vertices.length; v < vl; v++ ) { - vertex0 = vertices[ v ]; - vertex1 = vertices[ v - 1 ]; - - clippedVertexPositionScreen0.copy( vertex0.positionScreen ); - clippedVertexPositionScreen1.copy( vertex1.positionScreen ); + v1 = vertices[ v ]; - if (clipLineSegmentAgainstNearAndFarPlanes(clippedVertexPositionScreen0, clippedVertexPositionScreen1)) { + v1.positionScreen.copy( v1.position ); + _projScreenObjectMatrix.transform( v1.positionScreen ); + + v2 = vertices[ v - 1 ]; + + _clippedVertex1PositionScreen.copy( v1.positionScreen ); + _clippedVertex2PositionScreen.copy( v2.positionScreen ); + + if ( clipLine( _clippedVertex1PositionScreen, _clippedVertex2PositionScreen ) ) { // Perform the perspective divide - clippedVertexPositionScreen0.multiplyScalar( 1.0 / clippedVertexPositionScreen0.w ); - clippedVertexPositionScreen1.multiplyScalar( 1.0 / clippedVertexPositionScreen1.w ); + _clippedVertex1PositionScreen.multiplyScalar( 1 / _clippedVertex1PositionScreen.w ); + _clippedVertex2PositionScreen.multiplyScalar( 1 / _clippedVertex2PositionScreen.w ); _line = _linePool[ _lineCount ] = _linePool[ _lineCount ] || new THREE.RenderableLine(); - _line.v1.positionScreen.copy( clippedVertexPositionScreen0 ); - _line.v2.positionScreen.copy( clippedVertexPositionScreen1 ); + _line.v1.positionScreen.copy( _clippedVertex1PositionScreen ); + _line.v2.positionScreen.copy( _clippedVertex2PositionScreen ); - // TODO: Use centroids here too. - _line.z = Math.max( clippedVertexPositionScreen0.z, clippedVertexPositionScreen1.z ); + _line.z = Math.max( _clippedVertex1PositionScreen.z, _clippedVertex2PositionScreen.z ); _line.material = object.material; @@ -263,73 +263,74 @@ THREE.Projector = function() { }; - function clipLineSegmentAgainstNearAndFarPlanes( s0, s1 ) { + function clipLine( s1, s2 ) { - var visible, alpha0 = 0, alpha1 = 1, + var alpha1 = 0, alpha2 = 1, // Calculate the boundary coordinate of each vertex for the near and far clip planes, // Z = -1 and Z = +1, respectively. - bc0near = s0.z + s0.w, bc1near = s1.z + s1.w, - bc0far = -s0.z + s0.w, - bc1far = -s1.z + s1.w; + bc2near = s2.z + s2.w, + bc1far = - s1.z + s1.w, + bc2far = - s2.z + s2.w; - if ( bc0near >= 0 && bc1near >= 0 && bc0far >= 0 && bc1far >= 0 ) { + if ( bc1near >= 0 && bc2near >= 0 && bc1far >= 0 && bc2far >= 0 ) { // Both vertices lie entirely within all clip planes. - visible = true; + return true; - } else if ( ( bc0near < 0 && bc1near < 0) || (bc0far < 0 && bc1far < 0 ) ) { + } else if ( ( bc1near < 0 && bc2near < 0) || (bc1far < 0 && bc2far < 0 ) ) { // Both vertices lie entirely outside one of the clip planes. - visible = false; + return false; } else { // The line segment spans at least one clip plane. - if ( bc0near < 0 ) { + if ( bc1near < 0 ) { - // vertex0 lies outside the near plane, vertex1 inside - alpha0 = Math.max( alpha0, bc0near / ( bc0near - bc1near ) ); + // v1 lies outside the near plane, v2 inside + alpha1 = Math.max( alpha1, bc1near / ( bc1near - bc2near ) ); - } else if ( bc1near < 0 ) { + } else if ( bc2near < 0 ) { - // vertex1 lies outside the near plane, vertex0 inside - alpha1 = Math.min( alpha1, bc0near / ( bc0near - bc1near ) ); + // v2 lies outside the near plane, v1 inside + alpha2 = Math.min( alpha2, bc1near / ( bc1near - bc2near ) ); } - if ( bc0far < 0 ) { + if ( bc1far < 0 ) { - // vertex0 lies outside the far plane, vertex1 inside - alpha0 = Math.max( alpha0, bc0far / ( bc0far - bc1far ) ); + // v1 lies outside the far plane, v2 inside + alpha1 = Math.max( alpha1, bc1far / ( bc1far - bc2far ) ); - } else if ( bc1far < 0 ) { + } else if ( bc2far < 0 ) { - // vertex1 lies outside the far plane, vertex1 inside - alpha1 = Math.min( alpha1, bc0far / ( bc0far - bc1far ) ); + // v2 lies outside the far plane, v2 inside + alpha2 = Math.min( alpha2, bc1far / ( bc1far - bc2far ) ); } - if ( alpha1 < alpha0 ) { + if ( alpha2 < alpha1 ) { // The line segment spans two boundaries, but is outside both of them. // (This can't happen when we're only clipping against just near/far but good // to leave the check here for future usage if other clip planes are added.) - visible = false; + return false; } else { - // Update the s0 and s1 vertices to match the clipped line segment. - s0.lerpSelf( s1, alpha0 ); - s1.lerpSelf( s0, 1 - alpha1 ); + // Update the s1 and s2 vertices to match the clipped line segment. + s1.lerpSelf( s2, alpha1 ); + s2.lerpSelf( s1, 1 - alpha2 ); + + return true; - visible = true; } + } - return visible; } }; diff --git a/src/renderers/SVGRenderer.js b/src/renderers/SVGRenderer.js index 5ff5aa53..78377fdc 100644 --- a/src/renderers/SVGRenderer.js +++ b/src/renderers/SVGRenderer.js @@ -15,11 +15,11 @@ THREE.SVGRenderer = function () { _bboxRect = new THREE.Rectangle(), _enableLighting = false, - _color = new THREE.Color( 0xffffffff ), - _light = new THREE.Color( 0xffffffff ), - _ambientLight = new THREE.Color( 0xff000000 ), - _directionalLights = new THREE.Color( 0xff000000 ), - _pointLights = new THREE.Color( 0xff000000 ), + _color = new THREE.Color( 0xffffff ), + _light = new THREE.Color( 0xffffff ), + _ambientLight = new THREE.Color( 0x000000 ), + _directionalLights = new THREE.Color( 0x000000 ), + _pointLights = new THREE.Color( 0x000000 ), _w, // z-buffer to w-buffer _vector3 = new THREE.Vector3(), // Needed for PointLight diff --git a/src/renderers/WebGLRenderer.js b/src/renderers/WebGLRenderer.js index 43321da9..a5e5ae0b 100644 --- a/src/renderers/WebGLRenderer.js +++ b/src/renderers/WebGLRenderer.js @@ -5,73 +5,73 @@ */ THREE.WebGLRenderer = function ( scene ) { - + // Currently you can use just up to 4 directional / point lights total. // Chrome barfs on shader linking when there are more than 4 lights :( - + // It seems problem comes from having too many varying vectors. - + // Weirdly, this is not GPU limitation as the same shader works ok in Firefox. - // This difference could come from Chrome using ANGLE on Windows, + // This difference could come from Chrome using ANGLE on Windows, // thus going DirectX9 route (while FF uses OpenGL). - + var _canvas = document.createElement( 'canvas' ), _gl, _program, _modelViewMatrix = new THREE.Matrix4(), _normalMatrix, - + BASIC = 0, LAMBERT = 1, PHONG = 2, DEPTH = 3, NORMAL = 4, CUBE = 5, // material constants used in shader - + maxLightCount = allocateLights( scene, 4 ); - + this.domElement = _canvas; this.autoClear = true; initGL(); initProgram( maxLightCount.directional, maxLightCount.point ); - + // Querying via gl.getParameter() reports different values for CH and FF for many max parameters. // On my GPU Chrome reports MAX_VARYING_VECTORS = 8, FF reports 0 yet compiles shaders with many // more varying vectors (up to 29 lights are ok, more start to throw warnings to FF error console // and then crash the browser). - + //alert( dumpObject( getGLParams() ) ); - - + + function allocateLights( scene, maxLights ) { // heuristics to create shader parameters according to lights in the scene // (not to blow over maxLights budget) - + if ( scene ) { var l, ll, light, dirLights = pointLights = maxDirLights = maxPointLights = 0; - + for ( l = 0, ll = scene.lights.length; l < ll; l++ ) { - + light = scene.lights[ l ]; - + if ( light instanceof THREE.DirectionalLight ) dirLights++; if ( light instanceof THREE.PointLight ) pointLights++; - + } - + if ( ( pointLights + dirLights ) <= maxLights ) { - + maxDirLights = dirLights; maxPointLights = pointLights; - + } else { - + maxDirLights = Math.ceil( maxLights * dirLights / ( pointLights + dirLights ) ); maxPointLights = maxLights - maxDirLights; - + } - + return { 'directional' : maxDirLights, 'point' : maxPointLights }; - + } - + return { 'directional' : 1, 'point' : maxLights - 1 }; - + }; this.setSize = function ( width, height ) { @@ -111,32 +111,32 @@ THREE.WebGLRenderer = function ( scene ) { } else if( light instanceof THREE.PointLight ) { pointLights.push( light ); - + } } - + // sum all ambient lights r = g = b = 0.0; - + for ( l = 0, ll = ambientLights.length; l < ll; l++ ) { - + r += ambientLights[ l ].color.r; g += ambientLights[ l ].color.g; b += ambientLights[ l ].color.b; - + } - + _gl.uniform3f( _program.ambientLightColor, r, g, b ); // pass directional lights as float arrays - + colors = []; positions = []; - + for ( l = 0, ll = directionalLights.length; l < ll; l++ ) { - + light = directionalLights[ l ]; - + colors.push( light.color.r * light.intensity ); colors.push( light.color.g * light.intensity ); colors.push( light.color.b * light.intensity ); @@ -144,25 +144,25 @@ THREE.WebGLRenderer = function ( scene ) { positions.push( light.position.x ); positions.push( light.position.y ); positions.push( light.position.z ); - + } - + if ( directionalLights.length ) { _gl.uniform1i( _program.directionalLightNumber, directionalLights.length ); _gl.uniform3fv( _program.directionalLightDirection, positions ); _gl.uniform3fv( _program.directionalLightColor, colors ); - + } // pass point lights as float arrays - + colors = []; positions = []; - + for ( l = 0, ll = pointLights.length; l < ll; l++ ) { - + light = pointLights[ l ]; - + colors.push( light.color.r * light.intensity ); colors.push( light.color.g * light.intensity ); colors.push( light.color.b * light.intensity ); @@ -170,17 +170,17 @@ THREE.WebGLRenderer = function ( scene ) { positions.push( light.position.x ); positions.push( light.position.y ); positions.push( light.position.z ); - + } - + if ( pointLights.length ) { _gl.uniform1i( _program.pointLightNumber, pointLights.length ); _gl.uniform3fv( _program.pointLightPosition, positions ); _gl.uniform3fv( _program.pointLightColor, colors ); - + } - + }; this.createBuffers = function ( object, mf ) { @@ -217,12 +217,12 @@ THREE.WebGLRenderer = function ( scene ) { if ( meshMaterial instanceof THREE.MeshFaceMaterial ) { for ( i = 0, l = materialFaceGroup.material.length; i < l; i++ ) { - + if ( needsSmoothNormals( materialFaceGroup.material[ i ] ) ) { - + useSmoothNormals = true; break; - + } } @@ -230,18 +230,18 @@ THREE.WebGLRenderer = function ( scene ) { } else { if ( needsSmoothNormals( meshMaterial ) ) { - + useSmoothNormals = true; break; - + } } - + if ( useSmoothNormals ) break; } - + for ( f = 0, fl = materialFaceGroup.faces.length; f < fl; f++ ) { fi = materialFaceGroup.faces[f]; @@ -263,23 +263,28 @@ THREE.WebGLRenderer = function ( scene ) { if ( vertexNormals.length == 3 && useSmoothNormals ) { - normalArray.push( vertexNormals[0].x, vertexNormals[0].y, vertexNormals[0].z ); - normalArray.push( vertexNormals[1].x, vertexNormals[1].y, vertexNormals[1].z ); - normalArray.push( vertexNormals[2].x, vertexNormals[2].y, vertexNormals[2].z ); + for ( i = 0; i < 3; i ++ ) { + + normalArray.push( vertexNormals[ i ].x, vertexNormals[ i ].y, vertexNormals[ i ].z ); + + } } else { - normalArray.push( normal.x, normal.y, normal.z ); - normalArray.push( normal.x, normal.y, normal.z ); - normalArray.push( normal.x, normal.y, normal.z ); + for ( i = 0; i < 3; i ++ ) { + + normalArray.push( normal.x, normal.y, normal.z ); + + } } if ( uv ) { - uvArray.push( uv[0].u, uv[0].v ); - uvArray.push( uv[1].u, uv[1].v ); - uvArray.push( uv[2].u, uv[2].v ); + for ( i = 0; i < 3; i ++ ) { + + uvArray.push( uv[ i ].u, uv[ i ].v ); + } } @@ -307,26 +312,28 @@ THREE.WebGLRenderer = function ( scene ) { if ( vertexNormals.length == 4 && useSmoothNormals ) { - normalArray.push( vertexNormals[0].x, vertexNormals[0].y, vertexNormals[0].z ); - normalArray.push( vertexNormals[1].x, vertexNormals[1].y, vertexNormals[1].z ); - normalArray.push( vertexNormals[2].x, vertexNormals[2].y, vertexNormals[2].z ); - normalArray.push( vertexNormals[3].x, vertexNormals[3].y, vertexNormals[3].z ); + for ( i = 0; i < 4; i ++ ) { + + normalArray.push( vertexNormals[ i ].x, vertexNormals[ i ].y, vertexNormals[ i ].z ); + + } } else { - normalArray.push( normal.x, normal.y, normal.z ); - normalArray.push( normal.x, normal.y, normal.z ); - normalArray.push( normal.x, normal.y, normal.z ); - normalArray.push( normal.x, normal.y, normal.z ); + for ( i = 0; i < 4; i ++ ) { + + normalArray.push( normal.x, normal.y, normal.z ); + + } } if ( uv ) { - uvArray.push( uv[0].u, uv[0].v ); - uvArray.push( uv[1].u, uv[1].v ); - uvArray.push( uv[2].u, uv[2].v ); - uvArray.push( uv[3].u, uv[3].v ); + for ( i = 0; i < 4; i ++ ) { + + uvArray.push( uv[ i ].u, uv[ i ].v ); + } } @@ -342,7 +349,7 @@ THREE.WebGLRenderer = function ( scene ) { lineArray.push( vertexIndex + 2, vertexIndex + 3 ); vertexIndex += 4; - + } } @@ -384,76 +391,76 @@ THREE.WebGLRenderer = function ( scene ) { mAmbient, mSpecular, mShininess, mMap, envMap, mixEnvMap, mRefractionRatio, useRefract; - + if ( material instanceof THREE.MeshPhongMaterial || material instanceof THREE.MeshLambertMaterial || material instanceof THREE.MeshBasicMaterial ) { - + mColor = material.color; mOpacity = material.opacity; - + mWireframe = material.wireframe; mLineWidth = material.wireframe_linewidth; - + mBlending = material.blending; - + mMap = material.map; envMap = material.env_map; mixEnvMap = material.combine == THREE.Mix; mReflectivity = material.reflectivity; - + useRefract = material.env_map && material.env_map.mapping == THREE.RefractionMap; mRefractionRatio = material.refraction_ratio; - + _gl.uniform4f( _program.mColor, mColor.r * mOpacity, mColor.g * mOpacity, mColor.b * mOpacity, mOpacity ); - + _gl.uniform1i( _program.mixEnvMap, mixEnvMap ); _gl.uniform1f( _program.mReflectivity, mReflectivity ); - + _gl.uniform1i( _program.useRefract, useRefract ); _gl.uniform1f( _program.mRefractionRatio, mRefractionRatio ); - + } - + if ( material instanceof THREE.MeshNormalMaterial ) { - + mOpacity = material.opacity; mBlending = material.blending; - + _gl.uniform1f( _program.mOpacity, mOpacity ); - + _gl.uniform1i( _program.material, NORMAL ); - + } else if ( material instanceof THREE.MeshDepthMaterial ) { - + mOpacity = material.opacity; - + mWireframe = material.wireframe; mLineWidth = material.wireframe_linewidth; - + _gl.uniform1f( _program.mOpacity, mOpacity ); - + _gl.uniform1f( _program.m2Near, material.__2near ); _gl.uniform1f( _program.mFarPlusNear, material.__farPlusNear ); _gl.uniform1f( _program.mFarMinusNear, material.__farMinusNear ); - + _gl.uniform1i( _program.material, DEPTH ); - + } else if ( material instanceof THREE.MeshPhongMaterial ) { mAmbient = material.ambient; mSpecular = material.specular; mShininess = material.shininess; - + _gl.uniform4f( _program.mAmbient, mAmbient.r, mAmbient.g, mAmbient.b, mOpacity ); _gl.uniform4f( _program.mSpecular, mSpecular.r, mSpecular.g, mSpecular.b, mOpacity ); _gl.uniform1f( _program.mShininess, mShininess ); - + _gl.uniform1i( _program.material, PHONG ); } else if ( material instanceof THREE.MeshLambertMaterial ) { - + _gl.uniform1i( _program.material, LAMBERT ); } else if ( material instanceof THREE.MeshBasicMaterial ) { @@ -463,11 +470,11 @@ THREE.WebGLRenderer = function ( scene ) { } else if ( material instanceof THREE.MeshCubeMaterial ) { _gl.uniform1i( _program.material, CUBE ); - + envMap = material.env_map; - } - + } + if ( mMap ) { if ( !material.__webGLTexture && material.map.image.loaded ) { @@ -491,78 +498,74 @@ THREE.WebGLRenderer = function ( scene ) { _gl.uniform1i( _program.enableMap, 1 ); } else { - + _gl.uniform1i( _program.enableMap, 0 ); - + } - + if ( envMap ) { - - if ( material.env_map && - material.env_map instanceof THREE.TextureCube && - material.env_map.image.length == 6 ) { - - if ( !material.env_map.image.__webGLTextureCube && !material.env_map.image.__cubeMapInitialized && material.env_map.image.loadCount == 6 ) { - + + if ( material.env_map && material.env_map instanceof THREE.TextureCube && + material.env_map.image.length == 6 ) { + + if ( !material.env_map.image.__webGLTextureCube && + !material.env_map.image.__cubeMapInitialized && material.env_map.image.loadCount == 6 ) { + material.env_map.image.__webGLTextureCube = _gl.createTexture(); - + _gl.bindTexture( _gl.TEXTURE_CUBE_MAP, material.env_map.image.__webGLTextureCube ); - + _gl.texParameteri( _gl.TEXTURE_CUBE_MAP, _gl.TEXTURE_WRAP_S, _gl.CLAMP_TO_EDGE ); _gl.texParameteri( _gl.TEXTURE_CUBE_MAP, _gl.TEXTURE_WRAP_T, _gl.CLAMP_TO_EDGE ); - + _gl.texParameteri( _gl.TEXTURE_CUBE_MAP, _gl.TEXTURE_MAG_FILTER, _gl.LINEAR ); _gl.texParameteri( _gl.TEXTURE_CUBE_MAP, _gl.TEXTURE_MIN_FILTER, _gl.LINEAR_MIPMAP_LINEAR ); - - - _gl.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X, 0, _gl.RGBA, _gl.RGBA, _gl.UNSIGNED_BYTE, material.env_map.image[0] ); - _gl.texImage2D( _gl.TEXTURE_CUBE_MAP_NEGATIVE_X, 0, _gl.RGBA, _gl.RGBA, _gl.UNSIGNED_BYTE, material.env_map.image[1] ); - + //_gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, true ); - _gl.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_Y, 0, _gl.RGBA, _gl.RGBA, _gl.UNSIGNED_BYTE, material.env_map.image[2] ); - _gl.texImage2D( _gl.TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, _gl.RGBA, _gl.RGBA, _gl.UNSIGNED_BYTE, material.env_map.image[3] ); + + for ( var i = 0; i < 6; ++i ) { + + _gl.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, _gl.RGBA, _gl.RGBA, _gl.UNSIGNED_BYTE, material.env_map.image[ i ] ); + } + //_gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, false ); - - _gl.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_Z, 0, _gl.RGBA, _gl.RGBA, _gl.UNSIGNED_BYTE, material.env_map.image[4] ); - _gl.texImage2D( _gl.TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, _gl.RGBA, _gl.RGBA, _gl.UNSIGNED_BYTE, material.env_map.image[5] ); - - + _gl.generateMipmap( _gl.TEXTURE_CUBE_MAP ); - + _gl.bindTexture( _gl.TEXTURE_CUBE_MAP, null ); - + material.env_map.image.__cubeMapInitialized = true; - + //log( "texture cube initialised " + material ); - + } - + _gl.activeTexture( _gl.TEXTURE1 ); _gl.bindTexture( _gl.TEXTURE_CUBE_MAP, material.env_map.image.__webGLTextureCube ); _gl.uniform1i( _program.tCube, 1 ); - + } - + _gl.uniform1i( _program.enableCubeMap, 1 ); - + } else { - + _gl.uniform1i( _program.enableCubeMap, 0 ); - + } - + // vertices - + _gl.bindBuffer( _gl.ARRAY_BUFFER, materialFaceGroup.__webGLVertexBuffer ); _gl.vertexAttribPointer( _program.position, 3, _gl.FLOAT, false, 0, 0 ); // normals - + _gl.bindBuffer( _gl.ARRAY_BUFFER, materialFaceGroup.__webGLNormalBuffer ); _gl.vertexAttribPointer( _program.normal, 3, _gl.FLOAT, false, 0, 0 ); // uvs - + if ( mMap ) { _gl.bindBuffer( _gl.ARRAY_BUFFER, materialFaceGroup.__webGLUVBuffer ); @@ -577,14 +580,14 @@ THREE.WebGLRenderer = function ( scene ) { } // render triangles - + if ( ! mWireframe ) { _gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, materialFaceGroup.__webGLFaceBuffer ); _gl.drawElements( _gl.TRIANGLES, materialFaceGroup.__webGLFaceCount, _gl.UNSIGNED_SHORT, 0 ); // render lines - + } else { _gl.lineWidth( mLineWidth ); @@ -596,9 +599,9 @@ THREE.WebGLRenderer = function ( scene ) { }; this.renderPass = function ( object, materialFaceGroup, blending ) { - + var i, l, m, ml, material, meshMaterial; - + for ( m = 0, ml = object.material.length; m < ml; m++ ) { meshMaterial = object.material[ m ]; @@ -609,10 +612,10 @@ THREE.WebGLRenderer = function ( scene ) { material = materialFaceGroup.material[ i ]; if ( material && material.blending == blending ) { - + this.setBlending( material.blending ); this.renderBuffer( material, materialFaceGroup ); - + } } @@ -621,7 +624,7 @@ THREE.WebGLRenderer = function ( scene ) { material = meshMaterial; if ( material && material.blending == blending ) { - + this.setBlending( material.blending ); this.renderBuffer( material, materialFaceGroup ); } @@ -629,15 +632,15 @@ THREE.WebGLRenderer = function ( scene ) { } } - + }; this.render = function( scene, camera ) { - + var o, ol; - + this.initWebGLObjects( scene ); - + if ( this.autoClear ) { this.clear(); @@ -650,40 +653,40 @@ THREE.WebGLRenderer = function ( scene ) { this.setupLights( scene ); // opaque pass - + for ( o = 0, ol = scene.__webGLObjects.length; o < ol; o++ ) { - + webGLObject = scene.__webGLObjects[ o ]; - + this.setupMatrices( webGLObject.__object, camera ); this.renderPass( webGLObject.__object, webGLObject, THREE.NormalBlending ); - + } - + // transparent pass - + for ( o = 0, ol = scene.__webGLObjects.length; o < ol; o++ ) { - + webGLObject = scene.__webGLObjects[ o ]; - + this.setupMatrices( webGLObject.__object, camera ); this.renderPass( webGLObject.__object, webGLObject, THREE.AdditiveBlending ); this.renderPass( webGLObject.__object, webGLObject, THREE.SubtractiveBlending ); - + } - + }; - + this.initWebGLObjects = function( scene ) { - + var o, ol, object, mf, materialFaceGroup; - + if ( !scene.__webGLObjects ) { - + scene.__webGLObjects = []; - + } - + for ( o = 0, ol = scene.objects.length; o < ol; o++ ) { object = scene.objects[ o ]; @@ -691,13 +694,13 @@ THREE.WebGLRenderer = function ( scene ) { if ( object instanceof THREE.Mesh ) { // create separate VBOs per material - + for ( mf in object.materialFaceGroup ) { materialFaceGroup = object.materialFaceGroup[ mf ]; // initialise buffers on the first access - + if( ! materialFaceGroup.__webGLVertexBuffer ) { this.createBuffers( object, mf ); @@ -705,20 +708,20 @@ THREE.WebGLRenderer = function ( scene ) { scene.__webGLObjects.push( materialFaceGroup ); } - + } - } else if ( object instanceof THREE.Line ) { - + }/* else if ( object instanceof THREE.Line ) { + } else if ( object instanceof THREE.Particle ) { - - } - + + }*/ + } - + }; - - + + this.setupMatrices = function ( object, camera ) { object.autoUpdateMatrix && object.updateMatrix(); @@ -740,65 +743,65 @@ THREE.WebGLRenderer = function ( scene ) { }; - + this.setBlending = function( blending ) { - + switch ( blending ) { case THREE.AdditiveBlending: _gl.blendEquation( _gl.FUNC_ADD ); _gl.blendFunc( _gl.ONE, _gl.ONE ); - + break; case THREE.SubtractiveBlending: //_gl.blendEquation( _gl.FUNC_SUBTRACT ); _gl.blendFunc( _gl.DST_COLOR, _gl.ZERO ); - + break; - + default: - + _gl.blendEquation( _gl.FUNC_ADD ); _gl.blendFunc( _gl.ONE, _gl.ONE_MINUS_SRC_ALPHA ); - + break; } - + }; - + this.setFaceCulling = function( cullFace, frontFace ) { - + if ( cullFace ) { - + if ( !frontFace || frontFace == "ccw" ) { - + _gl.frontFace( _gl.CCW ); - + } else { - + _gl.frontFace( _gl.CW ); } - + if( cullFace == "back" ) { - + _gl.cullFace( _gl.BACK ); - + } else if( cullFace == "front" ) { - + _gl.cullFace( _gl.FRONT ); - + } else { - + _gl.cullFace( _gl.FRONT_AND_BACK ); } - + _gl.enable( _gl.CULL_FACE ); - + } else { - + _gl.disable( _gl.CULL_FACE ); } @@ -828,7 +831,7 @@ THREE.WebGLRenderer = function ( scene ) { _gl.frontFace( _gl.CCW ); _gl.cullFace( _gl.BACK ); _gl.enable( _gl.CULL_FACE ); - + _gl.enable( _gl.BLEND ); //_gl.blendFunc( _gl.SRC_ALPHA, _gl.ONE_MINUS_SRC_ALPHA ); //_gl.blendFunc( _gl.SRC_ALPHA, _gl.ONE ); // cool! @@ -838,22 +841,22 @@ THREE.WebGLRenderer = function ( scene ) { }; function generateFragmentShader( maxDirLights, maxPointLights ) { - + var chunks = [ "#ifdef GL_ES", "precision highp float;", "#endif", - + maxDirLights ? "#define MAX_DIR_LIGHTS " + maxDirLights : "", maxPointLights ? "#define MAX_POINT_LIGHTS " + maxPointLights : "", - + "uniform int material;", // 0 - Basic, 1 - Lambert, 2 - Phong, 3 - Depth, 4 - Normal, 5 - Cube "uniform bool enableMap;", "uniform bool enableCubeMap;", "uniform bool mixEnvMap;", - + "uniform samplerCube tCube;", "uniform float mReflectivity;", @@ -868,97 +871,97 @@ THREE.WebGLRenderer = function ( scene ) { "uniform float m2Near;", "uniform float mFarPlusNear;", "uniform float mFarMinusNear;", - + "uniform int pointLightNumber;", "uniform int directionalLightNumber;", - + maxDirLights ? "uniform mat4 viewMatrix;" : "", maxDirLights ? "uniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];" : "", - + "varying vec3 vNormal;", "varying vec2 vUv;", - + "varying vec3 vLightWeighting;", maxPointLights ? "varying vec3 vPointLightVector[ MAX_POINT_LIGHTS ];" : "", - + "varying vec3 vViewPosition;", - + "varying vec3 vReflect;", - + "uniform vec3 cameraPosition;", - + "void main() {", "vec4 mapColor = vec4( 1.0, 1.0, 1.0, 1.0 );", "vec4 cubeColor = vec4( 1.0, 1.0, 1.0, 1.0 );", // diffuse map - + "if ( enableMap ) {", - + "mapColor = texture2D( tMap, vUv );", - + "}", // cube map - + "if ( enableCubeMap ) {", - + "cubeColor = textureCube( tCube, vec3( -vReflect.x, vReflect.yz ) );", - + "}", // Cube - + "if ( material == 5 ) { ", "vec3 wPos = cameraPosition - vViewPosition;", "gl_FragColor = textureCube( tCube, vec3( -wPos.x, wPos.yz ) );", // Normals - + "} else if ( material == 4 ) { ", - + "gl_FragColor = vec4( 0.5*normalize( vNormal ) + vec3(0.5, 0.5, 0.5), mOpacity );", - + // Depth - + "} else if ( material == 3 ) { ", - - // this breaks shader validation in Chrome 9.0.576.0 dev + + // this breaks shader validation in Chrome 9.0.576.0 dev // and also latest continuous build Chromium 9.0.583.0 (66089) // (curiously it works in Chrome 9.0.576.0 canary build and Firefox 4b7) //"float w = 1.0 - ( m2Near / ( mFarPlusNear - gl_FragCoord.z * mFarMinusNear ) );", "float w = 0.5;", - + "gl_FragColor = vec4( w, w, w, mOpacity );", - + // Blinn-Phong // based on o3d example - - "} else if ( material == 2 ) { ", + + "} else if ( material == 2 ) { ", "vec3 normal = normalize( vNormal );", "vec3 viewPosition = normalize( vViewPosition );", // point lights - + maxPointLights ? "vec4 pointDiffuse = vec4( 0.0, 0.0, 0.0, 0.0 );" : "", maxPointLights ? "vec4 pointSpecular = vec4( 0.0, 0.0, 0.0, 0.0 );" : "", maxPointLights ? "for( int i = 0; i < MAX_POINT_LIGHTS; i++ ) {" : "", - + maxPointLights ? "vec3 pointVector = normalize( vPointLightVector[ i ] );" : "", maxPointLights ? "vec3 pointHalfVector = normalize( vPointLightVector[ i ] + vViewPosition );" : "", - + maxPointLights ? "float pointDotNormalHalf = dot( normal, pointHalfVector );" : "", maxPointLights ? "float pointDiffuseWeight = max( dot( normal, pointVector ), 0.0 );" : "", // Ternary conditional is from the original o3d shader. Here it produces abrupt dark cutoff artefacts. // Using just pow works ok in Chrome, but makes different artefact in Firefox 4. // Zeroing on negative pointDotNormalHalf seems to work in both. - + //"float specularCompPoint = dot( normal, pointVector ) < 0.0 || pointDotNormalHalf < 0.0 ? 0.0 : pow( pointDotNormalHalf, mShininess );", //"float specularCompPoint = pow( pointDotNormalHalf, mShininess );", //"float pointSpecularWeight = pointDotNormalHalf < 0.0 ? 0.0 : pow( pointDotNormalHalf, mShininess );", @@ -969,28 +972,28 @@ THREE.WebGLRenderer = function ( scene ) { maxPointLights ? "float pointSpecularWeight = 0.0;" : "", maxPointLights ? "if ( pointDotNormalHalf >= 0.0 )" : "", maxPointLights ? "pointSpecularWeight = pow( pointDotNormalHalf, mShininess );" : "", - + maxPointLights ? "pointDiffuse += mColor * pointDiffuseWeight;" : "", maxPointLights ? "pointSpecular += mSpecular * pointSpecularWeight;" : "", - + maxPointLights ? "}" : "", // directional lights maxDirLights ? "vec4 dirDiffuse = vec4( 0.0, 0.0, 0.0, 0.0 );" : "", maxDirLights ? "vec4 dirSpecular = vec4( 0.0, 0.0, 0.0, 0.0 );" : "", - + maxDirLights ? "for( int i = 0; i < MAX_DIR_LIGHTS; i++ ) {" : "", maxDirLights ? "vec4 lDirection = viewMatrix * vec4( directionalLightDirection[ i ], 0.0 );" : "", maxDirLights ? "vec3 dirVector = normalize( lDirection.xyz );" : "", maxDirLights ? "vec3 dirHalfVector = normalize( lDirection.xyz + vViewPosition );" : "", - + maxDirLights ? "float dirDotNormalHalf = dot( normal, dirHalfVector );" : "", - maxDirLights ? "float dirDiffuseWeight = max( dot( normal, dirVector ), 0.0 );" : "", - + maxDirLights ? "float dirDiffuseWeight = max( dot( normal, dirVector ), 0.0 );" : "", + maxDirLights ? "float dirSpecularWeight = 0.0;" : "", maxDirLights ? "if ( dirDotNormalHalf >= 0.0 )" : "", maxDirLights ? "dirSpecularWeight = pow( dirDotNormalHalf, mShininess );" : "", @@ -1001,66 +1004,66 @@ THREE.WebGLRenderer = function ( scene ) { maxDirLights ? "}" : "", // all lights contribution summation - + "vec4 totalLight = mAmbient;", maxDirLights ? "totalLight += dirDiffuse + dirSpecular;" : "", maxPointLights ? "totalLight += pointDiffuse + pointSpecular;" : "", // looks nicer with weighting - + "if ( mixEnvMap ) {", - + "gl_FragColor = vec4( mix( mapColor.rgb * totalLight.xyz * vLightWeighting, cubeColor.rgb, mReflectivity ), mapColor.a );", - + "} else {", - + "gl_FragColor = vec4( mapColor.rgb * cubeColor.rgb * totalLight.xyz * vLightWeighting, mapColor.a );", - + "}", - + // Lambert: diffuse lighting - - "} else if ( material == 1 ) {", + + "} else if ( material == 1 ) {", "if ( mixEnvMap ) {", - + "gl_FragColor = vec4( mix( mColor.rgb * mapColor.rgb * vLightWeighting, cubeColor.rgb, mReflectivity ), mColor.a * mapColor.a );", - + "} else {", - + "gl_FragColor = vec4( mColor.rgb * mapColor.rgb * cubeColor.rgb * vLightWeighting, mColor.a * mapColor.a );", - + "}", - + // Basic: unlit color / texture - - "} else {", + + "} else {", "if ( mixEnvMap ) {", "gl_FragColor = mix( mColor * mapColor, cubeColor, mReflectivity );", - + "} else {", "gl_FragColor = mColor * mapColor * cubeColor;", - + "}", - + "}", "}" ]; - + return chunks.join("\n"); - + }; - + function generateVertexShader( maxDirLights, maxPointLights ) { - + var chunks = [ - + maxDirLights ? "#define MAX_DIR_LIGHTS " + maxDirLights : "", maxPointLights ? "#define MAX_POINT_LIGHTS " + maxPointLights : "", - + "attribute vec3 position;", "attribute vec3 normal;", "attribute vec2 uv;", @@ -1069,12 +1072,12 @@ THREE.WebGLRenderer = function ( scene ) { "uniform bool enableLighting;", "uniform bool useRefract;", - + "uniform int pointLightNumber;", "uniform int directionalLightNumber;", - + "uniform vec3 ambientLightColor;", - + maxDirLights ? "uniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];" : "", maxDirLights ? "uniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];" : "", @@ -1089,29 +1092,29 @@ THREE.WebGLRenderer = function ( scene ) { "varying vec3 vNormal;", "varying vec2 vUv;", - + "varying vec3 vLightWeighting;", maxPointLights ? "varying vec3 vPointLightVector[ MAX_POINT_LIGHTS ];" : "", - + "varying vec3 vViewPosition;", - + "varying vec3 vReflect;", "uniform float mRefractionRatio;", "void main(void) {", // world space - + "vec4 mPosition = objMatrix * vec4( position, 1.0 );", "vViewPosition = cameraPosition - mPosition.xyz;", - + // this doesn't work on Mac //"vec3 nWorld = mat3(objMatrix) * normal;", "vec3 nWorld = mat3( objMatrix[0].xyz, objMatrix[1].xyz, objMatrix[2].xyz ) * normal;", - + // eye space - + "vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );", "vec3 transformedNormal = normalize( normalMatrix * normal );", @@ -1122,54 +1125,54 @@ THREE.WebGLRenderer = function ( scene ) { "} else {", "vLightWeighting = ambientLightColor;", - + // directional lights - + maxDirLights ? "for( int i = 0; i < MAX_DIR_LIGHTS; i++ ) {" : "", maxDirLights ? "vec4 lDirection = viewMatrix * vec4( directionalLightDirection[ i ], 0.0 );" : "", maxDirLights ? "float directionalLightWeighting = max( dot( transformedNormal, normalize(lDirection.xyz ) ), 0.0 );" : "", maxDirLights ? "vLightWeighting += directionalLightColor[ i ] * directionalLightWeighting;" : "", maxDirLights ? "}" : "", - + // point lights - + maxPointLights ? "for( int i = 0; i < MAX_POINT_LIGHTS; i++ ) {" : "", maxPointLights ? "vec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );" : "", maxPointLights ? "vPointLightVector[ i ] = normalize( lPosition.xyz - mvPosition.xyz );" : "", maxPointLights ? "float pointLightWeighting = max( dot( transformedNormal, vPointLightVector[ i ] ), 0.0 );" : "", maxPointLights ? "vLightWeighting += pointLightColor[ i ] * pointLightWeighting;" : "", maxPointLights ? "}" : "", - + "}", "vNormal = transformedNormal;", "vUv = uv;", "if ( useRefract ) {", - + "vReflect = refract( normalize(mPosition.xyz - cameraPosition), normalize(nWorld.xyz), mRefractionRatio );", - + "} else {", - + "vReflect = reflect( normalize(mPosition.xyz - cameraPosition), normalize(nWorld.xyz) );", - + "}", - + "gl_Position = projectionMatrix * mvPosition;", "}" ]; - + return chunks.join("\n"); - + }; - + function initProgram( maxDirLights, maxPointLights ) { _program = _gl.createProgram(); - + //log ( generateVertexShader( maxDirLights, maxPointLights ) ); //log ( generateFragmentShader( maxDirLights, maxPointLights ) ); - + _gl.attachShader( _program, getShader( "fragment", generateFragmentShader( maxDirLights, maxPointLights ) ) ); _gl.attachShader( _program, getShader( "vertex", generateVertexShader( maxDirLights, maxPointLights ) ) ); @@ -1182,12 +1185,12 @@ THREE.WebGLRenderer = function ( scene ) { alert( "VALIDATE_STATUS: " + _gl.getProgramParameter( _program, _gl.VALIDATE_STATUS ) ); alert( _gl.getError() ); } - + _gl.useProgram( _program ); // matrices - + _program.viewMatrix = _gl.getUniformLocation( _program, "viewMatrix" ); _program.modelViewMatrix = _gl.getUniformLocation( _program, "modelViewMatrix" ); _program.projectionMatrix = _gl.getUniformLocation( _program, "projectionMatrix" ); @@ -1197,77 +1200,77 @@ THREE.WebGLRenderer = function ( scene ) { _program.cameraPosition = _gl.getUniformLocation( _program, 'cameraPosition' ); // lights - + _program.enableLighting = _gl.getUniformLocation( _program, 'enableLighting' ); - + _program.ambientLightColor = _gl.getUniformLocation( _program, 'ambientLightColor' ); - + if ( maxDirLights ) { - + _program.directionalLightNumber = _gl.getUniformLocation( _program, 'directionalLightNumber' ); _program.directionalLightColor = _gl.getUniformLocation( _program, 'directionalLightColor' ); _program.directionalLightDirection = _gl.getUniformLocation( _program, 'directionalLightDirection' ); - + } if ( maxPointLights ) { - + _program.pointLightNumber = _gl.getUniformLocation( _program, 'pointLightNumber' ); _program.pointLightColor = _gl.getUniformLocation( _program, 'pointLightColor' ); _program.pointLightPosition = _gl.getUniformLocation( _program, 'pointLightPosition' ); - + } // material - + _program.material = _gl.getUniformLocation( _program, 'material' ); - + // material properties (Basic / Lambert / Blinn-Phong shader) - + _program.mColor = _gl.getUniformLocation( _program, 'mColor' ); _program.mOpacity = _gl.getUniformLocation( _program, 'mOpacity' ); _program.mReflectivity = _gl.getUniformLocation( _program, 'mReflectivity' ); // material properties (Blinn-Phong shader) - + _program.mAmbient = _gl.getUniformLocation( _program, 'mAmbient' ); _program.mSpecular = _gl.getUniformLocation( _program, 'mSpecular' ); _program.mShininess = _gl.getUniformLocation( _program, 'mShininess' ); // texture (diffuse map) - + _program.enableMap = _gl.getUniformLocation( _program, "enableMap" ); _gl.uniform1i( _program.enableMap, 0 ); - + _program.tMap = _gl.getUniformLocation( _program, "tMap" ); _gl.uniform1i( _program.tMap, 0 ); // cube texture - + _program.enableCubeMap = _gl.getUniformLocation( _program, "enableCubeMap" ); _gl.uniform1i( _program.enableCubeMap, 0 ); - + _program.tCube = _gl.getUniformLocation( _program, "tCube" ); _gl.uniform1i( _program.tCube, 1 ); // it's important to use non-zero texture unit, otherwise it doesn't work _program.mixEnvMap = _gl.getUniformLocation( _program, "mixEnvMap" ); _gl.uniform1i( _program.mixEnvMap, 0 ); - + // refraction - + _program.mRefractionRatio = _gl.getUniformLocation( _program, 'mRefractionRatio' ); - + _program.useRefract = _gl.getUniformLocation( _program, "useRefract" ); _gl.uniform1i( _program.useRefract, 0 ); - + // material properties (Depth) - + _program.m2Near = _gl.getUniformLocation( _program, 'm2Near' ); _program.mFarPlusNear = _gl.getUniformLocation( _program, 'mFarPlusNear' ); _program.mFarMinusNear = _gl.getUniformLocation( _program, 'mFarMinusNear' ); - + // vertex arrays - + _program.position = _gl.getAttribLocation( _program, "position" ); _gl.enableVertexAttribArray( _program.position ); @@ -1309,37 +1312,37 @@ THREE.WebGLRenderer = function ( scene ) { } return shader; - + }; /* DEBUG function getGLParams() { - + var params = { - + 'MAX_VARYING_VECTORS': _gl.getParameter( _gl.MAX_VARYING_VECTORS ), 'MAX_VERTEX_ATTRIBS': _gl.getParameter( _gl.MAX_VERTEX_ATTRIBS ), - + 'MAX_TEXTURE_IMAGE_UNITS': _gl.getParameter( _gl.MAX_TEXTURE_IMAGE_UNITS ), 'MAX_VERTEX_TEXTURE_IMAGE_UNITS': _gl.getParameter( _gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS ), 'MAX_COMBINED_TEXTURE_IMAGE_UNITS' : _gl.getParameter( _gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS ), - + 'MAX_VERTEX_UNIFORM_VECTORS': _gl.getParameter( _gl.MAX_VERTEX_UNIFORM_VECTORS ), 'MAX_FRAGMENT_UNIFORM_VECTORS': _gl.getParameter( _gl.MAX_FRAGMENT_UNIFORM_VECTORS ) } - + return params; }; - + function dumpObject( obj ) { - + var p, str = ""; for ( p in obj ) { - + str += p + ": " + obj[p] + "\n"; - + } - + return str; } */