Browse Source

(Hopefully) temporal patch for making video work on Chrome Stable + Windows. (Thanks @spite!).

Mr.doob 14 years ago
parent
commit
ce8e05b632
3 changed files with 83 additions and 58 deletions
  1. 29 29
      build/Three.js
  2. 28 29
      build/custom/ThreeWebGL.js
  3. 26 0
      src/renderers/WebGLRenderer.js

+ 29 - 29
build/Three.js

@@ -284,35 +284,35 @@ La=n.__vertexArray;J=n.__colorArray;bb=n.__dirtyColors;if(n.__dirtyVertices){for
 (z.__dirtyVertices||z.__dirtyColors||n.sortParticles)&&d(z,e.DYNAMIC_DRAW,n);z.__dirtyVertices=!1;z.__dirtyColors=!1}}function S(n){function D(W){var ia=[];z=0;for(v=W.length;z<v;z++)W[z]==undefined?ia.push("undefined"):ia.push(W[z].id);return ia.join("_")}var z,v,A,M,J,G,U,Y,B={},K=n.morphTargets!==undefined?n.morphTargets.length:0;n.geometryGroups={};A=0;for(M=n.faces.length;A<M;A++){J=n.faces[A];G=J.materials;U=D(G);B[U]==undefined&&(B[U]={hash:U,counter:0});Y=B[U].hash+"_"+B[U].counter;n.geometryGroups[Y]==
 undefined&&(n.geometryGroups[Y]={faces:[],materials:G,vertices:0,numMorphTargets:K});J=J instanceof THREE.Face3?3:4;if(n.geometryGroups[Y].vertices+J>65535){B[U].counter+=1;Y=B[U].hash+"_"+B[U].counter;n.geometryGroups[Y]==undefined&&(n.geometryGroups[Y]={faces:[],materials:G,vertices:0,numMorphTargets:K})}n.geometryGroups[Y].faces.push(A);n.geometryGroups[Y].vertices+=J}}function E(n,D,z){n.push({buffer:D,object:z,opaque:{list:[],count:0},transparent:{list:[],count:0}})}function T(n){if(n!=sa){switch(n){case THREE.AdditiveBlending:e.blendEquation(e.FUNC_ADD);
 e.blendFunc(e.SRC_ALPHA,e.ONE);break;case THREE.SubtractiveBlending:e.blendEquation(e.FUNC_ADD);e.blendFunc(e.ZERO,e.ONE_MINUS_SRC_COLOR);break;case THREE.MultiplyBlending:e.blendEquation(e.FUNC_ADD);e.blendFunc(e.ZERO,e.SRC_COLOR);break;default:e.blendEquationSeparate(e.FUNC_ADD,e.FUNC_ADD);e.blendFuncSeparate(e.SRC_ALPHA,e.ONE_MINUS_SRC_ALPHA,e.ONE,e.ONE_MINUS_SRC_ALPHA)}sa=n}}function O(n,D,z){if((z.width&z.width-1)==0&&(z.height&z.height-1)==0){e.texParameteri(n,e.TEXTURE_WRAP_S,X(D.wrapS));e.texParameteri(n,
-e.TEXTURE_WRAP_T,X(D.wrapT));e.texParameteri(n,e.TEXTURE_MAG_FILTER,X(D.magFilter));e.texParameteri(n,e.TEXTURE_MIN_FILTER,X(D.minFilter));e.generateMipmap(n)}else{e.texParameteri(n,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE);e.texParameteri(n,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE);e.texParameteri(n,e.TEXTURE_MAG_FILTER,ga(D.magFilter));e.texParameteri(n,e.TEXTURE_MIN_FILTER,ga(D.minFilter))}}function Q(n,D){if(n.needsUpdate){if(n.__webglInit){e.bindTexture(e.TEXTURE_2D,n.__webglTexture);e.texSubImage2D(e.TEXTURE_2D,
-0,0,0,e.RGBA,e.UNSIGNED_BYTE,n.image)}else{n.__webglTexture=e.createTexture();e.bindTexture(e.TEXTURE_2D,n.__webglTexture);e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,n.image);n.__webglInit=!0}O(e.TEXTURE_2D,n,n.image);e.bindTexture(e.TEXTURE_2D,null);n.needsUpdate=!1}e.activeTexture(e.TEXTURE0+D);e.bindTexture(e.TEXTURE_2D,n.__webglTexture)}function ya(n){if(n&&!n.__webglFramebuffer){if(n.depthBuffer===undefined)n.depthBuffer=!0;if(n.stencilBuffer===undefined)n.stencilBuffer=!0;n.__webglFramebuffer=
-e.createFramebuffer();n.__webglRenderbuffer=e.createRenderbuffer();n.__webglTexture=e.createTexture();e.bindTexture(e.TEXTURE_2D,n.__webglTexture);e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,X(n.wrapS));e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,X(n.wrapT));e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,X(n.magFilter));e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,X(n.minFilter));e.texImage2D(e.TEXTURE_2D,0,X(n.format),n.width,n.height,0,X(n.format),X(n.type),null);e.bindRenderbuffer(e.RENDERBUFFER,
-n.__webglRenderbuffer);e.bindFramebuffer(e.FRAMEBUFFER,n.__webglFramebuffer);e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,n.__webglTexture,0);if(n.depthBuffer&&!n.stencilBuffer){e.renderbufferStorage(e.RENDERBUFFER,e.DEPTH_COMPONENT16,n.width,n.height);e.framebufferRenderbuffer(e.FRAMEBUFFER,e.DEPTH_ATTACHMENT,e.RENDERBUFFER,n.__webglRenderbuffer)}else if(n.depthBuffer&&n.stencilBuffer){e.renderbufferStorage(e.RENDERBUFFER,e.DEPTH_STENCIL,n.width,n.height);e.framebufferRenderbuffer(e.FRAMEBUFFER,
-e.DEPTH_STENCIL_ATTACHMENT,e.RENDERBUFFER,n.__webglRenderbuffer)}else e.renderbufferStorage(e.RENDERBUFFER,e.RGBA4,n.width,n.height);e.bindTexture(e.TEXTURE_2D,null);e.bindRenderbuffer(e.RENDERBUFFER,null);e.bindFramebuffer(e.FRAMEBUFFER,null)}var D,z;if(n){D=n.__webglFramebuffer;z=n.width;n=n.height}else{D=null;z=ea;n=Aa}if(D!=Da){e.bindFramebuffer(e.FRAMEBUFFER,D);e.viewport(ra,oa,z,n);Da=D}}function aa(n,D){var z;if(n=="fragment")z=e.createShader(e.FRAGMENT_SHADER);else n=="vertex"&&(z=e.createShader(e.VERTEX_SHADER));
-e.shaderSource(z,D);e.compileShader(z);if(!e.getShaderParameter(z,e.COMPILE_STATUS)){console.error(e.getShaderInfoLog(z));console.error(D);return null}return z}function ga(n){switch(n){case THREE.NearestFilter:case THREE.NearestMipMapNearestFilter:case THREE.NearestMipMapLinearFilter:return e.NEAREST;default:return e.LINEAR}}function X(n){switch(n){case THREE.RepeatWrapping:return e.REPEAT;case THREE.ClampToEdgeWrapping:return e.CLAMP_TO_EDGE;case THREE.MirroredRepeatWrapping:return e.MIRRORED_REPEAT;
-case THREE.NearestFilter:return e.NEAREST;case THREE.NearestMipMapNearestFilter:return e.NEAREST_MIPMAP_NEAREST;case THREE.NearestMipMapLinearFilter:return e.NEAREST_MIPMAP_LINEAR;case THREE.LinearFilter:return e.LINEAR;case THREE.LinearMipMapNearestFilter:return e.LINEAR_MIPMAP_NEAREST;case THREE.LinearMipMapLinearFilter:return e.LINEAR_MIPMAP_LINEAR;case THREE.ByteType:return e.BYTE;case THREE.UnsignedByteType:return e.UNSIGNED_BYTE;case THREE.ShortType:return e.SHORT;case THREE.UnsignedShortType:return e.UNSIGNED_SHORT;
-case THREE.IntType:return e.INT;case THREE.UnsignedShortType:return e.UNSIGNED_INT;case THREE.FloatType:return e.FLOAT;case THREE.AlphaFormat:return e.ALPHA;case THREE.RGBFormat:return e.RGB;case THREE.RGBAFormat:return e.RGBA;case THREE.LuminanceFormat:return e.LUMINANCE;case THREE.LuminanceAlphaFormat:return e.LUMINANCE_ALPHA}return 0}var ha=this,e,Ja=[],ta=null,Da=null,ca=!0,ua=null,da=null,sa=null,na=null,ra=0,oa=0,ea=0,Aa=0,Oa=[new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,
-new THREE.Vector4,new THREE.Vector4],fa=new THREE.Matrix4,xa=new Float32Array(16),Ma=new Float32Array(16),Qa=new THREE.Vector4,Ua={ambient:[0,0,0],directional:{length:0,colors:[],positions:[]},point:{length:0,colors:[],positions:[],distances:[]}};b=b||{};var L=b.canvas!==undefined?b.canvas:document.createElement("canvas"),Z=b.stencil!==undefined?b.stencil:!0,ja=b.antialias!==undefined?b.antialias:!1,la=b.clearColor!==undefined?new THREE.Color(b.clearColor):new THREE.Color(0),Na=b.clearAlpha!==undefined?
-b.clearAlpha:0;this.data={vertices:0,faces:0,drawCalls:0};this.maxMorphTargets=8;this.domElement=L;this.autoClear=!0;this.sortObjects=!0;try{if(!(e=L.getContext("experimental-webgl",{antialias:ja,stencil:Z})))throw"Error creating WebGL context.";}catch(fb){console.error(fb)}console.log(navigator.userAgent+" | "+e.getParameter(e.VERSION)+" | "+e.getParameter(e.VENDOR)+" | "+e.getParameter(e.RENDERER)+" | "+e.getParameter(e.SHADING_LANGUAGE_VERSION));e.clearColor(0,0,0,1);e.clearDepth(1);e.enable(e.DEPTH_TEST);
-e.depthFunc(e.LEQUAL);e.frontFace(e.CCW);e.cullFace(e.BACK);e.enable(e.CULL_FACE);e.enable(e.BLEND);e.blendEquation(e.FUNC_ADD);e.blendFunc(e.SRC_ALPHA,e.ONE_MINUS_SRC_ALPHA);e.clearColor(la.r,la.g,la.b,Na);this.context=e;var hb=e.getParameter(e.MAX_VERTEX_TEXTURE_IMAGE_UNITS)>0;if(Z){var Ga={};Ga.vertices=new Float32Array(12);Ga.faces=new Uint16Array(6);Ga.darkness=0.5;Ga.vertices[0]=-20;Ga.vertices[1]=-20;Ga.vertices[2]=-1;Ga.vertices[3]=20;Ga.vertices[4]=-20;Ga.vertices[5]=-1;Ga.vertices[6]=20;
-Ga.vertices[7]=20;Ga.vertices[8]=-1;Ga.vertices[9]=-20;Ga.vertices[10]=20;Ga.vertices[11]=-1;Ga.faces[0]=0;Ga.faces[1]=1;Ga.faces[2]=2;Ga.faces[3]=0;Ga.faces[4]=2;Ga.faces[5]=3;Ga.vertexBuffer=e.createBuffer();Ga.elementBuffer=e.createBuffer();e.bindBuffer(e.ARRAY_BUFFER,Ga.vertexBuffer);e.bufferData(e.ARRAY_BUFFER,Ga.vertices,e.STATIC_DRAW);e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,Ga.elementBuffer);e.bufferData(e.ELEMENT_ARRAY_BUFFER,Ga.faces,e.STATIC_DRAW);Ga.program=e.createProgram();e.attachShader(Ga.program,
-aa("fragment",THREE.ShaderLib.shadowPost.fragmentShader));e.attachShader(Ga.program,aa("vertex",THREE.ShaderLib.shadowPost.vertexShader));e.linkProgram(Ga.program);Ga.vertexLocation=e.getAttribLocation(Ga.program,"position");Ga.projectionLocation=e.getUniformLocation(Ga.program,"projectionMatrix");Ga.darknessLocation=e.getUniformLocation(Ga.program,"darkness")}var ka={};ka.vertices=new Float32Array(16);ka.faces=new Uint16Array(6);b=0;ka.vertices[b++]=-1;ka.vertices[b++]=-1;ka.vertices[b++]=0;ka.vertices[b++]=
-0;ka.vertices[b++]=1;ka.vertices[b++]=-1;ka.vertices[b++]=1;ka.vertices[b++]=0;ka.vertices[b++]=1;ka.vertices[b++]=1;ka.vertices[b++]=1;ka.vertices[b++]=1;ka.vertices[b++]=-1;ka.vertices[b++]=1;ka.vertices[b++]=0;ka.vertices[b++]=1;b=0;ka.faces[b++]=0;ka.faces[b++]=1;ka.faces[b++]=2;ka.faces[b++]=0;ka.faces[b++]=2;ka.faces[b++]=3;ka.vertexBuffer=e.createBuffer();ka.elementBuffer=e.createBuffer();ka.tempTexture=e.createTexture();ka.occlusionTexture=e.createTexture();e.bindBuffer(e.ARRAY_BUFFER,ka.vertexBuffer);
-e.bufferData(e.ARRAY_BUFFER,ka.vertices,e.STATIC_DRAW);e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,ka.elementBuffer);e.bufferData(e.ELEMENT_ARRAY_BUFFER,ka.faces,e.STATIC_DRAW);e.bindTexture(e.TEXTURE_2D,ka.tempTexture);e.texImage2D(e.TEXTURE_2D,0,e.RGB,16,16,0,e.RGB,e.UNSIGNED_BYTE,null);e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE);e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE);e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.NEAREST);e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,
-e.NEAREST);e.bindTexture(e.TEXTURE_2D,ka.occlusionTexture);e.texImage2D(e.TEXTURE_2D,0,e.RGBA,16,16,0,e.RGBA,e.UNSIGNED_BYTE,null);e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE);e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE);e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.NEAREST);e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.NEAREST);if(e.getParameter(e.MAX_VERTEX_TEXTURE_IMAGE_UNITS)<=0){ka.hasVertexTexture=!1;ka.program=e.createProgram();e.attachShader(ka.program,
-aa("fragment",THREE.ShaderLib.lensFlare.fragmentShader));e.attachShader(ka.program,aa("vertex",THREE.ShaderLib.lensFlare.vertexShader))}else{ka.hasVertexTexture=!0;ka.program=e.createProgram();e.attachShader(ka.program,aa("fragment",THREE.ShaderLib.lensFlareVertexTexture.fragmentShader));e.attachShader(ka.program,aa("vertex",THREE.ShaderLib.lensFlareVertexTexture.vertexShader))}e.linkProgram(ka.program);ka.attributes={};ka.uniforms={};ka.attributes.vertex=e.getAttribLocation(ka.program,"position");
-ka.attributes.uv=e.getAttribLocation(ka.program,"UV");ka.uniforms.renderType=e.getUniformLocation(ka.program,"renderType");ka.uniforms.map=e.getUniformLocation(ka.program,"map");ka.uniforms.occlusionMap=e.getUniformLocation(ka.program,"occlusionMap");ka.uniforms.opacity=e.getUniformLocation(ka.program,"opacity");ka.uniforms.scale=e.getUniformLocation(ka.program,"scale");ka.uniforms.rotation=e.getUniformLocation(ka.program,"rotation");ka.uniforms.screenPosition=e.getUniformLocation(ka.program,"screenPosition");
-var ub=!1;_sprite={};_sprite.vertices=new Float32Array(16);_sprite.faces=new Uint16Array(6);b=0;_sprite.vertices[b++]=-1;_sprite.vertices[b++]=-1;_sprite.vertices[b++]=0;_sprite.vertices[b++]=0;_sprite.vertices[b++]=1;_sprite.vertices[b++]=-1;_sprite.vertices[b++]=1;_sprite.vertices[b++]=0;_sprite.vertices[b++]=1;_sprite.vertices[b++]=1;_sprite.vertices[b++]=1;_sprite.vertices[b++]=1;_sprite.vertices[b++]=-1;_sprite.vertices[b++]=1;_sprite.vertices[b++]=0;_sprite.vertices[b++]=1;b=0;_sprite.faces[b++]=
-0;_sprite.faces[b++]=1;_sprite.faces[b++]=2;_sprite.faces[b++]=0;_sprite.faces[b++]=2;_sprite.faces[b++]=3;_sprite.vertexBuffer=e.createBuffer();_sprite.elementBuffer=e.createBuffer();e.bindBuffer(e.ARRAY_BUFFER,_sprite.vertexBuffer);e.bufferData(e.ARRAY_BUFFER,_sprite.vertices,e.STATIC_DRAW);e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,_sprite.elementBuffer);e.bufferData(e.ELEMENT_ARRAY_BUFFER,_sprite.faces,e.STATIC_DRAW);_sprite.program=e.createProgram();e.attachShader(_sprite.program,aa("fragment",THREE.ShaderLib.sprite.fragmentShader));
-e.attachShader(_sprite.program,aa("vertex",THREE.ShaderLib.sprite.vertexShader));e.linkProgram(_sprite.program);_sprite.attributes={};_sprite.uniforms={};_sprite.attributes.position=e.getAttribLocation(_sprite.program,"position");_sprite.attributes.uv=e.getAttribLocation(_sprite.program,"uv");_sprite.uniforms.uvOffset=e.getUniformLocation(_sprite.program,"uvOffset");_sprite.uniforms.uvScale=e.getUniformLocation(_sprite.program,"uvScale");_sprite.uniforms.rotation=e.getUniformLocation(_sprite.program,
-"rotation");_sprite.uniforms.scale=e.getUniformLocation(_sprite.program,"scale");_sprite.uniforms.alignment=e.getUniformLocation(_sprite.program,"alignment");_sprite.uniforms.map=e.getUniformLocation(_sprite.program,"map");_sprite.uniforms.opacity=e.getUniformLocation(_sprite.program,"opacity");_sprite.uniforms.useScreenCoordinates=e.getUniformLocation(_sprite.program,"useScreenCoordinates");_sprite.uniforms.affectedByDistance=e.getUniformLocation(_sprite.program,"affectedByDistance");_sprite.uniforms.screenPosition=
-e.getUniformLocation(_sprite.program,"screenPosition");_sprite.uniforms.modelViewMatrix=e.getUniformLocation(_sprite.program,"modelViewMatrix");_sprite.uniforms.projectionMatrix=e.getUniformLocation(_sprite.program,"projectionMatrix");var lb=!1;this.setSize=function(n,D){L.width=n;L.height=D;this.setViewport(0,0,L.width,L.height)};this.setViewport=function(n,D,z,v){ra=n;oa=D;ea=z;Aa=v;e.viewport(ra,oa,ea,Aa)};this.setScissor=function(n,D,z,v){e.scissor(n,D,z,v)};this.enableScissorTest=function(n){n?
-e.enable(e.SCISSOR_TEST):e.disable(e.SCISSOR_TEST)};this.enableDepthBufferWrite=function(n){ca=n;e.depthMask(n)};this.setClearColorHex=function(n,D){la.setHex(n);Na=D;e.clearColor(la.r,la.g,la.b,Na)};this.setClearColor=function(n,D){la.copy(n);Na=D;e.clearColor(la.r,la.g,la.b,Na)};this.clear=function(){e.clear(e.COLOR_BUFFER_BIT|e.DEPTH_BUFFER_BIT|e.STENCIL_BUFFER_BIT)};this.setStencilShadowDarkness=function(n){Ga.darkness=n};this.getContext=function(){return e};this.initMaterial=function(n,D,z,v){var A,
-M,J;if(n instanceof THREE.MeshDepthMaterial)J="depth";else if(n instanceof THREE.ShadowVolumeDynamicMaterial)J="shadowVolumeDynamic";else if(n instanceof THREE.MeshNormalMaterial)J="normal";else if(n instanceof THREE.MeshBasicMaterial)J="basic";else if(n instanceof THREE.MeshLambertMaterial)J="lambert";else if(n instanceof THREE.MeshPhongMaterial)J="phong";else if(n instanceof THREE.LineBasicMaterial)J="basic";else n instanceof THREE.ParticleBasicMaterial&&(J="particle_basic");if(J){var G=THREE.ShaderLib[J];
-n.uniforms=THREE.UniformsUtils.clone(G.uniforms);n.vertexShader=G.vertexShader;n.fragmentShader=G.fragmentShader}var U,Y,B;U=B=G=0;for(Y=D.length;U<Y;U++){M=D[U];M instanceof THREE.DirectionalLight&&B++;M instanceof THREE.PointLight&&G++}if(G+B<=4)D=B;else{D=Math.ceil(4*B/(G+B));G=4-D}M={directional:D,point:G};B=50;if(v!==undefined&&v instanceof THREE.SkinnedMesh)B=v.bones.length;var K;a:{U=n.fragmentShader;Y=n.vertexShader;G=n.uniforms;D=n.attributes;z={map:!!n.map,envMap:!!n.envMap,lightMap:!!n.lightMap,
-vertexColors:n.vertexColors,fog:z,sizeAttenuation:n.sizeAttenuation,skinning:n.skinning,morphTargets:n.morphTargets,maxMorphTargets:this.maxMorphTargets,maxDirLights:M.directional,maxPointLights:M.point,maxBones:B};var W;M=[];if(J)M.push(J);else{M.push(U);M.push(Y)}for(W in z){M.push(W);M.push(z[W])}J=M.join();W=0;for(M=Ja.length;W<M;W++)if(Ja[W].code==J){K=Ja[W].program;break a}W=e.createProgram();prefix_fragment=["#ifdef GL_ES\nprecision highp float;\n#endif","#define MAX_DIR_LIGHTS "+z.maxDirLights,
-"#define MAX_POINT_LIGHTS "+z.maxPointLights,z.fog?"#define USE_FOG":"",z.fog instanceof THREE.FogExp2?"#define FOG_EXP2":"",z.map?"#define USE_MAP":"",z.envMap?"#define USE_ENVMAP":"",z.lightMap?"#define USE_LIGHTMAP":"",z.vertexColors?"#define USE_COLOR":"","uniform mat4 viewMatrix;\nuniform vec3 cameraPosition;\n"].join("\n");prefix_vertex=[hb?"#define VERTEX_TEXTURES":"","#define MAX_DIR_LIGHTS "+z.maxDirLights,"#define MAX_POINT_LIGHTS "+z.maxPointLights,"#define MAX_BONES "+z.maxBones,z.map?
-"#define USE_MAP":"",z.envMap?"#define USE_ENVMAP":"",z.lightMap?"#define USE_LIGHTMAP":"",z.vertexColors?"#define USE_COLOR":"",z.skinning?"#define USE_SKINNING":"",z.morphTargets?"#define USE_MORPHTARGETS":"",z.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");
+e.TEXTURE_WRAP_T,X(D.wrapT));e.texParameteri(n,e.TEXTURE_MAG_FILTER,X(D.magFilter));e.texParameteri(n,e.TEXTURE_MIN_FILTER,X(D.minFilter));e.generateMipmap(n)}else{e.texParameteri(n,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE);e.texParameteri(n,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE);e.texParameteri(n,e.TEXTURE_MAG_FILTER,ga(D.magFilter));e.texParameteri(n,e.TEXTURE_MIN_FILTER,ga(D.minFilter))}}function Q(n,D){if(n.needsUpdate){if(n.__webglTexture)n.__webglTexture=e.deleteTexture(n.__webglTexture);n.__webglTexture=
+e.createTexture();e.bindTexture(e.TEXTURE_2D,n.__webglTexture);e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,n.image);O(e.TEXTURE_2D,n,n.image);e.bindTexture(e.TEXTURE_2D,null);n.needsUpdate=!1}e.activeTexture(e.TEXTURE0+D);e.bindTexture(e.TEXTURE_2D,n.__webglTexture)}function ya(n){if(n&&!n.__webglFramebuffer){if(n.depthBuffer===undefined)n.depthBuffer=!0;if(n.stencilBuffer===undefined)n.stencilBuffer=!0;n.__webglFramebuffer=e.createFramebuffer();n.__webglRenderbuffer=e.createRenderbuffer();
+n.__webglTexture=e.createTexture();e.bindTexture(e.TEXTURE_2D,n.__webglTexture);e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,X(n.wrapS));e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,X(n.wrapT));e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,X(n.magFilter));e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,X(n.minFilter));e.texImage2D(e.TEXTURE_2D,0,X(n.format),n.width,n.height,0,X(n.format),X(n.type),null);e.bindRenderbuffer(e.RENDERBUFFER,n.__webglRenderbuffer);e.bindFramebuffer(e.FRAMEBUFFER,
+n.__webglFramebuffer);e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,n.__webglTexture,0);if(n.depthBuffer&&!n.stencilBuffer){e.renderbufferStorage(e.RENDERBUFFER,e.DEPTH_COMPONENT16,n.width,n.height);e.framebufferRenderbuffer(e.FRAMEBUFFER,e.DEPTH_ATTACHMENT,e.RENDERBUFFER,n.__webglRenderbuffer)}else if(n.depthBuffer&&n.stencilBuffer){e.renderbufferStorage(e.RENDERBUFFER,e.DEPTH_STENCIL,n.width,n.height);e.framebufferRenderbuffer(e.FRAMEBUFFER,e.DEPTH_STENCIL_ATTACHMENT,e.RENDERBUFFER,
+n.__webglRenderbuffer)}else e.renderbufferStorage(e.RENDERBUFFER,e.RGBA4,n.width,n.height);e.bindTexture(e.TEXTURE_2D,null);e.bindRenderbuffer(e.RENDERBUFFER,null);e.bindFramebuffer(e.FRAMEBUFFER,null)}var D,z;if(n){D=n.__webglFramebuffer;z=n.width;n=n.height}else{D=null;z=ea;n=Aa}if(D!=Da){e.bindFramebuffer(e.FRAMEBUFFER,D);e.viewport(ra,oa,z,n);Da=D}}function aa(n,D){var z;if(n=="fragment")z=e.createShader(e.FRAGMENT_SHADER);else n=="vertex"&&(z=e.createShader(e.VERTEX_SHADER));e.shaderSource(z,
+D);e.compileShader(z);if(!e.getShaderParameter(z,e.COMPILE_STATUS)){console.error(e.getShaderInfoLog(z));console.error(D);return null}return z}function ga(n){switch(n){case THREE.NearestFilter:case THREE.NearestMipMapNearestFilter:case THREE.NearestMipMapLinearFilter:return e.NEAREST;default:return e.LINEAR}}function X(n){switch(n){case THREE.RepeatWrapping:return e.REPEAT;case THREE.ClampToEdgeWrapping:return e.CLAMP_TO_EDGE;case THREE.MirroredRepeatWrapping:return e.MIRRORED_REPEAT;case THREE.NearestFilter:return e.NEAREST;
+case THREE.NearestMipMapNearestFilter:return e.NEAREST_MIPMAP_NEAREST;case THREE.NearestMipMapLinearFilter:return e.NEAREST_MIPMAP_LINEAR;case THREE.LinearFilter:return e.LINEAR;case THREE.LinearMipMapNearestFilter:return e.LINEAR_MIPMAP_NEAREST;case THREE.LinearMipMapLinearFilter:return e.LINEAR_MIPMAP_LINEAR;case THREE.ByteType:return e.BYTE;case THREE.UnsignedByteType:return e.UNSIGNED_BYTE;case THREE.ShortType:return e.SHORT;case THREE.UnsignedShortType:return e.UNSIGNED_SHORT;case THREE.IntType:return e.INT;
+case THREE.UnsignedShortType:return e.UNSIGNED_INT;case THREE.FloatType:return e.FLOAT;case THREE.AlphaFormat:return e.ALPHA;case THREE.RGBFormat:return e.RGB;case THREE.RGBAFormat:return e.RGBA;case THREE.LuminanceFormat:return e.LUMINANCE;case THREE.LuminanceAlphaFormat:return e.LUMINANCE_ALPHA}return 0}var ha=this,e,Ja=[],ta=null,Da=null,ca=!0,ua=null,da=null,sa=null,na=null,ra=0,oa=0,ea=0,Aa=0,Oa=[new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4],
+fa=new THREE.Matrix4,xa=new Float32Array(16),Ma=new Float32Array(16),Qa=new THREE.Vector4,Ua={ambient:[0,0,0],directional:{length:0,colors:[],positions:[]},point:{length:0,colors:[],positions:[],distances:[]}};b=b||{};var L=b.canvas!==undefined?b.canvas:document.createElement("canvas"),Z=b.stencil!==undefined?b.stencil:!0,ja=b.antialias!==undefined?b.antialias:!1,la=b.clearColor!==undefined?new THREE.Color(b.clearColor):new THREE.Color(0),Na=b.clearAlpha!==undefined?b.clearAlpha:0;this.data={vertices:0,
+faces:0,drawCalls:0};this.maxMorphTargets=8;this.domElement=L;this.autoClear=!0;this.sortObjects=!0;try{if(!(e=L.getContext("experimental-webgl",{antialias:ja,stencil:Z})))throw"Error creating WebGL context.";}catch(fb){console.error(fb)}console.log(navigator.userAgent+" | "+e.getParameter(e.VERSION)+" | "+e.getParameter(e.VENDOR)+" | "+e.getParameter(e.RENDERER)+" | "+e.getParameter(e.SHADING_LANGUAGE_VERSION));e.clearColor(0,0,0,1);e.clearDepth(1);e.enable(e.DEPTH_TEST);e.depthFunc(e.LEQUAL);e.frontFace(e.CCW);
+e.cullFace(e.BACK);e.enable(e.CULL_FACE);e.enable(e.BLEND);e.blendEquation(e.FUNC_ADD);e.blendFunc(e.SRC_ALPHA,e.ONE_MINUS_SRC_ALPHA);e.clearColor(la.r,la.g,la.b,Na);this.context=e;var hb=e.getParameter(e.MAX_VERTEX_TEXTURE_IMAGE_UNITS)>0;if(Z){var Ga={};Ga.vertices=new Float32Array(12);Ga.faces=new Uint16Array(6);Ga.darkness=0.5;Ga.vertices[0]=-20;Ga.vertices[1]=-20;Ga.vertices[2]=-1;Ga.vertices[3]=20;Ga.vertices[4]=-20;Ga.vertices[5]=-1;Ga.vertices[6]=20;Ga.vertices[7]=20;Ga.vertices[8]=-1;Ga.vertices[9]=
+-20;Ga.vertices[10]=20;Ga.vertices[11]=-1;Ga.faces[0]=0;Ga.faces[1]=1;Ga.faces[2]=2;Ga.faces[3]=0;Ga.faces[4]=2;Ga.faces[5]=3;Ga.vertexBuffer=e.createBuffer();Ga.elementBuffer=e.createBuffer();e.bindBuffer(e.ARRAY_BUFFER,Ga.vertexBuffer);e.bufferData(e.ARRAY_BUFFER,Ga.vertices,e.STATIC_DRAW);e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,Ga.elementBuffer);e.bufferData(e.ELEMENT_ARRAY_BUFFER,Ga.faces,e.STATIC_DRAW);Ga.program=e.createProgram();e.attachShader(Ga.program,aa("fragment",THREE.ShaderLib.shadowPost.fragmentShader));
+e.attachShader(Ga.program,aa("vertex",THREE.ShaderLib.shadowPost.vertexShader));e.linkProgram(Ga.program);Ga.vertexLocation=e.getAttribLocation(Ga.program,"position");Ga.projectionLocation=e.getUniformLocation(Ga.program,"projectionMatrix");Ga.darknessLocation=e.getUniformLocation(Ga.program,"darkness")}var ka={};ka.vertices=new Float32Array(16);ka.faces=new Uint16Array(6);b=0;ka.vertices[b++]=-1;ka.vertices[b++]=-1;ka.vertices[b++]=0;ka.vertices[b++]=0;ka.vertices[b++]=1;ka.vertices[b++]=-1;ka.vertices[b++]=
+1;ka.vertices[b++]=0;ka.vertices[b++]=1;ka.vertices[b++]=1;ka.vertices[b++]=1;ka.vertices[b++]=1;ka.vertices[b++]=-1;ka.vertices[b++]=1;ka.vertices[b++]=0;ka.vertices[b++]=1;b=0;ka.faces[b++]=0;ka.faces[b++]=1;ka.faces[b++]=2;ka.faces[b++]=0;ka.faces[b++]=2;ka.faces[b++]=3;ka.vertexBuffer=e.createBuffer();ka.elementBuffer=e.createBuffer();ka.tempTexture=e.createTexture();ka.occlusionTexture=e.createTexture();e.bindBuffer(e.ARRAY_BUFFER,ka.vertexBuffer);e.bufferData(e.ARRAY_BUFFER,ka.vertices,e.STATIC_DRAW);
+e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,ka.elementBuffer);e.bufferData(e.ELEMENT_ARRAY_BUFFER,ka.faces,e.STATIC_DRAW);e.bindTexture(e.TEXTURE_2D,ka.tempTexture);e.texImage2D(e.TEXTURE_2D,0,e.RGB,16,16,0,e.RGB,e.UNSIGNED_BYTE,null);e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE);e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE);e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.NEAREST);e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.NEAREST);e.bindTexture(e.TEXTURE_2D,
+ka.occlusionTexture);e.texImage2D(e.TEXTURE_2D,0,e.RGBA,16,16,0,e.RGBA,e.UNSIGNED_BYTE,null);e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE);e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE);e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.NEAREST);e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.NEAREST);if(e.getParameter(e.MAX_VERTEX_TEXTURE_IMAGE_UNITS)<=0){ka.hasVertexTexture=!1;ka.program=e.createProgram();e.attachShader(ka.program,aa("fragment",THREE.ShaderLib.lensFlare.fragmentShader));
+e.attachShader(ka.program,aa("vertex",THREE.ShaderLib.lensFlare.vertexShader))}else{ka.hasVertexTexture=!0;ka.program=e.createProgram();e.attachShader(ka.program,aa("fragment",THREE.ShaderLib.lensFlareVertexTexture.fragmentShader));e.attachShader(ka.program,aa("vertex",THREE.ShaderLib.lensFlareVertexTexture.vertexShader))}e.linkProgram(ka.program);ka.attributes={};ka.uniforms={};ka.attributes.vertex=e.getAttribLocation(ka.program,"position");ka.attributes.uv=e.getAttribLocation(ka.program,"UV");ka.uniforms.renderType=
+e.getUniformLocation(ka.program,"renderType");ka.uniforms.map=e.getUniformLocation(ka.program,"map");ka.uniforms.occlusionMap=e.getUniformLocation(ka.program,"occlusionMap");ka.uniforms.opacity=e.getUniformLocation(ka.program,"opacity");ka.uniforms.scale=e.getUniformLocation(ka.program,"scale");ka.uniforms.rotation=e.getUniformLocation(ka.program,"rotation");ka.uniforms.screenPosition=e.getUniformLocation(ka.program,"screenPosition");var ub=!1;_sprite={};_sprite.vertices=new Float32Array(16);_sprite.faces=
+new Uint16Array(6);b=0;_sprite.vertices[b++]=-1;_sprite.vertices[b++]=-1;_sprite.vertices[b++]=0;_sprite.vertices[b++]=0;_sprite.vertices[b++]=1;_sprite.vertices[b++]=-1;_sprite.vertices[b++]=1;_sprite.vertices[b++]=0;_sprite.vertices[b++]=1;_sprite.vertices[b++]=1;_sprite.vertices[b++]=1;_sprite.vertices[b++]=1;_sprite.vertices[b++]=-1;_sprite.vertices[b++]=1;_sprite.vertices[b++]=0;_sprite.vertices[b++]=1;b=0;_sprite.faces[b++]=0;_sprite.faces[b++]=1;_sprite.faces[b++]=2;_sprite.faces[b++]=0;_sprite.faces[b++]=
+2;_sprite.faces[b++]=3;_sprite.vertexBuffer=e.createBuffer();_sprite.elementBuffer=e.createBuffer();e.bindBuffer(e.ARRAY_BUFFER,_sprite.vertexBuffer);e.bufferData(e.ARRAY_BUFFER,_sprite.vertices,e.STATIC_DRAW);e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,_sprite.elementBuffer);e.bufferData(e.ELEMENT_ARRAY_BUFFER,_sprite.faces,e.STATIC_DRAW);_sprite.program=e.createProgram();e.attachShader(_sprite.program,aa("fragment",THREE.ShaderLib.sprite.fragmentShader));e.attachShader(_sprite.program,aa("vertex",THREE.ShaderLib.sprite.vertexShader));
+e.linkProgram(_sprite.program);_sprite.attributes={};_sprite.uniforms={};_sprite.attributes.position=e.getAttribLocation(_sprite.program,"position");_sprite.attributes.uv=e.getAttribLocation(_sprite.program,"uv");_sprite.uniforms.uvOffset=e.getUniformLocation(_sprite.program,"uvOffset");_sprite.uniforms.uvScale=e.getUniformLocation(_sprite.program,"uvScale");_sprite.uniforms.rotation=e.getUniformLocation(_sprite.program,"rotation");_sprite.uniforms.scale=e.getUniformLocation(_sprite.program,"scale");
+_sprite.uniforms.alignment=e.getUniformLocation(_sprite.program,"alignment");_sprite.uniforms.map=e.getUniformLocation(_sprite.program,"map");_sprite.uniforms.opacity=e.getUniformLocation(_sprite.program,"opacity");_sprite.uniforms.useScreenCoordinates=e.getUniformLocation(_sprite.program,"useScreenCoordinates");_sprite.uniforms.affectedByDistance=e.getUniformLocation(_sprite.program,"affectedByDistance");_sprite.uniforms.screenPosition=e.getUniformLocation(_sprite.program,"screenPosition");_sprite.uniforms.modelViewMatrix=
+e.getUniformLocation(_sprite.program,"modelViewMatrix");_sprite.uniforms.projectionMatrix=e.getUniformLocation(_sprite.program,"projectionMatrix");var lb=!1;this.setSize=function(n,D){L.width=n;L.height=D;this.setViewport(0,0,L.width,L.height)};this.setViewport=function(n,D,z,v){ra=n;oa=D;ea=z;Aa=v;e.viewport(ra,oa,ea,Aa)};this.setScissor=function(n,D,z,v){e.scissor(n,D,z,v)};this.enableScissorTest=function(n){n?e.enable(e.SCISSOR_TEST):e.disable(e.SCISSOR_TEST)};this.enableDepthBufferWrite=function(n){ca=
+n;e.depthMask(n)};this.setClearColorHex=function(n,D){la.setHex(n);Na=D;e.clearColor(la.r,la.g,la.b,Na)};this.setClearColor=function(n,D){la.copy(n);Na=D;e.clearColor(la.r,la.g,la.b,Na)};this.clear=function(){e.clear(e.COLOR_BUFFER_BIT|e.DEPTH_BUFFER_BIT|e.STENCIL_BUFFER_BIT)};this.setStencilShadowDarkness=function(n){Ga.darkness=n};this.getContext=function(){return e};this.initMaterial=function(n,D,z,v){var A,M,J;if(n instanceof THREE.MeshDepthMaterial)J="depth";else if(n instanceof THREE.ShadowVolumeDynamicMaterial)J=
+"shadowVolumeDynamic";else if(n instanceof THREE.MeshNormalMaterial)J="normal";else if(n instanceof THREE.MeshBasicMaterial)J="basic";else if(n instanceof THREE.MeshLambertMaterial)J="lambert";else if(n instanceof THREE.MeshPhongMaterial)J="phong";else if(n instanceof THREE.LineBasicMaterial)J="basic";else n instanceof THREE.ParticleBasicMaterial&&(J="particle_basic");if(J){var G=THREE.ShaderLib[J];n.uniforms=THREE.UniformsUtils.clone(G.uniforms);n.vertexShader=G.vertexShader;n.fragmentShader=G.fragmentShader}var U,
+Y,B;U=B=G=0;for(Y=D.length;U<Y;U++){M=D[U];M instanceof THREE.DirectionalLight&&B++;M instanceof THREE.PointLight&&G++}if(G+B<=4)D=B;else{D=Math.ceil(4*B/(G+B));G=4-D}M={directional:D,point:G};B=50;if(v!==undefined&&v instanceof THREE.SkinnedMesh)B=v.bones.length;var K;a:{U=n.fragmentShader;Y=n.vertexShader;G=n.uniforms;D=n.attributes;z={map:!!n.map,envMap:!!n.envMap,lightMap:!!n.lightMap,vertexColors:n.vertexColors,fog:z,sizeAttenuation:n.sizeAttenuation,skinning:n.skinning,morphTargets:n.morphTargets,
+maxMorphTargets:this.maxMorphTargets,maxDirLights:M.directional,maxPointLights:M.point,maxBones:B};var W;M=[];if(J)M.push(J);else{M.push(U);M.push(Y)}for(W in z){M.push(W);M.push(z[W])}J=M.join();W=0;for(M=Ja.length;W<M;W++)if(Ja[W].code==J){K=Ja[W].program;break a}W=e.createProgram();prefix_fragment=["#ifdef GL_ES\nprecision highp float;\n#endif","#define MAX_DIR_LIGHTS "+z.maxDirLights,"#define MAX_POINT_LIGHTS "+z.maxPointLights,z.fog?"#define USE_FOG":"",z.fog instanceof THREE.FogExp2?"#define FOG_EXP2":
+"",z.map?"#define USE_MAP":"",z.envMap?"#define USE_ENVMAP":"",z.lightMap?"#define USE_LIGHTMAP":"",z.vertexColors?"#define USE_COLOR":"","uniform mat4 viewMatrix;\nuniform vec3 cameraPosition;\n"].join("\n");prefix_vertex=[hb?"#define VERTEX_TEXTURES":"","#define MAX_DIR_LIGHTS "+z.maxDirLights,"#define MAX_POINT_LIGHTS "+z.maxPointLights,"#define MAX_BONES "+z.maxBones,z.map?"#define USE_MAP":"",z.envMap?"#define USE_ENVMAP":"",z.lightMap?"#define USE_LIGHTMAP":"",z.vertexColors?"#define USE_COLOR":
+"",z.skinning?"#define USE_SKINNING":"",z.morphTargets?"#define USE_MORPHTARGETS":"",z.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");
 e.attachShader(W,aa("fragment",prefix_fragment+U));e.attachShader(W,aa("vertex",prefix_vertex+Y));e.linkProgram(W);e.getProgramParameter(W,e.LINK_STATUS)||console.error("Could not initialise shader\nVALIDATE_STATUS: "+e.getProgramParameter(W,e.VALIDATE_STATUS)+", gl error ["+e.getError()+"]");W.uniforms={};W.attributes={};var ia;U=["viewMatrix","modelViewMatrix","projectionMatrix","normalMatrix","objectMatrix","cameraPosition","cameraInverseMatrix","boneGlobalMatrices","morphTargetInfluences"];for(ia in G)U.push(ia);
 ia=U;G=0;for(U=ia.length;G<U;G++){Y=ia[G];W.uniforms[Y]=e.getUniformLocation(W,Y)}U=["position","normal","uv","uv2","tangent","color","skinVertexA","skinVertexB","skinIndex","skinWeight"];for(ia=0;ia<z.maxMorphTargets;ia++)U.push("morphTarget"+ia);for(K in D)U.push(K);K=U;ia=0;for(D=K.length;ia<D;ia++){z=K[ia];W.attributes[z]=e.getAttribLocation(W,z)}Ja.push({program:W,code:J});K=W}n.program=K;K=n.program.attributes;K.position>=0&&e.enableVertexAttribArray(K.position);K.color>=0&&e.enableVertexAttribArray(K.color);
 K.normal>=0&&e.enableVertexAttribArray(K.normal);K.tangent>=0&&e.enableVertexAttribArray(K.tangent);if(n.skinning&&K.skinVertexA>=0&&K.skinVertexB>=0&&K.skinIndex>=0&&K.skinWeight>=0){e.enableVertexAttribArray(K.skinVertexA);e.enableVertexAttribArray(K.skinVertexB);e.enableVertexAttribArray(K.skinIndex);e.enableVertexAttribArray(K.skinWeight)}if(n.attributes)for(A in n.attributes)K[A]!==undefined&&K[A]>=0&&e.enableVertexAttribArray(K[A]);if(n.morphTargets){n.numSupportedMorphTargets=0;if(K.morphTarget0>=

+ 28 - 29
build/custom/ThreeWebGL.js

@@ -243,35 +243,34 @@ i[u];m=u*3;w[m]=color.r;w[m+1]=color.g;w[m+2]=color.b}c.bindBuffer(c.ARRAY_BUFFE
 u,z,D,n={},y=f.morphTargets!==undefined?f.morphTargets.length:0;f.geometryGroups={};m=0;for(x=f.faces.length;m<x;m++){w=f.faces[m];u=w.materials;z=t(u);n[z]==undefined&&(n[z]={hash:z,counter:0});D=n[z].hash+"_"+n[z].counter;f.geometryGroups[D]==undefined&&(f.geometryGroups[D]={faces:[],materials:u,vertices:0,numMorphTargets:y});w=w instanceof THREE.Face3?3:4;if(f.geometryGroups[D].vertices+w>65535){n[z].counter+=1;D=n[z].hash+"_"+n[z].counter;f.geometryGroups[D]==undefined&&(f.geometryGroups[D]={faces:[],
 materials:u,vertices:0,numMorphTargets:y})}f.geometryGroups[D].faces.push(m);f.geometryGroups[D].vertices+=w}}function W(f,t,k){f.push({buffer:t,object:k,opaque:{list:[],count:0},transparent:{list:[],count:0}})}function $(f){if(f!=ga){switch(f){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)}ga=f}}function X(f,t,k){if((k.width&k.width-1)==0&&(k.height&k.height-1)==0){c.texParameteri(f,c.TEXTURE_WRAP_S,ia(t.wrapS));c.texParameteri(f,c.TEXTURE_WRAP_T,ia(t.wrapT));c.texParameteri(f,c.TEXTURE_MAG_FILTER,ia(t.magFilter));c.texParameteri(f,c.TEXTURE_MIN_FILTER,ia(t.minFilter));c.generateMipmap(f)}else{c.texParameteri(f,
-c.TEXTURE_WRAP_S,c.CLAMP_TO_EDGE);c.texParameteri(f,c.TEXTURE_WRAP_T,c.CLAMP_TO_EDGE);c.texParameteri(f,c.TEXTURE_MAG_FILTER,Ea(t.magFilter));c.texParameteri(f,c.TEXTURE_MIN_FILTER,Ea(t.minFilter))}}function M(f,t){if(f.needsUpdate){if(f.__webglInit){c.bindTexture(c.TEXTURE_2D,f.__webglTexture);c.texSubImage2D(c.TEXTURE_2D,0,0,0,c.RGBA,c.UNSIGNED_BYTE,f.image)}else{f.__webglTexture=c.createTexture();c.bindTexture(c.TEXTURE_2D,f.__webglTexture);c.texImage2D(c.TEXTURE_2D,0,c.RGBA,c.RGBA,c.UNSIGNED_BYTE,
-f.image);f.__webglInit=!0}X(c.TEXTURE_2D,f,f.image);c.bindTexture(c.TEXTURE_2D,null);f.needsUpdate=!1}c.activeTexture(c.TEXTURE0+t);c.bindTexture(c.TEXTURE_2D,f.__webglTexture)}function Ia(f){if(f&&!f.__webglFramebuffer){if(f.depthBuffer===undefined)f.depthBuffer=!0;if(f.stencilBuffer===undefined)f.stencilBuffer=!0;f.__webglFramebuffer=c.createFramebuffer();f.__webglRenderbuffer=c.createRenderbuffer();f.__webglTexture=c.createTexture();c.bindTexture(c.TEXTURE_2D,f.__webglTexture);c.texParameteri(c.TEXTURE_2D,
-c.TEXTURE_WRAP_S,ia(f.wrapS));c.texParameteri(c.TEXTURE_2D,c.TEXTURE_WRAP_T,ia(f.wrapT));c.texParameteri(c.TEXTURE_2D,c.TEXTURE_MAG_FILTER,ia(f.magFilter));c.texParameteri(c.TEXTURE_2D,c.TEXTURE_MIN_FILTER,ia(f.minFilter));c.texImage2D(c.TEXTURE_2D,0,ia(f.format),f.width,f.height,0,ia(f.format),ia(f.type),null);c.bindRenderbuffer(c.RENDERBUFFER,f.__webglRenderbuffer);c.bindFramebuffer(c.FRAMEBUFFER,f.__webglFramebuffer);c.framebufferTexture2D(c.FRAMEBUFFER,c.COLOR_ATTACHMENT0,c.TEXTURE_2D,f.__webglTexture,
-0);if(f.depthBuffer&&!f.stencilBuffer){c.renderbufferStorage(c.RENDERBUFFER,c.DEPTH_COMPONENT16,f.width,f.height);c.framebufferRenderbuffer(c.FRAMEBUFFER,c.DEPTH_ATTACHMENT,c.RENDERBUFFER,f.__webglRenderbuffer)}else if(f.depthBuffer&&f.stencilBuffer){c.renderbufferStorage(c.RENDERBUFFER,c.DEPTH_STENCIL,f.width,f.height);c.framebufferRenderbuffer(c.FRAMEBUFFER,c.DEPTH_STENCIL_ATTACHMENT,c.RENDERBUFFER,f.__webglRenderbuffer)}else c.renderbufferStorage(c.RENDERBUFFER,c.RGBA4,f.width,f.height);c.bindTexture(c.TEXTURE_2D,
-null);c.bindRenderbuffer(c.RENDERBUFFER,null);c.bindFramebuffer(c.FRAMEBUFFER,null)}var t,k;if(f){t=f.__webglFramebuffer;k=f.width;f=f.height}else{t=null;k=fa;f=ua}if(t!=Fa){c.bindFramebuffer(c.FRAMEBUFFER,t);c.viewport(Y,xa,k,f);Fa=t}}function ea(f,t){var k;if(f=="fragment")k=c.createShader(c.FRAGMENT_SHADER);else f=="vertex"&&(k=c.createShader(c.VERTEX_SHADER));c.shaderSource(k,t);c.compileShader(k);if(!c.getShaderParameter(k,c.COMPILE_STATUS)){console.error(c.getShaderInfoLog(k));console.error(t);
-return null}return k}function Ea(f){switch(f){case THREE.NearestFilter:case THREE.NearestMipMapNearestFilter:case THREE.NearestMipMapLinearFilter:return c.NEAREST;default:return c.LINEAR}}function ia(f){switch(f){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 S=this,c,ra=[],ta=null,Fa=null,va=!0,ca=null,qa=null,ga=null,sa=null,Y=0,xa=0,fa=0,ua=0,za=[new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4],ja=new THREE.Matrix4,Qa=new Float32Array(16),Ua=new Float32Array(16),Va=new THREE.Vector4,ib={ambient:[0,0,0],directional:{length:0,
-colors:[],positions:[]},point:{length:0,colors:[],positions:[],distances:[]}};b=b||{};var Oa=b.canvas!==undefined?b.canvas:document.createElement("canvas"),$a=b.stencil!==undefined?b.stencil:!0,ab=b.antialias!==undefined?b.antialias:!1,Ta=b.clearColor!==undefined?new THREE.Color(b.clearColor):new THREE.Color(0),lb=b.clearAlpha!==undefined?b.clearAlpha:0;this.data={vertices:0,faces:0,drawCalls:0};this.maxMorphTargets=8;this.domElement=Oa;this.autoClear=!0;this.sortObjects=!0;try{if(!(c=Oa.getContext("experimental-webgl",
-{antialias:ab,stencil:$a})))throw"Error creating WebGL context.";}catch(Bb){console.error(Bb)}console.log(navigator.userAgent+" | "+c.getParameter(c.VERSION)+" | "+c.getParameter(c.VENDOR)+" | "+c.getParameter(c.RENDERER)+" | "+c.getParameter(c.SHADING_LANGUAGE_VERSION));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(Ta.r,Ta.g,Ta.b,lb);this.context=c;var zb=c.getParameter(c.MAX_VERTEX_TEXTURE_IMAGE_UNITS)>0;if($a){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,ea("fragment",THREE.ShaderLib.shadowPost.fragmentShader));c.attachShader(V.program,ea("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 N={};N.vertices=new Float32Array(16);N.faces=new Uint16Array(6);b=0;N.vertices[b++]=-1;N.vertices[b++]=-1;N.vertices[b++]=0;N.vertices[b++]=0;N.vertices[b++]=1;N.vertices[b++]=-1;N.vertices[b++]=1;N.vertices[b++]=0;N.vertices[b++]=1;N.vertices[b++]=1;N.vertices[b++]=1;N.vertices[b++]=1;N.vertices[b++]=-1;N.vertices[b++]=1;N.vertices[b++]=0;N.vertices[b++]=
-1;b=0;N.faces[b++]=0;N.faces[b++]=1;N.faces[b++]=2;N.faces[b++]=0;N.faces[b++]=2;N.faces[b++]=3;N.vertexBuffer=c.createBuffer();N.elementBuffer=c.createBuffer();N.tempTexture=c.createTexture();N.occlusionTexture=c.createTexture();c.bindBuffer(c.ARRAY_BUFFER,N.vertexBuffer);c.bufferData(c.ARRAY_BUFFER,N.vertices,c.STATIC_DRAW);c.bindBuffer(c.ELEMENT_ARRAY_BUFFER,N.elementBuffer);c.bufferData(c.ELEMENT_ARRAY_BUFFER,N.faces,c.STATIC_DRAW);c.bindTexture(c.TEXTURE_2D,N.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,N.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);if(c.getParameter(c.MAX_VERTEX_TEXTURE_IMAGE_UNITS)<=0){N.hasVertexTexture=!1;N.program=c.createProgram();c.attachShader(N.program,ea("fragment",THREE.ShaderLib.lensFlare.fragmentShader));c.attachShader(N.program,ea("vertex",THREE.ShaderLib.lensFlare.vertexShader))}else{N.hasVertexTexture=!0;N.program=c.createProgram();c.attachShader(N.program,
-ea("fragment",THREE.ShaderLib.lensFlareVertexTexture.fragmentShader));c.attachShader(N.program,ea("vertex",THREE.ShaderLib.lensFlareVertexTexture.vertexShader))}c.linkProgram(N.program);N.attributes={};N.uniforms={};N.attributes.vertex=c.getAttribLocation(N.program,"position");N.attributes.uv=c.getAttribLocation(N.program,"UV");N.uniforms.renderType=c.getUniformLocation(N.program,"renderType");N.uniforms.map=c.getUniformLocation(N.program,"map");N.uniforms.occlusionMap=c.getUniformLocation(N.program,
-"occlusionMap");N.uniforms.opacity=c.getUniformLocation(N.program,"opacity");N.uniforms.scale=c.getUniformLocation(N.program,"scale");N.uniforms.rotation=c.getUniformLocation(N.program,"rotation");N.uniforms.screenPosition=c.getUniformLocation(N.program,"screenPosition");var ub=!1;_sprite={};_sprite.vertices=new Float32Array(16);_sprite.faces=new Uint16Array(6);b=0;_sprite.vertices[b++]=-1;_sprite.vertices[b++]=-1;_sprite.vertices[b++]=0;_sprite.vertices[b++]=0;_sprite.vertices[b++]=1;_sprite.vertices[b++]=
--1;_sprite.vertices[b++]=1;_sprite.vertices[b++]=0;_sprite.vertices[b++]=1;_sprite.vertices[b++]=1;_sprite.vertices[b++]=1;_sprite.vertices[b++]=1;_sprite.vertices[b++]=-1;_sprite.vertices[b++]=1;_sprite.vertices[b++]=0;_sprite.vertices[b++]=1;b=0;_sprite.faces[b++]=0;_sprite.faces[b++]=1;_sprite.faces[b++]=2;_sprite.faces[b++]=0;_sprite.faces[b++]=2;_sprite.faces[b++]=3;_sprite.vertexBuffer=c.createBuffer();_sprite.elementBuffer=c.createBuffer();c.bindBuffer(c.ARRAY_BUFFER,_sprite.vertexBuffer);
-c.bufferData(c.ARRAY_BUFFER,_sprite.vertices,c.STATIC_DRAW);c.bindBuffer(c.ELEMENT_ARRAY_BUFFER,_sprite.elementBuffer);c.bufferData(c.ELEMENT_ARRAY_BUFFER,_sprite.faces,c.STATIC_DRAW);_sprite.program=c.createProgram();c.attachShader(_sprite.program,ea("fragment",THREE.ShaderLib.sprite.fragmentShader));c.attachShader(_sprite.program,ea("vertex",THREE.ShaderLib.sprite.vertexShader));c.linkProgram(_sprite.program);_sprite.attributes={};_sprite.uniforms={};_sprite.attributes.position=c.getAttribLocation(_sprite.program,
-"position");_sprite.attributes.uv=c.getAttribLocation(_sprite.program,"uv");_sprite.uniforms.uvOffset=c.getUniformLocation(_sprite.program,"uvOffset");_sprite.uniforms.uvScale=c.getUniformLocation(_sprite.program,"uvScale");_sprite.uniforms.rotation=c.getUniformLocation(_sprite.program,"rotation");_sprite.uniforms.scale=c.getUniformLocation(_sprite.program,"scale");_sprite.uniforms.alignment=c.getUniformLocation(_sprite.program,"alignment");_sprite.uniforms.map=c.getUniformLocation(_sprite.program,
-"map");_sprite.uniforms.opacity=c.getUniformLocation(_sprite.program,"opacity");_sprite.uniforms.useScreenCoordinates=c.getUniformLocation(_sprite.program,"useScreenCoordinates");_sprite.uniforms.affectedByDistance=c.getUniformLocation(_sprite.program,"affectedByDistance");_sprite.uniforms.screenPosition=c.getUniformLocation(_sprite.program,"screenPosition");_sprite.uniforms.modelViewMatrix=c.getUniformLocation(_sprite.program,"modelViewMatrix");_sprite.uniforms.projectionMatrix=c.getUniformLocation(_sprite.program,
-"projectionMatrix");var tb=!1;this.setSize=function(f,t){Oa.width=f;Oa.height=t;this.setViewport(0,0,Oa.width,Oa.height)};this.setViewport=function(f,t,k,i){Y=f;xa=t;fa=k;ua=i;c.viewport(Y,xa,fa,ua)};this.setScissor=function(f,t,k,i){c.scissor(f,t,k,i)};this.enableScissorTest=function(f){f?c.enable(c.SCISSOR_TEST):c.disable(c.SCISSOR_TEST)};this.enableDepthBufferWrite=function(f){va=f;c.depthMask(f)};this.setClearColorHex=function(f,t){Ta.setHex(f);lb=t;c.clearColor(Ta.r,Ta.g,Ta.b,lb)};this.setClearColor=
-function(f,t){Ta.copy(f);lb=t;c.clearColor(Ta.r,Ta.g,Ta.b,lb)};this.clear=function(){c.clear(c.COLOR_BUFFER_BIT|c.DEPTH_BUFFER_BIT|c.STENCIL_BUFFER_BIT)};this.setStencilShadowDarkness=function(f){V.darkness=f};this.getContext=function(){return c};this.initMaterial=function(f,t,k,i){var m,x,w;if(f instanceof THREE.MeshDepthMaterial)w="depth";else if(f instanceof THREE.ShadowVolumeDynamicMaterial)w="shadowVolumeDynamic";else if(f instanceof THREE.MeshNormalMaterial)w="normal";else if(f instanceof THREE.MeshBasicMaterial)w=
-"basic";else if(f instanceof THREE.MeshLambertMaterial)w="lambert";else if(f instanceof THREE.MeshPhongMaterial)w="phong";else if(f instanceof THREE.LineBasicMaterial)w="basic";else f instanceof THREE.ParticleBasicMaterial&&(w="particle_basic");if(w){var u=THREE.ShaderLib[w];f.uniforms=THREE.UniformsUtils.clone(u.uniforms);f.vertexShader=u.vertexShader;f.fragmentShader=u.fragmentShader}var z,D,n;z=n=u=0;for(D=t.length;z<D;z++){x=t[z];x instanceof THREE.DirectionalLight&&n++;x instanceof THREE.PointLight&&
-u++}if(u+n<=4)t=n;else{t=Math.ceil(4*n/(u+n));u=4-t}x={directional:t,point:u};n=50;if(i!==undefined&&i instanceof THREE.SkinnedMesh)n=i.bones.length;var y;a:{z=f.fragmentShader;D=f.vertexShader;u=f.uniforms;t=f.attributes;k={map:!!f.map,envMap:!!f.envMap,lightMap:!!f.lightMap,vertexColors:f.vertexColors,fog:k,sizeAttenuation:f.sizeAttenuation,skinning:f.skinning,morphTargets:f.morphTargets,maxMorphTargets:this.maxMorphTargets,maxDirLights:x.directional,maxPointLights:x.point,maxBones:n};var B;x=[];
-if(w)x.push(w);else{x.push(z);x.push(D)}for(B in k){x.push(B);x.push(k[B])}w=x.join();B=0;for(x=ra.length;B<x;B++)if(ra[B].code==w){y=ra[B].program;break a}B=c.createProgram();prefix_fragment=["#ifdef GL_ES\nprecision highp float;\n#endif","#define MAX_DIR_LIGHTS "+k.maxDirLights,"#define MAX_POINT_LIGHTS "+k.maxPointLights,k.fog?"#define USE_FOG":"",k.fog instanceof THREE.FogExp2?"#define FOG_EXP2":"",k.map?"#define USE_MAP":"",k.envMap?"#define USE_ENVMAP":"",k.lightMap?"#define USE_LIGHTMAP":"",
-k.vertexColors?"#define USE_COLOR":"","uniform mat4 viewMatrix;\nuniform vec3 cameraPosition;\n"].join("\n");prefix_vertex=[zb?"#define VERTEX_TEXTURES":"","#define MAX_DIR_LIGHTS "+k.maxDirLights,"#define MAX_POINT_LIGHTS "+k.maxPointLights,"#define MAX_BONES "+k.maxBones,k.map?"#define USE_MAP":"",k.envMap?"#define USE_ENVMAP":"",k.lightMap?"#define USE_LIGHTMAP":"",k.vertexColors?"#define USE_COLOR":"",k.skinning?"#define USE_SKINNING":"",k.morphTargets?"#define USE_MORPHTARGETS":"",k.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");
+c.TEXTURE_WRAP_S,c.CLAMP_TO_EDGE);c.texParameteri(f,c.TEXTURE_WRAP_T,c.CLAMP_TO_EDGE);c.texParameteri(f,c.TEXTURE_MAG_FILTER,Ea(t.magFilter));c.texParameteri(f,c.TEXTURE_MIN_FILTER,Ea(t.minFilter))}}function M(f,t){if(f.needsUpdate){if(f.__webglTexture)f.__webglTexture=c.deleteTexture(f.__webglTexture);f.__webglTexture=c.createTexture();c.bindTexture(c.TEXTURE_2D,f.__webglTexture);c.texImage2D(c.TEXTURE_2D,0,c.RGBA,c.RGBA,c.UNSIGNED_BYTE,f.image);X(c.TEXTURE_2D,f,f.image);c.bindTexture(c.TEXTURE_2D,
+null);f.needsUpdate=!1}c.activeTexture(c.TEXTURE0+t);c.bindTexture(c.TEXTURE_2D,f.__webglTexture)}function Ia(f){if(f&&!f.__webglFramebuffer){if(f.depthBuffer===undefined)f.depthBuffer=!0;if(f.stencilBuffer===undefined)f.stencilBuffer=!0;f.__webglFramebuffer=c.createFramebuffer();f.__webglRenderbuffer=c.createRenderbuffer();f.__webglTexture=c.createTexture();c.bindTexture(c.TEXTURE_2D,f.__webglTexture);c.texParameteri(c.TEXTURE_2D,c.TEXTURE_WRAP_S,ia(f.wrapS));c.texParameteri(c.TEXTURE_2D,c.TEXTURE_WRAP_T,
+ia(f.wrapT));c.texParameteri(c.TEXTURE_2D,c.TEXTURE_MAG_FILTER,ia(f.magFilter));c.texParameteri(c.TEXTURE_2D,c.TEXTURE_MIN_FILTER,ia(f.minFilter));c.texImage2D(c.TEXTURE_2D,0,ia(f.format),f.width,f.height,0,ia(f.format),ia(f.type),null);c.bindRenderbuffer(c.RENDERBUFFER,f.__webglRenderbuffer);c.bindFramebuffer(c.FRAMEBUFFER,f.__webglFramebuffer);c.framebufferTexture2D(c.FRAMEBUFFER,c.COLOR_ATTACHMENT0,c.TEXTURE_2D,f.__webglTexture,0);if(f.depthBuffer&&!f.stencilBuffer){c.renderbufferStorage(c.RENDERBUFFER,
+c.DEPTH_COMPONENT16,f.width,f.height);c.framebufferRenderbuffer(c.FRAMEBUFFER,c.DEPTH_ATTACHMENT,c.RENDERBUFFER,f.__webglRenderbuffer)}else if(f.depthBuffer&&f.stencilBuffer){c.renderbufferStorage(c.RENDERBUFFER,c.DEPTH_STENCIL,f.width,f.height);c.framebufferRenderbuffer(c.FRAMEBUFFER,c.DEPTH_STENCIL_ATTACHMENT,c.RENDERBUFFER,f.__webglRenderbuffer)}else c.renderbufferStorage(c.RENDERBUFFER,c.RGBA4,f.width,f.height);c.bindTexture(c.TEXTURE_2D,null);c.bindRenderbuffer(c.RENDERBUFFER,null);c.bindFramebuffer(c.FRAMEBUFFER,
+null)}var t,k;if(f){t=f.__webglFramebuffer;k=f.width;f=f.height}else{t=null;k=fa;f=ua}if(t!=Fa){c.bindFramebuffer(c.FRAMEBUFFER,t);c.viewport(Y,xa,k,f);Fa=t}}function ea(f,t){var k;if(f=="fragment")k=c.createShader(c.FRAGMENT_SHADER);else f=="vertex"&&(k=c.createShader(c.VERTEX_SHADER));c.shaderSource(k,t);c.compileShader(k);if(!c.getShaderParameter(k,c.COMPILE_STATUS)){console.error(c.getShaderInfoLog(k));console.error(t);return null}return k}function Ea(f){switch(f){case THREE.NearestFilter:case THREE.NearestMipMapNearestFilter:case THREE.NearestMipMapLinearFilter:return c.NEAREST;
+default:return c.LINEAR}}function ia(f){switch(f){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 S=this,c,ra=[],ta=null,Fa=null,va=!0,ca=null,qa=null,ga=null,sa=null,Y=0,xa=0,fa=0,ua=0,za=[new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4],ja=new THREE.Matrix4,Qa=new Float32Array(16),Ua=new Float32Array(16),Va=new THREE.Vector4,ib={ambient:[0,0,0],directional:{length:0,colors:[],positions:[]},point:{length:0,colors:[],positions:[],distances:[]}};b=b||{};var Oa=b.canvas!==undefined?b.canvas:document.createElement("canvas"),$a=b.stencil!==
+undefined?b.stencil:!0,ab=b.antialias!==undefined?b.antialias:!1,Ta=b.clearColor!==undefined?new THREE.Color(b.clearColor):new THREE.Color(0),lb=b.clearAlpha!==undefined?b.clearAlpha:0;this.data={vertices:0,faces:0,drawCalls:0};this.maxMorphTargets=8;this.domElement=Oa;this.autoClear=!0;this.sortObjects=!0;try{if(!(c=Oa.getContext("experimental-webgl",{antialias:ab,stencil:$a})))throw"Error creating WebGL context.";}catch(Bb){console.error(Bb)}console.log(navigator.userAgent+" | "+c.getParameter(c.VERSION)+
+" | "+c.getParameter(c.VENDOR)+" | "+c.getParameter(c.RENDERER)+" | "+c.getParameter(c.SHADING_LANGUAGE_VERSION));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(Ta.r,Ta.g,Ta.b,lb);this.context=c;var zb=c.getParameter(c.MAX_VERTEX_TEXTURE_IMAGE_UNITS)>0;if($a){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,ea("fragment",THREE.ShaderLib.shadowPost.fragmentShader));c.attachShader(V.program,ea("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 N={};N.vertices=
+new Float32Array(16);N.faces=new Uint16Array(6);b=0;N.vertices[b++]=-1;N.vertices[b++]=-1;N.vertices[b++]=0;N.vertices[b++]=0;N.vertices[b++]=1;N.vertices[b++]=-1;N.vertices[b++]=1;N.vertices[b++]=0;N.vertices[b++]=1;N.vertices[b++]=1;N.vertices[b++]=1;N.vertices[b++]=1;N.vertices[b++]=-1;N.vertices[b++]=1;N.vertices[b++]=0;N.vertices[b++]=1;b=0;N.faces[b++]=0;N.faces[b++]=1;N.faces[b++]=2;N.faces[b++]=0;N.faces[b++]=2;N.faces[b++]=3;N.vertexBuffer=c.createBuffer();N.elementBuffer=c.createBuffer();
+N.tempTexture=c.createTexture();N.occlusionTexture=c.createTexture();c.bindBuffer(c.ARRAY_BUFFER,N.vertexBuffer);c.bufferData(c.ARRAY_BUFFER,N.vertices,c.STATIC_DRAW);c.bindBuffer(c.ELEMENT_ARRAY_BUFFER,N.elementBuffer);c.bufferData(c.ELEMENT_ARRAY_BUFFER,N.faces,c.STATIC_DRAW);c.bindTexture(c.TEXTURE_2D,N.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,N.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);if(c.getParameter(c.MAX_VERTEX_TEXTURE_IMAGE_UNITS)<=
+0){N.hasVertexTexture=!1;N.program=c.createProgram();c.attachShader(N.program,ea("fragment",THREE.ShaderLib.lensFlare.fragmentShader));c.attachShader(N.program,ea("vertex",THREE.ShaderLib.lensFlare.vertexShader))}else{N.hasVertexTexture=!0;N.program=c.createProgram();c.attachShader(N.program,ea("fragment",THREE.ShaderLib.lensFlareVertexTexture.fragmentShader));c.attachShader(N.program,ea("vertex",THREE.ShaderLib.lensFlareVertexTexture.vertexShader))}c.linkProgram(N.program);N.attributes={};N.uniforms=
+{};N.attributes.vertex=c.getAttribLocation(N.program,"position");N.attributes.uv=c.getAttribLocation(N.program,"UV");N.uniforms.renderType=c.getUniformLocation(N.program,"renderType");N.uniforms.map=c.getUniformLocation(N.program,"map");N.uniforms.occlusionMap=c.getUniformLocation(N.program,"occlusionMap");N.uniforms.opacity=c.getUniformLocation(N.program,"opacity");N.uniforms.scale=c.getUniformLocation(N.program,"scale");N.uniforms.rotation=c.getUniformLocation(N.program,"rotation");N.uniforms.screenPosition=
+c.getUniformLocation(N.program,"screenPosition");var ub=!1;_sprite={};_sprite.vertices=new Float32Array(16);_sprite.faces=new Uint16Array(6);b=0;_sprite.vertices[b++]=-1;_sprite.vertices[b++]=-1;_sprite.vertices[b++]=0;_sprite.vertices[b++]=0;_sprite.vertices[b++]=1;_sprite.vertices[b++]=-1;_sprite.vertices[b++]=1;_sprite.vertices[b++]=0;_sprite.vertices[b++]=1;_sprite.vertices[b++]=1;_sprite.vertices[b++]=1;_sprite.vertices[b++]=1;_sprite.vertices[b++]=-1;_sprite.vertices[b++]=1;_sprite.vertices[b++]=
+0;_sprite.vertices[b++]=1;b=0;_sprite.faces[b++]=0;_sprite.faces[b++]=1;_sprite.faces[b++]=2;_sprite.faces[b++]=0;_sprite.faces[b++]=2;_sprite.faces[b++]=3;_sprite.vertexBuffer=c.createBuffer();_sprite.elementBuffer=c.createBuffer();c.bindBuffer(c.ARRAY_BUFFER,_sprite.vertexBuffer);c.bufferData(c.ARRAY_BUFFER,_sprite.vertices,c.STATIC_DRAW);c.bindBuffer(c.ELEMENT_ARRAY_BUFFER,_sprite.elementBuffer);c.bufferData(c.ELEMENT_ARRAY_BUFFER,_sprite.faces,c.STATIC_DRAW);_sprite.program=c.createProgram();
+c.attachShader(_sprite.program,ea("fragment",THREE.ShaderLib.sprite.fragmentShader));c.attachShader(_sprite.program,ea("vertex",THREE.ShaderLib.sprite.vertexShader));c.linkProgram(_sprite.program);_sprite.attributes={};_sprite.uniforms={};_sprite.attributes.position=c.getAttribLocation(_sprite.program,"position");_sprite.attributes.uv=c.getAttribLocation(_sprite.program,"uv");_sprite.uniforms.uvOffset=c.getUniformLocation(_sprite.program,"uvOffset");_sprite.uniforms.uvScale=c.getUniformLocation(_sprite.program,
+"uvScale");_sprite.uniforms.rotation=c.getUniformLocation(_sprite.program,"rotation");_sprite.uniforms.scale=c.getUniformLocation(_sprite.program,"scale");_sprite.uniforms.alignment=c.getUniformLocation(_sprite.program,"alignment");_sprite.uniforms.map=c.getUniformLocation(_sprite.program,"map");_sprite.uniforms.opacity=c.getUniformLocation(_sprite.program,"opacity");_sprite.uniforms.useScreenCoordinates=c.getUniformLocation(_sprite.program,"useScreenCoordinates");_sprite.uniforms.affectedByDistance=
+c.getUniformLocation(_sprite.program,"affectedByDistance");_sprite.uniforms.screenPosition=c.getUniformLocation(_sprite.program,"screenPosition");_sprite.uniforms.modelViewMatrix=c.getUniformLocation(_sprite.program,"modelViewMatrix");_sprite.uniforms.projectionMatrix=c.getUniformLocation(_sprite.program,"projectionMatrix");var tb=!1;this.setSize=function(f,t){Oa.width=f;Oa.height=t;this.setViewport(0,0,Oa.width,Oa.height)};this.setViewport=function(f,t,k,i){Y=f;xa=t;fa=k;ua=i;c.viewport(Y,xa,fa,
+ua)};this.setScissor=function(f,t,k,i){c.scissor(f,t,k,i)};this.enableScissorTest=function(f){f?c.enable(c.SCISSOR_TEST):c.disable(c.SCISSOR_TEST)};this.enableDepthBufferWrite=function(f){va=f;c.depthMask(f)};this.setClearColorHex=function(f,t){Ta.setHex(f);lb=t;c.clearColor(Ta.r,Ta.g,Ta.b,lb)};this.setClearColor=function(f,t){Ta.copy(f);lb=t;c.clearColor(Ta.r,Ta.g,Ta.b,lb)};this.clear=function(){c.clear(c.COLOR_BUFFER_BIT|c.DEPTH_BUFFER_BIT|c.STENCIL_BUFFER_BIT)};this.setStencilShadowDarkness=function(f){V.darkness=
+f};this.getContext=function(){return c};this.initMaterial=function(f,t,k,i){var m,x,w;if(f instanceof THREE.MeshDepthMaterial)w="depth";else if(f instanceof THREE.ShadowVolumeDynamicMaterial)w="shadowVolumeDynamic";else if(f instanceof THREE.MeshNormalMaterial)w="normal";else if(f instanceof THREE.MeshBasicMaterial)w="basic";else if(f instanceof THREE.MeshLambertMaterial)w="lambert";else if(f instanceof THREE.MeshPhongMaterial)w="phong";else if(f instanceof THREE.LineBasicMaterial)w="basic";else f instanceof
+THREE.ParticleBasicMaterial&&(w="particle_basic");if(w){var u=THREE.ShaderLib[w];f.uniforms=THREE.UniformsUtils.clone(u.uniforms);f.vertexShader=u.vertexShader;f.fragmentShader=u.fragmentShader}var z,D,n;z=n=u=0;for(D=t.length;z<D;z++){x=t[z];x instanceof THREE.DirectionalLight&&n++;x instanceof THREE.PointLight&&u++}if(u+n<=4)t=n;else{t=Math.ceil(4*n/(u+n));u=4-t}x={directional:t,point:u};n=50;if(i!==undefined&&i instanceof THREE.SkinnedMesh)n=i.bones.length;var y;a:{z=f.fragmentShader;D=f.vertexShader;
+u=f.uniforms;t=f.attributes;k={map:!!f.map,envMap:!!f.envMap,lightMap:!!f.lightMap,vertexColors:f.vertexColors,fog:k,sizeAttenuation:f.sizeAttenuation,skinning:f.skinning,morphTargets:f.morphTargets,maxMorphTargets:this.maxMorphTargets,maxDirLights:x.directional,maxPointLights:x.point,maxBones:n};var B;x=[];if(w)x.push(w);else{x.push(z);x.push(D)}for(B in k){x.push(B);x.push(k[B])}w=x.join();B=0;for(x=ra.length;B<x;B++)if(ra[B].code==w){y=ra[B].program;break a}B=c.createProgram();prefix_fragment=
+["#ifdef GL_ES\nprecision highp float;\n#endif","#define MAX_DIR_LIGHTS "+k.maxDirLights,"#define MAX_POINT_LIGHTS "+k.maxPointLights,k.fog?"#define USE_FOG":"",k.fog instanceof THREE.FogExp2?"#define FOG_EXP2":"",k.map?"#define USE_MAP":"",k.envMap?"#define USE_ENVMAP":"",k.lightMap?"#define USE_LIGHTMAP":"",k.vertexColors?"#define USE_COLOR":"","uniform mat4 viewMatrix;\nuniform vec3 cameraPosition;\n"].join("\n");prefix_vertex=[zb?"#define VERTEX_TEXTURES":"","#define MAX_DIR_LIGHTS "+k.maxDirLights,
+"#define MAX_POINT_LIGHTS "+k.maxPointLights,"#define MAX_BONES "+k.maxBones,k.map?"#define USE_MAP":"",k.envMap?"#define USE_ENVMAP":"",k.lightMap?"#define USE_LIGHTMAP":"",k.vertexColors?"#define USE_COLOR":"",k.skinning?"#define USE_SKINNING":"",k.morphTargets?"#define USE_MORPHTARGETS":"",k.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");
 c.attachShader(B,ea("fragment",prefix_fragment+z));c.attachShader(B,ea("vertex",prefix_vertex+D));c.linkProgram(B);c.getProgramParameter(B,c.LINK_STATUS)||console.error("Could not initialise shader\nVALIDATE_STATUS: "+c.getProgramParameter(B,c.VALIDATE_STATUS)+", gl error ["+c.getError()+"]");B.uniforms={};B.attributes={};var K;z=["viewMatrix","modelViewMatrix","projectionMatrix","normalMatrix","objectMatrix","cameraPosition","cameraInverseMatrix","boneGlobalMatrices","morphTargetInfluences"];for(K in u)z.push(K);
 K=z;u=0;for(z=K.length;u<z;u++){D=K[u];B.uniforms[D]=c.getUniformLocation(B,D)}z=["position","normal","uv","uv2","tangent","color","skinVertexA","skinVertexB","skinIndex","skinWeight"];for(K=0;K<k.maxMorphTargets;K++)z.push("morphTarget"+K);for(y in t)z.push(y);y=z;K=0;for(t=y.length;K<t;K++){k=y[K];B.attributes[k]=c.getAttribLocation(B,k)}ra.push({program:B,code:w});y=B}f.program=y;y=f.program.attributes;y.position>=0&&c.enableVertexAttribArray(y.position);y.color>=0&&c.enableVertexAttribArray(y.color);
 y.normal>=0&&c.enableVertexAttribArray(y.normal);y.tangent>=0&&c.enableVertexAttribArray(y.tangent);if(f.skinning&&y.skinVertexA>=0&&y.skinVertexB>=0&&y.skinIndex>=0&&y.skinWeight>=0){c.enableVertexAttribArray(y.skinVertexA);c.enableVertexAttribArray(y.skinVertexB);c.enableVertexAttribArray(y.skinIndex);c.enableVertexAttribArray(y.skinWeight)}if(f.attributes)for(m in f.attributes)y[m]!==undefined&&y[m]>=0&&c.enableVertexAttribArray(y[m]);if(f.morphTargets){f.numSupportedMorphTargets=0;if(y.morphTarget0>=

+ 26 - 0
src/renderers/WebGLRenderer.js

@@ -4641,6 +4641,7 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 	function setTexture( texture, slot ) {
 
+		/*
 		if ( texture.needsUpdate ) {
 
 			if ( !texture.__webglInit ) {
@@ -4669,6 +4670,31 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 		_gl.activeTexture( _gl.TEXTURE0 + slot );
 		_gl.bindTexture( _gl.TEXTURE_2D, texture.__webglTexture );
+		*/
+
+		if ( texture.needsUpdate ) {
+
+			if ( texture.__webglTexture ) {
+
+				texture.__webglTexture = _gl.deleteTexture( texture.__webglTexture );
+
+			}
+
+			texture.__webglTexture = _gl.createTexture();
+
+			_gl.bindTexture( _gl.TEXTURE_2D, texture.__webglTexture );
+			_gl.texImage2D( _gl.TEXTURE_2D, 0, _gl.RGBA, _gl.RGBA, _gl.UNSIGNED_BYTE, texture.image );
+
+			setTextureParameters( _gl.TEXTURE_2D, texture, texture.image );
+
+			_gl.bindTexture( _gl.TEXTURE_2D, null );
+
+			texture.needsUpdate = false;
+
+		}
+
+		_gl.activeTexture( _gl.TEXTURE0 + slot );
+		_gl.bindTexture( _gl.TEXTURE_2D, texture.__webglTexture );
 
 	};