diff --git a/build/three.js b/build/three.js index 6b085d5bb47d45f16d83b98059f6b9a75cc2bca6..7340b41bf6320ff9595ec3e52811c3f807449391 100644 --- a/build/three.js +++ b/build/three.js @@ -5233,7 +5233,7 @@ THREE.Plane.prototype = { // compute new normal based on theory here: // http://www.songho.ca/opengl/gl_normaltransform.html - optionalNormalMatrix = optionalNormalMatrix || new THREE.Matrix3().getInverse( matrix ).transpose(); + optionalNormalMatrix = optionalNormalMatrix || new THREE.Matrix3().getNormalMatrix( matrix ); var newNormal = v1.copy( this.normal ).applyMatrix3( optionalNormalMatrix ); var newCoplanarPoint = this.coplanarPoint( v2 ); @@ -6860,8 +6860,7 @@ THREE.Projector = function () { _viewMatrix.copy( camera.matrixWorldInverse.getInverse( camera.matrixWorld ) ); _viewProjectionMatrix.multiplyMatrices( camera.projectionMatrix, _viewMatrix ); - _normalViewMatrix.getInverse( _viewMatrix ); - _normalViewMatrix.transpose(); + _normalViewMatrix.getNormalMatrix( _viewMatrix ); _frustum.setFromMatrix( _viewProjectionMatrix ); @@ -6883,8 +6882,7 @@ THREE.Projector = function () { faces = geometry.faces; faceVertexUvs = geometry.faceVertexUvs; - _normalMatrix.getInverse( _modelMatrix ); - _normalMatrix.transpose(); + _normalMatrix.getNormalMatrix( _modelMatrix ); isFaceMaterial = object.material instanceof THREE.MeshFaceMaterial; objectMaterials = isFaceMaterial === true ? object.material : null; @@ -7491,7 +7489,7 @@ THREE.Geometry.prototype = { applyMatrix: function ( matrix ) { - var normalMatrix = new THREE.Matrix3().getInverse( matrix ).transpose(); + var normalMatrix = new THREE.Matrix3().getNormalMatrix( matrix ); for ( var i = 0, il = this.vertices.length; i < il; i ++ ) { @@ -8291,8 +8289,7 @@ THREE.BufferGeometry.prototype = { if ( normalArray !== undefined ) { - var normalMatrix = new THREE.Matrix3(); - normalMatrix.getInverse( matrix ).transpose(); + var normalMatrix = new THREE.Matrix3().getNormalMatrix( matrix ); normalMatrix.multiplyVector3Array( normalArray ); @@ -24000,9 +23997,7 @@ THREE.WebGLRenderer = function ( parameters ) { function setupMatrices ( object, camera ) { object._modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld ); - - object._normalMatrix.getInverse( object._modelViewMatrix ); - object._normalMatrix.transpose(); + object._normalMatrix.getNormalMatrix( object._modelViewMatrix ); }; @@ -25868,9 +25863,7 @@ THREE.GeometryUtils = { matrix = object2.matrix; - normalMatrix = new THREE.Matrix3(); - normalMatrix.getInverse( matrix ); - normalMatrix.transpose(); + normalMatrix = new THREE.Matrix3().getNormalMatrix( matrix ); } diff --git a/build/three.min.js b/build/three.min.js index 63b28c86214bbcf6a2f963f187f788311950a424..927f8c488d6917dc8a9a816a97a52af925bb3eec 100644 --- a/build/three.min.js +++ b/build/three.min.js @@ -82,8 +82,8 @@ return this.copyPosition(a)},copyPosition:function(a){var b=this.elements,a=a.el b){var c=this.elements,d=a.x,e=a.y,f=a.z,g=Math.cos(d),d=Math.sin(d),h=Math.cos(e),e=Math.sin(e),i=Math.cos(f),f=Math.sin(f);if(void 0===b||"XYZ"===b){var j=g*i,m=g*f,l=d*i,p=d*f;c[0]=h*i;c[4]=-h*f;c[8]=e;c[1]=m+l*e;c[5]=j-p*e;c[9]=-d*h;c[2]=p-j*e;c[6]=l+m*e;c[10]=g*h}else"YXZ"===b?(j=h*i,m=h*f,l=e*i,p=e*f,c[0]=j+p*d,c[4]=l*d-m,c[8]=g*e,c[1]=g*f,c[5]=g*i,c[9]=-d,c[2]=m*d-l,c[6]=p+j*d,c[10]=g*h):"ZXY"===b?(j=h*i,m=h*f,l=e*i,p=e*f,c[0]=j-p*d,c[4]=-g*f,c[8]=l+m*d,c[1]=m+l*d,c[5]=g*i,c[9]=p-j*d,c[2]= -g*e,c[6]=d,c[10]=g*h):"ZYX"===b?(j=g*i,m=g*f,l=d*i,p=d*f,c[0]=h*i,c[4]=l*e-m,c[8]=j*e+p,c[1]=h*f,c[5]=p*e+j,c[9]=m*e-l,c[2]=-e,c[6]=d*h,c[10]=g*h):"YZX"===b?(j=g*h,m=g*e,l=d*h,p=d*e,c[0]=h*i,c[4]=p-j*f,c[8]=l*f+m,c[1]=f,c[5]=g*i,c[9]=-d*i,c[2]=-e*i,c[6]=m*f+l,c[10]=j-p*f):"XZY"===b&&(j=g*h,m=g*e,l=d*h,p=d*e,c[0]=h*i,c[4]=-f,c[8]=e*i,c[1]=j*f+p,c[5]=g*i,c[9]=m*f-l,c[2]=l*f-m,c[6]=d*i,c[10]=p*f+j);return this},setRotationFromQuaternion:function(a){var b=this.elements,c=a.x,d=a.y,e=a.z,f=a.w,g=c+c, h=d+d,i=e+e,a=c*g,j=c*h,c=c*i,m=d*h,d=d*i,e=e*i,g=f*g,h=f*h,f=f*i;b[0]=1-(m+e);b[4]=j-f;b[8]=c+h;b[1]=j+f;b[5]=1-(a+e);b[9]=d-g;b[2]=c-h;b[6]=d+g;b[10]=1-(a+m);return this},lookAt:function(){var a=new THREE.Vector3,b=new THREE.Vector3,c=new THREE.Vector3;return function(d,e,f){var g=this.elements;c.subVectors(d,e).normalize();0===c.length()&&(c.z=1);a.crossVectors(f,c).normalize();0===a.length()&&(c.x+=1E-4,a.crossVectors(f,c).normalize());b.crossVectors(c,a);g[0]=a.x;g[4]=b.x;g[8]=c.x;g[1]=a.y;g[5]= -b.y;g[9]=c.y;g[2]=a.z;g[6]=b.z;g[10]=c.z;return this}}(),multiply:function(a,b){return void 0!==b?(console.warn("DEPRECATED: Matrix4's .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead."),this.multiplyMatrices(a,b)):this.multiplyMatrices(this,a)},multiplyMatrices:function(a,b){var c=a.elements,d=b.elements,e=this.elements,f=c[0],g=c[4],h=c[8],i=c[12],j=c[1],m=c[5],l=c[9],p=c[13],r=c[2],s=c[6],n=c[10],q=c[14],y=c[3],u=c[7],x=c[11],c=c[15],t=d[0],D=d[4],J=d[8],F=d[12], -z=d[1],H=d[5],L=d[9],I=d[13],N=d[2],A=d[6],U=d[10],G=d[14],K=d[3],M=d[7],T=d[11],d=d[15];e[0]=f*t+g*z+h*N+i*K;e[4]=f*D+g*H+h*A+i*M;e[8]=f*J+g*L+h*U+i*T;e[12]=f*F+g*I+h*G+i*d;e[1]=j*t+m*z+l*N+p*K;e[5]=j*D+m*H+l*A+p*M;e[9]=j*J+m*L+l*U+p*T;e[13]=j*F+m*I+l*G+p*d;e[2]=r*t+s*z+n*N+q*K;e[6]=r*D+s*H+n*A+q*M;e[10]=r*J+s*L+n*U+q*T;e[14]=r*F+s*I+n*G+q*d;e[3]=y*t+u*z+x*N+c*K;e[7]=y*D+u*H+x*A+c*M;e[11]=y*J+u*L+x*U+c*T;e[15]=y*F+u*I+x*G+c*d;return this},multiplyToArray:function(a,b,c){var d=this.elements;this.multiplyMatrices(a, +b.y;g[9]=c.y;g[2]=a.z;g[6]=b.z;g[10]=c.z;return this}}(),multiply:function(a,b){return void 0!==b?(console.warn("DEPRECATED: Matrix4's .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead."),this.multiplyMatrices(a,b)):this.multiplyMatrices(this,a)},multiplyMatrices:function(a,b){var c=a.elements,d=b.elements,e=this.elements,f=c[0],g=c[4],h=c[8],i=c[12],j=c[1],m=c[5],l=c[9],p=c[13],r=c[2],s=c[6],n=c[10],q=c[14],y=c[3],u=c[7],x=c[11],c=c[15],t=d[0],E=d[4],J=d[8],F=d[12], +z=d[1],H=d[5],K=d[9],G=d[13],L=d[2],B=d[6],P=d[10],C=d[14],I=d[3],M=d[7],U=d[11],d=d[15];e[0]=f*t+g*z+h*L+i*I;e[4]=f*E+g*H+h*B+i*M;e[8]=f*J+g*K+h*P+i*U;e[12]=f*F+g*G+h*C+i*d;e[1]=j*t+m*z+l*L+p*I;e[5]=j*E+m*H+l*B+p*M;e[9]=j*J+m*K+l*P+p*U;e[13]=j*F+m*G+l*C+p*d;e[2]=r*t+s*z+n*L+q*I;e[6]=r*E+s*H+n*B+q*M;e[10]=r*J+s*K+n*P+q*U;e[14]=r*F+s*G+n*C+q*d;e[3]=y*t+u*z+x*L+c*I;e[7]=y*E+u*H+x*B+c*M;e[11]=y*J+u*K+x*P+c*U;e[15]=y*F+u*G+x*C+c*d;return this},multiplyToArray:function(a,b,c){var d=this.elements;this.multiplyMatrices(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]*=a;b[4]*=a;b[8]*=a;b[12]*=a;b[1]*=a;b[5]*=a;b[9]*=a;b[13]*=a;b[2]*=a;b[6]*=a;b[10]*=a;b[14]*=a;b[3]*=a;b[7]*=a;b[11]*=a;b[15]*=a;return this},multiplyVector3:function(a){console.warn("DEPRECATED: Matrix4's .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) or vector.applyProjection( matrix ) instead."); return a.applyProjection(this)},multiplyVector4:function(a){console.warn("DEPRECATED: Matrix4's .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead.");return a.applyMatrix4(this)},multiplyVector3Array:function(){var a=new THREE.Vector3;return function(b){for(var c=0,d=b.length;cd;d++)if(b[d].distanceToPoint(c)b&&0a&&0f||1c?c:a},clampBottom:function(a,b){return a=c)return 1;a=(a-b)/(c-b);return a*a*(3-2*a)},smootherstep:function(a,b,c){if(a<=b)return 0;if(a>=c)return 1;a=(a-b)/(c-b);return a*a*a*(a*(6*a-15)+10)},random16:function(){return(65280*Math.random()+255*Math.random())/65535},randInt:function(a,b){return a+Math.floor(Math.random()*(b-a+1))},randFloat:function(a, b){return a+Math.random()*(b-a)},randFloatSpread:function(a){return a*(0.5-Math.random())},sign:function(a){return 0>a?-1:0this.points.length-2?this.points.length-1:f+1;c[3]=f>this.points.length-3?this.points.length-1: f+2;j=this.points[c[0]];m=this.points[c[1]];l=this.points[c[2]];p=this.points[c[3]];h=g*g;i=g*h;d.x=b(j.x,m.x,l.x,p.x,g,h,i);d.y=b(j.y,m.y,l.y,p.y,g,h,i);d.z=b(j.z,m.z,l.z,p.z,g,h,i);return d};this.getControlPointsArray=function(){var a,b,c=this.points.length,d=[];for(a=0;ah.scale.x)return p;p.push({distance:r,point:h.position,face:null,object:h})}else if(h instanceof -a.LOD)f.getPositionFromMatrix(h.matrixWorld),r=j.ray.origin.distanceTo(f),i(h.getObjectForDistance(r),j,p);else if(h instanceof a.Mesh){f.getPositionFromMatrix(h.matrixWorld);b.set(f,h.geometry.boundingSphere.radius*h.matrixWorld.getMaxScaleOnAxis());if(!j.ray.isIntersectionSphere(b))return p;var r=h.geometry,s=r.vertices,n=h.material instanceof a.MeshFaceMaterial,q=!0===n?h.material.materials:null,y=h.material.side,u,x,t,D=j.precision;g.getInverse(h.matrixWorld);c.copy(j.ray).applyMatrix4(g);for(var J= -0,F=r.faces.length;JH)){y=y.side;if(y!==a.DoubleSide&&(u=c.direction.dot(d.normal),!(y===a.FrontSide?0>u:0j.far)){e=c.at(H,e);if(z instanceof a.Face3){if(y=s[z.a],u=s[z.b],x=s[z.c],!a.Triangle.containsPoint(e,y,u,x))continue}else if(z instanceof a.Face4){if(y=s[z.a],u=s[z.b],x=s[z.c],t=s[z.d], +a.LOD)f.getPositionFromMatrix(h.matrixWorld),r=j.ray.origin.distanceTo(f),i(h.getObjectForDistance(r),j,p);else if(h instanceof a.Mesh){f.getPositionFromMatrix(h.matrixWorld);b.set(f,h.geometry.boundingSphere.radius*h.matrixWorld.getMaxScaleOnAxis());if(!j.ray.isIntersectionSphere(b))return p;var r=h.geometry,s=r.vertices,n=h.material instanceof a.MeshFaceMaterial,q=!0===n?h.material.materials:null,y=h.material.side,u,x,t,E=j.precision;g.getInverse(h.matrixWorld);c.copy(j.ray).applyMatrix4(g);for(var J= +0,F=r.faces.length;JH)){y=y.side;if(y!==a.DoubleSide&&(u=c.direction.dot(d.normal),!(y===a.FrontSide?0>u:0j.far)){e=c.at(H,e);if(z instanceof a.Face3){if(y=s[z.a],u=s[z.b],x=s[z.c],!a.Triangle.containsPoint(e,y,u,x))continue}else if(z instanceof a.Face4){if(y=s[z.a],u=s[z.b],x=s[z.c],t=s[z.d], !a.Triangle.containsPoint(e,y,u,t)&&!a.Triangle.containsPoint(e,u,x,t))continue}else throw Error("face type not supported");p.push({distance:H,point:j.ray.at(H),face:z,faceIndex:J,object:h})}}}}}},j=function(a,b,c){for(var a=a.getDescendants(),d=0,e=a.length;de&&0>f||0>g&&0>h)return!1;0>e?c=Math.max(c,e/(e-f)):0>f&&(d=Math.min(d,e/(e-f)));0>g?c=Math.max(c,g/(g-h)):0>h&&(d=Math.min(d,g/(g-h)));if(d< -c)return!1;a.lerp(b,c);b.lerp(a,1-d);return!0}var e,f,g=[],h=0,i,j,m=[],l=0,p,r,s=[],n=0,q,y=[],u=0,x,t,D=[],J=0,F,z,H=[],L=0,I={objects:[],sprites:[],lights:[],elements:[]},N=new THREE.Vector3,A=new THREE.Vector4,U=new THREE.Box3(new THREE.Vector3(-1,-1,-1),new THREE.Vector3(1,1,1)),G=new THREE.Box3,K=Array(3),M=Array(4),T=new THREE.Matrix4,$=new THREE.Matrix4,wa,fb=new THREE.Matrix4,B=new THREE.Matrix3,ca=new THREE.Matrix3,qa=new THREE.Vector3,ga=new THREE.Frustum,ja=new THREE.Vector4,E=new THREE.Vector4; -this.projectVector=function(a,b){b.matrixWorldInverse.getInverse(b.matrixWorld);$.multiplyMatrices(b.projectionMatrix,b.matrixWorldInverse);return a.applyProjection($)};this.unprojectVector=function(a,b){b.projectionMatrixInverse.getInverse(b.projectionMatrix);$.multiplyMatrices(b.matrixWorld,b.projectionMatrixInverse);return a.applyProjection($)};this.pickingRay=function(a,b){a.z=-1;var c=new THREE.Vector3(a.x,a.y,1);this.unprojectVector(a,b);this.unprojectVector(c,b);c.sub(a).normalize();return new THREE.Raycaster(a, -c)};this.projectScene=function(g,h,l,Xa){var Ba=!1,ma,fa,X,V,Y,ia,ha,na,Ka,Ya,pa,Na,Qa;z=t=q=r=0;I.elements.length=0;g.updateMatrixWorld();void 0===h.parent&&h.updateMatrixWorld();T.copy(h.matrixWorldInverse.getInverse(h.matrixWorld));$.multiplyMatrices(h.projectionMatrix,T);ca.getInverse(T);ca.transpose();ga.setFromMatrix($);f=0;I.objects.length=0;I.sprites.length=0;I.lights.length=0;var Va=function(b){for(var c=0,d=b.children.length;ci.positionScreen.x||1i.positionScreen.y||1i.positionScreen.z||1(ha.positionScreen.x-V.positionScreen.x)*(Y.positionScreen.y-V.positionScreen.y)-(ha.positionScreen.y-V.positionScreen.y)*(Y.positionScreen.x-V.positionScreen.x),ia===THREE.DoubleSide||Ba===(ia===THREE.FrontSide))r===n?(pa=new THREE.RenderableFace3,s.push(pa),n++,r++,p=pa):p=s[r++],p.v1.copy(V),p.v2.copy(Y),p.v3.copy(ha);else continue; -else continue;else if(fa instanceof THREE.Face4)if(V=m[fa.a],Y=m[fa.b],ha=m[fa.c],pa=m[fa.d],M[0]=V.positionScreen,M[1]=Y.positionScreen,M[2]=ha.positionScreen,M[3]=pa.positionScreen,!0===V.visible||!0===Y.visible||!0===ha.visible||!0===pa.visible||U.isIntersectionBox(G.setFromPoints(M)))if(Ba=0>(pa.positionScreen.x-V.positionScreen.x)*(Y.positionScreen.y-V.positionScreen.y)-(pa.positionScreen.y-V.positionScreen.y)*(Y.positionScreen.x-V.positionScreen.x)||0>(Y.positionScreen.x-ha.positionScreen.x)* -(pa.positionScreen.y-ha.positionScreen.y)-(Y.positionScreen.y-ha.positionScreen.y)*(pa.positionScreen.x-ha.positionScreen.x),ia===THREE.DoubleSide||Ba===(ia===THREE.FrontSide)){if(q===u){var Bb=new THREE.RenderableFace4;y.push(Bb);u++;q++;p=Bb}else p=y[q++];p.v1.copy(V);p.v2.copy(Y);p.v3.copy(ha);p.v4.copy(pa)}else continue;else continue;p.normalModel.copy(fa.normal);!1===Ba&&(ia===THREE.BackSide||ia===THREE.DoubleSide)&&p.normalModel.negate();p.normalModel.applyMatrix3(B).normalize();p.normalModelView.copy(p.normalModel).applyMatrix3(ca); -p.centroidModel.copy(fa.centroid).applyMatrix4(wa);ha=fa.vertexNormals;V=0;for(Y=ha.length;VA.z&&(z===L?(Ba=new THREE.RenderableParticle,H.push(Ba),L++,z++,F=Ba):F=H[z++],F.object=na,F.x=A.x/A.w,F.y=A.y/A.w,F.z=A.z,F.rotation=na.rotation.z,F.scale.x=na.scale.x*Math.abs(F.x-(A.x+h.projectionMatrix.elements[0])/ -(A.w+h.projectionMatrix.elements[12])),F.scale.y=na.scale.y*Math.abs(F.y-(A.y+h.projectionMatrix.elements[5])/(A.w+h.projectionMatrix.elements[13])),F.material=na.material,I.elements.push(F)));!0===Xa&&I.elements.sort(c);return I}};THREE.Face3=function(a,b,c,d,e,f){this.a=a;this.b=b;this.c=c;this.normal=d instanceof THREE.Vector3?d:new THREE.Vector3;this.vertexNormals=d instanceof Array?d:[];this.color=e instanceof THREE.Color?e:new THREE.Color;this.vertexColors=e instanceof Array?e:[];this.vertexTangents=[];this.materialIndex=void 0!==f?f:0;this.centroid=new THREE.Vector3}; +c)return!1;a.lerp(b,c);b.lerp(a,1-d);return!0}var e,f,g=[],h=0,i,j,m=[],l=0,p,r,s=[],n=0,q,y=[],u=0,x,t,E=[],J=0,F,z,H=[],K=0,G={objects:[],sprites:[],lights:[],elements:[]},L=new THREE.Vector3,B=new THREE.Vector4,P=new THREE.Box3(new THREE.Vector3(-1,-1,-1),new THREE.Vector3(1,1,1)),C=new THREE.Box3,I=Array(3),M=Array(4),U=new THREE.Matrix4,ea=new THREE.Matrix4,xa,La=new THREE.Matrix4,A=new THREE.Matrix3,ca=new THREE.Matrix3,ga=new THREE.Vector3,ma=new THREE.Frustum,N=new THREE.Vector4,fa=new THREE.Vector4; +this.projectVector=function(a,b){b.matrixWorldInverse.getInverse(b.matrixWorld);ea.multiplyMatrices(b.projectionMatrix,b.matrixWorldInverse);return a.applyProjection(ea)};this.unprojectVector=function(a,b){b.projectionMatrixInverse.getInverse(b.projectionMatrix);ea.multiplyMatrices(b.matrixWorld,b.projectionMatrixInverse);return a.applyProjection(ea)};this.pickingRay=function(a,b){a.z=-1;var c=new THREE.Vector3(a.x,a.y,1);this.unprojectVector(a,b);this.unprojectVector(c,b);c.sub(a).normalize();return new THREE.Raycaster(a, +c)};this.projectScene=function(g,h,l,Ja){var pa=!1,ta,Z,ka,W,V,la,ha,ja,Pa,jb,oa,Va,Qa;z=t=q=r=0;G.elements.length=0;g.updateMatrixWorld();void 0===h.parent&&h.updateMatrixWorld();U.copy(h.matrixWorldInverse.getInverse(h.matrixWorld));ea.multiplyMatrices(h.projectionMatrix,U);ca.getNormalMatrix(U);ma.setFromMatrix(ea);f=0;G.objects.length=0;G.sprites.length=0;G.lights.length=0;var Aa=function(b){for(var c=0,d=b.children.length;ci.positionScreen.x||1i.positionScreen.y||1i.positionScreen.z||1(ha.positionScreen.x-W.positionScreen.x)*(V.positionScreen.y-W.positionScreen.y)-(ha.positionScreen.y-W.positionScreen.y)*(V.positionScreen.x-W.positionScreen.x),la===THREE.DoubleSide||pa===(la===THREE.FrontSide))r===n?(oa=new THREE.RenderableFace3,s.push(oa),n++,r++,p=oa):p=s[r++],p.v1.copy(W),p.v2.copy(V),p.v3.copy(ha);else continue; +else continue;else if(Z instanceof THREE.Face4)if(W=m[Z.a],V=m[Z.b],ha=m[Z.c],oa=m[Z.d],M[0]=W.positionScreen,M[1]=V.positionScreen,M[2]=ha.positionScreen,M[3]=oa.positionScreen,!0===W.visible||!0===V.visible||!0===ha.visible||!0===oa.visible||P.isIntersectionBox(C.setFromPoints(M)))if(pa=0>(oa.positionScreen.x-W.positionScreen.x)*(V.positionScreen.y-W.positionScreen.y)-(oa.positionScreen.y-W.positionScreen.y)*(V.positionScreen.x-W.positionScreen.x)||0>(V.positionScreen.x-ha.positionScreen.x)*(oa.positionScreen.y- +ha.positionScreen.y)-(V.positionScreen.y-ha.positionScreen.y)*(oa.positionScreen.x-ha.positionScreen.x),la===THREE.DoubleSide||pa===(la===THREE.FrontSide)){if(q===u){var rb=new THREE.RenderableFace4;y.push(rb);u++;q++;p=rb}else p=y[q++];p.v1.copy(W);p.v2.copy(V);p.v3.copy(ha);p.v4.copy(oa)}else continue;else continue;p.normalModel.copy(Z.normal);!1===pa&&(la===THREE.BackSide||la===THREE.DoubleSide)&&p.normalModel.negate();p.normalModel.applyMatrix3(A).normalize();p.normalModelView.copy(p.normalModel).applyMatrix3(ca); +p.centroidModel.copy(Z.centroid).applyMatrix4(xa);ha=Z.vertexNormals;W=0;for(V=ha.length;WB.z&&(z===K?(pa=new THREE.RenderableParticle,H.push(pa),K++,z++,F=pa):F=H[z++],F.object=ja,F.x=B.x/B.w,F.y=B.y/B.w,F.z=B.z,F.rotation=ja.rotation.z,F.scale.x=ja.scale.x*Math.abs(F.x-(B.x+h.projectionMatrix.elements[0])/ +(B.w+h.projectionMatrix.elements[12])),F.scale.y=ja.scale.y*Math.abs(F.y-(B.y+h.projectionMatrix.elements[5])/(B.w+h.projectionMatrix.elements[13])),F.material=ja.material,G.elements.push(F)));!0===Ja&&G.elements.sort(c);return G}};THREE.Face3=function(a,b,c,d,e,f){this.a=a;this.b=b;this.c=c;this.normal=d instanceof THREE.Vector3?d:new THREE.Vector3;this.vertexNormals=d instanceof Array?d:[];this.color=e instanceof THREE.Color?e:new THREE.Color;this.vertexColors=e instanceof Array?e:[];this.vertexTangents=[];this.materialIndex=void 0!==f?f:0;this.centroid=new THREE.Vector3}; THREE.Face3.prototype={constructor:THREE.Face3,clone:function(){var a=new THREE.Face3(this.a,this.b,this.c);a.normal.copy(this.normal);a.color.copy(this.color);a.centroid.copy(this.centroid);a.materialIndex=this.materialIndex;var b,c;b=0;for(c=this.vertexNormals.length;be?-1:1,f.vertexTangents[d]=new THREE.Vector4(A.x,A.y,A.z,e)}this.hasTangents=!0},computeLineDistances:function(){for(var a=0,b=this.vertices,c=0,d=b.length;ce?-1:1,f.vertexTangents[d]=new THREE.Vector4(B.x,B.y,B.z,e)}this.hasTangents=!0},computeLineDistances:function(){for(var a=0,b=this.vertices,c=0,d=b.length;ci;i++)if(h[i]==h[(i+1)%3]){e.push(f);break}}else if(a instanceof THREE.Face4){a.a=c[a.a];a.b=c[a.b];a.c=c[a.c];a.d=c[a.d];h=[a.a,a.b,a.c,a.d];d=-1;for(i=0;4>i;i++)h[i]==h[(i+1)%4]&&(0<=d&&e.push(f),d=i);if(0<= d){h.splice(d,1);var m=new THREE.Face3(h[0],h[1],h[2],a.normal,a.color,a.materialIndex);h=0;for(i=this.faceVertexUvs.length;hb.max.x&&(b.max.x= -c),db.max.y&&(b.max.y=d),eb.max.z&&(b.max.z=e)}if(void 0===a||0===a.length)this.boundingBox.min.set(0,0,0),this.boundingBox.max.set(0,0,0)},computeBoundingSphere:function(){null===this.boundingSphere&&(this.boundingSphere=new THREE.Sphere);var a=this.attributes.position.array;if(a){for(var b,c=0,d,e,f=0,g=a.length;fc&&(c=b);this.boundingSphere.radius=Math.sqrt(c)}},computeVertexNormals:function(){if(this.attributes.position){var a, +this.verticesNeedUpdate=!0);void 0!==c&&((new THREE.Matrix3).getNormalMatrix(a).multiplyVector3Array(c),this.normalizeNormals(),this.normalsNeedUpdate=!0)},computeBoundingBox:function(){null===this.boundingBox&&(this.boundingBox=new THREE.Box3);var a=this.attributes.position.array;if(a){var b=this.boundingBox,c,d,e;3<=a.length&&(b.min.x=b.max.x=a[0],b.min.y=b.max.y=a[1],b.min.z=b.max.z=a[2]);for(var f=3,g=a.length;fb.max.x&&(b.max.x=c),db.max.y&&(b.max.y=d),eb.max.z&&(b.max.z=e)}if(void 0===a||0===a.length)this.boundingBox.min.set(0,0,0),this.boundingBox.max.set(0,0,0)},computeBoundingSphere:function(){null===this.boundingSphere&&(this.boundingSphere=new THREE.Sphere);var a=this.attributes.position.array;if(a){for(var b,c=0,d,e,f=0,g=a.length;fc&&(c=b);this.boundingSphere.radius=Math.sqrt(c)}},computeVertexNormals:function(){if(this.attributes.position){var a, b,c,d;a=this.attributes.position.array.length;if(void 0===this.attributes.normal)this.attributes.normal={itemSize:3,array:new Float32Array(a),numItems:a};else{a=0;for(b=this.attributes.normal.array.length;aqa?-1:1;h[4*a]=T.x;h[4*a+1]=T.y;h[4*a+2]=T.z;h[4*a+3]=B}if(void 0===this.attributes.index||void 0===this.attributes.position||void 0===this.attributes.normal||void 0===this.attributes.uv)console.warn("Missing required attributes (index, position, normal or uv) in BufferGeometry.computeTangents()");else{var b=this.attributes.index.array,c=this.attributes.position.array, -d=this.attributes.normal.array,e=this.attributes.uv.array,f=c.length/3;if(void 0===this.attributes.tangent){var g=4*f;this.attributes.tangent={itemSize:4,array:new Float32Array(g),numItems:g}}for(var h=this.attributes.tangent.array,i=[],j=[],g=0;gga?-1:1;h[4*a]=U.x;h[4*a+1]=U.y;h[4*a+2]=U.z;h[4*a+3]=A}if(void 0===this.attributes.index||void 0===this.attributes.position||void 0===this.attributes.normal||void 0===this.attributes.uv)console.warn("Missing required attributes (index, position, normal or uv) in BufferGeometry.computeTangents()");else{var b=this.attributes.index.array,c=this.attributes.position.array, +d=this.attributes.normal.array,e=this.attributes.uv.array,f=c.length/3;if(void 0===this.attributes.tangent){var g=4*f;this.attributes.tangent={itemSize:4,array:new Float32Array(g),numItems:g}}for(var h=this.attributes.tangent.array,i=[],j=[],g=0;gG.parameters.opacity&&(G.parameters.transparent=!0);G.parameters.normalMap?(I=THREE.ShaderLib.normalmap,A=THREE.UniformsUtils.clone(I.uniforms),q=G.parameters.color,U=G.parameters.specular,n=G.parameters.ambient,N=G.parameters.shininess,A.tNormal.value=z.textures[G.parameters.normalMap],G.parameters.normalScale&&A.uNormalScale.value.set(G.parameters.normalScale[0],G.parameters.normalScale[1]),G.parameters.map&&(A.tDiffuse.value=G.parameters.map,A.enableDiffuse.value=!0),G.parameters.envMap&&(A.tCube.value= -G.parameters.envMap,A.enableReflection.value=!0,A.uReflectivity.value=G.parameters.reflectivity),G.parameters.lightMap&&(A.tAO.value=G.parameters.lightMap,A.enableAO.value=!0),G.parameters.specularMap&&(A.tSpecular.value=z.textures[G.parameters.specularMap],A.enableSpecular.value=!0),G.parameters.displacementMap&&(A.tDisplacement.value=z.textures[G.parameters.displacementMap],A.enableDisplacement.value=!0,A.uDisplacementBias.value=G.parameters.displacementBias,A.uDisplacementScale.value=G.parameters.displacementScale), -A.uDiffuseColor.value.setHex(q),A.uSpecularColor.value.setHex(U),A.uAmbientColor.value.setHex(n),A.uShininess.value=N,G.parameters.opacity&&(A.uOpacity.value=G.parameters.opacity),r=new THREE.ShaderMaterial({fragmentShader:I.fragmentShader,vertexShader:I.vertexShader,uniforms:A,lights:!0,fog:!0})):r=new THREE[G.type](G.parameters);r.name=K;z.materials[K]=r}for(K in L.materials)if(G=L.materials[K],G.parameters.materials){M=[];for(q=0;qC.parameters.opacity&&(C.parameters.transparent=!0);C.parameters.normalMap?(G=THREE.ShaderLib.normalmap,B=THREE.UniformsUtils.clone(G.uniforms),q=C.parameters.color,P=C.parameters.specular,n=C.parameters.ambient,L=C.parameters.shininess,B.tNormal.value=z.textures[C.parameters.normalMap],C.parameters.normalScale&&B.uNormalScale.value.set(C.parameters.normalScale[0],C.parameters.normalScale[1]),C.parameters.map&&(B.tDiffuse.value=C.parameters.map,B.enableDiffuse.value=!0),C.parameters.envMap&&(B.tCube.value= +C.parameters.envMap,B.enableReflection.value=!0,B.uReflectivity.value=C.parameters.reflectivity),C.parameters.lightMap&&(B.tAO.value=C.parameters.lightMap,B.enableAO.value=!0),C.parameters.specularMap&&(B.tSpecular.value=z.textures[C.parameters.specularMap],B.enableSpecular.value=!0),C.parameters.displacementMap&&(B.tDisplacement.value=z.textures[C.parameters.displacementMap],B.enableDisplacement.value=!0,B.uDisplacementBias.value=C.parameters.displacementBias,B.uDisplacementScale.value=C.parameters.displacementScale), +B.uDiffuseColor.value.setHex(q),B.uSpecularColor.value.setHex(P),B.uAmbientColor.value.setHex(n),B.uShininess.value=L,C.parameters.opacity&&(B.uOpacity.value=C.parameters.opacity),r=new THREE.ShaderMaterial({fragmentShader:G.fragmentShader,vertexShader:G.vertexShader,uniforms:B,lights:!0,fog:!0})):r=new THREE[C.type](C.parameters);r.name=I;z.materials[I]=r}for(I in K.materials)if(C=K.materials[I],C.parameters.materials){M=[];for(q=0;q=this.objects[d].distance)this.objects[d-1].object.visible=!1,this.objects[d].object.visible=!0;else break;for(;dJ&&t.clearRect(ra.min.x|0,ra.min.y|0,ra.max.x-ra.min.x|0,ra.max.y-ra.min.y|0),0=h||(h*=f.intensity,c.add(Ka.multiplyScalar(h)))}else f instanceof THREE.PointLight&&(g=ka.getPositionFromMatrix(f.matrixWorld),h=b.dot(ka.subVectors(g,a).normalize()),0>=h||(h*=0==f.distance?1:1-Math.min(a.distanceTo(g)/f.distance,1),0!=h&&(h*=f.intensity,c.add(Ka.multiplyScalar(h)))))}}function z(a,d,e,f,g,h,k,i){m.info.render.vertices+= -3;m.info.render.faces++;b(i.opacity);c(i.blending);B=a.positionScreen.x;ca=a.positionScreen.y;qa=d.positionScreen.x;ga=d.positionScreen.y;ja=e.positionScreen.x;E=e.positionScreen.y;y(B,ca,qa,ga,ja,E);(i instanceof THREE.MeshLambertMaterial||i instanceof THREE.MeshPhongMaterial)&&null===i.map?(ha.copy(i.color),na.copy(i.emissive),i.vertexColors===THREE.FaceColors&&ha.multiply(k.color),!1===i.wireframe&&i.shading==THREE.SmoothShading&&3==k.vertexNormalsLength?(X.copy(nb),V.copy(nb),Y.copy(nb),q(k.v1.positionWorld, -k.vertexNormalsModel[0],X),q(k.v2.positionWorld,k.vertexNormalsModel[1],V),q(k.v3.positionWorld,k.vertexNormalsModel[2],Y),X.multiply(ha).add(na),V.multiply(ha).add(na),Y.multiply(ha).add(na),ia.addColors(V,Y).multiplyScalar(0.5),Va=H(X,V,Y,ia),J(B,ca,qa,ga,ja,E,0,0,1,0,0,1,Va)):(fa.copy(nb),q(k.centroidModel,k.normalModel,fa),fa.multiply(ha).add(na),!0===i.wireframe?D(fa,i.wireframeLinewidth,i.wireframeLinecap,i.wireframeLinejoin):F(fa))):i instanceof THREE.MeshBasicMaterial||i instanceof THREE.MeshLambertMaterial|| -i instanceof THREE.MeshPhongMaterial?null!==i.map?i.map.mapping instanceof THREE.UVMapping&&(Wa=k.uvs[0],G(B,ca,qa,ga,ja,E,Wa[f].x,Wa[f].y,Wa[g].x,Wa[g].y,Wa[h].x,Wa[h].y,i.map)):null!==i.envMap?i.envMap.mapping instanceof THREE.SphericalReflectionMapping&&(ka.copy(k.vertexNormalsModelView[f]),Bb=0.5*ka.x+0.5,Kb=0.5*ka.y+0.5,ka.copy(k.vertexNormalsModelView[g]),Nb=0.5*ka.x+0.5,Ob=0.5*ka.y+0.5,ka.copy(k.vertexNormalsModelView[h]),Pb=0.5*ka.x+0.5,Tb=0.5*ka.y+0.5,G(B,ca,qa,ga,ja,E,Bb,Kb,Nb,Ob,Pb,Tb, -i.envMap)):(fa.copy(i.color),i.vertexColors===THREE.FaceColors&&fa.multiply(k.color),!0===i.wireframe?D(fa,i.wireframeLinewidth,i.wireframeLinecap,i.wireframeLinejoin):F(fa)):i instanceof THREE.MeshDepthMaterial?(Na=n.near,Qa=n.far,X.r=X.g=X.b=1-j(a.positionScreen.z*a.positionScreen.w,Na,Qa),V.r=V.g=V.b=1-j(d.positionScreen.z*d.positionScreen.w,Na,Qa),Y.r=Y.g=Y.b=1-j(e.positionScreen.z*e.positionScreen.w,Na,Qa),ia.addColors(V,Y).multiplyScalar(0.5),Va=H(X,V,Y,ia),J(B,ca,qa,ga,ja,E,0,0,1,0,0,1,Va)): -i instanceof THREE.MeshNormalMaterial&&(i.shading==THREE.FlatShading?(a=k.normalModelView,fa.setRGB(a.x,a.y,a.z).multiplyScalar(0.5).addScalar(0.5),!0===i.wireframe?D(fa,i.wireframeLinewidth,i.wireframeLinecap,i.wireframeLinejoin):F(fa)):i.shading==THREE.SmoothShading&&(a=k.vertexNormalsModelView[f],X.setRGB(a.x,a.y,a.z).multiplyScalar(0.5).addScalar(0.5),a=k.vertexNormalsModelView[g],V.setRGB(a.x,a.y,a.z).multiplyScalar(0.5).addScalar(0.5),a=k.vertexNormalsModelView[h],Y.setRGB(a.x,a.y,a.z).multiplyScalar(0.5).addScalar(0.5), -ia.addColors(V,Y).multiplyScalar(0.5),Va=H(X,V,Y,ia),J(B,ca,qa,ga,ja,E,0,0,1,0,0,1,Va)))}function y(a,b,c,d,e,f){t.beginPath();t.moveTo(a,b);t.lineTo(c,d);t.lineTo(e,f);t.closePath()}function A(a,b,c,d,e,f,g,h){t.beginPath();t.moveTo(a,b);t.lineTo(c,d);t.lineTo(e,f);t.lineTo(g,h);t.closePath()}function D(a,b,c,h){d(b);e(c);f(h);g(a.getStyle());t.stroke();Ia.expandByScalar(2*b)}function F(a){h(a.getStyle());t.fill()}function G(a,b,c,d,e,f,g,k,i,Ja,j,p,m){if(!(m instanceof THREE.DataTexture||void 0=== -m.image||0==m.image.width)){if(!0===m.needsUpdate){var l=m.wrapS==THREE.RepeatWrapping,n=m.wrapT==THREE.RepeatWrapping;Ya[m.id]=t.createPattern(m.image,!0===l&&!0===n?"repeat":!0===l&&!1===n?"repeat-x":!1===l&&!0===n?"repeat-y":"no-repeat");m.needsUpdate=!1}void 0===Ya[m.id]?h("rgba(0,0,0,1)"):h(Ya[m.id]);var l=m.offset.x/m.repeat.x,n=m.offset.y/m.repeat.y,mb=m.image.width*m.repeat.x,q=m.image.height*m.repeat.y,g=(g+l)*mb,k=(1-k+n)*q,c=c-a,d=d-b,e=e-a,f=f-b,i=(i+l)*mb-g,Ja=(1-Ja+n)*q-k,j=(j+l)*mb- -g,p=(1-p+n)*q-k,l=i*p-j*Ja;0===l?(void 0===pa[m.id]&&(b=document.createElement("canvas"),b.width=m.image.width,b.height=m.image.height,b=b.getContext("2d"),b.drawImage(m.image,0,0),pa[m.id]=b.getImageData(0,0,m.image.width,m.image.height).data),b=pa[m.id],g=4*(Math.floor(g)+Math.floor(k)*m.image.width),fa.setRGB(b[g]/255,b[g+1]/255,b[g+2]/255),F(fa)):(l=1/l,m=(p*c-Ja*e)*l,Ja=(p*d-Ja*f)*l,c=(i*e-j*c)*l,d=(i*f-j*d)*l,a=a-m*g-c*k,g=b-Ja*g-d*k,t.save(),t.transform(m,Ja,c,d,a,g),t.fill(),t.restore())}} -function J(a,b,c,d,e,f,g,h,k,i,Ja,j,m){var p,l;p=m.width-1;l=m.height-1;g*=p;h*=l;c-=a;d-=b;e-=a;f-=b;k=k*p-g;i=i*l-h;Ja=Ja*p-g;j=j*l-h;l=1/(k*j-Ja*i);p=(j*c-i*e)*l;i=(j*d-i*f)*l;c=(k*e-Ja*c)*l;d=(k*f-Ja*d)*l;a=a-p*g-c*h;b=b-i*g-d*h;t.save();t.transform(p,i,c,d,a,b);t.clip();t.drawImage(m,0,0);t.restore()}function H(a,b,c,d){Ra[0]=255*a.r|0;Ra[1]=255*a.g|0;Ra[2]=255*a.b|0;Ra[4]=255*b.r|0;Ra[5]=255*b.g|0;Ra[6]=255*b.b|0;Ra[8]=255*c.r|0;Ra[9]=255*c.g|0;Ra[10]=255*c.b|0;Ra[12]=255*d.r|0;Ra[13]=255*d.g| -0;Ra[14]=255*d.b|0;Eb.putImageData(k,0,0);lb.drawImage(jb,0,0);return ub}function I(a,b){var c=b.x-a.x,d=b.y-a.y,e=c*c+d*d;0!==e&&(e=1/Math.sqrt(e),c*=e,d*=e,b.x+=c,b.y+=d,a.x-=c,a.y-=d)}if(!1===n instanceof THREE.Camera)console.error("THREE.CanvasRenderer.render: camera is not an instance of THREE.Camera.");else{!0===this.autoClear&&this.clear();t.setTransform(1,0,0,-1,u,x);m.info.render.vertices=0;m.info.render.faces=0;l=s.projectScene(a,n,this.sortObjects,this.sortElements);p=l.elements;r=l.lights; -nb.setRGB(0,0,0);$b.setRGB(0,0,0);Oa.setRGB(0,0,0);for(var L=0,U=r.length;L>1,Oc=N.height>>1,mb=ua.scale.x*u,wb=ua.scale.y*x,Ja=mb*Nc,vb=wb*Oc,Ia.min.set(W.x-Ja,W.y-vb),Ia.max.set(W.x+Ja,W.y+vb),!1!==tb.isIntersectionBox(Ia)&& -(t.save(),t.translate(W.x,W.y),t.rotate(-ua.rotation),t.scale(mb,-wb),t.translate(-Nc,-Oc),t.drawImage(N,0,0),t.restore())):O instanceof THREE.ParticleCanvasMaterial&&(Ja=ua.scale.x*u,vb=ua.scale.y*x,Ia.min.set(W.x-Ja,W.y-vb),Ia.max.set(W.x+Ja,W.y+vb),!1!==tb.isIntersectionBox(Ia)&&(g(O.color.getStyle()),h(O.color.getStyle()),t.save(),t.translate(W.x,W.y),t.rotate(-ua.rotation),t.scale(Ja,vb),O.program(t),t.restore()))}else if(N instanceof THREE.RenderableLine)K=N.v1,M=N.v2,K.positionScreen.x*=u, -K.positionScreen.y*=x,M.positionScreen.x*=u,M.positionScreen.y*=x,Ia.setFromPoints([K.positionScreen,M.positionScreen]),!0===tb.isIntersectionBox(Ia)&&(W=K,ua=M,b(O.opacity),c(O.blending),t.beginPath(),t.moveTo(W.positionScreen.x,W.positionScreen.y),t.lineTo(ua.positionScreen.x,ua.positionScreen.y),O instanceof THREE.LineBasicMaterial?(d(O.linewidth),e(O.linecap),f(O.linejoin),g(O.color.getStyle()),t.stroke(),Ia.expandByScalar(2*O.linewidth)):O instanceof THREE.LineDashedMaterial&&(d(O.linewidth), -e(O.linecap),f(O.linejoin),g(O.color.getStyle()),i(O.dashSize,O.gapSize),t.stroke(),Ia.expandByScalar(2*O.linewidth),i(null,null)));else if(N instanceof THREE.RenderableFace3){K=N.v1;M=N.v2;T=N.v3;if(-1>K.positionScreen.z||1M.positionScreen.z||1T.positionScreen.z||1K.positionScreen.z||1M.positionScreen.z||1T.positionScreen.z||1$.positionScreen.z||1<$.positionScreen.z)continue; -K.positionScreen.x*=u;K.positionScreen.y*=x;M.positionScreen.x*=u;M.positionScreen.y*=x;T.positionScreen.x*=u;T.positionScreen.y*=x;$.positionScreen.x*=u;$.positionScreen.y*=x;wa.positionScreen.copy(M.positionScreen);fb.positionScreen.copy($.positionScreen);!0===O.overdraw&&(I(K.positionScreen,M.positionScreen),I(M.positionScreen,$.positionScreen),I($.positionScreen,K.positionScreen),I(T.positionScreen,wa.positionScreen),I(T.positionScreen,fb.positionScreen));Ia.setFromPoints([K.positionScreen,M.positionScreen, -T.positionScreen,$.positionScreen]);W=K;ua=M;Ja=T;vb=$;mb=wa;wb=fb;m.info.render.vertices+=4;m.info.render.faces++;b(O.opacity);c(O.blending);void 0!==O.map&&null!==O.map||void 0!==O.envMap&&null!==O.envMap?(z(W,ua,vb,0,1,3,N,O),z(mb,Ja,wb,1,2,3,N,O)):(B=W.positionScreen.x,ca=W.positionScreen.y,qa=ua.positionScreen.x,ga=ua.positionScreen.y,ja=Ja.positionScreen.x,E=Ja.positionScreen.y,Ma=vb.positionScreen.x,ib=vb.positionScreen.y,Ua=mb.positionScreen.x,Xa=mb.positionScreen.y,Ba=wb.positionScreen.x, -ma=wb.positionScreen.y,O instanceof THREE.MeshLambertMaterial||O instanceof THREE.MeshPhongMaterial?(ha.copy(O.color),na.copy(O.emissive),O.vertexColors===THREE.FaceColors&&ha.multiply(N.color),!1===O.wireframe&&O.shading==THREE.SmoothShading&&4==N.vertexNormalsLength?(X.copy(nb),V.copy(nb),Y.copy(nb),ia.copy(nb),q(N.v1.positionWorld,N.vertexNormalsModel[0],X),q(N.v2.positionWorld,N.vertexNormalsModel[1],V),q(N.v4.positionWorld,N.vertexNormalsModel[3],Y),q(N.v3.positionWorld,N.vertexNormalsModel[2], -ia),X.multiply(ha).add(na),V.multiply(ha).add(na),Y.multiply(ha).add(na),ia.multiply(ha).add(na),Va=H(X,V,Y,ia),y(B,ca,qa,ga,Ma,ib),J(B,ca,qa,ga,Ma,ib,0,0,1,0,0,1,Va),y(Ua,Xa,ja,E,Ba,ma),J(Ua,Xa,ja,E,Ba,ma,1,0,1,1,0,1,Va)):(fa.copy(nb),q(N.centroidModel,N.normalModel,fa),fa.multiply(ha).add(na),A(B,ca,qa,ga,ja,E,Ma,ib),!0===O.wireframe?D(fa,O.wireframeLinewidth,O.wireframeLinecap,O.wireframeLinejoin):F(fa))):O instanceof THREE.MeshBasicMaterial?(fa.copy(O.color),O.vertexColors===THREE.FaceColors&& -fa.multiply(N.color),A(B,ca,qa,ga,ja,E,Ma,ib),!0===O.wireframe?D(fa,O.wireframeLinewidth,O.wireframeLinecap,O.wireframeLinejoin):F(fa)):O instanceof THREE.MeshNormalMaterial?(W=void 0,O.shading==THREE.FlatShading?(W=N.normalModelView,fa.setRGB(W.x,W.y,W.z).multiplyScalar(0.5).addScalar(0.5),A(B,ca,qa,ga,ja,E,Ma,ib),!0===O.wireframe?D(fa,O.wireframeLinewidth,O.wireframeLinecap,O.wireframeLinejoin):F(fa)):O.shading==THREE.SmoothShading&&(W=N.vertexNormalsModelView[0],X.setRGB(W.x,W.y,W.z).multiplyScalar(0.5).addScalar(0.5), -W=N.vertexNormalsModelView[1],V.setRGB(W.x,W.y,W.z).multiplyScalar(0.5).addScalar(0.5),W=N.vertexNormalsModelView[3],Y.setRGB(W.x,W.y,W.z).multiplyScalar(0.5).addScalar(0.5),W=N.vertexNormalsModelView[2],ia.setRGB(W.x,W.y,W.z).multiplyScalar(0.5).addScalar(0.5),Va=H(X,V,Y,ia),y(B,ca,qa,ga,Ma,ib),J(B,ca,qa,ga,Ma,ib,0,0,1,0,0,1,Va),y(Ua,Xa,ja,E,Ba,ma),J(Ua,Xa,ja,E,Ba,ma,1,0,1,1,0,1,Va))):O instanceof THREE.MeshDepthMaterial&&(Na=n.near,Qa=n.far,X.r=X.g=X.b=1-j(W.positionScreen.z*W.positionScreen.w, -Na,Qa),V.r=V.g=V.b=1-j(ua.positionScreen.z*ua.positionScreen.w,Na,Qa),Y.r=Y.g=Y.b=1-j(vb.positionScreen.z*vb.positionScreen.w,Na,Qa),ia.r=ia.g=ia.b=1-j(Ja.positionScreen.z*Ja.positionScreen.w,Na,Qa),Va=H(X,V,Y,ia),y(B,ca,qa,ga,Ma,ib),J(B,ca,qa,ga,Ma,ib,0,0,1,0,0,1,Va),y(Ua,Xa,ja,E,Ba,ma),J(Ua,Xa,ja,E,Ba,ma,1,0,1,1,0,1,Va)))}ra.union(Ia)}}t.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", +THREE.Scene.prototype.__removeObject=function(a){if(a instanceof THREE.Light){var b=this.__lights.indexOf(a);-1!==b&&this.__lights.splice(b,1)}else a instanceof THREE.Camera||(b=this.__objects.indexOf(a),-1!==b&&(this.__objects.splice(b,1),this.__objectsRemoved.push(a),b=this.__objectsAdded.indexOf(a),-1!==b&&this.__objectsAdded.splice(b,1)));for(b=0;bJ&&t.clearRect(ua.min.x|0,ua.min.y|0,ua.max.x-ua.min.x|0,ua.max.y-ua.min.y|0),0=h||(h*=f.intensity,c.add(Pa.multiplyScalar(h)))}else f instanceof THREE.PointLight&&(g=ab.getPositionFromMatrix(f.matrixWorld),h=b.dot(ab.subVectors(g,a).normalize()),0>=h||(h*=0==f.distance?1:1-Math.min(a.distanceTo(g)/f.distance,1),0!=h&&(h*=f.intensity,c.add(Pa.multiplyScalar(h)))))}}function z(a,d,e,f,g,h,k,i){m.info.render.vertices+= +3;m.info.render.faces++;b(i.opacity);c(i.blending);A=a.positionScreen.x;ca=a.positionScreen.y;ga=d.positionScreen.x;ma=d.positionScreen.y;N=e.positionScreen.x;fa=e.positionScreen.y;y(A,ca,ga,ma,N,fa);(i instanceof THREE.MeshLambertMaterial||i instanceof THREE.MeshPhongMaterial)&&null===i.map?(ha.copy(i.color),ja.copy(i.emissive),i.vertexColors===THREE.FaceColors&&ha.multiply(k.color),!1===i.wireframe&&i.shading==THREE.SmoothShading&&3==k.vertexNormalsLength?(ka.copy(sb),W.copy(sb),V.copy(sb),q(k.v1.positionWorld, +k.vertexNormalsModel[0],ka),q(k.v2.positionWorld,k.vertexNormalsModel[1],W),q(k.v3.positionWorld,k.vertexNormalsModel[2],V),ka.multiply(ha).add(ja),W.multiply(ha).add(ja),V.multiply(ha).add(ja),la.addColors(W,V).multiplyScalar(0.5),Aa=H(ka,W,V,la),J(A,ca,ga,ma,N,fa,0,0,1,0,0,1,Aa)):(Z.copy(sb),q(k.centroidModel,k.normalModel,Z),Z.multiply(ha).add(ja),!0===i.wireframe?E(Z,i.wireframeLinewidth,i.wireframeLinecap,i.wireframeLinejoin):F(Z))):i instanceof THREE.MeshBasicMaterial||i instanceof THREE.MeshLambertMaterial|| +i instanceof THREE.MeshPhongMaterial?null!==i.map?i.map.mapping instanceof THREE.UVMapping&&(Ra=k.uvs[0],C(A,ca,ga,ma,N,fa,Ra[f].x,Ra[f].y,Ra[g].x,Ra[g].y,Ra[h].x,Ra[h].y,i.map)):null!==i.envMap?i.envMap.mapping instanceof THREE.SphericalReflectionMapping&&(ab.copy(k.vertexNormalsModelView[f]),rb=0.5*ab.x+0.5,Ob=0.5*ab.y+0.5,ab.copy(k.vertexNormalsModelView[g]),Lb=0.5*ab.x+0.5,Pb=0.5*ab.y+0.5,ab.copy(k.vertexNormalsModelView[h]),Tb=0.5*ab.x+0.5,Ub=0.5*ab.y+0.5,C(A,ca,ga,ma,N,fa,rb,Ob,Lb,Pb,Tb,Ub, +i.envMap)):(Z.copy(i.color),i.vertexColors===THREE.FaceColors&&Z.multiply(k.color),!0===i.wireframe?E(Z,i.wireframeLinewidth,i.wireframeLinecap,i.wireframeLinejoin):F(Z)):i instanceof THREE.MeshDepthMaterial?(Va=n.near,Qa=n.far,ka.r=ka.g=ka.b=1-j(a.positionScreen.z*a.positionScreen.w,Va,Qa),W.r=W.g=W.b=1-j(d.positionScreen.z*d.positionScreen.w,Va,Qa),V.r=V.g=V.b=1-j(e.positionScreen.z*e.positionScreen.w,Va,Qa),la.addColors(W,V).multiplyScalar(0.5),Aa=H(ka,W,V,la),J(A,ca,ga,ma,N,fa,0,0,1,0,0,1,Aa)): +i instanceof THREE.MeshNormalMaterial&&(i.shading==THREE.FlatShading?(a=k.normalModelView,Z.setRGB(a.x,a.y,a.z).multiplyScalar(0.5).addScalar(0.5),!0===i.wireframe?E(Z,i.wireframeLinewidth,i.wireframeLinecap,i.wireframeLinejoin):F(Z)):i.shading==THREE.SmoothShading&&(a=k.vertexNormalsModelView[f],ka.setRGB(a.x,a.y,a.z).multiplyScalar(0.5).addScalar(0.5),a=k.vertexNormalsModelView[g],W.setRGB(a.x,a.y,a.z).multiplyScalar(0.5).addScalar(0.5),a=k.vertexNormalsModelView[h],V.setRGB(a.x,a.y,a.z).multiplyScalar(0.5).addScalar(0.5), +la.addColors(W,V).multiplyScalar(0.5),Aa=H(ka,W,V,la),J(A,ca,ga,ma,N,fa,0,0,1,0,0,1,Aa)))}function y(a,b,c,d,e,f){t.beginPath();t.moveTo(a,b);t.lineTo(c,d);t.lineTo(e,f);t.closePath()}function B(a,b,c,d,e,f,g,h){t.beginPath();t.moveTo(a,b);t.lineTo(c,d);t.lineTo(e,f);t.lineTo(g,h);t.closePath()}function E(a,b,c,h){d(b);e(c);f(h);g(a.getStyle());t.stroke();Wa.expandByScalar(2*b)}function F(a){h(a.getStyle());t.fill()}function C(a,b,c,d,e,f,g,k,i,va,j,p,m){if(!(m instanceof THREE.DataTexture||void 0=== +m.image||0==m.image.width)){if(!0===m.needsUpdate){var l=m.wrapS==THREE.RepeatWrapping,n=m.wrapT==THREE.RepeatWrapping;jb[m.id]=t.createPattern(m.image,!0===l&&!0===n?"repeat":!0===l&&!1===n?"repeat-x":!1===l&&!0===n?"repeat-y":"no-repeat");m.needsUpdate=!1}void 0===jb[m.id]?h("rgba(0,0,0,1)"):h(jb[m.id]);var l=m.offset.x/m.repeat.x,n=m.offset.y/m.repeat.y,mb=m.image.width*m.repeat.x,q=m.image.height*m.repeat.y,g=(g+l)*mb,k=(1-k+n)*q,c=c-a,d=d-b,e=e-a,f=f-b,i=(i+l)*mb-g,va=(1-va+n)*q-k,j=(j+l)*mb- +g,p=(1-p+n)*q-k,l=i*p-j*va;0===l?(void 0===oa[m.id]&&(b=document.createElement("canvas"),b.width=m.image.width,b.height=m.image.height,b=b.getContext("2d"),b.drawImage(m.image,0,0),oa[m.id]=b.getImageData(0,0,m.image.width,m.image.height).data),b=oa[m.id],g=4*(Math.floor(g)+Math.floor(k)*m.image.width),Z.setRGB(b[g]/255,b[g+1]/255,b[g+2]/255),F(Z)):(l=1/l,m=(p*c-va*e)*l,va=(p*d-va*f)*l,c=(i*e-j*c)*l,d=(i*f-j*d)*l,a=a-m*g-c*k,g=b-va*g-d*k,t.save(),t.transform(m,va,c,d,a,g),t.fill(),t.restore())}}function J(a, +b,c,d,e,f,g,h,k,i,va,j,m){var p,l;p=m.width-1;l=m.height-1;g*=p;h*=l;c-=a;d-=b;e-=a;f-=b;k=k*p-g;i=i*l-h;va=va*p-g;j=j*l-h;l=1/(k*j-va*i);p=(j*c-i*e)*l;i=(j*d-i*f)*l;c=(k*e-va*c)*l;d=(k*f-va*d)*l;a=a-p*g-c*h;b=b-i*g-d*h;t.save();t.transform(p,i,c,d,a,b);t.clip();t.drawImage(m,0,0);t.restore()}function H(a,b,c,d){Sa[0]=255*a.r|0;Sa[1]=255*a.g|0;Sa[2]=255*a.b|0;Sa[4]=255*b.r|0;Sa[5]=255*b.g|0;Sa[6]=255*b.b|0;Sa[8]=255*c.r|0;Sa[9]=255*c.g|0;Sa[10]=255*c.b|0;Sa[12]=255*d.r|0;Sa[13]=255*d.g|0;Sa[14]=255* +d.b|0;k.putImageData(Cb,0,0);Ta.drawImage(Bb,0,0);return kb}function G(a,b){var c=b.x-a.x,d=b.y-a.y,e=c*c+d*d;0!==e&&(e=1/Math.sqrt(e),c*=e,d*=e,b.x+=c,b.y+=d,a.x-=c,a.y-=d)}if(!1===n instanceof THREE.Camera)console.error("THREE.CanvasRenderer.render: camera is not an instance of THREE.Camera.");else{!0===this.autoClear&&this.clear();t.setTransform(1,0,0,-1,u,x);m.info.render.vertices=0;m.info.render.faces=0;l=s.projectScene(a,n,this.sortObjects,this.sortElements);p=l.elements;r=l.lights;sb.setRGB(0, +0,0);Ma.setRGB(0,0,0);qa.setRGB(0,0,0);for(var K=0,P=r.length;K>1,Oc=da.height>>1,vb=va.scale.x*u,wb=va.scale.y*x,ub=vb*Nc,mb=wb*Oc,Wa.min.set(L.x-ub,L.y-mb),Wa.max.set(L.x+ub,L.y+mb),!1!==$a.isIntersectionBox(Wa)&& +(t.save(),t.translate(L.x,L.y),t.rotate(-va.rotation),t.scale(vb,-wb),t.translate(-Nc,-Oc),t.drawImage(da,0,0),t.restore())):R instanceof THREE.ParticleCanvasMaterial&&(ub=va.scale.x*u,mb=va.scale.y*x,Wa.min.set(L.x-ub,L.y-mb),Wa.max.set(L.x+ub,L.y+mb),!1!==$a.isIntersectionBox(Wa)&&(g(R.color.getStyle()),h(R.color.getStyle()),t.save(),t.translate(L.x,L.y),t.rotate(-va.rotation),t.scale(ub,mb),R.program(t),t.restore()))}else if(da instanceof THREE.RenderableLine)I=da.v1,M=da.v2,I.positionScreen.x*= +u,I.positionScreen.y*=x,M.positionScreen.x*=u,M.positionScreen.y*=x,Wa.setFromPoints([I.positionScreen,M.positionScreen]),!0===$a.isIntersectionBox(Wa)&&(L=I,va=M,b(R.opacity),c(R.blending),t.beginPath(),t.moveTo(L.positionScreen.x,L.positionScreen.y),t.lineTo(va.positionScreen.x,va.positionScreen.y),R instanceof THREE.LineBasicMaterial?(d(R.linewidth),e(R.linecap),f(R.linejoin),g(R.color.getStyle()),t.stroke(),Wa.expandByScalar(2*R.linewidth)):R instanceof THREE.LineDashedMaterial&&(d(R.linewidth), +e(R.linecap),f(R.linejoin),g(R.color.getStyle()),i(R.dashSize,R.gapSize),t.stroke(),Wa.expandByScalar(2*R.linewidth),i(null,null)));else if(da instanceof THREE.RenderableFace3){I=da.v1;M=da.v2;U=da.v3;if(-1>I.positionScreen.z||1M.positionScreen.z||1U.positionScreen.z||1I.positionScreen.z||1M.positionScreen.z||1U.positionScreen.z||1ea.positionScreen.z||1l;l++)E.autoScaleCubemaps&&!f?(p=j,s=l,t=c.image[l],x=Hc,t.width<=x&&t.height<=x||(y=Math.max(t.width,t.height),u=Math.floor(t.width*x/y),x=Math.floor(t.height*x/y),y=document.createElement("canvas"),y.width=u,y.height=x,y.getContext("2d").drawImage(t,0,0,t.width,t.height,0,0,u,x),t=y),p[s]=t):j[l]=c.image[l];l=j[0];p=0===(l.width&l.width- -1)&&0===(l.height&l.height-1);s=M(c.format);t=M(c.type);U(k.TEXTURE_CUBE_MAP,c,p);for(l=0;6>l;l++)if(f){x=j[l].mipmaps;y=0;for(A=x.length;y=dc&&console.warn("WebGLRenderer: trying to use "+ -a+" texture units while this GPU supports only "+dc);V+=1;return a}function F(a,b){a._modelViewMatrix.multiplyMatrices(b.matrixWorldInverse,a.matrixWorld);a._normalMatrix.getInverse(a._modelViewMatrix);a._normalMatrix.transpose()}function z(a,b,c,d){a[b]=c.r*c.r*d;a[b+1]=c.g*c.g*d;a[b+2]=c.b*c.b*d}function H(a,b,c,d){a[b]=c.r*d;a[b+1]=c.g*d;a[b+2]=c.b*d}function L(a){a!==Bb&&(k.lineWidth(a),Bb=a)}function I(a,b,c){Qa!==a&&(a?k.enable(k.POLYGON_OFFSET_FILL):k.disable(k.POLYGON_OFFSET_FILL),Qa=a);if(a&& -(Va!==b||Wa!==c))k.polygonOffset(b,c),Va=b,Wa=c}function N(a){for(var a=a.split("\n"),b=0,c=a.length;bb;b++)k.deleteFramebuffer(a.__webglFramebuffer[b]),k.deleteRenderbuffer(a.__webglRenderbuffer[b]); -else k.deleteFramebuffer(a.__webglFramebuffer),k.deleteRenderbuffer(a.__webglRenderbuffer);E.info.memory.textures--},oc=function(a){a=a.target;a.removeEventListener("dispose",oc);ua(a)},ua=function(a){var b=a.program;if(void 0!==b){a.program=void 0;var c,d,e=!1,a=0;for(c=Ma.length;ad.numSupportedMorphTargets?(j.sort(m),j.length=d.numSupportedMorphTargets):j.length>d.numSupportedMorphNormals? -j.sort(m):0===j.length&&j.push([0,0]);for(l=0;lva;va++)Ka=T[va],yb[gb]=Ka.x,yb[gb+1]=Ka.y,yb[gb+2]=Ka.z,gb+=3;else for(va=0;3>va;va++)yb[gb]=U.x,yb[gb+1]=U.y,yb[gb+2]=U.z,gb+=3;C=0;for(B=ta.length;Cva;va++)Ka=T[va],yb[gb]=Ka.x,yb[gb+1]=Ka.y,yb[gb+2]=Ka.z,gb+=3;else for(va=0;4>va;va++)yb[gb]=U.x,yb[gb+1]=U.y,yb[gb+2]=U.z,gb+=3;k.bindBuffer(k.ARRAY_BUFFER,E.__webglNormalBuffer);k.bufferData(k.ARRAY_BUFFER,yb,G)}if(Kb&&Ub&&M){C=0;for(B= -sa.length;Cva;va++)Na=W[va],jb[Wa]=Na.x,jb[Wa+1]=Na.y,Wa+=2;C=0;for(B=ta.length;Cva;va++)Na=W[va],jb[Wa]=Na.x,jb[Wa+1]=Na.y,Wa+=2;0va;va++)Ra=Y[va],lb[Ya]=Ra.x,lb[Ya+1]=Ra.y,Ya+=2;C=0;for(B=ta.length;Cva;va++)Ra=Y[va],lb[Ya]=Ra.x,lb[Ya+1]=Ra.y,Ya+=2;0l;l++)N.autoScaleCubemaps&&!f?(p=j,s=l,t=c.image[l],x=Hc,t.width<=x&&t.height<=x||(y=Math.max(t.width,t.height),u=Math.floor(t.width*x/y),x=Math.floor(t.height*x/y),y=document.createElement("canvas"),y.width=u,y.height=x,y.getContext("2d").drawImage(t,0,0,t.width,t.height,0,0,u,x),t=y),p[s]=t):j[l]=c.image[l];l=j[0];p=0===(l.width&l.width- +1)&&0===(l.height&l.height-1);s=I(c.format);t=I(c.type);B(k.TEXTURE_CUBE_MAP,c,p);for(l=0;6>l;l++)if(f){x=j[l].mipmaps;y=0;for(E=x.length;y=cc&&console.warn("WebGLRenderer: trying to use "+ +a+" texture units while this GPU supports only "+cc);ka+=1;return a}function F(a,b,c,d){a[b]=c.r*c.r*d;a[b+1]=c.g*c.g*d;a[b+2]=c.b*c.b*d}function z(a,b,c,d){a[b]=c.r*d;a[b+1]=c.g*d;a[b+2]=c.b*d}function H(a){a!==Ra&&(k.lineWidth(a),Ra=a)}function K(a,b,c){Va!==a&&(a?k.enable(k.POLYGON_OFFSET_FILL):k.disable(k.POLYGON_OFFSET_FILL),Va=a);if(a&&(Qa!==b||Aa!==c))k.polygonOffset(b,c),Qa=b,Aa=c}function G(a){for(var a=a.split("\n"),b=0,c=a.length;bb;b++)k.deleteFramebuffer(a.__webglFramebuffer[b]),k.deleteRenderbuffer(a.__webglRenderbuffer[b]);else k.deleteFramebuffer(a.__webglFramebuffer),k.deleteRenderbuffer(a.__webglRenderbuffer);N.info.memory.textures--},pc=function(a){a=a.target;a.removeEventListener("dispose", +pc);da(a)},da=function(a){var b=a.program;if(void 0!==b){a.program=void 0;var c,d,e=!1,a=0;for(c=fa.length;ad.numSupportedMorphTargets?(j.sort(m),j.length=d.numSupportedMorphTargets):j.length>d.numSupportedMorphNormals?j.sort(m):0===j.length&&j.push([0,0]);for(l=0;lwa;wa++)La=U[wa],yb[hb]=La.x,yb[hb+1]=La.y,yb[hb+2]=La.z,hb+=3;else for(wa=0;3>wa;wa++)yb[hb]=R.x,yb[hb+1]=R.y,yb[hb+2]=R.z,hb+=3;D=0;for(A=sa.length;Dwa;wa++)La=U[wa],yb[hb]=La.x,yb[hb+1]=La.y,yb[hb+2]=La.z,hb+=3;else for(wa=0;4>wa;wa++)yb[hb]=R.x,yb[hb+1]= +R.y,yb[hb+2]=R.z,hb+=3;k.bindBuffer(k.ARRAY_BUFFER,C.__webglNormalBuffer);k.bufferData(k.ARRAY_BUFFER,yb,G)}if(Lb&&Vb&&N){D=0;for(A=ra.length;Dwa;wa++)Sa=Z[wa],kb[Ta]=Sa.x,kb[Ta+1]=Sa.y,Ta+=2;D=0;for(A=sa.length;Dwa;wa++)Sa=Z[wa],kb[Ta]=Sa.x,kb[Ta+1]=Sa.y,Ta+=2;0wa;wa++)Va=ka[wa],rb[$a]=Va.x,rb[$a+1]=Va.y,$a+=2;D=0;for(A=sa.length;Dwa;wa++)Va=ka[wa],rb[$a]=Va.x,rb[$a+1]=Va.y,$a+=2;0<$a&&(k.bindBuffer(k.ARRAY_BUFFER,C.__webglUV2Buffer),k.bufferData(k.ARRAY_BUFFER,rb,G))}if(Ob){D=0;for(A=ra.length;Df;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);G(a.__webglRenderbuffer[f],a)}c&&k.generateMipmap(k.TEXTURE_CUBE_MAP)}else a.__webglFramebuffer=k.createFramebuffer(),a.__webglRenderbuffer=a.shareDepthFrom?a.shareDepthFrom.__webglRenderbuffer:k.createRenderbuffer(),k.bindTexture(k.TEXTURE_2D,a.__webglTexture),U(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),a.shareDepthFrom?a.depthBuffer&&!a.stencilBuffer?k.framebufferRenderbuffer(k.FRAMEBUFFER,k.DEPTH_ATTACHMENT,k.RENDERBUFFER,a.__webglRenderbuffer):a.depthBuffer&&a.stencilBuffer&&k.framebufferRenderbuffer(k.FRAMEBUFFER,k.DEPTH_STENCIL_ATTACHMENT,k.RENDERBUFFER,a.__webglRenderbuffer):G(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)}a?(b=b?a.__webglFramebuffer[a.activeCubeFace]:a.__webglFramebuffer,c=a.width,a=a.height,e=d=0):(b=null,c=Ob,a=Pb,d=Kb,e=Nb);b!==Xa&&(k.bindFramebuffer(k.FRAMEBUFFER,b),k.viewport(d,e,c,a),Xa=b);Tb=c;tb=a};this.shadowMapPlugin=new THREE.ShadowMapPlugin;this.addPrePlugin(this.shadowMapPlugin);this.addPostPlugin(new THREE.SpritePlugin);this.addPostPlugin(new THREE.LensFlarePlugin)};THREE.WebGLRenderTarget=function(a,b,c){this.width=a;this.height=b;c=c||{};this.wrapS=void 0!==c.wrapS?c.wrapS:THREE.ClampToEdgeWrapping;this.wrapT=void 0!==c.wrapT?c.wrapT:THREE.ClampToEdgeWrapping;this.magFilter=void 0!==c.magFilter?c.magFilter:THREE.LinearFilter;this.minFilter=void 0!==c.minFilter?c.minFilter:THREE.LinearMipMapLinearFilter;this.anisotropy=void 0!==c.anisotropy?c.anisotropy:1;this.offset=new THREE.Vector2(0,0);this.repeat=new THREE.Vector2(1,1);this.format=void 0!==c.format?c.format: +y);for(y=0;yf;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);P(a.__webglRenderbuffer[f],a)}c&&k.generateMipmap(k.TEXTURE_CUBE_MAP)}else a.__webglFramebuffer=k.createFramebuffer(),a.__webglRenderbuffer=a.shareDepthFrom?a.shareDepthFrom.__webglRenderbuffer:k.createRenderbuffer(),k.bindTexture(k.TEXTURE_2D,a.__webglTexture),B(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),a.shareDepthFrom?a.depthBuffer&&!a.stencilBuffer?k.framebufferRenderbuffer(k.FRAMEBUFFER,k.DEPTH_ATTACHMENT,k.RENDERBUFFER,a.__webglRenderbuffer):a.depthBuffer&&a.stencilBuffer&&k.framebufferRenderbuffer(k.FRAMEBUFFER,k.DEPTH_STENCIL_ATTACHMENT,k.RENDERBUFFER,a.__webglRenderbuffer):P(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)}a?(b=b?a.__webglFramebuffer[a.activeCubeFace]:a.__webglFramebuffer,c=a.width,a=a.height,e=d=0):(b=null,c=Lb,a=Pb,d=rb,e=Ob);b!==eb&&(k.bindFramebuffer(k.FRAMEBUFFER,b),k.viewport(d,e,c,a),eb=b);Tb=c;Ub=a};this.shadowMapPlugin=new THREE.ShadowMapPlugin;this.addPrePlugin(this.shadowMapPlugin);this.addPostPlugin(new THREE.SpritePlugin);this.addPostPlugin(new THREE.LensFlarePlugin)};THREE.WebGLRenderTarget=function(a,b,c){this.width=a;this.height=b;c=c||{};this.wrapS=void 0!==c.wrapS?c.wrapS:THREE.ClampToEdgeWrapping;this.wrapT=void 0!==c.wrapT?c.wrapT:THREE.ClampToEdgeWrapping;this.magFilter=void 0!==c.magFilter?c.magFilter:THREE.LinearFilter;this.minFilter=void 0!==c.minFilter?c.minFilter:THREE.LinearMipMapLinearFilter;this.anisotropy=void 0!==c.anisotropy?c.anisotropy:1;this.offset=new THREE.Vector2(0,0);this.repeat=new THREE.Vector2(1,1);this.format=void 0!==c.format?c.format: THREE.RGBAFormat;this.type=void 0!==c.type?c.type:THREE.UnsignedByteType;this.depthBuffer=void 0!==c.depthBuffer?c.depthBuffer:!0;this.stencilBuffer=void 0!==c.stencilBuffer?c.stencilBuffer:!0;this.generateMipmaps=!0;this.shareDepthFrom=null}; THREE.WebGLRenderTarget.prototype={constructor:THREE.WebGLRenderTarget,addEventListener:THREE.EventDispatcher.prototype.addEventListener,hasEventListener:THREE.EventDispatcher.prototype.hasEventListener,removeEventListener:THREE.EventDispatcher.prototype.removeEventListener,dispatchEvent:THREE.EventDispatcher.prototype.dispatchEvent,clone:function(){var a=new THREE.WebGLRenderTarget(this.width,this.height);a.wrapS=this.wrapS;a.wrapT=this.wrapT;a.magFilter=this.magFilter;a.minFilter=this.minFilter; a.anisotropy=this.anisotropy;a.offset.copy(this.offset);a.repeat.copy(this.repeat);a.format=this.format;a.type=this.type;a.depthBuffer=this.depthBuffer;a.stencilBuffer=this.stencilBuffer;a.generateMipmaps=this.generateMipmaps;a.shareDepthFrom=this.shareDepthFrom;return a},dispose:function(){this.dispatchEvent({type:"dispose"})}};THREE.WebGLRenderTargetCube=function(a,b,c){THREE.WebGLRenderTarget.call(this,a,b,c);this.activeCubeFace=0};THREE.WebGLRenderTargetCube.prototype=Object.create(THREE.WebGLRenderTarget.prototype);THREE.RenderableVertex=function(){this.positionWorld=new THREE.Vector3;this.positionScreen=new THREE.Vector4;this.visible=!0};THREE.RenderableVertex.prototype.copy=function(a){this.positionWorld.copy(a.positionWorld);this.positionScreen.copy(a.positionScreen)};THREE.RenderableFace3=function(){this.v1=new THREE.RenderableVertex;this.v2=new THREE.RenderableVertex;this.v3=new THREE.RenderableVertex;this.centroidModel=new THREE.Vector3;this.normalModel=new THREE.Vector3;this.normalModelView=new THREE.Vector3;this.vertexNormalsLength=0;this.vertexNormalsModel=[new THREE.Vector3,new THREE.Vector3,new THREE.Vector3];this.vertexNormalsModelView=[new THREE.Vector3,new THREE.Vector3,new THREE.Vector3];this.material=this.color=null;this.uvs=[[]];this.z=null};THREE.RenderableFace4=function(){this.v1=new THREE.RenderableVertex;this.v2=new THREE.RenderableVertex;this.v3=new THREE.RenderableVertex;this.v4=new THREE.RenderableVertex;this.centroidModel=new THREE.Vector3;this.normalModel=new THREE.Vector3;this.normalModelView=new THREE.Vector3;this.vertexNormalsLength=0;this.vertexNormalsModel=[new THREE.Vector3,new THREE.Vector3,new THREE.Vector3,new THREE.Vector3];this.vertexNormalsModelView=[new THREE.Vector3,new THREE.Vector3,new THREE.Vector3,new THREE.Vector3]; -this.material=this.color=null;this.uvs=[[]];this.z=null};THREE.RenderableObject=function(){this.z=this.object=null};THREE.RenderableParticle=function(){this.rotation=this.z=this.y=this.x=this.object=null;this.scale=new THREE.Vector2;this.material=null};THREE.RenderableLine=function(){this.z=null;this.v1=new THREE.RenderableVertex;this.v2=new THREE.RenderableVertex;this.material=null};THREE.GeometryUtils={merge:function(a,b,c){var d,e,f=a.vertices.length,g=b instanceof THREE.Mesh?b.geometry:b,h=a.vertices,i=g.vertices,j=a.faces,m=g.faces,a=a.faceVertexUvs[0],g=g.faceVertexUvs[0];void 0===c&&(c=0);b instanceof THREE.Mesh&&(b.matrixAutoUpdate&&b.updateMatrix(),d=b.matrix,e=new THREE.Matrix3,e.getInverse(d),e.transpose());for(var b=0,l=i.length;ba?b(c,e-1):j[e]a?b(c,e-1):j[e]e)return null;var f=[],g=[],h=[],i,j,m;if(0=l--){console.log("Warning, unable to triangulate polygon!");break}i=j;e<=i&&(i=0);j=i+1;e<=j&&(j=0);m=j+1;e<=m&&(m=0);var p;a:{var r=p=void 0,s=void 0,n=void 0,q=void 0,y=void 0,u=void 0,x=void 0,t= -void 0,r=a[g[i]].x,s=a[g[i]].y,n=a[g[j]].x,q=a[g[j]].y,y=a[g[m]].x,u=a[g[m]].y;if(1E-10>(n-r)*(u-s)-(q-s)*(y-r))p=!1;else{var D=void 0,J=void 0,F=void 0,z=void 0,H=void 0,L=void 0,I=void 0,N=void 0,A=void 0,U=void 0,A=N=I=t=x=void 0,D=y-n,J=u-q,F=r-y,z=s-u,H=n-r,L=q-s;for(p=0;p(n-r)*(u-s)-(q-s)*(y-r))p=!1;else{var E=void 0,J=void 0,F=void 0,z=void 0,H=void 0,K=void 0,G=void 0,L=void 0,B=void 0,P=void 0,B=L=G=t=x=void 0,E=y-n,J=u-q,F=r-y,z=s-u,H=n-r,K=q-s;for(p=0;pi)g=d+1;else if(0b&&(b=0);1g?(b=Math.atan2(b.y-a.y,b.x-a.x),a=Math.atan2(c.y-a.y,c.x-a.x),b>a&&(a+=2*Math.PI),c=(b+a)/2,a=-Math.cos(c),c=-Math.sin(c),new THREE.Vector2(a,c)):d.multiplyScalar(g).add(h).sub(a).clone()}function e(c,d){var e,f;for(B=c.length;0<=--B;){e=B;f=B-1;0>f&&(f=c.length-1);for(var g=0,h=r+2*m, -g=0;gg?(b=Math.atan2(b.y-a.y,b.x-a.x),a=Math.atan2(c.y-a.y,c.x-a.x),b>a&&(a+=2*Math.PI),c=(b+a)/2,a=-Math.cos(c),c=-Math.sin(c),new THREE.Vector2(a,c)):d.multiplyScalar(g).add(h).sub(a).clone()}function e(c,d){var e,f;for(A=c.length;0<=--A;){e=A;f=A-1;0>f&&(f=c.length-1);for(var g=0,h=r+2*m, +g=0;gMath.abs(c-i)?[new THREE.Vector2(b,1-e),new THREE.Vector2(d,1-f),new THREE.Vector2(j,1-g),new THREE.Vector2(l,1-a)]:[new THREE.Vector2(c,1-e),new THREE.Vector2(i,1-f),new THREE.Vector2(m,1-g),new THREE.Vector2(p,1-a)]}};THREE.ExtrudeGeometry.__v1=new THREE.Vector2;THREE.ExtrudeGeometry.__v2=new THREE.Vector2;THREE.ExtrudeGeometry.__v3=new THREE.Vector2;THREE.ExtrudeGeometry.__v4=new THREE.Vector2; THREE.ExtrudeGeometry.__v5=new THREE.Vector2;THREE.ExtrudeGeometry.__v6=new THREE.Vector2;THREE.ShapeGeometry=function(a,b){THREE.Geometry.call(this);!1===a instanceof Array&&(a=[a]);this.shapebb=a[a.length-1].getBoundingBox();this.addShapeList(a,b);this.computeCentroids();this.computeFaceNormals()};THREE.ShapeGeometry.prototype=Object.create(THREE.Geometry.prototype);THREE.ShapeGeometry.prototype.addShapeList=function(a,b){for(var c=0,d=a.length;c=b.getParameter(b.MAX_VERTEX_TEXTURE_IMAGE_UNITS)?(m=!1,l=a(THREE.ShaderFlares.lensFlare,d)):(m=!0,l=a(THREE.ShaderFlares.lensFlareVertexTexture,d));p={};r={};p.vertex=b.getAttribLocation(l,"position");p.uv=b.getAttribLocation(l,"uv");r.renderType=b.getUniformLocation(l,"renderType");r.map=b.getUniformLocation(l,"map");r.occlusionMap=b.getUniformLocation(l,"occlusionMap");r.opacity= -b.getUniformLocation(l,"opacity");r.color=b.getUniformLocation(l,"color");r.scale=b.getUniformLocation(l,"scale");r.rotation=b.getUniformLocation(l,"rotation");r.screenPosition=b.getUniformLocation(l,"screenPosition")};this.render=function(a,d,e,f){var a=a.__webglFlares,u=a.length;if(u){var x=new THREE.Vector3,t=f/e,D=0.5*e,J=0.5*f,F=16/f,z=new THREE.Vector2(F*t,F),H=new THREE.Vector3(1,1,0),L=new THREE.Vector2(1,1),I=r,F=p;b.useProgram(l);b.enableVertexAttribArray(p.vertex);b.enableVertexAttribArray(p.uv); -b.uniform1i(I.occlusionMap,0);b.uniform1i(I.map,1);b.bindBuffer(b.ARRAY_BUFFER,g);b.vertexAttribPointer(F.vertex,2,b.FLOAT,!1,16,0);b.vertexAttribPointer(F.uv,2,b.FLOAT,!1,16,8);b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,h);b.disable(b.CULL_FACE);b.depthMask(!1);var N,A,U,G,K;for(N=0;Nz;z++)t[z]=new THREE.Vector3,u[z]=new THREE.Vector3;t=D.shadowCascadeNearZ[x];D=D.shadowCascadeFarZ[x];u[0].set(-1,-1,t);u[1].set(1,-1,t);u[2].set(-1, -1,t);u[3].set(1,1,t);u[4].set(-1,-1,D);u[5].set(1,-1,D);u[6].set(-1,1,D);u[7].set(1,1,D);F.originalCamera=p;u=new THREE.Gyroscope;u.position=n.shadowCascadeOffset;u.add(F);u.add(F.target);p.add(u);n.shadowCascadeArray[y]=F;console.log("Created virtualLight",F)}x=n;t=y;D=x.shadowCascadeArray[t];D.position.copy(x.position);D.target.position.copy(x.target.position);D.lookAt(D.target);D.shadowCameraVisible=x.shadowCameraVisible;D.shadowDarkness=x.shadowDarkness;D.shadowBias=x.shadowCascadeBias[t];u=x.shadowCascadeNearZ[t]; -x=x.shadowCascadeFarZ[t];D=D.pointsFrustum;D[0].z=u;D[1].z=u;D[2].z=u;D[3].z=u;D[4].z=x;D[5].z=x;D[6].z=x;D[7].z=x;J[q]=F;q++}else J[q]=n,q++;r=0;for(s=J.length;rz;z++)t[z]=new THREE.Vector3,u[z]=new THREE.Vector3;t=E.shadowCascadeNearZ[x];E=E.shadowCascadeFarZ[x];u[0].set(-1,-1,t);u[1].set(1,-1,t);u[2].set(-1, +1,t);u[3].set(1,1,t);u[4].set(-1,-1,E);u[5].set(1,-1,E);u[6].set(-1,1,E);u[7].set(1,1,E);F.originalCamera=p;u=new THREE.Gyroscope;u.position=n.shadowCascadeOffset;u.add(F);u.add(F.target);p.add(u);n.shadowCascadeArray[y]=F;console.log("Created virtualLight",F)}x=n;t=y;E=x.shadowCascadeArray[t];E.position.copy(x.position);E.target.position.copy(x.target.position);E.lookAt(E.target);E.shadowCameraVisible=x.shadowCameraVisible;E.shadowDarkness=x.shadowDarkness;E.shadowBias=x.shadowCascadeBias[t];u=x.shadowCascadeNearZ[t]; +x=x.shadowCascadeFarZ[t];E=E.pointsFrustum;E[0].z=u;E[1].z=u;E[2].z=u;E[3].z=u;E[4].z=x;E[5].z=x;E[6].z=x;E[7].z=x;J[q]=F;q++}else J[q]=n,q++;r=0;for(s=J.length;rx;x++)t=D[x],t.copy(u[x]),THREE.ShadowMapPlugin.__projector.unprojectVector(t,y),t.applyMatrix4(q.matrixWorldInverse),t.xj.x&&(j.x=t.x),t.yj.y&&(j.y=t.y),t.zj.z&& +!n.cameraHelper&&(n.cameraHelper=new THREE.CameraHelper(n.shadowCamera),n.shadowCamera.add(n.cameraHelper));if(n.isVirtual&&F.originalCamera==p){y=p;q=n.shadowCamera;u=n.pointsFrustum;E=n.pointsWorld;i.set(Infinity,Infinity,Infinity);j.set(-Infinity,-Infinity,-Infinity);for(x=0;8>x;x++)t=E[x],t.copy(u[x]),THREE.ShadowMapPlugin.__projector.unprojectVector(t,y),t.applyMatrix4(q.matrixWorldInverse),t.xj.x&&(j.x=t.x),t.yj.y&&(j.y=t.y),t.zj.z&& (j.z=t.z);q.left=i.x;q.right=j.x;q.top=j.y;q.bottom=i.y;q.updateProjectionMatrix()}q=n.shadowMap;u=n.shadowMatrix;y=n.shadowCamera;y.position.getPositionFromMatrix(n.matrixWorld);m.getPositionFromMatrix(n.target.matrixWorld);y.lookAt(m);y.updateMatrixWorld();y.matrixWorldInverse.getInverse(y.matrixWorld);n.cameraHelper&&(n.cameraHelper.visible=n.shadowCameraVisible);n.shadowCameraVisible&&n.cameraHelper.update();u.set(0.5,0,0,0.5,0,0.5,0,0.5,0,0,0.5,0.5,0,0,0,1);u.multiply(y.projectionMatrix);u.multiply(y.matrixWorldInverse); -h.multiplyMatrices(y.projectionMatrix,y.matrixWorldInverse);g.setFromMatrix(h);b.setRenderTarget(q);b.clear();D=l.__webglObjects;n=0;for(q=D.length;n