From b6861b3e0c9c1a31f67b08aef9b0906765c9e4fe Mon Sep 17 00:00:00 2001 From: "Mr.doob" Date: Sun, 19 Aug 2012 11:46:20 +0200 Subject: [PATCH] Yet more Ray clean up. --- build/three.js | 72 +++-- build/three.min.js | 443 +++++++++++++------------- examples/webgl_interactive_cubes.html | 16 +- src/core/Ray.js | 308 +++++++++--------- 4 files changed, 424 insertions(+), 415 deletions(-) diff --git a/build/three.js b/build/three.js index 142993fb64..db5b100783 100644 --- a/build/three.js +++ b/build/three.js @@ -2761,27 +2761,13 @@ THREE.Frustum.__v1 = new THREE.Vector3(); }; - // - - THREE.Ray.prototype.precision = 0.0001; - - THREE.Ray.prototype.intersectObject = function ( object, recursive ) { - - var intersect, intersects = [], distance; - - if ( recursive === true ) { - - for ( var i = 0, l = object.children.length; i < l; i ++ ) { - - Array.prototype.push.apply( intersects, this.intersectObject( object.children[ i ], recursive ) ); + var intersectObject = function ( object, ray, intersects ) { - } - - } + var distance,intersect; if ( object instanceof THREE.Particle ) { - distance = distanceFromIntersection( this.origin, this.direction, object.matrixWorld.getPosition() ); + distance = distanceFromIntersection( ray.origin, ray.direction, object.matrixWorld.getPosition() ); if ( distance > object.scale.x ) { @@ -2808,9 +2794,9 @@ THREE.Frustum.__v1 = new THREE.Vector3(); // Checking distance to ray - distance = distanceFromIntersection( this.origin, this.direction, object.matrixWorld.getPosition() ); + distance = distanceFromIntersection( ray.origin, ray.direction, object.matrixWorld.getPosition() ); - if ( distance > scaledRadius ) { + if ( distance > scaledRadius) { return intersects; @@ -2827,13 +2813,13 @@ THREE.Frustum.__v1 = new THREE.Vector3(); geometryMaterials = object.geometry.materials; isFaceMaterial = object.material instanceof THREE.MeshFaceMaterial; side = object.material.side; + var a, b, c, d; - var precision = this.precision; + var precision = ray.precision; object.matrixRotationWorld.extractRotation( object.matrixWorld ); - originCopy.copy( this.origin ); - //directionCopy.copy( this.direction ); + originCopy.copy( ray.origin ); objMatrix = object.matrixWorld; inverseMatrix.getInverse( objMatrix ); @@ -2841,7 +2827,7 @@ THREE.Frustum.__v1 = new THREE.Vector3(); localOriginCopy.copy( originCopy ); inverseMatrix.multiplyVector3( localOriginCopy ); - localDirectionCopy.copy( this.direction ); + localDirectionCopy.copy( ray.direction ); inverseMatrix.rotateAxis( localDirectionCopy ).normalize(); for ( f = 0, fl = geometry.faces.length; f < fl; f ++ ) { @@ -2883,7 +2869,7 @@ THREE.Frustum.__v1 = new THREE.Vector3(); point = object.matrixWorld.multiplyVector3( intersectPoint.clone() ); distance = originCopy.distanceTo( point ); - if ( distance < this.near || distance > this.far ) continue; + if ( distance < ray.near || distance > ray.far ) continue; intersect = { @@ -2911,7 +2897,7 @@ THREE.Frustum.__v1 = new THREE.Vector3(); point = object.matrixWorld.multiplyVector3( intersectPoint.clone() ); distance = originCopy.distanceTo( point ); - if ( distance < this.near || distance > this.far ) continue; + if ( distance < ray.near || distance > ray.far ) continue; intersect = { @@ -2935,6 +2921,35 @@ THREE.Frustum.__v1 = new THREE.Vector3(); } + }; + + var intersectDescendants= function ( object, ray, intersects ) { + + var descendants = object.getDescendants(); + + for ( var i = 0, l = descendants.length; i < l; i ++ ) { + + intersectObject( descendants[ i ], this, intersects ); + + } + }; + + // + + THREE.Ray.prototype.precision = 0.0001; + + THREE.Ray.prototype.intersectObject = function ( object, recursive ) { + + var intersects = []; + + if ( recursive === true ) { + + intersectDescendants( object, this, intersects ); + + } + + intersectObject(object,this,intersects); + intersects.sort( descSort ); return intersects; @@ -2947,8 +2962,13 @@ THREE.Frustum.__v1 = new THREE.Vector3(); for ( var i = 0, l = objects.length; i < l; i ++ ) { - Array.prototype.push.apply( intersects, this.intersectObject( objects[ i ], recursive ) ); + intersectObject( objects[ i ], this, intersects ); + + if ( recursive === true ) { + intersectDescendants( objects[ i ], this, intersects ); + + } } intersects.sort( descSort ); diff --git a/build/three.min.js b/build/three.min.js index 07475fe8e1..a7e73800e3 100644 --- a/build/three.min.js +++ b/build/three.min.js @@ -31,8 +31,8 @@ Math.acos(a.w);var b=Math.sqrt(1-a.w*a.w);if(b<1E-4){this.x=1;this.z=this.y=0}el THREE.Matrix3.prototype={constructor:THREE.Matrix3,getInverse:function(a){var b=a.elements,a=b[10]*b[5]-b[6]*b[9],c=-b[10]*b[1]+b[2]*b[9],d=b[6]*b[1]-b[2]*b[5],f=-b[10]*b[4]+b[6]*b[8],e=b[10]*b[0]-b[2]*b[8],g=-b[6]*b[0]+b[2]*b[4],h=b[9]*b[4]-b[5]*b[8],i=-b[9]*b[0]+b[1]*b[8],j=b[5]*b[0]-b[1]*b[4],b=b[0]*a+b[1]*f+b[2]*h;b===0&&console.warn("Matrix3.getInverse(): determinant == 0");var b=1/b,l=this.elements;l[0]=b*a;l[1]=b*c;l[2]=b*d;l[3]=b*f;l[4]=b*e;l[5]=b*g;l[6]=b*h;l[7]=b*i;l[8]=b*j;return this}, transpose:function(){var a,b=this.elements;a=b[1];b[1]=b[3];b[3]=a;a=b[2];b[2]=b[6];b[6]=a;a=b[5];b[5]=b[7];b[7]=a;return this},transposeIntoArray:function(a){var b=this.m;a[0]=b[0];a[1]=b[3];a[2]=b[6];a[3]=b[1];a[4]=b[4];a[5]=b[7];a[6]=b[2];a[7]=b[5];a[8]=b[8];return this}};THREE.Matrix4=function(a,b,c,d,f,e,g,h,i,j,l,m,n,q,o,p){this.elements=new Float32Array(16);this.set(a!==void 0?a:1,b||0,c||0,d||0,f||0,e!==void 0?e:1,g||0,h||0,i||0,j||0,l!==void 0?l:1,m||0,n||0,q||0,o||0,p!==void 0?p:1)}; THREE.Matrix4.prototype={constructor:THREE.Matrix4,set:function(a,b,c,d,f,e,g,h,i,j,l,m,n,q,o,p){var s=this.elements;s[0]=a;s[4]=b;s[8]=c;s[12]=d;s[1]=f;s[5]=e;s[9]=g;s[13]=h;s[2]=i;s[6]=j;s[10]=l;s[14]=m;s[3]=n;s[7]=q;s[11]=o;s[15]=p;return this},identity:function(){this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1);return this},copy:function(a){a=a.elements;this.set(a[0],a[4],a[8],a[12],a[1],a[5],a[9],a[13],a[2],a[6],a[10],a[14],a[3],a[7],a[11],a[15]);return this},lookAt:function(a,b,c){var d=this.elements, -f=THREE.Matrix4.__v1,e=THREE.Matrix4.__v2,g=THREE.Matrix4.__v3;g.sub(a,b).normalize();if(g.length()===0)g.z=1;f.cross(c,g).normalize();if(f.length()===0){g.x=g.x+1E-4;f.cross(c,g).normalize()}e.cross(g,f);d[0]=f.x;d[4]=e.x;d[8]=g.x;d[1]=f.y;d[5]=e.y;d[9]=g.y;d[2]=f.z;d[6]=e.z;d[10]=g.z;return this},multiply:function(a,b){var c=a.elements,d=b.elements,f=this.elements,e=c[0],g=c[4],h=c[8],i=c[12],j=c[1],l=c[5],m=c[9],n=c[13],q=c[2],o=c[6],p=c[10],s=c[14],r=c[3],t=c[7],v=c[11],c=c[15],u=d[0],A=d[4], -y=d[8],B=d[12],F=d[1],x=d[5],E=d[9],G=d[13],O=d[2],J=d[6],N=d[10],C=d[14],I=d[3],Q=d[7],K=d[11],d=d[15];f[0]=e*u+g*F+h*O+i*I;f[4]=e*A+g*x+h*J+i*Q;f[8]=e*y+g*E+h*N+i*K;f[12]=e*B+g*G+h*C+i*d;f[1]=j*u+l*F+m*O+n*I;f[5]=j*A+l*x+m*J+n*Q;f[9]=j*y+l*E+m*N+n*K;f[13]=j*B+l*G+m*C+n*d;f[2]=q*u+o*F+p*O+s*I;f[6]=q*A+o*x+p*J+s*Q;f[10]=q*y+o*E+p*N+s*K;f[14]=q*B+o*G+p*C+s*d;f[3]=r*u+t*F+v*O+c*I;f[7]=r*A+t*x+v*J+c*Q;f[11]=r*y+t*E+v*N+c*K;f[15]=r*B+t*G+v*C+c*d;return this},multiplySelf:function(a){return this.multiply(this, +f=THREE.Matrix4.__v1,e=THREE.Matrix4.__v2,g=THREE.Matrix4.__v3;g.sub(a,b).normalize();if(g.length()===0)g.z=1;f.cross(c,g).normalize();if(f.length()===0){g.x=g.x+1E-4;f.cross(c,g).normalize()}e.cross(g,f);d[0]=f.x;d[4]=e.x;d[8]=g.x;d[1]=f.y;d[5]=e.y;d[9]=g.y;d[2]=f.z;d[6]=e.z;d[10]=g.z;return this},multiply:function(a,b){var c=a.elements,d=b.elements,f=this.elements,e=c[0],g=c[4],h=c[8],i=c[12],j=c[1],l=c[5],m=c[9],n=c[13],q=c[2],o=c[6],p=c[10],s=c[14],r=c[3],u=c[7],v=c[11],c=c[15],t=d[0],A=d[4], +y=d[8],B=d[12],E=d[1],w=d[5],I=d[9],G=d[13],O=d[2],F=d[6],K=d[10],C=d[14],J=d[3],Q=d[7],L=d[11],d=d[15];f[0]=e*t+g*E+h*O+i*J;f[4]=e*A+g*w+h*F+i*Q;f[8]=e*y+g*I+h*K+i*L;f[12]=e*B+g*G+h*C+i*d;f[1]=j*t+l*E+m*O+n*J;f[5]=j*A+l*w+m*F+n*Q;f[9]=j*y+l*I+m*K+n*L;f[13]=j*B+l*G+m*C+n*d;f[2]=q*t+o*E+p*O+s*J;f[6]=q*A+o*w+p*F+s*Q;f[10]=q*y+o*I+p*K+s*L;f[14]=q*B+o*G+p*C+s*d;f[3]=r*t+u*E+v*O+c*J;f[7]=r*A+u*w+v*F+c*Q;f[11]=r*y+u*I+v*K+c*L;f[15]=r*B+u*G+v*C+c*d;return this},multiplySelf:function(a){return this.multiply(this, a)},multiplyToArray:function(a,b,c){var d=this.elements;this.multiply(a,b);c[0]=d[0];c[1]=d[1];c[2]=d[2];c[3]=d[3];c[4]=d[4];c[5]=d[5];c[6]=d[6];c[7]=d[7];c[8]=d[8];c[9]=d[9];c[10]=d[10];c[11]=d[11];c[12]=d[12];c[13]=d[13];c[14]=d[14];c[15]=d[15];return this},multiplyScalar:function(a){var b=this.elements;b[0]=b[0]*a;b[4]=b[4]*a;b[8]=b[8]*a;b[12]=b[12]*a;b[1]=b[1]*a;b[5]=b[5]*a;b[9]=b[9]*a;b[13]=b[13]*a;b[2]=b[2]*a;b[6]=b[6]*a;b[10]=b[10]*a;b[14]=b[14]*a;b[3]=b[3]*a;b[7]=b[7]*a;b[11]=b[11]*a;b[15]= b[15]*a;return this},multiplyVector3:function(a){var b=this.elements,c=a.x,d=a.y,f=a.z,e=1/(b[3]*c+b[7]*d+b[11]*f+b[15]);a.x=(b[0]*c+b[4]*d+b[8]*f+b[12])*e;a.y=(b[1]*c+b[5]*d+b[9]*f+b[13])*e;a.z=(b[2]*c+b[6]*d+b[10]*f+b[14])*e;return a},multiplyVector4:function(a){var b=this.elements,c=a.x,d=a.y,f=a.z,e=a.w;a.x=b[0]*c+b[4]*d+b[8]*f+b[12]*e;a.y=b[1]*c+b[5]*d+b[9]*f+b[13]*e;a.z=b[2]*c+b[6]*d+b[10]*f+b[14]*e;a.w=b[3]*c+b[7]*d+b[11]*f+b[15]*e;return a},multiplyVector3Array:function(a){for(var b=THREE.Matrix4.__v1, c=0,d=a.length;c=0&&a>=0&&f+a<1};a.Ray.prototype.precision=1E-4;a.Ray.prototype.intersectObject=function(l,j){var m,r=[],t;if(j===true)for(var v=0,u=l.children.length;vl.scale.x)return r;m={distance:t,point:l.position,face:null,object:l}; -r.push(m)}else if(l instanceof a.Mesh){v=l.geometry.boundingSphere.radius*l.matrixWorld.getMaxScaleOnAxis();t=n(this.origin,this.direction,l.matrixWorld.getPosition());if(t>v)return r;var A,y=l.geometry,B=y.vertices,F,x,E;F=l.geometry.materials;x=l.material instanceof a.MeshFaceMaterial;var G,O=this.precision;l.matrixRotationWorld.extractRotation(l.matrixWorld);b.copy(this.origin);h.getInverse(l.matrixWorld);c.copy(b);h.multiplyVector3(c);d.copy(this.direction);h.rotateAxis(d).normalize();v=0;for(u= -y.faces.length;v0))){g.add(c,d.multiplyScalar(A));if(m instanceof a.Face3){t=B[m.a];A=B[m.b];E=B[m.c];if(q(g,t,A,E)){A=l.matrixWorld.multiplyVector3(g.clone());t=b.distanceTo(A);if(!(tthis.far)){m={distance:t,point:A,face:m,faceIndex:v,object:l};r.push(m)}}}else if(m instanceof -a.Face4){t=B[m.a];A=B[m.b];E=B[m.c];G=B[m.d];if(q(g,t,A,G)||q(g,A,E,G)){A=l.matrixWorld.multiplyVector3(g.clone());t=b.distanceTo(A);if(!(tthis.far)){m={distance:t,point:A,face:m,faceIndex:v,object:l};r.push(m)}}}}}}}}r.sort(i);return r};a.Ray.prototype.intersectObjects=function(a,b){for(var c=[],d=0,f=a.length;d=0&&a>=0&&f+a<1},o=function(i,l,j){var m,o;if(i instanceof a.Particle){m=n(l.origin,l.direction,i.matrixWorld.getPosition());if(m>i.scale.x)return j;o={distance:m,point:i.position,face:null,object:i};j.push(o)}else if(i instanceof a.Mesh){var p=i.geometry.boundingSphere.radius*i.matrixWorld.getMaxScaleOnAxis();m=n(l.origin,l.direction,i.matrixWorld.getPosition());if(m>p)return j;var y, +B,E=i.geometry,w=E.vertices,I,G,O;I=i.geometry.materials;G=i.material instanceof a.MeshFaceMaterial;var F,K=l.precision;i.matrixRotationWorld.extractRotation(i.matrixWorld);b.copy(l.origin);h.getInverse(i.matrixWorld);c.copy(b);h.multiplyVector3(c);d.copy(l.direction);h.rotateAxis(d).normalize();p=0;for(y=E.faces.length;p0))){g.add(c,d.multiplyScalar(B));if(o instanceof a.Face3){m=w[o.a];B=w[o.b];O=w[o.c];if(q(g,m,B,O)){B=i.matrixWorld.multiplyVector3(g.clone());m=b.distanceTo(B);if(!(ml.far)){o={distance:m,point:B,face:o,faceIndex:p,object:i};j.push(o)}}}else if(o instanceof a.Face4){m=w[o.a];B=w[o.b];O=w[o.c];F=w[o.d];if(q(g,m,B,F)||q(g,B,O,F)){B=i.matrixWorld.multiplyVector3(g.clone());m=b.distanceTo(B);if(!(ml.far)){o={distance:m,point:B,face:o,faceIndex:p, +object:i};j.push(o)}}}}}}}}},p=function(a,b,c){for(var a=a.getDescendants(),b=0,d=a.length;be?d:e;f=f>g?f:g}a()};this.add3Points=function(e,g,l,m,n,q){if(h===true){h=false;b=el?e>n?e:n:l>n?l:n;f=g>m?g>q?g:q:m>q?m:q}else{b=el?e>n?e>d?e:d:n>d?n:d:l>n?l>d?l:d:n>d?n:d;f=g>m?g>q?g>f?g:f:q>f?q:f:m>q?m>f?m:f:q>f?q:f}a()};this.addRectangle=function(e){if(h===true){h=false;b=e.getLeft();c=e.getTop();d=e.getRight();f=e.getBottom()}else{b=be.getRight()?d:e.getRight();f=f>e.getBottom()?f:e.getBottom()}a()};this.inflate=function(e){b=b-e;c=c-e;d=d+e;f=f+e;a()};this.minSelf=function(e){b=b>e.getLeft()?b:e.getLeft();c=c>e.getTop()?c:e.getTop();d=da.getRight()||fa.getBottom()?false:true};this.empty=function(){h=true;f=d=c=b=0;a()};this.isEmpty=function(){return h}}; @@ -75,17 +75,17 @@ this.children);for(var b=0,c=this.children.length;b=0&&e>=0&&g>=0&&h>=0)return true;if(f<0&&e<0||g<0&&h<0)return false;f<0?c=Math.max(c,f/(f-e)):e<0&&(d=Math.min(d,f/(f-e)));g<0?c=Math.max(c,g/(g-h)):h<0&&(d=Math.min(d,g/(g-h))); -if(dL&&i.positionScreen.z0)){Y=l[j-2];Q.copy(M.positionScreen);K.copy(Y.positionScreen);if(d(Q,K)===true){Q.multiplyScalar(1/Q.w);K.multiplyScalar(1/K.w);if(u===y){Ja=new THREE.RenderableLine;A.push(Ja);y++;u++;v=Ja}else v=A[u++];v.v1.positionScreen.copy(Q);v.v2.positionScreen.copy(K);v.z=Math.max(Q.z,K.z);v.material=oa.material;G.elements.push(v)}}}}}g=0;for(ha=G.sprites.length;g0&&J.z<1){if(F===E){L=new THREE.RenderableParticle;x.push(L);E++;F++;B=L}else B=x[F++];B.object=oa;B.x=J.x/J.w;B.y=J.y/J.w;B.z=J.z;B.rotation=oa.rotation.z;B.scale.x=oa.scale.x*Math.abs(B.x-(J.x+h.projectionMatrix.elements[0])/(J.w+h.projectionMatrix.elements[12]));B.scale.y=oa.scale.y*Math.abs(B.y-(J.y+h.projectionMatrix.elements[5])/(J.w+h.projectionMatrix.elements[13]));B.material=oa.material; +if(dM&&i.positionScreen.z0)){Y=l[j-2];Q.copy(N.positionScreen);L.copy(Y.positionScreen);if(d(Q,L)===true){Q.multiplyScalar(1/Q.w);L.multiplyScalar(1/L.w);if(t===y){Ja=new THREE.RenderableLine;A.push(Ja);y++;t++;v=Ja}else v=A[t++];v.v1.positionScreen.copy(Q);v.v2.positionScreen.copy(L);v.z=Math.max(Q.z,L.z);v.material=oa.material;G.elements.push(v)}}}}}g=0;for(ha=G.sprites.length;g0&&F.z<1){if(E===I){M=new THREE.RenderableParticle;w.push(M);I++;E++;B=M}else B=w[E++];B.object=oa;B.x=F.x/F.w;B.y=F.y/F.w;B.z=F.z;B.rotation=oa.rotation.z;B.scale.x=oa.scale.x*Math.abs(B.x-(F.x+h.projectionMatrix.elements[0])/(F.w+h.projectionMatrix.elements[12]));B.scale.y=oa.scale.y*Math.abs(B.y-(F.y+h.projectionMatrix.elements[5])/(F.w+h.projectionMatrix.elements[13]));B.material=oa.material; G.elements.push(B)}}}m&&G.elements.sort(c);return G}};THREE.Quaternion=function(a,b,c,d){this.x=a||0;this.y=b||0;this.z=c||0;this.w=d!==void 0?d:1}; THREE.Quaternion.prototype={constructor:THREE.Quaternion,set:function(a,b,c,d){this.x=a;this.y=b;this.z=c;this.w=d;return this},copy:function(a){this.x=a.x;this.y=a.y;this.z=a.z;this.w=a.w;return this},setFromEuler:function(a,b){var c=Math.cos(a.x/2),d=Math.cos(a.y/2),f=Math.cos(a.z/2),e=Math.sin(a.x/2),g=Math.sin(a.y/2),h=Math.sin(a.z/2);if(b===void 0||b==="XYZ"){this.x=e*d*f+c*g*h;this.y=c*g*f-e*d*h;this.z=c*d*h+e*g*f;this.w=c*d*f-e*g*h}else if(b==="YXZ"){this.x=e*d*f+c*g*h;this.y=c*g*f-e*d*h;this.z= c*d*h-e*g*f;this.w=c*d*f+e*g*h}else if(b==="ZXY"){this.x=e*d*f-c*g*h;this.y=c*g*f+e*d*h;this.z=c*d*h+e*g*f;this.w=c*d*f-e*g*h}else if(b==="ZYX"){this.x=e*d*f-c*g*h;this.y=c*g*f+e*d*h;this.z=c*d*h-e*g*f;this.w=c*d*f+e*g*h}else if(b==="YZX"){this.x=e*d*f+c*g*h;this.y=c*g*f+e*d*h;this.z=c*d*h-e*g*f;this.w=c*d*f-e*g*h}else if(b==="XZY"){this.x=e*d*f-c*g*h;this.y=c*g*f-e*d*h;this.z=c*d*h+e*g*f;this.w=c*d*f+e*g*h}return this},setFromAxisAngle:function(a,b){var c=b/2,d=Math.sin(c);this.x=a.x*d;this.y=a.y* @@ -108,22 +108,22 @@ else if(c instanceof THREE.Face4)c.vertexNormals=[new THREE.Vector3,new THREE.Ve for(b=this.vertices.length;a0){var a;a=this.vertices[0];this.boundingBox.min.copy(a);this.boundingBox.max.copy(a);for(var b=this.boundingBox.min,c=this.boundingBox.max,d=1,f=this.vertices.length;dc.x)c.x= +i=g.faceNormals[c];j=g.vertexNormals[c];i.copy(f.normal);if(f instanceof THREE.Face3){j.a.copy(f.vertexNormals[0]);j.b.copy(f.vertexNormals[1]);j.c.copy(f.vertexNormals[2])}else{j.a.copy(f.vertexNormals[0]);j.b.copy(f.vertexNormals[1]);j.c.copy(f.vertexNormals[2]);j.d.copy(f.vertexNormals[3])}}}c=0;for(d=this.faces.length;c0){var a;a=this.vertices[0];this.boundingBox.min.copy(a);this.boundingBox.max.copy(a);for(var b=this.boundingBox.min,c=this.boundingBox.max,d=1,f=this.vertices.length;dc.x)c.x= a.x;if(a.yc.y)c.y=a.y;if(a.zc.z)c.z=a.z}}else{this.boundingBox.min.set(0,0,0);this.boundingBox.max.set(0,0,0)}},computeBoundingSphere:function(){var a=0;if(this.boundingSphere===null)this.boundingSphere={radius:0};for(var b=0,c=this.vertices.length;ba&&(a=d)}this.boundingSphere.radius=Math.sqrt(a)},mergeVertices:function(){var a={},b=[],c=[],d,f=Math.pow(10,4),e,g,h,i;e=0;for(g=this.vertices.length;e0;f--)if(d.indexOf(a["abcd"[f]])!==f){d.splice(f,1);this.faces[e]=new THREE.Face3(d[0],d[1],d[2],a.normal,a.color, a.materialIndex);d=0;for(h=this.faceVertexUvs.length;db.max.x)b.max.x=c;if(db.max.y)b.max.y=d;if(fb.max.z)b.max.z=f}if(a===void 0||a.length===0){this.boundingBox.min.set(0,0,0);this.boundingBox.max.set(0,0,0)}},computeBoundingSphere:function(){if(!this.boundingSphere)this.boundingSphere= {radius:0};var a=this.attributes.position.array;if(a){for(var b,c=0,d,f,e=0,g=a.length;ec&&(c=b)}this.boundingSphere.radius=Math.sqrt(c)}},computeVertexNormals:function(){if(this.attributes.position&&this.attributes.index){var a,b,c,d;a=this.attributes.position.array.length;if(this.attributes.normal===void 0)this.attributes.normal={itemSize:3,array:new Float32Array(a),numItems:a};else{a=0;for(b=this.attributes.normal.array.length;athis.points.length-2?this.points.length-1:e+1;c[3]=e>this.points.length-3?this.points.length-1: e+2;j=this.points[c[0]];l=this.points[c[1]];m=this.points[c[2]];n=this.points[c[3]];h=g*g;i=g*h;d.x=b(j.x,l.x,m.x,n.x,g,h,i);d.y=b(j.y,l.y,m.y,n.y,g,h,i);d.z=b(j.z,l.z,m.z,n.z,g,h,i);return d};this.getControlPointsArray=function(){var a,b,c=this.points.length,d=[];for(a=0;a1&&(O=new THREE.MeshFaceMaterial);c= -new THREE.Mesh(G,O);c.name=n;if(t){c.matrixAutoUpdate=false;c.matrix.set(t[0],t[1],t[2],t[3],t[4],t[5],t[6],t[7],t[8],t[9],t[10],t[11],t[12],t[13],t[14],t[15])}else{c.position.set(A[0],A[1],A[2]);if(B){c.quaternion.set(B[0],B[1],B[2],B[3]);c.useQuaternion=true}else c.rotation.set(y[0],y[1],y[2]);c.scale.set(F[0],F[1],F[2])}c.visible=r.visible;c.castShadow=r.castShadow;c.receiveShadow=r.receiveShadow;a.add(c);P.objects[n]=c}}else{A=r.position;y=r.rotation;B=r.quaternion;F=r.scale;B=0;c=new THREE.Object3D; -c.name=n;c.position.set(A[0],A[1],A[2]);if(B){c.quaternion.set(B[0],B[1],B[2],B[3]);c.useQuaternion=true}else c.rotation.set(y[0],y[1],y[2]);c.scale.set(F[0],F[1],F[2]);c.visible=r.visible!==void 0?r.visible:false;a.add(c);P.objects[n]=c;P.empties[n]=c}if(r.properties!==void 0)for(var d in r.properties)c.properties[d]=r.properties[d];r.children!==void 0&&f(c,r.children)}}function e(a){return function(b){P.geometries[a]=b;f(P.scene,C.objects);Q=Q-1;i.onLoadComplete();h()}}function g(a){return function(b){P.geometries[a]= -b}}function h(){i.callbackProgress({totalModels:H,totalTextures:X,loadedModels:H-Q,loadedTextures:X-K},P);i.onLoadProgress();Q===0&&K===0&&b(P)}var i=this,j=THREE.Loader.prototype.extractUrlBase(c),l,m,n,q,o,p,s,r,t,v,u,A,y,B,F,x,E,G,O,J,N,C,I,Q,K,H,X,P;C=a;c=new THREE.BinaryLoader;I=new THREE.JSONLoader;K=Q=0;P={scene:new THREE.Scene,geometries:{},materials:{},textures:{},objects:{},cameras:{},lights:{},fogs:{},empties:{}};if(C.transform){a=C.transform.position;v=C.transform.rotation;x=C.transform.scale; -a&&P.scene.position.set(a[0],a[1],a[2]);v&&P.scene.rotation.set(v[0],v[1],v[2]);x&&P.scene.scale.set(x[0],x[1],x[2]);if(a||v||x){P.scene.updateMatrix();P.scene.updateMatrixWorld()}}a=function(a){return function(){K=K-a;h();i.onLoadComplete()}};for(o in C.cameras){x=C.cameras[o];x.type==="perspective"?J=new THREE.PerspectiveCamera(x.fov,x.aspect,x.near,x.far):x.type==="ortho"&&(J=new THREE.OrthographicCamera(x.left,x.right,x.top,x.bottom,x.near,x.far));A=x.position;v=x.target;x=x.up;J.position.set(A[0], -A[1],A[2]);J.target=new THREE.Vector3(v[0],v[1],v[2]);x&&J.up.set(x[0],x[1],x[2]);P.cameras[o]=J}for(q in C.lights){v=C.lights[q];o=v.color!==void 0?v.color:16777215;J=v.intensity!==void 0?v.intensity:1;if(v.type==="directional"){A=v.direction;u=new THREE.DirectionalLight(o,J);u.position.set(A[0],A[1],A[2]);u.position.normalize()}else if(v.type==="point"){A=v.position;u=v.distance;u=new THREE.PointLight(o,J,u);u.position.set(A[0],A[1],A[2])}else v.type==="ambient"&&(u=new THREE.AmbientLight(o));P.scene.add(u); -P.lights[q]=u}for(p in C.fogs){q=C.fogs[p];q.type==="linear"?N=new THREE.Fog(0,q.near,q.far):q.type==="exp2"&&(N=new THREE.FogExp2(0,q.density));x=q.color;N.color.setRGB(x[0],x[1],x[2]);P.fogs[p]=N}if(P.cameras&&C.defaults.camera)P.currentCamera=P.cameras[C.defaults.camera];if(P.fogs&&C.defaults.fog)P.scene.fog=P.fogs[C.defaults.fog];x=C.defaults.bgcolor;P.bgColor=new THREE.Color;P.bgColor.setRGB(x[0],x[1],x[2]);P.bgColorAlpha=C.defaults.bgalpha;for(l in C.geometries){p=C.geometries[l];if(p.type== +THREE.SceneLoader.prototype.createScene=function(a,b,c){function d(a,b){return b=="relativeToHTML"?a:j+"/"+a}function f(a,b){var c;for(n in b)if(P.objects[n]===void 0){r=b[n];if(r.geometry!==void 0){if(G=P.geometries[r.geometry]){c=false;O=P.materials[r.materials[0]];(c=O instanceof THREE.ShaderMaterial)&&G.computeTangents();A=r.position;y=r.rotation;B=r.quaternion;E=r.scale;u=r.matrix;B=0;r.materials.length==0&&(O=new THREE.MeshFaceMaterial);r.materials.length>1&&(O=new THREE.MeshFaceMaterial);c= +new THREE.Mesh(G,O);c.name=n;if(u){c.matrixAutoUpdate=false;c.matrix.set(u[0],u[1],u[2],u[3],u[4],u[5],u[6],u[7],u[8],u[9],u[10],u[11],u[12],u[13],u[14],u[15])}else{c.position.set(A[0],A[1],A[2]);if(B){c.quaternion.set(B[0],B[1],B[2],B[3]);c.useQuaternion=true}else c.rotation.set(y[0],y[1],y[2]);c.scale.set(E[0],E[1],E[2])}c.visible=r.visible;c.castShadow=r.castShadow;c.receiveShadow=r.receiveShadow;a.add(c);P.objects[n]=c}}else{A=r.position;y=r.rotation;B=r.quaternion;E=r.scale;B=0;c=new THREE.Object3D; +c.name=n;c.position.set(A[0],A[1],A[2]);if(B){c.quaternion.set(B[0],B[1],B[2],B[3]);c.useQuaternion=true}else c.rotation.set(y[0],y[1],y[2]);c.scale.set(E[0],E[1],E[2]);c.visible=r.visible!==void 0?r.visible:false;a.add(c);P.objects[n]=c;P.empties[n]=c}if(r.properties!==void 0)for(var d in r.properties)c.properties[d]=r.properties[d];r.children!==void 0&&f(c,r.children)}}function e(a){return function(b){P.geometries[a]=b;f(P.scene,C.objects);Q=Q-1;i.onLoadComplete();h()}}function g(a){return function(b){P.geometries[a]= +b}}function h(){i.callbackProgress({totalModels:H,totalTextures:X,loadedModels:H-Q,loadedTextures:X-L},P);i.onLoadProgress();Q===0&&L===0&&b(P)}var i=this,j=THREE.Loader.prototype.extractUrlBase(c),l,m,n,q,o,p,s,r,u,v,t,A,y,B,E,w,I,G,O,F,K,C,J,Q,L,H,X,P;C=a;c=new THREE.BinaryLoader;J=new THREE.JSONLoader;L=Q=0;P={scene:new THREE.Scene,geometries:{},materials:{},textures:{},objects:{},cameras:{},lights:{},fogs:{},empties:{}};if(C.transform){a=C.transform.position;v=C.transform.rotation;w=C.transform.scale; +a&&P.scene.position.set(a[0],a[1],a[2]);v&&P.scene.rotation.set(v[0],v[1],v[2]);w&&P.scene.scale.set(w[0],w[1],w[2]);if(a||v||w){P.scene.updateMatrix();P.scene.updateMatrixWorld()}}a=function(a){return function(){L=L-a;h();i.onLoadComplete()}};for(o in C.cameras){w=C.cameras[o];w.type==="perspective"?F=new THREE.PerspectiveCamera(w.fov,w.aspect,w.near,w.far):w.type==="ortho"&&(F=new THREE.OrthographicCamera(w.left,w.right,w.top,w.bottom,w.near,w.far));A=w.position;v=w.target;w=w.up;F.position.set(A[0], +A[1],A[2]);F.target=new THREE.Vector3(v[0],v[1],v[2]);w&&F.up.set(w[0],w[1],w[2]);P.cameras[o]=F}for(q in C.lights){v=C.lights[q];o=v.color!==void 0?v.color:16777215;F=v.intensity!==void 0?v.intensity:1;if(v.type==="directional"){A=v.direction;t=new THREE.DirectionalLight(o,F);t.position.set(A[0],A[1],A[2]);t.position.normalize()}else if(v.type==="point"){A=v.position;t=v.distance;t=new THREE.PointLight(o,F,t);t.position.set(A[0],A[1],A[2])}else v.type==="ambient"&&(t=new THREE.AmbientLight(o));P.scene.add(t); +P.lights[q]=t}for(p in C.fogs){q=C.fogs[p];q.type==="linear"?K=new THREE.Fog(0,q.near,q.far):q.type==="exp2"&&(K=new THREE.FogExp2(0,q.density));w=q.color;K.color.setRGB(w[0],w[1],w[2]);P.fogs[p]=K}if(P.cameras&&C.defaults.camera)P.currentCamera=P.cameras[C.defaults.camera];if(P.fogs&&C.defaults.fog)P.scene.fog=P.fogs[C.defaults.fog];w=C.defaults.bgcolor;P.bgColor=new THREE.Color;P.bgColor.setRGB(w[0],w[1],w[2]);P.bgColorAlpha=C.defaults.bgalpha;for(l in C.geometries){p=C.geometries[l];if(p.type== "bin_mesh"||p.type=="ascii_mesh"){Q=Q+1;i.onLoadStart()}}H=Q;for(l in C.geometries){p=C.geometries[l];if(p.type==="cube"){G=new THREE.CubeGeometry(p.width,p.height,p.depth,p.segmentsWidth,p.segmentsHeight,p.segmentsDepth,null,p.flipped,p.sides);P.geometries[l]=G}else if(p.type==="plane"){G=new THREE.PlaneGeometry(p.width,p.height,p.segmentsWidth,p.segmentsHeight);P.geometries[l]=G}else if(p.type==="sphere"){G=new THREE.SphereGeometry(p.radius,p.segmentsWidth,p.segmentsHeight);P.geometries[l]=G}else if(p.type=== -"cylinder"){G=new THREE.CylinderGeometry(p.topRad,p.botRad,p.height,p.radSegs,p.heightSegs);P.geometries[l]=G}else if(p.type==="torus"){G=new THREE.TorusGeometry(p.radius,p.tube,p.segmentsR,p.segmentsT);P.geometries[l]=G}else if(p.type==="icosahedron"){G=new THREE.IcosahedronGeometry(p.radius,p.subdivisions);P.geometries[l]=G}else if(p.type==="bin_mesh")c.load(d(p.url,C.urlBaseType),e(l));else if(p.type==="ascii_mesh")I.load(d(p.url,C.urlBaseType),e(l));else if(p.type==="embedded_mesh"){p=C.embeds[p.id]; -p.metadata=C.metadata;p&&I.createModel(p,g(l),"")}}for(s in C.textures){l=C.textures[s];if(l.url instanceof Array){K=K+l.url.length;for(p=0;p0){c(THREE.NormalBlending);b(1); +2);l.width=m;l.height=n;jb.set(-q,-o,q,o);Ma.set(-q,-o,q,o);u=1;v=0;E=B=y=A=t=null};this.setClearColor=function(a,b){s.copy(a);r=b!==void 0?b:1;Ma.set(-q,-o,q,o)};this.setClearColorHex=function(a,b){s.setHex(a);r=b!==void 0?b:1;Ma.set(-q,-o,q,o)};this.clear=function(){p.setTransform(1,0,0,-1,q,o);if(Ma.isEmpty()===false){Ma.minSelf(jb);Ma.inflate(2);r<1&&p.clearRect(Math.floor(Ma.getX()),Math.floor(Ma.getY()),Math.floor(Ma.getWidth()),Math.floor(Ma.getHeight()));if(r>0){c(THREE.NormalBlending);b(1); f("rgba("+Math.floor(s.r*255)+","+Math.floor(s.g*255)+","+Math.floor(s.b*255)+","+r+")");p.fillRect(Math.floor(Ma.getX()),Math.floor(Ma.getY()),Math.floor(Ma.getWidth()),Math.floor(Ma.getHeight()))}Ma.empty()}};this.render=function(a,l){function m(a,b,c){for(var d=0,f=i.length;d255?255:f;Ya[1]=e<0?0:e>255?255:e;Ya[2]=a<0?0:a>255?255:a;Ya[4]=g<0?0:g>255?255:g;Ya[5]=h<0?0:h>255?255:h;Ya[6]=b<0?0:b>255?255:b;Ya[8]=i<0?0:i>255?255:i;Ya[9]=j<0?0:j>255?255:j;Ya[10]=c<0?0:c>255?255:c;Ya[12]=l<0?0:l>255?255:l;Ya[13]=n<0?0:n>255?255:n;Ya[14]=d<0?0:d>255?255:d;k.putImageData(gb,0,0);ib.drawImage(fb,0,0);return hb}function ec(a,b,c){a=(a-b)/(c-b);return a*a*(3-2*a)}function ic(a){a=(a+1)*0.5;return a<0?0:a>1?1:a}function Tb(a,b){var c=b.x-a.x,d= -b.y-a.y,f=c*c+d*d;if(f!==0){f=1/Math.sqrt(f);c=c*f;d=d*f;b.x=b.x+c;b.y=b.y+d;a.x=a.x-c;a.y=a.y-d}}if(l instanceof THREE.Camera===false)console.error("THREE.CanvasRenderer.render: camera is not an instance of THREE.Camera.");else{var Ub,Dc,ja,V;this.autoClear===true?this.clear():p.setTransform(1,0,0,-1,q,o);e.info.render.vertices=0;e.info.render.faces=0;g=j.projectScene(a,l,this.sortElements);h=g.elements;i=g.lights;tb=i.length>0;if(tb===true){Fa.setRGB(0,0,0);Wa.setRGB(0,0,0);Ha.setRGB(0,0,0);Ub= -0;for(Dc=i.length;Ub>1;Qc=ja.height>>1;lb=Va.scale.x*q;mb=Va.scale.y* -o;rb=lb*jc;sb=mb*Qc;Ca.set(fa.x-rb,fa.y-sb,fa.x+rb,fa.y+sb);if(jb.intersects(Ca)!==false){p.save();p.translate(fa.x,fa.y);p.rotate(-Va.rotation);p.scale(lb,-mb);p.translate(-jc,-Qc);p.drawImage(ja,0,0);p.restore()}}else if(V instanceof THREE.ParticleCanvasMaterial){rb=Va.scale.x*q;sb=Va.scale.y*o;Ca.set(fa.x-rb,fa.y-sb,fa.x+rb,fa.y+sb);if(jb.intersects(Ca)!==false){d(V.color.getContextStyle());f(V.color.getContextStyle());p.save();p.translate(fa.x,fa.y);p.rotate(-Va.rotation);p.scale(rb,sb);V.program(p); -p.restore()}}}else if(ja instanceof THREE.RenderableLine){x=ja.v1;E=ja.v2;x.positionScreen.x=x.positionScreen.x*q;x.positionScreen.y=x.positionScreen.y*o;E.positionScreen.x=E.positionScreen.x*q;E.positionScreen.y=E.positionScreen.y*o;Ca.addPoint(x.positionScreen.x,x.positionScreen.y);Ca.addPoint(E.positionScreen.x,E.positionScreen.y);if(jb.intersects(Ca)===true){fa=x;Va=E;b(V.opacity);c(V.blending);p.beginPath();p.moveTo(fa.positionScreen.x,fa.positionScreen.y);p.lineTo(Va.positionScreen.x,Va.positionScreen.y); -if(V instanceof THREE.LineBasicMaterial){fa=V.linewidth;if(y!==fa)y=p.lineWidth=fa;fa=V.linecap;if(B!==fa)B=p.lineCap=fa;fa=V.linejoin;if(F!==fa)F=p.lineJoin=fa;d(V.color.getContextStyle());p.stroke();Ca.inflate(V.linewidth*2)}}}else if(ja instanceof THREE.RenderableFace3){x=ja.v1;E=ja.v2;G=ja.v3;x.positionScreen.x=x.positionScreen.x*q;x.positionScreen.y=x.positionScreen.y*o;E.positionScreen.x=E.positionScreen.x*q;E.positionScreen.y=E.positionScreen.y*o;G.positionScreen.x=G.positionScreen.x*q;G.positionScreen.y= -G.positionScreen.y*o;if(V.overdraw===true){Tb(x.positionScreen,E.positionScreen);Tb(E.positionScreen,G.positionScreen);Tb(G.positionScreen,x.positionScreen)}Ca.add3Points(x.positionScreen.x,x.positionScreen.y,E.positionScreen.x,E.positionScreen.y,G.positionScreen.x,G.positionScreen.y);jb.intersects(Ca)===true&&n(x,E,G,0,1,2,ja,V,a)}else if(ja instanceof THREE.RenderableFace4){x=ja.v1;E=ja.v2;G=ja.v3;O=ja.v4;x.positionScreen.x=x.positionScreen.x*q;x.positionScreen.y=x.positionScreen.y*o;E.positionScreen.x= -E.positionScreen.x*q;E.positionScreen.y=E.positionScreen.y*o;G.positionScreen.x=G.positionScreen.x*q;G.positionScreen.y=G.positionScreen.y*o;O.positionScreen.x=O.positionScreen.x*q;O.positionScreen.y=O.positionScreen.y*o;J.positionScreen.copy(E.positionScreen);N.positionScreen.copy(O.positionScreen);if(V.overdraw===true){Tb(x.positionScreen,E.positionScreen);Tb(E.positionScreen,O.positionScreen);Tb(O.positionScreen,x.positionScreen);Tb(G.positionScreen,J.positionScreen);Tb(G.positionScreen,N.positionScreen)}Ca.addPoint(x.positionScreen.x, -x.positionScreen.y);Ca.addPoint(E.positionScreen.x,E.positionScreen.y);Ca.addPoint(G.positionScreen.x,G.positionScreen.y);Ca.addPoint(O.positionScreen.x,O.positionScreen.y);if(jb.intersects(Ca)===true){fa=x;Va=E;rb=G;sb=O;lb=J;mb=N;jc=a;e.info.render.vertices=e.info.render.vertices+4;e.info.render.faces++;b(V.opacity);c(V.blending);if(V.map!==void 0&&V.map!==null||V.envMap!==void 0&&V.envMap!==null){n(fa,Va,sb,0,1,3,ja,V,jc);n(lb,rb,mb,1,2,3,ja,V,jc)}else{C=fa.positionScreen.x;I=fa.positionScreen.y; -Q=Va.positionScreen.x;K=Va.positionScreen.y;H=rb.positionScreen.x;X=rb.positionScreen.y;P=sb.positionScreen.x;L=sb.positionScreen.y;ea=lb.positionScreen.x;qa=lb.positionScreen.y;ha=mb.positionScreen.x;na=mb.positionScreen.y;if(V instanceof THREE.MeshBasicMaterial){Sb(C,I,Q,K,H,X,P,L);V.wireframe===true?u(V.color,V.wireframeLinewidth,V.wireframeLinecap,V.wireframeLinejoin):s(V.color)}else if(V instanceof THREE.MeshLambertMaterial)if(tb===true)if(V.wireframe===false&&V.shading==THREE.SmoothShading&& -ja.vertexNormalsLength==4){aa.r=M.r=Y.r=ga.r=Fa.r;aa.g=M.g=Y.g=ga.g=Fa.g;aa.b=M.b=Y.b=ga.b=Fa.b;m(ja.v1.positionWorld,ja.vertexNormalsWorld[0],aa);m(ja.v2.positionWorld,ja.vertexNormalsWorld[1],M);m(ja.v4.positionWorld,ja.vertexNormalsWorld[3],Y);m(ja.v3.positionWorld,ja.vertexNormalsWorld[2],ga);aa.r=Math.max(0,Math.min(V.color.r*aa.r,1));aa.g=Math.max(0,Math.min(V.color.g*aa.g,1));aa.b=Math.max(0,Math.min(V.color.b*aa.b,1));M.r=Math.max(0,Math.min(V.color.r*M.r,1));M.g=Math.max(0,Math.min(V.color.g* -M.g,1));M.b=Math.max(0,Math.min(V.color.b*M.b,1));Y.r=Math.max(0,Math.min(V.color.r*Y.r,1));Y.g=Math.max(0,Math.min(V.color.g*Y.g,1));Y.b=Math.max(0,Math.min(V.color.b*Y.b,1));ga.r=Math.max(0,Math.min(V.color.r*ga.r,1));ga.g=Math.max(0,Math.min(V.color.g*ga.g,1));ga.b=Math.max(0,Math.min(V.color.b*ga.b,1));Ja=A(aa,M,Y,ga);r(C,I,Q,K,P,L);v(C,I,Q,K,P,L,0,0,1,0,0,1,Ja);r(ea,qa,H,X,ha,na);v(ea,qa,H,X,ha,na,1,0,1,1,0,1,Ja)}else{ba.r=Fa.r;ba.g=Fa.g;ba.b=Fa.b;m(ja.centroidWorld,ja.normalWorld,ba);ba.r=Math.max(0, -Math.min(V.color.r*ba.r,1));ba.g=Math.max(0,Math.min(V.color.g*ba.g,1));ba.b=Math.max(0,Math.min(V.color.b*ba.b,1));Sb(C,I,Q,K,H,X,P,L);V.wireframe===true?u(ba,V.wireframeLinewidth,V.wireframeLinecap,V.wireframeLinejoin):s(ba)}else{Sb(C,I,Q,K,H,X,P,L);V.wireframe===true?u(V.color,V.wireframeLinewidth,V.wireframeLinecap,V.wireframeLinejoin):s(V.color)}else if(V instanceof THREE.MeshNormalMaterial){ba.r=ic(ja.normalWorld.x);ba.g=ic(ja.normalWorld.y);ba.b=ic(ja.normalWorld.z);Sb(C,I,Q,K,H,X,P,L);V.wireframe=== -true?u(ba,V.wireframeLinewidth,V.wireframeLinecap,V.wireframeLinejoin):s(ba)}else if(V instanceof THREE.MeshDepthMaterial){ta=l.near;Da=l.far;aa.r=aa.g=aa.b=1-ec(fa.positionScreen.z,ta,Da);M.r=M.g=M.b=1-ec(Va.positionScreen.z,ta,Da);Y.r=Y.g=Y.b=1-ec(sb.positionScreen.z,ta,Da);ga.r=ga.g=ga.b=1-ec(rb.positionScreen.z,ta,Da);Ja=A(aa,M,Y,ga);r(C,I,Q,K,P,L);v(C,I,Q,K,P,L,0,0,1,0,0,1,Ja);r(ea,qa,H,X,ha,na);v(ea,qa,H,X,ha,na,1,0,1,1,0,1,Ja)}}}}Ma.addRectangle(Ca)}}p.setTransform(1,0,0,1,0,0)}}}; -THREE.ShaderChunk={fog_pars_fragment:"#ifdef USE_FOG\nuniform vec3 fogColor;\n#ifdef FOG_EXP2\nuniform float fogDensity;\n#else\nuniform float fogNear;\nuniform float fogFar;\n#endif\n#endif",fog_fragment:"#ifdef USE_FOG\nfloat depth = gl_FragCoord.z / gl_FragCoord.w;\n#ifdef FOG_EXP2\nconst float LOG2 = 1.442695;\nfloat fogFactor = exp2( - fogDensity * fogDensity * depth * depth * LOG2 );\nfogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );\n#else\nfloat fogFactor = smoothstep( fogNear, fogFar, depth );\n#endif\ngl_FragColor = mix( gl_FragColor, vec4( fogColor, gl_FragColor.w ), fogFactor );\n#endif", -envmap_pars_fragment:"#ifdef USE_ENVMAP\nuniform float reflectivity;\nuniform samplerCube envMap;\nuniform float flipEnvMap;\nuniform int combine;\n#ifdef USE_BUMPMAP\nuniform bool useRefract;\nuniform float refractionRatio;\n#else\nvarying vec3 vReflect;\n#endif\n#endif",envmap_fragment:"#ifdef USE_ENVMAP\nvec3 reflectVec;\n#ifdef USE_BUMPMAP\nvec3 cameraToVertex = normalize( vWorldPosition - cameraPosition );\nif ( useRefract ) {\nreflectVec = refract( cameraToVertex, normal, refractionRatio );\n} else { \nreflectVec = reflect( cameraToVertex, normal );\n}\n#else\nreflectVec = vReflect;\n#endif\n#ifdef DOUBLE_SIDED\nfloat flipNormal = ( -1.0 + 2.0 * float( gl_FrontFacing ) );\nvec4 cubeColor = textureCube( envMap, flipNormal * vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n#else\nvec4 cubeColor = textureCube( envMap, vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n#endif\n#ifdef GAMMA_INPUT\ncubeColor.xyz *= cubeColor.xyz;\n#endif\nif ( combine == 1 ) {\ngl_FragColor.xyz = mix( gl_FragColor.xyz, cubeColor.xyz, specularStrength * reflectivity );\n} else {\ngl_FragColor.xyz = mix( gl_FragColor.xyz, gl_FragColor.xyz * cubeColor.xyz, specularStrength * reflectivity );\n}\n#endif", +e.matrixWorld.getPosition();k=b.dot(ua.sub(h,a).normalize());if(!(k<=0)){k=k*(e.distance==0?1:1-Math.min(a.distanceTo(h)/e.distance,1));if(k!=0){k=k*e.intensity;c.r=c.r+g.r*k;c.g=c.g+g.g*k;c.b=c.b+g.b*k}}}}}function n(a,d,f,g,h,i,k,j){e.info.render.vertices=e.info.render.vertices+3;e.info.render.faces++;b(j.opacity);c(j.blending);C=a.positionScreen.x;J=a.positionScreen.y;Q=d.positionScreen.x;L=d.positionScreen.y;H=f.positionScreen.x;X=f.positionScreen.y;rc(C,J,Q,L,H,X);if(j instanceof THREE.MeshBasicMaterial)if(j.map!== +null){if(j.map.mapping instanceof THREE.UVMapping){Sa=k.uvs[0];s(C,J,Q,L,H,X,Sa[g].u,Sa[g].v,Sa[h].u,Sa[h].v,Sa[i].u,Sa[i].v,j.map)}}else if(j.envMap!==null){if(j.envMap.mapping instanceof THREE.SphericalReflectionMapping){a=l.matrixWorldInverse;ua.copy(k.vertexNormalsWorld[g]);wa=(ua.x*a.elements[0]+ua.y*a.elements[4]+ua.z*a.elements[8])*0.5+0.5;db=(ua.x*a.elements[1]+ua.y*a.elements[5]+ua.z*a.elements[9])*0.5+0.5;ua.copy(k.vertexNormalsWorld[h]);Qa=(ua.x*a.elements[0]+ua.y*a.elements[4]+ua.z*a.elements[8])* +0.5+0.5;Za=(ua.x*a.elements[1]+ua.y*a.elements[5]+ua.z*a.elements[9])*0.5+0.5;ua.copy(k.vertexNormalsWorld[i]);eb=(ua.x*a.elements[0]+ua.y*a.elements[4]+ua.z*a.elements[8])*0.5+0.5;kb=(ua.x*a.elements[1]+ua.y*a.elements[5]+ua.z*a.elements[9])*0.5+0.5;s(C,J,Q,L,H,X,wa,db,Qa,Za,eb,kb,j.envMap)}}else j.wireframe===true?t(j.color,j.wireframeLinewidth,j.wireframeLinecap,j.wireframeLinejoin):r(j.color);else if(j instanceof THREE.MeshLambertMaterial)if(tb===true)if(j.wireframe===false&&j.shading==THREE.SmoothShading&& +k.vertexNormalsLength==3){aa.r=N.r=Y.r=Fa.r;aa.g=N.g=Y.g=Fa.g;aa.b=N.b=Y.b=Fa.b;m(k.v1.positionWorld,k.vertexNormalsWorld[0],aa);m(k.v2.positionWorld,k.vertexNormalsWorld[1],N);m(k.v3.positionWorld,k.vertexNormalsWorld[2],Y);aa.r=Math.max(0,Math.min(j.color.r*aa.r,1));aa.g=Math.max(0,Math.min(j.color.g*aa.g,1));aa.b=Math.max(0,Math.min(j.color.b*aa.b,1));N.r=Math.max(0,Math.min(j.color.r*N.r,1));N.g=Math.max(0,Math.min(j.color.g*N.g,1));N.b=Math.max(0,Math.min(j.color.b*N.b,1));Y.r=Math.max(0,Math.min(j.color.r* +Y.r,1));Y.g=Math.max(0,Math.min(j.color.g*Y.g,1));Y.b=Math.max(0,Math.min(j.color.b*Y.b,1));ga.r=(N.r+Y.r)*0.5;ga.g=(N.g+Y.g)*0.5;ga.b=(N.b+Y.b)*0.5;Ja=v(aa,N,Y,ga);u(C,J,Q,L,H,X,0,0,1,0,0,1,Ja)}else{ba.r=Fa.r;ba.g=Fa.g;ba.b=Fa.b;m(k.centroidWorld,k.normalWorld,ba);ba.r=Math.max(0,Math.min(j.color.r*ba.r,1));ba.g=Math.max(0,Math.min(j.color.g*ba.g,1));ba.b=Math.max(0,Math.min(j.color.b*ba.b,1));j.wireframe===true?t(ba,j.wireframeLinewidth,j.wireframeLinecap,j.wireframeLinejoin):r(ba)}else j.wireframe=== +true?t(j.color,j.wireframeLinewidth,j.wireframeLinecap,j.wireframeLinejoin):r(j.color);else if(j instanceof THREE.MeshDepthMaterial){ta=l.near;Da=l.far;aa.r=aa.g=aa.b=1-A(a.positionScreen.z,ta,Da);N.r=N.g=N.b=1-A(d.positionScreen.z,ta,Da);Y.r=Y.g=Y.b=1-A(f.positionScreen.z,ta,Da);ga.r=(N.r+Y.r)*0.5;ga.g=(N.g+Y.g)*0.5;ga.b=(N.b+Y.b)*0.5;Ja=v(aa,N,Y,ga);u(C,J,Q,L,H,X,0,0,1,0,0,1,Ja)}else if(j instanceof THREE.MeshNormalMaterial){ba.r=hc(k.normalWorld.x);ba.g=hc(k.normalWorld.y);ba.b=hc(k.normalWorld.z); +j.wireframe===true?t(ba,j.wireframeLinewidth,j.wireframeLinecap,j.wireframeLinejoin):r(ba)}}function rc(a,b,c,d,f,e){p.beginPath();p.moveTo(a,b);p.lineTo(c,d);p.lineTo(f,e);p.closePath()}function Sb(a,b,c,d,f,e,g,h){p.beginPath();p.moveTo(a,b);p.lineTo(c,d);p.lineTo(f,e);p.lineTo(g,h);p.closePath()}function t(a,b,c,f){if(y!==b)y=p.lineWidth=b;if(B!==c)B=p.lineCap=c;if(E!==f)E=p.lineJoin=f;d(a.getContextStyle());p.stroke();Ca.inflate(b*2)}function r(a){f(a.getContextStyle());p.fill()}function s(a, +b,c,d,e,g,h,i,k,j,l,m,n){if(!(n.image===void 0||n.image.width===0)){if(n.needsUpdate===true||ra[n.id]===void 0){var o=n.wrapS==THREE.RepeatWrapping,dc=n.wrapT==THREE.RepeatWrapping;ra[n.id]=p.createPattern(n.image,o===true&&dc===true?"repeat":o===true&&dc===false?"repeat-x":o===false&&dc===true?"repeat-y":"no-repeat");n.needsUpdate=false}f(ra[n.id]);var o=n.offset.x/n.repeat.x,dc=n.offset.y/n.repeat.y,q=n.image.width*n.repeat.x,Sb=n.image.height*n.repeat.y,h=(h+o)*q,i=(1-i+dc)*Sb,c=c-a,d=d-b,e=e- +a,g=g-b,k=(k+o)*q-h,j=(1-j+dc)*Sb-i,l=(l+o)*q-h,m=(1-m+dc)*Sb-i,o=k*m-l*j;if(o===0){if(oa[n.id]===void 0){b=document.createElement("canvas");b.width=n.image.width;b.height=n.image.height;b=b.getContext("2d");b.drawImage(n.image,0,0);oa[n.id]=b.getImageData(0,0,n.image.width,n.image.height).data}b=oa[n.id];h=(Math.floor(h)+Math.floor(i)*n.image.width)*4;ba.setRGB(b[h]/255,b[h+1]/255,b[h+2]/255);r(ba)}else{o=1/o;n=(m*c-j*e)*o;j=(m*d-j*g)*o;c=(k*e-l*c)*o;d=(k*g-l*d)*o;a=a-n*h-c*i;h=b-j*h-d*i;p.save(); +p.transform(n,j,c,d,a,h);p.fill();p.restore()}}}function u(a,b,c,d,f,e,g,h,i,k,j,l,n){var m,o;m=n.width-1;o=n.height-1;g=g*m;h=h*o;c=c-a;d=d-b;f=f-a;e=e-b;i=i*m-g;k=k*o-h;j=j*m-g;l=l*o-h;o=1/(i*l-j*k);m=(l*c-k*f)*o;k=(l*d-k*e)*o;c=(i*f-j*c)*o;d=(i*e-j*d)*o;a=a-m*g-c*h;b=b-k*g-d*h;p.save();p.transform(m,k,c,d,a,b);p.clip();p.drawImage(n,0,0);p.restore()}function v(a,b,c,d){var f=a.r*255|0,e=a.g*255|0,a=a.b*255|0,g=b.r*255|0,h=b.g*255|0,b=b.b*255|0,i=c.r*255|0,j=c.g*255|0,c=c.b*255|0,l=d.r*255|0,n= +d.g*255|0,d=d.b*255|0;Ya[0]=f<0?0:f>255?255:f;Ya[1]=e<0?0:e>255?255:e;Ya[2]=a<0?0:a>255?255:a;Ya[4]=g<0?0:g>255?255:g;Ya[5]=h<0?0:h>255?255:h;Ya[6]=b<0?0:b>255?255:b;Ya[8]=i<0?0:i>255?255:i;Ya[9]=j<0?0:j>255?255:j;Ya[10]=c<0?0:c>255?255:c;Ya[12]=l<0?0:l>255?255:l;Ya[13]=n<0?0:n>255?255:n;Ya[14]=d<0?0:d>255?255:d;k.putImageData(gb,0,0);ib.drawImage(fb,0,0);return hb}function A(a,b,c){a=(a-b)/(c-b);return a*a*(3-2*a)}function hc(a){a=(a+1)*0.5;return a<0?0:a>1?1:a}function Tb(a,b){var c=b.x-a.x,d=b.y- +a.y,f=c*c+d*d;if(f!==0){f=1/Math.sqrt(f);c=c*f;d=d*f;b.x=b.x+c;b.y=b.y+d;a.x=a.x-c;a.y=a.y-d}}if(l instanceof THREE.Camera===false)console.error("THREE.CanvasRenderer.render: camera is not an instance of THREE.Camera.");else{var Ub,Dc,ja,V;this.autoClear===true?this.clear():p.setTransform(1,0,0,-1,q,o);e.info.render.vertices=0;e.info.render.faces=0;g=j.projectScene(a,l,this.sortElements);h=g.elements;i=g.lights;tb=i.length>0;if(tb===true){Fa.setRGB(0,0,0);Wa.setRGB(0,0,0);Ha.setRGB(0,0,0);Ub=0;for(Dc= +i.length;Ub>1;Qc=ja.height>>1;lb=Va.scale.x*q;mb=Va.scale.y* +o;rb=lb*ic;sb=mb*Qc;Ca.set(fa.x-rb,fa.y-sb,fa.x+rb,fa.y+sb);if(jb.intersects(Ca)!==false){p.save();p.translate(fa.x,fa.y);p.rotate(-Va.rotation);p.scale(lb,-mb);p.translate(-ic,-Qc);p.drawImage(ja,0,0);p.restore()}}else if(V instanceof THREE.ParticleCanvasMaterial){rb=Va.scale.x*q;sb=Va.scale.y*o;Ca.set(fa.x-rb,fa.y-sb,fa.x+rb,fa.y+sb);if(jb.intersects(Ca)!==false){d(V.color.getContextStyle());f(V.color.getContextStyle());p.save();p.translate(fa.x,fa.y);p.rotate(-Va.rotation);p.scale(rb,sb);V.program(p); +p.restore()}}}else if(ja instanceof THREE.RenderableLine){w=ja.v1;I=ja.v2;w.positionScreen.x=w.positionScreen.x*q;w.positionScreen.y=w.positionScreen.y*o;I.positionScreen.x=I.positionScreen.x*q;I.positionScreen.y=I.positionScreen.y*o;Ca.addPoint(w.positionScreen.x,w.positionScreen.y);Ca.addPoint(I.positionScreen.x,I.positionScreen.y);if(jb.intersects(Ca)===true){fa=w;Va=I;b(V.opacity);c(V.blending);p.beginPath();p.moveTo(fa.positionScreen.x,fa.positionScreen.y);p.lineTo(Va.positionScreen.x,Va.positionScreen.y); +if(V instanceof THREE.LineBasicMaterial){fa=V.linewidth;if(y!==fa)y=p.lineWidth=fa;fa=V.linecap;if(B!==fa)B=p.lineCap=fa;fa=V.linejoin;if(E!==fa)E=p.lineJoin=fa;d(V.color.getContextStyle());p.stroke();Ca.inflate(V.linewidth*2)}}}else if(ja instanceof THREE.RenderableFace3){w=ja.v1;I=ja.v2;G=ja.v3;w.positionScreen.x=w.positionScreen.x*q;w.positionScreen.y=w.positionScreen.y*o;I.positionScreen.x=I.positionScreen.x*q;I.positionScreen.y=I.positionScreen.y*o;G.positionScreen.x=G.positionScreen.x*q;G.positionScreen.y= +G.positionScreen.y*o;if(V.overdraw===true){Tb(w.positionScreen,I.positionScreen);Tb(I.positionScreen,G.positionScreen);Tb(G.positionScreen,w.positionScreen)}Ca.add3Points(w.positionScreen.x,w.positionScreen.y,I.positionScreen.x,I.positionScreen.y,G.positionScreen.x,G.positionScreen.y);jb.intersects(Ca)===true&&n(w,I,G,0,1,2,ja,V,a)}else if(ja instanceof THREE.RenderableFace4){w=ja.v1;I=ja.v2;G=ja.v3;O=ja.v4;w.positionScreen.x=w.positionScreen.x*q;w.positionScreen.y=w.positionScreen.y*o;I.positionScreen.x= +I.positionScreen.x*q;I.positionScreen.y=I.positionScreen.y*o;G.positionScreen.x=G.positionScreen.x*q;G.positionScreen.y=G.positionScreen.y*o;O.positionScreen.x=O.positionScreen.x*q;O.positionScreen.y=O.positionScreen.y*o;F.positionScreen.copy(I.positionScreen);K.positionScreen.copy(O.positionScreen);if(V.overdraw===true){Tb(w.positionScreen,I.positionScreen);Tb(I.positionScreen,O.positionScreen);Tb(O.positionScreen,w.positionScreen);Tb(G.positionScreen,F.positionScreen);Tb(G.positionScreen,K.positionScreen)}Ca.addPoint(w.positionScreen.x, +w.positionScreen.y);Ca.addPoint(I.positionScreen.x,I.positionScreen.y);Ca.addPoint(G.positionScreen.x,G.positionScreen.y);Ca.addPoint(O.positionScreen.x,O.positionScreen.y);if(jb.intersects(Ca)===true){fa=w;Va=I;rb=G;sb=O;lb=F;mb=K;ic=a;e.info.render.vertices=e.info.render.vertices+4;e.info.render.faces++;b(V.opacity);c(V.blending);if(V.map!==void 0&&V.map!==null||V.envMap!==void 0&&V.envMap!==null){n(fa,Va,sb,0,1,3,ja,V,ic);n(lb,rb,mb,1,2,3,ja,V,ic)}else{C=fa.positionScreen.x;J=fa.positionScreen.y; +Q=Va.positionScreen.x;L=Va.positionScreen.y;H=rb.positionScreen.x;X=rb.positionScreen.y;P=sb.positionScreen.x;M=sb.positionScreen.y;ea=lb.positionScreen.x;qa=lb.positionScreen.y;ha=mb.positionScreen.x;na=mb.positionScreen.y;if(V instanceof THREE.MeshBasicMaterial){Sb(C,J,Q,L,H,X,P,M);V.wireframe===true?t(V.color,V.wireframeLinewidth,V.wireframeLinecap,V.wireframeLinejoin):r(V.color)}else if(V instanceof THREE.MeshLambertMaterial)if(tb===true)if(V.wireframe===false&&V.shading==THREE.SmoothShading&& +ja.vertexNormalsLength==4){aa.r=N.r=Y.r=ga.r=Fa.r;aa.g=N.g=Y.g=ga.g=Fa.g;aa.b=N.b=Y.b=ga.b=Fa.b;m(ja.v1.positionWorld,ja.vertexNormalsWorld[0],aa);m(ja.v2.positionWorld,ja.vertexNormalsWorld[1],N);m(ja.v4.positionWorld,ja.vertexNormalsWorld[3],Y);m(ja.v3.positionWorld,ja.vertexNormalsWorld[2],ga);aa.r=Math.max(0,Math.min(V.color.r*aa.r,1));aa.g=Math.max(0,Math.min(V.color.g*aa.g,1));aa.b=Math.max(0,Math.min(V.color.b*aa.b,1));N.r=Math.max(0,Math.min(V.color.r*N.r,1));N.g=Math.max(0,Math.min(V.color.g* +N.g,1));N.b=Math.max(0,Math.min(V.color.b*N.b,1));Y.r=Math.max(0,Math.min(V.color.r*Y.r,1));Y.g=Math.max(0,Math.min(V.color.g*Y.g,1));Y.b=Math.max(0,Math.min(V.color.b*Y.b,1));ga.r=Math.max(0,Math.min(V.color.r*ga.r,1));ga.g=Math.max(0,Math.min(V.color.g*ga.g,1));ga.b=Math.max(0,Math.min(V.color.b*ga.b,1));Ja=v(aa,N,Y,ga);rc(C,J,Q,L,P,M);u(C,J,Q,L,P,M,0,0,1,0,0,1,Ja);rc(ea,qa,H,X,ha,na);u(ea,qa,H,X,ha,na,1,0,1,1,0,1,Ja)}else{ba.r=Fa.r;ba.g=Fa.g;ba.b=Fa.b;m(ja.centroidWorld,ja.normalWorld,ba);ba.r= +Math.max(0,Math.min(V.color.r*ba.r,1));ba.g=Math.max(0,Math.min(V.color.g*ba.g,1));ba.b=Math.max(0,Math.min(V.color.b*ba.b,1));Sb(C,J,Q,L,H,X,P,M);V.wireframe===true?t(ba,V.wireframeLinewidth,V.wireframeLinecap,V.wireframeLinejoin):r(ba)}else{Sb(C,J,Q,L,H,X,P,M);V.wireframe===true?t(V.color,V.wireframeLinewidth,V.wireframeLinecap,V.wireframeLinejoin):r(V.color)}else if(V instanceof THREE.MeshNormalMaterial){ba.r=hc(ja.normalWorld.x);ba.g=hc(ja.normalWorld.y);ba.b=hc(ja.normalWorld.z);Sb(C,J,Q,L,H, +X,P,M);V.wireframe===true?t(ba,V.wireframeLinewidth,V.wireframeLinecap,V.wireframeLinejoin):r(ba)}else if(V instanceof THREE.MeshDepthMaterial){ta=l.near;Da=l.far;aa.r=aa.g=aa.b=1-A(fa.positionScreen.z,ta,Da);N.r=N.g=N.b=1-A(Va.positionScreen.z,ta,Da);Y.r=Y.g=Y.b=1-A(sb.positionScreen.z,ta,Da);ga.r=ga.g=ga.b=1-A(rb.positionScreen.z,ta,Da);Ja=v(aa,N,Y,ga);rc(C,J,Q,L,P,M);u(C,J,Q,L,P,M,0,0,1,0,0,1,Ja);rc(ea,qa,H,X,ha,na);u(ea,qa,H,X,ha,na,1,0,1,1,0,1,Ja)}}}}Ma.addRectangle(Ca)}}p.setTransform(1,0,0, +1,0,0)}}}; +THREE.ShaderChunk={fog_pars_fragment:"#ifdef USE_FOG\nuniform vec3 fogColor;\n#ifdef FOG_EXP2\nuniform float fogDensity;\n#else\nuniform float fogNear;\nuniform float fogFar;\n#endif\n#endif",fog_fragment:"#ifdef USE_FOG\nfloat depth = gl_FragCoord.z / gl_FragCoord.w;\n#ifdef FOG_EXP2\nconst float LOG2 = 1.442695;\nfloat fogFactor = exp2( - fogDensity * fogDensity * depth * depth * LOG2 );\nfogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );\n#else\nfloat fogFactor = smoothstep( fogNear, fogFar, depth );\n#endif\ngl_FragColor = mix( gl_FragColor, vec4( fogColor, gl_FragColor.w ), fogFactor );\n#endif",envmap_pars_fragment:"#ifdef USE_ENVMAP\nuniform float reflectivity;\nuniform samplerCube envMap;\nuniform float flipEnvMap;\nuniform int combine;\n#ifdef USE_BUMPMAP\nuniform bool useRefract;\nuniform float refractionRatio;\n#else\nvarying vec3 vReflect;\n#endif\n#endif", +envmap_fragment:"#ifdef USE_ENVMAP\nvec3 reflectVec;\n#ifdef USE_BUMPMAP\nvec3 cameraToVertex = normalize( vWorldPosition - cameraPosition );\nif ( useRefract ) {\nreflectVec = refract( cameraToVertex, normal, refractionRatio );\n} else { \nreflectVec = reflect( cameraToVertex, normal );\n}\n#else\nreflectVec = vReflect;\n#endif\n#ifdef DOUBLE_SIDED\nfloat flipNormal = ( -1.0 + 2.0 * float( gl_FrontFacing ) );\nvec4 cubeColor = textureCube( envMap, flipNormal * vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n#else\nvec4 cubeColor = textureCube( envMap, vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n#endif\n#ifdef GAMMA_INPUT\ncubeColor.xyz *= cubeColor.xyz;\n#endif\nif ( combine == 1 ) {\ngl_FragColor.xyz = mix( gl_FragColor.xyz, cubeColor.xyz, specularStrength * reflectivity );\n} else {\ngl_FragColor.xyz = mix( gl_FragColor.xyz, gl_FragColor.xyz * cubeColor.xyz, specularStrength * reflectivity );\n}\n#endif", envmap_pars_vertex:"#if defined( USE_ENVMAP ) && ! defined( USE_BUMPMAP )\nvarying vec3 vReflect;\nuniform float refractionRatio;\nuniform bool useRefract;\n#endif",worldpos_vertex:"#if defined( USE_ENVMAP ) || defined( PHONG ) || defined( LAMBERT ) || defined ( USE_SHADOWMAP )\n#ifdef USE_SKINNING\nvec4 mPosition = modelMatrix * skinned;\n#endif\n#if defined( USE_MORPHTARGETS ) && ! defined( USE_SKINNING )\nvec4 mPosition = modelMatrix * vec4( morphed, 1.0 );\n#endif\n#if ! defined( USE_MORPHTARGETS ) && ! defined( USE_SKINNING )\nvec4 mPosition = modelMatrix * vec4( position, 1.0 );\n#endif\n#endif", envmap_vertex:"#if defined( USE_ENVMAP ) && ! defined( USE_BUMPMAP )\nvec3 nWorld = mat3( modelMatrix[ 0 ].xyz, modelMatrix[ 1 ].xyz, modelMatrix[ 2 ].xyz ) * objectNormal;\nif ( useRefract ) {\nvReflect = refract( normalize( mPosition.xyz - cameraPosition ), normalize( nWorld.xyz ), refractionRatio );\n} else {\nvReflect = reflect( normalize( mPosition.xyz - cameraPosition ), normalize( nWorld.xyz ) );\n}\n#endif",map_particle_pars_fragment:"#ifdef USE_MAP\nuniform sampler2D map;\n#endif",map_particle_fragment:"#ifdef USE_MAP\ngl_FragColor = gl_FragColor * texture2D( map, vec2( gl_PointCoord.x, 1.0 - gl_PointCoord.y ) );\n#endif", map_pars_vertex:"#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_SPECULARMAP )\nvarying vec2 vUv;\nuniform vec4 offsetRepeat;\n#endif",map_pars_fragment:"#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_SPECULARMAP )\nvarying vec2 vUv;\n#endif\n#ifdef USE_MAP\nuniform sampler2D map;\n#endif",map_vertex:"#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_SPECULARMAP )\nvUv = uv * offsetRepeat.zw + offsetRepeat.xy;\n#endif",map_fragment:"#ifdef USE_MAP\n#ifdef GAMMA_INPUT\nvec4 texelColor = texture2D( map, vUv );\ntexelColor.xyz *= texelColor.xyz;\ngl_FragColor = gl_FragColor * texelColor;\n#else\ngl_FragColor = gl_FragColor * texture2D( map, vUv );\n#endif\n#endif", @@ -331,47 +332,47 @@ f,e,g,h=a.vertices;g=h.length;var i=a.colors,j=i.length,l=a.__vertexArray,n=a.__ for(j=q.length;i=0;c--)a[c].object===b&&a.splice(c,1)}function p(a,b){for(var c=a.length-1;c>=0;c--)a[c]===b&&a.splice(c,1)}function s(a,b,c,d,f){if(d.needsUpdate){d.program&&H.deallocateMaterial(d);H.initMaterial(d,b,c,f);d.needsUpdate=false}if(d.morphTargets&&!f.__webglMorphTargetInfluences)f.__webglMorphTargetInfluences=new Float32Array(H.maxMorphTargets);var e=false,g=d.program,h=g.uniforms,i=d.uniforms;if(g!==L){k.useProgram(g);L=g;e=true}if(d.id!==qa){qa=d.id;e= -true}if(e||a!==na){k.uniformMatrix4fv(h.projectionMatrix,false,a._projectionMatrixArray);a!==na&&(na=a)}if(e){if(c&&d.fog){i.fogColor.value=c.color;if(c instanceof THREE.Fog){i.fogNear.value=c.near;i.fogFar.value=c.far}else if(c instanceof THREE.FogExp2)i.fogDensity.value=c.density}if(d instanceof THREE.MeshPhongMaterial||d instanceof THREE.MeshLambertMaterial||d.lights){if(ua){for(var j,l=0,n=0,m=0,o,p,q,r=fb,u=r.directional.colors,s=r.directional.positions,t=r.point.colors,v=r.point.positions,y= -r.point.distances,B=r.spot.colors,C=r.spot.positions,G=r.spot.distances,E=r.spot.directions,I=r.spot.angles,J=r.spot.exponents,M=0,P=0,O=0,K=q=0,c=K=0,e=b.length;c=0;c--)a[c].object===b&&a.splice(c,1)}function p(a,b){for(var c=a.length-1;c>=0;c--)a[c]===b&&a.splice(c,1)}function s(a,b,c,d,f){if(d.needsUpdate){d.program&&H.deallocateMaterial(d);H.initMaterial(d,b,c,f);d.needsUpdate=false}if(d.morphTargets&&!f.__webglMorphTargetInfluences)f.__webglMorphTargetInfluences=new Float32Array(H.maxMorphTargets);var e=false,g=d.program,h=g.uniforms,i=d.uniforms;if(g!==M){k.useProgram(g);M=g;e=true}if(d.id!==qa){qa=d.id;e= +true}if(e||a!==na){k.uniformMatrix4fv(h.projectionMatrix,false,a._projectionMatrixArray);a!==na&&(na=a)}if(e){if(c&&d.fog){i.fogColor.value=c.color;if(c instanceof THREE.Fog){i.fogNear.value=c.near;i.fogFar.value=c.far}else if(c instanceof THREE.FogExp2)i.fogDensity.value=c.density}if(d instanceof THREE.MeshPhongMaterial||d instanceof THREE.MeshLambertMaterial||d.lights){if(ua){for(var j,l=0,n=0,m=0,o,p,q,t=fb,r=t.directional.colors,s=t.directional.positions,u=t.point.colors,v=t.point.positions,y= +t.point.distances,B=t.spot.colors,C=t.spot.positions,G=t.spot.distances,F=t.spot.directions,I=t.spot.angles,J=t.spot.exponents,N=0,O=0,P=0,K=q=0,c=K=0,e=b.length;c1||b.__oldAnisotropy)){k.texParameterf(a, +null&&k.uniformMatrix4fv(h.boneGlobalMatrices,false,f.boneMatrices);k.uniformMatrix4fv(h.modelViewMatrix,false,f._modelViewMatrix.elements);h.normalMatrix&&k.uniformMatrix3fv(h.normalMatrix,false,f._normalMatrix.elements);h.modelMatrix!==null&&k.uniformMatrix4fv(h.modelMatrix,false,f.matrixWorld.elements);return g}function r(a,b){a._modelViewMatrix.multiply(b.matrixWorldInverse,a.matrixWorld);a._normalMatrix.getInverse(a._modelViewMatrix);a._normalMatrix.transpose()}function u(a,b,c){if(Ja!==a){a? +k.enable(k.POLYGON_OFFSET_FILL):k.disable(k.POLYGON_OFFSET_FILL);Ja=a}if(a&&(Sa!==b||wa!==c)){k.polygonOffset(b,c);Sa=b;wa=c}}function v(a){for(var a=a.split("\n"),b=0,c=a.length;b1||b.__oldAnisotropy)){k.texParameterf(a, gb.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(b.anisotropy,ib));b.__oldAnisotropy=b.anisotropy}}function y(a,b){k.bindRenderbuffer(k.RENDERBUFFER,a);if(b.depthBuffer&&!b.stencilBuffer){k.renderbufferStorage(k.RENDERBUFFER,k.DEPTH_COMPONENT16,b.width,b.height);k.framebufferRenderbuffer(k.FRAMEBUFFER,k.DEPTH_ATTACHMENT,k.RENDERBUFFER,a)}else if(b.depthBuffer&&b.stencilBuffer){k.renderbufferStorage(k.RENDERBUFFER,k.DEPTH_STENCIL,b.width,b.height);k.framebufferRenderbuffer(k.FRAMEBUFFER,k.DEPTH_STENCIL_ATTACHMENT, -k.RENDERBUFFER,a)}else k.renderbufferStorage(k.RENDERBUFFER,k.RGBA4,b.width,b.height)}function B(a){return a===THREE.NearestFilter||a===THREE.NearestMipMapNearestFilter||a===THREE.NearestMipMapLinearFilter?k.NEAREST:k.LINEAR}function F(a){return a===THREE.RepeatWrapping?k.REPEAT:a===THREE.ClampToEdgeWrapping?k.CLAMP_TO_EDGE:a===THREE.MirroredRepeatWrapping?k.MIRRORED_REPEAT:a===THREE.NearestFilter?k.NEAREST:a===THREE.NearestMipMapNearestFilter?k.NEAREST_MIPMAP_NEAREST:a===THREE.NearestMipMapLinearFilter? +k.RENDERBUFFER,a)}else k.renderbufferStorage(k.RENDERBUFFER,k.RGBA4,b.width,b.height)}function B(a){return a===THREE.NearestFilter||a===THREE.NearestMipMapNearestFilter||a===THREE.NearestMipMapLinearFilter?k.NEAREST:k.LINEAR}function E(a){return a===THREE.RepeatWrapping?k.REPEAT:a===THREE.ClampToEdgeWrapping?k.CLAMP_TO_EDGE:a===THREE.MirroredRepeatWrapping?k.MIRRORED_REPEAT:a===THREE.NearestFilter?k.NEAREST:a===THREE.NearestMipMapNearestFilter?k.NEAREST_MIPMAP_NEAREST:a===THREE.NearestMipMapLinearFilter? k.NEAREST_MIPMAP_LINEAR:a===THREE.LinearFilter?k.LINEAR:a===THREE.LinearMipMapNearestFilter?k.LINEAR_MIPMAP_NEAREST:a===THREE.LinearMipMapLinearFilter?k.LINEAR_MIPMAP_LINEAR:a===THREE.UnsignedByteType?k.UNSIGNED_BYTE:a===THREE.UnsignedShort4444Type?k.UNSIGNED_SHORT_4_4_4_4:a===THREE.UnsignedShort5551Type?k.UNSIGNED_SHORT_5_5_5_1:a===THREE.UnsignedShort565Type?k.UNSIGNED_SHORT_5_6_5:a===THREE.ByteType?k.BYTE:a===THREE.ShortType?k.SHORT:a===THREE.UnsignedShortType?k.UNSIGNED_SHORT:a===THREE.IntType? k.INT:a===THREE.UnsignedIntType?k.UNSIGNED_INT:a===THREE.FloatType?k.FLOAT:a===THREE.AlphaFormat?k.ALPHA:a===THREE.RGBFormat?k.RGB:a===THREE.RGBAFormat?k.RGBA:a===THREE.LuminanceFormat?k.LUMINANCE:a===THREE.LuminanceAlphaFormat?k.LUMINANCE_ALPHA:a===THREE.AddEquation?k.FUNC_ADD:a===THREE.SubtractEquation?k.FUNC_SUBTRACT:a===THREE.ReverseSubtractEquation?k.FUNC_REVERSE_SUBTRACT:a===THREE.ZeroFactor?k.ZERO:a===THREE.OneFactor?k.ONE:a===THREE.SrcColorFactor?k.SRC_COLOR:a===THREE.OneMinusSrcColorFactor? -k.ONE_MINUS_SRC_COLOR:a===THREE.SrcAlphaFactor?k.SRC_ALPHA:a===THREE.OneMinusSrcAlphaFactor?k.ONE_MINUS_SRC_ALPHA:a===THREE.DstAlphaFactor?k.DST_ALPHA:a===THREE.OneMinusDstAlphaFactor?k.ONE_MINUS_DST_ALPHA:a===THREE.DstColorFactor?k.DST_COLOR:a===THREE.OneMinusDstColorFactor?k.ONE_MINUS_DST_COLOR:a===THREE.SrcAlphaSaturateFactor?k.SRC_ALPHA_SATURATE:0}console.log("THREE.WebGLRenderer",THREE.REVISION);var a=a||{},x=a.canvas!==void 0?a.canvas:document.createElement("canvas"),E=a.precision!==void 0? -a.precision:"highp",G=a.alpha!==void 0?a.alpha:true,O=a.premultipliedAlpha!==void 0?a.premultipliedAlpha:true,J=a.antialias!==void 0?a.antialias:false,N=a.stencil!==void 0?a.stencil:true,C=a.preserveDrawingBuffer!==void 0?a.preserveDrawingBuffer:false,I=a.clearColor!==void 0?new THREE.Color(a.clearColor):new THREE.Color(0),Q=a.clearAlpha!==void 0?a.clearAlpha:0,K=a.maxLights!==void 0?a.maxLights:4;this.domElement=x;this.context=null;this.autoUpdateScene=this.autoUpdateObjects=this.sortObjects=this.autoClearStencil= +k.ONE_MINUS_SRC_COLOR:a===THREE.SrcAlphaFactor?k.SRC_ALPHA:a===THREE.OneMinusSrcAlphaFactor?k.ONE_MINUS_SRC_ALPHA:a===THREE.DstAlphaFactor?k.DST_ALPHA:a===THREE.OneMinusDstAlphaFactor?k.ONE_MINUS_DST_ALPHA:a===THREE.DstColorFactor?k.DST_COLOR:a===THREE.OneMinusDstColorFactor?k.ONE_MINUS_DST_COLOR:a===THREE.SrcAlphaSaturateFactor?k.SRC_ALPHA_SATURATE:0}console.log("THREE.WebGLRenderer",THREE.REVISION);var a=a||{},w=a.canvas!==void 0?a.canvas:document.createElement("canvas"),I=a.precision!==void 0? +a.precision:"highp",G=a.alpha!==void 0?a.alpha:true,O=a.premultipliedAlpha!==void 0?a.premultipliedAlpha:true,F=a.antialias!==void 0?a.antialias:false,K=a.stencil!==void 0?a.stencil:true,C=a.preserveDrawingBuffer!==void 0?a.preserveDrawingBuffer:false,J=a.clearColor!==void 0?new THREE.Color(a.clearColor):new THREE.Color(0),Q=a.clearAlpha!==void 0?a.clearAlpha:0,L=a.maxLights!==void 0?a.maxLights:4;this.domElement=w;this.context=null;this.autoUpdateScene=this.autoUpdateObjects=this.sortObjects=this.autoClearStencil= this.autoClearDepth=this.autoClearColor=this.autoClear=true;this.shadowMapEnabled=this.physicallyBasedShading=this.gammaOutput=this.gammaInput=false;this.shadowMapCullFrontFaces=this.shadowMapSoft=this.shadowMapAutoUpdate=true;this.shadowMapCascade=this.shadowMapDebug=false;this.maxMorphTargets=8;this.maxMorphNormals=4;this.autoScaleCubemaps=true;this.renderPluginsPre=[];this.renderPluginsPost=[];this.info={memory:{programs:0,geometries:0,textures:0},render:{calls:0,vertices:0,faces:0,points:0}}; -var H=this,X=[],P=0,L=null,ea=null,qa=-1,ha=null,na=null,ba=0,aa=-1,M=-1,Y=-1,ga=-1,ra=-1,oa=-1,ta=-1,Da=-1,Ja=null,Sa=null,wa=null,db=null,Qa=0,Za=0,eb=0,kb=0,jb=0,Ma=0,Ca=new THREE.Frustum,tb=new THREE.Matrix4,Fa=new THREE.Matrix4,Wa=new THREE.Vector4,Ha=new THREE.Vector3,ua=true,fb={ambient:[0,0,0],directional:{length:0,colors:[],positions:[]},point:{length:0,colors:[],positions:[],distances:[]},spot:{length:0,colors:[],positions:[],distances:[],directions:[],angles:[],exponents:[]}},k,gb;try{if(!(k= -x.getContext("experimental-webgl",{alpha:G,premultipliedAlpha:O,antialias:J,stencil:N,preserveDrawingBuffer:C})))throw"Error creating WebGL context.";}catch(Ya){console.error(Ya)}a=k.getExtension("OES_texture_float");G=k.getExtension("OES_standard_derivatives");gb=k.getExtension("EXT_texture_filter_anisotropic")||k.getExtension("MOZ_EXT_texture_filter_anisotropic")||k.getExtension("WEBKIT_EXT_texture_filter_anisotropic");a||console.log("THREE.WebGLRenderer: Float textures not supported.");G||console.log("THREE.WebGLRenderer: Standard derivatives not supported."); -gb||console.log("THREE.WebGLRenderer: Anisotropic texture filtering not supported.");k.clearColor(0,0,0,1);k.clearDepth(1);k.clearStencil(0);k.enable(k.DEPTH_TEST);k.depthFunc(k.LEQUAL);k.frontFace(k.CCW);k.cullFace(k.BACK);k.enable(k.CULL_FACE);k.enable(k.BLEND);k.blendEquation(k.FUNC_ADD);k.blendFunc(k.SRC_ALPHA,k.ONE_MINUS_SRC_ALPHA);k.clearColor(I.r,I.g,I.b,Q);this.context=k;G=k.getParameter(k.MAX_VERTEX_TEXTURE_IMAGE_UNITS);k.getParameter(k.MAX_TEXTURE_SIZE);var hb=k.getParameter(k.MAX_CUBE_MAP_TEXTURE_SIZE), -ib=gb?k.getParameter(gb.MAX_TEXTURE_MAX_ANISOTROPY_EXT):0,rc=G>0,cc=rc&&a;this.getContext=function(){return k};this.supportsVertexTextures=function(){return rc};this.getMaxAnisotropy=function(){return ib};this.setSize=function(a,b){x.width=a;x.height=b;this.setViewport(0,0,x.width,x.height)};this.setViewport=function(a,b,c,d){Qa=a!==void 0?a:0;Za=b!==void 0?b:0;eb=c!==void 0?c:x.width;kb=d!==void 0?d:x.height;k.viewport(Qa,Za,eb,kb)};this.setScissor=function(a,b,c,d){k.scissor(a,b,c,d)};this.enableScissorTest= -function(a){a?k.enable(k.SCISSOR_TEST):k.disable(k.SCISSOR_TEST)};this.setClearColorHex=function(a,b){I.setHex(a);Q=b;k.clearColor(I.r,I.g,I.b,Q)};this.setClearColor=function(a,b){I.copy(a);Q=b;k.clearColor(I.r,I.g,I.b,Q)};this.getClearColor=function(){return I};this.getClearAlpha=function(){return Q};this.clear=function(a,b,c){var d=0;if(a===void 0||a)d=d|k.COLOR_BUFFER_BIT;if(b===void 0||b)d=d|k.DEPTH_BUFFER_BIT;if(c===void 0||c)d=d|k.STENCIL_BUFFER_BIT;k.clear(d)};this.clearTarget=function(a,b, +var H=this,X=[],P=0,M=null,ea=null,qa=-1,ha=null,na=null,ba=0,aa=-1,N=-1,Y=-1,ga=-1,ra=-1,oa=-1,ta=-1,Da=-1,Ja=null,Sa=null,wa=null,db=null,Qa=0,Za=0,eb=0,kb=0,jb=0,Ma=0,Ca=new THREE.Frustum,tb=new THREE.Matrix4,Fa=new THREE.Matrix4,Wa=new THREE.Vector4,Ha=new THREE.Vector3,ua=true,fb={ambient:[0,0,0],directional:{length:0,colors:[],positions:[]},point:{length:0,colors:[],positions:[],distances:[]},spot:{length:0,colors:[],positions:[],distances:[],directions:[],angles:[],exponents:[]}},k,gb;try{if(!(k= +w.getContext("experimental-webgl",{alpha:G,premultipliedAlpha:O,antialias:F,stencil:K,preserveDrawingBuffer:C})))throw"Error creating WebGL context.";}catch(Ya){console.error(Ya)}a=k.getExtension("OES_texture_float");G=k.getExtension("OES_standard_derivatives");gb=k.getExtension("EXT_texture_filter_anisotropic")||k.getExtension("MOZ_EXT_texture_filter_anisotropic")||k.getExtension("WEBKIT_EXT_texture_filter_anisotropic");a||console.log("THREE.WebGLRenderer: Float textures not supported.");G||console.log("THREE.WebGLRenderer: Standard derivatives not supported."); +gb||console.log("THREE.WebGLRenderer: Anisotropic texture filtering not supported.");k.clearColor(0,0,0,1);k.clearDepth(1);k.clearStencil(0);k.enable(k.DEPTH_TEST);k.depthFunc(k.LEQUAL);k.frontFace(k.CCW);k.cullFace(k.BACK);k.enable(k.CULL_FACE);k.enable(k.BLEND);k.blendEquation(k.FUNC_ADD);k.blendFunc(k.SRC_ALPHA,k.ONE_MINUS_SRC_ALPHA);k.clearColor(J.r,J.g,J.b,Q);this.context=k;G=k.getParameter(k.MAX_VERTEX_TEXTURE_IMAGE_UNITS);k.getParameter(k.MAX_TEXTURE_SIZE);var hb=k.getParameter(k.MAX_CUBE_MAP_TEXTURE_SIZE), +ib=gb?k.getParameter(gb.MAX_TEXTURE_MAX_ANISOTROPY_EXT):0,qc=G>0,cc=qc&&a;this.getContext=function(){return k};this.supportsVertexTextures=function(){return qc};this.getMaxAnisotropy=function(){return ib};this.setSize=function(a,b){w.width=a;w.height=b;this.setViewport(0,0,w.width,w.height)};this.setViewport=function(a,b,c,d){Qa=a!==void 0?a:0;Za=b!==void 0?b:0;eb=c!==void 0?c:w.width;kb=d!==void 0?d:w.height;k.viewport(Qa,Za,eb,kb)};this.setScissor=function(a,b,c,d){k.scissor(a,b,c,d)};this.enableScissorTest= +function(a){a?k.enable(k.SCISSOR_TEST):k.disable(k.SCISSOR_TEST)};this.setClearColorHex=function(a,b){J.setHex(a);Q=b;k.clearColor(J.r,J.g,J.b,Q)};this.setClearColor=function(a,b){J.copy(a);Q=b;k.clearColor(J.r,J.g,J.b,Q)};this.getClearColor=function(){return J};this.getClearAlpha=function(){return Q};this.clear=function(a,b,c){var d=0;if(a===void 0||a)d=d|k.COLOR_BUFFER_BIT;if(b===void 0||b)d=d|k.DEPTH_BUFFER_BIT;if(c===void 0||c)d=d|k.STENCIL_BUFFER_BIT;k.clear(d)};this.clearTarget=function(a,b, c,d){this.setRenderTarget(a);this.clear(b,c,d)};this.addPostPlugin=function(a){a.init(this);this.renderPluginsPost.push(a)};this.addPrePlugin=function(a){a.init(this);this.renderPluginsPre.push(a)};this.deallocateObject=function(a){if(a.__webglInit){a.__webglInit=false;delete a._modelViewMatrix;delete a._normalMatrix;delete a._normalMatrixArray;delete a._modelViewMatrixArray;delete a._modelMatrixArray;if(a instanceof THREE.Mesh)for(var b in a.geometry.geometryGroups){var c=a.geometry.geometryGroups[b]; k.deleteBuffer(c.__webglVertexBuffer);k.deleteBuffer(c.__webglNormalBuffer);k.deleteBuffer(c.__webglTangentBuffer);k.deleteBuffer(c.__webglColorBuffer);k.deleteBuffer(c.__webglUVBuffer);k.deleteBuffer(c.__webglUV2Buffer);k.deleteBuffer(c.__webglSkinIndicesBuffer);k.deleteBuffer(c.__webglSkinWeightsBuffer);k.deleteBuffer(c.__webglFaceBuffer);k.deleteBuffer(c.__webglLineBuffer);var d=void 0,e=void 0;if(c.numMorphTargets){d=0;for(e=c.numMorphTargets;d1&&(b=true);d=0;for(c=f.length;d=0){s=q.geometry.materials[s];if(s.transparent){p.transparent= +0;this.setRenderTarget(c);(this.autoClear||d)&&this.clear(this.autoClearColor,this.autoClearDepth,this.autoClearStencil);m=a.__webglObjects;d=0;for(e=m.length;d=0){s=q.geometry.materials[s];if(s.transparent){p.transparent= s;p.opaque=null}else{p.opaque=s;p.transparent=null}}}else if(s)if(s.transparent){p.transparent=s;p.opaque=null}else{p.opaque=s;p.transparent=null}f.render=true;if(this.sortObjects)if(h.renderDepth)f.z=h.renderDepth;else{Wa.copy(h.matrixWorld.getPosition());tb.multiplyVector3(Wa);f.z=Wa.z}}}this.sortObjects&&m.sort(g);m=a.__webglObjectsImmediate;d=0;for(e=m.length;d65535){B[y].counter=B[y].counter+1;A=B[y].hash+"_"+B[y].counter;r.geometryGroups[A]===void 0&&(r.geometryGroups[A]={faces3:[],faces4:[],materialIndex:v,vertices:0,numMorphTargets:F,numMorphNormals:C})}t instanceof THREE.Face3?r.geometryGroups[A].faces3.push(u):r.geometryGroups[A].faces4.push(u);r.geometryGroups[A].vertices=r.geometryGroups[A].vertices+x}r.geometryGroupsList= -[];var G=void 0;for(G in r.geometryGroups){r.geometryGroups[G].id=ba++;r.geometryGroupsList.push(r.geometryGroups[G])}}for(i in j.geometryGroups){l=j.geometryGroups[i];if(!l.__webglVertexBuffer){var E=l;E.__webglVertexBuffer=k.createBuffer();E.__webglNormalBuffer=k.createBuffer();E.__webglTangentBuffer=k.createBuffer();E.__webglColorBuffer=k.createBuffer();E.__webglUVBuffer=k.createBuffer();E.__webglUV2Buffer=k.createBuffer();E.__webglSkinIndicesBuffer=k.createBuffer();E.__webglSkinWeightsBuffer= -k.createBuffer();E.__webglFaceBuffer=k.createBuffer();E.__webglLineBuffer=k.createBuffer();var I=void 0,J=void 0;if(E.numMorphTargets){E.__webglMorphTargetsBuffers=[];I=0;for(J=E.numMorphTargets;I0||L.faceVertexUvs.length>0)M.__uvArray=new Float32Array(P*2);if(L.faceUvs.length>1||L.faceVertexUvs.length>1)M.__uv2Array=new Float32Array(P*2)}if(K.geometry.skinWeights.length&&K.geometry.skinIndices.length){M.__skinIndexArray= -new Float32Array(P*4);M.__skinWeightArray=new Float32Array(P*4)}M.__faceArray=new Uint16Array(Q*3);M.__lineArray=new Uint16Array(Y*2);var oa=void 0,ra=void 0;if(M.numMorphTargets){M.__morphTargetsArrays=[];oa=0;for(ra=M.numMorphTargets;oa65535){B[y].counter=B[y].counter+1;A=B[y].hash+"_"+B[y].counter;t.geometryGroups[A]===void 0&&(t.geometryGroups[A]={faces3:[],faces4:[],materialIndex:v,vertices:0,numMorphTargets:E,numMorphNormals:C})}u instanceof THREE.Face3?t.geometryGroups[A].faces3.push(s):t.geometryGroups[A].faces4.push(s);t.geometryGroups[A].vertices=t.geometryGroups[A].vertices+w}t.geometryGroupsList= +[];var G=void 0;for(G in t.geometryGroups){t.geometryGroups[G].id=ba++;t.geometryGroupsList.push(t.geometryGroups[G])}}for(i in j.geometryGroups){l=j.geometryGroups[i];if(!l.__webglVertexBuffer){var F=l;F.__webglVertexBuffer=k.createBuffer();F.__webglNormalBuffer=k.createBuffer();F.__webglTangentBuffer=k.createBuffer();F.__webglColorBuffer=k.createBuffer();F.__webglUVBuffer=k.createBuffer();F.__webglUV2Buffer=k.createBuffer();F.__webglSkinIndicesBuffer=k.createBuffer();F.__webglSkinWeightsBuffer= +k.createBuffer();F.__webglFaceBuffer=k.createBuffer();F.__webglLineBuffer=k.createBuffer();var I=void 0,J=void 0;if(F.numMorphTargets){F.__webglMorphTargetsBuffers=[];I=0;for(J=F.numMorphTargets;I0||M.faceVertexUvs.length>0)N.__uvArray=new Float32Array(P*2);if(M.faceUvs.length>1||M.faceVertexUvs.length>1)N.__uv2Array=new Float32Array(P*2)}if(K.geometry.skinWeights.length&&K.geometry.skinIndices.length){N.__skinIndexArray= +new Float32Array(P*4);N.__skinWeightArray=new Float32Array(P*4)}N.__faceArray=new Uint16Array(Q*3);N.__lineArray=new Uint16Array(Y*2);var oa=void 0,ra=void 0;if(N.numMorphTargets){N.__morphTargetsArrays=[];oa=0;for(ra=N.numMorphTargets;oa0){k.bindBuffer(k.ARRAY_BUFFER,ka.__webglSkinIndicesBuffer);k.bufferData(k.ARRAY_BUFFER,za,ob);k.bindBuffer(k.ARRAY_BUFFER,ka.__webglSkinWeightsBuffer);k.bufferData(k.ARRAY_BUFFER,Aa,ob)}}if(wd&&Xc){D=0;for(W=la.length;D0){k.bindBuffer(k.ARRAY_BUFFER,ka.__webglColorBuffer);k.bufferData(k.ARRAY_BUFFER,Pa,ob)}}if(vd&&ab.hasTangents){D=0;for(W= la.length;D0){k.bindBuffer(k.ARRAY_BUFFER,ka.__webglUVBuffer);k.bufferData(k.ARRAY_BUFFER,xc,ob)}}if(jd&&bd&&gd){D=0;for(W=la.length;D0){k.bindBuffer(k.ARRAY_BUFFER,ka.__webglUV2Buffer);k.bufferData(k.ARRAY_BUFFER,yc,ob)}}if(td){D=0;for(W=la.length;D< +ya[va+11]=yb.w;ya[va+12]=sc.x;ya[va+13]=sc.y;ya[va+14]=sc.z;ya[va+15]=sc.w;va=va+16}k.bindBuffer(k.ARRAY_BUFFER,ka.__webglTangentBuffer);k.bufferData(k.ARRAY_BUFFER,ya,ob)}if(ud&&fd){D=0;for(W=la.length;D0){k.bindBuffer(k.ARRAY_BUFFER,ka.__webglUVBuffer);k.bufferData(k.ARRAY_BUFFER,xc,ob)}}if(jd&&bd&&gd){D=0;for(W=la.length;D0){k.bindBuffer(k.ARRAY_BUFFER,ka.__webglUV2Buffer);k.bufferData(k.ARRAY_BUFFER,yc,ob)}}if(td){D=0;for(W=la.length;D< W;D++){Lb[pb]=Ea;Lb[pb+1]=Ea+1;Lb[pb+2]=Ea+2;pb=pb+3;cb[Xa]=Ea;cb[Xa+1]=Ea+1;cb[Xa+2]=Ea;cb[Xa+3]=Ea+2;cb[Xa+4]=Ea+1;cb[Xa+5]=Ea+2;Xa=Xa+6;Ea=Ea+3}D=0;for(W=ma.length;D=0&&k.enableVertexAttribArray(q.position);q.color>=0&&k.enableVertexAttribArray(q.color);q.normal>=0&&k.enableVertexAttribArray(q.normal);q.tangent>=0&&k.enableVertexAttribArray(q.tangent);if(a.skinning&&q.skinIndex>=0&&q.skinWeight>=0){k.enableVertexAttribArray(q.skinIndex);k.enableVertexAttribArray(q.skinWeight)}if(a.attributes)for(i in a.attributes)q[i]!== -void 0&&q[i]>=0&&k.enableVertexAttribArray(q[i]);if(a.morphTargets){a.numSupportedMorphTargets=0;r="morphTarget";for(i=0;i=0){k.enableVertexAttribArray(q[s]);a.numSupportedMorphTargets++}}}if(a.morphNormals){a.numSupportedMorphNormals=0;r="morphNormal";for(i=0;i=0){k.enableVertexAttribArray(q[s]);a.numSupportedMorphNormals++}}}a.uniformsList=[];for(h in a.uniforms)a.uniformsList.push([a.uniforms[h],h])};this.setFaceCulling= -function(a,b){if(a){!b||b==="ccw"?k.frontFace(k.CCW):k.frontFace(k.CW);a==="back"?k.cullFace(k.BACK):a==="front"?k.cullFace(k.FRONT):k.cullFace(k.FRONT_AND_BACK);k.enable(k.CULL_FACE)}else k.disable(k.CULL_FACE)};this.setMaterialFaces=function(a){var b=a.side===THREE.DoubleSide,a=a.side===THREE.BackSide;if(aa!==b){b?k.disable(k.CULL_FACE):k.enable(k.CULL_FACE);aa=b}if(M!==a){a?k.frontFace(k.CW):k.frontFace(k.CCW);M=a}};this.setDepthTest=function(a){if(ta!==a){a?k.enable(k.DEPTH_TEST):k.disable(k.DEPTH_TEST); +"#define SHADOWMAP_DEBUG":"",c.shadowMapCascade?"#define SHADOWMAP_CASCADE":"","uniform mat4 viewMatrix;\nuniform vec3 cameraPosition;\n"].join("\n");e=t("fragment",e+p);d=t("vertex",d+o);k.attachShader(s,d);k.attachShader(s,e);k.linkProgram(s);k.getProgramParameter(s,k.LINK_STATUS)||console.error("Could not initialise shader\nVALIDATE_STATUS: "+k.getProgramParameter(s,k.VALIDATE_STATUS)+", gl error ["+k.getError()+"]");k.deleteShader(e);k.deleteShader(d);s.uniforms={};s.attributes={};var r,d=["viewMatrix", +"modelViewMatrix","projectionMatrix","normalMatrix","modelMatrix","cameraPosition","morphTargetInfluences"];c.useVertexTexture?d.push("boneTexture"):d.push("boneGlobalMatrices");for(r in n)d.push(r);r=d;d=0;for(n=r.length;d=0&&k.enableVertexAttribArray(q.position);q.color>=0&&k.enableVertexAttribArray(q.color);q.normal>=0&&k.enableVertexAttribArray(q.normal);q.tangent>=0&&k.enableVertexAttribArray(q.tangent);if(a.skinning&&q.skinIndex>=0&&q.skinWeight>=0){k.enableVertexAttribArray(q.skinIndex);k.enableVertexAttribArray(q.skinWeight)}if(a.attributes)for(i in a.attributes)q[i]!== +void 0&&q[i]>=0&&k.enableVertexAttribArray(q[i]);if(a.morphTargets){a.numSupportedMorphTargets=0;s="morphTarget";for(i=0;i=0){k.enableVertexAttribArray(q[r]);a.numSupportedMorphTargets++}}}if(a.morphNormals){a.numSupportedMorphNormals=0;s="morphNormal";for(i=0;i=0){k.enableVertexAttribArray(q[r]);a.numSupportedMorphNormals++}}}a.uniformsList=[];for(h in a.uniforms)a.uniformsList.push([a.uniforms[h],h])};this.setFaceCulling= +function(a,b){if(a){!b||b==="ccw"?k.frontFace(k.CCW):k.frontFace(k.CW);a==="back"?k.cullFace(k.BACK):a==="front"?k.cullFace(k.FRONT):k.cullFace(k.FRONT_AND_BACK);k.enable(k.CULL_FACE)}else k.disable(k.CULL_FACE)};this.setMaterialFaces=function(a){var b=a.side===THREE.DoubleSide,a=a.side===THREE.BackSide;if(aa!==b){b?k.disable(k.CULL_FACE):k.enable(k.CULL_FACE);aa=b}if(N!==a){a?k.frontFace(k.CW):k.frontFace(k.CCW);N=a}};this.setDepthTest=function(a){if(ta!==a){a?k.enable(k.DEPTH_TEST):k.disable(k.DEPTH_TEST); ta=a}};this.setDepthWrite=function(a){if(Da!==a){k.depthMask(a);Da=a}};this.setBlending=function(a,b,c,d){if(a!==Y){if(a===THREE.NoBlending)k.disable(k.BLEND);else if(a===THREE.AdditiveBlending){k.enable(k.BLEND);k.blendEquation(k.FUNC_ADD);k.blendFunc(k.SRC_ALPHA,k.ONE)}else if(a===THREE.SubtractiveBlending){k.enable(k.BLEND);k.blendEquation(k.FUNC_ADD);k.blendFunc(k.ZERO,k.ONE_MINUS_SRC_COLOR)}else if(a===THREE.MultiplyBlending){k.enable(k.BLEND);k.blendEquation(k.FUNC_ADD);k.blendFunc(k.ZERO,k.SRC_COLOR)}else if(a=== -THREE.CustomBlending)k.enable(k.BLEND);else{k.enable(k.BLEND);k.blendEquationSeparate(k.FUNC_ADD,k.FUNC_ADD);k.blendFuncSeparate(k.SRC_ALPHA,k.ONE_MINUS_SRC_ALPHA,k.ONE,k.ONE_MINUS_SRC_ALPHA)}Y=a}if(a===THREE.CustomBlending){if(b!==ga){k.blendEquation(F(b));ga=b}if(c!==ra||d!==oa){k.blendFunc(F(c),F(d));ra=c;oa=d}}else oa=ra=ga=null};this.setTexture=function(a,b){if(a.needsUpdate){if(!a.__webglInit){a.__webglInit=true;a.__webglTexture=k.createTexture();H.info.memory.textures++}k.activeTexture(k.TEXTURE0+ -b);k.bindTexture(k.TEXTURE_2D,a.__webglTexture);k.pixelStorei(k.UNPACK_FLIP_Y_WEBGL,a.flipY);k.pixelStorei(k.UNPACK_PREMULTIPLY_ALPHA_WEBGL,a.premultiplyAlpha);var c=a.image,d=(c.width&c.width-1)===0&&(c.height&c.height-1)===0,e=F(a.format),f=F(a.type);A(k.TEXTURE_2D,a,d);a instanceof THREE.DataTexture?k.texImage2D(k.TEXTURE_2D,0,e,c.width,c.height,0,e,f,c.data):k.texImage2D(k.TEXTURE_2D,0,e,e,f,a.image);a.generateMipmaps&&d&&k.generateMipmap(k.TEXTURE_2D);a.needsUpdate=false;if(a.onUpdate)a.onUpdate()}else{k.activeTexture(k.TEXTURE0+ -b);k.bindTexture(k.TEXTURE_2D,a.__webglTexture)}};this.setRenderTarget=function(a){var b=a instanceof THREE.WebGLRenderTargetCube;if(a&&!a.__webglFramebuffer){if(a.depthBuffer===void 0)a.depthBuffer=true;if(a.stencilBuffer===void 0)a.stencilBuffer=true;a.__webglTexture=k.createTexture();var c=(a.width&a.width-1)===0&&(a.height&a.height-1)===0,d=F(a.format),e=F(a.type);if(b){a.__webglFramebuffer=[];a.__webglRenderbuffer=[];k.bindTexture(k.TEXTURE_CUBE_MAP,a.__webglTexture);A(k.TEXTURE_CUBE_MAP,a,c); +THREE.CustomBlending)k.enable(k.BLEND);else{k.enable(k.BLEND);k.blendEquationSeparate(k.FUNC_ADD,k.FUNC_ADD);k.blendFuncSeparate(k.SRC_ALPHA,k.ONE_MINUS_SRC_ALPHA,k.ONE,k.ONE_MINUS_SRC_ALPHA)}Y=a}if(a===THREE.CustomBlending){if(b!==ga){k.blendEquation(E(b));ga=b}if(c!==ra||d!==oa){k.blendFunc(E(c),E(d));ra=c;oa=d}}else oa=ra=ga=null};this.setTexture=function(a,b){if(a.needsUpdate){if(!a.__webglInit){a.__webglInit=true;a.__webglTexture=k.createTexture();H.info.memory.textures++}k.activeTexture(k.TEXTURE0+ +b);k.bindTexture(k.TEXTURE_2D,a.__webglTexture);k.pixelStorei(k.UNPACK_FLIP_Y_WEBGL,a.flipY);k.pixelStorei(k.UNPACK_PREMULTIPLY_ALPHA_WEBGL,a.premultiplyAlpha);var c=a.image,d=(c.width&c.width-1)===0&&(c.height&c.height-1)===0,e=E(a.format),f=E(a.type);A(k.TEXTURE_2D,a,d);a instanceof THREE.DataTexture?k.texImage2D(k.TEXTURE_2D,0,e,c.width,c.height,0,e,f,c.data):k.texImage2D(k.TEXTURE_2D,0,e,e,f,a.image);a.generateMipmaps&&d&&k.generateMipmap(k.TEXTURE_2D);a.needsUpdate=false;if(a.onUpdate)a.onUpdate()}else{k.activeTexture(k.TEXTURE0+ +b);k.bindTexture(k.TEXTURE_2D,a.__webglTexture)}};this.setRenderTarget=function(a){var b=a instanceof THREE.WebGLRenderTargetCube;if(a&&!a.__webglFramebuffer){if(a.depthBuffer===void 0)a.depthBuffer=true;if(a.stencilBuffer===void 0)a.stencilBuffer=true;a.__webglTexture=k.createTexture();var c=(a.width&a.width-1)===0&&(a.height&a.height-1)===0,d=E(a.format),e=E(a.type);if(b){a.__webglFramebuffer=[];a.__webglRenderbuffer=[];k.bindTexture(k.TEXTURE_CUBE_MAP,a.__webglTexture);A(k.TEXTURE_CUBE_MAP,a,c); for(var f=0;f<6;f++){a.__webglFramebuffer[f]=k.createFramebuffer();a.__webglRenderbuffer[f]=k.createRenderbuffer();k.texImage2D(k.TEXTURE_CUBE_MAP_POSITIVE_X+f,0,d,a.width,a.height,0,d,e,null);var g=a,h=k.TEXTURE_CUBE_MAP_POSITIVE_X+f;k.bindFramebuffer(k.FRAMEBUFFER,a.__webglFramebuffer[f]);k.framebufferTexture2D(k.FRAMEBUFFER,k.COLOR_ATTACHMENT0,h,g.__webglTexture,0);y(a.__webglRenderbuffer[f],a)}c&&k.generateMipmap(k.TEXTURE_CUBE_MAP)}else{a.__webglFramebuffer=k.createFramebuffer();a.__webglRenderbuffer= k.createRenderbuffer();k.bindTexture(k.TEXTURE_2D,a.__webglTexture);A(k.TEXTURE_2D,a,c);k.texImage2D(k.TEXTURE_2D,0,d,a.width,a.height,0,d,e,null);d=k.TEXTURE_2D;k.bindFramebuffer(k.FRAMEBUFFER,a.__webglFramebuffer);k.framebufferTexture2D(k.FRAMEBUFFER,k.COLOR_ATTACHMENT0,d,a.__webglTexture,0);y(a.__webglRenderbuffer,a);c&&k.generateMipmap(k.TEXTURE_2D)}b?k.bindTexture(k.TEXTURE_CUBE_MAP,null):k.bindTexture(k.TEXTURE_2D,null);k.bindRenderbuffer(k.RENDERBUFFER,null);k.bindFramebuffer(k.FRAMEBUFFER, null)}if(a){b=b?a.__webglFramebuffer[a.activeCubeFace]:a.__webglFramebuffer;c=a.width;a=a.height;e=d=0}else{b=null;c=eb;a=kb;d=Qa;e=Za}if(b!==ea){k.bindFramebuffer(k.FRAMEBUFFER,b);k.viewport(d,e,c,a);ea=b}jb=c;Ma=a};this.shadowMapPlugin=new THREE.ShadowMapPlugin;this.addPrePlugin(this.shadowMapPlugin);this.addPostPlugin(new THREE.SpritePlugin);this.addPostPlugin(new THREE.LensFlarePlugin)}; @@ -472,7 +473,7 @@ THREE.RenderableObject=function(){this.z=this.object=null};THREE.RenderableParti THREE.ColorUtils={adjustHSV:function(a,b,c,d){var f=THREE.ColorUtils.__hsv;THREE.ColorUtils.rgbToHsv(a,f);f.h=THREE.Math.clamp(f.h+b,0,1);f.s=THREE.Math.clamp(f.s+c,0,1);f.v=THREE.Math.clamp(f.v+d,0,1);a.setHSV(f.h,f.s,f.v)},rgbToHsv:function(a,b){var c=a.r,d=a.g,f=a.b,e=Math.max(Math.max(c,d),f),g=Math.min(Math.min(c,d),f);if(g===e)g=c=0;else{var h=e-g,g=h/e,c=(c===e?(d-f)/h:d===e?2+(f-c)/h:4+(c-d)/h)/6;c<0&&(c=c+1);c>1&&(c=c-1)}b===void 0&&(b={h:0,s:0,v:0});b.h=c;b.s=g;b.v=e;return b}}; THREE.ColorUtils.__hsv={h:0,s:0,v:0}; THREE.GeometryUtils={merge:function(a,b){for(var c,d,f=a.vertices.length,e=b instanceof THREE.Mesh?b.geometry:b,g=a.vertices,h=e.vertices,i=a.faces,j=e.faces,l=a.faceVertexUvs[0],m=e.faceVertexUvs[0],n={},q=0;q1){d=1-d;f=1-f}e=1-d-f;g.copy(a);g.multiplyScalar(d);h.copy(b);h.multiplyScalar(f);g.addSelf(h);h.copy(c);h.multiplyScalar(e);g.addSelf(h);return g},randomPointInFace:function(a,b,c){var d,f,e;if(a instanceof THREE.Face3){d=b.vertices[a.a];f=b.vertices[a.b];e=b.vertices[a.c];return THREE.GeometryUtils.randomPointInTriangle(d,f,e)}if(a instanceof THREE.Face4){d=b.vertices[a.a];f=b.vertices[a.b];e=b.vertices[a.c];var b=b.vertices[a.d],g;if(c)if(a._area1&&a._area2){c=a._area1;g=a._area2}else{c=THREE.GeometryUtils.triangleArea(d,f,b);g=THREE.GeometryUtils.triangleArea(f,e,b);a._area1=c;a._area2=g}else{c=THREE.GeometryUtils.triangleArea(d,f,b);g=THREE.GeometryUtils.triangleArea(f,e,b)}return THREE.GeometryUtils.random()* @@ -482,20 +483,20 @@ var b=a.boundingBox,c=new THREE.Vector3;c.add(b.min,b.max);c.multiplyScalar(-0.5 c;b++)h[b]=[];b=0;for(c=a.faces.length;b -b||o>b||n>b){i=a.vertices.length;v=f.clone();u=f.clone();if(q>=o&&q>=n){j=j.clone();j.lerpSelf(l,0.5);v.a=e;v.b=i;v.c=h;u.a=i;u.b=g;u.c=h;if(f.vertexNormals.length===3){e=f.vertexNormals[0].clone();e.lerpSelf(f.vertexNormals[1],0.5);v.vertexNormals[1].copy(e);u.vertexNormals[0].copy(e)}if(f.vertexColors.length===3){e=f.vertexColors[0].clone();e.lerpSelf(f.vertexColors[1],0.5);v.vertexColors[1].copy(e);u.vertexColors[0].copy(e)}f=0}else if(o>=q&&o>=n){j=l.clone();j.lerpSelf(m,0.5);v.a=e;v.b=g;v.c= -i;u.a=i;u.b=h;u.c=e;if(f.vertexNormals.length===3){e=f.vertexNormals[1].clone();e.lerpSelf(f.vertexNormals[2],0.5);v.vertexNormals[2].copy(e);u.vertexNormals[0].copy(e);u.vertexNormals[1].copy(f.vertexNormals[2]);u.vertexNormals[2].copy(f.vertexNormals[0])}if(f.vertexColors.length===3){e=f.vertexColors[1].clone();e.lerpSelf(f.vertexColors[2],0.5);v.vertexColors[2].copy(e);u.vertexColors[0].copy(e);u.vertexColors[1].copy(f.vertexColors[2]);u.vertexColors[2].copy(f.vertexColors[0])}f=1}else{j=j.clone(); -j.lerpSelf(m,0.5);v.a=e;v.b=g;v.c=i;u.a=i;u.b=g;u.c=h;if(f.vertexNormals.length===3){e=f.vertexNormals[0].clone();e.lerpSelf(f.vertexNormals[2],0.5);v.vertexNormals[2].copy(e);u.vertexNormals[0].copy(e)}if(f.vertexColors.length===3){e=f.vertexColors[0].clone();e.lerpSelf(f.vertexColors[2],0.5);v.vertexColors[2].copy(e);u.vertexColors[0].copy(e)}f=2}A.push(v,u);a.vertices.push(j);e=0;for(g=a.faceVertexUvs.length;eb||o>b||p>b||s>b){r=a.vertices.length;t=a.vertices.length+1;v=f.clone();u=f.clone();if(q>=o&&q>=p&&q>=s||p>=o&&p>=q&&p>=s){q=j.clone();q.lerpSelf(l,0.5);l=m.clone();l.lerpSelf(n,0.5);v.a=e;v.b=r;v.c=t;v.d=i;u.a=r;u.b=g;u.c=h;u.d=t;if(f.vertexNormals.length===4){e=f.vertexNormals[0].clone();e.lerpSelf(f.vertexNormals[1],0.5);g=f.vertexNormals[2].clone();g.lerpSelf(f.vertexNormals[3],0.5);v.vertexNormals[1].copy(e); -v.vertexNormals[2].copy(g);u.vertexNormals[0].copy(e);u.vertexNormals[3].copy(g)}if(f.vertexColors.length===4){e=f.vertexColors[0].clone();e.lerpSelf(f.vertexColors[1],0.5);g=f.vertexColors[2].clone();g.lerpSelf(f.vertexColors[3],0.5);v.vertexColors[1].copy(e);v.vertexColors[2].copy(g);u.vertexColors[0].copy(e);u.vertexColors[3].copy(g)}f=0}else{q=l.clone();q.lerpSelf(m,0.5);l=n.clone();l.lerpSelf(j,0.5);v.a=e;v.b=g;v.c=r;v.d=t;u.a=t;u.b=r;u.c=h;u.d=i;if(f.vertexNormals.length===4){e=f.vertexNormals[1].clone(); -e.lerpSelf(f.vertexNormals[2],0.5);g=f.vertexNormals[3].clone();g.lerpSelf(f.vertexNormals[0],0.5);v.vertexNormals[2].copy(e);v.vertexNormals[3].copy(g);u.vertexNormals[0].copy(g);u.vertexNormals[1].copy(e)}if(f.vertexColors.length===4){e=f.vertexColors[1].clone();e.lerpSelf(f.vertexColors[2],0.5);g=f.vertexColors[3].clone();g.lerpSelf(f.vertexColors[0],0.5);v.vertexColors[2].copy(e);v.vertexColors[3].copy(g);u.vertexColors[0].copy(g);u.vertexColors[1].copy(e)}f=1}A.push(v,u);a.vertices.push(q,l); -e=0;for(g=a.faceVertexUvs.length;e +b||o>b||n>b){i=a.vertices.length;v=f.clone();t=f.clone();if(q>=o&&q>=n){j=j.clone();j.lerpSelf(l,0.5);v.a=e;v.b=i;v.c=h;t.a=i;t.b=g;t.c=h;if(f.vertexNormals.length===3){e=f.vertexNormals[0].clone();e.lerpSelf(f.vertexNormals[1],0.5);v.vertexNormals[1].copy(e);t.vertexNormals[0].copy(e)}if(f.vertexColors.length===3){e=f.vertexColors[0].clone();e.lerpSelf(f.vertexColors[1],0.5);v.vertexColors[1].copy(e);t.vertexColors[0].copy(e)}f=0}else if(o>=q&&o>=n){j=l.clone();j.lerpSelf(m,0.5);v.a=e;v.b=g;v.c= +i;t.a=i;t.b=h;t.c=e;if(f.vertexNormals.length===3){e=f.vertexNormals[1].clone();e.lerpSelf(f.vertexNormals[2],0.5);v.vertexNormals[2].copy(e);t.vertexNormals[0].copy(e);t.vertexNormals[1].copy(f.vertexNormals[2]);t.vertexNormals[2].copy(f.vertexNormals[0])}if(f.vertexColors.length===3){e=f.vertexColors[1].clone();e.lerpSelf(f.vertexColors[2],0.5);v.vertexColors[2].copy(e);t.vertexColors[0].copy(e);t.vertexColors[1].copy(f.vertexColors[2]);t.vertexColors[2].copy(f.vertexColors[0])}f=1}else{j=j.clone(); +j.lerpSelf(m,0.5);v.a=e;v.b=g;v.c=i;t.a=i;t.b=g;t.c=h;if(f.vertexNormals.length===3){e=f.vertexNormals[0].clone();e.lerpSelf(f.vertexNormals[2],0.5);v.vertexNormals[2].copy(e);t.vertexNormals[0].copy(e)}if(f.vertexColors.length===3){e=f.vertexColors[0].clone();e.lerpSelf(f.vertexColors[2],0.5);v.vertexColors[2].copy(e);t.vertexColors[0].copy(e)}f=2}A.push(v,t);a.vertices.push(j);e=0;for(g=a.faceVertexUvs.length;eb||o>b||p>b||s>b){r=a.vertices.length;u=a.vertices.length+1;v=f.clone();t=f.clone();if(q>=o&&q>=p&&q>=s||p>=o&&p>=q&&p>=s){q=j.clone();q.lerpSelf(l,0.5);l=m.clone();l.lerpSelf(n,0.5);v.a=e;v.b=r;v.c=u;v.d=i;t.a=r;t.b=g;t.c=h;t.d=u;if(f.vertexNormals.length===4){e=f.vertexNormals[0].clone();e.lerpSelf(f.vertexNormals[1],0.5);g=f.vertexNormals[2].clone();g.lerpSelf(f.vertexNormals[3],0.5);v.vertexNormals[1].copy(e); +v.vertexNormals[2].copy(g);t.vertexNormals[0].copy(e);t.vertexNormals[3].copy(g)}if(f.vertexColors.length===4){e=f.vertexColors[0].clone();e.lerpSelf(f.vertexColors[1],0.5);g=f.vertexColors[2].clone();g.lerpSelf(f.vertexColors[3],0.5);v.vertexColors[1].copy(e);v.vertexColors[2].copy(g);t.vertexColors[0].copy(e);t.vertexColors[3].copy(g)}f=0}else{q=l.clone();q.lerpSelf(m,0.5);l=n.clone();l.lerpSelf(j,0.5);v.a=e;v.b=g;v.c=r;v.d=u;t.a=u;t.b=r;t.c=h;t.d=i;if(f.vertexNormals.length===4){e=f.vertexNormals[1].clone(); +e.lerpSelf(f.vertexNormals[2],0.5);g=f.vertexNormals[3].clone();g.lerpSelf(f.vertexNormals[0],0.5);v.vertexNormals[2].copy(e);v.vertexNormals[3].copy(g);t.vertexNormals[0].copy(g);t.vertexNormals[1].copy(e)}if(f.vertexColors.length===4){e=f.vertexColors[1].clone();e.lerpSelf(f.vertexColors[2],0.5);g=f.vertexColors[3].clone();g.lerpSelf(f.vertexColors[0],0.5);v.vertexColors[2].copy(e);v.vertexColors[3].copy(g);t.vertexColors[0].copy(g);t.vertexColors[1].copy(e)}f=1}A.push(v,t);a.vertices.push(q,l); +e=0;for(g=a.faceVertexUvs.length;ef- -1?f-1:m+1,o=l-1<0?0:l-1,p=l+1>d-1?d-1:l+1,s=[],r=[0,0,h[(m*d+l)*4]/255*b];s.push([-1,0,h[(m*d+o)*4]/255*b]);s.push([-1,-1,h[(n*d+o)*4]/255*b]);s.push([0,-1,h[(n*d+l)*4]/255*b]);s.push([1,-1,h[(n*d+p)*4]/255*b]);s.push([1,0,h[(m*d+p)*4]/255*b]);s.push([1,1,h[(q*d+p)*4]/255*b]);s.push([0,1,h[(q*d+l)*4]/255*b]);s.push([-1,1,h[(q*d+o)*4]/255*b]);n=[];o=s.length;for(q=0;qd-1?d-1:l+1,s=[],r=[0,0,h[(m*d+l)*4]/255*b];s.push([-1,0,h[(m*d+o)*4]/255*b]);s.push([-1,-1,h[(n*d+o)*4]/255*b]);s.push([0,-1,h[(n*d+l)*4]/255*b]);s.push([1,-1,h[(n*d+p)*4]/255*b]);s.push([1,0,h[(m*d+p)*4]/255*b]);s.push([1,1,h[(q*d+p)*4]/255*b]);s.push([0,1,h[(q*d+l)*4]/255*b]);s.push([-1,1,h[(q*d+o)*4]/255*b]);n=[];o=s.length;for(q=0;q0)for(j=0;j2;){if(m--<=0){console.log("Warning, unable to triangulate polygon!");break}i=j;f<=i&&(i=0);j=i+1;f<=j&&(j=0);l=j+1;f<=l&&(l=0);var n;a:{n=a;var q=i,o=j,p=l,s=f,r=g,t=void 0,v=void 0,u=void 0,A=void 0,y=void 0, -B=void 0,F=void 0,x=void 0,E=void 0,v=n[r[q]].x,u=n[r[q]].y,A=n[r[o]].x,y=n[r[o]].y,B=n[r[p]].x,F=n[r[p]].y;if(1E-10>(A-v)*(F-u)-(y-u)*(B-v))n=false;else{for(t=0;t=0&&J>=0&&C>=0){n=false;break a}}n=true}}if(n){e.push([a[g[i]], +(function(a){var b=function(a){for(var b=a.length,f=0,e=b-1,g=0;g0)for(j=0;j2;){if(m--<=0){console.log("Warning, unable to triangulate polygon!");break}i=j;f<=i&&(i=0);j=i+1;f<=j&&(j=0);l=j+1;f<=l&&(l=0);var n;a:{n=a;var q=i,o=j,p=l,s=f,r=g,u=void 0,v=void 0,t=void 0,A=void 0,y=void 0, +B=void 0,E=void 0,w=void 0,I=void 0,v=n[r[q]].x,t=n[r[q]].y,A=n[r[o]].x,y=n[r[o]].y,B=n[r[p]].x,E=n[r[p]].y;if(1E-10>(A-v)*(E-t)-(y-t)*(B-v))n=false;else{for(u=0;u=0&&F>=0&&C>=0){n=false;break a}}n=true}}if(n){e.push([a[g[i]], a[g[j]],a[g[l]]]);h.push([g[i],g[j],g[l]]);i=j;for(l=j+1;l0?e.zoomIn():e.zoomOut();l.copy(m)}}function f(){if(e.userRotate){document.removeEventListener("mousemove",d,false);document.removeEventListener("mouseup",f,false); -t=r.NONE}}THREE.EventTarget.call(this);this.object=a;this.domElement=b!==void 0?b:document;this.center=new THREE.Vector3;this.userZoom=true;this.userZoomSpeed=1;this.userRotate=true;this.userRotateSpeed=1;this.autoRotate=false;this.autoRotateSpeed=2;var e=this,g=1800,h=new THREE.Vector2,i=new THREE.Vector2,j=new THREE.Vector2,l=new THREE.Vector2,m=new THREE.Vector2,n=new THREE.Vector2,q=0,o=0,p=1,s=new THREE.Vector3,r={NONE:-1,ROTATE:0,ZOOM:1},t=r.NONE,v={type:"change"};this.rotateLeft=function(a){a=== +THREE.OrbitControls=function(a,b){function c(){return 2*Math.PI/60/60*e.autoRotateSpeed}function d(a){a.preventDefault();if(u===r.ROTATE){i.set(a.clientX,a.clientY);j.sub(i,h);e.rotateLeft(2*Math.PI*j.x/g*e.userRotateSpeed);e.rotateUp(2*Math.PI*j.y/g*e.userRotateSpeed);h.copy(i)}else if(u===r.ZOOM){m.set(a.clientX,a.clientY);n.sub(m,l);n.y>0?e.zoomIn():e.zoomOut();l.copy(m)}}function f(){if(e.userRotate){document.removeEventListener("mousemove",d,false);document.removeEventListener("mouseup",f,false); +u=r.NONE}}THREE.EventTarget.call(this);this.object=a;this.domElement=b!==void 0?b:document;this.center=new THREE.Vector3;this.userZoom=true;this.userZoomSpeed=1;this.userRotate=true;this.userRotateSpeed=1;this.autoRotate=false;this.autoRotateSpeed=2;var e=this,g=1800,h=new THREE.Vector2,i=new THREE.Vector2,j=new THREE.Vector2,l=new THREE.Vector2,m=new THREE.Vector2,n=new THREE.Vector2,q=0,o=0,p=1,s=new THREE.Vector3,r={NONE:-1,ROTATE:0,ZOOM:1},u=r.NONE,v={type:"change"};this.rotateLeft=function(a){a=== void 0&&(a=c());o=o-a};this.rotateRight=function(a){a===void 0&&(a=c());o=o+a};this.rotateUp=function(a){a===void 0&&(a=c());q=q-a};this.rotateDown=function(a){a===void 0&&(a=c());q=q+a};this.zoomIn=function(a){a===void 0&&(a=Math.pow(0.95,e.userZoomSpeed));p=p/a};this.zoomOut=function(a){a===void 0&&(a=Math.pow(0.95,e.userZoomSpeed));p=p*a};this.update=function(){var a=this.object.position,b=a.clone().subSelf(this.center),d=Math.atan2(b.x,b.z),e=Math.atan2(Math.sqrt(b.x*b.x+b.z*b.z),b.y);this.autoRotate&& this.rotateLeft(c());var d=d+o,e=e+q,e=Math.max(1E-6,Math.min(Math.PI-1E-6,e)),f=b.length();b.x=f*Math.sin(e)*Math.sin(d);b.y=f*Math.cos(e);b.z=f*Math.sin(e)*Math.cos(d);b.multiplyScalar(p);a.copy(this.center).addSelf(b);this.object.lookAt(this.center);q=o=0;p=1;if(s.distanceTo(this.object.position)>0){this.dispatchEvent(v);s.copy(this.object.position)}};this.domElement.addEventListener("contextmenu",function(a){a.preventDefault()},false);this.domElement.addEventListener("mousedown",function(a){if(e.userRotate){a.preventDefault(); -if(a.button===0||a.button===2){t=r.ROTATE;h.set(a.clientX,a.clientY)}else if(a.button===1){t=r.ZOOM;l.set(a.clientX,a.clientY)}document.addEventListener("mousemove",d,false);document.addEventListener("mouseup",f,false)}},false);this.domElement.addEventListener("mousewheel",function(a){e.userZoom&&(a.wheelDelta>0?e.zoomOut():e.zoomIn())},false)}; +if(a.button===0||a.button===2){u=r.ROTATE;h.set(a.clientX,a.clientY)}else if(a.button===1){u=r.ZOOM;l.set(a.clientX,a.clientY)}document.addEventListener("mousemove",d,false);document.addEventListener("mouseup",f,false)}},false);this.domElement.addEventListener("mousewheel",function(a){e.userZoom&&(a.wheelDelta>0?e.zoomOut():e.zoomIn())},false)}; THREE.CircleGeometry=function(a,b,c,d){THREE.Geometry.call(this);var a=a||50,c=c!==void 0?c:0,d=d!==void 0?d:Math.PI*2,b=b!==void 0?Math.max(3,b):8,f,e=[];f=new THREE.Vector3;var g=new THREE.UV(0.5,0.5);this.vertices.push(f);e.push(g);for(f=0;f<=b;f++){var h=new THREE.Vector3;h.x=a*Math.cos(c+f/b*d);h.y=a*Math.sin(c+f/b*d);this.vertices.push(h);e.push(new THREE.UV((h.x/a+1)/2,-(h.y/a+1)/2+1))}c=new THREE.Vector3(0,0,-1);for(f=1;f<=b;f++){this.faces.push(new THREE.Face3(f,f+1,0,[c,c,c]));this.faceVertexUvs[0].push([e[f], e[f+1],g])}this.computeCentroids();this.computeFaceNormals();this.boundingSphere={radius:a}};THREE.CircleGeometry.prototype=Object.create(THREE.Geometry.prototype); -THREE.CubeGeometry=function(a,b,c,d,f,e,g,h){function i(a,b,c,g,h,i,l,n){var m,o=d||1,p=f||1,q=h/2,r=i/2,s=j.vertices.length;if(a==="x"&&b==="y"||a==="y"&&b==="x")m="z";else if(a==="x"&&b==="z"||a==="z"&&b==="x"){m="y";p=e||1}else if(a==="z"&&b==="y"||a==="y"&&b==="z"){m="x";o=e||1}var t=o+1,v=p+1,X=h/o,P=i/p,L=new THREE.Vector3;L[m]=l>0?1:-1;for(h=0;h0?1:-1;for(h=0;h -0){this.vertices.push(new THREE.Vector3(0,g,0));for(h=0;h0){this.vertices.push(new THREE.Vector3(0,-g,0));for(h=0;h +0){this.vertices.push(new THREE.Vector3(0,g,0));for(h=0;h0){this.vertices.push(new THREE.Vector3(0,-g,0));for(h=0;ha&&(a=a+Math.PI*2);c=(b+a)/2;a=-Math.cos(c);c=-Math.sin(c);return new THREE.Vector2(a,c)}return d.multiplyScalar(g).addSelf(h).subSelf(a).clone()}function f(c,d){var e,f;for(L=c.length;--L>=0;){e=L;f=L-1;f<0&&(f= -c.length-1);for(var g=0,h=n+l*2,g=0;g=0;C--){F=C/l;Q=i*(1-F);I=j*Math.sin(F*Math.PI/2);L=0;for(ea=o.length;L< -ea;L++){K=c(o[L],P[L],I);e(K.x,K.y,h+Q)}x=0;for(E=q.length;xa&&(a=a+Math.PI*2);c=(b+a)/2;a=-Math.cos(c);c=-Math.sin(c);return new THREE.Vector2(a,c)}return d.multiplyScalar(g).addSelf(h).subSelf(a).clone()}function f(c,d){var e,f;for(M=c.length;--M>=0;){e=M;f=M-1;f<0&&(f= +c.length-1);for(var g=0,h=n+l*2,g=0;g=0;C--){E=C/l;Q=i*(1-E);J=j*Math.sin(E*Math.PI/2);M=0;for(ea=o.length;M< +ea;M++){L=c(o[M],P[M],J);e(L.x,L.y,h+Q)}w=0;for(I=q.length;w0;)this.smooth(a)}; THREE.SubdivisionModifier.prototype.smooth=function(a){function b(){l.debug&&console.log.apply(console,arguments)}function c(){console&&console.log.apply(console,arguments)}function d(a,c,d,f,g,h,m){var n=new THREE.Face4(a,c,d,f,null,g.color,g.materialIndex);if(l.useOldVertexColors){n.vertexColors=[];for(var o,p,q,r=0;r<4;r++){q=h[r];o=new THREE.Color;o.setRGB(0,0,0);for(var s=0;s=r&&a0&&E.x0&& -E.y0.001&&I.scale>0.001){x.x=I.x;x.y=I.y;x.z=I.z;B=I.size*I.scale/r;F.x=B*u;F.y=B;b.uniform3f(G.screenPosition,x.x,x.y,x.z);b.uniform2f(G.scale,F.x,F.y);b.uniform1f(G.rotation,I.rotation);b.uniform1f(G.opacity,I.opacity); -b.uniform3f(G.color,I.color.r,I.color.g,I.color.b);c.setBlending(I.blending,I.blendEquation,I.blendSrc,I.blendDst);c.setTexture(I.texture,1);b.drawElements(b.TRIANGLES,6,b.UNSIGNED_SHORT,0)}}}}b.enable(b.CULL_FACE);b.enable(b.DEPTH_TEST);b.depthMask(true)}}}; +"color");n.scale=b.getUniformLocation(l,"scale");n.rotation=b.getUniformLocation(l,"rotation");n.screenPosition=b.getUniformLocation(l,"screenPosition");q=false};this.render=function(a,d,f,r){var a=a.__webglFlares,u=a.length;if(u){var v=new THREE.Vector3,t=r/f,A=f*0.5,y=r*0.5,B=16/r,E=new THREE.Vector2(B*t,B),w=new THREE.Vector3(1,1,0),I=new THREE.Vector2(1,1),G=n,B=m;b.useProgram(l);if(!q){b.enableVertexAttribArray(m.vertex);b.enableVertexAttribArray(m.uv);q=true}b.uniform1i(G.occlusionMap,0);b.uniform1i(G.map, +1);b.bindBuffer(b.ARRAY_BUFFER,e);b.vertexAttribPointer(B.vertex,2,b.FLOAT,false,16,0);b.vertexAttribPointer(B.uv,2,b.FLOAT,false,16,8);b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,g);b.disable(b.CULL_FACE);b.depthMask(false);var O,F,K,C,J;for(O=0;O0&&I.x0&& +I.y0.001&&J.scale>0.001){w.x=J.x;w.y=J.y;w.z=J.z;B=J.size*J.scale/r;E.x=B*t;E.y=B;b.uniform3f(G.screenPosition,w.x,w.y,w.z);b.uniform2f(G.scale,E.x,E.y);b.uniform1f(G.rotation,J.rotation);b.uniform1f(G.opacity,J.opacity); +b.uniform3f(G.color,J.color.r,J.color.g,J.color.b);c.setBlending(J.blending,J.blendEquation,J.blendSrc,J.blendDst);c.setTexture(J.texture,1);b.drawElements(b.TRIANGLES,6,b.UNSIGNED_SHORT,0)}}}}b.enable(b.CULL_FACE);b.enable(b.DEPTH_TEST);b.depthMask(true)}}}; THREE.ShadowMapPlugin=function(){var a,b,c,d,f,e,g=new THREE.Frustum,h=new THREE.Matrix4,i=new THREE.Vector3,j=new THREE.Vector3;this.init=function(g){a=g.context;b=g;var g=THREE.ShaderLib.depthRGBA,h=THREE.UniformsUtils.clone(g.uniforms);c=new THREE.ShaderMaterial({fragmentShader:g.fragmentShader,vertexShader:g.vertexShader,uniforms:h});d=new THREE.ShaderMaterial({fragmentShader:g.fragmentShader,vertexShader:g.vertexShader,uniforms:h,morphTargets:true});f=new THREE.ShaderMaterial({fragmentShader:g.fragmentShader, -vertexShader:g.vertexShader,uniforms:h,skinning:true});e=new THREE.ShaderMaterial({fragmentShader:g.fragmentShader,vertexShader:g.vertexShader,uniforms:h,morphTargets:true,skinning:true});c._shadowPass=true;d._shadowPass=true;f._shadowPass=true;e._shadowPass=true};this.render=function(a,c){b.shadowMapEnabled&&b.shadowMapAutoUpdate&&this.update(a,c)};this.update=function(l,m){var n,q,o,p,s,r,t,v,u,A=[];p=0;a.clearColor(1,1,1,1);a.disable(a.BLEND);a.enable(a.CULL_FACE);b.shadowMapCullFrontFaces?a.cullFace(a.FRONT): -a.cullFace(a.BACK);b.setDepthTest(true);n=0;for(q=l.__lights.length;nj.x)j.x=v.x;if(v.yj.y)j.y=v.y;if(v.zj.z)j.z=v.z}p.left=i.x;p.right= +new THREE.CameraHelper(o.shadowCamera);o.shadowCamera.add(o.cameraHelper)}if(o.isVirtual&&y.originalCamera==m){s=m;p=o.shadowCamera;r=o.pointsFrustum;t=o.pointsWorld;i.set(Infinity,Infinity,Infinity);j.set(-Infinity,-Infinity,-Infinity);for(u=0;u<8;u++){v=t[u];v.copy(r[u]);THREE.ShadowMapPlugin.__projector.unprojectVector(v,s);p.matrixWorldInverse.multiplyVector3(v);if(v.xj.x)j.x=v.x;if(v.yj.y)j.y=v.y;if(v.zj.z)j.z=v.z}p.left=i.x;p.right= j.x;p.top=j.y;p.bottom=i.y;p.updateProjectionMatrix()}p=o.shadowMap;r=o.shadowMatrix;s=o.shadowCamera;s.position.copy(o.matrixWorld.getPosition());s.lookAt(o.target.matrixWorld.getPosition());s.updateMatrixWorld();s.matrixWorldInverse.getInverse(s.matrixWorld);if(o.cameraHelper)o.cameraHelper.lines.visible=o.shadowCameraVisible;o.shadowCameraVisible&&o.cameraHelper.update();r.set(0.5,0,0,0.5,0,0.5,0,0.5,0,0,0.5,0.5,0,0,0,1);r.multiplySelf(s.projectionMatrix);r.multiplySelf(s.matrixWorldInverse);if(!s._viewMatrixArray)s._viewMatrixArray= -new Float32Array(16);if(!s._projectionMatrixArray)s._projectionMatrixArray=new Float32Array(16);s.matrixWorldInverse.flattenToArray(s._viewMatrixArray);s.projectionMatrix.flattenToArray(s._projectionMatrixArray);h.multiply(s.projectionMatrix,s.matrixWorldInverse);g.setFromMatrix(h);b.setRenderTarget(p);b.clear();u=l.__webglObjects;o=0;for(p=u.length;o= 0 ) && ( v >= 0 ) && ( u + v < 1 ); - + }; - - var intersectObject = function(object,ray,intersects){ + + var intersectObject = function ( object, ray, intersects ) { + var distance,intersect; + if ( object instanceof THREE.Particle ) { - + distance = distanceFromIntersection( ray.origin, ray.direction, object.matrixWorld.getPosition() ); - + if ( distance > object.scale.x ) { - - return []; - + + return intersects; + } - + intersect = { - + distance: distance, point: object.position, face: null, object: object - + }; - + intersects.push( intersect ); - + } else if ( object instanceof THREE.Mesh ) { - + // Checking boundingSphere - - //var scale = THREE.Frustum.__v1.set( object.matrixWorld.getColumnX().length(), object.matrixWorld.getColumnY().length(), object.matrixWorld.getColumnZ().length() ); + var scaledRadius = object.geometry.boundingSphere.radius * object.matrixWorld.getMaxScaleOnAxis(); - + // Checking distance to ray - + distance = distanceFromIntersection( ray.origin, ray.direction, object.matrixWorld.getPosition() ); - + if ( distance > scaledRadius) { - + return intersects; - + } - + // Checking faces - + var f, fl, face, dot, scalar, geometry = object.geometry, vertices = geometry.vertices, objMatrix, geometryMaterials, isFaceMaterial, material, side, point; - + geometryMaterials = object.geometry.materials; isFaceMaterial = object.material instanceof THREE.MeshFaceMaterial; side = object.material.side; + var a, b, c, d; var precision = ray.precision; - + object.matrixRotationWorld.extractRotation( object.matrixWorld ); - + originCopy.copy( ray.origin ); - + objMatrix = object.matrixWorld; - inverseMatrix.getInverse(objMatrix); - - localOriginCopy.copy(originCopy); - inverseMatrix.multiplyVector3(localOriginCopy); - - localDirectionCopy.copy(ray.direction); - inverseMatrix.rotateAxis(localDirectionCopy).normalize(); - + inverseMatrix.getInverse( objMatrix ); + + localOriginCopy.copy( originCopy ); + inverseMatrix.multiplyVector3( localOriginCopy ); + + localDirectionCopy.copy( ray.direction ); + inverseMatrix.rotateAxis( localDirectionCopy ).normalize(); + for ( f = 0, fl = geometry.faces.length; f < fl; f ++ ) { - + face = geometry.faces[ f ]; - + material = isFaceMaterial === true ? geometryMaterials[ face.materialIndex ] : object.material; if ( material === undefined ) continue; side = material.side; - + vector.sub( face.centroid, localOriginCopy ); normal = face.normal; dot = localDirectionCopy.dot( normal ); - - + // bail if ray and plane are parallel - + if ( Math.abs( dot ) < precision ) continue; - + // calc distance to plane - + scalar = normal.dot( vector ) / dot; - + // if negative distance, then plane is behind ray - + if ( scalar < 0 ) continue; - + if ( side === THREE.DoubleSide || ( side === THREE.FrontSide ? dot < 0 : dot > 0 ) ) { - + intersectPoint.add( localOriginCopy, localDirectionCopy.multiplyScalar( scalar ) ); - + if ( face instanceof THREE.Face3 ) { - + a = vertices[ face.a ]; b = vertices[ face.b ]; c = vertices[ face.c ]; - + if ( pointInFace3( intersectPoint, a, b, c ) ) { - - point = object.matrixWorld.multiplyVector3(intersectPoint.clone()); - distance = originCopy.distanceTo( point); - - if ( distance < ray.near ) continue; - if ( distance > ray.far ) continue; - - + + point = object.matrixWorld.multiplyVector3( intersectPoint.clone() ); + distance = originCopy.distanceTo( point ); + + if ( distance < ray.near || distance > ray.far ) continue; + intersect = { - + distance: distance, point: point, face: face, faceIndex: f, object: object - + }; - + intersects.push( intersect ); - + } - + } else if ( face instanceof THREE.Face4 ) { - + a = vertices[ face.a ]; b = vertices[ face.b ]; c = vertices[ face.c ]; d = vertices[ face.d ]; - + if ( pointInFace3( intersectPoint, a, b, d ) || pointInFace3( intersectPoint, b, c, d ) ) { - - point = object.matrixWorld.multiplyVector3(intersectPoint.clone()); - distance = originCopy.distanceTo( point); - - if ( distance < ray.near ) continue; - if ( distance > ray.far ) continue; - + + point = object.matrixWorld.multiplyVector3( intersectPoint.clone() ); + distance = originCopy.distanceTo( point ); + + if ( distance < ray.near || distance > ray.far ) continue; + intersect = { - + distance: distance, point: point, face: face, faceIndex: f, object: object - + }; - + intersects.push( intersect ); - + } - + } - + } - + } - + } - + }; - - var intersectDescendants= function(object,ray,intersects){ + + var intersectDescendants= function ( object, ray, intersects ) { + var descendants = object.getDescendants(); - var length = descendants.length; - for ( var i = 0; i < length; i ++ ) { - - intersectObject(descendants[i],this,intersects); - + + for ( var i = 0, l = descendants.length; i < l; i ++ ) { + + intersectObject( descendants[ i ], this, intersects ); + } }; - + // - + THREE.Ray.prototype.precision = 0.0001; -/* - This has deemed to be unnessecary - THREE.Ray.prototype.setPrecision = function ( value ) { - - this.precision = value; - - };*/ - + THREE.Ray.prototype.intersectObject = function ( object, recursive ) { - + var intersects = []; - + if ( recursive === true ) { - - intersectDescendants(object,this,intersects); - + + intersectDescendants( object, this, intersects ); + } - + intersectObject(object,this,intersects); - + intersects.sort( descSort ); - + return intersects; - + }; - + THREE.Ray.prototype.intersectObjects = function ( objects, recursive ) { - + var intersects = []; - + for ( var i = 0, l = objects.length; i < l; i ++ ) { - - intersectObject(objects[i],this,intersects); - - if ( recursive === true ) { - - intersectDescendants(objects[i],this,intersects); - + + intersectObject( objects[ i ], this, intersects ); + + if ( recursive === true ) { + + intersectDescendants( objects[ i ], this, intersects ); + } } - + intersects.sort( descSort ); - + return intersects; - + }; - -}(THREE)); + +}( THREE ) ); -- GitLab