diff --git a/build/three.js b/build/three.js index c113e888602c2fe8f304131f2bcf9b04a7613b39..7da7b5c34ce9bf7cd05f600240a865062478a3a6 100644 --- a/build/three.js +++ b/build/three.js @@ -15981,10 +15981,22 @@ THREE.WebGLRenderer = function ( parameters ) { this.deallocateTexture = function ( texture ) { - if ( ! texture.__webglInit ) return; + // cube texture - texture.__webglInit = false; - _gl.deleteTexture( texture.__webglTexture ); + if ( texture.image && texture.image.__webglTextureCube ) { + + _gl.deleteTexture( texture.image.__webglTextureCube ); + + // 2D texture + + } else { + + if ( ! texture.__webglInit ) return; + + texture.__webglInit = false; + _gl.deleteTexture( texture.__webglTexture ); + + } _this.info.memory.textures --; @@ -22316,6 +22328,8 @@ THREE.WebGLRenderer = function ( parameters ) { texture.image.__webglTextureCube = _gl.createTexture(); + _this.info.memory.textures ++; + } _gl.activeTexture( _gl.TEXTURE0 + slot ); @@ -22445,6 +22459,8 @@ THREE.WebGLRenderer = function ( parameters ) { renderTarget.__webglTexture = _gl.createTexture(); + _this.info.memory.textures ++; + // Setup texture, create render and frame buffers var isTargetPowerOfTwo = isPowerOfTwo( renderTarget.width ) && isPowerOfTwo( renderTarget.height ), @@ -24174,7 +24190,7 @@ THREE.ImageUtils = { if ( images.loadCount === 6 ) { texture.needsUpdate = true; - if ( onLoad ) onLoad(); + if ( onLoad ) onLoad( texture ); } @@ -24229,7 +24245,7 @@ THREE.ImageUtils = { texture.format = dds.format; texture.needsUpdate = true; - if ( onLoad ) onLoad(); + if ( onLoad ) onLoad( texture ); } @@ -24237,17 +24253,68 @@ THREE.ImageUtils = { } - for ( var i = 0, il = array.length; i < il; ++ i ) { + // compressed cubemap textures as 6 separate DDS files - var cubeImage = {}; - images[ i ] = cubeImage; + if ( array instanceof Array ) { + + for ( var i = 0, il = array.length; i < il; ++ i ) { + + var cubeImage = {}; + images[ i ] = cubeImage; + + var request = new XMLHttpRequest(); + request.onload = generateCubeFaceCallback( request, cubeImage ); + request.onerror = onError; + + var url = array[ i ]; + + request.open( 'GET', url, true ); + request.responseType = "arraybuffer"; + request.send( null ); + + } + + // compressed cubemap texture stored in a single DDS file + + } else { + + var url = array; var request = new XMLHttpRequest(); - request.onload = generateCubeFaceCallback( request, cubeImage ); - request.onerror = onError; + request.onload = function( ) { + + var buffer = request.response; + var dds = THREE.ImageUtils.parseDDS( buffer, true ); + + if ( dds.isCubemap ) { + + var faces = dds.mipmaps.length / dds.mipmapCount; + + for ( var f = 0; f < faces; f ++ ) { + + images[ f ] = { mipmaps : [] }; - var url = array[ i ]; + for ( var i = 0; i < dds.mipmapCount; i ++ ) { + + images[ f ].mipmaps.push( dds.mipmaps[ f * dds.mipmapCount + i ] ); + images[ f ].format = dds.format; + images[ f ].width = dds.width; + images[ f ].height = dds.height; + + } + + } + + texture.format = dds.format; + texture.needsUpdate = true; + if ( onLoad ) onLoad( texture ); + + } + + } + + request.onerror = onError; request.open( 'GET', url, true ); request.responseType = "arraybuffer"; @@ -24339,85 +24406,103 @@ THREE.ImageUtils = { var off_pfFlags = 20; var off_pfFourCC = 21; + var off_caps = 27; + var off_caps2 = 28; + var off_caps3 = 29; + var off_caps4 = 30; + // Parse header var header = new Int32Array( buffer, 0, headerLengthInt ); - if ( header[ off_magic ] !== DDS_MAGIC ) { + if ( header[ off_magic ] !== DDS_MAGIC ) { - console.error( "ImageUtils.parseDDS(): Invalid magic number in DDS header" ); - return dds; + console.error( "ImageUtils.parseDDS(): Invalid magic number in DDS header" ); + return dds; - } + } - if ( ! header[ off_pfFlags ] & DDPF_FOURCC ) { + if ( ! header[ off_pfFlags ] & DDPF_FOURCC ) { - console.error( "ImageUtils.parseDDS(): Unsupported format, must contain a FourCC code" ); - return dds; + console.error( "ImageUtils.parseDDS(): Unsupported format, must contain a FourCC code" ); + return dds; - } + } var blockBytes; var fourCC = header[ off_pfFourCC ]; - switch ( fourCC ) { + switch ( fourCC ) { case FOURCC_DXT1: blockBytes = 8; - dds.format = THREE.RGB_S3TC_DXT1_Format; - break; + dds.format = THREE.RGB_S3TC_DXT1_Format; + break; - case FOURCC_DXT3: + case FOURCC_DXT3: - blockBytes = 16; - dds.format = THREE.RGBA_S3TC_DXT3_Format; - break; + blockBytes = 16; + dds.format = THREE.RGBA_S3TC_DXT3_Format; + break; - case FOURCC_DXT5: + case FOURCC_DXT5: - blockBytes = 16; - dds.format = THREE.RGBA_S3TC_DXT5_Format; - break; + blockBytes = 16; + dds.format = THREE.RGBA_S3TC_DXT5_Format; + break; - default: + default: - console.error( "ImageUtils.parseDDS(): Unsupported FourCC code: ", int32ToFourCC( fourCC ) ); - return dds; + console.error( "ImageUtils.parseDDS(): Unsupported FourCC code: ", int32ToFourCC( fourCC ) ); + return dds; - } + } dds.mipmapCount = 1; - if ( header[ off_flags ] & DDSD_MIPMAPCOUNT && loadMipmaps !== false ) { + if ( header[ off_flags ] & DDSD_MIPMAPCOUNT && loadMipmaps !== false ) { + + dds.mipmapCount = Math.max( 1, header[ off_mipmapCount ] ); - dds.mipmapCount = Math.max( 1, header[ off_mipmapCount ] ); + } + + //TODO: Verify that all faces of the cubemap are present with DDSCAPS2_CUBEMAP_POSITIVEX, etc. - } + dds.isCubemap = header[ off_caps2 ] & DDSCAPS2_CUBEMAP ? true : false; - dds.width = header[ off_width ]; - dds.height = header[ off_height ]; + dds.width = header[ off_width ]; + dds.height = header[ off_height ]; - var dataOffset = header[ off_size ] + 4; + var dataOffset = header[ off_size ] + 4; // Extract mipmaps buffers var width = dds.width; var height = dds.height; - for ( var i = 0; i < dds.mipmapCount; i ++ ) { + var faces = dds.isCubemap ? 6 : 1; + + for ( var face = 0; face < faces; face ++ ) { + + for ( var i = 0; i < dds.mipmapCount; i ++ ) { - var dataLength = Math.max( 4, width ) / 4 * Math.max( 4, height ) / 4 * blockBytes; - var byteArray = new Uint8Array( buffer, dataOffset, dataLength ); + var dataLength = Math.max( 4, width ) / 4 * Math.max( 4, height ) / 4 * blockBytes; + var byteArray = new Uint8Array( buffer, dataOffset, dataLength ); - var mipmap = { "data": byteArray, "width": width, "height": height }; - dds.mipmaps.push( mipmap ); + var mipmap = { "data": byteArray, "width": width, "height": height }; + dds.mipmaps.push( mipmap ); - dataOffset += dataLength; + dataOffset += dataLength; + + width = Math.max( width * 0.5, 1 ); + height = Math.max( height * 0.5, 1 ); + + } - width = Math.max( width * 0.5, 1 ); - height = Math.max( height * 0.5, 1 ); + width = dds.width; + height = dds.height; } @@ -31196,7 +31281,7 @@ THREE.TubeGeometry = function( path, segments, radius, radiusSegments, closed, d a, b, c, d, uva, uvb, uvc, uvd; - var frames = new THREE.TubeGeometry.FrenetFrames(path, segments, closed), + var frames = new THREE.TubeGeometry.FrenetFrames( this.path, this.segments, this.closed ), tangents = frames.tangents, normals = frames.normals, binormals = frames.binormals; @@ -31259,7 +31344,7 @@ THREE.TubeGeometry = function( path, segments, radius, radiusSegments, closed, d for ( j = 0; j < this.radiusSegments; j++ ) { - ip = ( closed ) ? (i + 1) % this.segments : i + 1; + ip = ( this.closed ) ? (i + 1) % this.segments : i + 1; jp = (j + 1) % this.radiusSegments; a = this.grid[ i ][ j ]; // *** NOT NECESSARILY PLANAR ! *** @@ -31290,8 +31375,7 @@ THREE.TubeGeometry.prototype = Object.create( THREE.Geometry.prototype ); // For computing of Frenet frames, exposing the tangents, normals and binormals the spline THREE.TubeGeometry.FrenetFrames = function(path, segments, closed) { - var - tangent = new THREE.Vector3(), + var tangent = new THREE.Vector3(), normal = new THREE.Vector3(), binormal = new THREE.Vector3(), diff --git a/build/three.min.js b/build/three.min.js index 15609c015ba2056cd8e0a3a86a6a3c0a70f9c415..39f85ca775796bde63163845dbbfac170e8355a5 100644 --- a/build/three.min.js +++ b/build/three.min.js @@ -73,16 +73,16 @@ this.matrixWorld.multiply(this.parent.matrixWorld,this.matrix),this.matrixWorldN a.matrixWorld.copy(this.matrixWorld);a.matrixRotationWorld.copy(this.matrixRotationWorld);a.matrixAutoUpdate=this.matrixAutoUpdate;a.matrixWorldNeedsUpdate=this.matrixWorldNeedsUpdate;a.quaternion.copy(this.quaternion);a.useQuaternion=this.useQuaternion;a.boundRadius=this.boundRadius;a.boundRadiusScale=this.boundRadiusScale;a.visible=this.visible;a.castShadow=this.castShadow;a.receiveShadow=this.receiveShadow;a.frustumCulled=this.frustumCulled;for(var b=0;be&&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.lerpSelf(b,c);b.lerpSelf(a,1-d);return!0}var e,f,g=[],h=0,i,j,l=[],m=0,n,p,q=[],r=0,u,t=[],D=0,x,s,F=[],A=0,v,z,E=[],B=0,J={objects:[],sprites:[],lights:[],elements:[]},K=new THREE.Vector3,C=new THREE.Vector4,L=new THREE.Matrix4,I=new THREE.Matrix4,M=new THREE.Matrix3,Q=new THREE.Frustum,O=new THREE.Vector4,R=new THREE.Vector4;this.projectVector=function(a,b){b.matrixWorldInverse.getInverse(b.matrixWorld);L.multiply(b.projectionMatrix,b.matrixWorldInverse);L.multiplyVector3(a);return a}; -this.unprojectVector=function(a,b){b.projectionMatrixInverse.getInverse(b.projectionMatrix);L.multiply(b.matrixWorld,b.projectionMatrixInverse);L.multiplyVector3(a);return a};this.pickingRay=function(a,b){var c;a.z=-1;c=new THREE.Vector3(a.x,a.y,1);this.unprojectVector(a,b);this.unprojectVector(c,b);c.subSelf(a).normalize();return new THREE.Ray(a,c)};this.projectScene=function(g,h,m,S){var aa=h.near,ga=h.far,Ia=!1,H,ca,ia,Z,ja,da,ba,oa,eb,Ma,za,qa,Sa,fb,vb;z=s=u=p=0;J.elements.length=0;g.updateMatrixWorld(); +this.unprojectVector=function(a,b){b.projectionMatrixInverse.getInverse(b.projectionMatrix);L.multiply(b.matrixWorld,b.projectionMatrixInverse);L.multiplyVector3(a);return a};this.pickingRay=function(a,b){var c;a.z=-1;c=new THREE.Vector3(a.x,a.y,1);this.unprojectVector(a,b);this.unprojectVector(c,b);c.subSelf(a).normalize();return new THREE.Ray(a,c)};this.projectScene=function(g,h,m,S){var aa=h.near,ga=h.far,Ia=!1,H,ca,ia,Z,ja,da,ba,oa,fb,Ma,za,qa,Sa,gb,vb;z=s=u=p=0;J.elements.length=0;g.updateMatrixWorld(); void 0===h.parent&&h.updateMatrixWorld();h.matrixWorldInverse.getInverse(h.matrixWorld);L.multiply(h.projectionMatrix,h.matrixWorldInverse);Q.setFromMatrix(L);f=0;J.objects.length=0;J.sprites.length=0;J.lights.length=0;var rb=function(b){for(var c=0,d=b.children.length;caa&&i.positionScreen.z(ba.positionScreen.x-Z.positionScreen.x)*(ja.positionScreen.y-Z.positionScreen.y)-(ba.positionScreen.y-Z.positionScreen.y)*(ja.positionScreen.x-Z.positionScreen.x),da===THREE.DoubleSide||Ia===(da===THREE.FrontSide))p=== +m;g++)if(oa=J.objects[g].object,fb=oa.matrixWorld,j=0,oa instanceof THREE.Mesh){Ma=oa.geometry;ia=Ma.vertices;za=Ma.faces;Ma=Ma.faceVertexUvs;M.getInverse(fb);M.transpose();Sa=oa.material instanceof THREE.MeshFaceMaterial;gb=!0===Sa?oa.material:null;H=0;for(ca=ia.length;Haa&&i.positionScreen.z(ba.positionScreen.x-Z.positionScreen.x)*(ja.positionScreen.y-Z.positionScreen.y)-(ba.positionScreen.y-Z.positionScreen.y)*(ja.positionScreen.x-Z.positionScreen.x),da===THREE.DoubleSide||Ia===(da===THREE.FrontSide))p=== r?(qa=new THREE.RenderableFace3,q.push(qa),r++,p++,n=qa):n=q[p++],n.v1.copy(Z),n.v2.copy(ja),n.v3.copy(ba);else continue;else continue;else if(ca instanceof THREE.Face4)if(Z=l[ca.a],ja=l[ca.b],ba=l[ca.c],qa=l[ca.d],!0===Z.visible&&!0===ja.visible&&!0===ba.visible&&!0===qa.visible)if(Ia=0>(qa.positionScreen.x-Z.positionScreen.x)*(ja.positionScreen.y-Z.positionScreen.y)-(qa.positionScreen.y-Z.positionScreen.y)*(ja.positionScreen.x-Z.positionScreen.x)||0>(ja.positionScreen.x-ba.positionScreen.x)*(qa.positionScreen.y- ba.positionScreen.y)-(ja.positionScreen.y-ba.positionScreen.y)*(qa.positionScreen.x-ba.positionScreen.x),da===THREE.DoubleSide||Ia===(da===THREE.FrontSide)){if(u===D){var nb=new THREE.RenderableFace4;t.push(nb);D++;u++;n=nb}else n=t[u++];n.v1.copy(Z);n.v2.copy(ja);n.v3.copy(ba);n.v4.copy(qa)}else continue;else continue;n.normalWorld.copy(ca.normal);!1===Ia&&(da===THREE.BackSide||da===THREE.DoubleSide)&&n.normalWorld.negate();M.multiplyVector3(n.normalWorld).normalize();n.centroidWorld.copy(ca.centroid); -eb.multiplyVector3(n.centroidWorld);n.centroidScreen.copy(n.centroidWorld);L.multiplyVector3(n.centroidScreen);ba=ca.vertexNormals;Z=0;for(ja=ba.length;ZC.z&&(z===B?(aa=new THREE.RenderableParticle,E.push(aa),B++,z++,v=aa):v=E[z++],v.object=oa,v.x=C.x/C.w,v.y=C.y/C.w,v.z=C.z,v.rotation=oa.rotation.z,v.scale.x=oa.scale.x*Math.abs(v.x- +fb.multiplyVector3(n.centroidWorld);n.centroidScreen.copy(n.centroidWorld);L.multiplyVector3(n.centroidScreen);ba=ca.vertexNormals;Z=0;for(ja=ba.length;ZC.z&&(z===B?(aa=new THREE.RenderableParticle,E.push(aa),B++,z++,v=aa):v=E[z++],v.object=oa,v.x=C.x/C.w,v.y=C.y/C.w,v.z=C.z,v.rotation=oa.rotation.z,v.scale.x=oa.scale.x*Math.abs(v.x- (C.x+h.projectionMatrix.elements[0])/(C.w+h.projectionMatrix.elements[12])),v.scale.y=oa.scale.y*Math.abs(v.y-(C.y+h.projectionMatrix.elements[5])/(C.w+h.projectionMatrix.elements[13])),v.material=oa.material,J.elements.push(v)));!0===S&&J.elements.sort(c);return J}};THREE.Quaternion=function(a,b,c,d){this.x=a||0;this.y=b||0;this.z=c||0;this.w=void 0!==d?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),e=Math.cos(a.z/2),f=Math.sin(a.x/2),g=Math.sin(a.y/2),h=Math.sin(a.z/2);void 0===b||"XYZ"===b?(this.x=f*d*e+c*g*h,this.y=c*g*e-f*d*h,this.z=c*d*h+f*g*e,this.w=c*d*e-f*g*h):"YXZ"===b?(this.x=f*d*e+c*g*h,this.y=c*g*e-f*d*h,this.z=c*d* h-f*g*e,this.w=c*d*e+f*g*h):"ZXY"===b?(this.x=f*d*e-c*g*h,this.y=c*g*e+f*d*h,this.z=c*d*h+f*g*e,this.w=c*d*e-f*g*h):"ZYX"===b?(this.x=f*d*e-c*g*h,this.y=c*g*e+f*d*h,this.z=c*d*h-f*g*e,this.w=c*d*e+f*g*h):"YZX"===b?(this.x=f*d*e+c*g*h,this.y=c*g*e+f*d*h,this.z=c*d*h-f*g*e,this.w=c*d*e-f*g*h):"XZY"===b&&(this.x=f*d*e-c*g*h,this.y=c*g*e-f*d*h,this.z=c*d*h+f*g*e,this.w=c*d*e+f*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*d;this.z=a.z*d;this.w=Math.cos(c); @@ -222,34 +222,34 @@ THREE.LOD.prototype.update=function(a){if(1t&&r.clearRect(Math.floor(Ta.getX()),Math.floor(Ta.getY()),Math.floor(Ta.getWidth()), Math.floor(Ta.getHeight())),0=k||(k*=f.intensity,c.r+=g.r*k, c.g+=g.g*k,c.b+=g.b*k)}else f instanceof THREE.PointLight&&(h=f.matrixWorld.getPosition(),k=b.dot(Ba.sub(h,a).normalize()),0>=k||(k*=0==f.distance?1:1-Math.min(a.distanceTo(h)/f.distance,1),0!=k&&(k*=f.intensity,c.r+=g.r*k,c.g+=g.g*k,c.b+=g.b*k)))}}function k(a,d,e,g,h,k,i,j){f.info.render.vertices+=3;f.info.render.faces++;b(j.opacity);c(j.blending);I=a.positionScreen.x;M=a.positionScreen.y;Q=d.positionScreen.x;O=d.positionScreen.y;R=e.positionScreen.x;T=e.positionScreen.y;m(I,M,Q,O,R,T);(j instanceof THREE.MeshLambertMaterial||j instanceof THREE.MeshPhongMaterial)&&null===j.map&&null===j.map?(da.copy(j.color),ba.copy(j.emissive),j.vertexColors===THREE.FaceColors&&(da.r*=i.color.r,da.g*=i.color.g,da.b*=i.color.b),!0===ob?!1===j.wireframe&&j.shading==THREE.SmoothShading&&3==i.vertexNormalsLength?(ca.r=ia.r=Z.r=la.r,ca.g=ia.g=Z.g=la.g,ca.b=ia.b=Z.b=la.b,n(i.v1.positionWorld,i.vertexNormalsWorld[0],ca),n(i.v2.positionWorld,i.vertexNormalsWorld[1],ia),n(i.v3.positionWorld,i.vertexNormalsWorld[2],Z), ca.r=ca.r*da.r+ba.r,ca.g=ca.g*da.g+ba.g,ca.b=ca.b*da.b+ba.b,ia.r=ia.r*da.r+ba.r,ia.g=ia.g*da.g+ba.g,ia.b=ia.b*da.b+ba.b,Z.r=Z.r*da.r+ba.r,Z.g=Z.g*da.g+ba.g,Z.b=Z.b*da.b+ba.b,ja.r=0.5*(ia.r+Z.r),ja.g=0.5*(ia.g+Z.g),ja.b=0.5*(ia.b+Z.b),qa=F(ca,ia,Z,ja),D(I,M,Q,O,R,T,0,0,1,0,0,1,qa)):(H.r=la.r,H.g=la.g,H.b=la.b,n(i.centroidWorld,i.normalWorld,H),H.r=H.r*da.r+ba.r,H.g=H.g*da.g+ba.g,H.b=H.b*da.b+ba.b,!0===j.wireframe?s(H,j.wireframeLinewidth,j.wireframeLinecap,j.wireframeLinejoin):u(H)):!0===j.wireframe? -s(j.color,j.wireframeLinewidth,j.wireframeLinecap,j.wireframeLinejoin):u(j.color)):j instanceof THREE.MeshBasicMaterial||j instanceof THREE.MeshLambertMaterial||j instanceof THREE.MeshPhongMaterial?null!==j.map?j.map.mapping instanceof THREE.UVMapping&&(Sa=i.uvs[0],x(I,M,Q,O,R,T,Sa[g].u,Sa[g].v,Sa[h].u,Sa[h].v,Sa[k].u,Sa[k].v,j.map)):null!==j.envMap?j.envMap.mapping instanceof THREE.SphericalReflectionMapping&&(a=l.matrixWorldInverse,Ba.copy(i.vertexNormalsWorld[g]),fb=0.5*(Ba.x*a.elements[0]+Ba.y* -a.elements[4]+Ba.z*a.elements[8])+0.5,vb=0.5*(Ba.x*a.elements[1]+Ba.y*a.elements[5]+Ba.z*a.elements[9])+0.5,Ba.copy(i.vertexNormalsWorld[h]),rb=0.5*(Ba.x*a.elements[0]+Ba.y*a.elements[4]+Ba.z*a.elements[8])+0.5,nb=0.5*(Ba.x*a.elements[1]+Ba.y*a.elements[5]+Ba.z*a.elements[9])+0.5,Ba.copy(i.vertexNormalsWorld[k]),mb=0.5*(Ba.x*a.elements[0]+Ba.y*a.elements[4]+Ba.z*a.elements[8])+0.5,ac=0.5*(Ba.x*a.elements[1]+Ba.y*a.elements[5]+Ba.z*a.elements[9])+0.5,x(I,M,Q,O,R,T,fb,vb,rb,nb,mb,ac,j.envMap)):(H.copy(j.color), +s(j.color,j.wireframeLinewidth,j.wireframeLinecap,j.wireframeLinejoin):u(j.color)):j instanceof THREE.MeshBasicMaterial||j instanceof THREE.MeshLambertMaterial||j instanceof THREE.MeshPhongMaterial?null!==j.map?j.map.mapping instanceof THREE.UVMapping&&(Sa=i.uvs[0],x(I,M,Q,O,R,T,Sa[g].u,Sa[g].v,Sa[h].u,Sa[h].v,Sa[k].u,Sa[k].v,j.map)):null!==j.envMap?j.envMap.mapping instanceof THREE.SphericalReflectionMapping&&(a=l.matrixWorldInverse,Ba.copy(i.vertexNormalsWorld[g]),gb=0.5*(Ba.x*a.elements[0]+Ba.y* +a.elements[4]+Ba.z*a.elements[8])+0.5,vb=0.5*(Ba.x*a.elements[1]+Ba.y*a.elements[5]+Ba.z*a.elements[9])+0.5,Ba.copy(i.vertexNormalsWorld[h]),rb=0.5*(Ba.x*a.elements[0]+Ba.y*a.elements[4]+Ba.z*a.elements[8])+0.5,nb=0.5*(Ba.x*a.elements[1]+Ba.y*a.elements[5]+Ba.z*a.elements[9])+0.5,Ba.copy(i.vertexNormalsWorld[k]),mb=0.5*(Ba.x*a.elements[0]+Ba.y*a.elements[4]+Ba.z*a.elements[8])+0.5,ac=0.5*(Ba.x*a.elements[1]+Ba.y*a.elements[5]+Ba.z*a.elements[9])+0.5,x(I,M,Q,O,R,T,gb,vb,rb,nb,mb,ac,j.envMap)):(H.copy(j.color), j.vertexColors===THREE.FaceColors&&(H.r*=i.color.r,H.g*=i.color.g,H.b*=i.color.b),!0===j.wireframe?s(H,j.wireframeLinewidth,j.wireframeLinecap,j.wireframeLinejoin):u(H)):j instanceof THREE.MeshDepthMaterial?(Ma=l.near,za=l.far,ca.r=ca.g=ca.b=1-Ya(a.positionScreen.z,Ma,za),ia.r=ia.g=ia.b=1-Ya(d.positionScreen.z,Ma,za),Z.r=Z.g=Z.b=1-Ya(e.positionScreen.z,Ma,za),ja.r=0.5*(ia.r+Z.r),ja.g=0.5*(ia.g+Z.g),ja.b=0.5*(ia.b+Z.b),qa=F(ca,ia,Z,ja),D(I,M,Q,O,R,T,0,0,1,0,0,1,qa)):j instanceof THREE.MeshNormalMaterial&& -(H.r=hb(i.normalWorld.x),H.g=hb(i.normalWorld.y),H.b=hb(i.normalWorld.z),!0===j.wireframe?s(H,j.wireframeLinewidth,j.wireframeLinecap,j.wireframeLinejoin):u(H))}function m(a,b,c,d,e,f){r.beginPath();r.moveTo(a,b);r.lineTo(c,d);r.lineTo(e,f);r.closePath()}function t(a,b,c,d,e,f,g,h){r.beginPath();r.moveTo(a,b);r.lineTo(c,d);r.lineTo(e,f);r.lineTo(g,h);r.closePath()}function s(a,b,c,e){A!==b&&(A=r.lineWidth=b);v!==c&&(v=r.lineCap=c);z!==e&&(z=r.lineJoin=e);d(a.getContextStyle());r.stroke();ra.inflate(2* -b)}function u(a){e(a.getContextStyle());r.fill()}function x(a,b,c,d,f,g,h,k,i,j,l,hb,n){if(!(n instanceof THREE.DataTexture||void 0===n.image||0==n.image.width)){if(!0===n.needsUpdate){var m=n.wrapS==THREE.RepeatWrapping,ib=n.wrapT==THREE.RepeatWrapping;oa[n.id]=r.createPattern(n.image,!0===m&&!0===ib?"repeat":!0===m&&!1===ib?"repeat-x":!1===m&&!0===ib?"repeat-y":"no-repeat");n.needsUpdate=!1}void 0===oa[n.id]?e("rgba(0,0,0,1)"):e(oa[n.id]);var m=n.offset.x/n.repeat.x,ib=n.offset.y/n.repeat.y,p=n.image.width* -n.repeat.x,q=n.image.height*n.repeat.y,h=(h+m)*p,k=(1-k+ib)*q,c=c-a,d=d-b,f=f-a,g=g-b,i=(i+m)*p-h,j=(1-j+ib)*q-k,l=(l+m)*p-h,hb=(1-hb+ib)*q-k,m=i*hb-l*j;0===m?(void 0===eb[n.id]&&(b=document.createElement("canvas"),b.width=n.image.width,b.height=n.image.height,b=b.getContext("2d"),b.drawImage(n.image,0,0),eb[n.id]=b.getImageData(0,0,n.image.width,n.image.height).data),b=eb[n.id],h=4*(Math.floor(h)+Math.floor(k)*n.image.width),H.setRGB(b[h]/255,b[h+1]/255,b[h+2]/255),u(H)):(m=1/m,n=(hb*c-j*f)*m,j= -(hb*d-j*g)*m,c=(i*f-l*c)*m,d=(i*g-l*d)*m,a=a-n*h-c*k,h=b-j*h-d*k,r.save(),r.transform(n,j,c,d,a,h),r.fill(),r.restore())}}function D(a,b,c,d,e,f,g,h,k,i,j,l,hb){var n,m;n=hb.width-1;m=hb.height-1;g*=n;h*=m;c-=a;d-=b;e-=a;f-=b;k=k*n-g;i=i*m-h;j=j*n-g;l=l*m-h;m=1/(k*l-j*i);n=(l*c-i*e)*m;i=(l*d-i*f)*m;c=(k*e-j*c)*m;d=(k*f-j*d)*m;a=a-n*g-c*h;b=b-i*g-d*h;r.save();r.transform(n,i,c,d,a,b);r.clip();r.drawImage(hb,0,0);r.restore()}function F(a,b,c,d){Xa[0]=255*a.r|0;Xa[1]=255*a.g|0;Xa[2]=255*a.b|0;Xa[4]= -255*b.r|0;Xa[5]=255*b.g|0;Xa[6]=255*b.b|0;Xa[8]=255*c.r|0;Xa[9]=255*c.g|0;Xa[10]=255*c.b|0;Xa[12]=255*d.r|0;Xa[13]=255*d.g|0;Xa[14]=255*d.b|0;Wa.putImageData(wb,0,0);cb.drawImage(tb,0,0);return ab}function Ya(a,b,c){a=(a-b)/(c-b);return a*a*(3-2*a)}function hb(a){a=0.5*(a+1);return 0>a?0:1>1,Rc=ma.height>>1,xb=bb.scale.x*p,yb=bb.scale.y*q,Fb=xb*jc,Gb=yb*Rc,ra.set(na.x-Fb,na.y-Gb,na.x+Fb,na.y+Gb),!1!==qb.intersects(ra)&&(r.save(),r.translate(na.x,na.y),r.rotate(-bb.rotation),r.scale(xb,-yb),r.translate(-jc,-Rc),r.drawImage(ma,0,0),r.restore())):ea instanceof THREE.ParticleCanvasMaterial&&(Fb=bb.scale.x*p,Gb=bb.scale.y* -q,ra.set(na.x-Fb,na.y-Gb,na.x+Fb,na.y+Gb),!1!==qb.intersects(ra)&&(d(ea.color.getContextStyle()),e(ea.color.getContextStyle()),r.save(),r.translate(na.x,na.y),r.rotate(-bb.rotation),r.scale(Fb,Gb),ea.program(r),r.restore()))}else ma instanceof THREE.RenderableLine?(E=ma.v1,B=ma.v2,E.positionScreen.x*=p,E.positionScreen.y*=q,B.positionScreen.x*=p,B.positionScreen.y*=q,ra.addPoint(E.positionScreen.x,E.positionScreen.y),ra.addPoint(B.positionScreen.x,B.positionScreen.y),!0===qb.intersects(ra)&&(na=E, -bb=B,b(ea.opacity),c(ea.blending),r.beginPath(),r.moveTo(na.positionScreen.x,na.positionScreen.y),r.lineTo(bb.positionScreen.x,bb.positionScreen.y),ea instanceof THREE.LineBasicMaterial&&(na=ea.linewidth,A!==na&&(A=r.lineWidth=na),na=ea.linecap,v!==na&&(v=r.lineCap=na),na=ea.linejoin,z!==na&&(z=r.lineJoin=na),d(ea.color.getContextStyle()),r.stroke(),ra.inflate(2*ea.linewidth)))):ma instanceof THREE.RenderableFace3?(E=ma.v1,B=ma.v2,J=ma.v3,E.positionScreen.x*=p,E.positionScreen.y*=q,B.positionScreen.x*= +(H.r=Za(i.normalWorld.x),H.g=Za(i.normalWorld.y),H.b=Za(i.normalWorld.z),!0===j.wireframe?s(H,j.wireframeLinewidth,j.wireframeLinecap,j.wireframeLinejoin):u(H))}function m(a,b,c,d,e,f){r.beginPath();r.moveTo(a,b);r.lineTo(c,d);r.lineTo(e,f);r.closePath()}function t(a,b,c,d,e,f,g,h){r.beginPath();r.moveTo(a,b);r.lineTo(c,d);r.lineTo(e,f);r.lineTo(g,h);r.closePath()}function s(a,b,c,e){A!==b&&(A=r.lineWidth=b);v!==c&&(v=r.lineCap=c);z!==e&&(z=r.lineJoin=e);d(a.getContextStyle());r.stroke();ra.inflate(2* +b)}function u(a){e(a.getContextStyle());r.fill()}function x(a,b,c,d,f,g,h,k,i,j,l,Za,n){if(!(n instanceof THREE.DataTexture||void 0===n.image||0==n.image.width)){if(!0===n.needsUpdate){var m=n.wrapS==THREE.RepeatWrapping,ib=n.wrapT==THREE.RepeatWrapping;oa[n.id]=r.createPattern(n.image,!0===m&&!0===ib?"repeat":!0===m&&!1===ib?"repeat-x":!1===m&&!0===ib?"repeat-y":"no-repeat");n.needsUpdate=!1}void 0===oa[n.id]?e("rgba(0,0,0,1)"):e(oa[n.id]);var m=n.offset.x/n.repeat.x,ib=n.offset.y/n.repeat.y,p=n.image.width* +n.repeat.x,q=n.image.height*n.repeat.y,h=(h+m)*p,k=(1-k+ib)*q,c=c-a,d=d-b,f=f-a,g=g-b,i=(i+m)*p-h,j=(1-j+ib)*q-k,l=(l+m)*p-h,Za=(1-Za+ib)*q-k,m=i*Za-l*j;0===m?(void 0===fb[n.id]&&(b=document.createElement("canvas"),b.width=n.image.width,b.height=n.image.height,b=b.getContext("2d"),b.drawImage(n.image,0,0),fb[n.id]=b.getImageData(0,0,n.image.width,n.image.height).data),b=fb[n.id],h=4*(Math.floor(h)+Math.floor(k)*n.image.width),H.setRGB(b[h]/255,b[h+1]/255,b[h+2]/255),u(H)):(m=1/m,n=(Za*c-j*f)*m,j= +(Za*d-j*g)*m,c=(i*f-l*c)*m,d=(i*g-l*d)*m,a=a-n*h-c*k,h=b-j*h-d*k,r.save(),r.transform(n,j,c,d,a,h),r.fill(),r.restore())}}function D(a,b,c,d,e,f,g,h,k,i,j,l,n){var Za,m;Za=n.width-1;m=n.height-1;g*=Za;h*=m;c-=a;d-=b;e-=a;f-=b;k=k*Za-g;i=i*m-h;j=j*Za-g;l=l*m-h;m=1/(k*l-j*i);Za=(l*c-i*e)*m;i=(l*d-i*f)*m;c=(k*e-j*c)*m;d=(k*f-j*d)*m;a=a-Za*g-c*h;b=b-i*g-d*h;r.save();r.transform(Za,i,c,d,a,b);r.clip();r.drawImage(n,0,0);r.restore()}function F(a,b,c,d){Xa[0]=255*a.r|0;Xa[1]=255*a.g|0;Xa[2]=255*a.b|0;Xa[4]= +255*b.r|0;Xa[5]=255*b.g|0;Xa[6]=255*b.b|0;Xa[8]=255*c.r|0;Xa[9]=255*c.g|0;Xa[10]=255*c.b|0;Xa[12]=255*d.r|0;Xa[13]=255*d.g|0;Xa[14]=255*d.b|0;Wa.putImageData(wb,0,0);db.drawImage(tb,0,0);return bb}function Ya(a,b,c){a=(a-b)/(c-b);return a*a*(3-2*a)}function Za(a){a=0.5*(a+1);return 0>a?0:1>1,Rc=ma.height>>1,xb=cb.scale.x*p,yb=cb.scale.y*q,Fb=xb*jc,Gb=yb*Rc,ra.set(na.x-Fb,na.y-Gb,na.x+Fb,na.y+Gb),!1!==qb.intersects(ra)&&(r.save(),r.translate(na.x,na.y),r.rotate(-cb.rotation),r.scale(xb,-yb),r.translate(-jc,-Rc),r.drawImage(ma,0,0),r.restore())):ea instanceof THREE.ParticleCanvasMaterial&&(Fb=cb.scale.x*p,Gb=cb.scale.y* +q,ra.set(na.x-Fb,na.y-Gb,na.x+Fb,na.y+Gb),!1!==qb.intersects(ra)&&(d(ea.color.getContextStyle()),e(ea.color.getContextStyle()),r.save(),r.translate(na.x,na.y),r.rotate(-cb.rotation),r.scale(Fb,Gb),ea.program(r),r.restore()))}else ma instanceof THREE.RenderableLine?(E=ma.v1,B=ma.v2,E.positionScreen.x*=p,E.positionScreen.y*=q,B.positionScreen.x*=p,B.positionScreen.y*=q,ra.addPoint(E.positionScreen.x,E.positionScreen.y),ra.addPoint(B.positionScreen.x,B.positionScreen.y),!0===qb.intersects(ra)&&(na=E, +cb=B,b(ea.opacity),c(ea.blending),r.beginPath(),r.moveTo(na.positionScreen.x,na.positionScreen.y),r.lineTo(cb.positionScreen.x,cb.positionScreen.y),ea instanceof THREE.LineBasicMaterial&&(na=ea.linewidth,A!==na&&(A=r.lineWidth=na),na=ea.linecap,v!==na&&(v=r.lineCap=na),na=ea.linejoin,z!==na&&(z=r.lineJoin=na),d(ea.color.getContextStyle()),r.stroke(),ra.inflate(2*ea.linewidth)))):ma instanceof THREE.RenderableFace3?(E=ma.v1,B=ma.v2,J=ma.v3,E.positionScreen.x*=p,E.positionScreen.y*=q,B.positionScreen.x*= p,B.positionScreen.y*=q,J.positionScreen.x*=p,J.positionScreen.y*=q,!0===ea.overdraw&&(bc(E.positionScreen,B.positionScreen),bc(B.positionScreen,J.positionScreen),bc(J.positionScreen,E.positionScreen)),ra.add3Points(E.positionScreen.x,E.positionScreen.y,B.positionScreen.x,B.positionScreen.y,J.positionScreen.x,J.positionScreen.y),!0===qb.intersects(ra)&&k(E,B,J,0,1,2,ma,ea,a)):ma instanceof THREE.RenderableFace4&&(E=ma.v1,B=ma.v2,J=ma.v3,K=ma.v4,E.positionScreen.x*=p,E.positionScreen.y*=q,B.positionScreen.x*= p,B.positionScreen.y*=q,J.positionScreen.x*=p,J.positionScreen.y*=q,K.positionScreen.x*=p,K.positionScreen.y*=q,C.positionScreen.copy(B.positionScreen),L.positionScreen.copy(K.positionScreen),!0===ea.overdraw&&(bc(E.positionScreen,B.positionScreen),bc(B.positionScreen,K.positionScreen),bc(K.positionScreen,E.positionScreen),bc(J.positionScreen,C.positionScreen),bc(J.positionScreen,L.positionScreen)),ra.addPoint(E.positionScreen.x,E.positionScreen.y),ra.addPoint(B.positionScreen.x,B.positionScreen.y), -ra.addPoint(J.positionScreen.x,J.positionScreen.y),ra.addPoint(K.positionScreen.x,K.positionScreen.y),!0===qb.intersects(ra)&&(na=E,bb=B,Fb=J,Gb=K,xb=C,yb=L,jc=a,f.info.render.vertices+=4,f.info.render.faces++,b(ea.opacity),c(ea.blending),void 0!==ea.map&&null!==ea.map||void 0!==ea.envMap&&null!==ea.envMap?(k(na,bb,Gb,0,1,3,ma,ea,jc),k(xb,Fb,yb,1,2,3,ma,ea,jc)):(I=na.positionScreen.x,M=na.positionScreen.y,Q=bb.positionScreen.x,O=bb.positionScreen.y,R=Fb.positionScreen.x,T=Fb.positionScreen.y,N=Gb.positionScreen.x, +ra.addPoint(J.positionScreen.x,J.positionScreen.y),ra.addPoint(K.positionScreen.x,K.positionScreen.y),!0===qb.intersects(ra)&&(na=E,cb=B,Fb=J,Gb=K,xb=C,yb=L,jc=a,f.info.render.vertices+=4,f.info.render.faces++,b(ea.opacity),c(ea.blending),void 0!==ea.map&&null!==ea.map||void 0!==ea.envMap&&null!==ea.envMap?(k(na,cb,Gb,0,1,3,ma,ea,jc),k(xb,Fb,yb,1,2,3,ma,ea,jc)):(I=na.positionScreen.x,M=na.positionScreen.y,Q=cb.positionScreen.x,O=cb.positionScreen.y,R=Fb.positionScreen.x,T=Fb.positionScreen.y,N=Gb.positionScreen.x, P=Gb.positionScreen.y,S=xb.positionScreen.x,aa=xb.positionScreen.y,ga=yb.positionScreen.x,Ia=yb.positionScreen.y,ea instanceof THREE.MeshLambertMaterial||ea instanceof THREE.MeshPhongMaterial?(da.copy(ea.color),ba.copy(ea.emissive),ea.vertexColors===THREE.FaceColors&&(da.r*=ma.color.r,da.g*=ma.color.g,da.b*=ma.color.b),!0===ob?!1===ea.wireframe&&ea.shading==THREE.SmoothShading&&4==ma.vertexNormalsLength?(ca.r=ia.r=Z.r=ja.r=la.r,ca.g=ia.g=Z.g=ja.g=la.g,ca.b=ia.b=Z.b=ja.b=la.b,n(ma.v1.positionWorld, ma.vertexNormalsWorld[0],ca),n(ma.v2.positionWorld,ma.vertexNormalsWorld[1],ia),n(ma.v4.positionWorld,ma.vertexNormalsWorld[3],Z),n(ma.v3.positionWorld,ma.vertexNormalsWorld[2],ja),ca.r=ca.r*da.r+ba.r,ca.g=ca.g*da.g+ba.g,ca.b=ca.b*da.b+ba.b,ia.r=ia.r*da.r+ba.r,ia.g=ia.g*da.g+ba.g,ia.b=ia.b*da.b+ba.b,Z.r=Z.r*da.r+ba.r,Z.g=Z.g*da.g+ba.g,Z.b=Z.b*da.b+ba.b,ja.r=ja.r*da.r+ba.r,ja.g=ja.g*da.g+ba.g,ja.b=ja.b*da.b+ba.b,qa=F(ca,ia,Z,ja),m(I,M,Q,O,N,P),D(I,M,Q,O,N,P,0,0,1,0,0,1,qa),m(S,aa,R,T,ga,Ia),D(S,aa, R,T,ga,Ia,1,0,1,1,0,1,qa)):(H.r=la.r,H.g=la.g,H.b=la.b,n(ma.centroidWorld,ma.normalWorld,H),H.r=H.r*da.r+ba.r,H.g=H.g*da.g+ba.g,H.b=H.b*da.b+ba.b,t(I,M,Q,O,R,T,N,P),!0===ea.wireframe?s(H,ea.wireframeLinewidth,ea.wireframeLinecap,ea.wireframeLinejoin):u(H)):(H.r=da.r+ba.r,H.g=da.g+ba.g,H.b=da.b+ba.b,t(I,M,Q,O,R,T,N,P),!0===ea.wireframe?s(H,ea.wireframeLinewidth,ea.wireframeLinecap,ea.wireframeLinejoin):u(H))):ea instanceof THREE.MeshBasicMaterial?(H.copy(ea.color),ea.vertexColors===THREE.FaceColors&& -(H.r*=ma.color.r,H.g*=ma.color.g,H.b*=ma.color.b),t(I,M,Q,O,R,T,N,P),!0===ea.wireframe?s(H,ea.wireframeLinewidth,ea.wireframeLinecap,ea.wireframeLinejoin):u(H)):ea instanceof THREE.MeshNormalMaterial?(H.r=hb(ma.normalWorld.x),H.g=hb(ma.normalWorld.y),H.b=hb(ma.normalWorld.z),t(I,M,Q,O,R,T,N,P),!0===ea.wireframe?s(H,ea.wireframeLinewidth,ea.wireframeLinecap,ea.wireframeLinejoin):u(H)):ea instanceof THREE.MeshDepthMaterial&&(Ma=l.near,za=l.far,ca.r=ca.g=ca.b=1-Ya(na.positionScreen.z,Ma,za),ia.r=ia.g= -ia.b=1-Ya(bb.positionScreen.z,Ma,za),Z.r=Z.g=Z.b=1-Ya(Gb.positionScreen.z,Ma,za),ja.r=ja.g=ja.b=1-Ya(Fb.positionScreen.z,Ma,za),qa=F(ca,ia,Z,ja),m(I,M,Q,O,N,P),D(I,M,Q,O,N,P,0,0,1,0,0,1,qa),m(S,aa,R,T,ga,Ia),D(S,aa,R,T,ga,Ia,1,0,1,1,0,1,qa)))));Ta.addRectangle(ra)}r.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", +(H.r*=ma.color.r,H.g*=ma.color.g,H.b*=ma.color.b),t(I,M,Q,O,R,T,N,P),!0===ea.wireframe?s(H,ea.wireframeLinewidth,ea.wireframeLinecap,ea.wireframeLinejoin):u(H)):ea instanceof THREE.MeshNormalMaterial?(H.r=Za(ma.normalWorld.x),H.g=Za(ma.normalWorld.y),H.b=Za(ma.normalWorld.z),t(I,M,Q,O,R,T,N,P),!0===ea.wireframe?s(H,ea.wireframeLinewidth,ea.wireframeLinecap,ea.wireframeLinejoin):u(H)):ea instanceof THREE.MeshDepthMaterial&&(Ma=l.near,za=l.far,ca.r=ca.g=ca.b=1-Ya(na.positionScreen.z,Ma,za),ia.r=ia.g= +ia.b=1-Ya(cb.positionScreen.z,Ma,za),Z.r=Z.g=Z.b=1-Ya(Gb.positionScreen.z,Ma,za),ja.r=ja.g=ja.b=1-Ya(Fb.positionScreen.z,Ma,za),qa=F(ca,ia,Z,ja),m(I,M,Q,O,N,P),D(I,M,Q,O,N,P,0,0,1,0,0,1,qa),m(S,aa,R,T,ga,Ia),D(S,aa,R,T,ga,Ia,1,0,1,1,0,1,qa)))));Ta.addRectangle(ra)}r.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#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\nuniform bool useRefract;\nuniform float refractionRatio;\n#else\nvarying vec3 vReflect;\n#endif\n#endif",envmap_fragment:"#ifdef USE_ENVMAP\nvec3 reflectVec;\n#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\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 if ( combine == 2 ) {\ngl_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 ) && ! defined( USE_NORMALMAP )\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 worldPosition = modelMatrix * skinned;\n#endif\n#if defined( USE_MORPHTARGETS ) && ! defined( USE_SKINNING )\nvec4 worldPosition = modelMatrix * vec4( morphed, 1.0 );\n#endif\n#if ! defined( USE_MORPHTARGETS ) && ! defined( USE_SKINNING )\nvec4 worldPosition = modelMatrix * vec4( position, 1.0 );\n#endif\n#endif", envmap_vertex:"#if defined( USE_ENVMAP ) && ! defined( USE_BUMPMAP ) && ! defined( USE_NORMALMAP )\nvec3 worldNormal = mat3( modelMatrix[ 0 ].xyz, modelMatrix[ 1 ].xyz, modelMatrix[ 2 ].xyz ) * objectNormal;\nworldNormal = normalize( worldNormal );\nvec3 cameraToVertex = normalize( worldPosition.xyz - cameraPosition );\nif ( useRefract ) {\nvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\n} else {\nvReflect = reflect( cameraToVertex, worldNormal );\n}\n#endif",map_particle_pars_fragment:"#ifdef USE_MAP\nuniform sampler2D map;\n#endif", @@ -299,7 +299,7 @@ g=4:"c"===f.type&&(g=3);f.size=g;f.array=new Float32Array(c*g);f.buffer=k.create l;c++)a.__morphTargetsArrays.push(new Float32Array(3*i))}if(a.numMorphNormals){a.__morphNormalsArrays=[];c=0;for(l=a.numMorphNormals;cl;l++)H.autoScaleCubemaps&&!f?(n=j,m=l,t=c.image[l],u=Qc,t.width<=u&&t.height<=u||(x=Math.max(t.width,t.height),s=Math.floor(t.width*u/x),u=Math.floor(t.height*u/x),x=document.createElement("canvas"),x.width=s,x.height=u,x.getContext("2d").drawImage(t,0,0,t.width,t.height,0,0,s,u),t=x),n[m]=t):j[l]=c.image[l];l=j[0];n=0===(l.width&l.width-1)&&0===(l.height&l.height-1);m=Q(c.format);t=Q(c.type);L(k.TEXTURE_CUBE_MAP, -c,n);for(l=0;6>l;l++)if(f){u=j[l].mipmaps;x=0;for(z=u.length;x=yc&&console.warn("Trying to use "+a+" texture units while this GPU supports only "+ +!1,c._array);else if("m4v"===l){void 0===c._array&&(c._array=new Float32Array(16*j.length));l=0;for(n=j.length;ll;l++)H.autoScaleCubemaps&&!f?(n=j,m=l,t=c.image[l],u=Qc,t.width<=u&&t.height<=u||(x=Math.max(t.width,t.height),s=Math.floor(t.width*u/x),u=Math.floor(t.height*u/x),x=document.createElement("canvas"),x.width=s,x.height=u,x.getContext("2d").drawImage(t,0,0,t.width,t.height,0,0,s,u),t=x),n[m]=t):j[l]=c.image[l];l=j[0];n=0===(l.width&l.width-1)&&0===(l.height&l.height-1);m=Q(c.format); +t=Q(c.type);L(k.TEXTURE_CUBE_MAP,c,n);for(l=0;6>l;l++)if(f){u=j[l].mipmaps;x=0;for(z=u.length;x=yc&&console.warn("Trying to use "+a+" texture units while this GPU supports only "+ yc);Ma+=1;return a}function z(a,b){a._modelViewMatrix.multiply(b.matrixWorldInverse,a.matrixWorld);a._normalMatrix.getInverse(a._modelViewMatrix);a._normalMatrix.transpose()}function E(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 B(a,b,c,d){a[b]=c.r*d;a[b+1]=c.g*d;a[b+2]=c.b*d}function J(a,b,c){ac!==a&&(a?k.enable(k.POLYGON_OFFSET_FILL):k.disable(k.POLYGON_OFFSET_FILL),ac=a);if(a&&(qb!==b||Ta!==c))k.polygonOffset(b,c),qb=b,Ta=c}function K(a){for(var a=a.split("\n"),b=0,c=a.length;b< c;b++)a[b]=b+1+": "+a[b];return a.join("\n")}function C(a,b){var c;"fragment"===a?c=k.createShader(k.FRAGMENT_SHADER):"vertex"===a&&(c=k.createShader(k.VERTEX_SHADER));k.shaderSource(c,b);k.compileShader(c);return!k.getShaderParameter(c,k.COMPILE_STATUS)?(console.error(k.getShaderInfoLog(c)),console.error(K(b)),null):c}function L(a,b,c){c?(k.texParameteri(a,k.TEXTURE_WRAP_S,Q(b.wrapS)),k.texParameteri(a,k.TEXTURE_WRAP_T,Q(b.wrapT)),k.texParameteri(a,k.TEXTURE_MAG_FILTER,Q(b.magFilter)),k.texParameteri(a, k.TEXTURE_MIN_FILTER,Q(b.minFilter))):(k.texParameteri(a,k.TEXTURE_WRAP_S,k.CLAMP_TO_EDGE),k.texParameteri(a,k.TEXTURE_WRAP_T,k.CLAMP_TO_EDGE),k.texParameteri(a,k.TEXTURE_MAG_FILTER,M(b.magFilter)),k.texParameteri(a,k.TEXTURE_MIN_FILTER,M(b.minFilter)));if(Eb&&b.type!==THREE.FloatType&&(1b;b++)k.deleteFramebuffer(a.__webglFramebuffer[b]),k.deleteRenderbuffer(a.__webglRenderbuffer[b]);else k.deleteFramebuffer(a.__webglFramebuffer),k.deleteRenderbuffer(a.__webglRenderbuffer)};this.deallocateMaterial=function(a){var b=a.program;if(b){a.program=void 0;var c,d,e=!1,a=0;for(c=ca.length;ad.numSupportedMorphTargets?(h.sort(p),h.length=d.numSupportedMorphTargets):h.length>d.numSupportedMorphNormals?h.sort(p):0===h.length&&h.push([0,0]);for(i=0;ib;b++)k.deleteFramebuffer(a.__webglFramebuffer[b]),k.deleteRenderbuffer(a.__webglRenderbuffer[b]);else k.deleteFramebuffer(a.__webglFramebuffer),k.deleteRenderbuffer(a.__webglRenderbuffer)};this.deallocateMaterial=function(a){var b=a.program;if(b){a.program=void 0;var c, +d,e=!1,a=0;for(c=ca.length;ad.numSupportedMorphTargets?(h.sort(p),h.length=d.numSupportedMorphTargets):h.length>d.numSupportedMorphNormals?h.sort(p):0===h.length&&h.push([0,0]);for(i=0;iva;va++)cc=cb[va],Ab[Za]=cc.x,Ab[Za+1]=cc.y,Ab[Za+2]=cc.z,Za+=3;else for(va=0;3>va;va++)Ab[Za]=Ya.x,Ab[Za+1]=Ya.y,Ab[Za+2]=Ya.z,Za+=3;G=0;for($=ua.length;G<$;G++)if(U=$a[ua[G]],cb=U.vertexNormals,Ya=U.normal,4===cb.length&&gb)for(va=0;4>va;va++)cc=cb[va],Ab[Za]=cc.x,Ab[Za+1]=cc.y,Ab[Za+2]=cc.z,Za+=3;else for(va=0;4>va;va++)Ab[Za]=Ya.x,Ab[Za+1]=Ya.y,Ab[Za+2]=Ya.z,Za+=3;k.bindBuffer(k.ARRAY_BUFFER,sa.__webglNormalBuffer);k.bufferData(k.ARRAY_BUFFER,Ab,Aa)}if(oc&&Vc&&sb){G=0;for($=ta.length;G< +nb){G=0;for($=ta.length;G<$;G++)U=ab[ta[G]],Hb=U.vertexColors,rb=U.color,3===Hb.length&&nb===THREE.VertexColors?(Ob=Hb[0],Pb=Hb[1],Qb=Hb[2]):Qb=Pb=Ob=rb,Ra[Ka]=Ob.r,Ra[Ka+1]=Ob.g,Ra[Ka+2]=Ob.b,Ra[Ka+3]=Pb.r,Ra[Ka+4]=Pb.g,Ra[Ka+5]=Pb.b,Ra[Ka+6]=Qb.r,Ra[Ka+7]=Qb.g,Ra[Ka+8]=Qb.b,Ka+=9;G=0;for($=ua.length;G<$;G++)U=ab[ua[G]],Hb=U.vertexColors,rb=U.color,4===Hb.length&&nb===THREE.VertexColors?(Ob=Hb[0],Pb=Hb[1],Qb=Hb[2],wb=Hb[3]):wb=Qb=Pb=Ob=rb,Ra[Ka]=Ob.r,Ra[Ka+1]=Ob.g,Ra[Ka+2]=Ob.b,Ra[Ka+3]=Pb.r,Ra[Ka+ +4]=Pb.g,Ra[Ka+5]=Pb.b,Ra[Ka+6]=Qb.r,Ra[Ka+7]=Qb.g,Ra[Ka+8]=Qb.b,Ra[Ka+9]=wb.r,Ra[Ka+10]=wb.g,Ra[Ka+11]=wb.b,Ka+=12;0va;va++)cc=db[va],Ab[$a]=cc.x,Ab[$a+1]=cc.y,Ab[$a+2]=cc.z,$a+=3;else for(va=0;3>va;va++)Ab[$a]=Ya.x,Ab[$a+1]=Ya.y,Ab[$a+2]=Ya.z,$a+=3;G=0;for($=ua.length;G<$;G++)if(U=ab[ua[G]],db=U.vertexNormals,Ya=U.normal,4===db.length&&hb)for(va=0;4>va;va++)cc=db[va],Ab[$a]=cc.x,Ab[$a+1]=cc.y,Ab[$a+2]=cc.z,$a+=3;else for(va=0;4>va;va++)Ab[$a]=Ya.x,Ab[$a+1]=Ya.y,Ab[$a+2]=Ya.z,$a+=3;k.bindBuffer(k.ARRAY_BUFFER,sa.__webglNormalBuffer);k.bufferData(k.ARRAY_BUFFER,Ab,Aa)}if(oc&&Vc&&sb){G=0;for($=ta.length;G< $;G++)if(Wa=ta[G],mb=Vc[Wa],void 0!==mb)for(va=0;3>va;va++)kc=mb[va],pc[Zb]=kc.u,pc[Zb+1]=kc.v,Zb+=2;G=0;for($=ua.length;G<$;G++)if(Wa=ua[G],mb=Vc[Wa],void 0!==mb)for(va=0;4>va;va++)kc=mb[va],pc[Zb]=kc.u,pc[Zb+1]=kc.v,Zb+=2;0va;va++)lc=ob[va],qc[$b]=lc.u,qc[$b+1]=lc.v,$b+=2;G=0;for($=ua.length;G<$;G++)if(Wa=ua[G],ob=Wc[Wa], -void 0!==ob)for(va=0;4>va;va++)lc=ob[va],qc[$b]=lc.u,qc[$b+1]=lc.v,$b+=2;0<$b&&(k.bindBuffer(k.ARRAY_BUFFER,sa.__webglUV2Buffer),k.bufferData(k.ARRAY_BUFFER,qc,Aa))}if(xc){G=0;for($=ta.length;G<$;G++)Xb[zb]=Ja,Xb[zb+1]=Ja+1,Xb[zb+2]=Ja+2,zb+=3,pb[db]=Ja,pb[db+1]=Ja+1,pb[db+2]=Ja,pb[db+3]=Ja+2,pb[db+4]=Ja+1,pb[db+5]=Ja+2,db+=6,Ja+=3;G=0;for($=ua.length;G<$;G++)Xb[zb]=Ja,Xb[zb+1]=Ja+1,Xb[zb+2]=Ja+3,Xb[zb+3]=Ja+1,Xb[zb+4]=Ja+2,Xb[zb+5]=Ja+3,zb+=6,pb[db]=Ja,pb[db+1]=Ja+1,pb[db+2]=Ja,pb[db+3]=Ja+3,pb[db+ -4]=Ja+1,pb[db+5]=Ja+2,pb[db+6]=Ja+2,pb[db+7]=Ja+3,db+=8,Ja+=4;k.bindBuffer(k.ELEMENT_ARRAY_BUFFER,sa.__webglFaceBuffer);k.bufferData(k.ELEMENT_ARRAY_BUFFER,Xb,Aa);k.bindBuffer(k.ELEMENT_ARRAY_BUFFER,sa.__webglLineBuffer);k.bufferData(k.ELEMENT_ARRAY_BUFFER,pb,Aa)}if(Uc){va=0;for(ac=Uc.length;vava;va++)lc=ob[va],qc[$b]=lc.u,qc[$b+1]=lc.v,$b+=2;0<$b&&(k.bindBuffer(k.ARRAY_BUFFER,sa.__webglUV2Buffer),k.bufferData(k.ARRAY_BUFFER,qc,Aa))}if(xc){G=0;for($=ta.length;G<$;G++)Xb[zb]=Ja,Xb[zb+1]=Ja+1,Xb[zb+2]=Ja+2,zb+=3,pb[eb]=Ja,pb[eb+1]=Ja+1,pb[eb+2]=Ja,pb[eb+3]=Ja+2,pb[eb+4]=Ja+1,pb[eb+5]=Ja+2,eb+=6,Ja+=3;G=0;for($=ua.length;G<$;G++)Xb[zb]=Ja,Xb[zb+1]=Ja+1,Xb[zb+2]=Ja+3,Xb[zb+3]=Ja+1,Xb[zb+4]=Ja+2,Xb[zb+5]=Ja+3,zb+=6,pb[eb]=Ja,pb[eb+1]=Ja+1,pb[eb+2]=Ja,pb[eb+3]=Ja+3,pb[eb+ +4]=Ja+1,pb[eb+5]=Ja+2,pb[eb+6]=Ja+2,pb[eb+7]=Ja+3,eb+=8,Ja+=4;k.bindBuffer(k.ELEMENT_ARRAY_BUFFER,sa.__webglFaceBuffer);k.bufferData(k.ELEMENT_ARRAY_BUFFER,Xb,Aa);k.bindBuffer(k.ELEMENT_ARRAY_BUFFER,sa.__webglLineBuffer);k.bufferData(k.ELEMENT_ARRAY_BUFFER,pb,Aa)}if(Uc){va=0;for(ac=Uc.length;vaf;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);I(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),L(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),I(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=sb,a=gb,d=ob,e=la);b!==ja&&(k.bindFramebuffer(k.FRAMEBUFFER,b),k.viewport(d,e,c,a),ja=b);Ba=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: +void 0===a.stencilBuffer&&(a.stencilBuffer=!0);a.__webglTexture=k.createTexture();H.info.memory.textures++;var c=0===(a.width&a.width-1)&&0===(a.height&a.height-1),d=Q(a.format),e=Q(a.type);if(b){a.__webglFramebuffer=[];a.__webglRenderbuffer=[];k.bindTexture(k.TEXTURE_CUBE_MAP,a.__webglTexture);L(k.TEXTURE_CUBE_MAP,a,c);for(var f=0;6>f;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);I(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),L(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),I(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=sb,a=hb,d=ob,e=la);b!==ja&&(k.bindFramebuffer(k.FRAMEBUFFER,b),k.viewport(d,e,c,a), +ja=b);Ba=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: 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}; THREE.WebGLRenderTarget.prototype.clone=function(){var a=new THREE.WebGLRenderTarget(this.width,this.height);a.wrapS=this.wrapS;a.wrapT=this.wrapT;a.magFilter=this.magFilter;a.anisotropy=this.anisotropy;a.minFilter=this.minFilter;a.offset.copy(this.offset);a.repeat.copy(this.repeat);a.format=this.format;a.type=this.type;a.depthBuffer=this.depthBuffer;a.stencilBuffer=this.stencilBuffer;a.generateMipmaps=this.generateMipmaps;return a};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.centroidWorld=new THREE.Vector3;this.centroidScreen=new THREE.Vector3;this.normalWorld=new THREE.Vector3;this.vertexNormalsWorld=[new THREE.Vector3,new THREE.Vector3,new THREE.Vector3];this.vertexNormalsLength=0;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.centroidWorld=new THREE.Vector3;this.centroidScreen=new THREE.Vector3;this.normalWorld=new THREE.Vector3;this.vertexNormalsWorld=[new THREE.Vector3,new THREE.Vector3,new THREE.Vector3,new THREE.Vector3];this.vertexNormalsLength=0;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.ColorUtils={adjustHSV:function(a,b,c,d){var e=THREE.ColorUtils.__hsv;a.getHSV(e);e.h=THREE.Math.clamp(e.h+b,0,1);e.s=THREE.Math.clamp(e.s+c,0,1);e.v=THREE.Math.clamp(e.v+d,0,1);a.setHSV(e.h,e.s,e.v)}};THREE.ColorUtils.__hsv={h:0,s:0,v:0};THREE.GeometryUtils={merge:function(a,b){var c,d,e=a.vertices.length,f=b instanceof THREE.Mesh?b.geometry:b,g=a.vertices,h=f.vertices,i=a.faces,j=f.faces,l=a.faceVertexUvs[0],f=f.faceVertexUvs[0];b instanceof THREE.Mesh&&(b.matrixAutoUpdate&&b.updateMatrix(),c=b.matrix,d=new THREE.Matrix4,d.extractRotation(c,b.scale));for(var m=0,n=h.length;m>8&255,i>>16&255,i>>24&255)),d}d.mipmapCount=1;h[2]&131072&&!1!==b&&(d.mipmapCount=Math.max(1,h[7]));d.width=h[4];d.height=h[3];h=h[1]+4;f=d.width;g=d.height;for(i=0;im-1?0:m-1,p=m+1>e-1?e-1:m+1,q=0>l-1?0:l-1,r=l+1>d-1?d-1:l+1,u=[],t=[0,0,h[4*(m*d+l)]/255*b];u.push([-1,0,h[4*(m*d+q)]/255*b]);u.push([-1,-1,h[4*(n*d+q)]/255*b]);u.push([0,-1,h[4*(n*d+l)]/255*b]);u.push([1,-1,h[4*(n*d+r)]/255*b]);u.push([1,0,h[4*(m*d+r)]/255*b]);u.push([1,1,h[4*(p*d+r)]/255*b]);u.push([0,1,h[4*(p*d+l)]/255*b]);u.push([-1,1,h[4*(p*d+q)]/255*b]);n=[];q=u.length;for(p=0;p>8&255,i>>16&255,i>>24&255)),d}d.mipmapCount=1;h[2]&131072&&!1!==b&&(d.mipmapCount=Math.max(1,h[7]));d.isCubemap=h[28]&512?!0:!1;d.width=h[4];d.height=h[3];for(var h=h[1]+4,f=d.width,g=d.height,i=d.isCubemap? +6:1,j=0;jm-1?0:m-1,p=m+1>e-1?e-1:m+1,q=0>l-1?0:l-1,r=l+1>d-1?d-1:l+1,u=[],t=[0,0,h[4*(m*d+l)]/255*b];u.push([-1,0,h[4*(m*d+q)]/255*b]);u.push([-1,-1,h[4*(n*d+q)]/255*b]);u.push([0,-1,h[4*(n*d+l)]/255*b]);u.push([1,-1,h[4*(n*d+r)]/255*b]);u.push([1,0,h[4*(m*d+r)]/255*b]);u.push([1,1,h[4*(p*d+r)]/255*b]);u.push([0,1,h[4*(p*d+l)]/255*b]);u.push([-1,1,h[4*(p*d+q)]/255*b]);n=[];q=u.length;for(p=0;pd?(d=new THREE.Face3(a.index,b.index,c.index,[a.clone(),b.clone(),c.clone()]),d.centroid.addSelf(a).addSelf(b).addSelf(c).divideScalar(3),d.normal=d.centroid.clone().normalize(),i.faces.push(d),d=Math.atan2(d.centroid.z,-d.centroid.x), i.faceVertexUvs[0].push([h(a.uv,a,d),h(b.uv,b,d),h(c.uv,c,d)])):(d-=1,f(a,g(a,b),g(a,c),d),f(g(a,b),b,g(b,c),d),f(g(a,c),g(b,c),c,d),f(g(a,b),g(b,c),g(a,c),d))}function g(a,b){m[a.index]||(m[a.index]=[]);m[b.index]||(m[b.index]=[]);var c=m[a.index][b.index];void 0===c&&(m[a.index][b.index]=m[b.index][a.index]=c=e((new THREE.Vector3).add(a,b).divideScalar(2)));return c}function h(a,b,c){0>c&&1===a.u&&(a=new THREE.UV(a.u-1,a.v));0===b.x&&0===b.z&&(a=new THREE.UV(c/2/Math.PI+0.5,a.v));return a}THREE.Geometry.call(this); diff --git a/examples/textures/compressed/Mountains.dds b/examples/textures/compressed/Mountains.dds new file mode 100644 index 0000000000000000000000000000000000000000..5f96b9e7c531c99698794f6578773f2bd0723219 Binary files /dev/null and b/examples/textures/compressed/Mountains.dds differ diff --git a/examples/webgl_materials_texture_compressed.html b/examples/webgl_materials_texture_compressed.html index dd0a1bbcb80d7359c919f10bc727236a1ce0de88..ae97e807cb4a5351e3619b8f84ca9c385ba9fd7f 100644 --- a/examples/webgl_materials_texture_compressed.html +++ b/examples/webgl_materials_texture_compressed.html @@ -82,12 +82,19 @@ var map4 = THREE.ImageUtils.loadCompressedTexture( 'textures/compressed/explosion_dxt5_mip.dds' ); map4.anisotropy = 4; - var material1 = new THREE.MeshBasicMaterial( { map: map1 } ); + var cubemap = THREE.ImageUtils.loadCompressedTextureCube( 'textures/compressed/Mountains.dds', new THREE.CubeReflectionMapping, function( cubemap ) { + + cubemap.magFilter = cubemap.minFilter = THREE.LinearFilter; + material1.needsUpdate = true; + + } ); + + var material1 = new THREE.MeshBasicMaterial( { map: map1, envMap: cubemap } ); var material2 = new THREE.MeshBasicMaterial( { map: map2 } ); var material3 = new THREE.MeshBasicMaterial( { map: map3, alphaTest: 0.5, side: THREE.DoubleSide } ); var material4 = new THREE.MeshBasicMaterial( { map: map4, side: THREE.DoubleSide, blending: THREE.AdditiveBlending, depthTest: false, transparent: true } ); - var mesh = new THREE.Mesh( geometry, material1 ); + var mesh = new THREE.Mesh( new THREE.TorusGeometry( 100, 50, 32, 16 ), material1 ); mesh.position.x = -200; mesh.position.y = -200; scene.add( mesh ); diff --git a/src/extras/ImageUtils.js b/src/extras/ImageUtils.js index 5312af18690c719bfc631fc33cc6a440a864d582..1faa60ff2ac97f8eb6fa35bb2838b25e2253220d 100644 --- a/src/extras/ImageUtils.js +++ b/src/extras/ImageUtils.js @@ -103,7 +103,7 @@ THREE.ImageUtils = { if ( images.loadCount === 6 ) { texture.needsUpdate = true; - if ( onLoad ) onLoad(); + if ( onLoad ) onLoad( texture ); } @@ -158,7 +158,7 @@ THREE.ImageUtils = { texture.format = dds.format; texture.needsUpdate = true; - if ( onLoad ) onLoad(); + if ( onLoad ) onLoad( texture ); } @@ -166,17 +166,68 @@ THREE.ImageUtils = { } - for ( var i = 0, il = array.length; i < il; ++ i ) { + // compressed cubemap textures as 6 separate DDS files - var cubeImage = {}; - images[ i ] = cubeImage; + if ( array instanceof Array ) { + + for ( var i = 0, il = array.length; i < il; ++ i ) { + + var cubeImage = {}; + images[ i ] = cubeImage; + + var request = new XMLHttpRequest(); + + request.onload = generateCubeFaceCallback( request, cubeImage ); + request.onerror = onError; + + var url = array[ i ]; + + request.open( 'GET', url, true ); + request.responseType = "arraybuffer"; + request.send( null ); + + } + + // compressed cubemap texture stored in a single DDS file + } else { + + var url = array; var request = new XMLHttpRequest(); - request.onload = generateCubeFaceCallback( request, cubeImage ); - request.onerror = onError; + request.onload = function( ) { + + var buffer = request.response; + var dds = THREE.ImageUtils.parseDDS( buffer, true ); + + if ( dds.isCubemap ) { + + var faces = dds.mipmaps.length / dds.mipmapCount; + + for ( var f = 0; f < faces; f ++ ) { + + images[ f ] = { mipmaps : [] }; + + for ( var i = 0; i < dds.mipmapCount; i ++ ) { + + images[ f ].mipmaps.push( dds.mipmaps[ f * dds.mipmapCount + i ] ); + images[ f ].format = dds.format; + images[ f ].width = dds.width; + images[ f ].height = dds.height; + + } - var url = array[ i ]; + } + + texture.format = dds.format; + texture.needsUpdate = true; + if ( onLoad ) onLoad( texture ); + + } + + } + + request.onerror = onError; request.open( 'GET', url, true ); request.responseType = "arraybuffer"; @@ -268,85 +319,103 @@ THREE.ImageUtils = { var off_pfFlags = 20; var off_pfFourCC = 21; + var off_caps = 27; + var off_caps2 = 28; + var off_caps3 = 29; + var off_caps4 = 30; + // Parse header var header = new Int32Array( buffer, 0, headerLengthInt ); - if ( header[ off_magic ] !== DDS_MAGIC ) { + if ( header[ off_magic ] !== DDS_MAGIC ) { - console.error( "ImageUtils.parseDDS(): Invalid magic number in DDS header" ); - return dds; + console.error( "ImageUtils.parseDDS(): Invalid magic number in DDS header" ); + return dds; - } + } - if ( ! header[ off_pfFlags ] & DDPF_FOURCC ) { + if ( ! header[ off_pfFlags ] & DDPF_FOURCC ) { - console.error( "ImageUtils.parseDDS(): Unsupported format, must contain a FourCC code" ); - return dds; + console.error( "ImageUtils.parseDDS(): Unsupported format, must contain a FourCC code" ); + return dds; - } + } var blockBytes; var fourCC = header[ off_pfFourCC ]; - switch ( fourCC ) { + switch ( fourCC ) { case FOURCC_DXT1: blockBytes = 8; - dds.format = THREE.RGB_S3TC_DXT1_Format; - break; + dds.format = THREE.RGB_S3TC_DXT1_Format; + break; - case FOURCC_DXT3: + case FOURCC_DXT3: - blockBytes = 16; - dds.format = THREE.RGBA_S3TC_DXT3_Format; - break; + blockBytes = 16; + dds.format = THREE.RGBA_S3TC_DXT3_Format; + break; - case FOURCC_DXT5: + case FOURCC_DXT5: - blockBytes = 16; - dds.format = THREE.RGBA_S3TC_DXT5_Format; - break; + blockBytes = 16; + dds.format = THREE.RGBA_S3TC_DXT5_Format; + break; - default: + default: - console.error( "ImageUtils.parseDDS(): Unsupported FourCC code: ", int32ToFourCC( fourCC ) ); - return dds; + console.error( "ImageUtils.parseDDS(): Unsupported FourCC code: ", int32ToFourCC( fourCC ) ); + return dds; - } + } dds.mipmapCount = 1; - if ( header[ off_flags ] & DDSD_MIPMAPCOUNT && loadMipmaps !== false ) { + if ( header[ off_flags ] & DDSD_MIPMAPCOUNT && loadMipmaps !== false ) { + + dds.mipmapCount = Math.max( 1, header[ off_mipmapCount ] ); + + } - dds.mipmapCount = Math.max( 1, header[ off_mipmapCount ] ); + //TODO: Verify that all faces of the cubemap are present with DDSCAPS2_CUBEMAP_POSITIVEX, etc. - } + dds.isCubemap = header[ off_caps2 ] & DDSCAPS2_CUBEMAP ? true : false; - dds.width = header[ off_width ]; - dds.height = header[ off_height ]; + dds.width = header[ off_width ]; + dds.height = header[ off_height ]; - var dataOffset = header[ off_size ] + 4; + var dataOffset = header[ off_size ] + 4; // Extract mipmaps buffers var width = dds.width; var height = dds.height; - for ( var i = 0; i < dds.mipmapCount; i ++ ) { + var faces = dds.isCubemap ? 6 : 1; - var dataLength = Math.max( 4, width ) / 4 * Math.max( 4, height ) / 4 * blockBytes; - var byteArray = new Uint8Array( buffer, dataOffset, dataLength ); + for ( var face = 0; face < faces; face ++ ) { - var mipmap = { "data": byteArray, "width": width, "height": height }; - dds.mipmaps.push( mipmap ); + for ( var i = 0; i < dds.mipmapCount; i ++ ) { - dataOffset += dataLength; + var dataLength = Math.max( 4, width ) / 4 * Math.max( 4, height ) / 4 * blockBytes; + var byteArray = new Uint8Array( buffer, dataOffset, dataLength ); + + var mipmap = { "data": byteArray, "width": width, "height": height }; + dds.mipmaps.push( mipmap ); + + dataOffset += dataLength; + + width = Math.max( width * 0.5, 1 ); + height = Math.max( height * 0.5, 1 ); + + } - width = Math.max( width * 0.5, 1 ); - height = Math.max( height * 0.5, 1 ); + width = dds.width; + height = dds.height; } diff --git a/src/extras/geometries/TubeGeometry.js b/src/extras/geometries/TubeGeometry.js index b3e5021b5181739146732845fbaf53fdbf477ffa..7df1adec3e47581670b5e5a8f7a9c20e2dae4624 100644 --- a/src/extras/geometries/TubeGeometry.js +++ b/src/extras/geometries/TubeGeometry.js @@ -44,7 +44,7 @@ THREE.TubeGeometry = function( path, segments, radius, radiusSegments, closed, d a, b, c, d, uva, uvb, uvc, uvd; - var frames = new THREE.TubeGeometry.FrenetFrames(path, segments, closed), + var frames = new THREE.TubeGeometry.FrenetFrames( this.path, this.segments, this.closed ), tangents = frames.tangents, normals = frames.normals, binormals = frames.binormals; @@ -107,7 +107,7 @@ THREE.TubeGeometry = function( path, segments, radius, radiusSegments, closed, d for ( j = 0; j < this.radiusSegments; j++ ) { - ip = ( closed ) ? (i + 1) % this.segments : i + 1; + ip = ( this.closed ) ? (i + 1) % this.segments : i + 1; jp = (j + 1) % this.radiusSegments; a = this.grid[ i ][ j ]; // *** NOT NECESSARILY PLANAR ! *** @@ -138,8 +138,7 @@ THREE.TubeGeometry.prototype = Object.create( THREE.Geometry.prototype ); // For computing of Frenet frames, exposing the tangents, normals and binormals the spline THREE.TubeGeometry.FrenetFrames = function(path, segments, closed) { - var - tangent = new THREE.Vector3(), + var tangent = new THREE.Vector3(), normal = new THREE.Vector3(), binormal = new THREE.Vector3(), diff --git a/src/renderers/WebGLRenderer.js b/src/renderers/WebGLRenderer.js index 1a574082de9ddb755b597fda27f0e11d685c3829..3484870f24dada29b99ea808d04062205ba2e3fc 100644 --- a/src/renderers/WebGLRenderer.js +++ b/src/renderers/WebGLRenderer.js @@ -355,10 +355,22 @@ THREE.WebGLRenderer = function ( parameters ) { this.deallocateTexture = function ( texture ) { - if ( ! texture.__webglInit ) return; + // cube texture - texture.__webglInit = false; - _gl.deleteTexture( texture.__webglTexture ); + if ( texture.image && texture.image.__webglTextureCube ) { + + _gl.deleteTexture( texture.image.__webglTextureCube ); + + // 2D texture + + } else { + + if ( ! texture.__webglInit ) return; + + texture.__webglInit = false; + _gl.deleteTexture( texture.__webglTexture ); + + } _this.info.memory.textures --; @@ -6690,6 +6702,8 @@ THREE.WebGLRenderer = function ( parameters ) { texture.image.__webglTextureCube = _gl.createTexture(); + _this.info.memory.textures ++; + } _gl.activeTexture( _gl.TEXTURE0 + slot ); @@ -6819,6 +6833,8 @@ THREE.WebGLRenderer = function ( parameters ) { renderTarget.__webglTexture = _gl.createTexture(); + _this.info.memory.textures ++; + // Setup texture, create render and frame buffers var isTargetPowerOfTwo = isPowerOfTwo( renderTarget.width ) && isPowerOfTwo( renderTarget.height ),