diff --git a/build/Three.js b/build/Three.js index 29872b78..13d489b5 100644 --- a/build/Three.js +++ b/build/Three.js @@ -15,64 +15,64 @@ this.y=Math.asin(a.n13);Math.abs(c)>1.0E-5?(this.x=Math.atan2(-a.n23/c,a.n33/c), THREE.Vector4.prototype={constructor:THREE.Vector4,set:function(a,c,b,d){this.x=a;this.y=c;this.z=b;this.w=d;return this},copy:function(a){this.x=a.x;this.y=a.y;this.z=a.z;this.w=a.w!==void 0?a.w:1},clone:function(){return new THREE.Vector4(this.x,this.y,this.z,this.w)},add:function(a,c){this.x=a.x+c.x;this.y=a.y+c.y;this.z=a.z+c.z;this.w=a.w+c.w;return this},addSelf:function(a){this.x+=a.x;this.y+=a.y;this.z+=a.z;this.w+=a.w;return this},sub:function(a,c){this.x=a.x-c.x;this.y=a.y-c.y;this.z=a.z- c.z;this.w=a.w-c.w;return this},subSelf:function(a){this.x-=a.x;this.y-=a.y;this.z-=a.z;this.w-=a.w;return this},multiplyScalar:function(a){this.x*=a;this.y*=a;this.z*=a;this.w*=a;return this},divideScalar:function(a){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,c){this.x+=(a.x-this.x)*c;this.y+=(a.y-this.y)*c;this.z+=(a.z-this.z)*c;this.w+=(a.w-this.w)*c;return this}}; -THREE.Ray=function(a,c){function b(a,b,c){o.sub(c,a);r=o.dot(b);if(r<=0)return null;m=p.add(a,n.copy(b).multiplyScalar(r));return s=c.distanceTo(m)}function d(a,b,c,d){o.sub(d,b);p.sub(c,b);n.sub(a,b);u=o.dot(o);t=o.dot(p);q=o.dot(n);A=p.dot(p);w=p.dot(n);E=1/(u*A-t*t);x=(A*q-t*w)*E;I=(u*w-t*q)*E;return x>=0&&I>=0&&x+I<1}this.origin=a||new THREE.Vector3;this.direction=c||new THREE.Vector3;this.intersectScene=function(a){return this.intersectObjects(a.children)};this.intersectObjects=function(a){var b, -c,d=[];b=0;for(c=a.length;bn.scale.x)return[];m={distance:p,point:n.position,face:null,object:n};o.push(m)}else if(n instanceof THREE.Mesh){p=b(this.origin,this.direction,n.matrixWorld.getPosition());if(p===null||p>n.geometry.boundingSphere.radius*Math.max(n.scale.x,Math.max(n.scale.y,n.scale.z)))return o;var s,q=n.geometry,u=q.vertices,t;n.matrixRotationWorld.extractRotation(n.matrixWorld);p=0;for(r=q.faces.length;p0:s<0)))if(s=k.dot(i.sub(g,a))/s,l.add(a,c.multiplyScalar(s)),m instanceof THREE.Face3)d(l, -g,e,f)&&(m={distance:a.distanceTo(l),point:l.clone(),face:m,object:n},o.push(m));else if(m instanceof THREE.Face4&&(d(l,g,e,h)||d(l,e,f,h)))m={distance:a.distanceTo(l),point:l.clone(),face:m,object:n},o.push(m)}return o};var o=new THREE.Vector3,p=new THREE.Vector3,n=new THREE.Vector3,r,m,s,u,t,q,A,w,E,x,I}; -THREE.Rectangle=function(){function a(){e=d-c;f=g-b}var c,b,d,g,e,f,h=!0;this.getX=function(){return c};this.getY=function(){return b};this.getWidth=function(){return e};this.getHeight=function(){return f};this.getLeft=function(){return c};this.getTop=function(){return b};this.getRight=function(){return d};this.getBottom=function(){return g};this.set=function(e,f,l,o){h=!1;c=e;b=f;d=l;g=o;a()};this.addPoint=function(e,f){h?(h=!1,c=e,b=f,d=e,g=f):(c=ce?d:e,g=g>f?g:f);a()};this.add3Points= -function(e,f,l,o,p,n){h?(h=!1,c=el?e>p?e:p:l>p?l:p,g=f>o?f>n?f:n:o>n?o:n):(c=el?e>p?e>d?e:d:p>d?p:d:l>p?l>d?l:d:p>d?p:d,g=f>o?f>n?f>g?f:g:n>g?n:g:o>n?o>g?o:g:n>g?n:g);a()};this.addRectangle=function(e){h?(h=!1,c=e.getLeft(),b=e.getTop(),d=e.getRight(),g=e.getBottom()):(c=ce.getRight()?d:e.getRight(),g=g> +THREE.Ray=function(a,c){function b(a,b,c){p.sub(c,a);t=p.dot(b);if(t<=0)return null;n=q.add(a,m.copy(b).multiplyScalar(t));return o=c.distanceTo(n)}function d(a,b,c,d){p.sub(d,b);q.sub(c,b);m.sub(a,b);s=p.dot(p);u=p.dot(q);r=p.dot(m);y=q.dot(q);v=q.dot(m);G=1/(s*y-u*u);B=(y*r-u*v)*G;H=(s*v-u*r)*G;return B>=0&&H>=0&&B+H<1}this.origin=a||new THREE.Vector3;this.direction=c||new THREE.Vector3;this.intersectScene=function(a){return this.intersectObjects(a.children)};this.intersectObjects=function(a){var b, +c,d=[];b=0;for(c=a.length;bm.scale.x)return[];n={distance:q,point:m.position,face:null,object:m};p.push(n)}else if(m instanceof THREE.Mesh){q=b(this.origin,this.direction,m.matrixWorld.getPosition());if(q===null||q>m.geometry.boundingSphere.radius*Math.max(m.scale.x,Math.max(m.scale.y,m.scale.z)))return p;var o,s=m.geometry,u=s.vertices,r;m.matrixRotationWorld.extractRotation(m.matrixWorld);q=0;for(t=s.faces.length;q0:o<0)))if(o=l.dot(i.sub(g,a))/o,k.add(a,c.multiplyScalar(o)),n instanceof THREE.Face3)d(k, +g,e,f)&&(n={distance:a.distanceTo(k),point:k.clone(),face:n,object:m},p.push(n));else if(n instanceof THREE.Face4&&(d(k,g,e,h)||d(k,e,f,h)))n={distance:a.distanceTo(k),point:k.clone(),face:n,object:m},p.push(n)}return p};var p=new THREE.Vector3,q=new THREE.Vector3,m=new THREE.Vector3,t,n,o,s,u,r,y,v,G,B,H}; +THREE.Rectangle=function(){function a(){e=d-c;f=g-b}var c,b,d,g,e,f,h=!0;this.getX=function(){return c};this.getY=function(){return b};this.getWidth=function(){return e};this.getHeight=function(){return f};this.getLeft=function(){return c};this.getTop=function(){return b};this.getRight=function(){return d};this.getBottom=function(){return g};this.set=function(e,f,k,p){h=!1;c=e;b=f;d=k;g=p;a()};this.addPoint=function(e,f){h?(h=!1,c=e,b=f,d=e,g=f):(c=ce?d:e,g=g>f?g:f);a()};this.add3Points= +function(e,f,k,p,q,m){h?(h=!1,c=ek?e>q?e:q:k>q?k:q,g=f>p?f>m?f:m:p>m?p:m):(c=ek?e>q?e>d?e:d:q>d?q:d:k>q?k>d?k:d:q>d?q:d,g=f>p?f>m?f>g?f:g:m>g?m:g:p>m?p>g?p:g:m>g?m:g);a()};this.addRectangle=function(e){h?(h=!1,c=e.getLeft(),b=e.getTop(),d=e.getRight(),g=e.getBottom()):(c=ce.getRight()?d:e.getRight(),g=g> e.getBottom()?g:e.getBottom());a()};this.inflate=function(e){c-=e;b-=e;d+=e;g+=e;a()};this.minSelf=function(e){c=c>e.getLeft()?c:e.getLeft();b=b>e.getTop()?b:e.getTop();d=d=0&&Math.min(g,a.getBottom())-Math.max(b,a.getTop())>=0};this.empty=function(){h=!0;g=d=b=c=0;a()};this.isEmpty=function(){return h}}; THREE.Math={clamp:function(a,c,b){return ab?b:a},clampBottom:function(a,c){return a=0&&g>=0&&f>=0&&h>=0?!0:e<0&&g<0||f<0&&h<0?!1:(e<0?c=Math.max(c,e/(e-g)):g<0&&(d=Math.min(d,e/(e-g))),f<0?c=Math.max(c,f/(f-h)):h<0&&(d=Math.min(d,f/(f-h))),df&&h.positionScreen.z0&&x.z<1))f=A[q]=A[q]||new THREE.RenderableParticle,q++,t=f,t.x=x.x/x.w,t.y=x.y/x.w,t.z=x.z,t.rotation=N.rotation.z,t.scale.x=N.scale.x*Math.abs(t.x-(x.x+e.projectionMatrix.n11)/(x.w+e.projectionMatrix.n14)),t.scale.y=N.scale.y*Math.abs(t.y-(x.y+e.projectionMatrix.n22)/(x.w+e.projectionMatrix.n24)),t.material=N.material,w.elements.push(t); -g&&w.elements.sort(b);return w}};THREE.Quaternion=function(a,c,b,d){this.set(a||0,c||0,b||0,d!==void 0?d:1)}; +THREE.Projector=function(){function a(){var a=f[e]=f[e]||new THREE.RenderableObject;e++;return a}function c(){var a=l[i]=l[i]||new THREE.RenderableVertex;i++;return a}function b(a,b){return b.z-a.z}function d(a,b){var c=0,d=1,e=a.z+a.w,g=b.z+b.w,f=-a.z+a.w,h=-b.z+b.w;return e>=0&&g>=0&&f>=0&&h>=0?!0:e<0&&g<0||f<0&&h<0?!1:(e<0?c=Math.max(c,e/(e-g)):g<0&&(d=Math.min(d,e/(e-g))),f<0?c=Math.max(c,f/(f-h)):h<0&&(d=Math.min(d,f/(f-h))),df&&h.positionScreen.z0&&B.z<1))f=y[r]=y[r]||new THREE.RenderableParticle,r++,u=f,u.x=B.x/B.w,u.y=B.y/B.w,u.z=B.z,u.rotation=O.rotation.z,u.scale.x=O.scale.x*Math.abs(u.x-(B.x+e.projectionMatrix.n11)/(B.w+e.projectionMatrix.n14)),u.scale.y=O.scale.y*Math.abs(u.y-(B.y+e.projectionMatrix.n22)/(B.w+e.projectionMatrix.n24)),u.material=O.material,v.elements.push(u); +g&&v.elements.sort(b);return v}};THREE.Quaternion=function(a,c,b,d){this.set(a||0,c||0,b||0,d!==void 0?d:1)}; THREE.Quaternion.prototype={constructor:THREE.Quaternion,set:function(a,c,b,d){this.x=a;this.y=c;this.z=b;this.w=d;return this},copy:function(a){this.x=a.x;this.y=a.y;this.z=a.z;this.w=a.w;return this},setFromEuler:function(a){var c=Math.PI/360,b=a.x*c,d=a.y*c,g=a.z*c,a=Math.cos(d),d=Math.sin(d),c=Math.cos(-g),g=Math.sin(-g),e=Math.cos(b),b=Math.sin(b),f=a*c,h=d*g;this.w=f*e-h*b;this.x=f*b+h*e;this.y=d*c*e+a*g*b;this.z=a*g*e-d*c*b;return this},setFromAxisAngle:function(a,c){var b=c/2,d=Math.sin(b); this.x=a.x*d;this.y=a.y*d;this.z=a.z*d;this.w=Math.cos(b);return this},setFromRotationMatrix:function(a){var c=Math.pow(a.determinant(),1/3);this.w=Math.sqrt(Math.max(0,c+a.n11+a.n22+a.n33))/2;this.x=Math.sqrt(Math.max(0,c+a.n11-a.n22-a.n33))/2;this.y=Math.sqrt(Math.max(0,c-a.n11+a.n22-a.n33))/2;this.z=Math.sqrt(Math.max(0,c-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 c= -this.x,b=this.y,d=this.z,g=this.w,e=a.x,f=a.y,h=a.z,a=a.w;this.x=c*a+g*e+b*h-d*f;this.y=b*a+g*f+d*e-c*h;this.z=d*a+g*h+c*f-b*e;this.w=g*a-c*e-b*f-d*h;return this},multiply:function(a,c){this.x=a.x*c.w+a.y*c.z-a.z*c.y+a.w*c.x;this.y=-a.x*c.z+a.y*c.w+a.z*c.x+a.w*c.y;this.z=a.x*c.y-a.y*c.x+a.z*c.w+a.w*c.z;this.w=-a.x*c.x-a.y*c.y-a.z*c.z+a.w*c.w;return this},multiplyVector3:function(a,c){c||(c=a);var b=a.x,d=a.y,g=a.z,e=this.x,f=this.y,h=this.z,i=this.w,k=i*b+f*g-h*d,l=i*d+h*b-e*g,o=i*g+e*d-f*b,b=-e* -b-f*d-h*g;c.x=k*i+b*-e+l*-h-o*-f;c.y=l*i+b*-f+o*-e-k*-h;c.z=o*i+b*-h+k*-f-l*-e;return c}}; +this.x,b=this.y,d=this.z,g=this.w,e=a.x,f=a.y,h=a.z,a=a.w;this.x=c*a+g*e+b*h-d*f;this.y=b*a+g*f+d*e-c*h;this.z=d*a+g*h+c*f-b*e;this.w=g*a-c*e-b*f-d*h;return this},multiply:function(a,c){this.x=a.x*c.w+a.y*c.z-a.z*c.y+a.w*c.x;this.y=-a.x*c.z+a.y*c.w+a.z*c.x+a.w*c.y;this.z=a.x*c.y-a.y*c.x+a.z*c.w+a.w*c.z;this.w=-a.x*c.x-a.y*c.y-a.z*c.z+a.w*c.w;return this},multiplyVector3:function(a,c){c||(c=a);var b=a.x,d=a.y,g=a.z,e=this.x,f=this.y,h=this.z,i=this.w,l=i*b+f*g-h*d,k=i*d+h*b-e*g,p=i*g+e*d-f*b,b=-e* +b-f*d-h*g;c.x=l*i+b*-e+k*-h-p*-f;c.y=k*i+b*-f+p*-e-l*-h;c.z=p*i+b*-h+l*-f-k*-e;return c}}; THREE.Quaternion.slerp=function(a,c,b,d){var g=a.w*c.w+a.x*c.x+a.y*c.y+a.z*c.z;g<0?(b.w=-c.w,b.x=-c.x,b.y=-c.y,b.z=-c.z,g=-g):b.copy(c);if(Math.abs(g)>=1)return b.w=a.w,b.x=a.x,b.y=a.y,b.z=a.z,b;var e=Math.acos(g),g=Math.sqrt(1-g*g);if(Math.abs(g)<0.0010)return b.w=0.5*(a.w+c.w),b.x=0.5*(a.x+c.x),b.y=0.5*(a.y+c.y),b.z=0.5*(a.z+c.z),b;c=Math.sin((1-d)*e)/g;d=Math.sin(d*e)/g;b.w=a.w*c+b.w*d;b.x=a.x*c+b.x*d;b.y=a.y*c+b.y*d;b.z=a.z*c+b.z*d;return b};THREE.Vertex=function(a){this.position=a||new THREE.Vector3}; THREE.Face3=function(a,c,b,d,g,e){this.a=a;this.b=c;this.c=b;this.normal=d instanceof THREE.Vector3?d:new THREE.Vector3;this.vertexNormals=d instanceof Array?d:[];this.color=g instanceof THREE.Color?g:new THREE.Color;this.vertexColors=g instanceof Array?g:[];this.vertexTangents=[];this.materialIndex=e;this.centroid=new THREE.Vector3}; THREE.Face4=function(a,c,b,d,g,e,f){this.a=a;this.b=c;this.c=b;this.d=d;this.normal=g instanceof THREE.Vector3?g:new THREE.Vector3;this.vertexNormals=g instanceof Array?g:[];this.color=e instanceof THREE.Color?e:new THREE.Color;this.vertexColors=e instanceof Array?e:[];this.vertexTangents=[];this.materialIndex=f;this.centroid=new THREE.Vector3};THREE.UV=function(a,c){this.u=a||0;this.v=c||0}; @@ -83,15 +83,15 @@ c;a++)b=this.faces[a],b.centroid.set(0,0,0),b instanceof THREE.Face3?(b.centroid b,d,g,e,f,h=new THREE.Vector3,i=new THREE.Vector3;d=0;for(g=this.faces.length;d0){this.boundingBox={x:[this.vertices[0].position.x,this.vertices[0].position.x],y:[this.vertices[0].position.y, +b.vertexNormals[1].copy(d[b.b]),b.vertexNormals[2].copy(d[b.c]),b.vertexNormals[3].copy(d[b.d]))},computeTangents:function(){function a(a,b,c,d,e,g,j){h=a.vertices[b].position;i=a.vertices[c].position;l=a.vertices[d].position;k=f[e];p=f[g];q=f[j];m=i.x-h.x;t=l.x-h.x;n=i.y-h.y;o=l.y-h.y;s=i.z-h.z;u=l.z-h.z;r=p.u-k.u;y=q.u-k.u;v=p.v-k.v;G=q.v-k.v;B=1/(r*G-y*v);A.set((G*m-v*t)*B,(G*n-v*o)*B,(G*s-v*u)*B);K.set((r*t-y*m)*B,(r*o-y*n)*B,(r*u-y*s)*B);w[b].addSelf(A);w[c].addSelf(A);w[d].addSelf(A);D[b].addSelf(K); +D[c].addSelf(K);D[d].addSelf(K)}var c,b,d,g,e,f,h,i,l,k,p,q,m,t,n,o,s,u,r,y,v,G,B,H,w=[],D=[],A=new THREE.Vector3,K=new THREE.Vector3,L=new THREE.Vector3,S=new THREE.Vector3,W=new THREE.Vector3;c=0;for(b=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 c=1,b=this.vertices.length;cthis.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,c=0,b=this.vertices.length;cthis.points.length-2?e:e+1;b[3]=e>this.points.length-3?e:e+2;k=this.points[b[0]];l=this.points[b[1]]; -o=this.points[b[2]];p=this.points[b[3]];h=f*f;i=f*h;d.x=c(k.x,l.x,o.x,p.x,f,h,i);d.y=c(k.y,l.y,o.y,p.y,f,h,i);d.z=c(k.z,l.z,o.z,p.z,f,h,i);return d};this.getControlPointsArray=function(){var a,b,c=this.points.length,d=[];for(a=0;athis.points.length-2?e:e+1;b[3]=e>this.points.length-3?e:e+2;l=this.points[b[0]];k=this.points[b[1]]; +p=this.points[b[2]];q=this.points[b[3]];h=f*f;i=f*h;d.x=c(l.x,k.x,p.x,q.x,f,h,i);d.y=c(l.y,k.y,p.y,q.y,f,h,i);d.z=c(l.z,k.z,p.z,q.z,f,h,i);return d};this.getControlPointsArray=function(){var a,b,c=this.points.length,d=[];for(a=0;a0&&(b(THREE.NormalBlending),c(1),g("rgba("+Math.floor(s.r*255)+","+Math.floor(s.g*255)+","+Math.floor(s.b*255)+","+u+")"),m.fillRect(Math.floor(J.getX()), -Math.floor(J.getY()),Math.floor(J.getWidth()),Math.floor(J.getHeight()))),J.empty())};this.render=function(a,l){function p(a){var b,c,d,e;ba.setRGB(0,0,0);ua.setRGB(0,0,0);Z.setRGB(0,0,0);b=0;for(c=a.length;b>1,ha= -l.height>>1,f=e.scale.x*n,i=e.scale.y*r,j=f*k,h=i*ha,Y.set(a.x-j,a.y-h,a.x+j,a.y+h),v.intersects(Y)&&(m.save(),m.translate(a.x,a.y),m.rotate(-e.rotation),m.scale(f,-i),m.translate(-k,-ha),m.drawImage(l,0,0),m.restore())}else f instanceof THREE.ParticleCanvasMaterial&&(j=e.scale.x*n,h=e.scale.y*r,Y.set(a.x-j,a.y-h,a.x+j,a.y+h),v.intersects(Y)&&(d(f.color.getContextStyle()),g(f.color.getContextStyle()),m.save(),m.translate(a.x,a.y),m.rotate(-e.rotation),m.scale(j,h),f.program(m),m.restore()))}function q(a, -e,g,f){c(f.opacity);b(f.blending);m.beginPath();m.moveTo(a.positionScreen.x,a.positionScreen.y);m.lineTo(e.positionScreen.x,e.positionScreen.y);m.closePath();if(f instanceof THREE.LineBasicMaterial){a=f.linewidth;if(E!=a)m.lineWidth=E=a;a=f.linecap;if(x!=a)m.lineCap=x=a;a=f.linejoin;if(I!=a)m.lineJoin=I=a;d(f.color.getContextStyle());m.stroke();Y.inflate(f.linewidth*2)}}function u(a,d,g,f,j,h,n,k){e.info.render.vertices+=3;e.info.render.faces++;c(k.opacity);b(k.blending);S=a.positionScreen.x;R=a.positionScreen.y; -V=d.positionScreen.x;ja=d.positionScreen.y;y=g.positionScreen.x;H=g.positionScreen.y;A(S,R,V,ja,y,H);if(k instanceof THREE.MeshBasicMaterial)if(k.map)k.map.mapping instanceof THREE.UVMapping&&(la=n.uvs[0],Ga(S,R,V,ja,y,H,la[f].u,la[f].v,la[j].u,la[j].v,la[h].u,la[h].v,k.map));else if(k.envMap){if(k.envMap.mapping instanceof THREE.SphericalReflectionMapping)a=l.matrixWorldInverse,fa.copy(n.vertexNormalsWorld[f]),ra=(fa.x*a.n11+fa.y*a.n12+fa.z*a.n13)*0.5+0.5,ta=-(fa.x*a.n21+fa.y*a.n22+fa.z*a.n23)*0.5+ -0.5,fa.copy(n.vertexNormalsWorld[j]),pa=(fa.x*a.n11+fa.y*a.n12+fa.z*a.n13)*0.5+0.5,qa=-(fa.x*a.n21+fa.y*a.n22+fa.z*a.n23)*0.5+0.5,fa.copy(n.vertexNormalsWorld[h]),wa=(fa.x*a.n11+fa.y*a.n12+fa.z*a.n13)*0.5+0.5,U=-(fa.x*a.n21+fa.y*a.n22+fa.z*a.n23)*0.5+0.5,Ga(S,R,V,ja,y,H,ra,ta,pa,qa,wa,U,k.envMap)}else k.wireframe?ya(k.color,k.wireframeLinewidth,k.wireframeLinecap,k.wireframeLinejoin):w(k.color);else if(k instanceof THREE.MeshLambertMaterial)k.map&&!k.wireframe&&(k.map.mapping instanceof THREE.UVMapping&& -(la=n.uvs[0],Ga(S,R,V,ja,y,H,la[f].u,la[f].v,la[j].u,la[j].v,la[h].u,la[h].v,k.map)),b(THREE.SubtractiveBlending)),ea?!k.wireframe&&k.shading==THREE.SmoothShading&&n.vertexNormalsWorld.length==3?(T.r=ca.r=Q.r=ba.r,T.g=ca.g=Q.g=ba.g,T.b=ca.b=Q.b=ba.b,o(i,n.v1.positionWorld,n.vertexNormalsWorld[0],T),o(i,n.v2.positionWorld,n.vertexNormalsWorld[1],ca),o(i,n.v3.positionWorld,n.vertexNormalsWorld[2],Q),T.r=Math.max(0,Math.min(k.color.r*T.r,1)),T.g=Math.max(0,Math.min(k.color.g*T.g,1)),T.b=Math.max(0,Math.min(k.color.b* -T.b,1)),ca.r=Math.max(0,Math.min(k.color.r*ca.r,1)),ca.g=Math.max(0,Math.min(k.color.g*ca.g,1)),ca.b=Math.max(0,Math.min(k.color.b*ca.b,1)),Q.r=Math.max(0,Math.min(k.color.r*Q.r,1)),Q.g=Math.max(0,Math.min(k.color.g*Q.g,1)),Q.b=Math.max(0,Math.min(k.color.b*Q.b,1)),C.r=(ca.r+Q.r)*0.5,C.g=(ca.g+Q.g)*0.5,C.b=(ca.b+Q.b)*0.5,oa=Da(T,ca,Q,C),Ba(S,R,V,ja,y,H,0,0,1,0,0,1,oa)):(W.r=ba.r,W.g=ba.g,W.b=ba.b,o(i,n.centroidWorld,n.normalWorld,W),W.r=Math.max(0,Math.min(k.color.r*W.r,1)),W.g=Math.max(0,Math.min(k.color.g* -W.g,1)),W.b=Math.max(0,Math.min(k.color.b*W.b,1)),k.wireframe?ya(W,k.wireframeLinewidth,k.wireframeLinecap,k.wireframeLinejoin):w(W)):k.wireframe?ya(k.color,k.wireframeLinewidth,k.wireframeLinecap,k.wireframeLinejoin):w(k.color);else if(k instanceof THREE.MeshDepthMaterial)da=l.near,X=l.far,T.r=T.g=T.b=1-Aa(a.positionScreen.z,da,X),ca.r=ca.g=ca.b=1-Aa(d.positionScreen.z,da,X),Q.r=Q.g=Q.b=1-Aa(g.positionScreen.z,da,X),C.r=(ca.r+Q.r)*0.5,C.g=(ca.g+Q.g)*0.5,C.b=(ca.b+Q.b)*0.5,oa=Da(T,ca,Q,C),Ba(S,R, -V,ja,y,H,0,0,1,0,0,1,oa);else if(k instanceof THREE.MeshNormalMaterial)W.r=Ca(n.normalWorld.x),W.g=Ca(n.normalWorld.y),W.b=Ca(n.normalWorld.z),k.wireframe?ya(W,k.wireframeLinewidth,k.wireframeLinecap,k.wireframeLinejoin):w(W)}function t(a,d,g,f,h,k,n,m,ha){e.info.render.vertices+=4;e.info.render.faces++;c(m.opacity);b(m.blending);if(m.map||m.envMap)u(a,d,f,0,1,3,n,m,ha),u(h,g,k,1,2,3,n,m,ha);else if(S=a.positionScreen.x,R=a.positionScreen.y,V=d.positionScreen.x,ja=d.positionScreen.y,y=g.positionScreen.x, -H=g.positionScreen.y,z=f.positionScreen.x,L=f.positionScreen.y,j=h.positionScreen.x,aa=h.positionScreen.y,ga=k.positionScreen.x,N=k.positionScreen.y,m instanceof THREE.MeshBasicMaterial)Ea(S,R,V,ja,y,H,z,L),m.wireframe?ya(m.color,m.wireframeLinewidth,m.wireframeLinecap,m.wireframeLinejoin):w(m.color);else if(m instanceof THREE.MeshLambertMaterial)ea?!m.wireframe&&m.shading==THREE.SmoothShading&&n.vertexNormalsWorld.length==4?(T.r=ca.r=Q.r=C.r=ba.r,T.g=ca.g=Q.g=C.g=ba.g,T.b=ca.b=Q.b=C.b=ba.b,o(i,n.v1.positionWorld, -n.vertexNormalsWorld[0],T),o(i,n.v2.positionWorld,n.vertexNormalsWorld[1],ca),o(i,n.v4.positionWorld,n.vertexNormalsWorld[3],Q),o(i,n.v3.positionWorld,n.vertexNormalsWorld[2],C),T.r=Math.max(0,Math.min(m.color.r*T.r,1)),T.g=Math.max(0,Math.min(m.color.g*T.g,1)),T.b=Math.max(0,Math.min(m.color.b*T.b,1)),ca.r=Math.max(0,Math.min(m.color.r*ca.r,1)),ca.g=Math.max(0,Math.min(m.color.g*ca.g,1)),ca.b=Math.max(0,Math.min(m.color.b*ca.b,1)),Q.r=Math.max(0,Math.min(m.color.r*Q.r,1)),Q.g=Math.max(0,Math.min(m.color.g* -Q.g,1)),Q.b=Math.max(0,Math.min(m.color.b*Q.b,1)),C.r=Math.max(0,Math.min(m.color.r*C.r,1)),C.g=Math.max(0,Math.min(m.color.g*C.g,1)),C.b=Math.max(0,Math.min(m.color.b*C.b,1)),oa=Da(T,ca,Q,C),A(S,R,V,ja,z,L),Ba(S,R,V,ja,z,L,0,0,1,0,0,1,oa),A(j,aa,y,H,ga,N),Ba(j,aa,y,H,ga,N,1,0,1,1,0,1,oa)):(W.r=ba.r,W.g=ba.g,W.b=ba.b,o(i,n.centroidWorld,n.normalWorld,W),W.r=Math.max(0,Math.min(m.color.r*W.r,1)),W.g=Math.max(0,Math.min(m.color.g*W.g,1)),W.b=Math.max(0,Math.min(m.color.b*W.b,1)),Ea(S,R,V,ja,y,H,z,L), -m.wireframe?ya(W,m.wireframeLinewidth,m.wireframeLinecap,m.wireframeLinejoin):w(W)):(Ea(S,R,V,ja,y,H,z,L),m.wireframe?ya(m.color,m.wireframeLinewidth,m.wireframeLinecap,m.wireframeLinejoin):w(m.color));else if(m instanceof THREE.MeshNormalMaterial)W.r=Ca(n.normalWorld.x),W.g=Ca(n.normalWorld.y),W.b=Ca(n.normalWorld.z),Ea(S,R,V,ja,y,H,z,L),m.wireframe?ya(W,m.wireframeLinewidth,m.wireframeLinecap,m.wireframeLinejoin):w(W);else if(m instanceof THREE.MeshDepthMaterial)da=l.near,X=l.far,T.r=T.g=T.b=1- -Aa(a.positionScreen.z,da,X),ca.r=ca.g=ca.b=1-Aa(d.positionScreen.z,da,X),Q.r=Q.g=Q.b=1-Aa(f.positionScreen.z,da,X),C.r=C.g=C.b=1-Aa(g.positionScreen.z,da,X),oa=Da(T,ca,Q,C),A(S,R,V,ja,z,L),Ba(S,R,V,ja,z,L,0,0,1,0,0,1,oa),A(j,aa,y,H,ga,N),Ba(j,aa,y,H,ga,N,1,0,1,1,0,1,oa)}function A(a,b,c,d,e,g){m.beginPath();m.moveTo(a,b);m.lineTo(c,d);m.lineTo(e,g);m.lineTo(a,b);m.closePath()}function Ea(a,b,c,d,e,g,f,j){m.beginPath();m.moveTo(a,b);m.lineTo(c,d);m.lineTo(e,g);m.lineTo(f,j);m.lineTo(a,b);m.closePath()} -function ya(a,b,c,e){if(E!=b)m.lineWidth=E=b;if(x!=c)m.lineCap=x=c;if(I!=e)m.lineJoin=I=e;d(a.getContextStyle());m.stroke();Y.inflate(b*2)}function w(a){g(a.getContextStyle());m.fill()}function Ga(a,b,c,d,e,f,j,h,i,n,k,l,ha){if(ha.image.width!=0){if(ha.needsUpdate==!0||ka[ha.id]==void 0){var o=ha.wrapS==THREE.RepeatWrapping,p=ha.wrapT==THREE.RepeatWrapping;ka[ha.id]=m.createPattern(ha.image,o&&p?"repeat":o&&!p?"repeat-x":!o&&p?"repeat-y":"no-repeat");ha.needsUpdate=!1}g(ka[ha.id]);var o=ha.offset.x/ -ha.repeat.x,p=ha.offset.y/ha.repeat.y,U=(ha.image.width-1)*ha.repeat.x,ha=(ha.image.height-1)*ha.repeat.y,j=(j+o)*U,h=(h+p)*ha,i=(i+o)*U,n=(n+p)*ha,k=(k+o)*U,l=(l+p)*ha;c-=a;d-=b;e-=a;f-=b;i-=j;n-=h;k-=j;l-=h;o=1/(i*l-k*n);ha=(l*c-n*e)*o;n=(l*d-n*f)*o;c=(i*e-k*c)*o;d=(i*f-k*d)*o;a=a-ha*j-c*h;b=b-n*j-d*h;m.save();m.transform(ha,n,c,d,a,b);m.fill();m.restore()}}function Ba(a,b,c,d,e,g,f,j,h,i,n,k,l){var ha,o;ha=l.width-1;o=l.height-1;f*=ha;j*=o;h*=ha;i*=o;n*=ha;k*=o;c-=a;d-=b;e-=a;g-=b;h-=f;i-=j;n-= -f;k-=j;o=1/(h*k-n*i);ha=(k*c-i*e)*o;i=(k*d-i*g)*o;c=(h*e-n*c)*o;d=(h*g-n*d)*o;a=a-ha*f-c*j;b=b-i*f-d*j;m.save();m.transform(ha,i,c,d,a,b);m.clip();m.drawImage(l,0,0);m.restore()}function Da(a,b,c,d){var e=~~(a.r*255),f=~~(a.g*255),a=~~(a.b*255),g=~~(b.r*255),j=~~(b.g*255),b=~~(b.b*255),h=~~(c.r*255),i=~~(c.g*255),c=~~(c.b*255),n=~~(d.r*255),k=~~(d.g*255),d=~~(d.b*255);ma[0]=e<0?0:e>255?255:e;ma[1]=f<0?0:f>255?255:f;ma[2]=a<0?0:a>255?255:a;ma[4]=g<0?0:g>255?255:g;ma[5]=j<0?0:j>255?255:j;ma[6]=b<0? -0:b>255?255:b;ma[8]=h<0?0:h>255?255:h;ma[9]=i<0?0:i>255?255:i;ma[10]=c<0?0:c>255?255:c;ma[12]=n<0?0:n>255?255:n;ma[13]=k<0?0:k>255?255:k;ma[14]=d<0?0:d>255?255:d;xa.putImageData(O,0,0);ha.drawImage(ia,0,0);return sa}function Aa(a,b,c){a=(a-b)/(c-b);return a*a*(3-2*a)}function Ca(a){a=(a+1)*0.5;return a<0?0:a>1?1:a}function za(a,b){var c=b.x-a.x,d=b.y-a.y,e=c*c+d*d;e!=0&&(e=1/Math.sqrt(e),c*=e,d*=e,b.x+=c,b.y+=d,a.x-=c,a.y-=d)}var Fa,Ha,na,va;this.autoClear?this.clear():m.setTransform(1,0,0,-1,n,r); -e.info.render.vertices=0;e.info.render.faces=0;f=k.projectScene(a,l,this.sortElements);h=f.elements;i=f.lights;(ea=i.length>0)&&p(i);Fa=0;for(Ha=h.length;Fa1?1:a}var d=this,g,e,f,h=new THREE.Projector,i=document.createElementNS("http://www.w3.org/2000/svg","svg"),k,l,o,p,n,r,m,s,u=new THREE.Rectangle,t=new THREE.Rectangle,q=!1,A=new THREE.Color,w=new THREE.Color,E=new THREE.Color,x=new THREE.Color,I,M=new THREE.Vector3,D=[],F=[],P,K,$,S=1;this.domElement=i;this.sortElements=this.sortObjects=this.autoClear=!0;this.info={render:{vertices:0, -faces:0}};this.setQuality=function(a){switch(a){case "high":S=1;break;case "low":S=0}};this.setSize=function(a,b){k=a;l=b;o=k/2;p=l/2;i.setAttribute("viewBox",-o+" "+-p+" "+k+" "+l);i.setAttribute("width",k);i.setAttribute("height",l);u.set(-o,-p,o,p)};this.clear=function(){for(;i.childNodes.length>0;)i.removeChild(i.childNodes[0])};this.render=function(k,l){var M,y,H,z;this.autoClear&&this.clear();d.info.render.vertices=0;d.info.render.faces=0;g=h.projectScene(k,l,this.sortElements);e=g.elements; -f=g.lights;$=K=0;if(q=f.length>0){w.setRGB(0,0,0);E.setRGB(0,0,0);x.setRGB(0,0,0);M=0;for(y=f.length;M0&&(b(THREE.NormalBlending),c(1),g("rgba("+Math.floor(o.r*255)+","+Math.floor(o.g*255)+","+Math.floor(o.b*255)+","+s+")"),n.fillRect(Math.floor(ba.getX()), +Math.floor(ba.getY()),Math.floor(ba.getWidth()),Math.floor(ba.getHeight()))),ba.empty())};this.render=function(a,k){function q(a){var b,c,d,e;J.setRGB(0,0,0);da.setRGB(0,0,0);T.setRGB(0,0,0);b=0;for(c=a.length;b>1,fa= +k.height>>1,f=e.scale.x*m,i=e.scale.y*t,j=f*l,h=i*fa,F.set(a.x-j,a.y-h,a.x+j,a.y+h),z.intersects(F)&&(n.save(),n.translate(a.x,a.y),n.rotate(-e.rotation),n.scale(f,-i),n.translate(-l,-fa),n.drawImage(k,0,0),n.restore())}else f instanceof THREE.ParticleCanvasMaterial&&(j=e.scale.x*m,h=e.scale.y*t,F.set(a.x-j,a.y-h,a.x+j,a.y+h),z.intersects(F)&&(d(f.color.getContextStyle()),g(f.color.getContextStyle()),n.save(),n.translate(a.x,a.y),n.rotate(-e.rotation),n.scale(j,h),f.program(n),n.restore()))}function s(a, +e,g,f){c(f.opacity);b(f.blending);n.beginPath();n.moveTo(a.positionScreen.x,a.positionScreen.y);n.lineTo(e.positionScreen.x,e.positionScreen.y);n.closePath();if(f instanceof THREE.LineBasicMaterial){a=f.linewidth;if(G!=a)n.lineWidth=G=a;a=f.linecap;if(B!=a)n.lineCap=B=a;a=f.linejoin;if(H!=a)n.lineJoin=H=a;d(f.color.getContextStyle());n.stroke();F.inflate(f.linewidth*2)}}function Ga(a,d,g,f,j,h,m,l){e.info.render.vertices+=3;e.info.render.faces++;c(l.opacity);b(l.blending);W=a.positionScreen.x;U=a.positionScreen.y; +X=d.positionScreen.x;$=d.positionScreen.y;E=g.positionScreen.x;I=g.positionScreen.y;r(W,U,X,$,E,I);if(l instanceof THREE.MeshBasicMaterial)if(l.map)l.map.mapping instanceof THREE.UVMapping&&(ka=m.uvs[0],Ha(W,U,X,$,E,I,ka[f].u,ka[f].v,ka[j].u,ka[j].v,ka[h].u,ka[h].v,l.map));else if(l.envMap){if(l.envMap.mapping instanceof THREE.SphericalReflectionMapping)a=k.matrixWorldInverse,ha.copy(m.vertexNormalsWorld[f]),ya=(ha.x*a.n11+ha.y*a.n12+ha.z*a.n13)*0.5+0.5,xa=-(ha.x*a.n21+ha.y*a.n22+ha.z*a.n23)*0.5+ +0.5,ha.copy(m.vertexNormalsWorld[j]),sa=(ha.x*a.n11+ha.y*a.n12+ha.z*a.n13)*0.5+0.5,pa=-(ha.x*a.n21+ha.y*a.n22+ha.z*a.n23)*0.5+0.5,ha.copy(m.vertexNormalsWorld[h]),qa=(ha.x*a.n11+ha.y*a.n12+ha.z*a.n13)*0.5+0.5,R=-(ha.x*a.n21+ha.y*a.n22+ha.z*a.n23)*0.5+0.5,Ha(W,U,X,$,E,I,ya,xa,sa,pa,qa,R,l.envMap)}else l.wireframe?za(l.color,l.wireframeLinewidth,l.wireframeLinecap,l.wireframeLinejoin):y(l.color);else if(l instanceof THREE.MeshLambertMaterial)l.map&&!l.wireframe&&(l.map.mapping instanceof THREE.UVMapping&& +(ka=m.uvs[0],Ha(W,U,X,$,E,I,ka[f].u,ka[f].v,ka[j].u,ka[j].v,ka[h].u,ka[h].v,l.map)),b(THREE.SubtractiveBlending)),ca?!l.wireframe&&l.shading==THREE.SmoothShading&&m.vertexNormalsWorld.length==3?(Y.r=ea.r=Q.r=J.r,Y.g=ea.g=Q.g=J.g,Y.b=ea.b=Q.b=J.b,p(i,m.v1.positionWorld,m.vertexNormalsWorld[0],Y),p(i,m.v2.positionWorld,m.vertexNormalsWorld[1],ea),p(i,m.v3.positionWorld,m.vertexNormalsWorld[2],Q),Y.r=Math.max(0,Math.min(l.color.r*Y.r,1)),Y.g=Math.max(0,Math.min(l.color.g*Y.g,1)),Y.b=Math.max(0,Math.min(l.color.b* +Y.b,1)),ea.r=Math.max(0,Math.min(l.color.r*ea.r,1)),ea.g=Math.max(0,Math.min(l.color.g*ea.g,1)),ea.b=Math.max(0,Math.min(l.color.b*ea.b,1)),Q.r=Math.max(0,Math.min(l.color.r*Q.r,1)),Q.g=Math.max(0,Math.min(l.color.g*Q.g,1)),Q.b=Math.max(0,Math.min(l.color.b*Q.b,1)),ga.r=(ea.r+Q.r)*0.5,ga.g=(ea.g+Q.g)*0.5,ga.b=(ea.b+Q.b)*0.5,la=Da(Y,ea,Q,ga),v(W,U,X,$,E,I,0,0,1,0,0,1,la)):(aa.r=J.r,aa.g=J.g,aa.b=J.b,p(i,m.centroidWorld,m.normalWorld,aa),aa.r=Math.max(0,Math.min(l.color.r*aa.r,1)),aa.g=Math.max(0,Math.min(l.color.g* +aa.g,1)),aa.b=Math.max(0,Math.min(l.color.b*aa.b,1)),l.wireframe?za(aa,l.wireframeLinewidth,l.wireframeLinecap,l.wireframeLinejoin):y(aa)):l.wireframe?za(l.color,l.wireframeLinewidth,l.wireframeLinecap,l.wireframeLinejoin):y(l.color);else if(l instanceof THREE.MeshDepthMaterial)ja=k.near,ma=k.far,Y.r=Y.g=Y.b=1-Ba(a.positionScreen.z,ja,ma),ea.r=ea.g=ea.b=1-Ba(d.positionScreen.z,ja,ma),Q.r=Q.g=Q.b=1-Ba(g.positionScreen.z,ja,ma),ga.r=(ea.r+Q.r)*0.5,ga.g=(ea.g+Q.g)*0.5,ga.b=(ea.b+Q.b)*0.5,la=Da(Y,ea, +Q,ga),v(W,U,X,$,E,I,0,0,1,0,0,1,la);else if(l instanceof THREE.MeshNormalMaterial)aa.r=Ca(m.normalWorld.x),aa.g=Ca(m.normalWorld.y),aa.b=Ca(m.normalWorld.z),l.wireframe?za(aa,l.wireframeLinewidth,l.wireframeLinecap,l.wireframeLinejoin):y(aa)}function u(a,d,g,f,h,l,m,n,fa){e.info.render.vertices+=4;e.info.render.faces++;c(n.opacity);b(n.blending);if(n.map||n.envMap)Ga(a,d,f,0,1,3,m,n,fa),Ga(h,g,l,1,2,3,m,n,fa);else if(W=a.positionScreen.x,U=a.positionScreen.y,X=d.positionScreen.x,$=d.positionScreen.y, +E=g.positionScreen.x,I=g.positionScreen.y,P=f.positionScreen.x,M=f.positionScreen.y,j=h.positionScreen.x,V=h.positionScreen.y,Z=l.positionScreen.x,O=l.positionScreen.y,n instanceof THREE.MeshBasicMaterial)Ea(W,U,X,$,E,I,P,M),n.wireframe?za(n.color,n.wireframeLinewidth,n.wireframeLinecap,n.wireframeLinejoin):y(n.color);else if(n instanceof THREE.MeshLambertMaterial)ca?!n.wireframe&&n.shading==THREE.SmoothShading&&m.vertexNormalsWorld.length==4?(Y.r=ea.r=Q.r=ga.r=J.r,Y.g=ea.g=Q.g=ga.g=J.g,Y.b=ea.b= +Q.b=ga.b=J.b,p(i,m.v1.positionWorld,m.vertexNormalsWorld[0],Y),p(i,m.v2.positionWorld,m.vertexNormalsWorld[1],ea),p(i,m.v4.positionWorld,m.vertexNormalsWorld[3],Q),p(i,m.v3.positionWorld,m.vertexNormalsWorld[2],ga),Y.r=Math.max(0,Math.min(n.color.r*Y.r,1)),Y.g=Math.max(0,Math.min(n.color.g*Y.g,1)),Y.b=Math.max(0,Math.min(n.color.b*Y.b,1)),ea.r=Math.max(0,Math.min(n.color.r*ea.r,1)),ea.g=Math.max(0,Math.min(n.color.g*ea.g,1)),ea.b=Math.max(0,Math.min(n.color.b*ea.b,1)),Q.r=Math.max(0,Math.min(n.color.r* +Q.r,1)),Q.g=Math.max(0,Math.min(n.color.g*Q.g,1)),Q.b=Math.max(0,Math.min(n.color.b*Q.b,1)),ga.r=Math.max(0,Math.min(n.color.r*ga.r,1)),ga.g=Math.max(0,Math.min(n.color.g*ga.g,1)),ga.b=Math.max(0,Math.min(n.color.b*ga.b,1)),la=Da(Y,ea,Q,ga),r(W,U,X,$,P,M),v(W,U,X,$,P,M,0,0,1,0,0,1,la),r(j,V,E,I,Z,O),v(j,V,E,I,Z,O,1,0,1,1,0,1,la)):(aa.r=J.r,aa.g=J.g,aa.b=J.b,p(i,m.centroidWorld,m.normalWorld,aa),aa.r=Math.max(0,Math.min(n.color.r*aa.r,1)),aa.g=Math.max(0,Math.min(n.color.g*aa.g,1)),aa.b=Math.max(0, +Math.min(n.color.b*aa.b,1)),Ea(W,U,X,$,E,I,P,M),n.wireframe?za(aa,n.wireframeLinewidth,n.wireframeLinecap,n.wireframeLinejoin):y(aa)):(Ea(W,U,X,$,E,I,P,M),n.wireframe?za(n.color,n.wireframeLinewidth,n.wireframeLinecap,n.wireframeLinejoin):y(n.color));else if(n instanceof THREE.MeshNormalMaterial)aa.r=Ca(m.normalWorld.x),aa.g=Ca(m.normalWorld.y),aa.b=Ca(m.normalWorld.z),Ea(W,U,X,$,E,I,P,M),n.wireframe?za(aa,n.wireframeLinewidth,n.wireframeLinecap,n.wireframeLinejoin):y(aa);else if(n instanceof THREE.MeshDepthMaterial)ja= +k.near,ma=k.far,Y.r=Y.g=Y.b=1-Ba(a.positionScreen.z,ja,ma),ea.r=ea.g=ea.b=1-Ba(d.positionScreen.z,ja,ma),Q.r=Q.g=Q.b=1-Ba(f.positionScreen.z,ja,ma),ga.r=ga.g=ga.b=1-Ba(g.positionScreen.z,ja,ma),la=Da(Y,ea,Q,ga),r(W,U,X,$,P,M),v(W,U,X,$,P,M,0,0,1,0,0,1,la),r(j,V,E,I,Z,O),v(j,V,E,I,Z,O,1,0,1,1,0,1,la)}function r(a,b,c,d,e,g){n.beginPath();n.moveTo(a,b);n.lineTo(c,d);n.lineTo(e,g);n.lineTo(a,b);n.closePath()}function Ea(a,b,c,d,e,g,f,j){n.beginPath();n.moveTo(a,b);n.lineTo(c,d);n.lineTo(e,g);n.lineTo(f, +j);n.lineTo(a,b);n.closePath()}function za(a,b,c,e){if(G!=b)n.lineWidth=G=b;if(B!=c)n.lineCap=B=c;if(H!=e)n.lineJoin=H=e;d(a.getContextStyle());n.stroke();F.inflate(b*2)}function y(a){g(a.getContextStyle());n.fill()}function Ha(a,b,c,d,e,f,j,h,i,m,l,k,fa){if(fa.image.width!=0){if(fa.needsUpdate==!0||na[fa.id]==void 0){var p=fa.wrapS==THREE.RepeatWrapping,q=fa.wrapT==THREE.RepeatWrapping;na[fa.id]=n.createPattern(fa.image,p&&q?"repeat":p&&!q?"repeat-x":!p&&q?"repeat-y":"no-repeat");fa.needsUpdate= +!1}g(na[fa.id]);var p=fa.offset.x/fa.repeat.x,q=fa.offset.y/fa.repeat.y,R=(fa.image.width-1)*fa.repeat.x,fa=(fa.image.height-1)*fa.repeat.y,j=(j+p)*R,h=(h+q)*fa,i=(i+p)*R,m=(m+q)*fa,l=(l+p)*R,k=(k+q)*fa;c-=a;d-=b;e-=a;f-=b;i-=j;m-=h;l-=j;k-=h;p=1/(i*k-l*m);fa=(k*c-m*e)*p;m=(k*d-m*f)*p;c=(i*e-l*c)*p;d=(i*f-l*d)*p;a=a-fa*j-c*h;b=b-m*j-d*h;n.save();n.transform(fa,m,c,d,a,b);n.fill();n.restore()}}function v(a,b,c,d,e,f,g,j,h,i,m,l,k){var fa,p;fa=k.width-1;p=k.height-1;g*=fa;j*=p;h*=fa;i*=p;m*=fa;l*=p; +c-=a;d-=b;e-=a;f-=b;h-=g;i-=j;m-=g;l-=j;p=1/(h*l-m*i);fa=(l*c-i*e)*p;i=(l*d-i*f)*p;c=(h*e-m*c)*p;d=(h*f-m*d)*p;a=a-fa*g-c*j;b=b-i*g-d*j;n.save();n.transform(fa,i,c,d,a,b);n.clip();n.drawImage(k,0,0);n.restore()}function Da(a,b,c,d){var e=~~(a.r*255),g=~~(a.g*255),a=~~(a.b*255),f=~~(b.r*255),j=~~(b.g*255),b=~~(b.b*255),h=~~(c.r*255),i=~~(c.g*255),c=~~(c.b*255),m=~~(d.r*255),l=~~(d.g*255),d=~~(d.b*255);ra[0]=e<0?0:e>255?255:e;ra[1]=g<0?0:g>255?255:g;ra[2]=a<0?0:a>255?255:a;ra[4]=f<0?0:f>255?255:f;ra[5]= +j<0?0:j>255?255:j;ra[6]=b<0?0:b>255?255:b;ra[8]=h<0?0:h>255?255:h;ra[9]=i<0?0:i>255?255:i;ra[10]=c<0?0:c>255?255:c;ra[12]=m<0?0:m>255?255:m;ra[13]=l<0?0:l>255?255:l;ra[14]=d<0?0:d>255?255:d;wa.putImageData(N,0,0);fa.drawImage(ta,0,0);return ua}function Ba(a,b,c){a=(a-b)/(c-b);return a*a*(3-2*a)}function Ca(a){a=(a+1)*0.5;return a<0?0:a>1?1:a}function Aa(a,b){var c=b.x-a.x,d=b.y-a.y,e=c*c+d*d;e!=0&&(e=1/Math.sqrt(e),c*=e,d*=e,b.x+=c,b.y+=d,a.x-=c,a.y-=d)}var Fa,Ia,oa,va;this.autoClear?this.clear(): +n.setTransform(1,0,0,-1,m,t);e.info.render.vertices=0;e.info.render.faces=0;f=l.projectScene(a,k,this.sortElements);h=f.elements;i=f.lights;(ca=i.length>0)&&q(i);Fa=0;for(Ia=h.length;Fa1?1:a}var d=this,g,e,f,h=new THREE.Projector,i=document.createElementNS("http://www.w3.org/2000/svg","svg"),l,k,p,q,m,t,n,o,s=new THREE.Rectangle,u=new THREE.Rectangle,r=!1,y=new THREE.Color,v=new THREE.Color,G=new THREE.Color,B=new THREE.Color,H,w=new THREE.Vector3,D=[],A=[],K,L,S,W=1;this.domElement=i;this.sortElements=this.sortObjects=this.autoClear=!0;this.info={render:{vertices:0, +faces:0}};this.setQuality=function(a){switch(a){case "high":W=1;break;case "low":W=0}};this.setSize=function(a,b){l=a;k=b;p=l/2;q=k/2;i.setAttribute("viewBox",-p+" "+-q+" "+l+" "+k);i.setAttribute("width",l);i.setAttribute("height",k);s.set(-p,-q,p,q)};this.clear=function(){for(;i.childNodes.length>0;)i.removeChild(i.childNodes[0])};this.render=function(l,k){var D,E,I,P;this.autoClear&&this.clear();d.info.render.vertices=0;d.info.render.faces=0;g=h.projectScene(l,k,this.sortElements);e=g.elements; +f=g.lights;S=L=0;if(r=f.length>0){v.setRGB(0,0,0);G.setRGB(0,0,0);B.setRGB(0,0,0);D=0;for(E=f.length;D=0)return a.geometry.materials[b.materialIndex]}function d(a,b,c){var d,e,g,f,h=a.vertices;f=h.length;var i=a.colors,n=i.length,k=a.__vertexArray,l=a.__colorArray,m=a.__sortArray,o=a.__dirtyVertices,p=a.__dirtyColors,U=a.__webglCustomAttributesList;if(c.sortParticles){J.multiplySelf(c.matrixWorld);for(d=0;d=0)a&&(j.bindBuffer(j.ARRAY_BUFFER, -e.__webglVertexBuffer),j.vertexAttribPointer(b.position,3,j.FLOAT,!1,0,0));else if(g.morphTargetBase){c=d.program.attributes;g.morphTargetBase!==-1?(j.bindBuffer(j.ARRAY_BUFFER,e.__webglMorphTargetsBuffers[g.morphTargetBase]),j.vertexAttribPointer(c.position,3,j.FLOAT,!1,0,0)):c.position>=0&&(j.bindBuffer(j.ARRAY_BUFFER,e.__webglVertexBuffer),j.vertexAttribPointer(c.position,3,j.FLOAT,!1,0,0));if(g.morphTargetForcedOrder.length){f=0;var i=g.morphTargetForcedOrder;for(h=g.morphTargetInfluences;fn&&(k=l,n=h[k]);j.bindBuffer(j.ARRAY_BUFFER,e.__webglMorphTargetsBuffers[k]);j.vertexAttribPointer(c["morphTarget"+f],3,j.FLOAT,!1,0,0);g.__webglMorphTargetInfluences[f]= -n;i[k]=1;n=-1;f++}}d.program.uniforms.morphTargetInfluences!==null&&j.uniform1fv(d.program.uniforms.morphTargetInfluences,g.__webglMorphTargetInfluences)}if(a){if(e.__webglCustomAttributesList){f=0;for(h=e.__webglCustomAttributesList.length;f=0&&(j.bindBuffer(j.ARRAY_BUFFER,c.buffer),j.vertexAttribPointer(b[c.buffer.belongsToAttribute],c.size,j.FLOAT,!1,0,0))}b.color>=0&&(j.bindBuffer(j.ARRAY_BUFFER,e.__webglColorBuffer),j.vertexAttribPointer(b.color, +THREE.WebGLRenderer=function(a){function c(a,b){var c=a.vertices.length,d=b.material;if(d.attributes){if(a.__webglCustomAttributesList===void 0)a.__webglCustomAttributesList=[];for(var e in d.attributes){var f=d.attributes[e];if(!f.__webglInitialized||f.createUniqueBuffers){f.__webglInitialized=!0;var g=1;f.type==="v2"?g=2:f.type==="v3"?g=3:f.type==="v4"?g=4:f.type==="c"&&(g=3);f.size=g;f.array=new Float32Array(c*g);f.buffer=j.createBuffer();f.buffer.belongsToAttribute=e;f.needsUpdate=!0}a.__webglCustomAttributesList.push(f)}}} +function b(a,b){if(a.material&&!(a.material instanceof THREE.MeshFaceMaterial))return a.material;else if(b.materialIndex>=0)return a.geometry.materials[b.materialIndex]}function d(a,b,c){var d,e,f,g,h=a.vertices;g=h.length;var i=a.colors,m=i.length,l=a.__vertexArray,k=a.__colorArray,n=a.__sortArray,p=a.__dirtyVertices,q=a.__dirtyColors,R=a.__webglCustomAttributesList;if(c.sortParticles){ba.multiplySelf(c.matrixWorld);for(d=0;d=0)a&&(j.bindBuffer(j.ARRAY_BUFFER, +e.__webglVertexBuffer),j.vertexAttribPointer(b.position,3,j.FLOAT,!1,0,0));else if(f.morphTargetBase){c=d.program.attributes;f.morphTargetBase!==-1?(j.bindBuffer(j.ARRAY_BUFFER,e.__webglMorphTargetsBuffers[f.morphTargetBase]),j.vertexAttribPointer(c.position,3,j.FLOAT,!1,0,0)):c.position>=0&&(j.bindBuffer(j.ARRAY_BUFFER,e.__webglVertexBuffer),j.vertexAttribPointer(c.position,3,j.FLOAT,!1,0,0));if(f.morphTargetForcedOrder.length){g=0;var i=f.morphTargetForcedOrder;for(h=f.morphTargetInfluences;gm&&(l=n,m=h[l]);j.bindBuffer(j.ARRAY_BUFFER,e.__webglMorphTargetsBuffers[l]);j.vertexAttribPointer(c["morphTarget"+g],3,j.FLOAT,!1,0,0);f.__webglMorphTargetInfluences[g]= +m;i[l]=1;m=-1;g++}}d.program.uniforms.morphTargetInfluences!==null&&j.uniform1fv(d.program.uniforms.morphTargetInfluences,f.__webglMorphTargetInfluences)}if(a){if(e.__webglCustomAttributesList){g=0;for(h=e.__webglCustomAttributesList.length;g=0&&(j.bindBuffer(j.ARRAY_BUFFER,c.buffer),j.vertexAttribPointer(b[c.buffer.belongsToAttribute],c.size,j.FLOAT,!1,0,0))}b.color>=0&&(j.bindBuffer(j.ARRAY_BUFFER,e.__webglColorBuffer),j.vertexAttribPointer(b.color, 3,j.FLOAT,!1,0,0));b.normal>=0&&(j.bindBuffer(j.ARRAY_BUFFER,e.__webglNormalBuffer),j.vertexAttribPointer(b.normal,3,j.FLOAT,!1,0,0));b.tangent>=0&&(j.bindBuffer(j.ARRAY_BUFFER,e.__webglTangentBuffer),j.vertexAttribPointer(b.tangent,4,j.FLOAT,!1,0,0));b.uv>=0&&(e.__webglUVBuffer?(j.bindBuffer(j.ARRAY_BUFFER,e.__webglUVBuffer),j.vertexAttribPointer(b.uv,2,j.FLOAT,!1,0,0),j.enableVertexAttribArray(b.uv)):j.disableVertexAttribArray(b.uv));b.uv2>=0&&(e.__webglUV2Buffer?(j.bindBuffer(j.ARRAY_BUFFER,e.__webglUV2Buffer), j.vertexAttribPointer(b.uv2,2,j.FLOAT,!1,0,0),j.enableVertexAttribArray(b.uv2)):j.disableVertexAttribArray(b.uv2));d.skinning&&b.skinVertexA>=0&&b.skinVertexB>=0&&b.skinIndex>=0&&b.skinWeight>=0&&(j.bindBuffer(j.ARRAY_BUFFER,e.__webglSkinVertexABuffer),j.vertexAttribPointer(b.skinVertexA,4,j.FLOAT,!1,0,0),j.bindBuffer(j.ARRAY_BUFFER,e.__webglSkinVertexBBuffer),j.vertexAttribPointer(b.skinVertexB,4,j.FLOAT,!1,0,0),j.bindBuffer(j.ARRAY_BUFFER,e.__webglSkinIndicesBuffer),j.vertexAttribPointer(b.skinIndex, -4,j.FLOAT,!1,0,0),j.bindBuffer(j.ARRAY_BUFFER,e.__webglSkinWeightsBuffer),j.vertexAttribPointer(b.skinWeight,4,j.FLOAT,!1,0,0))}g instanceof THREE.Mesh?(d.wireframe?(d=d.wireframeLinewidth,d!==ta&&(j.lineWidth(d),ta=d),a&&j.bindBuffer(j.ELEMENT_ARRAY_BUFFER,e.__webglLineBuffer),j.drawElements(j.LINES,e.__webglLineCount,j.UNSIGNED_SHORT,0)):(a&&j.bindBuffer(j.ELEMENT_ARRAY_BUFFER,e.__webglFaceBuffer),j.drawElements(j.TRIANGLES,e.__webglFaceCount,j.UNSIGNED_SHORT,0)),L.info.render.calls++,L.info.render.vertices+= -e.__webglFaceCount,L.info.render.faces+=e.__webglFaceCount/3):g instanceof THREE.Line?(g=g.type===THREE.LineStrip?j.LINE_STRIP:j.LINES,d=d.linewidth,d!==ta&&(j.lineWidth(d),ta=d),j.drawArrays(g,0,e.__webglLineCount),L.info.render.calls++):g instanceof THREE.ParticleSystem?(j.drawArrays(j.POINTS,0,e.__webglParticleCount),L.info.render.calls++):g instanceof THREE.Ribbon&&(j.drawArrays(j.TRIANGLE_STRIP,0,e.__webglVertexCount),L.info.render.calls++)}}function f(a){v[0].set(a.n41-a.n11,a.n42-a.n12,a.n43- -a.n13,a.n44-a.n14);v[1].set(a.n41+a.n11,a.n42+a.n12,a.n43+a.n13,a.n44+a.n14);v[2].set(a.n41+a.n21,a.n42+a.n22,a.n43+a.n23,a.n44+a.n24);v[3].set(a.n41-a.n21,a.n42-a.n22,a.n43-a.n23,a.n44-a.n24);v[4].set(a.n41-a.n31,a.n42-a.n32,a.n43-a.n33,a.n44-a.n34);v[5].set(a.n41+a.n31,a.n42+a.n32,a.n43+a.n33,a.n44+a.n34);for(var b,a=0;a<6;a++)b=v[a],b.divideScalar(Math.sqrt(b.x*b.x+b.y*b.y+b.z*b.z))}function h(a){for(var b=a.matrixWorld,c=-a.geometry.boundingSphere.radius*Math.max(a.scale.x,Math.max(a.scale.y, -a.scale.z)),d=0;d<6;d++)if(a=v[d].x*b.n14+v[d].y*b.n24+v[d].z*b.n34+v[d].w,a<=c)return!1;return!0}function i(a,b){return b.z-a.z}function k(a){var b,c,d,i,n,k,l,m,o=0,p=a.lights;Z||(Z=new THREE.PerspectiveCamera(L.shadowCameraFov,L.shadowMapWidth/L.shadowMapHeight,L.shadowCameraNear,L.shadowCameraFar));b=0;for(c=p.length;b=0;c--)a[c].object===b&&a.splice(c,1)}function s(a,b,c,d,e){d.program||L.initMaterial(d,b,c,e);if(d.morphTargets&&!e.__webglMorphTargetInfluences){e.__webglMorphTargetInfluences=new Float32Array(L.maxMorphTargets); -for(var g=0,f=L.maxMorphTargets;g0;this.getContext=function(){return j};this.supportsVertexTextures= -function(){return sa};this.setSize=function(a,b){$.width=a;$.height=b;this.setViewport(0,0,$.width,$.height)};this.setViewport=function(a,b,c,d){pa=a;qa=b;wa=c;U=d;j.viewport(pa,qa,wa,U)};this.setScissor=function(a,b,c,d){j.scissor(a,b,c,d)};this.enableScissorTest=function(a){a?j.enable(j.SCISSOR_TEST):j.disable(j.SCISSOR_TEST)};this.setClearColorHex=function(a,b){y.setHex(a);H=b;j.clearColor(y.r,y.g,y.b,H)};this.setClearColor=function(a,b){y.copy(a);H=b;j.clearColor(y.r,y.g,y.b,H)};this.getClearColor= -function(){return y};this.getClearAlpha=function(){return H};this.clear=function(a,b,c){var d=0;if(a===void 0||a)d|=j.COLOR_BUFFER_BIT;if(b===void 0||b)d|=j.DEPTH_BUFFER_BIT;if(c===void 0||c)d|=j.STENCIL_BUFFER_BIT;j.clear(d)};this.clearTarget=function(a,b,c,d){F(a);this.clear(b,c,d)};this.deallocateObject=function(a){if(a.__webglInit)if(a.__webglInit=!1,delete a._modelViewMatrix,delete a._normalMatrixArray,delete a._modelViewMatrixArray,delete a._objectMatrixArray,a instanceof THREE.Mesh)for(var b in a.geometry.geometryGroups){var c= -a.geometry.geometryGroups[b];j.deleteBuffer(c.__webglVertexBuffer);j.deleteBuffer(c.__webglNormalBuffer);j.deleteBuffer(c.__webglTangentBuffer);j.deleteBuffer(c.__webglColorBuffer);j.deleteBuffer(c.__webglUVBuffer);j.deleteBuffer(c.__webglUV2Buffer);j.deleteBuffer(c.__webglSkinVertexABuffer);j.deleteBuffer(c.__webglSkinVertexBBuffer);j.deleteBuffer(c.__webglSkinIndicesBuffer);j.deleteBuffer(c.__webglSkinWeightsBuffer);j.deleteBuffer(c.__webglFaceBuffer);j.deleteBuffer(c.__webglLineBuffer);if(c.numMorphTargets)for(var d= -0,e=c.numMorphTargets;d=0)C=v.geometry.materials[C],C.transparent?(s.transparent=C,s.opaque=null):(s.opaque=C,s.transparent=null)}else if(C)C.transparent?(s.transparent=C,s.opaque=null):(s.opaque=C,s.transparent=null);g.render=!0;if(this.sortObjects)m.renderDepth?g.z=m.renderDepth:(ba.copy(m.position),J.multiplyVector3(ba),g.z=ba.z)}this.sortObjects&&n.sort(i);n=a.__webglObjectsImmediate; -d=0;for(e=n.length;d65535&&(q[J].counter+=1,s=q[J].hash+"_"+q[J].counter,i.geometryGroups[s]===void 0&&(i.geometryGroups[s]= -{faces3:[],faces4:[],materialIndex:U,vertices:0,numMorphTargets:u})),o instanceof THREE.Face3?i.geometryGroups[s].faces3.push(k):i.geometryGroups[s].faces4.push(k),i.geometryGroups[s].vertices+=v;i.geometryGroupsList=[];k=void 0;for(k in i.geometryGroups)i.geometryGroups[k].id=ca++,i.geometryGroupsList.push(i.geometryGroups[k])}for(f in h.geometryGroups)if(i=h.geometryGroups[f],!i.__webglVertexBuffer){k=i;k.__webglVertexBuffer=j.createBuffer();k.__webglNormalBuffer=j.createBuffer();k.__webglTangentBuffer= -j.createBuffer();k.__webglColorBuffer=j.createBuffer();k.__webglUVBuffer=j.createBuffer();k.__webglUV2Buffer=j.createBuffer();k.__webglSkinVertexABuffer=j.createBuffer();k.__webglSkinVertexBBuffer=j.createBuffer();k.__webglSkinIndicesBuffer=j.createBuffer();k.__webglSkinWeightsBuffer=j.createBuffer();k.__webglFaceBuffer=j.createBuffer();k.__webglLineBuffer=j.createBuffer();if(k.numMorphTargets){o=l=void 0;k.__webglMorphTargetsBuffers=[];l=0;for(o=k.numMorphTargets;l0||v.faceVertexUvs.length>0)i.__uvArray=new Float32Array(k*2);if(v.faceUvs.length>1||v.faceVertexUvs.length>1)i.__uv2Array=new Float32Array(k*2)}if(U.geometry.skinWeights.length&&U.geometry.skinIndices.length)i.__skinVertexAArray=new Float32Array(k*4),i.__skinVertexBArray=new Float32Array(k*4),i.__skinIndexArray=new Float32Array(k*4),i.__skinWeightArray=new Float32Array(k*4);i.__faceArray=new Uint16Array(o*3); -i.__lineArray=new Uint16Array(J*2);if(i.numMorphTargets){i.__morphTargetsArrays=[];U=0;for(v=i.numMorphTargets;U=0;h--)g[h]===f&&g.splice(h,1)}else(e instanceof THREE.MarchingCubes||e.immediateRenderCallback)&&m(g.__webglObjectsImmediate,e);e.__webglActive=!1;a.__objectsRemoved.splice(0,1)}e=0;for(g=a.__webglObjects.length;e0&&(j.bindBuffer(j.ARRAY_BUFFER,l.__webglSkinVertexABuffer),j.bufferData(j.ARRAY_BUFFER,ea,o),j.bindBuffer(j.ARRAY_BUFFER,l.__webglSkinVertexBBuffer),j.bufferData(j.ARRAY_BUFFER,O,o),j.bindBuffer(j.ARRAY_BUFFER,l.__webglSkinIndicesBuffer),j.bufferData(j.ARRAY_BUFFER, -ba,o),j.bindBuffer(j.ARRAY_BUFFER,l.__webglSkinWeightsBuffer),j.bufferData(j.ARRAY_BUFFER,V,o))}if(xa&&ka){v=0;for(J=q.length;v0&&(j.bindBuffer(j.ARRAY_BUFFER,l.__webglColorBuffer),j.bufferData(j.ARRAY_BUFFER,K,o))}if(ga&&E.hasTangents){v=0;for(J=q.length;v0&&(j.bindBuffer(j.ARRAY_BUFFER,l.__webglUVBuffer),j.bufferData(j.ARRAY_BUFFER,W,o))}if(oa&&ta&&M){v=0;for(J=q.length;v0&&(j.bindBuffer(j.ARRAY_BUFFER,l.__webglUV2Buffer),j.bufferData(j.ARRAY_BUFFER,G,o))}if(aa){v=0;for(J=q.length;v=0&&j.enableVertexAttribArray(o.position);o.color>=0&&j.enableVertexAttribArray(o.color);o.normal>=0&&j.enableVertexAttribArray(o.normal); -o.tangent>=0&&j.enableVertexAttribArray(o.tangent);a.skinning&&o.skinVertexA>=0&&o.skinVertexB>=0&&o.skinIndex>=0&&o.skinWeight>=0&&(j.enableVertexAttribArray(o.skinVertexA),j.enableVertexAttribArray(o.skinVertexB),j.enableVertexAttribArray(o.skinIndex),j.enableVertexAttribArray(o.skinWeight));if(a.attributes)for(g in a.attributes)o[g]!==void 0&&o[g]>=0&&j.enableVertexAttribArray(o[g]);if(a.morphTargets)for(g=a.numSupportedMorphTargets=0;g=0&&(j.enableVertexAttribArray(o[p]), +4,j.FLOAT,!1,0,0),j.bindBuffer(j.ARRAY_BUFFER,e.__webglSkinWeightsBuffer),j.vertexAttribPointer(b.skinWeight,4,j.FLOAT,!1,0,0))}f instanceof THREE.Mesh?(d.wireframe?(d=d.wireframeLinewidth,d!==xa&&(j.lineWidth(d),xa=d),a&&j.bindBuffer(j.ELEMENT_ARRAY_BUFFER,e.__webglLineBuffer),j.drawElements(j.LINES,e.__webglLineCount,j.UNSIGNED_SHORT,0)):(a&&j.bindBuffer(j.ELEMENT_ARRAY_BUFFER,e.__webglFaceBuffer),j.drawElements(j.TRIANGLES,e.__webglFaceCount,j.UNSIGNED_SHORT,0)),M.info.render.calls++,M.info.render.vertices+= +e.__webglFaceCount,M.info.render.faces+=e.__webglFaceCount/3):f instanceof THREE.Line?(f=f.type===THREE.LineStrip?j.LINE_STRIP:j.LINES,d=d.linewidth,d!==xa&&(j.lineWidth(d),xa=d),j.drawArrays(f,0,e.__webglLineCount),M.info.render.calls++):f instanceof THREE.ParticleSystem?(j.drawArrays(j.POINTS,0,e.__webglParticleCount),M.info.render.calls++):f instanceof THREE.Ribbon&&(j.drawArrays(j.TRIANGLE_STRIP,0,e.__webglVertexCount),M.info.render.calls++)}}function f(a){z[0].set(a.n41-a.n11,a.n42-a.n12,a.n43- +a.n13,a.n44-a.n14);z[1].set(a.n41+a.n11,a.n42+a.n12,a.n43+a.n13,a.n44+a.n14);z[2].set(a.n41+a.n21,a.n42+a.n22,a.n43+a.n23,a.n44+a.n24);z[3].set(a.n41-a.n21,a.n42-a.n22,a.n43-a.n23,a.n44-a.n24);z[4].set(a.n41-a.n31,a.n42-a.n32,a.n43-a.n33,a.n44-a.n34);z[5].set(a.n41+a.n31,a.n42+a.n32,a.n43+a.n33,a.n44+a.n34);for(var b,a=0;a<6;a++)b=z[a],b.divideScalar(Math.sqrt(b.x*b.x+b.y*b.y+b.z*b.z))}function h(a){for(var b=a.matrixWorld,c=-a.geometry.boundingSphere.radius*Math.max(a.scale.x,Math.max(a.scale.y, +a.scale.z)),d=0;d<6;d++)if(a=z[d].x*b.n14+z[d].y*b.n24+z[d].z*b.n34+z[d].w,a<=c)return!1;return!0}function i(a,b){return b.z-a.z}function l(a){var b,c,d,i,m,l,n,k,p=0,q=a.lights;T||(T=new THREE.PerspectiveCamera(M.shadowCameraFov,M.shadowMapWidth/M.shadowMapHeight,M.shadowCameraNear,M.shadowCameraFar));b=0;for(c=q.length;b=0;c--)a[c].object===b&&a.splice(c,1)}function o(a,b,c,d,e){d.program||M.initMaterial(d,b,c,e);if(d.morphTargets&&!e.__webglMorphTargetInfluences){e.__webglMorphTargetInfluences=new Float32Array(M.maxMorphTargets); +for(var f=0,g=M.maxMorphTargets;f0;this.getContext=function(){return j};this.supportsVertexTextures=function(){return ua};this.setSize=function(a,b){S.width=a;S.height=b;this.setViewport(0,0,S.width,S.height)};this.setViewport=function(a,b,c,d){sa=a;pa=b;qa=c;R=d;j.viewport(sa,pa,qa,R)};this.setScissor=function(a,b,c,d){j.scissor(a,b,c,d)};this.enableScissorTest=function(a){a?j.enable(j.SCISSOR_TEST):j.disable(j.SCISSOR_TEST)}; +this.setClearColorHex=function(a,b){E.setHex(a);I=b;j.clearColor(E.r,E.g,E.b,I)};this.setClearColor=function(a,b){E.copy(a);I=b;j.clearColor(E.r,E.g,E.b,I)};this.getClearColor=function(){return E};this.getClearAlpha=function(){return I};this.clear=function(a,b,c){var d=0;if(a===void 0||a)d|=j.COLOR_BUFFER_BIT;if(b===void 0||b)d|=j.DEPTH_BUFFER_BIT;if(c===void 0||c)d|=j.STENCIL_BUFFER_BIT;j.clear(d)};this.clearTarget=function(a,b,c,d){A(a);this.clear(b,c,d)};this.deallocateObject=function(a){if(a.__webglInit)if(a.__webglInit= +!1,delete a._modelViewMatrix,delete a._normalMatrixArray,delete a._modelViewMatrixArray,delete a._objectMatrixArray,a instanceof THREE.Mesh)for(var b in a.geometry.geometryGroups){var c=a.geometry.geometryGroups[b];j.deleteBuffer(c.__webglVertexBuffer);j.deleteBuffer(c.__webglNormalBuffer);j.deleteBuffer(c.__webglTangentBuffer);j.deleteBuffer(c.__webglColorBuffer);j.deleteBuffer(c.__webglUVBuffer);j.deleteBuffer(c.__webglUV2Buffer);j.deleteBuffer(c.__webglSkinVertexABuffer);j.deleteBuffer(c.__webglSkinVertexBBuffer); +j.deleteBuffer(c.__webglSkinIndicesBuffer);j.deleteBuffer(c.__webglSkinWeightsBuffer);j.deleteBuffer(c.__webglFaceBuffer);j.deleteBuffer(c.__webglLineBuffer);if(c.numMorphTargets)for(var d=0,e=c.numMorphTargets;d=0)D=z.geometry.materials[D],D.transparent?(o.transparent=D,o.opaque=null):(o.opaque=D,o.transparent=null)}else if(D)D.transparent? +(o.transparent=D,o.opaque=null):(o.opaque=D,o.transparent=null);g.render=!0;if(this.sortObjects)m.renderDepth?g.z=m.renderDepth:(J.copy(m.position),ba.multiplyVector3(J),g.z=J.z)}this.sortObjects&&n.sort(i);n=a.__webglObjectsImmediate;d=0;for(e=n.length;d65535&&(s[z].counter+=1,ba=s[z].hash+"_"+s[z].counter,i.geometryGroups[ba]===void 0&&(i.geometryGroups[ba]={faces3:[],faces4:[],materialIndex:R,vertices:0,numMorphTargets:u})),p instanceof THREE.Face3?i.geometryGroups[ba].faces3.push(k):i.geometryGroups[ba].faces4.push(k),i.geometryGroups[ba].vertices+=o;i.geometryGroupsList=[];k=void 0;for(k in i.geometryGroups)i.geometryGroups[k].id= +ea++,i.geometryGroupsList.push(i.geometryGroups[k])}for(g in h.geometryGroups)if(i=h.geometryGroups[g],!i.__webglVertexBuffer){k=i;k.__webglVertexBuffer=j.createBuffer();k.__webglNormalBuffer=j.createBuffer();k.__webglTangentBuffer=j.createBuffer();k.__webglColorBuffer=j.createBuffer();k.__webglUVBuffer=j.createBuffer();k.__webglUV2Buffer=j.createBuffer();k.__webglSkinVertexABuffer=j.createBuffer();k.__webglSkinVertexBBuffer=j.createBuffer();k.__webglSkinIndicesBuffer=j.createBuffer();k.__webglSkinWeightsBuffer= +j.createBuffer();k.__webglFaceBuffer=j.createBuffer();k.__webglLineBuffer=j.createBuffer();if(k.numMorphTargets){p=l=void 0;k.__webglMorphTargetsBuffers=[];l=0;for(p=k.numMorphTargets;l0||o.faceVertexUvs.length>0)i.__uvArray=new Float32Array(k*2);if(o.faceUvs.length>1||o.faceVertexUvs.length>1)i.__uv2Array=new Float32Array(k* +2)}if(R.geometry.skinWeights.length&&R.geometry.skinIndices.length)i.__skinVertexAArray=new Float32Array(k*4),i.__skinVertexBArray=new Float32Array(k*4),i.__skinIndexArray=new Float32Array(k*4),i.__skinWeightArray=new Float32Array(k*4);i.__faceArray=new Uint16Array(p*3);i.__lineArray=new Uint16Array(z*2);if(i.numMorphTargets){i.__morphTargetsArrays=[];R=0;for(o=i.numMorphTargets;R=0;h--)f[h]===g&&f.splice(h,1)}else(e instanceof THREE.MarchingCubes||e.immediateRenderCallback)&&n(f.__webglObjectsImmediate,e);e.__webglActive=!1;a.__objectsRemoved.splice(0,1)}e=0;for(f=a.__webglObjects.length;e0&&(j.bindBuffer(j.ARRAY_BUFFER,l.__webglSkinVertexABuffer),j.bufferData(j.ARRAY_BUFFER,ca,p),j.bindBuffer(j.ARRAY_BUFFER,l.__webglSkinVertexBBuffer),j.bufferData(j.ARRAY_BUFFER,N,p),j.bindBuffer(j.ARRAY_BUFFER,l.__webglSkinIndicesBuffer),j.bufferData(j.ARRAY_BUFFER,y,p),j.bindBuffer(j.ARRAY_BUFFER,l.__webglSkinWeightsBuffer),j.bufferData(j.ARRAY_BUFFER,Z,p))}if(ma&&G){o=0;for(z=s.length;o0&&(j.bindBuffer(j.ARRAY_BUFFER,l.__webglColorBuffer),j.bufferData(j.ARRAY_BUFFER, +H,p))}if(na&&I.hasTangents){o=0;for(z=s.length;o0&&(j.bindBuffer(j.ARRAY_BUFFER,l.__webglUVBuffer),j.bufferData(j.ARRAY_BUFFER,aa,p))}if(ta&&ra&&P){o=0;for(z=s.length;o0&&(j.bindBuffer(j.ARRAY_BUFFER,l.__webglUV2Buffer),j.bufferData(j.ARRAY_BUFFER,C,p))}if(wa){o=0;for(z=s.length;o=0&&j.enableVertexAttribArray(o.position);o.color>=0&&j.enableVertexAttribArray(o.color);o.normal>=0&&j.enableVertexAttribArray(o.normal); +o.tangent>=0&&j.enableVertexAttribArray(o.tangent);a.skinning&&o.skinVertexA>=0&&o.skinVertexB>=0&&o.skinIndex>=0&&o.skinWeight>=0&&(j.enableVertexAttribArray(o.skinVertexA),j.enableVertexAttribArray(o.skinVertexB),j.enableVertexAttribArray(o.skinIndex),j.enableVertexAttribArray(o.skinWeight));if(a.attributes)for(g in a.attributes)o[g]!==void 0&&o[g]>=0&&j.enableVertexAttribArray(o[g]);if(a.morphTargets)for(g=a.numSupportedMorphTargets=0;g=0&&(j.enableVertexAttribArray(o[q]), a.numSupportedMorphTargets++);a.uniformsList=[];for(e in a.uniforms)a.uniformsList.push([a.uniforms[e],e])};this.setFaceCulling=function(a,b){a?(!b||b==="ccw"?j.frontFace(j.CCW):j.frontFace(j.CW),a==="back"?j.cullFace(j.BACK):a==="front"?j.cullFace(j.FRONT):j.cullFace(j.FRONT_AND_BACK),j.enable(j.CULL_FACE)):j.disable(j.CULL_FACE)}}; THREE.WebGLRenderTarget=function(a,c,b){this.width=a;this.height=c;b=b||{};this.wrapS=b.wrapS!==void 0?b.wrapS:THREE.ClampToEdgeWrapping;this.wrapT=b.wrapT!==void 0?b.wrapT:THREE.ClampToEdgeWrapping;this.magFilter=b.magFilter!==void 0?b.magFilter:THREE.LinearFilter;this.minFilter=b.minFilter!==void 0?b.minFilter:THREE.LinearMipMapLinearFilter;this.offset=new THREE.Vector2(0,0);this.repeat=new THREE.Vector2(1,1);this.format=b.format!==void 0?b.format:THREE.RGBAFormat;this.type=b.type!==void 0?b.type: THREE.UnsignedByteType;this.depthBuffer=b.depthBuffer!==void 0?b.depthBuffer:!0;this.stencilBuffer=b.stencilBuffer!==void 0?b.stencilBuffer:!0}; @@ -349,19 +349,19 @@ THREE.RenderableFace4=function(){this.v1=new THREE.RenderableVertex;this.v2=new THREE.RenderableParticle=function(){this.rotation=this.z=this.y=this.x=null;this.scale=new THREE.Vector2;this.material=null};THREE.RenderableLine=function(){this.z=null;this.v1=new THREE.RenderableVertex;this.v2=new THREE.RenderableVertex;this.material=null}; THREE.ColorUtils={adjustHSV:function(a,c,b,d){var g=THREE.ColorUtils.__hsv;THREE.ColorUtils.rgbToHsv(a,g);g.h=THREE.Math.clamp(g.h+c,0,1);g.s=THREE.Math.clamp(g.s+b,0,1);g.v=THREE.Math.clamp(g.v+d,0,1);a.setHSV(g.h,g.s,g.v)},rgbToHsv:function(a,c){var b=a.r,d=a.g,g=a.b,e=Math.max(Math.max(b,d),g),f=Math.min(Math.min(b,d),g);if(f===e)f=b=0;else{var h=e-f,f=h/e,b=b===e?(d-g)/h:d===e?2+(g-b)/h:4+(b-d)/h;b/=6;b<0&&(b+=1);b>1&&(b-=1)}c===void 0&&(c={h:0,s:0,v:0});c.h=b;c.s=f;c.v=e;return c}}; THREE.ColorUtils.__hsv={h:0,s:0,v:0}; -THREE.GeometryUtils={merge:function(a,c){for(var b,d,g=a.vertices.length,e=c instanceof THREE.Mesh?c.geometry:c,f=a.vertices,h=e.vertices,i=a.faces,k=e.faces,l=a.faceVertexUvs[0],o=e.faceVertexUvs[0],p={},n=0;n1&&(d=1-d,g=1-g);e=1-d-g;f.copy(a);f.multiplyScalar(d);h.copy(c);h.multiplyScalar(g);f.addSelf(h);h.copy(b);h.multiplyScalar(e);f.addSelf(h);return f},randomPointInFace:function(a,c,b){var d,g,e;if(a instanceof THREE.Face3)return d=c.vertices[a.a].position,g=c.vertices[a.b].position, e=c.vertices[a.c].position,THREE.GeometryUtils.randomPointInTriangle(d,g,e);else if(a instanceof THREE.Face4){d=c.vertices[a.a].position;g=c.vertices[a.b].position;e=c.vertices[a.c].position;var c=c.vertices[a.d].position,f;b?a._area1&&a._area2?(b=a._area1,f=a._area2):(b=THREE.GeometryUtils.triangleArea(d,g,c),f=THREE.GeometryUtils.triangleArea(g,e,c),a._area1=b,a._area2=f):(b=THREE.GeometryUtils.triangleArea(d,g,c),f=THREE.GeometryUtils.triangleArea(g,e,c));return THREE.GeometryUtils.random()*(b+ -f)a?b(c,e-1):k[e]a?b(c,e-1):l[e]0?(f=b[b.length-1],n=f.x,r=f.y):(f=this.actions[d-1].args,n=f[f.length-2],r=f[f.length-1]);for(f=1;f<=a;f++)m=f/a,e=THREE.Shape.Utils.b2(m,n,o,h),m=THREE.Shape.Utils.b2(m,r,p, -i),b.push(new THREE.Vector2(e,m));break;case THREE.PathActions.BEZIER_CURVE_TO:h=e[4];i=e[5];o=e[0];p=e[1];k=e[2];l=e[3];b.length>0?(f=b[b.length-1],n=f.x,r=f.y):(f=this.actions[d-1].args,n=f[f.length-2],r=f[f.length-1]);for(f=1;f<=a;f++)m=f/a,e=THREE.Shape.Utils.b3(m,n,o,k,h),m=THREE.Shape.Utils.b3(m,r,p,l,i),b.push(new THREE.Vector2(e,m));break;case THREE.PathActions.CSPLINE_THRU:f=this.actions[d-1].args;f=[new THREE.Vector2(f[f.length-2],f[f.length-1])];m=a*e[0].length;f=f.concat(e[0]);e=new THREE.SplineCurve(f); -for(f=1;f<=m;f++)b.push(e.getPointAt(f/m));break;case THREE.PathActions.ARC:f=this.actions[d-1].args;h=e[0];i=e[1];k=e[2];o=e[3];m=e[4];p=!!e[5];l=f[f.length-2];n=f[f.length-1];f.length==0&&(l=n=0);r=m-o;var s=a*2;for(f=1;f<=s;f++)m=f/s,p||(m=1-m),m=o+m*r,e=l+h+k*Math.cos(m),m=n+i+k*Math.sin(m),b.push(new THREE.Vector2(e,m))}c&&b.push(b[0]);return b};THREE.Path.prototype.transform=function(a,c){this.getBoundingBox();return this.getWrapPoints(this.getPoints(c),a)}; -THREE.Path.prototype.nltransform=function(a,c,b,d,g,e){var f=this.getPoints(),h,i,k,l,o;h=0;for(i=f.length;h0?(f=b[b.length-1],m=f.x,t=f.y):(f=this.actions[d-1].args,m=f[f.length-2],t=f[f.length-1]);for(f=1;f<=a;f++)n=f/a,e=THREE.Shape.Utils.b2(n,m,p,h),n=THREE.Shape.Utils.b2(n,t,q, +i),b.push(new THREE.Vector2(e,n));break;case THREE.PathActions.BEZIER_CURVE_TO:h=e[4];i=e[5];p=e[0];q=e[1];l=e[2];k=e[3];b.length>0?(f=b[b.length-1],m=f.x,t=f.y):(f=this.actions[d-1].args,m=f[f.length-2],t=f[f.length-1]);for(f=1;f<=a;f++)n=f/a,e=THREE.Shape.Utils.b3(n,m,p,l,h),n=THREE.Shape.Utils.b3(n,t,q,k,i),b.push(new THREE.Vector2(e,n));break;case THREE.PathActions.CSPLINE_THRU:f=this.actions[d-1].args;f=[new THREE.Vector2(f[f.length-2],f[f.length-1])];n=a*e[0].length;f=f.concat(e[0]);e=new THREE.SplineCurve(f); +for(f=1;f<=n;f++)b.push(e.getPointAt(f/n));break;case THREE.PathActions.ARC:f=this.actions[d-1].args;h=e[0];i=e[1];l=e[2];p=e[3];n=e[4];q=!!e[5];k=f[f.length-2];m=f[f.length-1];f.length==0&&(k=m=0);t=n-p;var o=a*2;for(f=1;f<=o;f++)n=f/o,q||(n=1-n),n=p+n*t,e=k+h+l*Math.cos(n),n=m+i+l*Math.sin(n),b.push(new THREE.Vector2(e,n))}c&&b.push(b[0]);return b};THREE.Path.prototype.transform=function(a,c){this.getBoundingBox();return this.getWrapPoints(this.getPoints(c),a)}; +THREE.Path.prototype.nltransform=function(a,c,b,d,g,e){var f=this.getPoints(),h,i,l,k,p;h=0;for(i=f.length;h=0?h-1:b.length-1;e=f-1>=0?f-1:k.length-1;var m=[k[f],b[h],b[g]];o=THREE.FontUtils.Triangulate.area(m);var s=[k[f],k[e],b[h]];p=THREE.FontUtils.Triangulate.area(s);n=h;l=f;h+=1;f+=-1;h< -0&&(h+=b.length);h%=b.length;f<0&&(f+=k.length);f%=k.length;g=h-1>=0?h-1:b.length-1;e=f-1>=0?f-1:k.length-1;m=[k[f],b[h],b[g]];m=THREE.FontUtils.Triangulate.area(m);s=[k[f],k[e],b[h]];s=THREE.FontUtils.Triangulate.area(s);o+p>m+s&&(h=n,f=l,h<0&&(h+=b.length),h%=b.length,f<0&&(f+=k.length),f%=k.length,g=h-1>=0?h-1:b.length-1,e=f-1>=0?f-1:k.length-1);o=b.slice(0,h);p=b.slice(h);n=k.slice(f);l=k.slice(0,f);e=[k[f],k[e],b[h]];r.push([k[f],b[h],b[g]]);r.push(e);b=o.concat(n).concat(l).concat(p)}return{shape:b, -isolatedPts:r,allpoints:d}},triangulateShape:function(a,c){var b=THREE.Shape.Utils.removeHoles(a,c),d=b.allpoints,g=b.isolatedPts,b=THREE.FontUtils.Triangulate(b.shape,!1),e,f,h,i,k={};e=0;for(f=d.length;e=0?h-1:b.length-1;e=f-1>=0?f-1:l.length-1;var n=[l[f],b[h],b[g]];p=THREE.FontUtils.Triangulate.area(n);var o=[l[f],l[e],b[h]];q=THREE.FontUtils.Triangulate.area(o);m=h;k=f;h+=1;f+=-1;h< +0&&(h+=b.length);h%=b.length;f<0&&(f+=l.length);f%=l.length;g=h-1>=0?h-1:b.length-1;e=f-1>=0?f-1:l.length-1;n=[l[f],b[h],b[g]];n=THREE.FontUtils.Triangulate.area(n);o=[l[f],l[e],b[h]];o=THREE.FontUtils.Triangulate.area(o);p+q>n+o&&(h=m,f=k,h<0&&(h+=b.length),h%=b.length,f<0&&(f+=l.length),f%=l.length,g=h-1>=0?h-1:b.length-1,e=f-1>=0?f-1:l.length-1);p=b.slice(0,h);q=b.slice(h);m=l.slice(f);k=l.slice(0,f);e=[l[f],l[e],b[h]];t.push([l[f],b[h],b[g]]);t.push(e);b=p.concat(m).concat(k).concat(q)}return{shape:b, +isolatedPts:t,allpoints:d}},triangulateShape:function(a,c){var b=THREE.Shape.Utils.removeHoles(a,c),d=b.allpoints,g=b.isolatedPts,b=THREE.FontUtils.Triangulate(b.shape,!1),e,f,h,i,l={};e=0;for(f=d.length;e1)console.log("THREE.Animation.update: Warning! Scale out of bounds:"+d+" on bone "+n),d=d<0?0:1;if(b==="pos")if(b=a.position,this.interpolationType===THREE.AnimationHandler.LINEAR)b.x=g[0]+(e[0]-g[0])*d,b.y=g[1]+(e[1]-g[1])*d,b.z=g[2]+(e[2]-g[2])*d;else{if(this.interpolationType===THREE.AnimationHandler.CATMULLROM||this.interpolationType===THREE.AnimationHandler.CATMULLROM_FORWARD)if(this.points[0]= -this.getPrevKeyWith("pos",n,f.index-1).pos,this.points[1]=g,this.points[2]=e,this.points[3]=this.getNextKeyWith("pos",n,h.index+1).pos,d=d*0.33+0.33,g=this.interpolateCatmullRom(this.points,d),b.x=g[0],b.y=g[1],b.z=g[2],this.interpolationType===THREE.AnimationHandler.CATMULLROM_FORWARD)d=this.interpolateCatmullRom(this.points,d*1.01),this.target.set(d[0],d[1],d[2]),this.target.subSelf(b),this.target.y=0,this.target.normalize(),d=Math.atan2(this.target.x,this.target.z),a.rotation.set(0,d,0)}else if(b=== -"rot")THREE.Quaternion.slerp(g,e,a.quaternion,d);else if(b==="scl")b=a.scale,b.x=g[0]+(e[0]-g[0])*d,b.y=g[1]+(e[1]-g[1])*d,b.z=g[2]+(e[2]-g[2])*d}}if(this.JITCompile&&l[0][k]===void 0){this.hierarchy[0].update(null,!0);for(n=0;na.length-2?e:e+1;b[3]=e>a.length-3?e:e+2;e=a[b[0]];h=a[b[1]];i=a[b[2]];k=a[b[3]];b=g*g;f=g*b;d[0]=this.interpolate(e[0],h[0],i[0],k[0],g,b,f);d[1]=this.interpolate(e[1],h[1],i[1],k[1],g,b,f);d[2]=this.interpolate(e[2],h[2],i[2],k[2],g,b,f);return d}; +THREE.Animation.prototype.update=function(a){if(this.isPlaying){var c=["pos","rot","scl"],b,d,g,e,f,h,i,l,k=this.data.JIT.hierarchy,p,q;this.currentTime+=a*this.timeScale;q=this.currentTime;p=this.currentTime%=this.data.length;l=parseInt(Math.min(p*this.data.fps,this.data.length*this.data.fps),10);for(var m=0,t=this.hierarchy.length;m1)console.log("THREE.Animation.update: Warning! Scale out of bounds:"+d+" on bone "+m),d=d<0?0:1;if(b==="pos")if(b=a.position,this.interpolationType===THREE.AnimationHandler.LINEAR)b.x=g[0]+(e[0]-g[0])*d,b.y=g[1]+(e[1]-g[1])*d,b.z=g[2]+(e[2]-g[2])*d;else{if(this.interpolationType===THREE.AnimationHandler.CATMULLROM||this.interpolationType===THREE.AnimationHandler.CATMULLROM_FORWARD)if(this.points[0]= +this.getPrevKeyWith("pos",m,f.index-1).pos,this.points[1]=g,this.points[2]=e,this.points[3]=this.getNextKeyWith("pos",m,h.index+1).pos,d=d*0.33+0.33,g=this.interpolateCatmullRom(this.points,d),b.x=g[0],b.y=g[1],b.z=g[2],this.interpolationType===THREE.AnimationHandler.CATMULLROM_FORWARD)d=this.interpolateCatmullRom(this.points,d*1.01),this.target.set(d[0],d[1],d[2]),this.target.subSelf(b),this.target.y=0,this.target.normalize(),d=Math.atan2(this.target.x,this.target.z),a.rotation.set(0,d,0)}else if(b=== +"rot")THREE.Quaternion.slerp(g,e,a.quaternion,d);else if(b==="scl")b=a.scale,b.x=g[0]+(e[0]-g[0])*d,b.y=g[1]+(e[1]-g[1])*d,b.z=g[2]+(e[2]-g[2])*d}}if(this.JITCompile&&k[0][l]===void 0){this.hierarchy[0].update(null,!0);for(m=0;ma.length-2?e:e+1;b[3]=e>a.length-3?e:e+2;e=a[b[0]];h=a[b[1]];i=a[b[2]];l=a[b[3]];b=g*g;f=g*b;d[0]=this.interpolate(e[0],h[0],i[0],l[0],g,b,f);d[1]=this.interpolate(e[1],h[1],i[1],l[1],g,b,f);d[2]=this.interpolate(e[2],h[2],i[2],l[2],g,b,f);return d}; THREE.Animation.prototype.interpolate=function(a,c,b,d,g,e,f){a=(b-a)*0.5;d=(d-c)*0.5;return(2*(c-b)+a+d)*f+(-3*(c-b)-2*a-d)*e+a*g+c};THREE.Animation.prototype.getNextKeyWith=function(a,c,b){var d=this.data.hierarchy[c].keys;for(this.interpolationType===THREE.AnimationHandler.CATMULLROM||this.interpolationType===THREE.AnimationHandler.CATMULLROM_FORWARD?b=b0?b:0:b>=0?b:b+d.length;b>=0;b--)if(d[b][a]!==void 0)return d[b];return this.data.hierarchy[c].keys[d.length-1]}; THREE.CubeCamera=function(a,c,b,d){this.heightOffset=b;this.position=new THREE.Vector3(0,b,0);this.cameraPX=new THREE.PerspectiveCamera(90,1,a,c);this.cameraNX=new THREE.PerspectiveCamera(90,1,a,c);this.cameraPY=new THREE.PerspectiveCamera(90,1,a,c);this.cameraNY=new THREE.PerspectiveCamera(90,1,a,c);this.cameraPZ=new THREE.PerspectiveCamera(90,1,a,c);this.cameraNZ=new THREE.PerspectiveCamera(90,1,a,c);this.cameraPX.position=this.position;this.cameraNX.position=this.position;this.cameraPY.position= @@ -448,18 +448,18 @@ THREE.FirstPersonControls=function(a,c){function b(a,b){return function(){b.appl 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(a){this.domElement!==document&&this.domElement.focus();a.preventDefault();a.stopPropagation();if(this.activeLook)switch(a.button){case 0:this.moveForward= !0;break;case 2:this.moveBackward=!0}this.mouseDragOn=!0};this.onMouseUp=function(a){a.preventDefault();a.stopPropagation();if(this.activeLook)switch(a.button){case 0:this.moveForward=!1;break;case 2:this.moveBackward=!1}this.mouseDragOn=!1};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.onKeyDown= function(a){switch(a.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(a){switch(a.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(a){if(!this.freeze){if(this.heightSpeed){var b=THREE.Math.clamp(this.object.position.y,this.heightMin,this.heightMax)-this.heightMin;this.autoSpeedFactor=a*b*this.heightCoef}else this.autoSpeedFactor=0;b=a*this.movementSpeed;(this.moveForward||this.autoForward&&!this.moveBackward)&&this.object.translateZ(-(b+this.autoSpeedFactor));this.moveBackward&&this.object.translateZ(b);this.moveLeft&&this.object.translateX(-b);this.moveRight&&this.object.translateX(b); -this.moveUp&&this.object.translateY(b);this.moveDown&&this.object.translateY(-b);b=a*this.lookSpeed;this.activeLook||(b=0);this.lon+=this.mouseX*b;this.lookVertical&&(this.lat-=this.mouseY*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;var a=this.target,c=this.object.position;a.x=c.x+100*Math.sin(this.phi)*Math.cos(this.theta);a.y=c.y+100*Math.cos(this.phi);a.z=c.z+100*Math.sin(this.phi)*Math.sin(this.theta)}a=1;this.constrainVertical&& -(a=Math.PI/(this.verticalMax-this.verticalMin));this.lon+=this.mouseX*b;this.lookVertical&&(this.lat-=this.mouseY*b*a);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);a=this.target;c=this.object.position;a.x=c.x+100*Math.sin(this.phi)*Math.cos(this.theta);a.y=c.y+100*Math.cos(this.phi);a.z=c.z+100*Math.sin(this.phi)*Math.sin(this.theta); -this.object.lookAt(a)};this.domElement.addEventListener("contextmenu",function(a){a.preventDefault()},!1);this.domElement.addEventListener("mousemove",b(this,this.onMouseMove),!1);this.domElement.addEventListener("mousedown",b(this,this.onMouseDown),!1);this.domElement.addEventListener("mouseup",b(this,this.onMouseUp),!1);this.domElement.addEventListener("keydown",b(this,this.onKeyDown),!1);this.domElement.addEventListener("keyup",b(this,this.onKeyUp),!1)}; -THREE.PathControls=function(a,c){function b(a){if((a*=2)<1)return 0.5*a*a;return-0.5*(--a*(a-2)-1)}function d(a,b){return function(){b.apply(a,arguments)}}function g(a,b,c,d){var e={name:c,fps:0.6,length:d,hierarchy:[]},f,g=b.getControlPointsArray(),h=b.getLength(),s=g.length,u=0;f=s-1;b={parent:-1,keys:[]};b.keys[0]={time:0,pos:g[0],rot:[0,0,0,1],scl:[1,1,1]};b.keys[f]={time:d,pos:g[f],rot:[0,0,0,1],scl:[1,1,1]};for(f=1;f=0?a:a+f;c=this.verticalAngleMap.srcRange; a=this.verticalAngleMap.dstRange;c=THREE.Math.mapLinear(this.phi,c[0],c[1],a[0],a[1]);var d=a[1]-a[0];this.phi=b((c-a[0])/d)*d+a[0];c=this.horizontalAngleMap.srcRange;a=this.horizontalAngleMap.dstRange;c=THREE.Math.mapLinear(this.theta,c[0],c[1],a[0],a[1]);d=a[1]-a[0];this.theta=b((c-a[0])/d)*d+a[0];a=this.target.position;a.x=100*Math.sin(this.phi)*Math.cos(this.theta);a.y=100*Math.cos(this.phi);a.z=100*Math.sin(this.phi)*Math.sin(this.theta);this.object.lookAt(this.target.position)};this.onMouseMove= function(a){this.domElement===document?(this.mouseX=a.pageX-this.viewHalfX,this.mouseY=a.pageY-this.viewHalfY):(this.mouseX=a.pageX-this.domElement.offsetLeft-this.viewHalfX,this.mouseY=a.pageY-this.domElement.offsetTop-this.viewHalfY)};this.init=function(){this.spline=new THREE.Spline;this.spline.initFromArray(this.waypoints);this.useConstantSpeed&&this.spline.reparametrizeByArcLength(this.resamplingCoef);if(this.createDebugDummy){var a=new THREE.MeshLambertMaterial({color:30719}),b=new THREE.MeshLambertMaterial({color:65280}), c=new THREE.CubeGeometry(10,10,20),f=new THREE.CubeGeometry(2,2,10);this.animationParent=new THREE.Mesh(c,a);a=new THREE.Mesh(f,b);a.position.set(0,10,0);this.animation=g(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=g(this.animationParent,this.spline,this.id,this.duration),this.animationParent.add(this.target),this.animationParent.add(this.object);if(this.createDebugPath){var a= -this.debugPath,b=this.spline,f=e(b,10),c=e(b,10),h=new THREE.LineBasicMaterial({color:16711680,linewidth:3}),f=new THREE.Line(f,h),c=new THREE.ParticleSystem(c,new THREE.ParticleBasicMaterial({color:16755200,size:3}));f.scale.set(1,1,1);a.add(f);c.scale.set(1,1,1);a.add(c);for(var f=new THREE.SphereGeometry(1,16,8),h=new THREE.MeshBasicMaterial({color:65280}),n=0;n0||this.autoForward&&!(i<0)?1:i));this.object.translateX(c*k);this.object.translateY(c*l);f&&(this.roll+=this.rollSpeed*a*h);if(this.forward.y>this.constrainVertical[1])this.forward.y=this.constrainVertical[1],this.forward.normalize();else if(this.forward.y0||this.autoForward&&!(i<0)?1:i));this.object.translateX(c*l);this.object.translateY(c*k);f&&(this.roll+=this.rollSpeed*a*h);if(this.forward.y>this.constrainVertical[1])this.forward.y=this.constrainVertical[1],this.forward.normalize();else if(this.forward.y1?d.normalize():d.z=Math.sqrt(1-e*e);f.copy(b.object.position).subSelf(b.target);e=b.object.up.clone().setLength(d.y);e.addSelf(b.object.up.clone().crossSelf(f).setLength(d.x));e.addSelf(f.setLength(d.z));return e};this.rotateCamera=function(){var a=Math.acos(h.dot(i)/h.length()/i.length());if(a){var c=(new THREE.Vector3).cross(h,i).normalize(),d=new THREE.Quaternion;a*=b.rotateSpeed;d.setFromAxisAngle(c,-a);d.multiplyVector3(f); -d.multiplyVector3(b.object.up);d.multiplyVector3(i);b.staticMoving?h=i:(d.setFromAxisAngle(c,a*(b.dynamicDampingFactor-1)),d.multiplyVector3(h))}};this.zoomCamera=function(){var a=1+(l.y-k.y)*b.zoomSpeed;a!==1&&a>0&&(f.multiplyScalar(a),b.staticMoving?k=l:k.y+=(l.y-k.y)*this.dynamicDampingFactor)};this.panCamera=function(){var a=p.clone().subSelf(o);if(a.lengthSq()){a.multiplyScalar(f.length()*b.panSpeed);var c=f.clone().crossSelf(b.object.up).setLength(a.x);c.addSelf(b.object.up.clone().setLength(a.y)); -b.object.position.addSelf(c);b.target.addSelf(c);b.staticMoving?o=p:o.addSelf(a.sub(p,o).multiplyScalar(b.dynamicDampingFactor))}};this.checkDistances=function(){if(!b.noZoom||!b.noPan)b.object.position.lengthSq()>b.maxDistance*b.maxDistance&&b.object.position.setLength(b.maxDistance),f.lengthSq()0&&(f.multiplyScalar(a),b.staticMoving?l=k:l.y+=(k.y-l.y)*this.dynamicDampingFactor)};this.panCamera=function(){var a=q.clone().subSelf(p);if(a.lengthSq()){a.multiplyScalar(f.length()*b.panSpeed);var c=f.clone().crossSelf(b.object.up).setLength(a.x);c.addSelf(b.object.up.clone().setLength(a.y)); +b.object.position.addSelf(c);b.target.addSelf(c);b.staticMoving?p=q:p.addSelf(a.sub(q,p).multiplyScalar(b.dynamicDampingFactor))}};this.checkDistances=function(){if(!b.noZoom||!b.noPan)b.object.position.lengthSq()>b.maxDistance*b.maxDistance&&b.object.position.setLength(b.maxDistance),f.lengthSq()0){this.vertices.push(new THREE.Vertex(new THREE.Vector3(0,f,0)));for(h=0;h0){this.vertices.push(new THREE.Vertex(new THREE.Vector3(0,-f,0)));for(h=0;h0){this.vertices.push(new THREE.Vertex(new THREE.Vector3(0,f,0)));for(h=0;h0){this.vertices.push(new THREE.Vertex(new THREE.Vector3(0,-f,0)));for(h=0;ha&&(a+=Math.PI*2),a=(b+a)/2,new THREE.Vector2(-Math.cos(a),-Math.sin(a));return d.multiplyScalar(g).addSelf(h).subSelf(a).clone()}function g(a){for(F=a.length;--F>=0;){j=F;aa=F-1;aa<0&&(aa=a.length-1);for(var b= -0,c=n+l*2,b=0;b=0;K--){$=K/l;S=i*(1-$);$=k*Math.sin($*Math.PI/2);F=0;for(P=t.length;Fa&&(a+=Math.PI*2),a=(b+a)/2,new THREE.Vector2(-Math.cos(a),-Math.sin(a));return d.multiplyScalar(g).addSelf(h).subSelf(a).clone()}function g(a){for(A=a.length;--A>=0;){j=A;V=A-1;V<0&&(V=a.length-1);for(var b= +0,c=m+k*2,b=0;b=0;L--){S=L/k;W=i*(1-S);S=l*Math.sin(S*Math.PI/2);A=0;for(K=u.length;A0||(l=this.vertices.push(new THREE.Vertex(new THREE.Vector3(o,h,p)))-1);k.push(l)}c.push(k)}for(var n,r,m,g=c.length,b=0;b0)for(d=0;d1&&(n= -this.vertices[f].position.clone(),r=this.vertices[i].position.clone(),m=this.vertices[k].position.clone(),n.normalize(),r.normalize(),m.normalize(),this.faces.push(new THREE.Face3(f,i,k,[new THREE.Vector3(n.x,n.y,n.z),new THREE.Vector3(r.x,r.y,r.z),new THREE.Vector3(m.x,m.y,m.z)])),this.faceVertexUvs[0].push([l,o,s]))}this.computeCentroids();this.computeFaceNormals();this.computeVertexNormals();this.boundingSphere={radius:a}};THREE.SphereGeometry.prototype=new THREE.Geometry; +THREE.SphereGeometry=function(a,c,b){THREE.Geometry.call(this);for(var a=a||50,d,g=Math.PI,e=Math.max(3,c||8),f=Math.max(2,b||6),c=[],b=0;b0||(k=this.vertices.push(new THREE.Vertex(new THREE.Vector3(p,h,q)))-1);l.push(k)}c.push(l)}for(var m,t,n,g=c.length,b=0;b0)for(d=0;d1&&(m= +this.vertices[f].position.clone(),t=this.vertices[i].position.clone(),n=this.vertices[l].position.clone(),m.normalize(),t.normalize(),n.normalize(),this.faces.push(new THREE.Face3(f,i,l,[new THREE.Vector3(m.x,m.y,m.z),new THREE.Vector3(t.x,t.y,t.z),new THREE.Vector3(n.x,n.y,n.z)])),this.faceVertexUvs[0].push([k,p,o]))}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(a,c){var b=(new THREE.TextPath(a,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 d=b[b.length-1].getBoundingBox().maxX;c.bendPath=new THREE.QuadraticBezierCurve(new THREE.Vector2(0,0),new THREE.Vector2(d/2,120),new THREE.Vector2(d,0))}THREE.ExtrudeGeometry.call(this,b,c)};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]},loadFace:function(a){var c=a.familyName.toLowerCase();this.faces[c]=this.faces[c]||{};this.faces[c][a.cssFontWeight]=this.faces[c][a.cssFontWeight]||{};this.faces[c][a.cssFontWeight][a.cssFontStyle]=a;return this.faces[c][a.cssFontWeight][a.cssFontStyle]=a},drawText:function(a){for(var c=this.getFace(),b=this.size/c.resolution,d= -0,g=String(a).split(""),e=g.length,f=[],a=0;a0)for(k=0;k2;){if(o--<=0){console.log("Warning, unable to triangulate polygon!");if(d)return h;return e}i=k;g<=i&&(i=0);k=i+1;g<=k&&(k=0);l=k+1;g<=l&&(l=0);var p;a:{p=a;var n=i,r=k,m=l,s=g,u=f,t=void 0,q=void 0,A=void 0, -w=void 0,E=void 0,x=void 0,I=void 0,M=void 0,D=void 0,q=p[u[n]].x,A=p[u[n]].y,w=p[u[r]].x,E=p[u[r]].y,x=p[u[m]].x,I=p[u[m]].y;if(1.0E-10>(w-q)*(I-A)-(E-A)*(x-q))p=!1;else{for(t=0;t=0&&K>=0&&S>=0){p=!1;break a}}p= -!0}}if(p){e.push([a[f[i]],a[f[k]],a[f[l]]]);h.push([f[i],f[k],f[l]]);i=k;for(l=k+1;l0)for(l=0;l2;){if(p--<=0){console.log("Warning, unable to triangulate polygon!");if(d)return h;return e}i=l;g<=i&&(i=0);l=i+1;g<=l&&(l=0);k=l+1;g<=k&&(k=0);var q;a:{q=a;var m=i,t=l,n=k,o=g,s=f,u=void 0,r=void 0,y=void 0, +v=void 0,G=void 0,B=void 0,H=void 0,w=void 0,D=void 0,r=q[s[m]].x,y=q[s[m]].y,v=q[s[t]].x,G=q[s[t]].y,B=q[s[n]].x,H=q[s[n]].y;if(1.0E-10>(v-r)*(H-y)-(G-y)*(B-r))q=!1;else{for(u=0;u=0&&L>=0&&W>=0){q=!1;break a}}q=!0}}if(q){e.push([a[f[i]], +a[f[l]],a[f[k]]]);h.push([f[i],f[l],f[k]]);i=l;for(k=l+1;k0;)this.smooth(a)}; -THREE.SubdivisionModifier.prototype.smooth=function(a){function c(a,b,c,d,h,i){var k=new THREE.Face4(a,b,c,d,null,h.color,h.material);if(f.useOldVertexColors){k.vertexColors=[];for(var j,l,m,n=0;n<4;n++){m=i[n];j=new THREE.Color;j.setRGB(0,0,0);for(var o=0;o>7)-127;d|=(f&127)<<16|e<<8;if(d==0&&h==-127)return 0;return(1-2*(g>>7))*(1+d*Math.pow(2,-23))*Math.pow(2,h)}function g(a,b){var c=l(a,b),d=l(a,b+1),e=l(a,b+2);return(l(a,b+3)<<24)+(e<<16)+(d<<8)+c}function i(a,b){var c=l(a,b);return(l(a,b+1)<<8)+c}function k(a,b){var c=l(a,b);return c>127?c-256:c}function l(a,b){return a.charCodeAt(b)&255}function o(b){var c, -d,e;c=g(a,b);d=g(a,b+E);e=g(a,b+x);b=i(a,b+I);u.faces.push(new THREE.Face3(c,d,e,null,null,b))}function p(b){var c,d,e,f,j,k,l;c=g(a,b);d=g(a,b+E);e=g(a,b+x);f=i(a,b+I);j=g(a,b+M);k=g(a,b+D);l=g(a,b+F);var b=A[k*3],m=A[k*3+1];k=A[k*3+2];var n=A[l*3],o=A[l*3+1];l=A[l*3+2];u.faces.push(new THREE.Face3(c,d,e,[new THREE.Vector3(A[j*3],A[j*3+1],A[j*3+2]),new THREE.Vector3(b,m,k),new THREE.Vector3(n,o,l)],null,f))}function n(b){var c,d,e,f;c=g(a,b);d=g(a,b+P);e=g(a,b+K);f=g(a,b+$);b=i(a,b+S);u.faces.push(new THREE.Face4(c, -d,e,f,null,null,b))}function r(b){var c,d,e,f,j,k,l,m,n;c=g(a,b);d=g(a,b+P);e=g(a,b+K);f=g(a,b+$);j=i(a,b+S);k=g(a,b+R);l=g(a,b+V);m=g(a,b+ja);n=g(a,b+y);var b=A[l*3],o=A[l*3+1];l=A[l*3+2];var p=A[m*3],v=A[m*3+1];m=A[m*3+2];var J=A[n*3],r=A[n*3+1];n=A[n*3+2];u.faces.push(new THREE.Face4(c,d,e,f,[new THREE.Vector3(A[k*3],A[k*3+1],A[k*3+2]),new THREE.Vector3(b,o,l),new THREE.Vector3(p,v,m),new THREE.Vector3(J,r,n)],null,j))}function m(b){var c,d,e,f;c=g(a,b);d=g(a,b+H);e=g(a,b+z);b=w[c*2];f=w[c*2+1]; -c=w[d*2];var i=u.faceVertexUvs[0];d=w[d*2+1];var j=w[e*2];e=w[e*2+1];var k=[];k.push(new THREE.UV(b,f));k.push(new THREE.UV(c,d));k.push(new THREE.UV(j,e));i.push(k)}function s(b){var c,d,e,f,i,k;c=g(a,b);d=g(a,b+L);e=g(a,b+j);f=g(a,b+aa);b=w[c*2];i=w[c*2+1];c=w[d*2];k=w[d*2+1];d=w[e*2];var l=u.faceVertexUvs[0];e=w[e*2+1];var m=w[f*2];f=w[f*2+1];var n=[];n.push(new THREE.UV(b,i));n.push(new THREE.UV(c,k));n.push(new THREE.UV(d,e));n.push(new THREE.UV(m,f));l.push(n)}var u=this,t=0,q,A=[],w=[],E,x, -I,M,D,F,P,K,$,S,R,V,ja,y,H,z,L,j,aa,ga,N,W,T,ca,Q;THREE.Geometry.call(this);THREE.Loader.prototype.initMaterials(u,d,b);q={signature:a.substr(t,8),header_bytes:l(a,t+8),vertex_coordinate_bytes:l(a,t+9),normal_coordinate_bytes:l(a,t+10),uv_coordinate_bytes:l(a,t+11),vertex_index_bytes:l(a,t+12),normal_index_bytes:l(a,t+13),uv_index_bytes:l(a,t+14),material_index_bytes:l(a,t+15),nvertices:g(a,t+16),nnormals:g(a,t+16+4),nuvs:g(a,t+16+8),ntri_flat:g(a,t+16+12),ntri_smooth:g(a,t+16+16),ntri_flat_uv:g(a, -t+16+20),ntri_smooth_uv:g(a,t+16+24),nquad_flat:g(a,t+16+28),nquad_smooth:g(a,t+16+32),nquad_flat_uv:g(a,t+16+36),nquad_smooth_uv:g(a,t+16+40)};t+=q.header_bytes;E=q.vertex_index_bytes;x=q.vertex_index_bytes*2;I=q.vertex_index_bytes*3;M=q.vertex_index_bytes*3+q.material_index_bytes;D=q.vertex_index_bytes*3+q.material_index_bytes+q.normal_index_bytes;F=q.vertex_index_bytes*3+q.material_index_bytes+q.normal_index_bytes*2;P=q.vertex_index_bytes;K=q.vertex_index_bytes*2;$=q.vertex_index_bytes*3;S=q.vertex_index_bytes* -4;R=q.vertex_index_bytes*4+q.material_index_bytes;V=q.vertex_index_bytes*4+q.material_index_bytes+q.normal_index_bytes;ja=q.vertex_index_bytes*4+q.material_index_bytes+q.normal_index_bytes*2;y=q.vertex_index_bytes*4+q.material_index_bytes+q.normal_index_bytes*3;H=q.uv_index_bytes;z=q.uv_index_bytes*2;L=q.uv_index_bytes;j=q.uv_index_bytes*2;aa=q.uv_index_bytes*3;b=q.vertex_index_bytes*3+q.material_index_bytes;Q=q.vertex_index_bytes*4+q.material_index_bytes;ga=q.ntri_flat*b;N=q.ntri_smooth*(b+q.normal_index_bytes* -3);W=q.ntri_flat_uv*(b+q.uv_index_bytes*3);T=q.ntri_smooth_uv*(b+q.normal_index_bytes*3+q.uv_index_bytes*3);ca=q.nquad_flat*Q;b=q.nquad_smooth*(Q+q.normal_index_bytes*4);Q=q.nquad_flat_uv*(Q+q.uv_index_bytes*4);t+=function(b){for(var d,e,g,h=q.vertex_coordinate_bytes*3,i=b+q.nvertices*h;b=0){p=i.invBindMatrices[m];j.invBindMatrix=p;j.skinningMatrix=new THREE.Matrix4;j.skinningMatrix.multiply(j.world,p);j.weights=[];for(p=0;p1){j=new THREE.MeshFaceMaterial;for(h=0;h1?b.add(j):b=j}}b.name=a.id||"";a.matrix.decompose(b.position,b.rotation,b.scale);for(f=0;f1?c[1].substr(0,b):"0";c[1].length=0,g=e.indexOf("(")>=0,h;if(f)d=e.split("."),e=d.shift(),d.shift();else if(g){h=e.split("(");e=h.shift();for(d=0;db){k=j.output[i];break}g=k!==void 0?k instanceof THREE.Matrix4?g.multiply(g,k):g.multiply(g,h.matrix):g.multiply(g,h.matrix)}else g=g.multiply(g,h.matrix);b=g;c.push({time:a,pos:[b.n14,b.n24,b.n34],rotq:[0,0,0,1],scl:[1,1,1]})}this.keys=c}this.updateMatrix();return this};o.prototype.updateMatrix=function(){this.matrix.identity();for(var a=0;a0&&(this[c.nodeName]=parseFloat(d[0].textContent))}}this.create();return this};D.prototype.create=function(){var a={},b=this.transparency!==void 0&&this.transparency<1,c;for(c in this)switch(c){case "ambient":case "emission":case "diffuse":case "specular":var d=this[c];if(d instanceof M)if(d.isTexture()){if(this.effect.sampler&&this.effect.surface&&this.effect.sampler.source==this.effect.surface.sid&&(d=C[this.effect.surface.init_from]))a.map= -THREE.ImageUtils.loadTexture(ta+d.init_from),a.map.wrapS=THREE.RepeatWrapping,a.map.wrapT=THREE.RepeatWrapping,a.map.repeat.x=1,a.map.repeat.y=-1}else c=="diffuse"?a.color=d.color.getHex():b||(a[c]=d.color.getHex());break;case "shininess":case "reflectivity":a[c]=this[c];break;case "transparency":if(b)a.transparent=!0,a.opacity=this[c],b=!0}a.shading=wa;return this.material=new THREE.MeshLambertMaterial(a)};F.prototype.parse=function(a){for(var b=0;b=0,d=a.indexOf("(")>=0,e,f;if(c)b=a.split("."),a=b.shift(),f=b.shift();else if(d){e=a.split("(");a=e.shift();for(b=0;b=0){p=i.invBindMatrices[m];j.invBindMatrix=p;j.skinningMatrix=new THREE.Matrix4;j.skinningMatrix.multiply(j.world,p);j.weights=[];for(p=0;p1){j=new THREE.MeshFaceMaterial;for(h=0;h1?b.add(j):b=j}}b.name=a.id||"";a.matrix.decompose(b.position,b.rotation, +b.scale);for(f=0;f1?c[1].substr(0,b):"0";c[1].length=0,g=e.indexOf("(")>=0,h;if(f)d=e.split("."),e=d.shift(),d.shift();else if(g){h=e.split("(");e=h.shift(); +for(d=0;db){l=j.output[i];break}g=l!==void 0?l instanceof THREE.Matrix4?g.multiply(g,l):g.multiply(g,h.matrix):g.multiply(g,h.matrix)}else g=g.multiply(g,h.matrix);b=g;c.push({time:a,pos:[b.n14, +b.n24,b.n34],rotq:[0,0,0,1],scl:[1,1,1]})}this.keys=c}this.updateMatrix();return this};p.prototype.updateMatrix=function(){this.matrix.identity();for(var a=0;a0&&(this[c.nodeName]=parseFloat(d[0].textContent))}}this.create();return this};D.prototype.create=function(){var a={},b=this.transparency!==void 0&&this.transparency<1,c;for(c in this)switch(c){case "ambient":case "emission":case "diffuse":case "specular":var d=this[c]; +if(d instanceof w)if(d.isTexture()){if(this.effect.sampler&&this.effect.surface&&this.effect.sampler.source==this.effect.surface.sid&&(d=ga[this.effect.surface.init_from]))a.map=THREE.ImageUtils.loadTexture(xa+d.init_from),a.map.wrapS=THREE.RepeatWrapping,a.map.wrapT=THREE.RepeatWrapping,a.map.repeat.x=1,a.map.repeat.y=-1}else c=="diffuse"?a.color=d.color.getHex():b||(a[c]=d.color.getHex());break;case "shininess":case "reflectivity":a[c]=this[c];break;case "transparency":if(b)a.transparent=!0,a.opacity= +this[c],b=!0}a.shading=qa;return this.material=new THREE.MeshLambertMaterial(a)};A.prototype.parse=function(a){for(var b=0;b=0,d=a.indexOf("(")>=0,e,f;if(c)b=a.split("."),a=b.shift(),f=b.shift();else if(d){e=a.split("(");a=e.shift();for(b=0;b1&&(P=new THREE.MeshFaceMaterial); -a=new THREE.Mesh(M,P);a.name=p;a.position.set(A[0],A[1],A[2]);E?(a.quaternion.set(E[0],E[1],E[2],E[3]),a.useQuaternion=!0):a.rotation.set(w[0],w[1],w[2]);a.scale.set(x[0],x[1],x[2]);a.visible=u.visible;y.scene.add(a);y.objects[p]=a;if(u.meshCollider){var b=THREE.CollisionUtils.MeshColliderWBox(a);y.scene.collisions.colliders.push(b)}if(u.castsShadow)b=new THREE.ShadowVolume(M),y.scene.add(b),b.position=a.position,b.rotation=a.rotation,b.scale=a.scale;u.trigger&&u.trigger.toLowerCase()!="none"&&(b= -{type:u.trigger,object:u},y.triggers[a.name]=b)}}else A=u.position,w=u.rotation,E=u.quaternion,x=u.scale,E=0,a=new THREE.Object3D,a.name=p,a.position.set(A[0],A[1],A[2]),E?(a.quaternion.set(E[0],E[1],E[2],E[3]),a.useQuaternion=!0):a.rotation.set(w[0],w[1],w[2]),a.scale.set(x[0],x[1],x[2]),a.visible=u.visible!==void 0?u.visible:!1,y.scene.add(a),y.objects[p]=a,y.empties[p]=a,u.trigger&&u.trigger.toLowerCase()!="none"&&(b={type:u.trigger,object:u},y.triggers[a.name]=b)}function e(a){return function(b){y.geometries[a]= -b;g();S-=1;i.onLoadComplete();h()}}function f(a){return function(b){y.geometries[a]=b}}function h(){i.callbackProgress({totalModels:V,totalTextures:ja,loadedModels:V-S,loadedTextures:ja-R},y);i.onLoadProgress();S==0&&R==0&&c(y)}var i=this,k=THREE.Loader.prototype.extractUrlbase(b),l,o,p,n,r,m,s,u,t,q,A,w,E,x,I,M,D,F,P,K,$,S,R,V,ja,y;K=a;b=new THREE.BinaryLoader;$=new THREE.JSONLoader;R=S=0;y={scene:new THREE.Scene,geometries:{},materials:{},textures:{},objects:{},cameras:{},lights:{},fogs:{},triggers:{}, -empties:{}};a=!1;for(p in K.objects)if(u=K.objects[p],u.meshCollider){a=!0;break}if(a)y.scene.collisions=new THREE.CollisionSystem;if(K.transform){a=K.transform.position;t=K.transform.rotation;var H=K.transform.scale;a&&y.scene.position.set(a[0],a[1],a[2]);t&&y.scene.rotation.set(t[0],t[1],t[2]);H&&y.scene.scale.set(H[0],H[1],H[2]);(a||t||H)&&y.scene.updateMatrix()}a=function(){R-=1;h();i.onLoadComplete()};for(r in K.cameras)t=K.cameras[r],t.type=="perspective"?D=new THREE.PerspectiveCamera(t.fov, -t.aspect,t.near,t.far):t.type=="ortho"&&(D=new THREE.OrthographicCamera(t.left,t.right,t.top,t.bottom,t.near,t.far)),A=t.position,t=t.target,D.position.set(A[0],A[1],A[2]),D.target=new THREE.Vector3(t[0],t[1],t[2]),y.cameras[r]=D;for(n in K.lights)t=K.lights[n],r=t.color!==void 0?t.color:16777215,D=t.intensity!==void 0?t.intensity:1,t.type=="directional"?(A=t.direction,q=new THREE.DirectionalLight(r,D),q.position.set(A[0],A[1],A[2]),q.position.normalize()):t.type=="point"?(A=t.position,q=t.distance, -q=new THREE.PointLight(r,D,q),q.position.set(A[0],A[1],A[2])):t.type=="ambient"&&(q=new THREE.AmbientLight(r)),y.scene.add(q),y.lights[n]=q;for(m in K.fogs)n=K.fogs[m],n.type=="linear"?F=new THREE.Fog(0,n.near,n.far):n.type=="exp2"&&(F=new THREE.FogExp2(0,n.density)),t=n.color,F.color.setRGB(t[0],t[1],t[2]),y.fogs[m]=F;if(y.cameras&&K.defaults.camera)y.currentCamera=y.cameras[K.defaults.camera];if(y.fogs&&K.defaults.fog)y.scene.fog=y.fogs[K.defaults.fog];t=K.defaults.bgcolor;y.bgColor=new THREE.Color; -y.bgColor.setRGB(t[0],t[1],t[2]);y.bgColorAlpha=K.defaults.bgalpha;for(l in K.geometries)if(m=K.geometries[l],m.type=="bin_mesh"||m.type=="ascii_mesh")S+=1,i.onLoadStart();V=S;for(l in K.geometries)m=K.geometries[l],m.type=="cube"?(M=new THREE.CubeGeometry(m.width,m.height,m.depth,m.segmentsWidth,m.segmentsHeight,m.segmentsDepth,null,m.flipped,m.sides),y.geometries[l]=M):m.type=="plane"?(M=new THREE.PlaneGeometry(m.width,m.height,m.segmentsWidth,m.segmentsHeight),y.geometries[l]=M):m.type=="sphere"? -(M=new THREE.SphereGeometry(m.radius,m.segmentsWidth,m.segmentsHeight),y.geometries[l]=M):m.type=="cylinder"?(M=new THREE.CylinderGeometry(m.topRad,m.botRad,m.height,m.radSegs,m.heightSegs),y.geometries[l]=M):m.type=="torus"?(M=new THREE.TorusGeometry(m.radius,m.tube,m.segmentsR,m.segmentsT),y.geometries[l]=M):m.type=="icosahedron"?(M=new THREE.IcosahedronGeometry(m.subdivisions),y.geometries[l]=M):m.type=="bin_mesh"?b.load(d(m.url,K.urlBaseType),e(l)):m.type=="ascii_mesh"?$.load(d(m.url,K.urlBaseType), -e(l)):m.type=="embedded_mesh"&&(m=K.embeds[m.id])&&$.createModel(m,f(l),"");for(s in K.textures)if(l=K.textures[s],l.url instanceof Array){R+=l.url.length;for(m=0;m1&&(K=new THREE.MeshFaceMaterial); +a=new THREE.Mesh(w,K);a.name=q;a.position.set(y[0],y[1],y[2]);G?(a.quaternion.set(G[0],G[1],G[2],G[3]),a.useQuaternion=!0):a.rotation.set(v[0],v[1],v[2]);a.scale.set(B[0],B[1],B[2]);a.visible=s.visible;E.scene.add(a);E.objects[q]=a;if(s.meshCollider){var b=THREE.CollisionUtils.MeshColliderWBox(a);E.scene.collisions.colliders.push(b)}if(s.castsShadow)b=new THREE.ShadowVolume(w),E.scene.add(b),b.position=a.position,b.rotation=a.rotation,b.scale=a.scale;s.trigger&&s.trigger.toLowerCase()!="none"&&(b= +{type:s.trigger,object:s},E.triggers[a.name]=b)}}else y=s.position,v=s.rotation,G=s.quaternion,B=s.scale,G=0,a=new THREE.Object3D,a.name=q,a.position.set(y[0],y[1],y[2]),G?(a.quaternion.set(G[0],G[1],G[2],G[3]),a.useQuaternion=!0):a.rotation.set(v[0],v[1],v[2]),a.scale.set(B[0],B[1],B[2]),a.visible=s.visible!==void 0?s.visible:!1,E.scene.add(a),E.objects[q]=a,E.empties[q]=a,s.trigger&&s.trigger.toLowerCase()!="none"&&(b={type:s.trigger,object:s},E.triggers[a.name]=b)}function e(a){return function(b){E.geometries[a]= +b;g();W-=1;i.onLoadComplete();h()}}function f(a){return function(b){E.geometries[a]=b}}function h(){i.callbackProgress({totalModels:X,totalTextures:$,loadedModels:X-W,loadedTextures:$-U},E);i.onLoadProgress();W==0&&U==0&&c(E)}var i=this,l=THREE.Loader.prototype.extractUrlbase(b),k,p,q,m,t,n,o,s,u,r,y,v,G,B,H,w,D,A,K,L,S,W,U,X,$,E;L=a;b=new THREE.BinaryLoader;S=new THREE.JSONLoader;U=W=0;E={scene:new THREE.Scene,geometries:{},materials:{},textures:{},objects:{},cameras:{},lights:{},fogs:{},triggers:{}, +empties:{}};a=!1;for(q in L.objects)if(s=L.objects[q],s.meshCollider){a=!0;break}if(a)E.scene.collisions=new THREE.CollisionSystem;if(L.transform){a=L.transform.position;u=L.transform.rotation;var I=L.transform.scale;a&&E.scene.position.set(a[0],a[1],a[2]);u&&E.scene.rotation.set(u[0],u[1],u[2]);I&&E.scene.scale.set(I[0],I[1],I[2]);(a||u||I)&&E.scene.updateMatrix()}a=function(){U-=1;h();i.onLoadComplete()};for(t in L.cameras)u=L.cameras[t],u.type=="perspective"?D=new THREE.PerspectiveCamera(u.fov, +u.aspect,u.near,u.far):u.type=="ortho"&&(D=new THREE.OrthographicCamera(u.left,u.right,u.top,u.bottom,u.near,u.far)),y=u.position,u=u.target,D.position.set(y[0],y[1],y[2]),D.target=new THREE.Vector3(u[0],u[1],u[2]),E.cameras[t]=D;for(m in L.lights)u=L.lights[m],t=u.color!==void 0?u.color:16777215,D=u.intensity!==void 0?u.intensity:1,u.type=="directional"?(y=u.direction,r=new THREE.DirectionalLight(t,D),r.position.set(y[0],y[1],y[2]),r.position.normalize()):u.type=="point"?(y=u.position,r=u.distance, +r=new THREE.PointLight(t,D,r),r.position.set(y[0],y[1],y[2])):u.type=="ambient"&&(r=new THREE.AmbientLight(t)),E.scene.add(r),E.lights[m]=r;for(n in L.fogs)m=L.fogs[n],m.type=="linear"?A=new THREE.Fog(0,m.near,m.far):m.type=="exp2"&&(A=new THREE.FogExp2(0,m.density)),u=m.color,A.color.setRGB(u[0],u[1],u[2]),E.fogs[n]=A;if(E.cameras&&L.defaults.camera)E.currentCamera=E.cameras[L.defaults.camera];if(E.fogs&&L.defaults.fog)E.scene.fog=E.fogs[L.defaults.fog];u=L.defaults.bgcolor;E.bgColor=new THREE.Color; +E.bgColor.setRGB(u[0],u[1],u[2]);E.bgColorAlpha=L.defaults.bgalpha;for(k in L.geometries)if(n=L.geometries[k],n.type=="bin_mesh"||n.type=="ascii_mesh")W+=1,i.onLoadStart();X=W;for(k in L.geometries)n=L.geometries[k],n.type=="cube"?(w=new THREE.CubeGeometry(n.width,n.height,n.depth,n.segmentsWidth,n.segmentsHeight,n.segmentsDepth,null,n.flipped,n.sides),E.geometries[k]=w):n.type=="plane"?(w=new THREE.PlaneGeometry(n.width,n.height,n.segmentsWidth,n.segmentsHeight),E.geometries[k]=w):n.type=="sphere"? +(w=new THREE.SphereGeometry(n.radius,n.segmentsWidth,n.segmentsHeight),E.geometries[k]=w):n.type=="cylinder"?(w=new THREE.CylinderGeometry(n.topRad,n.botRad,n.height,n.radSegs,n.heightSegs),E.geometries[k]=w):n.type=="torus"?(w=new THREE.TorusGeometry(n.radius,n.tube,n.segmentsR,n.segmentsT),E.geometries[k]=w):n.type=="icosahedron"?(w=new THREE.IcosahedronGeometry(n.subdivisions),E.geometries[k]=w):n.type=="bin_mesh"?b.load(d(n.url,L.urlBaseType),e(k)):n.type=="ascii_mesh"?S.load(d(n.url,L.urlBaseType), +e(k)):n.type=="embedded_mesh"&&(n=L.embeds[n.id])&&S.createModel(n,f(k),"");for(o in L.textures)if(k=L.textures[o],k.url instanceof Array){U+=k.url.length;for(n=0;n=57344&&(c-=2048);c++;for(var b=new Float32Array(8*c),d=1,g=0;g<8;g++){for(var e=0,f=0;f>1^-(h&1);b[8*f+g]=e}d+=c}c=a.length-d;e=new Uint16Array(c);for(g=f=0;g=this.maxCount-3&&h(this)};this.begin= -function(){this.count=0;this.hasNormal=this.hasPos=!1};this.end=function(a){if(this.count!==0){for(var c=this.count*3;cthis.size-1&&(i=this.size-1);var p=Math.floor(k-h);p<1&&(p=1);k=Math.floor(k+h);k>this.size-1&&(k=this.size-1);var n=Math.floor(l-h);n<1&&(n=1);h=Math.floor(l+h); -h>this.size-1&&(h=this.size-1);for(var r,m,s,u,t,q;o0&&(this.field[s+r]+=u)}}};this.addPlaneX=function(a,c){var g,e,f,h,i,k=this.size,l=this.yd,o=this.zd,p=this.field,n=k*Math.sqrt(a/c);n>k&&(n=k);for(g=0;g0)for(e=0;el&&(r=l);for(e=0;e0){i=e*o;for(g=0;gl&&(r=l);for(f=0;f0){i=p*f;for(e=0;ethis.size-1&&(i=this.size-1);var q=Math.floor(l-h);q<1&&(q=1);l=Math.floor(l+h);l>this.size-1&&(l=this.size-1);var m=Math.floor(k-h);m<1&&(m=1);h=Math.floor(k+h); +h>this.size-1&&(h=this.size-1);for(var t,n,o,s,u,r;p0&&(this.field[o+t]+=s)}}};this.addPlaneX=function(a,c){var g,e,f,h,i,l=this.size,k=this.yd,p=this.zd,q=this.field,m=l*Math.sqrt(a/c);m>l&&(m=l);for(g=0;g0)for(e=0;ek&&(t=k);for(e=0;e0){i=e*p;for(g=0;gk&&(t=k);for(f=0;f0){i=q*f;for(e=0;ee?this.hits.push(g):this.hits.unshift(g),e=d;return this.hits}; THREE.CollisionSystem.prototype.rayCastNearest=function(a){var c=this.rayCastAll(a);if(c.length==0)return null;for(var b=0;c[b]instanceof THREE.MeshCollider;){var d=this.rayMesh(a,c[b]);if(d.distc.length)return null;return c[b]}; THREE.CollisionSystem.prototype.rayCast=function(a,c){if(c instanceof THREE.PlaneCollider)return this.rayPlane(a,c);else if(c instanceof THREE.SphereCollider)return this.raySphere(a,c);else if(c instanceof THREE.BoxCollider)return this.rayBox(a,c);else if(c instanceof THREE.MeshCollider&&c.box)return this.rayBox(a,c.box)}; -THREE.CollisionSystem.prototype.rayMesh=function(a,c){for(var b=this.makeRayLocal(a,c.mesh),d=Number.MAX_VALUE,g,e=0;e=h*g))return Number.MAX_VALUE;f/=h;h=THREE.CollisionSystem.__v3;h.copy(a.direction);h.multiplyScalar(f);h.addSelf(a.origin);Math.abs(e.x)> Math.abs(e.y)?Math.abs(e.x)>Math.abs(e.z)?(a=h.y-c.y,e=b.y-c.y,g=d.y-c.y,h=h.z-c.z,b=b.z-c.z,d=d.z-c.z):(a=h.x-c.x,e=b.x-c.x,g=d.x-c.x,h=h.y-c.y,b=b.y-c.y,d=d.y-c.y):Math.abs(e.y)>Math.abs(e.z)?(a=h.x-c.x,e=b.x-c.x,g=d.x-c.x,h=h.z-c.z,b=b.z-c.z,d=d.z-c.z):(a=h.x-c.x,e=b.x-c.x,g=d.x-c.x,h=h.y-c.y,b=b.y-c.y,d=d.y-c.y);c=e*d-b*g;if(c==0)return Number.MAX_VALUE;c=1/c;d=(a*d-h*g)*c;if(!(d>=0))return Number.MAX_VALUE;c*=e*h-b*a;if(!(c>=0))return Number.MAX_VALUE;if(!(1-d-c>=0))return Number.MAX_VALUE;return f}; THREE.CollisionSystem.prototype.makeRayLocal=function(a,c){var b=THREE.CollisionSystem.__m;b.getInverse(c.matrixWorld);var d=THREE.CollisionSystem.__r;d.origin.copy(a.origin);d.direction.copy(a.direction);b.multiplyVector3(d.origin);b.rotateAxis(d.direction);d.direction.normalize();return d}; -THREE.CollisionSystem.prototype.rayBox=function(a,c){var b;c.dynamic&&c.mesh&&c.mesh.matrixWorld?b=this.makeRayLocal(a,c.mesh):(b=THREE.CollisionSystem.__r,b.origin.copy(a.origin),b.direction.copy(a.direction));var d=0,g=0,e=0,f=0,h=0,i=0,k=!0;b.origin.xc.max.x&&(d=c.max.x-b.origin.x,d/=b.direction.x,k=!1,f=1);b.origin.yc.max.y&&(g=c.max.y-b.origin.y,g/=b.direction.y, -k=!1,h=1);b.origin.zc.max.z&&(e=c.max.z-b.origin.z,e/=b.direction.z,k=!1,i=1);if(k)return-1;k=0;g>d&&(k=1,d=g);e>d&&(k=2,d=e);switch(k){case 0:h=b.origin.y+b.direction.y*d;if(hc.max.y)return Number.MAX_VALUE;b=b.origin.z+b.direction.z*d;if(bc.max.z)return Number.MAX_VALUE;c.normal.set(f,0,0);break;case 1:f=b.origin.x+b.direction.x*d;if(fc.max.x)return Number.MAX_VALUE;b=b.origin.z+b.direction.z* +THREE.CollisionSystem.prototype.rayBox=function(a,c){var b;c.dynamic&&c.mesh&&c.mesh.matrixWorld?b=this.makeRayLocal(a,c.mesh):(b=THREE.CollisionSystem.__r,b.origin.copy(a.origin),b.direction.copy(a.direction));var d=0,g=0,e=0,f=0,h=0,i=0,l=!0;b.origin.xc.max.x&&(d=c.max.x-b.origin.x,d/=b.direction.x,l=!1,f=1);b.origin.yc.max.y&&(g=c.max.y-b.origin.y,g/=b.direction.y, +l=!1,h=1);b.origin.zc.max.z&&(e=c.max.z-b.origin.z,e/=b.direction.z,l=!1,i=1);if(l)return-1;l=0;g>d&&(l=1,d=g);e>d&&(l=2,d=e);switch(l){case 0:h=b.origin.y+b.direction.y*d;if(hc.max.y)return Number.MAX_VALUE;b=b.origin.z+b.direction.z*d;if(bc.max.z)return Number.MAX_VALUE;c.normal.set(f,0,0);break;case 1:f=b.origin.x+b.direction.x*d;if(fc.max.x)return Number.MAX_VALUE;b=b.origin.z+b.direction.z* d;if(bc.max.z)return Number.MAX_VALUE;c.normal.set(0,h,0);break;case 2:f=b.origin.x+b.direction.x*d;if(fc.max.x)return Number.MAX_VALUE;h=b.origin.y+b.direction.y*d;if(hc.max.y)return Number.MAX_VALUE;c.normal.set(0,0,i)}return d};THREE.CollisionSystem.prototype.rayPlane=function(a,c){var b=a.direction.dot(c.normal),d=c.point.dot(c.normal);if(b<0)b=(d-a.origin.dot(c.normal))/b;else return Number.MAX_VALUE;return b>0?b:Number.MAX_VALUE}; THREE.CollisionSystem.prototype.raySphere=function(a,c){var b=c.center.clone().subSelf(a.origin);if(b.lengthSq=0)return Math.abs(d)-Math.sqrt(b);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 c=a.geometry.boundingBox,b=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]),b=new THREE.BoxCollider(b,c);b.mesh=a;return b};THREE.CollisionUtils.MeshAABB=function(a){var c=THREE.CollisionUtils.MeshOBB(a);c.min.addSelf(a.position);c.max.addSelf(a.position);c.dynamic=!1;return c}; 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);this.autoUpdateScene=!1;var c=this,b=this.setSize,d=this.render,g=new THREE.PerspectiveCamera,e=new THREE.PerspectiveCamera,f=new THREE.Matrix4,h=new THREE.Matrix4,i,k,l,o;g.matrixAutoUpdate=e.matrixAutoUpdate=!1;var a={minFilter:THREE.LinearFilter,magFilter:THREE.NearestFilter,format:THREE.RGBAFormat},p=new THREE.WebGLRenderTarget(512,512,a),n=new THREE.WebGLRenderTarget(512,512,a),r=new THREE.PerspectiveCamera(53, -1,1,1E4);r.position.z=2;var a=new THREE.ShaderMaterial({uniforms:{mapLeft:{type:"t",value:0,texture:p},mapRight:{type:"t",value:1,texture:n}},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}"}), -m=new THREE.Scene;m.add(new THREE.Mesh(new THREE.PlaneGeometry(2,2),a));m.add(r);this.setSize=function(a,d){b.call(c,a,d);p.width=a;p.height=d;n.width=a;n.height=d};this.render=function(a,b){a.updateMatrixWorld();if(i!==b.aspect||k!==b.near||l!==b.far||o!==b.fov){i=b.aspect;k=b.near;l=b.far;o=b.fov;var t=b.projectionMatrix.clone(),q=125/30*0.5,A=q*k/125,w=k*Math.tan(o*Math.PI/360),E;f.n14=q;h.n14=-q;q=-w*i+A;E=w*i+A;t.n11=2*k/(E-q);t.n13=(E+q)/(E-q);g.projectionMatrix.copy(t);q=-w*i-A;E=w*i-A;t.n11= -2*k/(E-q);t.n13=(E+q)/(E-q);e.projectionMatrix.copy(t)}g.matrixWorld.copy(b.matrixWorld).multiplySelf(h);g.position.copy(b.position);g.near=b.near;g.far=b.far;d.call(c,a,g,p,!0);e.matrixWorld.copy(b.matrixWorld).multiplySelf(f);e.position.copy(b.position);e.near=b.near;e.far=b.far;d.call(c,a,e,n,!0);m.updateMatrixWorld();d.call(c,m,r)}}; +if(THREE.WebGLRenderer)THREE.AnaglyphWebGLRenderer=function(a){THREE.WebGLRenderer.call(this,a);this.autoUpdateScene=!1;var c=this,b=this.setSize,d=this.render,g=new THREE.PerspectiveCamera,e=new THREE.PerspectiveCamera,f=new THREE.Matrix4,h=new THREE.Matrix4,i,l,k,p;g.matrixAutoUpdate=e.matrixAutoUpdate=!1;var a={minFilter:THREE.LinearFilter,magFilter:THREE.NearestFilter,format:THREE.RGBAFormat},q=new THREE.WebGLRenderTarget(512,512,a),m=new THREE.WebGLRenderTarget(512,512,a),t=new THREE.PerspectiveCamera(53, +1,1,1E4);t.position.z=2;var a=new THREE.ShaderMaterial({uniforms:{mapLeft:{type:"t",value:0,texture:q},mapRight:{type:"t",value:1,texture:m}},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}"}), +n=new THREE.Scene;n.add(new THREE.Mesh(new THREE.PlaneGeometry(2,2),a));n.add(t);this.setSize=function(a,d){b.call(c,a,d);q.width=a;q.height=d;m.width=a;m.height=d};this.render=function(a,b){a.updateMatrixWorld();if(i!==b.aspect||l!==b.near||k!==b.far||p!==b.fov){i=b.aspect;l=b.near;k=b.far;p=b.fov;var u=b.projectionMatrix.clone(),r=125/30*0.5,y=r*l/125,v=l*Math.tan(p*Math.PI/360),G;f.n14=r;h.n14=-r;r=-v*i+y;G=v*i+y;u.n11=2*l/(G-r);u.n13=(G+r)/(G-r);g.projectionMatrix.copy(u);r=-v*i-y;G=v*i-y;u.n11= +2*l/(G-r);u.n13=(G+r)/(G-r);e.projectionMatrix.copy(u)}g.matrixWorld.copy(b.matrixWorld).multiplySelf(h);g.position.copy(b.position);g.near=b.near;g.far=b.far;d.call(c,a,g,q,!0);e.matrixWorld.copy(b.matrixWorld).multiplySelf(f);e.position.copy(b.position);e.near=b.near;e.far=b.far;d.call(c,a,e,m,!0);n.updateMatrixWorld();d.call(c,n,t)}}; if(THREE.WebGLRenderer)THREE.CrosseyedWebGLRenderer=function(a){THREE.WebGLRenderer.call(this,a);this.autoClear=!1;var c=this,b=this.setSize,d=this.render,g,e,f=new THREE.PerspectiveCamera;f.target=new THREE.Vector3(0,0,0);var h=new THREE.PerspectiveCamera;h.target=new THREE.Vector3(0,0,0);c.separation=10;if(a&&a.separation!==void 0)c.separation=a.separation;this.setSize=function(a,d){b.call(c,a,d);g=a/2;e=d};this.render=function(a,b){this.clear();f.fov=b.fov;f.aspect=0.5*b.aspect;f.near=b.near;f.far= b.far;f.updateProjectionMatrix();f.position.copy(b.position);f.target.copy(b.target);f.translateX(c.separation);f.lookAt(f.target);h.projectionMatrix=f.projectionMatrix;h.position.copy(b.position);h.target.copy(b.target);h.translateX(-c.separation);h.lookAt(h.target);this.setViewport(0,0,g,e);d.call(c,a,f);this.setViewport(g,0,g,e);d.call(c,a,h,!1)}}; diff --git a/build/custom/ThreeExtras.js b/build/custom/ThreeExtras.js index 1dc8d46e..ad1f96a9 100644 --- a/build/custom/ThreeExtras.js +++ b/build/custom/ThreeExtras.js @@ -1,19 +1,19 @@ // ThreeExtras.js r46dev - http://github.com/mrdoob/three.js THREE.ColorUtils={adjustHSV:function(a,c,b,d){var g=THREE.ColorUtils.__hsv;THREE.ColorUtils.rgbToHsv(a,g);g.h=THREE.Math.clamp(g.h+c,0,1);g.s=THREE.Math.clamp(g.s+b,0,1);g.v=THREE.Math.clamp(g.v+d,0,1);a.setHSV(g.h,g.s,g.v)},rgbToHsv:function(a,c){var b=a.r,d=a.g,g=a.b,f=Math.max(Math.max(b,d),g),e=Math.min(Math.min(b,d),g);if(e===f)e=b=0;else{var h=f-e,e=h/f,b=b===f?(d-g)/h:d===f?2+(g-b)/h:4+(b-d)/h;b/=6;b<0&&(b+=1);b>1&&(b-=1)}c===void 0&&(c={h:0,s:0,v:0});c.h=b;c.s=e;c.v=f;return c}}; THREE.ColorUtils.__hsv={h:0,s:0,v:0}; -THREE.GeometryUtils={merge:function(a,c){for(var b,d,g=a.vertices.length,f=c instanceof THREE.Mesh?c.geometry:c,e=a.vertices,h=f.vertices,i=a.faces,k=f.faces,j=a.faceVertexUvs[0],p=f.faceVertexUvs[0],m={},n=0;n1&&(d=1-d,g=1-g);f=1-d-g;e.copy(a);e.multiplyScalar(d);h.copy(c);h.multiplyScalar(g);e.addSelf(h);h.copy(b);h.multiplyScalar(f);e.addSelf(h);return e},randomPointInFace:function(a,c,b){var d,g,f;if(a instanceof THREE.Face3)return d=c.vertices[a.a].position,g=c.vertices[a.b].position, f=c.vertices[a.c].position,THREE.GeometryUtils.randomPointInTriangle(d,g,f);else if(a instanceof THREE.Face4){d=c.vertices[a.a].position;g=c.vertices[a.b].position;f=c.vertices[a.c].position;var c=c.vertices[a.d].position,e;b?a._area1&&a._area2?(b=a._area1,e=a._area2):(b=THREE.GeometryUtils.triangleArea(d,g,c),e=THREE.GeometryUtils.triangleArea(g,f,c),a._area1=b,a._area2=e):(b=THREE.GeometryUtils.triangleArea(d,g,c),e=THREE.GeometryUtils.triangleArea(g,f,c));return THREE.GeometryUtils.random()*(b+ -e)a?b(d,e-1):k[e]a?b(d,e-1):j[e]0?(e=b[b.length-1],n=e.x,t=e.y):(e=this.actions[d-1].args,n=e[e.length-2],t=e[e.length-1]);for(e=1;e<=a;e++)l=e/a,f=THREE.Shape.Utils.b2(l,n,p,h),l=THREE.Shape.Utils.b2(l,t,m, -i),b.push(new THREE.Vector2(f,l));break;case THREE.PathActions.BEZIER_CURVE_TO:h=f[4];i=f[5];p=f[0];m=f[1];k=f[2];j=f[3];b.length>0?(e=b[b.length-1],n=e.x,t=e.y):(e=this.actions[d-1].args,n=e[e.length-2],t=e[e.length-1]);for(e=1;e<=a;e++)l=e/a,f=THREE.Shape.Utils.b3(l,n,p,k,h),l=THREE.Shape.Utils.b3(l,t,m,j,i),b.push(new THREE.Vector2(f,l));break;case THREE.PathActions.CSPLINE_THRU:e=this.actions[d-1].args;e=[new THREE.Vector2(e[e.length-2],e[e.length-1])];l=a*f[0].length;e=e.concat(f[0]);f=new THREE.SplineCurve(e); -for(e=1;e<=l;e++)b.push(f.getPointAt(e/l));break;case THREE.PathActions.ARC:e=this.actions[d-1].args;h=f[0];i=f[1];k=f[2];p=f[3];l=f[4];m=!!f[5];j=e[e.length-2];n=e[e.length-1];e.length==0&&(j=n=0);t=l-p;var s=a*2;for(e=1;e<=s;e++)l=e/s,m||(l=1-l),l=p+l*t,f=j+h+k*Math.cos(l),l=n+i+k*Math.sin(l),b.push(new THREE.Vector2(f,l))}c&&b.push(b[0]);return b};THREE.Path.prototype.transform=function(a,c){this.getBoundingBox();return this.getWrapPoints(this.getPoints(c),a)}; -THREE.Path.prototype.nltransform=function(a,c,b,d,g,f){var e=this.getPoints(),h,i,k,j,p;h=0;for(i=e.length;h0?(e=b[b.length-1],l=e.x,s=e.y):(e=this.actions[d-1].args,l=e[e.length-2],s=e[e.length-1]);for(e=1;e<=a;e++)m=e/a,f=THREE.Shape.Utils.b2(m,l,q,h),m=THREE.Shape.Utils.b2(m,s,n, +i),b.push(new THREE.Vector2(f,m));break;case THREE.PathActions.BEZIER_CURVE_TO:h=f[4];i=f[5];q=f[0];n=f[1];j=f[2];k=f[3];b.length>0?(e=b[b.length-1],l=e.x,s=e.y):(e=this.actions[d-1].args,l=e[e.length-2],s=e[e.length-1]);for(e=1;e<=a;e++)m=e/a,f=THREE.Shape.Utils.b3(m,l,q,j,h),m=THREE.Shape.Utils.b3(m,s,n,k,i),b.push(new THREE.Vector2(f,m));break;case THREE.PathActions.CSPLINE_THRU:e=this.actions[d-1].args;e=[new THREE.Vector2(e[e.length-2],e[e.length-1])];m=a*f[0].length;e=e.concat(f[0]);f=new THREE.SplineCurve(e); +for(e=1;e<=m;e++)b.push(f.getPointAt(e/m));break;case THREE.PathActions.ARC:e=this.actions[d-1].args;h=f[0];i=f[1];j=f[2];q=f[3];m=f[4];n=!!f[5];k=e[e.length-2];l=e[e.length-1];e.length==0&&(k=l=0);s=m-q;var p=a*2;for(e=1;e<=p;e++)m=e/p,n||(m=1-m),m=q+m*s,f=k+h+j*Math.cos(m),m=l+i+j*Math.sin(m),b.push(new THREE.Vector2(f,m))}c&&b.push(b[0]);return b};THREE.Path.prototype.transform=function(a,c){this.getBoundingBox();return this.getWrapPoints(this.getPoints(c),a)}; +THREE.Path.prototype.nltransform=function(a,c,b,d,g,f){var e=this.getPoints(),h,i,j,k,q;h=0;for(i=e.length;h=0?h-1:b.length-1;f=e-1>=0?e-1:k.length-1;var l=[k[e],b[h],b[g]];p=THREE.FontUtils.Triangulate.area(l);var s=[k[e],k[f],b[h]];m=THREE.FontUtils.Triangulate.area(s);n=h;j=e;h+=1;e+=-1;h< -0&&(h+=b.length);h%=b.length;e<0&&(e+=k.length);e%=k.length;g=h-1>=0?h-1:b.length-1;f=e-1>=0?e-1:k.length-1;l=[k[e],b[h],b[g]];l=THREE.FontUtils.Triangulate.area(l);s=[k[e],k[f],b[h]];s=THREE.FontUtils.Triangulate.area(s);p+m>l+s&&(h=n,e=j,h<0&&(h+=b.length),h%=b.length,e<0&&(e+=k.length),e%=k.length,g=h-1>=0?h-1:b.length-1,f=e-1>=0?e-1:k.length-1);p=b.slice(0,h);m=b.slice(h);n=k.slice(e);j=k.slice(0,e);f=[k[e],k[f],b[h]];t.push([k[e],b[h],b[g]]);t.push(f);b=p.concat(n).concat(j).concat(m)}return{shape:b, -isolatedPts:t,allpoints:d}},triangulateShape:function(a,c){var b=THREE.Shape.Utils.removeHoles(a,c),d=b.allpoints,g=b.isolatedPts,b=THREE.FontUtils.Triangulate(b.shape,!1),f,e,h,i,k={};f=0;for(e=d.length;f=0?h-1:b.length-1;f=e-1>=0?e-1:j.length-1;var m=[j[e],b[h],b[g]];q=THREE.FontUtils.Triangulate.area(m);var p=[j[e],j[f],b[h]];n=THREE.FontUtils.Triangulate.area(p);l=h;k=e;h+=1;e+=-1;h< +0&&(h+=b.length);h%=b.length;e<0&&(e+=j.length);e%=j.length;g=h-1>=0?h-1:b.length-1;f=e-1>=0?e-1:j.length-1;m=[j[e],b[h],b[g]];m=THREE.FontUtils.Triangulate.area(m);p=[j[e],j[f],b[h]];p=THREE.FontUtils.Triangulate.area(p);q+n>m+p&&(h=l,e=k,h<0&&(h+=b.length),h%=b.length,e<0&&(e+=j.length),e%=j.length,g=h-1>=0?h-1:b.length-1,f=e-1>=0?e-1:j.length-1);q=b.slice(0,h);n=b.slice(h);l=j.slice(e);k=j.slice(0,e);f=[j[e],j[f],b[h]];s.push([j[e],b[h],b[g]]);s.push(f);b=q.concat(l).concat(k).concat(n)}return{shape:b, +isolatedPts:s,allpoints:d}},triangulateShape:function(a,c){var b=THREE.Shape.Utils.removeHoles(a,c),d=b.allpoints,g=b.isolatedPts,b=THREE.FontUtils.Triangulate(b.shape,!1),f,e,h,i,j={};f=0;for(e=d.length;f1)console.log("THREE.Animation.update: Warning! Scale out of bounds:"+d+" on bone "+n),d=d<0?0:1;if(b==="pos")if(b=a.position,this.interpolationType===THREE.AnimationHandler.LINEAR)b.x=g[0]+(f[0]-g[0])*d,b.y=g[1]+(f[1]-g[1])*d,b.z=g[2]+(f[2]-g[2])*d;else{if(this.interpolationType===THREE.AnimationHandler.CATMULLROM||this.interpolationType===THREE.AnimationHandler.CATMULLROM_FORWARD)if(this.points[0]= -this.getPrevKeyWith("pos",n,e.index-1).pos,this.points[1]=g,this.points[2]=f,this.points[3]=this.getNextKeyWith("pos",n,h.index+1).pos,d=d*0.33+0.33,g=this.interpolateCatmullRom(this.points,d),b.x=g[0],b.y=g[1],b.z=g[2],this.interpolationType===THREE.AnimationHandler.CATMULLROM_FORWARD)d=this.interpolateCatmullRom(this.points,d*1.01),this.target.set(d[0],d[1],d[2]),this.target.subSelf(b),this.target.y=0,this.target.normalize(),d=Math.atan2(this.target.x,this.target.z),a.rotation.set(0,d,0)}else if(b=== -"rot")THREE.Quaternion.slerp(g,f,a.quaternion,d);else if(b==="scl")b=a.scale,b.x=g[0]+(f[0]-g[0])*d,b.y=g[1]+(f[1]-g[1])*d,b.z=g[2]+(f[2]-g[2])*d}}if(this.JITCompile&&j[0][k]===void 0){this.hierarchy[0].update(null,!0);for(n=0;na.length-2?f:f+1;b[3]=f>a.length-3?f:f+2;f=a[b[0]];h=a[b[1]];i=a[b[2]];k=a[b[3]];b=g*g;e=g*b;d[0]=this.interpolate(f[0],h[0],i[0],k[0],g,b,e);d[1]=this.interpolate(f[1],h[1],i[1],k[1],g,b,e);d[2]=this.interpolate(f[2],h[2],i[2],k[2],g,b,e);return d}; +THREE.Animation.prototype.update=function(a){if(this.isPlaying){var c=["pos","rot","scl"],b,d,g,f,e,h,i,j,k=this.data.JIT.hierarchy,q,n;this.currentTime+=a*this.timeScale;n=this.currentTime;q=this.currentTime%=this.data.length;j=parseInt(Math.min(q*this.data.fps,this.data.length*this.data.fps),10);for(var l=0,s=this.hierarchy.length;l1)console.log("THREE.Animation.update: Warning! Scale out of bounds:"+d+" on bone "+l),d=d<0?0:1;if(b==="pos")if(b=a.position,this.interpolationType===THREE.AnimationHandler.LINEAR)b.x=g[0]+(f[0]-g[0])*d,b.y=g[1]+(f[1]-g[1])*d,b.z=g[2]+(f[2]-g[2])*d;else{if(this.interpolationType===THREE.AnimationHandler.CATMULLROM||this.interpolationType===THREE.AnimationHandler.CATMULLROM_FORWARD)if(this.points[0]= +this.getPrevKeyWith("pos",l,e.index-1).pos,this.points[1]=g,this.points[2]=f,this.points[3]=this.getNextKeyWith("pos",l,h.index+1).pos,d=d*0.33+0.33,g=this.interpolateCatmullRom(this.points,d),b.x=g[0],b.y=g[1],b.z=g[2],this.interpolationType===THREE.AnimationHandler.CATMULLROM_FORWARD)d=this.interpolateCatmullRom(this.points,d*1.01),this.target.set(d[0],d[1],d[2]),this.target.subSelf(b),this.target.y=0,this.target.normalize(),d=Math.atan2(this.target.x,this.target.z),a.rotation.set(0,d,0)}else if(b=== +"rot")THREE.Quaternion.slerp(g,f,a.quaternion,d);else if(b==="scl")b=a.scale,b.x=g[0]+(f[0]-g[0])*d,b.y=g[1]+(f[1]-g[1])*d,b.z=g[2]+(f[2]-g[2])*d}}if(this.JITCompile&&k[0][j]===void 0){this.hierarchy[0].update(null,!0);for(l=0;la.length-2?f:f+1;b[3]=f>a.length-3?f:f+2;f=a[b[0]];h=a[b[1]];i=a[b[2]];j=a[b[3]];b=g*g;e=g*b;d[0]=this.interpolate(f[0],h[0],i[0],j[0],g,b,e);d[1]=this.interpolate(f[1],h[1],i[1],j[1],g,b,e);d[2]=this.interpolate(f[2],h[2],i[2],j[2],g,b,e);return d}; THREE.Animation.prototype.interpolate=function(a,c,b,d,g,f,e){a=(b-a)*0.5;d=(d-c)*0.5;return(2*(c-b)+a+d)*e+(-3*(c-b)-2*a-d)*f+a*g+c};THREE.Animation.prototype.getNextKeyWith=function(a,c,b){var d=this.data.hierarchy[c].keys;for(this.interpolationType===THREE.AnimationHandler.CATMULLROM||this.interpolationType===THREE.AnimationHandler.CATMULLROM_FORWARD?b=b0?b:0:b>=0?b:b+d.length;b>=0;b--)if(d[b][a]!==void 0)return d[b];return this.data.hierarchy[c].keys[d.length-1]}; THREE.CubeCamera=function(a,c,b,d){this.heightOffset=b;this.position=new THREE.Vector3(0,b,0);this.cameraPX=new THREE.PerspectiveCamera(90,1,a,c);this.cameraNX=new THREE.PerspectiveCamera(90,1,a,c);this.cameraPY=new THREE.PerspectiveCamera(90,1,a,c);this.cameraNY=new THREE.PerspectiveCamera(90,1,a,c);this.cameraPZ=new THREE.PerspectiveCamera(90,1,a,c);this.cameraNZ=new THREE.PerspectiveCamera(90,1,a,c);this.cameraPX.position=this.position;this.cameraNX.position=this.position;this.cameraPY.position= @@ -100,18 +100,18 @@ THREE.FirstPersonControls=function(a,c){function b(a,b){return function(){b.appl 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(a){this.domElement!==document&&this.domElement.focus();a.preventDefault();a.stopPropagation();if(this.activeLook)switch(a.button){case 0:this.moveForward= !0;break;case 2:this.moveBackward=!0}this.mouseDragOn=!0};this.onMouseUp=function(a){a.preventDefault();a.stopPropagation();if(this.activeLook)switch(a.button){case 0:this.moveForward=!1;break;case 2:this.moveBackward=!1}this.mouseDragOn=!1};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.onKeyDown= function(a){switch(a.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(a){switch(a.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(a){if(!this.freeze){if(this.heightSpeed){var b=THREE.Math.clamp(this.object.position.y,this.heightMin,this.heightMax)-this.heightMin;this.autoSpeedFactor=a*b*this.heightCoef}else this.autoSpeedFactor=0;b=a*this.movementSpeed;(this.moveForward||this.autoForward&&!this.moveBackward)&&this.object.translateZ(-(b+this.autoSpeedFactor));this.moveBackward&&this.object.translateZ(b);this.moveLeft&&this.object.translateX(-b);this.moveRight&&this.object.translateX(b); -this.moveUp&&this.object.translateY(b);this.moveDown&&this.object.translateY(-b);b=a*this.lookSpeed;this.activeLook||(b=0);this.lon+=this.mouseX*b;this.lookVertical&&(this.lat-=this.mouseY*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;var a=this.target,c=this.object.position;a.x=c.x+100*Math.sin(this.phi)*Math.cos(this.theta);a.y=c.y+100*Math.cos(this.phi);a.z=c.z+100*Math.sin(this.phi)*Math.sin(this.theta)}a=1;this.constrainVertical&& -(a=Math.PI/(this.verticalMax-this.verticalMin));this.lon+=this.mouseX*b;this.lookVertical&&(this.lat-=this.mouseY*b*a);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);a=this.target;c=this.object.position;a.x=c.x+100*Math.sin(this.phi)*Math.cos(this.theta);a.y=c.y+100*Math.cos(this.phi);a.z=c.z+100*Math.sin(this.phi)*Math.sin(this.theta); -this.object.lookAt(a)};this.domElement.addEventListener("contextmenu",function(a){a.preventDefault()},!1);this.domElement.addEventListener("mousemove",b(this,this.onMouseMove),!1);this.domElement.addEventListener("mousedown",b(this,this.onMouseDown),!1);this.domElement.addEventListener("mouseup",b(this,this.onMouseUp),!1);this.domElement.addEventListener("keydown",b(this,this.onKeyDown),!1);this.domElement.addEventListener("keyup",b(this,this.onKeyUp),!1)}; -THREE.PathControls=function(a,c){function b(a){if((a*=2)<1)return 0.5*a*a;return-0.5*(--a*(a-2)-1)}function d(a,b){return function(){b.apply(a,arguments)}}function g(a,b,d,c){var e={name:d,fps:0.6,length:c,hierarchy:[]},f,g=b.getControlPointsArray(),h=b.getLength(),s=g.length,q=0;f=s-1;b={parent:-1,keys:[]};b.keys[0]={time:0,pos:g[0],rot:[0,0,0,1],scl:[1,1,1]};b.keys[f]={time:c,pos:g[f],rot:[0,0,0,1],scl:[1,1,1]};for(f=1;f=0?a:a+e;d=this.verticalAngleMap.srcRange; a=this.verticalAngleMap.dstRange;d=THREE.Math.mapLinear(this.phi,d[0],d[1],a[0],a[1]);var c=a[1]-a[0];this.phi=b((d-a[0])/c)*c+a[0];d=this.horizontalAngleMap.srcRange;a=this.horizontalAngleMap.dstRange;d=THREE.Math.mapLinear(this.theta,d[0],d[1],a[0],a[1]);c=a[1]-a[0];this.theta=b((d-a[0])/c)*c+a[0];a=this.target.position;a.x=100*Math.sin(this.phi)*Math.cos(this.theta);a.y=100*Math.cos(this.phi);a.z=100*Math.sin(this.phi)*Math.sin(this.theta);this.object.lookAt(this.target.position)};this.onMouseMove= function(a){this.domElement===document?(this.mouseX=a.pageX-this.viewHalfX,this.mouseY=a.pageY-this.viewHalfY):(this.mouseX=a.pageX-this.domElement.offsetLeft-this.viewHalfX,this.mouseY=a.pageY-this.domElement.offsetTop-this.viewHalfY)};this.init=function(){this.spline=new THREE.Spline;this.spline.initFromArray(this.waypoints);this.useConstantSpeed&&this.spline.reparametrizeByArcLength(this.resamplingCoef);if(this.createDebugDummy){var a=new THREE.MeshLambertMaterial({color:30719}),b=new THREE.MeshLambertMaterial({color:65280}), c=new THREE.CubeGeometry(10,10,20),e=new THREE.CubeGeometry(2,2,10);this.animationParent=new THREE.Mesh(c,a);a=new THREE.Mesh(e,b);a.position.set(0,10,0);this.animation=g(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=g(this.animationParent,this.spline,this.id,this.duration),this.animationParent.add(this.target),this.animationParent.add(this.object);if(this.createDebugPath){var a= -this.debugPath,b=this.spline,e=f(b,10),c=f(b,10),h=new THREE.LineBasicMaterial({color:16711680,linewidth:3}),e=new THREE.Line(e,h),c=new THREE.ParticleSystem(c,new THREE.ParticleBasicMaterial({color:16755200,size:3}));e.scale.set(1,1,1);a.add(e);c.scale.set(1,1,1);a.add(c);for(var e=new THREE.SphereGeometry(1,16,8),h=new THREE.MeshBasicMaterial({color:65280}),n=0;n0||this.autoForward&&!(i<0)?1:i));this.object.translateX(c*k);this.object.translateY(c*j);e&&(this.roll+=this.rollSpeed*a*h);if(this.forward.y>this.constrainVertical[1])this.forward.y=this.constrainVertical[1],this.forward.normalize();else if(this.forward.y0||this.autoForward&&!(i<0)?1:i));this.object.translateX(c*j);this.object.translateY(c*k);e&&(this.roll+=this.rollSpeed*a*h);if(this.forward.y>this.constrainVertical[1])this.forward.y=this.constrainVertical[1],this.forward.normalize();else if(this.forward.y1?d.normalize():d.z=Math.sqrt(1-f*f);e.copy(b.object.position).subSelf(b.target);f=b.object.up.clone().setLength(d.y);f.addSelf(b.object.up.clone().crossSelf(e).setLength(d.x));f.addSelf(e.setLength(d.z));return f};this.rotateCamera=function(){var a=Math.acos(h.dot(i)/h.length()/i.length());if(a){var c=(new THREE.Vector3).cross(h,i).normalize(),d=new THREE.Quaternion;a*=b.rotateSpeed;d.setFromAxisAngle(c,-a);d.multiplyVector3(e); -d.multiplyVector3(b.object.up);d.multiplyVector3(i);b.staticMoving?h=i:(d.setFromAxisAngle(c,a*(b.dynamicDampingFactor-1)),d.multiplyVector3(h))}};this.zoomCamera=function(){var a=1+(j.y-k.y)*b.zoomSpeed;a!==1&&a>0&&(e.multiplyScalar(a),b.staticMoving?k=j:k.y+=(j.y-k.y)*this.dynamicDampingFactor)};this.panCamera=function(){var a=m.clone().subSelf(p);if(a.lengthSq()){a.multiplyScalar(e.length()*b.panSpeed);var c=e.clone().crossSelf(b.object.up).setLength(a.x);c.addSelf(b.object.up.clone().setLength(a.y)); -b.object.position.addSelf(c);b.target.addSelf(c);b.staticMoving?p=m:p.addSelf(a.sub(m,p).multiplyScalar(b.dynamicDampingFactor))}};this.checkDistances=function(){if(!b.noZoom||!b.noPan)b.object.position.lengthSq()>b.maxDistance*b.maxDistance&&b.object.position.setLength(b.maxDistance),e.lengthSq()0&&(e.multiplyScalar(a),b.staticMoving?j=k:j.y+=(k.y-j.y)*this.dynamicDampingFactor)};this.panCamera=function(){var a=n.clone().subSelf(q);if(a.lengthSq()){a.multiplyScalar(e.length()*b.panSpeed);var c=e.clone().crossSelf(b.object.up).setLength(a.x);c.addSelf(b.object.up.clone().setLength(a.y)); +b.object.position.addSelf(c);b.target.addSelf(c);b.staticMoving?q=n:q.addSelf(a.sub(n,q).multiplyScalar(b.dynamicDampingFactor))}};this.checkDistances=function(){if(!b.noZoom||!b.noPan)b.object.position.lengthSq()>b.maxDistance*b.maxDistance&&b.object.position.setLength(b.maxDistance),e.lengthSq()0){this.vertices.push(new THREE.Vertex(new THREE.Vector3(0,e,0)));for(h=0;h0){this.vertices.push(new THREE.Vertex(new THREE.Vector3(0,-e,0)));for(h=0;h0){this.vertices.push(new THREE.Vertex(new THREE.Vector3(0,e,0)));for(h=0;h0){this.vertices.push(new THREE.Vertex(new THREE.Vector3(0,-e,0)));for(h=0;ha&&(a+=Math.PI*2),a=(b+a)/2,new THREE.Vector2(-Math.cos(a),-Math.sin(a));return d.multiplyScalar(g).addSelf(h).subSelf(a).clone()}function g(a){for(v=a.length;--v>=0;){L=v;M=v-1;M<0&&(M=a.length-1);for(var b= -0,c=n+j*2,b=0;b=0;z--){G=z/j;I=i*(1-G);G=k*Math.sin(G*Math.PI/2);v=0;for(D=r.length;va&&(a+=Math.PI*2),a=(b+a)/2,new THREE.Vector2(-Math.cos(a),-Math.sin(a));return d.multiplyScalar(g).addSelf(h).subSelf(a).clone()}function g(a){for(u=a.length;--u>=0;){L=u;M=u-1;M<0&&(M=a.length-1);for(var b= +0,c=l+k*2,b=0;b=0;B--){G=B/k;I=i*(1-G);G=j*Math.sin(G*Math.PI/2);u=0;for(D=r.length;u0||(j=this.vertices.push(new THREE.Vertex(new THREE.Vector3(p,h,m)))-1);k.push(j)}c.push(k)}for(var n,t,l,g=c.length,b=0;b0)for(d=0;d1&&(n= -this.vertices[e].position.clone(),t=this.vertices[i].position.clone(),l=this.vertices[k].position.clone(),n.normalize(),t.normalize(),l.normalize(),this.faces.push(new THREE.Face3(e,i,k,[new THREE.Vector3(n.x,n.y,n.z),new THREE.Vector3(t.x,t.y,t.z),new THREE.Vector3(l.x,l.y,l.z)])),this.faceVertexUvs[0].push([j,p,s]))}this.computeCentroids();this.computeFaceNormals();this.computeVertexNormals();this.boundingSphere={radius:a}};THREE.SphereGeometry.prototype=new THREE.Geometry; +THREE.SphereGeometry=function(a,c,b){THREE.Geometry.call(this);for(var a=a||50,d,g=Math.PI,f=Math.max(3,c||8),e=Math.max(2,b||6),c=[],b=0;b0||(k=this.vertices.push(new THREE.Vertex(new THREE.Vector3(q,h,n)))-1);j.push(k)}c.push(j)}for(var l,s,m,g=c.length,b=0;b0)for(d=0;d1&&(l= +this.vertices[e].position.clone(),s=this.vertices[i].position.clone(),m=this.vertices[j].position.clone(),l.normalize(),s.normalize(),m.normalize(),this.faces.push(new THREE.Face3(e,i,j,[new THREE.Vector3(l.x,l.y,l.z),new THREE.Vector3(s.x,s.y,s.z),new THREE.Vector3(m.x,m.y,m.z)])),this.faceVertexUvs[0].push([k,q,p]))}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(a,c){var b=(new THREE.TextPath(a,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 d=b[b.length-1].getBoundingBox().maxX;c.bendPath=new THREE.QuadraticBezierCurve(new THREE.Vector2(0,0),new THREE.Vector2(d/2,120),new THREE.Vector2(d,0))}THREE.ExtrudeGeometry.call(this,b,c)};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]},loadFace:function(a){var c=a.familyName.toLowerCase();this.faces[c]=this.faces[c]||{};this.faces[c][a.cssFontWeight]=this.faces[c][a.cssFontWeight]||{};this.faces[c][a.cssFontWeight][a.cssFontStyle]=a;return this.faces[c][a.cssFontWeight][a.cssFontStyle]=a},drawText:function(a){for(var c=this.getFace(),b=this.size/c.resolution,d= -0,g=String(a).split(""),f=g.length,e=[],a=0;a0)for(k=0;k2;){if(p--<=0){console.log("Warning, unable to triangulate polygon!");if(d)return h;return f}i=k;g<=i&&(i=0);k=i+1;g<=k&&(k=0);j=k+1;g<=j&&(j=0);var m;a:{m=a;var n=i,t=k,l=j,s=g,q=e,r=void 0,o=void 0,u=void 0, -y=void 0,w=void 0,x=void 0,A=void 0,C=void 0,F=void 0,o=m[q[n]].x,u=m[q[n]].y,y=m[q[t]].x,w=m[q[t]].y,x=m[q[l]].x,A=m[q[l]].y;if(1.0E-10>(y-o)*(A-u)-(w-u)*(x-o))m=!1;else{for(r=0;r=0&&z>=0&&I>=0){m=!1;break a}}m=!0}}if(m){f.push([a[e[i]], -a[e[k]],a[e[j]]]);h.push([e[i],e[k],e[j]]);i=k;for(j=k+1;j0)for(j=0;j2;){if(q--<=0){console.log("Warning, unable to triangulate polygon!");if(d)return h;return f}i=j;g<=i&&(i=0);j=i+1;g<=j&&(j=0);k=j+1;g<=k&&(k=0);var n;a:{n=a;var l=i,s=j,m=k,p=g,o=e,r=void 0,t=void 0,w=void 0, +z=void 0,v=void 0,x=void 0,y=void 0,A=void 0,F=void 0,t=n[o[l]].x,w=n[o[l]].y,z=n[o[s]].x,v=n[o[s]].y,x=n[o[m]].x,y=n[o[m]].y;if(1.0E-10>(z-t)*(y-w)-(v-w)*(x-t))n=!1;else{for(r=0;r=0&&B>=0&&I>=0){n=!1;break a}}n=!0}}if(n){f.push([a[e[i]], +a[e[j]],a[e[k]]]);h.push([e[i],e[j],e[k]]);i=j;for(k=j+1;k0;)this.smooth(a)}; -THREE.SubdivisionModifier.prototype.smooth=function(a){function c(a,b,c,d,h,i){var j=new THREE.Face4(a,b,c,d,null,h.color,h.material);if(e.useOldVertexColors){j.vertexColors=[];for(var k,n,l,o=0;o<4;o++){l=i[o];k=new THREE.Color;k.setRGB(0,0,0);for(var q=0;q>7)-127;d|=(f&127)<<16|e<<8;if(d==0&&h==-127)return 0;return(1-2*(g>>7))*(1+d*Math.pow(2,-23))*Math.pow(2,h)}function g(a,b){var c=j(a,b),d=j(a,b+1),e=j(a,b+2);return(j(a,b+3)<<24)+(e<<16)+(d<<8)+c}function i(a,b){var c=j(a,b);return(j(a,b+1)<<8)+c}function k(a,b){var c=j(a,b);return c>127?c-256:c}function j(a,b){return a.charCodeAt(b)&255}function p(b){var c, -d,e;c=g(a,b);d=g(a,b+w);e=g(a,b+x);b=i(a,b+A);q.faces.push(new THREE.Face3(c,d,e,null,null,b))}function m(b){var c,d,e,f,j,k,l;c=g(a,b);d=g(a,b+w);e=g(a,b+x);f=i(a,b+A);j=g(a,b+C);k=g(a,b+F);l=g(a,b+v);var b=u[k*3],n=u[k*3+1];k=u[k*3+2];var m=u[l*3],o=u[l*3+1];l=u[l*3+2];q.faces.push(new THREE.Face3(c,d,e,[new THREE.Vector3(u[j*3],u[j*3+1],u[j*3+2]),new THREE.Vector3(b,n,k),new THREE.Vector3(m,o,l)],null,f))}function n(b){var c,d,e,f;c=g(a,b);d=g(a,b+D);e=g(a,b+z);f=g(a,b+G);b=i(a,b+I);q.faces.push(new THREE.Face4(c, -d,e,f,null,null,b))}function t(b){var c,d,e,f,j,k,l,n,m;c=g(a,b);d=g(a,b+D);e=g(a,b+z);f=g(a,b+G);j=i(a,b+I);k=g(a,b+E);l=g(a,b+J);n=g(a,b+O);m=g(a,b+B);var b=u[l*3],o=u[l*3+1];l=u[l*3+2];var fa=u[n*3],ga=u[n*3+1];n=u[n*3+2];var ha=u[m*3],p=u[m*3+1];m=u[m*3+2];q.faces.push(new THREE.Face4(c,d,e,f,[new THREE.Vector3(u[k*3],u[k*3+1],u[k*3+2]),new THREE.Vector3(b,o,l),new THREE.Vector3(fa,ga,n),new THREE.Vector3(ha,p,m)],null,j))}function l(b){var c,d,e,f;c=g(a,b);d=g(a,b+K);e=g(a,b+H);b=y[c*2];f=y[c* -2+1];c=y[d*2];var i=q.faceVertexUvs[0];d=y[d*2+1];var j=y[e*2];e=y[e*2+1];var k=[];k.push(new THREE.UV(b,f));k.push(new THREE.UV(c,d));k.push(new THREE.UV(j,e));i.push(k)}function s(b){var c,d,e,f,i,j;c=g(a,b);d=g(a,b+N);e=g(a,b+L);f=g(a,b+M);b=y[c*2];i=y[c*2+1];c=y[d*2];j=y[d*2+1];d=y[e*2];var k=q.faceVertexUvs[0];e=y[e*2+1];var l=y[f*2];f=y[f*2+1];var n=[];n.push(new THREE.UV(b,i));n.push(new THREE.UV(c,j));n.push(new THREE.UV(d,e));n.push(new THREE.UV(l,f));k.push(n)}var q=this,r=0,o,u=[],y=[], -w,x,A,C,F,v,D,z,G,I,E,J,O,B,K,H,N,L,M,R,P,T,S,U,Q;THREE.Geometry.call(this);THREE.Loader.prototype.initMaterials(q,d,b);o={signature:a.substr(r,8),header_bytes:j(a,r+8),vertex_coordinate_bytes:j(a,r+9),normal_coordinate_bytes:j(a,r+10),uv_coordinate_bytes:j(a,r+11),vertex_index_bytes:j(a,r+12),normal_index_bytes:j(a,r+13),uv_index_bytes:j(a,r+14),material_index_bytes:j(a,r+15),nvertices:g(a,r+16),nnormals:g(a,r+16+4),nuvs:g(a,r+16+8),ntri_flat:g(a,r+16+12),ntri_smooth:g(a,r+16+16),ntri_flat_uv:g(a, -r+16+20),ntri_smooth_uv:g(a,r+16+24),nquad_flat:g(a,r+16+28),nquad_smooth:g(a,r+16+32),nquad_flat_uv:g(a,r+16+36),nquad_smooth_uv:g(a,r+16+40)};r+=o.header_bytes;w=o.vertex_index_bytes;x=o.vertex_index_bytes*2;A=o.vertex_index_bytes*3;C=o.vertex_index_bytes*3+o.material_index_bytes;F=o.vertex_index_bytes*3+o.material_index_bytes+o.normal_index_bytes;v=o.vertex_index_bytes*3+o.material_index_bytes+o.normal_index_bytes*2;D=o.vertex_index_bytes;z=o.vertex_index_bytes*2;G=o.vertex_index_bytes*3;I=o.vertex_index_bytes* -4;E=o.vertex_index_bytes*4+o.material_index_bytes;J=o.vertex_index_bytes*4+o.material_index_bytes+o.normal_index_bytes;O=o.vertex_index_bytes*4+o.material_index_bytes+o.normal_index_bytes*2;B=o.vertex_index_bytes*4+o.material_index_bytes+o.normal_index_bytes*3;K=o.uv_index_bytes;H=o.uv_index_bytes*2;N=o.uv_index_bytes;L=o.uv_index_bytes*2;M=o.uv_index_bytes*3;b=o.vertex_index_bytes*3+o.material_index_bytes;Q=o.vertex_index_bytes*4+o.material_index_bytes;R=o.ntri_flat*b;P=o.ntri_smooth*(b+o.normal_index_bytes* -3);T=o.ntri_flat_uv*(b+o.uv_index_bytes*3);S=o.ntri_smooth_uv*(b+o.normal_index_bytes*3+o.uv_index_bytes*3);U=o.nquad_flat*Q;b=o.nquad_smooth*(Q+o.normal_index_bytes*4);Q=o.nquad_flat_uv*(Q+o.uv_index_bytes*4);r+=function(b){for(var d,f,g,h=o.vertex_coordinate_bytes*3,i=b+o.nvertices*h;b=0){p=i.invBindMatrices[n];j.invBindMatrix=p;j.skinningMatrix=new THREE.Matrix4;j.skinningMatrix.multiply(j.world,p);j.weights=[];for(p=0;p1){j=new THREE.MeshFaceMaterial;for(h=0;h1?b.add(j):b=j}}b.name=a.id||"";a.matrix.decompose(b.position,b.rotation,b.scale);for(e=0;e1?c[1].substr(0,b):"0";c[1].length=0,g=e.indexOf("(")>=0,h;if(f)d=e.split("."),e=d.shift(),d.shift();else if(g){h=e.split("(");e=h.shift();for(d=0;d=0){p=i.invBindMatrices[m];j.invBindMatrix=p;j.skinningMatrix=new THREE.Matrix4;j.skinningMatrix.multiply(j.world,p);j.weights=[];for(p=0;p1){j=new THREE.MeshFaceMaterial;for(h=0;h1?b.add(j):b=j}}b.name=a.id||"";a.matrix.decompose(b.position,b.rotation,b.scale);for(e=0;e1?c[1].substr(0,b):"0";c[1].length=0,g=e.indexOf("(")>=0,h;if(f)d=e.split("."),e=d.shift(),d.shift();else if(g){h=e.split("(");e=h.shift();for(d=0;db){k=j.output[i];break}g=k!==void 0?k instanceof THREE.Matrix4?g.multiply(g,k):g.multiply(g,h.matrix):g.multiply(g,h.matrix)}else g=g.multiply(g,h.matrix);b=g;c.push({time:a,pos:[b.n14,b.n24,b.n34],rotq:[0,0,0,1],scl:[1,1,1]})}this.keys=c}this.updateMatrix();return this};p.prototype.updateMatrix=function(){this.matrix.identity();for(var a=0;a0&&(this[c.nodeName]=parseFloat(d[0].textContent))}}this.create();return this};F.prototype.create=function(){var a={},b=this.transparency!==void 0&&this.transparency<1,c;for(c in this)switch(c){case "ambient":case "emission":case "diffuse":case "specular":var d=this[c];if(d instanceof C)if(d.isTexture()){if(this.effect.sampler&&this.effect.surface&&this.effect.sampler.source==this.effect.surface.sid&&(d=$[this.effect.surface.init_from]))a.map= -THREE.ImageUtils.loadTexture(da+d.init_from),a.map.wrapS=THREE.RepeatWrapping,a.map.wrapT=THREE.RepeatWrapping,a.map.repeat.x=1,a.map.repeat.y=-1}else c=="diffuse"?a.color=d.color.getHex():b||(a[c]=d.color.getHex());break;case "shininess":case "reflectivity":a[c]=this[c];break;case "transparency":if(b)a.transparent=!0,a.opacity=this[c],b=!0}a.shading=ea;return this.material=new THREE.MeshLambertMaterial(a)};v.prototype.parse=function(a){for(var b=0;bb){k=j.output[i];break}g=k!==void 0?k instanceof THREE.Matrix4?g.multiply(g,k):g.multiply(g,h.matrix):g.multiply(g,h.matrix)}else g=g.multiply(g,h.matrix);b=g;c.push({time:a,pos:[b.n14,b.n24,b.n34],rotq:[0,0,0,1],scl:[1,1,1]})}this.keys=c}this.updateMatrix();return this};q.prototype.updateMatrix=function(){this.matrix.identity();for(var a=0;a0&&(this[c.nodeName]=parseFloat(d[0].textContent))}}this.create();return this};F.prototype.create=function(){var a={},b=this.transparency!==void 0&&this.transparency<1,c;for(c in this)switch(c){case "ambient":case "emission":case "diffuse":case "specular":var d=this[c];if(d instanceof A)if(d.isTexture()){if(this.effect.sampler&&this.effect.surface&&this.effect.sampler.source==this.effect.surface.sid&&(d=Z[this.effect.surface.init_from]))a.map= +THREE.ImageUtils.loadTexture(da+d.init_from),a.map.wrapS=THREE.RepeatWrapping,a.map.wrapT=THREE.RepeatWrapping,a.map.repeat.x=1,a.map.repeat.y=-1}else c=="diffuse"?a.color=d.color.getHex():b||(a[c]=d.color.getHex());break;case "shininess":case "reflectivity":a[c]=this[c];break;case "transparency":if(b)a.transparent=!0,a.opacity=this[c],b=!0}a.shading=ea;return this.material=new THREE.MeshLambertMaterial(a)};u.prototype.parse=function(a){for(var b=0;b=0,d=a.indexOf("(")>=0,e,f;if(c)b=a.split("."),a=b.shift(),f=b.shift();else if(d){e=a.split("(");a=e.shift();for(b=0;b=0,d=a.indexOf("(")>=0,e,f;if(c)b=a.split("."),a=b.shift(),f=b.shift();else if(d){e=a.split("(");a=e.shift();for(b=0;b1&&(D=new THREE.MeshFaceMaterial); -a=new THREE.Mesh(C,D);a.name=m;a.position.set(u[0],u[1],u[2]);w?(a.quaternion.set(w[0],w[1],w[2],w[3]),a.useQuaternion=!0):a.rotation.set(y[0],y[1],y[2]);a.scale.set(x[0],x[1],x[2]);a.visible=q.visible;B.scene.add(a);B.objects[m]=a;if(q.meshCollider){var b=THREE.CollisionUtils.MeshColliderWBox(a);B.scene.collisions.colliders.push(b)}if(q.castsShadow)b=new THREE.ShadowVolume(C),B.scene.add(b),b.position=a.position,b.rotation=a.rotation,b.scale=a.scale;q.trigger&&q.trigger.toLowerCase()!="none"&&(b= -{type:q.trigger,object:q},B.triggers[a.name]=b)}}else u=q.position,y=q.rotation,w=q.quaternion,x=q.scale,w=0,a=new THREE.Object3D,a.name=m,a.position.set(u[0],u[1],u[2]),w?(a.quaternion.set(w[0],w[1],w[2],w[3]),a.useQuaternion=!0):a.rotation.set(y[0],y[1],y[2]),a.scale.set(x[0],x[1],x[2]),a.visible=q.visible!==void 0?q.visible:!1,B.scene.add(a),B.objects[m]=a,B.empties[m]=a,q.trigger&&q.trigger.toLowerCase()!="none"&&(b={type:q.trigger,object:q},B.triggers[a.name]=b)}function f(a){return function(b){B.geometries[a]= -b;g();I-=1;i.onLoadComplete();h()}}function e(a){return function(b){B.geometries[a]=b}}function h(){i.callbackProgress({totalModels:J,totalTextures:O,loadedModels:J-I,loadedTextures:O-E},B);i.onLoadProgress();I==0&&E==0&&c(B)}var i=this,k=THREE.Loader.prototype.extractUrlbase(b),j,p,m,n,t,l,s,q,r,o,u,y,w,x,A,C,F,v,D,z,G,I,E,J,O,B;z=a;b=new THREE.BinaryLoader;G=new THREE.JSONLoader;E=I=0;B={scene:new THREE.Scene,geometries:{},materials:{},textures:{},objects:{},cameras:{},lights:{},fogs:{},triggers:{}, -empties:{}};a=!1;for(m in z.objects)if(q=z.objects[m],q.meshCollider){a=!0;break}if(a)B.scene.collisions=new THREE.CollisionSystem;if(z.transform){a=z.transform.position;r=z.transform.rotation;var K=z.transform.scale;a&&B.scene.position.set(a[0],a[1],a[2]);r&&B.scene.rotation.set(r[0],r[1],r[2]);K&&B.scene.scale.set(K[0],K[1],K[2]);(a||r||K)&&B.scene.updateMatrix()}a=function(){E-=1;h();i.onLoadComplete()};for(t in z.cameras)r=z.cameras[t],r.type=="perspective"?F=new THREE.PerspectiveCamera(r.fov, -r.aspect,r.near,r.far):r.type=="ortho"&&(F=new THREE.OrthographicCamera(r.left,r.right,r.top,r.bottom,r.near,r.far)),u=r.position,r=r.target,F.position.set(u[0],u[1],u[2]),F.target=new THREE.Vector3(r[0],r[1],r[2]),B.cameras[t]=F;for(n in z.lights)r=z.lights[n],t=r.color!==void 0?r.color:16777215,F=r.intensity!==void 0?r.intensity:1,r.type=="directional"?(u=r.direction,o=new THREE.DirectionalLight(t,F),o.position.set(u[0],u[1],u[2]),o.position.normalize()):r.type=="point"?(u=r.position,o=r.distance, -o=new THREE.PointLight(t,F,o),o.position.set(u[0],u[1],u[2])):r.type=="ambient"&&(o=new THREE.AmbientLight(t)),B.scene.add(o),B.lights[n]=o;for(l in z.fogs)n=z.fogs[l],n.type=="linear"?v=new THREE.Fog(0,n.near,n.far):n.type=="exp2"&&(v=new THREE.FogExp2(0,n.density)),r=n.color,v.color.setRGB(r[0],r[1],r[2]),B.fogs[l]=v;if(B.cameras&&z.defaults.camera)B.currentCamera=B.cameras[z.defaults.camera];if(B.fogs&&z.defaults.fog)B.scene.fog=B.fogs[z.defaults.fog];r=z.defaults.bgcolor;B.bgColor=new THREE.Color; -B.bgColor.setRGB(r[0],r[1],r[2]);B.bgColorAlpha=z.defaults.bgalpha;for(j in z.geometries)if(l=z.geometries[j],l.type=="bin_mesh"||l.type=="ascii_mesh")I+=1,i.onLoadStart();J=I;for(j in z.geometries)l=z.geometries[j],l.type=="cube"?(C=new THREE.CubeGeometry(l.width,l.height,l.depth,l.segmentsWidth,l.segmentsHeight,l.segmentsDepth,null,l.flipped,l.sides),B.geometries[j]=C):l.type=="plane"?(C=new THREE.PlaneGeometry(l.width,l.height,l.segmentsWidth,l.segmentsHeight),B.geometries[j]=C):l.type=="sphere"? -(C=new THREE.SphereGeometry(l.radius,l.segmentsWidth,l.segmentsHeight),B.geometries[j]=C):l.type=="cylinder"?(C=new THREE.CylinderGeometry(l.topRad,l.botRad,l.height,l.radSegs,l.heightSegs),B.geometries[j]=C):l.type=="torus"?(C=new THREE.TorusGeometry(l.radius,l.tube,l.segmentsR,l.segmentsT),B.geometries[j]=C):l.type=="icosahedron"?(C=new THREE.IcosahedronGeometry(l.subdivisions),B.geometries[j]=C):l.type=="bin_mesh"?b.load(d(l.url,z.urlBaseType),f(j)):l.type=="ascii_mesh"?G.load(d(l.url,z.urlBaseType), -f(j)):l.type=="embedded_mesh"&&(l=z.embeds[l.id])&&G.createModel(l,e(j),"");for(s in z.textures)if(j=z.textures[s],j.url instanceof Array){E+=j.url.length;for(l=0;l1&&(D=new THREE.MeshFaceMaterial); +a=new THREE.Mesh(A,D);a.name=n;a.position.set(w[0],w[1],w[2]);v?(a.quaternion.set(v[0],v[1],v[2],v[3]),a.useQuaternion=!0):a.rotation.set(z[0],z[1],z[2]);a.scale.set(x[0],x[1],x[2]);a.visible=o.visible;C.scene.add(a);C.objects[n]=a;if(o.meshCollider){var b=THREE.CollisionUtils.MeshColliderWBox(a);C.scene.collisions.colliders.push(b)}if(o.castsShadow)b=new THREE.ShadowVolume(A),C.scene.add(b),b.position=a.position,b.rotation=a.rotation,b.scale=a.scale;o.trigger&&o.trigger.toLowerCase()!="none"&&(b= +{type:o.trigger,object:o},C.triggers[a.name]=b)}}else w=o.position,z=o.rotation,v=o.quaternion,x=o.scale,v=0,a=new THREE.Object3D,a.name=n,a.position.set(w[0],w[1],w[2]),v?(a.quaternion.set(v[0],v[1],v[2],v[3]),a.useQuaternion=!0):a.rotation.set(z[0],z[1],z[2]),a.scale.set(x[0],x[1],x[2]),a.visible=o.visible!==void 0?o.visible:!1,C.scene.add(a),C.objects[n]=a,C.empties[n]=a,o.trigger&&o.trigger.toLowerCase()!="none"&&(b={type:o.trigger,object:o},C.triggers[a.name]=b)}function f(a){return function(b){C.geometries[a]= +b;g();I-=1;i.onLoadComplete();h()}}function e(a){return function(b){C.geometries[a]=b}}function h(){i.callbackProgress({totalModels:J,totalTextures:O,loadedModels:J-I,loadedTextures:O-E},C);i.onLoadProgress();I==0&&E==0&&c(C)}var i=this,j=THREE.Loader.prototype.extractUrlbase(b),k,q,n,l,s,m,p,o,r,t,w,z,v,x,y,A,F,u,D,B,G,I,E,J,O,C;B=a;b=new THREE.BinaryLoader;G=new THREE.JSONLoader;E=I=0;C={scene:new THREE.Scene,geometries:{},materials:{},textures:{},objects:{},cameras:{},lights:{},fogs:{},triggers:{}, +empties:{}};a=!1;for(n in B.objects)if(o=B.objects[n],o.meshCollider){a=!0;break}if(a)C.scene.collisions=new THREE.CollisionSystem;if(B.transform){a=B.transform.position;r=B.transform.rotation;var K=B.transform.scale;a&&C.scene.position.set(a[0],a[1],a[2]);r&&C.scene.rotation.set(r[0],r[1],r[2]);K&&C.scene.scale.set(K[0],K[1],K[2]);(a||r||K)&&C.scene.updateMatrix()}a=function(){E-=1;h();i.onLoadComplete()};for(s in B.cameras)r=B.cameras[s],r.type=="perspective"?F=new THREE.PerspectiveCamera(r.fov, +r.aspect,r.near,r.far):r.type=="ortho"&&(F=new THREE.OrthographicCamera(r.left,r.right,r.top,r.bottom,r.near,r.far)),w=r.position,r=r.target,F.position.set(w[0],w[1],w[2]),F.target=new THREE.Vector3(r[0],r[1],r[2]),C.cameras[s]=F;for(l in B.lights)r=B.lights[l],s=r.color!==void 0?r.color:16777215,F=r.intensity!==void 0?r.intensity:1,r.type=="directional"?(w=r.direction,t=new THREE.DirectionalLight(s,F),t.position.set(w[0],w[1],w[2]),t.position.normalize()):r.type=="point"?(w=r.position,t=r.distance, +t=new THREE.PointLight(s,F,t),t.position.set(w[0],w[1],w[2])):r.type=="ambient"&&(t=new THREE.AmbientLight(s)),C.scene.add(t),C.lights[l]=t;for(m in B.fogs)l=B.fogs[m],l.type=="linear"?u=new THREE.Fog(0,l.near,l.far):l.type=="exp2"&&(u=new THREE.FogExp2(0,l.density)),r=l.color,u.color.setRGB(r[0],r[1],r[2]),C.fogs[m]=u;if(C.cameras&&B.defaults.camera)C.currentCamera=C.cameras[B.defaults.camera];if(C.fogs&&B.defaults.fog)C.scene.fog=C.fogs[B.defaults.fog];r=B.defaults.bgcolor;C.bgColor=new THREE.Color; +C.bgColor.setRGB(r[0],r[1],r[2]);C.bgColorAlpha=B.defaults.bgalpha;for(k in B.geometries)if(m=B.geometries[k],m.type=="bin_mesh"||m.type=="ascii_mesh")I+=1,i.onLoadStart();J=I;for(k in B.geometries)m=B.geometries[k],m.type=="cube"?(A=new THREE.CubeGeometry(m.width,m.height,m.depth,m.segmentsWidth,m.segmentsHeight,m.segmentsDepth,null,m.flipped,m.sides),C.geometries[k]=A):m.type=="plane"?(A=new THREE.PlaneGeometry(m.width,m.height,m.segmentsWidth,m.segmentsHeight),C.geometries[k]=A):m.type=="sphere"? +(A=new THREE.SphereGeometry(m.radius,m.segmentsWidth,m.segmentsHeight),C.geometries[k]=A):m.type=="cylinder"?(A=new THREE.CylinderGeometry(m.topRad,m.botRad,m.height,m.radSegs,m.heightSegs),C.geometries[k]=A):m.type=="torus"?(A=new THREE.TorusGeometry(m.radius,m.tube,m.segmentsR,m.segmentsT),C.geometries[k]=A):m.type=="icosahedron"?(A=new THREE.IcosahedronGeometry(m.subdivisions),C.geometries[k]=A):m.type=="bin_mesh"?b.load(d(m.url,B.urlBaseType),f(k)):m.type=="ascii_mesh"?G.load(d(m.url,B.urlBaseType), +f(k)):m.type=="embedded_mesh"&&(m=B.embeds[m.id])&&G.createModel(m,e(k),"");for(p in B.textures)if(k=B.textures[p],k.url instanceof Array){E+=k.url.length;for(m=0;m=57344&&(c-=2048);c++;for(var b=new Float32Array(8*c),d=1,g=0;g<8;g++){for(var f=0,e=0;e>1^-(h&1);b[8*e+g]=f}d+=c}c=a.length-d;f=new Uint16Array(c);for(g=e=0;g=this.maxCount-3&&h(this)};this.begin= -function(){this.count=0;this.hasNormal=this.hasPos=!1};this.end=function(a){if(this.count!==0){for(var c=this.count*3;cthis.size-1&&(i=this.size-1);var m=Math.floor(k-h);m<1&&(m=1);k=Math.floor(k+h);k>this.size-1&&(k=this.size-1);var n=Math.floor(j-h);n<1&&(n=1);h=Math.floor(j+h); -h>this.size-1&&(h=this.size-1);for(var t,l,s,q,r,o;p0&&(this.field[s+t]+=q)}}};this.addPlaneX=function(a,c){var g,f,e,h,i,k=this.size,j=this.yd,p=this.zd,m=this.field,n=k*Math.sqrt(a/c);n>k&&(n=k);for(g=0;g0)for(f=0;fj&&(t=j);for(f=0;f0){i=f*p;for(g=0;gj&&(t=j);for(e=0;e0){i=m*e;for(f=0;fthis.size-1&&(i=this.size-1);var n=Math.floor(j-h);n<1&&(n=1);j=Math.floor(j+h);j>this.size-1&&(j=this.size-1);var l=Math.floor(k-h);l<1&&(l=1);h=Math.floor(k+h); +h>this.size-1&&(h=this.size-1);for(var s,m,p,o,r,t;q0&&(this.field[p+s]+=o)}}};this.addPlaneX=function(a,c){var g,f,e,h,i,j=this.size,k=this.yd,q=this.zd,n=this.field,l=j*Math.sqrt(a/c);l>j&&(l=j);for(g=0;g0)for(f=0;fk&&(s=k);for(f=0;f0){i=f*q;for(g=0;gk&&(s=k);for(e=0;e0){i=n*e;for(f=0;ff?this.hits.push(g):this.hits.unshift(g),f=d;return this.hits}; THREE.CollisionSystem.prototype.rayCastNearest=function(a){var c=this.rayCastAll(a);if(c.length==0)return null;for(var b=0;c[b]instanceof THREE.MeshCollider;){var d=this.rayMesh(a,c[b]);if(d.distc.length)return null;return c[b]}; THREE.CollisionSystem.prototype.rayCast=function(a,c){if(c instanceof THREE.PlaneCollider)return this.rayPlane(a,c);else if(c instanceof THREE.SphereCollider)return this.raySphere(a,c);else if(c instanceof THREE.BoxCollider)return this.rayBox(a,c);else if(c instanceof THREE.MeshCollider&&c.box)return this.rayBox(a,c.box)}; -THREE.CollisionSystem.prototype.rayMesh=function(a,c){for(var b=this.makeRayLocal(a,c.mesh),d=Number.MAX_VALUE,g,f=0;f=h*g))return Number.MAX_VALUE;e/=h;h=THREE.CollisionSystem.__v3;h.copy(a.direction);h.multiplyScalar(e);h.addSelf(a.origin);Math.abs(f.x)> Math.abs(f.y)?Math.abs(f.x)>Math.abs(f.z)?(a=h.y-c.y,f=b.y-c.y,g=d.y-c.y,h=h.z-c.z,b=b.z-c.z,d=d.z-c.z):(a=h.x-c.x,f=b.x-c.x,g=d.x-c.x,h=h.y-c.y,b=b.y-c.y,d=d.y-c.y):Math.abs(f.y)>Math.abs(f.z)?(a=h.x-c.x,f=b.x-c.x,g=d.x-c.x,h=h.z-c.z,b=b.z-c.z,d=d.z-c.z):(a=h.x-c.x,f=b.x-c.x,g=d.x-c.x,h=h.y-c.y,b=b.y-c.y,d=d.y-c.y);c=f*d-b*g;if(c==0)return Number.MAX_VALUE;c=1/c;d=(a*d-h*g)*c;if(!(d>=0))return Number.MAX_VALUE;c*=f*h-b*a;if(!(c>=0))return Number.MAX_VALUE;if(!(1-d-c>=0))return Number.MAX_VALUE;return e}; THREE.CollisionSystem.prototype.makeRayLocal=function(a,c){var b=THREE.CollisionSystem.__m;b.getInverse(c.matrixWorld);var d=THREE.CollisionSystem.__r;d.origin.copy(a.origin);d.direction.copy(a.direction);b.multiplyVector3(d.origin);b.rotateAxis(d.direction);d.direction.normalize();return d}; -THREE.CollisionSystem.prototype.rayBox=function(a,c){var b;c.dynamic&&c.mesh&&c.mesh.matrixWorld?b=this.makeRayLocal(a,c.mesh):(b=THREE.CollisionSystem.__r,b.origin.copy(a.origin),b.direction.copy(a.direction));var d=0,g=0,f=0,e=0,h=0,i=0,k=!0;b.origin.xc.max.x&&(d=c.max.x-b.origin.x,d/=b.direction.x,k=!1,e=1);b.origin.yc.max.y&&(g=c.max.y-b.origin.y,g/=b.direction.y, -k=!1,h=1);b.origin.zc.max.z&&(f=c.max.z-b.origin.z,f/=b.direction.z,k=!1,i=1);if(k)return-1;k=0;g>d&&(k=1,d=g);f>d&&(k=2,d=f);switch(k){case 0:h=b.origin.y+b.direction.y*d;if(hc.max.y)return Number.MAX_VALUE;b=b.origin.z+b.direction.z*d;if(bc.max.z)return Number.MAX_VALUE;c.normal.set(e,0,0);break;case 1:e=b.origin.x+b.direction.x*d;if(ec.max.x)return Number.MAX_VALUE;b=b.origin.z+b.direction.z* +THREE.CollisionSystem.prototype.rayBox=function(a,c){var b;c.dynamic&&c.mesh&&c.mesh.matrixWorld?b=this.makeRayLocal(a,c.mesh):(b=THREE.CollisionSystem.__r,b.origin.copy(a.origin),b.direction.copy(a.direction));var d=0,g=0,f=0,e=0,h=0,i=0,j=!0;b.origin.xc.max.x&&(d=c.max.x-b.origin.x,d/=b.direction.x,j=!1,e=1);b.origin.yc.max.y&&(g=c.max.y-b.origin.y,g/=b.direction.y, +j=!1,h=1);b.origin.zc.max.z&&(f=c.max.z-b.origin.z,f/=b.direction.z,j=!1,i=1);if(j)return-1;j=0;g>d&&(j=1,d=g);f>d&&(j=2,d=f);switch(j){case 0:h=b.origin.y+b.direction.y*d;if(hc.max.y)return Number.MAX_VALUE;b=b.origin.z+b.direction.z*d;if(bc.max.z)return Number.MAX_VALUE;c.normal.set(e,0,0);break;case 1:e=b.origin.x+b.direction.x*d;if(ec.max.x)return Number.MAX_VALUE;b=b.origin.z+b.direction.z* d;if(bc.max.z)return Number.MAX_VALUE;c.normal.set(0,h,0);break;case 2:e=b.origin.x+b.direction.x*d;if(ec.max.x)return Number.MAX_VALUE;h=b.origin.y+b.direction.y*d;if(hc.max.y)return Number.MAX_VALUE;c.normal.set(0,0,i)}return d};THREE.CollisionSystem.prototype.rayPlane=function(a,c){var b=a.direction.dot(c.normal),d=c.point.dot(c.normal);if(b<0)b=(d-a.origin.dot(c.normal))/b;else return Number.MAX_VALUE;return b>0?b:Number.MAX_VALUE}; THREE.CollisionSystem.prototype.raySphere=function(a,c){var b=c.center.clone().subSelf(a.origin);if(b.lengthSq=0)return Math.abs(d)-Math.sqrt(b);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 c=a.geometry.boundingBox,b=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]),b=new THREE.BoxCollider(b,c);b.mesh=a;return b};THREE.CollisionUtils.MeshAABB=function(a){var c=THREE.CollisionUtils.MeshOBB(a);c.min.addSelf(a.position);c.max.addSelf(a.position);c.dynamic=!1;return c}; 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);this.autoUpdateScene=!1;var c=this,b=this.setSize,d=this.render,g=new THREE.PerspectiveCamera,f=new THREE.PerspectiveCamera,e=new THREE.Matrix4,h=new THREE.Matrix4,i,k,j,p;g.matrixAutoUpdate=f.matrixAutoUpdate=!1;var a={minFilter:THREE.LinearFilter,magFilter:THREE.NearestFilter,format:THREE.RGBAFormat},m=new THREE.WebGLRenderTarget(512,512,a),n=new THREE.WebGLRenderTarget(512,512,a),t=new THREE.PerspectiveCamera(53, -1,1,1E4);t.position.z=2;var a=new THREE.ShaderMaterial({uniforms:{mapLeft:{type:"t",value:0,texture:m},mapRight:{type:"t",value:1,texture:n}},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}"}), -l=new THREE.Scene;l.add(new THREE.Mesh(new THREE.PlaneGeometry(2,2),a));l.add(t);this.setSize=function(a,d){b.call(c,a,d);m.width=a;m.height=d;n.width=a;n.height=d};this.render=function(a,b){a.updateMatrixWorld();if(i!==b.aspect||k!==b.near||j!==b.far||p!==b.fov){i=b.aspect;k=b.near;j=b.far;p=b.fov;var r=b.projectionMatrix.clone(),o=125/30*0.5,u=o*k/125,y=k*Math.tan(p*Math.PI/360),w;e.n14=o;h.n14=-o;o=-y*i+u;w=y*i+u;r.n11=2*k/(w-o);r.n13=(w+o)/(w-o);g.projectionMatrix.copy(r);o=-y*i-u;w=y*i-u;r.n11= -2*k/(w-o);r.n13=(w+o)/(w-o);f.projectionMatrix.copy(r)}g.matrixWorld.copy(b.matrixWorld).multiplySelf(h);g.position.copy(b.position);g.near=b.near;g.far=b.far;d.call(c,a,g,m,!0);f.matrixWorld.copy(b.matrixWorld).multiplySelf(e);f.position.copy(b.position);f.near=b.near;f.far=b.far;d.call(c,a,f,n,!0);l.updateMatrixWorld();d.call(c,l,t)}}; +if(THREE.WebGLRenderer)THREE.AnaglyphWebGLRenderer=function(a){THREE.WebGLRenderer.call(this,a);this.autoUpdateScene=!1;var c=this,b=this.setSize,d=this.render,g=new THREE.PerspectiveCamera,f=new THREE.PerspectiveCamera,e=new THREE.Matrix4,h=new THREE.Matrix4,i,j,k,q;g.matrixAutoUpdate=f.matrixAutoUpdate=!1;var a={minFilter:THREE.LinearFilter,magFilter:THREE.NearestFilter,format:THREE.RGBAFormat},n=new THREE.WebGLRenderTarget(512,512,a),l=new THREE.WebGLRenderTarget(512,512,a),s=new THREE.PerspectiveCamera(53, +1,1,1E4);s.position.z=2;var a=new THREE.ShaderMaterial({uniforms:{mapLeft:{type:"t",value:0,texture:n},mapRight:{type:"t",value:1,texture:l}},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}"}), +m=new THREE.Scene;m.add(new THREE.Mesh(new THREE.PlaneGeometry(2,2),a));m.add(s);this.setSize=function(a,d){b.call(c,a,d);n.width=a;n.height=d;l.width=a;l.height=d};this.render=function(a,b){a.updateMatrixWorld();if(i!==b.aspect||j!==b.near||k!==b.far||q!==b.fov){i=b.aspect;j=b.near;k=b.far;q=b.fov;var r=b.projectionMatrix.clone(),t=125/30*0.5,w=t*j/125,z=j*Math.tan(q*Math.PI/360),v;e.n14=t;h.n14=-t;t=-z*i+w;v=z*i+w;r.n11=2*j/(v-t);r.n13=(v+t)/(v-t);g.projectionMatrix.copy(r);t=-z*i-w;v=z*i-w;r.n11= +2*j/(v-t);r.n13=(v+t)/(v-t);f.projectionMatrix.copy(r)}g.matrixWorld.copy(b.matrixWorld).multiplySelf(h);g.position.copy(b.position);g.near=b.near;g.far=b.far;d.call(c,a,g,n,!0);f.matrixWorld.copy(b.matrixWorld).multiplySelf(e);f.position.copy(b.position);f.near=b.near;f.far=b.far;d.call(c,a,f,l,!0);m.updateMatrixWorld();d.call(c,m,s)}}; if(THREE.WebGLRenderer)THREE.CrosseyedWebGLRenderer=function(a){THREE.WebGLRenderer.call(this,a);this.autoClear=!1;var c=this,b=this.setSize,d=this.render,g,f,e=new THREE.PerspectiveCamera;e.target=new THREE.Vector3(0,0,0);var h=new THREE.PerspectiveCamera;h.target=new THREE.Vector3(0,0,0);c.separation=10;if(a&&a.separation!==void 0)c.separation=a.separation;this.setSize=function(a,d){b.call(c,a,d);g=a/2;f=d};this.render=function(a,b){this.clear();e.fov=b.fov;e.aspect=0.5*b.aspect;e.near=b.near;e.far= b.far;e.updateProjectionMatrix();e.position.copy(b.position);e.target.copy(b.target);e.translateX(c.separation);e.lookAt(e.target);h.projectionMatrix=e.projectionMatrix;h.position.copy(b.position);h.target.copy(b.target);h.translateX(-c.separation);h.lookAt(h.target);this.setViewport(0,0,g,f);d.call(c,a,e);this.setViewport(g,0,g,f);d.call(c,a,h,!1)}}; diff --git a/examples/obj/camaro/CamaroNoUv_bin.bin b/examples/obj/camaro/CamaroNoUv_bin.bin index 35e36249..9ad482e9 100644 Binary files a/examples/obj/camaro/CamaroNoUv_bin.bin and b/examples/obj/camaro/CamaroNoUv_bin.bin differ diff --git a/examples/obj/f50/F50NoUv_bin.bin b/examples/obj/f50/F50NoUv_bin.bin index 70accdd4..3f6f01f0 100644 Binary files a/examples/obj/f50/F50NoUv_bin.bin and b/examples/obj/f50/F50NoUv_bin.bin differ diff --git a/examples/obj/female02/Female02_bin.bin b/examples/obj/female02/Female02_bin.bin index 03ceef6f..99f58a7b 100644 Binary files a/examples/obj/female02/Female02_bin.bin and b/examples/obj/female02/Female02_bin.bin differ diff --git a/examples/obj/gallardo/GallardoNoUv_bin.bin b/examples/obj/gallardo/GallardoNoUv_bin.bin index 7b25318d..076f8358 100644 Binary files a/examples/obj/gallardo/GallardoNoUv_bin.bin and b/examples/obj/gallardo/GallardoNoUv_bin.bin differ diff --git a/examples/obj/gallardo/parts/gallardo_body_bin.bin b/examples/obj/gallardo/parts/gallardo_body_bin.bin index 0fe276e7..3b2f9601 100644 Binary files a/examples/obj/gallardo/parts/gallardo_body_bin.bin and b/examples/obj/gallardo/parts/gallardo_body_bin.bin differ diff --git a/examples/obj/gallardo/parts/gallardo_wheel_bin.bin b/examples/obj/gallardo/parts/gallardo_wheel_bin.bin index 40e60576..a970579a 100644 Binary files a/examples/obj/gallardo/parts/gallardo_wheel_bin.bin and b/examples/obj/gallardo/parts/gallardo_wheel_bin.bin differ diff --git a/examples/obj/lucy/Lucy100k_bin.bin b/examples/obj/lucy/Lucy100k_bin.bin index 0881076a..837c2ba5 100644 Binary files a/examples/obj/lucy/Lucy100k_bin.bin and b/examples/obj/lucy/Lucy100k_bin.bin differ diff --git a/examples/obj/male02/Male02_bin.bin b/examples/obj/male02/Male02_bin.bin index b3bafdcd..30ecde3e 100644 Binary files a/examples/obj/male02/Male02_bin.bin and b/examples/obj/male02/Male02_bin.bin differ diff --git a/examples/obj/ninja/NinjaLo_bin.bin b/examples/obj/ninja/NinjaLo_bin.bin index 2d6ff9dc..cd1fb082 100644 Binary files a/examples/obj/ninja/NinjaLo_bin.bin and b/examples/obj/ninja/NinjaLo_bin.bin differ diff --git a/examples/obj/veyron/VeyronNoUv_bin.bin b/examples/obj/veyron/VeyronNoUv_bin.bin index 84d1e83d..6f24cecb 100644 Binary files a/examples/obj/veyron/VeyronNoUv_bin.bin and b/examples/obj/veyron/VeyronNoUv_bin.bin differ diff --git a/examples/obj/veyron/parts/veyron_body_bin.bin b/examples/obj/veyron/parts/veyron_body_bin.bin index 4ded83e1..79bb3e2d 100644 Binary files a/examples/obj/veyron/parts/veyron_body_bin.bin and b/examples/obj/veyron/parts/veyron_body_bin.bin differ diff --git a/examples/obj/veyron/parts/veyron_wheel_bin.bin b/examples/obj/veyron/parts/veyron_wheel_bin.bin index c4581fd4..96a658a5 100644 Binary files a/examples/obj/veyron/parts/veyron_wheel_bin.bin and b/examples/obj/veyron/parts/veyron_wheel_bin.bin differ diff --git a/examples/obj/walt/WaltHead_bin.bin b/examples/obj/walt/WaltHead_bin.bin index bb4fcb89..b43962e1 100644 Binary files a/examples/obj/walt/WaltHead_bin.bin and b/examples/obj/walt/WaltHead_bin.bin differ diff --git a/src/extras/loaders/BinaryLoader.js b/src/extras/loaders/BinaryLoader.js index 3a0bca26..4ddec85d 100644 --- a/src/extras/loaders/BinaryLoader.js +++ b/src/extras/loaders/BinaryLoader.js @@ -111,7 +111,7 @@ THREE.BinaryLoader.prototype.loadAjaxBuffers = function( json, callback, binaryP if ( xhr.status == 200 || xhr.status == 0 ) { - THREE.BinaryLoader.prototype.createBinModel( xhr.responseText, callback, texturePath, json.materials ); + THREE.BinaryLoader.prototype.createBinModel( xhr.response, callback, texturePath, json.materials ); } else { @@ -142,18 +142,12 @@ THREE.BinaryLoader.prototype.loadAjaxBuffers = function( json, callback, binaryP }; xhr.open( "GET", url, true ); - xhr.overrideMimeType( "text/plain; charset=x-user-defined" ); - xhr.setRequestHeader( "Content-Type", "text/plain" ); + xhr.responseType = "arraybuffer"; xhr.send( null ); }; -// Binary AJAX parser based on Magi binary loader -// https://github.com/kig/magi - -// Should look more into HTML5 File API -// See also other suggestions by Gregg Tavares -// https://groups.google.com/group/o3d-discuss/browse_thread/thread/a8967bc9ce1e0978 +// Binary AJAX parser THREE.BinaryLoader.prototype.createBinModel = function ( data, callback, texturePath, materials ) { @@ -164,9 +158,6 @@ THREE.BinaryLoader.prototype.createBinModel = function ( data, callback, texture md, normals = [], uvs = [], - tri_b, tri_c, tri_m, tri_na, tri_nb, tri_nc, - quad_b, quad_c, quad_d, quad_m, quad_na, quad_nb, quad_nc, quad_nd, - tri_uvb, tri_uvc, quad_uvb, quad_uvc, quad_uvd, start_tri_flat, start_tri_smooth, start_tri_flat_uv, start_tri_smooth_uv, start_quad_flat, start_quad_smooth, start_quad_flat_uv, start_quad_smooth_uv, tri_size, quad_size, @@ -179,33 +170,20 @@ THREE.BinaryLoader.prototype.createBinModel = function ( data, callback, texture THREE.Loader.prototype.initMaterials( scope, materials, texturePath ); md = parseMetaData( data, currentOffset ); + + if ( md.signature !== "Three.js 003" ) { + + console.warn( "DEPRECATED: binary model seems to be using old format" ); + + } + currentOffset += md.header_bytes; - - // cache offsets - - tri_b = md.vertex_index_bytes, - tri_c = md.vertex_index_bytes*2, - tri_m = md.vertex_index_bytes*3, - tri_na = md.vertex_index_bytes*3 + md.material_index_bytes, - tri_nb = md.vertex_index_bytes*3 + md.material_index_bytes + md.normal_index_bytes, - tri_nc = md.vertex_index_bytes*3 + md.material_index_bytes + md.normal_index_bytes*2, - - quad_b = md.vertex_index_bytes, - quad_c = md.vertex_index_bytes*2, - quad_d = md.vertex_index_bytes*3, - quad_m = md.vertex_index_bytes*4, - quad_na = md.vertex_index_bytes*4 + md.material_index_bytes, - quad_nb = md.vertex_index_bytes*4 + md.material_index_bytes + md.normal_index_bytes, - quad_nc = md.vertex_index_bytes*4 + md.material_index_bytes + md.normal_index_bytes*2, - quad_nd = md.vertex_index_bytes*4 + md.material_index_bytes + md.normal_index_bytes*3, - - tri_uvb = md.uv_index_bytes, - tri_uvc = md.uv_index_bytes * 2, - - quad_uvb = md.uv_index_bytes, - quad_uvc = md.uv_index_bytes * 2, - quad_uvd = md.uv_index_bytes * 3; - +/* + md.vertex_index_bytes = Uint32Array.BYTES_PER_ELEMENT; + md.material_index_bytes = Uint16Array.BYTES_PER_ELEMENT; + md.normal_index_bytes = Uint32Array.BYTES_PER_ELEMENT; + md.uv_index_bytes = Uint32Array.BYTES_PER_ELEMENT; +*/ // buffers sizes tri_size = md.vertex_index_bytes * 3 + md.material_index_bytes; @@ -224,18 +202,21 @@ THREE.BinaryLoader.prototype.createBinModel = function ( data, callback, texture // read buffers currentOffset += init_vertices( currentOffset ); + currentOffset += init_normals( currentOffset ); + currentOffset += handlePadding( md.nnormals * 3 ); + currentOffset += init_uvs( currentOffset ); start_tri_flat = currentOffset; - start_tri_smooth = start_tri_flat + len_tri_flat; - start_tri_flat_uv = start_tri_smooth + len_tri_smooth; - start_tri_smooth_uv = start_tri_flat_uv + len_tri_flat_uv; + start_tri_smooth = start_tri_flat + len_tri_flat + handlePadding( md.ntri_flat * 2 ); + start_tri_flat_uv = start_tri_smooth + len_tri_smooth + handlePadding( md.ntri_smooth * 2 ); + start_tri_smooth_uv = start_tri_flat_uv + len_tri_flat_uv + handlePadding( md.ntri_flat_uv * 2 ); - start_quad_flat = start_tri_smooth_uv + len_tri_smooth_uv; - start_quad_smooth = start_quad_flat + len_quad_flat; - start_quad_flat_uv = start_quad_smooth + len_quad_smooth; - start_quad_smooth_uv= start_quad_flat_uv +len_quad_flat_uv; + start_quad_flat = start_tri_smooth_uv + len_tri_smooth_uv + handlePadding( md.ntri_smooth_uv * 2 ); + start_quad_smooth = start_quad_flat + len_quad_flat + handlePadding( md.nquad_flat * 2 ); + start_quad_flat_uv = start_quad_smooth + len_quad_smooth + handlePadding( md.nquad_smooth * 2 ); + start_quad_smooth_uv= start_quad_flat_uv + len_quad_flat_uv + handlePadding( md.nquad_flat_uv * 2 ); // have to first process faces with uvs // so that face and uv indices match @@ -259,64 +240,69 @@ THREE.BinaryLoader.prototype.createBinModel = function ( data, callback, texture if ( THREE.Loader.prototype.hasNormals( this ) ) this.computeTangents(); + function handlePadding( n ) { + + return ( n % 4 ) ? ( 4 - n % 4 ) : 0; + + }; + function parseMetaData( data, offset ) { var metaData = { - 'signature' :parseString( data, offset, 8 ), - 'header_bytes' :parseUChar8( data, offset + 8 ), + 'signature' :parseString( data, offset, 12 ), + 'header_bytes' :parseUChar8( data, offset + 12 ), - 'vertex_coordinate_bytes' :parseUChar8( data, offset + 9 ), - 'normal_coordinate_bytes' :parseUChar8( data, offset + 10 ), - 'uv_coordinate_bytes' :parseUChar8( data, offset + 11 ), + 'vertex_coordinate_bytes' :parseUChar8( data, offset + 13 ), + 'normal_coordinate_bytes' :parseUChar8( data, offset + 14 ), + 'uv_coordinate_bytes' :parseUChar8( data, offset + 15 ), - 'vertex_index_bytes' :parseUChar8( data, offset + 12 ), - 'normal_index_bytes' :parseUChar8( data, offset + 13 ), - 'uv_index_bytes' :parseUChar8( data, offset + 14 ), - 'material_index_bytes' :parseUChar8( data, offset + 15 ), + 'vertex_index_bytes' :parseUChar8( data, offset + 16 ), + 'normal_index_bytes' :parseUChar8( data, offset + 17 ), + 'uv_index_bytes' :parseUChar8( data, offset + 18 ), + 'material_index_bytes' :parseUChar8( data, offset + 19 ), - 'nvertices' :parseUInt32( data, offset + 16 ), - 'nnormals' :parseUInt32( data, offset + 16 + 4*1 ), - 'nuvs' :parseUInt32( data, offset + 16 + 4*2 ), + 'nvertices' :parseUInt32( data, offset + 20 ), + 'nnormals' :parseUInt32( data, offset + 20 + 4*1 ), + 'nuvs' :parseUInt32( data, offset + 20 + 4*2 ), - 'ntri_flat' :parseUInt32( data, offset + 16 + 4*3 ), - 'ntri_smooth' :parseUInt32( data, offset + 16 + 4*4 ), - 'ntri_flat_uv' :parseUInt32( data, offset + 16 + 4*5 ), - 'ntri_smooth_uv' :parseUInt32( data, offset + 16 + 4*6 ), + 'ntri_flat' :parseUInt32( data, offset + 20 + 4*3 ), + 'ntri_smooth' :parseUInt32( data, offset + 20 + 4*4 ), + 'ntri_flat_uv' :parseUInt32( data, offset + 20 + 4*5 ), + 'ntri_smooth_uv' :parseUInt32( data, offset + 20 + 4*6 ), - 'nquad_flat' :parseUInt32( data, offset + 16 + 4*7 ), - 'nquad_smooth' :parseUInt32( data, offset + 16 + 4*8 ), - 'nquad_flat_uv' :parseUInt32( data, offset + 16 + 4*9 ), - 'nquad_smooth_uv' :parseUInt32( data, offset + 16 + 4*10 ) + 'nquad_flat' :parseUInt32( data, offset + 20 + 4*7 ), + 'nquad_smooth' :parseUInt32( data, offset + 20 + 4*8 ), + 'nquad_flat_uv' :parseUInt32( data, offset + 20 + 4*9 ), + 'nquad_smooth_uv' :parseUInt32( data, offset + 20 + 4*10 ) }; +/* + console.log( "signature: " + metaData.signature ); - /* - log( "signature: " + metaData.signature ); + console.log( "header_bytes: " + metaData.header_bytes ); + console.log( "vertex_coordinate_bytes: " + metaData.vertex_coordinate_bytes ); + console.log( "normal_coordinate_bytes: " + metaData.normal_coordinate_bytes ); + console.log( "uv_coordinate_bytes: " + metaData.uv_coordinate_bytes ); - log( "header_bytes: " + metaData.header_bytes ); - log( "vertex_coordinate_bytes: " + metaData.vertex_coordinate_bytes ); - log( "normal_coordinate_bytes: " + metaData.normal_coordinate_bytes ); - log( "uv_coordinate_bytes: " + metaData.uv_coordinate_bytes ); + console.log( "vertex_index_bytes: " + metaData.vertex_index_bytes ); + console.log( "normal_index_bytes: " + metaData.normal_index_bytes ); + console.log( "uv_index_bytes: " + metaData.uv_index_bytes ); + console.log( "material_index_bytes: " + metaData.material_index_bytes ); - log( "vertex_index_bytes: " + metaData.vertex_index_bytes ); - log( "normal_index_bytes: " + metaData.normal_index_bytes ); - log( "uv_index_bytes: " + metaData.uv_index_bytes ); - log( "material_index_bytes: " + metaData.material_index_bytes ); + console.log( "nvertices: " + metaData.nvertices ); + console.log( "nnormals: " + metaData.nnormals ); + console.log( "nuvs: " + metaData.nuvs ); - log( "nvertices: " + metaData.nvertices ); - log( "nnormals: " + metaData.nnormals ); - log( "nuvs: " + metaData.nuvs ); + console.log( "ntri_flat: " + metaData.ntri_flat ); + console.log( "ntri_smooth: " + metaData.ntri_smooth ); + console.log( "ntri_flat_uv: " + metaData.ntri_flat_uv ); + console.log( "ntri_smooth_uv: " + metaData.ntri_smooth_uv ); - log( "ntri_flat: " + metaData.ntri_flat ); - log( "ntri_smooth: " + metaData.ntri_smooth ); - log( "ntri_flat_uv: " + metaData.ntri_flat_uv ); - log( "ntri_smooth_uv: " + metaData.ntri_smooth_uv ); - - log( "nquad_flat: " + metaData.nquad_flat ); - log( "nquad_smooth: " + metaData.nquad_smooth ); - log( "nquad_flat_uv: " + metaData.nquad_flat_uv ); - log( "nquad_smooth_uv: " + metaData.nquad_smooth_uv ); + console.log( "nquad_flat: " + metaData.nquad_flat ); + console.log( "nquad_smooth: " + metaData.nquad_smooth ); + console.log( "nquad_flat_uv: " + metaData.nquad_flat_uv ); + console.log( "nquad_smooth_uv: " + metaData.nquad_smooth_uv ); var total = metaData.header_bytes + metaData.nvertices * metaData.vertex_coordinate_bytes * 3 @@ -330,8 +316,8 @@ THREE.BinaryLoader.prototype.createBinModel = function ( data, callback, texture + metaData.nquad_smooth * ( metaData.vertex_index_bytes*4 + metaData.material_index_bytes + metaData.normal_index_bytes*4 ) + metaData.nquad_flat_uv * ( metaData.vertex_index_bytes*4 + metaData.material_index_bytes + metaData.uv_index_bytes*4 ) + metaData.nquad_smooth_uv * ( metaData.vertex_index_bytes*4 + metaData.material_index_bytes + metaData.normal_index_bytes*4 + metaData.uv_index_bytes*4 ); - log( "total bytes: " + total ); - */ + console.log( "total bytes: " + total ); +*/ return metaData; @@ -339,359 +325,386 @@ THREE.BinaryLoader.prototype.createBinModel = function ( data, callback, texture function parseString( data, offset, length ) { - return data.substr( offset, length ); + var charArray = new Uint8Array( data, offset, length ); - }; + var text = ""; - function parseFloat32( data, offset ) { + for ( var i = 0; i < length; i ++ ) { - var b3 = parseUChar8( data, offset ), - b2 = parseUChar8( data, offset + 1 ), - b1 = parseUChar8( data, offset + 2 ), - b0 = parseUChar8( data, offset + 3 ), + text += String.fromCharCode( charArray[ offset + i ] ); - sign = 1 - ( 2 * ( b0 >> 7 ) ), - exponent = ((( b0 << 1 ) & 0xff) | ( b1 >> 7 )) - 127, - mantissa = (( b1 & 0x7f ) << 16) | (b2 << 8) | b3; + } - if (mantissa == 0 && exponent == -127) - return 0.0; - - return sign * ( 1 + mantissa * Math.pow( 2, -23 ) ) * Math.pow( 2, exponent ); - - }; - - function parseUInt32( data, offset ) { - - var b0 = parseUChar8( data, offset ), - b1 = parseUChar8( data, offset + 1 ), - b2 = parseUChar8( data, offset + 2 ), - b3 = parseUChar8( data, offset + 3 ); - - return (b3 << 24) + (b2 << 16) + (b1 << 8) + b0; - - }; - - function parseUInt16( data, offset ) { - - var b0 = parseUChar8( data, offset ), - b1 = parseUChar8( data, offset + 1 ); - - return (b1 << 8) + b0; - - }; - - function parseSChar8( data, offset ) { - - var b = parseUChar8( data, offset ); - return b > 127 ? b - 256 : b; + return text; }; function parseUChar8( data, offset ) { - return data.charCodeAt( offset ) & 0xff; + var charArray = new Uint8Array( data, offset, 1 ); + + return charArray[ 0 ]; + + }; + + function parseUInt32( data, offset ) { + + var intArray = new Uint32Array( data, offset, 1 ); + + return intArray[ 0 ]; }; function init_vertices( start ) { - var i, x, y, z, - stride = md.vertex_coordinate_bytes * 3, - end = start + md.nvertices * stride; + var nElements = md.nvertices; - for( i = start; i < end; i += stride ) { + var coordArray = new Float32Array( data, start, nElements * 3 ); - x = parseFloat32( data, i ); - y = parseFloat32( data, i + md.vertex_coordinate_bytes ); - z = parseFloat32( data, i + md.vertex_coordinate_bytes*2 ); + var i, x, y, z; + + for( i = 0; i < nElements; i ++ ) { + + x = coordArray[ i * 3 ]; + y = coordArray[ i * 3 + 1 ]; + z = coordArray[ i * 3 + 2 ]; vertex( scope, x, y, z ); } - return md.nvertices * stride; + return nElements * 3 * Float32Array.BYTES_PER_ELEMENT; }; function init_normals( start ) { - var i, x, y, z, - stride = md.normal_coordinate_bytes * 3, - end = start + md.nnormals * stride; + var nElements = md.nnormals; - for( i = start; i < end; i += stride ) { + if ( nElements ) { - x = parseSChar8( data, i ); - y = parseSChar8( data, i + md.normal_coordinate_bytes ); - z = parseSChar8( data, i + md.normal_coordinate_bytes*2 ); + var normalArray = new Int8Array( data, start, nElements * 3 ); - normals.push( x/127, y/127, z/127 ); + var i, x, y, z; + + for( i = 0; i < nElements; i ++ ) { + + x = normalArray[ i * 3 ]; + y = normalArray[ i * 3 + 1 ]; + z = normalArray[ i * 3 + 2 ]; + + normals.push( x/127, y/127, z/127 ); + + } } - return md.nnormals * stride; + return nElements * 3 * Int8Array.BYTES_PER_ELEMENT; }; function init_uvs( start ) { - var i, u, v, - stride = md.uv_coordinate_bytes * 2, - end = start + md.nuvs * stride; + var nElements = md.nuvs; - for( i = start; i < end; i += stride ) { + if ( nElements ) { - u = parseFloat32( data, i ); - v = parseFloat32( data, i + md.uv_coordinate_bytes ); + var uvArray = new Float32Array( data, start, nElements * 2 ); - uvs.push( u, v ); + var i, u, v; + + for( i = 0; i < nElements; i ++ ) { + + u = uvArray[ i * 2 ]; + v = uvArray[ i * 2 + 1 ]; + + uvs.push( u, v ); + + } } - return md.nuvs * stride; + return nElements * 2 * Float32Array.BYTES_PER_ELEMENT; }; - function add_tri( i ) { + function init_uvs3( nElements, offset ) { - var a, b, c, m; + var i, uva, uvb, uvc, u1, u2, u3, v1, v2, v3; - a = parseUInt32( data, i ); - b = parseUInt32( data, i + tri_b ); - c = parseUInt32( data, i + tri_c ); + var uvIndexBuffer = new Uint32Array( data, offset, 3 * nElements ); - m = parseUInt16( data, i + tri_m ); + for( i = 0; i < nElements; i ++ ) { - f3( scope, a, b, c, m ); + uva = uvIndexBuffer[ i * 3 ]; + uvb = uvIndexBuffer[ i * 3 + 1 ]; + uvc = uvIndexBuffer[ i * 3 + 2 ]; + + u1 = uvs[ uva*2 ]; + v1 = uvs[ uva*2 + 1 ]; + + u2 = uvs[ uvb*2 ]; + v2 = uvs[ uvb*2 + 1 ]; + + u3 = uvs[ uvc*2 ]; + v3 = uvs[ uvc*2 + 1 ]; + + uv3( scope.faceVertexUvs[ 0 ], u1, v1, u2, v2, u3, v3 ); + + } }; - function add_tri_n( i ) { + function init_uvs4( nElements, offset ) { - var a, b, c, m, na, nb, nc; + var i, uva, uvb, uvc, uvd, u1, u2, u3, u4, v1, v2, v3, v4; - a = parseUInt32( data, i ); - b = parseUInt32( data, i + tri_b ); - c = parseUInt32( data, i + tri_c ); + var uvIndexBuffer = new Uint32Array( data, offset, 4 * nElements ); - m = parseUInt16( data, i + tri_m ); + for( i = 0; i < nElements; i ++ ) { - na = parseUInt32( data, i + tri_na ); - nb = parseUInt32( data, i + tri_nb ); - nc = parseUInt32( data, i + tri_nc ); + uva = uvIndexBuffer[ i * 4 ]; + uvb = uvIndexBuffer[ i * 4 + 1 ]; + uvc = uvIndexBuffer[ i * 4 + 2 ]; + uvd = uvIndexBuffer[ i * 4 + 3 ]; - f3n( scope, normals, a, b, c, m, na, nb, nc ); + u1 = uvs[ uva*2 ]; + v1 = uvs[ uva*2 + 1 ]; + + u2 = uvs[ uvb*2 ]; + v2 = uvs[ uvb*2 + 1 ]; + + u3 = uvs[ uvc*2 ]; + v3 = uvs[ uvc*2 + 1 ]; + + u4 = uvs[ uvd*2 ]; + v4 = uvs[ uvd*2 + 1 ]; + + uv4( scope.faceVertexUvs[ 0 ], u1, v1, u2, v2, u3, v3, u4, v4 ); + + } }; - function add_quad( i ) { + function init_faces3_flat( nElements, offsetVertices, offsetMaterials ) { - var a, b, c, d, m; + var i, a, b, c, m; - a = parseUInt32( data, i ); - b = parseUInt32( data, i + quad_b ); - c = parseUInt32( data, i + quad_c ); - d = parseUInt32( data, i + quad_d ); + var vertexIndexBuffer = new Uint32Array( data, offsetVertices, 3 * nElements ); + var materialIndexBuffer = new Uint16Array( data, offsetMaterials, nElements ); - m = parseUInt16( data, i + quad_m ); + for( i = 0; i < nElements; i ++ ) { - f4( scope, a, b, c, d, m ); + a = vertexIndexBuffer[ i * 3 ]; + b = vertexIndexBuffer[ i * 3 + 1 ]; + c = vertexIndexBuffer[ i * 3 + 2 ]; + + m = materialIndexBuffer[ i ]; + + f3( scope, a, b, c, m ); + + } }; - function add_quad_n( i ) { + function init_faces4_flat( nElements, offsetVertices, offsetMaterials ) { - var a, b, c, d, m, na, nb, nc, nd; + var i, a, b, c, d, m; - a = parseUInt32( data, i ); - b = parseUInt32( data, i + quad_b ); - c = parseUInt32( data, i + quad_c ); - d = parseUInt32( data, i + quad_d ); + var vertexIndexBuffer = new Uint32Array( data, offsetVertices, 4 * nElements ); + var materialIndexBuffer = new Uint16Array( data, offsetMaterials, nElements ); - m = parseUInt16( data, i + quad_m ); + for( i = 0; i < nElements; i ++ ) { - na = parseUInt32( data, i + quad_na ); - nb = parseUInt32( data, i + quad_nb ); - nc = parseUInt32( data, i + quad_nc ); - nd = parseUInt32( data, i + quad_nd ); + a = vertexIndexBuffer[ i * 4 ]; + b = vertexIndexBuffer[ i * 4 + 1 ]; + c = vertexIndexBuffer[ i * 4 + 2 ]; + d = vertexIndexBuffer[ i * 4 + 3 ]; - f4n( scope, normals, a, b, c, d, m, na, nb, nc, nd ); + m = materialIndexBuffer[ i ]; + + f4( scope, a, b, c, d, m ); + + } }; - function add_uv3( i ) { + function init_faces3_smooth( nElements, offsetVertices, offsetNormals, offsetMaterials ) { - var uva, uvb, uvc, u1, u2, u3, v1, v2, v3; + var i, a, b, c, m; + var na, nb, nc; - uva = parseUInt32( data, i ); - uvb = parseUInt32( data, i + tri_uvb ); - uvc = parseUInt32( data, i + tri_uvc ); + var vertexIndexBuffer = new Uint32Array( data, offsetVertices, 3 * nElements ); + var normalIndexBuffer = new Uint32Array( data, offsetNormals, 3 * nElements ); + var materialIndexBuffer = new Uint16Array( data, offsetMaterials, nElements ); - u1 = uvs[ uva*2 ]; - v1 = uvs[ uva*2 + 1 ]; + for( i = 0; i < nElements; i ++ ) { - u2 = uvs[ uvb*2 ]; - v2 = uvs[ uvb*2 + 1 ]; + a = vertexIndexBuffer[ i * 3 ]; + b = vertexIndexBuffer[ i * 3 + 1 ]; + c = vertexIndexBuffer[ i * 3 + 2 ]; - u3 = uvs[ uvc*2 ]; - v3 = uvs[ uvc*2 + 1 ]; + na = normalIndexBuffer[ i * 3 ]; + nb = normalIndexBuffer[ i * 3 + 1 ]; + nc = normalIndexBuffer[ i * 3 + 2 ]; - uv3( scope.faceVertexUvs[ 0 ], u1, v1, u2, v2, u3, v3 ); + m = materialIndexBuffer[ i ]; + + f3n( scope, normals, a, b, c, m, na, nb, nc ); + + } }; - function add_uv4( i ) { + function init_faces4_smooth( nElements, offsetVertices, offsetNormals, offsetMaterials ) { - var uva, uvb, uvc, uvd, u1, u2, u3, u4, v1, v2, v3, v4; + var i, a, b, c, d, m; + var na, nb, nc, nd; - uva = parseUInt32( data, i ); - uvb = parseUInt32( data, i + quad_uvb ); - uvc = parseUInt32( data, i + quad_uvc ); - uvd = parseUInt32( data, i + quad_uvd ); + var vertexIndexBuffer = new Uint32Array( data, offsetVertices, 4 * nElements ); + var normalIndexBuffer = new Uint32Array( data, offsetNormals, 4 * nElements ); + var materialIndexBuffer = new Uint16Array( data, offsetMaterials, nElements ); - u1 = uvs[ uva*2 ]; - v1 = uvs[ uva*2 + 1 ]; + for( i = 0; i < nElements; i ++ ) { - u2 = uvs[ uvb*2 ]; - v2 = uvs[ uvb*2 + 1 ]; + a = vertexIndexBuffer[ i * 4 ]; + b = vertexIndexBuffer[ i * 4 + 1 ]; + c = vertexIndexBuffer[ i * 4 + 2 ]; + d = vertexIndexBuffer[ i * 4 + 3 ]; - u3 = uvs[ uvc*2 ]; - v3 = uvs[ uvc*2 + 1 ]; + na = normalIndexBuffer[ i * 4 ]; + nb = normalIndexBuffer[ i * 4 + 1 ]; + nc = normalIndexBuffer[ i * 4 + 2 ]; + nd = normalIndexBuffer[ i * 4 + 3 ]; - u4 = uvs[ uvd*2 ]; - v4 = uvs[ uvd*2 + 1 ]; + m = materialIndexBuffer[ i ]; - uv4( scope.faceVertexUvs[ 0 ], u1, v1, u2, v2, u3, v3, u4, v4 ); + f4n( scope, normals, a, b, c, d, m, na, nb, nc, nd ); + + } }; function init_triangles_flat( start ) { - var i, stride = md.vertex_index_bytes * 3 + md.material_index_bytes, - end = start + md.ntri_flat * stride; + var nElements = md.ntri_flat; - for( i = start; i < end; i += stride ) { + if ( nElements ) { - add_tri( i ); + var offsetMaterials = start + nElements * Uint32Array.BYTES_PER_ELEMENT * 3; + init_faces3_flat( nElements, start, offsetMaterials ); } - return end - start; - - } + }; function init_triangles_flat_uv( start ) { - var i, offset = md.vertex_index_bytes * 3 + md.material_index_bytes, - stride = offset + md.uv_index_bytes * 3, - end = start + md.ntri_flat_uv * stride; + var nElements = md.ntri_flat_uv; - for( i = start; i < end; i += stride ) { + if ( nElements ) { - add_tri( i ); - add_uv3( i + offset ); + var offsetUvs = start + nElements * Uint32Array.BYTES_PER_ELEMENT * 3; + var offsetMaterials = offsetUvs + nElements * Uint32Array.BYTES_PER_ELEMENT * 3; + + init_faces3_flat( nElements, start, offsetMaterials ); + init_uvs3( nElements, offsetUvs ); } - return end - start; - }; function init_triangles_smooth( start ) { - var i, stride = md.vertex_index_bytes * 3 + md.material_index_bytes + md.normal_index_bytes * 3, - end = start + md.ntri_smooth * stride; + var nElements = md.ntri_smooth; - for( i = start; i < end; i += stride ) { + if ( nElements ) { - add_tri_n( i ); + var offsetNormals = start + nElements * Uint32Array.BYTES_PER_ELEMENT * 3; + var offsetMaterials = offsetNormals + nElements * Uint32Array.BYTES_PER_ELEMENT * 3; + + init_faces3_smooth( nElements, start, offsetNormals, offsetMaterials ); } - return end - start; - }; function init_triangles_smooth_uv( start ) { - var i, offset = md.vertex_index_bytes * 3 + md.material_index_bytes + md.normal_index_bytes * 3, - stride = offset + md.uv_index_bytes * 3, - end = start + md.ntri_smooth_uv * stride; + var nElements = md.ntri_smooth_uv; - for( i = start; i < end; i += stride ) { + if ( nElements ) { - add_tri_n( i ); - add_uv3( i + offset ); + var offsetNormals = start + nElements * Uint32Array.BYTES_PER_ELEMENT * 3; + var offsetUvs = offsetNormals + nElements * Uint32Array.BYTES_PER_ELEMENT * 3; + var offsetMaterials = offsetUvs + nElements * Uint32Array.BYTES_PER_ELEMENT * 3; + + init_faces3_smooth( nElements, start, offsetNormals, offsetMaterials ); + init_uvs3( nElements, offsetUvs ); } - return end - start; - }; function init_quads_flat( start ) { - var i, stride = md.vertex_index_bytes * 4 + md.material_index_bytes, - end = start + md.nquad_flat * stride; + var nElements = md.nquad_flat; - for( i = start; i < end; i += stride ) { + if ( nElements ) { - add_quad( i ); + var offsetMaterials = start + nElements * Uint32Array.BYTES_PER_ELEMENT * 4; + init_faces4_flat( nElements, start, offsetMaterials ); } - return end - start; - }; function init_quads_flat_uv( start ) { - var i, offset = md.vertex_index_bytes * 4 + md.material_index_bytes, - stride = offset + md.uv_index_bytes * 4, - end = start + md.nquad_flat_uv * stride; + var nElements = md.nquad_flat_uv; - for( i = start; i < end; i += stride ) { + if ( nElements ) { - add_quad( i ); - add_uv4( i + offset ); + var offsetUvs = start + nElements * Uint32Array.BYTES_PER_ELEMENT * 4; + var offsetMaterials = offsetUvs + nElements * Uint32Array.BYTES_PER_ELEMENT * 4; + + init_faces4_flat( nElements, start, offsetMaterials ); + init_uvs4( nElements, offsetUvs ); } - return end - start; - }; function init_quads_smooth( start ) { - var i, stride = md.vertex_index_bytes * 4 + md.material_index_bytes + md.normal_index_bytes * 4, - end = start + md.nquad_smooth * stride; + var nElements = md.nquad_smooth; - for( i = start; i < end; i += stride ) { + if ( nElements ) { - add_quad_n( i ); + var offsetNormals = start + nElements * Uint32Array.BYTES_PER_ELEMENT * 4; + var offsetMaterials = offsetNormals + nElements * Uint32Array.BYTES_PER_ELEMENT * 4; + + init_faces4_smooth( nElements, start, offsetNormals, offsetMaterials ); } - return end - start; - }; function init_quads_smooth_uv( start ) { - var i, offset = md.vertex_index_bytes * 4 + md.material_index_bytes + md.normal_index_bytes * 4, - stride = offset + md.uv_index_bytes * 4, - end = start + md.nquad_smooth_uv * stride; + var nElements = md.nquad_smooth_uv; - for( i = start; i < end; i += stride ) { + if ( nElements ) { - add_quad_n( i ); - add_uv4( i + offset ); + var offsetNormals = start + nElements * Uint32Array.BYTES_PER_ELEMENT * 4; + var offsetUvs = offsetNormals + nElements * Uint32Array.BYTES_PER_ELEMENT * 4; + var offsetMaterials = offsetUvs + nElements * Uint32Array.BYTES_PER_ELEMENT * 4; + + init_faces4_smooth( nElements, start, offsetNormals, offsetMaterials ); + init_uvs4( nElements, offsetUvs ); } - return end - start; - }; }; diff --git a/utils/exporters/convert_obj_three.py b/utils/exporters/convert_obj_three.py index 25a7f480..17c229b5 100644 --- a/utils/exporters/convert_obj_three.py +++ b/utils/exporters/convert_obj_three.py @@ -1098,6 +1098,60 @@ def convert_ascii(infile, morphfiles, colorfiles, outfile): # ############################################################################# # API - Binary converter # ############################################################################# +def dump_materials_to_buffer(faces, buffer): + for f in faces: + data = struct.pack('