From 5bcf179d3e88c31e6a23da50c3bae020b8239b28 Mon Sep 17 00:00:00 2001 From: "Mr.doob" Date: Fri, 25 Nov 2011 00:18:21 +0100 Subject: [PATCH] Merging with @alteredq's branch. --- build/Three.js | 559 +++++++++--------- build/custom/ThreeCanvas.js | 2 +- build/custom/ThreeDOM.js | 2 +- build/custom/ThreeExtras.js | 201 +++---- build/custom/ThreeSVG.js | 2 +- build/custom/ThreeWebGL.js | 4 +- ...camera_earth.html => misc_camera_fly.html} | 0 ...tml => webgl_geometry_colors_blender.html} | 0 ...collada.html => webgl_loader_collada.html} | 0 ...er.html => webgl_loader_json_blender.html} | 0 ...ml => webgl_loader_json_objconverter.html} | 0 ...cene_test.html => webgl_loader_scene.html} | 0 ...r.html => webgl_loader_scene_blender.html} | 0 ...utf8loader.html => webgl_loader_utf8.html} | 0 src/extras/GeometryUtils.js | 29 +- 15 files changed, 413 insertions(+), 386 deletions(-) rename examples/{webgl_flycamera_earth.html => misc_camera_fly.html} (100%) rename examples/{webgl_geometry_blenderexport_colors.html => webgl_geometry_colors_blender.html} (100%) rename examples/{webgl_collada.html => webgl_loader_collada.html} (100%) rename examples/{webgl_collada_blender.html => webgl_loader_json_blender.html} (100%) rename examples/{webgl_objconvert_test.html => webgl_loader_json_objconverter.html} (100%) rename examples/{webgl_scene_test.html => webgl_loader_scene.html} (100%) rename examples/{webgl_scene_test_blender.html => webgl_loader_scene_blender.html} (100%) rename examples/{webgl_utf8loader.html => webgl_loader_utf8.html} (100%) diff --git a/build/Three.js b/build/Three.js index 9d8e947d9e..6c246c9fe6 100644 --- a/build/Three.js +++ b/build/Three.js @@ -1,6 +1,6 @@ // Three.js r47dev - http://github.com/mrdoob/three.js var THREE=THREE||{};if(!self.Int32Array)self.Int32Array=Array,self.Float32Array=Array;THREE.Clock=function(a){this.autoStart=a!==void 0?a:!0;this.elapsedTime=this.oldTime=this.startTime=0;this.running=!1};THREE.Clock.prototype.start=function(){this.oldTime=this.startTime=Date.now();this.running=!0};THREE.Clock.prototype.stop=function(){this.getElapsedTime();this.running=!1};THREE.Clock.prototype.getElapsedTime=function(){this.elapsedTime+=this.getDelta();return this.elapsedTime}; -THREE.Clock.prototype.getDelta=function(){var a=0;this.autoStart&&!this.running&&this.start();if(this.running){var b=Date.now(),a=0.001*(b-this.oldTime);this.oldTime=b;this.elapsedTime+=a}return a};THREE.Color=function(a){a!==void 0&&this.setHex(a);return this}; +THREE.Clock.prototype.getDelta=function(){var a=0;this.autoStart&&!this.running&&this.start();if(this.running){var b=Date.now(),a=0.0010*(b-this.oldTime);this.oldTime=b;this.elapsedTime+=a}return a};THREE.Color=function(a){a!==void 0&&this.setHex(a);return this}; THREE.Color.prototype={constructor:THREE.Color,r:1,g:1,b:1,copy:function(a){this.r=a.r;this.g=a.g;this.b=a.b;return this},copyGammaToLinear:function(a){this.r=a.r*a.r;this.g=a.g*a.g;this.b=a.b*a.b;return this},copyLinearToGamma:function(a){this.r=Math.sqrt(a.r);this.g=Math.sqrt(a.g);this.b=Math.sqrt(a.b);return this},setRGB:function(a,b,c){this.r=a;this.g=b;this.b=c;return this},setHSV:function(a,b,c){var d,e,f;if(c===0)this.r=this.g=this.b=0;else switch(d=Math.floor(a*6),e=a*6-d,a=c*(1-b),f=c*(1- b*e),b=c*(1-b*(1-e)),d){case 1:this.r=f;this.g=c;this.b=a;break;case 2:this.r=a;this.g=c;this.b=b;break;case 3:this.r=a;this.g=f;this.b=c;break;case 4:this.r=b;this.g=a;this.b=c;break;case 5:this.r=c;this.g=a;this.b=f;break;case 6:case 0:this.r=c,this.g=b,this.b=a}return this},setHex:function(a){a=Math.floor(a);this.r=(a>>16&255)/255;this.g=(a>>8&255)/255;this.b=(a&255)/255;return this},getHex:function(){return Math.floor(this.r*255)<<16^Math.floor(this.g*255)<<8^Math.floor(this.b*255)},getContextStyle:function(){return"rgb("+ Math.floor(this.r*255)+","+Math.floor(this.g*255)+","+Math.floor(this.b*255)+")"},clone:function(){return(new THREE.Color).setRGB(this.r,this.g,this.b)}};THREE.Frustum=function(){this.planes=[new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4]}; @@ -17,11 +17,11 @@ this.y=Math.asin(a.n13);Math.abs(b)>1.0E-5?(this.x=Math.atan2(-a.n23/b,a.n33/b), THREE.Vector4.prototype={constructor:THREE.Vector4,set:function(a,b,c,d){this.x=a;this.y=b;this.z=c;this.w=d;return this},copy:function(a){this.x=a.x;this.y=a.y;this.z=a.z;this.w=a.w!==void 0?a.w:1},clone:function(){return new THREE.Vector4(this.x,this.y,this.z,this.w)},add:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;this.z=a.z+b.z;this.w=a.w+b.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,b){this.x=a.x-b.x;this.y=a.y-b.y;this.z=a.z- b.z;this.w=a.w-b.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){a?(this.x/=a,this.y/=a,this.z/=a,this.w/=a):(this.z=this.y=this.x=0,this.w=1);return this},negate:function(){return this.multiplyScalar(-1)},dot:function(a){return this.x*a.x+this.y*a.y+this.z*a.z+this.w*a.w},lengthSq:function(){return this.dot(this)},length:function(){return Math.sqrt(this.lengthSq())}, normalize:function(){return this.divideScalar(this.length())},setLength:function(a){return this.normalize().multiplyScalar(a)},lerpSelf:function(a,b){this.x+=(a.x-this.x)*b;this.y+=(a.y-this.y)*b;this.z+=(a.z-this.z)*b;this.w+=(a.w-this.w)*b;return this}}; -THREE.Ray=function(a,b){function c(a,b,c){o.sub(c,a);q=o.dot(b);if(q<=0)return null;n=p.add(a,m.copy(b).multiplyScalar(q));return s=c.distanceTo(n)}function d(a,b,c,d){o.sub(d,b);p.sub(c,b);m.sub(a,b);r=o.dot(o);t=o.dot(p);u=o.dot(m);x=p.dot(p);G=p.dot(m);w=1/(r*x-t*t);B=(x*u-t*G)*w;E=(r*G-t*u)*w;return B>=0&&E>=0&&B+E<1}this.origin=a||new THREE.Vector3;this.direction=b||new THREE.Vector3;this.intersectScene=function(a){return this.intersectObjects(a.children)};this.intersectObjects=function(a){var b, +THREE.Ray=function(a,b){function c(a,b,c){o.sub(c,a);q=o.dot(b);if(q<=0)return null;n=p.add(a,m.copy(b).multiplyScalar(q));return s=c.distanceTo(n)}function d(a,b,c,d){o.sub(d,b);p.sub(c,b);m.sub(a,b);r=o.dot(o);u=o.dot(p);t=o.dot(m);z=p.dot(p);A=p.dot(m);E=1/(r*z-u*u);D=(z*t-u*A)*E;B=(r*A-u*t)*E;return D>=0&&B>=0&&D+B<1}this.origin=a||new THREE.Vector3;this.direction=b||new THREE.Vector3;this.intersectScene=function(a){return this.intersectObjects(a.children)};this.intersectObjects=function(a){var b, c,d=[];b=0;for(c=a.length;bm.scale.x)return[];n={distance:o,point:m.position,face:null,object:m};q.push(n)}else if(m instanceof THREE.Mesh){o=c(this.origin,this.direction,m.matrixWorld.getPosition());if(o===null||o>m.geometry.boundingSphere.radius*Math.max(m.scale.x,Math.max(m.scale.y,m.scale.z)))return q;var s,r=m.geometry,t=r.vertices,u;m.matrixRotationWorld.extractRotation(m.matrixWorld);o=0;for(p=r.faces.length;o0:s<0)))if(s=k.dot(i.sub(e,a))/s,j.add(a,b.multiplyScalar(s)),n instanceof THREE.Face3)d(j, -e,f,g)&&(n={distance:a.distanceTo(j),point:j.clone(),face:n,object:m},q.push(n));else if(n instanceof THREE.Face4&&(d(j,e,f,h)||d(j,f,g,h)))n={distance:a.distanceTo(j),point:j.clone(),face:n,object:m},q.push(n)}return q};var o=new THREE.Vector3,p=new THREE.Vector3,m=new THREE.Vector3,q,n,s,r,t,u,x,G,w,B,E}; +c(this.origin,this.direction,m.matrixWorld.getPosition());if(o===null||o>m.scale.x)return[];n={distance:o,point:m.position,face:null,object:m};q.push(n)}else if(m instanceof THREE.Mesh){o=c(this.origin,this.direction,m.matrixWorld.getPosition());if(o===null||o>m.geometry.boundingSphere.radius*Math.max(m.scale.x,Math.max(m.scale.y,m.scale.z)))return q;var s,r=m.geometry,u=r.vertices,t;m.matrixRotationWorld.extractRotation(m.matrixWorld);o=0;for(p=r.faces.length;o0:s<0)))if(s=k.dot(i.sub(e,a))/s,j.add(a,b.multiplyScalar(s)),n instanceof THREE.Face3)d(j, +e,f,g)&&(n={distance:a.distanceTo(j),point:j.clone(),face:n,object:m},q.push(n));else if(n instanceof THREE.Face4&&(d(j,e,f,h)||d(j,f,g,h)))n={distance:a.distanceTo(j),point:j.clone(),face:n,object:m},q.push(n)}return q};var o=new THREE.Vector3,p=new THREE.Vector3,m=new THREE.Vector3,q,n,s,r,u,t,z,A,E,D,B}; THREE.Rectangle=function(){function a(){f=d-b;g=e-c}var b,c,d,e,f,g,h=!0;this.getX=function(){return b};this.getY=function(){return c};this.getWidth=function(){return f};this.getHeight=function(){return g};this.getLeft=function(){return b};this.getTop=function(){return c};this.getRight=function(){return d};this.getBottom=function(){return e};this.set=function(f,g,j,o){h=!1;b=f;c=g;d=j;e=o;a()};this.addPoint=function(f,g){h?(h=!1,b=f,c=g,d=f,e=g):(b=bf?d:f,e=e>g?e:g);a()};this.add3Points= function(f,g,j,o,p,m){h?(h=!1,b=fj?f>p?f:p:j>p?j:p,e=g>o?g>m?g:m:o>m?o:m):(b=fj?f>p?f>d?f:d:p>d?p:d:j>p?j>d?j:d:p>d?p:d,e=g>o?g>m?g>e?g:e:m>e?m:e:o>m?o>e?o:e:m>e?m:e);a()};this.addRectangle=function(f){h?(h=!1,b=f.getLeft(),c=f.getTop(),d=f.getRight(),e=f.getBottom()):(b=bf.getRight()?d:f.getRight(),e=e> f.getBottom()?e:f.getBottom());a()};this.inflate=function(f){b-=f;c-=f;d+=f;e+=f;a()};this.minSelf=function(f){b=b>f.getLeft()?b:f.getLeft();c=c>f.getTop()?c:f.getTop();d=da.getRight())return!1;if(ea.getBottom())return!1;return!0};this.empty=function(){h=!0;e=d=c=b=0;a()};this.isEmpty=function(){return h}}; @@ -30,8 +30,8 @@ THREE.Matrix3.prototype={constructor:THREE.Matrix3,transpose:function(){var a,b= THREE.Matrix4=function(a,b,c,d,e,f,g,h,i,k,j,o,p,m,q,n){this.set(a!==void 0?a:1,b||0,c||0,d||0,e||0,f!==void 0?f:1,g||0,h||0,i||0,k||0,j!==void 0?j:1,o||0,p||0,m||0,q||0,n!==void 0?n:1);this.flat=Array(16);this.m33=new THREE.Matrix3}; THREE.Matrix4.prototype={constructor:THREE.Matrix4,set:function(a,b,c,d,e,f,g,h,i,k,j,o,p,m,q,n){this.n11=a;this.n12=b;this.n13=c;this.n14=d;this.n21=e;this.n22=f;this.n23=g;this.n24=h;this.n31=i;this.n32=k;this.n33=j;this.n34=o;this.n41=p;this.n42=m;this.n43=q;this.n44=n;return this},identity:function(){this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1);return this},copy:function(a){this.set(a.n11,a.n12,a.n13,a.n14,a.n21,a.n22,a.n23,a.n24,a.n31,a.n32,a.n33,a.n34,a.n41,a.n42,a.n43,a.n44);return this},lookAt:function(a, b,c){var d=THREE.Matrix4.__v1,e=THREE.Matrix4.__v2,f=THREE.Matrix4.__v3;f.sub(a,b).normalize();if(f.length()===0)f.z=1;d.cross(c,f).normalize();d.length()===0&&(f.x+=1.0E-4,d.cross(c,f).normalize());e.cross(f,d).normalize();this.n11=d.x;this.n12=e.x;this.n13=f.x;this.n21=d.y;this.n22=e.y;this.n23=f.y;this.n31=d.z;this.n32=e.z;this.n33=f.z;return this},multiply:function(a,b){var c=a.n11,d=a.n12,e=a.n13,f=a.n14,g=a.n21,h=a.n22,i=a.n23,k=a.n24,j=a.n31,o=a.n32,p=a.n33,m=a.n34,q=a.n41,n=a.n42,s=a.n43, -r=a.n44,t=b.n11,u=b.n12,x=b.n13,G=b.n14,w=b.n21,B=b.n22,E=b.n23,I=b.n24,R=b.n31,z=b.n32,A=b.n33,K=b.n34,X=b.n41,T=b.n42,$=b.n43,V=b.n44;this.n11=c*t+d*w+e*R+f*X;this.n12=c*u+d*B+e*z+f*T;this.n13=c*x+d*E+e*A+f*$;this.n14=c*G+d*I+e*K+f*V;this.n21=g*t+h*w+i*R+k*X;this.n22=g*u+h*B+i*z+k*T;this.n23=g*x+h*E+i*A+k*$;this.n24=g*G+h*I+i*K+k*V;this.n31=j*t+o*w+p*R+m*X;this.n32=j*u+o*B+p*z+m*T;this.n33=j*x+o*E+p*A+m*$;this.n34=j*G+o*I+p*K+m*V;this.n41=q*t+n*w+s*R+r*X;this.n42=q*u+n*B+s*z+r*T;this.n43=q*x+n* -E+s*A+r*$;this.n44=q*G+n*I+s*K+r*V;return this},multiplySelf:function(a){return this.multiply(this,a)},multiplyToArray:function(a,b,c){this.multiply(a,b);c[0]=this.n11;c[1]=this.n21;c[2]=this.n31;c[3]=this.n41;c[4]=this.n12;c[5]=this.n22;c[6]=this.n32;c[7]=this.n42;c[8]=this.n13;c[9]=this.n23;c[10]=this.n33;c[11]=this.n43;c[12]=this.n14;c[13]=this.n24;c[14]=this.n34;c[15]=this.n44;return this},multiplyScalar:function(a){this.n11*=a;this.n12*=a;this.n13*=a;this.n14*=a;this.n21*=a;this.n22*=a;this.n23*= +r=a.n44,u=b.n11,t=b.n12,z=b.n13,A=b.n14,E=b.n21,D=b.n22,B=b.n23,w=b.n24,G=b.n31,y=b.n32,K=b.n33,$=b.n34,Q=b.n41,X=b.n42,S=b.n43,R=b.n44;this.n11=c*u+d*E+e*G+f*Q;this.n12=c*t+d*D+e*y+f*X;this.n13=c*z+d*B+e*K+f*S;this.n14=c*A+d*w+e*$+f*R;this.n21=g*u+h*E+i*G+k*Q;this.n22=g*t+h*D+i*y+k*X;this.n23=g*z+h*B+i*K+k*S;this.n24=g*A+h*w+i*$+k*R;this.n31=j*u+o*E+p*G+m*Q;this.n32=j*t+o*D+p*y+m*X;this.n33=j*z+o*B+p*K+m*S;this.n34=j*A+o*w+p*$+m*R;this.n41=q*u+n*E+s*G+r*Q;this.n42=q*t+n*D+s*y+r*X;this.n43=q*z+n* +B+s*K+r*S;this.n44=q*A+n*w+s*$+r*R;return this},multiplySelf:function(a){return this.multiply(this,a)},multiplyToArray:function(a,b,c){this.multiply(a,b);c[0]=this.n11;c[1]=this.n21;c[2]=this.n31;c[3]=this.n41;c[4]=this.n12;c[5]=this.n22;c[6]=this.n32;c[7]=this.n42;c[8]=this.n13;c[9]=this.n23;c[10]=this.n33;c[11]=this.n43;c[12]=this.n14;c[13]=this.n24;c[14]=this.n34;c[15]=this.n44;return this},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;return this},multiplyVector3:function(a){var b=a.x,c=a.y,d=a.z,e=1/(this.n41*b+this.n42*c+this.n43*d+this.n44);a.x=(this.n11*b+this.n12*c+this.n13*d+this.n14)*e;a.y=(this.n21*b+this.n22*c+this.n23*d+this.n24)*e;a.z=(this.n31*b+this.n32*c+this.n33*d+this.n34)*e;return a},multiplyVector4:function(a){var b=a.x,c=a.y,d=a.z,e=a.w;a.x=this.n11*b+this.n12*c+this.n13*d+this.n14*e;a.y=this.n21*b+this.n22* c+this.n23*d+this.n24*e;a.z=this.n31*b+this.n32*c+this.n33*d+this.n34*e;a.w=this.n41*b+this.n42*c+this.n43*d+this.n44*e;return a},rotateAxis:function(a){var b=a.x,c=a.y,d=a.z;a.x=b*this.n11+c*this.n12+d*this.n13;a.y=b*this.n21+c*this.n22+d*this.n23;a.z=b*this.n31+c*this.n32+d*this.n33;a.normalize();return a},crossVector:function(a){var b=new THREE.Vector4;b.x=this.n11*a.x+this.n12*a.y+this.n13*a.z+this.n14*a.w;b.y=this.n21*a.x+this.n22*a.y+this.n23*a.z+this.n24*a.w;b.z=this.n31*a.x+this.n32*a.y+this.n33* a.z+this.n34*a.w;b.w=a.w?this.n41*a.x+this.n42*a.y+this.n43*a.z+this.n44*a.w:1;return b},determinant:function(){var a=this.n11,b=this.n12,c=this.n13,d=this.n14,e=this.n21,f=this.n22,g=this.n23,h=this.n24,i=this.n31,k=this.n32,j=this.n33,o=this.n34,p=this.n41,m=this.n42,q=this.n43,n=this.n44;return d*g*k*p-c*h*k*p-d*f*j*p+b*h*j*p+c*f*o*p-b*g*o*p-d*g*i*m+c*h*i*m+d*e*j*m-a*h*j*m-c*e*o*m+a*g*o*m+d*f*i*q-b*h*i*q-d*e*k*q+a*h*k*q+b*e*o*q-a*f*o*q-c*f*i*n+b*g*i*n+c*e*k*n-a*g*k*n-b*e*j*n+a*f*j*n},transpose:function(){var a; @@ -48,8 +48,8 @@ e,j=c*h,o=c*e,this.n11=g*h,this.n12=-g*e,this.n13=d,this.n21=k+j*d,this.n22=i-o* a;this.n21*=b;this.n22*=c;this.n23*=a;this.n31*=b;this.n32*=c;this.n33*=a;this.n41*=b;this.n42*=c;this.n43*=a;return this},compose:function(a,b,c){var d=THREE.Matrix4.__m1,e=THREE.Matrix4.__m2;d.identity();d.setRotationFromQuaternion(b);e.setScale(c.x,c.y,c.z);this.multiply(d,e);this.n14=a.x;this.n24=a.y;this.n34=a.z;return this},decompose:function(a,b,c){var d=THREE.Matrix4.__v1,e=THREE.Matrix4.__v2,f=THREE.Matrix4.__v3;d.set(this.n11,this.n21,this.n31);e.set(this.n12,this.n22,this.n32);f.set(this.n13, this.n23,this.n33);a=a instanceof THREE.Vector3?a:new THREE.Vector3;b=b instanceof THREE.Quaternion?b:new THREE.Quaternion;c=c instanceof THREE.Vector3?c:new THREE.Vector3;c.x=d.length();c.y=e.length();c.z=f.length();a.x=this.n14;a.y=this.n24;a.z=this.n34;d=THREE.Matrix4.__m1;d.copy(this);d.n11/=c.x;d.n21/=c.x;d.n31/=c.x;d.n12/=c.y;d.n22/=c.y;d.n32/=c.y;d.n13/=c.z;d.n23/=c.z;d.n33/=c.z;b.setFromRotationMatrix(d);return[a,b,c]},extractPosition:function(a){this.n14=a.n14;this.n24=a.n24;this.n34=a.n34; return this},extractRotation:function(a){var b=THREE.Matrix4.__v1,c=1/b.set(a.n11,a.n21,a.n31).length(),d=1/b.set(a.n12,a.n22,a.n32).length(),b=1/b.set(a.n13,a.n23,a.n33).length();this.n11=a.n11*c;this.n21=a.n21*c;this.n31=a.n31*c;this.n12=a.n12*d;this.n22=a.n22*d;this.n32=a.n32*d;this.n13=a.n13*b;this.n23=a.n23*b;this.n33=a.n33*b;return this},rotateByAxis:function(a,b){if(a.x===1&&a.y===0&&a.z===0)return this.rotateX(b);else if(a.x===0&&a.y===1&&a.z===0)return this.rotateY(b);else if(a.x===0&&a.y=== -0&&a.z===1)return this.rotateZ(b);var c=a.x,d=a.y,e=a.z,f=Math.sqrt(c*c+d*d+e*e);c/=f;d/=f;e/=f;var f=c*c,g=d*d,h=e*e,i=Math.cos(b),k=Math.sin(b),j=1-i,o=c*d*j,p=c*e*j;j*=d*e;c*=k;var m=d*k;k*=e;e=f+(1-f)*i;f=o+k;d=p-m;o-=k;g+=(1-g)*i;k=j+c;p+=m;j-=c;h+=(1-h)*i;var i=this.n11,c=this.n21,m=this.n31,q=this.n41,n=this.n12,s=this.n22,r=this.n32,t=this.n42,u=this.n13,x=this.n23,G=this.n33,w=this.n43;this.n11=e*i+f*n+d*u;this.n21=e*c+f*s+d*x;this.n31=e*m+f*r+d*G;this.n41=e*q+f*t+d*w;this.n12=o*i+g*n+k* -u;this.n22=o*c+g*s+k*x;this.n32=o*m+g*r+k*G;this.n42=o*q+g*t+k*w;this.n13=p*i+j*n+h*u;this.n23=p*c+j*s+h*x;this.n33=p*m+j*r+h*G;this.n43=p*q+j*t+h*w;return this},rotateX:function(a){var b=this.n12,c=this.n22,d=this.n32,e=this.n42,f=this.n13,g=this.n23,h=this.n33,i=this.n43,k=Math.cos(a),a=Math.sin(a);this.n12=k*b+a*f;this.n22=k*c+a*g;this.n32=k*d+a*h;this.n42=k*e+a*i;this.n13=k*f-a*b;this.n23=k*g-a*c;this.n33=k*h-a*d;this.n43=k*i-a*e;return this},rotateY:function(a){var b=this.n11,c=this.n21,d=this.n31, +0&&a.z===1)return this.rotateZ(b);var c=a.x,d=a.y,e=a.z,f=Math.sqrt(c*c+d*d+e*e);c/=f;d/=f;e/=f;var f=c*c,g=d*d,h=e*e,i=Math.cos(b),k=Math.sin(b),j=1-i,o=c*d*j,p=c*e*j;j*=d*e;c*=k;var m=d*k;k*=e;e=f+(1-f)*i;f=o+k;d=p-m;o-=k;g+=(1-g)*i;k=j+c;p+=m;j-=c;h+=(1-h)*i;var i=this.n11,c=this.n21,m=this.n31,q=this.n41,n=this.n12,s=this.n22,r=this.n32,u=this.n42,t=this.n13,z=this.n23,A=this.n33,E=this.n43;this.n11=e*i+f*n+d*t;this.n21=e*c+f*s+d*z;this.n31=e*m+f*r+d*A;this.n41=e*q+f*u+d*E;this.n12=o*i+g*n+k* +t;this.n22=o*c+g*s+k*z;this.n32=o*m+g*r+k*A;this.n42=o*q+g*u+k*E;this.n13=p*i+j*n+h*t;this.n23=p*c+j*s+h*z;this.n33=p*m+j*r+h*A;this.n43=p*q+j*u+h*E;return this},rotateX:function(a){var b=this.n12,c=this.n22,d=this.n32,e=this.n42,f=this.n13,g=this.n23,h=this.n33,i=this.n43,k=Math.cos(a),a=Math.sin(a);this.n12=k*b+a*f;this.n22=k*c+a*g;this.n32=k*d+a*h;this.n42=k*e+a*i;this.n13=k*f-a*b;this.n23=k*g-a*c;this.n33=k*h-a*d;this.n43=k*i-a*e;return this},rotateY:function(a){var b=this.n11,c=this.n21,d=this.n31, e=this.n41,f=this.n13,g=this.n23,h=this.n33,i=this.n43,k=Math.cos(a),a=Math.sin(a);this.n11=k*b-a*f;this.n21=k*c-a*g;this.n31=k*d-a*h;this.n41=k*e-a*i;this.n13=k*f+a*b;this.n23=k*g+a*c;this.n33=k*h+a*d;this.n43=k*i+a*e;return this},rotateZ:function(a){var b=this.n11,c=this.n21,d=this.n31,e=this.n41,f=this.n12,g=this.n22,h=this.n32,i=this.n42,k=Math.cos(a),a=Math.sin(a);this.n11=k*b+a*f;this.n21=k*c+a*g;this.n31=k*d+a*h;this.n41=k*e+a*i;this.n12=k*f-a*b;this.n22=k*g-a*c;this.n32=k*h-a*d;this.n42=k* i-a*e;return this},translate:function(a){var b=a.x,c=a.y,a=a.z;this.n14=this.n11*b+this.n12*c+this.n13*a+this.n14;this.n24=this.n21*b+this.n22*c+this.n23*a+this.n24;this.n34=this.n31*b+this.n32*c+this.n33*a+this.n34;this.n44=this.n41*b+this.n42*c+this.n43*a+this.n44;return this}}; THREE.Matrix4.makeInvert3x3=function(a){var b=a.m33,c=b.m,d=a.n33*a.n22-a.n32*a.n23,e=-a.n33*a.n21+a.n31*a.n23,f=a.n32*a.n21-a.n31*a.n22,g=-a.n33*a.n12+a.n32*a.n13,h=a.n33*a.n11-a.n31*a.n13,i=-a.n32*a.n11+a.n31*a.n12,k=a.n23*a.n12-a.n22*a.n13,j=-a.n23*a.n11+a.n21*a.n13,o=a.n22*a.n11-a.n21*a.n12,a=a.n11*d+a.n21*g+a.n31*k;if(a===0)return null;a=1/a;c[0]=a*d;c[1]=a*e;c[2]=a*f;c[3]=a*g;c[4]=a*h;c[5]=a*i;c[6]=a*k;c[7]=a*j;c[8]=a*o;return b}; @@ -62,22 +62,22 @@ THREE.Object3D.prototype={constructor:THREE.Object3D,translate:function(a,b){thi if(b&&(e=e.getChildByName(a,b),e!==void 0))return e}},updateMatrix:function(){this.matrix.setPosition(this.position);this.useQuaternion?this.matrix.setRotationFromQuaternion(this.quaternion):this.matrix.setRotationFromEuler(this.rotation,this.eulerOrder);if(this.scale.x!==1||this.scale.y!==1||this.scale.z!==1)this.matrix.scale(this.scale),this.boundRadiusScale=Math.max(this.scale.x,Math.max(this.scale.y,this.scale.z));this.matrixWorldNeedsUpdate=!0},updateMatrixWorld:function(a){this.matrixAutoUpdate&& this.updateMatrix();if(this.matrixWorldNeedsUpdate||a)this.parent?this.matrixWorld.multiply(this.parent.matrixWorld,this.matrix):this.matrixWorld.copy(this.matrix),this.matrixWorldNeedsUpdate=!1,a=!0;for(var b=0,c=this.children.length;b=0&&f>=0&&g>=0&&h>=0?!0:e<0&&f<0||g<0&&h<0?!1:(e<0?c=Math.max(c,e/(e-f)):f<0&&(d=Math.min(d,e/(e-f))),g<0?c=Math.max(c,g/(g-h)):h<0&&(d=Math.min(d,g/(g-h))),dg&&h.positionScreen.z0&&B.z<1))g=x[u]=x[u]||new THREE.RenderableParticle,u++,t=g, -t.x=B.x/B.w,t.y=B.y/B.w,t.z=B.z,t.rotation=ca.rotation.z,t.scale.x=ca.scale.x*Math.abs(t.x-(B.x+e.projectionMatrix.n11)/(B.w+e.projectionMatrix.n14)),t.scale.y=ca.scale.y*Math.abs(t.y-(B.y+e.projectionMatrix.n22)/(B.w+e.projectionMatrix.n24)),t.material=ca.material,G.elements.push(t);f&&G.elements.sort(c);return G}};THREE.Quaternion=function(a,b,c,d){this.set(a||0,b||0,c||0,d!==void 0?d:1)}; +j,o,p=[],m,q=[],n,s,r=[],u,t,z=[],A={objects:[],sprites:[],lights:[],elements:[]},E=new THREE.Vector3,D=new THREE.Vector4,B=new THREE.Matrix4,w=new THREE.Matrix4,G=new THREE.Frustum,y=new THREE.Vector4,K=new THREE.Vector4;this.projectVector=function(a,b){b.matrixWorldInverse.getInverse(b.matrixWorld);B.multiply(b.projectionMatrix,b.matrixWorldInverse);B.multiplyVector3(a);return a};this.unprojectVector=function(a,b){b.projectionMatrixInverse.getInverse(b.projectionMatrix);B.multiply(b.matrixWorld, +b.projectionMatrixInverse);B.multiplyVector3(a);return a};this.pickingRay=function(a,b){var c;a.z=-1;c=new THREE.Vector3(a.x,a.y,1);this.unprojectVector(a,b);this.unprojectVector(c,b);c.subSelf(a).normalize();return new THREE.Ray(a,c)};this.projectGraph=function(b,d){f=0;A.objects.length=0;A.sprites.length=0;A.lights.length=0;var g=function(b){if(b.visible!==!1){(b instanceof THREE.Mesh||b instanceof THREE.Line)&&(b.frustumCulled===!1||G.contains(b))?(B.multiplyVector3(E.copy(b.position)),e=a(),e.object= +b,e.z=E.z,A.objects.push(e)):b instanceof THREE.Sprite||b instanceof THREE.Particle?(B.multiplyVector3(E.copy(b.position)),e=a(),e.object=b,e.z=E.z,A.sprites.push(e)):b instanceof THREE.Light&&A.lights.push(b);for(var c=0,d=b.children.length;cg&&h.positionScreen.z0&&D.z<1))g=z[t]=z[t]||new THREE.RenderableParticle,t++,u=g,u.x= +D.x/D.w,u.y=D.y/D.w,u.z=D.z,u.rotation=T.rotation.z,u.scale.x=T.scale.x*Math.abs(u.x-(D.x+e.projectionMatrix.n11)/(D.w+e.projectionMatrix.n14)),u.scale.y=T.scale.y*Math.abs(u.y-(D.y+e.projectionMatrix.n22)/(D.w+e.projectionMatrix.n24)),u.material=T.material,A.elements.push(u);f&&A.elements.sort(c);return A}};THREE.Quaternion=function(a,b,c,d){this.set(a||0,b||0,c||0,d!==void 0?d:1)}; THREE.Quaternion.prototype={constructor:THREE.Quaternion,set:function(a,b,c,d){this.x=a;this.y=b;this.z=c;this.w=d;return this},copy:function(a){this.x=a.x;this.y=a.y;this.z=a.z;this.w=a.w;return this},setFromEuler:function(a){var b=Math.PI/360,c=a.x*b,d=a.y*b,e=a.z*b,a=Math.cos(d),d=Math.sin(d),b=Math.cos(-e),e=Math.sin(-e),f=Math.cos(c),c=Math.sin(c),g=a*b,h=d*e;this.w=g*f-h*c;this.x=g*c+h*f;this.y=d*b*f+a*e*c;this.z=a*e*f-d*b*c;return this},setFromAxisAngle:function(a,b){var c=b/2,d=Math.sin(c); this.x=a.x*d;this.y=a.y*d;this.z=a.z*d;this.w=Math.cos(c);return this},setFromRotationMatrix:function(a){var b=Math.pow(a.determinant(),1/3);this.w=Math.sqrt(Math.max(0,b+a.n11+a.n22+a.n33))/2;this.x=Math.sqrt(Math.max(0,b+a.n11-a.n22-a.n33))/2;this.y=Math.sqrt(Math.max(0,b-a.n11+a.n22-a.n33))/2;this.z=Math.sqrt(Math.max(0,b-a.n11-a.n22+a.n33))/2;this.x=a.n32-a.n23<0?-Math.abs(this.x):Math.abs(this.x);this.y=a.n13-a.n31<0?-Math.abs(this.y):Math.abs(this.y);this.z=a.n21-a.n12<0?-Math.abs(this.z):Math.abs(this.z); this.normalize();return this},calculateW:function(){this.w=-Math.sqrt(Math.abs(1-this.x*this.x-this.y*this.y-this.z*this.z));return this},inverse:function(){this.x*=-1;this.y*=-1;this.z*=-1;return this},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w)},normalize:function(){var a=Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w);a===0?this.w=this.z=this.y=this.x=0:(a=1/a,this.x*=a,this.y*=a,this.z*=a,this.w*=a);return this},multiplySelf:function(a){var b= this.x,c=this.y,d=this.z,e=this.w,f=a.x,g=a.y,h=a.z,a=a.w;this.x=b*a+e*f+c*h-d*g;this.y=c*a+e*g+d*f-b*h;this.z=d*a+e*h+b*g-c*f;this.w=e*a-b*f-c*g-d*h;return this},multiply:function(a,b){this.x=a.x*b.w+a.y*b.z-a.z*b.y+a.w*b.x;this.y=-a.x*b.z+a.y*b.w+a.z*b.x+a.w*b.y;this.z=a.x*b.y-a.y*b.x+a.z*b.w+a.w*b.z;this.w=-a.x*b.x-a.y*b.y-a.z*b.z+a.w*b.w;return this},multiplyVector3:function(a,b){b||(b=a);var c=a.x,d=a.y,e=a.z,f=this.x,g=this.y,h=this.z,i=this.w,k=i*c+g*e-h*d,j=i*d+h*c-f*e,o=i*e+f*d-g*c,c=-f* c-g*d-h*e;b.x=k*i+c*-f+j*-h-o*-g;b.y=j*i+c*-g+o*-f-k*-h;b.z=o*i+c*-h+k*-g-j*-f;return b}}; -THREE.Quaternion.slerp=function(a,b,c,d){var e=a.w*b.w+a.x*b.x+a.y*b.y+a.z*b.z;e<0?(c.w=-b.w,c.x=-b.x,c.y=-b.y,c.z=-b.z,e=-e):c.copy(b);if(Math.abs(e)>=1)return c.w=a.w,c.x=a.x,c.y=a.y,c.z=a.z,c;var f=Math.acos(e),e=Math.sqrt(1-e*e);if(Math.abs(e)<0.001)return c.w=0.5*(a.w+b.w),c.x=0.5*(a.x+b.x),c.y=0.5*(a.y+b.y),c.z=0.5*(a.z+b.z),c;b=Math.sin((1-d)*f)/e;d=Math.sin(d*f)/e;c.w=a.w*b+c.w*d;c.x=a.x*b+c.x*d;c.y=a.y*b+c.y*d;c.z=a.z*b+c.z*d;return c};THREE.Vertex=function(a){this.position=a||new THREE.Vector3}; +THREE.Quaternion.slerp=function(a,b,c,d){var e=a.w*b.w+a.x*b.x+a.y*b.y+a.z*b.z;e<0?(c.w=-b.w,c.x=-b.x,c.y=-b.y,c.z=-b.z,e=-e):c.copy(b);if(Math.abs(e)>=1)return c.w=a.w,c.x=a.x,c.y=a.y,c.z=a.z,c;var f=Math.acos(e),e=Math.sqrt(1-e*e);if(Math.abs(e)<0.0010)return c.w=0.5*(a.w+b.w),c.x=0.5*(a.x+b.x),c.y=0.5*(a.y+b.y),c.z=0.5*(a.z+b.z),c;b=Math.sin((1-d)*f)/e;d=Math.sin(d*f)/e;c.w=a.w*b+c.w*d;c.x=a.x*b+c.x*d;c.y=a.y*b+c.y*d;c.z=a.z*b+c.z*d;return c};THREE.Vertex=function(a){this.position=a||new THREE.Vector3}; THREE.Face3=function(a,b,c,d,e,f){this.a=a;this.b=b;this.c=c;this.normal=d instanceof THREE.Vector3?d:new THREE.Vector3;this.vertexNormals=d instanceof Array?d:[];this.color=e instanceof THREE.Color?e:new THREE.Color;this.vertexColors=e instanceof Array?e:[];this.vertexTangents=[];this.materialIndex=f;this.centroid=new THREE.Vector3}; THREE.Face4=function(a,b,c,d,e,f,g){this.a=a;this.b=b;this.c=c;this.d=d;this.normal=e instanceof THREE.Vector3?e:new THREE.Vector3;this.vertexNormals=e instanceof Array?e:[];this.color=f instanceof THREE.Color?f:new THREE.Color;this.vertexColors=f instanceof Array?f:[];this.vertexTangents=[];this.materialIndex=g;this.centroid=new THREE.Vector3};THREE.UV=function(a,b){this.u=a||0;this.v=b||0}; THREE.UV.prototype={constructor:THREE.UV,set:function(a,b){this.u=a;this.v=b;return this},copy:function(a){this.u=a.u;this.v=a.v;return this},clone:function(){return new THREE.UV(this.u,this.v)}}; @@ -87,9 +87,9 @@ b;a++)c=this.faces[a],c.centroid.set(0,0,0),c instanceof THREE.Face3?(c.centroid b,c,d,e,f,g=new THREE.Vector3,h=new THREE.Vector3;a=0;for(b=this.faces.length;a0){this.boundingBox={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 b=1,c=this.vertices.length;b0){this.boundingBox={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 b=1,c=this.vertices.length;bthis.boundingBox.x[1])this.boundingBox.x[1]=a.position.x;if(a.position.ythis.boundingBox.y[1])this.boundingBox.y[1]=a.position.y;if(a.position.zthis.boundingBox.z[1])this.boundingBox.z[1]=a.position.z}}},computeBoundingSphere:function(){for(var a= 0,b=0,c=this.vertices.length;b0&&(c(THREE.NormalBlending),b(1),e("rgba("+Math.floor(s.r*255)+","+Math.floor(s.g*255)+","+Math.floor(s.b*255)+","+r+")"),n.fillRect(Math.floor(ta.getX()), -Math.floor(ta.getY()),Math.floor(ta.getWidth()),Math.floor(ta.getHeight()))),ta.empty())};this.render=function(a,j){function o(a){var b,c,d,e;ba.setRGB(0,0,0);Z.setRGB(0,0,0);F.setRGB(0,0,0);b=0;for(c=a.length;b> -1,F=i.height>>1,g=f.scale.x*m,l=f.scale.y*q,ba=g*j,h=l*F,pa.set(a.x-ba,a.y-h,a.x+ba,a.y+h),qa.intersects(pa)&&(n.save(),n.translate(a.x,a.y),n.rotate(-f.rotation),n.scale(g,-l),n.translate(-j,-F),n.drawImage(i,0,0),n.restore())}else g instanceof THREE.ParticleCanvasMaterial&&(ba=f.scale.x*m,h=f.scale.y*q,pa.set(a.x-ba,a.y-h,a.x+ba,a.y+h),qa.intersects(pa)&&(d(g.color.getContextStyle()),e(g.color.getContextStyle()),n.save(),n.translate(a.x,a.y),n.rotate(-f.rotation),n.scale(ba,h),g.program(n),n.restore()))} -function r(a,e,f,g){b(g.opacity);c(g.blending);n.beginPath();n.moveTo(a.positionScreen.x,a.positionScreen.y);n.lineTo(e.positionScreen.x,e.positionScreen.y);n.closePath();if(g instanceof THREE.LineBasicMaterial){a=g.linewidth;if(w!=a)n.lineWidth=w=a;a=g.linecap;if(B!=a)n.lineCap=B=a;a=g.linejoin;if(E!=a)n.lineJoin=E=a;d(g.color.getContextStyle());n.stroke();pa.inflate(g.linewidth*2)}}function t(a,d,e,g,h,F,k,Z){f.info.render.vertices+=3;f.info.render.faces++;b(Z.opacity);c(Z.blending);T=a.positionScreen.x; -$=a.positionScreen.y;V=d.positionScreen.x;l=d.positionScreen.y;M=e.positionScreen.x;J=e.positionScreen.y;x(T,$,V,l,M,J);if(Z instanceof THREE.MeshBasicMaterial)if(Z.map)Z.map.mapping instanceof THREE.UVMapping&&(ia=k.uvs[0],Qa(T,$,V,l,M,J,ia[g].u,ia[g].v,ia[h].u,ia[h].v,ia[F].u,ia[F].v,Z.map));else if(Z.envMap){if(Z.envMap.mapping instanceof THREE.SphericalReflectionMapping)a=j.matrixWorldInverse,ra.copy(k.vertexNormalsWorld[g]),Ba=(ra.x*a.n11+ra.y*a.n12+ra.z*a.n13)*0.5+0.5,wa=-(ra.x*a.n21+ra.y*a.n22+ -ra.z*a.n23)*0.5+0.5,ra.copy(k.vertexNormalsWorld[h]),xa=(ra.x*a.n11+ra.y*a.n12+ra.z*a.n13)*0.5+0.5,ya=-(ra.x*a.n21+ra.y*a.n22+ra.z*a.n23)*0.5+0.5,ra.copy(k.vertexNormalsWorld[F]),za=(ra.x*a.n11+ra.y*a.n12+ra.z*a.n13)*0.5+0.5,Aa=-(ra.x*a.n21+ra.y*a.n22+ra.z*a.n23)*0.5+0.5,Qa(T,$,V,l,M,J,Ba,wa,xa,ya,za,Aa,Z.envMap)}else Z.wireframe?Fa(Z.color,Z.wireframeLinewidth,Z.wireframeLinecap,Z.wireframeLinejoin):Ea(Z.color);else if(Z instanceof THREE.MeshLambertMaterial)Z.map&&!Z.wireframe&&(Z.map.mapping instanceof -THREE.UVMapping&&(ia=k.uvs[0],Qa(T,$,V,l,M,J,ia[g].u,ia[g].v,ia[h].u,ia[h].v,ia[F].u,ia[F].v,Z.map)),c(THREE.SubtractiveBlending)),Ja?!Z.wireframe&&Z.shading==THREE.SmoothShading&&k.vertexNormalsWorld.length==3?(N.r=W.r=S.r=ba.r,N.g=W.g=S.g=ba.g,N.b=W.b=S.b=ba.b,p(i,k.v1.positionWorld,k.vertexNormalsWorld[0],N),p(i,k.v2.positionWorld,k.vertexNormalsWorld[1],W),p(i,k.v3.positionWorld,k.vertexNormalsWorld[2],S),N.r=Math.max(0,Math.min(Z.color.r*N.r,1)),N.g=Math.max(0,Math.min(Z.color.g*N.g,1)),N.b= -Math.max(0,Math.min(Z.color.b*N.b,1)),W.r=Math.max(0,Math.min(Z.color.r*W.r,1)),W.g=Math.max(0,Math.min(Z.color.g*W.g,1)),W.b=Math.max(0,Math.min(Z.color.b*W.b,1)),S.r=Math.max(0,Math.min(Z.color.r*S.r,1)),S.g=Math.max(0,Math.min(Z.color.g*S.g,1)),S.b=Math.max(0,Math.min(Z.color.b*S.b,1)),da.r=(W.r+S.r)*0.5,da.g=(W.g+S.g)*0.5,da.b=(W.b+S.b)*0.5,sa=Q(N,W,S,da),Ka(T,$,V,l,M,J,0,0,1,0,0,1,sa)):(U.r=ba.r,U.g=ba.g,U.b=ba.b,p(i,k.centroidWorld,k.normalWorld,U),U.r=Math.max(0,Math.min(Z.color.r*U.r,1)), -U.g=Math.max(0,Math.min(Z.color.g*U.g,1)),U.b=Math.max(0,Math.min(Z.color.b*U.b,1)),Z.wireframe?Fa(U,Z.wireframeLinewidth,Z.wireframeLinecap,Z.wireframeLinejoin):Ea(U)):Z.wireframe?Fa(Z.color,Z.wireframeLinewidth,Z.wireframeLinecap,Z.wireframeLinejoin):Ea(Z.color);else if(Z instanceof THREE.MeshDepthMaterial)na=j.near,la=j.far,N.r=N.g=N.b=1-O(a.positionScreen.z,na,la),W.r=W.g=W.b=1-O(d.positionScreen.z,na,la),S.r=S.g=S.b=1-O(e.positionScreen.z,na,la),da.r=(W.r+S.r)*0.5,da.g=(W.g+S.g)*0.5,da.b=(W.b+ -S.b)*0.5,sa=Q(N,W,S,da),Ka(T,$,V,l,M,J,0,0,1,0,0,1,sa);else if(Z instanceof THREE.MeshNormalMaterial)U.r=P(k.normalWorld.x),U.g=P(k.normalWorld.y),U.b=P(k.normalWorld.z),Z.wireframe?Fa(U,Z.wireframeLinewidth,Z.wireframeLinecap,Z.wireframeLinejoin):Ea(U)}function u(a,d,e,g,h,Z,F,k,n){f.info.render.vertices+=4;f.info.render.faces++;b(k.opacity);c(k.blending);if(k.map||k.envMap)t(a,d,g,0,1,3,F,k,n),t(h,e,Z,1,2,3,F,k,n);else if(T=a.positionScreen.x,$=a.positionScreen.y,V=d.positionScreen.x,l=d.positionScreen.y, -M=e.positionScreen.x,J=e.positionScreen.y,L=g.positionScreen.x,v=g.positionScreen.y,Y=h.positionScreen.x,aa=h.positionScreen.y,fa=Z.positionScreen.x,ca=Z.positionScreen.y,k instanceof THREE.MeshBasicMaterial)G(T,$,V,l,M,J,L,v),k.wireframe?Fa(k.color,k.wireframeLinewidth,k.wireframeLinecap,k.wireframeLinejoin):Ea(k.color);else if(k instanceof THREE.MeshLambertMaterial)Ja?!k.wireframe&&k.shading==THREE.SmoothShading&&F.vertexNormalsWorld.length==4?(N.r=W.r=S.r=da.r=ba.r,N.g=W.g=S.g=da.g=ba.g,N.b=W.b= -S.b=da.b=ba.b,p(i,F.v1.positionWorld,F.vertexNormalsWorld[0],N),p(i,F.v2.positionWorld,F.vertexNormalsWorld[1],W),p(i,F.v4.positionWorld,F.vertexNormalsWorld[3],S),p(i,F.v3.positionWorld,F.vertexNormalsWorld[2],da),N.r=Math.max(0,Math.min(k.color.r*N.r,1)),N.g=Math.max(0,Math.min(k.color.g*N.g,1)),N.b=Math.max(0,Math.min(k.color.b*N.b,1)),W.r=Math.max(0,Math.min(k.color.r*W.r,1)),W.g=Math.max(0,Math.min(k.color.g*W.g,1)),W.b=Math.max(0,Math.min(k.color.b*W.b,1)),S.r=Math.max(0,Math.min(k.color.r* -S.r,1)),S.g=Math.max(0,Math.min(k.color.g*S.g,1)),S.b=Math.max(0,Math.min(k.color.b*S.b,1)),da.r=Math.max(0,Math.min(k.color.r*da.r,1)),da.g=Math.max(0,Math.min(k.color.g*da.g,1)),da.b=Math.max(0,Math.min(k.color.b*da.b,1)),sa=Q(N,W,S,da),x(T,$,V,l,L,v),Ka(T,$,V,l,L,v,0,0,1,0,0,1,sa),x(Y,aa,M,J,fa,ca),Ka(Y,aa,M,J,fa,ca,1,0,1,1,0,1,sa)):(U.r=ba.r,U.g=ba.g,U.b=ba.b,p(i,F.centroidWorld,F.normalWorld,U),U.r=Math.max(0,Math.min(k.color.r*U.r,1)),U.g=Math.max(0,Math.min(k.color.g*U.g,1)),U.b=Math.max(0, -Math.min(k.color.b*U.b,1)),G(T,$,V,l,M,J,L,v),k.wireframe?Fa(U,k.wireframeLinewidth,k.wireframeLinecap,k.wireframeLinejoin):Ea(U)):(G(T,$,V,l,M,J,L,v),k.wireframe?Fa(k.color,k.wireframeLinewidth,k.wireframeLinecap,k.wireframeLinejoin):Ea(k.color));else if(k instanceof THREE.MeshNormalMaterial)U.r=P(F.normalWorld.x),U.g=P(F.normalWorld.y),U.b=P(F.normalWorld.z),G(T,$,V,l,M,J,L,v),k.wireframe?Fa(U,k.wireframeLinewidth,k.wireframeLinecap,k.wireframeLinejoin):Ea(U);else if(k instanceof THREE.MeshDepthMaterial)na= -j.near,la=j.far,N.r=N.g=N.b=1-O(a.positionScreen.z,na,la),W.r=W.g=W.b=1-O(d.positionScreen.z,na,la),S.r=S.g=S.b=1-O(g.positionScreen.z,na,la),da.r=da.g=da.b=1-O(e.positionScreen.z,na,la),sa=Q(N,W,S,da),x(T,$,V,l,L,v),Ka(T,$,V,l,L,v,0,0,1,0,0,1,sa),x(Y,aa,M,J,fa,ca),Ka(Y,aa,M,J,fa,ca,1,0,1,1,0,1,sa)}function x(a,b,c,d,e,f){n.beginPath();n.moveTo(a,b);n.lineTo(c,d);n.lineTo(e,f);n.lineTo(a,b);n.closePath()}function G(a,b,c,d,e,f,g,ba){n.beginPath();n.moveTo(a,b);n.lineTo(c,d);n.lineTo(e,f);n.lineTo(g, -ba);n.lineTo(a,b);n.closePath()}function Fa(a,b,c,e){if(w!=b)n.lineWidth=w=b;if(B!=c)n.lineCap=B=c;if(E!=e)n.lineJoin=E=e;d(a.getContextStyle());n.stroke();pa.inflate(b*2)}function Ea(a){e(a.getContextStyle());n.fill()}function Qa(a,b,c,d,f,g,ba,h,l,i,k,j,F){if(F.image.width!=0){if(F.needsUpdate==!0||va[F.id]==void 0){var Z=F.wrapS==THREE.RepeatWrapping,m=F.wrapT==THREE.RepeatWrapping;va[F.id]=n.createPattern(F.image,Z&&m?"repeat":Z&&!m?"repeat-x":!Z&&m?"repeat-y":"no-repeat");F.needsUpdate=!1}e(va[F.id]); -var Z=F.offset.x/F.repeat.x,m=F.offset.y/F.repeat.y,o=F.image.width*F.repeat.x,p=F.image.height*F.repeat.y,ba=(ba+Z)*o,h=(h+m)*p,l=(l+Z)*o,i=(i+m)*p,k=(k+Z)*o,j=(j+m)*p;c-=a;d-=b;f-=a;g-=b;l-=ba;i-=h;k-=ba;j-=h;Z=l*j-k*i;if(Z==0){if(ea[F.id]==void 0)b=document.createElement("canvas"),b.width=F.image.width,b.height=F.image.height,a=b.getContext("2d"),a.drawImage(F.image,0,0),ea[F.id]=a.getImageData(0,0,F.image.width,F.image.height).data,delete b;b=ea[F.id];ba=(Math.floor(ba)+Math.floor(h)*F.image.width)* -4;U.setRGB(b[ba]/255,b[ba+1]/255,b[ba+2]/255);Ea(U)}else Z=1/Z,F=(j*c-i*f)*Z,i=(j*d-i*g)*Z,c=(l*f-k*c)*Z,d=(l*g-k*d)*Z,a=a-F*ba-c*h,ba=b-i*ba-d*h,n.save(),n.transform(F,i,c,d,a,ba),n.fill(),n.restore()}}function Ka(a,b,c,d,e,f,g,ba,h,l,i,k,F){var Z,j;Z=F.width-1;j=F.height-1;g*=Z;ba*=j;h*=Z;l*=j;i*=Z;k*=j;c-=a;d-=b;e-=a;f-=b;h-=g;l-=ba;i-=g;k-=ba;j=1/(h*k-i*l);Z=(k*c-l*e)*j;l=(k*d-l*f)*j;c=(h*e-i*c)*j;d=(h*f-i*d)*j;a=a-Z*g-c*ba;b=b-l*g-d*ba;n.save();n.transform(Z,l,c,d,a,b);n.clip();n.drawImage(F, -0,0);n.restore()}function Q(a,b,c,d){var e=~~(a.r*255),f=~~(a.g*255),a=~~(a.b*255),g=~~(b.r*255),ba=~~(b.g*255),b=~~(b.b*255),h=~~(c.r*255),l=~~(c.g*255),c=~~(c.b*255),i=~~(d.r*255),k=~~(d.g*255),d=~~(d.b*255);Ca[0]=e<0?0:e>255?255:e;Ca[1]=f<0?0:f>255?255:f;Ca[2]=a<0?0:a>255?255:a;Ca[4]=g<0?0:g>255?255:g;Ca[5]=ba<0?0:ba>255?255:ba;Ca[6]=b<0?0:b>255?255:b;Ca[8]=h<0?0:h>255?255:h;Ca[9]=l<0?0:l>255?255:l;Ca[10]=c<0?0:c>255?255:c;Ca[12]=i<0?0:i>255?255:i;Ca[13]=k<0?0:k>255?255:k;Ca[14]=d<0?0:d>255?255: -d;Ma.putImageData(Pa,0,0);C.drawImage(La,0,0);return Na}function O(a,b,c){a=(a-b)/(c-b);return a*a*(3-2*a)}function P(a){a=(a+1)*0.5;return a<0?0:a>1?1:a}function Ga(a,b){var c=b.x-a.x,d=b.y-a.y,e=c*c+d*d;e!=0&&(e=1/Math.sqrt(e),c*=e,d*=e,b.x+=c,b.y+=d,a.x-=c,a.y-=d)}var Oa,Ra,ua,Da;this.autoClear?this.clear():n.setTransform(1,0,0,-1,m,q);f.info.render.vertices=0;f.info.render.faces=0;g=k.projectScene(a,j,this.sortElements);h=g.elements;i=g.lights;(Ja=i.length>0)&&o(i);Oa=0;for(Ra=h.length;Oa1?1:a}var d=this,e,f,g,h=new THREE.Projector,i=document.createElementNS("http://www.w3.org/2000/svg","svg"),k,j,o,p,m,q,n,s,r=new THREE.Rectangle,t=new THREE.Rectangle,u=!1,x=new THREE.Color,G=new THREE.Color,w=new THREE.Color,B=new THREE.Color,E,I=new THREE.Vector3,R=[],z=[],A,K,X,T=1;this.domElement=i;this.sortElements=this.sortObjects=this.autoClear=!0;this.info={render:{vertices:0, -faces:0}};this.setQuality=function(a){switch(a){case "high":T=1;break;case "low":T=0}};this.setSize=function(a,b){k=a;j=b;o=k/2;p=j/2;i.setAttribute("viewBox",-o+" "+-p+" "+k+" "+j);i.setAttribute("width",k);i.setAttribute("height",j);r.set(-o,-p,o,p)};this.clear=function(){for(;i.childNodes.length>0;)i.removeChild(i.childNodes[0])};this.render=function(k,j){var l,R,J,L;this.autoClear&&this.clear();d.info.render.vertices=0;d.info.render.faces=0;e=h.projectScene(k,j,this.sortElements);f=e.elements; -g=e.lights;X=K=0;if(u=g.length>0){G.setRGB(0,0,0);w.setRGB(0,0,0);B.setRGB(0,0,0);l=0;for(R=g.length;l0&&(c(THREE.NormalBlending),b(1),e("rgba("+Math.floor(s.r*255)+","+Math.floor(s.g*255)+","+Math.floor(s.b*255)+","+r+")"),n.fillRect(Math.floor(ta.getX()), +Math.floor(ta.getY()),Math.floor(ta.getWidth()),Math.floor(ta.getHeight()))),ta.empty())};this.render=function(a,j){function o(a){var b,c,d,e;ea.setRGB(0,0,0);Y.setRGB(0,0,0);H.setRGB(0,0,0);b=0;for(c=a.length;b> +1,H=i.height>>1,g=f.scale.x*m,l=f.scale.y*q,ea=g*j,h=l*H,pa.set(a.x-ea,a.y-h,a.x+ea,a.y+h),qa.intersects(pa)&&(n.save(),n.translate(a.x,a.y),n.rotate(-f.rotation),n.scale(g,-l),n.translate(-j,-H),n.drawImage(i,0,0),n.restore())}else g instanceof THREE.ParticleCanvasMaterial&&(ea=f.scale.x*m,h=f.scale.y*q,pa.set(a.x-ea,a.y-h,a.x+ea,a.y+h),qa.intersects(pa)&&(d(g.color.getContextStyle()),e(g.color.getContextStyle()),n.save(),n.translate(a.x,a.y),n.rotate(-f.rotation),n.scale(ea,h),g.program(n),n.restore()))} +function r(a,e,f,g){b(g.opacity);c(g.blending);n.beginPath();n.moveTo(a.positionScreen.x,a.positionScreen.y);n.lineTo(e.positionScreen.x,e.positionScreen.y);n.closePath();if(g instanceof THREE.LineBasicMaterial){a=g.linewidth;if(E!=a)n.lineWidth=E=a;a=g.linecap;if(D!=a)n.lineCap=D=a;a=g.linejoin;if(B!=a)n.lineJoin=B=a;d(g.color.getContextStyle());n.stroke();pa.inflate(g.linewidth*2)}}function u(a,d,e,g,h,H,k,Y){f.info.render.vertices+=3;f.info.render.faces++;b(Y.opacity);c(Y.blending);X=a.positionScreen.x; +S=a.positionScreen.y;R=d.positionScreen.x;l=d.positionScreen.y;V=e.positionScreen.x;v=e.positionScreen.y;z(X,S,R,l,V,v);if(Y instanceof THREE.MeshBasicMaterial)if(Y.map)Y.map.mapping instanceof THREE.UVMapping&&(ja=k.uvs[0],Pa(X,S,R,l,V,v,ja[g].u,ja[g].v,ja[h].u,ja[h].v,ja[H].u,ja[H].v,Y.map));else if(Y.envMap){if(Y.envMap.mapping instanceof THREE.SphericalReflectionMapping)a=j.matrixWorldInverse,ra.copy(k.vertexNormalsWorld[g]),Ba=(ra.x*a.n11+ra.y*a.n12+ra.z*a.n13)*0.5+0.5,wa=-(ra.x*a.n21+ra.y*a.n22+ +ra.z*a.n23)*0.5+0.5,ra.copy(k.vertexNormalsWorld[h]),xa=(ra.x*a.n11+ra.y*a.n12+ra.z*a.n13)*0.5+0.5,ya=-(ra.x*a.n21+ra.y*a.n22+ra.z*a.n23)*0.5+0.5,ra.copy(k.vertexNormalsWorld[H]),za=(ra.x*a.n11+ra.y*a.n12+ra.z*a.n13)*0.5+0.5,Aa=-(ra.x*a.n21+ra.y*a.n22+ra.z*a.n23)*0.5+0.5,Pa(X,S,R,l,V,v,Ba,wa,xa,ya,za,Aa,Y.envMap)}else Y.wireframe?J(Y.color,Y.wireframeLinewidth,Y.wireframeLinecap,Y.wireframeLinejoin):Ea(Y.color);else if(Y instanceof THREE.MeshLambertMaterial)Y.map&&!Y.wireframe&&(Y.map.mapping instanceof +THREE.UVMapping&&(ja=k.uvs[0],Pa(X,S,R,l,V,v,ja[g].u,ja[g].v,ja[h].u,ja[h].v,ja[H].u,ja[H].v,Y.map)),c(THREE.SubtractiveBlending)),Ia?!Y.wireframe&&Y.shading==THREE.SmoothShading&&k.vertexNormalsWorld.length==3?(O.r=aa.r=ca.r=ea.r,O.g=aa.g=ca.g=ea.g,O.b=aa.b=ca.b=ea.b,p(i,k.v1.positionWorld,k.vertexNormalsWorld[0],O),p(i,k.v2.positionWorld,k.vertexNormalsWorld[1],aa),p(i,k.v3.positionWorld,k.vertexNormalsWorld[2],ca),O.r=Math.max(0,Math.min(Y.color.r*O.r,1)),O.g=Math.max(0,Math.min(Y.color.g*O.g, +1)),O.b=Math.max(0,Math.min(Y.color.b*O.b,1)),aa.r=Math.max(0,Math.min(Y.color.r*aa.r,1)),aa.g=Math.max(0,Math.min(Y.color.g*aa.g,1)),aa.b=Math.max(0,Math.min(Y.color.b*aa.b,1)),ca.r=Math.max(0,Math.min(Y.color.r*ca.r,1)),ca.g=Math.max(0,Math.min(Y.color.g*ca.g,1)),ca.b=Math.max(0,Math.min(Y.color.b*ca.b,1)),ga.r=(aa.r+ca.r)*0.5,ga.g=(aa.g+ca.g)*0.5,ga.b=(aa.b+ca.b)*0.5,sa=P(O,aa,ca,ga),Ja(X,S,R,l,V,v,0,0,1,0,0,1,sa)):(U.r=ea.r,U.g=ea.g,U.b=ea.b,p(i,k.centroidWorld,k.normalWorld,U),U.r=Math.max(0, +Math.min(Y.color.r*U.r,1)),U.g=Math.max(0,Math.min(Y.color.g*U.g,1)),U.b=Math.max(0,Math.min(Y.color.b*U.b,1)),Y.wireframe?J(U,Y.wireframeLinewidth,Y.wireframeLinecap,Y.wireframeLinejoin):Ea(U)):Y.wireframe?J(Y.color,Y.wireframeLinewidth,Y.wireframeLinecap,Y.wireframeLinejoin):Ea(Y.color);else if(Y instanceof THREE.MeshDepthMaterial)na=j.near,la=j.far,O.r=O.g=O.b=1-M(a.positionScreen.z,na,la),aa.r=aa.g=aa.b=1-M(d.positionScreen.z,na,la),ca.r=ca.g=ca.b=1-M(e.positionScreen.z,na,la),ga.r=(aa.r+ca.r)* +0.5,ga.g=(aa.g+ca.g)*0.5,ga.b=(aa.b+ca.b)*0.5,sa=P(O,aa,ca,ga),Ja(X,S,R,l,V,v,0,0,1,0,0,1,sa);else if(Y instanceof THREE.MeshNormalMaterial)U.r=N(k.normalWorld.x),U.g=N(k.normalWorld.y),U.b=N(k.normalWorld.z),Y.wireframe?J(U,Y.wireframeLinewidth,Y.wireframeLinecap,Y.wireframeLinejoin):Ea(U)}function t(a,d,e,g,h,Y,H,k,n){f.info.render.vertices+=4;f.info.render.faces++;b(k.opacity);c(k.blending);if(k.map||k.envMap)u(a,d,g,0,1,3,H,k,n),u(h,e,Y,1,2,3,H,k,n);else if(X=a.positionScreen.x,S=a.positionScreen.y, +R=d.positionScreen.x,l=d.positionScreen.y,V=e.positionScreen.x,v=e.positionScreen.y,W=g.positionScreen.x,L=g.positionScreen.y,Z=h.positionScreen.x,da=h.positionScreen.y,ba=Y.positionScreen.x,T=Y.positionScreen.y,k instanceof THREE.MeshBasicMaterial)A(X,S,R,l,V,v,W,L),k.wireframe?J(k.color,k.wireframeLinewidth,k.wireframeLinecap,k.wireframeLinejoin):Ea(k.color);else if(k instanceof THREE.MeshLambertMaterial)Ia?!k.wireframe&&k.shading==THREE.SmoothShading&&H.vertexNormalsWorld.length==4?(O.r=aa.r=ca.r= +ga.r=ea.r,O.g=aa.g=ca.g=ga.g=ea.g,O.b=aa.b=ca.b=ga.b=ea.b,p(i,H.v1.positionWorld,H.vertexNormalsWorld[0],O),p(i,H.v2.positionWorld,H.vertexNormalsWorld[1],aa),p(i,H.v4.positionWorld,H.vertexNormalsWorld[3],ca),p(i,H.v3.positionWorld,H.vertexNormalsWorld[2],ga),O.r=Math.max(0,Math.min(k.color.r*O.r,1)),O.g=Math.max(0,Math.min(k.color.g*O.g,1)),O.b=Math.max(0,Math.min(k.color.b*O.b,1)),aa.r=Math.max(0,Math.min(k.color.r*aa.r,1)),aa.g=Math.max(0,Math.min(k.color.g*aa.g,1)),aa.b=Math.max(0,Math.min(k.color.b* +aa.b,1)),ca.r=Math.max(0,Math.min(k.color.r*ca.r,1)),ca.g=Math.max(0,Math.min(k.color.g*ca.g,1)),ca.b=Math.max(0,Math.min(k.color.b*ca.b,1)),ga.r=Math.max(0,Math.min(k.color.r*ga.r,1)),ga.g=Math.max(0,Math.min(k.color.g*ga.g,1)),ga.b=Math.max(0,Math.min(k.color.b*ga.b,1)),sa=P(O,aa,ca,ga),z(X,S,R,l,W,L),Ja(X,S,R,l,W,L,0,0,1,0,0,1,sa),z(Z,da,V,v,ba,T),Ja(Z,da,V,v,ba,T,1,0,1,1,0,1,sa)):(U.r=ea.r,U.g=ea.g,U.b=ea.b,p(i,H.centroidWorld,H.normalWorld,U),U.r=Math.max(0,Math.min(k.color.r*U.r,1)),U.g=Math.max(0, +Math.min(k.color.g*U.g,1)),U.b=Math.max(0,Math.min(k.color.b*U.b,1)),A(X,S,R,l,V,v,W,L),k.wireframe?J(U,k.wireframeLinewidth,k.wireframeLinecap,k.wireframeLinejoin):Ea(U)):(A(X,S,R,l,V,v,W,L),k.wireframe?J(k.color,k.wireframeLinewidth,k.wireframeLinecap,k.wireframeLinejoin):Ea(k.color));else if(k instanceof THREE.MeshNormalMaterial)U.r=N(H.normalWorld.x),U.g=N(H.normalWorld.y),U.b=N(H.normalWorld.z),A(X,S,R,l,V,v,W,L),k.wireframe?J(U,k.wireframeLinewidth,k.wireframeLinecap,k.wireframeLinejoin):Ea(U); +else if(k instanceof THREE.MeshDepthMaterial)na=j.near,la=j.far,O.r=O.g=O.b=1-M(a.positionScreen.z,na,la),aa.r=aa.g=aa.b=1-M(d.positionScreen.z,na,la),ca.r=ca.g=ca.b=1-M(g.positionScreen.z,na,la),ga.r=ga.g=ga.b=1-M(e.positionScreen.z,na,la),sa=P(O,aa,ca,ga),z(X,S,R,l,W,L),Ja(X,S,R,l,W,L,0,0,1,0,0,1,sa),z(Z,da,V,v,ba,T),Ja(Z,da,V,v,ba,T,1,0,1,1,0,1,sa)}function z(a,b,c,d,e,f){n.beginPath();n.moveTo(a,b);n.lineTo(c,d);n.lineTo(e,f);n.lineTo(a,b);n.closePath()}function A(a,b,c,d,e,f,g,ea){n.beginPath(); +n.moveTo(a,b);n.lineTo(c,d);n.lineTo(e,f);n.lineTo(g,ea);n.lineTo(a,b);n.closePath()}function J(a,b,c,e){if(E!=b)n.lineWidth=E=b;if(D!=c)n.lineCap=D=c;if(B!=e)n.lineJoin=B=e;d(a.getContextStyle());n.stroke();pa.inflate(b*2)}function Ea(a){e(a.getContextStyle());n.fill()}function Pa(a,b,c,d,f,g,ea,h,l,i,k,j,H){if(H.image.width!=0){if(H.needsUpdate==!0||va[H.id]==void 0){var Y=H.wrapS==THREE.RepeatWrapping,m=H.wrapT==THREE.RepeatWrapping;va[H.id]=n.createPattern(H.image,Y&&m?"repeat":Y&&!m?"repeat-x": +!Y&&m?"repeat-y":"no-repeat");H.needsUpdate=!1}e(va[H.id]);var Y=H.offset.x/H.repeat.x,m=H.offset.y/H.repeat.y,o=H.image.width*H.repeat.x,p=H.image.height*H.repeat.y,ea=(ea+Y)*o,h=(h+m)*p,l=(l+Y)*o,i=(i+m)*p,k=(k+Y)*o,j=(j+m)*p;c-=a;d-=b;f-=a;g-=b;l-=ea;i-=h;k-=ea;j-=h;Y=l*j-k*i;if(Y==0){if(fa[H.id]==void 0)b=document.createElement("canvas"),b.width=H.image.width,b.height=H.image.height,a=b.getContext("2d"),a.drawImage(H.image,0,0),fa[H.id]=a.getImageData(0,0,H.image.width,H.image.height).data,delete b; +b=fa[H.id];ea=(Math.floor(ea)+Math.floor(h)*H.image.width)*4;U.setRGB(b[ea]/255,b[ea+1]/255,b[ea+2]/255);Ea(U)}else Y=1/Y,H=(j*c-i*f)*Y,i=(j*d-i*g)*Y,c=(l*f-k*c)*Y,d=(l*g-k*d)*Y,a=a-H*ea-c*h,ea=b-i*ea-d*h,n.save(),n.transform(H,i,c,d,a,ea),n.fill(),n.restore()}}function Ja(a,b,c,d,e,f,g,ea,h,l,i,k,H){var Y,j;Y=H.width-1;j=H.height-1;g*=Y;ea*=j;h*=Y;l*=j;i*=Y;k*=j;c-=a;d-=b;e-=a;f-=b;h-=g;l-=ea;i-=g;k-=ea;j=1/(h*k-i*l);Y=(k*c-l*e)*j;l=(k*d-l*f)*j;c=(h*e-i*c)*j;d=(h*f-i*d)*j;a=a-Y*g-c*ea;b=b-l*g-d* +ea;n.save();n.transform(Y,l,c,d,a,b);n.clip();n.drawImage(H,0,0);n.restore()}function P(a,b,c,d){var e=~~(a.r*255),f=~~(a.g*255),a=~~(a.b*255),g=~~(b.r*255),ea=~~(b.g*255),b=~~(b.b*255),h=~~(c.r*255),l=~~(c.g*255),c=~~(c.b*255),i=~~(d.r*255),k=~~(d.g*255),d=~~(d.b*255);Ca[0]=e<0?0:e>255?255:e;Ca[1]=f<0?0:f>255?255:f;Ca[2]=a<0?0:a>255?255:a;Ca[4]=g<0?0:g>255?255:g;Ca[5]=ea<0?0:ea>255?255:ea;Ca[6]=b<0?0:b>255?255:b;Ca[8]=h<0?0:h>255?255:h;Ca[9]=l<0?0:l>255?255:l;Ca[10]=c<0?0:c>255?255:c;Ca[12]=i<0? +0:i>255?255:i;Ca[13]=k<0?0:k>255?255:k;Ca[14]=d<0?0:d>255?255:d;La.putImageData(Oa,0,0);C.drawImage(Ka,0,0);return Ma}function M(a,b,c){a=(a-b)/(c-b);return a*a*(3-2*a)}function N(a){a=(a+1)*0.5;return a<0?0:a>1?1:a}function Fa(a,b){var c=b.x-a.x,d=b.y-a.y,e=c*c+d*d;e!=0&&(e=1/Math.sqrt(e),c*=e,d*=e,b.x+=c,b.y+=d,a.x-=c,a.y-=d)}var Na,Qa,ua,Da;this.autoClear?this.clear():n.setTransform(1,0,0,-1,m,q);f.info.render.vertices=0;f.info.render.faces=0;g=k.projectScene(a,j,this.sortElements);h=g.elements; +i=g.lights;(Ia=i.length>0)&&o(i);Na=0;for(Qa=h.length;Na1?1:a}var d=this,e,f,g,h=new THREE.Projector,i=document.createElementNS("http://www.w3.org/2000/svg","svg"),k,j,o,p,m,q,n,s,r=new THREE.Rectangle,u=new THREE.Rectangle,t=!1,z=new THREE.Color,A=new THREE.Color,E=new THREE.Color,D=new THREE.Color,B,w=new THREE.Vector3,G=[],y=[],K,$,Q,X=1;this.domElement=i;this.sortElements=this.sortObjects=this.autoClear=!0;this.info={render:{vertices:0, +faces:0}};this.setQuality=function(a){switch(a){case "high":X=1;break;case "low":X=0}};this.setSize=function(a,b){k=a;j=b;o=k/2;p=j/2;i.setAttribute("viewBox",-o+" "+-p+" "+k+" "+j);i.setAttribute("width",k);i.setAttribute("height",j);r.set(-o,-p,o,p)};this.clear=function(){for(;i.childNodes.length>0;)i.removeChild(i.childNodes[0])};this.render=function(k,j){var l,G,v,w;this.autoClear&&this.clear();d.info.render.vertices=0;d.info.render.faces=0;e=h.projectScene(k,j,this.sortElements);f=e.elements; +g=e.lights;Q=$=0;if(t=g.length>0){A.setRGB(0,0,0);E.setRGB(0,0,0);D.setRGB(0,0,0);l=0;for(G=g.length;l=0;c--)a[c].object===b&&a.splice(c,1)}function n(a,b){for(var c=a.length-1;c>=0;c--)a[c]===b&&a.splice(c,1)}function s(a,b,c,d,e){d.program||V.initMaterial(d,b,c,e);if(d.morphTargets&&!e.__webglMorphTargetInfluences){e.__webglMorphTargetInfluences= -new Float32Array(V.maxMorphTargets);for(var f=0,g=V.maxMorphTargets;f=0;c--)a[c].object===b&&a.splice(c,1)}function n(a,b){for(var c=a.length-1;c>=0;c--)a[c]===b&&a.splice(c,1)}function s(a,b,c,d,e){d.program||R.initMaterial(d,b,c,e);if(d.morphTargets&&!e.__webglMorphTargetInfluences){e.__webglMorphTargetInfluences= +new Float32Array(R.maxMorphTargets);for(var f=0,g=R.maxMorphTargets;f0;this.getContext=function(){return l};this.supportsVertexTextures=function(){return qa};this.setSize=function(a,b){I.width=a;I.height=b;this.setViewport(0,0,I.width,I.height)};this.setViewport=function(a,b,c,d){na=a;la=b;sa=c;ia=d;l.viewport(na,la,sa,ia)};this.setScissor=function(a,b,c,d){l.scissor(a,b,c,d)};this.enableScissorTest=function(a){a?l.enable(l.SCISSOR_TEST):l.disable(l.SCISSOR_TEST)};this.setClearColorHex=function(a,b){X.setHex(a); -T=b;l.clearColor(X.r,X.g,X.b,T)};this.setClearColor=function(a,b){X.copy(a);T=b;l.clearColor(X.r,X.g,X.b,T)};this.getClearColor=function(){return X};this.getClearAlpha=function(){return T};this.clear=function(a,b,c){var d=0;if(a===void 0||a)d|=l.COLOR_BUFFER_BIT;if(b===void 0||b)d|=l.DEPTH_BUFFER_BIT;if(c===void 0||c)d|=l.STENCIL_BUFFER_BIT;l.clear(d)};this.clearTarget=function(a,b,c,d){this.setRenderTarget(a);this.clear(b,c,d)};this.addPostPlugin=function(a){a.init(this);this.renderPluginsPost.push(a)}; +vertices:0,faces:0,points:0}};var R=this,l,V=[],v=null,W=null,L=-1,Z=null,da=0,ba=null,T=null,U=null,O=null,aa=null,ca=null,ga=null,va=null,fa=null,na=0,la=0,sa=0,ja=0,Ba=0,wa=0,xa=new THREE.Frustum,ya=new THREE.Matrix4,za=new THREE.Vector4,Aa={ambient:[0,0,0],directional:{length:0,colors:[],positions:[]},point:{length:0,colors:[],positions:[],distances:[]}};l=function(){var a;try{if(!(a=w.getContext("experimental-webgl",{antialias:y,stencil:K,preserveDrawingBuffer:$})))throw"Error creating WebGL context."; +console.log(navigator.userAgent+" | "+a.getParameter(a.VERSION)+" | "+a.getParameter(a.VENDOR)+" | "+a.getParameter(a.RENDERER)+" | "+a.getParameter(a.SHADING_LANGUAGE_VERSION))}catch(b){console.error(b)}return a}();l.clearColor(0,0,0,1);l.clearDepth(1);l.clearStencil(0);l.enable(l.DEPTH_TEST);l.depthFunc(l.LEQUAL);l.frontFace(l.CCW);l.cullFace(l.BACK);l.enable(l.CULL_FACE);l.enable(l.BLEND);l.blendEquation(l.FUNC_ADD);l.blendFunc(l.SRC_ALPHA,l.ONE_MINUS_SRC_ALPHA);l.clearColor(Q.r,Q.g,Q.b,X);this.context= +l;var qa=l.getParameter(l.MAX_VERTEX_TEXTURE_IMAGE_UNITS)>0;this.getContext=function(){return l};this.supportsVertexTextures=function(){return qa};this.setSize=function(a,b){w.width=a;w.height=b;this.setViewport(0,0,w.width,w.height)};this.setViewport=function(a,b,c,d){na=a;la=b;sa=c;ja=d;l.viewport(na,la,sa,ja)};this.setScissor=function(a,b,c,d){l.scissor(a,b,c,d)};this.enableScissorTest=function(a){a?l.enable(l.SCISSOR_TEST):l.disable(l.SCISSOR_TEST)};this.setClearColorHex=function(a,b){Q.setHex(a); +X=b;l.clearColor(Q.r,Q.g,Q.b,X)};this.setClearColor=function(a,b){Q.copy(a);X=b;l.clearColor(Q.r,Q.g,Q.b,X)};this.getClearColor=function(){return Q};this.getClearAlpha=function(){return X};this.clear=function(a,b,c){var d=0;if(a===void 0||a)d|=l.COLOR_BUFFER_BIT;if(b===void 0||b)d|=l.DEPTH_BUFFER_BIT;if(c===void 0||c)d|=l.STENCIL_BUFFER_BIT;l.clear(d)};this.clearTarget=function(a,b,c,d){this.setRenderTarget(a);this.clear(b,c,d)};this.addPostPlugin=function(a){a.init(this);this.renderPluginsPost.push(a)}; this.addPrePlugin=function(a){a.init(this);this.renderPluginsPre.push(a)};this.deallocateObject=function(a){if(a.__webglInit)if(a.__webglInit=!1,delete a._modelViewMatrix,delete a._normalMatrixArray,delete a._modelViewMatrixArray,delete a._objectMatrixArray,a instanceof THREE.Mesh)for(var b in a.geometry.geometryGroups){var c=a.geometry.geometryGroups[b];l.deleteBuffer(c.__webglVertexBuffer);l.deleteBuffer(c.__webglNormalBuffer);l.deleteBuffer(c.__webglTangentBuffer);l.deleteBuffer(c.__webglColorBuffer); l.deleteBuffer(c.__webglUVBuffer);l.deleteBuffer(c.__webglUV2Buffer);l.deleteBuffer(c.__webglSkinVertexABuffer);l.deleteBuffer(c.__webglSkinVertexBBuffer);l.deleteBuffer(c.__webglSkinIndicesBuffer);l.deleteBuffer(c.__webglSkinWeightsBuffer);l.deleteBuffer(c.__webglFaceBuffer);l.deleteBuffer(c.__webglLineBuffer);if(c.numMorphTargets)for(var d=0,e=c.numMorphTargets;d=0)a&&(l.bindBuffer(l.ARRAY_BUFFER,e.__webglVertexBuffer),l.vertexAttribPointer(b.position,3,l.FLOAT,!1,0,0));else if(f.morphTargetBase){c=d.program.attributes;f.morphTargetBase!==-1?(l.bindBuffer(l.ARRAY_BUFFER, +l.vertexAttribPointer(b.attributes.normal,3,l.FLOAT,!1,0,0)}l.drawArrays(l.TRIANGLES,0,a.count);a.count=0};this.renderBuffer=function(a,b,c,d,e,f){if(d.opacity!==0){var g,h,c=s(a,b,c,d,f),b=c.attributes,a=!1,c=e.id*16777215+c.id*2+(d.wireframe?1:0);c!==Z&&(Z=c,a=!0);if(!d.morphTargets&&b.position>=0)a&&(l.bindBuffer(l.ARRAY_BUFFER,e.__webglVertexBuffer),l.vertexAttribPointer(b.position,3,l.FLOAT,!1,0,0));else if(f.morphTargetBase){c=d.program.attributes;f.morphTargetBase!==-1?(l.bindBuffer(l.ARRAY_BUFFER, e.__webglMorphTargetsBuffers[f.morphTargetBase]),l.vertexAttribPointer(c.position,3,l.FLOAT,!1,0,0)):c.position>=0&&(l.bindBuffer(l.ARRAY_BUFFER,e.__webglVertexBuffer),l.vertexAttribPointer(c.position,3,l.FLOAT,!1,0,0));if(f.morphTargetForcedOrder.length){g=0;var i=f.morphTargetForcedOrder;for(h=f.morphTargetInfluences;gk&&(j=m,k=h[j]);l.bindBuffer(l.ARRAY_BUFFER,e.__webglMorphTargetsBuffers[j]);l.vertexAttribPointer(c["morphTarget"+g],3,l.FLOAT,!1,0,0);f.__webglMorphTargetInfluences[g]=k;i[j]=1;k=-1;g++}}d.program.uniforms.morphTargetInfluences!==null&&l.uniform1fv(d.program.uniforms.morphTargetInfluences,f.__webglMorphTargetInfluences)}if(a){if(e.__webglCustomAttributesList){g= 0;for(h=e.__webglCustomAttributesList.length;g=0&&(l.bindBuffer(l.ARRAY_BUFFER,c.buffer),l.vertexAttribPointer(b[c.buffer.belongsToAttribute],c.size,l.FLOAT,!1,0,0))}b.color>=0&&(l.bindBuffer(l.ARRAY_BUFFER,e.__webglColorBuffer),l.vertexAttribPointer(b.color,3,l.FLOAT,!1,0,0));b.normal>=0&&(l.bindBuffer(l.ARRAY_BUFFER,e.__webglNormalBuffer),l.vertexAttribPointer(b.normal,3,l.FLOAT,!1,0,0));b.tangent>=0&&(l.bindBuffer(l.ARRAY_BUFFER, e.__webglTangentBuffer),l.vertexAttribPointer(b.tangent,4,l.FLOAT,!1,0,0));b.uv>=0&&(e.__webglUVBuffer?(l.bindBuffer(l.ARRAY_BUFFER,e.__webglUVBuffer),l.vertexAttribPointer(b.uv,2,l.FLOAT,!1,0,0),l.enableVertexAttribArray(b.uv)):l.disableVertexAttribArray(b.uv));b.uv2>=0&&(e.__webglUV2Buffer?(l.bindBuffer(l.ARRAY_BUFFER,e.__webglUV2Buffer),l.vertexAttribPointer(b.uv2,2,l.FLOAT,!1,0,0),l.enableVertexAttribArray(b.uv2)):l.disableVertexAttribArray(b.uv2));d.skinning&&b.skinVertexA>=0&&b.skinVertexB>= 0&&b.skinIndex>=0&&b.skinWeight>=0&&(l.bindBuffer(l.ARRAY_BUFFER,e.__webglSkinVertexABuffer),l.vertexAttribPointer(b.skinVertexA,4,l.FLOAT,!1,0,0),l.bindBuffer(l.ARRAY_BUFFER,e.__webglSkinVertexBBuffer),l.vertexAttribPointer(b.skinVertexB,4,l.FLOAT,!1,0,0),l.bindBuffer(l.ARRAY_BUFFER,e.__webglSkinIndicesBuffer),l.vertexAttribPointer(b.skinIndex,4,l.FLOAT,!1,0,0),l.bindBuffer(l.ARRAY_BUFFER,e.__webglSkinWeightsBuffer),l.vertexAttribPointer(b.skinWeight,4,l.FLOAT,!1,0,0))}f instanceof THREE.Mesh?(d.wireframe? -(d=d.wireframeLinewidth,d!==ea&&(l.lineWidth(d),ea=d),a&&l.bindBuffer(l.ELEMENT_ARRAY_BUFFER,e.__webglLineBuffer),l.drawElements(l.LINES,e.__webglLineCount,l.UNSIGNED_SHORT,0)):(a&&l.bindBuffer(l.ELEMENT_ARRAY_BUFFER,e.__webglFaceBuffer),l.drawElements(l.TRIANGLES,e.__webglFaceCount,l.UNSIGNED_SHORT,0)),V.info.render.calls++,V.info.render.vertices+=e.__webglFaceCount,V.info.render.faces+=e.__webglFaceCount/3):f instanceof THREE.Line?(f=f.type===THREE.LineStrip?l.LINE_STRIP:l.LINES,d=d.linewidth,d!== -ea&&(l.lineWidth(d),ea=d),l.drawArrays(f,0,e.__webglLineCount),V.info.render.calls++):f instanceof THREE.ParticleSystem?(l.drawArrays(l.POINTS,0,e.__webglParticleCount),V.info.render.calls++,V.info.render.points+=e.__webglParticleCount):f instanceof THREE.Ribbon&&(l.drawArrays(l.TRIANGLE_STRIP,0,e.__webglVertexCount),V.info.render.calls++)}};this.render=function(a,b,c,d){var e,f,g,m,n=a.lights,o=a.fog;v=-1;this.autoUpdateObjects&&this.initWebGLObjects(a);b.parent===void 0&&(console.warn("DEPRECATED: Camera hasn't been added to a Scene. Adding it..."), -a.add(b));this.autoUpdateScene&&a.updateMatrixWorld();i(this.renderPluginsPre,a,b);V.info.render.calls=0;V.info.render.vertices=0;V.info.render.faces=0;V.info.render.points=0;b.matrixWorldInverse.getInverse(b.matrixWorld);if(!b._viewMatrixArray)b._viewMatrixArray=new Float32Array(16);b.matrixWorldInverse.flattenToArray(b._viewMatrixArray);if(!b._projectionMatrixArray)b._projectionMatrixArray=new Float32Array(16);b.projectionMatrix.flattenToArray(b._projectionMatrixArray);ya.multiply(b.projectionMatrix, -b.matrixWorldInverse);xa.setFromMatrix(ya);this.setRenderTarget(c);(this.autoClear||d)&&this.clear(this.autoClearColor,this.autoClearDepth,this.autoClearStencil);m=a.__webglObjects;d=0;for(e=m.length;d=0)z=q.geometry.materials[z],z.transparent?(p.transparent=z,p.opaque=null):(p.opaque=z,p.transparent=null)}else if(z)z.transparent?(p.transparent=z,p.opaque=null):(p.opaque=z,p.transparent=null);f.render=!0;if(this.sortObjects)g.renderDepth?f.z=g.renderDepth:(za.copy(g.position),ya.multiplyVector3(za),f.z=za.z)}this.sortObjects&&m.sort(h);m=a.__webglObjectsImmediate;d=0;for(e=m.length;d=0)y=q.geometry.materials[y],y.transparent?(p.transparent=y,p.opaque=null):(p.opaque=y,p.transparent=null)}else if(y)y.transparent?(p.transparent=y,p.opaque=null):(p.opaque=y,p.transparent=null);f.render=!0;if(this.sortObjects)g.renderDepth?f.z=g.renderDepth:(za.copy(g.position),ya.multiplyVector3(za),f.z=za.z)}this.sortObjects&&m.sort(h);m=a.__webglObjectsImmediate;d=0;for(e=m.length;d65535&&(A[x].counter+=1,C=A[x].hash+"_"+A[x].counter,F.geometryGroups[C]===void 0&&(F.geometryGroups[C]={faces3:[],faces4:[],materialIndex:z,vertices:0,numMorphTargets:R})),t instanceof THREE.Face3?F.geometryGroups[C].faces3.push(s): -F.geometryGroups[C].faces4.push(s),F.geometryGroups[C].vertices+=u;F.geometryGroupsList=[];s=void 0;for(s in F.geometryGroups)F.geometryGroups[s].id=aa++,F.geometryGroupsList.push(F.geometryGroups[s])}for(k in j.geometryGroups)if(F=j.geometryGroups[k],!F.__webglVertexBuffer){s=F;s.__webglVertexBuffer=l.createBuffer();s.__webglNormalBuffer=l.createBuffer();s.__webglTangentBuffer=l.createBuffer();s.__webglColorBuffer=l.createBuffer();s.__webglUVBuffer=l.createBuffer();s.__webglUV2Buffer=l.createBuffer(); -s.__webglSkinVertexABuffer=l.createBuffer();s.__webglSkinVertexBBuffer=l.createBuffer();s.__webglSkinIndicesBuffer=l.createBuffer();s.__webglSkinWeightsBuffer=l.createBuffer();s.__webglFaceBuffer=l.createBuffer();s.__webglLineBuffer=l.createBuffer();if(s.numMorphTargets){t=r=void 0;s.__webglMorphTargetsBuffers=[];r=0;for(t=s.numMorphTargets;r0||u.faceVertexUvs.length>0)F.__uvArray=new Float32Array(s*2);if(u.faceUvs.length>1||u.faceVertexUvs.length>1)F.__uv2Array=new Float32Array(s*2)}if(z.geometry.skinWeights.length&&z.geometry.skinIndices.length)F.__skinVertexAArray= -new Float32Array(s*4),F.__skinVertexBArray=new Float32Array(s*4),F.__skinIndexArray=new Float32Array(s*4),F.__skinWeightArray=new Float32Array(s*4);F.__faceArray=new Uint16Array(t*3);F.__lineArray=new Uint16Array(x*2);if(F.numMorphTargets){F.__morphTargetsArrays=[];z=0;for(u=F.numMorphTargets;z65535&&(v[w].counter+=1,C=v[w].hash+"_"+v[w].counter,H.geometryGroups[C]===void 0&&(H.geometryGroups[C]={faces3:[],faces4:[],materialIndex:u,vertices:0,numMorphTargets:z})),y instanceof THREE.Face3?H.geometryGroups[C].faces3.push(s): +H.geometryGroups[C].faces4.push(s),H.geometryGroups[C].vertices+=t;H.geometryGroupsList=[];s=void 0;for(s in H.geometryGroups)H.geometryGroups[s].id=da++,H.geometryGroupsList.push(H.geometryGroups[s])}for(k in j.geometryGroups)if(H=j.geometryGroups[k],!H.__webglVertexBuffer){s=H;s.__webglVertexBuffer=l.createBuffer();s.__webglNormalBuffer=l.createBuffer();s.__webglTangentBuffer=l.createBuffer();s.__webglColorBuffer=l.createBuffer();s.__webglUVBuffer=l.createBuffer();s.__webglUV2Buffer=l.createBuffer(); +s.__webglSkinVertexABuffer=l.createBuffer();s.__webglSkinVertexBBuffer=l.createBuffer();s.__webglSkinIndicesBuffer=l.createBuffer();s.__webglSkinWeightsBuffer=l.createBuffer();s.__webglFaceBuffer=l.createBuffer();s.__webglLineBuffer=l.createBuffer();if(s.numMorphTargets){y=r=void 0;s.__webglMorphTargetsBuffers=[];r=0;for(y=s.numMorphTargets;r0||t.faceVertexUvs.length>0)H.__uvArray=new Float32Array(s*2);if(t.faceUvs.length>1||t.faceVertexUvs.length>1)H.__uv2Array=new Float32Array(s*2)}if(u.geometry.skinWeights.length&&u.geometry.skinIndices.length)H.__skinVertexAArray= +new Float32Array(s*4),H.__skinVertexBArray=new Float32Array(s*4),H.__skinIndexArray=new Float32Array(s*4),H.__skinWeightArray=new Float32Array(s*4);H.__faceArray=new Uint16Array(y*3);H.__lineArray=new Uint16Array(w*2);if(H.numMorphTargets){H.__morphTargetsArrays=[];u=0;for(t=H.numMorphTargets;u0&&(l.bindBuffer(l.ARRAY_BUFFER,r.__webglSkinVertexABuffer),l.bufferData(l.ARRAY_BUFFER,T,t),l.bindBuffer(l.ARRAY_BUFFER, -r.__webglSkinVertexBBuffer),l.bufferData(l.ARRAY_BUFFER,W,t),l.bindBuffer(l.ARRAY_BUFFER,r.__webglSkinIndicesBuffer),l.bufferData(l.ARRAY_BUFFER,B,t),l.bindBuffer(l.ARRAY_BUFFER,r.__webglSkinWeightsBuffer),l.bufferData(l.ARRAY_BUFFER,oa,t))}if(za&&x){C=0;for(A=w.length;C0&&(l.bindBuffer(l.ARRAY_BUFFER,r.__webglColorBuffer),l.bufferData(l.ARRAY_BUFFER,U,t))}if(M&&Y.hasTangents){C=0;for(A=w.length;C0&&(l.bindBuffer(l.ARRAY_BUFFER,r.__webglUVBuffer),l.bufferData(l.ARRAY_BUFFER,fa,t))}if(sa&&Ba&&G){C=0;for(A=w.length;C -0&&(l.bindBuffer(l.ARRAY_BUFFER,r.__webglUV2Buffer),l.bufferData(l.ARRAY_BUFFER,D,t))}if(qa){C=0;for(A=w.length;C0&&(l.bindBuffer(l.ARRAY_BUFFER,r.__webglSkinVertexABuffer),l.bufferData(l.ARRAY_BUFFER,W,y),l.bindBuffer(l.ARRAY_BUFFER, +r.__webglSkinVertexBBuffer),l.bufferData(l.ARRAY_BUFFER,V,y),l.bindBuffer(l.ARRAY_BUFFER,r.__webglSkinIndicesBuffer),l.bufferData(l.ARRAY_BUFFER,D,y),l.bindBuffer(l.ARRAY_BUFFER,r.__webglSkinWeightsBuffer),l.bufferData(l.ARRAY_BUFFER,oa,y))}if(za&&w){C=0;for(v=G.length;C0&&(l.bindBuffer(l.ARRAY_BUFFER,r.__webglColorBuffer),l.bufferData(l.ARRAY_BUFFER,U,y))}if($&&X.hasTangents){C=0;for(v=G.length;C0&&(l.bindBuffer(l.ARRAY_BUFFER,r.__webglUVBuffer),l.bufferData(l.ARRAY_BUFFER,ga,y))}if(sa&&Ba&&B){C=0;for(v=G.length;C +0&&(l.bindBuffer(l.ARRAY_BUFFER,r.__webglUV2Buffer),l.bufferData(l.ARRAY_BUFFER,F,y))}if(qa){C=0;for(v=G.length;C=0&&l.enableVertexAttribArray(o.position);o.color>=0&&l.enableVertexAttribArray(o.color);o.normal>=0&&l.enableVertexAttribArray(o.normal); +g=["#ifdef GL_ES","precision "+G+" float;","#endif","#define MAX_DIR_LIGHTS "+c.maxDirLights,"#define MAX_POINT_LIGHTS "+c.maxPointLights,"#define MAX_SHADOWS "+c.maxShadows,c.alphaTest?"#define ALPHATEST "+c.alphaTest:"",R.gammaInput?"#define GAMMA_INPUT":"",R.gammaOutput?"#define GAMMA_OUTPUT":"",R.physicallyBasedShading?"#define PHYSICALLY_BASED_SHADING":"",c.useFog&&c.fog?"#define USE_FOG":"",c.useFog&&c.fog instanceof THREE.FogExp2?"#define FOG_EXP2":"",c.map?"#define USE_MAP":"",c.envMap?"#define USE_ENVMAP": +"",c.lightMap?"#define USE_LIGHTMAP":"",c.vertexColors?"#define USE_COLOR":"",c.metal?"#define METAL":"",c.perPixel?"#define PHONG_PER_PIXEL":"",c.shadowMapEnabled?"#define USE_SHADOWMAP":"",c.shadowMapSoft?"#define SHADOWMAP_SOFT":"",c.shadowMapSoft?"#define SHADOWMAP_WIDTH "+c.shadowMapWidth.toFixed(1):"",c.shadowMapSoft?"#define SHADOWMAP_HEIGHT "+c.shadowMapHeight.toFixed(1):"","uniform mat4 viewMatrix;\nuniform vec3 cameraPosition;\n"].join("\n");l.attachShader(p,z("fragment",g+j));l.attachShader(p, +z("vertex",d+k));l.linkProgram(p);l.getProgramParameter(p,l.LINK_STATUS)||console.error("Could not initialise shader\nVALIDATE_STATUS: "+l.getProgramParameter(p,l.VALIDATE_STATUS)+", gl error ["+l.getError()+"]");p.uniforms={};p.attributes={};var q,d=["viewMatrix","modelViewMatrix","projectionMatrix","normalMatrix","objectMatrix","cameraPosition","cameraInverseMatrix","boneGlobalMatrices","morphTargetInfluences"];for(q in i)d.push(q);q=d;d=0;for(i=q.length;d=0&&l.enableVertexAttribArray(o.position);o.color>=0&&l.enableVertexAttribArray(o.color);o.normal>=0&&l.enableVertexAttribArray(o.normal); o.tangent>=0&&l.enableVertexAttribArray(o.tangent);a.skinning&&o.skinVertexA>=0&&o.skinVertexB>=0&&o.skinIndex>=0&&o.skinWeight>=0&&(l.enableVertexAttribArray(o.skinVertexA),l.enableVertexAttribArray(o.skinVertexB),l.enableVertexAttribArray(o.skinIndex),l.enableVertexAttribArray(o.skinWeight));if(a.attributes)for(f in a.attributes)o[f]!==void 0&&o[f]>=0&&l.enableVertexAttribArray(o[f]);if(a.morphTargets)for(f=a.numSupportedMorphTargets=0;f=0&&(l.enableVertexAttribArray(o[q]), -a.numSupportedMorphTargets++);a.uniformsList=[];for(e in a.uniforms)a.uniformsList.push([a.uniforms[e],e])};this.setFaceCulling=function(a,b){a?(!b||b==="ccw"?l.frontFace(l.CCW):l.frontFace(l.CW),a==="back"?l.cullFace(l.BACK):a==="front"?l.cullFace(l.FRONT):l.cullFace(l.FRONT_AND_BACK),l.enable(l.CULL_FACE)):l.disable(l.CULL_FACE)};this.setObjectFaces=function(a){if(fa!==a.doubleSided)a.doubleSided?l.disable(l.CULL_FACE):l.enable(l.CULL_FACE),fa=a.doubleSided;if(ca!==a.flipSided)a.flipSided?l.frontFace(l.CW): -l.frontFace(l.CCW),ca=a.flipSided};this.setDepthTest=function(a){N!==a&&(a?l.enable(l.DEPTH_TEST):l.disable(l.DEPTH_TEST),N=a)};this.setBlending=function(a){if(a!==U){switch(a){case THREE.AdditiveBlending:l.blendEquation(l.FUNC_ADD);l.blendFunc(l.SRC_ALPHA,l.ONE);break;case THREE.SubtractiveBlending:l.blendEquation(l.FUNC_ADD);l.blendFunc(l.ZERO,l.ONE_MINUS_SRC_COLOR);break;case THREE.MultiplyBlending:l.blendEquation(l.FUNC_ADD);l.blendFunc(l.ZERO,l.SRC_COLOR);break;default:l.blendEquationSeparate(l.FUNC_ADD, -l.FUNC_ADD),l.blendFuncSeparate(l.SRC_ALPHA,l.ONE_MINUS_SRC_ALPHA,l.ONE,l.ONE_MINUS_SRC_ALPHA)}U=a}};this.setTexture=function(a,b){if(a.needsUpdate){if(!a.__webglInit)a.__webglInit=!0,a.__webglTexture=l.createTexture(),V.info.memory.textures++;l.activeTexture(l.TEXTURE0+b);l.bindTexture(l.TEXTURE_2D,a.__webglTexture);var c=G(l.TEXTURE_2D,a,a.image);a instanceof THREE.DataTexture?l.texImage2D(l.TEXTURE_2D,0,E(a.format),a.image.width,a.image.height,0,E(a.format),l.UNSIGNED_BYTE,a.image.data):l.texImage2D(l.TEXTURE_2D, +a.numSupportedMorphTargets++);a.uniformsList=[];for(e in a.uniforms)a.uniformsList.push([a.uniforms[e],e])};this.setFaceCulling=function(a,b){a?(!b||b==="ccw"?l.frontFace(l.CCW):l.frontFace(l.CW),a==="back"?l.cullFace(l.BACK):a==="front"?l.cullFace(l.FRONT):l.cullFace(l.FRONT_AND_BACK),l.enable(l.CULL_FACE)):l.disable(l.CULL_FACE)};this.setObjectFaces=function(a){if(ba!==a.doubleSided)a.doubleSided?l.disable(l.CULL_FACE):l.enable(l.CULL_FACE),ba=a.doubleSided;if(T!==a.flipSided)a.flipSided?l.frontFace(l.CW): +l.frontFace(l.CCW),T=a.flipSided};this.setDepthTest=function(a){O!==a&&(a?l.enable(l.DEPTH_TEST):l.disable(l.DEPTH_TEST),O=a)};this.setBlending=function(a){if(a!==U){switch(a){case THREE.AdditiveBlending:l.blendEquation(l.FUNC_ADD);l.blendFunc(l.SRC_ALPHA,l.ONE);break;case THREE.SubtractiveBlending:l.blendEquation(l.FUNC_ADD);l.blendFunc(l.ZERO,l.ONE_MINUS_SRC_COLOR);break;case THREE.MultiplyBlending:l.blendEquation(l.FUNC_ADD);l.blendFunc(l.ZERO,l.SRC_COLOR);break;default:l.blendEquationSeparate(l.FUNC_ADD, +l.FUNC_ADD),l.blendFuncSeparate(l.SRC_ALPHA,l.ONE_MINUS_SRC_ALPHA,l.ONE,l.ONE_MINUS_SRC_ALPHA)}U=a}};this.setTexture=function(a,b){if(a.needsUpdate){if(!a.__webglInit)a.__webglInit=!0,a.__webglTexture=l.createTexture(),R.info.memory.textures++;l.activeTexture(l.TEXTURE0+b);l.bindTexture(l.TEXTURE_2D,a.__webglTexture);var c=A(l.TEXTURE_2D,a,a.image);a instanceof THREE.DataTexture?l.texImage2D(l.TEXTURE_2D,0,B(a.format),a.image.width,a.image.height,0,B(a.format),l.UNSIGNED_BYTE,a.image.data):l.texImage2D(l.TEXTURE_2D, 0,l.RGBA,l.RGBA,l.UNSIGNED_BYTE,a.image);c&&l.generateMipmap(l.TEXTURE_2D);a.needsUpdate=!1;if(a.onUpdated)a.onUpdated()}else l.activeTexture(l.TEXTURE0+b),l.bindTexture(l.TEXTURE_2D,a.__webglTexture)};this.setRenderTarget=function(a){var b=a instanceof THREE.WebGLRenderTargetCube;if(a&&!a.__webglFramebuffer){if(a.depthBuffer===void 0)a.depthBuffer=!0;if(a.stencilBuffer===void 0)a.stencilBuffer=!0;a.__webglTexture=l.createTexture();if(b){a.__webglFramebuffer=[];a.__webglRenderbuffer=[];l.bindTexture(l.TEXTURE_CUBE_MAP, -a.__webglTexture);G(l.TEXTURE_CUBE_MAP,a,a);for(var c=0;c<6;c++){a.__webglFramebuffer[c]=l.createFramebuffer();a.__webglRenderbuffer[c]=l.createRenderbuffer();l.texImage2D(l.TEXTURE_CUBE_MAP_POSITIVE_X+c,0,E(a.format),a.width,a.height,0,E(a.format),E(a.type),null);var d=a,e=l.TEXTURE_CUBE_MAP_POSITIVE_X+c;l.bindFramebuffer(l.FRAMEBUFFER,a.__webglFramebuffer[c]);l.framebufferTexture2D(l.FRAMEBUFFER,l.COLOR_ATTACHMENT0,e,d.__webglTexture,0);w(a.__webglRenderbuffer[c],a)}}else a.__webglFramebuffer=l.createFramebuffer(), -a.__webglRenderbuffer=l.createRenderbuffer(),l.bindTexture(l.TEXTURE_2D,a.__webglTexture),G(l.TEXTURE_2D,a,a),l.texImage2D(l.TEXTURE_2D,0,E(a.format),a.width,a.height,0,E(a.format),E(a.type),null),c=l.TEXTURE_2D,l.bindFramebuffer(l.FRAMEBUFFER,a.__webglFramebuffer),l.framebufferTexture2D(l.FRAMEBUFFER,l.COLOR_ATTACHMENT0,c,a.__webglTexture,0),w(a.__webglRenderbuffer,a);b?l.bindTexture(l.TEXTURE_CUBE_MAP,null):l.bindTexture(l.TEXTURE_2D,null);l.bindRenderbuffer(l.RENDERBUFFER,null);l.bindFramebuffer(l.FRAMEBUFFER, -null)}a?(b=b?a.__webglFramebuffer[a.activeCubeFace]:a.__webglFramebuffer,c=a.width,a=a.height,e=d=0):(b=null,c=sa,a=ia,d=na,e=la);b!==L&&(l.bindFramebuffer(l.FRAMEBUFFER,b),l.viewport(d,e,c,a),L=b);Ba=c;wa=a};this.shadowMapPlugin=new THREE.ShadowMapPlugin;this.addPrePlugin(this.shadowMapPlugin);this.addPostPlugin(new THREE.SpritePlugin);this.addPostPlugin(new THREE.LensFlarePlugin)}; +a.__webglTexture);A(l.TEXTURE_CUBE_MAP,a,a);for(var c=0;c<6;c++){a.__webglFramebuffer[c]=l.createFramebuffer();a.__webglRenderbuffer[c]=l.createRenderbuffer();l.texImage2D(l.TEXTURE_CUBE_MAP_POSITIVE_X+c,0,B(a.format),a.width,a.height,0,B(a.format),B(a.type),null);var d=a,e=l.TEXTURE_CUBE_MAP_POSITIVE_X+c;l.bindFramebuffer(l.FRAMEBUFFER,a.__webglFramebuffer[c]);l.framebufferTexture2D(l.FRAMEBUFFER,l.COLOR_ATTACHMENT0,e,d.__webglTexture,0);E(a.__webglRenderbuffer[c],a)}}else a.__webglFramebuffer=l.createFramebuffer(), +a.__webglRenderbuffer=l.createRenderbuffer(),l.bindTexture(l.TEXTURE_2D,a.__webglTexture),A(l.TEXTURE_2D,a,a),l.texImage2D(l.TEXTURE_2D,0,B(a.format),a.width,a.height,0,B(a.format),B(a.type),null),c=l.TEXTURE_2D,l.bindFramebuffer(l.FRAMEBUFFER,a.__webglFramebuffer),l.framebufferTexture2D(l.FRAMEBUFFER,l.COLOR_ATTACHMENT0,c,a.__webglTexture,0),E(a.__webglRenderbuffer,a);b?l.bindTexture(l.TEXTURE_CUBE_MAP,null):l.bindTexture(l.TEXTURE_2D,null);l.bindRenderbuffer(l.RENDERBUFFER,null);l.bindFramebuffer(l.FRAMEBUFFER, +null)}a?(b=b?a.__webglFramebuffer[a.activeCubeFace]:a.__webglFramebuffer,c=a.width,a=a.height,e=d=0):(b=null,c=sa,a=ja,d=na,e=la);b!==W&&(l.bindFramebuffer(l.FRAMEBUFFER,b),l.viewport(d,e,c,a),W=b);Ba=c;wa=a};this.shadowMapPlugin=new THREE.ShadowMapPlugin;this.addPrePlugin(this.shadowMapPlugin);this.addPostPlugin(new THREE.SpritePlugin);this.addPostPlugin(new THREE.LensFlarePlugin)}; THREE.WebGLRenderTarget=function(a,b,c){this.width=a;this.height=b;c=c||{};this.wrapS=c.wrapS!==void 0?c.wrapS:THREE.ClampToEdgeWrapping;this.wrapT=c.wrapT!==void 0?c.wrapT:THREE.ClampToEdgeWrapping;this.magFilter=c.magFilter!==void 0?c.magFilter:THREE.LinearFilter;this.minFilter=c.minFilter!==void 0?c.minFilter:THREE.LinearMipMapLinearFilter;this.offset=new THREE.Vector2(0,0);this.repeat=new THREE.Vector2(1,1);this.format=c.format!==void 0?c.format:THREE.RGBAFormat;this.type=c.type!==void 0?c.type: THREE.UnsignedByteType;this.depthBuffer=c.depthBuffer!==void 0?c.depthBuffer:!0;this.stencilBuffer=c.stencilBuffer!==void 0?c.stencilBuffer:!0}; THREE.WebGLRenderTarget.prototype.clone=function(){var a=new THREE.WebGLRenderTarget(this.width,this.height);a.wrapS=this.wrapS;a.wrapT=this.wrapT;a.magFilter=this.magFilter;a.minFilter=this.minFilter;a.offset.copy(this.offset);a.repeat.copy(this.repeat);a.format=this.format;a.type=this.type;a.depthBuffer=this.depthBuffer;a.stencilBuffer=this.stencilBuffer;return a};THREE.WebGLRenderTargetCube=function(a,b,c){THREE.WebGLRenderTarget.call(this,a,b,c);this.activeCubeFace=0}; @@ -345,17 +345,18 @@ THREE.RenderableParticle=function(){this.rotation=this.z=this.y=this.x=null;this THREE.ColorUtils={adjustHSV:function(a,b,c,d){var e=THREE.ColorUtils.__hsv;THREE.ColorUtils.rgbToHsv(a,e);e.h=THREE.Math.clamp(e.h+b,0,1);e.s=THREE.Math.clamp(e.s+c,0,1);e.v=THREE.Math.clamp(e.v+d,0,1);a.setHSV(e.h,e.s,e.v)},rgbToHsv:function(a,b){var c=a.r,d=a.g,e=a.b,f=Math.max(Math.max(c,d),e),g=Math.min(Math.min(c,d),e);if(g===f)g=c=0;else{var h=f-g,g=h/f,c=c===f?(d-e)/h:d===f?2+(e-c)/h:4+(c-d)/h;c/=6;c<0&&(c+=1);c>1&&(c-=1)}b===void 0&&(b={h:0,s:0,v:0});b.h=c;b.s=g;b.v=f;return b}}; THREE.ColorUtils.__hsv={h:0,s:0,v:0}; THREE.GeometryUtils={merge:function(a,b){for(var c,d,e=a.vertices.length,f=b instanceof THREE.Mesh?b.geometry:b,g=a.vertices,h=f.vertices,i=a.faces,k=f.faces,j=a.faceVertexUvs[0],o=f.faceVertexUvs[0],p={},m=0;m1&&(d=1-d,e=1-e);f=1-d-e;g.copy(a);g.multiplyScalar(d);h.copy(b);h.multiplyScalar(e);g.addSelf(h);h.copy(c);h.multiplyScalar(f);g.addSelf(h);return g},randomPointInFace:function(a,b,c){var d,e,f;if(a instanceof THREE.Face3)return d=b.vertices[a.a].position,e=b.vertices[a.b].position, f=b.vertices[a.c].position,THREE.GeometryUtils.randomPointInTriangle(d,e,f);else if(a instanceof THREE.Face4){d=b.vertices[a.a].position;e=b.vertices[a.b].position;f=b.vertices[a.c].position;var b=b.vertices[a.d].position,g;c?a._area1&&a._area2?(c=a._area1,g=a._area2):(c=THREE.GeometryUtils.triangleArea(d,e,b),g=THREE.GeometryUtils.triangleArea(e,f,b),a._area1=c,a._area2=g):(c=THREE.GeometryUtils.triangleArea(d,e,b),g=THREE.GeometryUtils.triangleArea(e,f,b));return THREE.GeometryUtils.random()*(c+ g)a?b(c,e-1):k[e]a.length-2?f:f+1;c[3]=f>a.length-3?f:f+2;f=a[c[0]];h=a[c[1]];i=a[c[2]];k=a[c[3]];c=e*e;g=e*c;d[0]=this.interpolate(f[0],h[0],i[0],k[0],e,c,g);d[1]=this.interpolate(f[1],h[1],i[1],k[1],e,c,g);d[2]=this.interpolate(f[2],h[2],i[2],k[2],e,c,g);return d}; THREE.Animation.prototype.interpolate=function(a,b,c,d,e,f,g){a=(c-a)*0.5;d=(d-b)*0.5;return(2*(b-c)+a+d)*g+(-3*(b-c)-2*a-d)*f+a*e+b};THREE.Animation.prototype.getNextKeyWith=function(a,b,c){var d=this.data.hierarchy[b].keys;for(this.interpolationType===THREE.AnimationHandler.CATMULLROM||this.interpolationType===THREE.AnimationHandler.CATMULLROM_FORWARD?c=c0?c:0:c>=0?c:c+d.length;c>=0;c--)if(d[c][a]!==void 0)return d[c];return this.data.hierarchy[b].keys[d.length-1]}; -THREE.KeyFrameAnimation=function(a,b,c){this.root=a;this.data=THREE.AnimationHandler.get(b);this.hierarchy=THREE.AnimationHandler.parse(a);this.currentTime=0;this.timeScale=0.001;this.isPlaying=!1;this.loop=this.isPaused=!0;this.JITCompile=c!==void 0?c:!0;a=0;for(b=this.hierarchy.length;a=0?a:a+g;b=this.verticalAngleMap.srcRange; a=this.verticalAngleMap.dstRange;b=THREE.Math.mapLinear(this.phi,b[0],b[1],a[0],a[1]);var d=a[1]-a[0];this.phi=c((b-a[0])/d)*d+a[0];b=this.horizontalAngleMap.srcRange;a=this.horizontalAngleMap.dstRange;b=THREE.Math.mapLinear(this.theta,b[0],b[1],a[0],a[1]);d=a[1]-a[0];this.theta=c((b-a[0])/d)*d+a[0];a=this.target.position;a.x=100*Math.sin(this.phi)*Math.cos(this.theta);a.y=100*Math.cos(this.phi);a.z=100*Math.sin(this.phi)*Math.sin(this.theta);this.object.lookAt(this.target.position)};this.onMouseMove= function(a){this.domElement===document?(this.mouseX=a.pageX-this.viewHalfX,this.mouseY=a.pageY-this.viewHalfY):(this.mouseX=a.pageX-this.domElement.offsetLeft-this.viewHalfX,this.mouseY=a.pageY-this.domElement.offsetTop-this.viewHalfY)};this.init=function(){this.spline=new THREE.Spline;this.spline.initFromArray(this.waypoints);this.useConstantSpeed&&this.spline.reparametrizeByArcLength(this.resamplingCoef);if(this.createDebugDummy){var a=new THREE.MeshLambertMaterial({color:30719}),b=new THREE.MeshLambertMaterial({color:65280}), c=new THREE.CubeGeometry(10,10,20),g=new THREE.CubeGeometry(2,2,10);this.animationParent=new THREE.Mesh(c,a);a=new THREE.Mesh(g,b);a.position.set(0,10,0);this.animation=e(this.animationParent,this.spline,this.id,this.duration);this.animationParent.add(this.object);this.animationParent.add(this.target);this.animationParent.add(a)}else this.animation=e(this.animationParent,this.spline,this.id,this.duration),this.animationParent.add(this.target),this.animationParent.add(this.object);if(this.createDebugPath){var a= this.debugPath,b=this.spline,g=f(b,10),c=f(b,10),h=new THREE.LineBasicMaterial({color:16711680,linewidth:3}),g=new THREE.Line(g,h),c=new THREE.ParticleSystem(c,new THREE.ParticleBasicMaterial({color:16755200,size:3}));g.scale.set(1,1,1);a.add(g);c.scale.set(1,1,1);a.add(c);for(var g=new THREE.SphereGeometry(1,16,8),h=new THREE.MeshBasicMaterial({color:65280}),m=0;m0?1:-1;for(h=0;h0?1:-1;for(h=0;h0){this.vertices.push(new THREE.Vertex(new THREE.Vector3(0,g,0)));for(h=0;h0){this.vertices.push(new THREE.Vertex(new THREE.Vector3(0,-g,0)));for(h=0;h0){this.vertices.push(new THREE.Vertex(new THREE.Vector3(0,g,0)));for(h=0;h0){this.vertices.push(new THREE.Vertex(new THREE.Vector3(0,-g,0)));for(h=0;ha&&(a+=Math.PI*2),a=(b+a)/2,new THREE.Vector2(-Math.cos(a),-Math.sin(a));return d.multiplyScalar(g).addSelf(h).subSelf(a).clone()}function e(a){for(z=a.length;--z>=0;){Y=z;aa=z-1;aa<0&&(aa=a.length-1);for(var b= -0,c=m+j*2,b=0;b=0;K--){X=K/j;T=i*(1-X);X=k*Math.sin(X*Math.PI/2);z=0;for(A=t.length;za&&(a+=Math.PI*2),a=(b+a)/2,new THREE.Vector2(-Math.cos(a),-Math.sin(a));return d.multiplyScalar(g).addSelf(h).subSelf(a).clone()}function e(a){for(y=a.length;--y>=0;){Z=y;da=y-1;da<0&&(da=a.length-1);for(var b= +0,c=m+j*2,b=0;b=0;$--){Q=$/j;X=i*(1-Q);Q=k*Math.sin(Q*Math.PI/2);y=0;for(K=u.length;y0)for(k=0;k2;){if(o--<=0){console.log("Warning, unable to triangulate polygon!");if(d)return h;return f}i=k;e<=i&&(i=0);k=i+1;e<=k&&(k=0);j=k+1;e<=j&&(j=0);var p;a:{p=a;var m=i,q=k,n=j,s=e,r=g,t=void 0,u=void 0,x=void 0, -G=void 0,w=void 0,B=void 0,E=void 0,I=void 0,R=void 0,u=p[r[m]].x,x=p[r[m]].y,G=p[r[q]].x,w=p[r[q]].y,B=p[r[n]].x,E=p[r[n]].y;if(1.0E-10>(G-u)*(E-x)-(w-x)*(B-u))p=!1;else{for(t=0;t=0&&K>=0&&T>=0){p=!1;break a}}p=!0}}if(p){f.push([a[g[i]], +j));e.lineTo(i,j);break;case "q":i=b[a++]*c+d;j=b[a++]*c;m=b[a++]*c+d;q=b[a++]*c;e.quadraticCurveTo(m,q,i,j);if(g=f[f.length-1]){o=g.x;p=g.y;g=1;for(h=this.divisions;g<=h;g++){var u=g/h,t=THREE.Shape.Utils.b2(u,o,m,i),u=THREE.Shape.Utils.b2(u,p,q,j);f.push(new THREE.Vector2(t,u))}}break;case "b":if(i=b[a++]*c+d,j=b[a++]*c,m=b[a++]*c+d,q=b[a++]*-c,n=b[a++]*c+d,s=b[a++]*-c,e.bezierCurveTo(i,j,m,q,n,s),g=f[f.length-1]){o=g.x;p=g.y;g=1;for(h=this.divisions;g<=h;g++)u=g/h,t=THREE.Shape.Utils.b3(u,o,m, +n,i),u=THREE.Shape.Utils.b3(u,p,q,s,j),f.push(new THREE.Vector2(t,u))}}}return{offset:r.ha*c,points:f,path:e}}}}; +(function(a){var b=function(a){for(var b=a.length,e=0,f=b-1,g=0;g0)for(k=0;k2;){if(o--<=0){console.log("Warning, unable to triangulate polygon!");if(d)return h;return f}i=k;e<=i&&(i=0);k=i+1;e<=k&&(k=0);j=k+1;e<=j&&(j=0);var p;a:{p=a;var m=i,q=k,n=j,s=e,r=g,u=void 0,t=void 0,z=void 0, +A=void 0,E=void 0,D=void 0,B=void 0,w=void 0,G=void 0,t=p[r[m]].x,z=p[r[m]].y,A=p[r[q]].x,E=p[r[q]].y,D=p[r[n]].x,B=p[r[n]].y;if(1.0E-10>(A-t)*(B-z)-(E-z)*(D-t))p=!1;else{for(u=0;u=0&&$>=0&&X>=0){p=!1;break a}}p=!0}}if(p){f.push([a[g[i]], a[g[k]],a[g[j]]]);h.push([g[i],g[k],g[j]]);i=k;for(j=k+1;j0;)this.smooth(a)}; THREE.SubdivisionModifier.prototype.smooth=function(a){function b(a,b,c,d,h,i){var j=new THREE.Face4(a,b,c,d,null,h.color,h.material);if(g.useOldVertexColors){j.vertexColors=[];for(var k,n,m,o=0;o<4;o++){m=i[o];k=new THREE.Color;k.setRGB(0,0,0);for(var q=0;q=0){o=k.invBindMatrices[n];l.invBindMatrix=o;l.skinningMatrix=new THREE.Matrix4;l.skinningMatrix.multiply(l.world,o);l.weights=[];for(o=0;o1){j=new THREE.MeshFaceMaterial;i.materials= +0;g1){j=new THREE.MeshFaceMaterial;i.materials= l;for(h=0;h1?b.add(j):b=j}}b.name=a.id||"";b.matrix=a.matrix;c=a.matrix.decompose();b.position=c[0];b.quaternion=c[1];b.useQuaternion=!0;b.scale=c[2];for(g=0;g=0,g=e.indexOf("(")>=0,h;if(f)d=e.split("."),e=d.shift(),d.shift();else if(g){h=e.split("(");e=h.shift(); -for(d=0;dq)break}if(!r){r= -new l(q);t=-1;u=0;for(v=d.length;u=q&&(t=u);q=t;d.splice(q==-1?d.length:q,0,r)}r.addTarget(f,j,g,s)}}else console.log('Could not find transform "'+b.sid+'" in node '+this.id)}for(c=0;c=0?i:i+h.length;i>=0;i--)if(k=h[i],k.hasTarget(g)){i=k;break a}i=null}k=void 0;a:{for(j+=1;j4&&qa.subdivideFaces){r=r.length?r:new THREE.Color;for(e=1;e4?[r[0],r[n+1],r[n+2]]:m===4?[r[0],r[1],r[2],r[3]]:[r[0],r[1],r[2]],b.faceVertexUvs[e]|| -(b.faceVertexUvs[e]=[]),b.faceVertexUvs[e].push(r)}}else console.log("dropped face with vcount "+m+" for geometry with id: "+b.id);c+=g.length*m}};t.prototype=new u;t.prototype.constructor=t;u.prototype.setVertices=function(a){for(var b=0;b0&&(this[c.nodeName]=parseFloat(d[0].textContent))}}this.create();return this};R.prototype.create=function(){var a={},b=this.transparency!==void 0&&this.transparency<1,c;for(c in this)switch(c){case "ambient":case "emission":case "diffuse":case "specular":var d=this[c];if(d instanceof I)if(d.isTexture()){if(this.effect.sampler&&this.effect.surface&&this.effect.sampler.source== -this.effect.surface.sid){var e=va[this.effect.surface.init_from];if(e)e=THREE.ImageUtils.loadTexture(xa+e.init_from),e.wrapS=d.texOpts.wrapU?THREE.RepeatWrapping:THREE.ClampToEdgeWrapping,e.wrapT=d.texOpts.wrapV?THREE.RepeatWrapping:THREE.ClampToEdgeWrapping,e.offset.x=d.texOpts.offsetU,e.offset.y=d.texOpts.offsetV,e.repeat.x=d.texOpts.repeatU,e.repeat.y=d.texOpts.repeatV,a.map=e}}else c=="diffuse"?a.color=d.color.getHex():b||(a[c]=d.color.getHex());break;case "shininess":case "reflectivity":a[c]= -this[c];break;case "transparency":if(b)a.transparent=!0,a.opacity=this[c],b=!0}a.shading=Aa;return this.material=new THREE.MeshLambertMaterial(a)};z.prototype.parse=function(a){for(var b=0;b=0,d=a.indexOf("(")>=0;if(c)b=a.split("."),this.sid=b.shift(),this.member=b.shift();else if(d){b=a.split("(");this.sid=b.shift();for(var e=0;e1){c=[];b*=this.strideOut;for(var d=0;d1)console.log("Key.interpolate: Warning! Scale out of bounds:"+ -f),f=f<0?0:1;if(h.length)for(var e=[],i=0;i=0,g=e.indexOf("(")>=0,h;if(f)d=e.split("."), +e=d.shift(),d.shift();else if(g){h=e.split("(");e=h.shift();for(d=0;dq)break}if(!r){r=new l(q);t=-1;u=0;for(v=d.length;u=q&&(t=u);q=t;d.splice(q==-1?d.length:q,0,r)}r.addTarget(f,j,g,s)}}else console.log('Could not find transform "'+b.sid+'" in node '+this.id)}for(c=0;c=0?i:i+h.length;i>=0;i--)if(k=h[i],k.hasTarget(g)){i=k;break a}i=null}k=void 0;a:{for(j+=1;j4&&qa.subdivideFaces){r=r.length?r:new THREE.Color;for(e=1;e4?[r[0],r[n+1],r[n+2]]:m===4?[r[0],r[1],r[2],r[3]]:[r[0],r[1],r[2]],b.faceVertexUvs[e]||(b.faceVertexUvs[e]=[]),b.faceVertexUvs[e].push(r)}}else console.log("dropped face with vcount "+m+" for geometry with id: "+b.id);c+=g.length*m}};u.prototype=new t;u.prototype.constructor=u;t.prototype.setVertices=function(a){for(var b=0;b0&&(this[c.nodeName]=parseFloat(d[0].textContent))}}this.create();return this};G.prototype.create=function(){var a={},b=this.transparency!==void 0&&this.transparency<1,c;for(c in this)switch(c){case "ambient":case "emission":case "diffuse":case "specular":var d=this[c]; +if(d instanceof w)if(d.isTexture()){if(this.effect.sampler&&this.effect.surface&&this.effect.sampler.source==this.effect.surface.sid){var e=va[this.effect.surface.init_from];if(e)e=THREE.ImageUtils.loadTexture(xa+e.init_from),e.wrapS=d.texOpts.wrapU?THREE.RepeatWrapping:THREE.ClampToEdgeWrapping,e.wrapT=d.texOpts.wrapV?THREE.RepeatWrapping:THREE.ClampToEdgeWrapping,e.offset.x=d.texOpts.offsetU,e.offset.y=d.texOpts.offsetV,e.repeat.x=d.texOpts.repeatU,e.repeat.y=d.texOpts.repeatV,a.map=e}}else c== +"diffuse"?a.color=d.color.getHex():b||(a[c]=d.color.getHex());break;case "shininess":case "reflectivity":a[c]=this[c];break;case "transparency":if(b)a.transparent=!0,a.opacity=this[c],b=!0}a.shading=Aa;return this.material=new THREE.MeshLambertMaterial(a)};y.prototype.parse=function(a){for(var b=0;b=0,d=a.indexOf("(")>=0;if(c)b=a.split("."),this.sid=b.shift(),this.member=b.shift();else if(d){b=a.split("(");this.sid=b.shift();for(var e= +0;e1){c=[];b*=this.strideOut;for(var d=0;d +1)console.log("Key.interpolate: Warning! Scale out of bounds:"+f),f=f<0?0:1;if(h.length)for(var e=[],i=0;i1&&(A=new THREE.MeshFaceMaterial); -a=new THREE.Mesh(I,A);a.name=p;a.position.set(x[0],x[1],x[2]);w?(a.quaternion.set(w[0],w[1],w[2],w[3]),a.useQuaternion=!0):a.rotation.set(G[0],G[1],G[2]);a.scale.set(B[0],B[1],B[2]);a.visible=r.visible;M.scene.add(a);M.objects[p]=a;if(r.meshCollider){var b=THREE.CollisionUtils.MeshColliderWBox(a);M.scene.collisions.colliders.push(b)}if(r.castsShadow)b=new THREE.ShadowVolume(I),M.scene.add(b),b.position=a.position,b.rotation=a.rotation,b.scale=a.scale;r.trigger&&r.trigger.toLowerCase()!="none"&&(b= -{type:r.trigger,object:r},M.triggers[a.name]=b)}}else x=r.position,G=r.rotation,w=r.quaternion,B=r.scale,w=0,a=new THREE.Object3D,a.name=p,a.position.set(x[0],x[1],x[2]),w?(a.quaternion.set(w[0],w[1],w[2],w[3]),a.useQuaternion=!0):a.rotation.set(G[0],G[1],G[2]),a.scale.set(B[0],B[1],B[2]),a.visible=r.visible!==void 0?r.visible:!1,M.scene.add(a),M.objects[p]=a,M.empties[p]=a,r.trigger&&r.trigger.toLowerCase()!="none"&&(b={type:r.trigger,object:r},M.triggers[a.name]=b)}function f(a){return function(b){M.geometries[a]= -b;e();T-=1;i.onLoadComplete();h()}}function g(a){return function(b){M.geometries[a]=b}}function h(){i.callbackProgress({totalModels:V,totalTextures:l,loadedModels:V-T,loadedTextures:l-$},M);i.onLoadProgress();T==0&&$==0&&b(M)}var i=this,k=THREE.Loader.prototype.extractUrlbase(c),j,o,p,m,q,n,s,r,t,u,x,G,w,B,E,I,R,z,A,K,X,T,$,V,l,M;K=a;c=new THREE.BinaryLoader;X=new THREE.JSONLoader;$=T=0;M={scene:new THREE.Scene,geometries:{},materials:{},textures:{},objects:{},cameras:{},lights:{},fogs:{},triggers:{}, -empties:{}};a=!1;for(p in K.objects)if(r=K.objects[p],r.meshCollider){a=!0;break}if(a)M.scene.collisions=new THREE.CollisionSystem;if(K.transform){a=K.transform.position;t=K.transform.rotation;var J=K.transform.scale;a&&M.scene.position.set(a[0],a[1],a[2]);t&&M.scene.rotation.set(t[0],t[1],t[2]);J&&M.scene.scale.set(J[0],J[1],J[2]);(a||t||J)&&M.scene.updateMatrix()}a=function(){$-=1;h();i.onLoadComplete()};for(q in K.cameras)t=K.cameras[q],t.type=="perspective"?R=new THREE.PerspectiveCamera(t.fov, -t.aspect,t.near,t.far):t.type=="ortho"&&(R=new THREE.OrthographicCamera(t.left,t.right,t.top,t.bottom,t.near,t.far)),x=t.position,t=t.target,R.position.set(x[0],x[1],x[2]),R.target=new THREE.Vector3(t[0],t[1],t[2]),M.cameras[q]=R;for(m in K.lights)t=K.lights[m],q=t.color!==void 0?t.color:16777215,R=t.intensity!==void 0?t.intensity:1,t.type=="directional"?(x=t.direction,u=new THREE.DirectionalLight(q,R),u.position.set(x[0],x[1],x[2]),u.position.normalize()):t.type=="point"?(x=t.position,u=t.distance, -u=new THREE.PointLight(q,R,u),u.position.set(x[0],x[1],x[2])):t.type=="ambient"&&(u=new THREE.AmbientLight(q)),M.scene.add(u),M.lights[m]=u;for(n in K.fogs)m=K.fogs[n],m.type=="linear"?z=new THREE.Fog(0,m.near,m.far):m.type=="exp2"&&(z=new THREE.FogExp2(0,m.density)),t=m.color,z.color.setRGB(t[0],t[1],t[2]),M.fogs[n]=z;if(M.cameras&&K.defaults.camera)M.currentCamera=M.cameras[K.defaults.camera];if(M.fogs&&K.defaults.fog)M.scene.fog=M.fogs[K.defaults.fog];t=K.defaults.bgcolor;M.bgColor=new THREE.Color; -M.bgColor.setRGB(t[0],t[1],t[2]);M.bgColorAlpha=K.defaults.bgalpha;for(j in K.geometries)if(n=K.geometries[j],n.type=="bin_mesh"||n.type=="ascii_mesh")T+=1,i.onLoadStart();V=T;for(j in K.geometries)n=K.geometries[j],n.type=="cube"?(I=new THREE.CubeGeometry(n.width,n.height,n.depth,n.segmentsWidth,n.segmentsHeight,n.segmentsDepth,null,n.flipped,n.sides),M.geometries[j]=I):n.type=="plane"?(I=new THREE.PlaneGeometry(n.width,n.height,n.segmentsWidth,n.segmentsHeight),M.geometries[j]=I):n.type=="sphere"? -(I=new THREE.SphereGeometry(n.radius,n.segmentsWidth,n.segmentsHeight),M.geometries[j]=I):n.type=="cylinder"?(I=new THREE.CylinderGeometry(n.topRad,n.botRad,n.height,n.radSegs,n.heightSegs),M.geometries[j]=I):n.type=="torus"?(I=new THREE.TorusGeometry(n.radius,n.tube,n.segmentsR,n.segmentsT),M.geometries[j]=I):n.type=="icosahedron"?(I=new THREE.IcosahedronGeometry(n.subdivisions),M.geometries[j]=I):n.type=="bin_mesh"?c.load(d(n.url,K.urlBaseType),f(j)):n.type=="ascii_mesh"?X.load(d(n.url,K.urlBaseType), -f(j)):n.type=="embedded_mesh"&&(n=K.embeds[n.id])&&X.createModel(n,g(j),"");for(s in K.textures)if(j=K.textures[s],j.url instanceof Array){$+=j.url.length;for(n=0;n1&&($=new THREE.MeshFaceMaterial); +a=new THREE.Mesh(G,$);a.name=p;a.position.set(z[0],z[1],z[2]);E?(a.quaternion.set(E[0],E[1],E[2],E[3]),a.useQuaternion=!0):a.rotation.set(A[0],A[1],A[2]);a.scale.set(D[0],D[1],D[2]);a.visible=r.visible;v.scene.add(a);v.objects[p]=a;if(r.meshCollider){var b=THREE.CollisionUtils.MeshColliderWBox(a);v.scene.collisions.colliders.push(b)}if(r.castsShadow)b=new THREE.ShadowVolume(G),v.scene.add(b),b.position=a.position,b.rotation=a.rotation,b.scale=a.scale;r.trigger&&r.trigger.toLowerCase()!="none"&&(b= +{type:r.trigger,object:r},v.triggers[a.name]=b)}}else z=r.position,A=r.rotation,E=r.quaternion,D=r.scale,E=0,a=new THREE.Object3D,a.name=p,a.position.set(z[0],z[1],z[2]),E?(a.quaternion.set(E[0],E[1],E[2],E[3]),a.useQuaternion=!0):a.rotation.set(A[0],A[1],A[2]),a.scale.set(D[0],D[1],D[2]),a.visible=r.visible!==void 0?r.visible:!1,v.scene.add(a),v.objects[p]=a,v.empties[p]=a,r.trigger&&r.trigger.toLowerCase()!="none"&&(b={type:r.trigger,object:r},v.triggers[a.name]=b)}function f(a){return function(b){v.geometries[a]= +b;e();S-=1;i.onLoadComplete();h()}}function g(a){return function(b){v.geometries[a]=b}}function h(){i.callbackProgress({totalModels:l,totalTextures:V,loadedModels:l-S,loadedTextures:V-R},v);i.onLoadProgress();S==0&&R==0&&b(v)}var i=this,k=THREE.Loader.prototype.extractUrlbase(c),j,o,p,m,q,n,s,r,u,t,z,A,E,D,B,w,G,y,K,$,Q,X,S,R,l,V,v;Q=a;c=new THREE.BinaryLoader;X=new THREE.JSONLoader;R=S=0;v={scene:new THREE.Scene,geometries:{},materials:{},textures:{},objects:{},cameras:{},lights:{},fogs:{},triggers:{}, +empties:{}};a=!1;for(p in Q.objects)if(r=Q.objects[p],r.meshCollider){a=!0;break}if(a)v.scene.collisions=new THREE.CollisionSystem;if(Q.transform)a=Q.transform.position,u=Q.transform.rotation,B=Q.transform.scale,a&&v.scene.position.set(a[0],a[1],a[2]),u&&v.scene.rotation.set(u[0],u[1],u[2]),B&&v.scene.scale.set(B[0],B[1],B[2]),(a||u||B)&&v.scene.updateMatrix();a=function(){R-=1;h();i.onLoadComplete()};for(q in Q.cameras)B=Q.cameras[q],B.type=="perspective"?y=new THREE.PerspectiveCamera(B.fov,B.aspect, +B.near,B.far):B.type=="ortho"&&(y=new THREE.OrthographicCamera(B.left,B.right,B.top,B.bottom,B.near,B.far)),z=B.position,u=B.target,B=B.up,y.position.set(z[0],z[1],z[2]),y.target=new THREE.Vector3(u[0],u[1],u[2]),B&&y.up.set(B[0],B[1],B[2]),v.cameras[q]=y;for(m in Q.lights)u=Q.lights[m],q=u.color!==void 0?u.color:16777215,y=u.intensity!==void 0?u.intensity:1,u.type=="directional"?(z=u.direction,t=new THREE.DirectionalLight(q,y),t.position.set(z[0],z[1],z[2]),t.position.normalize()):u.type=="point"? +(z=u.position,t=u.distance,t=new THREE.PointLight(q,y,t),t.position.set(z[0],z[1],z[2])):u.type=="ambient"&&(t=new THREE.AmbientLight(q)),v.scene.add(t),v.lights[m]=t;for(n in Q.fogs)m=Q.fogs[n],m.type=="linear"?K=new THREE.Fog(0,m.near,m.far):m.type=="exp2"&&(K=new THREE.FogExp2(0,m.density)),B=m.color,K.color.setRGB(B[0],B[1],B[2]),v.fogs[n]=K;if(v.cameras&&Q.defaults.camera)v.currentCamera=v.cameras[Q.defaults.camera];if(v.fogs&&Q.defaults.fog)v.scene.fog=v.fogs[Q.defaults.fog];B=Q.defaults.bgcolor; +v.bgColor=new THREE.Color;v.bgColor.setRGB(B[0],B[1],B[2]);v.bgColorAlpha=Q.defaults.bgalpha;for(j in Q.geometries)if(n=Q.geometries[j],n.type=="bin_mesh"||n.type=="ascii_mesh")S+=1,i.onLoadStart();l=S;for(j in Q.geometries)n=Q.geometries[j],n.type=="cube"?(G=new THREE.CubeGeometry(n.width,n.height,n.depth,n.segmentsWidth,n.segmentsHeight,n.segmentsDepth,null,n.flipped,n.sides),v.geometries[j]=G):n.type=="plane"?(G=new THREE.PlaneGeometry(n.width,n.height,n.segmentsWidth,n.segmentsHeight),v.geometries[j]= +G):n.type=="sphere"?(G=new THREE.SphereGeometry(n.radius,n.segmentsWidth,n.segmentsHeight),v.geometries[j]=G):n.type=="cylinder"?(G=new THREE.CylinderGeometry(n.topRad,n.botRad,n.height,n.radSegs,n.heightSegs),v.geometries[j]=G):n.type=="torus"?(G=new THREE.TorusGeometry(n.radius,n.tube,n.segmentsR,n.segmentsT),v.geometries[j]=G):n.type=="icosahedron"?(G=new THREE.IcosahedronGeometry(n.subdivisions),v.geometries[j]=G):n.type=="bin_mesh"?c.load(d(n.url,Q.urlBaseType),f(j)):n.type=="ascii_mesh"?X.load(d(n.url, +Q.urlBaseType),f(j)):n.type=="embedded_mesh"&&(n=Q.embeds[n.id])&&X.createModel(n,g(j),"");for(s in Q.textures)if(j=Q.textures[s],j.url instanceof Array){R+=j.url.length;for(n=0;n=57344&&(b-=2048);b++;for(var c=new Float32Array(8*b),d=1,e=0;e<8;e++){for(var f=0,g=0;g>1^-(h&1);c[8*g+e]=f}d+=b}b=a.length-d;f=new Uint16Array(b);for(e=g=0;e=this.maxCount-3&&h(this)};this.begin=function(){this.count=0; this.hasNormal=this.hasPos=!1};this.end=function(a){if(this.count!==0){for(var b=this.count*3;bthis.size-1&&(i=this.size-1);var p=Math.floor(k-h);p<1&&(p=1);k=Math.floor(k+h);k>this.size-1&&(k=this.size-1);var m=Math.floor(j-h);m<1&&(m=1);h=Math.floor(j+h);h>this.size-1&&(h=this.size- -1);for(var q,n,s,r,t,u;o0&&(this.field[s+q]+=r)}}};this.addPlaneX=function(a,b){var e,f,g,h,i,k=this.size,j=this.yd,o=this.zd,p=this.field,m=k*Math.sqrt(a/b);m>k&&(m=k);for(e=0;e0)for(f=0;f0&&(this.field[s+q]+=r)}}};this.addPlaneX=function(a,b){var e,f,g,h,i,k=this.size,j=this.yd,o=this.zd,p=this.field,m=k*Math.sqrt(a/b);m>k&&(m=k);for(e=0;e0)for(f=0;fj&&(q=j);for(f=0;f0){i=f*o;for(e=0;ej&&(q=j);for(g=0;g0){i=p*g;for(f=0;f0&&s.x0&&s.y0.001&&w.scale>0.001)n.x=w.x,n.y=w.y,n.z=w.z,m=w.size*w.scale/ -h,q.x=m*j,q.y=m,b.uniform3f(r.screenPosition,n.x,n.y,n.z),b.uniform2f(r.scale,q.x,q.y),b.uniform1f(r.rotation,w.rotation),b.uniform1f(r.opacity,w.opacity),b.uniform3f(r.color,w.color.r,w.color.g,w.color.b),c.setBlending(w.blending),c.setTexture(w.texture,1),b.drawElements(b.TRIANGLES,6,b.UNSIGNED_SHORT,0)}b.enable(b.CULL_FACE);b.enable(b.DEPTH_TEST);b.depthMask(!0)}}}; +b.copyTexImage2D(b.TEXTURE_2D,0,b.RGBA,s.x-8,s.y-8,16,16,0);b.uniform1i(r.renderType,1);b.disable(b.DEPTH_TEST);b.activeTexture(b.TEXTURE1);b.bindTexture(b.TEXTURE_2D,d.tempTexture);b.drawElements(b.TRIANGLES,6,b.UNSIGNED_SHORT,0);A.positionScreen.copy(n);A.customUpdateCallback?A.customUpdateCallback(A):A.updateLensFlares();b.uniform1i(r.renderType,2);b.enable(b.BLEND);t=0;for(z=A.lensFlares.length;t0.0010&&E.scale>0.0010)n.x=E.x,n.y=E.y,n.z=E.z,m=E.size*E.scale/ +h,q.x=m*j,q.y=m,b.uniform3f(r.screenPosition,n.x,n.y,n.z),b.uniform2f(r.scale,q.x,q.y),b.uniform1f(r.rotation,E.rotation),b.uniform1f(r.opacity,E.opacity),b.uniform3f(r.color,E.color.r,E.color.g,E.color.b),c.setBlending(E.blending),c.setTexture(E.texture,1),b.drawElements(b.TRIANGLES,6,b.UNSIGNED_SHORT,0)}b.enable(b.CULL_FACE);b.enable(b.DEPTH_TEST);b.depthMask(!0)}}}; THREE.ShadowMapPlugin=function(){var a,b,c,d,e,f=new THREE.Frustum,g=new THREE.Matrix4;this.shadowMatrix=[];this.shadowMap=[];this.init=function(e){a=e.context;b=e;var e=THREE.ShaderLib.depthRGBA,f=THREE.UniformsUtils.clone(e.uniforms);c=new THREE.ShaderMaterial({fragmentShader:e.fragmentShader,vertexShader:e.vertexShader,uniforms:f});d=new THREE.ShaderMaterial({fragmentShader:e.fragmentShader,vertexShader:e.vertexShader,uniforms:f,morphTargets:!0});c._shadowPass=!0;d._shadowPass=!0};this.render= function(a,c){b.shadowMapEnabled&&b.shadowMapAutoUpdate&&this.update(a,c)};this.update=function(h){var i,k,j,o,p,m,q,n,s=0,r=h.lights;e||(e=new THREE.PerspectiveCamera(b.shadowCameraFov,b.shadowMapWidth/b.shadowMapHeight,b.shadowCameraNear,b.shadowCameraFar));i=0;for(k=r.length;i=1)return c.w=a.w,c.x=a.x,c.y=a.y,c.z=a.z,c;var f=Math.acos(e),e=Math.sqrt(1-e*e);if(Math.abs(e)<0.001)return c.w=0.5*(a.w+b.w),c.x=0.5*(a.x+b.x),c.y=0.5*(a.y+b.y),c.z=0.5*(a.z+b.z),c;b=Math.sin((1-d)*f)/e;d=Math.sin(d*f)/e;c.w=a.w*b+c.w*d;c.x=a.x*b+c.x*d;c.y=a.y*b+c.y*d;c.z=a.z*b+c.z*d;return c};THREE.Vertex=function(a){this.position=a||new THREE.Vector3}; +THREE.Quaternion.slerp=function(a,b,c,d){var e=a.w*b.w+a.x*b.x+a.y*b.y+a.z*b.z;e<0?(c.w=-b.w,c.x=-b.x,c.y=-b.y,c.z=-b.z,e=-e):c.copy(b);if(Math.abs(e)>=1)return c.w=a.w,c.x=a.x,c.y=a.y,c.z=a.z,c;var f=Math.acos(e),e=Math.sqrt(1-e*e);if(Math.abs(e)<0.0010)return c.w=0.5*(a.w+b.w),c.x=0.5*(a.x+b.x),c.y=0.5*(a.y+b.y),c.z=0.5*(a.z+b.z),c;b=Math.sin((1-d)*f)/e;d=Math.sin(d*f)/e;c.w=a.w*b+c.w*d;c.x=a.x*b+c.x*d;c.y=a.y*b+c.y*d;c.z=a.z*b+c.z*d;return c};THREE.Vertex=function(a){this.position=a||new THREE.Vector3}; THREE.Face3=function(a,b,c,d,e,f){this.a=a;this.b=b;this.c=c;this.normal=d instanceof THREE.Vector3?d:new THREE.Vector3;this.vertexNormals=d instanceof Array?d:[];this.color=e instanceof THREE.Color?e:new THREE.Color;this.vertexColors=e instanceof Array?e:[];this.vertexTangents=[];this.materialIndex=f;this.centroid=new THREE.Vector3}; THREE.Face4=function(a,b,c,d,e,f,g){this.a=a;this.b=b;this.c=c;this.d=d;this.normal=e instanceof THREE.Vector3?e:new THREE.Vector3;this.vertexNormals=e instanceof Array?e:[];this.color=f instanceof THREE.Color?f:new THREE.Color;this.vertexColors=f instanceof Array?f:[];this.vertexTangents=[];this.materialIndex=g;this.centroid=new THREE.Vector3};THREE.UV=function(a,b){this.u=a||0;this.v=b||0}; THREE.UV.prototype={constructor:THREE.UV,set:function(a,b){this.u=a;this.v=b;return this},copy:function(a){this.u=a.u;this.v=a.v;return this},clone:function(){return new THREE.UV(this.u,this.v)}}; diff --git a/build/custom/ThreeDOM.js b/build/custom/ThreeDOM.js index e45666b681..27d9677f75 100644 --- a/build/custom/ThreeDOM.js +++ b/build/custom/ThreeDOM.js @@ -76,7 +76,7 @@ this.x=a.x*d;this.y=a.y*d;this.z=a.z*d;this.w=Math.cos(c);return this},setFromRo this.normalize();return this},calculateW:function(){this.w=-Math.sqrt(Math.abs(1-this.x*this.x-this.y*this.y-this.z*this.z));return this},inverse:function(){this.x*=-1;this.y*=-1;this.z*=-1;return this},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w)},normalize:function(){var a=Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w);a===0?this.w=this.z=this.y=this.x=0:(a=1/a,this.x*=a,this.y*=a,this.z*=a,this.w*=a);return this},multiplySelf:function(a){var b= this.x,c=this.y,d=this.z,e=this.w,f=a.x,g=a.y,h=a.z,a=a.w;this.x=b*a+e*f+c*h-d*g;this.y=c*a+e*g+d*f-b*h;this.z=d*a+e*h+b*g-c*f;this.w=e*a-b*f-c*g-d*h;return this},multiply:function(a,b){this.x=a.x*b.w+a.y*b.z-a.z*b.y+a.w*b.x;this.y=-a.x*b.z+a.y*b.w+a.z*b.x+a.w*b.y;this.z=a.x*b.y-a.y*b.x+a.z*b.w+a.w*b.z;this.w=-a.x*b.x-a.y*b.y-a.z*b.z+a.w*b.w;return this},multiplyVector3:function(a,b){b||(b=a);var c=a.x,d=a.y,e=a.z,f=this.x,g=this.y,h=this.z,l=this.w,i=l*c+g*e-h*d,j=l*d+h*c-f*e,k=l*e+f*d-g*c,c=-f* c-g*d-h*e;b.x=i*l+c*-f+j*-h-k*-g;b.y=j*l+c*-g+k*-f-i*-h;b.z=k*l+c*-h+i*-g-j*-f;return b}}; -THREE.Quaternion.slerp=function(a,b,c,d){var e=a.w*b.w+a.x*b.x+a.y*b.y+a.z*b.z;e<0?(c.w=-b.w,c.x=-b.x,c.y=-b.y,c.z=-b.z,e=-e):c.copy(b);if(Math.abs(e)>=1)return c.w=a.w,c.x=a.x,c.y=a.y,c.z=a.z,c;var f=Math.acos(e),e=Math.sqrt(1-e*e);if(Math.abs(e)<0.001)return c.w=0.5*(a.w+b.w),c.x=0.5*(a.x+b.x),c.y=0.5*(a.y+b.y),c.z=0.5*(a.z+b.z),c;b=Math.sin((1-d)*f)/e;d=Math.sin(d*f)/e;c.w=a.w*b+c.w*d;c.x=a.x*b+c.x*d;c.y=a.y*b+c.y*d;c.z=a.z*b+c.z*d;return c};THREE.Vertex=function(a){this.position=a||new THREE.Vector3}; +THREE.Quaternion.slerp=function(a,b,c,d){var e=a.w*b.w+a.x*b.x+a.y*b.y+a.z*b.z;e<0?(c.w=-b.w,c.x=-b.x,c.y=-b.y,c.z=-b.z,e=-e):c.copy(b);if(Math.abs(e)>=1)return c.w=a.w,c.x=a.x,c.y=a.y,c.z=a.z,c;var f=Math.acos(e),e=Math.sqrt(1-e*e);if(Math.abs(e)<0.0010)return c.w=0.5*(a.w+b.w),c.x=0.5*(a.x+b.x),c.y=0.5*(a.y+b.y),c.z=0.5*(a.z+b.z),c;b=Math.sin((1-d)*f)/e;d=Math.sin(d*f)/e;c.w=a.w*b+c.w*d;c.x=a.x*b+c.x*d;c.y=a.y*b+c.y*d;c.z=a.z*b+c.z*d;return c};THREE.Vertex=function(a){this.position=a||new THREE.Vector3}; THREE.Face3=function(a,b,c,d,e,f){this.a=a;this.b=b;this.c=c;this.normal=d instanceof THREE.Vector3?d:new THREE.Vector3;this.vertexNormals=d instanceof Array?d:[];this.color=e instanceof THREE.Color?e:new THREE.Color;this.vertexColors=e instanceof Array?e:[];this.vertexTangents=[];this.materialIndex=f;this.centroid=new THREE.Vector3}; THREE.Face4=function(a,b,c,d,e,f,g){this.a=a;this.b=b;this.c=c;this.d=d;this.normal=e instanceof THREE.Vector3?e:new THREE.Vector3;this.vertexNormals=e instanceof Array?e:[];this.color=f instanceof THREE.Color?f:new THREE.Color;this.vertexColors=f instanceof Array?f:[];this.vertexTangents=[];this.materialIndex=g;this.centroid=new THREE.Vector3};THREE.UV=function(a,b){this.u=a||0;this.v=b||0}; THREE.UV.prototype={constructor:THREE.UV,set:function(a,b){this.u=a;this.v=b;return this},copy:function(a){this.u=a.u;this.v=a.v;return this},clone:function(){return new THREE.UV(this.u,this.v)}}; diff --git a/build/custom/ThreeExtras.js b/build/custom/ThreeExtras.js index b31898441c..c9dcb92675 100644 --- a/build/custom/ThreeExtras.js +++ b/build/custom/ThreeExtras.js @@ -7,9 +7,10 @@ n=h.id;t=p[n];if(t===void 0)t=a.materials.length,p[n]=t,a.materials.push(h);r.ma 0;for(c=e.length;a1&&(d=1-d,e=1-e);g=1-d-e;f.copy(a);f.multiplyScalar(d);h.copy(b);h.multiplyScalar(e);f.addSelf(h);h.copy(c);h.multiplyScalar(g);f.addSelf(h);return f},randomPointInFace:function(a,b,c){var d,e,g;if(a instanceof THREE.Face3)return d=b.vertices[a.a].position,e=b.vertices[a.b].position, g=b.vertices[a.c].position,THREE.GeometryUtils.randomPointInTriangle(d,e,g);else if(a instanceof THREE.Face4){d=b.vertices[a.a].position;e=b.vertices[a.b].position;g=b.vertices[a.c].position;var b=b.vertices[a.d].position,f;c?a._area1&&a._area2?(c=a._area1,f=a._area2):(c=THREE.GeometryUtils.triangleArea(d,e,b),f=THREE.GeometryUtils.triangleArea(e,g,b),a._area1=c,a._area2=f):(c=THREE.GeometryUtils.triangleArea(d,e,b),f=THREE.GeometryUtils.triangleArea(e,g,b));return THREE.GeometryUtils.random()*(c+ -f)a?b(c,e-1):k[e]a?b(d,e-1):k[e]a.length-2?g:g+1;c[3]=g>a.length-3?g:g+2;g=a[c[0]];h=a[c[1]];i=a[c[2]];k=a[c[3]];c=e*e;f=e*c;d[0]=this.interpolate(g[0],h[0],i[0],k[0],e,c,f);d[1]=this.interpolate(g[1],h[1],i[1],k[1],e,c,f);d[2]=this.interpolate(g[2],h[2],i[2],k[2],e,c,f);return d}; THREE.Animation.prototype.interpolate=function(a,b,c,d,e,g,f){a=(c-a)*0.5;d=(d-b)*0.5;return(2*(b-c)+a+d)*f+(-3*(b-c)-2*a-d)*g+a*e+b};THREE.Animation.prototype.getNextKeyWith=function(a,b,c){var d=this.data.hierarchy[b].keys;for(this.interpolationType===THREE.AnimationHandler.CATMULLROM||this.interpolationType===THREE.AnimationHandler.CATMULLROM_FORWARD?c=c0?c:0:c>=0?c:c+d.length;c>=0;c--)if(d[c][a]!==void 0)return d[c];return this.data.hierarchy[b].keys[d.length-1]}; -THREE.KeyFrameAnimation=function(a,b,c){this.root=a;this.data=THREE.AnimationHandler.get(b);this.hierarchy=THREE.AnimationHandler.parse(a);this.currentTime=0;this.timeScale=0.001;this.isPlaying=!1;this.loop=this.isPaused=!0;this.JITCompile=c!==void 0?c:!0;a=0;for(b=this.hierarchy.length;a=0?a:a+f;b=this.verticalAngleMap.srcRange; a=this.verticalAngleMap.dstRange;b=THREE.Math.mapLinear(this.phi,b[0],b[1],a[0],a[1]);var d=a[1]-a[0];this.phi=c((b-a[0])/d)*d+a[0];b=this.horizontalAngleMap.srcRange;a=this.horizontalAngleMap.dstRange;b=THREE.Math.mapLinear(this.theta,b[0],b[1],a[0],a[1]);d=a[1]-a[0];this.theta=c((b-a[0])/d)*d+a[0];a=this.target.position;a.x=100*Math.sin(this.phi)*Math.cos(this.theta);a.y=100*Math.cos(this.phi);a.z=100*Math.sin(this.phi)*Math.sin(this.theta);this.object.lookAt(this.target.position)};this.onMouseMove= function(a){this.domElement===document?(this.mouseX=a.pageX-this.viewHalfX,this.mouseY=a.pageY-this.viewHalfY):(this.mouseX=a.pageX-this.domElement.offsetLeft-this.viewHalfX,this.mouseY=a.pageY-this.domElement.offsetTop-this.viewHalfY)};this.init=function(){this.spline=new THREE.Spline;this.spline.initFromArray(this.waypoints);this.useConstantSpeed&&this.spline.reparametrizeByArcLength(this.resamplingCoef);if(this.createDebugDummy){var a=new THREE.MeshLambertMaterial({color:30719}),b=new THREE.MeshLambertMaterial({color:65280}), c=new THREE.CubeGeometry(10,10,20),f=new THREE.CubeGeometry(2,2,10);this.animationParent=new THREE.Mesh(c,a);a=new THREE.Mesh(f,b);a.position.set(0,10,0);this.animation=e(this.animationParent,this.spline,this.id,this.duration);this.animationParent.add(this.object);this.animationParent.add(this.target);this.animationParent.add(a)}else this.animation=e(this.animationParent,this.spline,this.id,this.duration),this.animationParent.add(this.target),this.animationParent.add(this.object);if(this.createDebugPath){var a= this.debugPath,b=this.spline,f=g(b,10),c=g(b,10),h=new THREE.LineBasicMaterial({color:16711680,linewidth:3}),f=new THREE.Line(f,h),c=new THREE.ParticleSystem(c,new THREE.ParticleBasicMaterial({color:16755200,size:3}));f.scale.set(1,1,1);a.add(f);c.scale.set(1,1,1);a.add(c);for(var f=new THREE.SphereGeometry(1,16,8),h=new THREE.MeshBasicMaterial({color:65280}),m=0;m0?1:-1;for(h=0;h0?1:-1;for(h=0;h0){this.vertices.push(new THREE.Vertex(new THREE.Vector3(0,f,0)));for(h=0;h0){this.vertices.push(new THREE.Vertex(new THREE.Vector3(0,f,0)));for(h=0;h0){this.vertices.push(new THREE.Vertex(new THREE.Vector3(0,-f,0)));for(h=0;ha&&(a+=Math.PI*2),a=(b+a)/2,new THREE.Vector2(-Math.cos(a),-Math.sin(a));return d.multiplyScalar(f).addSelf(h).subSelf(a).clone()}function e(a){for(v=a.length;--v>=0;){K=v;I=v-1;I<0&&(I=a.length-1);for(var b= -0,c=m+j*2,b=0;b=0;B--){G=B/j;J=i*(1-G);G=k*Math.sin(G*Math.PI/2);v=0;for(D=s.length;va&&(a+=Math.PI*2),a=(b+a)/2,new THREE.Vector2(-Math.cos(a),-Math.sin(a));return d.multiplyScalar(f).addSelf(h).subSelf(a).clone()}function e(a){for(v=a.length;--v>=0;){L=v;I=v-1;I<0&&(I=a.length-1);for(var b= +0,c=m+j*2,b=0;b=0;F--){C=F/j;K=i*(1-C);C=k*Math.sin(C*Math.PI/2);v=0;for(E=s.length;v0)for(k=0;k2;){if(q--<=0){console.log("Warning, unable to triangulate polygon!");if(d)return h;return g}i=k;e<=i&&(i=0);k=i+1;e<=k&&(k=0);j=k+1;e<=j&&(j=0);var p;a:{p=a;var m=i,l=k,n=j,r=e,o=f,s=void 0,t=void 0,w=void 0, -y=void 0,u=void 0,x=void 0,z=void 0,A=void 0,F=void 0,t=p[o[m]].x,w=p[o[m]].y,y=p[o[l]].x,u=p[o[l]].y,x=p[o[n]].x,z=p[o[n]].y;if(1.0E-10>(y-t)*(z-w)-(u-w)*(x-t))p=!1;else{for(s=0;s=0&&B>=0&&J>=0){p=!1;break a}}p=!0}}if(p){g.push([a[f[i]], +z=void 0,u=void 0,y=void 0,x=void 0,A=void 0,D=void 0,t=p[o[m]].x,w=p[o[m]].y,z=p[o[l]].x,u=p[o[l]].y,y=p[o[n]].x,x=p[o[n]].y;if(1.0E-10>(z-t)*(x-w)-(u-w)*(y-t))p=!1;else{for(s=0;s=0&&F>=0&&K>=0){p=!1;break a}}p=!0}}if(p){g.push([a[f[i]], a[f[k]],a[f[j]]]);h.push([f[i],f[k],f[j]]);i=k;for(j=k+1;j0;)this.smooth(a)}; THREE.SubdivisionModifier.prototype.smooth=function(a){function b(a,b,c,d,h,i){var j=new THREE.Face4(a,b,c,d,null,h.color,h.material);if(f.useOldVertexColors){j.vertexColors=[];for(var k,n,l,m=0;m<4;m++){l=i[m];k=new THREE.Color;k.setRGB(0,0,0);for(var o=0;o=0){o=k.invBindMatrices[l];m.invBindMatrix=o;m.skinningMatrix=new THREE.Matrix4;m.skinningMatrix.multiply(m.world,o);m.weights=[];for(o=0;o1){j=new THREE.MeshFaceMaterial;i.materials=l;for(h=0;h1?b.add(j):b=j}}b.name=a.id||"";b.matrix=a.matrix;c=a.matrix.decompose();b.position=c[0];b.quaternion=c[1];b.useQuaternion=!0;b.scale=c[2];for(f=0;f=0,g=e.indexOf("(")>=0,h;if(f)d=e.split("."),e=d.shift(),d.shift();else if(g){h=e.split("(");e=h.shift(); for(d=0;dl)break}if(!r){r= new O(l);s=-1;t=0;for(u=d.length;t=l&&(s=t);l=s;d.splice(l==-1?d.length:l,0,r)}r.addTarget(f,j,g,o)}}else console.log('Could not find transform "'+b.sid+'" in node '+this.id)}for(c=0;c=0?i:i+h.length;i>=0;i--)if(k=h[i],k.hasTarget(g)){i=k;break a}i=null}k=void 0;a:{for(j+=1;j4&&Q.subdivideFaces){q=q.length?q:new THREE.Color;for(e=1;e4?[q[0],q[n+1],q[n+2]]:l===4?[q[0],q[1],q[2],q[3]]:[q[0],q[1],q[2]],b.faceVertexUvs[e]||(b.faceVertexUvs[e]= -[]),b.faceVertexUvs[e].push(q)}}else console.log("dropped face with vcount "+l+" for geometry with id: "+b.id);c+=g.length*l}};s.prototype=new t;s.prototype.constructor=s;t.prototype.setVertices=function(a){for(var b=0;b0&&(this[c.nodeName]=parseFloat(d[0].textContent))}}this.create();return this};F.prototype.create=function(){var a={},b=this.transparency!==void 0&&this.transparency<1,c;for(c in this)switch(c){case "ambient":case "emission":case "diffuse":case "specular":var d=this[c];if(d instanceof A)if(d.isTexture()){if(this.effect.sampler&&this.effect.surface&&this.effect.sampler.source== +parseFloat(c.textContent);break;case "wrapU":case "wrapV":this.texOpts[c.nodeName]=parseInt(c.textContent);break;default:this.texOpts[c.nodeName]=c.textContent}}return this};D.prototype.parse=function(a){for(var b=0;b0&&(this[c.nodeName]=parseFloat(d[0].textContent))}}this.create();return this};D.prototype.create=function(){var a={},b=this.transparency!==void 0&&this.transparency<1,c;for(c in this)switch(c){case "ambient":case "emission":case "diffuse":case "specular":var d=this[c];if(d instanceof A)if(d.isTexture()){if(this.effect.sampler&&this.effect.surface&&this.effect.sampler.source== this.effect.surface.sid){var e=ca[this.effect.surface.init_from];if(e)e=THREE.ImageUtils.loadTexture(ja+e.init_from),e.wrapS=d.texOpts.wrapU?THREE.RepeatWrapping:THREE.ClampToEdgeWrapping,e.wrapT=d.texOpts.wrapV?THREE.RepeatWrapping:THREE.ClampToEdgeWrapping,e.offset.x=d.texOpts.offsetU,e.offset.y=d.texOpts.offsetV,e.repeat.x=d.texOpts.repeatU,e.repeat.y=d.texOpts.repeatV,a.map=e}}else c=="diffuse"?a.color=d.color.getHex():b||(a[c]=d.color.getHex());break;case "shininess":case "reflectivity":a[c]= -this[c];break;case "transparency":if(b)a.transparent=!0,a.opacity=this[c],b=!0}a.shading=ka;return this.material=new THREE.MeshLambertMaterial(a)};v.prototype.parse=function(a){for(var b=0;b=0,d=a.indexOf("(")>=0;if(c)b=a.split("."),this.sid=b.shift(),this.member=b.shift();else if(d){b=a.split("(");this.sid=b.shift();for(var e=0;e=0,d=a.indexOf("(")>=0;if(c)b=a.split("."),this.sid=b.shift(),this.member=b.shift();else if(d){b=a.split("(");this.sid=b.shift();for(var e=0;e1){c=[];b*=this.strideOut;for(var d=0;d1){c=[];b*=this.strideOut;for(var d=0;d1)console.log("Key.interpolate: Warning! Scale out of bounds:"+ f),f=f<0?0:1;if(h.length)for(var e=[],i=0;i1&&(D=new THREE.MeshFaceMaterial); -a=new THREE.Mesh(A,D);a.name=p;a.position.set(w[0],w[1],w[2]);u?(a.quaternion.set(u[0],u[1],u[2],u[3]),a.useQuaternion=!0):a.rotation.set(y[0],y[1],y[2]);a.scale.set(x[0],x[1],x[2]);a.visible=o.visible;C.scene.add(a);C.objects[p]=a;if(o.meshCollider){var b=THREE.CollisionUtils.MeshColliderWBox(a);C.scene.collisions.colliders.push(b)}if(o.castsShadow)b=new THREE.ShadowVolume(A),C.scene.add(b),b.position=a.position,b.rotation=a.rotation,b.scale=a.scale;o.trigger&&o.trigger.toLowerCase()!="none"&&(b= -{type:o.trigger,object:o},C.triggers[a.name]=b)}}else w=o.position,y=o.rotation,u=o.quaternion,x=o.scale,u=0,a=new THREE.Object3D,a.name=p,a.position.set(w[0],w[1],w[2]),u?(a.quaternion.set(u[0],u[1],u[2],u[3]),a.useQuaternion=!0):a.rotation.set(y[0],y[1],y[2]),a.scale.set(x[0],x[1],x[2]),a.visible=o.visible!==void 0?o.visible:!1,C.scene.add(a),C.objects[p]=a,C.empties[p]=a,o.trigger&&o.trigger.toLowerCase()!="none"&&(b={type:o.trigger,object:o},C.triggers[a.name]=b)}function g(a){return function(b){C.geometries[a]= -b;e();J-=1;i.onLoadComplete();h()}}function f(a){return function(b){C.geometries[a]=b}}function h(){i.callbackProgress({totalModels:L,totalTextures:O,loadedModels:L-J,loadedTextures:O-E},C);i.onLoadProgress();J==0&&E==0&&b(C)}var i=this,k=THREE.Loader.prototype.extractUrlbase(c),j,q,p,m,l,n,r,o,s,t,w,y,u,x,z,A,F,v,D,B,G,J,E,L,O,C;B=a;c=new THREE.BinaryLoader;G=new THREE.JSONLoader;E=J=0;C={scene:new THREE.Scene,geometries:{},materials:{},textures:{},objects:{},cameras:{},lights:{},fogs:{},triggers:{}, -empties:{}};a=!1;for(p in B.objects)if(o=B.objects[p],o.meshCollider){a=!0;break}if(a)C.scene.collisions=new THREE.CollisionSystem;if(B.transform){a=B.transform.position;s=B.transform.rotation;var M=B.transform.scale;a&&C.scene.position.set(a[0],a[1],a[2]);s&&C.scene.rotation.set(s[0],s[1],s[2]);M&&C.scene.scale.set(M[0],M[1],M[2]);(a||s||M)&&C.scene.updateMatrix()}a=function(){E-=1;h();i.onLoadComplete()};for(l in B.cameras)s=B.cameras[l],s.type=="perspective"?F=new THREE.PerspectiveCamera(s.fov, -s.aspect,s.near,s.far):s.type=="ortho"&&(F=new THREE.OrthographicCamera(s.left,s.right,s.top,s.bottom,s.near,s.far)),w=s.position,s=s.target,F.position.set(w[0],w[1],w[2]),F.target=new THREE.Vector3(s[0],s[1],s[2]),C.cameras[l]=F;for(m in B.lights)s=B.lights[m],l=s.color!==void 0?s.color:16777215,F=s.intensity!==void 0?s.intensity:1,s.type=="directional"?(w=s.direction,t=new THREE.DirectionalLight(l,F),t.position.set(w[0],w[1],w[2]),t.position.normalize()):s.type=="point"?(w=s.position,t=s.distance, -t=new THREE.PointLight(l,F,t),t.position.set(w[0],w[1],w[2])):s.type=="ambient"&&(t=new THREE.AmbientLight(l)),C.scene.add(t),C.lights[m]=t;for(n in B.fogs)m=B.fogs[n],m.type=="linear"?v=new THREE.Fog(0,m.near,m.far):m.type=="exp2"&&(v=new THREE.FogExp2(0,m.density)),s=m.color,v.color.setRGB(s[0],s[1],s[2]),C.fogs[n]=v;if(C.cameras&&B.defaults.camera)C.currentCamera=C.cameras[B.defaults.camera];if(C.fogs&&B.defaults.fog)C.scene.fog=C.fogs[B.defaults.fog];s=B.defaults.bgcolor;C.bgColor=new THREE.Color; -C.bgColor.setRGB(s[0],s[1],s[2]);C.bgColorAlpha=B.defaults.bgalpha;for(j in B.geometries)if(n=B.geometries[j],n.type=="bin_mesh"||n.type=="ascii_mesh")J+=1,i.onLoadStart();L=J;for(j in B.geometries)n=B.geometries[j],n.type=="cube"?(A=new THREE.CubeGeometry(n.width,n.height,n.depth,n.segmentsWidth,n.segmentsHeight,n.segmentsDepth,null,n.flipped,n.sides),C.geometries[j]=A):n.type=="plane"?(A=new THREE.PlaneGeometry(n.width,n.height,n.segmentsWidth,n.segmentsHeight),C.geometries[j]=A):n.type=="sphere"? -(A=new THREE.SphereGeometry(n.radius,n.segmentsWidth,n.segmentsHeight),C.geometries[j]=A):n.type=="cylinder"?(A=new THREE.CylinderGeometry(n.topRad,n.botRad,n.height,n.radSegs,n.heightSegs),C.geometries[j]=A):n.type=="torus"?(A=new THREE.TorusGeometry(n.radius,n.tube,n.segmentsR,n.segmentsT),C.geometries[j]=A):n.type=="icosahedron"?(A=new THREE.IcosahedronGeometry(n.subdivisions),C.geometries[j]=A):n.type=="bin_mesh"?c.load(d(n.url,B.urlBaseType),g(j)):n.type=="ascii_mesh"?G.load(d(n.url,B.urlBaseType), -g(j)):n.type=="embedded_mesh"&&(n=B.embeds[n.id])&&G.createModel(n,f(j),"");for(r in B.textures)if(j=B.textures[r],j.url instanceof Array){E+=j.url.length;for(n=0;n1&&(F=new THREE.MeshFaceMaterial); +a=new THREE.Mesh(D,F);a.name=p;a.position.set(w[0],w[1],w[2]);u?(a.quaternion.set(u[0],u[1],u[2],u[3]),a.useQuaternion=!0):a.rotation.set(z[0],z[1],z[2]);a.scale.set(y[0],y[1],y[2]);a.visible=o.visible;B.scene.add(a);B.objects[p]=a;if(o.meshCollider){var b=THREE.CollisionUtils.MeshColliderWBox(a);B.scene.collisions.colliders.push(b)}if(o.castsShadow)b=new THREE.ShadowVolume(D),B.scene.add(b),b.position=a.position,b.rotation=a.rotation,b.scale=a.scale;o.trigger&&o.trigger.toLowerCase()!="none"&&(b= +{type:o.trigger,object:o},B.triggers[a.name]=b)}}else w=o.position,z=o.rotation,u=o.quaternion,y=o.scale,u=0,a=new THREE.Object3D,a.name=p,a.position.set(w[0],w[1],w[2]),u?(a.quaternion.set(u[0],u[1],u[2],u[3]),a.useQuaternion=!0):a.rotation.set(z[0],z[1],z[2]),a.scale.set(y[0],y[1],y[2]),a.visible=o.visible!==void 0?o.visible:!1,B.scene.add(a),B.objects[p]=a,B.empties[p]=a,o.trigger&&o.trigger.toLowerCase()!="none"&&(b={type:o.trigger,object:o},B.triggers[a.name]=b)}function g(a){return function(b){B.geometries[a]= +b;e();G-=1;i.onLoadComplete();h()}}function f(a){return function(b){B.geometries[a]=b}}function h(){i.callbackProgress({totalModels:O,totalTextures:M,loadedModels:O-G,loadedTextures:M-J},B);i.onLoadProgress();G==0&&J==0&&b(B)}var i=this,k=THREE.Loader.prototype.extractUrlbase(c),j,q,p,m,l,n,r,o,s,t,w,z,u,y,x,A,D,v,E,F,C,K,G,J,O,M,B;C=a;c=new THREE.BinaryLoader;K=new THREE.JSONLoader;J=G=0;B={scene:new THREE.Scene,geometries:{},materials:{},textures:{},objects:{},cameras:{},lights:{},fogs:{},triggers:{}, +empties:{}};a=!1;for(p in C.objects)if(o=C.objects[p],o.meshCollider){a=!0;break}if(a)B.scene.collisions=new THREE.CollisionSystem;if(C.transform)a=C.transform.position,s=C.transform.rotation,x=C.transform.scale,a&&B.scene.position.set(a[0],a[1],a[2]),s&&B.scene.rotation.set(s[0],s[1],s[2]),x&&B.scene.scale.set(x[0],x[1],x[2]),(a||s||x)&&B.scene.updateMatrix();a=function(){J-=1;h();i.onLoadComplete()};for(l in C.cameras)x=C.cameras[l],x.type=="perspective"?v=new THREE.PerspectiveCamera(x.fov,x.aspect, +x.near,x.far):x.type=="ortho"&&(v=new THREE.OrthographicCamera(x.left,x.right,x.top,x.bottom,x.near,x.far)),w=x.position,s=x.target,x=x.up,v.position.set(w[0],w[1],w[2]),v.target=new THREE.Vector3(s[0],s[1],s[2]),x&&v.up.set(x[0],x[1],x[2]),B.cameras[l]=v;for(m in C.lights)s=C.lights[m],l=s.color!==void 0?s.color:16777215,v=s.intensity!==void 0?s.intensity:1,s.type=="directional"?(w=s.direction,t=new THREE.DirectionalLight(l,v),t.position.set(w[0],w[1],w[2]),t.position.normalize()):s.type=="point"? +(w=s.position,t=s.distance,t=new THREE.PointLight(l,v,t),t.position.set(w[0],w[1],w[2])):s.type=="ambient"&&(t=new THREE.AmbientLight(l)),B.scene.add(t),B.lights[m]=t;for(n in C.fogs)m=C.fogs[n],m.type=="linear"?E=new THREE.Fog(0,m.near,m.far):m.type=="exp2"&&(E=new THREE.FogExp2(0,m.density)),x=m.color,E.color.setRGB(x[0],x[1],x[2]),B.fogs[n]=E;if(B.cameras&&C.defaults.camera)B.currentCamera=B.cameras[C.defaults.camera];if(B.fogs&&C.defaults.fog)B.scene.fog=B.fogs[C.defaults.fog];x=C.defaults.bgcolor; +B.bgColor=new THREE.Color;B.bgColor.setRGB(x[0],x[1],x[2]);B.bgColorAlpha=C.defaults.bgalpha;for(j in C.geometries)if(n=C.geometries[j],n.type=="bin_mesh"||n.type=="ascii_mesh")G+=1,i.onLoadStart();O=G;for(j in C.geometries)n=C.geometries[j],n.type=="cube"?(D=new THREE.CubeGeometry(n.width,n.height,n.depth,n.segmentsWidth,n.segmentsHeight,n.segmentsDepth,null,n.flipped,n.sides),B.geometries[j]=D):n.type=="plane"?(D=new THREE.PlaneGeometry(n.width,n.height,n.segmentsWidth,n.segmentsHeight),B.geometries[j]= +D):n.type=="sphere"?(D=new THREE.SphereGeometry(n.radius,n.segmentsWidth,n.segmentsHeight),B.geometries[j]=D):n.type=="cylinder"?(D=new THREE.CylinderGeometry(n.topRad,n.botRad,n.height,n.radSegs,n.heightSegs),B.geometries[j]=D):n.type=="torus"?(D=new THREE.TorusGeometry(n.radius,n.tube,n.segmentsR,n.segmentsT),B.geometries[j]=D):n.type=="icosahedron"?(D=new THREE.IcosahedronGeometry(n.subdivisions),B.geometries[j]=D):n.type=="bin_mesh"?c.load(d(n.url,C.urlBaseType),g(j)):n.type=="ascii_mesh"?K.load(d(n.url, +C.urlBaseType),g(j)):n.type=="embedded_mesh"&&(n=C.embeds[n.id])&&K.createModel(n,f(j),"");for(r in C.textures)if(j=C.textures[r],j.url instanceof Array){J+=j.url.length;for(n=0;n=57344&&(b-=2048);b++;for(var c=new Float32Array(8*b),d=1,e=0;e<8;e++){for(var g=0,f=0;f>1^-(h&1);c[8*f+e]=g}d+=b}b=a.length-d;g=new Uint16Array(b);for(e=f=0;e=this.maxCount-3&&h(this)};this.begin=function(){this.count=0; this.hasNormal=this.hasPos=!1};this.end=function(a){if(this.count!==0){for(var b=this.count*3;bthis.size-1&&(i=this.size-1);var p=Math.floor(k-h);p<1&&(p=1);k=Math.floor(k+h);k>this.size-1&&(k=this.size-1);var m=Math.floor(j-h);m<1&&(m=1);h=Math.floor(j+h);h>this.size-1&&(h=this.size- 1);for(var l,n,r,o,s,t;q0&&(this.field[r+l]+=o)}}};this.addPlaneX=function(a,b){var e,g,f,h,i,k=this.size,j=this.yd,q=this.zd,p=this.field,m=k*Math.sqrt(a/b);m>k&&(m=k);for(e=0;e0)for(g=0;g0&&r.x0&&r.y0.001&&u.scale>0.001)n.x=u.x,n.y=u.y,n.z=u.z,m=u.size*u.scale/ +b.copyTexImage2D(b.TEXTURE_2D,0,b.RGBA,r.x-8,r.y-8,16,16,0);b.uniform1i(o.renderType,1);b.disable(b.DEPTH_TEST);b.activeTexture(b.TEXTURE1);b.bindTexture(b.TEXTURE_2D,d.tempTexture);b.drawElements(b.TRIANGLES,6,b.UNSIGNED_SHORT,0);z.positionScreen.copy(n);z.customUpdateCallback?z.customUpdateCallback(z):z.updateLensFlares();b.uniform1i(o.renderType,2);b.enable(b.BLEND);t=0;for(w=z.lensFlares.length;t0.0010&&u.scale>0.0010)n.x=u.x,n.y=u.y,n.z=u.z,m=u.size*u.scale/ h,l.x=m*j,l.y=m,b.uniform3f(o.screenPosition,n.x,n.y,n.z),b.uniform2f(o.scale,l.x,l.y),b.uniform1f(o.rotation,u.rotation),b.uniform1f(o.opacity,u.opacity),b.uniform3f(o.color,u.color.r,u.color.g,u.color.b),c.setBlending(u.blending),c.setTexture(u.texture,1),b.drawElements(b.TRIANGLES,6,b.UNSIGNED_SHORT,0)}b.enable(b.CULL_FACE);b.enable(b.DEPTH_TEST);b.depthMask(!0)}}}; THREE.ShadowMapPlugin=function(){var a,b,c,d,e,g=new THREE.Frustum,f=new THREE.Matrix4;this.shadowMatrix=[];this.shadowMap=[];this.init=function(e){a=e.context;b=e;var e=THREE.ShaderLib.depthRGBA,f=THREE.UniformsUtils.clone(e.uniforms);c=new THREE.ShaderMaterial({fragmentShader:e.fragmentShader,vertexShader:e.vertexShader,uniforms:f});d=new THREE.ShaderMaterial({fragmentShader:e.fragmentShader,vertexShader:e.vertexShader,uniforms:f,morphTargets:!0});c._shadowPass=!0;d._shadowPass=!0};this.render= function(a,c){b.shadowMapEnabled&&b.shadowMapAutoUpdate&&this.update(a,c)};this.update=function(h){var i,k,j,q,p,m,l,n,r=0,o=h.lights;e||(e=new THREE.PerspectiveCamera(b.shadowCameraFov,b.shadowMapWidth/b.shadowMapHeight,b.shadowCameraNear,b.shadowCameraFar));i=0;for(k=o.length;i=1)return c.w=a.w,c.x=a.x,c.y=a.y,c.z=a.z,c;var f=Math.acos(e),e=Math.sqrt(1-e*e);if(Math.abs(e)<0.001)return c.w=0.5*(a.w+b.w),c.x=0.5*(a.x+b.x),c.y=0.5*(a.y+b.y),c.z=0.5*(a.z+b.z),c;b=Math.sin((1-d)*f)/e;d=Math.sin(d*f)/e;c.w=a.w*b+c.w*d;c.x=a.x*b+c.x*d;c.y=a.y*b+c.y*d;c.z=a.z*b+c.z*d;return c};THREE.Vertex=function(a){this.position=a||new THREE.Vector3}; +THREE.Quaternion.slerp=function(a,b,c,d){var e=a.w*b.w+a.x*b.x+a.y*b.y+a.z*b.z;e<0?(c.w=-b.w,c.x=-b.x,c.y=-b.y,c.z=-b.z,e=-e):c.copy(b);if(Math.abs(e)>=1)return c.w=a.w,c.x=a.x,c.y=a.y,c.z=a.z,c;var f=Math.acos(e),e=Math.sqrt(1-e*e);if(Math.abs(e)<0.0010)return c.w=0.5*(a.w+b.w),c.x=0.5*(a.x+b.x),c.y=0.5*(a.y+b.y),c.z=0.5*(a.z+b.z),c;b=Math.sin((1-d)*f)/e;d=Math.sin(d*f)/e;c.w=a.w*b+c.w*d;c.x=a.x*b+c.x*d;c.y=a.y*b+c.y*d;c.z=a.z*b+c.z*d;return c};THREE.Vertex=function(a){this.position=a||new THREE.Vector3}; THREE.Face3=function(a,b,c,d,e,f){this.a=a;this.b=b;this.c=c;this.normal=d instanceof THREE.Vector3?d:new THREE.Vector3;this.vertexNormals=d instanceof Array?d:[];this.color=e instanceof THREE.Color?e:new THREE.Color;this.vertexColors=e instanceof Array?e:[];this.vertexTangents=[];this.materialIndex=f;this.centroid=new THREE.Vector3}; THREE.Face4=function(a,b,c,d,e,f,g){this.a=a;this.b=b;this.c=c;this.d=d;this.normal=e instanceof THREE.Vector3?e:new THREE.Vector3;this.vertexNormals=e instanceof Array?e:[];this.color=f instanceof THREE.Color?f:new THREE.Color;this.vertexColors=f instanceof Array?f:[];this.vertexTangents=[];this.materialIndex=g;this.centroid=new THREE.Vector3};THREE.UV=function(a,b){this.u=a||0;this.v=b||0}; THREE.UV.prototype={constructor:THREE.UV,set:function(a,b){this.u=a;this.v=b;return this},copy:function(a){this.u=a.u;this.v=a.v;return this},clone:function(){return new THREE.UV(this.u,this.v)}}; diff --git a/build/custom/ThreeWebGL.js b/build/custom/ThreeWebGL.js index b2c6b9fa54..c5560599e7 100644 --- a/build/custom/ThreeWebGL.js +++ b/build/custom/ThreeWebGL.js @@ -76,7 +76,7 @@ this.x=a.x*c;this.y=a.y*c;this.z=a.z*c;this.w=Math.cos(d);return this},setFromRo this.normalize();return this},calculateW:function(){this.w=-Math.sqrt(Math.abs(1-this.x*this.x-this.y*this.y-this.z*this.z));return this},inverse:function(){this.x*=-1;this.y*=-1;this.z*=-1;return this},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w)},normalize:function(){var a=Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w);a===0?this.w=this.z=this.y=this.x=0:(a=1/a,this.x*=a,this.y*=a,this.z*=a,this.w*=a);return this},multiplySelf:function(a){var b= this.x,d=this.y,c=this.z,f=this.w,g=a.x,h=a.y,i=a.z,a=a.w;this.x=b*a+f*g+d*i-c*h;this.y=d*a+f*h+c*g-b*i;this.z=c*a+f*i+b*h-d*g;this.w=f*a-b*g-d*h-c*i;return this},multiply:function(a,b){this.x=a.x*b.w+a.y*b.z-a.z*b.y+a.w*b.x;this.y=-a.x*b.z+a.y*b.w+a.z*b.x+a.w*b.y;this.z=a.x*b.y-a.y*b.x+a.z*b.w+a.w*b.z;this.w=-a.x*b.x-a.y*b.y-a.z*b.z+a.w*b.w;return this},multiplyVector3:function(a,b){b||(b=a);var d=a.x,c=a.y,f=a.z,g=this.x,h=this.y,i=this.z,l=this.w,k=l*d+h*f-i*c,j=l*c+i*d-g*f,p=l*f+g*c-h*d,d=-g* d-h*c-i*f;b.x=k*l+d*-g+j*-i-p*-h;b.y=j*l+d*-h+p*-g-k*-i;b.z=p*l+d*-i+k*-h-j*-g;return b}}; -THREE.Quaternion.slerp=function(a,b,d,c){var f=a.w*b.w+a.x*b.x+a.y*b.y+a.z*b.z;f<0?(d.w=-b.w,d.x=-b.x,d.y=-b.y,d.z=-b.z,f=-f):d.copy(b);if(Math.abs(f)>=1)return d.w=a.w,d.x=a.x,d.y=a.y,d.z=a.z,d;var g=Math.acos(f),f=Math.sqrt(1-f*f);if(Math.abs(f)<0.001)return d.w=0.5*(a.w+b.w),d.x=0.5*(a.x+b.x),d.y=0.5*(a.y+b.y),d.z=0.5*(a.z+b.z),d;b=Math.sin((1-c)*g)/f;c=Math.sin(c*g)/f;d.w=a.w*b+d.w*c;d.x=a.x*b+d.x*c;d.y=a.y*b+d.y*c;d.z=a.z*b+d.z*c;return d};THREE.Vertex=function(a){this.position=a||new THREE.Vector3}; +THREE.Quaternion.slerp=function(a,b,d,c){var f=a.w*b.w+a.x*b.x+a.y*b.y+a.z*b.z;f<0?(d.w=-b.w,d.x=-b.x,d.y=-b.y,d.z=-b.z,f=-f):d.copy(b);if(Math.abs(f)>=1)return d.w=a.w,d.x=a.x,d.y=a.y,d.z=a.z,d;var g=Math.acos(f),f=Math.sqrt(1-f*f);if(Math.abs(f)<0.0010)return d.w=0.5*(a.w+b.w),d.x=0.5*(a.x+b.x),d.y=0.5*(a.y+b.y),d.z=0.5*(a.z+b.z),d;b=Math.sin((1-c)*g)/f;c=Math.sin(c*g)/f;d.w=a.w*b+d.w*c;d.x=a.x*b+d.x*c;d.y=a.y*b+d.y*c;d.z=a.z*b+d.z*c;return d};THREE.Vertex=function(a){this.position=a||new THREE.Vector3}; THREE.Face3=function(a,b,d,c,f,g){this.a=a;this.b=b;this.c=d;this.normal=c instanceof THREE.Vector3?c:new THREE.Vector3;this.vertexNormals=c instanceof Array?c:[];this.color=f instanceof THREE.Color?f:new THREE.Color;this.vertexColors=f instanceof Array?f:[];this.vertexTangents=[];this.materialIndex=g;this.centroid=new THREE.Vector3}; THREE.Face4=function(a,b,d,c,f,g,h){this.a=a;this.b=b;this.c=d;this.d=c;this.normal=f instanceof THREE.Vector3?f:new THREE.Vector3;this.vertexNormals=f instanceof Array?f:[];this.color=g instanceof THREE.Color?g:new THREE.Color;this.vertexColors=g instanceof Array?g:[];this.vertexTangents=[];this.materialIndex=h;this.centroid=new THREE.Vector3};THREE.UV=function(a,b){this.u=a||0;this.v=b||0}; THREE.UV.prototype={constructor:THREE.UV,set:function(a,b){this.u=a;this.v=b;return this},copy:function(a){this.u=a.u;this.v=a.v;return this},clone:function(){return new THREE.UV(this.u,this.v)}}; @@ -303,7 +303,7 @@ b.bindTexture(b.TEXTURE_2D,c.occlusionTexture);b.texImage2D(b.TEXTURE_2D,0,b.RGB "color");c.uniforms.scale=b.getUniformLocation(c.program,"scale");c.uniforms.rotation=b.getUniformLocation(c.program,"rotation");c.uniforms.screenPosition=b.getUniformLocation(c.program,"screenPosition");c.attributesEnabled=!1};this.render=function(a,g,h,i){var a=a.__webglFlares,l=a.length;if(l){var k=new THREE.Vector3,j=i/h,p=h*0.5,s=i*0.5,w=16/i,n=new THREE.Vector2(w*j,w),E=new THREE.Vector3(1,1,0),y=new THREE.Vector2(1,1),J=c.uniforms,w=c.attributes;b.useProgram(c.program);if(!c.attributesEnabled)b.enableVertexAttribArray(c.attributes.vertex), b.enableVertexAttribArray(c.attributes.uv),c.attributesEnabled=!0;b.uniform1i(J.occlusionMap,0);b.uniform1i(J.map,1);b.bindBuffer(b.ARRAY_BUFFER,c.vertexBuffer);b.vertexAttribPointer(w.vertex,2,b.FLOAT,!1,16,0);b.vertexAttribPointer(w.uv,2,b.FLOAT,!1,16,8);b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,c.elementBuffer);b.disable(b.CULL_FACE);b.depthMask(!1);var P,Q,V,C,D;for(P=0;P0&&y.x0&&y.y0.001&&D.scale>0.001)E.x=D.x,E.y=D.y,E.z=D.z,w=D.size*D.scale/ +b.copyTexImage2D(b.TEXTURE_2D,0,b.RGBA,y.x-8,y.y-8,16,16,0);b.uniform1i(J.renderType,1);b.disable(b.DEPTH_TEST);b.activeTexture(b.TEXTURE1);b.bindTexture(b.TEXTURE_2D,c.tempTexture);b.drawElements(b.TRIANGLES,6,b.UNSIGNED_SHORT,0);C.positionScreen.copy(E);C.customUpdateCallback?C.customUpdateCallback(C):C.updateLensFlares();b.uniform1i(J.renderType,2);b.enable(b.BLEND);Q=0;for(V=C.lensFlares.length;Q0.0010&&D.scale>0.0010)E.x=D.x,E.y=D.y,E.z=D.z,w=D.size*D.scale/ i,n.x=w*j,n.y=w,b.uniform3f(J.screenPosition,E.x,E.y,E.z),b.uniform2f(J.scale,n.x,n.y),b.uniform1f(J.rotation,D.rotation),b.uniform1f(J.opacity,D.opacity),b.uniform3f(J.color,D.color.r,D.color.g,D.color.b),d.setBlending(D.blending),d.setTexture(D.texture,1),b.drawElements(b.TRIANGLES,6,b.UNSIGNED_SHORT,0)}b.enable(b.CULL_FACE);b.enable(b.DEPTH_TEST);b.depthMask(!0)}}}; THREE.ShadowMapPlugin=function(){var a,b,d,c,f,g=new THREE.Frustum,h=new THREE.Matrix4;this.shadowMatrix=[];this.shadowMap=[];this.init=function(f){a=f.context;b=f;var f=THREE.ShaderLib.depthRGBA,g=THREE.UniformsUtils.clone(f.uniforms);d=new THREE.ShaderMaterial({fragmentShader:f.fragmentShader,vertexShader:f.vertexShader,uniforms:g});c=new THREE.ShaderMaterial({fragmentShader:f.fragmentShader,vertexShader:f.vertexShader,uniforms:g,morphTargets:!0});d._shadowPass=!0;c._shadowPass=!0};this.render= function(a,c){b.shadowMapEnabled&&b.shadowMapAutoUpdate&&this.update(a,c)};this.update=function(i){var l,k,j,p,s,w,n,E,y=0,J=i.lights;f||(f=new THREE.PerspectiveCamera(b.shadowCameraFov,b.shadowMapWidth/b.shadowMapHeight,b.shadowCameraNear,b.shadowCameraFar));l=0;for(k=J.length;l + // (for now just the first set of UVs) + + normalizeUVs: function ( geometry ) { + + var uvSet = geometry.faceVertexUvs[ 0 ]; + + for ( var i = 0, il = uvSet.length; i < il; i ++ ) { + + var uvs = uvSet[ i ]; + for ( var j = 0, jl = uvs.length; j < jl; j ++ ) { + + // texture repeat + + if( uvs[ j ].u !== 1.0 ) uvs[ j ].u = uvs[ j ].u - Math.floor( uvs[ j ].u ); + if( uvs[ j ].v !== 1.0 ) uvs[ j ].v = uvs[ j ].v - Math.floor( uvs[ j ].v ); + + } + + } + + } }; -- GitLab