Browse Source

Added better random in GeometryUtils. Added possibility of using custom depth material for shadow maps.

alteredq 14 years ago
parent
commit
fd27811b7c
5 changed files with 122 additions and 99 deletions
  1. 18 18
      build/Three.js
  2. 5 5
      build/custom/ThreeExtras.js
  3. 70 70
      build/custom/ThreeWebGL.js
  4. 16 5
      src/extras/GeometryUtils.js
  5. 13 1
      src/renderers/WebGLRenderer.js

+ 18 - 18
build/Three.js

@@ -257,19 +257,19 @@ b.n32,b.n43-b.n33,b.n44-b.n34);ga[5].set(b.n41+b.n31,b.n42+b.n32,b.n43+b.n33,b.n
 g.count=0;for(e=f.materials.length;b<e;b++)c=f.materials[b],c.transparent?o(j,c):o(g,c)}function v(b){var e,c,f,g,j=b.object,h=b.buffer,k=b.opaque,m=b.transparent;m.count=0;b=k.count=0;for(f=j.materials.length;b<f;b++)if(e=j.materials[b],e instanceof THREE.MeshFaceMaterial){e=0;for(c=h.materials.length;e<c;e++)(g=h.materials[e])&&(g.transparent?o(m,g):o(k,g))}else(g=e)&&(g.transparent?o(m,g):o(k,g))}function u(b,e){return e.z-b.z}function w(b,c){var m,p,o,u=0,v,w,y,x,z=b.lights;ta||(ta=new THREE.Camera($.shadowCameraFov,
 c.aspect,$.shadowCameraNear,$.shadowCameraFar));m=0;for(p=z.length;m<p;m++)if(o=z[m],o instanceof THREE.SpotLight&&o.castShadow){$.shadowMap[u]||($.shadowMap[u]=new THREE.WebGLRenderTarget($.shadowMapWidth,$.shadowMapHeight,{minFilter:THREE.LinearFilter,magFilter:THREE.LinearFilter,format:THREE.RGBAFormat}));ua[u]||(ua[u]=new THREE.Matrix4);v=$.shadowMap[u];w=ua[u];ta.position.copy(o.position);ta.target.position.copy(o.target.position);ta.update(void 0,!0);b.update(void 0,!1,ta);w.set(0.5,0,0,0.5,
 0,0.5,0,0.5,0,0,0.5,0.5,0,0,0,1);w.multiplySelf(ta.projectionMatrix);w.multiplySelf(ta.matrixWorldInverse);ta.matrixWorldInverse.flattenToArray(xa);ta.projectionMatrix.flattenToArray(sa);ka.multiply(ta.projectionMatrix,ta.matrixWorldInverse);n(ka);$.initWebGLObjects(b);Q(v);k.clearColor(1,1,1,1);$.clear();k.clearColor(ja.r,ja.g,ja.b,qa);w=b.__webglObjects.length;o=b.__webglObjectsImmediate.length;for(v=0;v<w;v++)y=b.__webglObjects[v],x=y.object,x.visible&&x.castShadow?!(x instanceof THREE.Mesh)||
-t(x)?(x.matrixWorld.flattenToArray(x._objectMatrixArray),G(x,ta,!1),y.render=!0):y.render=!1:y.render=!1;g(!0);I(THREE.NormalBlending);for(v=0;v<w;v++)if(y=b.__webglObjects[v],y.render)x=y.object,buffer=y.buffer,j(x),y=x.geometry.morphTargets.length?ya:Da,f(ta,z,null,y,buffer,x);for(v=0;v<o;v++)y=b.__webglObjectsImmediate[v],x=y.object,x.visible&&x.castShadow&&(x.matrixAutoUpdate&&x.matrixWorld.flattenToArray(x._objectMatrixArray),G(x,ta,!1),j(x),program=e(ta,z,null,Da,x),x.render(function(b){h(b,
-program,Da.shading)}));u++}}function z(b){k.enable(k.POLYGON_OFFSET_FILL);k.polygonOffset(0.1,1);k.enable(k.STENCIL_TEST);k.enable(k.DEPTH_TEST);k.depthMask(!1);k.colorMask(!1,!1,!1,!1);k.stencilFunc(k.ALWAYS,1,255);k.stencilOpSeparate(k.BACK,k.KEEP,k.INCR,k.KEEP);k.stencilOpSeparate(k.FRONT,k.KEEP,k.DECR,k.KEEP);var e,c=b.lights.length,f,g=b.lights,j=[],h,m,p,n,t,o=b.__webglShadowVolumes.length;for(e=0;e<c;e++)if(f=b.lights[e],f instanceof THREE.DirectionalLight&&f.castShadow){j[0]=-f.position.x;
-j[1]=-f.position.y;j[2]=-f.position.z;for(t=0;t<o;t++)f=b.__webglShadowVolumes[t].object,h=b.__webglShadowVolumes[t].buffer,m=f.materials[0],m.program||$.initMaterial(m,g,void 0,f),m=m.program,p=m.uniforms,n=m.attributes,da!==m&&(k.useProgram(m),da=m,k.uniformMatrix4fv(p.projectionMatrix,!1,sa),k.uniformMatrix4fv(p.viewMatrix,!1,xa),k.uniform3fv(p.directionalLightDirection,j)),f.matrixWorld.flattenToArray(f._objectMatrixArray),k.uniformMatrix4fv(p.objectMatrix,!1,f._objectMatrixArray),k.bindBuffer(k.ARRAY_BUFFER,
-h.__webglVertexBuffer),k.vertexAttribPointer(n.position,3,k.FLOAT,!1,0,0),k.bindBuffer(k.ARRAY_BUFFER,h.__webglNormalBuffer),k.vertexAttribPointer(n.normal,3,k.FLOAT,!1,0,0),k.bindBuffer(k.ELEMENT_ARRAY_BUFFER,h.__webglFaceBuffer),k.cullFace(k.FRONT),k.drawElements(k.TRIANGLES,h.__webglFaceCount,k.UNSIGNED_SHORT,0),k.cullFace(k.BACK),k.drawElements(k.TRIANGLES,h.__webglFaceCount,k.UNSIGNED_SHORT,0)}k.disable(k.POLYGON_OFFSET_FILL);k.colorMask(!0,!0,!0,!0);k.stencilFunc(k.NOTEQUAL,0,255);k.stencilOp(k.KEEP,
-k.KEEP,k.KEEP);k.disable(k.DEPTH_TEST);fa=ea=-1;da=Y.program;k.useProgram(Y.program);k.uniformMatrix4fv(Y.projectionLocation,!1,sa);k.uniform1f(Y.darknessLocation,Y.darkness);k.bindBuffer(k.ARRAY_BUFFER,Y.vertexBuffer);k.vertexAttribPointer(Y.vertexLocation,3,k.FLOAT,!1,0,0);k.enableVertexAttribArray(Y.vertexLocation);k.blendFunc(k.ONE,k.ONE_MINUS_SRC_ALPHA);k.blendEquation(k.FUNC_ADD);k.bindBuffer(k.ELEMENT_ARRAY_BUFFER,Y.elementBuffer);k.drawElements(k.TRIANGLES,6,k.UNSIGNED_SHORT,0);k.disable(k.STENCIL_TEST);
-k.enable(k.DEPTH_TEST);k.depthMask(aa)}function x(b,e){var c,f,g;c=U.attributes;var j=U.uniforms,h=V/J,m,p=[],n=J*0.5,t=V*0.5,o=!0;k.useProgram(U.program);da=U.program;fa=ea=-1;za||(k.enableVertexAttribArray(U.attributes.position),k.enableVertexAttribArray(U.attributes.uv),za=!0);k.disable(k.CULL_FACE);k.enable(k.BLEND);k.depthMask(!0);k.bindBuffer(k.ARRAY_BUFFER,U.vertexBuffer);k.vertexAttribPointer(c.position,2,k.FLOAT,!1,16,0);k.vertexAttribPointer(c.uv,2,k.FLOAT,!1,16,8);k.bindBuffer(k.ELEMENT_ARRAY_BUFFER,
-U.elementBuffer);k.uniformMatrix4fv(j.projectionMatrix,!1,sa);k.activeTexture(k.TEXTURE0);k.uniform1i(j.map,0);c=0;for(f=b.__webglSprites.length;c<f;c++)g=b.__webglSprites[c],g.useScreenCoordinates?g.z=-g.position.z:(g._modelViewMatrix.multiplyToArray(e.matrixWorldInverse,g.matrixWorld,g._modelViewMatrixArray),g.z=-g._modelViewMatrix.n34);b.__webglSprites.sort(u);c=0;for(f=b.__webglSprites.length;c<f;c++)g=b.__webglSprites[c],g.material===void 0&&g.map&&g.map.image&&g.map.image.width&&(g.useScreenCoordinates?
-(k.uniform1i(j.useScreenCoordinates,1),k.uniform3f(j.screenPosition,(g.position.x-n)/n,(t-g.position.y)/t,Math.max(0,Math.min(1,g.position.z)))):(k.uniform1i(j.useScreenCoordinates,0),k.uniform1i(j.affectedByDistance,g.affectedByDistance?1:0),k.uniformMatrix4fv(j.modelViewMatrix,!1,g._modelViewMatrixArray)),m=g.map.image.width/(g.scaleByViewport?V:1),p[0]=m*h*g.scale.x,p[1]=m*g.scale.y,k.uniform2f(j.uvScale,g.uvScale.x,g.uvScale.y),k.uniform2f(j.uvOffset,g.uvOffset.x,g.uvOffset.y),k.uniform2f(j.alignment,
-g.alignment.x,g.alignment.y),k.uniform1f(j.opacity,g.opacity),k.uniform1f(j.rotation,g.rotation),k.uniform2fv(j.scale,p),g.mergeWith3D&&!o?(k.enable(k.DEPTH_TEST),o=!0):!g.mergeWith3D&&o&&(k.disable(k.DEPTH_TEST),o=!1),I(g.blending),P(g.map,0),k.drawElements(k.TRIANGLES,6,k.UNSIGNED_SHORT,0));k.enable(k.CULL_FACE);k.enable(k.DEPTH_TEST);k.depthMask(aa)}function y(b,e){var c,f,g=b.__webglLensFlares.length,j,h,m,p=new THREE.Vector3,n=V/J,t=J*0.5,o=V*0.5,u=16/V,v=[u*n,u],w=[1,1,0],y=[1,1],x=T.uniforms;
-c=T.attributes;k.useProgram(T.program);da=T.program;fa=ea=-1;va||(k.enableVertexAttribArray(T.attributes.vertex),k.enableVertexAttribArray(T.attributes.uv),va=!0);k.uniform1i(x.occlusionMap,0);k.uniform1i(x.map,1);k.bindBuffer(k.ARRAY_BUFFER,T.vertexBuffer);k.vertexAttribPointer(c.vertex,2,k.FLOAT,!1,16,0);k.vertexAttribPointer(c.uv,2,k.FLOAT,!1,16,8);k.bindBuffer(k.ELEMENT_ARRAY_BUFFER,T.elementBuffer);k.disable(k.CULL_FACE);k.depthMask(!1);k.activeTexture(k.TEXTURE0);k.bindTexture(k.TEXTURE_2D,
-T.occlusionTexture);k.activeTexture(k.TEXTURE1);for(f=0;f<g;f++)if(c=b.__webglLensFlares[f].object,p.set(c.matrixWorld.n14,c.matrixWorld.n24,c.matrixWorld.n34),e.matrixWorldInverse.multiplyVector3(p),e.projectionMatrix.multiplyVector3(p),w[0]=p.x,w[1]=p.y,w[2]=p.z,y[0]=w[0]*t+t,y[1]=w[1]*o+o,T.hasVertexTexture||y[0]>0&&y[0]<J&&y[1]>0&&y[1]<V){k.bindTexture(k.TEXTURE_2D,T.tempTexture);k.copyTexImage2D(k.TEXTURE_2D,0,k.RGB,y[0]-8,y[1]-8,16,16,0);k.uniform1i(x.renderType,0);k.uniform2fv(x.scale,v);k.uniform3fv(x.screenPosition,
-w);k.disable(k.BLEND);k.enable(k.DEPTH_TEST);k.drawElements(k.TRIANGLES,6,k.UNSIGNED_SHORT,0);k.bindTexture(k.TEXTURE_2D,T.occlusionTexture);k.copyTexImage2D(k.TEXTURE_2D,0,k.RGBA,y[0]-8,y[1]-8,16,16,0);k.uniform1i(x.renderType,1);k.disable(k.DEPTH_TEST);k.bindTexture(k.TEXTURE_2D,T.tempTexture);k.drawElements(k.TRIANGLES,6,k.UNSIGNED_SHORT,0);c.positionScreen.x=w[0];c.positionScreen.y=w[1];c.positionScreen.z=w[2];c.customUpdateCallback?c.customUpdateCallback(c):c.updateLensFlares();k.uniform1i(x.renderType,
-2);k.enable(k.BLEND);j=0;for(h=c.lensFlares.length;j<h;j++)if(m=c.lensFlares[j],m.opacity>0.0010&&m.scale>0.0010)w[0]=m.x,w[1]=m.y,w[2]=m.z,u=m.size*m.scale/V,v[0]=u*n,v[1]=u,k.uniform3fv(x.screenPosition,w),k.uniform2fv(x.scale,v),k.uniform1f(x.rotation,m.rotation),k.uniform1f(x.opacity,m.opacity),I(m.blending),P(m.texture,1),k.drawElements(k.TRIANGLES,6,k.UNSIGNED_SHORT,0)}k.enable(k.CULL_FACE);k.enable(k.DEPTH_TEST);k.depthMask(aa)}function G(b,e,c){b._modelViewMatrix.multiplyToArray(e.matrixWorldInverse,
+t(x)?(x.matrixWorld.flattenToArray(x._objectMatrixArray),G(x,ta,!1),y.render=!0):y.render=!1:y.render=!1;g(!0);I(THREE.NormalBlending);for(v=0;v<w;v++)if(y=b.__webglObjects[v],y.render)x=y.object,buffer=y.buffer,j(x),y=x.customDepthMaterial?x.customDepthMaterial:x.geometry.morphTargets.length?ya:Da,f(ta,z,null,y,buffer,x);for(v=0;v<o;v++)y=b.__webglObjectsImmediate[v],x=y.object,x.visible&&x.castShadow&&(x.matrixAutoUpdate&&x.matrixWorld.flattenToArray(x._objectMatrixArray),G(x,ta,!1),j(x),program=
+e(ta,z,null,Da,x),x.render(function(b){h(b,program,Da.shading)}));u++}}function z(b){k.enable(k.POLYGON_OFFSET_FILL);k.polygonOffset(0.1,1);k.enable(k.STENCIL_TEST);k.enable(k.DEPTH_TEST);k.depthMask(!1);k.colorMask(!1,!1,!1,!1);k.stencilFunc(k.ALWAYS,1,255);k.stencilOpSeparate(k.BACK,k.KEEP,k.INCR,k.KEEP);k.stencilOpSeparate(k.FRONT,k.KEEP,k.DECR,k.KEEP);var e,c=b.lights.length,f,g=b.lights,j=[],h,m,p,n,t,o=b.__webglShadowVolumes.length;for(e=0;e<c;e++)if(f=b.lights[e],f instanceof THREE.DirectionalLight&&
+f.castShadow){j[0]=-f.position.x;j[1]=-f.position.y;j[2]=-f.position.z;for(t=0;t<o;t++)f=b.__webglShadowVolumes[t].object,h=b.__webglShadowVolumes[t].buffer,m=f.materials[0],m.program||$.initMaterial(m,g,void 0,f),m=m.program,p=m.uniforms,n=m.attributes,da!==m&&(k.useProgram(m),da=m,k.uniformMatrix4fv(p.projectionMatrix,!1,sa),k.uniformMatrix4fv(p.viewMatrix,!1,xa),k.uniform3fv(p.directionalLightDirection,j)),f.matrixWorld.flattenToArray(f._objectMatrixArray),k.uniformMatrix4fv(p.objectMatrix,!1,
+f._objectMatrixArray),k.bindBuffer(k.ARRAY_BUFFER,h.__webglVertexBuffer),k.vertexAttribPointer(n.position,3,k.FLOAT,!1,0,0),k.bindBuffer(k.ARRAY_BUFFER,h.__webglNormalBuffer),k.vertexAttribPointer(n.normal,3,k.FLOAT,!1,0,0),k.bindBuffer(k.ELEMENT_ARRAY_BUFFER,h.__webglFaceBuffer),k.cullFace(k.FRONT),k.drawElements(k.TRIANGLES,h.__webglFaceCount,k.UNSIGNED_SHORT,0),k.cullFace(k.BACK),k.drawElements(k.TRIANGLES,h.__webglFaceCount,k.UNSIGNED_SHORT,0)}k.disable(k.POLYGON_OFFSET_FILL);k.colorMask(!0,!0,
+!0,!0);k.stencilFunc(k.NOTEQUAL,0,255);k.stencilOp(k.KEEP,k.KEEP,k.KEEP);k.disable(k.DEPTH_TEST);fa=ea=-1;da=Y.program;k.useProgram(Y.program);k.uniformMatrix4fv(Y.projectionLocation,!1,sa);k.uniform1f(Y.darknessLocation,Y.darkness);k.bindBuffer(k.ARRAY_BUFFER,Y.vertexBuffer);k.vertexAttribPointer(Y.vertexLocation,3,k.FLOAT,!1,0,0);k.enableVertexAttribArray(Y.vertexLocation);k.blendFunc(k.ONE,k.ONE_MINUS_SRC_ALPHA);k.blendEquation(k.FUNC_ADD);k.bindBuffer(k.ELEMENT_ARRAY_BUFFER,Y.elementBuffer);k.drawElements(k.TRIANGLES,
+6,k.UNSIGNED_SHORT,0);k.disable(k.STENCIL_TEST);k.enable(k.DEPTH_TEST);k.depthMask(aa)}function x(b,e){var c,f,g;c=U.attributes;var j=U.uniforms,h=V/J,m,p=[],n=J*0.5,t=V*0.5,o=!0;k.useProgram(U.program);da=U.program;fa=ea=-1;za||(k.enableVertexAttribArray(U.attributes.position),k.enableVertexAttribArray(U.attributes.uv),za=!0);k.disable(k.CULL_FACE);k.enable(k.BLEND);k.depthMask(!0);k.bindBuffer(k.ARRAY_BUFFER,U.vertexBuffer);k.vertexAttribPointer(c.position,2,k.FLOAT,!1,16,0);k.vertexAttribPointer(c.uv,
+2,k.FLOAT,!1,16,8);k.bindBuffer(k.ELEMENT_ARRAY_BUFFER,U.elementBuffer);k.uniformMatrix4fv(j.projectionMatrix,!1,sa);k.activeTexture(k.TEXTURE0);k.uniform1i(j.map,0);c=0;for(f=b.__webglSprites.length;c<f;c++)g=b.__webglSprites[c],g.useScreenCoordinates?g.z=-g.position.z:(g._modelViewMatrix.multiplyToArray(e.matrixWorldInverse,g.matrixWorld,g._modelViewMatrixArray),g.z=-g._modelViewMatrix.n34);b.__webglSprites.sort(u);c=0;for(f=b.__webglSprites.length;c<f;c++)g=b.__webglSprites[c],g.material===void 0&&
+g.map&&g.map.image&&g.map.image.width&&(g.useScreenCoordinates?(k.uniform1i(j.useScreenCoordinates,1),k.uniform3f(j.screenPosition,(g.position.x-n)/n,(t-g.position.y)/t,Math.max(0,Math.min(1,g.position.z)))):(k.uniform1i(j.useScreenCoordinates,0),k.uniform1i(j.affectedByDistance,g.affectedByDistance?1:0),k.uniformMatrix4fv(j.modelViewMatrix,!1,g._modelViewMatrixArray)),m=g.map.image.width/(g.scaleByViewport?V:1),p[0]=m*h*g.scale.x,p[1]=m*g.scale.y,k.uniform2f(j.uvScale,g.uvScale.x,g.uvScale.y),k.uniform2f(j.uvOffset,
+g.uvOffset.x,g.uvOffset.y),k.uniform2f(j.alignment,g.alignment.x,g.alignment.y),k.uniform1f(j.opacity,g.opacity),k.uniform1f(j.rotation,g.rotation),k.uniform2fv(j.scale,p),g.mergeWith3D&&!o?(k.enable(k.DEPTH_TEST),o=!0):!g.mergeWith3D&&o&&(k.disable(k.DEPTH_TEST),o=!1),I(g.blending),P(g.map,0),k.drawElements(k.TRIANGLES,6,k.UNSIGNED_SHORT,0));k.enable(k.CULL_FACE);k.enable(k.DEPTH_TEST);k.depthMask(aa)}function y(b,e){var c,f,g=b.__webglLensFlares.length,j,h,m,p=new THREE.Vector3,n=V/J,t=J*0.5,o=
+V*0.5,u=16/V,v=[u*n,u],w=[1,1,0],y=[1,1],x=T.uniforms;c=T.attributes;k.useProgram(T.program);da=T.program;fa=ea=-1;va||(k.enableVertexAttribArray(T.attributes.vertex),k.enableVertexAttribArray(T.attributes.uv),va=!0);k.uniform1i(x.occlusionMap,0);k.uniform1i(x.map,1);k.bindBuffer(k.ARRAY_BUFFER,T.vertexBuffer);k.vertexAttribPointer(c.vertex,2,k.FLOAT,!1,16,0);k.vertexAttribPointer(c.uv,2,k.FLOAT,!1,16,8);k.bindBuffer(k.ELEMENT_ARRAY_BUFFER,T.elementBuffer);k.disable(k.CULL_FACE);k.depthMask(!1);k.activeTexture(k.TEXTURE0);
+k.bindTexture(k.TEXTURE_2D,T.occlusionTexture);k.activeTexture(k.TEXTURE1);for(f=0;f<g;f++)if(c=b.__webglLensFlares[f].object,p.set(c.matrixWorld.n14,c.matrixWorld.n24,c.matrixWorld.n34),e.matrixWorldInverse.multiplyVector3(p),e.projectionMatrix.multiplyVector3(p),w[0]=p.x,w[1]=p.y,w[2]=p.z,y[0]=w[0]*t+t,y[1]=w[1]*o+o,T.hasVertexTexture||y[0]>0&&y[0]<J&&y[1]>0&&y[1]<V){k.bindTexture(k.TEXTURE_2D,T.tempTexture);k.copyTexImage2D(k.TEXTURE_2D,0,k.RGB,y[0]-8,y[1]-8,16,16,0);k.uniform1i(x.renderType,0);
+k.uniform2fv(x.scale,v);k.uniform3fv(x.screenPosition,w);k.disable(k.BLEND);k.enable(k.DEPTH_TEST);k.drawElements(k.TRIANGLES,6,k.UNSIGNED_SHORT,0);k.bindTexture(k.TEXTURE_2D,T.occlusionTexture);k.copyTexImage2D(k.TEXTURE_2D,0,k.RGBA,y[0]-8,y[1]-8,16,16,0);k.uniform1i(x.renderType,1);k.disable(k.DEPTH_TEST);k.bindTexture(k.TEXTURE_2D,T.tempTexture);k.drawElements(k.TRIANGLES,6,k.UNSIGNED_SHORT,0);c.positionScreen.x=w[0];c.positionScreen.y=w[1];c.positionScreen.z=w[2];c.customUpdateCallback?c.customUpdateCallback(c):
+c.updateLensFlares();k.uniform1i(x.renderType,2);k.enable(k.BLEND);j=0;for(h=c.lensFlares.length;j<h;j++)if(m=c.lensFlares[j],m.opacity>0.0010&&m.scale>0.0010)w[0]=m.x,w[1]=m.y,w[2]=m.z,u=m.size*m.scale/V,v[0]=u*n,v[1]=u,k.uniform3fv(x.screenPosition,w),k.uniform2fv(x.scale,v),k.uniform1f(x.rotation,m.rotation),k.uniform1f(x.opacity,m.opacity),I(m.blending),P(m.texture,1),k.drawElements(k.TRIANGLES,6,k.UNSIGNED_SHORT,0)}k.enable(k.CULL_FACE);k.enable(k.DEPTH_TEST);k.depthMask(aa)}function G(b,e,c){b._modelViewMatrix.multiplyToArray(e.matrixWorldInverse,
 b.matrixWorld,b._modelViewMatrixArray);c&&THREE.Matrix4.makeInvert3x3(b._modelViewMatrix).transposeIntoArray(b._normalMatrixArray)}function B(b){var e,c,f,g;g=b.__materials;b=0;for(c=g.length;b<c;b++)if(f=g[b],f.attributes)for(e in f.attributes)if(f.attributes[e].needsUpdate)return!0;return!1}function L(b){var e,c,f,g;g=b.__materials;b=0;for(c=g.length;b<c;b++)if(f=g[b],f.attributes)for(e in f.attributes)f.attributes[e].needsUpdate=!1}function F(b){var e,f,g,j;if(b instanceof THREE.Mesh){f=b.geometry;
 for(e in f.geometryGroups)if(g=f.geometryGroups[e],j=B(g),f.__dirtyVertices||f.__dirtyMorphTargets||f.__dirtyElements||f.__dirtyUvs||f.__dirtyNormals||f.__dirtyColors||f.__dirtyTangents||j){j=g;var h=b,m=k.DYNAMIC_DRAW;if(j.__inittedArrays){var p=void 0,n=void 0,t=void 0,o=void 0,u=t=void 0,v=void 0,w=void 0,y=void 0,x=void 0,z=void 0,G=void 0,F=void 0,H=void 0,J=void 0,D=void 0,I=void 0,V=void 0,C=o=y=o=w=v=void 0,A=void 0,E=A=C=v=void 0,M=void 0,P=E=A=C=t=t=u=y=o=E=A=C=M=E=A=C=M=E=A=C=void 0,K=
 0,ga=0,aa=0,X=0,Q=0,T=0,O=0,U=0,ka=0,N=0,R=0,E=C=0,E=void 0,S=j.__vertexArray,$=j.__uvArray,da=j.__uv2Array,la=j.__normalArray,W=j.__tangentArray,Z=j.__colorArray,Y=j.__skinVertexAArray,ea=j.__skinVertexBArray,ca=j.__skinIndexArray,fa=j.__skinWeightArray,na=j.__morphTargetsArrays,ha=j.__webglCustomAttributes,A=void 0,ia=j.__faceArray,sa=j.__lineArray,oa=j.__needsSmoothNormals,z=j.__vertexColorType,x=j.__uvType,G=j.__normalType,ja=h.geometry,qa=ja.__dirtyVertices,ra=ja.__dirtyElements,xa=ja.__dirtyUvs,
@@ -362,11 +362,11 @@ clamp:function(b,c,e){return b<c?c:b>e?e:b}};THREE.ColorUtils.__hsv={h:0,s:0,v:0
 THREE.GeometryUtils={merge:function(b,c){var e=c instanceof THREE.Mesh,f=b.vertices.length,h=e?c.geometry:c,j=b.vertices,g=h.vertices,m=b.faces,n=h.faces,t=b.faceVertexUvs[0],h=h.faceVertexUvs[0];e&&c.matrixAutoUpdate&&c.updateMatrix();for(var o=0,p=g.length;o<p;o++){var v=new THREE.Vertex(g[o].position.clone());e&&c.matrix.multiplyVector3(v.position);j.push(v)}o=0;for(p=n.length;o<p;o++){var g=n[o],u,w,z=g.vertexNormals,v=g.vertexColors;g instanceof THREE.Face3?u=new THREE.Face3(g.a+f,g.b+f,g.c+
 f):g instanceof THREE.Face4&&(u=new THREE.Face4(g.a+f,g.b+f,g.c+f,g.d+f));u.normal.copy(g.normal);e=0;for(j=z.length;e<j;e++)w=z[e],u.vertexNormals.push(w.clone());u.color.copy(g.color);e=0;for(j=v.length;e<j;e++)w=v[e],u.vertexColors.push(w.clone());u.materials=g.materials.slice();u.centroid.copy(g.centroid);m.push(u)}o=0;for(p=h.length;o<p;o++){f=h[o];m=[];e=0;for(j=f.length;e<j;e++)m.push(new THREE.UV(f[e].u,f[e].v));t.push(m)}},clone:function(b){var c=new THREE.Geometry,e,f=b.vertices,h=b.faces,
 j=b.faceVertexUvs[0],b=0;for(e=f.length;b<e;b++){var g=new THREE.Vertex(f[b].position.clone());c.vertices.push(g)}b=0;for(e=h.length;b<e;b++){var m=h[b],n,t,o=m.vertexNormals,p=m.vertexColors;m instanceof THREE.Face3?n=new THREE.Face3(m.a,m.b,m.c):m instanceof THREE.Face4&&(n=new THREE.Face4(m.a,m.b,m.c,m.d));n.normal.copy(m.normal);f=0;for(g=o.length;f<g;f++)t=o[f],n.vertexNormals.push(t.clone());n.color.copy(m.color);f=0;for(g=p.length;f<g;f++)t=p[f],n.vertexColors.push(t.clone());n.materials=m.materials.slice();
-n.centroid.copy(m.centroid);c.faces.push(n)}b=0;for(e=j.length;b<e;b++){h=j[b];n=[];f=0;for(g=h.length;f<g;f++)n.push(new THREE.UV(h[f].u,h[f].v));c.faceVertexUvs[0].push(n)}return c},randomPointInTriangle:function(b,c,e){var f,h,j,g=new THREE.Vector3,m=THREE.GeometryUtils.__v1;f=Math.random();h=Math.random();f+h>1&&(f=1-f,h=1-h);j=1-f-h;g.copy(b);g.multiplyScalar(f);m.copy(c);m.multiplyScalar(h);g.addSelf(m);m.copy(e);m.multiplyScalar(j);g.addSelf(m);return g},randomPointInFace:function(b,c,e){var f,
-h,j;if(b instanceof THREE.Face3)return f=c.vertices[b.a].position,h=c.vertices[b.b].position,j=c.vertices[b.c].position,THREE.GeometryUtils.randomPointInTriangle(f,h,j);else if(b instanceof THREE.Face4){f=c.vertices[b.a].position;h=c.vertices[b.b].position;j=c.vertices[b.c].position;var c=c.vertices[b.d].position,g;e?b._area1&&b._area2?(e=b._area1,g=b._area2):(e=THREE.GeometryUtils.triangleArea(f,h,c),g=THREE.GeometryUtils.triangleArea(h,j,c),b._area1=e,b._area2=g):(e=THREE.GeometryUtils.triangleArea(f,
-h,c),g=THREE.GeometryUtils.triangleArea(h,j,c));return Math.random()*(e+g)<e?THREE.GeometryUtils.randomPointInTriangle(f,h,c):THREE.GeometryUtils.randomPointInTriangle(h,j,c)}},randomPointsInGeometry:function(b,c){function e(b){function c(e,f){if(f<e)return e;var g=e+Math.floor((f-e)/2);return t[g]>b?c(e,g-1):t[g]<b?c(g+1,f):g}return c(0,t.length-1)}var f,h,j=b.faces,g=b.vertices,m=j.length,n=0,t=[],o,p,v,u;for(h=0;h<m;h++){f=j[h];if(f instanceof THREE.Face3)o=g[f.a].position,p=g[f.b].position,v=
-g[f.c].position,f._area=THREE.GeometryUtils.triangleArea(o,p,v);else if(f instanceof THREE.Face4)o=g[f.a].position,p=g[f.b].position,v=g[f.c].position,u=g[f.d].position,f._area1=THREE.GeometryUtils.triangleArea(o,p,u),f._area2=THREE.GeometryUtils.triangleArea(p,v,u),f._area=f._area1+f._area2;n+=f._area;t[h]=n}f=[];g={};for(h=0;h<c;h++)m=Math.random()*n,m=e(m),f[h]=THREE.GeometryUtils.randomPointInFace(j[m],b,!0),g[m]?g[m]+=1:g[m]=1;return f},triangleArea:function(b,c,e){var f,h=THREE.GeometryUtils.__v1;
-h.sub(b,c);f=h.length();h.sub(b,e);b=h.length();h.sub(c,e);e=h.length();c=0.5*(f+b+e);return Math.sqrt(c*(c-f)*(c-b)*(c-e))}};THREE.GeometryUtils.__v1=new THREE.Vector3;
+n.centroid.copy(m.centroid);c.faces.push(n)}b=0;for(e=j.length;b<e;b++){h=j[b];n=[];f=0;for(g=h.length;f<g;f++)n.push(new THREE.UV(h[f].u,h[f].v));c.faceVertexUvs[0].push(n)}return c},randomPointInTriangle:function(b,c,e){var f,h,j,g=new THREE.Vector3,m=THREE.GeometryUtils.__v1;f=THREE.GeometryUtils.random();h=THREE.GeometryUtils.random();f+h>1&&(f=1-f,h=1-h);j=1-f-h;g.copy(b);g.multiplyScalar(f);m.copy(c);m.multiplyScalar(h);g.addSelf(m);m.copy(e);m.multiplyScalar(j);g.addSelf(m);return g},randomPointInFace:function(b,
+c,e){var f,h,j;if(b instanceof THREE.Face3)return f=c.vertices[b.a].position,h=c.vertices[b.b].position,j=c.vertices[b.c].position,THREE.GeometryUtils.randomPointInTriangle(f,h,j);else if(b instanceof THREE.Face4){f=c.vertices[b.a].position;h=c.vertices[b.b].position;j=c.vertices[b.c].position;var c=c.vertices[b.d].position,g;e?b._area1&&b._area2?(e=b._area1,g=b._area2):(e=THREE.GeometryUtils.triangleArea(f,h,c),g=THREE.GeometryUtils.triangleArea(h,j,c),b._area1=e,b._area2=g):(e=THREE.GeometryUtils.triangleArea(f,
+h,c),g=THREE.GeometryUtils.triangleArea(h,j,c));return THREE.GeometryUtils.random()*(e+g)<e?THREE.GeometryUtils.randomPointInTriangle(f,h,c):THREE.GeometryUtils.randomPointInTriangle(h,j,c)}},randomPointsInGeometry:function(b,c){function e(b){function c(e,f){if(f<e)return e;var g=e+Math.floor((f-e)/2);return t[g]>b?c(e,g-1):t[g]<b?c(g+1,f):g}return c(0,t.length-1)}var f,h,j=b.faces,g=b.vertices,m=j.length,n=0,t=[],o,p,v,u;for(h=0;h<m;h++){f=j[h];if(f instanceof THREE.Face3)o=g[f.a].position,p=g[f.b].position,
+v=g[f.c].position,f._area=THREE.GeometryUtils.triangleArea(o,p,v);else if(f instanceof THREE.Face4)o=g[f.a].position,p=g[f.b].position,v=g[f.c].position,u=g[f.d].position,f._area1=THREE.GeometryUtils.triangleArea(o,p,u),f._area2=THREE.GeometryUtils.triangleArea(p,v,u),f._area=f._area1+f._area2;n+=f._area;t[h]=n}f=[];g={};for(h=0;h<c;h++)m=THREE.GeometryUtils.random()*n,m=e(m),f[h]=THREE.GeometryUtils.randomPointInFace(j[m],b,!0),g[m]?g[m]+=1:g[m]=1;return f},triangleArea:function(b,c,e){var f,h=THREE.GeometryUtils.__v1;
+h.sub(b,c);f=h.length();h.sub(b,e);b=h.length();h.sub(c,e);e=h.length();c=0.5*(f+b+e);return Math.sqrt(c*(c-f)*(c-b)*(c-e))},random16:function(){return(65280*Math.random()+255*Math.random())/65535}};THREE.GeometryUtils.random=THREE.GeometryUtils.random16;THREE.GeometryUtils.__v1=new THREE.Vector3;
 THREE.ImageUtils={loadTexture:function(b,c,e){var f=new Image,h=new THREE.Texture(f,c);f.onload=function(){h.needsUpdate=!0;e&&e(this)};f.crossOrigin="";f.src=b;return h},loadTextureCube:function(b,c,e){var f,h=[],j=new THREE.Texture(h,c),c=h.loadCount=0;for(f=b.length;c<f;++c)h[c]=new Image,h[c].onload=function(){h.loadCount+=1;if(h.loadCount==6)j.needsUpdate=!0;e&&e(this)},h[c].crossOrigin="",h[c].src=b[c];return j}};
 THREE.SceneUtils={showHierarchy:function(b,c){THREE.SceneUtils.traverseHierarchy(b,function(b){b.visible=c})},traverseHierarchy:function(b,c){var e,f,h=b.children.length;for(f=0;f<h;f++)e=b.children[f],c(e),THREE.SceneUtils.traverseHierarchy(e,c)}};
 if(THREE.WebGLRenderer)THREE.ShaderUtils={lib:{fresnel:{uniforms:{mRefractionRatio:{type:"f",value:1.02},mFresnelBias:{type:"f",value:0.1},mFresnelPower:{type:"f",value:2},mFresnelScale:{type:"f",value:1},tCube:{type:"t",value:1,texture:null}},fragmentShader:"uniform samplerCube tCube;\nvarying vec3 vReflect;\nvarying vec3 vRefract[3];\nvarying float vReflectionFactor;\nvoid main() {\nvec4 reflectedColor = textureCube( tCube, vec3( -vReflect.x, vReflect.yz ) );\nvec4 refractedColor = vec4( 1.0, 1.0, 1.0, 1.0 );\nrefractedColor.r = textureCube( tCube, vec3( -vRefract[0].x, vRefract[0].yz ) ).r;\nrefractedColor.g = textureCube( tCube, vec3( -vRefract[1].x, vRefract[1].yz ) ).g;\nrefractedColor.b = textureCube( tCube, vec3( -vRefract[2].x, vRefract[2].yz ) ).b;\nrefractedColor.a = 1.0;\ngl_FragColor = mix( refractedColor, reflectedColor, clamp( vReflectionFactor, 0.0, 1.0 ) );\n}",vertexShader:"uniform float mRefractionRatio;\nuniform float mFresnelBias;\nuniform float mFresnelScale;\nuniform float mFresnelPower;\nvarying vec3 vReflect;\nvarying vec3 vRefract[3];\nvarying float vReflectionFactor;\nvoid main() {\nvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\nvec4 mPosition = objectMatrix * vec4( position, 1.0 );\nvec3 nWorld = normalize ( mat3( objectMatrix[0].xyz, objectMatrix[1].xyz, objectMatrix[2].xyz ) * normal );\nvec3 I = mPosition.xyz - cameraPosition;\nvReflect = reflect( I, nWorld );\nvRefract[0] = refract( normalize( I ), nWorld, mRefractionRatio );\nvRefract[1] = refract( normalize( I ), nWorld, mRefractionRatio * 0.99 );\nvRefract[2] = refract( normalize( I ), nWorld, mRefractionRatio * 0.98 );\nvReflectionFactor = mFresnelBias + mFresnelScale * pow( 1.0 + dot( normalize( I ), nWorld ), mFresnelPower );\ngl_Position = projectionMatrix * mvPosition;\n}"},

+ 5 - 5
build/custom/ThreeExtras.js

@@ -4,11 +4,11 @@ clamp:function(a,b,c){return a<b?b:a>c?c:a}};THREE.ColorUtils.__hsv={h:0,s:0,v:0
 THREE.GeometryUtils={merge:function(a,b){var c=b instanceof THREE.Mesh,e=a.vertices.length,f=c?b.geometry:b,h=a.vertices,g=f.vertices,j=a.faces,k=f.faces,l=a.faceVertexUvs[0],f=f.faceVertexUvs[0];c&&b.matrixAutoUpdate&&b.updateMatrix();for(var m=0,n=g.length;m<n;m++){var o=new THREE.Vertex(g[m].position.clone());c&&b.matrix.multiplyVector3(o.position);h.push(o)}m=0;for(n=k.length;m<n;m++){var g=k[m],t,u,w=g.vertexNormals,o=g.vertexColors;g instanceof THREE.Face3?t=new THREE.Face3(g.a+e,g.b+e,g.c+
 e):g instanceof THREE.Face4&&(t=new THREE.Face4(g.a+e,g.b+e,g.c+e,g.d+e));t.normal.copy(g.normal);c=0;for(h=w.length;c<h;c++)u=w[c],t.vertexNormals.push(u.clone());t.color.copy(g.color);c=0;for(h=o.length;c<h;c++)u=o[c],t.vertexColors.push(u.clone());t.materials=g.materials.slice();t.centroid.copy(g.centroid);j.push(t)}m=0;for(n=f.length;m<n;m++){e=f[m];j=[];c=0;for(h=e.length;c<h;c++)j.push(new THREE.UV(e[c].u,e[c].v));l.push(j)}},clone:function(a){var b=new THREE.Geometry,c,e=a.vertices,f=a.faces,
 h=a.faceVertexUvs[0],a=0;for(c=e.length;a<c;a++){var g=new THREE.Vertex(e[a].position.clone());b.vertices.push(g)}a=0;for(c=f.length;a<c;a++){var j=f[a],k,l,m=j.vertexNormals,n=j.vertexColors;j instanceof THREE.Face3?k=new THREE.Face3(j.a,j.b,j.c):j instanceof THREE.Face4&&(k=new THREE.Face4(j.a,j.b,j.c,j.d));k.normal.copy(j.normal);e=0;for(g=m.length;e<g;e++)l=m[e],k.vertexNormals.push(l.clone());k.color.copy(j.color);e=0;for(g=n.length;e<g;e++)l=n[e],k.vertexColors.push(l.clone());k.materials=j.materials.slice();
-k.centroid.copy(j.centroid);b.faces.push(k)}a=0;for(c=h.length;a<c;a++){f=h[a];k=[];e=0;for(g=f.length;e<g;e++)k.push(new THREE.UV(f[e].u,f[e].v));b.faceVertexUvs[0].push(k)}return b},randomPointInTriangle:function(a,b,c){var e,f,h,g=new THREE.Vector3,j=THREE.GeometryUtils.__v1;e=Math.random();f=Math.random();e+f>1&&(e=1-e,f=1-f);h=1-e-f;g.copy(a);g.multiplyScalar(e);j.copy(b);j.multiplyScalar(f);g.addSelf(j);j.copy(c);j.multiplyScalar(h);g.addSelf(j);return g},randomPointInFace:function(a,b,c){var e,
-f,h;if(a instanceof THREE.Face3)return e=b.vertices[a.a].position,f=b.vertices[a.b].position,h=b.vertices[a.c].position,THREE.GeometryUtils.randomPointInTriangle(e,f,h);else if(a instanceof THREE.Face4){e=b.vertices[a.a].position;f=b.vertices[a.b].position;h=b.vertices[a.c].position;var b=b.vertices[a.d].position,g;c?a._area1&&a._area2?(c=a._area1,g=a._area2):(c=THREE.GeometryUtils.triangleArea(e,f,b),g=THREE.GeometryUtils.triangleArea(f,h,b),a._area1=c,a._area2=g):(c=THREE.GeometryUtils.triangleArea(e,
-f,b),g=THREE.GeometryUtils.triangleArea(f,h,b));return Math.random()*(c+g)<c?THREE.GeometryUtils.randomPointInTriangle(e,f,b):THREE.GeometryUtils.randomPointInTriangle(f,h,b)}},randomPointsInGeometry:function(a,b){function c(a){function c(b,e){if(e<b)return b;var g=b+Math.floor((e-b)/2);return l[g]>a?c(b,g-1):l[g]<a?c(g+1,e):g}return c(0,l.length-1)}var e,f,h=a.faces,g=a.vertices,j=h.length,k=0,l=[],m,n,o,t;for(f=0;f<j;f++){e=h[f];if(e instanceof THREE.Face3)m=g[e.a].position,n=g[e.b].position,o=
-g[e.c].position,e._area=THREE.GeometryUtils.triangleArea(m,n,o);else if(e instanceof THREE.Face4)m=g[e.a].position,n=g[e.b].position,o=g[e.c].position,t=g[e.d].position,e._area1=THREE.GeometryUtils.triangleArea(m,n,t),e._area2=THREE.GeometryUtils.triangleArea(n,o,t),e._area=e._area1+e._area2;k+=e._area;l[f]=k}e=[];g={};for(f=0;f<b;f++)j=Math.random()*k,j=c(j),e[f]=THREE.GeometryUtils.randomPointInFace(h[j],a,!0),g[j]?g[j]+=1:g[j]=1;return e},triangleArea:function(a,b,c){var e,f=THREE.GeometryUtils.__v1;
-f.sub(a,b);e=f.length();f.sub(a,c);a=f.length();f.sub(b,c);c=f.length();b=0.5*(e+a+c);return Math.sqrt(b*(b-e)*(b-a)*(b-c))}};THREE.GeometryUtils.__v1=new THREE.Vector3;
+k.centroid.copy(j.centroid);b.faces.push(k)}a=0;for(c=h.length;a<c;a++){f=h[a];k=[];e=0;for(g=f.length;e<g;e++)k.push(new THREE.UV(f[e].u,f[e].v));b.faceVertexUvs[0].push(k)}return b},randomPointInTriangle:function(a,b,c){var e,f,h,g=new THREE.Vector3,j=THREE.GeometryUtils.__v1;e=THREE.GeometryUtils.random();f=THREE.GeometryUtils.random();e+f>1&&(e=1-e,f=1-f);h=1-e-f;g.copy(a);g.multiplyScalar(e);j.copy(b);j.multiplyScalar(f);g.addSelf(j);j.copy(c);j.multiplyScalar(h);g.addSelf(j);return g},randomPointInFace:function(a,
+b,c){var e,f,h;if(a instanceof THREE.Face3)return e=b.vertices[a.a].position,f=b.vertices[a.b].position,h=b.vertices[a.c].position,THREE.GeometryUtils.randomPointInTriangle(e,f,h);else if(a instanceof THREE.Face4){e=b.vertices[a.a].position;f=b.vertices[a.b].position;h=b.vertices[a.c].position;var b=b.vertices[a.d].position,g;c?a._area1&&a._area2?(c=a._area1,g=a._area2):(c=THREE.GeometryUtils.triangleArea(e,f,b),g=THREE.GeometryUtils.triangleArea(f,h,b),a._area1=c,a._area2=g):(c=THREE.GeometryUtils.triangleArea(e,
+f,b),g=THREE.GeometryUtils.triangleArea(f,h,b));return THREE.GeometryUtils.random()*(c+g)<c?THREE.GeometryUtils.randomPointInTriangle(e,f,b):THREE.GeometryUtils.randomPointInTriangle(f,h,b)}},randomPointsInGeometry:function(a,b){function c(a){function c(b,e){if(e<b)return b;var g=b+Math.floor((e-b)/2);return l[g]>a?c(b,g-1):l[g]<a?c(g+1,e):g}return c(0,l.length-1)}var e,f,h=a.faces,g=a.vertices,j=h.length,k=0,l=[],m,n,o,t;for(f=0;f<j;f++){e=h[f];if(e instanceof THREE.Face3)m=g[e.a].position,n=g[e.b].position,
+o=g[e.c].position,e._area=THREE.GeometryUtils.triangleArea(m,n,o);else if(e instanceof THREE.Face4)m=g[e.a].position,n=g[e.b].position,o=g[e.c].position,t=g[e.d].position,e._area1=THREE.GeometryUtils.triangleArea(m,n,t),e._area2=THREE.GeometryUtils.triangleArea(n,o,t),e._area=e._area1+e._area2;k+=e._area;l[f]=k}e=[];g={};for(f=0;f<b;f++)j=THREE.GeometryUtils.random()*k,j=c(j),e[f]=THREE.GeometryUtils.randomPointInFace(h[j],a,!0),g[j]?g[j]+=1:g[j]=1;return e},triangleArea:function(a,b,c){var e,f=THREE.GeometryUtils.__v1;
+f.sub(a,b);e=f.length();f.sub(a,c);a=f.length();f.sub(b,c);c=f.length();b=0.5*(e+a+c);return Math.sqrt(b*(b-e)*(b-a)*(b-c))},random16:function(){return(65280*Math.random()+255*Math.random())/65535}};THREE.GeometryUtils.random=THREE.GeometryUtils.random16;THREE.GeometryUtils.__v1=new THREE.Vector3;
 THREE.ImageUtils={loadTexture:function(a,b,c){var e=new Image,f=new THREE.Texture(e,b);e.onload=function(){f.needsUpdate=!0;c&&c(this)};e.crossOrigin="";e.src=a;return f},loadTextureCube:function(a,b,c){var e,f=[],h=new THREE.Texture(f,b),b=f.loadCount=0;for(e=a.length;b<e;++b)f[b]=new Image,f[b].onload=function(){f.loadCount+=1;if(f.loadCount==6)h.needsUpdate=!0;c&&c(this)},f[b].crossOrigin="",f[b].src=a[b];return h}};
 THREE.SceneUtils={showHierarchy:function(a,b){THREE.SceneUtils.traverseHierarchy(a,function(a){a.visible=b})},traverseHierarchy:function(a,b){var c,e,f=a.children.length;for(e=0;e<f;e++)c=a.children[e],b(c),THREE.SceneUtils.traverseHierarchy(c,b)}};
 if(THREE.WebGLRenderer)THREE.ShaderUtils={lib:{fresnel:{uniforms:{mRefractionRatio:{type:"f",value:1.02},mFresnelBias:{type:"f",value:0.1},mFresnelPower:{type:"f",value:2},mFresnelScale:{type:"f",value:1},tCube:{type:"t",value:1,texture:null}},fragmentShader:"uniform samplerCube tCube;\nvarying vec3 vReflect;\nvarying vec3 vRefract[3];\nvarying float vReflectionFactor;\nvoid main() {\nvec4 reflectedColor = textureCube( tCube, vec3( -vReflect.x, vReflect.yz ) );\nvec4 refractedColor = vec4( 1.0, 1.0, 1.0, 1.0 );\nrefractedColor.r = textureCube( tCube, vec3( -vRefract[0].x, vRefract[0].yz ) ).r;\nrefractedColor.g = textureCube( tCube, vec3( -vRefract[1].x, vRefract[1].yz ) ).g;\nrefractedColor.b = textureCube( tCube, vec3( -vRefract[2].x, vRefract[2].yz ) ).b;\nrefractedColor.a = 1.0;\ngl_FragColor = mix( refractedColor, reflectedColor, clamp( vReflectionFactor, 0.0, 1.0 ) );\n}",vertexShader:"uniform float mRefractionRatio;\nuniform float mFresnelBias;\nuniform float mFresnelScale;\nuniform float mFresnelPower;\nvarying vec3 vReflect;\nvarying vec3 vRefract[3];\nvarying float vReflectionFactor;\nvoid main() {\nvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\nvec4 mPosition = objectMatrix * vec4( position, 1.0 );\nvec3 nWorld = normalize ( mat3( objectMatrix[0].xyz, objectMatrix[1].xyz, objectMatrix[2].xyz ) * normal );\nvec3 I = mPosition.xyz - cameraPosition;\nvReflect = reflect( I, nWorld );\nvRefract[0] = refract( normalize( I ), nWorld, mRefractionRatio );\nvRefract[1] = refract( normalize( I ), nWorld, mRefractionRatio * 0.99 );\nvRefract[2] = refract( normalize( I ), nWorld, mRefractionRatio * 0.98 );\nvReflectionFactor = mFresnelBias + mFresnelScale * pow( 1.0 + dot( normalize( I ), nWorld ), mFresnelPower );\ngl_Position = projectionMatrix * mvPosition;\n}"},

+ 70 - 70
build/custom/ThreeWebGL.js

@@ -214,76 +214,76 @@ b.n32,b.n43-b.n33,b.n44-b.n34);ma[5].set(b.n41+b.n31,b.n42+b.n32,b.n43+b.n33,b.n
 f.count=0;for(c=e.materials.length;b<c;b++)d=e.materials[b],d.transparent?r(h,d):r(f,d)}function s(b){var c,d,e,f,h=b.object,g=b.buffer,i=b.opaque,j=b.transparent;j.count=0;b=i.count=0;for(e=h.materials.length;b<e;b++)if(c=h.materials[b],c instanceof THREE.MeshFaceMaterial){c=0;for(d=g.materials.length;c<d;c++)(f=g.materials[c])&&(f.transparent?r(j,f):r(i,f))}else(f=c)&&(f.transparent?r(j,f):r(i,f))}function p(b,c){return c.z-b.z}function D(b,d){var j,Ra,Ba,r=0,o,Ca,p,C,q=b.lights;na||(na=new THREE.Camera(J.shadowCameraFov,
 d.aspect,J.shadowCameraNear,J.shadowCameraFar));j=0;for(Ra=q.length;j<Ra;j++)if(Ba=q[j],Ba instanceof THREE.SpotLight&&Ba.castShadow){J.shadowMap[r]||(J.shadowMap[r]=new THREE.WebGLRenderTarget(J.shadowMapWidth,J.shadowMapHeight,{minFilter:THREE.LinearFilter,magFilter:THREE.LinearFilter,format:THREE.RGBAFormat}));Oa[r]||(Oa[r]=new THREE.Matrix4);o=J.shadowMap[r];Ca=Oa[r];na.position.copy(Ba.position);na.target.position.copy(Ba.target.position);na.update(void 0,!0);b.update(void 0,!1,na);Ca.set(0.5,
 0,0,0.5,0,0.5,0,0.5,0,0,0.5,0.5,0,0,0,1);Ca.multiplySelf(na.projectionMatrix);Ca.multiplySelf(na.matrixWorldInverse);na.matrixWorldInverse.flattenToArray(Ma);na.projectionMatrix.flattenToArray(La);wa.multiply(na.projectionMatrix,na.matrixWorldInverse);k(wa);J.initWebGLObjects(b);ka(o);c.clearColor(1,1,1,1);J.clear();c.clearColor(sa.r,sa.g,sa.b,Na);Ca=b.__webglObjects.length;Ba=b.__webglObjectsImmediate.length;for(o=0;o<Ca;o++)p=b.__webglObjects[o],C=p.object,C.visible&&C.castShadow?!(C instanceof
-THREE.Mesh)||n(C)?(C.matrixWorld.flattenToArray(C._objectMatrixArray),U(C,na,!1),p.render=!0):p.render=!1:p.render=!1;h(!0);M(THREE.NormalBlending);for(o=0;o<Ca;o++)if(p=b.__webglObjects[o],p.render)C=p.object,buffer=p.buffer,i(C),p=C.geometry.morphTargets.length?Ta:Pa,f(na,q,null,p,buffer,C);for(o=0;o<Ba;o++)p=b.__webglObjectsImmediate[o],C=p.object,C.visible&&C.castShadow&&(C.matrixAutoUpdate&&C.matrixWorld.flattenToArray(C._objectMatrixArray),U(C,na,!1),i(C),program=e(na,q,null,Pa,C),C.render(function(b){g(b,
-program,Pa.shading)}));r++}}function F(b){c.enable(c.POLYGON_OFFSET_FILL);c.polygonOffset(0.1,1);c.enable(c.STENCIL_TEST);c.enable(c.DEPTH_TEST);c.depthMask(!1);c.colorMask(!1,!1,!1,!1);c.stencilFunc(c.ALWAYS,1,255);c.stencilOpSeparate(c.BACK,c.KEEP,c.INCR,c.KEEP);c.stencilOpSeparate(c.FRONT,c.KEEP,c.DECR,c.KEEP);var d,e=b.lights.length,f,h=b.lights,g=[],i,j,k,n,q,r=b.__webglShadowVolumes.length;for(d=0;d<e;d++)if(f=b.lights[d],f instanceof THREE.DirectionalLight&&f.castShadow){g[0]=-f.position.x;
-g[1]=-f.position.y;g[2]=-f.position.z;for(q=0;q<r;q++)f=b.__webglShadowVolumes[q].object,i=b.__webglShadowVolumes[q].buffer,j=f.materials[0],j.program||J.initMaterial(j,h,void 0,f),j=j.program,k=j.uniforms,n=j.attributes,R!==j&&(c.useProgram(j),R=j,c.uniformMatrix4fv(k.projectionMatrix,!1,La),c.uniformMatrix4fv(k.viewMatrix,!1,Ma),c.uniform3fv(k.directionalLightDirection,g)),f.matrixWorld.flattenToArray(f._objectMatrixArray),c.uniformMatrix4fv(k.objectMatrix,!1,f._objectMatrixArray),c.bindBuffer(c.ARRAY_BUFFER,
-i.__webglVertexBuffer),c.vertexAttribPointer(n.position,3,c.FLOAT,!1,0,0),c.bindBuffer(c.ARRAY_BUFFER,i.__webglNormalBuffer),c.vertexAttribPointer(n.normal,3,c.FLOAT,!1,0,0),c.bindBuffer(c.ELEMENT_ARRAY_BUFFER,i.__webglFaceBuffer),c.cullFace(c.FRONT),c.drawElements(c.TRIANGLES,i.__webglFaceCount,c.UNSIGNED_SHORT,0),c.cullFace(c.BACK),c.drawElements(c.TRIANGLES,i.__webglFaceCount,c.UNSIGNED_SHORT,0)}c.disable(c.POLYGON_OFFSET_FILL);c.colorMask(!0,!0,!0,!0);c.stencilFunc(c.NOTEQUAL,0,255);c.stencilOp(c.KEEP,
-c.KEEP,c.KEEP);c.disable(c.DEPTH_TEST);T=da=-1;R=v.program;c.useProgram(v.program);c.uniformMatrix4fv(v.projectionLocation,!1,La);c.uniform1f(v.darknessLocation,v.darkness);c.bindBuffer(c.ARRAY_BUFFER,v.vertexBuffer);c.vertexAttribPointer(v.vertexLocation,3,c.FLOAT,!1,0,0);c.enableVertexAttribArray(v.vertexLocation);c.blendFunc(c.ONE,c.ONE_MINUS_SRC_ALPHA);c.blendEquation(c.FUNC_ADD);c.bindBuffer(c.ELEMENT_ARRAY_BUFFER,v.elementBuffer);c.drawElements(c.TRIANGLES,6,c.UNSIGNED_SHORT,0);c.disable(c.STENCIL_TEST);
-c.enable(c.DEPTH_TEST);c.depthMask(K)}function G(b,d){var e,f,h;e=w.attributes;var g=w.uniforms,i=qa/la,j,k=[],n=la*0.5,q=qa*0.5,r=!0;c.useProgram(w.program);R=w.program;T=da=-1;Ua||(c.enableVertexAttribArray(w.attributes.position),c.enableVertexAttribArray(w.attributes.uv),Ua=!0);c.disable(c.CULL_FACE);c.enable(c.BLEND);c.depthMask(!0);c.bindBuffer(c.ARRAY_BUFFER,w.vertexBuffer);c.vertexAttribPointer(e.position,2,c.FLOAT,!1,16,0);c.vertexAttribPointer(e.uv,2,c.FLOAT,!1,16,8);c.bindBuffer(c.ELEMENT_ARRAY_BUFFER,
-w.elementBuffer);c.uniformMatrix4fv(g.projectionMatrix,!1,La);c.activeTexture(c.TEXTURE0);c.uniform1i(g.map,0);e=0;for(f=b.__webglSprites.length;e<f;e++)h=b.__webglSprites[e],h.useScreenCoordinates?h.z=-h.position.z:(h._modelViewMatrix.multiplyToArray(d.matrixWorldInverse,h.matrixWorld,h._modelViewMatrixArray),h.z=-h._modelViewMatrix.n34);b.__webglSprites.sort(p);e=0;for(f=b.__webglSprites.length;e<f;e++)h=b.__webglSprites[e],h.material===void 0&&h.map&&h.map.image&&h.map.image.width&&(h.useScreenCoordinates?
-(c.uniform1i(g.useScreenCoordinates,1),c.uniform3f(g.screenPosition,(h.position.x-n)/n,(q-h.position.y)/q,Math.max(0,Math.min(1,h.position.z)))):(c.uniform1i(g.useScreenCoordinates,0),c.uniform1i(g.affectedByDistance,h.affectedByDistance?1:0),c.uniformMatrix4fv(g.modelViewMatrix,!1,h._modelViewMatrixArray)),j=h.map.image.width/(h.scaleByViewport?qa:1),k[0]=j*i*h.scale.x,k[1]=j*h.scale.y,c.uniform2f(g.uvScale,h.uvScale.x,h.uvScale.y),c.uniform2f(g.uvOffset,h.uvOffset.x,h.uvOffset.y),c.uniform2f(g.alignment,
-h.alignment.x,h.alignment.y),c.uniform1f(g.opacity,h.opacity),c.uniform1f(g.rotation,h.rotation),c.uniform2fv(g.scale,k),h.mergeWith3D&&!r?(c.enable(c.DEPTH_TEST),r=!0):!h.mergeWith3D&&r&&(c.disable(c.DEPTH_TEST),r=!1),M(h.blending),ra(h.map,0),c.drawElements(c.TRIANGLES,6,c.UNSIGNED_SHORT,0));c.enable(c.CULL_FACE);c.enable(c.DEPTH_TEST);c.depthMask(K)}function B(b,e){var d,f,h=b.__webglLensFlares.length,g,i,j,k=new THREE.Vector3,n=qa/la,q=la*0.5,r=qa*0.5,o=16/qa,p=[o*n,o],s=[1,1,0],u=[1,1],w=y.uniforms;
-d=y.attributes;c.useProgram(y.program);R=y.program;T=da=-1;Va||(c.enableVertexAttribArray(y.attributes.vertex),c.enableVertexAttribArray(y.attributes.uv),Va=!0);c.uniform1i(w.occlusionMap,0);c.uniform1i(w.map,1);c.bindBuffer(c.ARRAY_BUFFER,y.vertexBuffer);c.vertexAttribPointer(d.vertex,2,c.FLOAT,!1,16,0);c.vertexAttribPointer(d.uv,2,c.FLOAT,!1,16,8);c.bindBuffer(c.ELEMENT_ARRAY_BUFFER,y.elementBuffer);c.disable(c.CULL_FACE);c.depthMask(!1);c.activeTexture(c.TEXTURE0);c.bindTexture(c.TEXTURE_2D,y.occlusionTexture);
-c.activeTexture(c.TEXTURE1);for(f=0;f<h;f++)if(d=b.__webglLensFlares[f].object,k.set(d.matrixWorld.n14,d.matrixWorld.n24,d.matrixWorld.n34),e.matrixWorldInverse.multiplyVector3(k),e.projectionMatrix.multiplyVector3(k),s[0]=k.x,s[1]=k.y,s[2]=k.z,u[0]=s[0]*q+q,u[1]=s[1]*r+r,y.hasVertexTexture||u[0]>0&&u[0]<la&&u[1]>0&&u[1]<qa){c.bindTexture(c.TEXTURE_2D,y.tempTexture);c.copyTexImage2D(c.TEXTURE_2D,0,c.RGB,u[0]-8,u[1]-8,16,16,0);c.uniform1i(w.renderType,0);c.uniform2fv(w.scale,p);c.uniform3fv(w.screenPosition,
-s);c.disable(c.BLEND);c.enable(c.DEPTH_TEST);c.drawElements(c.TRIANGLES,6,c.UNSIGNED_SHORT,0);c.bindTexture(c.TEXTURE_2D,y.occlusionTexture);c.copyTexImage2D(c.TEXTURE_2D,0,c.RGBA,u[0]-8,u[1]-8,16,16,0);c.uniform1i(w.renderType,1);c.disable(c.DEPTH_TEST);c.bindTexture(c.TEXTURE_2D,y.tempTexture);c.drawElements(c.TRIANGLES,6,c.UNSIGNED_SHORT,0);d.positionScreen.x=s[0];d.positionScreen.y=s[1];d.positionScreen.z=s[2];d.customUpdateCallback?d.customUpdateCallback(d):d.updateLensFlares();c.uniform1i(w.renderType,
-2);c.enable(c.BLEND);g=0;for(i=d.lensFlares.length;g<i;g++)if(j=d.lensFlares[g],j.opacity>0.0010&&j.scale>0.0010)s[0]=j.x,s[1]=j.y,s[2]=j.z,o=j.size*j.scale/qa,p[0]=o*n,p[1]=o,c.uniform3fv(w.screenPosition,s),c.uniform2fv(w.scale,p),c.uniform1f(w.rotation,j.rotation),c.uniform1f(w.opacity,j.opacity),M(j.blending),ra(j.texture,1),c.drawElements(c.TRIANGLES,6,c.UNSIGNED_SHORT,0)}c.enable(c.CULL_FACE);c.enable(c.DEPTH_TEST);c.depthMask(K)}function U(b,c,d){b._modelViewMatrix.multiplyToArray(c.matrixWorldInverse,
-b.matrixWorld,b._modelViewMatrixArray);d&&THREE.Matrix4.makeInvert3x3(b._modelViewMatrix).transposeIntoArray(b._normalMatrixArray)}function ta(b){var c,d,e,f;f=b.__materials;b=0;for(d=f.length;b<d;b++)if(e=f[b],e.attributes)for(c in e.attributes)if(e.attributes[c].needsUpdate)return!0;return!1}function fa(b){var c,d,e,f;f=b.__materials;b=0;for(d=f.length;b<d;b++)if(e=f[b],e.attributes)for(c in e.attributes)e.attributes[c].needsUpdate=!1}function H(b){var e,f,h,g;if(b instanceof THREE.Mesh){f=b.geometry;
-for(e in f.geometryGroups)if(h=f.geometryGroups[e],g=ta(h),f.__dirtyVertices||f.__dirtyMorphTargets||f.__dirtyElements||f.__dirtyUvs||f.__dirtyNormals||f.__dirtyColors||f.__dirtyTangents||g){g=h;var i=b,j=c.DYNAMIC_DRAW;if(g.__inittedArrays){var k=void 0,n=void 0,r=void 0,q=void 0,o=r=void 0,p=void 0,s=void 0,u=void 0,w=void 0,y=void 0,B=void 0,D=void 0,F=void 0,x=void 0,v=void 0,L=void 0,G=void 0,t=q=u=q=s=p=void 0,m=void 0,A=m=t=p=void 0,J=void 0,K=A=m=t=r=r=o=u=q=A=m=t=J=A=m=t=J=A=m=t=void 0,H=
-0,I=0,R=0,S=0,M=0,N=0,V=0,O=0,ea=0,z=0,ga=0,A=t=0,A=void 0,ia=g.__vertexArray,aa=g.__uvArray,ca=g.__uv2Array,Q=g.__normalArray,W=g.__tangentArray,ja=g.__colorArray,X=g.__skinVertexAArray,Y=g.__skinVertexBArray,Z=g.__skinIndexArray,$=g.__skinWeightArray,da=g.__morphTargetsArrays,U=g.__webglCustomAttributes,m=void 0,P=g.__faceArray,T=g.__lineArray,ma=g.__needsSmoothNormals,y=g.__vertexColorType,w=g.__uvType,B=g.__normalType,oa=i.geometry,la=oa.__dirtyVertices,na=oa.__dirtyElements,ha=oa.__dirtyUvs,
-pa=oa.__dirtyNormals,qa=oa.__dirtyTangents,ra=oa.__dirtyColors,sa=oa.__dirtyMorphTargets,ka=oa.vertices,ua=g.faces,va=oa.faces,wa=oa.faceVertexUvs[0],xa=oa.faceVertexUvs[1],Ea=oa.skinVerticesA,Fa=oa.skinVerticesB,Ga=oa.skinIndices,za=oa.skinWeights,Aa=i instanceof THREE.ShadowVolume?oa.edgeFaces:void 0,ya=oa.morphTargets;if(U)for(K in U)U[K].offset=0,U[K].offsetSrc=0;k=0;for(n=ua.length;k<n;k++)if(r=ua[k],q=va[r],wa&&(D=wa[r]),xa&&(F=xa[r]),r=q.vertexNormals,o=q.normal,p=q.vertexColors,s=q.color,
-u=q.vertexTangents,q instanceof THREE.Face3){if(la)x=ka[q.a].position,v=ka[q.b].position,L=ka[q.c].position,ia[I]=x.x,ia[I+1]=x.y,ia[I+2]=x.z,ia[I+3]=v.x,ia[I+4]=v.y,ia[I+5]=v.z,ia[I+6]=L.x,ia[I+7]=L.y,ia[I+8]=L.z,I+=9;if(U)for(K in U)if(m=U[K],m.__original.needsUpdate)t=m.offset,A=m.offsetSrc,m.size===1?(m.boundTo===void 0||m.boundTo==="vertices"?(m.array[t]=m.value[q.a],m.array[t+1]=m.value[q.b],m.array[t+2]=m.value[q.c]):m.boundTo==="faces"?(A=m.value[A],m.array[t]=A,m.array[t+1]=A,m.array[t+2]=
-A,m.offsetSrc++):m.boundTo==="faceVertices"&&(m.array[t]=m.value[A],m.array[t+1]=m.value[A+1],m.array[t+2]=m.value[A+2],m.offsetSrc+=3),m.offset+=3):(m.boundTo===void 0||m.boundTo==="vertices"?(x=m.value[q.a],v=m.value[q.b],L=m.value[q.c]):m.boundTo==="faces"?(L=v=x=A=m.value[A],m.offsetSrc++):m.boundTo==="faceVertices"&&(x=m.value[A],v=m.value[A+1],L=m.value[A+2],m.offsetSrc+=3),m.size===2?(m.array[t]=x.x,m.array[t+1]=x.y,m.array[t+2]=v.x,m.array[t+3]=v.y,m.array[t+4]=L.x,m.array[t+5]=L.y,m.offset+=
-6):m.size===3?(m.type==="c"?(m.array[t]=x.r,m.array[t+1]=x.g,m.array[t+2]=x.b,m.array[t+3]=v.r,m.array[t+4]=v.g,m.array[t+5]=v.b,m.array[t+6]=L.r,m.array[t+7]=L.g,m.array[t+8]=L.b):(m.array[t]=x.x,m.array[t+1]=x.y,m.array[t+2]=x.z,m.array[t+3]=v.x,m.array[t+4]=v.y,m.array[t+5]=v.z,m.array[t+6]=L.x,m.array[t+7]=L.y,m.array[t+8]=L.z),m.offset+=9):(m.array[t]=x.x,m.array[t+1]=x.y,m.array[t+2]=x.z,m.array[t+3]=x.w,m.array[t+4]=v.x,m.array[t+5]=v.y,m.array[t+6]=v.z,m.array[t+7]=v.w,m.array[t+8]=L.x,m.array[t+
-9]=L.y,m.array[t+10]=L.z,m.array[t+11]=L.w,m.offset+=12));if(sa){t=0;for(m=ya.length;t<m;t++)x=ya[t].vertices[q.a].position,v=ya[t].vertices[q.b].position,L=ya[t].vertices[q.c].position,A=da[t],A[ga]=x.x,A[ga+1]=x.y,A[ga+2]=x.z,A[ga+3]=v.x,A[ga+4]=v.y,A[ga+5]=v.z,A[ga+6]=L.x,A[ga+7]=L.y,A[ga+8]=L.z;ga+=9}if(za.length)t=za[q.a],m=za[q.b],A=za[q.c],$[z]=t.x,$[z+1]=t.y,$[z+2]=t.z,$[z+3]=t.w,$[z+4]=m.x,$[z+5]=m.y,$[z+6]=m.z,$[z+7]=m.w,$[z+8]=A.x,$[z+9]=A.y,$[z+10]=A.z,$[z+11]=A.w,t=Ga[q.a],m=Ga[q.b],
-A=Ga[q.c],Z[z]=t.x,Z[z+1]=t.y,Z[z+2]=t.z,Z[z+3]=t.w,Z[z+4]=m.x,Z[z+5]=m.y,Z[z+6]=m.z,Z[z+7]=m.w,Z[z+8]=A.x,Z[z+9]=A.y,Z[z+10]=A.z,Z[z+11]=A.w,t=Ea[q.a],m=Ea[q.b],A=Ea[q.c],X[z]=t.x,X[z+1]=t.y,X[z+2]=t.z,X[z+3]=1,X[z+4]=m.x,X[z+5]=m.y,X[z+6]=m.z,X[z+7]=1,X[z+8]=A.x,X[z+9]=A.y,X[z+10]=A.z,X[z+11]=1,t=Fa[q.a],m=Fa[q.b],A=Fa[q.c],Y[z]=t.x,Y[z+1]=t.y,Y[z+2]=t.z,Y[z+3]=1,Y[z+4]=m.x,Y[z+5]=m.y,Y[z+6]=m.z,Y[z+7]=1,Y[z+8]=A.x,Y[z+9]=A.y,Y[z+10]=A.z,Y[z+11]=1,z+=12;if(ra&&y)p.length==3&&y==THREE.VertexColors?
-(q=p[0],t=p[1],m=p[2]):m=t=q=s,ja[ea]=q.r,ja[ea+1]=q.g,ja[ea+2]=q.b,ja[ea+3]=t.r,ja[ea+4]=t.g,ja[ea+5]=t.b,ja[ea+6]=m.r,ja[ea+7]=m.g,ja[ea+8]=m.b,ea+=9;if(qa&&oa.hasTangents)p=u[0],s=u[1],q=u[2],W[V]=p.x,W[V+1]=p.y,W[V+2]=p.z,W[V+3]=p.w,W[V+4]=s.x,W[V+5]=s.y,W[V+6]=s.z,W[V+7]=s.w,W[V+8]=q.x,W[V+9]=q.y,W[V+10]=q.z,W[V+11]=q.w,V+=12;if(pa&&B)if(r.length==3&&ma)for(u=0;u<3;u++)o=r[u],Q[N]=o.x,Q[N+1]=o.y,Q[N+2]=o.z,N+=3;else for(u=0;u<3;u++)Q[N]=o.x,Q[N+1]=o.y,Q[N+2]=o.z,N+=3;if(ha&&D!==void 0&&w)for(u=
-0;u<3;u++)r=D[u],aa[R]=r.u,aa[R+1]=r.v,R+=2;if(ha&&F!==void 0&&w)for(u=0;u<3;u++)r=F[u],ca[S]=r.u,ca[S+1]=r.v,S+=2;na&&(P[M]=H,P[M+1]=H+1,P[M+2]=H+2,M+=3,T[O]=H,T[O+1]=H+1,T[O+2]=H,T[O+3]=H+2,T[O+4]=H+1,T[O+5]=H+2,O+=6,H+=3)}else if(q instanceof THREE.Face4){if(la)x=ka[q.a].position,v=ka[q.b].position,L=ka[q.c].position,G=ka[q.d].position,ia[I]=x.x,ia[I+1]=x.y,ia[I+2]=x.z,ia[I+3]=v.x,ia[I+4]=v.y,ia[I+5]=v.z,ia[I+6]=L.x,ia[I+7]=L.y,ia[I+8]=L.z,ia[I+9]=G.x,ia[I+10]=G.y,ia[I+11]=G.z,I+=12;if(U)for(K in U)if(m=
-U[K],m.__original.needsUpdate)t=m.offset,A=m.offsetSrc,m.size===1?(m.boundTo===void 0||m.boundTo==="vertices"?(m.array[t]=m.value[q.a],m.array[t+1]=m.value[q.b],m.array[t+2]=m.value[q.c],m.array[t+3]=m.value[q.d]):m.boundTo==="faces"?(A=m.value[A],m.array[t]=A,m.array[t+1]=A,m.array[t+2]=A,m.array[t+3]=A,m.offsetSrc++):m.boundTo==="faceVertices"&&(m.array[t]=m.value[A],m.array[t+1]=m.value[A+1],m.array[t+2]=m.value[A+2],m.array[t+3]=m.value[A+3],m.offsetSrc+=4),m.offset+=4):(m.boundTo===void 0||m.boundTo===
-"vertices"?(x=m.value[q.a],v=m.value[q.b],L=m.value[q.c],G=m.value[q.d]):m.boundTo==="faces"?(G=L=v=x=A=m.value[A],m.offsetSrc++):m.boundTo==="faceVertices"&&(x=m.value[A],v=m.value[A+1],L=m.value[A+2],G=m.value[A+3],m.offsetSrc+=4),m.size===2?(m.array[t]=x.x,m.array[t+1]=x.y,m.array[t+2]=v.x,m.array[t+3]=v.y,m.array[t+4]=L.x,m.array[t+5]=L.y,m.array[t+6]=G.x,m.array[t+7]=G.y,m.offset+=8):m.size===3?(m.type==="c"?(m.array[t]=x.r,m.array[t+1]=x.g,m.array[t+2]=x.b,m.array[t+3]=v.r,m.array[t+4]=v.g,
-m.array[t+5]=v.b,m.array[t+6]=L.r,m.array[t+7]=L.g,m.array[t+8]=L.b,m.array[t+9]=G.r,m.array[t+10]=G.g,m.array[t+11]=G.b):(m.array[t]=x.x,m.array[t+1]=x.y,m.array[t+2]=x.z,m.array[t+3]=v.x,m.array[t+4]=v.y,m.array[t+5]=v.z,m.array[t+6]=L.x,m.array[t+7]=L.y,m.array[t+8]=L.z,m.array[t+9]=G.x,m.array[t+10]=G.y,m.array[t+11]=G.z),m.offset+=12):(m.array[t]=x.x,m.array[t+1]=x.y,m.array[t+2]=x.z,m.array[t+3]=x.w,m.array[t+4]=v.x,m.array[t+5]=v.y,m.array[t+6]=v.z,m.array[t+7]=v.w,m.array[t+8]=L.x,m.array[t+
-9]=L.y,m.array[t+10]=L.z,m.array[t+11]=L.w,m.array[t+12]=G.x,m.array[t+13]=G.y,m.array[t+14]=G.z,m.array[t+15]=G.w,m.offset+=16));if(sa){t=0;for(m=ya.length;t<m;t++)x=ya[t].vertices[q.a].position,v=ya[t].vertices[q.b].position,L=ya[t].vertices[q.c].position,G=ya[t].vertices[q.d].position,A=da[t],A[ga]=x.x,A[ga+1]=x.y,A[ga+2]=x.z,A[ga+3]=v.x,A[ga+4]=v.y,A[ga+5]=v.z,A[ga+6]=L.x,A[ga+7]=L.y,A[ga+8]=L.z,A[ga+9]=G.x,A[ga+10]=G.y,A[ga+11]=G.z;ga+=12}if(za.length)t=za[q.a],m=za[q.b],A=za[q.c],J=za[q.d],
-$[z]=t.x,$[z+1]=t.y,$[z+2]=t.z,$[z+3]=t.w,$[z+4]=m.x,$[z+5]=m.y,$[z+6]=m.z,$[z+7]=m.w,$[z+8]=A.x,$[z+9]=A.y,$[z+10]=A.z,$[z+11]=A.w,$[z+12]=J.x,$[z+13]=J.y,$[z+14]=J.z,$[z+15]=J.w,t=Ga[q.a],m=Ga[q.b],A=Ga[q.c],J=Ga[q.d],Z[z]=t.x,Z[z+1]=t.y,Z[z+2]=t.z,Z[z+3]=t.w,Z[z+4]=m.x,Z[z+5]=m.y,Z[z+6]=m.z,Z[z+7]=m.w,Z[z+8]=A.x,Z[z+9]=A.y,Z[z+10]=A.z,Z[z+11]=A.w,Z[z+12]=J.x,Z[z+13]=J.y,Z[z+14]=J.z,Z[z+15]=J.w,t=Ea[q.a],m=Ea[q.b],A=Ea[q.c],J=Ea[q.d],X[z]=t.x,X[z+1]=t.y,X[z+2]=t.z,X[z+3]=1,X[z+4]=m.x,X[z+5]=m.y,
-X[z+6]=m.z,X[z+7]=1,X[z+8]=A.x,X[z+9]=A.y,X[z+10]=A.z,X[z+11]=1,X[z+12]=J.x,X[z+13]=J.y,X[z+14]=J.z,X[z+15]=1,t=Fa[q.a],m=Fa[q.b],A=Fa[q.c],q=Fa[q.d],Y[z]=t.x,Y[z+1]=t.y,Y[z+2]=t.z,Y[z+3]=1,Y[z+4]=m.x,Y[z+5]=m.y,Y[z+6]=m.z,Y[z+7]=1,Y[z+8]=A.x,Y[z+9]=A.y,Y[z+10]=A.z,Y[z+11]=1,Y[z+12]=q.x,Y[z+13]=q.y,Y[z+14]=q.z,Y[z+15]=1,z+=16;if(ra&&y)p.length==4&&y==THREE.VertexColors?(q=p[0],t=p[1],m=p[2],p=p[3]):p=m=t=q=s,ja[ea]=q.r,ja[ea+1]=q.g,ja[ea+2]=q.b,ja[ea+3]=t.r,ja[ea+4]=t.g,ja[ea+5]=t.b,ja[ea+6]=m.r,
-ja[ea+7]=m.g,ja[ea+8]=m.b,ja[ea+9]=p.r,ja[ea+10]=p.g,ja[ea+11]=p.b,ea+=12;if(qa&&oa.hasTangents)p=u[0],s=u[1],q=u[2],u=u[3],W[V]=p.x,W[V+1]=p.y,W[V+2]=p.z,W[V+3]=p.w,W[V+4]=s.x,W[V+5]=s.y,W[V+6]=s.z,W[V+7]=s.w,W[V+8]=q.x,W[V+9]=q.y,W[V+10]=q.z,W[V+11]=q.w,W[V+12]=u.x,W[V+13]=u.y,W[V+14]=u.z,W[V+15]=u.w,V+=16;if(pa&&B)if(r.length==4&&ma)for(u=0;u<4;u++)o=r[u],Q[N]=o.x,Q[N+1]=o.y,Q[N+2]=o.z,N+=3;else for(u=0;u<4;u++)Q[N]=o.x,Q[N+1]=o.y,Q[N+2]=o.z,N+=3;if(ha&&D!==void 0&&w)for(u=0;u<4;u++)r=D[u],aa[R]=
-r.u,aa[R+1]=r.v,R+=2;if(ha&&F!==void 0&&w)for(u=0;u<4;u++)r=F[u],ca[S]=r.u,ca[S+1]=r.v,S+=2;na&&(P[M]=H,P[M+1]=H+1,P[M+2]=H+3,P[M+3]=H+1,P[M+4]=H+2,P[M+5]=H+3,M+=6,T[O]=H,T[O+1]=H+1,T[O+2]=H,T[O+3]=H+3,T[O+4]=H+1,T[O+5]=H+2,T[O+6]=H+2,T[O+7]=H+3,O+=8,H+=4)}if(Aa){k=0;for(n=Aa.length;k<n;k++)P[M]=Aa[k].a,P[M+1]=Aa[k].b,P[M+2]=Aa[k].c,P[M+3]=Aa[k].a,P[M+4]=Aa[k].c,P[M+5]=Aa[k].d,M+=6}la&&(c.bindBuffer(c.ARRAY_BUFFER,g.__webglVertexBuffer),c.bufferData(c.ARRAY_BUFFER,ia,j));if(U)for(K in U)m=U[K],m.__original.needsUpdate&&
-(c.bindBuffer(c.ARRAY_BUFFER,m.buffer),c.bufferData(c.ARRAY_BUFFER,m.array,j));if(sa){t=0;for(m=ya.length;t<m;t++)c.bindBuffer(c.ARRAY_BUFFER,g.__webglMorphTargetsBuffers[t]),c.bufferData(c.ARRAY_BUFFER,da[t],j)}ra&&ea>0&&(c.bindBuffer(c.ARRAY_BUFFER,g.__webglColorBuffer),c.bufferData(c.ARRAY_BUFFER,ja,j));pa&&(c.bindBuffer(c.ARRAY_BUFFER,g.__webglNormalBuffer),c.bufferData(c.ARRAY_BUFFER,Q,j));qa&&oa.hasTangents&&(c.bindBuffer(c.ARRAY_BUFFER,g.__webglTangentBuffer),c.bufferData(c.ARRAY_BUFFER,W,
-j));ha&&R>0&&(c.bindBuffer(c.ARRAY_BUFFER,g.__webglUVBuffer),c.bufferData(c.ARRAY_BUFFER,aa,j));ha&&S>0&&(c.bindBuffer(c.ARRAY_BUFFER,g.__webglUV2Buffer),c.bufferData(c.ARRAY_BUFFER,ca,j));na&&(c.bindBuffer(c.ELEMENT_ARRAY_BUFFER,g.__webglFaceBuffer),c.bufferData(c.ELEMENT_ARRAY_BUFFER,P,j),c.bindBuffer(c.ELEMENT_ARRAY_BUFFER,g.__webglLineBuffer),c.bufferData(c.ELEMENT_ARRAY_BUFFER,T,j));z>0&&(c.bindBuffer(c.ARRAY_BUFFER,g.__webglSkinVertexABuffer),c.bufferData(c.ARRAY_BUFFER,X,j),c.bindBuffer(c.ARRAY_BUFFER,
-g.__webglSkinVertexBBuffer),c.bufferData(c.ARRAY_BUFFER,Y,j),c.bindBuffer(c.ARRAY_BUFFER,g.__webglSkinIndicesBuffer),c.bufferData(c.ARRAY_BUFFER,Z,j),c.bindBuffer(c.ARRAY_BUFFER,g.__webglSkinWeightsBuffer),c.bufferData(c.ARRAY_BUFFER,$,j));i.dynamic||(delete g.__inittedArrays,delete g.__colorArray,delete g.__normalArray,delete g.__tangentArray,delete g.__uvArray,delete g.__uv2Array,delete g.__faceArray,delete g.__vertexArray,delete g.__lineArray,delete g.__skinVertexAArray,delete g.__skinVertexBArray,
-delete g.__skinIndexArray,delete g.__skinWeightArray)}}f.__dirtyVertices=!1;f.__dirtyMorphTargets=!1;f.__dirtyElements=!1;f.__dirtyUvs=!1;f.__dirtyNormals=!1;f.__dirtyTangents=!1;f.__dirtyColors=!1;fa(h)}else if(b instanceof THREE.Ribbon){f=b.geometry;if(f.__dirtyVertices||f.__dirtyColors){b=f;e=c.DYNAMIC_DRAW;w=b.vertices;g=b.colors;y=w.length;i=g.length;B=b.__vertexArray;j=b.__colorArray;D=b.__dirtyColors;if(b.__dirtyVertices){for(k=0;k<y;k++)n=w[k].position,h=k*3,B[h]=n.x,B[h+1]=n.y,B[h+2]=n.z;
-c.bindBuffer(c.ARRAY_BUFFER,b.__webglVertexBuffer);c.bufferData(c.ARRAY_BUFFER,B,e)}if(D){for(k=0;k<i;k++)color=g[k],h=k*3,j[h]=color.r,j[h+1]=color.g,j[h+2]=color.b;c.bindBuffer(c.ARRAY_BUFFER,b.__webglColorBuffer);c.bufferData(c.ARRAY_BUFFER,j,e)}}f.__dirtyVertices=!1;f.__dirtyColors=!1}else if(b instanceof THREE.Line){f=b.geometry;if(f.__dirtyVertices||f.__dirtyColors){b=f;e=c.DYNAMIC_DRAW;w=b.vertices;g=b.colors;y=w.length;i=g.length;B=b.__vertexArray;j=b.__colorArray;D=b.__dirtyColors;if(b.__dirtyVertices){for(k=
-0;k<y;k++)n=w[k].position,h=k*3,B[h]=n.x,B[h+1]=n.y,B[h+2]=n.z;c.bindBuffer(c.ARRAY_BUFFER,b.__webglVertexBuffer);c.bufferData(c.ARRAY_BUFFER,B,e)}if(D){for(k=0;k<i;k++)color=g[k],h=k*3,j[h]=color.r,j[h+1]=color.g,j[h+2]=color.b;c.bindBuffer(c.ARRAY_BUFFER,b.__webglColorBuffer);c.bufferData(c.ARRAY_BUFFER,j,e)}}f.__dirtyVertices=!1;f.__dirtyColors=!1}else if(b instanceof THREE.ParticleSystem)f=b.geometry,g=ta(f),(f.__dirtyVertices||f.__dirtyColors||b.sortParticles||g)&&d(f,c.DYNAMIC_DRAW,b),f.__dirtyVertices=
-!1,f.__dirtyColors=!1,fa(f)}function u(b,c){var d;for(d=b.length-1;d>=0;d--)b[d].object==c&&b.splice(d,1)}function P(b){function c(b){var f=[];d=0;for(e=b.length;d<e;d++)b[d]==void 0?f.push("undefined"):f.push(b[d].id);return f.join("_")}var d,e,f,g,h,i,j,k,q={},n=b.morphTargets!==void 0?b.morphTargets.length:0;b.geometryGroups={};f=0;for(g=b.faces.length;f<g;f++)h=b.faces[f],i=h.materials,j=c(i),q[j]==void 0&&(q[j]={hash:j,counter:0}),k=q[j].hash+"_"+q[j].counter,b.geometryGroups[k]==void 0&&(b.geometryGroups[k]=
-{faces:[],materials:i,vertices:0,numMorphTargets:n}),h=h instanceof THREE.Face3?3:4,b.geometryGroups[k].vertices+h>65535&&(q[j].counter+=1,k=q[j].hash+"_"+q[j].counter,b.geometryGroups[k]==void 0&&(b.geometryGroups[k]={faces:[],materials:i,vertices:0,numMorphTargets:n})),b.geometryGroups[k].faces.push(f),b.geometryGroups[k].vertices+=h}function I(b,c,d){b.push({buffer:c,object:d,opaque:{list:[],count:0},transparent:{list:[],count:0}})}function M(b){if(b!=da){switch(b){case THREE.AdditiveBlending:c.blendEquation(c.FUNC_ADD);
-c.blendFunc(c.SRC_ALPHA,c.ONE);break;case THREE.SubtractiveBlending:c.blendEquation(c.FUNC_ADD);c.blendFunc(c.ZERO,c.ONE_MINUS_SRC_COLOR);break;case THREE.MultiplyBlending:c.blendEquation(c.FUNC_ADD);c.blendFunc(c.ZERO,c.SRC_COLOR);break;default:c.blendEquationSeparate(c.FUNC_ADD,c.FUNC_ADD),c.blendFuncSeparate(c.SRC_ALPHA,c.ONE_MINUS_SRC_ALPHA,c.ONE,c.ONE_MINUS_SRC_ALPHA)}da=b}}function Q(b,d,e){(e.width&e.width-1)==0&&(e.height&e.height-1)==0?(c.texParameteri(b,c.TEXTURE_WRAP_S,N(d.wrapS)),c.texParameteri(b,
-c.TEXTURE_WRAP_T,N(d.wrapT)),c.texParameteri(b,c.TEXTURE_MAG_FILTER,N(d.magFilter)),c.texParameteri(b,c.TEXTURE_MIN_FILTER,N(d.minFilter)),c.generateMipmap(b)):(c.texParameteri(b,c.TEXTURE_WRAP_S,c.CLAMP_TO_EDGE),c.texParameteri(b,c.TEXTURE_WRAP_T,c.CLAMP_TO_EDGE),c.texParameteri(b,c.TEXTURE_MAG_FILTER,va(d.magFilter)),c.texParameteri(b,c.TEXTURE_MIN_FILTER,va(d.minFilter)))}function ra(b,d){if(b.needsUpdate){if(!b.__webglInit)b.__webglTexture=c.createTexture(),b.__webglInit=!0;c.bindTexture(c.TEXTURE_2D,
-b.__webglTexture);b.image.data?c.texImage2D(c.TEXTURE_2D,0,N(b.format),b.image.width,b.image.height,0,N(b.format),c.UNSIGNED_BYTE,b.image.data):c.texImage2D(c.TEXTURE_2D,0,c.RGBA,c.RGBA,c.UNSIGNED_BYTE,b.image);Q(c.TEXTURE_2D,b,b.image);c.bindTexture(c.TEXTURE_2D,null);b.needsUpdate=!1}c.activeTexture(c.TEXTURE0+d);c.bindTexture(c.TEXTURE_2D,b.__webglTexture)}function ka(b){if(b&&!b.__webglFramebuffer){if(b.depthBuffer===void 0)b.depthBuffer=!0;if(b.stencilBuffer===void 0)b.stencilBuffer=!0;b.__webglFramebuffer=
-c.createFramebuffer();b.__webglRenderbuffer=c.createRenderbuffer();b.__webglTexture=c.createTexture();c.bindTexture(c.TEXTURE_2D,b.__webglTexture);c.texParameteri(c.TEXTURE_2D,c.TEXTURE_WRAP_S,N(b.wrapS));c.texParameteri(c.TEXTURE_2D,c.TEXTURE_WRAP_T,N(b.wrapT));c.texParameteri(c.TEXTURE_2D,c.TEXTURE_MAG_FILTER,N(b.magFilter));c.texParameteri(c.TEXTURE_2D,c.TEXTURE_MIN_FILTER,N(b.minFilter));c.texImage2D(c.TEXTURE_2D,0,N(b.format),b.width,b.height,0,N(b.format),N(b.type),null);c.bindRenderbuffer(c.RENDERBUFFER,
-b.__webglRenderbuffer);c.bindFramebuffer(c.FRAMEBUFFER,b.__webglFramebuffer);c.framebufferTexture2D(c.FRAMEBUFFER,c.COLOR_ATTACHMENT0,c.TEXTURE_2D,b.__webglTexture,0);b.depthBuffer&&!b.stencilBuffer?(c.renderbufferStorage(c.RENDERBUFFER,c.DEPTH_COMPONENT16,b.width,b.height),c.framebufferRenderbuffer(c.FRAMEBUFFER,c.DEPTH_ATTACHMENT,c.RENDERBUFFER,b.__webglRenderbuffer)):b.depthBuffer&&b.stencilBuffer?(c.renderbufferStorage(c.RENDERBUFFER,c.DEPTH_STENCIL,b.width,b.height),c.framebufferRenderbuffer(c.FRAMEBUFFER,
-c.DEPTH_STENCIL_ATTACHMENT,c.RENDERBUFFER,b.__webglRenderbuffer)):c.renderbufferStorage(c.RENDERBUFFER,c.RGBA4,b.width,b.height);c.bindTexture(c.TEXTURE_2D,null);c.bindRenderbuffer(c.RENDERBUFFER,null);c.bindFramebuffer(c.FRAMEBUFFER,null)}var d,e;b?(d=b.__webglFramebuffer,e=b.width,b=b.height):(d=null,e=la,b=qa);d!=pa&&(c.bindFramebuffer(c.FRAMEBUFFER,d),c.viewport(Ia,Ja,e,b),pa=d)}function aa(b,d){var e;b=="fragment"?e=c.createShader(c.FRAGMENT_SHADER):b=="vertex"&&(e=c.createShader(c.VERTEX_SHADER));
-c.shaderSource(e,d);c.compileShader(e);if(!c.getShaderParameter(e,c.COMPILE_STATUS))return console.error(c.getShaderInfoLog(e)),console.error(d),null;return e}function va(b){switch(b){case THREE.NearestFilter:case THREE.NearestMipMapNearestFilter:case THREE.NearestMipMapLinearFilter:return c.NEAREST;default:return c.LINEAR}}function N(b){switch(b){case THREE.RepeatWrapping:return c.REPEAT;case THREE.ClampToEdgeWrapping:return c.CLAMP_TO_EDGE;case THREE.MirroredRepeatWrapping:return c.MIRRORED_REPEAT;
-case THREE.NearestFilter:return c.NEAREST;case THREE.NearestMipMapNearestFilter:return c.NEAREST_MIPMAP_NEAREST;case THREE.NearestMipMapLinearFilter:return c.NEAREST_MIPMAP_LINEAR;case THREE.LinearFilter:return c.LINEAR;case THREE.LinearMipMapNearestFilter:return c.LINEAR_MIPMAP_NEAREST;case THREE.LinearMipMapLinearFilter:return c.LINEAR_MIPMAP_LINEAR;case THREE.ByteType:return c.BYTE;case THREE.UnsignedByteType:return c.UNSIGNED_BYTE;case THREE.ShortType:return c.SHORT;case THREE.UnsignedShortType:return c.UNSIGNED_SHORT;
-case THREE.IntType:return c.INT;case THREE.UnsignedShortType:return c.UNSIGNED_INT;case THREE.FloatType:return c.FLOAT;case THREE.AlphaFormat:return c.ALPHA;case THREE.RGBFormat:return c.RGB;case THREE.RGBAFormat:return c.RGBA;case THREE.LuminanceFormat:return c.LUMINANCE;case THREE.LuminanceAlphaFormat:return c.LUMINANCE_ALPHA}return 0}var J=this,c,ha=[],R=null,pa=null,K=!0,ca=null,O=null,da=null,T=null,S=null,ua=null,Ha=null,Ia=0,Ja=0,la=0,qa=0,ma=[new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,
-new THREE.Vector4,new THREE.Vector4,new THREE.Vector4],wa=new THREE.Matrix4,La=new Float32Array(16),Ma=new Float32Array(16),Ka=new THREE.Vector4,Sa={ambient:[0,0,0],directional:{length:0,colors:[],positions:[]},point:{length:0,colors:[],positions:[],distances:[]}},b=b||{},xa=b.canvas!==void 0?b.canvas:document.createElement("canvas"),Qa=b.stencil!==void 0?b.stencil:!0,x=b.antialias!==void 0?b.antialias:!1,sa=b.clearColor!==void 0?new THREE.Color(b.clearColor):new THREE.Color(0),Na=b.clearAlpha!==
-void 0?b.clearAlpha:0;this.data={vertices:0,faces:0,drawCalls:0};this.maxMorphTargets=8;this.domElement=xa;this.sortObjects=this.autoClear=!0;this.shadowMapBias=0.0039;this.shadowMapDarkness=0.5;this.shadowMapHeight=this.shadowMapWidth=512;this.shadowCameraNear=1;this.shadowCameraFar=5E3;this.shadowCameraFov=50;this.shadowMap=[];this.shadowMapEnabled=!1;this.shadowMapSoft=!0;var na,Oa=[],b=THREE.ShaderLib.depthRGBA,Wa=THREE.UniformsUtils.clone(b.uniforms),Pa=new THREE.MeshShaderMaterial({fragmentShader:b.fragmentShader,
-vertexShader:b.vertexShader,uniforms:Wa}),Ta=new THREE.MeshShaderMaterial({fragmentShader:b.fragmentShader,vertexShader:b.vertexShader,uniforms:Wa,morphTargets:!0});Pa._shadowPass=!0;Ta._shadowPass=!0;try{if(!(c=xa.getContext("experimental-webgl",{antialias:x,stencil:Qa})))throw"Error creating WebGL context.";console.log(navigator.userAgent+" | "+c.getParameter(c.VERSION)+" | "+c.getParameter(c.VENDOR)+" | "+c.getParameter(c.RENDERER)+" | "+c.getParameter(c.SHADING_LANGUAGE_VERSION))}catch(Ya){console.error(Ya)}c.clearColor(0,
-0,0,1);c.clearDepth(1);c.enable(c.DEPTH_TEST);c.depthFunc(c.LEQUAL);c.frontFace(c.CCW);c.cullFace(c.BACK);c.enable(c.CULL_FACE);c.enable(c.BLEND);c.blendEquation(c.FUNC_ADD);c.blendFunc(c.SRC_ALPHA,c.ONE_MINUS_SRC_ALPHA);c.clearColor(sa.r,sa.g,sa.b,Na);this.context=c;var Xa=c.getParameter(c.MAX_VERTEX_TEXTURE_IMAGE_UNITS)>0;if(Qa){var v={};v.vertices=new Float32Array(12);v.faces=new Uint16Array(6);v.darkness=0.5;v.vertices[0]=-20;v.vertices[1]=-20;v.vertices[2]=-1;v.vertices[3]=20;v.vertices[4]=-20;
-v.vertices[5]=-1;v.vertices[6]=20;v.vertices[7]=20;v.vertices[8]=-1;v.vertices[9]=-20;v.vertices[10]=20;v.vertices[11]=-1;v.faces[0]=0;v.faces[1]=1;v.faces[2]=2;v.faces[3]=0;v.faces[4]=2;v.faces[5]=3;v.vertexBuffer=c.createBuffer();v.elementBuffer=c.createBuffer();c.bindBuffer(c.ARRAY_BUFFER,v.vertexBuffer);c.bufferData(c.ARRAY_BUFFER,v.vertices,c.STATIC_DRAW);c.bindBuffer(c.ELEMENT_ARRAY_BUFFER,v.elementBuffer);c.bufferData(c.ELEMENT_ARRAY_BUFFER,v.faces,c.STATIC_DRAW);v.program=c.createProgram();
-c.attachShader(v.program,aa("fragment",THREE.ShaderLib.shadowPost.fragmentShader));c.attachShader(v.program,aa("vertex",THREE.ShaderLib.shadowPost.vertexShader));c.linkProgram(v.program);v.vertexLocation=c.getAttribLocation(v.program,"position");v.projectionLocation=c.getUniformLocation(v.program,"projectionMatrix");v.darknessLocation=c.getUniformLocation(v.program,"darkness")}var y={};y.vertices=new Float32Array(16);y.faces=new Uint16Array(6);x=0;y.vertices[x++]=-1;y.vertices[x++]=-1;y.vertices[x++]=
-0;y.vertices[x++]=0;y.vertices[x++]=1;y.vertices[x++]=-1;y.vertices[x++]=1;y.vertices[x++]=0;y.vertices[x++]=1;y.vertices[x++]=1;y.vertices[x++]=1;y.vertices[x++]=1;y.vertices[x++]=-1;y.vertices[x++]=1;y.vertices[x++]=0;y.vertices[x++]=1;x=0;y.faces[x++]=0;y.faces[x++]=1;y.faces[x++]=2;y.faces[x++]=0;y.faces[x++]=2;y.faces[x++]=3;y.vertexBuffer=c.createBuffer();y.elementBuffer=c.createBuffer();y.tempTexture=c.createTexture();y.occlusionTexture=c.createTexture();c.bindBuffer(c.ARRAY_BUFFER,y.vertexBuffer);
-c.bufferData(c.ARRAY_BUFFER,y.vertices,c.STATIC_DRAW);c.bindBuffer(c.ELEMENT_ARRAY_BUFFER,y.elementBuffer);c.bufferData(c.ELEMENT_ARRAY_BUFFER,y.faces,c.STATIC_DRAW);c.bindTexture(c.TEXTURE_2D,y.tempTexture);c.texImage2D(c.TEXTURE_2D,0,c.RGB,16,16,0,c.RGB,c.UNSIGNED_BYTE,null);c.texParameteri(c.TEXTURE_2D,c.TEXTURE_WRAP_S,c.CLAMP_TO_EDGE);c.texParameteri(c.TEXTURE_2D,c.TEXTURE_WRAP_T,c.CLAMP_TO_EDGE);c.texParameteri(c.TEXTURE_2D,c.TEXTURE_MAG_FILTER,c.NEAREST);c.texParameteri(c.TEXTURE_2D,c.TEXTURE_MIN_FILTER,
-c.NEAREST);c.bindTexture(c.TEXTURE_2D,y.occlusionTexture);c.texImage2D(c.TEXTURE_2D,0,c.RGBA,16,16,0,c.RGBA,c.UNSIGNED_BYTE,null);c.texParameteri(c.TEXTURE_2D,c.TEXTURE_WRAP_S,c.CLAMP_TO_EDGE);c.texParameteri(c.TEXTURE_2D,c.TEXTURE_WRAP_T,c.CLAMP_TO_EDGE);c.texParameteri(c.TEXTURE_2D,c.TEXTURE_MAG_FILTER,c.NEAREST);c.texParameteri(c.TEXTURE_2D,c.TEXTURE_MIN_FILTER,c.NEAREST);c.getParameter(c.MAX_VERTEX_TEXTURE_IMAGE_UNITS)<=0?(y.hasVertexTexture=!1,y.program=c.createProgram(),c.attachShader(y.program,
-aa("fragment",THREE.ShaderLib.lensFlare.fragmentShader)),c.attachShader(y.program,aa("vertex",THREE.ShaderLib.lensFlare.vertexShader))):(y.hasVertexTexture=!0,y.program=c.createProgram(),c.attachShader(y.program,aa("fragment",THREE.ShaderLib.lensFlareVertexTexture.fragmentShader)),c.attachShader(y.program,aa("vertex",THREE.ShaderLib.lensFlareVertexTexture.vertexShader)));c.linkProgram(y.program);y.attributes={};y.uniforms={};y.attributes.vertex=c.getAttribLocation(y.program,"position");y.attributes.uv=
-c.getAttribLocation(y.program,"UV");y.uniforms.renderType=c.getUniformLocation(y.program,"renderType");y.uniforms.map=c.getUniformLocation(y.program,"map");y.uniforms.occlusionMap=c.getUniformLocation(y.program,"occlusionMap");y.uniforms.opacity=c.getUniformLocation(y.program,"opacity");y.uniforms.scale=c.getUniformLocation(y.program,"scale");y.uniforms.rotation=c.getUniformLocation(y.program,"rotation");y.uniforms.screenPosition=c.getUniformLocation(y.program,"screenPosition");var Va=!1,w={};w.vertices=
-new Float32Array(16);w.faces=new Uint16Array(6);x=0;w.vertices[x++]=-1;w.vertices[x++]=-1;w.vertices[x++]=0;w.vertices[x++]=1;w.vertices[x++]=1;w.vertices[x++]=-1;w.vertices[x++]=1;w.vertices[x++]=1;w.vertices[x++]=1;w.vertices[x++]=1;w.vertices[x++]=1;w.vertices[x++]=0;w.vertices[x++]=-1;w.vertices[x++]=1;w.vertices[x++]=0;x=w.vertices[x++]=0;w.faces[x++]=0;w.faces[x++]=1;w.faces[x++]=2;w.faces[x++]=0;w.faces[x++]=2;w.faces[x++]=3;w.vertexBuffer=c.createBuffer();w.elementBuffer=c.createBuffer();
-c.bindBuffer(c.ARRAY_BUFFER,w.vertexBuffer);c.bufferData(c.ARRAY_BUFFER,w.vertices,c.STATIC_DRAW);c.bindBuffer(c.ELEMENT_ARRAY_BUFFER,w.elementBuffer);c.bufferData(c.ELEMENT_ARRAY_BUFFER,w.faces,c.STATIC_DRAW);w.program=c.createProgram();c.attachShader(w.program,aa("fragment",THREE.ShaderLib.sprite.fragmentShader));c.attachShader(w.program,aa("vertex",THREE.ShaderLib.sprite.vertexShader));c.linkProgram(w.program);w.attributes={};w.uniforms={};w.attributes.position=c.getAttribLocation(w.program,"position");
-w.attributes.uv=c.getAttribLocation(w.program,"uv");w.uniforms.uvOffset=c.getUniformLocation(w.program,"uvOffset");w.uniforms.uvScale=c.getUniformLocation(w.program,"uvScale");w.uniforms.rotation=c.getUniformLocation(w.program,"rotation");w.uniforms.scale=c.getUniformLocation(w.program,"scale");w.uniforms.alignment=c.getUniformLocation(w.program,"alignment");w.uniforms.map=c.getUniformLocation(w.program,"map");w.uniforms.opacity=c.getUniformLocation(w.program,"opacity");w.uniforms.useScreenCoordinates=
-c.getUniformLocation(w.program,"useScreenCoordinates");w.uniforms.affectedByDistance=c.getUniformLocation(w.program,"affectedByDistance");w.uniforms.screenPosition=c.getUniformLocation(w.program,"screenPosition");w.uniforms.modelViewMatrix=c.getUniformLocation(w.program,"modelViewMatrix");w.uniforms.projectionMatrix=c.getUniformLocation(w.program,"projectionMatrix");var Ua=!1;this.setSize=function(b,c){xa.width=b;xa.height=c;this.setViewport(0,0,xa.width,xa.height)};this.setViewport=function(b,d,
-e,f){Ia=b;Ja=d;la=e;qa=f;c.viewport(Ia,Ja,la,qa)};this.setScissor=function(b,d,e,f){c.scissor(b,d,e,f)};this.enableScissorTest=function(b){b?c.enable(c.SCISSOR_TEST):c.disable(c.SCISSOR_TEST)};this.enableDepthBufferWrite=function(b){K=b;c.depthMask(b)};this.setClearColorHex=function(b,d){sa.setHex(b);Na=d;c.clearColor(sa.r,sa.g,sa.b,Na)};this.setClearColor=function(b,d){sa.copy(b);Na=d;c.clearColor(sa.r,sa.g,sa.b,Na)};this.clear=function(){c.clear(c.COLOR_BUFFER_BIT|c.DEPTH_BUFFER_BIT|c.STENCIL_BUFFER_BIT)};
-this.setStencilShadowDarkness=function(b){v.darkness=b};this.getContext=function(){return c};this.initMaterial=function(b,d,e,f){var g,h,i;b instanceof THREE.MeshDepthMaterial?i="depth":b instanceof THREE.ShadowVolumeDynamicMaterial?i="shadowVolumeDynamic":b instanceof THREE.MeshNormalMaterial?i="normal":b instanceof THREE.MeshBasicMaterial?i="basic":b instanceof THREE.MeshLambertMaterial?i="lambert":b instanceof THREE.MeshPhongMaterial?i="phong":b instanceof THREE.LineBasicMaterial?i="basic":b instanceof
-THREE.ParticleBasicMaterial&&(i="particle_basic");if(i){var j=THREE.ShaderLib[i];b.uniforms=THREE.UniformsUtils.clone(j.uniforms);b.vertexShader=j.vertexShader;b.fragmentShader=j.fragmentShader}var k,n,q;k=q=j=0;for(n=d.length;k<n;k++)h=d[k],h instanceof THREE.SpotLight&&q++,h instanceof THREE.DirectionalLight&&q++,h instanceof THREE.PointLight&&j++;j+q<=4?k=q:(k=Math.ceil(4*q/(j+q)),j=4-k);h={directional:k,point:j};j=q=0;for(k=d.length;j<k;j++)n=d[j],n instanceof THREE.SpotLight&&n.castShadow&&q++;
-var r=50;if(f!==void 0&&f instanceof THREE.SkinnedMesh)r=f.bones.length;var o;a:{k=b.fragmentShader;n=b.vertexShader;var j=b.uniforms,d=b.attributes,e={map:!!b.map,envMap:!!b.envMap,lightMap:!!b.lightMap,vertexColors:b.vertexColors,fog:e,sizeAttenuation:b.sizeAttenuation,skinning:b.skinning,morphTargets:b.morphTargets,maxMorphTargets:this.maxMorphTargets,maxDirLights:h.directional,maxPointLights:h.point,maxBones:r,shadowMapEnabled:this.shadowMapEnabled&&f.receiveShadow,shadowMapSoft:this.shadowMapSoft,
-shadowMapWidth:this.shadowMapWidth,shadowMapHeight:this.shadowMapHeight,maxShadows:q,alphaTest:b.alphaTest},p,f=[];i?f.push(i):(f.push(k),f.push(n));for(p in e)f.push(p),f.push(e[p]);i=f.join();p=0;for(f=ha.length;p<f;p++)if(ha[p].code==i){o=ha[p].program;break a}p=c.createProgram();f=[Xa?"#define VERTEX_TEXTURES":"","#define MAX_DIR_LIGHTS "+e.maxDirLights,"#define MAX_POINT_LIGHTS "+e.maxPointLights,"#define MAX_SHADOWS "+e.maxShadows,"#define MAX_BONES "+e.maxBones,e.map?"#define USE_MAP":"",e.envMap?
-"#define USE_ENVMAP":"",e.lightMap?"#define USE_LIGHTMAP":"",e.vertexColors?"#define USE_COLOR":"",e.skinning?"#define USE_SKINNING":"",e.morphTargets?"#define USE_MORPHTARGETS":"",e.shadowMapEnabled?"#define USE_SHADOWMAP":"",e.shadowMapSoft?"#define SHADOWMAP_SOFT":"",e.sizeAttenuation?"#define USE_SIZEATTENUATION":"","uniform mat4 objectMatrix;\nuniform mat4 modelViewMatrix;\nuniform mat4 projectionMatrix;\nuniform mat4 viewMatrix;\nuniform mat3 normalMatrix;\nuniform vec3 cameraPosition;\nuniform mat4 cameraInverseMatrix;\nattribute vec3 position;\nattribute vec3 normal;\nattribute vec2 uv;\nattribute vec2 uv2;\n#ifdef USE_COLOR\nattribute vec3 color;\n#endif\n#ifdef USE_MORPHTARGETS\nattribute vec3 morphTarget0;\nattribute vec3 morphTarget1;\nattribute vec3 morphTarget2;\nattribute vec3 morphTarget3;\nattribute vec3 morphTarget4;\nattribute vec3 morphTarget5;\nattribute vec3 morphTarget6;\nattribute vec3 morphTarget7;\n#endif\n#ifdef USE_SKINNING\nattribute vec4 skinVertexA;\nattribute vec4 skinVertexB;\nattribute vec4 skinIndex;\nattribute vec4 skinWeight;\n#endif\n"].join("\n");
+THREE.Mesh)||n(C)?(C.matrixWorld.flattenToArray(C._objectMatrixArray),U(C,na,!1),p.render=!0):p.render=!1:p.render=!1;h(!0);M(THREE.NormalBlending);for(o=0;o<Ca;o++)if(p=b.__webglObjects[o],p.render)C=p.object,buffer=p.buffer,i(C),p=C.customDepthMaterial?C.customDepthMaterial:C.geometry.morphTargets.length?Ta:Pa,f(na,q,null,p,buffer,C);for(o=0;o<Ba;o++)p=b.__webglObjectsImmediate[o],C=p.object,C.visible&&C.castShadow&&(C.matrixAutoUpdate&&C.matrixWorld.flattenToArray(C._objectMatrixArray),U(C,na,
+!1),i(C),program=e(na,q,null,Pa,C),C.render(function(b){g(b,program,Pa.shading)}));r++}}function F(b){c.enable(c.POLYGON_OFFSET_FILL);c.polygonOffset(0.1,1);c.enable(c.STENCIL_TEST);c.enable(c.DEPTH_TEST);c.depthMask(!1);c.colorMask(!1,!1,!1,!1);c.stencilFunc(c.ALWAYS,1,255);c.stencilOpSeparate(c.BACK,c.KEEP,c.INCR,c.KEEP);c.stencilOpSeparate(c.FRONT,c.KEEP,c.DECR,c.KEEP);var d,e=b.lights.length,f,h=b.lights,g=[],i,j,k,n,q,r=b.__webglShadowVolumes.length;for(d=0;d<e;d++)if(f=b.lights[d],f instanceof
+THREE.DirectionalLight&&f.castShadow){g[0]=-f.position.x;g[1]=-f.position.y;g[2]=-f.position.z;for(q=0;q<r;q++)f=b.__webglShadowVolumes[q].object,i=b.__webglShadowVolumes[q].buffer,j=f.materials[0],j.program||J.initMaterial(j,h,void 0,f),j=j.program,k=j.uniforms,n=j.attributes,R!==j&&(c.useProgram(j),R=j,c.uniformMatrix4fv(k.projectionMatrix,!1,La),c.uniformMatrix4fv(k.viewMatrix,!1,Ma),c.uniform3fv(k.directionalLightDirection,g)),f.matrixWorld.flattenToArray(f._objectMatrixArray),c.uniformMatrix4fv(k.objectMatrix,
+!1,f._objectMatrixArray),c.bindBuffer(c.ARRAY_BUFFER,i.__webglVertexBuffer),c.vertexAttribPointer(n.position,3,c.FLOAT,!1,0,0),c.bindBuffer(c.ARRAY_BUFFER,i.__webglNormalBuffer),c.vertexAttribPointer(n.normal,3,c.FLOAT,!1,0,0),c.bindBuffer(c.ELEMENT_ARRAY_BUFFER,i.__webglFaceBuffer),c.cullFace(c.FRONT),c.drawElements(c.TRIANGLES,i.__webglFaceCount,c.UNSIGNED_SHORT,0),c.cullFace(c.BACK),c.drawElements(c.TRIANGLES,i.__webglFaceCount,c.UNSIGNED_SHORT,0)}c.disable(c.POLYGON_OFFSET_FILL);c.colorMask(!0,
+!0,!0,!0);c.stencilFunc(c.NOTEQUAL,0,255);c.stencilOp(c.KEEP,c.KEEP,c.KEEP);c.disable(c.DEPTH_TEST);T=da=-1;R=v.program;c.useProgram(v.program);c.uniformMatrix4fv(v.projectionLocation,!1,La);c.uniform1f(v.darknessLocation,v.darkness);c.bindBuffer(c.ARRAY_BUFFER,v.vertexBuffer);c.vertexAttribPointer(v.vertexLocation,3,c.FLOAT,!1,0,0);c.enableVertexAttribArray(v.vertexLocation);c.blendFunc(c.ONE,c.ONE_MINUS_SRC_ALPHA);c.blendEquation(c.FUNC_ADD);c.bindBuffer(c.ELEMENT_ARRAY_BUFFER,v.elementBuffer);
+c.drawElements(c.TRIANGLES,6,c.UNSIGNED_SHORT,0);c.disable(c.STENCIL_TEST);c.enable(c.DEPTH_TEST);c.depthMask(K)}function G(b,d){var e,f,h;e=w.attributes;var g=w.uniforms,i=qa/la,j,k=[],n=la*0.5,q=qa*0.5,r=!0;c.useProgram(w.program);R=w.program;T=da=-1;Ua||(c.enableVertexAttribArray(w.attributes.position),c.enableVertexAttribArray(w.attributes.uv),Ua=!0);c.disable(c.CULL_FACE);c.enable(c.BLEND);c.depthMask(!0);c.bindBuffer(c.ARRAY_BUFFER,w.vertexBuffer);c.vertexAttribPointer(e.position,2,c.FLOAT,
+!1,16,0);c.vertexAttribPointer(e.uv,2,c.FLOAT,!1,16,8);c.bindBuffer(c.ELEMENT_ARRAY_BUFFER,w.elementBuffer);c.uniformMatrix4fv(g.projectionMatrix,!1,La);c.activeTexture(c.TEXTURE0);c.uniform1i(g.map,0);e=0;for(f=b.__webglSprites.length;e<f;e++)h=b.__webglSprites[e],h.useScreenCoordinates?h.z=-h.position.z:(h._modelViewMatrix.multiplyToArray(d.matrixWorldInverse,h.matrixWorld,h._modelViewMatrixArray),h.z=-h._modelViewMatrix.n34);b.__webglSprites.sort(p);e=0;for(f=b.__webglSprites.length;e<f;e++)h=
+b.__webglSprites[e],h.material===void 0&&h.map&&h.map.image&&h.map.image.width&&(h.useScreenCoordinates?(c.uniform1i(g.useScreenCoordinates,1),c.uniform3f(g.screenPosition,(h.position.x-n)/n,(q-h.position.y)/q,Math.max(0,Math.min(1,h.position.z)))):(c.uniform1i(g.useScreenCoordinates,0),c.uniform1i(g.affectedByDistance,h.affectedByDistance?1:0),c.uniformMatrix4fv(g.modelViewMatrix,!1,h._modelViewMatrixArray)),j=h.map.image.width/(h.scaleByViewport?qa:1),k[0]=j*i*h.scale.x,k[1]=j*h.scale.y,c.uniform2f(g.uvScale,
+h.uvScale.x,h.uvScale.y),c.uniform2f(g.uvOffset,h.uvOffset.x,h.uvOffset.y),c.uniform2f(g.alignment,h.alignment.x,h.alignment.y),c.uniform1f(g.opacity,h.opacity),c.uniform1f(g.rotation,h.rotation),c.uniform2fv(g.scale,k),h.mergeWith3D&&!r?(c.enable(c.DEPTH_TEST),r=!0):!h.mergeWith3D&&r&&(c.disable(c.DEPTH_TEST),r=!1),M(h.blending),ra(h.map,0),c.drawElements(c.TRIANGLES,6,c.UNSIGNED_SHORT,0));c.enable(c.CULL_FACE);c.enable(c.DEPTH_TEST);c.depthMask(K)}function B(b,e){var d,f,h=b.__webglLensFlares.length,
+g,i,j,k=new THREE.Vector3,n=qa/la,q=la*0.5,r=qa*0.5,o=16/qa,p=[o*n,o],s=[1,1,0],u=[1,1],w=y.uniforms;d=y.attributes;c.useProgram(y.program);R=y.program;T=da=-1;Va||(c.enableVertexAttribArray(y.attributes.vertex),c.enableVertexAttribArray(y.attributes.uv),Va=!0);c.uniform1i(w.occlusionMap,0);c.uniform1i(w.map,1);c.bindBuffer(c.ARRAY_BUFFER,y.vertexBuffer);c.vertexAttribPointer(d.vertex,2,c.FLOAT,!1,16,0);c.vertexAttribPointer(d.uv,2,c.FLOAT,!1,16,8);c.bindBuffer(c.ELEMENT_ARRAY_BUFFER,y.elementBuffer);
+c.disable(c.CULL_FACE);c.depthMask(!1);c.activeTexture(c.TEXTURE0);c.bindTexture(c.TEXTURE_2D,y.occlusionTexture);c.activeTexture(c.TEXTURE1);for(f=0;f<h;f++)if(d=b.__webglLensFlares[f].object,k.set(d.matrixWorld.n14,d.matrixWorld.n24,d.matrixWorld.n34),e.matrixWorldInverse.multiplyVector3(k),e.projectionMatrix.multiplyVector3(k),s[0]=k.x,s[1]=k.y,s[2]=k.z,u[0]=s[0]*q+q,u[1]=s[1]*r+r,y.hasVertexTexture||u[0]>0&&u[0]<la&&u[1]>0&&u[1]<qa){c.bindTexture(c.TEXTURE_2D,y.tempTexture);c.copyTexImage2D(c.TEXTURE_2D,
+0,c.RGB,u[0]-8,u[1]-8,16,16,0);c.uniform1i(w.renderType,0);c.uniform2fv(w.scale,p);c.uniform3fv(w.screenPosition,s);c.disable(c.BLEND);c.enable(c.DEPTH_TEST);c.drawElements(c.TRIANGLES,6,c.UNSIGNED_SHORT,0);c.bindTexture(c.TEXTURE_2D,y.occlusionTexture);c.copyTexImage2D(c.TEXTURE_2D,0,c.RGBA,u[0]-8,u[1]-8,16,16,0);c.uniform1i(w.renderType,1);c.disable(c.DEPTH_TEST);c.bindTexture(c.TEXTURE_2D,y.tempTexture);c.drawElements(c.TRIANGLES,6,c.UNSIGNED_SHORT,0);d.positionScreen.x=s[0];d.positionScreen.y=
+s[1];d.positionScreen.z=s[2];d.customUpdateCallback?d.customUpdateCallback(d):d.updateLensFlares();c.uniform1i(w.renderType,2);c.enable(c.BLEND);g=0;for(i=d.lensFlares.length;g<i;g++)if(j=d.lensFlares[g],j.opacity>0.0010&&j.scale>0.0010)s[0]=j.x,s[1]=j.y,s[2]=j.z,o=j.size*j.scale/qa,p[0]=o*n,p[1]=o,c.uniform3fv(w.screenPosition,s),c.uniform2fv(w.scale,p),c.uniform1f(w.rotation,j.rotation),c.uniform1f(w.opacity,j.opacity),M(j.blending),ra(j.texture,1),c.drawElements(c.TRIANGLES,6,c.UNSIGNED_SHORT,
+0)}c.enable(c.CULL_FACE);c.enable(c.DEPTH_TEST);c.depthMask(K)}function U(b,c,d){b._modelViewMatrix.multiplyToArray(c.matrixWorldInverse,b.matrixWorld,b._modelViewMatrixArray);d&&THREE.Matrix4.makeInvert3x3(b._modelViewMatrix).transposeIntoArray(b._normalMatrixArray)}function ta(b){var c,d,e,f;f=b.__materials;b=0;for(d=f.length;b<d;b++)if(e=f[b],e.attributes)for(c in e.attributes)if(e.attributes[c].needsUpdate)return!0;return!1}function fa(b){var c,d,e,f;f=b.__materials;b=0;for(d=f.length;b<d;b++)if(e=
+f[b],e.attributes)for(c in e.attributes)e.attributes[c].needsUpdate=!1}function H(b){var e,f,h,g;if(b instanceof THREE.Mesh){f=b.geometry;for(e in f.geometryGroups)if(h=f.geometryGroups[e],g=ta(h),f.__dirtyVertices||f.__dirtyMorphTargets||f.__dirtyElements||f.__dirtyUvs||f.__dirtyNormals||f.__dirtyColors||f.__dirtyTangents||g){g=h;var i=b,j=c.DYNAMIC_DRAW;if(g.__inittedArrays){var k=void 0,n=void 0,r=void 0,q=void 0,o=r=void 0,p=void 0,s=void 0,u=void 0,w=void 0,y=void 0,B=void 0,D=void 0,F=void 0,
+x=void 0,v=void 0,L=void 0,G=void 0,t=q=u=q=s=p=void 0,m=void 0,A=m=t=p=void 0,J=void 0,K=A=m=t=r=r=o=u=q=A=m=t=J=A=m=t=J=A=m=t=void 0,H=0,I=0,R=0,S=0,M=0,N=0,V=0,O=0,ea=0,z=0,ga=0,A=t=0,A=void 0,ia=g.__vertexArray,aa=g.__uvArray,ca=g.__uv2Array,Q=g.__normalArray,W=g.__tangentArray,ja=g.__colorArray,X=g.__skinVertexAArray,Y=g.__skinVertexBArray,Z=g.__skinIndexArray,$=g.__skinWeightArray,da=g.__morphTargetsArrays,U=g.__webglCustomAttributes,m=void 0,P=g.__faceArray,T=g.__lineArray,ma=g.__needsSmoothNormals,
+y=g.__vertexColorType,w=g.__uvType,B=g.__normalType,oa=i.geometry,la=oa.__dirtyVertices,na=oa.__dirtyElements,ha=oa.__dirtyUvs,pa=oa.__dirtyNormals,qa=oa.__dirtyTangents,ra=oa.__dirtyColors,sa=oa.__dirtyMorphTargets,ka=oa.vertices,ua=g.faces,va=oa.faces,wa=oa.faceVertexUvs[0],xa=oa.faceVertexUvs[1],Ea=oa.skinVerticesA,Fa=oa.skinVerticesB,Ga=oa.skinIndices,za=oa.skinWeights,Aa=i instanceof THREE.ShadowVolume?oa.edgeFaces:void 0,ya=oa.morphTargets;if(U)for(K in U)U[K].offset=0,U[K].offsetSrc=0;k=0;
+for(n=ua.length;k<n;k++)if(r=ua[k],q=va[r],wa&&(D=wa[r]),xa&&(F=xa[r]),r=q.vertexNormals,o=q.normal,p=q.vertexColors,s=q.color,u=q.vertexTangents,q instanceof THREE.Face3){if(la)x=ka[q.a].position,v=ka[q.b].position,L=ka[q.c].position,ia[I]=x.x,ia[I+1]=x.y,ia[I+2]=x.z,ia[I+3]=v.x,ia[I+4]=v.y,ia[I+5]=v.z,ia[I+6]=L.x,ia[I+7]=L.y,ia[I+8]=L.z,I+=9;if(U)for(K in U)if(m=U[K],m.__original.needsUpdate)t=m.offset,A=m.offsetSrc,m.size===1?(m.boundTo===void 0||m.boundTo==="vertices"?(m.array[t]=m.value[q.a],
+m.array[t+1]=m.value[q.b],m.array[t+2]=m.value[q.c]):m.boundTo==="faces"?(A=m.value[A],m.array[t]=A,m.array[t+1]=A,m.array[t+2]=A,m.offsetSrc++):m.boundTo==="faceVertices"&&(m.array[t]=m.value[A],m.array[t+1]=m.value[A+1],m.array[t+2]=m.value[A+2],m.offsetSrc+=3),m.offset+=3):(m.boundTo===void 0||m.boundTo==="vertices"?(x=m.value[q.a],v=m.value[q.b],L=m.value[q.c]):m.boundTo==="faces"?(L=v=x=A=m.value[A],m.offsetSrc++):m.boundTo==="faceVertices"&&(x=m.value[A],v=m.value[A+1],L=m.value[A+2],m.offsetSrc+=
+3),m.size===2?(m.array[t]=x.x,m.array[t+1]=x.y,m.array[t+2]=v.x,m.array[t+3]=v.y,m.array[t+4]=L.x,m.array[t+5]=L.y,m.offset+=6):m.size===3?(m.type==="c"?(m.array[t]=x.r,m.array[t+1]=x.g,m.array[t+2]=x.b,m.array[t+3]=v.r,m.array[t+4]=v.g,m.array[t+5]=v.b,m.array[t+6]=L.r,m.array[t+7]=L.g,m.array[t+8]=L.b):(m.array[t]=x.x,m.array[t+1]=x.y,m.array[t+2]=x.z,m.array[t+3]=v.x,m.array[t+4]=v.y,m.array[t+5]=v.z,m.array[t+6]=L.x,m.array[t+7]=L.y,m.array[t+8]=L.z),m.offset+=9):(m.array[t]=x.x,m.array[t+1]=
+x.y,m.array[t+2]=x.z,m.array[t+3]=x.w,m.array[t+4]=v.x,m.array[t+5]=v.y,m.array[t+6]=v.z,m.array[t+7]=v.w,m.array[t+8]=L.x,m.array[t+9]=L.y,m.array[t+10]=L.z,m.array[t+11]=L.w,m.offset+=12));if(sa){t=0;for(m=ya.length;t<m;t++)x=ya[t].vertices[q.a].position,v=ya[t].vertices[q.b].position,L=ya[t].vertices[q.c].position,A=da[t],A[ga]=x.x,A[ga+1]=x.y,A[ga+2]=x.z,A[ga+3]=v.x,A[ga+4]=v.y,A[ga+5]=v.z,A[ga+6]=L.x,A[ga+7]=L.y,A[ga+8]=L.z;ga+=9}if(za.length)t=za[q.a],m=za[q.b],A=za[q.c],$[z]=t.x,$[z+1]=t.y,
+$[z+2]=t.z,$[z+3]=t.w,$[z+4]=m.x,$[z+5]=m.y,$[z+6]=m.z,$[z+7]=m.w,$[z+8]=A.x,$[z+9]=A.y,$[z+10]=A.z,$[z+11]=A.w,t=Ga[q.a],m=Ga[q.b],A=Ga[q.c],Z[z]=t.x,Z[z+1]=t.y,Z[z+2]=t.z,Z[z+3]=t.w,Z[z+4]=m.x,Z[z+5]=m.y,Z[z+6]=m.z,Z[z+7]=m.w,Z[z+8]=A.x,Z[z+9]=A.y,Z[z+10]=A.z,Z[z+11]=A.w,t=Ea[q.a],m=Ea[q.b],A=Ea[q.c],X[z]=t.x,X[z+1]=t.y,X[z+2]=t.z,X[z+3]=1,X[z+4]=m.x,X[z+5]=m.y,X[z+6]=m.z,X[z+7]=1,X[z+8]=A.x,X[z+9]=A.y,X[z+10]=A.z,X[z+11]=1,t=Fa[q.a],m=Fa[q.b],A=Fa[q.c],Y[z]=t.x,Y[z+1]=t.y,Y[z+2]=t.z,Y[z+3]=1,Y[z+
+4]=m.x,Y[z+5]=m.y,Y[z+6]=m.z,Y[z+7]=1,Y[z+8]=A.x,Y[z+9]=A.y,Y[z+10]=A.z,Y[z+11]=1,z+=12;if(ra&&y)p.length==3&&y==THREE.VertexColors?(q=p[0],t=p[1],m=p[2]):m=t=q=s,ja[ea]=q.r,ja[ea+1]=q.g,ja[ea+2]=q.b,ja[ea+3]=t.r,ja[ea+4]=t.g,ja[ea+5]=t.b,ja[ea+6]=m.r,ja[ea+7]=m.g,ja[ea+8]=m.b,ea+=9;if(qa&&oa.hasTangents)p=u[0],s=u[1],q=u[2],W[V]=p.x,W[V+1]=p.y,W[V+2]=p.z,W[V+3]=p.w,W[V+4]=s.x,W[V+5]=s.y,W[V+6]=s.z,W[V+7]=s.w,W[V+8]=q.x,W[V+9]=q.y,W[V+10]=q.z,W[V+11]=q.w,V+=12;if(pa&&B)if(r.length==3&&ma)for(u=0;u<
+3;u++)o=r[u],Q[N]=o.x,Q[N+1]=o.y,Q[N+2]=o.z,N+=3;else for(u=0;u<3;u++)Q[N]=o.x,Q[N+1]=o.y,Q[N+2]=o.z,N+=3;if(ha&&D!==void 0&&w)for(u=0;u<3;u++)r=D[u],aa[R]=r.u,aa[R+1]=r.v,R+=2;if(ha&&F!==void 0&&w)for(u=0;u<3;u++)r=F[u],ca[S]=r.u,ca[S+1]=r.v,S+=2;na&&(P[M]=H,P[M+1]=H+1,P[M+2]=H+2,M+=3,T[O]=H,T[O+1]=H+1,T[O+2]=H,T[O+3]=H+2,T[O+4]=H+1,T[O+5]=H+2,O+=6,H+=3)}else if(q instanceof THREE.Face4){if(la)x=ka[q.a].position,v=ka[q.b].position,L=ka[q.c].position,G=ka[q.d].position,ia[I]=x.x,ia[I+1]=x.y,ia[I+
+2]=x.z,ia[I+3]=v.x,ia[I+4]=v.y,ia[I+5]=v.z,ia[I+6]=L.x,ia[I+7]=L.y,ia[I+8]=L.z,ia[I+9]=G.x,ia[I+10]=G.y,ia[I+11]=G.z,I+=12;if(U)for(K in U)if(m=U[K],m.__original.needsUpdate)t=m.offset,A=m.offsetSrc,m.size===1?(m.boundTo===void 0||m.boundTo==="vertices"?(m.array[t]=m.value[q.a],m.array[t+1]=m.value[q.b],m.array[t+2]=m.value[q.c],m.array[t+3]=m.value[q.d]):m.boundTo==="faces"?(A=m.value[A],m.array[t]=A,m.array[t+1]=A,m.array[t+2]=A,m.array[t+3]=A,m.offsetSrc++):m.boundTo==="faceVertices"&&(m.array[t]=
+m.value[A],m.array[t+1]=m.value[A+1],m.array[t+2]=m.value[A+2],m.array[t+3]=m.value[A+3],m.offsetSrc+=4),m.offset+=4):(m.boundTo===void 0||m.boundTo==="vertices"?(x=m.value[q.a],v=m.value[q.b],L=m.value[q.c],G=m.value[q.d]):m.boundTo==="faces"?(G=L=v=x=A=m.value[A],m.offsetSrc++):m.boundTo==="faceVertices"&&(x=m.value[A],v=m.value[A+1],L=m.value[A+2],G=m.value[A+3],m.offsetSrc+=4),m.size===2?(m.array[t]=x.x,m.array[t+1]=x.y,m.array[t+2]=v.x,m.array[t+3]=v.y,m.array[t+4]=L.x,m.array[t+5]=L.y,m.array[t+
+6]=G.x,m.array[t+7]=G.y,m.offset+=8):m.size===3?(m.type==="c"?(m.array[t]=x.r,m.array[t+1]=x.g,m.array[t+2]=x.b,m.array[t+3]=v.r,m.array[t+4]=v.g,m.array[t+5]=v.b,m.array[t+6]=L.r,m.array[t+7]=L.g,m.array[t+8]=L.b,m.array[t+9]=G.r,m.array[t+10]=G.g,m.array[t+11]=G.b):(m.array[t]=x.x,m.array[t+1]=x.y,m.array[t+2]=x.z,m.array[t+3]=v.x,m.array[t+4]=v.y,m.array[t+5]=v.z,m.array[t+6]=L.x,m.array[t+7]=L.y,m.array[t+8]=L.z,m.array[t+9]=G.x,m.array[t+10]=G.y,m.array[t+11]=G.z),m.offset+=12):(m.array[t]=x.x,
+m.array[t+1]=x.y,m.array[t+2]=x.z,m.array[t+3]=x.w,m.array[t+4]=v.x,m.array[t+5]=v.y,m.array[t+6]=v.z,m.array[t+7]=v.w,m.array[t+8]=L.x,m.array[t+9]=L.y,m.array[t+10]=L.z,m.array[t+11]=L.w,m.array[t+12]=G.x,m.array[t+13]=G.y,m.array[t+14]=G.z,m.array[t+15]=G.w,m.offset+=16));if(sa){t=0;for(m=ya.length;t<m;t++)x=ya[t].vertices[q.a].position,v=ya[t].vertices[q.b].position,L=ya[t].vertices[q.c].position,G=ya[t].vertices[q.d].position,A=da[t],A[ga]=x.x,A[ga+1]=x.y,A[ga+2]=x.z,A[ga+3]=v.x,A[ga+4]=v.y,
+A[ga+5]=v.z,A[ga+6]=L.x,A[ga+7]=L.y,A[ga+8]=L.z,A[ga+9]=G.x,A[ga+10]=G.y,A[ga+11]=G.z;ga+=12}if(za.length)t=za[q.a],m=za[q.b],A=za[q.c],J=za[q.d],$[z]=t.x,$[z+1]=t.y,$[z+2]=t.z,$[z+3]=t.w,$[z+4]=m.x,$[z+5]=m.y,$[z+6]=m.z,$[z+7]=m.w,$[z+8]=A.x,$[z+9]=A.y,$[z+10]=A.z,$[z+11]=A.w,$[z+12]=J.x,$[z+13]=J.y,$[z+14]=J.z,$[z+15]=J.w,t=Ga[q.a],m=Ga[q.b],A=Ga[q.c],J=Ga[q.d],Z[z]=t.x,Z[z+1]=t.y,Z[z+2]=t.z,Z[z+3]=t.w,Z[z+4]=m.x,Z[z+5]=m.y,Z[z+6]=m.z,Z[z+7]=m.w,Z[z+8]=A.x,Z[z+9]=A.y,Z[z+10]=A.z,Z[z+11]=A.w,Z[z+
+12]=J.x,Z[z+13]=J.y,Z[z+14]=J.z,Z[z+15]=J.w,t=Ea[q.a],m=Ea[q.b],A=Ea[q.c],J=Ea[q.d],X[z]=t.x,X[z+1]=t.y,X[z+2]=t.z,X[z+3]=1,X[z+4]=m.x,X[z+5]=m.y,X[z+6]=m.z,X[z+7]=1,X[z+8]=A.x,X[z+9]=A.y,X[z+10]=A.z,X[z+11]=1,X[z+12]=J.x,X[z+13]=J.y,X[z+14]=J.z,X[z+15]=1,t=Fa[q.a],m=Fa[q.b],A=Fa[q.c],q=Fa[q.d],Y[z]=t.x,Y[z+1]=t.y,Y[z+2]=t.z,Y[z+3]=1,Y[z+4]=m.x,Y[z+5]=m.y,Y[z+6]=m.z,Y[z+7]=1,Y[z+8]=A.x,Y[z+9]=A.y,Y[z+10]=A.z,Y[z+11]=1,Y[z+12]=q.x,Y[z+13]=q.y,Y[z+14]=q.z,Y[z+15]=1,z+=16;if(ra&&y)p.length==4&&y==THREE.VertexColors?
+(q=p[0],t=p[1],m=p[2],p=p[3]):p=m=t=q=s,ja[ea]=q.r,ja[ea+1]=q.g,ja[ea+2]=q.b,ja[ea+3]=t.r,ja[ea+4]=t.g,ja[ea+5]=t.b,ja[ea+6]=m.r,ja[ea+7]=m.g,ja[ea+8]=m.b,ja[ea+9]=p.r,ja[ea+10]=p.g,ja[ea+11]=p.b,ea+=12;if(qa&&oa.hasTangents)p=u[0],s=u[1],q=u[2],u=u[3],W[V]=p.x,W[V+1]=p.y,W[V+2]=p.z,W[V+3]=p.w,W[V+4]=s.x,W[V+5]=s.y,W[V+6]=s.z,W[V+7]=s.w,W[V+8]=q.x,W[V+9]=q.y,W[V+10]=q.z,W[V+11]=q.w,W[V+12]=u.x,W[V+13]=u.y,W[V+14]=u.z,W[V+15]=u.w,V+=16;if(pa&&B)if(r.length==4&&ma)for(u=0;u<4;u++)o=r[u],Q[N]=o.x,Q[N+
+1]=o.y,Q[N+2]=o.z,N+=3;else for(u=0;u<4;u++)Q[N]=o.x,Q[N+1]=o.y,Q[N+2]=o.z,N+=3;if(ha&&D!==void 0&&w)for(u=0;u<4;u++)r=D[u],aa[R]=r.u,aa[R+1]=r.v,R+=2;if(ha&&F!==void 0&&w)for(u=0;u<4;u++)r=F[u],ca[S]=r.u,ca[S+1]=r.v,S+=2;na&&(P[M]=H,P[M+1]=H+1,P[M+2]=H+3,P[M+3]=H+1,P[M+4]=H+2,P[M+5]=H+3,M+=6,T[O]=H,T[O+1]=H+1,T[O+2]=H,T[O+3]=H+3,T[O+4]=H+1,T[O+5]=H+2,T[O+6]=H+2,T[O+7]=H+3,O+=8,H+=4)}if(Aa){k=0;for(n=Aa.length;k<n;k++)P[M]=Aa[k].a,P[M+1]=Aa[k].b,P[M+2]=Aa[k].c,P[M+3]=Aa[k].a,P[M+4]=Aa[k].c,P[M+5]=
+Aa[k].d,M+=6}la&&(c.bindBuffer(c.ARRAY_BUFFER,g.__webglVertexBuffer),c.bufferData(c.ARRAY_BUFFER,ia,j));if(U)for(K in U)m=U[K],m.__original.needsUpdate&&(c.bindBuffer(c.ARRAY_BUFFER,m.buffer),c.bufferData(c.ARRAY_BUFFER,m.array,j));if(sa){t=0;for(m=ya.length;t<m;t++)c.bindBuffer(c.ARRAY_BUFFER,g.__webglMorphTargetsBuffers[t]),c.bufferData(c.ARRAY_BUFFER,da[t],j)}ra&&ea>0&&(c.bindBuffer(c.ARRAY_BUFFER,g.__webglColorBuffer),c.bufferData(c.ARRAY_BUFFER,ja,j));pa&&(c.bindBuffer(c.ARRAY_BUFFER,g.__webglNormalBuffer),
+c.bufferData(c.ARRAY_BUFFER,Q,j));qa&&oa.hasTangents&&(c.bindBuffer(c.ARRAY_BUFFER,g.__webglTangentBuffer),c.bufferData(c.ARRAY_BUFFER,W,j));ha&&R>0&&(c.bindBuffer(c.ARRAY_BUFFER,g.__webglUVBuffer),c.bufferData(c.ARRAY_BUFFER,aa,j));ha&&S>0&&(c.bindBuffer(c.ARRAY_BUFFER,g.__webglUV2Buffer),c.bufferData(c.ARRAY_BUFFER,ca,j));na&&(c.bindBuffer(c.ELEMENT_ARRAY_BUFFER,g.__webglFaceBuffer),c.bufferData(c.ELEMENT_ARRAY_BUFFER,P,j),c.bindBuffer(c.ELEMENT_ARRAY_BUFFER,g.__webglLineBuffer),c.bufferData(c.ELEMENT_ARRAY_BUFFER,
+T,j));z>0&&(c.bindBuffer(c.ARRAY_BUFFER,g.__webglSkinVertexABuffer),c.bufferData(c.ARRAY_BUFFER,X,j),c.bindBuffer(c.ARRAY_BUFFER,g.__webglSkinVertexBBuffer),c.bufferData(c.ARRAY_BUFFER,Y,j),c.bindBuffer(c.ARRAY_BUFFER,g.__webglSkinIndicesBuffer),c.bufferData(c.ARRAY_BUFFER,Z,j),c.bindBuffer(c.ARRAY_BUFFER,g.__webglSkinWeightsBuffer),c.bufferData(c.ARRAY_BUFFER,$,j));i.dynamic||(delete g.__inittedArrays,delete g.__colorArray,delete g.__normalArray,delete g.__tangentArray,delete g.__uvArray,delete g.__uv2Array,
+delete g.__faceArray,delete g.__vertexArray,delete g.__lineArray,delete g.__skinVertexAArray,delete g.__skinVertexBArray,delete g.__skinIndexArray,delete g.__skinWeightArray)}}f.__dirtyVertices=!1;f.__dirtyMorphTargets=!1;f.__dirtyElements=!1;f.__dirtyUvs=!1;f.__dirtyNormals=!1;f.__dirtyTangents=!1;f.__dirtyColors=!1;fa(h)}else if(b instanceof THREE.Ribbon){f=b.geometry;if(f.__dirtyVertices||f.__dirtyColors){b=f;e=c.DYNAMIC_DRAW;w=b.vertices;g=b.colors;y=w.length;i=g.length;B=b.__vertexArray;j=b.__colorArray;
+D=b.__dirtyColors;if(b.__dirtyVertices){for(k=0;k<y;k++)n=w[k].position,h=k*3,B[h]=n.x,B[h+1]=n.y,B[h+2]=n.z;c.bindBuffer(c.ARRAY_BUFFER,b.__webglVertexBuffer);c.bufferData(c.ARRAY_BUFFER,B,e)}if(D){for(k=0;k<i;k++)color=g[k],h=k*3,j[h]=color.r,j[h+1]=color.g,j[h+2]=color.b;c.bindBuffer(c.ARRAY_BUFFER,b.__webglColorBuffer);c.bufferData(c.ARRAY_BUFFER,j,e)}}f.__dirtyVertices=!1;f.__dirtyColors=!1}else if(b instanceof THREE.Line){f=b.geometry;if(f.__dirtyVertices||f.__dirtyColors){b=f;e=c.DYNAMIC_DRAW;
+w=b.vertices;g=b.colors;y=w.length;i=g.length;B=b.__vertexArray;j=b.__colorArray;D=b.__dirtyColors;if(b.__dirtyVertices){for(k=0;k<y;k++)n=w[k].position,h=k*3,B[h]=n.x,B[h+1]=n.y,B[h+2]=n.z;c.bindBuffer(c.ARRAY_BUFFER,b.__webglVertexBuffer);c.bufferData(c.ARRAY_BUFFER,B,e)}if(D){for(k=0;k<i;k++)color=g[k],h=k*3,j[h]=color.r,j[h+1]=color.g,j[h+2]=color.b;c.bindBuffer(c.ARRAY_BUFFER,b.__webglColorBuffer);c.bufferData(c.ARRAY_BUFFER,j,e)}}f.__dirtyVertices=!1;f.__dirtyColors=!1}else if(b instanceof THREE.ParticleSystem)f=
+b.geometry,g=ta(f),(f.__dirtyVertices||f.__dirtyColors||b.sortParticles||g)&&d(f,c.DYNAMIC_DRAW,b),f.__dirtyVertices=!1,f.__dirtyColors=!1,fa(f)}function u(b,c){var d;for(d=b.length-1;d>=0;d--)b[d].object==c&&b.splice(d,1)}function P(b){function c(b){var f=[];d=0;for(e=b.length;d<e;d++)b[d]==void 0?f.push("undefined"):f.push(b[d].id);return f.join("_")}var d,e,f,g,h,i,j,k,q={},n=b.morphTargets!==void 0?b.morphTargets.length:0;b.geometryGroups={};f=0;for(g=b.faces.length;f<g;f++)h=b.faces[f],i=h.materials,
+j=c(i),q[j]==void 0&&(q[j]={hash:j,counter:0}),k=q[j].hash+"_"+q[j].counter,b.geometryGroups[k]==void 0&&(b.geometryGroups[k]={faces:[],materials:i,vertices:0,numMorphTargets:n}),h=h instanceof THREE.Face3?3:4,b.geometryGroups[k].vertices+h>65535&&(q[j].counter+=1,k=q[j].hash+"_"+q[j].counter,b.geometryGroups[k]==void 0&&(b.geometryGroups[k]={faces:[],materials:i,vertices:0,numMorphTargets:n})),b.geometryGroups[k].faces.push(f),b.geometryGroups[k].vertices+=h}function I(b,c,d){b.push({buffer:c,object:d,
+opaque:{list:[],count:0},transparent:{list:[],count:0}})}function M(b){if(b!=da){switch(b){case THREE.AdditiveBlending:c.blendEquation(c.FUNC_ADD);c.blendFunc(c.SRC_ALPHA,c.ONE);break;case THREE.SubtractiveBlending:c.blendEquation(c.FUNC_ADD);c.blendFunc(c.ZERO,c.ONE_MINUS_SRC_COLOR);break;case THREE.MultiplyBlending:c.blendEquation(c.FUNC_ADD);c.blendFunc(c.ZERO,c.SRC_COLOR);break;default:c.blendEquationSeparate(c.FUNC_ADD,c.FUNC_ADD),c.blendFuncSeparate(c.SRC_ALPHA,c.ONE_MINUS_SRC_ALPHA,c.ONE,c.ONE_MINUS_SRC_ALPHA)}da=
+b}}function Q(b,d,e){(e.width&e.width-1)==0&&(e.height&e.height-1)==0?(c.texParameteri(b,c.TEXTURE_WRAP_S,N(d.wrapS)),c.texParameteri(b,c.TEXTURE_WRAP_T,N(d.wrapT)),c.texParameteri(b,c.TEXTURE_MAG_FILTER,N(d.magFilter)),c.texParameteri(b,c.TEXTURE_MIN_FILTER,N(d.minFilter)),c.generateMipmap(b)):(c.texParameteri(b,c.TEXTURE_WRAP_S,c.CLAMP_TO_EDGE),c.texParameteri(b,c.TEXTURE_WRAP_T,c.CLAMP_TO_EDGE),c.texParameteri(b,c.TEXTURE_MAG_FILTER,va(d.magFilter)),c.texParameteri(b,c.TEXTURE_MIN_FILTER,va(d.minFilter)))}
+function ra(b,d){if(b.needsUpdate){if(!b.__webglInit)b.__webglTexture=c.createTexture(),b.__webglInit=!0;c.bindTexture(c.TEXTURE_2D,b.__webglTexture);b.image.data?c.texImage2D(c.TEXTURE_2D,0,N(b.format),b.image.width,b.image.height,0,N(b.format),c.UNSIGNED_BYTE,b.image.data):c.texImage2D(c.TEXTURE_2D,0,c.RGBA,c.RGBA,c.UNSIGNED_BYTE,b.image);Q(c.TEXTURE_2D,b,b.image);c.bindTexture(c.TEXTURE_2D,null);b.needsUpdate=!1}c.activeTexture(c.TEXTURE0+d);c.bindTexture(c.TEXTURE_2D,b.__webglTexture)}function ka(b){if(b&&
+!b.__webglFramebuffer){if(b.depthBuffer===void 0)b.depthBuffer=!0;if(b.stencilBuffer===void 0)b.stencilBuffer=!0;b.__webglFramebuffer=c.createFramebuffer();b.__webglRenderbuffer=c.createRenderbuffer();b.__webglTexture=c.createTexture();c.bindTexture(c.TEXTURE_2D,b.__webglTexture);c.texParameteri(c.TEXTURE_2D,c.TEXTURE_WRAP_S,N(b.wrapS));c.texParameteri(c.TEXTURE_2D,c.TEXTURE_WRAP_T,N(b.wrapT));c.texParameteri(c.TEXTURE_2D,c.TEXTURE_MAG_FILTER,N(b.magFilter));c.texParameteri(c.TEXTURE_2D,c.TEXTURE_MIN_FILTER,
+N(b.minFilter));c.texImage2D(c.TEXTURE_2D,0,N(b.format),b.width,b.height,0,N(b.format),N(b.type),null);c.bindRenderbuffer(c.RENDERBUFFER,b.__webglRenderbuffer);c.bindFramebuffer(c.FRAMEBUFFER,b.__webglFramebuffer);c.framebufferTexture2D(c.FRAMEBUFFER,c.COLOR_ATTACHMENT0,c.TEXTURE_2D,b.__webglTexture,0);b.depthBuffer&&!b.stencilBuffer?(c.renderbufferStorage(c.RENDERBUFFER,c.DEPTH_COMPONENT16,b.width,b.height),c.framebufferRenderbuffer(c.FRAMEBUFFER,c.DEPTH_ATTACHMENT,c.RENDERBUFFER,b.__webglRenderbuffer)):
+b.depthBuffer&&b.stencilBuffer?(c.renderbufferStorage(c.RENDERBUFFER,c.DEPTH_STENCIL,b.width,b.height),c.framebufferRenderbuffer(c.FRAMEBUFFER,c.DEPTH_STENCIL_ATTACHMENT,c.RENDERBUFFER,b.__webglRenderbuffer)):c.renderbufferStorage(c.RENDERBUFFER,c.RGBA4,b.width,b.height);c.bindTexture(c.TEXTURE_2D,null);c.bindRenderbuffer(c.RENDERBUFFER,null);c.bindFramebuffer(c.FRAMEBUFFER,null)}var d,e;b?(d=b.__webglFramebuffer,e=b.width,b=b.height):(d=null,e=la,b=qa);d!=pa&&(c.bindFramebuffer(c.FRAMEBUFFER,d),
+c.viewport(Ia,Ja,e,b),pa=d)}function aa(b,d){var e;b=="fragment"?e=c.createShader(c.FRAGMENT_SHADER):b=="vertex"&&(e=c.createShader(c.VERTEX_SHADER));c.shaderSource(e,d);c.compileShader(e);if(!c.getShaderParameter(e,c.COMPILE_STATUS))return console.error(c.getShaderInfoLog(e)),console.error(d),null;return e}function va(b){switch(b){case THREE.NearestFilter:case THREE.NearestMipMapNearestFilter:case THREE.NearestMipMapLinearFilter:return c.NEAREST;default:return c.LINEAR}}function N(b){switch(b){case THREE.RepeatWrapping:return c.REPEAT;
+case THREE.ClampToEdgeWrapping:return c.CLAMP_TO_EDGE;case THREE.MirroredRepeatWrapping:return c.MIRRORED_REPEAT;case THREE.NearestFilter:return c.NEAREST;case THREE.NearestMipMapNearestFilter:return c.NEAREST_MIPMAP_NEAREST;case THREE.NearestMipMapLinearFilter:return c.NEAREST_MIPMAP_LINEAR;case THREE.LinearFilter:return c.LINEAR;case THREE.LinearMipMapNearestFilter:return c.LINEAR_MIPMAP_NEAREST;case THREE.LinearMipMapLinearFilter:return c.LINEAR_MIPMAP_LINEAR;case THREE.ByteType:return c.BYTE;
+case THREE.UnsignedByteType:return c.UNSIGNED_BYTE;case THREE.ShortType:return c.SHORT;case THREE.UnsignedShortType:return c.UNSIGNED_SHORT;case THREE.IntType:return c.INT;case THREE.UnsignedShortType:return c.UNSIGNED_INT;case THREE.FloatType:return c.FLOAT;case THREE.AlphaFormat:return c.ALPHA;case THREE.RGBFormat:return c.RGB;case THREE.RGBAFormat:return c.RGBA;case THREE.LuminanceFormat:return c.LUMINANCE;case THREE.LuminanceAlphaFormat:return c.LUMINANCE_ALPHA}return 0}var J=this,c,ha=[],R=null,
+pa=null,K=!0,ca=null,O=null,da=null,T=null,S=null,ua=null,Ha=null,Ia=0,Ja=0,la=0,qa=0,ma=[new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4],wa=new THREE.Matrix4,La=new Float32Array(16),Ma=new Float32Array(16),Ka=new THREE.Vector4,Sa={ambient:[0,0,0],directional:{length:0,colors:[],positions:[]},point:{length:0,colors:[],positions:[],distances:[]}},b=b||{},xa=b.canvas!==void 0?b.canvas:document.createElement("canvas"),Qa=b.stencil!==void 0?
+b.stencil:!0,x=b.antialias!==void 0?b.antialias:!1,sa=b.clearColor!==void 0?new THREE.Color(b.clearColor):new THREE.Color(0),Na=b.clearAlpha!==void 0?b.clearAlpha:0;this.data={vertices:0,faces:0,drawCalls:0};this.maxMorphTargets=8;this.domElement=xa;this.sortObjects=this.autoClear=!0;this.shadowMapBias=0.0039;this.shadowMapDarkness=0.5;this.shadowMapHeight=this.shadowMapWidth=512;this.shadowCameraNear=1;this.shadowCameraFar=5E3;this.shadowCameraFov=50;this.shadowMap=[];this.shadowMapEnabled=!1;this.shadowMapSoft=
+!0;var na,Oa=[],b=THREE.ShaderLib.depthRGBA,Wa=THREE.UniformsUtils.clone(b.uniforms),Pa=new THREE.MeshShaderMaterial({fragmentShader:b.fragmentShader,vertexShader:b.vertexShader,uniforms:Wa}),Ta=new THREE.MeshShaderMaterial({fragmentShader:b.fragmentShader,vertexShader:b.vertexShader,uniforms:Wa,morphTargets:!0});Pa._shadowPass=!0;Ta._shadowPass=!0;try{if(!(c=xa.getContext("experimental-webgl",{antialias:x,stencil:Qa})))throw"Error creating WebGL context.";console.log(navigator.userAgent+" | "+c.getParameter(c.VERSION)+
+" | "+c.getParameter(c.VENDOR)+" | "+c.getParameter(c.RENDERER)+" | "+c.getParameter(c.SHADING_LANGUAGE_VERSION))}catch(Ya){console.error(Ya)}c.clearColor(0,0,0,1);c.clearDepth(1);c.enable(c.DEPTH_TEST);c.depthFunc(c.LEQUAL);c.frontFace(c.CCW);c.cullFace(c.BACK);c.enable(c.CULL_FACE);c.enable(c.BLEND);c.blendEquation(c.FUNC_ADD);c.blendFunc(c.SRC_ALPHA,c.ONE_MINUS_SRC_ALPHA);c.clearColor(sa.r,sa.g,sa.b,Na);this.context=c;var Xa=c.getParameter(c.MAX_VERTEX_TEXTURE_IMAGE_UNITS)>0;if(Qa){var v={};v.vertices=
+new Float32Array(12);v.faces=new Uint16Array(6);v.darkness=0.5;v.vertices[0]=-20;v.vertices[1]=-20;v.vertices[2]=-1;v.vertices[3]=20;v.vertices[4]=-20;v.vertices[5]=-1;v.vertices[6]=20;v.vertices[7]=20;v.vertices[8]=-1;v.vertices[9]=-20;v.vertices[10]=20;v.vertices[11]=-1;v.faces[0]=0;v.faces[1]=1;v.faces[2]=2;v.faces[3]=0;v.faces[4]=2;v.faces[5]=3;v.vertexBuffer=c.createBuffer();v.elementBuffer=c.createBuffer();c.bindBuffer(c.ARRAY_BUFFER,v.vertexBuffer);c.bufferData(c.ARRAY_BUFFER,v.vertices,c.STATIC_DRAW);
+c.bindBuffer(c.ELEMENT_ARRAY_BUFFER,v.elementBuffer);c.bufferData(c.ELEMENT_ARRAY_BUFFER,v.faces,c.STATIC_DRAW);v.program=c.createProgram();c.attachShader(v.program,aa("fragment",THREE.ShaderLib.shadowPost.fragmentShader));c.attachShader(v.program,aa("vertex",THREE.ShaderLib.shadowPost.vertexShader));c.linkProgram(v.program);v.vertexLocation=c.getAttribLocation(v.program,"position");v.projectionLocation=c.getUniformLocation(v.program,"projectionMatrix");v.darknessLocation=c.getUniformLocation(v.program,
+"darkness")}var y={};y.vertices=new Float32Array(16);y.faces=new Uint16Array(6);x=0;y.vertices[x++]=-1;y.vertices[x++]=-1;y.vertices[x++]=0;y.vertices[x++]=0;y.vertices[x++]=1;y.vertices[x++]=-1;y.vertices[x++]=1;y.vertices[x++]=0;y.vertices[x++]=1;y.vertices[x++]=1;y.vertices[x++]=1;y.vertices[x++]=1;y.vertices[x++]=-1;y.vertices[x++]=1;y.vertices[x++]=0;y.vertices[x++]=1;x=0;y.faces[x++]=0;y.faces[x++]=1;y.faces[x++]=2;y.faces[x++]=0;y.faces[x++]=2;y.faces[x++]=3;y.vertexBuffer=c.createBuffer();
+y.elementBuffer=c.createBuffer();y.tempTexture=c.createTexture();y.occlusionTexture=c.createTexture();c.bindBuffer(c.ARRAY_BUFFER,y.vertexBuffer);c.bufferData(c.ARRAY_BUFFER,y.vertices,c.STATIC_DRAW);c.bindBuffer(c.ELEMENT_ARRAY_BUFFER,y.elementBuffer);c.bufferData(c.ELEMENT_ARRAY_BUFFER,y.faces,c.STATIC_DRAW);c.bindTexture(c.TEXTURE_2D,y.tempTexture);c.texImage2D(c.TEXTURE_2D,0,c.RGB,16,16,0,c.RGB,c.UNSIGNED_BYTE,null);c.texParameteri(c.TEXTURE_2D,c.TEXTURE_WRAP_S,c.CLAMP_TO_EDGE);c.texParameteri(c.TEXTURE_2D,
+c.TEXTURE_WRAP_T,c.CLAMP_TO_EDGE);c.texParameteri(c.TEXTURE_2D,c.TEXTURE_MAG_FILTER,c.NEAREST);c.texParameteri(c.TEXTURE_2D,c.TEXTURE_MIN_FILTER,c.NEAREST);c.bindTexture(c.TEXTURE_2D,y.occlusionTexture);c.texImage2D(c.TEXTURE_2D,0,c.RGBA,16,16,0,c.RGBA,c.UNSIGNED_BYTE,null);c.texParameteri(c.TEXTURE_2D,c.TEXTURE_WRAP_S,c.CLAMP_TO_EDGE);c.texParameteri(c.TEXTURE_2D,c.TEXTURE_WRAP_T,c.CLAMP_TO_EDGE);c.texParameteri(c.TEXTURE_2D,c.TEXTURE_MAG_FILTER,c.NEAREST);c.texParameteri(c.TEXTURE_2D,c.TEXTURE_MIN_FILTER,
+c.NEAREST);c.getParameter(c.MAX_VERTEX_TEXTURE_IMAGE_UNITS)<=0?(y.hasVertexTexture=!1,y.program=c.createProgram(),c.attachShader(y.program,aa("fragment",THREE.ShaderLib.lensFlare.fragmentShader)),c.attachShader(y.program,aa("vertex",THREE.ShaderLib.lensFlare.vertexShader))):(y.hasVertexTexture=!0,y.program=c.createProgram(),c.attachShader(y.program,aa("fragment",THREE.ShaderLib.lensFlareVertexTexture.fragmentShader)),c.attachShader(y.program,aa("vertex",THREE.ShaderLib.lensFlareVertexTexture.vertexShader)));
+c.linkProgram(y.program);y.attributes={};y.uniforms={};y.attributes.vertex=c.getAttribLocation(y.program,"position");y.attributes.uv=c.getAttribLocation(y.program,"UV");y.uniforms.renderType=c.getUniformLocation(y.program,"renderType");y.uniforms.map=c.getUniformLocation(y.program,"map");y.uniforms.occlusionMap=c.getUniformLocation(y.program,"occlusionMap");y.uniforms.opacity=c.getUniformLocation(y.program,"opacity");y.uniforms.scale=c.getUniformLocation(y.program,"scale");y.uniforms.rotation=c.getUniformLocation(y.program,
+"rotation");y.uniforms.screenPosition=c.getUniformLocation(y.program,"screenPosition");var Va=!1,w={};w.vertices=new Float32Array(16);w.faces=new Uint16Array(6);x=0;w.vertices[x++]=-1;w.vertices[x++]=-1;w.vertices[x++]=0;w.vertices[x++]=1;w.vertices[x++]=1;w.vertices[x++]=-1;w.vertices[x++]=1;w.vertices[x++]=1;w.vertices[x++]=1;w.vertices[x++]=1;w.vertices[x++]=1;w.vertices[x++]=0;w.vertices[x++]=-1;w.vertices[x++]=1;w.vertices[x++]=0;x=w.vertices[x++]=0;w.faces[x++]=0;w.faces[x++]=1;w.faces[x++]=
+2;w.faces[x++]=0;w.faces[x++]=2;w.faces[x++]=3;w.vertexBuffer=c.createBuffer();w.elementBuffer=c.createBuffer();c.bindBuffer(c.ARRAY_BUFFER,w.vertexBuffer);c.bufferData(c.ARRAY_BUFFER,w.vertices,c.STATIC_DRAW);c.bindBuffer(c.ELEMENT_ARRAY_BUFFER,w.elementBuffer);c.bufferData(c.ELEMENT_ARRAY_BUFFER,w.faces,c.STATIC_DRAW);w.program=c.createProgram();c.attachShader(w.program,aa("fragment",THREE.ShaderLib.sprite.fragmentShader));c.attachShader(w.program,aa("vertex",THREE.ShaderLib.sprite.vertexShader));
+c.linkProgram(w.program);w.attributes={};w.uniforms={};w.attributes.position=c.getAttribLocation(w.program,"position");w.attributes.uv=c.getAttribLocation(w.program,"uv");w.uniforms.uvOffset=c.getUniformLocation(w.program,"uvOffset");w.uniforms.uvScale=c.getUniformLocation(w.program,"uvScale");w.uniforms.rotation=c.getUniformLocation(w.program,"rotation");w.uniforms.scale=c.getUniformLocation(w.program,"scale");w.uniforms.alignment=c.getUniformLocation(w.program,"alignment");w.uniforms.map=c.getUniformLocation(w.program,
+"map");w.uniforms.opacity=c.getUniformLocation(w.program,"opacity");w.uniforms.useScreenCoordinates=c.getUniformLocation(w.program,"useScreenCoordinates");w.uniforms.affectedByDistance=c.getUniformLocation(w.program,"affectedByDistance");w.uniforms.screenPosition=c.getUniformLocation(w.program,"screenPosition");w.uniforms.modelViewMatrix=c.getUniformLocation(w.program,"modelViewMatrix");w.uniforms.projectionMatrix=c.getUniformLocation(w.program,"projectionMatrix");var Ua=!1;this.setSize=function(b,
+c){xa.width=b;xa.height=c;this.setViewport(0,0,xa.width,xa.height)};this.setViewport=function(b,d,e,f){Ia=b;Ja=d;la=e;qa=f;c.viewport(Ia,Ja,la,qa)};this.setScissor=function(b,d,e,f){c.scissor(b,d,e,f)};this.enableScissorTest=function(b){b?c.enable(c.SCISSOR_TEST):c.disable(c.SCISSOR_TEST)};this.enableDepthBufferWrite=function(b){K=b;c.depthMask(b)};this.setClearColorHex=function(b,d){sa.setHex(b);Na=d;c.clearColor(sa.r,sa.g,sa.b,Na)};this.setClearColor=function(b,d){sa.copy(b);Na=d;c.clearColor(sa.r,
+sa.g,sa.b,Na)};this.clear=function(){c.clear(c.COLOR_BUFFER_BIT|c.DEPTH_BUFFER_BIT|c.STENCIL_BUFFER_BIT)};this.setStencilShadowDarkness=function(b){v.darkness=b};this.getContext=function(){return c};this.initMaterial=function(b,d,e,f){var g,h,i;b instanceof THREE.MeshDepthMaterial?i="depth":b instanceof THREE.ShadowVolumeDynamicMaterial?i="shadowVolumeDynamic":b instanceof THREE.MeshNormalMaterial?i="normal":b instanceof THREE.MeshBasicMaterial?i="basic":b instanceof THREE.MeshLambertMaterial?i="lambert":
+b instanceof THREE.MeshPhongMaterial?i="phong":b instanceof THREE.LineBasicMaterial?i="basic":b instanceof THREE.ParticleBasicMaterial&&(i="particle_basic");if(i){var j=THREE.ShaderLib[i];b.uniforms=THREE.UniformsUtils.clone(j.uniforms);b.vertexShader=j.vertexShader;b.fragmentShader=j.fragmentShader}var k,n,q;k=q=j=0;for(n=d.length;k<n;k++)h=d[k],h instanceof THREE.SpotLight&&q++,h instanceof THREE.DirectionalLight&&q++,h instanceof THREE.PointLight&&j++;j+q<=4?k=q:(k=Math.ceil(4*q/(j+q)),j=4-k);
+h={directional:k,point:j};j=q=0;for(k=d.length;j<k;j++)n=d[j],n instanceof THREE.SpotLight&&n.castShadow&&q++;var r=50;if(f!==void 0&&f instanceof THREE.SkinnedMesh)r=f.bones.length;var o;a:{k=b.fragmentShader;n=b.vertexShader;var j=b.uniforms,d=b.attributes,e={map:!!b.map,envMap:!!b.envMap,lightMap:!!b.lightMap,vertexColors:b.vertexColors,fog:e,sizeAttenuation:b.sizeAttenuation,skinning:b.skinning,morphTargets:b.morphTargets,maxMorphTargets:this.maxMorphTargets,maxDirLights:h.directional,maxPointLights:h.point,
+maxBones:r,shadowMapEnabled:this.shadowMapEnabled&&f.receiveShadow,shadowMapSoft:this.shadowMapSoft,shadowMapWidth:this.shadowMapWidth,shadowMapHeight:this.shadowMapHeight,maxShadows:q,alphaTest:b.alphaTest},p,f=[];i?f.push(i):(f.push(k),f.push(n));for(p in e)f.push(p),f.push(e[p]);i=f.join();p=0;for(f=ha.length;p<f;p++)if(ha[p].code==i){o=ha[p].program;break a}p=c.createProgram();f=[Xa?"#define VERTEX_TEXTURES":"","#define MAX_DIR_LIGHTS "+e.maxDirLights,"#define MAX_POINT_LIGHTS "+e.maxPointLights,
+"#define MAX_SHADOWS "+e.maxShadows,"#define MAX_BONES "+e.maxBones,e.map?"#define USE_MAP":"",e.envMap?"#define USE_ENVMAP":"",e.lightMap?"#define USE_LIGHTMAP":"",e.vertexColors?"#define USE_COLOR":"",e.skinning?"#define USE_SKINNING":"",e.morphTargets?"#define USE_MORPHTARGETS":"",e.shadowMapEnabled?"#define USE_SHADOWMAP":"",e.shadowMapSoft?"#define SHADOWMAP_SOFT":"",e.sizeAttenuation?"#define USE_SIZEATTENUATION":"","uniform mat4 objectMatrix;\nuniform mat4 modelViewMatrix;\nuniform mat4 projectionMatrix;\nuniform mat4 viewMatrix;\nuniform mat3 normalMatrix;\nuniform vec3 cameraPosition;\nuniform mat4 cameraInverseMatrix;\nattribute vec3 position;\nattribute vec3 normal;\nattribute vec2 uv;\nattribute vec2 uv2;\n#ifdef USE_COLOR\nattribute vec3 color;\n#endif\n#ifdef USE_MORPHTARGETS\nattribute vec3 morphTarget0;\nattribute vec3 morphTarget1;\nattribute vec3 morphTarget2;\nattribute vec3 morphTarget3;\nattribute vec3 morphTarget4;\nattribute vec3 morphTarget5;\nattribute vec3 morphTarget6;\nattribute vec3 morphTarget7;\n#endif\n#ifdef USE_SKINNING\nattribute vec4 skinVertexA;\nattribute vec4 skinVertexB;\nattribute vec4 skinIndex;\nattribute vec4 skinWeight;\n#endif\n"].join("\n");
 h=["#ifdef GL_ES\nprecision highp float;\n#endif","#define MAX_DIR_LIGHTS "+e.maxDirLights,"#define MAX_POINT_LIGHTS "+e.maxPointLights,"#define MAX_SHADOWS "+e.maxShadows,e.alphaTest?"#define ALPHATEST "+e.alphaTest:"",e.fog?"#define USE_FOG":"",e.fog instanceof THREE.FogExp2?"#define FOG_EXP2":"",e.map?"#define USE_MAP":"",e.envMap?"#define USE_ENVMAP":"",e.lightMap?"#define USE_LIGHTMAP":"",e.vertexColors?"#define USE_COLOR":"",e.shadowMapEnabled?"#define USE_SHADOWMAP":"",e.shadowMapSoft?"#define SHADOWMAP_SOFT":
 "",e.shadowMapSoft?"#define SHADOWMAP_WIDTH "+e.shadowMapWidth.toFixed(1):"",e.shadowMapSoft?"#define SHADOWMAP_HEIGHT "+e.shadowMapHeight.toFixed(1):"","uniform mat4 viewMatrix;\nuniform vec3 cameraPosition;\n"].join("\n");c.attachShader(p,aa("fragment",h+k));c.attachShader(p,aa("vertex",f+n));c.linkProgram(p);c.getProgramParameter(p,c.LINK_STATUS)||console.error("Could not initialise shader\nVALIDATE_STATUS: "+c.getProgramParameter(p,c.VALIDATE_STATUS)+", gl error ["+c.getError()+"]");p.uniforms=
 {};p.attributes={};var s,f=["viewMatrix","modelViewMatrix","projectionMatrix","normalMatrix","objectMatrix","cameraPosition","cameraInverseMatrix","boneGlobalMatrices","morphTargetInfluences"];for(s in j)f.push(s);s=f;f=0;for(j=s.length;f<j;f++)k=s[f],p.uniforms[k]=c.getUniformLocation(p,k);f=["position","normal","uv","uv2","tangent","color","skinVertexA","skinVertexB","skinIndex","skinWeight"];for(s=0;s<e.maxMorphTargets;s++)f.push("morphTarget"+s);for(o in d)f.push(o);o=f;s=0;for(d=o.length;s<d;s++)e=

+ 16 - 5
src/extras/GeometryUtils.js

@@ -191,8 +191,8 @@ THREE.GeometryUtils = {
 			point = new THREE.Vector3(),
 			tmp = THREE.GeometryUtils.__v1;
 
-		a = Math.random();
-		b = Math.random();
+		a = THREE.GeometryUtils.random();
+		b = THREE.GeometryUtils.random();
 
 		if ( ( a + b ) > 1 ) {
 
@@ -268,7 +268,7 @@ THREE.GeometryUtils = {
 
 			}
 
-			var r = Math.random() * ( area1 + area2 );
+			var r = THREE.GeometryUtils.random() * ( area1 + area2 );
 
 			if ( r < area1 ) {
 
@@ -378,7 +378,7 @@ THREE.GeometryUtils = {
 
 		for ( i = 0; i < n; i ++ ) {
 
-			r = Math.random() * totalArea;
+			r = THREE.GeometryUtils.random() * totalArea;
 
 			index = binarySearchIndices( r );
 
@@ -421,8 +421,19 @@ THREE.GeometryUtils = {
 
 		return Math.sqrt( s * ( s - a ) * ( s - b ) * ( s - c ) );
 
+	},
+
+	// Get 16 bits of randomness
+	// (standard Math.random() creates repetitive patterns when applied over larger space)
+
+	random16: function() {
+
+		return ( 65280 * Math.random() + 255 * Math.random() ) / 65535;
+
 	}
 
 };
 
-THREE.GeometryUtils.__v1 = new THREE.Vector3();
+THREE.GeometryUtils.random = THREE.GeometryUtils.random16;
+
+THREE.GeometryUtils.__v1 = new THREE.Vector3();

+ 13 - 1
src/renderers/WebGLRenderer.js

@@ -3586,7 +3586,19 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 						setObjectFaces( object );
 
-						material = object.geometry.morphTargets.length ? _depthMaterialMorph : _depthMaterial;
+						if ( object.customDepthMaterial ) {
+
+							material =  object.customDepthMaterial;
+
+						} else if ( object.geometry.morphTargets.length ) {
+
+							material =  _depthMaterialMorph;
+
+						} else {
+
+							material = _depthMaterial;
+
+						}
 
 						renderBuffer( _cameraLight, lights, fog, material, buffer, object );