From 05b3db4dca5fca2b6dacd6782b5e166c3802f749 Mon Sep 17 00:00:00 2001 From: alteredq Date: Fri, 21 Oct 2011 03:06:06 +0200 Subject: [PATCH] Experimenting with array-less materials. Do not use for anything, this is just snapshot of a test in progress. I solved quite a few issues, but many things are still clumsy and broken. --- build/Three.js | 1258 ++++++++--------- examples/js/Car.js | 8 +- examples/js/postprocessing/BloomPass.js | 4 +- examples/js/postprocessing/DotScreenPass.js | 2 +- examples/js/postprocessing/FilmPass.js | 2 +- examples/js/postprocessing/SavePass.js | 2 +- examples/js/postprocessing/ShaderPass.js | 2 +- examples/js/postprocessing/TexturePass.js | 2 +- examples/webgl_animation_skinning.html | 2 +- .../webgl_geometry_blenderexport_colors.html | 14 +- examples/webgl_geometry_colors.html | 54 +- examples/webgl_geometry_text.html | 8 +- .../webgl_interactive_draggablecubes.html | 8 +- examples/webgl_materials2.html | 2 +- examples/webgl_materials_cars.html | 6 +- examples/webgl_materials_cars_camaro.html | 22 +- examples/webgl_materials_cubemap_dynamic.html | 165 ++- examples/webgl_materials_grass.html | 2 +- examples/webgl_materials_normalmap.html | 4 + examples/webgl_shader_lava.html | 2 +- examples/webgl_shading_physical.html | 2 +- examples/webgl_shadowmap.html | 2 + src/core/Face3.js | 6 +- src/core/Face4.js | 6 +- src/core/Geometry.js | 36 +- src/extras/GeometryUtils.js | 39 +- src/extras/geometries/CubeGeometry.js | 22 +- src/extras/loaders/BinaryLoader.js | 16 +- src/extras/loaders/JSONLoader.js | 2 +- src/extras/loaders/Loader.js | 6 +- src/objects/Line.js | 4 +- src/objects/Mesh.js | 4 +- src/objects/MorphAnimMesh.js | 4 +- src/objects/Particle.js | 4 +- src/objects/ParticleSystem.js | 4 +- src/objects/Ribbon.js | 4 +- src/objects/SkinnedMesh.js | 4 +- src/renderers/WebGLRenderer.js | 460 ++---- 38 files changed, 1103 insertions(+), 1091 deletions(-) diff --git a/build/Three.js b/build/Three.js index de3aae7e..e1d92850 100644 --- a/build/Three.js +++ b/build/Three.js @@ -1,200 +1,199 @@ // Three.js r46dev - http://github.com/mrdoob/three.js -var THREE=THREE||{};if(!self.Int32Array)self.Int32Array=Array,self.Float32Array=Array;THREE.Clock=function(b){this.autoStart=b!==void 0?b:!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 b=0;this.autoStart&&!this.running&&this.start();if(this.running){var c=Date.now(),b=0.0010*(c-this.oldTime);this.oldTime=c;this.elapsedTime+=b}return b};THREE.Color=function(b){b!==void 0&&this.setHex(b);return this}; -THREE.Color.prototype={constructor:THREE.Color,r:1,g:1,b:1,copy:function(b){this.r=b.r;this.g=b.g;this.b=b.b;return this},copyGammaToLinear:function(b){this.r=b.r*b.r;this.g=b.g*b.g;this.b=b.b*b.b;return this},copyLinearToGamma:function(b){this.r=Math.sqrt(b.r);this.g=Math.sqrt(b.g);this.b=Math.sqrt(b.b);return this},setRGB:function(b,c,e){this.r=b;this.g=c;this.b=e;return this},setHSV:function(b,c,e){var f,h,k;if(e==0)this.r=this.g=this.b=0;else switch(f=Math.floor(b*6),h=b*6-f,b=e*(1-c),k=e*(1- -c*h),c=e*(1-c*(1-h)),f){case 1:this.r=k;this.g=e;this.b=b;break;case 2:this.r=b;this.g=e;this.b=c;break;case 3:this.r=b;this.g=k;this.b=e;break;case 4:this.r=c;this.g=b;this.b=e;break;case 5:this.r=e;this.g=b;this.b=k;break;case 6:case 0:this.r=e,this.g=c,this.b=b}return this},setHex:function(b){b=Math.floor(b);this.r=(b>>16&255)/255;this.g=(b>>8&255)/255;this.b=(b&255)/255;return this},getHex:function(){return~~(this.r*255)<<16^~~(this.g*255)<<8^~~(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.Vector2=function(b,c){this.x=b||0;this.y=c||0}; -THREE.Vector2.prototype={constructor:THREE.Vector2,set:function(b,c){this.x=b;this.y=c;return this},copy:function(b){this.x=b.x;this.y=b.y;return this},clone:function(){return new THREE.Vector2(this.x,this.y)},add:function(b,c){this.x=b.x+c.x;this.y=b.y+c.y;return this},addSelf:function(b){this.x+=b.x;this.y+=b.y;return this},sub:function(b,c){this.x=b.x-c.x;this.y=b.y-c.y;return this},subSelf:function(b){this.x-=b.x;this.y-=b.y;return this},multiplyScalar:function(b){this.x*=b;this.y*=b;return this}, -divideScalar:function(b){b?(this.x/=b,this.y/=b):this.set(0,0);return this},negate:function(){return this.multiplyScalar(-1)},dot:function(b){return this.x*b.x+this.y*b.y},lengthSq:function(){return this.x*this.x+this.y*this.y},length:function(){return Math.sqrt(this.lengthSq())},normalize:function(){return this.divideScalar(this.length())},distanceTo:function(b){return Math.sqrt(this.distanceToSquared(b))},distanceToSquared:function(b){var c=this.x-b.x,b=this.y-b.y;return c*c+b*b},setLength:function(b){return this.normalize().multiplyScalar(b)}, -equals:function(b){return b.x==this.x&&b.y==this.y}};THREE.Vector3=function(b,c,e){this.x=b||0;this.y=c||0;this.z=e||0}; -THREE.Vector3.prototype={constructor:THREE.Vector3,set:function(b,c,e){this.x=b;this.y=c;this.z=e;return this},setX:function(b){this.x=b;return this},setY:function(b){this.y=b;return this},setZ:function(b){this.z=b;return this},copy:function(b){this.x=b.x;this.y=b.y;this.z=b.z;return this},clone:function(){return new THREE.Vector3(this.x,this.y,this.z)},add:function(b,c){this.x=b.x+c.x;this.y=b.y+c.y;this.z=b.z+c.z;return this},addSelf:function(b){this.x+=b.x;this.y+=b.y;this.z+=b.z;return this}, -addScalar:function(b){this.x+=b;this.y+=b;this.z+=b;return this},sub:function(b,c){this.x=b.x-c.x;this.y=b.y-c.y;this.z=b.z-c.z;return this},subSelf:function(b){this.x-=b.x;this.y-=b.y;this.z-=b.z;return this},multiply:function(b,c){this.x=b.x*c.x;this.y=b.y*c.y;this.z=b.z*c.z;return this},multiplySelf:function(b){this.x*=b.x;this.y*=b.y;this.z*=b.z;return this},multiplyScalar:function(b){this.x*=b;this.y*=b;this.z*=b;return this},divideSelf:function(b){this.x/=b.x;this.y/=b.y;this.z/=b.z;return this}, -divideScalar:function(b){b?(this.x/=b,this.y/=b,this.z/=b):this.set(0,0,0);return this},negate:function(){return this.multiplyScalar(-1)},dot:function(b){return this.x*b.x+this.y*b.y+this.z*b.z},lengthSq:function(){return this.x*this.x+this.y*this.y+this.z*this.z},length:function(){return Math.sqrt(this.lengthSq())},lengthManhattan:function(){return this.x+this.y+this.z},normalize:function(){return this.divideScalar(this.length())},setLength:function(b){return this.normalize().multiplyScalar(b)}, -cross:function(b,c){this.x=b.y*c.z-b.z*c.y;this.y=b.z*c.x-b.x*c.z;this.z=b.x*c.y-b.y*c.x;return this},crossSelf:function(b){return this.set(this.y*b.z-this.z*b.y,this.z*b.x-this.x*b.z,this.x*b.y-this.y*b.x)},distanceTo:function(b){return Math.sqrt(this.distanceToSquared(b))},distanceToSquared:function(b){return(new THREE.Vector3).sub(this,b).lengthSq()},setPositionFromMatrix:function(b){this.x=b.n14;this.y=b.n24;this.z=b.n34},setRotationFromMatrix:function(b){var c=Math.cos(this.y);this.y=Math.asin(b.n13); -Math.abs(c)>1.0E-5?(this.x=Math.atan2(-b.n23/c,b.n33/c),this.z=Math.atan2(-b.n12/c,b.n11/c)):(this.x=0,this.z=Math.atan2(b.n21,b.n22))},isZero:function(){return this.lengthSq()<1.0E-4}};THREE.Vector4=function(b,c,e,f){this.x=b||0;this.y=c||0;this.z=e||0;this.w=f!==void 0?f:1}; -THREE.Vector4.prototype={constructor:THREE.Vector4,set:function(b,c,e,f){this.x=b;this.y=c;this.z=e;this.w=f;return this},copy:function(b){this.x=b.x;this.y=b.y;this.z=b.z;this.w=b.w!==void 0?b.w:1},clone:function(){return new THREE.Vector4(this.x,this.y,this.z,this.w)},add:function(b,c){this.x=b.x+c.x;this.y=b.y+c.y;this.z=b.z+c.z;this.w=b.w+c.w;return this},addSelf:function(b){this.x+=b.x;this.y+=b.y;this.z+=b.z;this.w+=b.w;return this},sub:function(b,c){this.x=b.x-c.x;this.y=b.y-c.y;this.z=b.z- -c.z;this.w=b.w-c.w;return this},subSelf:function(b){this.x-=b.x;this.y-=b.y;this.z-=b.z;this.w-=b.w;return this},multiplyScalar:function(b){this.x*=b;this.y*=b;this.z*=b;this.w*=b;return this},divideScalar:function(b){b?(this.x/=b,this.y/=b,this.z/=b,this.w/=b):(this.z=this.y=this.x=0,this.w=1);return this},negate:function(){return this.multiplyScalar(-1)},dot:function(b){return this.x*b.x+this.y*b.y+this.z*b.z+this.w*b.w},lengthSq:function(){return this.dot(this)},length:function(){return Math.sqrt(this.lengthSq())}, -normalize:function(){return this.divideScalar(this.length())},setLength:function(b){return this.normalize().multiplyScalar(b)},lerpSelf:function(b,c){this.x+=(b.x-this.x)*c;this.y+=(b.y-this.y)*c;this.z+=(b.z-this.z)*c;this.w+=(b.w-this.w)*c;return this}};THREE.Ray=function(b,c){this.origin=b||new THREE.Vector3;this.direction=c||new THREE.Vector3}; -THREE.Ray.prototype={constructor:THREE.Ray,intersectScene:function(b){return this.intersectObjects(b.objects)},intersectObjects:function(b){var c,e,f=[];c=0;for(e=b.length;c0&&b>0&&k+b<1}for(var f,h=[],k=0,m=b.children.length;kb.scale.x)return[];f={distance:k,point:b.position,face:null,object:b};h.push(f)}else if(b instanceof THREE.Mesh){k=c(this.origin, -this.direction,b.matrixWorld.getPosition());if(k==null||k>b.geometry.boundingSphere.radius*Math.max(b.scale.x,Math.max(b.scale.y,b.scale.z)))return h;for(var n,p,t,w,u,x,v,A,z=b.geometry,y=z.vertices,k=0,m=z.faces.length;k0:x<0)))if(x=u.dot((new THREE.Vector3).sub(n,v))/x,v=v.addSelf(A.multiplyScalar(x)),f instanceof THREE.Face3)e(v,n,p,t)&&(f={distance:this.origin.distanceTo(v),point:v,face:f,object:b},h.push(f));else if(f instanceof THREE.Face4&&(e(v,n,p,w)||e(v,p,t,w)))f={distance:this.origin.distanceTo(v),point:v,face:f,object:b},h.push(f)}return h}}; -THREE.Rectangle=function(){function b(){k=f-c;m=h-e}var c,e,f,h,k,m,n=!0;this.getX=function(){return c};this.getY=function(){return e};this.getWidth=function(){return k};this.getHeight=function(){return m};this.getLeft=function(){return c};this.getTop=function(){return e};this.getRight=function(){return f};this.getBottom=function(){return h};this.set=function(k,m,w,u){n=!1;c=k;e=m;f=w;h=u;b()};this.addPoint=function(k,m){n?(n=!1,c=k,e=m,f=k,h=m):(c=ck?f:k,h=h>m?h:m);b()};this.add3Points= -function(k,m,w,u,x,v){n?(n=!1,c=kw?k>x?k:x:w>x?w:x,h=m>u?m>v?m:v:u>v?u:v):(c=kw?k>x?k>f?k:f:x>f?x:f:w>x?w>f?w:f:x>f?x:f,h=m>u?m>v?m>h?m:h:v>h?v:h:u>v?u>h?u:h:v>h?v:h);b()};this.addRectangle=function(k){n?(n=!1,c=k.getLeft(),e=k.getTop(),f=k.getRight(),h=k.getBottom()):(c=ck.getRight()?f:k.getRight(),h=h> -k.getBottom()?h:k.getBottom());b()};this.inflate=function(k){c-=k;e-=k;f+=k;h+=k;b()};this.minSelf=function(k){c=c>k.getLeft()?c:k.getLeft();e=e>k.getTop()?e:k.getTop();f=f=0&&Math.min(h,b.getBottom())-Math.max(e,b.getTop())>=0};this.empty=function(){n=!0;h=f=e=c=0;b()};this.isEmpty=function(){return n}}; -THREE.Math={clamp:function(b,c,e){return be?e:b},clampBottom:function(b,c){return b>16&255)/255;this.g=(a>>8&255)/255;this.b=(a&255)/255;return this},getHex:function(){return~~(this.r*255)<<16^~~(this.g*255)<<8^~~(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.Vector2=function(a,b){this.x=a||0;this.y=b||0}; +THREE.Vector2.prototype={constructor:THREE.Vector2,set:function(a,b){this.x=a;this.y=b;return this},copy:function(a){this.x=a.x;this.y=a.y;return this},clone:function(){return new THREE.Vector2(this.x,this.y)},add:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;return this},addSelf:function(a){this.x+=a.x;this.y+=a.y;return this},sub:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;return this},subSelf:function(a){this.x-=a.x;this.y-=a.y;return this},multiplyScalar:function(a){this.x*=a;this.y*=a;return this}, +divideScalar:function(a){a?(this.x/=a,this.y/=a):this.set(0,0);return this},negate:function(){return this.multiplyScalar(-1)},dot:function(a){return this.x*a.x+this.y*a.y},lengthSq:function(){return this.x*this.x+this.y*this.y},length:function(){return Math.sqrt(this.lengthSq())},normalize:function(){return this.divideScalar(this.length())},distanceTo:function(a){return Math.sqrt(this.distanceToSquared(a))},distanceToSquared:function(a){var b=this.x-a.x,a=this.y-a.y;return b*b+a*a},setLength:function(a){return this.normalize().multiplyScalar(a)}, +equals:function(a){return a.x==this.x&&a.y==this.y}};THREE.Vector3=function(a,b,c){this.x=a||0;this.y=b||0;this.z=c||0}; +THREE.Vector3.prototype={constructor:THREE.Vector3,set:function(a,b,c){this.x=a;this.y=b;this.z=c;return this},setX:function(a){this.x=a;return this},setY:function(a){this.y=a;return this},setZ:function(a){this.z=a;return this},copy:function(a){this.x=a.x;this.y=a.y;this.z=a.z;return this},clone:function(){return new THREE.Vector3(this.x,this.y,this.z)},add:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;this.z=a.z+b.z;return this},addSelf:function(a){this.x+=a.x;this.y+=a.y;this.z+=a.z;return this}, +addScalar:function(a){this.x+=a;this.y+=a;this.z+=a;return this},sub:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;this.z=a.z-b.z;return this},subSelf:function(a){this.x-=a.x;this.y-=a.y;this.z-=a.z;return this},multiply:function(a,b){this.x=a.x*b.x;this.y=a.y*b.y;this.z=a.z*b.z;return this},multiplySelf:function(a){this.x*=a.x;this.y*=a.y;this.z*=a.z;return this},multiplyScalar:function(a){this.x*=a;this.y*=a;this.z*=a;return this},divideSelf:function(a){this.x/=a.x;this.y/=a.y;this.z/=a.z;return this}, +divideScalar:function(a){a?(this.x/=a,this.y/=a,this.z/=a):this.set(0,0,0);return this},negate:function(){return this.multiplyScalar(-1)},dot:function(a){return this.x*a.x+this.y*a.y+this.z*a.z},lengthSq:function(){return this.x*this.x+this.y*this.y+this.z*this.z},length:function(){return Math.sqrt(this.lengthSq())},lengthManhattan:function(){return this.x+this.y+this.z},normalize:function(){return this.divideScalar(this.length())},setLength:function(a){return this.normalize().multiplyScalar(a)}, +cross:function(a,b){this.x=a.y*b.z-a.z*b.y;this.y=a.z*b.x-a.x*b.z;this.z=a.x*b.y-a.y*b.x;return this},crossSelf:function(a){return this.set(this.y*a.z-this.z*a.y,this.z*a.x-this.x*a.z,this.x*a.y-this.y*a.x)},distanceTo:function(a){return Math.sqrt(this.distanceToSquared(a))},distanceToSquared:function(a){return(new THREE.Vector3).sub(this,a).lengthSq()},setPositionFromMatrix:function(a){this.x=a.n14;this.y=a.n24;this.z=a.n34},setRotationFromMatrix:function(a){var b=Math.cos(this.y);this.y=Math.asin(a.n13); +Math.abs(b)>1.0E-5?(this.x=Math.atan2(-a.n23/b,a.n33/b),this.z=Math.atan2(-a.n12/b,a.n11/b)):(this.x=0,this.z=Math.atan2(a.n21,a.n22))},isZero:function(){return this.lengthSq()<1.0E-4}};THREE.Vector4=function(a,b,c,e){this.x=a||0;this.y=b||0;this.z=c||0;this.w=e!==void 0?e:1}; +THREE.Vector4.prototype={constructor:THREE.Vector4,set:function(a,b,c,e){this.x=a;this.y=b;this.z=c;this.w=e;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){this.origin=a||new THREE.Vector3;this.direction=b||new THREE.Vector3}; +THREE.Ray.prototype={constructor:THREE.Ray,intersectScene:function(a){return this.intersectObjects(a.objects)},intersectObjects:function(a){var b,c,e=[];b=0;for(c=a.length;b0&&a>0&&k+a<1}for(var e,f=[],k=0,h=a.children.length;ka.scale.x)return[];e={distance:k,point:a.position,face:null,object:a};f.push(e)}else if(a instanceof THREE.Mesh){k=b(this.origin, +this.direction,a.matrixWorld.getPosition());if(k==null||k>a.geometry.boundingSphere.radius*Math.max(a.scale.x,Math.max(a.scale.y,a.scale.z)))return f;for(var l,n,o,u,p,v,t,y,x=a.geometry,w=x.vertices,k=0,h=x.faces.length;k0:v<0)))if(v=p.dot((new THREE.Vector3).sub(l,t))/v,t=t.addSelf(y.multiplyScalar(v)),e instanceof THREE.Face3)c(t,l,n,o)&&(e={distance:this.origin.distanceTo(t),point:t,face:e,object:a},f.push(e));else if(e instanceof THREE.Face4&&(c(t,l,n,u)||c(t,n,o,u)))e={distance:this.origin.distanceTo(t),point:t,face:e,object:a},f.push(e)}return f}}; +THREE.Rectangle=function(){function a(){k=e-b;h=f-c}var b,c,e,f,k,h,l=!0;this.getX=function(){return b};this.getY=function(){return c};this.getWidth=function(){return k};this.getHeight=function(){return h};this.getLeft=function(){return b};this.getTop=function(){return c};this.getRight=function(){return e};this.getBottom=function(){return f};this.set=function(k,h,u,p){l=!1;b=k;c=h;e=u;f=p;a()};this.addPoint=function(k,h){l?(l=!1,b=k,c=h,e=k,f=h):(b=bk?e:k,f=f>h?f:h);a()};this.add3Points= +function(k,h,u,p,v,t){l?(l=!1,b=ku?k>v?k:v:u>v?u:v,f=h>p?h>t?h:t:p>t?p:t):(b=ku?k>v?k>e?k:e:v>e?v:e:u>v?u>e?u:e:v>e?v:e,f=h>p?h>t?h>f?h:f:t>f?t:f:p>t?p>f?p:f:t>f?t:f);a()};this.addRectangle=function(k){l?(l=!1,b=k.getLeft(),c=k.getTop(),e=k.getRight(),f=k.getBottom()):(b=bk.getRight()?e:k.getRight(),f=f> +k.getBottom()?f:k.getBottom());a()};this.inflate=function(k){b-=k;c-=k;e+=k;f+=k;a()};this.minSelf=function(k){b=b>k.getLeft()?b:k.getLeft();c=c>k.getTop()?c:k.getTop();e=e=0&&Math.min(f,a.getBottom())-Math.max(c,a.getTop())>=0};this.empty=function(){l=!0;f=e=c=b=0;a()};this.isEmpty=function(){return l}}; +THREE.Math={clamp:function(a,b,c){return ac?c:a},clampBottom:function(a,b){return a=0&&k>=0&&m>=0&&n>=0?!0:h<0&&k<0||m<0&&n<0?!1:(h<0?e=Math.max(e,h/(h-k)):k<0&&(f=Math.min(f,h/(h-k))),m<0?e=Math.max(e,m/(m-n)):n<0&&(f=Math.min(f,m/(m-n))),fG&&m.positionScreen.z0&&K.z<1))ia=C[E]=C[E]||new THREE.RenderableParticle,E++,D=ia,D.x=K.x/K.w,D.y=K.y/K.w,D.z=K.z,D.rotation=X.rotation.z,D.scale.x=X.scale.x*Math.abs(D.x-(K.x+h.projectionMatrix.n11)/(K.w+h.projectionMatrix.n14)),D.scale.y=X.scale.y*Math.abs(D.y-(K.y+h.projectionMatrix.n22)/(K.w+h.projectionMatrix.n24)),D.materials=X.materials,I.push(D);k&&I.sort(c);return I}}; -THREE.Quaternion=function(b,c,e,f){this.set(b||0,c||0,e||0,f!==void 0?f:1)}; -THREE.Quaternion.prototype={constructor:THREE.Quaternion,set:function(b,c,e,f){this.x=b;this.y=c;this.z=e;this.w=f;return this},copy:function(b){this.x=b.x;this.y=b.y;this.z=b.z;this.w=b.w;return this},setFromEuler:function(b){var c=Math.PI/360,e=b.x*c,f=b.y*c,h=b.z*c,b=Math.cos(f),f=Math.sin(f),c=Math.cos(-h),h=Math.sin(-h),k=Math.cos(e),e=Math.sin(e),m=b*c,n=f*h;this.w=m*k-n*e;this.x=m*e+n*k;this.y=f*c*k+b*h*e;this.z=b*h*k-f*c*e;return this},setFromAxisAngle:function(b,c){var e=c/2,f=Math.sin(e); -this.x=b.x*f;this.y=b.y*f;this.z=b.z*f;this.w=Math.cos(e);return this},setFromRotationMatrix:function(b){var c=Math.pow(b.determinant(),1/3);this.w=Math.sqrt(Math.max(0,c+b.n11+b.n22+b.n33))/2;this.x=Math.sqrt(Math.max(0,c+b.n11-b.n22-b.n33))/2;this.y=Math.sqrt(Math.max(0,c-b.n11+b.n22-b.n33))/2;this.z=Math.sqrt(Math.max(0,c-b.n11-b.n22+b.n33))/2;this.x=b.n32-b.n23<0?-Math.abs(this.x):Math.abs(this.x);this.y=b.n13-b.n31<0?-Math.abs(this.y):Math.abs(this.y);this.z=b.n21-b.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 b=Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w);b==0?this.w=this.z=this.y=this.x=0:(b=1/b,this.x*=b,this.y*=b,this.z*=b,this.w*=b);return this},multiplySelf:function(b){var c= -this.x,e=this.y,f=this.z,h=this.w,k=b.x,m=b.y,n=b.z,b=b.w;this.x=c*b+h*k+e*n-f*m;this.y=e*b+h*m+f*k-c*n;this.z=f*b+h*n+c*m-e*k;this.w=h*b-c*k-e*m-f*n;return this},multiply:function(b,c){this.x=b.x*c.w+b.y*c.z-b.z*c.y+b.w*c.x;this.y=-b.x*c.z+b.y*c.w+b.z*c.x+b.w*c.y;this.z=b.x*c.y-b.y*c.x+b.z*c.w+b.w*c.z;this.w=-b.x*c.x-b.y*c.y-b.z*c.z+b.w*c.w;return this},multiplyVector3:function(b,c){c||(c=b);var e=b.x,f=b.y,h=b.z,k=this.x,m=this.y,n=this.z,p=this.w,t=p*e+m*h-n*f,w=p*f+n*e-k*h,u=p*h+k*f-m*e,e=-k* -e-m*f-n*h;c.x=t*p+e*-k+w*-n-u*-m;c.y=w*p+e*-m+u*-k-t*-n;c.z=u*p+e*-n+t*-m-w*-k;return c}};THREE.Quaternion.slerp=function(b,c,e,f){var h=b.w*c.w+b.x*c.x+b.y*c.y+b.z*c.z;if(Math.abs(h)>=1)return e.w=b.w,e.x=b.x,e.y=b.y,e.z=b.z,e;var k=Math.acos(h),m=Math.sqrt(1-h*h);if(Math.abs(m)<0.0010)return e.w=0.5*(b.w+c.w),e.x=0.5*(b.x+c.x),e.y=0.5*(b.y+c.y),e.z=0.5*(b.z+c.z),e;h=Math.sin((1-f)*k)/m;f=Math.sin(f*k)/m;e.w=b.w*h+c.w*f;e.x=b.x*h+c.x*f;e.y=b.y*h+c.y*f;e.z=b.z*h+c.z*f;return e}; -THREE.Vertex=function(b){this.position=b||new THREE.Vector3};THREE.Face3=function(b,c,e,f,h,k){this.a=b;this.b=c;this.c=e;this.normal=f instanceof THREE.Vector3?f:new THREE.Vector3;this.vertexNormals=f instanceof Array?f:[];this.color=h instanceof THREE.Color?h:new THREE.Color;this.vertexColors=h instanceof Array?h:[];this.vertexTangents=[];this.materials=k instanceof Array?k:[k];this.centroid=new THREE.Vector3}; -THREE.Face4=function(b,c,e,f,h,k,m){this.a=b;this.b=c;this.c=e;this.d=f;this.normal=h instanceof THREE.Vector3?h:new THREE.Vector3;this.vertexNormals=h instanceof Array?h:[];this.color=k instanceof THREE.Color?k:new THREE.Color;this.vertexColors=k instanceof Array?k:[];this.vertexTangents=[];this.materials=m instanceof Array?m:[m];this.centroid=new THREE.Vector3};THREE.UV=function(b,c){this.u=b||0;this.v=c||0}; -THREE.UV.prototype={constructor:THREE.UV,set:function(b,c){this.u=b;this.v=c;return this},copy:function(b){this.u=b.u;this.v=b.v;return this},clone:function(){return new THREE.UV(this.u,this.v)}};THREE.Geometry=function(){this.id=THREE.GeometryCount++;this.vertices=[];this.colors=[];this.faces=[];this.faceUvs=[[]];this.faceVertexUvs=[[]];this.morphTargets=[];this.morphColors=[];this.skinWeights=[];this.skinIndices=[];this.boundingSphere=this.boundingBox=null;this.dynamic=this.hasTangents=!1}; -THREE.Geometry.prototype={constructor:THREE.Geometry,applyMatrix:function(b){var c=new THREE.Matrix4;c.extractRotation(b,new THREE.Vector3(1,1,1));for(var e=0,f=this.vertices.length;e0){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 c=1,e=this.vertices.length;cthis.boundingBox.x[1])this.boundingBox.x[1]=b.position.x;if(b.position.ythis.boundingBox.y[1])this.boundingBox.y[1]=b.position.y;if(b.position.zthis.boundingBox.z[1])this.boundingBox.z[1]=b.position.z}}},computeBoundingSphere:function(){for(var b=0,c=0,e=this.vertices.length;cthis.points.length-2?k:k+1;e[3]=k>this.points.length-3?k:k+2;t=this.points[e[0]];w=this.points[e[1]]; -u=this.points[e[2]];x=this.points[e[3]];n=m*m;p=m*n;f.x=c(t.x,w.x,u.x,x.x,m,n,p);f.y=c(t.y,w.y,u.y,x.y,m,n,p);f.z=c(t.z,w.z,u.z,x.z,m,n,p);return f};this.getControlPointsArray=function(){var b,c,e=this.points.length,f=[];for(b=0;b=0&&k>=0&&h>=0&&l>=0?!0:f<0&&k<0||h<0&&l<0?!1:(f<0?b=Math.max(b,f/(f-k)):k<0&&(e=Math.min(e,f/(f-k))),h<0?b=Math.max(b,h/(h-l)):l<0&&(e=Math.min(e,h/(h-l))),em&&h.positionScreen.z0&&F.z<1))aa=z[A]=z[A]||new THREE.RenderableParticle,A++,B=aa,B.x=F.x/F.w,B.y=F.y/F.w,B.z=F.z,B.rotation=X.rotation.z,B.scale.x=X.scale.x*Math.abs(B.x-(F.x+f.projectionMatrix.n11)/(F.w+f.projectionMatrix.n14)),B.scale.y=X.scale.y*Math.abs(B.y-(F.y+f.projectionMatrix.n22)/(F.w+f.projectionMatrix.n24)),B.materials=X.materials,E.push(B);k&&E.sort(b);return E}};THREE.Quaternion=function(a,b,c,e){this.set(a||0,b||0,c||0,e!==void 0?e:1)}; +THREE.Quaternion.prototype={constructor:THREE.Quaternion,set:function(a,b,c,e){this.x=a;this.y=b;this.z=c;this.w=e;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,e=a.y*b,f=a.z*b,a=Math.cos(e),e=Math.sin(e),b=Math.cos(-f),f=Math.sin(-f),k=Math.cos(c),c=Math.sin(c),h=a*b,l=e*f;this.w=h*k-l*c;this.x=h*c+l*k;this.y=e*b*k+a*f*c;this.z=a*f*k-e*b*c;return this},setFromAxisAngle:function(a,b){var c=b/2,e=Math.sin(c); +this.x=a.x*e;this.y=a.y*e;this.z=a.z*e;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,e=this.z,f=this.w,k=a.x,h=a.y,l=a.z,a=a.w;this.x=b*a+f*k+c*l-e*h;this.y=c*a+f*h+e*k-b*l;this.z=e*a+f*l+b*h-c*k;this.w=f*a-b*k-c*h-e*l;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,e=a.y,f=a.z,k=this.x,h=this.y,l=this.z,n=this.w,o=n*c+h*f-l*e,u=n*e+l*c-k*f,p=n*f+k*e-h*c,c=-k* +c-h*e-l*f;b.x=o*n+c*-k+u*-l-p*-h;b.y=u*n+c*-h+p*-k-o*-l;b.z=p*n+c*-l+o*-h-u*-k;return b}};THREE.Quaternion.slerp=function(a,b,c,e){var f=a.w*b.w+a.x*b.x+a.y*b.y+a.z*b.z;if(Math.abs(f)>=1)return c.w=a.w,c.x=a.x,c.y=a.y,c.z=a.z,c;var k=Math.acos(f),h=Math.sqrt(1-f*f);if(Math.abs(h)<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;f=Math.sin((1-e)*k)/h;e=Math.sin(e*k)/h;c.w=a.w*f+b.w*e;c.x=a.x*f+b.x*e;c.y=a.y*f+b.y*e;c.z=a.z*f+b.z*e;return c}; +THREE.Vertex=function(a){this.position=a||new THREE.Vector3};THREE.Face3=function(a,b,c,e,f,k){this.a=a;this.b=b;this.c=c;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=k;this.centroid=new THREE.Vector3}; +THREE.Face4=function(a,b,c,e,f,k,h){this.a=a;this.b=b;this.c=c;this.d=e;this.normal=f instanceof THREE.Vector3?f:new THREE.Vector3;this.vertexNormals=f instanceof Array?f:[];this.color=k instanceof THREE.Color?k:new THREE.Color;this.vertexColors=k instanceof Array?k:[];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)}}; +THREE.Geometry=function(){this.id=THREE.GeometryCount++;this.vertices=[];this.colors=[];this.materials=[];this.faces=[];this.faceUvs=[[]];this.faceVertexUvs=[[]];this.morphTargets=[];this.morphColors=[];this.skinWeights=[];this.skinIndices=[];this.boundingSphere=this.boundingBox=null;this.dynamic=this.hasTangents=!1}; +THREE.Geometry.prototype={constructor:THREE.Geometry,applyMatrix:function(a){var b=new THREE.Matrix4;b.extractRotation(a,new THREE.Vector3(1,1,1));for(var c=0,e=this.vertices.length;c0){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;bthis.points.length-2?k:k+1;c[3]=k>this.points.length-3?k:k+2;o=this.points[c[0]];u=this.points[c[1]]; +p=this.points[c[2]];v=this.points[c[3]];l=h*h;n=h*l;e.x=b(o.x,u.x,p.x,v.x,h,l,n);e.y=b(o.y,u.y,p.y,v.y,h,l,n);e.z=b(o.z,u.z,p.z,v.z,h,l,n);return e};this.getControlPointsArray=function(){var a,c,b=this.points.length,e=[];for(a=0;athis.duration||this.time<0){this.direction*=-1;if(this.time>this.duration)this.time=this.duration,this.directionBackwards=!0;if(this.time<0)this.time=0,this.directionBackwards=!1}}else this.time%=this.duration;b=THREE.Math.clamp(Math.floor(this.time/c),0,this.geometry.morphTargets.length-1);if(b!=this.currentKeyframe)this.morphTargetInfluences[this.lastKeyframe]= -0,this.morphTargetInfluences[this.currentKeyframe]=1,this.morphTargetInfluences[b]=0,this.lastKeyframe=this.currentKeyframe,this.currentKeyframe=b;c=this.time%c/c;this.directionBackwards&&(c=1-c);this.morphTargetInfluences[this.currentKeyframe]=c;this.morphTargetInfluences[this.lastKeyframe]=1-c};THREE.Ribbon=function(b,c){THREE.Object3D.call(this);this.geometry=b;this.materials=c instanceof Array?c:[c]};THREE.Ribbon.prototype=new THREE.Object3D;THREE.Ribbon.prototype.constructor=THREE.Ribbon; -THREE.LOD=function(){THREE.Object3D.call(this);this.LODs=[]};THREE.LOD.prototype=new THREE.Object3D;THREE.LOD.prototype.constructor=THREE.LOD;THREE.LOD.prototype.supr=THREE.Object3D.prototype;THREE.LOD.prototype.addLevel=function(b,c){c===void 0&&(c=0);for(var c=Math.abs(c),e=0;e1){b=e.matrixWorldInverse;b=-(b.n31*this.position.x+b.n32*this.position.y+b.n33*this.position.z+b.n34);this.LODs[0].object3D.visible=!0;for(var f=1;f=this.LODs[f].visibleAtDistance)this.LODs[f-1].object3D.visible=!1, -this.LODs[f].object3D.visible=!0;else break;for(;fthis.duration||this.time<0){this.direction*=-1;if(this.time>this.duration)this.time=this.duration,this.directionBackwards=!0;if(this.time<0)this.time=0,this.directionBackwards=!1}}else this.time%=this.duration;a=THREE.Math.clamp(Math.floor(this.time/b),0,this.geometry.morphTargets.length-1);if(a!=this.currentKeyframe)this.morphTargetInfluences[this.lastKeyframe]= +0,this.morphTargetInfluences[this.currentKeyframe]=1,this.morphTargetInfluences[a]=0,this.lastKeyframe=this.currentKeyframe,this.currentKeyframe=a;b=this.time%b/b;this.directionBackwards&&(b=1-b);this.morphTargetInfluences[this.currentKeyframe]=b;this.morphTargetInfluences[this.lastKeyframe]=1-b};THREE.Ribbon=function(a,b){THREE.Object3D.call(this);this.geometry=a;this.material=b};THREE.Ribbon.prototype=new THREE.Object3D;THREE.Ribbon.prototype.constructor=THREE.Ribbon; +THREE.LOD=function(){THREE.Object3D.call(this);this.LODs=[]};THREE.LOD.prototype=new THREE.Object3D;THREE.LOD.prototype.constructor=THREE.LOD;THREE.LOD.prototype.supr=THREE.Object3D.prototype;THREE.LOD.prototype.addLevel=function(a,b){b===void 0&&(b=0);for(var b=Math.abs(b),c=0;c1){a=c.matrixWorldInverse;a=-(a.n31*this.position.x+a.n32*this.position.y+a.n33*this.position.z+a.n34);this.LODs[0].object3D.visible=!0;for(var e=1;e=this.LODs[e].visibleAtDistance)this.LODs[e-1].object3D.visible=!1, +this.LODs[e].object3D.visible=!0;else break;for(;e0&&(e(THREE.NormalBlending),c(1),h("rgba("+Math.floor(A.r*255)+","+Math.floor(A.g*255)+","+ -Math.floor(A.b*255)+","+z+")"),v.fillRect(Math.floor(U.getX()),Math.floor(U.getY()),Math.floor(U.getWidth()),Math.floor(U.getHeight()))),U.empty())};this.render=function(b,p){function t(b){var c,e,f,h=b.lights;M.setRGB(0,0,0);na.setRGB(0,0,0);ya.setRGB(0,0,0);b=0;for(c=h.length;b>1,wa=t.height>>1,m=k.scale.x*u,p=k.scale.y*x,o=m*w,n=p*wa,L.set(b.x-o,b.y-n,b.x+o,b.y+n),za.intersects(L)&&(v.save(),v.translate(b.x,b.y),v.rotate(-k.rotation),v.scale(m,-p),v.translate(-w,-wa),v.drawImage(t,0,0),v.restore())}else m instanceof THREE.ParticleCanvasMaterial&&(o=k.scale.x*u,n=k.scale.y*x,L.set(b.x-o,b.y-n,b.x+o,b.y+n),za.intersects(L)&&(f(m.color.getContextStyle()),h(m.color.getContextStyle()),v.save(),v.translate(b.x,b.y),v.rotate(-k.rotation),v.scale(o,n),m.program(v), -v.restore()))}function y(b,h,k,m){c(m.opacity);e(m.blending);v.beginPath();v.moveTo(b.positionScreen.x,b.positionScreen.y);v.lineTo(h.positionScreen.x,h.positionScreen.y);v.closePath();if(m instanceof THREE.LineBasicMaterial){b=m.linewidth;if(G!=b)v.lineWidth=G=b;b=m.linecap;if(I!=b)v.lineCap=I=b;b=m.linejoin;if(P!=b)v.lineJoin=P=b;f(m.color.getContextStyle());v.stroke();L.inflate(m.linewidth*2)}}function A(b,f,h,m,n,t,u,v,wa){k.info.render.vertices+=3;k.info.render.faces++;c(v.opacity);e(v.blending); -J=b.positionScreen.x;$=b.positionScreen.y;Z=f.positionScreen.x;Q=f.positionScreen.y;o=h.positionScreen.x;R=h.positionScreen.y;D(J,$,Z,Q,o,R);if(v instanceof THREE.MeshBasicMaterial)if(v.map)v.map.mapping instanceof THREE.UVMapping&&(qa=u.uvs[0],bb(J,$,Z,Q,o,R,qa[m].u,qa[m].v,qa[n].u,qa[n].v,qa[t].u,qa[t].v,v.map));else if(v.envMap){if(v.envMap.mapping instanceof THREE.SphericalReflectionMapping)b=p.matrixWorldInverse,ka.copy(u.vertexNormalsWorld[0]),ra=(ka.x*b.n11+ka.y*b.n12+ka.z*b.n13)*0.5+0.5,xa= --(ka.x*b.n21+ka.y*b.n22+ka.z*b.n23)*0.5+0.5,ka.copy(u.vertexNormalsWorld[1]),Ca=(ka.x*b.n11+ka.y*b.n12+ka.z*b.n13)*0.5+0.5,Ga=-(ka.x*b.n21+ka.y*b.n22+ka.z*b.n23)*0.5+0.5,ka.copy(u.vertexNormalsWorld[2]),Fa=(ka.x*b.n11+ka.y*b.n12+ka.z*b.n13)*0.5+0.5,Da=-(ka.x*b.n21+ka.y*b.n22+ka.z*b.n23)*0.5+0.5,bb(J,$,Z,Q,o,R,ra,xa,Ca,Ga,Fa,Da,v.envMap)}else v.wireframe?Na(v.color,v.wireframeLinewidth,v.wireframeLinecap,v.wireframeLinejoin):C(v.color);else if(v instanceof THREE.MeshLambertMaterial)v.map&&!v.wireframe&& -(v.map.mapping instanceof THREE.UVMapping&&(qa=u.uvs[0],bb(J,$,Z,Q,o,R,qa[m].u,qa[m].v,qa[n].u,qa[n].v,qa[t].u,qa[t].v,v.map)),e(THREE.SubtractiveBlending)),da?!v.wireframe&&v.shading==THREE.SmoothShading&&u.vertexNormalsWorld.length==3?(T.r=X.r=ia.r=M.r,T.g=X.g=ia.g=M.g,T.b=X.b=ia.b=M.b,w(wa,u.v1.positionWorld,u.vertexNormalsWorld[0],T),w(wa,u.v2.positionWorld,u.vertexNormalsWorld[1],X),w(wa,u.v3.positionWorld,u.vertexNormalsWorld[2],ia),T.r=Math.max(0,Math.min(v.color.r*T.r,1)),T.g=Math.max(0,Math.min(v.color.g* -T.g,1)),T.b=Math.max(0,Math.min(v.color.b*T.b,1)),X.r=Math.max(0,Math.min(v.color.r*X.r,1)),X.g=Math.max(0,Math.min(v.color.g*X.g,1)),X.b=Math.max(0,Math.min(v.color.b*X.b,1)),ia.r=Math.max(0,Math.min(v.color.r*ia.r,1)),ia.g=Math.max(0,Math.min(v.color.g*ia.g,1)),ia.b=Math.max(0,Math.min(v.color.b*ia.b,1)),ja.r=(X.r+ia.r)*0.5,ja.g=(X.g+ia.g)*0.5,ja.b=(X.b+ia.b)*0.5,ua=Ya(T,X,ia,ja),Ua(J,$,Z,Q,o,R,0,0,1,0,0,1,ua)):(pa.r=M.r,pa.g=M.g,pa.b=M.b,w(wa,u.centroidWorld,u.normalWorld,pa),aa.r=Math.max(0,Math.min(v.color.r* -pa.r,1)),aa.g=Math.max(0,Math.min(v.color.g*pa.g,1)),aa.b=Math.max(0,Math.min(v.color.b*pa.b,1)),v.wireframe?Na(aa,v.wireframeLinewidth,v.wireframeLinecap,v.wireframeLinejoin):C(aa)):v.wireframe?Na(v.color,v.wireframeLinewidth,v.wireframeLinecap,v.wireframeLinejoin):C(v.color);else if(v instanceof THREE.MeshDepthMaterial)ma=p.near,ca=p.far,T.r=T.g=T.b=1-Qa(b.positionScreen.z,ma,ca),X.r=X.g=X.b=1-Qa(f.positionScreen.z,ma,ca),ia.r=ia.g=ia.b=1-Qa(h.positionScreen.z,ma,ca),ja.r=(X.r+ia.r)*0.5,ja.g=(X.g+ -ia.g)*0.5,ja.b=(X.b+ia.b)*0.5,ua=Ya(T,X,ia,ja),Ua(J,$,Z,Q,o,R,0,0,1,0,0,1,ua);else if(v instanceof THREE.MeshNormalMaterial)aa.r=Va(u.normalWorld.x),aa.g=Va(u.normalWorld.y),aa.b=Va(u.normalWorld.z),v.wireframe?Na(aa,v.wireframeLinewidth,v.wireframeLinecap,v.wireframeLinejoin):C(aa)}function E(b,f,h,m,n,t,v,u,wa){k.info.render.vertices+=4;k.info.render.faces++;c(u.opacity);e(u.blending);if(u.map||u.envMap)A(b,f,m,0,1,3,v,u,wa),A(n,h,t,1,2,3,v,u,wa);else if(J=b.positionScreen.x,$=b.positionScreen.y, -Z=f.positionScreen.x,Q=f.positionScreen.y,o=h.positionScreen.x,R=h.positionScreen.y,fa=m.positionScreen.x,ea=m.positionScreen.y,ha=n.positionScreen.x,ga=n.positionScreen.y,la=t.positionScreen.x,oa=t.positionScreen.y,u instanceof THREE.MeshBasicMaterial)Za(J,$,Z,Q,o,R,fa,ea),u.wireframe?Na(u.color,u.wireframeLinewidth,u.wireframeLinecap,u.wireframeLinejoin):C(u.color);else if(u instanceof THREE.MeshLambertMaterial)da?!u.wireframe&&u.shading==THREE.SmoothShading&&v.vertexNormalsWorld.length==4?(T.r= -X.r=ia.r=ja.r=M.r,T.g=X.g=ia.g=ja.g=M.g,T.b=X.b=ia.b=ja.b=M.b,w(wa,v.v1.positionWorld,v.vertexNormalsWorld[0],T),w(wa,v.v2.positionWorld,v.vertexNormalsWorld[1],X),w(wa,v.v4.positionWorld,v.vertexNormalsWorld[3],ia),w(wa,v.v3.positionWorld,v.vertexNormalsWorld[2],ja),T.r=Math.max(0,Math.min(u.color.r*T.r,1)),T.g=Math.max(0,Math.min(u.color.g*T.g,1)),T.b=Math.max(0,Math.min(u.color.b*T.b,1)),X.r=Math.max(0,Math.min(u.color.r*X.r,1)),X.g=Math.max(0,Math.min(u.color.g*X.g,1)),X.b=Math.max(0,Math.min(u.color.b* -X.b,1)),ia.r=Math.max(0,Math.min(u.color.r*ia.r,1)),ia.g=Math.max(0,Math.min(u.color.g*ia.g,1)),ia.b=Math.max(0,Math.min(u.color.b*ia.b,1)),ja.r=Math.max(0,Math.min(u.color.r*ja.r,1)),ja.g=Math.max(0,Math.min(u.color.g*ja.g,1)),ja.b=Math.max(0,Math.min(u.color.b*ja.b,1)),ua=Ya(T,X,ia,ja),D(J,$,Z,Q,fa,ea),Ua(J,$,Z,Q,fa,ea,0,0,1,0,0,1,ua),D(ha,ga,o,R,la,oa),Ua(ha,ga,o,R,la,oa,1,0,1,1,0,1,ua)):(pa.r=M.r,pa.g=M.g,pa.b=M.b,w(wa,v.centroidWorld,v.normalWorld,pa),aa.r=Math.max(0,Math.min(u.color.r*pa.r, -1)),aa.g=Math.max(0,Math.min(u.color.g*pa.g,1)),aa.b=Math.max(0,Math.min(u.color.b*pa.b,1)),Za(J,$,Z,Q,o,R,fa,ea),u.wireframe?Na(aa,u.wireframeLinewidth,u.wireframeLinecap,u.wireframeLinejoin):C(aa)):(Za(J,$,Z,Q,o,R,fa,ea),u.wireframe?Na(u.color,u.wireframeLinewidth,u.wireframeLinecap,u.wireframeLinejoin):C(u.color));else if(u instanceof THREE.MeshNormalMaterial)aa.r=Va(v.normalWorld.x),aa.g=Va(v.normalWorld.y),aa.b=Va(v.normalWorld.z),Za(J,$,Z,Q,o,R,fa,ea),u.wireframe?Na(aa,u.wireframeLinewidth, -u.wireframeLinecap,u.wireframeLinejoin):C(aa);else if(u instanceof THREE.MeshDepthMaterial)ma=p.near,ca=p.far,T.r=T.g=T.b=1-Qa(b.positionScreen.z,ma,ca),X.r=X.g=X.b=1-Qa(f.positionScreen.z,ma,ca),ia.r=ia.g=ia.b=1-Qa(m.positionScreen.z,ma,ca),ja.r=ja.g=ja.b=1-Qa(h.positionScreen.z,ma,ca),ua=Ya(T,X,ia,ja),D(J,$,Z,Q,fa,ea),Ua(J,$,Z,Q,fa,ea,0,0,1,0,0,1,ua),D(ha,ga,o,R,la,oa),Ua(ha,ga,o,R,la,oa,1,0,1,1,0,1,ua)}function D(b,c,e,f,h,k){v.beginPath();v.moveTo(b,c);v.lineTo(e,f);v.lineTo(h,k);v.lineTo(b,c); -v.closePath()}function Za(b,c,e,f,h,k,m,o){v.beginPath();v.moveTo(b,c);v.lineTo(e,f);v.lineTo(h,k);v.lineTo(m,o);v.lineTo(b,c);v.closePath()}function Na(b,c,e,h){if(G!=c)v.lineWidth=G=c;if(I!=e)v.lineCap=I=e;if(P!=h)v.lineJoin=P=h;f(b.getContextStyle());v.stroke();L.inflate(c*2)}function C(b){h(b.getContextStyle());v.fill()}function bb(b,c,e,f,k,m,o,n,p,u,t,wa,w){if(w.image.width!=0){if(w.needsUpdate==!0||sa[w.id]==void 0){var x=w.wrapS==THREE.RepeatWrapping,U=w.wrapT==THREE.RepeatWrapping;sa[w.id]= -v.createPattern(w.image,x&&U?"repeat":x&&!U?"repeat-x":!x&&U?"repeat-y":"no-repeat");w.needsUpdate=!1}h(sa[w.id]);var x=w.offset.x/w.repeat.x,U=w.offset.y/w.repeat.y,z=(w.image.width-1)*w.repeat.x,w=(w.image.height-1)*w.repeat.y,o=(o+x)*z,n=(n+U)*w,p=(p+x)*z,u=(u+U)*w,t=(t+x)*z,wa=(wa+U)*w;e-=b;f-=c;k-=b;m-=c;p-=o;u-=n;t-=o;wa-=n;x=1/(p*wa-t*u);w=(wa*e-u*k)*x;u=(wa*f-u*m)*x;e=(p*k-t*e)*x;f=(p*m-t*f)*x;b=b-w*o-e*n;c=c-u*o-f*n;v.save();v.transform(w,u,e,f,b,c);v.fill();v.restore()}}function Ua(b,c, -e,f,h,k,m,o,n,p,u,t,w){var wa,x;wa=w.width-1;x=w.height-1;m*=wa;o*=x;n*=wa;p*=x;u*=wa;t*=x;e-=b;f-=c;h-=b;k-=c;n-=m;p-=o;u-=m;t-=o;x=1/(n*t-u*p);wa=(t*e-p*h)*x;p=(t*f-p*k)*x;e=(n*h-u*e)*x;f=(n*k-u*f)*x;b=b-wa*m-e*o;c=c-p*m-f*o;v.save();v.transform(wa,p,e,f,b,c);v.clip();v.drawImage(w,0,0);v.restore()}function Ya(b,c,e,f){var h=~~(b.r*255),k=~~(b.g*255),b=~~(b.b*255),m=~~(c.r*255),o=~~(c.g*255),c=~~(c.b*255),n=~~(e.r*255),p=~~(e.g*255),e=~~(e.b*255),u=~~(f.r*255),t=~~(f.g*255),f=~~(f.b*255);ta[0]= -h<0?0:h>255?255:h;ta[1]=k<0?0:k>255?255:k;ta[2]=b<0?0:b>255?255:b;ta[4]=m<0?0:m>255?255:m;ta[5]=o<0?0:o>255?255:o;ta[6]=c<0?0:c>255?255:c;ta[8]=n<0?0:n>255?255:n;ta[9]=p<0?0:p>255?255:p;ta[10]=e<0?0:e>255?255:e;ta[12]=u<0?0:u>255?255:u;ta[13]=t<0?0:t>255?255:t;ta[14]=f<0?0:f>255?255:f;Ia.putImageData(Ba,0,0);Ha.drawImage(Ea,0,0);return Ka}function Qa(b,c,e){b=(b-c)/(e-c);return b*b*(3-2*b)}function Va(b){b=(b+1)*0.5;return b<0?0:b>1?1:b}function Oa(b,c){var e=c.x-b.x,f=c.y-b.y,h=e*e+f*f;h!=0&&(h= -1/Math.sqrt(h),e*=h,f*=h,c.x+=e,c.y+=f,b.x-=e,b.y-=f)}var $a,cb,va,Ja,Pa,Wa,ab,Aa;this.autoClear?this.clear():v.setTransform(1,0,0,-1,u,x);k.info.render.vertices=0;k.info.render.faces=0;m=n.projectScene(b,p,this.sortElements);(da=b.lights.length>0)&&t(b);$a=0;for(cb=m.length;$a0&&(e.r+=k.color.r*m,e.g+=k.color.g*m,e.b+=k.color.b*m)):k instanceof THREE.PointLight&&(Y.sub(k.position,c.centroidWorld),Y.normalize(),m=c.normalWorld.dot(Y)*k.intensity,m>0&&(e.r+=k.color.r*m,e.g+=k.color.g*m,e.b+=k.color.b*m))}function c(c,e,m,n,u,t){k.info.render.vertices+=3;k.info.render.faces++;J=f($++); -J.setAttribute("d","M "+c.positionScreen.x+" "+c.positionScreen.y+" L "+e.positionScreen.x+" "+e.positionScreen.y+" L "+m.positionScreen.x+","+m.positionScreen.y+"z");u instanceof THREE.MeshBasicMaterial?G.copy(u.color):u instanceof THREE.MeshLambertMaterial?C?(I.r=P.r,I.g=P.g,I.b=P.b,b(t,n,I),G.r=Math.max(0,Math.min(u.color.r*I.r,1)),G.g=Math.max(0,Math.min(u.color.g*I.g,1)),G.b=Math.max(0,Math.min(u.color.b*I.b,1))):G.copy(u.color):u instanceof THREE.MeshDepthMaterial?(O=1-u.__2near/(u.__farPlusNear- -n.z*u.__farMinusNear),G.setRGB(O,O,O)):u instanceof THREE.MeshNormalMaterial&&G.setRGB(h(n.normalWorld.x),h(n.normalWorld.y),h(n.normalWorld.z));u.wireframe?J.setAttribute("style","fill: none; stroke: "+G.getContextStyle()+"; stroke-width: "+u.wireframeLinewidth+"; stroke-opacity: "+u.opacity+"; stroke-linecap: "+u.wireframeLinecap+"; stroke-linejoin: "+u.wireframeLinejoin):J.setAttribute("style","fill: "+G.getContextStyle()+"; fill-opacity: "+u.opacity);p.appendChild(J)}function e(c,e,m,n,u,t,v){k.info.render.vertices+= -4;k.info.render.faces++;J=f($++);J.setAttribute("d","M "+c.positionScreen.x+" "+c.positionScreen.y+" L "+e.positionScreen.x+" "+e.positionScreen.y+" L "+m.positionScreen.x+","+m.positionScreen.y+" L "+n.positionScreen.x+","+n.positionScreen.y+"z");t instanceof THREE.MeshBasicMaterial?G.copy(t.color):t instanceof THREE.MeshLambertMaterial?C?(I.r=P.r,I.g=P.g,I.b=P.b,b(v,u,I),G.r=Math.max(0,Math.min(t.color.r*I.r,1)),G.g=Math.max(0,Math.min(t.color.g*I.g,1)),G.b=Math.max(0,Math.min(t.color.b*I.b,1))): -G.copy(t.color):t instanceof THREE.MeshDepthMaterial?(O=1-t.__2near/(t.__farPlusNear-u.z*t.__farMinusNear),G.setRGB(O,O,O)):t instanceof THREE.MeshNormalMaterial&&G.setRGB(h(u.normalWorld.x),h(u.normalWorld.y),h(u.normalWorld.z));t.wireframe?J.setAttribute("style","fill: none; stroke: "+G.getContextStyle()+"; stroke-width: "+t.wireframeLinewidth+"; stroke-opacity: "+t.opacity+"; stroke-linecap: "+t.wireframeLinecap+"; stroke-linejoin: "+t.wireframeLinejoin):J.setAttribute("style","fill: "+G.getContextStyle()+ -"; fill-opacity: "+t.opacity);p.appendChild(J)}function f(b){N[b]==null&&(N[b]=document.createElementNS("http://www.w3.org/2000/svg","path"),Q==0&&N[b].setAttribute("shape-rendering","crispEdges"));return N[b]}function h(b){b=(b+1)*0.5;return b<0?0:b>1?1:b}var k=this,m=null,n=new THREE.Projector,p=document.createElementNS("http://www.w3.org/2000/svg","svg"),t,w,u,x,v,A,z,y,D=new THREE.Rectangle,E=new THREE.Rectangle,C=!1,G=new THREE.Color(16777215),I=new THREE.Color(16777215),P=new THREE.Color(0), -K=new THREE.Color(0),B=new THREE.Color(0),O,Y=new THREE.Vector3,N=[],V=[],J,$,Z,Q=1;this.domElement=p;this.sortElements=this.sortObjects=this.autoClear=!0;this.info={render:{vertices:0,faces:0}};this.setQuality=function(b){switch(b){case "high":Q=1;break;case "low":Q=0}};this.setSize=function(b,c){t=b;w=c;u=t/2;x=w/2;p.setAttribute("viewBox",-u+" "+-x+" "+t+" "+w);p.setAttribute("width",t);p.setAttribute("height",w);D.set(-u,-x,u,x)};this.clear=function(){for(;p.childNodes.length>0;)p.removeChild(p.childNodes[0])}; -this.render=function(b,f){var h,t,w,G,N,O,I,T;this.autoClear&&this.clear();k.info.render.vertices=0;k.info.render.faces=0;m=n.projectScene(b,f,this.sortElements);Z=$=0;if(C=b.lights.length>0){I=b.lights;P.setRGB(0,0,0);K.setRGB(0,0,0);B.setRGB(0,0,0);h=0;for(t=I.length;h0&&(c(THREE.NormalBlending),b(1),f("rgba("+Math.floor(y.r*255)+","+Math.floor(y.g*255)+","+ +Math.floor(y.b*255)+","+x+")"),t.fillRect(Math.floor(H.getX()),Math.floor(H.getY()),Math.floor(H.getWidth()),Math.floor(H.getHeight()))),H.empty())};this.render=function(a,n){function o(a){var c,b,e,f=a.lights;Y.setRGB(0,0,0);N.setRGB(0,0,0);na.setRGB(0,0,0);a=0;for(c=f.length;a>1,wa=o.height>>1,h=k.scale.x*p,n=k.scale.y*v,m=h*u,l=n*wa,L.set(a.x-m,a.y-l,a.x+m,a.y+l),xa.intersects(L)&&(t.save(),t.translate(a.x,a.y),t.rotate(-k.rotation),t.scale(h,-n),t.translate(-u,-wa),t.drawImage(o,0,0),t.restore())}else h instanceof THREE.ParticleCanvasMaterial&&(m=k.scale.x*p,l=k.scale.y*v,L.set(a.x-m,a.y-l,a.x+m,a.y+l),xa.intersects(L)&&(e(h.color.getContextStyle()),f(h.color.getContextStyle()),t.save(),t.translate(a.x,a.y),t.rotate(-k.rotation),t.scale(m,l),h.program(t), +t.restore()))}function w(a,f,k,h){b(h.opacity);c(h.blending);t.beginPath();t.moveTo(a.positionScreen.x,a.positionScreen.y);t.lineTo(f.positionScreen.x,f.positionScreen.y);t.closePath();if(h instanceof THREE.LineBasicMaterial){a=h.linewidth;if(C!=a)t.lineWidth=C=a;a=h.linecap;if(E!=a)t.lineCap=E=a;a=h.linejoin;if(G!=a)t.lineJoin=G=a;e(h.color.getContextStyle());t.stroke();L.inflate(h.linewidth*2)}}function y(a,e,f,h,l,o,p,t,v){k.info.render.vertices+=3;k.info.render.faces++;b(t.opacity);c(t.blending); +O=a.positionScreen.x;W=a.positionScreen.y;S=e.positionScreen.x;m=e.positionScreen.y;ca=f.positionScreen.x;Q=f.positionScreen.y;B(O,W,S,m,ca,Q);if(t instanceof THREE.MeshBasicMaterial)if(t.map)t.map.mapping instanceof THREE.UVMapping&&(ma=p.uvs[0],Za(O,W,S,m,ca,Q,ma[h].u,ma[h].v,ma[l].u,ma[l].v,ma[o].u,ma[o].v,t.map));else if(t.envMap){if(t.envMap.mapping instanceof THREE.SphericalReflectionMapping)a=n.matrixWorldInverse,va.copy(p.vertexNormalsWorld[0]),sa=(va.x*a.n11+va.y*a.n12+va.z*a.n13)*0.5+0.5, +Aa=-(va.x*a.n21+va.y*a.n22+va.z*a.n23)*0.5+0.5,va.copy(p.vertexNormalsWorld[1]),Da=(va.x*a.n11+va.y*a.n12+va.z*a.n13)*0.5+0.5,Ca=-(va.x*a.n21+va.y*a.n22+va.z*a.n23)*0.5+0.5,va.copy(p.vertexNormalsWorld[2]),Ba=(va.x*a.n11+va.y*a.n12+va.z*a.n13)*0.5+0.5,Ea=-(va.x*a.n21+va.y*a.n22+va.z*a.n23)*0.5+0.5,Za(O,W,S,m,ca,Q,sa,Aa,Da,Ca,Ba,Ea,t.envMap)}else t.wireframe?La(t.color,t.wireframeLinewidth,t.wireframeLinecap,t.wireframeLinejoin):Ma(t.color);else if(t instanceof THREE.MeshLambertMaterial)t.map&&!t.wireframe&& +(t.map.mapping instanceof THREE.UVMapping&&(ma=p.uvs[0],Za(O,W,S,m,ca,Q,ma[h].u,ma[h].v,ma[l].u,ma[l].v,ma[o].u,ma[o].v,t.map)),c(THREE.SubtractiveBlending)),Z?!t.wireframe&&t.shading==THREE.SmoothShading&&p.vertexNormalsWorld.length==3?(R.r=X.r=aa.r=Y.r,R.g=X.g=aa.g=Y.g,R.b=X.b=aa.b=Y.b,u(v,p.v1.positionWorld,p.vertexNormalsWorld[0],R),u(v,p.v2.positionWorld,p.vertexNormalsWorld[1],X),u(v,p.v3.positionWorld,p.vertexNormalsWorld[2],aa),R.r=Math.max(0,Math.min(t.color.r*R.r,1)),R.g=Math.max(0,Math.min(t.color.g* +R.g,1)),R.b=Math.max(0,Math.min(t.color.b*R.b,1)),X.r=Math.max(0,Math.min(t.color.r*X.r,1)),X.g=Math.max(0,Math.min(t.color.g*X.g,1)),X.b=Math.max(0,Math.min(t.color.b*X.b,1)),aa.r=Math.max(0,Math.min(t.color.r*aa.r,1)),aa.g=Math.max(0,Math.min(t.color.g*aa.g,1)),aa.b=Math.max(0,Math.min(t.color.b*aa.b,1)),ga.r=(X.r+aa.r)*0.5,ga.g=(X.g+aa.g)*0.5,ga.b=(X.b+aa.b)*0.5,qa=Wa(R,X,aa,ga),Ta(O,W,S,m,ca,Q,0,0,1,0,0,1,qa)):(fa.r=Y.r,fa.g=Y.g,fa.b=Y.b,u(v,p.centroidWorld,p.normalWorld,fa),$.r=Math.max(0,Math.min(t.color.r* +fa.r,1)),$.g=Math.max(0,Math.min(t.color.g*fa.g,1)),$.b=Math.max(0,Math.min(t.color.b*fa.b,1)),t.wireframe?La($,t.wireframeLinewidth,t.wireframeLinecap,t.wireframeLinejoin):Ma($)):t.wireframe?La(t.color,t.wireframeLinewidth,t.wireframeLinecap,t.wireframeLinejoin):Ma(t.color);else if(t instanceof THREE.MeshDepthMaterial)oa=n.near,la=n.far,R.r=R.g=R.b=1-Pa(a.positionScreen.z,oa,la),X.r=X.g=X.b=1-Pa(e.positionScreen.z,oa,la),aa.r=aa.g=aa.b=1-Pa(f.positionScreen.z,oa,la),ga.r=(X.r+aa.r)*0.5,ga.g=(X.g+ +aa.g)*0.5,ga.b=(X.b+aa.b)*0.5,qa=Wa(R,X,aa,ga),Ta(O,W,S,m,ca,Q,0,0,1,0,0,1,qa);else if(t instanceof THREE.MeshNormalMaterial)$.r=Ua(p.normalWorld.x),$.g=Ua(p.normalWorld.y),$.b=Ua(p.normalWorld.z),t.wireframe?La($,t.wireframeLinewidth,t.wireframeLinecap,t.wireframeLinejoin):Ma($)}function A(a,e,f,h,l,o,t,p,v){k.info.render.vertices+=4;k.info.render.faces++;b(p.opacity);c(p.blending);if(p.map||p.envMap)y(a,e,h,0,1,3,t,p,v),y(l,f,o,1,2,3,t,p,v);else if(O=a.positionScreen.x,W=a.positionScreen.y,S=e.positionScreen.x, +m=e.positionScreen.y,ca=f.positionScreen.x,Q=f.positionScreen.y,ea=h.positionScreen.x,da=h.positionScreen.y,ka=l.positionScreen.x,ia=l.positionScreen.y,ha=o.positionScreen.x,ja=o.positionScreen.y,p instanceof THREE.MeshBasicMaterial)z(O,W,S,m,ca,Q,ea,da),p.wireframe?La(p.color,p.wireframeLinewidth,p.wireframeLinecap,p.wireframeLinejoin):Ma(p.color);else if(p instanceof THREE.MeshLambertMaterial)Z?!p.wireframe&&p.shading==THREE.SmoothShading&&t.vertexNormalsWorld.length==4?(R.r=X.r=aa.r=ga.r=Y.r,R.g= +X.g=aa.g=ga.g=Y.g,R.b=X.b=aa.b=ga.b=Y.b,u(v,t.v1.positionWorld,t.vertexNormalsWorld[0],R),u(v,t.v2.positionWorld,t.vertexNormalsWorld[1],X),u(v,t.v4.positionWorld,t.vertexNormalsWorld[3],aa),u(v,t.v3.positionWorld,t.vertexNormalsWorld[2],ga),R.r=Math.max(0,Math.min(p.color.r*R.r,1)),R.g=Math.max(0,Math.min(p.color.g*R.g,1)),R.b=Math.max(0,Math.min(p.color.b*R.b,1)),X.r=Math.max(0,Math.min(p.color.r*X.r,1)),X.g=Math.max(0,Math.min(p.color.g*X.g,1)),X.b=Math.max(0,Math.min(p.color.b*X.b,1)),aa.r=Math.max(0, +Math.min(p.color.r*aa.r,1)),aa.g=Math.max(0,Math.min(p.color.g*aa.g,1)),aa.b=Math.max(0,Math.min(p.color.b*aa.b,1)),ga.r=Math.max(0,Math.min(p.color.r*ga.r,1)),ga.g=Math.max(0,Math.min(p.color.g*ga.g,1)),ga.b=Math.max(0,Math.min(p.color.b*ga.b,1)),qa=Wa(R,X,aa,ga),B(O,W,S,m,ea,da),Ta(O,W,S,m,ea,da,0,0,1,0,0,1,qa),B(ka,ia,ca,Q,ha,ja),Ta(ka,ia,ca,Q,ha,ja,1,0,1,1,0,1,qa)):(fa.r=Y.r,fa.g=Y.g,fa.b=Y.b,u(v,t.centroidWorld,t.normalWorld,fa),$.r=Math.max(0,Math.min(p.color.r*fa.r,1)),$.g=Math.max(0,Math.min(p.color.g* +fa.g,1)),$.b=Math.max(0,Math.min(p.color.b*fa.b,1)),z(O,W,S,m,ca,Q,ea,da),p.wireframe?La($,p.wireframeLinewidth,p.wireframeLinecap,p.wireframeLinejoin):Ma($)):(z(O,W,S,m,ca,Q,ea,da),p.wireframe?La(p.color,p.wireframeLinewidth,p.wireframeLinecap,p.wireframeLinejoin):Ma(p.color));else if(p instanceof THREE.MeshNormalMaterial)$.r=Ua(t.normalWorld.x),$.g=Ua(t.normalWorld.y),$.b=Ua(t.normalWorld.z),z(O,W,S,m,ca,Q,ea,da),p.wireframe?La($,p.wireframeLinewidth,p.wireframeLinecap,p.wireframeLinejoin):Ma($); +else if(p instanceof THREE.MeshDepthMaterial)oa=n.near,la=n.far,R.r=R.g=R.b=1-Pa(a.positionScreen.z,oa,la),X.r=X.g=X.b=1-Pa(e.positionScreen.z,oa,la),aa.r=aa.g=aa.b=1-Pa(h.positionScreen.z,oa,la),ga.r=ga.g=ga.b=1-Pa(f.positionScreen.z,oa,la),qa=Wa(R,X,aa,ga),B(O,W,S,m,ea,da),Ta(O,W,S,m,ea,da,0,0,1,0,0,1,qa),B(ka,ia,ca,Q,ha,ja),Ta(ka,ia,ca,Q,ha,ja,1,0,1,1,0,1,qa)}function B(a,c,b,e,f,k){t.beginPath();t.moveTo(a,c);t.lineTo(b,e);t.lineTo(f,k);t.lineTo(a,c);t.closePath()}function z(a,c,b,e,f,k,h,m){t.beginPath(); +t.moveTo(a,c);t.lineTo(b,e);t.lineTo(f,k);t.lineTo(h,m);t.lineTo(a,c);t.closePath()}function La(a,c,b,f){if(C!=c)t.lineWidth=C=c;if(E!=b)t.lineCap=E=b;if(G!=f)t.lineJoin=G=f;e(a.getContextStyle());t.stroke();L.inflate(c*2)}function Ma(a){f(a.getContextStyle());t.fill()}function Za(a,c,b,e,k,h,m,l,n,p,o,u,v){if(v.image.width!=0){if(v.needsUpdate==!0||ra[v.id]==void 0){var wa=v.wrapS==THREE.RepeatWrapping,H=v.wrapT==THREE.RepeatWrapping;ra[v.id]=t.createPattern(v.image,wa&&H?"repeat":wa&&!H?"repeat-x": +!wa&&H?"repeat-y":"no-repeat");v.needsUpdate=!1}f(ra[v.id]);var wa=v.offset.x/v.repeat.x,H=v.offset.y/v.repeat.y,x=(v.image.width-1)*v.repeat.x,v=(v.image.height-1)*v.repeat.y,m=(m+wa)*x,l=(l+H)*v,n=(n+wa)*x,p=(p+H)*v,o=(o+wa)*x,u=(u+H)*v;b-=a;e-=c;k-=a;h-=c;n-=m;p-=l;o-=m;u-=l;wa=1/(n*u-o*p);v=(u*b-p*k)*wa;p=(u*e-p*h)*wa;b=(n*k-o*b)*wa;e=(n*h-o*e)*wa;a=a-v*m-b*l;c=c-p*m-e*l;t.save();t.transform(v,p,b,e,a,c);t.fill();t.restore()}}function Ta(a,c,b,e,f,k,h,m,l,n,p,o,v){var u,wa;u=v.width-1;wa=v.height- +1;h*=u;m*=wa;l*=u;n*=wa;p*=u;o*=wa;b-=a;e-=c;f-=a;k-=c;l-=h;n-=m;p-=h;o-=m;wa=1/(l*o-p*n);u=(o*b-n*f)*wa;n=(o*e-n*k)*wa;b=(l*f-p*b)*wa;e=(l*k-p*e)*wa;a=a-u*h-b*m;c=c-n*h-e*m;t.save();t.transform(u,n,b,e,a,c);t.clip();t.drawImage(v,0,0);t.restore()}function Wa(a,c,b,e){var f=~~(a.r*255),k=~~(a.g*255),a=~~(a.b*255),h=~~(c.r*255),m=~~(c.g*255),c=~~(c.b*255),l=~~(b.r*255),n=~~(b.g*255),b=~~(b.b*255),p=~~(e.r*255),o=~~(e.g*255),e=~~(e.b*255);ta[0]=f<0?0:f>255?255:f;ta[1]=k<0?0:k>255?255:k;ta[2]=a<0?0: +a>255?255:a;ta[4]=h<0?0:h>255?255:h;ta[5]=m<0?0:m>255?255:m;ta[6]=c<0?0:c>255?255:c;ta[8]=l<0?0:l>255?255:l;ta[9]=n<0?0:n>255?255:n;ta[10]=b<0?0:b>255?255:b;ta[12]=p<0?0:p>255?255:p;ta[13]=o<0?0:o>255?255:o;ta[14]=e<0?0:e>255?255:e;Fa.putImageData(ya,0,0);U.drawImage(pa,0,0);return Ga}function Pa(a,c,b){a=(a-c)/(b-c);return a*a*(3-2*a)}function Ua(a){a=(a+1)*0.5;return a<0?0:a>1?1:a}function Na(a,c){var b=c.x-a.x,e=c.y-a.y,f=b*b+e*e;f!=0&&(f=1/Math.sqrt(f),b*=f,e*=f,c.x+=b,c.y+=e,a.x-=b,a.y-=e)}var Xa, +$a,ua,Ha,Oa,Va,Ya,za;this.autoClear?this.clear():t.setTransform(1,0,0,-1,p,v);k.info.render.vertices=0;k.info.render.faces=0;h=l.projectScene(a,n,this.sortElements);(Z=a.lights.length>0)&&o(a);Xa=0;for($a=h.length;Xa<$a;Xa++){ua=h[Xa];L.empty();if(ua instanceof THREE.RenderableParticle){F=ua;F.x*=p;F.y*=v;Ha=0;for(Oa=ua.materials.length;Ha0&&(b.r+=k.color.r*h,b.g+=k.color.g*h,b.b+=k.color.b*h)):k instanceof THREE.PointLight&&(V.sub(k.position,c.centroidWorld),V.normalize(),h=c.normalWorld.dot(V)*k.intensity,h>0&&(b.r+=k.color.r*h,b.g+=k.color.g*h,b.b+=k.color.b*h))}function b(c,b,h,m,l,p){k.info.render.vertices+=3;k.info.render.faces++;O=e(W++); +O.setAttribute("d","M "+c.positionScreen.x+" "+c.positionScreen.y+" L "+b.positionScreen.x+" "+b.positionScreen.y+" L "+h.positionScreen.x+","+h.positionScreen.y+"z");l instanceof THREE.MeshBasicMaterial?C.copy(l.color):l instanceof THREE.MeshLambertMaterial?z?(E.r=G.r,E.g=G.g,E.b=G.b,a(p,m,E),C.r=Math.max(0,Math.min(l.color.r*E.r,1)),C.g=Math.max(0,Math.min(l.color.g*E.g,1)),C.b=Math.max(0,Math.min(l.color.b*E.b,1))):C.copy(l.color):l instanceof THREE.MeshDepthMaterial?(M=1-l.__2near/(l.__farPlusNear- +m.z*l.__farMinusNear),C.setRGB(M,M,M)):l instanceof THREE.MeshNormalMaterial&&C.setRGB(f(m.normalWorld.x),f(m.normalWorld.y),f(m.normalWorld.z));l.wireframe?O.setAttribute("style","fill: none; stroke: "+C.getContextStyle()+"; stroke-width: "+l.wireframeLinewidth+"; stroke-opacity: "+l.opacity+"; stroke-linecap: "+l.wireframeLinecap+"; stroke-linejoin: "+l.wireframeLinejoin):O.setAttribute("style","fill: "+C.getContextStyle()+"; fill-opacity: "+l.opacity);n.appendChild(O)}function c(c,b,h,m,l,p,o){k.info.render.vertices+= +4;k.info.render.faces++;O=e(W++);O.setAttribute("d","M "+c.positionScreen.x+" "+c.positionScreen.y+" L "+b.positionScreen.x+" "+b.positionScreen.y+" L "+h.positionScreen.x+","+h.positionScreen.y+" L "+m.positionScreen.x+","+m.positionScreen.y+"z");p instanceof THREE.MeshBasicMaterial?C.copy(p.color):p instanceof THREE.MeshLambertMaterial?z?(E.r=G.r,E.g=G.g,E.b=G.b,a(o,l,E),C.r=Math.max(0,Math.min(p.color.r*E.r,1)),C.g=Math.max(0,Math.min(p.color.g*E.g,1)),C.b=Math.max(0,Math.min(p.color.b*E.b,1))): +C.copy(p.color):p instanceof THREE.MeshDepthMaterial?(M=1-p.__2near/(p.__farPlusNear-l.z*p.__farMinusNear),C.setRGB(M,M,M)):p instanceof THREE.MeshNormalMaterial&&C.setRGB(f(l.normalWorld.x),f(l.normalWorld.y),f(l.normalWorld.z));p.wireframe?O.setAttribute("style","fill: none; stroke: "+C.getContextStyle()+"; stroke-width: "+p.wireframeLinewidth+"; stroke-opacity: "+p.opacity+"; stroke-linecap: "+p.wireframeLinecap+"; stroke-linejoin: "+p.wireframeLinejoin):O.setAttribute("style","fill: "+C.getContextStyle()+ +"; fill-opacity: "+p.opacity);n.appendChild(O)}function e(a){J[a]==null&&(J[a]=document.createElementNS("http://www.w3.org/2000/svg","path"),m==0&&J[a].setAttribute("shape-rendering","crispEdges"));return J[a]}function f(a){a=(a+1)*0.5;return a<0?0:a>1?1:a}var k=this,h=null,l=new THREE.Projector,n=document.createElementNS("http://www.w3.org/2000/svg","svg"),o,u,p,v,t,y,x,w,B=new THREE.Rectangle,A=new THREE.Rectangle,z=!1,C=new THREE.Color(16777215),E=new THREE.Color(16777215),G=new THREE.Color(0), +F=new THREE.Color(0),I=new THREE.Color(0),M,V=new THREE.Vector3,J=[],T=[],O,W,S,m=1;this.domElement=n;this.sortElements=this.sortObjects=this.autoClear=!0;this.info={render:{vertices:0,faces:0}};this.setQuality=function(a){switch(a){case "high":m=1;break;case "low":m=0}};this.setSize=function(a,c){o=a;u=c;p=o/2;v=u/2;n.setAttribute("viewBox",-p+" "+-v+" "+o+" "+u);n.setAttribute("width",o);n.setAttribute("height",u);B.set(-p,-v,p,v)};this.clear=function(){for(;n.childNodes.length>0;)n.removeChild(n.childNodes[0])}; +this.render=function(a,e){var f,o,u,C,M,J,E,R;this.autoClear&&this.clear();k.info.render.vertices=0;k.info.render.faces=0;h=l.projectScene(a,e,this.sortElements);S=W=0;if(z=a.lights.length>0){E=a.lights;G.setRGB(0,0,0);F.setRGB(0,0,0);I.setRGB(0,0,0);f=0;for(o=E.length;f= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0 ) {\n#ifdef SHADOWMAP_SOFT\nfloat shadow = 0.0;\nfor ( float y = -1.25; y <= 1.25; y += 1.25 )\nfor ( float x = -1.25; x <= 1.25; x += 1.25 ) {\nvec4 rgbaDepth = texture2D( shadowMap[ i ], vec2( x * xPixelOffset, y * yPixelOffset ) + shadowCoord.xy );\nfloat fDepth = unpackDepth( rgbaDepth );\nif ( fDepth < shadowCoord.z )\nshadow += 1.0;\n}\nshadow /= 9.0;\nshadowColor = shadowColor * vec3( ( 1.0 - shadowDarkness * shadow ) );\n#else\nvec4 rgbaDepth = texture2D( shadowMap[ i ], shadowCoord.xy );\nfloat fDepth = unpackDepth( rgbaDepth );\nif ( fDepth < shadowCoord.z )\nshadowColor = shadowColor * vec3( shadowDarkness );\n#endif\n}\n}\n#ifdef GAMMA_OUTPUT\nshadowColor *= shadowColor;\n#endif\ngl_FragColor.xyz = gl_FragColor.xyz * shadowColor;\n#endif", shadowmap_pars_vertex:"#ifdef USE_SHADOWMAP\nvarying vec4 vShadowCoord[ MAX_SHADOWS ];\nuniform mat4 shadowMatrix[ MAX_SHADOWS ];\n#endif",shadowmap_vertex:"#ifdef USE_SHADOWMAP\nfor( int i = 0; i < MAX_SHADOWS; i ++ ) {\nvShadowCoord[ i ] = shadowMatrix[ i ] * objectMatrix * vec4( position, 1.0 );\n}\n#endif",alphatest_fragment:"#ifdef ALPHATEST\nif ( gl_FragColor.a < ALPHATEST ) discard;\n#endif",linear_to_gamma_fragment:"#ifdef GAMMA_OUTPUT\ngl_FragColor.xyz = sqrt( gl_FragColor.xyz );\n#endif"}; -THREE.UniformsUtils={merge:function(b){var c,e,f,h={};for(c=0;c=0)c&&(o.bindBuffer(o.ARRAY_BUFFER,h.__webglVertexBuffer),o.vertexAttribPointer(b.position,3,o.FLOAT,!1,0,0));else if(m.morphTargetBase){f=k.program.attributes;m.morphTargetBase!==-1?(o.bindBuffer(o.ARRAY_BUFFER,h.__webglMorphTargetsBuffers[m.morphTargetBase]),o.vertexAttribPointer(f.position,3,o.FLOAT,!1,0,0)):f.position>=0&&(o.bindBuffer(o.ARRAY_BUFFER,h.__webglVertexBuffer),o.vertexAttribPointer(f.position, -3,o.FLOAT,!1,0,0));if(m.morphTargetForcedOrder.length){n=0;var t=m.morphTargetForcedOrder;for(p=m.morphTargetInfluences;nu&&(v=w,u=p[v]);o.bindBuffer(o.ARRAY_BUFFER,h.__webglMorphTargetsBuffers[v]);o.vertexAttribPointer(f["morphTarget"+n],3,o.FLOAT,!1,0,0);m.__webglMorphTargetInfluences[n]=u;t[v]=1;u=-1;n++}}k.program.uniforms.morphTargetInfluences!==null&&o.uniform1fv(k.program.uniforms.morphTargetInfluences,m.__webglMorphTargetInfluences)}if(c){if(h.__webglCustomAttributesList){n=0;for(p=h.__webglCustomAttributesList.length;n=0&&(o.bindBuffer(o.ARRAY_BUFFER, -f.buffer),o.vertexAttribPointer(b[f.buffer.belongsToAttribute],f.size,o.FLOAT,!1,0,0))}b.color>=0&&(o.bindBuffer(o.ARRAY_BUFFER,h.__webglColorBuffer),o.vertexAttribPointer(b.color,3,o.FLOAT,!1,0,0));b.normal>=0&&(o.bindBuffer(o.ARRAY_BUFFER,h.__webglNormalBuffer),o.vertexAttribPointer(b.normal,3,o.FLOAT,!1,0,0));b.tangent>=0&&(o.bindBuffer(o.ARRAY_BUFFER,h.__webglTangentBuffer),o.vertexAttribPointer(b.tangent,4,o.FLOAT,!1,0,0));b.uv>=0&&(h.__webglUVBuffer?(o.bindBuffer(o.ARRAY_BUFFER,h.__webglUVBuffer), -o.vertexAttribPointer(b.uv,2,o.FLOAT,!1,0,0),o.enableVertexAttribArray(b.uv)):o.disableVertexAttribArray(b.uv));b.uv2>=0&&(h.__webglUV2Buffer?(o.bindBuffer(o.ARRAY_BUFFER,h.__webglUV2Buffer),o.vertexAttribPointer(b.uv2,2,o.FLOAT,!1,0,0),o.enableVertexAttribArray(b.uv2)):o.disableVertexAttribArray(b.uv2));k.skinning&&b.skinVertexA>=0&&b.skinVertexB>=0&&b.skinIndex>=0&&b.skinWeight>=0&&(o.bindBuffer(o.ARRAY_BUFFER,h.__webglSkinVertexABuffer),o.vertexAttribPointer(b.skinVertexA,4,o.FLOAT,!1,0,0),o.bindBuffer(o.ARRAY_BUFFER, -h.__webglSkinVertexBBuffer),o.vertexAttribPointer(b.skinVertexB,4,o.FLOAT,!1,0,0),o.bindBuffer(o.ARRAY_BUFFER,h.__webglSkinIndicesBuffer),o.vertexAttribPointer(b.skinIndex,4,o.FLOAT,!1,0,0),o.bindBuffer(o.ARRAY_BUFFER,h.__webglSkinWeightsBuffer),o.vertexAttribPointer(b.skinWeight,4,o.FLOAT,!1,0,0))}m instanceof THREE.Mesh?(k.wireframe?(o.lineWidth(k.wireframeLinewidth),c&&o.bindBuffer(o.ELEMENT_ARRAY_BUFFER,h.__webglLineBuffer),o.drawElements(o.LINES,h.__webglLineCount,o.UNSIGNED_SHORT,0)):(c&&o.bindBuffer(o.ELEMENT_ARRAY_BUFFER, -h.__webglFaceBuffer),o.drawElements(o.TRIANGLES,h.__webglFaceCount,o.UNSIGNED_SHORT,0)),Q.info.render.calls++,Q.info.render.vertices+=h.__webglFaceCount,Q.info.render.faces+=h.__webglFaceCount/3):m instanceof THREE.Line?(m=m.type==THREE.LineStrip?o.LINE_STRIP:o.LINES,o.lineWidth(k.linewidth),o.drawArrays(m,0,h.__webglLineCount),Q.info.render.calls++):m instanceof THREE.ParticleSystem?(o.drawArrays(o.POINTS,0,h.__webglParticleCount),Q.info.render.calls++):m instanceof THREE.Ribbon&&(o.drawArrays(o.TRIANGLE_STRIP, -0,h.__webglVertexCount),Q.info.render.calls++)}}function h(b,c,e){if(!b.__webglVertexBuffer)b.__webglVertexBuffer=o.createBuffer();if(!b.__webglNormalBuffer)b.__webglNormalBuffer=o.createBuffer();b.hasPos&&(o.bindBuffer(o.ARRAY_BUFFER,b.__webglVertexBuffer),o.bufferData(o.ARRAY_BUFFER,b.positionArray,o.DYNAMIC_DRAW),o.enableVertexAttribArray(c.attributes.position),o.vertexAttribPointer(c.attributes.position,3,o.FLOAT,!1,0,0));if(b.hasNormal){o.bindBuffer(o.ARRAY_BUFFER,b.__webglNormalBuffer);if(e== -THREE.FlatShading){var f,h,k,m,n,p,t,u,v,w,x=b.count*3;for(w=0;w=0;e--)b[e].object==c&&b.splice(e,1)}function I(b){function c(b){var h=[];e=0;for(f=b.length;e65535&&(t[o].counter+=1,p=t[o].hash+"_"+t[o].counter,b.geometryGroups[p]==void 0&&(b.geometryGroups[p]={faces:[], -materials:n,vertices:0,numMorphTargets:u})),b.geometryGroups[p].faces.push(h),b.geometryGroups[p].vertices+=m;b.geometryGroupsList=[];for(var v in b.geometryGroups)b.geometryGroups[v].id=la++,b.geometryGroupsList.push(b.geometryGroups[v])}function P(b,c,e){b.push({buffer:c,object:e,opaque:{list:[],count:0},transparent:{list:[],count:0}})}function K(b){if(b!=T){switch(b){case THREE.AdditiveBlending:o.blendEquation(o.FUNC_ADD);o.blendFunc(o.SRC_ALPHA,o.ONE);break;case THREE.SubtractiveBlending:o.blendEquation(o.FUNC_ADD); -o.blendFunc(o.ZERO,o.ONE_MINUS_SRC_COLOR);break;case THREE.MultiplyBlending:o.blendEquation(o.FUNC_ADD);o.blendFunc(o.ZERO,o.SRC_COLOR);break;default:o.blendEquationSeparate(o.FUNC_ADD,o.FUNC_ADD),o.blendFuncSeparate(o.SRC_ALPHA,o.ONE_MINUS_SRC_ALPHA,o.ONE,o.ONE_MINUS_SRC_ALPHA)}T=b}}function B(b,c,e){(e.width&e.width-1)==0&&(e.height&e.height-1)==0?(o.texParameteri(b,o.TEXTURE_WRAP_S,Z(c.wrapS)),o.texParameteri(b,o.TEXTURE_WRAP_T,Z(c.wrapT)),o.texParameteri(b,o.TEXTURE_MAG_FILTER,Z(c.magFilter)), -o.texParameteri(b,o.TEXTURE_MIN_FILTER,Z(c.minFilter)),o.generateMipmap(b)):(o.texParameteri(b,o.TEXTURE_WRAP_S,o.CLAMP_TO_EDGE),o.texParameteri(b,o.TEXTURE_WRAP_T,o.CLAMP_TO_EDGE),o.texParameteri(b,o.TEXTURE_MAG_FILTER,$(c.magFilter)),o.texParameteri(b,o.TEXTURE_MIN_FILTER,$(c.minFilter)))}function O(b,c){if(b.needsUpdate){if(!b.__webglInit)b.__webglInit=!0,b.__webglTexture=o.createTexture(),Q.info.memory.textures++;o.activeTexture(o.TEXTURE0+c);o.bindTexture(o.TEXTURE_2D,b.__webglTexture);b instanceof -THREE.DataTexture?o.texImage2D(o.TEXTURE_2D,0,Z(b.format),b.image.width,b.image.height,0,Z(b.format),o.UNSIGNED_BYTE,b.image.data):o.texImage2D(o.TEXTURE_2D,0,o.RGBA,o.RGBA,o.UNSIGNED_BYTE,b.image);B(o.TEXTURE_2D,b,b.image);b.needsUpdate=!1}else o.activeTexture(o.TEXTURE0+c),o.bindTexture(o.TEXTURE_2D,b.__webglTexture)}function Y(b,c){o.bindRenderbuffer(o.RENDERBUFFER,b);c.depthBuffer&&!c.stencilBuffer?(o.renderbufferStorage(o.RENDERBUFFER,o.DEPTH_COMPONENT16,c.width,c.height),o.framebufferRenderbuffer(o.FRAMEBUFFER, -o.DEPTH_ATTACHMENT,o.RENDERBUFFER,b)):c.depthBuffer&&c.stencilBuffer?(o.renderbufferStorage(o.RENDERBUFFER,o.DEPTH_STENCIL,c.width,c.height),o.framebufferRenderbuffer(o.FRAMEBUFFER,o.DEPTH_STENCIL_ATTACHMENT,o.RENDERBUFFER,b)):o.renderbufferStorage(o.RENDERBUFFER,o.RGBA4,c.width,c.height)}function N(b){var c=b instanceof THREE.WebGLRenderTargetCube;if(b&&!b.__webglFramebuffer){if(b.depthBuffer===void 0)b.depthBuffer=!0;if(b.stencilBuffer===void 0)b.stencilBuffer=!0;b.__webglTexture=o.createTexture(); -if(c){b.__webglFramebuffer=[];b.__webglRenderbuffer=[];o.bindTexture(o.TEXTURE_CUBE_MAP,b.__webglTexture);B(o.TEXTURE_CUBE_MAP,b,b);for(var e=0;e<6;e++){b.__webglFramebuffer[e]=o.createFramebuffer();b.__webglRenderbuffer[e]=o.createRenderbuffer();o.texImage2D(o.TEXTURE_CUBE_MAP_POSITIVE_X+e,0,Z(b.format),b.width,b.height,0,Z(b.format),Z(b.type),null);var f=b,h=o.TEXTURE_CUBE_MAP_POSITIVE_X+e;o.bindFramebuffer(o.FRAMEBUFFER,b.__webglFramebuffer[e]);o.framebufferTexture2D(o.FRAMEBUFFER,o.COLOR_ATTACHMENT0, -h,f.__webglTexture,0);Y(b.__webglRenderbuffer[e],b)}}else b.__webglFramebuffer=o.createFramebuffer(),b.__webglRenderbuffer=o.createRenderbuffer(),o.bindTexture(o.TEXTURE_2D,b.__webglTexture),B(o.TEXTURE_2D,b,b),o.texImage2D(o.TEXTURE_2D,0,Z(b.format),b.width,b.height,0,Z(b.format),Z(b.type),null),e=o.TEXTURE_2D,o.bindFramebuffer(o.FRAMEBUFFER,b.__webglFramebuffer),o.framebufferTexture2D(o.FRAMEBUFFER,o.COLOR_ATTACHMENT0,e,b.__webglTexture,0),o.bindRenderbuffer(o.RENDERBUFFER,b.__webglRenderbuffer), -Y(b.__webglRenderbuffer,b);c?o.bindTexture(o.TEXTURE_CUBE_MAP,null):o.bindTexture(o.TEXTURE_2D,null);o.bindRenderbuffer(o.RENDERBUFFER,null);o.bindFramebuffer(o.FRAMEBUFFER,null)}b?(c=c?b.__webglFramebuffer[b.activeCubeFace]:b.__webglFramebuffer,e=b.width,b=b.height,h=f=0):(c=null,e=qa,b=ra,f=ca,h=ua);c!=ea&&(o.bindFramebuffer(o.FRAMEBUFFER,c),o.viewport(f,h,e,b),ea=c)}function V(b){b instanceof THREE.WebGLRenderTargetCube?(o.bindTexture(o.TEXTURE_CUBE_MAP,b.__webglTexture),o.generateMipmap(o.TEXTURE_CUBE_MAP), -o.bindTexture(o.TEXTURE_CUBE_MAP,null)):(o.bindTexture(o.TEXTURE_2D,b.__webglTexture),o.generateMipmap(o.TEXTURE_2D),o.bindTexture(o.TEXTURE_2D,null))}function J(b,c){var e;b=="fragment"?e=o.createShader(o.FRAGMENT_SHADER):b=="vertex"&&(e=o.createShader(o.VERTEX_SHADER));o.shaderSource(e,c);o.compileShader(e);if(!o.getShaderParameter(e,o.COMPILE_STATUS))return console.error(o.getShaderInfoLog(e)),console.error(c),null;return e}function $(b){switch(b){case THREE.NearestFilter:case THREE.NearestMipMapNearestFilter:case THREE.NearestMipMapLinearFilter:return o.NEAREST; -default:return o.LINEAR}}function Z(b){switch(b){case THREE.RepeatWrapping:return o.REPEAT;case THREE.ClampToEdgeWrapping:return o.CLAMP_TO_EDGE;case THREE.MirroredRepeatWrapping:return o.MIRRORED_REPEAT;case THREE.NearestFilter:return o.NEAREST;case THREE.NearestMipMapNearestFilter:return o.NEAREST_MIPMAP_NEAREST;case THREE.NearestMipMapLinearFilter:return o.NEAREST_MIPMAP_LINEAR;case THREE.LinearFilter:return o.LINEAR;case THREE.LinearMipMapNearestFilter:return o.LINEAR_MIPMAP_NEAREST;case THREE.LinearMipMapLinearFilter:return o.LINEAR_MIPMAP_LINEAR; -case THREE.ByteType:return o.BYTE;case THREE.UnsignedByteType:return o.UNSIGNED_BYTE;case THREE.ShortType:return o.SHORT;case THREE.UnsignedShortType:return o.UNSIGNED_SHORT;case THREE.IntType:return o.INT;case THREE.UnsignedShortType:return o.UNSIGNED_INT;case THREE.FloatType:return o.FLOAT;case THREE.AlphaFormat:return o.ALPHA;case THREE.RGBFormat:return o.RGB;case THREE.RGBAFormat:return o.RGBA;case THREE.LuminanceFormat:return o.LUMINANCE;case THREE.LuminanceAlphaFormat:return o.LUMINANCE_ALPHA}return 0} -var Q=this,o,R=[],fa=null,ea=null,ha=-1,ga=null,la=0,oa=null,aa=null,T=null,X=null,ia=null,ja=null,sa=null,ma=null,ca=0,ua=0,qa=0,ra=0,xa=[new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4],Ca=new THREE.Matrix4,Ga=new Float32Array(16),Fa=new Float32Array(16),Da=new THREE.Vector4,za={ambient:[0,0,0],directional:{length:0,colors:[],positions:[]},point:{length:0,colors:[],positions:[],distances:[]}},b=b||{},U=b.canvas!==void 0?b.canvas:document.createElement("canvas"), -L=b.stencil!==void 0?b.stencil:!0,da=b.preserveDrawingBuffer!==void 0?b.preserveDrawingBuffer:!1,pa=b.antialias!==void 0?b.antialias:!1,M=b.clearColor!==void 0?new THREE.Color(b.clearColor):new THREE.Color(0),na=b.clearAlpha!==void 0?b.clearAlpha:0,ya=b.maxLights!==void 0?b.maxLights:4;this.info={memory:{programs:0,geometries:0,textures:0},render:{calls:0,vertices:0,faces:0}};this.maxMorphTargets=8;this.domElement=U;this.sortObjects=this.autoClearStencil=this.autoClearDepth=this.autoClearColor=this.autoClear= -!0;this.physicallyBasedShading=this.gammaOutput=this.gammaInput=!1;this.shadowMapBias=0.0039;this.shadowMapDarkness=0.5;this.shadowMapHeight=this.shadowMapWidth=512;this.shadowCameraNear=1;this.shadowCameraFar=5E3;this.shadowCameraFov=50;this.shadowMap=[];this.shadowMapEnabled=!1;this.shadowMapSoft=this.shadowMapAutoUpdate=!0;var ka,Ea=[],b=THREE.ShaderLib.depthRGBA,Ia=THREE.UniformsUtils.clone(b.uniforms),Ba=new THREE.ShaderMaterial({fragmentShader:b.fragmentShader,vertexShader:b.vertexShader,uniforms:Ia}), -ta=new THREE.ShaderMaterial({fragmentShader:b.fragmentShader,vertexShader:b.vertexShader,uniforms:Ia,morphTargets:!0});Ba._shadowPass=!0;ta._shadowPass=!0;try{if(!(o=U.getContext("experimental-webgl",{antialias:pa,stencil:L,preserveDrawingBuffer:da})))throw"Error creating WebGL context.";console.log(navigator.userAgent+" | "+o.getParameter(o.VERSION)+" | "+o.getParameter(o.VENDOR)+" | "+o.getParameter(o.RENDERER)+" | "+o.getParameter(o.SHADING_LANGUAGE_VERSION))}catch(Ka){console.error(Ka)}o.clearColor(0, -0,0,1);o.clearDepth(1);o.clearStencil(0);o.enable(o.DEPTH_TEST);o.depthFunc(o.LEQUAL);o.frontFace(o.CCW);o.cullFace(o.BACK);o.enable(o.CULL_FACE);o.enable(o.BLEND);o.blendEquation(o.FUNC_ADD);o.blendFunc(o.SRC_ALPHA,o.ONE_MINUS_SRC_ALPHA);o.clearColor(M.r,M.g,M.b,na);this.context=o;var Ha=o.getParameter(o.MAX_VERTEX_TEXTURE_IMAGE_UNITS)>0,W={};W.vertices=new Float32Array(16);W.faces=new Uint16Array(6);L=0;W.vertices[L++]=-1;W.vertices[L++]=-1;W.vertices[L++]=0;W.vertices[L++]=1;W.vertices[L++]=1; -W.vertices[L++]=-1;W.vertices[L++]=1;W.vertices[L++]=1;W.vertices[L++]=1;W.vertices[L++]=1;W.vertices[L++]=1;W.vertices[L++]=0;W.vertices[L++]=-1;W.vertices[L++]=1;W.vertices[L++]=0;L=W.vertices[L++]=0;W.faces[L++]=0;W.faces[L++]=1;W.faces[L++]=2;W.faces[L++]=0;W.faces[L++]=2;W.faces[L++]=3;W.vertexBuffer=o.createBuffer();W.elementBuffer=o.createBuffer();o.bindBuffer(o.ARRAY_BUFFER,W.vertexBuffer);o.bufferData(o.ARRAY_BUFFER,W.vertices,o.STATIC_DRAW);o.bindBuffer(o.ELEMENT_ARRAY_BUFFER,W.elementBuffer); -o.bufferData(o.ELEMENT_ARRAY_BUFFER,W.faces,o.STATIC_DRAW);W.program=o.createProgram();o.attachShader(W.program,J("fragment",THREE.ShaderLib.sprite.fragmentShader));o.attachShader(W.program,J("vertex",THREE.ShaderLib.sprite.vertexShader));o.linkProgram(W.program);W.attributes={};W.uniforms={};W.attributes.position=o.getAttribLocation(W.program,"position");W.attributes.uv=o.getAttribLocation(W.program,"uv");W.uniforms.uvOffset=o.getUniformLocation(W.program,"uvOffset");W.uniforms.uvScale=o.getUniformLocation(W.program, -"uvScale");W.uniforms.rotation=o.getUniformLocation(W.program,"rotation");W.uniforms.scale=o.getUniformLocation(W.program,"scale");W.uniforms.alignment=o.getUniformLocation(W.program,"alignment");W.uniforms.color=o.getUniformLocation(W.program,"color");W.uniforms.map=o.getUniformLocation(W.program,"map");W.uniforms.opacity=o.getUniformLocation(W.program,"opacity");W.uniforms.useScreenCoordinates=o.getUniformLocation(W.program,"useScreenCoordinates");W.uniforms.affectedByDistance=o.getUniformLocation(W.program, -"affectedByDistance");W.uniforms.screenPosition=o.getUniformLocation(W.program,"screenPosition");W.uniforms.modelViewMatrix=o.getUniformLocation(W.program,"modelViewMatrix");W.uniforms.projectionMatrix=o.getUniformLocation(W.program,"projectionMatrix");var Xa=!1;this.setSize=function(b,c){U.width=b;U.height=c;this.setViewport(0,0,U.width,U.height)};this.setViewport=function(b,c,e,f){ca=b;ua=c;qa=e;ra=f;o.viewport(ca,ua,qa,ra)};this.setScissor=function(b,c,e,f){o.scissor(b,c,e,f)};this.enableScissorTest= -function(b){b?o.enable(o.SCISSOR_TEST):o.disable(o.SCISSOR_TEST)};this.setClearColorHex=function(b,c){M.setHex(b);na=c;o.clearColor(M.r,M.g,M.b,na)};this.setClearColor=function(b,c){M.copy(b);na=c;o.clearColor(M.r,M.g,M.b,na)};this.getClearColor=function(){return M};this.getClearAlpha=function(){return na};this.clear=function(b,c,e){var f=0;if(b==void 0||b)f|=o.COLOR_BUFFER_BIT;if(c==void 0||c)f|=o.DEPTH_BUFFER_BIT;if(e==void 0||e)f|=o.STENCIL_BUFFER_BIT;o.clear(f)};this.getContext=function(){return o}; -this.deallocateObject=function(b){if(b.__webglInit)if(b.__webglInit=!1,delete b._modelViewMatrix,delete b._normalMatrixArray,delete b._modelViewMatrixArray,delete b._objectMatrixArray,b instanceof THREE.Mesh)for(g in b.geometry.geometryGroups){var c=b.geometry.geometryGroups[g];o.deleteBuffer(c.__webglVertexBuffer);o.deleteBuffer(c.__webglNormalBuffer);o.deleteBuffer(c.__webglTangentBuffer);o.deleteBuffer(c.__webglColorBuffer);o.deleteBuffer(c.__webglUVBuffer);o.deleteBuffer(c.__webglUV2Buffer);o.deleteBuffer(c.__webglSkinVertexABuffer); -o.deleteBuffer(c.__webglSkinVertexBBuffer);o.deleteBuffer(c.__webglSkinIndicesBuffer);o.deleteBuffer(c.__webglSkinWeightsBuffer);o.deleteBuffer(c.__webglFaceBuffer);o.deleteBuffer(c.__webglLineBuffer);if(c.numMorphTargets)for(var e=0,f=c.numMorphTargets;e=0&&o.enableVertexAttribArray(x.position);x.color>=0&&o.enableVertexAttribArray(x.color);x.normal>=0&&o.enableVertexAttribArray(x.normal); -x.tangent>=0&&o.enableVertexAttribArray(x.tangent);b.skinning&&x.skinVertexA>=0&&x.skinVertexB>=0&&x.skinIndex>=0&&x.skinWeight>=0&&(o.enableVertexAttribArray(x.skinVertexA),o.enableVertexAttribArray(x.skinVertexB),o.enableVertexAttribArray(x.skinIndex),o.enableVertexAttribArray(x.skinWeight));if(b.attributes)for(k in b.attributes)x[k]!==void 0&&x[k]>=0&&o.enableVertexAttribArray(x[k]);if(b.morphTargets)for(k=b.numSupportedMorphTargets=0;k=0&&(o.enableVertexAttribArray(x[z]), -b.numSupportedMorphTargets++);b.uniformsList=[];for(h in b.uniforms)b.uniformsList.push([b.uniforms[h],h])};this.clearTarget=function(b,c,e,f){N(b);this.clear(c,e,f)};this.updateShadowMap=function(b,c){z(b,c)};this.render=function(b,c,u,U){var L,da,E,C,G,pa,B,ma,I=b.lights,ca=b.fog;ha=-1;this.shadowMapEnabled&&this.shadowMapAutoUpdate&&z(b,c);Q.info.render.calls=0;Q.info.render.vertices=0;Q.info.render.faces=0;if(c.matrixAutoUpdate){for(G=c;G.parent;)G=G.parent;G.update(void 0,!0)}b.update(void 0, -!1,c);c.matrixWorldInverse.flattenToArray(Fa);c.projectionMatrix.flattenToArray(Ga);Ca.multiply(c.projectionMatrix,c.matrixWorldInverse);t(Ca);this.initWebGLObjects(b);N(u);(this.autoClear||U)&&this.clear(this.autoClearColor,this.autoClearDepth,this.autoClearStencil);G=b.__webglObjects.length;for(U=0;U=0;U--)if(L=b.__webglObjects[U],L.render){B=L.object;ma=L.buffer;E=L.opaque;k(B);for(L=0;L0||x.faceVertexUvs.length> -0)m.__uvArray=new Float32Array(p*2);if(x.faceUvs.length>1||x.faceVertexUvs.length>1)m.__uv2Array=new Float32Array(p*2)}if(n.geometry.skinWeights.length&&n.geometry.skinIndices.length)m.__skinVertexAArray=new Float32Array(p*4),m.__skinVertexBArray=new Float32Array(p*4),m.__skinIndexArray=new Float32Array(p*4),m.__skinWeightArray=new Float32Array(p*4);m.__faceArray=new Uint16Array(z*3+(n.geometry.edgeFaces?n.geometry.edgeFaces.length*6:0));m.__lineArray=new Uint16Array(U*2);if(m.numMorphTargets){m.__morphTargetsArrays= -[];x=0;for(y=m.numMorphTargets;x=0;k--)f[k]==h&&f.splice(k,1)}else(e instanceof THREE.MarchingCubes||e.immediateRenderCallback)&&G(f.__webglObjectsImmediate,e);e.__webglActive=!1;b.__objectsRemoved.splice(0,1)}e=0;for(f=b.__webglObjects.length;e0&&(o.bindBuffer(o.ARRAY_BUFFER,t.__webglColorBuffer),o.bufferData(o.ARRAY_BUFFER,ea,z));Ga&&(o.bindBuffer(o.ARRAY_BUFFER,t.__webglNormalBuffer),o.bufferData(o.ARRAY_BUFFER,ga,z));Da&&ta.hasTangents&&(o.bindBuffer(o.ARRAY_BUFFER, -t.__webglTangentBuffer),o.bufferData(o.ARRAY_BUFFER,ha,z));Ha&&ua>0&&(o.bindBuffer(o.ARRAY_BUFFER,t.__webglUVBuffer),o.bufferData(o.ARRAY_BUFFER,ia,z));Ha&&qa>0&&(o.bindBuffer(o.ARRAY_BUFFER,t.__webglUV2Buffer),o.bufferData(o.ARRAY_BUFFER,Ea,z));Ca&&(o.bindBuffer(o.ELEMENT_ARRAY_BUFFER,t.__webglFaceBuffer),o.bufferData(o.ELEMENT_ARRAY_BUFFER,Ba,z),o.bindBuffer(o.ELEMENT_ARRAY_BUFFER,t.__webglLineBuffer),o.bufferData(o.ELEMENT_ARRAY_BUFFER,sa,z));S>0&&(o.bindBuffer(o.ARRAY_BUFFER,t.__webglSkinVertexABuffer), -o.bufferData(o.ARRAY_BUFFER,ja,z),o.bindBuffer(o.ARRAY_BUFFER,t.__webglSkinVertexBBuffer),o.bufferData(o.ARRAY_BUFFER,ra,z),o.bindBuffer(o.ARRAY_BUFFER,t.__webglSkinIndicesBuffer),o.bufferData(o.ARRAY_BUFFER,aa,z),o.bindBuffer(o.ARRAY_BUFFER,t.__webglSkinWeightsBuffer),o.bufferData(o.ARRAY_BUFFER,fa,z));U&&(delete t.__inittedArrays,delete t.__colorArray,delete t.__normalArray,delete t.__tangentArray,delete t.__uvArray,delete t.__uv2Array,delete t.__faceArray,delete t.__vertexArray,delete t.__lineArray, -delete t.__skinVertexAArray,delete t.__skinVertexBArray,delete t.__skinIndexArray,delete t.__skinWeightArray)}h.__dirtyVertices=!1;h.__dirtyMorphTargets=!1;h.__dirtyElements=!1;h.__dirtyUvs=!1;h.__dirtyNormals=!1;h.__dirtyTangents=!1;h.__dirtyColors=!1;C(m)}else if(k instanceof THREE.Ribbon){h=k.geometry;if(h.__dirtyVertices||h.__dirtyColors){k=h;m=o.DYNAMIC_DRAW;n=x=U=U=void 0;u=k.vertices;p=k.colors;v=u.length;t=p.length;y=k.__vertexArray;z=k.__colorArray;L=k.__dirtyColors;if(k.__dirtyVertices){for(U= -0;U=0)b&&(m.bindBuffer(m.ARRAY_BUFFER,f.__webglVertexBuffer),m.vertexAttribPointer(a.position,3,m.FLOAT,!1,0,0));else if(h.morphTargetBase){e=k.program.attributes;h.morphTargetBase!==-1?(m.bindBuffer(m.ARRAY_BUFFER,f.__webglMorphTargetsBuffers[h.morphTargetBase]),m.vertexAttribPointer(e.position,3,m.FLOAT,!1,0,0)):e.position>=0&&(m.bindBuffer(m.ARRAY_BUFFER,f.__webglVertexBuffer),m.vertexAttribPointer(e.position,3,m.FLOAT,!1,0,0));if(h.morphTargetForcedOrder.length){l= +0;var p=h.morphTargetForcedOrder;for(n=h.morphTargetInfluences;lo&&(t=v,o=n[t]);m.bindBuffer(m.ARRAY_BUFFER, +f.__webglMorphTargetsBuffers[t]);m.vertexAttribPointer(e["morphTarget"+l],3,m.FLOAT,!1,0,0);h.__webglMorphTargetInfluences[l]=o;p[t]=1;o=-1;l++}}k.program.uniforms.morphTargetInfluences!==null&&m.uniform1fv(k.program.uniforms.morphTargetInfluences,h.__webglMorphTargetInfluences)}if(b){if(f.__webglCustomAttributesList){l=0;for(n=f.__webglCustomAttributesList.length;l=0&&(m.bindBuffer(m.ARRAY_BUFFER,e.buffer),m.vertexAttribPointer(a[e.buffer.belongsToAttribute], +e.size,m.FLOAT,!1,0,0))}a.color>=0&&(m.bindBuffer(m.ARRAY_BUFFER,f.__webglColorBuffer),m.vertexAttribPointer(a.color,3,m.FLOAT,!1,0,0));a.normal>=0&&(m.bindBuffer(m.ARRAY_BUFFER,f.__webglNormalBuffer),m.vertexAttribPointer(a.normal,3,m.FLOAT,!1,0,0));a.tangent>=0&&(m.bindBuffer(m.ARRAY_BUFFER,f.__webglTangentBuffer),m.vertexAttribPointer(a.tangent,4,m.FLOAT,!1,0,0));a.uv>=0&&(f.__webglUVBuffer?(m.bindBuffer(m.ARRAY_BUFFER,f.__webglUVBuffer),m.vertexAttribPointer(a.uv,2,m.FLOAT,!1,0,0),m.enableVertexAttribArray(a.uv)): +m.disableVertexAttribArray(a.uv));a.uv2>=0&&(f.__webglUV2Buffer?(m.bindBuffer(m.ARRAY_BUFFER,f.__webglUV2Buffer),m.vertexAttribPointer(a.uv2,2,m.FLOAT,!1,0,0),m.enableVertexAttribArray(a.uv2)):m.disableVertexAttribArray(a.uv2));k.skinning&&a.skinVertexA>=0&&a.skinVertexB>=0&&a.skinIndex>=0&&a.skinWeight>=0&&(m.bindBuffer(m.ARRAY_BUFFER,f.__webglSkinVertexABuffer),m.vertexAttribPointer(a.skinVertexA,4,m.FLOAT,!1,0,0),m.bindBuffer(m.ARRAY_BUFFER,f.__webglSkinVertexBBuffer),m.vertexAttribPointer(a.skinVertexB, +4,m.FLOAT,!1,0,0),m.bindBuffer(m.ARRAY_BUFFER,f.__webglSkinIndicesBuffer),m.vertexAttribPointer(a.skinIndex,4,m.FLOAT,!1,0,0),m.bindBuffer(m.ARRAY_BUFFER,f.__webglSkinWeightsBuffer),m.vertexAttribPointer(a.skinWeight,4,m.FLOAT,!1,0,0))}h instanceof THREE.Mesh?(k.wireframe?(m.lineWidth(k.wireframeLinewidth),b&&m.bindBuffer(m.ELEMENT_ARRAY_BUFFER,f.__webglLineBuffer),m.drawElements(m.LINES,f.__webglLineCount,m.UNSIGNED_SHORT,0)):(b&&m.bindBuffer(m.ELEMENT_ARRAY_BUFFER,f.__webglFaceBuffer),m.drawElements(m.TRIANGLES, +f.__webglFaceCount,m.UNSIGNED_SHORT,0)),S.info.render.calls++,S.info.render.vertices+=f.__webglFaceCount,S.info.render.faces+=f.__webglFaceCount/3):h instanceof THREE.Line?(h=h.type==THREE.LineStrip?m.LINE_STRIP:m.LINES,m.lineWidth(k.linewidth),m.drawArrays(h,0,f.__webglLineCount),S.info.render.calls++):h instanceof THREE.ParticleSystem?(m.drawArrays(m.POINTS,0,f.__webglParticleCount),S.info.render.calls++):h instanceof THREE.Ribbon&&(m.drawArrays(m.TRIANGLE_STRIP,0,f.__webglVertexCount),S.info.render.calls++)}} +function f(a,c,b){if(!a.__webglVertexBuffer)a.__webglVertexBuffer=m.createBuffer();if(!a.__webglNormalBuffer)a.__webglNormalBuffer=m.createBuffer();a.hasPos&&(m.bindBuffer(m.ARRAY_BUFFER,a.__webglVertexBuffer),m.bufferData(m.ARRAY_BUFFER,a.positionArray,m.DYNAMIC_DRAW),m.enableVertexAttribArray(c.attributes.position),m.vertexAttribPointer(c.attributes.position,3,m.FLOAT,!1,0,0));if(a.hasNormal){m.bindBuffer(m.ARRAY_BUFFER,a.__webglNormalBuffer);if(b==THREE.FlatShading){var e,f,k,h,l,n,p,o,t,v,u=a.count* +3;for(v=0;v=0&&(c=c.geometry.materials[materialIndex],c.transparent?p(a,c):p(f,c))):(c=b)&&(c.transparent?p(a, +c):p(f,c))}function y(a,c){return c.z-a.z}function x(a){var b,l,n,p=0,t,v,H,w,x=a.lights;na||(na=new THREE.PerspectiveCamera(S.shadowCameraFov,S.shadowMapWidth/S.shadowMapHeight,S.shadowCameraNear,S.shadowCameraFar));b=0;for(l=x.length;b=0?c.geometry.materials[a.materialIndex]:c.material;if(b.attributes)for(var e in b.attributes)if(b.attributes[e].needsUpdate)return!0; +return!1}function z(a,c){var b=a.materialIndex>=0?c.geometry.materials[a.materialIndex]:c.material;if(b.attributes)for(var e in b.attributes)b.attributes[e].needsUpdate=!1}function C(a,c){var b;for(b=a.length-1;b>=0;b--)a[b].object==c&&a.splice(b,1)}function E(a,c,b){a.push({buffer:c,object:b,opaque:{list:[],count:0},transparent:{list:[],count:0}})}function G(a){if(a!=$){switch(a){case THREE.AdditiveBlending:m.blendEquation(m.FUNC_ADD);m.blendFunc(m.SRC_ALPHA,m.ONE);break;case THREE.SubtractiveBlending:m.blendEquation(m.FUNC_ADD); +m.blendFunc(m.ZERO,m.ONE_MINUS_SRC_COLOR);break;case THREE.MultiplyBlending:m.blendEquation(m.FUNC_ADD);m.blendFunc(m.ZERO,m.SRC_COLOR);break;default:m.blendEquationSeparate(m.FUNC_ADD,m.FUNC_ADD),m.blendFuncSeparate(m.SRC_ALPHA,m.ONE_MINUS_SRC_ALPHA,m.ONE,m.ONE_MINUS_SRC_ALPHA)}$=a}}function F(a,c,b){(b.width&b.width-1)==0&&(b.height&b.height-1)==0?(m.texParameteri(a,m.TEXTURE_WRAP_S,W(c.wrapS)),m.texParameteri(a,m.TEXTURE_WRAP_T,W(c.wrapT)),m.texParameteri(a,m.TEXTURE_MAG_FILTER,W(c.magFilter)), +m.texParameteri(a,m.TEXTURE_MIN_FILTER,W(c.minFilter)),m.generateMipmap(a)):(m.texParameteri(a,m.TEXTURE_WRAP_S,m.CLAMP_TO_EDGE),m.texParameteri(a,m.TEXTURE_WRAP_T,m.CLAMP_TO_EDGE),m.texParameteri(a,m.TEXTURE_MAG_FILTER,O(c.magFilter)),m.texParameteri(a,m.TEXTURE_MIN_FILTER,O(c.minFilter)))}function I(a,c){if(a.needsUpdate){if(!a.__webglInit)a.__webglInit=!0,a.__webglTexture=m.createTexture(),S.info.memory.textures++;m.activeTexture(m.TEXTURE0+c);m.bindTexture(m.TEXTURE_2D,a.__webglTexture);a instanceof +THREE.DataTexture?m.texImage2D(m.TEXTURE_2D,0,W(a.format),a.image.width,a.image.height,0,W(a.format),m.UNSIGNED_BYTE,a.image.data):m.texImage2D(m.TEXTURE_2D,0,m.RGBA,m.RGBA,m.UNSIGNED_BYTE,a.image);F(m.TEXTURE_2D,a,a.image);a.needsUpdate=!1}else m.activeTexture(m.TEXTURE0+c),m.bindTexture(m.TEXTURE_2D,a.__webglTexture)}function M(a,c){m.bindRenderbuffer(m.RENDERBUFFER,a);c.depthBuffer&&!c.stencilBuffer?(m.renderbufferStorage(m.RENDERBUFFER,m.DEPTH_COMPONENT16,c.width,c.height),m.framebufferRenderbuffer(m.FRAMEBUFFER, +m.DEPTH_ATTACHMENT,m.RENDERBUFFER,a)):c.depthBuffer&&c.stencilBuffer?(m.renderbufferStorage(m.RENDERBUFFER,m.DEPTH_STENCIL,c.width,c.height),m.framebufferRenderbuffer(m.FRAMEBUFFER,m.DEPTH_STENCIL_ATTACHMENT,m.RENDERBUFFER,a)):m.renderbufferStorage(m.RENDERBUFFER,m.RGBA4,c.width,c.height)}function V(a){var c=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=m.createTexture(); +if(c){a.__webglFramebuffer=[];a.__webglRenderbuffer=[];m.bindTexture(m.TEXTURE_CUBE_MAP,a.__webglTexture);F(m.TEXTURE_CUBE_MAP,a,a);for(var b=0;b<6;b++){a.__webglFramebuffer[b]=m.createFramebuffer();a.__webglRenderbuffer[b]=m.createRenderbuffer();m.texImage2D(m.TEXTURE_CUBE_MAP_POSITIVE_X+b,0,W(a.format),a.width,a.height,0,W(a.format),W(a.type),null);var e=a,f=m.TEXTURE_CUBE_MAP_POSITIVE_X+b;m.bindFramebuffer(m.FRAMEBUFFER,a.__webglFramebuffer[b]);m.framebufferTexture2D(m.FRAMEBUFFER,m.COLOR_ATTACHMENT0, +f,e.__webglTexture,0);M(a.__webglRenderbuffer[b],a)}}else a.__webglFramebuffer=m.createFramebuffer(),a.__webglRenderbuffer=m.createRenderbuffer(),m.bindTexture(m.TEXTURE_2D,a.__webglTexture),F(m.TEXTURE_2D,a,a),m.texImage2D(m.TEXTURE_2D,0,W(a.format),a.width,a.height,0,W(a.format),W(a.type),null),b=m.TEXTURE_2D,m.bindFramebuffer(m.FRAMEBUFFER,a.__webglFramebuffer),m.framebufferTexture2D(m.FRAMEBUFFER,m.COLOR_ATTACHMENT0,b,a.__webglTexture,0),m.bindRenderbuffer(m.RENDERBUFFER,a.__webglRenderbuffer), +M(a.__webglRenderbuffer,a);c?m.bindTexture(m.TEXTURE_CUBE_MAP,null):m.bindTexture(m.TEXTURE_2D,null);m.bindRenderbuffer(m.RENDERBUFFER,null);m.bindFramebuffer(m.FRAMEBUFFER,null)}a?(c=c?a.__webglFramebuffer[a.activeCubeFace]:a.__webglFramebuffer,b=a.width,a=a.height,f=e=0):(c=null,b=qa,a=ma,e=oa,f=la);c!=ea&&(m.bindFramebuffer(m.FRAMEBUFFER,c),m.viewport(e,f,b,a),ea=c)}function J(a){a instanceof THREE.WebGLRenderTargetCube?(m.bindTexture(m.TEXTURE_CUBE_MAP,a.__webglTexture),m.generateMipmap(m.TEXTURE_CUBE_MAP), +m.bindTexture(m.TEXTURE_CUBE_MAP,null)):(m.bindTexture(m.TEXTURE_2D,a.__webglTexture),m.generateMipmap(m.TEXTURE_2D),m.bindTexture(m.TEXTURE_2D,null))}function T(a,c){var b;a=="fragment"?b=m.createShader(m.FRAGMENT_SHADER):a=="vertex"&&(b=m.createShader(m.VERTEX_SHADER));m.shaderSource(b,c);m.compileShader(b);if(!m.getShaderParameter(b,m.COMPILE_STATUS))return console.error(m.getShaderInfoLog(b)),console.error(c),null;return b}function O(a){switch(a){case THREE.NearestFilter:case THREE.NearestMipMapNearestFilter:case THREE.NearestMipMapLinearFilter:return m.NEAREST; +default:return m.LINEAR}}function W(a){switch(a){case THREE.RepeatWrapping:return m.REPEAT;case THREE.ClampToEdgeWrapping:return m.CLAMP_TO_EDGE;case THREE.MirroredRepeatWrapping:return m.MIRRORED_REPEAT;case THREE.NearestFilter:return m.NEAREST;case THREE.NearestMipMapNearestFilter:return m.NEAREST_MIPMAP_NEAREST;case THREE.NearestMipMapLinearFilter:return m.NEAREST_MIPMAP_LINEAR;case THREE.LinearFilter:return m.LINEAR;case THREE.LinearMipMapNearestFilter:return m.LINEAR_MIPMAP_NEAREST;case THREE.LinearMipMapLinearFilter:return m.LINEAR_MIPMAP_LINEAR; +case THREE.ByteType:return m.BYTE;case THREE.UnsignedByteType:return m.UNSIGNED_BYTE;case THREE.ShortType:return m.SHORT;case THREE.UnsignedShortType:return m.UNSIGNED_SHORT;case THREE.IntType:return m.INT;case THREE.UnsignedShortType:return m.UNSIGNED_INT;case THREE.FloatType:return m.FLOAT;case THREE.AlphaFormat:return m.ALPHA;case THREE.RGBFormat:return m.RGB;case THREE.RGBAFormat:return m.RGBA;case THREE.LuminanceFormat:return m.LUMINANCE;case THREE.LuminanceAlphaFormat:return m.LUMINANCE_ALPHA}return 0} +var S=this,m,ca=[],Q=null,ea=null,da=-1,ka=null,ia=0,ha=null,ja=null,$=null,R=null,X=null,aa=null,ga=null,ra=null,oa=0,la=0,qa=0,ma=0,sa=[new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4],Aa=new THREE.Matrix4,Da=new Float32Array(16),Ca=new Float32Array(16),Ba=new THREE.Vector4,Ea={ambient:[0,0,0],directional:{length:0,colors:[],positions:[]},point:{length:0,colors:[],positions:[],distances:[]}},a=a||{},xa=a.canvas!==void 0?a.canvas:document.createElement("canvas"), +H=a.stencil!==void 0?a.stencil:!0,L=a.preserveDrawingBuffer!==void 0?a.preserveDrawingBuffer:!1,Z=a.antialias!==void 0?a.antialias:!1,fa=a.clearColor!==void 0?new THREE.Color(a.clearColor):new THREE.Color(0),Y=a.clearAlpha!==void 0?a.clearAlpha:0,N=a.maxLights!==void 0?a.maxLights:4;this.info={memory:{programs:0,geometries:0,textures:0},render:{calls:0,vertices:0,faces:0}};this.maxMorphTargets=8;this.domElement=xa;this.sortObjects=this.autoClearStencil=this.autoClearDepth=this.autoClearColor=this.autoClear= +!0;this.physicallyBasedShading=this.gammaOutput=this.gammaInput=!1;this.shadowMapBias=0.0039;this.shadowMapDarkness=0.5;this.shadowMapHeight=this.shadowMapWidth=512;this.shadowCameraNear=1;this.shadowCameraFar=5E3;this.shadowCameraFov=50;this.shadowMap=[];this.shadowMapEnabled=!1;this.shadowMapSoft=this.shadowMapAutoUpdate=!0;var na,va=[],a=THREE.ShaderLib.depthRGBA,pa=THREE.UniformsUtils.clone(a.uniforms),Fa=new THREE.ShaderMaterial({fragmentShader:a.fragmentShader,vertexShader:a.vertexShader,uniforms:pa}), +ya=new THREE.ShaderMaterial({fragmentShader:a.fragmentShader,vertexShader:a.vertexShader,uniforms:pa,morphTargets:!0});Fa._shadowPass=!0;ya._shadowPass=!0;try{if(!(m=xa.getContext("experimental-webgl",{antialias:Z,stencil:H,preserveDrawingBuffer:L})))throw"Error creating WebGL context.";console.log(navigator.userAgent+" | "+m.getParameter(m.VERSION)+" | "+m.getParameter(m.VENDOR)+" | "+m.getParameter(m.RENDERER)+" | "+m.getParameter(m.SHADING_LANGUAGE_VERSION))}catch(ta){console.error(ta)}m.clearColor(0, +0,0,1);m.clearDepth(1);m.clearStencil(0);m.enable(m.DEPTH_TEST);m.depthFunc(m.LEQUAL);m.frontFace(m.CCW);m.cullFace(m.BACK);m.enable(m.CULL_FACE);m.enable(m.BLEND);m.blendEquation(m.FUNC_ADD);m.blendFunc(m.SRC_ALPHA,m.ONE_MINUS_SRC_ALPHA);m.clearColor(fa.r,fa.g,fa.b,Y);this.context=m;var Ga=m.getParameter(m.MAX_VERTEX_TEXTURE_IMAGE_UNITS)>0,U={};U.vertices=new Float32Array(16);U.faces=new Uint16Array(6);H=0;U.vertices[H++]=-1;U.vertices[H++]=-1;U.vertices[H++]=0;U.vertices[H++]=1;U.vertices[H++]= +1;U.vertices[H++]=-1;U.vertices[H++]=1;U.vertices[H++]=1;U.vertices[H++]=1;U.vertices[H++]=1;U.vertices[H++]=1;U.vertices[H++]=0;U.vertices[H++]=-1;U.vertices[H++]=1;U.vertices[H++]=0;H=U.vertices[H++]=0;U.faces[H++]=0;U.faces[H++]=1;U.faces[H++]=2;U.faces[H++]=0;U.faces[H++]=2;U.faces[H++]=3;U.vertexBuffer=m.createBuffer();U.elementBuffer=m.createBuffer();m.bindBuffer(m.ARRAY_BUFFER,U.vertexBuffer);m.bufferData(m.ARRAY_BUFFER,U.vertices,m.STATIC_DRAW);m.bindBuffer(m.ELEMENT_ARRAY_BUFFER,U.elementBuffer); +m.bufferData(m.ELEMENT_ARRAY_BUFFER,U.faces,m.STATIC_DRAW);U.program=m.createProgram();m.attachShader(U.program,T("fragment",THREE.ShaderLib.sprite.fragmentShader));m.attachShader(U.program,T("vertex",THREE.ShaderLib.sprite.vertexShader));m.linkProgram(U.program);U.attributes={};U.uniforms={};U.attributes.position=m.getAttribLocation(U.program,"position");U.attributes.uv=m.getAttribLocation(U.program,"uv");U.uniforms.uvOffset=m.getUniformLocation(U.program,"uvOffset");U.uniforms.uvScale=m.getUniformLocation(U.program, +"uvScale");U.uniforms.rotation=m.getUniformLocation(U.program,"rotation");U.uniforms.scale=m.getUniformLocation(U.program,"scale");U.uniforms.alignment=m.getUniformLocation(U.program,"alignment");U.uniforms.color=m.getUniformLocation(U.program,"color");U.uniforms.map=m.getUniformLocation(U.program,"map");U.uniforms.opacity=m.getUniformLocation(U.program,"opacity");U.uniforms.useScreenCoordinates=m.getUniformLocation(U.program,"useScreenCoordinates");U.uniforms.affectedByDistance=m.getUniformLocation(U.program, +"affectedByDistance");U.uniforms.screenPosition=m.getUniformLocation(U.program,"screenPosition");U.uniforms.modelViewMatrix=m.getUniformLocation(U.program,"modelViewMatrix");U.uniforms.projectionMatrix=m.getUniformLocation(U.program,"projectionMatrix");var Ia=!1;this.setSize=function(a,c){xa.width=a;xa.height=c;this.setViewport(0,0,xa.width,xa.height)};this.setViewport=function(a,c,b,e){oa=a;la=c;qa=b;ma=e;m.viewport(oa,la,qa,ma)};this.setScissor=function(a,c,b,e){m.scissor(a,c,b,e)};this.enableScissorTest= +function(a){a?m.enable(m.SCISSOR_TEST):m.disable(m.SCISSOR_TEST)};this.setClearColorHex=function(a,c){fa.setHex(a);Y=c;m.clearColor(fa.r,fa.g,fa.b,Y)};this.setClearColor=function(a,c){fa.copy(a);Y=c;m.clearColor(fa.r,fa.g,fa.b,Y)};this.getClearColor=function(){return fa};this.getClearAlpha=function(){return Y};this.clear=function(a,c,b){var e=0;if(a==void 0||a)e|=m.COLOR_BUFFER_BIT;if(c==void 0||c)e|=m.DEPTH_BUFFER_BIT;if(b==void 0||b)e|=m.STENCIL_BUFFER_BIT;m.clear(e)};this.getContext=function(){return m}; +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(g in a.geometry.geometryGroups){var c=a.geometry.geometryGroups[g];m.deleteBuffer(c.__webglVertexBuffer);m.deleteBuffer(c.__webglNormalBuffer);m.deleteBuffer(c.__webglTangentBuffer);m.deleteBuffer(c.__webglColorBuffer);m.deleteBuffer(c.__webglUVBuffer);m.deleteBuffer(c.__webglUV2Buffer);m.deleteBuffer(c.__webglSkinVertexABuffer); +m.deleteBuffer(c.__webglSkinVertexBBuffer);m.deleteBuffer(c.__webglSkinIndicesBuffer);m.deleteBuffer(c.__webglSkinWeightsBuffer);m.deleteBuffer(c.__webglFaceBuffer);m.deleteBuffer(c.__webglLineBuffer);if(c.numMorphTargets)for(var b=0,e=c.numMorphTargets;b=0&&m.enableVertexAttribArray(u.position);u.color>=0&&m.enableVertexAttribArray(u.color);u.normal>=0&&m.enableVertexAttribArray(u.normal); +u.tangent>=0&&m.enableVertexAttribArray(u.tangent);a.skinning&&u.skinVertexA>=0&&u.skinVertexB>=0&&u.skinIndex>=0&&u.skinWeight>=0&&(m.enableVertexAttribArray(u.skinVertexA),m.enableVertexAttribArray(u.skinVertexB),m.enableVertexAttribArray(u.skinIndex),m.enableVertexAttribArray(u.skinWeight));if(a.attributes)for(k in a.attributes)u[k]!==void 0&&u[k]>=0&&m.enableVertexAttribArray(u[k]);if(a.morphTargets)for(k=a.numSupportedMorphTargets=0;k=0&&(m.enableVertexAttribArray(u[H]), +a.numSupportedMorphTargets++);a.uniformsList=[];for(f in a.uniforms)a.uniformsList.push([a.uniforms[f],f])};this.clearTarget=function(a,c,b,e){V(a);this.clear(c,b,e)};this.updateShadowMap=function(a,c){x(a,c)};this.render=function(a,b,p,H){var Z,L,A,z,C,fa,E,I,oa=a.lights,M=a.fog;da=-1;this.shadowMapEnabled&&this.shadowMapAutoUpdate&&x(a,b);S.info.render.calls=0;S.info.render.vertices=0;S.info.render.faces=0;if(b.matrixAutoUpdate){for(C=b;C.parent;)C=C.parent;C.update(void 0,!0)}a.update(void 0,!1, +b);b.matrixWorldInverse.flattenToArray(Ca);b.projectionMatrix.flattenToArray(Da);Aa.multiply(b.projectionMatrix,b.matrixWorldInverse);o(Aa);this.initWebGLObjects(a);V(p);(this.autoClear||H)&&this.clear(this.autoClearColor,this.autoClearDepth,this.autoClearStencil);C=a.__webglObjects.length;for(H=0;H=0;H--)if(Z=a.__webglObjects[H],Z.render){E=Z.object;I=Z.buffer;A=Z.opaque;k(E);for(Z=0;Z65535&&(u[t].counter+=1,v=u[t].hash+"_"+u[t].counter,h.geometryGroups[v]==void 0&&(h.geometryGroups[v]={faces:[],materialIndex:o,vertices:0,numMorphTargets:H})),h.geometryGroups[v].faces.push(l),h.geometryGroups[v].vertices+=p;h.geometryGroupsList=[];l=void 0;for(l in h.geometryGroups)h.geometryGroups[l].id=ia++,h.geometryGroupsList.push(h.geometryGroups[l])}for(f in k.geometryGroups)if(h=k.geometryGroups[f],!h.__webglVertexBuffer){l=h;l.__webglVertexBuffer=m.createBuffer();l.__webglNormalBuffer= +m.createBuffer();l.__webglTangentBuffer=m.createBuffer();l.__webglColorBuffer=m.createBuffer();l.__webglUVBuffer=m.createBuffer();l.__webglUV2Buffer=m.createBuffer();l.__webglSkinVertexABuffer=m.createBuffer();l.__webglSkinVertexBBuffer=m.createBuffer();l.__webglSkinIndicesBuffer=m.createBuffer();l.__webglSkinWeightsBuffer=m.createBuffer();l.__webglFaceBuffer=m.createBuffer();l.__webglLineBuffer=m.createBuffer();if(l.numMorphTargets){o=n=void 0;l.__webglMorphTargetsBuffers=[];n=0;for(o=l.numMorphTargets;n< +o;n++)l.__webglMorphTargetsBuffers.push(m.createBuffer())}S.info.memory.geometries++;for(var o=c,w=p=u=void 0,t=w=H=w=void 0,v=t=l=0,x=p=void 0,Z=void 0,p=n=H=u=void 0,H=o.geometry,x=H.faces,Z=h.faces,u=0,p=Z.length;u=0?H.materials[h.materialIndex]:o.material;p=u.map||u.lightMap||u instanceof THREE.ShaderMaterial?!0:!1;Z=u instanceof THREE.MeshBasicMaterial&&!u.envMap||u instanceof +THREE.MeshDepthMaterial?!1:u&&u.shading!=void 0&&u.shading==THREE.SmoothShading?THREE.SmoothShading:THREE.FlatShading;x=u.vertexColors?u.vertexColors:!1;h.__vertexArray=new Float32Array(l*3);if(Z)h.__normalArray=new Float32Array(l*3);if(H.hasTangents)h.__tangentArray=new Float32Array(l*4);if(x)h.__colorArray=new Float32Array(l*3);if(p){if(H.faceUvs.length>0||H.faceVertexUvs.length>0)h.__uvArray=new Float32Array(l*2);if(H.faceUvs.length>1||H.faceVertexUvs.length>1)h.__uv2Array=new Float32Array(l*2)}if(o.geometry.skinWeights.length&& +o.geometry.skinIndices.length)h.__skinVertexAArray=new Float32Array(l*4),h.__skinVertexBArray=new Float32Array(l*4),h.__skinIndexArray=new Float32Array(l*4),h.__skinWeightArray=new Float32Array(l*4);h.__faceArray=new Uint16Array(t*3+(o.geometry.edgeFaces?o.geometry.edgeFaces.length*6:0));h.__lineArray=new Uint16Array(v*2);if(h.numMorphTargets){h.__morphTargetsArrays=[];H=0;for(w=h.numMorphTargets;H=0;k--)e[k]==f&&e.splice(k,1)}else(c instanceof THREE.MarchingCubes||c.immediateRenderCallback)&&C(e.__webglObjectsImmediate,c);c.__webglActive=!1;a.__objectsRemoved.splice(0, +1)}c=0;for(e=a.__webglObjects.length;c0&&(m.bindBuffer(m.ARRAY_BUFFER, +o.__webglColorBuffer),m.bufferData(m.ARRAY_BUFFER,da,t));Ba&&(m.bindBuffer(m.ARRAY_BUFFER,o.__webglNormalBuffer),m.bufferData(m.ARRAY_BUFFER,sa,t));Ea&&ta.hasTangents&&(m.bindBuffer(m.ARRAY_BUFFER,o.__webglTangentBuffer),m.bufferData(m.ARRAY_BUFFER,pa,t));Ca&&T>0&&(m.bindBuffer(m.ARRAY_BUFFER,o.__webglUVBuffer),m.bufferData(m.ARRAY_BUFFER,va,t));Ca&&qa>0&&(m.bindBuffer(m.ARRAY_BUFFER,o.__webglUV2Buffer),m.bufferData(m.ARRAY_BUFFER,ka,t));Da&&(m.bindBuffer(m.ELEMENT_ARRAY_BUFFER,o.__webglFaceBuffer), +m.bufferData(m.ELEMENT_ARRAY_BUFFER,ra,t),m.bindBuffer(m.ELEMENT_ARRAY_BUFFER,o.__webglLineBuffer),m.bufferData(m.ELEMENT_ARRAY_BUFFER,ya,t));P>0&&(m.bindBuffer(m.ARRAY_BUFFER,o.__webglSkinVertexABuffer),m.bufferData(m.ARRAY_BUFFER,ca,t),m.bindBuffer(m.ARRAY_BUFFER,o.__webglSkinVertexBBuffer),m.bufferData(m.ARRAY_BUFFER,ga,t),m.bindBuffer(m.ARRAY_BUFFER,o.__webglSkinIndicesBuffer),m.bufferData(m.ARRAY_BUFFER,ea,t),m.bindBuffer(m.ARRAY_BUFFER,o.__webglSkinWeightsBuffer),m.bufferData(m.ARRAY_BUFFER, +$,t));v&&(delete o.__inittedArrays,delete o.__colorArray,delete o.__normalArray,delete o.__tangentArray,delete o.__uvArray,delete o.__uv2Array,delete o.__faceArray,delete o.__vertexArray,delete o.__lineArray,delete o.__skinVertexAArray,delete o.__skinVertexBArray,delete o.__skinIndexArray,delete o.__skinWeightArray)}f.__dirtyVertices=!1;f.__dirtyMorphTargets=!1;f.__dirtyElements=!1;f.__dirtyUvs=!1;f.__dirtyNormals=!1;f.__dirtyTangents=!1;f.__dirtyColors=!1;z(h,k)}else if(k instanceof THREE.Ribbon){f= +k.geometry;if(f.__dirtyVertices||f.__dirtyColors){k=f;h=m.DYNAMIC_DRAW;l=u=v=v=void 0;H=k.vertices;n=k.colors;p=H.length;o=n.length;x=k.__vertexArray;t=k.__colorArray;Z=k.__dirtyColors;if(k.__dirtyVertices){for(v=0;v1&&(e-=1)}c===void 0&&(c={h:0,s:0,v:0});c.h=e;c.s=m;c.v=k;return c}}; +THREE.ColorUtils={adjustHSV:function(a,b,c,e){var f=THREE.ColorUtils.__hsv;THREE.ColorUtils.rgbToHsv(a,f);f.h=THREE.Math.clamp(f.h+b,0,1);f.s=THREE.Math.clamp(f.s+c,0,1);f.v=THREE.Math.clamp(f.v+e,0,1);a.setHSV(f.h,f.s,f.v)},rgbToHsv:function(a,b){var c=a.r,e=a.g,f=a.b,k=Math.max(Math.max(c,e),f),h=Math.min(Math.min(c,e),f);if(h==k)h=c=0;else{var l=k-h,h=l/k,c=c==k?(e-f)/l:e==k?2+(f-c)/l:4+(c-e)/l;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=h;b.v=k;return b}}; THREE.ColorUtils.__hsv={h:0,s:0,v:0}; -THREE.GeometryUtils={merge:function(b,c){var e,f,h=b.vertices.length,k=c instanceof THREE.Mesh?c.geometry:c,m=b.vertices,n=k.vertices,p=b.faces,t=k.faces,w=b.faceVertexUvs[0],k=k.faceVertexUvs[0];if(c instanceof THREE.Mesh)c.matrixAutoUpdate&&c.updateMatrix(),e=c.matrix,f=new THREE.Matrix4,f.extractRotation(e,c.scale);for(var u=0,x=n.length;u1&&(f=1-f,h=1-h);k=1-f-h;m.copy(b);m.multiplyScalar(f);n.copy(c);n.multiplyScalar(h);m.addSelf(n);n.copy(e);n.multiplyScalar(k);m.addSelf(n);return m},randomPointInFace:function(b,c,e){var f,h,k;if(b instanceof THREE.Face3)return f=c.vertices[b.a].position,h=c.vertices[b.b].position,k=c.vertices[b.c].position,THREE.GeometryUtils.randomPointInTriangle(f,h,k);else if(b instanceof THREE.Face4){f=c.vertices[b.a].position;h=c.vertices[b.b].position;k=c.vertices[b.c].position;var c=c.vertices[b.d].position, -m;e?b._area1&&b._area2?(e=b._area1,m=b._area2):(e=THREE.GeometryUtils.triangleArea(f,h,c),m=THREE.GeometryUtils.triangleArea(h,k,c),b._area1=e,b._area2=m):(e=THREE.GeometryUtils.triangleArea(f,h,c),m=THREE.GeometryUtils.triangleArea(h,k,c));return THREE.GeometryUtils.random()*(e+m) -b?e(c,h-1):t[h]1&&(e=1-e,f=1-f);k=1-e-f;h.copy(a);h.multiplyScalar(e);l.copy(b);l.multiplyScalar(f);h.addSelf(l);l.copy(c);l.multiplyScalar(k);h.addSelf(l);return h},randomPointInFace:function(a,b,c){var e,f,k;if(a instanceof THREE.Face3)return e=b.vertices[a.a].position,f=b.vertices[a.b].position, +k=b.vertices[a.c].position,THREE.GeometryUtils.randomPointInTriangle(e,f,k);else if(a instanceof THREE.Face4){e=b.vertices[a.a].position;f=b.vertices[a.b].position;k=b.vertices[a.c].position;var b=b.vertices[a.d].position,h;c?a._area1&&a._area2?(c=a._area1,h=a._area2):(c=THREE.GeometryUtils.triangleArea(e,f,b),h=THREE.GeometryUtils.triangleArea(f,k,b),a._area1=c,a._area2=h):(c=THREE.GeometryUtils.triangleArea(e,f,b),h=THREE.GeometryUtils.triangleArea(f,k,b));return THREE.GeometryUtils.random()*(c+ +h)a?c(b,f-1):o[f] 0\nuniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];\nuniform float pointLightDistance[ MAX_POINT_LIGHTS ];\nvarying vec4 vPointLight[ MAX_POINT_LIGHTS ];\n#endif\nvarying vec3 vViewPosition;", THREE.ShaderChunk.shadowmap_pars_vertex,"void main() {\nvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\nvViewPosition = -mvPosition.xyz;\nvNormal = normalize( normalMatrix * normal );\nvTangent = normalize( normalMatrix * tangent.xyz );\nvBinormal = cross( vNormal, vTangent ) * tangent.w;\nvBinormal = normalize( vBinormal );\nvUv = uv * uRepeat + uOffset;\n#if MAX_POINT_LIGHTS > 0\nfor( int i = 0; i < MAX_POINT_LIGHTS; i++ ) {\nvec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );\nvec3 lVector = lPosition.xyz - mvPosition.xyz;\nfloat lDistance = 1.0;\nif ( pointLightDistance[ i ] > 0.0 )\nlDistance = 1.0 - min( ( length( lVector ) / pointLightDistance[ i ] ), 1.0 );\nlVector = normalize( lVector );\nvPointLight[ i ] = vec4( lVector, lDistance );\n}\n#endif\n#ifdef VERTEX_TEXTURES\nvec3 dv = texture2D( tDisplacement, uv ).xyz;\nfloat df = uDisplacementScale * dv.x + uDisplacementBias;\nvec4 displacedPosition = vec4( vNormal.xyz * df, 0.0 ) + mvPosition;\ngl_Position = projectionMatrix * displacedPosition;\n#else\ngl_Position = projectionMatrix * mvPosition;\n#endif", THREE.ShaderChunk.shadowmap_vertex,"}"].join("\n")},cube:{uniforms:{tCube:{type:"t",value:1,texture:null},tFlip:{type:"f",value:-1}},vertexShader:"varying vec3 vViewPosition;\nvoid main() {\nvec4 mPosition = objectMatrix * vec4( position, 1.0 );\nvViewPosition = cameraPosition - mPosition.xyz;\ngl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}",fragmentShader:"uniform samplerCube tCube;\nuniform float tFlip;\nvarying vec3 vViewPosition;\nvoid main() {\nvec3 wPos = cameraPosition - vViewPosition;\ngl_FragColor = textureCube( tCube, vec3( tFlip * wPos.x, wPos.yz ) );\n}"}}}; -THREE.Curve=function(){};THREE.Curve.prototype.getPoint=function(){console.log("Warning, getPoint() not implemented!");return null};THREE.Curve.prototype.getPointAt=function(b){return this.getPoint(this.getUtoTmapping(b))};THREE.Curve.prototype.getPoints=function(b){b||(b=5);var c,e=[];for(c=0;c<=b;c++)e.push(this.getPoint(c/b));return e};THREE.Curve.prototype.getSpacedPoints=function(b){b||(b=5);var c,e=[];for(c=0;c<=b;c++)e.push(this.getPointAt(c/b));return e}; -THREE.Curve.prototype.getLength=function(){var b=this.getLengths();return b[b.length-1]};THREE.Curve.prototype.getLengths=function(b){b||(b=200);if(this.cacheArcLengths&&this.cacheArcLengths.length==b+1)return this.cacheArcLengths;var c=[],e,f=this.getPoint(0),h,k=0;c.push(0);for(h=1;h<=b;h++)e=this.getPoint(h/b),k+=e.distanceTo(f),c.push(k),f=e;return this.cacheArcLengths=c}; -THREE.Curve.prototype.getUtoTmapping=function(b,c){var e=this.getLengths(),f=0,h=e.length,k;k=c?c:b*e[h-1];time=Date.now();for(var m=0,n=h-1,p;m<=n;)if(f=Math.floor(m+(n-m)/2),p=e[f]-k,p<0)m=f+1;else if(p>0)n=f-1;else{n=f;break}f=n;if(e[f]==k)return f/(h-1);m=e[f];return e=(f+(k-m)/(e[f+1]-m))/(h-1)};THREE.Curve.prototype.getNormalVector=function(b){b=this.getTangent(b);return new THREE.Vector2(-b.y,b.x)}; -THREE.Curve.prototype.getTangent=function(b){var c=b-1.0E-4;b+=1.0E-4;c<0&&(c=0);b>1&&(b=1);var c=this.getPoint(c),b=this.getPoint(b),e=new THREE.Vector2;e.sub(b,c);return e.unit()};THREE.LineCurve=function(b,c){b instanceof THREE.Vector2?(this.v1=b,this.v2=c):THREE.LineCurve.oldConstructor.apply(this,arguments)};THREE.LineCurve.oldConstructor=function(b,c,e,f){this.constructor(new THREE.Vector2(b,c),new THREE.Vector2(e,f))};THREE.LineCurve.prototype=new THREE.Curve; -THREE.LineCurve.prototype.constructor=THREE.LineCurve;THREE.LineCurve.prototype.getPoint=function(b){var c=new THREE.Vector2;c.sub(this.v2,this.v1);c.multiplyScalar(b).addSelf(this.v1);return c};THREE.LineCurve.prototype.getPointAt=function(b){return this.getPoint(b)};THREE.LineCurve.prototype.getTangent=function(){var b=new THREE.Vector2;b.sub(this.v2,this.v1);b.normalize();return b}; -THREE.QuadraticBezierCurve=function(b,c,e){if(!(c instanceof THREE.Vector2))var f=Array.prototype.slice.call(arguments),b=new THREE.Vector2(f[0],f[1]),c=new THREE.Vector2(f[2],f[3]),e=new THREE.Vector2(f[4],f[5]);this.v0=b;this.v1=c;this.v2=e};THREE.QuadraticBezierCurve.prototype=new THREE.Curve;THREE.QuadraticBezierCurve.prototype.constructor=THREE.QuadraticBezierCurve; -THREE.QuadraticBezierCurve.prototype.getPoint=function(b){var c;c=THREE.Shape.Utils.b2(b,this.v0.x,this.v1.x,this.v2.x);b=THREE.Shape.Utils.b2(b,this.v0.y,this.v1.y,this.v2.y);return new THREE.Vector2(c,b)};THREE.QuadraticBezierCurve.prototype.getTangent=function(b){var c;c=THREE.Curve.Utils.tangentQuadraticBezier(b,this.v0.x,this.v1.x,this.v2.x);b=THREE.Curve.Utils.tangentQuadraticBezier(b,this.v0.y,this.v1.y,this.v2.y);c=new THREE.Vector2(c,b);c.normalize();return c}; -THREE.CubicBezierCurve=function(b,c,e,f){if(!(c instanceof THREE.Vector2))var h=Array.prototype.slice.call(arguments),b=new THREE.Vector2(h[0],h[1]),c=new THREE.Vector2(h[2],h[3]),e=new THREE.Vector2(h[4],h[5]),f=new THREE.Vector2(h[6],h[7]);this.v0=b;this.v1=c;this.v2=e;this.v3=f};THREE.CubicBezierCurve.prototype=new THREE.Curve;THREE.CubicBezierCurve.prototype.constructor=THREE.CubicBezierCurve; -THREE.CubicBezierCurve.prototype.getPoint=function(b){var c;c=THREE.Shape.Utils.b3(b,this.v0.x,this.v1.x,this.v2.x,this.v3.x);b=THREE.Shape.Utils.b3(b,this.v0.y,this.v1.y,this.v2.y,this.v3.y);return new THREE.Vector2(c,b)};THREE.CubicBezierCurve.prototype.getTangent=function(b){var c;c=THREE.Curve.Utils.tangentCubicBezier(b,this.v0.x,this.v1.x,this.v2.x,this.v3.x);b=THREE.Curve.Utils.tangentCubicBezier(b,this.v0.y,this.v1.y,this.v2.y,this.v3.y);c=new THREE.Vector2(c,b);c.normalize();return c}; -THREE.SplineCurve=function(b){this.points=b};THREE.SplineCurve.prototype=new THREE.Curve;THREE.SplineCurve.prototype.constructor=THREE.SplineCurve; -THREE.SplineCurve.prototype.getPoint=function(b){var c=new THREE.Vector2,e=[],f=this.points,h;h=(f.length-1)*b;b=Math.floor(h);h-=b;e[0]=b==0?b:b-1;e[1]=b;e[2]=b>f.length-2?b:b+1;e[3]=b>f.length-3?b:b+2;c.x=THREE.Curve.Utils.interpolate(f[e[0]].x,f[e[1]].x,f[e[2]].x,f[e[3]].x,h);c.y=THREE.Curve.Utils.interpolate(f[e[0]].y,f[e[1]].y,f[e[2]].y,f[e[3]].y,h);return c};THREE.ArcCurve=function(b,c,e,f,h,k){this.aX=b;this.aY=c;this.aRadius=e;this.aStartAngle=f;this.aEndAngle=h;this.aClockwise=k}; -THREE.ArcCurve.prototype=new THREE.Curve;THREE.ArcCurve.prototype.constructor=THREE.ArcCurve;THREE.ArcCurve.prototype.getPoint=function(b){var c=this.aEndAngle-this.aStartAngle;this.aClockwise||(b=1-b);b=this.aStartAngle+b*c;return new THREE.Vector2(this.aX+this.aRadius*Math.cos(b),this.aY+this.aRadius*Math.sin(b))}; -THREE.Curve.Utils={tangentQuadraticBezier:function(b,c,e,f){return 2*(1-b)*(e-c)+2*b*(f-e)},tangentCubicBezier:function(b,c,e,f,h){return-3*c*(1-b)*(1-b)+3*e*(1-b)*(1-b)-6*b*e*(1-b)+6*b*f*(1-b)-3*b*b*f+3*b*b*h},tangentSpline:function(b){return 6*b*b-6*b+(3*b*b-4*b+1)+(-6*b*b+6*b)+(3*b*b-2*b)},interpolate:function(b,c,e,f,h){var b=(e-b)*0.5,f=(f-c)*0.5,k=h*h;return(2*c-2*e+b+f)*h*k+(-3*c+3*e-2*b-f)*k+b*h+c}}; -THREE.Curve.create=function(b,c){b.prototype=new THREE.Curve;b.prototype.constructor=b;b.prototype.getPoint=c;return b};THREE.LineCurve3=THREE.Curve.create(function(b,c){this.v1=b;this.v2=c},function(b){var c=new THREE.Vector3;c.sub(v2,v1);c.multiplyScalar(b);c.addSelf(this.v1);return c}); -THREE.QuadraticBezierCurve3=THREE.Curve.create(function(b,c,e){this.v0=b;this.v1=c;this.v2=e},function(b){var c,e;c=THREE.Shape.Utils.b2(b,this.v0.x,this.v1.x,this.v2.x);e=THREE.Shape.Utils.b2(b,this.v0.y,this.v1.y,this.v2.y);b=THREE.Shape.Utils.b2(b,this.v0.z,this.v1.z,this.v2.z);return new THREE.Vector3(c,e,b)}); -THREE.CubicBezierCurve3=THREE.Curve.create(function(b,c,e,f){this.v0=b;this.v1=c;this.v2=e;this.v3=f},function(b){var c,e;c=THREE.Shape.Utils.b3(b,this.v0.x,this.v1.x,this.v2.x,this.v3.x);e=THREE.Shape.Utils.b3(b,this.v0.y,this.v1.y,this.v2.y,this.v3.y);b=THREE.Shape.Utils.b3(b,this.v0.z,this.v1.z,this.v2.z,this.v3.z);return new THREE.Vector3(c,e,b)}); -THREE.SplineCurve3=THREE.Curve.create(function(b){this.points=b},function(b){var c=new THREE.Vector3,e=[],f=this.points,h;h=(f.length-1)*b;b=Math.floor(h);h-=b;e[0]=b==0?b:b-1;e[1]=b;e[2]=b>f.length-2?b:b+1;e[3]=b>f.length-3?b:b+2;c.x=THREE.Curve.Utils.interpolate(f[e[0]].x,f[e[1]].x,f[e[2]].x,f[e[3]].x,h);c.y=THREE.Curve.Utils.interpolate(f[e[0]].y,f[e[1]].y,f[e[2]].y,f[e[3]].y,h);c.z=THREE.Curve.Utils.interpolate(f[e[0]].z,f[e[1]].z,f[e[2]].z,f[e[3]].z,h);return c}); -THREE.CurvePath=function(){this.curves=[];this.bends=[]};THREE.CurvePath.prototype=new THREE.Curve;THREE.CurvePath.prototype.constructor=THREE.CurvePath;THREE.CurvePath.prototype.add=function(b){this.curves.push(b)};THREE.CurvePath.prototype.checkConnection=function(){};THREE.CurvePath.prototype.closePath=function(){}; -THREE.CurvePath.prototype.getPoint=function(b){for(var c=b*this.getLength(),e=this.getCurveLengths(),b=0;b=c)return c=e[b]-c,b=this.curves[b],c=1-c/b.getLength(),b.getPointAt(c);b++}return null};THREE.CurvePath.prototype.getLength=function(){var b=this.getCurveLengths();return b[b.length-1]}; -THREE.CurvePath.prototype.getCurveLengths=function(){if(this.cacheLengths&&this.cacheLengths.length==this.curves.length)return this.cacheLengths;var b=[],c=0,e,f=this.curves.length;for(e=0;ec)c=k.x;else if(k.xe)e=k.y;else if(k.y0?(m=e[e.length-1],v=m.x,A=m.y):(m=this.actions[f-1].args,v=m[m.length-2],A=m[m.length-1]);for(m=1;m<=b;m++)z=m/b,k=THREE.Shape.Utils.b2(z,v,u,n),z=THREE.Shape.Utils.b2(z,A,x, -p),e.push(new THREE.Vector2(k,z));break;case THREE.PathActions.BEZIER_CURVE_TO:n=k[4];p=k[5];u=k[0];x=k[1];t=k[2];w=k[3];e.length>0?(m=e[e.length-1],v=m.x,A=m.y):(m=this.actions[f-1].args,v=m[m.length-2],A=m[m.length-1]);for(m=1;m<=b;m++)z=m/b,k=THREE.Shape.Utils.b3(z,v,u,t,n),z=THREE.Shape.Utils.b3(z,A,x,w,p),e.push(new THREE.Vector2(k,z));break;case THREE.PathActions.CSPLINE_THRU:m=this.actions[f-1].args;m=[new THREE.Vector2(m[m.length-2],m[m.length-1])];z=b*k[0].length;m=m.concat(k[0]);k=new THREE.SplineCurve(m); -for(m=1;m<=z;m++)e.push(k.getPointAt(m/z));break;case THREE.PathActions.ARC:m=this.actions[f-1].args;n=k[0];p=k[1];t=k[2];u=k[3];z=k[4];x=!!k[5];w=m[m.length-2];v=m[m.length-1];m.length==0&&(w=v=0);A=z-u;var y=b*2;for(m=1;m<=y;m++)z=m/y,x||(z=1-z),z=u+z*A,k=w+n+t*Math.cos(z),z=v+p+t*Math.sin(z),e.push(new THREE.Vector2(k,z))}c&&e.push(e[0]);return e};THREE.Path.prototype.transform=function(b,c){this.getBoundingBox();return this.getWrapPoints(this.getPoints(c),b)}; -THREE.Path.prototype.nltransform=function(b,c,e,f,h,k){var m=this.getPoints(),n,p,t,w,u;n=0;for(p=m.length;n=0?n-1:e.length-1;k=m-1>=0?m-1:t.length-1;var z=[t[m],e[n],e[h]];u=THREE.FontUtils.Triangulate.area(z);var y=[t[m],t[k],e[n]];x=THREE.FontUtils.Triangulate.area(y);v=n;w=m;n+=1;m+=-1;n< -0&&(n+=e.length);n%=e.length;m<0&&(m+=t.length);m%=t.length;h=n-1>=0?n-1:e.length-1;k=m-1>=0?m-1:t.length-1;z=[t[m],e[n],e[h]];z=THREE.FontUtils.Triangulate.area(z);y=[t[m],t[k],e[n]];y=THREE.FontUtils.Triangulate.area(y);u+x>z+y&&(n=v,m=w,n<0&&(n+=e.length),n%=e.length,m<0&&(m+=t.length),m%=t.length,h=n-1>=0?n-1:e.length-1,k=m-1>=0?m-1:t.length-1);u=e.slice(0,n);x=e.slice(n);v=t.slice(m);w=t.slice(0,m);k=[t[m],t[k],e[n]];A.push([t[m],e[n],e[h]]);A.push(k);e=u.concat(v).concat(w).concat(x)}return{shape:e, -isolatedPts:A,allpoints:f}},triangulateShape:function(b,c){var e=THREE.Shape.Utils.removeHoles(b,c),f=e.allpoints,h=e.isolatedPts,e=THREE.FontUtils.Triangulate(e.shape,!1),k,m,n,p,t={};k=0;for(m=f.length;k0)l=e-1;else{l=e;break}e=l;if(c[e]==k)return e/(f-1);h=c[e];return c=(e+(k-h)/(c[e+1]-h))/(f-1)};THREE.Curve.prototype.getNormalVector=function(a){a=this.getTangent(a);return new THREE.Vector2(-a.y,a.x)}; +THREE.Curve.prototype.getTangent=function(a){var b=a-1.0E-4;a+=1.0E-4;b<0&&(b=0);a>1&&(a=1);var b=this.getPoint(b),a=this.getPoint(a),c=new THREE.Vector2;c.sub(a,b);return c.unit()};THREE.LineCurve=function(a,b){a instanceof THREE.Vector2?(this.v1=a,this.v2=b):THREE.LineCurve.oldConstructor.apply(this,arguments)};THREE.LineCurve.oldConstructor=function(a,b,c,e){this.constructor(new THREE.Vector2(a,b),new THREE.Vector2(c,e))};THREE.LineCurve.prototype=new THREE.Curve; +THREE.LineCurve.prototype.constructor=THREE.LineCurve;THREE.LineCurve.prototype.getPoint=function(a){var b=new THREE.Vector2;b.sub(this.v2,this.v1);b.multiplyScalar(a).addSelf(this.v1);return b};THREE.LineCurve.prototype.getPointAt=function(a){return this.getPoint(a)};THREE.LineCurve.prototype.getTangent=function(){var a=new THREE.Vector2;a.sub(this.v2,this.v1);a.normalize();return a}; +THREE.QuadraticBezierCurve=function(a,b,c){if(!(b instanceof THREE.Vector2))var e=Array.prototype.slice.call(arguments),a=new THREE.Vector2(e[0],e[1]),b=new THREE.Vector2(e[2],e[3]),c=new THREE.Vector2(e[4],e[5]);this.v0=a;this.v1=b;this.v2=c};THREE.QuadraticBezierCurve.prototype=new THREE.Curve;THREE.QuadraticBezierCurve.prototype.constructor=THREE.QuadraticBezierCurve; +THREE.QuadraticBezierCurve.prototype.getPoint=function(a){var b;b=THREE.Shape.Utils.b2(a,this.v0.x,this.v1.x,this.v2.x);a=THREE.Shape.Utils.b2(a,this.v0.y,this.v1.y,this.v2.y);return new THREE.Vector2(b,a)};THREE.QuadraticBezierCurve.prototype.getTangent=function(a){var b;b=THREE.Curve.Utils.tangentQuadraticBezier(a,this.v0.x,this.v1.x,this.v2.x);a=THREE.Curve.Utils.tangentQuadraticBezier(a,this.v0.y,this.v1.y,this.v2.y);b=new THREE.Vector2(b,a);b.normalize();return b}; +THREE.CubicBezierCurve=function(a,b,c,e){if(!(b instanceof THREE.Vector2))var f=Array.prototype.slice.call(arguments),a=new THREE.Vector2(f[0],f[1]),b=new THREE.Vector2(f[2],f[3]),c=new THREE.Vector2(f[4],f[5]),e=new THREE.Vector2(f[6],f[7]);this.v0=a;this.v1=b;this.v2=c;this.v3=e};THREE.CubicBezierCurve.prototype=new THREE.Curve;THREE.CubicBezierCurve.prototype.constructor=THREE.CubicBezierCurve; +THREE.CubicBezierCurve.prototype.getPoint=function(a){var b;b=THREE.Shape.Utils.b3(a,this.v0.x,this.v1.x,this.v2.x,this.v3.x);a=THREE.Shape.Utils.b3(a,this.v0.y,this.v1.y,this.v2.y,this.v3.y);return new THREE.Vector2(b,a)};THREE.CubicBezierCurve.prototype.getTangent=function(a){var b;b=THREE.Curve.Utils.tangentCubicBezier(a,this.v0.x,this.v1.x,this.v2.x,this.v3.x);a=THREE.Curve.Utils.tangentCubicBezier(a,this.v0.y,this.v1.y,this.v2.y,this.v3.y);b=new THREE.Vector2(b,a);b.normalize();return b}; +THREE.SplineCurve=function(a){this.points=a};THREE.SplineCurve.prototype=new THREE.Curve;THREE.SplineCurve.prototype.constructor=THREE.SplineCurve; +THREE.SplineCurve.prototype.getPoint=function(a){var b=new THREE.Vector2,c=[],e=this.points,f;f=(e.length-1)*a;a=Math.floor(f);f-=a;c[0]=a==0?a:a-1;c[1]=a;c[2]=a>e.length-2?a:a+1;c[3]=a>e.length-3?a:a+2;b.x=THREE.Curve.Utils.interpolate(e[c[0]].x,e[c[1]].x,e[c[2]].x,e[c[3]].x,f);b.y=THREE.Curve.Utils.interpolate(e[c[0]].y,e[c[1]].y,e[c[2]].y,e[c[3]].y,f);return b};THREE.ArcCurve=function(a,b,c,e,f,k){this.aX=a;this.aY=b;this.aRadius=c;this.aStartAngle=e;this.aEndAngle=f;this.aClockwise=k}; +THREE.ArcCurve.prototype=new THREE.Curve;THREE.ArcCurve.prototype.constructor=THREE.ArcCurve;THREE.ArcCurve.prototype.getPoint=function(a){var b=this.aEndAngle-this.aStartAngle;this.aClockwise||(a=1-a);a=this.aStartAngle+a*b;return new THREE.Vector2(this.aX+this.aRadius*Math.cos(a),this.aY+this.aRadius*Math.sin(a))}; +THREE.Curve.Utils={tangentQuadraticBezier:function(a,b,c,e){return 2*(1-a)*(c-b)+2*a*(e-c)},tangentCubicBezier:function(a,b,c,e,f){return-3*b*(1-a)*(1-a)+3*c*(1-a)*(1-a)-6*a*c*(1-a)+6*a*e*(1-a)-3*a*a*e+3*a*a*f},tangentSpline:function(a){return 6*a*a-6*a+(3*a*a-4*a+1)+(-6*a*a+6*a)+(3*a*a-2*a)},interpolate:function(a,b,c,e,f){var a=(c-a)*0.5,e=(e-b)*0.5,k=f*f;return(2*b-2*c+a+e)*f*k+(-3*b+3*c-2*a-e)*k+a*f+b}}; +THREE.Curve.create=function(a,b){a.prototype=new THREE.Curve;a.prototype.constructor=a;a.prototype.getPoint=b;return a};THREE.LineCurve3=THREE.Curve.create(function(a,b){this.v1=a;this.v2=b},function(a){var b=new THREE.Vector3;b.sub(v2,v1);b.multiplyScalar(a);b.addSelf(this.v1);return b}); +THREE.QuadraticBezierCurve3=THREE.Curve.create(function(a,b,c){this.v0=a;this.v1=b;this.v2=c},function(a){var b,c;b=THREE.Shape.Utils.b2(a,this.v0.x,this.v1.x,this.v2.x);c=THREE.Shape.Utils.b2(a,this.v0.y,this.v1.y,this.v2.y);a=THREE.Shape.Utils.b2(a,this.v0.z,this.v1.z,this.v2.z);return new THREE.Vector3(b,c,a)}); +THREE.CubicBezierCurve3=THREE.Curve.create(function(a,b,c,e){this.v0=a;this.v1=b;this.v2=c;this.v3=e},function(a){var b,c;b=THREE.Shape.Utils.b3(a,this.v0.x,this.v1.x,this.v2.x,this.v3.x);c=THREE.Shape.Utils.b3(a,this.v0.y,this.v1.y,this.v2.y,this.v3.y);a=THREE.Shape.Utils.b3(a,this.v0.z,this.v1.z,this.v2.z,this.v3.z);return new THREE.Vector3(b,c,a)}); +THREE.SplineCurve3=THREE.Curve.create(function(a){this.points=a},function(a){var b=new THREE.Vector3,c=[],e=this.points,f;f=(e.length-1)*a;a=Math.floor(f);f-=a;c[0]=a==0?a:a-1;c[1]=a;c[2]=a>e.length-2?a:a+1;c[3]=a>e.length-3?a:a+2;b.x=THREE.Curve.Utils.interpolate(e[c[0]].x,e[c[1]].x,e[c[2]].x,e[c[3]].x,f);b.y=THREE.Curve.Utils.interpolate(e[c[0]].y,e[c[1]].y,e[c[2]].y,e[c[3]].y,f);b.z=THREE.Curve.Utils.interpolate(e[c[0]].z,e[c[1]].z,e[c[2]].z,e[c[3]].z,f);return b}); +THREE.CurvePath=function(){this.curves=[];this.bends=[]};THREE.CurvePath.prototype=new THREE.Curve;THREE.CurvePath.prototype.constructor=THREE.CurvePath;THREE.CurvePath.prototype.add=function(a){this.curves.push(a)};THREE.CurvePath.prototype.checkConnection=function(){};THREE.CurvePath.prototype.closePath=function(){}; +THREE.CurvePath.prototype.getPoint=function(a){for(var b=a*this.getLength(),c=this.getCurveLengths(),a=0;a=b)return b=c[a]-b,a=this.curves[a],b=1-b/a.getLength(),a.getPointAt(b);a++}return null};THREE.CurvePath.prototype.getLength=function(){var a=this.getCurveLengths();return a[a.length-1]}; +THREE.CurvePath.prototype.getCurveLengths=function(){if(this.cacheLengths&&this.cacheLengths.length==this.curves.length)return this.cacheLengths;var a=[],b=0,c,e=this.curves.length;for(c=0;cb)b=k.x;else if(k.xc)c=k.y;else if(k.y0?(h=c[c.length-1],t=h.x,y=h.y):(h=this.actions[e-1].args,t=h[h.length-2],y=h[h.length-1]);for(h=1;h<=a;h++)x=h/a,k=THREE.Shape.Utils.b2(x,t,p,l),x=THREE.Shape.Utils.b2(x,y,v, +n),c.push(new THREE.Vector2(k,x));break;case THREE.PathActions.BEZIER_CURVE_TO:l=k[4];n=k[5];p=k[0];v=k[1];o=k[2];u=k[3];c.length>0?(h=c[c.length-1],t=h.x,y=h.y):(h=this.actions[e-1].args,t=h[h.length-2],y=h[h.length-1]);for(h=1;h<=a;h++)x=h/a,k=THREE.Shape.Utils.b3(x,t,p,o,l),x=THREE.Shape.Utils.b3(x,y,v,u,n),c.push(new THREE.Vector2(k,x));break;case THREE.PathActions.CSPLINE_THRU:h=this.actions[e-1].args;h=[new THREE.Vector2(h[h.length-2],h[h.length-1])];x=a*k[0].length;h=h.concat(k[0]);k=new THREE.SplineCurve(h); +for(h=1;h<=x;h++)c.push(k.getPointAt(h/x));break;case THREE.PathActions.ARC:h=this.actions[e-1].args;l=k[0];n=k[1];o=k[2];p=k[3];x=k[4];v=!!k[5];u=h[h.length-2];t=h[h.length-1];h.length==0&&(u=t=0);y=x-p;var w=a*2;for(h=1;h<=w;h++)x=h/w,v||(x=1-x),x=p+x*y,k=u+l+o*Math.cos(x),x=t+n+o*Math.sin(x),c.push(new THREE.Vector2(k,x))}b&&c.push(c[0]);return c};THREE.Path.prototype.transform=function(a,b){this.getBoundingBox();return this.getWrapPoints(this.getPoints(b),a)}; +THREE.Path.prototype.nltransform=function(a,b,c,e,f,k){var h=this.getPoints(),l,n,o,u,p;l=0;for(n=h.length;l=0?l-1:c.length-1;k=h-1>=0?h-1:o.length-1;var x=[o[h],c[l],c[f]];p=THREE.FontUtils.Triangulate.area(x);var w=[o[h],o[k],c[l]];v=THREE.FontUtils.Triangulate.area(w);t=l;u=h;l+=1;h+=-1;l< +0&&(l+=c.length);l%=c.length;h<0&&(h+=o.length);h%=o.length;f=l-1>=0?l-1:c.length-1;k=h-1>=0?h-1:o.length-1;x=[o[h],c[l],c[f]];x=THREE.FontUtils.Triangulate.area(x);w=[o[h],o[k],c[l]];w=THREE.FontUtils.Triangulate.area(w);p+v>x+w&&(l=t,h=u,l<0&&(l+=c.length),l%=c.length,h<0&&(h+=o.length),h%=o.length,f=l-1>=0?l-1:c.length-1,k=h-1>=0?h-1:o.length-1);p=c.slice(0,l);v=c.slice(l);t=o.slice(h);u=o.slice(0,h);k=[o[h],o[k],c[l]];y.push([o[h],c[l],c[f]]);y.push(k);c=p.concat(t).concat(u).concat(v)}return{shape:c, +isolatedPts:y,allpoints:e}},triangulateShape:function(a,b){var c=THREE.Shape.Utils.removeHoles(a,b),e=c.allpoints,f=c.isolatedPts,c=THREE.FontUtils.Triangulate(c.shape,!1),k,h,l,n,o={};k=0;for(h=e.length;k1)console.log("THREE.Animation.update: Warning! Scale out of bounds:"+f+" on bone "+v),f=f<0?0:1;if(e==="pos")if(e=b.position,this.interpolationType===THREE.AnimationHandler.LINEAR)e.x=h[0]+(k[0]-h[0])*f,e.y=h[1]+(k[1]-h[1])*f,e.z=h[2]+(k[2]-h[2])*f;else{if(this.interpolationType===THREE.AnimationHandler.CATMULLROM||this.interpolationType===THREE.AnimationHandler.CATMULLROM_FORWARD)if(this.points[0]= -this.getPrevKeyWith("pos",v,m.index-1).pos,this.points[1]=h,this.points[2]=k,this.points[3]=this.getNextKeyWith("pos",v,n.index+1).pos,f=f*0.33+0.33,h=this.interpolateCatmullRom(this.points,f),e.x=h[0],e.y=h[1],e.z=h[2],this.interpolationType===THREE.AnimationHandler.CATMULLROM_FORWARD)f=this.interpolateCatmullRom(this.points,f*1.01),this.target.set(f[0],f[1],f[2]),this.target.subSelf(e),this.target.y=0,this.target.normalize(),f=Math.atan2(this.target.x,this.target.z),b.rotation.set(0,f,0)}else if(e=== -"rot")THREE.Quaternion.slerp(h,k,b.quaternion,f);else if(e==="scl")e=b.scale,e.x=h[0]+(k[0]-h[0])*f,e.y=h[1]+(k[1]-h[1])*f,e.z=h[2]+(k[2]-h[2])*f}}if(this.JITCompile&&w[0][t]===void 0){this.hierarchy[0].update(void 0,!0);for(v=0;vb.length-2?k:k+1;e[3]=k>b.length-3?k:k+2;k=b[e[0]];n=b[e[1]];p=b[e[2]];t=b[e[3]];e=h*h;m=h*e;f[0]=this.interpolate(k[0],n[0],p[0],t[0],h,e,m);f[1]=this.interpolate(k[1],n[1],p[1],t[1],h,e,m);f[2]=this.interpolate(k[2],n[2],p[2],t[2],h,e,m);return f}; -THREE.Animation.prototype.interpolate=function(b,c,e,f,h,k,m){b=(e-b)*0.5;f=(f-c)*0.5;return(2*(c-e)+b+f)*m+(-3*(c-e)-2*b-f)*k+b*h+c};THREE.Animation.prototype.getNextKeyWith=function(b,c,e){var f=this.data.hierarchy[c].keys;for(this.interpolationType===THREE.AnimationHandler.CATMULLROM||this.interpolationType===THREE.AnimationHandler.CATMULLROM_FORWARD?e=e0?e:0:e>=0?e:e+f.length;e>=0;e--)if(f[e][b]!==void 0)return f[e];return this.data.hierarchy[c].keys[f.length-1]}; -THREE.CubeCamera=function(b,c,e,f){this.heightOffset=e;this.position=new THREE.Vector3(0,e,0);this.cameraPX=new THREE.PerspectiveCamera(90,1,b,c);this.cameraNX=new THREE.PerspectiveCamera(90,1,b,c);this.cameraPY=new THREE.PerspectiveCamera(90,1,b,c);this.cameraNY=new THREE.PerspectiveCamera(90,1,b,c);this.cameraPZ=new THREE.PerspectiveCamera(90,1,b,c);this.cameraNZ=new THREE.PerspectiveCamera(90,1,b,c);this.cameraPX.position=this.position;this.cameraNX.position=this.position;this.cameraPY.position= +THREE.Animation.prototype.stop=function(){this.isPaused=this.isPlaying=!1;THREE.AnimationHandler.removeFromUpdate(this);for(var a=0;a1)console.log("THREE.Animation.update: Warning! Scale out of bounds:"+e+" on bone "+t),e=e<0?0:1;if(c==="pos")if(c=a.position,this.interpolationType===THREE.AnimationHandler.LINEAR)c.x=f[0]+(k[0]-f[0])*e,c.y=f[1]+(k[1]-f[1])*e,c.z=f[2]+(k[2]-f[2])*e;else{if(this.interpolationType===THREE.AnimationHandler.CATMULLROM||this.interpolationType===THREE.AnimationHandler.CATMULLROM_FORWARD)if(this.points[0]= +this.getPrevKeyWith("pos",t,h.index-1).pos,this.points[1]=f,this.points[2]=k,this.points[3]=this.getNextKeyWith("pos",t,l.index+1).pos,e=e*0.33+0.33,f=this.interpolateCatmullRom(this.points,e),c.x=f[0],c.y=f[1],c.z=f[2],this.interpolationType===THREE.AnimationHandler.CATMULLROM_FORWARD)e=this.interpolateCatmullRom(this.points,e*1.01),this.target.set(e[0],e[1],e[2]),this.target.subSelf(c),this.target.y=0,this.target.normalize(),e=Math.atan2(this.target.x,this.target.z),a.rotation.set(0,e,0)}else if(c=== +"rot")THREE.Quaternion.slerp(f,k,a.quaternion,e);else if(c==="scl")c=a.scale,c.x=f[0]+(k[0]-f[0])*e,c.y=f[1]+(k[1]-f[1])*e,c.z=f[2]+(k[2]-f[2])*e}}if(this.JITCompile&&u[0][o]===void 0){this.hierarchy[0].update(void 0,!0);for(t=0;ta.length-2?k:k+1;c[3]=k>a.length-3?k:k+2;k=a[c[0]];l=a[c[1]];n=a[c[2]];o=a[c[3]];c=f*f;h=f*c;e[0]=this.interpolate(k[0],l[0],n[0],o[0],f,c,h);e[1]=this.interpolate(k[1],l[1],n[1],o[1],f,c,h);e[2]=this.interpolate(k[2],l[2],n[2],o[2],f,c,h);return e}; +THREE.Animation.prototype.interpolate=function(a,b,c,e,f,k,h){a=(c-a)*0.5;e=(e-b)*0.5;return(2*(b-c)+a+e)*h+(-3*(b-c)-2*a-e)*k+a*f+b};THREE.Animation.prototype.getNextKeyWith=function(a,b,c){var e=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+e.length;c>=0;c--)if(e[c][a]!==void 0)return e[c];return this.data.hierarchy[b].keys[e.length-1]}; +THREE.CubeCamera=function(a,b,c,e){this.heightOffset=c;this.position=new THREE.Vector3(0,c,0);this.cameraPX=new THREE.PerspectiveCamera(90,1,a,b);this.cameraNX=new THREE.PerspectiveCamera(90,1,a,b);this.cameraPY=new THREE.PerspectiveCamera(90,1,a,b);this.cameraNY=new THREE.PerspectiveCamera(90,1,a,b);this.cameraPZ=new THREE.PerspectiveCamera(90,1,a,b);this.cameraNZ=new THREE.PerspectiveCamera(90,1,a,b);this.cameraPX.position=this.position;this.cameraNX.position=this.position;this.cameraPY.position= this.position;this.cameraNY.position=this.position;this.cameraPZ.position=this.position;this.cameraNZ.position=this.position;this.cameraPX.up.set(0,-1,0);this.cameraNX.up.set(0,-1,0);this.cameraPY.up.set(0,0,1);this.cameraNY.up.set(0,0,-1);this.cameraPZ.up.set(0,-1,0);this.cameraNZ.up.set(0,-1,0);this.targetPX=new THREE.Vector3(0,0,0);this.targetNX=new THREE.Vector3(0,0,0);this.targetPY=new THREE.Vector3(0,0,0);this.targetNY=new THREE.Vector3(0,0,0);this.targetPZ=new THREE.Vector3(0,0,0);this.targetNZ= -new THREE.Vector3(0,0,0);this.renderTarget=new THREE.WebGLRenderTargetCube(f,f,{format:THREE.RGBFormat,magFilter:THREE.LinearFilter,minFilter:THREE.LinearFilter});this.updatePosition=function(b){this.position.copy(b);this.position.y+=this.heightOffset;this.targetPX.copy(this.position);this.targetNX.copy(this.position);this.targetPY.copy(this.position);this.targetNY.copy(this.position);this.targetPZ.copy(this.position);this.targetNZ.copy(this.position);this.targetPX.x+=1;this.targetNX.x-=1;this.targetPY.y+= -1;this.targetNY.y-=1;this.targetPZ.z+=1;this.targetNZ.z-=1;this.cameraPX.lookAt(this.targetPX);this.cameraNX.lookAt(this.targetNX);this.cameraPY.lookAt(this.targetPY);this.cameraNY.lookAt(this.targetNY);this.cameraPZ.lookAt(this.targetPZ);this.cameraNZ.lookAt(this.targetNZ)};this.updateCubeMap=function(b,e){var c=this.renderTarget;c.activeCubeFace=0;b.render(e,this.cameraPX,c);c.activeCubeFace=1;b.render(e,this.cameraNX,c);c.activeCubeFace=2;b.render(e,this.cameraPY,c);c.activeCubeFace=3;b.render(e, -this.cameraNY,c);c.activeCubeFace=4;b.render(e,this.cameraPZ,c);c.activeCubeFace=5;b.render(e,this.cameraNZ,c)}};THREE.FirstPersonCamera=function(){console.warn("DEPRECATED: FirstPersonCamera() is FirstPersonControls().")};THREE.PathCamera=function(){console.warn("DEPRECATED: PathCamera() is PathControls().")};THREE.FlyCamera=function(){console.warn("DEPRECATED: FlyCamera() is FlyControls().")};THREE.RollCamera=function(){console.warn("DEPRECATED: RollCamera() is RollControls().")}; -THREE.TrackballCamera=function(){console.warn("DEPRECATED: TrackballCamera() is TrackballControls().")};THREE.CombinedCamera=function(b,c,e,f,h,k,m){THREE.Camera.call(this);this.cameraO=new THREE.OrthographicCamera(b/-2,b/2,c/2,c/-2,k,m);this.cameraP=new THREE.PerspectiveCamera(e,b/c,f,h);this.toPerspective()};THREE.CombinedCamera.prototype=new THREE.Camera;THREE.CombinedCamera.prototype.constructor=THREE.CoolCamera; -THREE.CombinedCamera.prototype.toPerspective=function(){this.near=this.cameraP.near;this.far=this.cameraP.far;this.projectionMatrix=this.cameraP.projectionMatrix};THREE.CombinedCamera.prototype.toOrthographic=function(){this.near=this.cameraO.near;this.far=this.cameraO.far;this.projectionMatrix=this.cameraO.projectionMatrix};THREE.CombinedCamera.prototype.setFov=function(b){this.cameraP.fov=b;this.cameraP.updateProjectionMatrix();this.toPerspective()}; -THREE.CombinedCamera.prototype.setLens=function(b,c){c||(c=43.25);var e=2*Math.atan(c/(b*2));e*=180/Math.PI;this.setFov(e);return e}; -THREE.FirstPersonControls=function(b,c){function e(b,e){return function(){e.apply(b,arguments)}}this.object=b;this.target=new THREE.Vector3(0,0,0);this.domElement=c!==void 0?c:document;this.movementSpeed=1;this.lookSpeed=0.0050;this.noFly=!1;this.lookVertical=!0;this.autoForward=!1;this.activeLook=!0;this.heightSpeed=!1;this.heightCoef=1;this.heightMin=0;this.constrainVertical=!1;this.verticalMin=0;this.verticalMax=Math.PI;this.theta=this.phi=this.lon=this.lat=this.mouseY=this.mouseX=this.autoSpeedFactor= -0;this.mouseDragOn=this.freeze=this.moveRight=this.moveLeft=this.moveBackward=this.moveForward=!1;this.domElement===document?(this.viewHalfX=window.innerWidth/2,this.viewHalfY=window.innerHeight/2):(this.viewHalfX=this.domElement.offsetWidth/2,this.viewHalfY=this.domElement.offsetHeight/2,this.domElement.setAttribute("tabindex",-1));this.onMouseDown=function(b){this.domElement!==document&&this.domElement.focus();b.preventDefault();b.stopPropagation();if(this.activeLook)switch(b.button){case 0:this.moveForward= -!0;break;case 2:this.moveBackward=!0}this.mouseDragOn=!0};this.onMouseUp=function(b){b.preventDefault();b.stopPropagation();if(this.activeLook)switch(b.button){case 0:this.moveForward=!1;break;case 2:this.moveBackward=!1}this.mouseDragOn=!1};this.onMouseMove=function(b){this.domElement===document?(this.mouseX=b.pageX-this.viewHalfX,this.mouseY=b.pageY-this.viewHalfY):(this.mouseX=b.pageX-this.domElement.offsetLeft-this.viewHalfX,this.mouseY=b.pageY-this.domElement.offsetTop-this.viewHalfY)};this.onKeyDown= -function(b){switch(b.keyCode){case 38:case 87:this.moveForward=!0;break;case 37:case 65:this.moveLeft=!0;break;case 40:case 83:this.moveBackward=!0;break;case 39:case 68:this.moveRight=!0;break;case 82:this.moveUp=!0;break;case 70:this.moveDown=!0;break;case 81:this.freeze=!this.freeze}};this.onKeyUp=function(b){switch(b.keyCode){case 38:case 87:this.moveForward=!1;break;case 37:case 65:this.moveLeft=!1;break;case 40:case 83:this.moveBackward=!1;break;case 39:case 68:this.moveRight=!1;break;case 82:this.moveUp= -!1;break;case 70:this.moveDown=!1}};this.update=function(b){if(!this.freeze){if(this.heightSpeed){var e=THREE.Math.clamp(this.object.position.y,this.heightMin,this.heightMax)-this.heightMin;this.autoSpeedFactor=b*e*this.heightCoef}else this.autoSpeedFactor=0;e=b*this.movementSpeed;(this.moveForward||this.autoForward&&!this.moveBackward)&&this.object.translateZ(-(e+this.autoSpeedFactor));this.moveBackward&&this.object.translateZ(e);this.moveLeft&&this.object.translateX(-e);this.moveRight&&this.object.translateX(e); -this.moveUp&&this.object.translateY(e);this.moveDown&&this.object.translateY(-e);e=b*this.lookSpeed;this.activeLook||(e=0);this.lon+=this.mouseX*e;this.lookVertical&&(this.lat-=this.mouseY*e);this.lat=Math.max(-85,Math.min(85,this.lat));this.phi=(90-this.lat)*Math.PI/180;this.theta=this.lon*Math.PI/180;var b=this.target,c=this.object.position;b.x=c.x+100*Math.sin(this.phi)*Math.cos(this.theta);b.y=c.y+100*Math.cos(this.phi);b.z=c.z+100*Math.sin(this.phi)*Math.sin(this.theta)}b=1;this.constrainVertical&& -(b=Math.PI/(this.verticalMax-this.verticalMin));this.lon+=this.mouseX*e;this.lookVertical&&(this.lat-=this.mouseY*e*b);this.lat=Math.max(-85,Math.min(85,this.lat));this.phi=(90-this.lat)*Math.PI/180;this.theta=this.lon*Math.PI/180;if(this.constrainVertical)this.phi=THREE.Math.mapLinear(this.phi,0,Math.PI,this.verticalMin,this.verticalMax);b=this.target;c=this.object.position;b.x=c.x+100*Math.sin(this.phi)*Math.cos(this.theta);b.y=c.y+100*Math.cos(this.phi);b.z=c.z+100*Math.sin(this.phi)*Math.sin(this.theta); -this.object.lookAt(b)};this.domElement.addEventListener("contextmenu",function(b){b.preventDefault()},!1);this.domElement.addEventListener("mousemove",e(this,this.onMouseMove),!1);this.domElement.addEventListener("mousedown",e(this,this.onMouseDown),!1);this.domElement.addEventListener("mouseup",e(this,this.onMouseUp),!1);this.domElement.addEventListener("keydown",e(this,this.onKeyDown),!1);this.domElement.addEventListener("keyup",e(this,this.onKeyUp),!1)}; -THREE.PathControls=function(b,c){function e(b){if((b*=2)<1)return 0.5*b*b;return-0.5*(--b*(b-2)-1)}function f(b,e){return function(){e.apply(b,arguments)}}function h(b,e,c,f){var h={name:c,fps:0.6,length:f,hierarchy:[]},k,m=e.getControlPointsArray(),n=e.getLength(),y=m.length,D=0;k=y-1;e={parent:-1,keys:[]};e.keys[0]={time:0,pos:m[0],rot:[0,0,0,1],scl:[1,1,1]};e.keys[k]={time:f,pos:m[k],rot:[0,0,0,1],scl:[1,1,1]};for(k=1;k=0?b:b+m;c=this.verticalAngleMap.srcRange; -b=this.verticalAngleMap.dstRange;c=THREE.Math.mapLinear(this.phi,c[0],c[1],b[0],b[1]);var f=b[1]-b[0];this.phi=e((c-b[0])/f)*f+b[0];c=this.horizontalAngleMap.srcRange;b=this.horizontalAngleMap.dstRange;c=THREE.Math.mapLinear(this.theta,c[0],c[1],b[0],b[1]);f=b[1]-b[0];this.theta=e((c-b[0])/f)*f+b[0];b=this.target.position;b.x=100*Math.sin(this.phi)*Math.cos(this.theta);b.y=100*Math.cos(this.phi);b.z=100*Math.sin(this.phi)*Math.sin(this.theta);this.object.lookAt(this.target.position)};this.onMouseMove= -function(b){this.domElement===document?(this.mouseX=b.pageX-this.viewHalfX,this.mouseY=b.pageY-this.viewHalfY):(this.mouseX=b.pageX-this.domElement.offsetLeft-this.viewHalfX,this.mouseY=b.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 b=new THREE.MeshLambertMaterial({color:30719}),e=new THREE.MeshLambertMaterial({color:65280}), -c=new THREE.CubeGeometry(10,10,20),m=new THREE.CubeGeometry(2,2,10);this.animationParent=new THREE.Mesh(c,b);b=new THREE.Mesh(m,e);b.position.set(0,10,0);this.animation=h(this.animationParent,this.spline,this.id,this.duration);this.animationParent.add(this.object);this.animationParent.add(this.target);this.animationParent.add(b)}else this.animation=h(this.animationParent,this.spline,this.id,this.duration),this.animationParent.add(this.target),this.animationParent.add(this.object);if(this.createDebugPath){var b= -this.debugPath,e=this.spline,c=k(e,10),m=k(e,10),n=new THREE.LineBasicMaterial({color:16711680,linewidth:3});lineObj=new THREE.Line(c,n);particleObj=new THREE.ParticleSystem(m,new THREE.ParticleBasicMaterial({color:16755200,size:3}));lineObj.scale.set(1,1,1);b.add(lineObj);particleObj.scale.set(1,1,1);b.add(particleObj);m=new THREE.SphereGeometry(1,16,8);n=new THREE.MeshBasicMaterial({color:65280});for(i=0;i0){var e=this.getContainerDimensions(),c=e.size[0]/2,m=e.size[1]/2;this.moveState.yawLeft=-(b.pageX-e.offset[0]-c)/c;this.moveState.pitchDown=(b.pageY-e.offset[1]-m)/m;this.updateRotationVector()}};this.mouseup=function(b){b.preventDefault();b.stopPropagation();if(this.dragToLook)this.mouseStatus--,this.moveState.yawLeft=this.moveState.pitchDown=0;else switch(b.button){case 0:this.moveForward= -!1;break;case 2:this.moveBackward=!1}this.updateRotationVector()};this.update=function(b){var e=b*this.movementSpeed;b*=this.rollSpeed;this.object.translateX(this.moveVector.x*e);this.object.translateY(this.moveVector.y*e);this.object.translateZ(this.moveVector.z*e);this.tmpQuaternion.set(this.rotationVector.x*b,this.rotationVector.y*b,this.rotationVector.z*b,1).normalize();this.object.quaternion.multiplySelf(this.tmpQuaternion);this.object.matrix.setPosition(this.object.position);this.object.matrix.setRotationFromQuaternion(this.object.quaternion); -this.object.matrixWorldNeedsUpdate=!0};this.updateMovementVector=function(){var b=this.moveState.forward||this.autoForward&&!this.moveState.back?1:0;this.moveVector.x=-this.moveState.left+this.moveState.right;this.moveVector.y=-this.moveState.down+this.moveState.up;this.moveVector.z=-b+this.moveState.back};this.updateRotationVector=function(){this.rotationVector.x=-this.moveState.pitchDown+this.moveState.pitchUp;this.rotationVector.y=-this.moveState.yawRight+this.moveState.yawLeft;this.rotationVector.z= --this.moveState.rollRight+this.moveState.rollLeft};this.getContainerDimensions=function(){return this.domElement!=document?{size:[this.domElement.offsetWidth,this.domElement.offsetHeight],offset:[this.domElement.offsetLeft,this.domElement.offsetTop]}:{size:[window.innerWidth,window.innerHeight],offset:[0,0]}};this.domElement.addEventListener("mousemove",e(this,this.mousemove),!1);this.domElement.addEventListener("mousedown",e(this,this.mousedown),!1);this.domElement.addEventListener("mouseup",e(this, -this.mouseup),!1);this.domElement.addEventListener("keydown",e(this,this.keydown),!1);this.domElement.addEventListener("keyup",e(this,this.keyup),!1);this.updateMovementVector();this.updateRotationVector()}; -THREE.RollControls=function(b,c){this.object=b;this.domElement=c!==void 0?c:document;this.mouseLook=!0;this.autoForward=!1;this.rollSpeed=this.movementSpeed=this.lookSpeed=1;this.constrainVertical=[-0.9,0.9];this.object.matrixAutoUpdate=!1;this.forward=new THREE.Vector3(0,0,1);this.roll=0;var e=new THREE.Vector3,f=new THREE.Vector3,h=new THREE.Vector3,k=new THREE.Matrix4,m=!1,n=1,p=0,t=0,w=0,u=0,x=0,v=window.innerWidth/2,A=window.innerHeight/2;this.update=function(b){if(this.mouseLook){var c=b*this.lookSpeed; -this.rotateHorizontally(c*u);this.rotateVertically(c*x)}c=b*this.movementSpeed;this.object.translateZ(-c*(p>0||this.autoForward&&!(p<0)?1:p));this.object.translateX(c*t);this.object.translateY(c*w);m&&(this.roll+=this.rollSpeed*b*n);if(this.forward.y>this.constrainVertical[1])this.forward.y=this.constrainVertical[1],this.forward.normalize();else if(this.forward.y1?c.normalize():c.z=Math.sqrt(1-f*f);k.copy(this.object.position).subSelf(this.target);f=this.object.up.clone().setLength(c.y);f.addSelf(this.object.up.clone().crossSelf(k).setLength(c.x));f.addSelf(k.setLength(c.z));return f};this.rotateCamera=function(){var b=Math.acos(m.dot(n)/m.length()/n.length());if(b){var e=(new THREE.Vector3).cross(m,n).normalize(),c=new THREE.Quaternion;b*=this.rotateSpeed;c.setFromAxisAngle(e, --b);c.multiplyVector3(k);c.multiplyVector3(this.object.up);c.multiplyVector3(n);this.staticMoving?m=n:(c.setFromAxisAngle(e,b*(this.dynamicDampingFactor-1)),c.multiplyVector3(m))}};this.zoomCamera=function(){var b=1+(t.y-p.y)*this.zoomSpeed;b!==1&&b>0&&(k.multiplyScalar(b),this.staticMoving?p=t:p.y+=(t.y-p.y)*this.dynamicDampingFactor)};this.panCamera=function(){var b=u.clone().subSelf(w);if(b.lengthSq()){b.multiplyScalar(k.length()*this.panSpeed);var e=k.clone().crossSelf(this.object.up).setLength(b.x); -e.addSelf(this.object.up.clone().setLength(b.y));this.object.position.addSelf(e);this.target.addSelf(e);this.staticMoving?w=u:w.addSelf(b.sub(u,w).multiplyScalar(this.dynamicDampingFactor))}};this.checkDistances=function(){if(!this.noZoom||!this.noPan)this.object.position.lengthSq()>this.maxDistance*this.maxDistance&&this.object.position.setLength(this.maxDistance),k.lengthSq()0){this.vertices.push(new THREE.Vertex(new THREE.Vector3(0,m,0)));for(n=0;n0){this.vertices.push(new THREE.Vertex(new THREE.Vector3(0,-m,0)));for(n=0;nb&&(b+=Math.PI*2),anglec=(e+b)/2,new THREE.Vector2(-Math.cos(anglec),-Math.sin(anglec));return f.multiplyScalar(m).addSelf(n).subSelf(b).clone()}function h(b){for(N=b.length;--N>=0;){la=N;oa=N-1;oa<0&&(oa=b.length- -1);for(var e=0,c=v+w*2,e=0;e=0;J--){$=J/w;Z=p*(1-$);$=t*Math.sin($*Math.PI/2);N=0;for(V=E.length;N=0?a:a+h;b=this.verticalAngleMap.srcRange; +a=this.verticalAngleMap.dstRange;b=THREE.Math.mapLinear(this.phi,b[0],b[1],a[0],a[1]);var e=a[1]-a[0];this.phi=c((b-a[0])/e)*e+a[0];b=this.horizontalAngleMap.srcRange;a=this.horizontalAngleMap.dstRange;b=THREE.Math.mapLinear(this.theta,b[0],b[1],a[0],a[1]);e=a[1]-a[0];this.theta=c((b-a[0])/e)*e+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}),c=new THREE.MeshLambertMaterial({color:65280}), +b=new THREE.CubeGeometry(10,10,20),h=new THREE.CubeGeometry(2,2,10);this.animationParent=new THREE.Mesh(b,a);a=new THREE.Mesh(h,c);a.position.set(0,10,0);this.animation=f(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=f(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,c=this.spline,b=k(c,10),h=k(c,10),l=new THREE.LineBasicMaterial({color:16711680,linewidth:3});lineObj=new THREE.Line(b,l);particleObj=new THREE.ParticleSystem(h,new THREE.ParticleBasicMaterial({color:16755200,size:3}));lineObj.scale.set(1,1,1);a.add(lineObj);particleObj.scale.set(1,1,1);a.add(particleObj);h=new THREE.SphereGeometry(1,16,8);l=new THREE.MeshBasicMaterial({color:65280});for(i=0;i0){var c=this.getContainerDimensions(),b=c.size[0]/2,h=c.size[1]/2;this.moveState.yawLeft=-(a.pageX-c.offset[0]-b)/b;this.moveState.pitchDown=(a.pageY-c.offset[1]-h)/h;this.updateRotationVector()}};this.mouseup=function(a){a.preventDefault();a.stopPropagation();if(this.dragToLook)this.mouseStatus--,this.moveState.yawLeft=this.moveState.pitchDown=0;else switch(a.button){case 0:this.moveForward= +!1;break;case 2:this.moveBackward=!1}this.updateRotationVector()};this.update=function(a){var c=a*this.movementSpeed;a*=this.rollSpeed;this.object.translateX(this.moveVector.x*c);this.object.translateY(this.moveVector.y*c);this.object.translateZ(this.moveVector.z*c);this.tmpQuaternion.set(this.rotationVector.x*a,this.rotationVector.y*a,this.rotationVector.z*a,1).normalize();this.object.quaternion.multiplySelf(this.tmpQuaternion);this.object.matrix.setPosition(this.object.position);this.object.matrix.setRotationFromQuaternion(this.object.quaternion); +this.object.matrixWorldNeedsUpdate=!0};this.updateMovementVector=function(){var a=this.moveState.forward||this.autoForward&&!this.moveState.back?1:0;this.moveVector.x=-this.moveState.left+this.moveState.right;this.moveVector.y=-this.moveState.down+this.moveState.up;this.moveVector.z=-a+this.moveState.back};this.updateRotationVector=function(){this.rotationVector.x=-this.moveState.pitchDown+this.moveState.pitchUp;this.rotationVector.y=-this.moveState.yawRight+this.moveState.yawLeft;this.rotationVector.z= +-this.moveState.rollRight+this.moveState.rollLeft};this.getContainerDimensions=function(){return this.domElement!=document?{size:[this.domElement.offsetWidth,this.domElement.offsetHeight],offset:[this.domElement.offsetLeft,this.domElement.offsetTop]}:{size:[window.innerWidth,window.innerHeight],offset:[0,0]}};this.domElement.addEventListener("mousemove",c(this,this.mousemove),!1);this.domElement.addEventListener("mousedown",c(this,this.mousedown),!1);this.domElement.addEventListener("mouseup",c(this, +this.mouseup),!1);this.domElement.addEventListener("keydown",c(this,this.keydown),!1);this.domElement.addEventListener("keyup",c(this,this.keyup),!1);this.updateMovementVector();this.updateRotationVector()}; +THREE.RollControls=function(a,b){this.object=a;this.domElement=b!==void 0?b:document;this.mouseLook=!0;this.autoForward=!1;this.rollSpeed=this.movementSpeed=this.lookSpeed=1;this.constrainVertical=[-0.9,0.9];this.object.matrixAutoUpdate=!1;this.forward=new THREE.Vector3(0,0,1);this.roll=0;var c=new THREE.Vector3,e=new THREE.Vector3,f=new THREE.Vector3,k=new THREE.Matrix4,h=!1,l=1,n=0,o=0,u=0,p=0,v=0,t=window.innerWidth/2,y=window.innerHeight/2;this.update=function(a){if(this.mouseLook){var b=a*this.lookSpeed; +this.rotateHorizontally(b*p);this.rotateVertically(b*v)}b=a*this.movementSpeed;this.object.translateZ(-b*(n>0||this.autoForward&&!(n<0)?1:n));this.object.translateX(b*o);this.object.translateY(b*u);h&&(this.roll+=this.rollSpeed*a*l);if(this.forward.y>this.constrainVertical[1])this.forward.y=this.constrainVertical[1],this.forward.normalize();else if(this.forward.y1?b.normalize():b.z=Math.sqrt(1-e*e);k.copy(this.object.position).subSelf(this.target);e=this.object.up.clone().setLength(b.y);e.addSelf(this.object.up.clone().crossSelf(k).setLength(b.x));e.addSelf(k.setLength(b.z));return e};this.rotateCamera=function(){var a=Math.acos(h.dot(l)/h.length()/l.length());if(a){var c=(new THREE.Vector3).cross(h,l).normalize(),b=new THREE.Quaternion;a*=this.rotateSpeed;b.setFromAxisAngle(c, +-a);b.multiplyVector3(k);b.multiplyVector3(this.object.up);b.multiplyVector3(l);this.staticMoving?h=l:(b.setFromAxisAngle(c,a*(this.dynamicDampingFactor-1)),b.multiplyVector3(h))}};this.zoomCamera=function(){var a=1+(o.y-n.y)*this.zoomSpeed;a!==1&&a>0&&(k.multiplyScalar(a),this.staticMoving?n=o:n.y+=(o.y-n.y)*this.dynamicDampingFactor)};this.panCamera=function(){var a=p.clone().subSelf(u);if(a.lengthSq()){a.multiplyScalar(k.length()*this.panSpeed);var c=k.clone().crossSelf(this.object.up).setLength(a.x); +c.addSelf(this.object.up.clone().setLength(a.y));this.object.position.addSelf(c);this.target.addSelf(c);this.staticMoving?u=p:u.addSelf(a.sub(p,u).multiplyScalar(this.dynamicDampingFactor))}};this.checkDistances=function(){if(!this.noZoom||!this.noPan)this.object.position.lengthSq()>this.maxDistance*this.maxDistance&&this.object.position.setLength(this.maxDistance),k.lengthSq()0){this.vertices.push(new THREE.Vertex(new THREE.Vector3(0,h,0)));for(l=0;l0){this.vertices.push(new THREE.Vertex(new THREE.Vector3(0,-h,0)));for(l=0;la&&(a+=Math.PI*2),anglec=(c+a)/2,new THREE.Vector2(-Math.cos(anglec),-Math.sin(anglec));return e.multiplyScalar(f).addSelf(l).subSelf(a).clone()}function f(a){for(J=a.length;--J>=0;){ha=J;ja=J-1;ja<0&&(ja=a.length- +1);for(var c=0,b=t+u*2,c=0;c=0;O--){W=O/u;S=n*(1-W);W=o*Math.sin(W*Math.PI/2);J=0;for(T=A.length;J0||(w=this.vertices.push(new THREE.Vertex(new THREE.Vector3(u,n,x)))-1);t.push(w)}c.push(t)}for(var v,A,z,h=c.length,e=0;e0)for(f=0;f1&&(v= -this.vertices[m].position.clone(),A=this.vertices[p].position.clone(),z=this.vertices[t].position.clone(),v.normalize(),A.normalize(),z.normalize(),this.faces.push(new THREE.Face3(m,p,t,[new THREE.Vector3(v.x,v.y,v.z),new THREE.Vector3(A.x,A.y,A.z),new THREE.Vector3(z.x,z.y,z.z)])),this.faceVertexUvs[0].push([w,u,y]))}this.computeCentroids();this.computeFaceNormals();this.computeVertexNormals();this.boundingSphere={radius:b}};THREE.SphereGeometry.prototype=new THREE.Geometry; +THREE.SphereGeometry=function(a,b,c){THREE.Geometry.call(this);for(var a=a||50,e,f=Math.PI,k=Math.max(3,b||8),h=Math.max(2,c||6),b=[],c=0;c0||(u=this.vertices.push(new THREE.Vertex(new THREE.Vector3(p,l,v)))-1);o.push(u)}b.push(o)}for(var t,y,x,f=b.length,c=0;c0)for(e=0;e1&&(t= +this.vertices[h].position.clone(),y=this.vertices[n].position.clone(),x=this.vertices[o].position.clone(),t.normalize(),y.normalize(),x.normalize(),this.faces.push(new THREE.Face3(h,n,o,[new THREE.Vector3(t.x,t.y,t.z),new THREE.Vector3(y.x,y.y,y.z),new THREE.Vector3(x.x,x.y,x.z)])),this.faceVertexUvs[0].push([u,p,w]))}this.computeCentroids();this.computeFaceNormals();this.computeVertexNormals();this.boundingSphere={radius:a}};THREE.SphereGeometry.prototype=new THREE.Geometry; THREE.SphereGeometry.prototype.constructor=THREE.SphereGeometry; -THREE.TextGeometry=function(b,c){var e=(new THREE.TextPath(b,c)).toShapes();c.amount=c.height!==void 0?c.height:50;if(c.bevelThickness===void 0)c.bevelThickness=10;if(c.bevelSize===void 0)c.bevelSize=8;if(c.bevelEnabled===void 0)c.bevelEnabled=!1;if(c.bend){var f=e[e.length-1].getBoundingBox().maxX;c.bendPath=new THREE.QuadraticBezierCurve(new THREE.Vector2(0,0),new THREE.Vector2(f/2,120),new THREE.Vector2(f,0))}THREE.ExtrudeGeometry.call(this,e,c)};THREE.TextGeometry.prototype=new THREE.ExtrudeGeometry; +THREE.TextGeometry=function(a,b){var c=(new THREE.TextPath(a,b)).toShapes();b.amount=b.height!==void 0?b.height:50;if(b.bevelThickness===void 0)b.bevelThickness=10;if(b.bevelSize===void 0)b.bevelSize=8;if(b.bevelEnabled===void 0)b.bevelEnabled=!1;if(b.bend){var e=c[c.length-1].getBoundingBox().maxX;b.bendPath=new THREE.QuadraticBezierCurve(new THREE.Vector2(0,0),new THREE.Vector2(e/2,120),new THREE.Vector2(e,0))}THREE.ExtrudeGeometry.call(this,c,b)};THREE.TextGeometry.prototype=new THREE.ExtrudeGeometry; THREE.TextGeometry.prototype.constructor=THREE.TextGeometry; -THREE.FontUtils={faces:{},face:"helvetiker",weight:"normal",style:"normal",size:150,divisions:10,getFace:function(){return this.faces[this.face][this.weight][this.style]},getTextShapes:function(b,c){return(new TextPath(b,c)).toShapes()},loadFace:function(b){var c=b.familyName.toLowerCase();this.faces[c]=this.faces[c]||{};this.faces[c][b.cssFontWeight]=this.faces[c][b.cssFontWeight]||{};this.faces[c][b.cssFontWeight][b.cssFontStyle]=b;return this.faces[c][b.cssFontWeight][b.cssFontStyle]=b},drawText:function(b){for(var c= -this.getFace(),e=this.size/c.resolution,f=0,h=String(b).split(""),k=h.length,m=[],b=0;b0)for(t=0;t2;){if(u--<=0){console.log("Warning, unable to triangulate polygon!");if(f)return n;return k}p=t;h<=p&&(p=0);t=p+1;h<=t&&(t=0);w=t+1;h<=w&&(w=0);var x;a:{x=b;var v=p,A=t,z=w,y=h,D=m,E=void 0,C=void 0,G=void 0, -I=void 0,P=void 0,K=void 0,B=void 0,O=void 0,Y=void 0,C=x[D[v]].x,G=x[D[v]].y,I=x[D[A]].x,P=x[D[A]].y,K=x[D[z]].x,B=x[D[z]].y;if(1.0E-10>(I-C)*(B-G)-(P-G)*(K-C))x=!1;else{for(E=0;E=0&&J>=0&&Z>=0){x=!1;break a}}x= -!0}}if(x){k.push([b[m[p]],b[m[t]],b[m[w]]]);n.push([m[p],m[t],m[w]]);p=t;for(w=t+1;w0;)this.smooth(b)}; -THREE.SubdivisionModifier.prototype.smooth=function(b){function c(b,e,c,f,n,p){var t=new THREE.Face4(b,e,c,f,null,n.color,n.material);if(m.useOldVertexColors){t.vertexColors=[];for(var v,o,w,x=0;x<4;x++){w=p[x];v=new THREE.Color;v.setRGB(0,0,0);for(var y=0;y0)for(o=0;o2;){if(p--<=0){console.log("Warning, unable to triangulate polygon!");if(e)return l;return k}n=o;f<=n&&(n=0);o=n+1;f<=o&&(o=0);u=o+1;f<=u&&(u=0);var v;a:{v=a;var t=n,y=o,x=u,w=f,B=h,A=void 0,z=void 0,C=void 0, +E=void 0,G=void 0,F=void 0,I=void 0,M=void 0,V=void 0,z=v[B[t]].x,C=v[B[t]].y,E=v[B[y]].x,G=v[B[y]].y,F=v[B[x]].x,I=v[B[x]].y;if(1.0E-10>(E-z)*(I-C)-(G-C)*(F-z))v=!1;else{for(A=0;A=0&&O>=0&&S>=0){v=!1; +break a}}v=!0}}if(v){k.push([a[h[n]],a[h[o]],a[h[u]]]);l.push([h[n],h[o],h[u]]);n=o;for(u=o+1;u0;)this.smooth(a)}; +THREE.SubdivisionModifier.prototype.smooth=function(a){function b(a,c,b,e,l,n){var o=new THREE.Face4(a,c,b,e,null,l.color,l.material);if(h.useOldVertexColors){o.vertexColors=[];for(var m,t,u,v=0;v<4;v++){u=n[v];m=new THREE.Color;m.setRGB(0,0,0);for(var w=0;w>7)-127;f|=(k&127)<<16|h<<8;if(f==0&&n==-127)return 0;return(1-2*(m>>7))*(1+f*Math.pow(2,-23))*Math.pow(2,n)}function h(b,e){var c=w(b,e),f=w(b,e+1),k=w(b,e+2);return(w(b,e+3)<<24)+(k<<16)+(f<<8)+c}function p(b,e){var c=w(b,e);return(w(b,e+1)<<8)+c}function t(b,e){var c=w(b,e);return c>127?c-256:c}function w(b,e){return b.charCodeAt(e)&255}function u(e){var c, -f,k;c=h(b,e);f=h(b,e+P);k=h(b,e+K);e=p(b,e+B);D.faces.push(new THREE.Face3(c,f,k,null,null,D.materials[e]))}function x(e){var c,f,k,m,o,t;c=h(b,e);f=h(b,e+P);k=h(b,e+K);m=p(b,e+B);o=h(b,e+O);t=h(b,e+Y);e=h(b,e+N);m=D.materials[m];var u=G[t*3],v=G[t*3+1];t=G[t*3+2];var w=G[e*3],x=G[e*3+1],e=G[e*3+2];D.faces.push(new THREE.Face3(c,f,k,[new THREE.Vector3(G[o*3],G[o*3+1],G[o*3+2]),new THREE.Vector3(u,v,t),new THREE.Vector3(w,x,e)],null,m))}function v(e){var c,f,k,m;c=h(b,e);f=h(b,e+V);k=h(b,e+J);m=h(b, -e+$);e=p(b,e+Z);D.faces.push(new THREE.Face4(c,f,k,m,null,null,D.materials[e]))}function A(e){var c,f,k,m,t,u,v,w;c=h(b,e);f=h(b,e+V);k=h(b,e+J);m=h(b,e+$);t=p(b,e+Z);u=h(b,e+Q);v=h(b,e+o);w=h(b,e+R);e=h(b,e+fa);t=D.materials[t];var x=G[v*3],y=G[v*3+1];v=G[v*3+2];var U=G[w*3],L=G[w*3+1];w=G[w*3+2];var z=G[e*3],A=G[e*3+1],e=G[e*3+2];D.faces.push(new THREE.Face4(c,f,k,m,[new THREE.Vector3(G[u*3],G[u*3+1],G[u*3+2]),new THREE.Vector3(x,y,v),new THREE.Vector3(U,L,w),new THREE.Vector3(z,A,e)],null,t))} -function z(e){var c,f,k,m;c=h(b,e);f=h(b,e+ea);k=h(b,e+ha);e=I[c*2];m=I[c*2+1];c=I[f*2];var o=D.faceVertexUvs[0];f=I[f*2+1];var p=I[k*2];k=I[k*2+1];var t=[];t.push(new THREE.UV(e,m));t.push(new THREE.UV(c,f));t.push(new THREE.UV(p,k));o.push(t)}function y(e){var c,f,k,m,o,p;c=h(b,e);f=h(b,e+ga);k=h(b,e+la);m=h(b,e+oa);e=I[c*2];o=I[c*2+1];c=I[f*2];p=I[f*2+1];f=I[k*2];var t=D.faceVertexUvs[0];k=I[k*2+1];var u=I[m*2];m=I[m*2+1];var v=[];v.push(new THREE.UV(e,o));v.push(new THREE.UV(c,p));v.push(new THREE.UV(f, -k));v.push(new THREE.UV(u,m));t.push(v)}var D=this,E=0,C,G=[],I=[],P,K,B,O,Y,N,V,J,$,Z,Q,o,R,fa,ea,ha,ga,la,oa,aa,T,X,ia,ja,sa;THREE.Geometry.call(this);THREE.Loader.prototype.initMaterials(D,f,e);C={signature:b.substr(E,8),header_bytes:w(b,E+8),vertex_coordinate_bytes:w(b,E+9),normal_coordinate_bytes:w(b,E+10),uv_coordinate_bytes:w(b,E+11),vertex_index_bytes:w(b,E+12),normal_index_bytes:w(b,E+13),uv_index_bytes:w(b,E+14),material_index_bytes:w(b,E+15),nvertices:h(b,E+16),nnormals:h(b,E+16+4),nuvs:h(b, -E+16+8),ntri_flat:h(b,E+16+12),ntri_smooth:h(b,E+16+16),ntri_flat_uv:h(b,E+16+20),ntri_smooth_uv:h(b,E+16+24),nquad_flat:h(b,E+16+28),nquad_smooth:h(b,E+16+32),nquad_flat_uv:h(b,E+16+36),nquad_smooth_uv:h(b,E+16+40)};E+=C.header_bytes;P=C.vertex_index_bytes;K=C.vertex_index_bytes*2;B=C.vertex_index_bytes*3;O=C.vertex_index_bytes*3+C.material_index_bytes;Y=C.vertex_index_bytes*3+C.material_index_bytes+C.normal_index_bytes;N=C.vertex_index_bytes*3+C.material_index_bytes+C.normal_index_bytes*2;V=C.vertex_index_bytes; -J=C.vertex_index_bytes*2;$=C.vertex_index_bytes*3;Z=C.vertex_index_bytes*4;Q=C.vertex_index_bytes*4+C.material_index_bytes;o=C.vertex_index_bytes*4+C.material_index_bytes+C.normal_index_bytes;R=C.vertex_index_bytes*4+C.material_index_bytes+C.normal_index_bytes*2;fa=C.vertex_index_bytes*4+C.material_index_bytes+C.normal_index_bytes*3;ea=C.uv_index_bytes;ha=C.uv_index_bytes*2;ga=C.uv_index_bytes;la=C.uv_index_bytes*2;oa=C.uv_index_bytes*3;e=C.vertex_index_bytes*3+C.material_index_bytes;sa=C.vertex_index_bytes* -4+C.material_index_bytes;aa=C.ntri_flat*e;T=C.ntri_smooth*(e+C.normal_index_bytes*3);X=C.ntri_flat_uv*(e+C.uv_index_bytes*3);ia=C.ntri_smooth_uv*(e+C.normal_index_bytes*3+C.uv_index_bytes*3);ja=C.nquad_flat*sa;e=C.nquad_smooth*(sa+C.normal_index_bytes*4);sa=C.nquad_flat_uv*(sa+C.uv_index_bytes*4);E+=function(e){for(var f,h,k,n=C.vertex_coordinate_bytes*3,o=e+C.nvertices*n;e=0){y=o.invBindMatrices[v];p.invBindMatrix=y;p.skinningMatrix=new THREE.Matrix4;p.skinningMatrix.multiply(p.world,y);p.weights=[];for(y=0;y1){o=new THREE.MeshFaceMaterial;for(j=0;j1?c[1].substr(0,e):"0";c[1].length=0,m=h.indexOf("(")>=0,n;if(k)f=h.split("."),h=f.shift(),f.shift();else if(m){n=h.split("(");h=n.shift(); -for(f=0;fe){t=p.output[o];break}m=t!==void 0?t instanceof THREE.Matrix4? -m.multiply(m,t):m.multiply(m,n.matrix):m.multiply(m,n.matrix)}else m=m.multiply(m,n.matrix);e=m;c.push({time:b,pos:[e.n14,e.n24,e.n34],rotq:[0,0,0,1],scl:[1,1,1]})}this.keys=c}this.updateMatrix();return this};u.prototype.updateMatrix=function(){this.matrix.identity();for(var b=0;b0&&(this[c.nodeName]=parseFloat(f[0].textContent))}}this.create();return this};Y.prototype.create=function(){var b={},e=this.transparency!==void 0&&this.transparency<1,c;for(c in this)switch(c){case "ambient":case "emission":case "diffuse":case "specular":var f=this[c];if(f instanceof O)if(f.isTexture()){if(this.effect.sampler&&this.effect.surface&&this.effect.sampler.source==this.effect.surface.sid&&(f=ma[this.effect.surface.init_from]))b.map=THREE.ImageUtils.loadTexture(Ga+f.init_from), -b.map.wrapS=THREE.RepeatWrapping,b.map.wrapT=THREE.RepeatWrapping,b.map.repeat.x=1,b.map.repeat.y=-1}else c=="diffuse"?b.color=f.color.getHex():e||(b[c]=f.color.getHex());break;case "shininess":case "reflectivity":b[c]=this[c];break;case "transparency":if(e)b.transparent=!0,b.opacity=this[c],e=!0}b.shading=za;return this.material=new THREE.MeshLambertMaterial(b)};N.prototype.parse=function(b){for(var e=0;e=0,f=b.indexOf("(")>=0,h,k;if(c)e=b.split("."),b=e.shift(),k=e.shift();else if(f){h=b.split("(");b=h.shift();for(e=0;e>7)-127;e|=(h&127)<<16|f<<8;if(e==0&&l==-127)return 0;return(1-2*(k>>7))*(1+e*Math.pow(2,-23))*Math.pow(2,l)}function f(a,c){var b=u(a,c),e=u(a,c+1),h=u(a,c+2);return(u(a,c+3)<<24)+(h<<16)+(e<<8)+b}function n(a,c){var b=u(a,c);return(u(a,c+1)<<8)+b}function o(a,c){var b=u(a,c);return b>127?b-256:b}function u(a,c){return a.charCodeAt(c)&255}function p(c){var b, +e,h;b=f(a,c);e=f(a,c+G);h=f(a,c+F);c=n(a,c+I);B.faces.push(new THREE.Face3(b,e,h,null,null,c))}function v(c){var b,e,h,k,m,o,p;b=f(a,c);e=f(a,c+G);h=f(a,c+F);k=n(a,c+I);m=f(a,c+M);o=f(a,c+V);p=f(a,c+J);var c=C[o*3],t=C[o*3+1];o=C[o*3+2];var u=C[p*3],v=C[p*3+1];p=C[p*3+2];B.faces.push(new THREE.Face3(b,e,h,[new THREE.Vector3(C[m*3],C[m*3+1],C[m*3+2]),new THREE.Vector3(c,t,o),new THREE.Vector3(u,v,p)],null,k))}function t(c){var b,e,h,k;b=f(a,c);e=f(a,c+T);h=f(a,c+O);k=f(a,c+W);c=n(a,c+S);B.faces.push(new THREE.Face4(b, +e,h,k,null,null,c))}function y(c){var b,e,h,k,o,p,t,u,v;b=f(a,c);e=f(a,c+T);h=f(a,c+O);k=f(a,c+W);o=n(a,c+S);p=f(a,c+m);t=f(a,c+ca);u=f(a,c+Q);v=f(a,c+ea);var c=C[t*3],w=C[t*3+1];t=C[t*3+2];var H=C[u*3],L=C[u*3+1];u=C[u*3+2];var Z=C[v*3],x=C[v*3+1];v=C[v*3+2];B.faces.push(new THREE.Face4(b,e,h,k,[new THREE.Vector3(C[p*3],C[p*3+1],C[p*3+2]),new THREE.Vector3(c,w,t),new THREE.Vector3(H,L,u),new THREE.Vector3(Z,x,v)],null,o))}function x(c){var b,e,h,k;b=f(a,c);e=f(a,c+da);h=f(a,c+ka);c=E[b*2];k=E[b* +2+1];b=E[e*2];var m=B.faceVertexUvs[0];e=E[e*2+1];var n=E[h*2];h=E[h*2+1];var o=[];o.push(new THREE.UV(c,k));o.push(new THREE.UV(b,e));o.push(new THREE.UV(n,h));m.push(o)}function w(c){var b,e,h,k,m,n;b=f(a,c);e=f(a,c+ia);h=f(a,c+ha);k=f(a,c+ja);c=E[b*2];m=E[b*2+1];b=E[e*2];n=E[e*2+1];e=E[h*2];var o=B.faceVertexUvs[0];h=E[h*2+1];var p=E[k*2];k=E[k*2+1];var t=[];t.push(new THREE.UV(c,m));t.push(new THREE.UV(b,n));t.push(new THREE.UV(e,h));t.push(new THREE.UV(p,k));o.push(t)}var B=this,A=0,z,C=[],E= +[],G,F,I,M,V,J,T,O,W,S,m,ca,Q,ea,da,ka,ia,ha,ja,$,R,X,aa,ga,ra;THREE.Geometry.call(this);THREE.Loader.prototype.initMaterials(B,e,c);z={signature:a.substr(A,8),header_bytes:u(a,A+8),vertex_coordinate_bytes:u(a,A+9),normal_coordinate_bytes:u(a,A+10),uv_coordinate_bytes:u(a,A+11),vertex_index_bytes:u(a,A+12),normal_index_bytes:u(a,A+13),uv_index_bytes:u(a,A+14),material_index_bytes:u(a,A+15),nvertices:f(a,A+16),nnormals:f(a,A+16+4),nuvs:f(a,A+16+8),ntri_flat:f(a,A+16+12),ntri_smooth:f(a,A+16+16),ntri_flat_uv:f(a, +A+16+20),ntri_smooth_uv:f(a,A+16+24),nquad_flat:f(a,A+16+28),nquad_smooth:f(a,A+16+32),nquad_flat_uv:f(a,A+16+36),nquad_smooth_uv:f(a,A+16+40)};A+=z.header_bytes;G=z.vertex_index_bytes;F=z.vertex_index_bytes*2;I=z.vertex_index_bytes*3;M=z.vertex_index_bytes*3+z.material_index_bytes;V=z.vertex_index_bytes*3+z.material_index_bytes+z.normal_index_bytes;J=z.vertex_index_bytes*3+z.material_index_bytes+z.normal_index_bytes*2;T=z.vertex_index_bytes;O=z.vertex_index_bytes*2;W=z.vertex_index_bytes*3;S=z.vertex_index_bytes* +4;m=z.vertex_index_bytes*4+z.material_index_bytes;ca=z.vertex_index_bytes*4+z.material_index_bytes+z.normal_index_bytes;Q=z.vertex_index_bytes*4+z.material_index_bytes+z.normal_index_bytes*2;ea=z.vertex_index_bytes*4+z.material_index_bytes+z.normal_index_bytes*3;da=z.uv_index_bytes;ka=z.uv_index_bytes*2;ia=z.uv_index_bytes;ha=z.uv_index_bytes*2;ja=z.uv_index_bytes*3;c=z.vertex_index_bytes*3+z.material_index_bytes;ra=z.vertex_index_bytes*4+z.material_index_bytes;$=z.ntri_flat*c;R=z.ntri_smooth*(c+ +z.normal_index_bytes*3);X=z.ntri_flat_uv*(c+z.uv_index_bytes*3);aa=z.ntri_smooth_uv*(c+z.normal_index_bytes*3+z.uv_index_bytes*3);ga=z.nquad_flat*ra;c=z.nquad_smooth*(ra+z.normal_index_bytes*4);ra=z.nquad_flat_uv*(ra+z.uv_index_bytes*4);A+=function(c){for(var e,f,k,l=z.vertex_coordinate_bytes*3,m=c+z.nvertices*l;c=0){w=m.invBindMatrices[t];n.invBindMatrix=w;n.skinningMatrix=new THREE.Matrix4;n.skinningMatrix.multiply(n.world,w);n.weights=[];for(w=0;w1){m=new THREE.MeshFaceMaterial;for(j=0;j1?b[1].substr(0,c):"0";b[1].length=0,k=f.indexOf("(")>=0,l;if(h)e=f.split("."),f=e.shift(),e.shift();else if(k){l=f.split("(");f=l.shift(); +for(e=0;ec){o=n.output[m];break}k=o!==void 0?o instanceof THREE.Matrix4? +k.multiply(k,o):k.multiply(k,l.matrix):k.multiply(k,l.matrix)}else k=k.multiply(k,l.matrix);c=k;b.push({time:a,pos:[c.n14,c.n24,c.n34],rotq:[0,0,0,1],scl:[1,1,1]})}this.keys=b}this.updateMatrix();return this};p.prototype.updateMatrix=function(){this.matrix.identity();for(var a=0;a0&&(this[b.nodeName]=parseFloat(e[0].textContent))}}this.create();return this};V.prototype.create=function(){var a={},c=this.transparency!==void 0&&this.transparency<1,b;for(b in this)switch(b){case "ambient":case "emission":case "diffuse":case "specular":var e=this[b];if(e instanceof M)if(e.isTexture()){if(this.effect.sampler&&this.effect.surface&&this.effect.sampler.source==this.effect.surface.sid&&(e=oa[this.effect.surface.init_from]))a.map=THREE.ImageUtils.loadTexture(Ca+e.init_from), +a.map.wrapS=THREE.RepeatWrapping,a.map.wrapT=THREE.RepeatWrapping,a.map.repeat.x=1,a.map.repeat.y=-1}else b=="diffuse"?a.color=e.color.getHex():c||(a[b]=e.color.getHex());break;case "shininess":case "reflectivity":a[b]=this[b];break;case "transparency":if(c)a.transparent=!0,a.opacity=this[b],c=!0}a.shading=xa;return this.material=new THREE.MeshLambertMaterial(a)};J.prototype.parse=function(a){for(var c=0;c=0,e=a.indexOf("(")>=0,h,f;if(b)c=a.split("."),a=c.shift(),f=c.shift();else if(e){h=a.split("(");a=h.shift();for(c=0;c1&&(Y=[new THREE.MeshFaceMaterial]);object=new THREE.Mesh(P,Y);object.name=v;object.position.set(C[0],C[1],C[2]);q?(object.quaternion.set(q[0],q[1],q[2],q[3]),object.useQuaternion=!0):object.rotation.set(r[0],r[1],r[2]);object.scale.set(s[0],s[1],s[2]);object.visible=E.visible;R.scene.add(object);R.objects[v]=object;E.meshCollider&&(b=THREE.CollisionUtils.MeshColliderWBox(object),R.scene.collisions.colliders.push(b)); -if(E.castsShadow)b=new THREE.ShadowVolume(P),R.scene.add(b),b.position=object.position,b.rotation=object.rotation,b.scale=object.scale;E.trigger&&E.trigger.toLowerCase()!="none"&&(b={type:E.trigger,object:E},R.triggers[object.name]=b)}}else C=E.position,r=E.rotation,q=E.quaternion,s=E.scale,q=0,object=new THREE.Object3D,object.name=v,object.position.set(C[0],C[1],C[2]),q?(object.quaternion.set(q[0],q[1],q[2],q[3]),object.useQuaternion=!0):object.rotation.set(r[0],r[1],r[2]),object.scale.set(s[0], -s[1],s[2]),object.visible=E.visible!==void 0?E.visible:!1,R.scene.add(object),R.objects[v]=object,R.empties[v]=object,E.trigger&&E.trigger.toLowerCase()!="none"&&(b={type:E.trigger,object:E},R.triggers[object.name]=b)}function p(b){return function(c){R.geometries[b]=c;n();$-=1;e.onLoadComplete();w()}}function t(b){return function(e){R.geometries[b]=e}}function w(){e.callbackProgress({totalModels:Q,totalTextures:o,loadedModels:Q-$,loadedTextures:o-Z},R);e.onLoadProgress();$==0&&Z==0&&c(R)}var u,x, -v,A,z,y,D,E,C,G,I,P,K,B,O,Y,N,V,J,$,Z,Q,o,R;V=b.data;O=new THREE.BinaryLoader;J=new THREE.JSONLoader;Z=$=0;R={scene:new THREE.Scene,geometries:{},materials:{},textures:{},objects:{},cameras:{},lights:{},fogs:{},triggers:{},empties:{}};b=!1;for(v in V.objects)if(E=V.objects[v],E.meshCollider){b=!0;break}if(b)R.scene.collisions=new THREE.CollisionSystem;if(V.transform){b=V.transform.position;G=V.transform.rotation;var fa=V.transform.scale;b&&R.scene.position.set(b[0],b[1],b[2]);G&&R.scene.rotation.set(G[0], -G[1],G[2]);fa&&R.scene.scale.set(fa[0],fa[1],fa[2]);(b||G||fa)&&R.scene.updateMatrix()}b=function(){Z-=1;w();e.onLoadComplete()};for(z in V.cameras)G=V.cameras[z],G.type=="perspective"?K=new THREE.PerspectiveCamera(G.fov,G.aspect,G.near,G.far):G.type=="ortho"&&(K=new THREE.OrthographicCamera(G.left,G.right,G.top,G.bottom,G.near,G.far)),C=G.position,G=G.target,K.position.set(C[0],C[1],C[2]),K.target=new THREE.Vector3(G[0],G[1],G[2]),R.cameras[z]=K;for(A in V.lights)z=V.lights[A],K=z.color!==void 0? -z.color:16777215,G=z.intensity!==void 0?z.intensity:1,z.type=="directional"?(C=z.direction,N=new THREE.DirectionalLight(K,G),N.position.set(C[0],C[1],C[2]),N.position.normalize()):z.type=="point"?(C=z.position,d=z.distance,N=new THREE.PointLight(K,G,d),N.position.set(C[0],C[1],C[2])):z.type=="ambient"&&(N=new THREE.AmbientLight(K)),R.scene.add(N),R.lights[A]=N;for(y in V.fogs)A=V.fogs[y],A.type=="linear"?B=new THREE.Fog(0,A.near,A.far):A.type=="exp2"&&(B=new THREE.FogExp2(0,A.density)),G=A.color, -B.color.setRGB(G[0],G[1],G[2]),R.fogs[y]=B;if(R.cameras&&V.defaults.camera)R.currentCamera=R.cameras[V.defaults.camera];if(R.fogs&&V.defaults.fog)R.scene.fog=R.fogs[V.defaults.fog];G=V.defaults.bgcolor;R.bgColor=new THREE.Color;R.bgColor.setRGB(G[0],G[1],G[2]);R.bgColorAlpha=V.defaults.bgalpha;for(u in V.geometries)if(y=V.geometries[u],y.type=="bin_mesh"||y.type=="ascii_mesh")$+=1,e.onLoadStart();Q=$;for(u in V.geometries)y=V.geometries[u],y.type=="cube"?(P=new THREE.CubeGeometry(y.width,y.height, -y.depth,y.segmentsWidth,y.segmentsHeight,y.segmentsDepth,null,y.flipped,y.sides),R.geometries[u]=P):y.type=="plane"?(P=new THREE.PlaneGeometry(y.width,y.height,y.segmentsWidth,y.segmentsHeight),R.geometries[u]=P):y.type=="sphere"?(P=new THREE.SphereGeometry(y.radius,y.segmentsWidth,y.segmentsHeight),R.geometries[u]=P):y.type=="cylinder"?(P=new THREE.CylinderGeometry(y.topRad,y.botRad,y.height,y.radSegs,y.heightSegs),R.geometries[u]=P):y.type=="torus"?(P=new THREE.TorusGeometry(y.radius,y.tube,y.segmentsR, -y.segmentsT),R.geometries[u]=P):y.type=="icosahedron"?(P=new THREE.IcosahedronGeometry(y.subdivisions),R.geometries[u]=P):y.type=="bin_mesh"?O.load(f(y.url,V.urlBaseType),p(u)):y.type=="ascii_mesh"?J.load(f(y.url,V.urlBaseType),p(u)):y.type=="embedded_mesh"&&(y=V.embeds[y.id])&&J.createModel(y,t(u),"");for(D in V.textures)if(u=V.textures[D],u.url instanceof Array){Z+=u.url.length;for(O=0;O1&&(V=[new THREE.MeshFaceMaterial]);object=new THREE.Mesh(G,V);object.name=t;object.position.set(z[0],z[1],z[2]);q?(object.quaternion.set(q[0],q[1],q[2],q[3]),object.useQuaternion=!0):object.rotation.set(r[0],r[1],r[2]);object.scale.set(s[0],s[1],s[2]);object.visible=A.visible;Q.scene.add(object);Q.objects[t]=object;A.meshCollider&&(a=THREE.CollisionUtils.MeshColliderWBox(object),Q.scene.collisions.colliders.push(a)); +if(A.castsShadow)a=new THREE.ShadowVolume(G),Q.scene.add(a),a.position=object.position,a.rotation=object.rotation,a.scale=object.scale;A.trigger&&A.trigger.toLowerCase()!="none"&&(a={type:A.trigger,object:A},Q.triggers[object.name]=a)}}else z=A.position,r=A.rotation,q=A.quaternion,s=A.scale,q=0,object=new THREE.Object3D,object.name=t,object.position.set(z[0],z[1],z[2]),q?(object.quaternion.set(q[0],q[1],q[2],q[3]),object.useQuaternion=!0):object.rotation.set(r[0],r[1],r[2]),object.scale.set(s[0], +s[1],s[2]),object.visible=A.visible!==void 0?A.visible:!1,Q.scene.add(object),Q.objects[t]=object,Q.empties[t]=object,A.trigger&&A.trigger.toLowerCase()!="none"&&(a={type:A.trigger,object:A},Q.triggers[object.name]=a)}function n(a){return function(b){Q.geometries[a]=b;l();W-=1;c.onLoadComplete();u()}}function o(a){return function(c){Q.geometries[a]=c}}function u(){c.callbackProgress({totalModels:m,totalTextures:ca,loadedModels:m-W,loadedTextures:ca-S},Q);c.onLoadProgress();W==0&&S==0&&b(Q)}var p, +v,t,y,x,w,B,A,z,C,E,G,F,I,M,V,J,T,O,W,S,m,ca,Q;T=a.data;M=new THREE.BinaryLoader;O=new THREE.JSONLoader;S=W=0;Q={scene:new THREE.Scene,geometries:{},materials:{},textures:{},objects:{},cameras:{},lights:{},fogs:{},triggers:{},empties:{}};a=!1;for(t in T.objects)if(A=T.objects[t],A.meshCollider){a=!0;break}if(a)Q.scene.collisions=new THREE.CollisionSystem;if(T.transform){a=T.transform.position;C=T.transform.rotation;var ea=T.transform.scale;a&&Q.scene.position.set(a[0],a[1],a[2]);C&&Q.scene.rotation.set(C[0], +C[1],C[2]);ea&&Q.scene.scale.set(ea[0],ea[1],ea[2]);(a||C||ea)&&Q.scene.updateMatrix()}a=function(){S-=1;u();c.onLoadComplete()};for(x in T.cameras)C=T.cameras[x],C.type=="perspective"?F=new THREE.PerspectiveCamera(C.fov,C.aspect,C.near,C.far):C.type=="ortho"&&(F=new THREE.OrthographicCamera(C.left,C.right,C.top,C.bottom,C.near,C.far)),z=C.position,C=C.target,F.position.set(z[0],z[1],z[2]),F.target=new THREE.Vector3(C[0],C[1],C[2]),Q.cameras[x]=F;for(y in T.lights)x=T.lights[y],F=x.color!==void 0? +x.color:16777215,C=x.intensity!==void 0?x.intensity:1,x.type=="directional"?(z=x.direction,J=new THREE.DirectionalLight(F,C),J.position.set(z[0],z[1],z[2]),J.position.normalize()):x.type=="point"?(z=x.position,d=x.distance,J=new THREE.PointLight(F,C,d),J.position.set(z[0],z[1],z[2])):x.type=="ambient"&&(J=new THREE.AmbientLight(F)),Q.scene.add(J),Q.lights[y]=J;for(w in T.fogs)y=T.fogs[w],y.type=="linear"?I=new THREE.Fog(0,y.near,y.far):y.type=="exp2"&&(I=new THREE.FogExp2(0,y.density)),C=y.color, +I.color.setRGB(C[0],C[1],C[2]),Q.fogs[w]=I;if(Q.cameras&&T.defaults.camera)Q.currentCamera=Q.cameras[T.defaults.camera];if(Q.fogs&&T.defaults.fog)Q.scene.fog=Q.fogs[T.defaults.fog];C=T.defaults.bgcolor;Q.bgColor=new THREE.Color;Q.bgColor.setRGB(C[0],C[1],C[2]);Q.bgColorAlpha=T.defaults.bgalpha;for(p in T.geometries)if(w=T.geometries[p],w.type=="bin_mesh"||w.type=="ascii_mesh")W+=1,c.onLoadStart();m=W;for(p in T.geometries)w=T.geometries[p],w.type=="cube"?(G=new THREE.CubeGeometry(w.width,w.height, +w.depth,w.segmentsWidth,w.segmentsHeight,w.segmentsDepth,null,w.flipped,w.sides),Q.geometries[p]=G):w.type=="plane"?(G=new THREE.PlaneGeometry(w.width,w.height,w.segmentsWidth,w.segmentsHeight),Q.geometries[p]=G):w.type=="sphere"?(G=new THREE.SphereGeometry(w.radius,w.segmentsWidth,w.segmentsHeight),Q.geometries[p]=G):w.type=="cylinder"?(G=new THREE.CylinderGeometry(w.topRad,w.botRad,w.height,w.radSegs,w.heightSegs),Q.geometries[p]=G):w.type=="torus"?(G=new THREE.TorusGeometry(w.radius,w.tube,w.segmentsR, +w.segmentsT),Q.geometries[p]=G):w.type=="icosahedron"?(G=new THREE.IcosahedronGeometry(w.subdivisions),Q.geometries[p]=G):w.type=="bin_mesh"?M.load(e(w.url,T.urlBaseType),n(p)):w.type=="ascii_mesh"?O.load(e(w.url,T.urlBaseType),n(p)):w.type=="embedded_mesh"&&(w=T.embeds[w.id])&&O.createModel(w,o(p),"");for(B in T.textures)if(p=T.textures[B],p.url instanceof Array){S+=p.url.length;for(M=0;M=57344&&(c-=2048);c++;for(var e=new Float32Array(8*c),f=1,h=0;h<8;h++){for(var k=0,m=0;m>1^-(n&1);e[8*m+h]=k}f+=c}c=b.length-f;k=new Uint16Array(c);for(h=m=0;h=this.maxCount-3&&n(this)};this.begin=function(){this.count=0; -this.hasNormal=this.hasPos=!1};this.end=function(b){if(this.count!=0){for(var c=this.count*3;cthis.size-1&&(p=this.size-1);var x=Math.floor(t-n);x<1&&(x=1);t=Math.floor(t+n);t>this.size-1&&(t=this.size-1);var v=Math.floor(w-n);v<1&&(v=1);n=Math.floor(w+n);n>this.size-1&&(n=this.size- -1);for(var A,z,y,D,E,C;u0&&(this.field[y+A]+=D)}}};this.addPlaneX=function(b,c){var h,k,m,n,p,t=this.size,w=this.yd,u=this.zd,x=this.field,v=t*Math.sqrt(b/c);v>t&&(v=t);for(h=0;h0)for(k=0;kw&&(A=w);for(k=0;k0){p=k*u;for(h=0;hsize&&(dist=size);for(m=0;m0){p=zd*m;for(k=0;k=57344&&(b-=2048);b++;for(var c=new Float32Array(8*b),e=1,f=0;f<8;f++){for(var k=0,h=0;h>1^-(l&1);c[8*h+f]=k}e+=b}b=a.length-e;k=new Uint16Array(b);for(f=h=0;f=this.maxCount-3&&l(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&&(n=this.size-1);var v=Math.floor(o-l);v<1&&(v=1);o=Math.floor(o+l);o>this.size-1&&(o=this.size-1);var t=Math.floor(u-l);t<1&&(t=1);l=Math.floor(u+l);l>this.size-1&&(l=this.size- +1);for(var y,x,w,B,A,z;p0&&(this.field[w+y]+=B)}}};this.addPlaneX=function(a,b){var f,k,h,l,n,o=this.size,u=this.yd,p=this.zd,v=this.field,t=o*Math.sqrt(a/b);t>o&&(t=o);for(f=0;f0)for(k=0;ku&&(y=u);for(k=0;k0){n=k*p;for(f=0;fsize&&(dist=size);for(h=0;h0){n=zd*h;for(k=0;kk?this.hits.push(h):this.hits.unshift(h),k=f;return this.hits}; -THREE.CollisionSystem.prototype.rayCastNearest=function(b){var c=this.rayCastAll(b);if(c.length==0)return null;for(var e=0;c[e]instanceof THREE.MeshCollider;){var f=this.rayMesh(b,c[e]);if(f.distc.length)return null;return c[e]}; -THREE.CollisionSystem.prototype.rayCast=function(b,c){if(c instanceof THREE.PlaneCollider)return this.rayPlane(b,c);else if(c instanceof THREE.SphereCollider)return this.raySphere(b,c);else if(c instanceof THREE.BoxCollider)return this.rayBox(b,c);else if(c instanceof THREE.MeshCollider&&c.box)return this.rayBox(b,c.box)}; -THREE.CollisionSystem.prototype.rayMesh=function(b,c){for(var e=this.makeRayLocal(b,c.mesh),f=Number.MAX_VALUE,h,k=0;k=n*h))return Number.MAX_VALUE;m/=n;n=THREE.CollisionSystem.__v3;n.copy(b.direction);n.multiplyScalar(m);n.addSelf(b.origin);Math.abs(k.x)> -Math.abs(k.y)?Math.abs(k.x)>Math.abs(k.z)?(b=n.y-c.y,k=e.y-c.y,h=f.y-c.y,n=n.z-c.z,e=e.z-c.z,f=f.z-c.z):(b=n.x-c.x,k=e.x-c.x,h=f.x-c.x,n=n.y-c.y,e=e.y-c.y,f=f.y-c.y):Math.abs(k.y)>Math.abs(k.z)?(b=n.x-c.x,k=e.x-c.x,h=f.x-c.x,n=n.z-c.z,e=e.z-c.z,f=f.z-c.z):(b=n.x-c.x,k=e.x-c.x,h=f.x-c.x,n=n.y-c.y,e=e.y-c.y,f=f.y-c.y);c=k*f-e*h;if(c==0)return Number.MAX_VALUE;c=1/c;f=(b*f-n*h)*c;if(!(f>=0))return Number.MAX_VALUE;c*=k*n-e*b;if(!(c>=0))return Number.MAX_VALUE;if(!(1-f-c>=0))return Number.MAX_VALUE;return m}; -THREE.CollisionSystem.prototype.makeRayLocal=function(b,c){var e=THREE.CollisionSystem.__m;THREE.Matrix4.makeInvert(c.matrixWorld,e);var f=THREE.CollisionSystem.__r;f.origin.copy(b.origin);f.direction.copy(b.direction);e.multiplyVector3(f.origin);e.rotateAxis(f.direction);f.direction.normalize();return f}; -THREE.CollisionSystem.prototype.rayBox=function(b,c){var e;c.dynamic&&c.mesh&&c.mesh.matrixWorld?e=this.makeRayLocal(b,c.mesh):(e=THREE.CollisionSystem.__r,e.origin.copy(b.origin),e.direction.copy(b.direction));var f=0,h=0,k=0,m=0,n=0,p=0,t=!0;e.origin.xc.max.x&&(f=c.max.x-e.origin.x,f/=e.direction.x,t=!1,m=1);e.origin.yc.max.y&&(h=c.max.y-e.origin.y,h/=e.direction.y, -t=!1,n=1);e.origin.zc.max.z&&(k=c.max.z-e.origin.z,k/=e.direction.z,t=!1,p=1);if(t)return-1;t=0;h>f&&(t=1,f=h);k>f&&(t=2,f=k);switch(t){case 0:n=e.origin.y+e.direction.y*f;if(nc.max.y)return Number.MAX_VALUE;e=e.origin.z+e.direction.z*f;if(ec.max.z)return Number.MAX_VALUE;c.normal.set(m,0,0);break;case 1:m=e.origin.x+e.direction.x*f;if(mc.max.x)return Number.MAX_VALUE;e=e.origin.z+e.direction.z* -f;if(ec.max.z)return Number.MAX_VALUE;c.normal.set(0,n,0);break;case 2:m=e.origin.x+e.direction.x*f;if(mc.max.x)return Number.MAX_VALUE;n=e.origin.y+e.direction.y*f;if(nc.max.y)return Number.MAX_VALUE;c.normal.set(0,0,p)}return f};THREE.CollisionSystem.prototype.rayPlane=function(b,c){var e=b.direction.dot(c.normal),f=c.point.dot(c.normal);if(e<0)e=(f-b.origin.dot(c.normal))/e;else return Number.MAX_VALUE;return e>0?e:Number.MAX_VALUE}; -THREE.CollisionSystem.prototype.raySphere=function(b,c){var e=c.center.clone().subSelf(b.origin);if(e.lengthSq=0)return Math.abs(f)-Math.sqrt(e);return Number.MAX_VALUE};THREE.CollisionSystem.__v1=new THREE.Vector3;THREE.CollisionSystem.__v2=new THREE.Vector3;THREE.CollisionSystem.__v3=new THREE.Vector3;THREE.CollisionSystem.__nr=new THREE.Vector3;THREE.CollisionSystem.__m=new THREE.Matrix4; -THREE.CollisionSystem.__r=new THREE.Ray;THREE.CollisionUtils={};THREE.CollisionUtils.MeshOBB=function(b){b.geometry.computeBoundingBox();var c=b.geometry.boundingBox,e=new THREE.Vector3(c.x[0],c.y[0],c.z[0]),c=new THREE.Vector3(c.x[1],c.y[1],c.z[1]),e=new THREE.BoxCollider(e,c);e.mesh=b;return e};THREE.CollisionUtils.MeshAABB=function(b){var c=THREE.CollisionUtils.MeshOBB(b);c.min.addSelf(b.position);c.max.addSelf(b.position);c.dynamic=!1;return c}; -THREE.CollisionUtils.MeshColliderWBox=function(b){return new THREE.MeshCollider(b,THREE.CollisionUtils.MeshOBB(b))}; -if(THREE.WebGLRenderer)THREE.AnaglyphWebGLRenderer=function(b){THREE.WebGLRenderer.call(this,b);var c=this,e=this.setSize,f=this.render,h=new THREE.PerspectiveCamera,k=new THREE.PerspectiveCamera,m=new THREE.Matrix4,n=new THREE.Matrix4,p,t,w;h.matrixAutoUpdate=k.matrixAutoUpdate=!1;var b={minFilter:THREE.LinearFilter,magFilter:THREE.NearestFilter,format:THREE.RGBAFormat},u=new THREE.WebGLRenderTarget(512,512,b),x=new THREE.WebGLRenderTarget(512,512,b),v=new THREE.PerspectiveCamera(53,1,1,1E4);v.position.z= -2;_material=new THREE.ShaderMaterial({uniforms:{mapLeft:{type:"t",value:0,texture:u},mapRight:{type:"t",value:1,texture:x}},vertexShader:"varying vec2 vUv;\nvoid main() {\nvUv = vec2( uv.x, 1.0 - uv.y );\ngl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}",fragmentShader:"uniform sampler2D mapLeft;\nuniform sampler2D mapRight;\nvarying vec2 vUv;\nvoid main() {\nvec4 colorL, colorR;\nvec2 uv = vUv;\ncolorL = texture2D( mapLeft, uv );\ncolorR = texture2D( mapRight, uv );\ngl_FragColor = vec4( colorL.g * 0.7 + colorL.b * 0.3, colorR.g, colorR.b, colorL.a + colorR.a ) * 1.1;\n}"}); -var A=new THREE.Scene;A.add(new THREE.Mesh(new THREE.PlaneGeometry(2,2),_material));this.setSize=function(b,f){e.call(c,b,f);u.width=b;u.height=f;x.width=b;x.height=f};this.render=function(b,e){e.update(null,!0);if(p!==e.aspect||t!==e.near||w!==e.fov){p=e.aspect;t=e.near;w=e.fov;var D=e.projectionMatrix.clone(),E=125/30*0.5,C=E*t/125,G=t*Math.tan(w*Math.PI/360),I;m.n14=E;n.n14=-E;E=-G*p+C;I=G*p+C;D.n11=2*t/(I-E);D.n13=(I+E)/(I-E);h.projectionMatrix=D.clone();E=-G*p-C;I=G*p-C;D.n11=2*t/(I-E);D.n13= -(I+E)/(I-E);k.projectionMatrix=D.clone()}h.matrix=e.matrixWorld.clone().multiplySelf(n);h.update(null,!0);h.position.copy(e.position);h.near=t;h.far=e.far;f.call(c,b,h,u,!0);k.matrix=e.matrixWorld.clone().multiplySelf(m);k.update(null,!0);k.position.copy(e.position);k.near=t;k.far=e.far;f.call(c,b,k,x,!0);f.call(c,A,v)}}; -if(THREE.WebGLRenderer)THREE.CrosseyedWebGLRenderer=function(b){THREE.WebGLRenderer.call(this,b);this.autoClear=!1;var c=this,e=this.setSize,f=this.render,h,k,m=new THREE.PerspectiveCamera;m.target=new THREE.Vector3(0,0,0);var n=new THREE.PerspectiveCamera;n.target=new THREE.Vector3(0,0,0);c.separation=10;if(b&&b.separation!==void 0)c.separation=b.separation;this.setSize=function(b,f){e.call(c,b,f);h=b/2;k=f};this.render=function(b,e){this.clear();m.fov=e.fov;m.aspect=0.5*e.aspect;m.near=e.near;m.far= -e.far;m.updateProjectionMatrix();m.position.copy(e.position);m.target.copy(e.target);m.translateX(c.separation);m.lookAt(m.target);n.projectionMatrix=m.projectionMatrix;n.position.copy(e.position);n.target.copy(e.target);n.translateX(-c.separation);n.lookAt(n.target);this.setViewport(0,0,h,k);f.call(c,b,m);this.setViewport(h,0,h,k);f.call(c,b,n,!1)}}; +2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,3,8,9,1,8,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,9,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,3,8,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1]);THREE.PlaneCollider=function(a,b){this.point=a;this.normal=b};THREE.SphereCollider=function(a,b){this.center=a;this.radius=b;this.radiusSq=b*b};THREE.BoxCollider=function(a,b){this.min=a;this.max=b;this.dynamic=!0;this.normal=new THREE.Vector3}; +THREE.MeshCollider=function(a,b){this.mesh=a;this.box=b;this.numFaces=this.mesh.geometry.faces.length;this.normal=new THREE.Vector3};THREE.CollisionSystem=function(){this.collisionNormal=new THREE.Vector3;this.colliders=[];this.hits=[]};THREE.Collisions=new THREE.CollisionSystem;THREE.CollisionSystem.prototype.merge=function(a){Array.prototype.push.apply(this.colliders,a.colliders);Array.prototype.push.apply(this.hits,a.hits)}; +THREE.CollisionSystem.prototype.rayCastAll=function(a){a.direction.normalize();this.hits.length=0;var b,c,e,f,k=0;b=0;for(c=this.colliders.length;bk?this.hits.push(f):this.hits.unshift(f),k=e;return this.hits}; +THREE.CollisionSystem.prototype.rayCastNearest=function(a){var b=this.rayCastAll(a);if(b.length==0)return null;for(var c=0;b[c]instanceof THREE.MeshCollider;){var e=this.rayMesh(a,b[c]);if(e.distb.length)return null;return b[c]}; +THREE.CollisionSystem.prototype.rayCast=function(a,b){if(b instanceof THREE.PlaneCollider)return this.rayPlane(a,b);else if(b instanceof THREE.SphereCollider)return this.raySphere(a,b);else if(b instanceof THREE.BoxCollider)return this.rayBox(a,b);else if(b instanceof THREE.MeshCollider&&b.box)return this.rayBox(a,b.box)}; +THREE.CollisionSystem.prototype.rayMesh=function(a,b){for(var c=this.makeRayLocal(a,b.mesh),e=Number.MAX_VALUE,f,k=0;k=l*f))return Number.MAX_VALUE;h/=l;l=THREE.CollisionSystem.__v3;l.copy(a.direction);l.multiplyScalar(h);l.addSelf(a.origin);Math.abs(k.x)> +Math.abs(k.y)?Math.abs(k.x)>Math.abs(k.z)?(a=l.y-b.y,k=c.y-b.y,f=e.y-b.y,l=l.z-b.z,c=c.z-b.z,e=e.z-b.z):(a=l.x-b.x,k=c.x-b.x,f=e.x-b.x,l=l.y-b.y,c=c.y-b.y,e=e.y-b.y):Math.abs(k.y)>Math.abs(k.z)?(a=l.x-b.x,k=c.x-b.x,f=e.x-b.x,l=l.z-b.z,c=c.z-b.z,e=e.z-b.z):(a=l.x-b.x,k=c.x-b.x,f=e.x-b.x,l=l.y-b.y,c=c.y-b.y,e=e.y-b.y);b=k*e-c*f;if(b==0)return Number.MAX_VALUE;b=1/b;e=(a*e-l*f)*b;if(!(e>=0))return Number.MAX_VALUE;b*=k*l-c*a;if(!(b>=0))return Number.MAX_VALUE;if(!(1-e-b>=0))return Number.MAX_VALUE;return h}; +THREE.CollisionSystem.prototype.makeRayLocal=function(a,b){var c=THREE.CollisionSystem.__m;THREE.Matrix4.makeInvert(b.matrixWorld,c);var e=THREE.CollisionSystem.__r;e.origin.copy(a.origin);e.direction.copy(a.direction);c.multiplyVector3(e.origin);c.rotateAxis(e.direction);e.direction.normalize();return e}; +THREE.CollisionSystem.prototype.rayBox=function(a,b){var c;b.dynamic&&b.mesh&&b.mesh.matrixWorld?c=this.makeRayLocal(a,b.mesh):(c=THREE.CollisionSystem.__r,c.origin.copy(a.origin),c.direction.copy(a.direction));var e=0,f=0,k=0,h=0,l=0,n=0,o=!0;c.origin.xb.max.x&&(e=b.max.x-c.origin.x,e/=c.direction.x,o=!1,h=1);c.origin.yb.max.y&&(f=b.max.y-c.origin.y,f/=c.direction.y, +o=!1,l=1);c.origin.zb.max.z&&(k=b.max.z-c.origin.z,k/=c.direction.z,o=!1,n=1);if(o)return-1;o=0;f>e&&(o=1,e=f);k>e&&(o=2,e=k);switch(o){case 0:l=c.origin.y+c.direction.y*e;if(lb.max.y)return Number.MAX_VALUE;c=c.origin.z+c.direction.z*e;if(cb.max.z)return Number.MAX_VALUE;b.normal.set(h,0,0);break;case 1:h=c.origin.x+c.direction.x*e;if(hb.max.x)return Number.MAX_VALUE;c=c.origin.z+c.direction.z* +e;if(cb.max.z)return Number.MAX_VALUE;b.normal.set(0,l,0);break;case 2:h=c.origin.x+c.direction.x*e;if(hb.max.x)return Number.MAX_VALUE;l=c.origin.y+c.direction.y*e;if(lb.max.y)return Number.MAX_VALUE;b.normal.set(0,0,n)}return e};THREE.CollisionSystem.prototype.rayPlane=function(a,b){var c=a.direction.dot(b.normal),e=b.point.dot(b.normal);if(c<0)c=(e-a.origin.dot(b.normal))/c;else return Number.MAX_VALUE;return c>0?c:Number.MAX_VALUE}; +THREE.CollisionSystem.prototype.raySphere=function(a,b){var c=b.center.clone().subSelf(a.origin);if(c.lengthSq=0)return Math.abs(e)-Math.sqrt(c);return Number.MAX_VALUE};THREE.CollisionSystem.__v1=new THREE.Vector3;THREE.CollisionSystem.__v2=new THREE.Vector3;THREE.CollisionSystem.__v3=new THREE.Vector3;THREE.CollisionSystem.__nr=new THREE.Vector3;THREE.CollisionSystem.__m=new THREE.Matrix4; +THREE.CollisionSystem.__r=new THREE.Ray;THREE.CollisionUtils={};THREE.CollisionUtils.MeshOBB=function(a){a.geometry.computeBoundingBox();var b=a.geometry.boundingBox,c=new THREE.Vector3(b.x[0],b.y[0],b.z[0]),b=new THREE.Vector3(b.x[1],b.y[1],b.z[1]),c=new THREE.BoxCollider(c,b);c.mesh=a;return c};THREE.CollisionUtils.MeshAABB=function(a){var b=THREE.CollisionUtils.MeshOBB(a);b.min.addSelf(a.position);b.max.addSelf(a.position);b.dynamic=!1;return b}; +THREE.CollisionUtils.MeshColliderWBox=function(a){return new THREE.MeshCollider(a,THREE.CollisionUtils.MeshOBB(a))}; +if(THREE.WebGLRenderer)THREE.AnaglyphWebGLRenderer=function(a){THREE.WebGLRenderer.call(this,a);var b=this,c=this.setSize,e=this.render,f=new THREE.PerspectiveCamera,k=new THREE.PerspectiveCamera,h=new THREE.Matrix4,l=new THREE.Matrix4,n,o,u;f.matrixAutoUpdate=k.matrixAutoUpdate=!1;var a={minFilter:THREE.LinearFilter,magFilter:THREE.NearestFilter,format:THREE.RGBAFormat},p=new THREE.WebGLRenderTarget(512,512,a),v=new THREE.WebGLRenderTarget(512,512,a),t=new THREE.PerspectiveCamera(53,1,1,1E4);t.position.z= +2;_material=new THREE.ShaderMaterial({uniforms:{mapLeft:{type:"t",value:0,texture:p},mapRight:{type:"t",value:1,texture:v}},vertexShader:"varying vec2 vUv;\nvoid main() {\nvUv = vec2( uv.x, 1.0 - uv.y );\ngl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}",fragmentShader:"uniform sampler2D mapLeft;\nuniform sampler2D mapRight;\nvarying vec2 vUv;\nvoid main() {\nvec4 colorL, colorR;\nvec2 uv = vUv;\ncolorL = texture2D( mapLeft, uv );\ncolorR = texture2D( mapRight, uv );\ngl_FragColor = vec4( colorL.g * 0.7 + colorL.b * 0.3, colorR.g, colorR.b, colorL.a + colorR.a ) * 1.1;\n}"}); +var y=new THREE.Scene;y.add(new THREE.Mesh(new THREE.PlaneGeometry(2,2),_material));this.setSize=function(a,e){c.call(b,a,e);p.width=a;p.height=e;v.width=a;v.height=e};this.render=function(a,c){c.update(null,!0);if(n!==c.aspect||o!==c.near||u!==c.fov){n=c.aspect;o=c.near;u=c.fov;var B=c.projectionMatrix.clone(),A=125/30*0.5,z=A*o/125,C=o*Math.tan(u*Math.PI/360),E;h.n14=A;l.n14=-A;A=-C*n+z;E=C*n+z;B.n11=2*o/(E-A);B.n13=(E+A)/(E-A);f.projectionMatrix=B.clone();A=-C*n-z;E=C*n-z;B.n11=2*o/(E-A);B.n13= +(E+A)/(E-A);k.projectionMatrix=B.clone()}f.matrix=c.matrixWorld.clone().multiplySelf(l);f.update(null,!0);f.position.copy(c.position);f.near=o;f.far=c.far;e.call(b,a,f,p,!0);k.matrix=c.matrixWorld.clone().multiplySelf(h);k.update(null,!0);k.position.copy(c.position);k.near=o;k.far=c.far;e.call(b,a,k,v,!0);e.call(b,y,t)}}; +if(THREE.WebGLRenderer)THREE.CrosseyedWebGLRenderer=function(a){THREE.WebGLRenderer.call(this,a);this.autoClear=!1;var b=this,c=this.setSize,e=this.render,f,k,h=new THREE.PerspectiveCamera;h.target=new THREE.Vector3(0,0,0);var l=new THREE.PerspectiveCamera;l.target=new THREE.Vector3(0,0,0);b.separation=10;if(a&&a.separation!==void 0)b.separation=a.separation;this.setSize=function(a,e){c.call(b,a,e);f=a/2;k=e};this.render=function(a,c){this.clear();h.fov=c.fov;h.aspect=0.5*c.aspect;h.near=c.near;h.far= +c.far;h.updateProjectionMatrix();h.position.copy(c.position);h.target.copy(c.target);h.translateX(b.separation);h.lookAt(h.target);l.projectionMatrix=h.projectionMatrix;l.position.copy(c.position);l.target.copy(c.target);l.translateX(-b.separation);l.lookAt(l.target);this.setViewport(0,0,f,k);e.call(b,a,h);this.setViewport(f,0,f,k);e.call(b,a,l,!1)}}; diff --git a/examples/js/Car.js b/examples/js/Car.js index b9ec89eb..bbaf52c6 100644 --- a/examples/js/Car.js +++ b/examples/js/Car.js @@ -106,8 +106,8 @@ THREE.Car = function () { var loader = new THREE.JSONLoader(); - loader.load( { model: bodyURL, callback: function( geometry ) { createBody( geometry ) } } ); - loader.load( { model: wheelURL, callback: function( geometry ) { createWheels( geometry ) } } ); + loader.load( bodyURL, function( geometry ) { createBody( geometry ) } ); + loader.load( wheelURL, function( geometry ) { createWheels( geometry ) } ); }; @@ -115,8 +115,8 @@ THREE.Car = function () { var loader = new THREE.BinaryLoader(); - loader.load( { model: bodyURL, callback: function( geometry ) { createBody( geometry ) } } ); - loader.load( { model: wheelURL, callback: function( geometry ) { createWheels( geometry ) } } ); + loader.load( bodyURL, function( geometry ) { createBody( geometry ) } ); + loader.load( wheelURL, function( geometry ) { createWheels( geometry ) } ); }; diff --git a/examples/js/postprocessing/BloomPass.js b/examples/js/postprocessing/BloomPass.js index ef4e5d05..ca2de01a 100644 --- a/examples/js/postprocessing/BloomPass.js +++ b/examples/js/postprocessing/BloomPass.js @@ -65,7 +65,7 @@ THREE.BloomPass.prototype = { // Render quad with blured scene into texture (convolution pass 1) - THREE.EffectComposer.quad.materials[ 0 ] = this.materialConvolution; + THREE.EffectComposer.quad.material = this.materialConvolution; this.convolutionUniforms[ "tDiffuse" ].texture = readBuffer; this.convolutionUniforms[ "uImageIncrement" ].value = THREE.BloomPass.blurX; @@ -82,7 +82,7 @@ THREE.BloomPass.prototype = { // Render original scene with superimposed blur to texture - THREE.EffectComposer.quad.materials[ 0 ] = this.materialScreen; + THREE.EffectComposer.quad.material = this.materialScreen; this.screenUniforms[ "tDiffuse" ].texture = this.renderTargetY; diff --git a/examples/js/postprocessing/DotScreenPass.js b/examples/js/postprocessing/DotScreenPass.js index e945955c..0cafe262 100644 --- a/examples/js/postprocessing/DotScreenPass.js +++ b/examples/js/postprocessing/DotScreenPass.js @@ -35,7 +35,7 @@ THREE.DotScreenPass.prototype = { this.uniforms[ "tDiffuse" ].texture = readBuffer; this.uniforms[ "tSize" ].value.set( readBuffer.width, readBuffer.height ); - THREE.EffectComposer.quad.materials[ 0 ] = this.material; + THREE.EffectComposer.quad.material = this.material; if ( this.renderToScreen ) { diff --git a/examples/js/postprocessing/FilmPass.js b/examples/js/postprocessing/FilmPass.js index 3575d2bd..3ff68843 100644 --- a/examples/js/postprocessing/FilmPass.js +++ b/examples/js/postprocessing/FilmPass.js @@ -34,7 +34,7 @@ THREE.FilmPass.prototype = { this.uniforms[ "tDiffuse" ].texture = readBuffer; this.uniforms[ "time" ].value += delta; - THREE.EffectComposer.quad.materials[ 0 ] = this.material; + THREE.EffectComposer.quad.material = this.material; if ( this.renderToScreen ) { diff --git a/examples/js/postprocessing/SavePass.js b/examples/js/postprocessing/SavePass.js index 056608c8..ea4478f5 100644 --- a/examples/js/postprocessing/SavePass.js +++ b/examples/js/postprocessing/SavePass.js @@ -43,7 +43,7 @@ THREE.SavePass.prototype = { } - THREE.EffectComposer.quad.materials[ 0 ] = this.material; + THREE.EffectComposer.quad.material = this.material; renderer.render( THREE.EffectComposer.scene, THREE.EffectComposer.camera, this.renderTarget, this.clear ); diff --git a/examples/js/postprocessing/ShaderPass.js b/examples/js/postprocessing/ShaderPass.js index 1c173e84..13c9e755 100644 --- a/examples/js/postprocessing/ShaderPass.js +++ b/examples/js/postprocessing/ShaderPass.js @@ -34,7 +34,7 @@ THREE.ShaderPass.prototype = { } - THREE.EffectComposer.quad.materials[ 0 ] = this.material; + THREE.EffectComposer.quad.material = this.material; if ( this.renderToScreen ) { diff --git a/examples/js/postprocessing/TexturePass.js b/examples/js/postprocessing/TexturePass.js index ea5d8ac6..e0fb1383 100644 --- a/examples/js/postprocessing/TexturePass.js +++ b/examples/js/postprocessing/TexturePass.js @@ -28,7 +28,7 @@ THREE.TexturePass.prototype = { render: function ( renderer, writeBuffer, readBuffer, delta ) { - THREE.EffectComposer.quad.materials[ 0 ] = this.material; + THREE.EffectComposer.quad.material = this.material; renderer.render( THREE.EffectComposer.scene, THREE.EffectComposer.camera, readBuffer ); diff --git a/examples/webgl_animation_skinning.html b/examples/webgl_animation_skinning.html index 44819975..a9139abc 100644 --- a/examples/webgl_animation_skinning.html +++ b/examples/webgl_animation_skinning.html @@ -140,7 +140,7 @@ var material = new THREE.MeshFaceMaterial(); - var originalMaterial = geometry.materials[ 0 ][ 0 ]; + var originalMaterial = geometry.materials[ 0 ]; originalMaterial.skinning = true; originalMaterial.transparent = true; diff --git a/examples/webgl_geometry_blenderexport_colors.html b/examples/webgl_geometry_blenderexport_colors.html index 85ad0a2d..42b028ea 100644 --- a/examples/webgl_geometry_blenderexport_colors.html +++ b/examples/webgl_geometry_blenderexport_colors.html @@ -91,20 +91,24 @@ function createScene1( geometry ) { - geometry.materials[0][0].shading = THREE.FlatShading; + geometry.materials[ 0 ].shading = THREE.FlatShading; - var material = [ new THREE.MeshFaceMaterial(), new THREE.MeshLambertMaterial( { color: 0xffffff, opacity:0.9, shading:THREE.FlatShading, wireframe: true, wireframeLinewidth: 2 } ) ]; - - mesh = new THREE.Mesh( geometry, material ); + mesh = new THREE.Object3D(); mesh.position.x = 400; mesh.scale.x = mesh.scale.y = mesh.scale.z = 250; scene.add( mesh ); + var part1 = new THREE.Mesh( geometry, new THREE.MeshFaceMaterial() ); + mesh.add( part1 ); + + var part2 = new THREE.Mesh( geometry, new THREE.MeshLambertMaterial( { color: 0xffffff, opacity: 0.9, shading: THREE.FlatShading, wireframe: true, wireframeLinewidth: 2, transparent: true } ) ); + mesh.add( part2 ); + } function createScene2( geometry ) { - geometry.materials[0][0].shading = THREE.FlatShading; + geometry.materials[ 0 ].shading = THREE.FlatShading; var material = new THREE.MeshFaceMaterial(); diff --git a/examples/webgl_geometry_colors.html b/examples/webgl_geometry_colors.html index 61705265..2c77924b 100644 --- a/examples/webgl_geometry_colors.html +++ b/examples/webgl_geometry_colors.html @@ -48,7 +48,7 @@ var camera, scene, renderer; - var mesh, mesh2, mesh3, light; + var group1, group2, group3, light; var mouseX = 0, mouseY = 0; @@ -100,7 +100,7 @@ geometry2 = new THREE.IcosahedronGeometry( 1 ), geometry3 = new THREE.IcosahedronGeometry( 1 ); - for ( var i = 0; i < geometry.faces.length; i++ ) { + for ( var i = 0; i < geometry.faces.length; i ++ ) { f = geometry.faces[ i ]; f2 = geometry2.faces[ i ]; @@ -137,27 +137,45 @@ var materials = [ new THREE.MeshLambertMaterial( { color: 0xffffff, shading: THREE.FlatShading, vertexColors: THREE.VertexColors } ), - new THREE.MeshBasicMaterial( { color: 0x000000, shading: THREE.FlatShading, wireframe: true } ) + new THREE.MeshBasicMaterial( { color: 0x000000, shading: THREE.FlatShading, wireframe: true, transparent: true } ) ]; - mesh = new THREE.Mesh( geometry, materials ); - mesh.position.x = -400; - mesh.scale.x = mesh.scale.y = mesh.scale.z = 200; - mesh.rotation.x = -1.87; - scene.add( mesh ); + group1 = new THREE.Object3D(); + group1.position.x = -400; + group1.scale.x = group1.scale.y = group1.scale.z = 200; + group1.rotation.x = -1.87; + scene.add( group1 ); - mesh2 = new THREE.Mesh( geometry2, materials ); - mesh2.position.x = 400; - mesh2.rotation.x = 0; - mesh2.scale = mesh.scale; - scene.add( mesh2 ); + var p1 = new THREE.Mesh( geometry, materials[ 0 ] ); + var p2 = new THREE.Mesh( geometry, materials[ 1 ] ); - mesh3 = new THREE.Mesh( geometry3, materials ); - mesh3.position.x = 0; - mesh3.rotation.x = 0; - mesh3.scale = mesh.scale; - scene.add( mesh3 ); + group1.add( p1 ); + group1.add( p2 ); + + group2 = new THREE.Object3D(); + group2.position.x = 400; + group2.rotation.x = 0; + group2.scale = group1.scale; + scene.add( group2 ); + + var p1 = new THREE.Mesh( geometry2, materials[ 0 ] ); + var p2 = new THREE.Mesh( geometry2, materials[ 1 ] ); + + group2.add( p1 ); + group2.add( p2 ); + + group3 = new THREE.Object3D(); + group3.position.x = 0; + group3.rotation.x = 0; + group3.scale = group1.scale; + scene.add( group3 ); + + var p1 = new THREE.Mesh( geometry3, materials[ 0 ] ); + var p2 = new THREE.Mesh( geometry3, materials[ 1 ] ); + + group3.add( p1 ); + group3.add( p2 ); renderer = new THREE.WebGLRenderer( { antialias: true } ); renderer.setSize( window.innerWidth, window.innerHeight ); diff --git a/examples/webgl_geometry_text.html b/examples/webgl_geometry_text.html index a92e3879..c6a16268 100644 --- a/examples/webgl_geometry_text.html +++ b/examples/webgl_geometry_text.html @@ -441,11 +441,13 @@ bend: bend, - material: textMaterialFront, - extrudeMaterial: textMaterialSide + material: 0, + extrudeMaterial: 1 }); + textGeo.materials = [ textMaterialFront, textMaterialSide ]; + textGeo.computeBoundingBox(); textGeo.computeVertexNormals(); @@ -460,7 +462,7 @@ var face = textGeo.faces[ i ]; - if ( face.materials[ 0 ].id == textMaterialSide.id ) { + if ( face.materialIndex == 1 ) { for ( var j = 0; j < face.vertexNormals.length; j ++ ) { diff --git a/examples/webgl_interactive_draggablecubes.html b/examples/webgl_interactive_draggablecubes.html index 384bb9b0..a3f67c98 100644 --- a/examples/webgl_interactive_draggablecubes.html +++ b/examples/webgl_interactive_draggablecubes.html @@ -56,7 +56,7 @@ var object = new THREE.Mesh( geometry, new THREE.MeshLambertMaterial( { color: Math.random() * 0xffffff } ) ); - object.materials[ 0 ].ambient = object.materials[ 0 ].color; + object.material.ambient = object.material.color; object.position.x = Math.random() * 1000 - 500; object.position.y = Math.random() * 600 - 300; @@ -153,10 +153,10 @@ if ( INTERSECTED != intersects[ 0 ].object ) { - if ( INTERSECTED ) INTERSECTED.materials[ 0 ].color.setHex( INTERSECTED.currentHex ); + if ( INTERSECTED ) INTERSECTED.material.color.setHex( INTERSECTED.currentHex ); INTERSECTED = intersects[ 0 ].object; - INTERSECTED.currentHex = INTERSECTED.materials[ 0 ].color.getHex(); + INTERSECTED.currentHex = INTERSECTED.material.color.getHex(); plane.position.copy( INTERSECTED.position ); @@ -166,7 +166,7 @@ } else { - if ( INTERSECTED ) INTERSECTED.materials[ 0 ].color.setHex( INTERSECTED.currentHex ); + if ( INTERSECTED ) INTERSECTED.material.color.setHex( INTERSECTED.currentHex ); INTERSECTED = null; diff --git a/examples/webgl_materials2.html b/examples/webgl_materials2.html index d9a00835..c3df6ba0 100644 --- a/examples/webgl_materials2.html +++ b/examples/webgl_materials2.html @@ -227,7 +227,7 @@ pointLight = new THREE.PointLight( 0xffffff, 2, 800 ); scene.add( pointLight ); - particleLight.materials[ 0 ].color = pointLight.color; + particleLight.material.color = pointLight.color; pointLight.position = particleLight.position; // diff --git a/examples/webgl_materials_cars.html b/examples/webgl_materials_cars.html index 35644be2..87301a50 100644 --- a/examples/webgl_materials_cars.html +++ b/examples/webgl_materials_cars.html @@ -532,9 +532,9 @@ $( button_name( car, i ) ).counter = i; $( button_name( car, i ) ).addEventListener( 'click', function() { - for ( var j = 0; j < material_indices.length; j++ ) { + for ( var j = 0; j < material_indices.length; j ++ ) { - geometry.materials[ material_indices [ j ] ][ 0 ] = materials[ this.counter ][ 1 ]; + geometry.materials[ material_indices [ j ] ] = materials[ this.counter ][ 1 ]; } @@ -557,7 +557,7 @@ for ( var i in CARS[ car ].mmap ) { - geometry.materials[ i ][ 0 ] = CARS[ car ].mmap[ i ]; + geometry.materials[ i ] = CARS[ car ].mmap[ i ]; } diff --git a/examples/webgl_materials_cars_camaro.html b/examples/webgl_materials_cars_camaro.html index 12812459..d4288617 100644 --- a/examples/webgl_materials_cars_camaro.html +++ b/examples/webgl_materials_cars_camaro.html @@ -147,7 +147,7 @@ var i, src = "", parent = $( "buttons" ); - for( i = 0; i < materials.length; i++ ) { + for( i = 0; i < materials.length; i ++ ) { src += ''; @@ -158,7 +158,7 @@ for( i = 0; i < materials.length; i ++ ) { $( "m" + i ).counter = i; - $( "m" + i ).addEventListener( 'click', function() { geometry.materials[ 0 ][ 0 ] = materials[ this.counter ][ 1 ] }, false ); + $( "m" + i ).addEventListener( 'click', function() { geometry.materials[ 0 ] = materials[ this.counter ][ 1 ] }, false ); } @@ -168,15 +168,15 @@ var s = 75, m = new THREE.MeshFaceMaterial(); - geometry.materials[ 0 ][ 0 ] = materials.body[ 0 ][ 1 ]; // car body - geometry.materials[ 1 ][ 0 ] = materials.chrome; // wheels chrome - geometry.materials[ 2 ][ 0 ] = materials.chrome; // grille chrome - geometry.materials[ 3 ][ 0 ] = materials.darkchrome; // door lines - geometry.materials[ 4 ][ 0 ] = materials.glass; // windshield - geometry.materials[ 5 ][ 0 ] = materials.interior; // interior - geometry.materials[ 6 ][ 0 ] = materials.tire; // tire - geometry.materials[ 7 ][ 0 ] = materials.black; // tireling - geometry.materials[ 8 ][ 0 ] = materials.black; // behind grille + geometry.materials[ 0 ] = materials.body[ 0 ][ 1 ]; // car body + geometry.materials[ 1 ] = materials.chrome; // wheels chrome + geometry.materials[ 2 ] = materials.chrome; // grille chrome + geometry.materials[ 3 ] = materials.darkchrome; // door lines + geometry.materials[ 4 ] = materials.glass; // windshield + geometry.materials[ 5 ] = materials.interior; // interior + geometry.materials[ 6 ] = materials.tire; // tire + geometry.materials[ 7 ] = materials.black; // tireling + geometry.materials[ 8 ] = materials.black; // behind grille var mesh = new THREE.Mesh( geometry, m ); mesh.rotation.y = 1; diff --git a/examples/webgl_materials_cubemap_dynamic.html b/examples/webgl_materials_cubemap_dynamic.html index 0e089137..8d47654b 100644 --- a/examples/webgl_materials_cubemap_dynamic.html +++ b/examples/webgl_materials_cubemap_dynamic.html @@ -51,8 +51,127 @@ motion blur: b - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -817,15 +936,15 @@ var materials = car.bodyGeometry.materials; - materials[ 0 ][ 0 ] = mlib.body[ 0 ][ 1 ]; // body - materials[ 1 ][ 0 ] = mlib[ "Dark chrome" ]; // front under lights, back + materials[ 0 ] = mlib.body[ 0 ][ 1 ]; // body + materials[ 1 ] = mlib[ "Dark chrome" ]; // front under lights, back // WHEELS materials = car.wheelGeometry.materials; - materials[ 0 ][ 0 ] = mlib[ "Chrome" ]; // insides - materials[ 1 ][ 0 ] = mlib[ "Black rough" ]; // tire + materials[ 0 ] = mlib[ "Chrome" ]; // insides + materials[ 1 ] = mlib[ "Black rough" ]; // tire } @@ -844,21 +963,21 @@ var materials = car.bodyGeometry.materials; - materials[ 0 ][ 0 ] = mlib[ "Black metal" ]; // top, front center, back sides - materials[ 1 ][ 0 ] = mlib[ "Chrome" ]; // front sides - materials[ 2 ][ 0 ] = mlib[ "Chrome" ]; // engine - materials[ 3 ][ 0 ] = mlib[ "Dark chrome" ]; // small chrome things - materials[ 4 ][ 0 ] = mlib[ "Red glass" ]; // backlights - materials[ 5 ][ 0 ] = mlib[ "Orange glass" ]; // back signals - materials[ 6 ][ 0 ] = mlib[ "Black rough" ]; // bottom, interior - materials[ 7 ][ 0 ] = mlib[ "Dark glass" ]; // windshield + materials[ 0 ] = mlib[ "Black metal" ]; // top, front center, back sides + materials[ 1 ] = mlib[ "Chrome" ]; // front sides + materials[ 2 ] = mlib[ "Chrome" ]; // engine + materials[ 3 ] = mlib[ "Dark chrome" ]; // small chrome things + materials[ 4 ] = mlib[ "Red glass" ]; // backlights + materials[ 5 ] = mlib[ "Orange glass" ]; // back signals + materials[ 6 ] = mlib[ "Black rough" ]; // bottom, interior + materials[ 7 ] = mlib[ "Dark glass" ]; // windshield // WHEELS materials = car.wheelGeometry.materials; - materials[ 0 ][ 0 ] = mlib[ "Chrome" ]; // insides - materials[ 1 ][ 0 ] = mlib[ "Black rough" ]; // tire + materials[ 0 ] = mlib[ "Chrome" ]; // insides + materials[ 1 ] = mlib[ "Black rough" ]; // tire } @@ -900,16 +1019,16 @@ if ( veyron.loaded ) { - veyron.bodyGeometry.materials[ 1 ][ 0 ] = mlib[ "ChromeN" ]; - veyron.bodyGeometry.materials[ 2 ][ 0 ] = mlib[ "ChromeN" ]; + veyron.bodyGeometry.materials[ 1 ] = mlib[ "ChromeN" ]; + veyron.bodyGeometry.materials[ 2 ] = mlib[ "ChromeN" ]; - veyron.wheelGeometry.materials[ 0 ][ 0 ] = mlib[ "ChromeN" ]; + veyron.wheelGeometry.materials[ 0 ] = mlib[ "ChromeN" ]; } if ( gallardo.loaded ) { - gallardo.wheelGeometry.materials[ 0 ][ 0 ] = mlib[ "ChromeN" ]; + gallardo.wheelGeometry.materials[ 0 ] = mlib[ "ChromeN" ]; } @@ -917,16 +1036,16 @@ if ( veyron.loaded ) { - veyron.bodyGeometry.materials[ 1 ][ 0 ] = mlib[ "Chrome" ]; - veyron.bodyGeometry.materials[ 2 ][ 0 ] = mlib[ "Chrome" ]; + veyron.bodyGeometry.materials[ 1 ] = mlib[ "Chrome" ]; + veyron.bodyGeometry.materials[ 2 ] = mlib[ "Chrome" ]; - veyron.wheelGeometry.materials[ 0 ][ 0 ] = mlib[ "Chrome" ]; + veyron.wheelGeometry.materials[ 0 ] = mlib[ "Chrome" ]; } if ( gallardo.loaded ) { - gallardo.wheelGeometry.materials[ 0 ][ 0 ] = mlib[ "Chrome" ]; + gallardo.wheelGeometry.materials[ 0 ] = mlib[ "Chrome" ]; } diff --git a/examples/webgl_materials_grass.html b/examples/webgl_materials_grass.html index e5a688d4..aaa762fc 100644 --- a/examples/webgl_materials_grass.html +++ b/examples/webgl_materials_grass.html @@ -47,7 +47,7 @@ for ( var i = 0; i < 15; i ++ ) { mesh = levels[ i ] = new THREE.Mesh( geometry, new THREE.MeshBasicMaterial( { map: new THREE.Texture( generateTextureLevel( bitmap ) ), transparent: true, depthTest: false } ) ); - mesh.materials[0].map.needsUpdate = true; + mesh.material.map.needsUpdate = true; mesh.rotation.x = - 90 * ( Math.PI / 180 ); mesh.position.y = i * 0.25; diff --git a/examples/webgl_materials_normalmap.html b/examples/webgl_materials_normalmap.html index d3eb547c..dd10192d 100644 --- a/examples/webgl_materials_normalmap.html +++ b/examples/webgl_materials_normalmap.html @@ -222,6 +222,8 @@ geometry.computeTangents(); + geometry.materials = [ material1 ]; + mesh1 = new THREE.Mesh( geometry, material1 ); mesh1.position.x = - scale * 12; mesh1.scale.set( scale, scale, scale ); @@ -238,6 +240,8 @@ loader.statusDomElement.style.display = "none"; + console.log( mesh1 ); + } function onDocumentMouseMove(event) { diff --git a/examples/webgl_shader_lava.html b/examples/webgl_shader_lava.html index 8fa3a7a6..58628bc5 100644 --- a/examples/webgl_shader_lava.html +++ b/examples/webgl_shader_lava.html @@ -170,7 +170,7 @@ } ); - mesh = new THREE.Mesh( new THREE.TorusGeometry( size, 0.3, 30, 30 ), [ material /*, new THREE.MeshBasicMaterial( { color: 0x000000, wireframe: true, wireframeLinewidth: 2 } ) */ ] ); + mesh = new THREE.Mesh( new THREE.TorusGeometry( size, 0.3, 30, 30 ), material ); mesh.rotation.x = 0.3; scene.add( mesh ); diff --git a/examples/webgl_shading_physical.html b/examples/webgl_shading_physical.html index 4d289a42..fabe2c7c 100644 --- a/examples/webgl_shading_physical.html +++ b/examples/webgl_shading_physical.html @@ -346,7 +346,7 @@ var tmpMesh = new THREE.Mesh( geometry, material ); - THREE.ColorUtils.adjustHSV( tmpMesh.materials[ 0 ].color, 0.1, -0.1, 0 ); + THREE.ColorUtils.adjustHSV( tmpMesh.material.color, 0.1, -0.1, 0 ); tmpMesh.position.set( x, y, z ); diff --git a/examples/webgl_shadowmap.html b/examples/webgl_shadowmap.html index e4151735..6e1b2e03 100644 --- a/examples/webgl_shadowmap.html +++ b/examples/webgl_shadowmap.html @@ -247,6 +247,8 @@ var material = new THREE.MeshLambertMaterial( { color: 0xffaa55, morphTargets: true, vertexColors: THREE.FaceColors } ); + geometry.materials[ 0 ] = material; + if ( fudgeColor ) { THREE.ColorUtils.adjustHSV( material.color, 0, 0.5 - Math.random(), 0.5 - Math.random() ); diff --git a/src/core/Face3.js b/src/core/Face3.js index d215afed..b02bf66f 100644 --- a/src/core/Face3.js +++ b/src/core/Face3.js @@ -3,9 +3,9 @@ * @author alteredq / http://alteredqualia.com/ */ -THREE.Face3 = function ( a, b, c, normal, color, materials ) { +THREE.Face3 = function ( a, b, c, normal, color, materialIndex ) { - this.a = a; + this.a = a; this.b = b; this.c = c; @@ -17,7 +17,7 @@ THREE.Face3 = function ( a, b, c, normal, color, materials ) { this.vertexTangents = []; - this.materials = materials instanceof Array ? materials : [ materials ]; + this.materialIndex = materialIndex; this.centroid = new THREE.Vector3(); diff --git a/src/core/Face4.js b/src/core/Face4.js index b5e4bc2b..ea35c1eb 100644 --- a/src/core/Face4.js +++ b/src/core/Face4.js @@ -3,9 +3,9 @@ * @author alteredq / http://alteredqualia.com/ */ -THREE.Face4 = function ( a, b, c, d, normal, color, materials ) { +THREE.Face4 = function ( a, b, c, d, normal, color, materialIndex ) { - this.a = a; + this.a = a; this.b = b; this.c = c; this.d = d; @@ -18,7 +18,7 @@ THREE.Face4 = function ( a, b, c, d, normal, color, materials ) { this.vertexTangents = []; - this.materials = materials instanceof Array ? materials : [ materials ]; + this.materialIndex = materialIndex; this.centroid = new THREE.Vector3(); diff --git a/src/core/Geometry.js b/src/core/Geometry.js index 99611277..c0cdbb44 100644 --- a/src/core/Geometry.js +++ b/src/core/Geometry.js @@ -13,6 +13,8 @@ THREE.Geometry = function () { this.vertices = []; this.colors = []; // one-to-one vertex colors, used in ParticleSystem, Line and Ribbon + this.materials = []; + this.faces = []; this.faceUvs = [[]]; @@ -435,27 +437,27 @@ THREE.Geometry.prototype = { this.boundingSphere = { radius: radius }; }, - - /* - * Checks for duplicate vertices with hashmap. + + /* + * Checks for duplicate vertices with hashmap. * Duplicated vertices are removed - * and faces' vertices are updated. + * and faces' vertices are updated. */ mergeVertices: function() { - + var verticesMap = {}; // Hashmap for looking up vertice by position coordinates (and making sure they are unique) var unique = [], changes = []; - + var v, key; - var precisionPoints = 4; // number of decimal points, eg. 4 for epsilon of 0.0001 + var precisionPoints = 4; // number of decimal points, eg. 4 for epsilon of 0.0001 var precision = Math.pow(10, precisionPoints) var i,il, face; - + for (i=0,il=this.vertices.length;i= 0 ) ? geometry.materials[ geometryGroup.materialIndex ] : object.material; - // this will not work if materials would change in run-time - // it should be refreshed every frame - // but need to do unrollGroupMaterials - // more properly without push to array - // like unrollBufferMaterials + uvType = bufferGuessUVType( material ); + normalType = bufferGuessNormalType( material ); + vertexColorType = bufferGuessVertexColorType( material ); - geometryGroup.__materials = materials; - - uvType = bufferGuessUVType( materials, geometryGroup, object ); - normalType = bufferGuessNormalType( materials, geometryGroup, object ); - vertexColorType = bufferGuessVertexColorType( materials, geometryGroup, object ); - - //console.log("uvType",uvType, "normalType",normalType, "vertexColorType",vertexColorType, object, geometryGroup, materials ); + //console.log( "uvType", uvType, "normalType", normalType, "vertexColorType", vertexColorType, object, geometryGroup, material ); geometryGroup.__vertexArray = new Float32Array( nvertices * 3 ); @@ -881,58 +865,52 @@ THREE.WebGLRenderer = function ( parameters ) { // custom attributes - for ( m = 0, ml = materials.length; m < ml; m ++ ) { + if ( material.attributes ) { - material = materials[ m ]; + if ( geometryGroup.__webglCustomAttributesList === undefined ) { - if ( material.attributes ) { + geometryGroup.__webglCustomAttributesList = []; - if ( geometryGroup.__webglCustomAttributesList === undefined ) { + } - geometryGroup.__webglCustomAttributesList = []; + for ( var a in material.attributes ) { + + // Do a shallow copy of the attribute object so different geometryGroup chunks use different + // attribute buffers which are correctly indexed in the setMeshBuffers function + + originalAttribute = material.attributes[ a ]; + + attribute = {}; + + for ( property in originalAttribute ) { + + attribute[ property ] = originalAttribute[ property ]; } - for ( a in material.attributes ) { + if( !attribute.__webglInitialized || attribute.createUniqueBuffers ) { - // Do a shallow copy of the attribute object so different geometryGroup chunks use different - // attribute buffers which are correctly indexed in the setMeshBuffers function + attribute.__webglInitialized = true; - originalAttribute = material.attributes[ a ]; + size = 1; // "f" and "i" - attribute = {}; + if( attribute.type === "v2" ) size = 2; + else if( attribute.type === "v3" ) size = 3; + else if( attribute.type === "v4" ) size = 4; + else if( attribute.type === "c" ) size = 3; - for ( property in originalAttribute ) { + attribute.size = size; + attribute.array = new Float32Array( nvertices * size ); + attribute.buffer = _gl.createBuffer(); + attribute.buffer.belongsToAttribute = a; - attribute[ property ] = originalAttribute[ property ]; - - } - - if( !attribute.__webglInitialized || attribute.createUniqueBuffers ) { - - attribute.__webglInitialized = true; - - size = 1; // "f" and "i" - - if( attribute.type === "v2" ) size = 2; - else if( attribute.type === "v3" ) size = 3; - else if( attribute.type === "v4" ) size = 4; - else if( attribute.type === "c" ) size = 3; - - attribute.size = size; - attribute.array = new Float32Array( nvertices * size ); - attribute.buffer = _gl.createBuffer(); - attribute.buffer.belongsToAttribute = a; - - originalAttribute.needsUpdate = true; - attribute.__original = originalAttribute; - - } - - geometryGroup.__webglCustomAttributesList.push( attribute ); + originalAttribute.needsUpdate = true; + attribute.__original = originalAttribute; } + geometryGroup.__webglCustomAttributesList.push( attribute ); + } } @@ -2551,6 +2529,7 @@ THREE.WebGLRenderer = function ( parameters ) { } uniforms.map.texture = material.map; + if ( material.map ) { uniforms.offsetRepeat.value.set( material.map.offset.x, material.map.offset.y, material.map.repeat.x, material.map.repeat.y ); @@ -3491,9 +3470,9 @@ THREE.WebGLRenderer = function ( parameters ) { }; - function unrollImmediateBufferMaterials( globject ) { + function unrollImmediateBufferMaterial( globject ) { - var i, l, m, ml, material, + var material, object = globject.object, opaque = globject.opaque, transparent = globject.transparent; @@ -3501,16 +3480,12 @@ THREE.WebGLRenderer = function ( parameters ) { transparent.count = 0; opaque.count = 0; - for ( m = 0, ml = object.materials.length; m < ml; m ++ ) { - - material = object.materials[ m ]; - material.transparent ? addToFixedArray( transparent, material ) : addToFixedArray( opaque, material ); - - } + material = object.material; + material.transparent ? addToFixedArray( transparent, material ) : addToFixedArray( opaque, material ); }; - function unrollBufferMaterials( globject ) { + function unrollBufferMaterial( globject ) { var i, l, m, ml, material, meshMaterial, object = globject.object, @@ -3521,26 +3496,24 @@ THREE.WebGLRenderer = function ( parameters ) { transparent.count = 0; opaque.count = 0; - for ( m = 0, ml = object.materials.length; m < ml; m ++ ) { + meshMaterial = object.material; - meshMaterial = object.materials[ m ]; + if ( meshMaterial instanceof THREE.MeshFaceMaterial ) { - if ( meshMaterial instanceof THREE.MeshFaceMaterial ) { + materialIndex = buffer.materialIndex; - for ( i = 0, l = buffer.materials.length; i < l; i ++ ) { + if ( materialIndex >= 0 ) { - material = buffer.materials[ i ]; - if ( material ) material.transparent ? addToFixedArray( transparent, material ) : addToFixedArray( opaque, material ); - - } - - } else { - - material = meshMaterial; - if ( material ) material.transparent ? addToFixedArray( transparent, material ) : addToFixedArray( opaque, material ); + material = object.geometry.materials[ materialIndex ]; + material.transparent ? addToFixedArray( transparent, material ) : addToFixedArray( opaque, material ); } + } else { + + material = meshMaterial; + if ( material ) material.transparent ? addToFixedArray( transparent, material ) : addToFixedArray( opaque, material ); + } }; @@ -3827,7 +3800,7 @@ THREE.WebGLRenderer = function ( parameters ) { setupMatrices( object, camera, true ); - unrollBufferMaterials( webglObject ); + unrollBufferMaterial( webglObject ); webglObject.render = true; @@ -3885,7 +3858,7 @@ THREE.WebGLRenderer = function ( parameters ) { setupMatrices( object, camera, true ); - unrollImmediateBufferMaterials( webglObject ); + unrollImmediateBufferMaterial( webglObject ); } @@ -4433,23 +4406,15 @@ THREE.WebGLRenderer = function ( parameters ) { }; - function areCustomAttributesDirty( geometryGroup ) { + function areCustomAttributesDirty( geometryGroup, object ) { - var a, m, ml, material, materials; + var material = ( geometryGroup.materialIndex >= 0 ) ? object.geometry.materials[ geometryGroup.materialIndex ] : object.material; - materials = geometryGroup.__materials; + if ( material.attributes ) { - for ( m = 0, ml = materials.length; m < ml; m ++ ) { + for ( var a in material.attributes ) { - material = materials[ m ]; - - if ( material.attributes ) { - - for ( a in material.attributes ) { - - if ( material.attributes[ a ].needsUpdate ) return true; - - } + if ( material.attributes[ a ].needsUpdate ) return true; } @@ -4459,23 +4424,15 @@ THREE.WebGLRenderer = function ( parameters ) { }; - function clearCustomAttributes( geometryGroup ) { + function clearCustomAttributes( geometryGroup, object ) { - var a, m, ml, material, materials; + var material = ( geometryGroup.materialIndex >= 0 ) ? object.geometry.materials[ geometryGroup.materialIndex ] : object.material; - materials = geometryGroup.__materials; + if ( material.attributes ) { - for ( m = 0, ml = materials.length; m < ml; m ++ ) { + for ( var a in material.attributes ) { - material = materials[ m ]; - - if ( material.attributes ) { - - for ( a in material.attributes ) { - - material.attributes[ a ].needsUpdate = false; - - } + material.attributes[ a ].needsUpdate = false; } @@ -4497,7 +4454,7 @@ THREE.WebGLRenderer = function ( parameters ) { geometryGroup = geometry.geometryGroupsList[ i ]; - customAttributeDirty = areCustomAttributesDirty( geometryGroup ); + customAttributeDirty = areCustomAttributesDirty( geometryGroup, object ); if ( geometry.__dirtyVertices || geometry.__dirtyMorphTargets || geometry.__dirtyElements || geometry.__dirtyUvs || geometry.__dirtyNormals || @@ -4517,7 +4474,7 @@ THREE.WebGLRenderer = function ( parameters ) { geometry.__dirtyTangents = false; geometry.__dirtyColors = false; - clearCustomAttributes( geometryGroup ); + clearCustomAttributes( geometryGroup, object ); } else if ( object instanceof THREE.Ribbon ) { @@ -4549,7 +4506,7 @@ THREE.WebGLRenderer = function ( parameters ) { geometry = object.geometry; - customAttributeDirty = areCustomAttributesDirty( geometry ); + customAttributeDirty = areCustomAttributesDirty( geometry, object ); if ( geometry.__dirtyVertices || geometry.__dirtyColors || object.sortParticles || customAttributeDirty ) { @@ -4560,7 +4517,7 @@ THREE.WebGLRenderer = function ( parameters ) { geometry.__dirtyVertices = false; geometry.__dirtyColors = false; - clearCustomAttributes( geometry ); + clearCustomAttributes( geometry, object ); }/* else if ( THREE.MarchingCubes !== undefined && object instanceof THREE.MarchingCubes ) { @@ -4634,44 +4591,17 @@ THREE.WebGLRenderer = function ( parameters ) { function sortFacesByMaterial( geometry ) { - // TODO - // Should optimize by grouping faces with ColorFill / ColorStroke materials - // which could then use vertex color attributes instead of each being - // in its separate VBO - - var i, l, f, fl, face, material, materials, vertices, mhash, ghash, hash_map = {}; + var i, l, f, fl, face, materialIndex, vertices, mhash, ghash, hash_map = {}; var numMorphTargets = geometry.morphTargets !== undefined ? geometry.morphTargets.length : 0; geometry.geometryGroups = {}; - function materialHash( material ) { - - var hash_array = []; - - for ( i = 0, l = material.length; i < l; i ++ ) { - - if ( material[ i ] == undefined ) { - - hash_array.push( "undefined" ); - - } else { - - hash_array.push( material[ i ].id ); - - } - - } - - return hash_array.join( '_' ); - - } - for ( f = 0, fl = geometry.faces.length; f < fl; f ++ ) { face = geometry.faces[ f ]; - materials = face.materials; + materialIndex = face.materialIndex; - mhash = materialHash( materials ); + mhash = ( materialIndex !== undefined ) ? materialIndex : -1; if ( hash_map[ mhash ] == undefined ) { @@ -4683,7 +4613,7 @@ THREE.WebGLRenderer = function ( parameters ) { if ( geometry.geometryGroups[ ghash ] == undefined ) { - geometry.geometryGroups[ ghash ] = { 'faces': [], 'materials': materials, 'vertices': 0, 'numMorphTargets': numMorphTargets }; + geometry.geometryGroups[ ghash ] = { 'faces': [], 'materialIndex': materialIndex, 'vertices': 0, 'numMorphTargets': numMorphTargets }; } @@ -4696,7 +4626,7 @@ THREE.WebGLRenderer = function ( parameters ) { if ( geometry.geometryGroups[ ghash ] == undefined ) { - geometry.geometryGroups[ ghash ] = { 'faces': [], 'materials': materials, 'vertices': 0, 'numMorphTargets': numMorphTargets }; + geometry.geometryGroups[ ghash ] = { 'faces': [], 'materialIndex': materialIndex, 'vertices': 0, 'numMorphTargets': numMorphTargets }; } @@ -4721,21 +4651,25 @@ THREE.WebGLRenderer = function ( parameters ) { function addBuffer( objlist, buffer, object ) { - objlist.push( { - buffer: buffer, object: object, - opaque: { list: [], count: 0 }, - transparent: { list: [], count: 0 } - } ); + objlist.push( + { + buffer: buffer, object: object, + opaque: { list: [], count: 0 }, + transparent: { list: [], count: 0 } + } + ); }; function addBufferImmediate( objlist, object ) { - objlist.push( { - object: object, - opaque: { list: [], count: 0 }, - transparent: { list: [], count: 0 } - } ); + objlist.push( + { + object: object, + opaque: { list: [], count: 0 }, + transparent: { list: [], count: 0 } + } + ); }; @@ -5652,103 +5586,11 @@ THREE.WebGLRenderer = function ( parameters ) { }; - function bufferNeedsSmoothNormals( geometryGroup, object ) { + function bufferGuessVertexColorType( material ) { - var m, ml, i, l, meshMaterial, needsSmoothNormals = false; + if ( material.vertexColors ) { - for ( m = 0, ml = object.materials.length; m < ml; m++ ) { - - meshMaterial = object.materials[ m ]; - - if ( meshMaterial instanceof THREE.MeshFaceMaterial ) { - - for ( i = 0, l = geometryGroup.materials.length; i < l; i++ ) { - - if ( materialNeedsSmoothNormals( geometryGroup.materials[ i ] ) ) { - - needsSmoothNormals = true; - break; - - } - - } - - } else { - - if ( materialNeedsSmoothNormals( meshMaterial ) ) { - - needsSmoothNormals = true; - break; - - } - - } - - if ( needsSmoothNormals ) break; - - } - - return needsSmoothNormals; - - }; - - function unrollGroupMaterials( geometryGroup, object ) { - - var m, ml, i, il, - material, meshMaterial, - materials = []; - - for ( m = 0, ml = object.materials.length; m < ml; m ++ ) { - - meshMaterial = object.materials[ m ]; - - if ( meshMaterial instanceof THREE.MeshFaceMaterial ) { - - for ( i = 0, l = geometryGroup.materials.length; i < l; i ++ ) { - - material = geometryGroup.materials[ i ]; - - if ( material ) { - - materials.push( material ); - - } - - } - - } else { - - material = meshMaterial; - - if ( material ) { - - materials.push( material ); - - } - - } - - } - - return materials; - - }; - - function bufferGuessVertexColorType( materials, geometryGroup, object ) { - - var i, m, ml = materials.length; - - // use vertexColor type from the first material in unrolled materials - - for ( i = 0; i < ml; i ++ ) { - - m = materials[ i ]; - - if ( m.vertexColors ) { - - return m.vertexColors; - - } + return material.vertexColors; } @@ -5756,49 +5598,35 @@ THREE.WebGLRenderer = function ( parameters ) { }; - function bufferGuessNormalType( materials, geometryGroup, object ) { - - var i, m, ml = materials.length; + function bufferGuessNormalType( material ) { // only MeshBasicMaterial and MeshDepthMaterial don't need normals - for ( i = 0; i < ml; i ++ ) { + if ( ( material instanceof THREE.MeshBasicMaterial && !material.envMap ) || material instanceof THREE.MeshDepthMaterial ) { - m = materials[ i ]; - - if ( ( m instanceof THREE.MeshBasicMaterial && !m.envMap ) || m instanceof THREE.MeshDepthMaterial ) continue; - - if ( materialNeedsSmoothNormals( m ) ) { - - return THREE.SmoothShading; - - } else { - - return THREE.FlatShading; - - } + return false; } - return false; + if ( materialNeedsSmoothNormals( material ) ) { + + return THREE.SmoothShading; + + } else { + + return THREE.FlatShading; + + } }; - function bufferGuessUVType( materials, geometryGroup, object ) { - - var i, m, ml = materials.length; + function bufferGuessUVType( material ) { // material must use some texture to require uvs - for ( i = 0; i < ml; i++ ) { + if ( material.map || material.lightMap || material instanceof THREE.ShaderMaterial ) { - m = materials[ i ]; - - if ( m.map || m.lightMap || m instanceof THREE.ShaderMaterial ) { - - return true; - - } + return true; }