Browse Source

Removed internal variables _projectionMatrixArray and _viewMatrixArray from WebGLRenderer and render plugins.

These are not needed anymore as matrix elements are directly usable for uniforms.
alteredq 12 years ago
parent
commit
3d4b2c9566

+ 3 - 21
build/three.js

@@ -19490,14 +19490,8 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 
 		if ( camera.parent === undefined ) camera.updateMatrixWorld();
 		if ( camera.parent === undefined ) camera.updateMatrixWorld();
 
 
-		if ( ! camera._viewMatrixArray ) camera._viewMatrixArray = new Float32Array( 16 );
-		if ( ! camera._projectionMatrixArray ) camera._projectionMatrixArray = new Float32Array( 16 );
-
 		camera.matrixWorldInverse.getInverse( camera.matrixWorld );
 		camera.matrixWorldInverse.getInverse( camera.matrixWorld );
 
 
-		camera.matrixWorldInverse.flattenToArray( camera._viewMatrixArray );
-		camera.projectionMatrix.flattenToArray( camera._projectionMatrixArray );
-
 		_projScreenMatrix.multiply( camera.projectionMatrix, camera.matrixWorldInverse );
 		_projScreenMatrix.multiply( camera.projectionMatrix, camera.matrixWorldInverse );
 		_frustum.setFromMatrix( _projScreenMatrix );
 		_frustum.setFromMatrix( _projScreenMatrix );
 
 
@@ -20616,7 +20610,7 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 
 		if ( refreshMaterial || camera !== _currentCamera ) {
 		if ( refreshMaterial || camera !== _currentCamera ) {
 
 
-			_gl.uniformMatrix4fv( p_uniforms.projectionMatrix, false, camera._projectionMatrixArray );
+			_gl.uniformMatrix4fv( p_uniforms.projectionMatrix, false, camera.projectionMatrix.elements );
 
 
 			if ( camera !== _currentCamera ) _currentCamera = camera;
 			if ( camera !== _currentCamera ) _currentCamera = camera;
 
 
@@ -20752,7 +20746,7 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 
 				if ( p_uniforms.viewMatrix !== null ) {
 				if ( p_uniforms.viewMatrix !== null ) {
 
 
-					_gl.uniformMatrix4fv( p_uniforms.viewMatrix, false, camera._viewMatrixArray );
+					_gl.uniformMatrix4fv( p_uniforms.viewMatrix, false, camera.matrixWorldInverse.elements );
 
 
 				}
 				}
 
 
@@ -34296,12 +34290,6 @@ THREE.ShadowMapPlugin = function ( ) {
 
 
 			// update camera matrices and frustum
 			// update camera matrices and frustum
 
 
-			if ( ! shadowCamera._viewMatrixArray ) shadowCamera._viewMatrixArray = new Float32Array( 16 );
-			if ( ! shadowCamera._projectionMatrixArray ) shadowCamera._projectionMatrixArray = new Float32Array( 16 );
-
-			shadowCamera.matrixWorldInverse.flattenToArray( shadowCamera._viewMatrixArray );
-			shadowCamera.projectionMatrix.flattenToArray( shadowCamera._projectionMatrixArray );
-
 			_projScreenMatrix.multiply( shadowCamera.projectionMatrix, shadowCamera.matrixWorldInverse );
 			_projScreenMatrix.multiply( shadowCamera.projectionMatrix, shadowCamera.matrixWorldInverse );
 			_frustum.setFromMatrix( _projScreenMatrix );
 			_frustum.setFromMatrix( _projScreenMatrix );
 
 
@@ -34687,7 +34675,7 @@ THREE.SpritePlugin = function ( ) {
 
 
 		_gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, _sprite.elementBuffer );
 		_gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, _sprite.elementBuffer );
 
 
-		_gl.uniformMatrix4fv( uniforms.projectionMatrix, false, camera._projectionMatrixArray );
+		_gl.uniformMatrix4fv( uniforms.projectionMatrix, false, camera.projectionMatrix.elements );
 
 
 		_gl.activeTexture( _gl.TEXTURE0 );
 		_gl.activeTexture( _gl.TEXTURE0 );
 		_gl.uniform1i( uniforms.map, 0 );
 		_gl.uniform1i( uniforms.map, 0 );
@@ -34937,14 +34925,8 @@ THREE.DepthPassPlugin = function ( ) {
 
 
 		// update camera matrices and frustum
 		// update camera matrices and frustum
 
 
-		if ( ! camera._viewMatrixArray ) camera._viewMatrixArray = new Float32Array( 16 );
-		if ( ! camera._projectionMatrixArray ) camera._projectionMatrixArray = new Float32Array( 16 );
-
 		camera.matrixWorldInverse.getInverse( camera.matrixWorld );
 		camera.matrixWorldInverse.getInverse( camera.matrixWorld );
 
 
-		camera.matrixWorldInverse.flattenToArray( camera._viewMatrixArray );
-		camera.projectionMatrix.flattenToArray( camera._projectionMatrixArray );
-
 		_projScreenMatrix.multiply( camera.projectionMatrix, camera.matrixWorldInverse );
 		_projScreenMatrix.multiply( camera.projectionMatrix, camera.matrixWorldInverse );
 		_frustum.setFromMatrix( _projScreenMatrix );
 		_frustum.setFromMatrix( _projScreenMatrix );
 
 

+ 82 - 82
build/three.min.js

@@ -57,9 +57,9 @@ b,c){this.set(a,0,0,0,0,b,0,0,0,0,c,0,0,0,0,1);return this},makeFrustum:function
 h;g[4]=0;g[8]=0;g[12]=-((b+a)/h);g[1]=0;g[5]=2/i;g[9]=0;g[13]=-((c+d)/i);g[2]=0;g[6]=0;g[10]=-2/j;g[14]=-((f+e)/j);g[3]=0;g[7]=0;g[11]=0;g[15]=1;return this},clone:function(){var a=this.elements;return new THREE.Matrix4(a[0],a[4],a[8],a[12],a[1],a[5],a[9],a[13],a[2],a[6],a[10],a[14],a[3],a[7],a[11],a[15])}};THREE.Matrix4.__v1=new THREE.Vector3;THREE.Matrix4.__v2=new THREE.Vector3;THREE.Matrix4.__v3=new THREE.Vector3;THREE.Matrix4.__m1=new THREE.Matrix4;THREE.Matrix4.__m2=new THREE.Matrix4;THREE.EventTarget=function(){var a={};this.addEventListener=function(b,c){void 0===a[b]&&(a[b]=[]);-1===a[b].indexOf(c)&&a[b].push(c)};this.dispatchEvent=function(b){var c=a[b.type];if(void 0!==c)for(var d=0,e=c.length;d<e;d++)c[d](b)};this.removeEventListener=function(b,c){var d=a[b].indexOf(c);-1!==d&&a[b].splice(d,1)}};THREE.Frustum=function(){this.planes=[new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4]};
 h;g[4]=0;g[8]=0;g[12]=-((b+a)/h);g[1]=0;g[5]=2/i;g[9]=0;g[13]=-((c+d)/i);g[2]=0;g[6]=0;g[10]=-2/j;g[14]=-((f+e)/j);g[3]=0;g[7]=0;g[11]=0;g[15]=1;return this},clone:function(){var a=this.elements;return new THREE.Matrix4(a[0],a[4],a[8],a[12],a[1],a[5],a[9],a[13],a[2],a[6],a[10],a[14],a[3],a[7],a[11],a[15])}};THREE.Matrix4.__v1=new THREE.Vector3;THREE.Matrix4.__v2=new THREE.Vector3;THREE.Matrix4.__v3=new THREE.Vector3;THREE.Matrix4.__m1=new THREE.Matrix4;THREE.Matrix4.__m2=new THREE.Matrix4;THREE.EventTarget=function(){var a={};this.addEventListener=function(b,c){void 0===a[b]&&(a[b]=[]);-1===a[b].indexOf(c)&&a[b].push(c)};this.dispatchEvent=function(b){var c=a[b.type];if(void 0!==c)for(var d=0,e=c.length;d<e;d++)c[d](b)};this.removeEventListener=function(b,c){var d=a[b].indexOf(c);-1!==d&&a[b].splice(d,1)}};THREE.Frustum=function(){this.planes=[new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4]};
 THREE.Frustum.prototype.setFromMatrix=function(a){var b=this.planes,c=a.elements,a=c[0],d=c[1],e=c[2],f=c[3],g=c[4],h=c[5],i=c[6],j=c[7],l=c[8],m=c[9],n=c[10],p=c[11],q=c[12],r=c[13],u=c[14],c=c[15];b[0].set(f-a,j-g,p-l,c-q);b[1].set(f+a,j+g,p+l,c+q);b[2].set(f+d,j+h,p+m,c+r);b[3].set(f-d,j-h,p-m,c-r);b[4].set(f-e,j-i,p-n,c-u);b[5].set(f+e,j+i,p+n,c+u);for(d=0;6>d;d++)a=b[d],a.divideScalar(Math.sqrt(a.x*a.x+a.y*a.y+a.z*a.z))};
 THREE.Frustum.prototype.setFromMatrix=function(a){var b=this.planes,c=a.elements,a=c[0],d=c[1],e=c[2],f=c[3],g=c[4],h=c[5],i=c[6],j=c[7],l=c[8],m=c[9],n=c[10],p=c[11],q=c[12],r=c[13],u=c[14],c=c[15];b[0].set(f-a,j-g,p-l,c-q);b[1].set(f+a,j+g,p+l,c+q);b[2].set(f+d,j+h,p+m,c+r);b[3].set(f-d,j-h,p-m,c-r);b[4].set(f-e,j-i,p-n,c-u);b[5].set(f+e,j+i,p+n,c+u);for(d=0;6>d;d++)a=b[d],a.divideScalar(Math.sqrt(a.x*a.x+a.y*a.y+a.z*a.z))};
 THREE.Frustum.prototype.contains=function(a){for(var b=0,c=this.planes,b=a.matrixWorld,d=b.elements,a=-a.geometry.boundingSphere.radius*b.getMaxScaleOnAxis(),e=0;6>e;e++)if(b=c[e].x*d[12]+c[e].y*d[13]+c[e].z*d[14]+c[e].w,b<=a)return!1;return!0};THREE.Frustum.__v1=new THREE.Vector3;(function(a){a.Ray=function(b,c,d,e){this.origin=b||new a.Vector3;this.direction=c||new a.Vector3;this.near=d||0;this.far=e||Infinity};var b=new a.Vector3,c=new a.Vector3,d=new a.Vector3,e=new a.Vector3;new a.Vector3;var f=new a.Vector3,g=new a.Matrix4,h=function(a,b){return a.distance-b.distance},i=new a.Vector3,j=new a.Vector3,l=new a.Vector3,m=function(a,b,c){i.sub(c,a);var d=i.dot(b),a=j.add(a,l.copy(b).multiplyScalar(d));return c.distanceTo(a)},n=function(a,b,c,d){i.sub(d,b);j.sub(c,b);l.sub(a,
 THREE.Frustum.prototype.contains=function(a){for(var b=0,c=this.planes,b=a.matrixWorld,d=b.elements,a=-a.geometry.boundingSphere.radius*b.getMaxScaleOnAxis(),e=0;6>e;e++)if(b=c[e].x*d[12]+c[e].y*d[13]+c[e].z*d[14]+c[e].w,b<=a)return!1;return!0};THREE.Frustum.__v1=new THREE.Vector3;(function(a){a.Ray=function(b,c,d,e){this.origin=b||new a.Vector3;this.direction=c||new a.Vector3;this.near=d||0;this.far=e||Infinity};var b=new a.Vector3,c=new a.Vector3,d=new a.Vector3,e=new a.Vector3;new a.Vector3;var f=new a.Vector3,g=new a.Matrix4,h=function(a,b){return a.distance-b.distance},i=new a.Vector3,j=new a.Vector3,l=new a.Vector3,m=function(a,b,c){i.sub(c,a);var d=i.dot(b),a=j.add(a,l.copy(b).multiplyScalar(d));return c.distanceTo(a)},n=function(a,b,c,d){i.sub(d,b);j.sub(c,b);l.sub(a,
-b);var a=i.dot(i),b=i.dot(j),c=i.dot(l),e=j.dot(j),d=j.dot(l),f=1/(a*e-b*b),e=(e*c-b*d)*f,a=(a*d-b*c)*f;return 0<=e&&0<=a&&1>e+a},p=function(h,i,j){if(h instanceof a.Particle){var l=m(i.origin,i.direction,h.matrixWorld.getPosition());if(l>h.scale.x)return j;j.push({distance:l,point:h.position,face:null,object:h})}else if(h instanceof a.Mesh){var p=h.geometry.boundingSphere.radius*h.matrixWorld.getMaxScaleOnAxis(),l=m(i.origin,i.direction,h.matrixWorld.getPosition());if(l>p)return j;var p=h.geometry,
-q=p.vertices,F=h.material instanceof a.MeshFaceMaterial,A=!0===F?h.material.materials:null,l=h.material.side,v,z,E,B=i.precision;h.matrixRotationWorld.extractRotation(h.matrixWorld);b.copy(i.origin);g.getInverse(h.matrixWorld);c.copy(b);g.multiplyVector3(c);d.copy(i.direction);g.rotateAxis(d).normalize();for(var J=0,K=p.faces.length;J<K;J++){var C=p.faces[J],l=!0===F?A[C.materialIndex]:h.material;if(void 0!==l&&(l=l.side,e.sub(C.centroid,c),z=C.normal,v=d.dot(z),!(Math.abs(v)<B)&&(z=z.dot(e)/v,!(0>
-z)&&(l===a.DoubleSide||(l===a.FrontSide?0>v:0<v)))))if(f.add(c,d.multiplyScalar(z)),C instanceof a.Face3)l=q[C.a],v=q[C.b],z=q[C.c],n(f,l,v,z)&&(v=h.matrixWorld.multiplyVector3(f.clone()),l=b.distanceTo(v),l<i.near||l>i.far||j.push({distance:l,point:v,face:C,faceIndex:J,object:h}));else if(C instanceof a.Face4&&(l=q[C.a],v=q[C.b],z=q[C.c],E=q[C.d],n(f,l,v,E)||n(f,v,z,E)))v=h.matrixWorld.multiplyVector3(f.clone()),l=b.distanceTo(v),l<i.near||l>i.far||j.push({distance:l,point:v,face:C,faceIndex:J,object:h})}}},
+b);var a=i.dot(i),b=i.dot(j),c=i.dot(l),e=j.dot(j),d=j.dot(l),f=1/(a*e-b*b),e=(e*c-b*d)*f,a=(a*d-b*c)*f;return 0<=e&&0<=a&&1>e+a},p=function(h,i,l){if(h instanceof a.Particle){var j=m(i.origin,i.direction,h.matrixWorld.getPosition());if(j>h.scale.x)return l;l.push({distance:j,point:h.position,face:null,object:h})}else if(h instanceof a.Mesh){var p=h.geometry.boundingSphere.radius*h.matrixWorld.getMaxScaleOnAxis(),j=m(i.origin,i.direction,h.matrixWorld.getPosition());if(j>p)return l;var p=h.geometry,
+q=p.vertices,F=h.material instanceof a.MeshFaceMaterial,A=!0===F?h.material.materials:null,j=h.material.side,v,z,E,B=i.precision;h.matrixRotationWorld.extractRotation(h.matrixWorld);b.copy(i.origin);g.getInverse(h.matrixWorld);c.copy(b);g.multiplyVector3(c);d.copy(i.direction);g.rotateAxis(d).normalize();for(var J=0,K=p.faces.length;J<K;J++){var C=p.faces[J],j=!0===F?A[C.materialIndex]:h.material;if(void 0!==j&&(j=j.side,e.sub(C.centroid,c),z=C.normal,v=d.dot(z),!(Math.abs(v)<B)&&(z=z.dot(e)/v,!(0>
+z)&&(j===a.DoubleSide||(j===a.FrontSide?0>v:0<v)))))if(f.add(c,d.multiplyScalar(z)),C instanceof a.Face3)j=q[C.a],v=q[C.b],z=q[C.c],n(f,j,v,z)&&(v=h.matrixWorld.multiplyVector3(f.clone()),j=b.distanceTo(v),j<i.near||j>i.far||l.push({distance:j,point:v,face:C,faceIndex:J,object:h}));else if(C instanceof a.Face4&&(j=q[C.a],v=q[C.b],z=q[C.c],E=q[C.d],n(f,j,v,E)||n(f,v,z,E)))v=h.matrixWorld.multiplyVector3(f.clone()),j=b.distanceTo(v),j<i.near||j>i.far||l.push({distance:j,point:v,face:C,faceIndex:J,object:h})}}},
 q=function(a,b,c){for(var a=a.getDescendants(),d=0,e=a.length;d<e;d++)p(a[d],b,c)};a.Ray.prototype.precision=1E-4;a.Ray.prototype.set=function(a,b){this.origin=a;this.direction=b};a.Ray.prototype.intersectObject=function(a,b){var c=[];!0===b&&q(a,this,c);p(a,this,c);c.sort(h);return c};a.Ray.prototype.intersectObjects=function(a,b){for(var c=[],d=0,e=a.length;d<e;d++)p(a[d],this,c),!0===b&&q(a[d],this,c);c.sort(h);return c}})(THREE);THREE.Rectangle=function(){function a(){f=d-b;g=e-c}var b=0,c=0,d=0,e=0,f=0,g=0,h=!0;this.getX=function(){return b};this.getY=function(){return c};this.getWidth=function(){return f};this.getHeight=function(){return g};this.getLeft=function(){return b};this.getTop=function(){return c};this.getRight=function(){return d};this.getBottom=function(){return e};this.set=function(f,g,l,m){h=!1;b=f;c=g;d=l;e=m;a()};this.addPoint=function(f,g){!0===h?(h=!1,b=f,c=g,d=f,e=g):(b=b<f?b:f,c=c<g?c:g,d=d>f?d:f,e=e>
 q=function(a,b,c){for(var a=a.getDescendants(),d=0,e=a.length;d<e;d++)p(a[d],b,c)};a.Ray.prototype.precision=1E-4;a.Ray.prototype.set=function(a,b){this.origin=a;this.direction=b};a.Ray.prototype.intersectObject=function(a,b){var c=[];!0===b&&q(a,this,c);p(a,this,c);c.sort(h);return c};a.Ray.prototype.intersectObjects=function(a,b){for(var c=[],d=0,e=a.length;d<e;d++)p(a[d],this,c),!0===b&&q(a[d],this,c);c.sort(h);return c}})(THREE);THREE.Rectangle=function(){function a(){f=d-b;g=e-c}var b=0,c=0,d=0,e=0,f=0,g=0,h=!0;this.getX=function(){return b};this.getY=function(){return c};this.getWidth=function(){return f};this.getHeight=function(){return g};this.getLeft=function(){return b};this.getTop=function(){return c};this.getRight=function(){return d};this.getBottom=function(){return e};this.set=function(f,g,l,m){h=!1;b=f;c=g;d=l;e=m;a()};this.addPoint=function(f,g){!0===h?(h=!1,b=f,c=g,d=f,e=g):(b=b<f?b:f,c=c<g?c:g,d=d>f?d:f,e=e>
 g?e:g);a()};this.add3Points=function(f,g,l,m,n,p){!0===h?(h=!1,b=f<l?f<n?f:n:l<n?l:n,c=g<m?g<p?g:p:m<p?m:p,d=f>l?f>n?f:n:l>n?l:n,e=g>m?g>p?g:p:m>p?m:p):(b=f<l?f<n?f<b?f:b:n<b?n:b:l<n?l<b?l:b:n<b?n:b,c=g<m?g<p?g<c?g:c:p<c?p:c:m<p?m<c?m:c:p<c?p:c,d=f>l?f>n?f>d?f:d:n>d?n:d:l>n?l>d?l:d:n>d?n:d,e=g>m?g>p?g>e?g:e:p>e?p:e:m>p?m>e?m:e:p>e?p:e);a()};this.addRectangle=function(f){!0===h?(h=!1,b=f.getLeft(),c=f.getTop(),d=f.getRight(),e=f.getBottom()):(b=b<f.getLeft()?b:f.getLeft(),c=c<f.getTop()?c:f.getTop(),
 g?e:g);a()};this.add3Points=function(f,g,l,m,n,p){!0===h?(h=!1,b=f<l?f<n?f:n:l<n?l:n,c=g<m?g<p?g:p:m<p?m:p,d=f>l?f>n?f:n:l>n?l:n,e=g>m?g>p?g:p:m>p?m:p):(b=f<l?f<n?f<b?f:b:n<b?n:b:l<n?l<b?l:b:n<b?n:b,c=g<m?g<p?g<c?g:c:p<c?p:c:m<p?m<c?m:c:p<c?p:c,d=f>l?f>n?f>d?f:d:n>d?n:d:l>n?l>d?l:d:n>d?n:d,e=g>m?g>p?g>e?g:e:p>e?p:e:m>p?m>e?m:e:p>e?p:e);a()};this.addRectangle=function(f){!0===h?(h=!1,b=f.getLeft(),c=f.getTop(),d=f.getRight(),e=f.getBottom()):(b=b<f.getLeft()?b:f.getLeft(),c=c<f.getTop()?c:f.getTop(),
 d=d>f.getRight()?d:f.getRight(),e=e>f.getBottom()?e:f.getBottom());a()};this.inflate=function(f){b-=f;c-=f;d+=f;e+=f;a()};this.minSelf=function(f){b=b>f.getLeft()?b:f.getLeft();c=c>f.getTop()?c:f.getTop();d=d<f.getRight()?d:f.getRight();e=e<f.getBottom()?e:f.getBottom();a()};this.intersects=function(a){return d<a.getLeft()||b>a.getRight()||e<a.getTop()||c>a.getBottom()?!1:!0};this.empty=function(){h=!0;e=d=c=b=0;a()};this.isEmpty=function(){return h}};THREE.Math={clamp:function(a,b,c){return a<b?b:a>c?c:a},clampBottom:function(a,b){return a<b?b:a},mapLinear:function(a,b,c,d,e){return d+(a-b)*(e-d)/(c-b)},random16:function(){return(65280*Math.random()+255*Math.random())/65535},randInt:function(a,b){return a+Math.floor(Math.random()*(b-a+1))},randFloat:function(a,b){return a+Math.random()*(b-a)},randFloatSpread:function(a){return a*(0.5-Math.random())},sign:function(a){return 0>a?-1:0<a?1:0}};THREE.Object3D=function(){THREE.Object3DLibrary.push(this);this.id=THREE.Object3DIdCount++;this.name="";this.properties={};this.parent=void 0;this.children=[];this.up=new THREE.Vector3(0,1,0);this.position=new THREE.Vector3;this.rotation=new THREE.Vector3;this.eulerOrder=THREE.Object3D.defaultEulerOrder;this.scale=new THREE.Vector3(1,1,1);this.renderDepth=null;this.rotationAutoUpdate=!0;this.matrix=new THREE.Matrix4;this.matrixWorld=new THREE.Matrix4;this.matrixRotationWorld=new THREE.Matrix4;this.matrixWorldNeedsUpdate=
 d=d>f.getRight()?d:f.getRight(),e=e>f.getBottom()?e:f.getBottom());a()};this.inflate=function(f){b-=f;c-=f;d+=f;e+=f;a()};this.minSelf=function(f){b=b>f.getLeft()?b:f.getLeft();c=c>f.getTop()?c:f.getTop();d=d<f.getRight()?d:f.getRight();e=e<f.getBottom()?e:f.getBottom();a()};this.intersects=function(a){return d<a.getLeft()||b>a.getRight()||e<a.getTop()||c>a.getBottom()?!1:!0};this.empty=function(){h=!0;e=d=c=b=0;a()};this.isEmpty=function(){return h}};THREE.Math={clamp:function(a,b,c){return a<b?b:a>c?c:a},clampBottom:function(a,b){return a<b?b:a},mapLinear:function(a,b,c,d,e){return d+(a-b)*(e-d)/(c-b)},random16:function(){return(65280*Math.random()+255*Math.random())/65535},randInt:function(a,b){return a+Math.floor(Math.random()*(b-a+1))},randFloat:function(a,b){return a+Math.random()*(b-a)},randFloatSpread:function(a){return a*(0.5-Math.random())},sign:function(a){return 0>a?-1:0<a?1:0}};THREE.Object3D=function(){THREE.Object3DLibrary.push(this);this.id=THREE.Object3DIdCount++;this.name="";this.properties={};this.parent=void 0;this.children=[];this.up=new THREE.Vector3(0,1,0);this.position=new THREE.Vector3;this.rotation=new THREE.Vector3;this.eulerOrder=THREE.Object3D.defaultEulerOrder;this.scale=new THREE.Vector3(1,1,1);this.renderDepth=null;this.rotationAutoUpdate=!0;this.matrix=new THREE.Matrix4;this.matrixWorld=new THREE.Matrix4;this.matrixRotationWorld=new THREE.Matrix4;this.matrixWorldNeedsUpdate=
@@ -140,11 +140,11 @@ j.uSpecularColor.value.setHex(i.specular),j.uAmbientColor.value.setHex(i.ambient
 THREE.BinaryLoader.prototype.loadAjaxJSON=function(a,b,c,d,e,f){var g=new XMLHttpRequest;g.onreadystatechange=function(){if(4==g.readyState)if(200==g.status||0==g.status){var h=JSON.parse(g.responseText);a.loadAjaxBuffers(h,c,e,d,f)}else console.error("THREE.BinaryLoader: Couldn't load ["+b+"] ["+g.status+"]")};g.open("GET",b,!0);g.send(null)};
 THREE.BinaryLoader.prototype.loadAjaxJSON=function(a,b,c,d,e,f){var g=new XMLHttpRequest;g.onreadystatechange=function(){if(4==g.readyState)if(200==g.status||0==g.status){var h=JSON.parse(g.responseText);a.loadAjaxBuffers(h,c,e,d,f)}else console.error("THREE.BinaryLoader: Couldn't load ["+b+"] ["+g.status+"]")};g.open("GET",b,!0);g.send(null)};
 THREE.BinaryLoader.prototype.loadAjaxBuffers=function(a,b,c,d,e){var f=new XMLHttpRequest,g=c+"/"+a.buffers,h=0;f.onreadystatechange=function(){if(4==f.readyState)if(200==f.status||0==f.status){var c=f.response;void 0===c&&(c=(new Uint8Array(f.responseBody)).buffer);THREE.BinaryLoader.prototype.createBinModel(c,b,d,a.materials)}else console.error("THREE.BinaryLoader: Couldn't load ["+g+"] ["+f.status+"]");else 3==f.readyState?e&&(0==h&&(h=f.getResponseHeader("Content-Length")),e({total:h,loaded:f.responseText.length})):
 THREE.BinaryLoader.prototype.loadAjaxBuffers=function(a,b,c,d,e){var f=new XMLHttpRequest,g=c+"/"+a.buffers,h=0;f.onreadystatechange=function(){if(4==f.readyState)if(200==f.status||0==f.status){var c=f.response;void 0===c&&(c=(new Uint8Array(f.responseBody)).buffer);THREE.BinaryLoader.prototype.createBinModel(c,b,d,a.materials)}else console.error("THREE.BinaryLoader: Couldn't load ["+g+"] ["+f.status+"]");else 3==f.readyState?e&&(0==h&&(h=f.getResponseHeader("Content-Length")),e({total:h,loaded:f.responseText.length})):
 2==f.readyState&&(h=f.getResponseHeader("Content-Length"))};f.open("GET",g,!0);f.responseType="arraybuffer";f.send(null)};
 2==f.readyState&&(h=f.getResponseHeader("Content-Length"))};f.open("GET",g,!0);f.responseType="arraybuffer";f.send(null)};
-THREE.BinaryLoader.prototype.createBinModel=function(a,b,c,d){var e=function(){var b,c,d,e,j,l,m,n,p,q,r,u,s,D,x,t;function F(a){return a%4?4-a%4:0}function A(a,b){return(new Uint8Array(a,b,1))[0]}function v(a,b){return(new Uint32Array(a,b,1))[0]}function z(b,c){var d,e,f,g,h,i,l,j=new Uint32Array(a,c,3*b);for(d=0;d<b;d++)e=j[3*d],f=j[3*d+1],g=j[3*d+2],h=Q[2*e],e=Q[2*e+1],i=Q[2*f],l=Q[2*f+1],f=Q[2*g],g=Q[2*g+1],L.faceVertexUvs[0].push([new THREE.UV(h,e),new THREE.UV(i,l),new THREE.UV(f,g)])}function E(b,
-c){var d,e,f,g,h,i,l,j,n,m=new Uint32Array(a,c,4*b);for(d=0;d<b;d++)e=m[4*d],f=m[4*d+1],g=m[4*d+2],h=m[4*d+3],i=Q[2*e],e=Q[2*e+1],l=Q[2*f],j=Q[2*f+1],f=Q[2*g],n=Q[2*g+1],g=Q[2*h],h=Q[2*h+1],L.faceVertexUvs[0].push([new THREE.UV(i,e),new THREE.UV(l,j),new THREE.UV(f,n),new THREE.UV(g,h)])}function B(b,c,d){for(var e,f,g,h,c=new Uint32Array(a,c,3*b),i=new Uint16Array(a,d,b),d=0;d<b;d++)e=c[3*d],f=c[3*d+1],g=c[3*d+2],h=i[d],L.faces.push(new THREE.Face3(e,f,g,null,null,h))}function J(b,c,d){for(var e,
-f,g,h,i,c=new Uint32Array(a,c,4*b),l=new Uint16Array(a,d,b),d=0;d<b;d++)e=c[4*d],f=c[4*d+1],g=c[4*d+2],h=c[4*d+3],i=l[d],L.faces.push(new THREE.Face4(e,f,g,h,null,null,i))}function K(b,c,d,e){for(var f,g,h,i,l,j,n,c=new Uint32Array(a,c,3*b),d=new Uint32Array(a,d,3*b),m=new Uint16Array(a,e,b),e=0;e<b;e++){f=c[3*e];g=c[3*e+1];h=c[3*e+2];l=d[3*e];j=d[3*e+1];n=d[3*e+2];i=m[e];var p=M[3*j],q=M[3*j+1];j=M[3*j+2];var r=M[3*n],s=M[3*n+1];n=M[3*n+2];L.faces.push(new THREE.Face3(f,g,h,[new THREE.Vector3(M[3*
-l],M[3*l+1],M[3*l+2]),new THREE.Vector3(p,q,j),new THREE.Vector3(r,s,n)],null,i))}}function C(b,c,d,e){for(var f,g,h,i,l,j,n,m,p,c=new Uint32Array(a,c,4*b),d=new Uint32Array(a,d,4*b),q=new Uint16Array(a,e,b),e=0;e<b;e++){f=c[4*e];g=c[4*e+1];h=c[4*e+2];i=c[4*e+3];j=d[4*e];n=d[4*e+1];m=d[4*e+2];p=d[4*e+3];l=q[e];var r=M[3*n],s=M[3*n+1];n=M[3*n+2];var t=M[3*m],u=M[3*m+1];m=M[3*m+2];var v=M[3*p],x=M[3*p+1];p=M[3*p+2];L.faces.push(new THREE.Face4(f,g,h,i,[new THREE.Vector3(M[3*j],M[3*j+1],M[3*j+2]),new THREE.Vector3(r,
-s,n),new THREE.Vector3(t,u,m),new THREE.Vector3(v,x,p)],null,l))}}var L=this,I=0,M=[],Q=[],O,R,T;THREE.Geometry.call(this);t=a;R=I;D=new Uint8Array(t,R,12);q="";for(s=0;12>s;s++)q+=String.fromCharCode(D[R+s]);b=A(t,R+12);A(t,R+13);A(t,R+14);A(t,R+15);c=A(t,R+16);d=A(t,R+17);e=A(t,R+18);j=A(t,R+19);l=v(t,R+20);m=v(t,R+20+4);n=v(t,R+20+8);p=v(t,R+20+12);q=v(t,R+20+16);r=v(t,R+20+20);u=v(t,R+20+24);s=v(t,R+20+28);D=v(t,R+20+32);x=v(t,R+20+36);t=v(t,R+20+40);I+=b;R=3*c+j;T=4*c+j;O=p*R;b=q*(R+3*d);c=r*
+THREE.BinaryLoader.prototype.createBinModel=function(a,b,c,d){var e=function(){var b,c,d,e,j,l,m,n,p,q,r,u,s,D,x,t;function F(a){return a%4?4-a%4:0}function A(a,b){return(new Uint8Array(a,b,1))[0]}function v(a,b){return(new Uint32Array(a,b,1))[0]}function z(b,c){var d,e,f,g,h,i,j,l=new Uint32Array(a,c,3*b);for(d=0;d<b;d++)e=l[3*d],f=l[3*d+1],g=l[3*d+2],h=Q[2*e],e=Q[2*e+1],i=Q[2*f],j=Q[2*f+1],f=Q[2*g],g=Q[2*g+1],L.faceVertexUvs[0].push([new THREE.UV(h,e),new THREE.UV(i,j),new THREE.UV(f,g)])}function E(b,
+c){var d,e,f,g,h,i,j,l,n,m=new Uint32Array(a,c,4*b);for(d=0;d<b;d++)e=m[4*d],f=m[4*d+1],g=m[4*d+2],h=m[4*d+3],i=Q[2*e],e=Q[2*e+1],j=Q[2*f],l=Q[2*f+1],f=Q[2*g],n=Q[2*g+1],g=Q[2*h],h=Q[2*h+1],L.faceVertexUvs[0].push([new THREE.UV(i,e),new THREE.UV(j,l),new THREE.UV(f,n),new THREE.UV(g,h)])}function B(b,c,d){for(var e,f,g,h,c=new Uint32Array(a,c,3*b),i=new Uint16Array(a,d,b),d=0;d<b;d++)e=c[3*d],f=c[3*d+1],g=c[3*d+2],h=i[d],L.faces.push(new THREE.Face3(e,f,g,null,null,h))}function J(b,c,d){for(var e,
+f,g,h,i,c=new Uint32Array(a,c,4*b),j=new Uint16Array(a,d,b),d=0;d<b;d++)e=c[4*d],f=c[4*d+1],g=c[4*d+2],h=c[4*d+3],i=j[d],L.faces.push(new THREE.Face4(e,f,g,h,null,null,i))}function K(b,c,d,e){for(var f,g,h,i,j,l,n,c=new Uint32Array(a,c,3*b),d=new Uint32Array(a,d,3*b),m=new Uint16Array(a,e,b),e=0;e<b;e++){f=c[3*e];g=c[3*e+1];h=c[3*e+2];j=d[3*e];l=d[3*e+1];n=d[3*e+2];i=m[e];var p=M[3*l],q=M[3*l+1];l=M[3*l+2];var r=M[3*n],s=M[3*n+1];n=M[3*n+2];L.faces.push(new THREE.Face3(f,g,h,[new THREE.Vector3(M[3*
+j],M[3*j+1],M[3*j+2]),new THREE.Vector3(p,q,l),new THREE.Vector3(r,s,n)],null,i))}}function C(b,c,d,e){for(var f,g,h,i,j,l,n,m,p,c=new Uint32Array(a,c,4*b),d=new Uint32Array(a,d,4*b),q=new Uint16Array(a,e,b),e=0;e<b;e++){f=c[4*e];g=c[4*e+1];h=c[4*e+2];i=c[4*e+3];l=d[4*e];n=d[4*e+1];m=d[4*e+2];p=d[4*e+3];j=q[e];var r=M[3*n],s=M[3*n+1];n=M[3*n+2];var t=M[3*m],u=M[3*m+1];m=M[3*m+2];var v=M[3*p],x=M[3*p+1];p=M[3*p+2];L.faces.push(new THREE.Face4(f,g,h,i,[new THREE.Vector3(M[3*l],M[3*l+1],M[3*l+2]),new THREE.Vector3(r,
+s,n),new THREE.Vector3(t,u,m),new THREE.Vector3(v,x,p)],null,j))}}var L=this,I=0,M=[],Q=[],O,R,T;THREE.Geometry.call(this);t=a;R=I;D=new Uint8Array(t,R,12);q="";for(s=0;12>s;s++)q+=String.fromCharCode(D[R+s]);b=A(t,R+12);A(t,R+13);A(t,R+14);A(t,R+15);c=A(t,R+16);d=A(t,R+17);e=A(t,R+18);j=A(t,R+19);l=v(t,R+20);m=v(t,R+20+4);n=v(t,R+20+8);p=v(t,R+20+12);q=v(t,R+20+16);r=v(t,R+20+20);u=v(t,R+20+24);s=v(t,R+20+28);D=v(t,R+20+32);x=v(t,R+20+36);t=v(t,R+20+40);I+=b;R=3*c+j;T=4*c+j;O=p*R;b=q*(R+3*d);c=r*
 (R+3*e);j=u*(R+3*d+3*e);R=s*T;d=D*(T+4*d);e=x*(T+4*e);T=I;var I=new Float32Array(a,I,3*l),N,P,S,aa;for(N=0;N<l;N++)P=I[3*N],S=I[3*N+1],aa=I[3*N+2],L.vertices.push(new THREE.Vector3(P,S,aa));l=I=T+3*l*Float32Array.BYTES_PER_ELEMENT;if(m){I=new Int8Array(a,I,3*m);for(T=0;T<m;T++)N=I[3*T],P=I[3*T+1],S=I[3*T+2],M.push(N/127,P/127,S/127)}I=l+3*m*Int8Array.BYTES_PER_ELEMENT;m=I+=F(3*m);if(n){l=new Float32Array(a,I,2*n);for(I=0;I<n;I++)T=l[2*I],N=l[2*I+1],Q.push(T,N)}n=I=m+2*n*Float32Array.BYTES_PER_ELEMENT;
 (R+3*e);j=u*(R+3*d+3*e);R=s*T;d=D*(T+4*d);e=x*(T+4*e);T=I;var I=new Float32Array(a,I,3*l),N,P,S,aa;for(N=0;N<l;N++)P=I[3*N],S=I[3*N+1],aa=I[3*N+2],L.vertices.push(new THREE.Vector3(P,S,aa));l=I=T+3*l*Float32Array.BYTES_PER_ELEMENT;if(m){I=new Int8Array(a,I,3*m);for(T=0;T<m;T++)N=I[3*T],P=I[3*T+1],S=I[3*T+2],M.push(N/127,P/127,S/127)}I=l+3*m*Int8Array.BYTES_PER_ELEMENT;m=I+=F(3*m);if(n){l=new Float32Array(a,I,2*n);for(I=0;I<n;I++)T=l[2*I],N=l[2*I+1],Q.push(T,N)}n=I=m+2*n*Float32Array.BYTES_PER_ELEMENT;
 O=n+O+F(2*p);m=O+b+F(2*q);b=m+c+F(2*r);c=b+j+F(2*u);R=c+R+F(2*s);j=R+d+F(2*D);d=j+e+F(2*x);r&&(e=m+3*r*Uint32Array.BYTES_PER_ELEMENT,B(r,m,e+3*r*Uint32Array.BYTES_PER_ELEMENT),z(r,e));u&&(r=b+3*u*Uint32Array.BYTES_PER_ELEMENT,e=r+3*u*Uint32Array.BYTES_PER_ELEMENT,K(u,b,r,e+3*u*Uint32Array.BYTES_PER_ELEMENT),z(u,e));x&&(u=j+4*x*Uint32Array.BYTES_PER_ELEMENT,J(x,j,u+4*x*Uint32Array.BYTES_PER_ELEMENT),E(x,u));t&&(x=d+4*t*Uint32Array.BYTES_PER_ELEMENT,u=x+4*t*Uint32Array.BYTES_PER_ELEMENT,C(t,d,x,u+4*
 O=n+O+F(2*p);m=O+b+F(2*q);b=m+c+F(2*r);c=b+j+F(2*u);R=c+R+F(2*s);j=R+d+F(2*D);d=j+e+F(2*x);r&&(e=m+3*r*Uint32Array.BYTES_PER_ELEMENT,B(r,m,e+3*r*Uint32Array.BYTES_PER_ELEMENT),z(r,e));u&&(r=b+3*u*Uint32Array.BYTES_PER_ELEMENT,e=r+3*u*Uint32Array.BYTES_PER_ELEMENT,K(u,b,r,e+3*u*Uint32Array.BYTES_PER_ELEMENT),z(u,e));x&&(u=j+4*x*Uint32Array.BYTES_PER_ELEMENT,J(x,j,u+4*x*Uint32Array.BYTES_PER_ELEMENT),E(x,u));t&&(x=d+4*t*Uint32Array.BYTES_PER_ELEMENT,u=x+4*t*Uint32Array.BYTES_PER_ELEMENT,C(t,d,x,u+4*
 t*Uint32Array.BYTES_PER_ELEMENT),E(t,u));p&&B(p,n,n+3*p*Uint32Array.BYTES_PER_ELEMENT);q&&(p=O+3*q*Uint32Array.BYTES_PER_ELEMENT,K(q,O,p,p+3*q*Uint32Array.BYTES_PER_ELEMENT));s&&J(s,c,c+4*s*Uint32Array.BYTES_PER_ELEMENT);D&&(q=R+4*D*Uint32Array.BYTES_PER_ELEMENT,C(D,R,q,q+4*D*Uint32Array.BYTES_PER_ELEMENT));this.computeCentroids();this.computeFaceNormals()};e.prototype=Object.create(THREE.Geometry.prototype);e=new e(c);c=this.initMaterials(d,c);this.needsTangents(c)&&e.computeTangents();b(e,c)};THREE.ImageLoader=function(){THREE.EventTarget.call(this);this.crossOrigin=null};THREE.ImageLoader.prototype={constructor:THREE.ImageLoader,load:function(a,b){var c=this;void 0===b&&(b=new Image);b.addEventListener("load",function(){c.dispatchEvent({type:"load",content:b})},!1);b.addEventListener("error",function(){c.dispatchEvent({type:"error",message:"Couldn't load URL ["+a+"]"})},!1);c.crossOrigin&&(b.crossOrigin=c.crossOrigin);b.src=a}};THREE.JSONLoader=function(a){THREE.Loader.call(this,a);this.withCredentials=!1};THREE.JSONLoader.prototype=Object.create(THREE.Loader.prototype);THREE.JSONLoader.prototype.load=function(a,b,c){c=c&&"string"===typeof c?c:this.extractUrlBase(a);this.onLoadStart();this.loadAjaxJSON(this,a,b,c)};
 t*Uint32Array.BYTES_PER_ELEMENT),E(t,u));p&&B(p,n,n+3*p*Uint32Array.BYTES_PER_ELEMENT);q&&(p=O+3*q*Uint32Array.BYTES_PER_ELEMENT,K(q,O,p,p+3*q*Uint32Array.BYTES_PER_ELEMENT));s&&J(s,c,c+4*s*Uint32Array.BYTES_PER_ELEMENT);D&&(q=R+4*D*Uint32Array.BYTES_PER_ELEMENT,C(D,R,q,q+4*D*Uint32Array.BYTES_PER_ELEMENT));this.computeCentroids();this.computeFaceNormals()};e.prototype=Object.create(THREE.Geometry.prototype);e=new e(c);c=this.initMaterials(d,c);this.needsTangents(c)&&e.computeTangents();b(e,c)};THREE.ImageLoader=function(){THREE.EventTarget.call(this);this.crossOrigin=null};THREE.ImageLoader.prototype={constructor:THREE.ImageLoader,load:function(a,b){var c=this;void 0===b&&(b=new Image);b.addEventListener("load",function(){c.dispatchEvent({type:"load",content:b})},!1);b.addEventListener("error",function(){c.dispatchEvent({type:"error",message:"Couldn't load URL ["+a+"]"})},!1);c.crossOrigin&&(b.crossOrigin=c.crossOrigin);b.src=a}};THREE.JSONLoader=function(a){THREE.Loader.call(this,a);this.withCredentials=!1};THREE.JSONLoader.prototype=Object.create(THREE.Loader.prototype);THREE.JSONLoader.prototype.load=function(a,b,c){c=c&&"string"===typeof c?c:this.extractUrlBase(a);this.onLoadStart();this.loadAjaxJSON(this,a,b,c)};
@@ -308,8 +308,8 @@ a.uvsNeedUpdate&&void 0!==h&&(k.bindBuffer(k.ARRAY_BUFFER,h.buffer),k.bufferData
 Wa[a]=!1)}function n(a,b){return a.z!==b.z?b.z-a.z:b.id-a.id}function p(a,b){return b[1]-a[1]}function q(a,b,c){if(a.length)for(var d=0,e=a.length;d<e;d++)oa=Z=null,da=ba=qa=za=mb=nb=Sa=-1,Db=!0,a[d].render(b,c,Ba,tb),oa=Z=null,da=ba=qa=za=mb=nb=Sa=-1,Db=!0}function r(a,b,c,d,e,f,g,h){var i,k,j,l;b?(k=a.length-1,l=b=-1):(k=0,b=a.length,l=1);for(var n=k;n!==b;n+=l)if(i=a[n],i.render){k=i.object;j=i.buffer;if(h)i=h;else{i=i[c];if(!i)continue;g&&H.setBlending(i.blending,i.blendEquation,i.blendSrc,i.blendDst);
 Wa[a]=!1)}function n(a,b){return a.z!==b.z?b.z-a.z:b.id-a.id}function p(a,b){return b[1]-a[1]}function q(a,b,c){if(a.length)for(var d=0,e=a.length;d<e;d++)oa=Z=null,da=ba=qa=za=mb=nb=Sa=-1,Db=!0,a[d].render(b,c,Ba,tb),oa=Z=null,da=ba=qa=za=mb=nb=Sa=-1,Db=!0}function r(a,b,c,d,e,f,g,h){var i,k,j,l;b?(k=a.length-1,l=b=-1):(k=0,b=a.length,l=1);for(var n=k;n!==b;n+=l)if(i=a[n],i.render){k=i.object;j=i.buffer;if(h)i=h;else{i=i[c];if(!i)continue;g&&H.setBlending(i.blending,i.blendEquation,i.blendSrc,i.blendDst);
 H.setDepthTest(i.depthTest);H.setDepthWrite(i.depthWrite);J(i.polygonOffset,i.polygonOffsetFactor,i.polygonOffsetUnits)}H.setMaterialFaces(i);j instanceof THREE.BufferGeometry?H.renderBufferDirect(d,e,f,i,j,k):H.renderBuffer(d,e,f,i,j,k)}}function u(a,b,c,d,e,f,g){for(var h,i,k=0,j=a.length;k<j;k++)if(h=a[k],i=h.object,i.visible){if(g)h=g;else{h=h[b];if(!h)continue;f&&H.setBlending(h.blending,h.blendEquation,h.blendSrc,h.blendDst);H.setDepthTest(h.depthTest);H.setDepthWrite(h.depthWrite);J(h.polygonOffset,
 H.setDepthTest(i.depthTest);H.setDepthWrite(i.depthWrite);J(i.polygonOffset,i.polygonOffsetFactor,i.polygonOffsetUnits)}H.setMaterialFaces(i);j instanceof THREE.BufferGeometry?H.renderBufferDirect(d,e,f,i,j,k):H.renderBuffer(d,e,f,i,j,k)}}function u(a,b,c,d,e,f,g){for(var h,i,k=0,j=a.length;k<j;k++)if(h=a[k],i=h.object,i.visible){if(g)h=g;else{h=h[b];if(!h)continue;f&&H.setBlending(h.blending,h.blendEquation,h.blendSrc,h.blendDst);H.setDepthTest(h.depthTest);H.setDepthWrite(h.depthWrite);J(h.polygonOffset,
 h.polygonOffsetFactor,h.polygonOffsetUnits)}H.renderImmediateObject(c,d,e,h,i)}}function s(a,b,c){a.push({buffer:b,object:c,opaque:null,transparent:null})}function D(a){for(var b in a.attributes)if(a.attributes[b].needsUpdate)return!0;return!1}function x(a){for(var b in a.attributes)a.attributes[b].needsUpdate=!1}function t(a,b){for(var c=a.length-1;0<=c;c--)a[c].object===b&&a.splice(c,1)}function F(a,b){for(var c=a.length-1;0<=c;c--)a[c]===b&&a.splice(c,1)}function A(a,b,c,d,e){Ma=0;d.needsUpdate&&
 h.polygonOffsetFactor,h.polygonOffsetUnits)}H.renderImmediateObject(c,d,e,h,i)}}function s(a,b,c){a.push({buffer:b,object:c,opaque:null,transparent:null})}function D(a){for(var b in a.attributes)if(a.attributes[b].needsUpdate)return!0;return!1}function x(a){for(var b in a.attributes)a.attributes[b].needsUpdate=!1}function t(a,b){for(var c=a.length-1;0<=c;c--)a[c].object===b&&a.splice(c,1)}function F(a,b){for(var c=a.length-1;0<=c;c--)a[c]===b&&a.splice(c,1)}function A(a,b,c,d,e){Ma=0;d.needsUpdate&&
-(d.program&&H.deallocateMaterial(d),H.initMaterial(d,b,c,e),d.needsUpdate=!1);d.morphTargets&&!e.__webglMorphTargetInfluences&&(e.__webglMorphTargetInfluences=new Float32Array(H.maxMorphTargets));var f=!1,g=d.program,h=g.uniforms,i=d.uniforms;g!==Z&&(k.useProgram(g),Z=g,f=!0);d.id!==da&&(da=d.id,f=!0);if(f||a!==oa)k.uniformMatrix4fv(h.projectionMatrix,!1,a._projectionMatrixArray),a!==oa&&(oa=a);if(d.skinning)if(Ya&&e.useVertexTexture){if(null!==h.boneTexture){var j=v();k.uniform1i(h.boneTexture,j);
-H.setTexture(e.boneTexture,j)}}else null!==h.boneGlobalMatrices&&k.uniformMatrix4fv(h.boneGlobalMatrices,!1,e.boneMatrices);if(f){c&&d.fog&&(i.fogColor.value=c.color,c instanceof THREE.Fog?(i.fogNear.value=c.near,i.fogFar.value=c.far):c instanceof THREE.FogExp2&&(i.fogDensity.value=c.density));if(d instanceof THREE.MeshPhongMaterial||d instanceof THREE.MeshLambertMaterial||d.lights){if(Db){for(var l=0,n=0,m=0,p,q,r,s=xc,t=s.directional.colors,u=s.directional.positions,x=s.point.colors,z=s.point.positions,
+(d.program&&H.deallocateMaterial(d),H.initMaterial(d,b,c,e),d.needsUpdate=!1);d.morphTargets&&!e.__webglMorphTargetInfluences&&(e.__webglMorphTargetInfluences=new Float32Array(H.maxMorphTargets));var f=!1,g=d.program,h=g.uniforms,i=d.uniforms;g!==Z&&(k.useProgram(g),Z=g,f=!0);d.id!==da&&(da=d.id,f=!0);if(f||a!==oa)k.uniformMatrix4fv(h.projectionMatrix,!1,a.projectionMatrix.elements),a!==oa&&(oa=a);if(d.skinning)if(Ya&&e.useVertexTexture){if(null!==h.boneTexture){var j=v();k.uniform1i(h.boneTexture,
+j);H.setTexture(e.boneTexture,j)}}else null!==h.boneGlobalMatrices&&k.uniformMatrix4fv(h.boneGlobalMatrices,!1,e.boneMatrices);if(f){c&&d.fog&&(i.fogColor.value=c.color,c instanceof THREE.Fog?(i.fogNear.value=c.near,i.fogFar.value=c.far):c instanceof THREE.FogExp2&&(i.fogDensity.value=c.density));if(d instanceof THREE.MeshPhongMaterial||d instanceof THREE.MeshLambertMaterial||d.lights){if(Db){for(var l=0,n=0,m=0,p,q,r,s=xc,t=s.directional.colors,u=s.directional.positions,x=s.point.colors,z=s.point.positions,
 A=s.point.distances,D=s.spot.colors,C=s.spot.positions,F=s.spot.distances,I=s.spot.directions,J=s.spot.anglesCos,P=s.spot.exponents,M=s.hemi.skyColors,ca=s.hemi.groundColors,K=s.hemi.positions,N=0,ba=0,S=0,R=0,ia=0,aa=0,ga=0,ja=0,T=q=0,c=T=T=0,f=b.length;c<f;c++)j=b[c],j.onlyShadow||(p=j.color,r=j.intensity,q=j.distance,j instanceof THREE.AmbientLight?j.visible&&(H.gammaInput?(l+=p.r*p.r,n+=p.g*p.g,m+=p.b*p.b):(l+=p.r,n+=p.g,m+=p.b)):j instanceof THREE.DirectionalLight?(ia+=1,j.visible&&(q=3*N,H.gammaInput?
 A=s.point.distances,D=s.spot.colors,C=s.spot.positions,F=s.spot.distances,I=s.spot.directions,J=s.spot.anglesCos,P=s.spot.exponents,M=s.hemi.skyColors,ca=s.hemi.groundColors,K=s.hemi.positions,N=0,ba=0,S=0,R=0,ia=0,aa=0,ga=0,ja=0,T=q=0,c=T=T=0,f=b.length;c<f;c++)j=b[c],j.onlyShadow||(p=j.color,r=j.intensity,q=j.distance,j instanceof THREE.AmbientLight?j.visible&&(H.gammaInput?(l+=p.r*p.r,n+=p.g*p.g,m+=p.b*p.b):(l+=p.r,n+=p.g,m+=p.b)):j instanceof THREE.DirectionalLight?(ia+=1,j.visible&&(q=3*N,H.gammaInput?
 E(t,q,p,r*r):B(t,q,p,r),Aa.copy(j.matrixWorld.getPosition()),Aa.subSelf(j.target.matrixWorld.getPosition()),Aa.normalize(),u[q]=Aa.x,u[q+1]=Aa.y,u[q+2]=Aa.z,N+=1)):j instanceof THREE.PointLight?(aa+=1,j.visible&&(T=3*ba,H.gammaInput?E(x,T,p,r*r):B(x,T,p,r),r=j.matrixWorld.getPosition(),z[T]=r.x,z[T+1]=r.y,z[T+2]=r.z,A[ba]=q,ba+=1)):j instanceof THREE.SpotLight?(ga+=1,j.visible&&(T=3*S,H.gammaInput?E(D,T,p,r*r):B(D,T,p,r),r=j.matrixWorld.getPosition(),C[T]=r.x,C[T+1]=r.y,C[T+2]=r.z,F[S]=q,Aa.copy(r),
 E(t,q,p,r*r):B(t,q,p,r),Aa.copy(j.matrixWorld.getPosition()),Aa.subSelf(j.target.matrixWorld.getPosition()),Aa.normalize(),u[q]=Aa.x,u[q+1]=Aa.y,u[q+2]=Aa.z,N+=1)):j instanceof THREE.PointLight?(aa+=1,j.visible&&(T=3*ba,H.gammaInput?E(x,T,p,r*r):B(x,T,p,r),r=j.matrixWorld.getPosition(),z[T]=r.x,z[T+1]=r.y,z[T+2]=r.z,A[ba]=q,ba+=1)):j instanceof THREE.SpotLight?(ga+=1,j.visible&&(T=3*S,H.gammaInput?E(D,T,p,r*r):B(D,T,p,r),r=j.matrixWorld.getPosition(),C[T]=r.x,C[T+1]=r.y,C[T+2]=r.z,F[S]=q,Aa.copy(r),
 Aa.subSelf(j.target.matrixWorld.getPosition()),Aa.normalize(),I[T]=Aa.x,I[T+1]=Aa.y,I[T+2]=Aa.z,J[S]=Math.cos(j.angle),P[S]=j.exponent,S+=1)):j instanceof THREE.HemisphereLight&&(ja+=1,j.visible&&(p=j.color,q=j.groundColor,T=3*R,H.gammaInput?(r*=r,E(M,T,p,r),E(ca,T,q,r)):(B(M,T,p,r),B(ca,T,q,r)),Aa.copy(j.matrixWorld.getPosition()),Aa.normalize(),K[T]=Aa.x,K[T+1]=Aa.y,K[T+2]=Aa.z,R+=1)));c=3*N;for(f=Math.max(t.length,3*ia);c<f;c++)t[c]=0;c=3*N;for(f=Math.max(u.length,3*ia);c<f;c++)u[c]=0;c=3*ba;for(f=
 Aa.subSelf(j.target.matrixWorld.getPosition()),Aa.normalize(),I[T]=Aa.x,I[T+1]=Aa.y,I[T+2]=Aa.z,J[S]=Math.cos(j.angle),P[S]=j.exponent,S+=1)):j instanceof THREE.HemisphereLight&&(ja+=1,j.visible&&(p=j.color,q=j.groundColor,T=3*R,H.gammaInput?(r*=r,E(M,T,p,r),E(ca,T,q,r)):(B(M,T,p,r),B(ca,T,q,r)),Aa.copy(j.matrixWorld.getPosition()),Aa.normalize(),K[T]=Aa.x,K[T+1]=Aa.y,K[T+2]=Aa.z,R+=1)));c=3*N;for(f=Math.max(t.length,3*ia);c<f;c++)t[c]=0;c=3*N;for(f=Math.max(u.length,3*ia);c<f;c++)u[c]=0;c=3*ba;for(f=
@@ -327,7 +327,7 @@ l){void 0===c._array&&(c._array=new Float32Array(3*j.length));l=0;for(n=j.length
 k.pixelStorei(k.UNPACK_FLIP_Y_WEBGL,c.flipY);f=c instanceof THREE.CompressedTexture;j=[];for(l=0;6>l;l++)H.autoScaleCubemaps&&!f?(n=j,m=l,s=c.image[l],u=Qc,s.width<=u&&s.height<=u||(x=Math.max(s.width,s.height),t=Math.floor(s.width*u/x),u=Math.floor(s.height*u/x),x=document.createElement("canvas"),x.width=t,x.height=u,x.getContext("2d").drawImage(s,0,0,s.width,s.height,0,0,t,u),s=x),n[m]=s):j[l]=c.image[l];l=j[0];n=0===(l.width&l.width-1)&&0===(l.height&l.height-1);m=Q(c.format);s=Q(c.type);L(k.TEXTURE_CUBE_MAP,
 k.pixelStorei(k.UNPACK_FLIP_Y_WEBGL,c.flipY);f=c instanceof THREE.CompressedTexture;j=[];for(l=0;6>l;l++)H.autoScaleCubemaps&&!f?(n=j,m=l,s=c.image[l],u=Qc,s.width<=u&&s.height<=u||(x=Math.max(s.width,s.height),t=Math.floor(s.width*u/x),u=Math.floor(s.height*u/x),x=document.createElement("canvas"),x.width=t,x.height=u,x.getContext("2d").drawImage(s,0,0,s.width,s.height,0,0,t,u),s=x),n[m]=s):j[l]=c.image[l];l=j[0];n=0===(l.width&l.width-1)&&0===(l.height&l.height-1);m=Q(c.format);s=Q(c.type);L(k.TEXTURE_CUBE_MAP,
 c,n);for(l=0;6>l;l++)if(f){u=j[l].mipmaps;x=0;for(z=u.length;x<z;x++)t=u[x],k.compressedTexImage2D(k.TEXTURE_CUBE_MAP_POSITIVE_X+l,x,m,t.width,t.height,0,t.data)}else k.texImage2D(k.TEXTURE_CUBE_MAP_POSITIVE_X+l,0,m,m,s,j[l]);c.generateMipmaps&&n&&k.generateMipmap(k.TEXTURE_CUBE_MAP);c.needsUpdate=!1;if(c.onUpdate)c.onUpdate()}else k.activeTexture(k.TEXTURE0+f),k.bindTexture(k.TEXTURE_CUBE_MAP,c.image.__webglTextureCube)}else m instanceof THREE.WebGLRenderTargetCube?(c=m,k.activeTexture(k.TEXTURE0+
 c,n);for(l=0;6>l;l++)if(f){u=j[l].mipmaps;x=0;for(z=u.length;x<z;x++)t=u[x],k.compressedTexImage2D(k.TEXTURE_CUBE_MAP_POSITIVE_X+l,x,m,t.width,t.height,0,t.data)}else k.texImage2D(k.TEXTURE_CUBE_MAP_POSITIVE_X+l,0,m,m,s,j[l]);c.generateMipmaps&&n&&k.generateMipmap(k.TEXTURE_CUBE_MAP);c.needsUpdate=!1;if(c.onUpdate)c.onUpdate()}else k.activeTexture(k.TEXTURE0+f),k.bindTexture(k.TEXTURE_CUBE_MAP,c.image.__webglTextureCube)}else m instanceof THREE.WebGLRenderTargetCube?(c=m,k.activeTexture(k.TEXTURE0+
 j),k.bindTexture(k.TEXTURE_CUBE_MAP,c.__webglTexture)):H.setTexture(m,j)}else if("tv"===l){void 0===c._array&&(c._array=[]);l=0;for(n=c.value.length;l<n;l++)c._array[l]=v();k.uniform1iv(f,c._array);l=0;for(n=c.value.length;l<n;l++)m=c.value[l],j=c._array[l],m&&H.setTexture(m,j)}if((d instanceof THREE.ShaderMaterial||d instanceof THREE.MeshPhongMaterial||d.envMap)&&null!==h.cameraPosition)b=a.matrixWorld.getPosition(),k.uniform3f(h.cameraPosition,b.x,b.y,b.z);(d instanceof THREE.MeshPhongMaterial||
 j),k.bindTexture(k.TEXTURE_CUBE_MAP,c.__webglTexture)):H.setTexture(m,j)}else if("tv"===l){void 0===c._array&&(c._array=[]);l=0;for(n=c.value.length;l<n;l++)c._array[l]=v();k.uniform1iv(f,c._array);l=0;for(n=c.value.length;l<n;l++)m=c.value[l],j=c._array[l],m&&H.setTexture(m,j)}if((d instanceof THREE.ShaderMaterial||d instanceof THREE.MeshPhongMaterial||d.envMap)&&null!==h.cameraPosition)b=a.matrixWorld.getPosition(),k.uniform3f(h.cameraPosition,b.x,b.y,b.z);(d instanceof THREE.MeshPhongMaterial||
-d instanceof THREE.MeshLambertMaterial||d instanceof THREE.ShaderMaterial||d.skinning)&&null!==h.viewMatrix&&k.uniformMatrix4fv(h.viewMatrix,!1,a._viewMatrixArray)}k.uniformMatrix4fv(h.modelViewMatrix,!1,e._modelViewMatrix.elements);h.normalMatrix&&k.uniformMatrix3fv(h.normalMatrix,!1,e._normalMatrix.elements);null!==h.modelMatrix&&k.uniformMatrix4fv(h.modelMatrix,!1,e.matrixWorld.elements);return g}function v(){var a=Ma;a>=yc&&console.warn("Trying to use "+a+" texture units while this GPU supports only "+
+d instanceof THREE.MeshLambertMaterial||d instanceof THREE.ShaderMaterial||d.skinning)&&null!==h.viewMatrix&&k.uniformMatrix4fv(h.viewMatrix,!1,a.matrixWorldInverse.elements)}k.uniformMatrix4fv(h.modelViewMatrix,!1,e._modelViewMatrix.elements);h.normalMatrix&&k.uniformMatrix3fv(h.normalMatrix,!1,e._normalMatrix.elements);null!==h.modelMatrix&&k.uniformMatrix4fv(h.modelMatrix,!1,e.matrixWorld.elements);return g}function v(){var a=Ma;a>=yc&&console.warn("Trying to use "+a+" texture units while this GPU supports only "+
 yc);Ma+=1;return a}function z(a,b){a._modelViewMatrix.multiply(b.matrixWorldInverse,a.matrixWorld);a._normalMatrix.getInverse(a._modelViewMatrix);a._normalMatrix.transpose()}function E(a,b,c,d){a[b]=c.r*c.r*d;a[b+1]=c.g*c.g*d;a[b+2]=c.b*c.b*d}function B(a,b,c,d){a[b]=c.r*d;a[b+1]=c.g*d;a[b+2]=c.b*d}function J(a,b,c){ac!==a&&(a?k.enable(k.POLYGON_OFFSET_FILL):k.disable(k.POLYGON_OFFSET_FILL),ac=a);if(a&&(qb!==b||Ta!==c))k.polygonOffset(b,c),qb=b,Ta=c}function K(a){for(var a=a.split("\n"),b=0,c=a.length;b<
 yc);Ma+=1;return a}function z(a,b){a._modelViewMatrix.multiply(b.matrixWorldInverse,a.matrixWorld);a._normalMatrix.getInverse(a._modelViewMatrix);a._normalMatrix.transpose()}function E(a,b,c,d){a[b]=c.r*c.r*d;a[b+1]=c.g*c.g*d;a[b+2]=c.b*c.b*d}function B(a,b,c,d){a[b]=c.r*d;a[b+1]=c.g*d;a[b+2]=c.b*d}function J(a,b,c){ac!==a&&(a?k.enable(k.POLYGON_OFFSET_FILL):k.disable(k.POLYGON_OFFSET_FILL),ac=a);if(a&&(qb!==b||Ta!==c))k.polygonOffset(b,c),qb=b,Ta=c}function K(a){for(var a=a.split("\n"),b=0,c=a.length;b<
 c;b++)a[b]=b+1+": "+a[b];return a.join("\n")}function C(a,b){var c;"fragment"===a?c=k.createShader(k.FRAGMENT_SHADER):"vertex"===a&&(c=k.createShader(k.VERTEX_SHADER));k.shaderSource(c,b);k.compileShader(c);return!k.getShaderParameter(c,k.COMPILE_STATUS)?(console.error(k.getShaderInfoLog(c)),console.error(K(b)),null):c}function L(a,b,c){c?(k.texParameteri(a,k.TEXTURE_WRAP_S,Q(b.wrapS)),k.texParameteri(a,k.TEXTURE_WRAP_T,Q(b.wrapT)),k.texParameteri(a,k.TEXTURE_MAG_FILTER,Q(b.magFilter)),k.texParameteri(a,
 c;b++)a[b]=b+1+": "+a[b];return a.join("\n")}function C(a,b){var c;"fragment"===a?c=k.createShader(k.FRAGMENT_SHADER):"vertex"===a&&(c=k.createShader(k.VERTEX_SHADER));k.shaderSource(c,b);k.compileShader(c);return!k.getShaderParameter(c,k.COMPILE_STATUS)?(console.error(k.getShaderInfoLog(c)),console.error(K(b)),null):c}function L(a,b,c){c?(k.texParameteri(a,k.TEXTURE_WRAP_S,Q(b.wrapS)),k.texParameteri(a,k.TEXTURE_WRAP_T,Q(b.wrapT)),k.texParameteri(a,k.TEXTURE_MAG_FILTER,Q(b.magFilter)),k.texParameteri(a,
 k.TEXTURE_MIN_FILTER,Q(b.minFilter))):(k.texParameteri(a,k.TEXTURE_WRAP_S,k.CLAMP_TO_EDGE),k.texParameteri(a,k.TEXTURE_WRAP_T,k.CLAMP_TO_EDGE),k.texParameteri(a,k.TEXTURE_MAG_FILTER,M(b.magFilter)),k.texParameteri(a,k.TEXTURE_MIN_FILTER,M(b.minFilter)));if(Eb&&b.type!==THREE.FloatType&&(1<b.anisotropy||b.__oldAnisotropy))k.texParameterf(a,Eb.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(b.anisotropy,oc)),b.__oldAnisotropy=b.anisotropy}function I(a,b){k.bindRenderbuffer(k.RENDERBUFFER,a);b.depthBuffer&&!b.stencilBuffer?
 k.TEXTURE_MIN_FILTER,Q(b.minFilter))):(k.texParameteri(a,k.TEXTURE_WRAP_S,k.CLAMP_TO_EDGE),k.texParameteri(a,k.TEXTURE_WRAP_T,k.CLAMP_TO_EDGE),k.texParameteri(a,k.TEXTURE_MAG_FILTER,M(b.magFilter)),k.texParameteri(a,k.TEXTURE_MIN_FILTER,M(b.minFilter)));if(Eb&&b.type!==THREE.FloatType&&(1<b.anisotropy||b.__oldAnisotropy))k.texParameterf(a,Eb.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(b.anisotropy,oc)),b.__oldAnisotropy=b.anisotropy}function I(a,b){k.bindRenderbuffer(k.RENDERBUFFER,a);b.depthBuffer&&!b.stencilBuffer?
@@ -366,68 +366,68 @@ l(c.position),k.vertexAttribPointer(c.position,3,k.FLOAT,!1,0,0));if(f.morphTarg
 3,k.FLOAT,!1,0,0));0<=b.tangent&&(k.bindBuffer(k.ARRAY_BUFFER,e.__webglTangentBuffer),l(b.tangent),k.vertexAttribPointer(b.tangent,4,k.FLOAT,!1,0,0));0<=b.uv&&(k.bindBuffer(k.ARRAY_BUFFER,e.__webglUVBuffer),l(b.uv),k.vertexAttribPointer(b.uv,2,k.FLOAT,!1,0,0));0<=b.uv2&&(k.bindBuffer(k.ARRAY_BUFFER,e.__webglUV2Buffer),l(b.uv2),k.vertexAttribPointer(b.uv2,2,k.FLOAT,!1,0,0));d.skinning&&(0<=b.skinIndex&&0<=b.skinWeight)&&(k.bindBuffer(k.ARRAY_BUFFER,e.__webglSkinIndicesBuffer),l(b.skinIndex),k.vertexAttribPointer(b.skinIndex,
 3,k.FLOAT,!1,0,0));0<=b.tangent&&(k.bindBuffer(k.ARRAY_BUFFER,e.__webglTangentBuffer),l(b.tangent),k.vertexAttribPointer(b.tangent,4,k.FLOAT,!1,0,0));0<=b.uv&&(k.bindBuffer(k.ARRAY_BUFFER,e.__webglUVBuffer),l(b.uv),k.vertexAttribPointer(b.uv,2,k.FLOAT,!1,0,0));0<=b.uv2&&(k.bindBuffer(k.ARRAY_BUFFER,e.__webglUV2Buffer),l(b.uv2),k.vertexAttribPointer(b.uv2,2,k.FLOAT,!1,0,0));d.skinning&&(0<=b.skinIndex&&0<=b.skinWeight)&&(k.bindBuffer(k.ARRAY_BUFFER,e.__webglSkinIndicesBuffer),l(b.skinIndex),k.vertexAttribPointer(b.skinIndex,
 4,k.FLOAT,!1,0,0),k.bindBuffer(k.ARRAY_BUFFER,e.__webglSkinWeightsBuffer),l(b.skinWeight),k.vertexAttribPointer(b.skinWeight,4,k.FLOAT,!1,0,0));0<=b.lineDistance&&(k.bindBuffer(k.ARRAY_BUFFER,e.__webglLineDistanceBuffer),l(b.lineDistance),k.vertexAttribPointer(b.lineDistance,1,k.FLOAT,!1,0,0))}f instanceof THREE.Mesh?(d.wireframe?(d=d.wireframeLinewidth,d!==ra&&(k.lineWidth(d),ra=d),a&&k.bindBuffer(k.ELEMENT_ARRAY_BUFFER,e.__webglLineBuffer),k.drawElements(k.LINES,e.__webglLineCount,k.UNSIGNED_SHORT,
 4,k.FLOAT,!1,0,0),k.bindBuffer(k.ARRAY_BUFFER,e.__webglSkinWeightsBuffer),l(b.skinWeight),k.vertexAttribPointer(b.skinWeight,4,k.FLOAT,!1,0,0));0<=b.lineDistance&&(k.bindBuffer(k.ARRAY_BUFFER,e.__webglLineDistanceBuffer),l(b.lineDistance),k.vertexAttribPointer(b.lineDistance,1,k.FLOAT,!1,0,0))}f instanceof THREE.Mesh?(d.wireframe?(d=d.wireframeLinewidth,d!==ra&&(k.lineWidth(d),ra=d),a&&k.bindBuffer(k.ELEMENT_ARRAY_BUFFER,e.__webglLineBuffer),k.drawElements(k.LINES,e.__webglLineCount,k.UNSIGNED_SHORT,
 0)):(a&&k.bindBuffer(k.ELEMENT_ARRAY_BUFFER,e.__webglFaceBuffer),k.drawElements(k.TRIANGLES,e.__webglFaceCount,k.UNSIGNED_SHORT,0)),H.info.render.calls++,H.info.render.vertices+=e.__webglFaceCount,H.info.render.faces+=e.__webglFaceCount/3):f instanceof THREE.Line?(f=f.type===THREE.LineStrip?k.LINE_STRIP:k.LINES,d=d.linewidth,d!==ra&&(k.lineWidth(d),ra=d),k.drawArrays(f,0,e.__webglLineCount),H.info.render.calls++):f instanceof THREE.ParticleSystem?(k.drawArrays(k.POINTS,0,e.__webglParticleCount),H.info.render.calls++,
 0)):(a&&k.bindBuffer(k.ELEMENT_ARRAY_BUFFER,e.__webglFaceBuffer),k.drawElements(k.TRIANGLES,e.__webglFaceCount,k.UNSIGNED_SHORT,0)),H.info.render.calls++,H.info.render.vertices+=e.__webglFaceCount,H.info.render.faces+=e.__webglFaceCount/3):f instanceof THREE.Line?(f=f.type===THREE.LineStrip?k.LINE_STRIP:k.LINES,d=d.linewidth,d!==ra&&(k.lineWidth(d),ra=d),k.drawArrays(f,0,e.__webglLineCount),H.info.render.calls++):f instanceof THREE.ParticleSystem?(k.drawArrays(k.POINTS,0,e.__webglParticleCount),H.info.render.calls++,
-H.info.render.points+=e.__webglParticleCount):f instanceof THREE.Ribbon&&(k.drawArrays(k.TRIANGLE_STRIP,0,e.__webglVertexCount),H.info.render.calls++)}};this.render=function(a,b,c,d){if(!1===b instanceof THREE.Camera)console.error("THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.");else{var e,f,g,h,i=a.__lights,j=a.fog;da=-1;Db=!0;this.autoUpdateScene&&a.updateMatrixWorld();void 0===b.parent&&b.updateMatrixWorld();b._viewMatrixArray||(b._viewMatrixArray=new Float32Array(16));
-b._projectionMatrixArray||(b._projectionMatrixArray=new Float32Array(16));b.matrixWorldInverse.getInverse(b.matrixWorld);b.matrixWorldInverse.flattenToArray(b._viewMatrixArray);b.projectionMatrix.flattenToArray(b._projectionMatrixArray);Xa.multiply(b.projectionMatrix,b.matrixWorldInverse);wb.setFromMatrix(Xa);this.autoUpdateObjects&&this.initWebGLObjects(a);q(this.renderPluginsPre,a,b);H.info.render.calls=0;H.info.render.vertices=0;H.info.render.faces=0;H.info.render.points=0;this.setRenderTarget(c);
-(this.autoClear||d)&&this.clear(this.autoClearColor,this.autoClearDepth,this.autoClearStencil);h=a.__webglObjects;d=0;for(e=h.length;d<e;d++)if(f=h[d],g=f.object,f.render=!1,g.visible&&(!(g instanceof THREE.Mesh||g instanceof THREE.ParticleSystem)||!g.frustumCulled||wb.contains(g))){z(g,b);var l=f,m=l.buffer,p=void 0,s=p=void 0,s=l.object.material;if(s instanceof THREE.MeshFaceMaterial)p=m.materialIndex,0<=p&&(p=s.materials[p],p.transparent?(l.transparent=p,l.opaque=null):(l.opaque=p,l.transparent=
-null));else if(p=s)p.transparent?(l.transparent=p,l.opaque=null):(l.opaque=p,l.transparent=null);f.render=!0;!0===this.sortObjects&&(null!==g.renderDepth?f.z=g.renderDepth:(cb.copy(g.matrixWorld.getPosition()),Xa.multiplyVector3(cb),f.z=cb.z),f.id=g.id)}this.sortObjects&&h.sort(n);h=a.__webglObjectsImmediate;d=0;for(e=h.length;d<e;d++)f=h[d],g=f.object,g.visible&&(z(g,b),g=f.object.material,g.transparent?(f.transparent=g,f.opaque=null):(f.opaque=g,f.transparent=null));a.overrideMaterial?(d=a.overrideMaterial,
-this.setBlending(d.blending,d.blendEquation,d.blendSrc,d.blendDst),this.setDepthTest(d.depthTest),this.setDepthWrite(d.depthWrite),J(d.polygonOffset,d.polygonOffsetFactor,d.polygonOffsetUnits),r(a.__webglObjects,!1,"",b,i,j,!0,d),u(a.__webglObjectsImmediate,"",b,i,j,!1,d)):(d=null,this.setBlending(THREE.NormalBlending),r(a.__webglObjects,!0,"opaque",b,i,j,!1,d),u(a.__webglObjectsImmediate,"opaque",b,i,j,!1,d),r(a.__webglObjects,!1,"transparent",b,i,j,!0,d),u(a.__webglObjectsImmediate,"transparent",
-b,i,j,!0,d));q(this.renderPluginsPost,a,b);c&&(c.generateMipmaps&&c.minFilter!==THREE.NearestFilter&&c.minFilter!==THREE.LinearFilter)&&(c instanceof THREE.WebGLRenderTargetCube?(k.bindTexture(k.TEXTURE_CUBE_MAP,c.__webglTexture),k.generateMipmap(k.TEXTURE_CUBE_MAP),k.bindTexture(k.TEXTURE_CUBE_MAP,null)):(k.bindTexture(k.TEXTURE_2D,c.__webglTexture),k.generateMipmap(k.TEXTURE_2D),k.bindTexture(k.TEXTURE_2D,null)));this.setDepthTest(!0);this.setDepthWrite(!0)}};this.renderImmediateObject=function(a,
-b,c,d,e){var f=A(a,b,c,d,e);ba=-1;H.setMaterialFaces(d);e.immediateRenderCallback?e.immediateRenderCallback(f,k,wb):e.render(function(a){H.renderBufferImmediate(a,f,d)})};this.initWebGLObjects=function(a){a.__webglObjects||(a.__webglObjects=[],a.__webglObjectsImmediate=[],a.__webglSprites=[],a.__webglFlares=[]);for(;a.__objectsAdded.length;){var b=a.__objectsAdded[0],l=a,n=void 0,m=void 0,p=void 0,q=void 0;if(!b.__webglInit)if(b.__webglInit=!0,b._modelViewMatrix=new THREE.Matrix4,b._normalMatrix=
-new THREE.Matrix3,b instanceof THREE.Mesh)if(m=b.geometry,p=b.material,m instanceof THREE.Geometry){if(void 0===m.geometryGroups){var r=m,u=void 0,v=void 0,z=void 0,A=void 0,C=void 0,B=void 0,E=void 0,I={},J=r.morphTargets.length,L=r.morphNormals.length,Z=p instanceof THREE.MeshFaceMaterial;r.geometryGroups={};u=0;for(v=r.faces.length;u<v;u++)z=r.faces[u],A=Z?z.materialIndex:void 0,B=void 0!==A?A:-1,void 0===I[B]&&(I[B]={hash:B,counter:0}),E=I[B].hash+"_"+I[B].counter,void 0===r.geometryGroups[E]&&
-(r.geometryGroups[E]={faces3:[],faces4:[],materialIndex:A,vertices:0,numMorphTargets:J,numMorphNormals:L}),C=z instanceof THREE.Face3?3:4,65535<r.geometryGroups[E].vertices+C&&(I[B].counter+=1,E=I[B].hash+"_"+I[B].counter,void 0===r.geometryGroups[E]&&(r.geometryGroups[E]={faces3:[],faces4:[],materialIndex:A,vertices:0,numMorphTargets:J,numMorphNormals:L})),z instanceof THREE.Face3?r.geometryGroups[E].faces3.push(u):r.geometryGroups[E].faces4.push(u),r.geometryGroups[E].vertices+=C;r.geometryGroupsList=
-[];var P=void 0;for(P in r.geometryGroups)r.geometryGroups[P].id=eb++,r.geometryGroupsList.push(r.geometryGroups[P])}for(n in m.geometryGroups)if(q=m.geometryGroups[n],!q.__webglVertexBuffer){var K=q;K.__webglVertexBuffer=k.createBuffer();K.__webglNormalBuffer=k.createBuffer();K.__webglTangentBuffer=k.createBuffer();K.__webglColorBuffer=k.createBuffer();K.__webglUVBuffer=k.createBuffer();K.__webglUV2Buffer=k.createBuffer();K.__webglSkinIndicesBuffer=k.createBuffer();K.__webglSkinWeightsBuffer=k.createBuffer();
-K.__webglFaceBuffer=k.createBuffer();K.__webglLineBuffer=k.createBuffer();var M=void 0,ca=void 0;if(K.numMorphTargets){K.__webglMorphTargetsBuffers=[];M=0;for(ca=K.numMorphTargets;M<ca;M++)K.__webglMorphTargetsBuffers.push(k.createBuffer())}if(K.numMorphNormals){K.__webglMorphNormalsBuffers=[];M=0;for(ca=K.numMorphNormals;M<ca;M++)K.__webglMorphNormalsBuffers.push(k.createBuffer())}H.info.memory.geometries++;d(q,b);m.verticesNeedUpdate=!0;m.morphTargetsNeedUpdate=!0;m.elementsNeedUpdate=!0;m.uvsNeedUpdate=
-!0;m.normalsNeedUpdate=!0;m.tangentsNeedUpdate=!0;m.colorsNeedUpdate=!0}}else m instanceof THREE.BufferGeometry&&h(m);else if(b instanceof THREE.Ribbon){if(m=b.geometry,!m.__webglVertexBuffer){var N=m;N.__webglVertexBuffer=k.createBuffer();N.__webglColorBuffer=k.createBuffer();N.__webglNormalBuffer=k.createBuffer();H.info.memory.geometries++;var S=m,ba=b,O=S.vertices.length;S.__vertexArray=new Float32Array(3*O);S.__colorArray=new Float32Array(3*O);S.__normalArray=new Float32Array(3*O);S.__webglVertexCount=
-O;c(S,ba);m.verticesNeedUpdate=!0;m.colorsNeedUpdate=!0;m.normalsNeedUpdate=!0}}else if(b instanceof THREE.Line){if(m=b.geometry,!m.__webglVertexBuffer){var Q=m;Q.__webglVertexBuffer=k.createBuffer();Q.__webglColorBuffer=k.createBuffer();Q.__webglLineDistanceBuffer=k.createBuffer();H.info.memory.geometries++;var R=m,ia=b,T=R.vertices.length;R.__vertexArray=new Float32Array(3*T);R.__colorArray=new Float32Array(3*T);R.__lineDistanceArray=new Float32Array(1*T);R.__webglLineCount=T;c(R,ia);m.verticesNeedUpdate=
-!0;m.colorsNeedUpdate=!0;m.lineDistancesNeedUpdate=!0}}else if(b instanceof THREE.ParticleSystem&&(m=b.geometry,!m.__webglVertexBuffer))if(m instanceof THREE.Geometry){var da=m;da.__webglVertexBuffer=k.createBuffer();da.__webglColorBuffer=k.createBuffer();H.info.memory.geometries++;var aa=m,ga=b,ja=aa.vertices.length;aa.__vertexArray=new Float32Array(3*ja);aa.__colorArray=new Float32Array(3*ja);aa.__sortArray=[];aa.__webglParticleCount=ja;c(aa,ga);m.verticesNeedUpdate=!0;m.colorsNeedUpdate=!0}else m instanceof
-THREE.BufferGeometry&&h(m);if(!b.__webglActive){if(b instanceof THREE.Mesh)if(m=b.geometry,m instanceof THREE.BufferGeometry)s(l.__webglObjects,m,b);else for(n in m.geometryGroups)q=m.geometryGroups[n],s(l.__webglObjects,q,b);else b instanceof THREE.Ribbon||b instanceof THREE.Line||b instanceof THREE.ParticleSystem?(m=b.geometry,s(l.__webglObjects,m,b)):b instanceof THREE.ImmediateRenderObject||b.immediateRenderCallback?l.__webglObjectsImmediate.push({object:b,opaque:null,transparent:null}):b instanceof
-THREE.Sprite?l.__webglSprites.push(b):b instanceof THREE.LensFlare&&l.__webglFlares.push(b);b.__webglActive=!0}a.__objectsAdded.splice(0,1)}for(;a.__objectsRemoved.length;){var oa=a.__objectsRemoved[0],qa=a;oa instanceof THREE.Mesh||oa instanceof THREE.ParticleSystem||oa instanceof THREE.Ribbon||oa instanceof THREE.Line?t(qa.__webglObjects,oa):oa instanceof THREE.Sprite?F(qa.__webglSprites,oa):oa instanceof THREE.LensFlare?F(qa.__webglFlares,oa):(oa instanceof THREE.ImmediateRenderObject||oa.immediateRenderCallback)&&
-t(qa.__webglObjectsImmediate,oa);oa.__webglActive=!1;a.__objectsRemoved.splice(0,1)}for(var Ia=0,Ma=a.__webglObjects.length;Ia<Ma;Ia++){var ra=a.__webglObjects[Ia].object,V=ra.geometry,Ba=void 0,za=void 0,la=void 0;if(ra instanceof THREE.Mesh)if(V instanceof THREE.BufferGeometry)(V.verticesNeedUpdate||V.elementsNeedUpdate||V.uvsNeedUpdate||V.normalsNeedUpdate||V.colorsNeedUpdate||V.tangentsNeedUpdate)&&j(V,k.DYNAMIC_DRAW,!V.dynamic),V.verticesNeedUpdate=!1,V.elementsNeedUpdate=!1,V.uvsNeedUpdate=
-!1,V.normalsNeedUpdate=!1,V.colorsNeedUpdate=!1,V.tangentsNeedUpdate=!1;else{for(var Sa=0,Ta=V.geometryGroupsList.length;Sa<Ta;Sa++)if(Ba=V.geometryGroupsList[Sa],la=e(ra,Ba),V.buffersNeedUpdate&&d(Ba,ra),za=la.attributes&&D(la),V.verticesNeedUpdate||V.morphTargetsNeedUpdate||V.elementsNeedUpdate||V.uvsNeedUpdate||V.normalsNeedUpdate||V.colorsNeedUpdate||V.tangentsNeedUpdate||za){var sa=Ba,Xa=ra,Aa=k.DYNAMIC_DRAW,vb=!V.dynamic,fb=la;if(sa.__inittedArrays){var qb=f(fb),nb=fb.vertexColors?fb.vertexColors:
-!1,sb=g(fb),gb=qb===THREE.SmoothShading,G=void 0,$=void 0,Wa=void 0,U=void 0,cb=void 0,Ya=void 0,Hb=void 0,rb=void 0,ab=void 0,mb=void 0,ob=void 0,W=void 0,X=void 0,Y=void 0,pa=void 0,Ib=void 0,Jb=void 0,Kb=void 0,tb=void 0,Lb=void 0,Mb=void 0,Nb=void 0,ub=void 0,Ob=void 0,Pb=void 0,Qb=void 0,wb=void 0,Rb=void 0,Sb=void 0,Tb=void 0,Db=void 0,Ub=void 0,Vb=void 0,Wb=void 0,Eb=void 0,va=void 0,ac=void 0,cc=void 0,kc=void 0,lc=void 0,Pa=void 0,ic=void 0,Na=void 0,Oa=void 0,dc=void 0,Yb=void 0,Ja=0,La=
-0,Zb=0,$b=0,zb=0,Za=0,ya=0,db=0,Ka=0,ha=0,ka=0,y=0,wa=void 0,Qa=sa.__vertexArray,pc=sa.__uvArray,qc=sa.__uv2Array,Ab=sa.__normalArray,Ea=sa.__tangentArray,Ra=sa.__colorArray,Fa=sa.__skinIndexArray,Ga=sa.__skinWeightArray,Sc=sa.__morphTargetsArrays,Tc=sa.__morphNormalsArrays,Uc=sa.__webglCustomAttributesList,w=void 0,Xb=sa.__faceArray,pb=sa.__lineArray,jb=Xa.geometry,xc=jb.elementsNeedUpdate,oc=jb.uvsNeedUpdate,yc=jb.normalsNeedUpdate,Pc=jb.tangentsNeedUpdate,Qc=jb.colorsNeedUpdate,hd=jb.morphTargetsNeedUpdate,
-gc=jb.vertices,ta=sa.faces3,ua=sa.faces4,$a=jb.faces,Vc=jb.faceVertexUvs[0],Wc=jb.faceVertexUvs[1],hc=jb.skinIndices,ec=jb.skinWeights,fc=jb.morphTargets,Ac=jb.morphNormals;if(jb.verticesNeedUpdate){G=0;for($=ta.length;G<$;G++)U=$a[ta[G]],W=gc[U.a],X=gc[U.b],Y=gc[U.c],Qa[La]=W.x,Qa[La+1]=W.y,Qa[La+2]=W.z,Qa[La+3]=X.x,Qa[La+4]=X.y,Qa[La+5]=X.z,Qa[La+6]=Y.x,Qa[La+7]=Y.y,Qa[La+8]=Y.z,La+=9;G=0;for($=ua.length;G<$;G++)U=$a[ua[G]],W=gc[U.a],X=gc[U.b],Y=gc[U.c],pa=gc[U.d],Qa[La]=W.x,Qa[La+1]=W.y,Qa[La+
-2]=W.z,Qa[La+3]=X.x,Qa[La+4]=X.y,Qa[La+5]=X.z,Qa[La+6]=Y.x,Qa[La+7]=Y.y,Qa[La+8]=Y.z,Qa[La+9]=pa.x,Qa[La+10]=pa.y,Qa[La+11]=pa.z,La+=12;k.bindBuffer(k.ARRAY_BUFFER,sa.__webglVertexBuffer);k.bufferData(k.ARRAY_BUFFER,Qa,Aa)}if(hd){Pa=0;for(ic=fc.length;Pa<ic;Pa++){G=ka=0;for($=ta.length;G<$;G++)dc=ta[G],U=$a[dc],W=fc[Pa].vertices[U.a],X=fc[Pa].vertices[U.b],Y=fc[Pa].vertices[U.c],Na=Sc[Pa],Na[ka]=W.x,Na[ka+1]=W.y,Na[ka+2]=W.z,Na[ka+3]=X.x,Na[ka+4]=X.y,Na[ka+5]=X.z,Na[ka+6]=Y.x,Na[ka+7]=Y.y,Na[ka+8]=
-Y.z,fb.morphNormals&&(gb?(Yb=Ac[Pa].vertexNormals[dc],Lb=Yb.a,Mb=Yb.b,Nb=Yb.c):Nb=Mb=Lb=Ac[Pa].faceNormals[dc],Oa=Tc[Pa],Oa[ka]=Lb.x,Oa[ka+1]=Lb.y,Oa[ka+2]=Lb.z,Oa[ka+3]=Mb.x,Oa[ka+4]=Mb.y,Oa[ka+5]=Mb.z,Oa[ka+6]=Nb.x,Oa[ka+7]=Nb.y,Oa[ka+8]=Nb.z),ka+=9;G=0;for($=ua.length;G<$;G++)dc=ua[G],U=$a[dc],W=fc[Pa].vertices[U.a],X=fc[Pa].vertices[U.b],Y=fc[Pa].vertices[U.c],pa=fc[Pa].vertices[U.d],Na=Sc[Pa],Na[ka]=W.x,Na[ka+1]=W.y,Na[ka+2]=W.z,Na[ka+3]=X.x,Na[ka+4]=X.y,Na[ka+5]=X.z,Na[ka+6]=Y.x,Na[ka+7]=Y.y,
-Na[ka+8]=Y.z,Na[ka+9]=pa.x,Na[ka+10]=pa.y,Na[ka+11]=pa.z,fb.morphNormals&&(gb?(Yb=Ac[Pa].vertexNormals[dc],Lb=Yb.a,Mb=Yb.b,Nb=Yb.c,ub=Yb.d):ub=Nb=Mb=Lb=Ac[Pa].faceNormals[dc],Oa=Tc[Pa],Oa[ka]=Lb.x,Oa[ka+1]=Lb.y,Oa[ka+2]=Lb.z,Oa[ka+3]=Mb.x,Oa[ka+4]=Mb.y,Oa[ka+5]=Mb.z,Oa[ka+6]=Nb.x,Oa[ka+7]=Nb.y,Oa[ka+8]=Nb.z,Oa[ka+9]=ub.x,Oa[ka+10]=ub.y,Oa[ka+11]=ub.z),ka+=12;k.bindBuffer(k.ARRAY_BUFFER,sa.__webglMorphTargetsBuffers[Pa]);k.bufferData(k.ARRAY_BUFFER,Sc[Pa],Aa);fb.morphNormals&&(k.bindBuffer(k.ARRAY_BUFFER,
-sa.__webglMorphNormalsBuffers[Pa]),k.bufferData(k.ARRAY_BUFFER,Tc[Pa],Aa))}}if(ec.length){G=0;for($=ta.length;G<$;G++)U=$a[ta[G]],Rb=ec[U.a],Sb=ec[U.b],Tb=ec[U.c],Ga[ha]=Rb.x,Ga[ha+1]=Rb.y,Ga[ha+2]=Rb.z,Ga[ha+3]=Rb.w,Ga[ha+4]=Sb.x,Ga[ha+5]=Sb.y,Ga[ha+6]=Sb.z,Ga[ha+7]=Sb.w,Ga[ha+8]=Tb.x,Ga[ha+9]=Tb.y,Ga[ha+10]=Tb.z,Ga[ha+11]=Tb.w,Ub=hc[U.a],Vb=hc[U.b],Wb=hc[U.c],Fa[ha]=Ub.x,Fa[ha+1]=Ub.y,Fa[ha+2]=Ub.z,Fa[ha+3]=Ub.w,Fa[ha+4]=Vb.x,Fa[ha+5]=Vb.y,Fa[ha+6]=Vb.z,Fa[ha+7]=Vb.w,Fa[ha+8]=Wb.x,Fa[ha+9]=Wb.y,
-Fa[ha+10]=Wb.z,Fa[ha+11]=Wb.w,ha+=12;G=0;for($=ua.length;G<$;G++)U=$a[ua[G]],Rb=ec[U.a],Sb=ec[U.b],Tb=ec[U.c],Db=ec[U.d],Ga[ha]=Rb.x,Ga[ha+1]=Rb.y,Ga[ha+2]=Rb.z,Ga[ha+3]=Rb.w,Ga[ha+4]=Sb.x,Ga[ha+5]=Sb.y,Ga[ha+6]=Sb.z,Ga[ha+7]=Sb.w,Ga[ha+8]=Tb.x,Ga[ha+9]=Tb.y,Ga[ha+10]=Tb.z,Ga[ha+11]=Tb.w,Ga[ha+12]=Db.x,Ga[ha+13]=Db.y,Ga[ha+14]=Db.z,Ga[ha+15]=Db.w,Ub=hc[U.a],Vb=hc[U.b],Wb=hc[U.c],Eb=hc[U.d],Fa[ha]=Ub.x,Fa[ha+1]=Ub.y,Fa[ha+2]=Ub.z,Fa[ha+3]=Ub.w,Fa[ha+4]=Vb.x,Fa[ha+5]=Vb.y,Fa[ha+6]=Vb.z,Fa[ha+7]=Vb.w,
-Fa[ha+8]=Wb.x,Fa[ha+9]=Wb.y,Fa[ha+10]=Wb.z,Fa[ha+11]=Wb.w,Fa[ha+12]=Eb.x,Fa[ha+13]=Eb.y,Fa[ha+14]=Eb.z,Fa[ha+15]=Eb.w,ha+=16;0<ha&&(k.bindBuffer(k.ARRAY_BUFFER,sa.__webglSkinIndicesBuffer),k.bufferData(k.ARRAY_BUFFER,Fa,Aa),k.bindBuffer(k.ARRAY_BUFFER,sa.__webglSkinWeightsBuffer),k.bufferData(k.ARRAY_BUFFER,Ga,Aa))}if(Qc&&nb){G=0;for($=ta.length;G<$;G++)U=$a[ta[G]],Hb=U.vertexColors,rb=U.color,3===Hb.length&&nb===THREE.VertexColors?(Ob=Hb[0],Pb=Hb[1],Qb=Hb[2]):Qb=Pb=Ob=rb,Ra[Ka]=Ob.r,Ra[Ka+1]=Ob.g,
-Ra[Ka+2]=Ob.b,Ra[Ka+3]=Pb.r,Ra[Ka+4]=Pb.g,Ra[Ka+5]=Pb.b,Ra[Ka+6]=Qb.r,Ra[Ka+7]=Qb.g,Ra[Ka+8]=Qb.b,Ka+=9;G=0;for($=ua.length;G<$;G++)U=$a[ua[G]],Hb=U.vertexColors,rb=U.color,4===Hb.length&&nb===THREE.VertexColors?(Ob=Hb[0],Pb=Hb[1],Qb=Hb[2],wb=Hb[3]):wb=Qb=Pb=Ob=rb,Ra[Ka]=Ob.r,Ra[Ka+1]=Ob.g,Ra[Ka+2]=Ob.b,Ra[Ka+3]=Pb.r,Ra[Ka+4]=Pb.g,Ra[Ka+5]=Pb.b,Ra[Ka+6]=Qb.r,Ra[Ka+7]=Qb.g,Ra[Ka+8]=Qb.b,Ra[Ka+9]=wb.r,Ra[Ka+10]=wb.g,Ra[Ka+11]=wb.b,Ka+=12;0<Ka&&(k.bindBuffer(k.ARRAY_BUFFER,sa.__webglColorBuffer),k.bufferData(k.ARRAY_BUFFER,
-Ra,Aa))}if(Pc&&jb.hasTangents){G=0;for($=ta.length;G<$;G++)U=$a[ta[G]],ab=U.vertexTangents,Ib=ab[0],Jb=ab[1],Kb=ab[2],Ea[ya]=Ib.x,Ea[ya+1]=Ib.y,Ea[ya+2]=Ib.z,Ea[ya+3]=Ib.w,Ea[ya+4]=Jb.x,Ea[ya+5]=Jb.y,Ea[ya+6]=Jb.z,Ea[ya+7]=Jb.w,Ea[ya+8]=Kb.x,Ea[ya+9]=Kb.y,Ea[ya+10]=Kb.z,Ea[ya+11]=Kb.w,ya+=12;G=0;for($=ua.length;G<$;G++)U=$a[ua[G]],ab=U.vertexTangents,Ib=ab[0],Jb=ab[1],Kb=ab[2],tb=ab[3],Ea[ya]=Ib.x,Ea[ya+1]=Ib.y,Ea[ya+2]=Ib.z,Ea[ya+3]=Ib.w,Ea[ya+4]=Jb.x,Ea[ya+5]=Jb.y,Ea[ya+6]=Jb.z,Ea[ya+7]=Jb.w,Ea[ya+
-8]=Kb.x,Ea[ya+9]=Kb.y,Ea[ya+10]=Kb.z,Ea[ya+11]=Kb.w,Ea[ya+12]=tb.x,Ea[ya+13]=tb.y,Ea[ya+14]=tb.z,Ea[ya+15]=tb.w,ya+=16;k.bindBuffer(k.ARRAY_BUFFER,sa.__webglTangentBuffer);k.bufferData(k.ARRAY_BUFFER,Ea,Aa)}if(yc&&qb){G=0;for($=ta.length;G<$;G++)if(U=$a[ta[G]],cb=U.vertexNormals,Ya=U.normal,3===cb.length&&gb)for(va=0;3>va;va++)cc=cb[va],Ab[Za]=cc.x,Ab[Za+1]=cc.y,Ab[Za+2]=cc.z,Za+=3;else for(va=0;3>va;va++)Ab[Za]=Ya.x,Ab[Za+1]=Ya.y,Ab[Za+2]=Ya.z,Za+=3;G=0;for($=ua.length;G<$;G++)if(U=$a[ua[G]],cb=
-U.vertexNormals,Ya=U.normal,4===cb.length&&gb)for(va=0;4>va;va++)cc=cb[va],Ab[Za]=cc.x,Ab[Za+1]=cc.y,Ab[Za+2]=cc.z,Za+=3;else for(va=0;4>va;va++)Ab[Za]=Ya.x,Ab[Za+1]=Ya.y,Ab[Za+2]=Ya.z,Za+=3;k.bindBuffer(k.ARRAY_BUFFER,sa.__webglNormalBuffer);k.bufferData(k.ARRAY_BUFFER,Ab,Aa)}if(oc&&Vc&&sb){G=0;for($=ta.length;G<$;G++)if(Wa=ta[G],mb=Vc[Wa],void 0!==mb)for(va=0;3>va;va++)kc=mb[va],pc[Zb]=kc.u,pc[Zb+1]=kc.v,Zb+=2;G=0;for($=ua.length;G<$;G++)if(Wa=ua[G],mb=Vc[Wa],void 0!==mb)for(va=0;4>va;va++)kc=mb[va],
-pc[Zb]=kc.u,pc[Zb+1]=kc.v,Zb+=2;0<Zb&&(k.bindBuffer(k.ARRAY_BUFFER,sa.__webglUVBuffer),k.bufferData(k.ARRAY_BUFFER,pc,Aa))}if(oc&&Wc&&sb){G=0;for($=ta.length;G<$;G++)if(Wa=ta[G],ob=Wc[Wa],void 0!==ob)for(va=0;3>va;va++)lc=ob[va],qc[$b]=lc.u,qc[$b+1]=lc.v,$b+=2;G=0;for($=ua.length;G<$;G++)if(Wa=ua[G],ob=Wc[Wa],void 0!==ob)for(va=0;4>va;va++)lc=ob[va],qc[$b]=lc.u,qc[$b+1]=lc.v,$b+=2;0<$b&&(k.bindBuffer(k.ARRAY_BUFFER,sa.__webglUV2Buffer),k.bufferData(k.ARRAY_BUFFER,qc,Aa))}if(xc){G=0;for($=ta.length;G<
-$;G++)Xb[zb]=Ja,Xb[zb+1]=Ja+1,Xb[zb+2]=Ja+2,zb+=3,pb[db]=Ja,pb[db+1]=Ja+1,pb[db+2]=Ja,pb[db+3]=Ja+2,pb[db+4]=Ja+1,pb[db+5]=Ja+2,db+=6,Ja+=3;G=0;for($=ua.length;G<$;G++)Xb[zb]=Ja,Xb[zb+1]=Ja+1,Xb[zb+2]=Ja+3,Xb[zb+3]=Ja+1,Xb[zb+4]=Ja+2,Xb[zb+5]=Ja+3,zb+=6,pb[db]=Ja,pb[db+1]=Ja+1,pb[db+2]=Ja,pb[db+3]=Ja+3,pb[db+4]=Ja+1,pb[db+5]=Ja+2,pb[db+6]=Ja+2,pb[db+7]=Ja+3,db+=8,Ja+=4;k.bindBuffer(k.ELEMENT_ARRAY_BUFFER,sa.__webglFaceBuffer);k.bufferData(k.ELEMENT_ARRAY_BUFFER,Xb,Aa);k.bindBuffer(k.ELEMENT_ARRAY_BUFFER,
-sa.__webglLineBuffer);k.bufferData(k.ELEMENT_ARRAY_BUFFER,pb,Aa)}if(Uc){va=0;for(ac=Uc.length;va<ac;va++)if(w=Uc[va],w.__original.needsUpdate){y=0;if(1===w.size)if(void 0===w.boundTo||"vertices"===w.boundTo){G=0;for($=ta.length;G<$;G++)U=$a[ta[G]],w.array[y]=w.value[U.a],w.array[y+1]=w.value[U.b],w.array[y+2]=w.value[U.c],y+=3;G=0;for($=ua.length;G<$;G++)U=$a[ua[G]],w.array[y]=w.value[U.a],w.array[y+1]=w.value[U.b],w.array[y+2]=w.value[U.c],w.array[y+3]=w.value[U.d],y+=4}else{if("faces"===w.boundTo){G=
-0;for($=ta.length;G<$;G++)wa=w.value[ta[G]],w.array[y]=wa,w.array[y+1]=wa,w.array[y+2]=wa,y+=3;G=0;for($=ua.length;G<$;G++)wa=w.value[ua[G]],w.array[y]=wa,w.array[y+1]=wa,w.array[y+2]=wa,w.array[y+3]=wa,y+=4}}else if(2===w.size)if(void 0===w.boundTo||"vertices"===w.boundTo){G=0;for($=ta.length;G<$;G++)U=$a[ta[G]],W=w.value[U.a],X=w.value[U.b],Y=w.value[U.c],w.array[y]=W.x,w.array[y+1]=W.y,w.array[y+2]=X.x,w.array[y+3]=X.y,w.array[y+4]=Y.x,w.array[y+5]=Y.y,y+=6;G=0;for($=ua.length;G<$;G++)U=$a[ua[G]],
-W=w.value[U.a],X=w.value[U.b],Y=w.value[U.c],pa=w.value[U.d],w.array[y]=W.x,w.array[y+1]=W.y,w.array[y+2]=X.x,w.array[y+3]=X.y,w.array[y+4]=Y.x,w.array[y+5]=Y.y,w.array[y+6]=pa.x,w.array[y+7]=pa.y,y+=8}else{if("faces"===w.boundTo){G=0;for($=ta.length;G<$;G++)Y=X=W=wa=w.value[ta[G]],w.array[y]=W.x,w.array[y+1]=W.y,w.array[y+2]=X.x,w.array[y+3]=X.y,w.array[y+4]=Y.x,w.array[y+5]=Y.y,y+=6;G=0;for($=ua.length;G<$;G++)pa=Y=X=W=wa=w.value[ua[G]],w.array[y]=W.x,w.array[y+1]=W.y,w.array[y+2]=X.x,w.array[y+
-3]=X.y,w.array[y+4]=Y.x,w.array[y+5]=Y.y,w.array[y+6]=pa.x,w.array[y+7]=pa.y,y+=8}}else if(3===w.size){var fa;fa="c"===w.type?["r","g","b"]:["x","y","z"];if(void 0===w.boundTo||"vertices"===w.boundTo){G=0;for($=ta.length;G<$;G++)U=$a[ta[G]],W=w.value[U.a],X=w.value[U.b],Y=w.value[U.c],w.array[y]=W[fa[0]],w.array[y+1]=W[fa[1]],w.array[y+2]=W[fa[2]],w.array[y+3]=X[fa[0]],w.array[y+4]=X[fa[1]],w.array[y+5]=X[fa[2]],w.array[y+6]=Y[fa[0]],w.array[y+7]=Y[fa[1]],w.array[y+8]=Y[fa[2]],y+=9;G=0;for($=ua.length;G<
-$;G++)U=$a[ua[G]],W=w.value[U.a],X=w.value[U.b],Y=w.value[U.c],pa=w.value[U.d],w.array[y]=W[fa[0]],w.array[y+1]=W[fa[1]],w.array[y+2]=W[fa[2]],w.array[y+3]=X[fa[0]],w.array[y+4]=X[fa[1]],w.array[y+5]=X[fa[2]],w.array[y+6]=Y[fa[0]],w.array[y+7]=Y[fa[1]],w.array[y+8]=Y[fa[2]],w.array[y+9]=pa[fa[0]],w.array[y+10]=pa[fa[1]],w.array[y+11]=pa[fa[2]],y+=12}else if("faces"===w.boundTo){G=0;for($=ta.length;G<$;G++)Y=X=W=wa=w.value[ta[G]],w.array[y]=W[fa[0]],w.array[y+1]=W[fa[1]],w.array[y+2]=W[fa[2]],w.array[y+
-3]=X[fa[0]],w.array[y+4]=X[fa[1]],w.array[y+5]=X[fa[2]],w.array[y+6]=Y[fa[0]],w.array[y+7]=Y[fa[1]],w.array[y+8]=Y[fa[2]],y+=9;G=0;for($=ua.length;G<$;G++)pa=Y=X=W=wa=w.value[ua[G]],w.array[y]=W[fa[0]],w.array[y+1]=W[fa[1]],w.array[y+2]=W[fa[2]],w.array[y+3]=X[fa[0]],w.array[y+4]=X[fa[1]],w.array[y+5]=X[fa[2]],w.array[y+6]=Y[fa[0]],w.array[y+7]=Y[fa[1]],w.array[y+8]=Y[fa[2]],w.array[y+9]=pa[fa[0]],w.array[y+10]=pa[fa[1]],w.array[y+11]=pa[fa[2]],y+=12}else if("faceVertices"===w.boundTo){G=0;for($=
-ta.length;G<$;G++)wa=w.value[ta[G]],W=wa[0],X=wa[1],Y=wa[2],w.array[y]=W[fa[0]],w.array[y+1]=W[fa[1]],w.array[y+2]=W[fa[2]],w.array[y+3]=X[fa[0]],w.array[y+4]=X[fa[1]],w.array[y+5]=X[fa[2]],w.array[y+6]=Y[fa[0]],w.array[y+7]=Y[fa[1]],w.array[y+8]=Y[fa[2]],y+=9;G=0;for($=ua.length;G<$;G++)wa=w.value[ua[G]],W=wa[0],X=wa[1],Y=wa[2],pa=wa[3],w.array[y]=W[fa[0]],w.array[y+1]=W[fa[1]],w.array[y+2]=W[fa[2]],w.array[y+3]=X[fa[0]],w.array[y+4]=X[fa[1]],w.array[y+5]=X[fa[2]],w.array[y+6]=Y[fa[0]],w.array[y+
-7]=Y[fa[1]],w.array[y+8]=Y[fa[2]],w.array[y+9]=pa[fa[0]],w.array[y+10]=pa[fa[1]],w.array[y+11]=pa[fa[2]],y+=12}}else if(4===w.size)if(void 0===w.boundTo||"vertices"===w.boundTo){G=0;for($=ta.length;G<$;G++)U=$a[ta[G]],W=w.value[U.a],X=w.value[U.b],Y=w.value[U.c],w.array[y]=W.x,w.array[y+1]=W.y,w.array[y+2]=W.z,w.array[y+3]=W.w,w.array[y+4]=X.x,w.array[y+5]=X.y,w.array[y+6]=X.z,w.array[y+7]=X.w,w.array[y+8]=Y.x,w.array[y+9]=Y.y,w.array[y+10]=Y.z,w.array[y+11]=Y.w,y+=12;G=0;for($=ua.length;G<$;G++)U=
-$a[ua[G]],W=w.value[U.a],X=w.value[U.b],Y=w.value[U.c],pa=w.value[U.d],w.array[y]=W.x,w.array[y+1]=W.y,w.array[y+2]=W.z,w.array[y+3]=W.w,w.array[y+4]=X.x,w.array[y+5]=X.y,w.array[y+6]=X.z,w.array[y+7]=X.w,w.array[y+8]=Y.x,w.array[y+9]=Y.y,w.array[y+10]=Y.z,w.array[y+11]=Y.w,w.array[y+12]=pa.x,w.array[y+13]=pa.y,w.array[y+14]=pa.z,w.array[y+15]=pa.w,y+=16}else if("faces"===w.boundTo){G=0;for($=ta.length;G<$;G++)Y=X=W=wa=w.value[ta[G]],w.array[y]=W.x,w.array[y+1]=W.y,w.array[y+2]=W.z,w.array[y+3]=W.w,
-w.array[y+4]=X.x,w.array[y+5]=X.y,w.array[y+6]=X.z,w.array[y+7]=X.w,w.array[y+8]=Y.x,w.array[y+9]=Y.y,w.array[y+10]=Y.z,w.array[y+11]=Y.w,y+=12;G=0;for($=ua.length;G<$;G++)pa=Y=X=W=wa=w.value[ua[G]],w.array[y]=W.x,w.array[y+1]=W.y,w.array[y+2]=W.z,w.array[y+3]=W.w,w.array[y+4]=X.x,w.array[y+5]=X.y,w.array[y+6]=X.z,w.array[y+7]=X.w,w.array[y+8]=Y.x,w.array[y+9]=Y.y,w.array[y+10]=Y.z,w.array[y+11]=Y.w,w.array[y+12]=pa.x,w.array[y+13]=pa.y,w.array[y+14]=pa.z,w.array[y+15]=pa.w,y+=16}else if("faceVertices"===
-w.boundTo){G=0;for($=ta.length;G<$;G++)wa=w.value[ta[G]],W=wa[0],X=wa[1],Y=wa[2],w.array[y]=W.x,w.array[y+1]=W.y,w.array[y+2]=W.z,w.array[y+3]=W.w,w.array[y+4]=X.x,w.array[y+5]=X.y,w.array[y+6]=X.z,w.array[y+7]=X.w,w.array[y+8]=Y.x,w.array[y+9]=Y.y,w.array[y+10]=Y.z,w.array[y+11]=Y.w,y+=12;G=0;for($=ua.length;G<$;G++)wa=w.value[ua[G]],W=wa[0],X=wa[1],Y=wa[2],pa=wa[3],w.array[y]=W.x,w.array[y+1]=W.y,w.array[y+2]=W.z,w.array[y+3]=W.w,w.array[y+4]=X.x,w.array[y+5]=X.y,w.array[y+6]=X.z,w.array[y+7]=X.w,
-w.array[y+8]=Y.x,w.array[y+9]=Y.y,w.array[y+10]=Y.z,w.array[y+11]=Y.w,w.array[y+12]=pa.x,w.array[y+13]=pa.y,w.array[y+14]=pa.z,w.array[y+15]=pa.w,y+=16}k.bindBuffer(k.ARRAY_BUFFER,w.buffer);k.bufferData(k.ARRAY_BUFFER,w.array,Aa)}}vb&&(delete sa.__inittedArrays,delete sa.__colorArray,delete sa.__normalArray,delete sa.__tangentArray,delete sa.__uvArray,delete sa.__uv2Array,delete sa.__faceArray,delete sa.__vertexArray,delete sa.__lineArray,delete sa.__skinIndexArray,delete sa.__skinWeightArray)}}V.verticesNeedUpdate=
-!1;V.morphTargetsNeedUpdate=!1;V.elementsNeedUpdate=!1;V.uvsNeedUpdate=!1;V.normalsNeedUpdate=!1;V.colorsNeedUpdate=!1;V.tangentsNeedUpdate=!1;V.buffersNeedUpdate=!1;la.attributes&&x(la)}else if(ra instanceof THREE.Ribbon){la=e(ra,V);za=la.attributes&&D(la);if(V.verticesNeedUpdate||V.colorsNeedUpdate||V.normalsNeedUpdate||za){var Bb=V,Bc=k.DYNAMIC_DRAW,rc=void 0,sc=void 0,tc=void 0,Cc=void 0,xa=void 0,Dc=void 0,Ec=void 0,Fc=void 0,Zc=void 0,Ua=void 0,mc=void 0,Ca=void 0,kb=void 0,$c=Bb.vertices,ad=
-Bb.colors,bd=Bb.normals,id=$c.length,jd=ad.length,kd=bd.length,Gc=Bb.__vertexArray,Hc=Bb.__colorArray,Ic=Bb.__normalArray,ld=Bb.colorsNeedUpdate,md=Bb.normalsNeedUpdate,Xc=Bb.__webglCustomAttributesList;if(Bb.verticesNeedUpdate){for(rc=0;rc<id;rc++)Cc=$c[rc],xa=3*rc,Gc[xa]=Cc.x,Gc[xa+1]=Cc.y,Gc[xa+2]=Cc.z;k.bindBuffer(k.ARRAY_BUFFER,Bb.__webglVertexBuffer);k.bufferData(k.ARRAY_BUFFER,Gc,Bc)}if(ld){for(sc=0;sc<jd;sc++)Dc=ad[sc],xa=3*sc,Hc[xa]=Dc.r,Hc[xa+1]=Dc.g,Hc[xa+2]=Dc.b;k.bindBuffer(k.ARRAY_BUFFER,
-Bb.__webglColorBuffer);k.bufferData(k.ARRAY_BUFFER,Hc,Bc)}if(md){for(tc=0;tc<kd;tc++)Ec=bd[tc],xa=3*tc,Ic[xa]=Ec.x,Ic[xa+1]=Ec.y,Ic[xa+2]=Ec.z;k.bindBuffer(k.ARRAY_BUFFER,Bb.__webglNormalBuffer);k.bufferData(k.ARRAY_BUFFER,Ic,Bc)}if(Xc){Fc=0;for(Zc=Xc.length;Fc<Zc;Fc++)if(Ca=Xc[Fc],Ca.needsUpdate&&(void 0===Ca.boundTo||"vertices"===Ca.boundTo)){xa=0;mc=Ca.value.length;if(1===Ca.size)for(Ua=0;Ua<mc;Ua++)Ca.array[Ua]=Ca.value[Ua];else if(2===Ca.size)for(Ua=0;Ua<mc;Ua++)kb=Ca.value[Ua],Ca.array[xa]=
-kb.x,Ca.array[xa+1]=kb.y,xa+=2;else if(3===Ca.size)if("c"===Ca.type)for(Ua=0;Ua<mc;Ua++)kb=Ca.value[Ua],Ca.array[xa]=kb.r,Ca.array[xa+1]=kb.g,Ca.array[xa+2]=kb.b,xa+=3;else for(Ua=0;Ua<mc;Ua++)kb=Ca.value[Ua],Ca.array[xa]=kb.x,Ca.array[xa+1]=kb.y,Ca.array[xa+2]=kb.z,xa+=3;else if(4===Ca.size)for(Ua=0;Ua<mc;Ua++)kb=Ca.value[Ua],Ca.array[xa]=kb.x,Ca.array[xa+1]=kb.y,Ca.array[xa+2]=kb.z,Ca.array[xa+3]=kb.w,xa+=4;k.bindBuffer(k.ARRAY_BUFFER,Ca.buffer);k.bufferData(k.ARRAY_BUFFER,Ca.array,Bc)}}}V.verticesNeedUpdate=
-!1;V.colorsNeedUpdate=!1;V.normalsNeedUpdate=!1;la.attributes&&x(la)}else if(ra instanceof THREE.Line){la=e(ra,V);za=la.attributes&&D(la);if(V.verticesNeedUpdate||V.colorsNeedUpdate||V.lineDistancesNeedUpdate||za){var Cb=V,Jc=k.DYNAMIC_DRAW,uc=void 0,vc=void 0,wc=void 0,Kc=void 0,Ha=void 0,Lc=void 0,cd=Cb.vertices,dd=Cb.colors,ed=Cb.lineDistances,nd=cd.length,od=dd.length,pd=ed.length,Mc=Cb.__vertexArray,Nc=Cb.__colorArray,fd=Cb.__lineDistanceArray,qd=Cb.colorsNeedUpdate,rd=Cb.lineDistancesNeedUpdate,
-Yc=Cb.__webglCustomAttributesList,Oc=void 0,gd=void 0,Va=void 0,nc=void 0,lb=void 0,Da=void 0;if(Cb.verticesNeedUpdate){for(uc=0;uc<nd;uc++)Kc=cd[uc],Ha=3*uc,Mc[Ha]=Kc.x,Mc[Ha+1]=Kc.y,Mc[Ha+2]=Kc.z;k.bindBuffer(k.ARRAY_BUFFER,Cb.__webglVertexBuffer);k.bufferData(k.ARRAY_BUFFER,Mc,Jc)}if(qd){for(vc=0;vc<od;vc++)Lc=dd[vc],Ha=3*vc,Nc[Ha]=Lc.r,Nc[Ha+1]=Lc.g,Nc[Ha+2]=Lc.b;k.bindBuffer(k.ARRAY_BUFFER,Cb.__webglColorBuffer);k.bufferData(k.ARRAY_BUFFER,Nc,Jc)}if(rd){for(wc=0;wc<pd;wc++)fd[wc]=ed[wc];k.bindBuffer(k.ARRAY_BUFFER,
-Cb.__webglLineDistanceBuffer);k.bufferData(k.ARRAY_BUFFER,fd,Jc)}if(Yc){Oc=0;for(gd=Yc.length;Oc<gd;Oc++)if(Da=Yc[Oc],Da.needsUpdate&&(void 0===Da.boundTo||"vertices"===Da.boundTo)){Ha=0;nc=Da.value.length;if(1===Da.size)for(Va=0;Va<nc;Va++)Da.array[Va]=Da.value[Va];else if(2===Da.size)for(Va=0;Va<nc;Va++)lb=Da.value[Va],Da.array[Ha]=lb.x,Da.array[Ha+1]=lb.y,Ha+=2;else if(3===Da.size)if("c"===Da.type)for(Va=0;Va<nc;Va++)lb=Da.value[Va],Da.array[Ha]=lb.r,Da.array[Ha+1]=lb.g,Da.array[Ha+2]=lb.b,Ha+=
-3;else for(Va=0;Va<nc;Va++)lb=Da.value[Va],Da.array[Ha]=lb.x,Da.array[Ha+1]=lb.y,Da.array[Ha+2]=lb.z,Ha+=3;else if(4===Da.size)for(Va=0;Va<nc;Va++)lb=Da.value[Va],Da.array[Ha]=lb.x,Da.array[Ha+1]=lb.y,Da.array[Ha+2]=lb.z,Da.array[Ha+3]=lb.w,Ha+=4;k.bindBuffer(k.ARRAY_BUFFER,Da.buffer);k.bufferData(k.ARRAY_BUFFER,Da.array,Jc)}}}V.verticesNeedUpdate=!1;V.colorsNeedUpdate=!1;V.lineDistancesNeedUpdate=!1;la.attributes&&x(la)}else ra instanceof THREE.ParticleSystem&&(V instanceof THREE.BufferGeometry?
-((V.verticesNeedUpdate||V.colorsNeedUpdate)&&j(V,k.DYNAMIC_DRAW,!V.dynamic),V.verticesNeedUpdate=!1,V.colorsNeedUpdate=!1):(la=e(ra,V),za=la.attributes&&D(la),(V.verticesNeedUpdate||V.colorsNeedUpdate||ra.sortParticles||za)&&i(V,k.DYNAMIC_DRAW,ra),V.verticesNeedUpdate=!1,V.colorsNeedUpdate=!1,la.attributes&&x(la)))}};this.initMaterial=function(a,b,c,d){var e,f,g,h,i,j,l,n,m;a instanceof THREE.MeshDepthMaterial?m="depth":a instanceof THREE.MeshNormalMaterial?m="normal":a instanceof THREE.MeshBasicMaterial?
-m="basic":a instanceof THREE.MeshLambertMaterial?m="lambert":a instanceof THREE.MeshPhongMaterial?m="phong":a instanceof THREE.LineBasicMaterial?m="basic":a instanceof THREE.LineDashedMaterial?m="dashed":a instanceof THREE.ParticleBasicMaterial&&(m="particle_basic");if(m){var p=THREE.ShaderLib[m];a.uniforms=THREE.UniformsUtils.clone(p.uniforms);a.vertexShader=p.vertexShader;a.fragmentShader=p.fragmentShader}var q,r,s;e=q=r=s=p=0;for(f=b.length;e<f;e++)g=b[e],g.onlyShadow||(g instanceof THREE.DirectionalLight&&
-q++,g instanceof THREE.PointLight&&r++,g instanceof THREE.SpotLight&&s++,g instanceof THREE.HemisphereLight&&p++);e=q;f=r;g=s;h=p;p=q=0;for(s=b.length;p<s;p++)r=b[p],r.castShadow&&(r instanceof THREE.SpotLight&&q++,r instanceof THREE.DirectionalLight&&!r.shadowCascade&&q++);n=q;Ya&&d&&d.useVertexTexture?l=1024:(b=k.getParameter(k.MAX_VERTEX_UNIFORM_VECTORS),b=Math.floor((b-20)/4),void 0!==d&&d instanceof THREE.SkinnedMesh&&(b=Math.min(d.bones.length,b),b<d.bones.length&&console.warn("WebGLRenderer: too many bones - "+
-d.bones.length+", this GPU supports just "+b+" (try OpenGL instead of ANGLE)")),l=b);a:{r=a.fragmentShader;s=a.vertexShader;p=a.uniforms;b=a.attributes;q=a.defines;var c={map:!!a.map,envMap:!!a.envMap,lightMap:!!a.lightMap,bumpMap:!!a.bumpMap,normalMap:!!a.normalMap,specularMap:!!a.specularMap,vertexColors:a.vertexColors,fog:c,useFog:a.fog,fogExp:c instanceof THREE.FogExp2,sizeAttenuation:a.sizeAttenuation,skinning:a.skinning,maxBones:l,useVertexTexture:Ya&&d&&d.useVertexTexture,boneTextureWidth:d&&
-d.boneTextureWidth,boneTextureHeight:d&&d.boneTextureHeight,morphTargets:a.morphTargets,morphNormals:a.morphNormals,maxMorphTargets:this.maxMorphTargets,maxMorphNormals:this.maxMorphNormals,maxDirLights:e,maxPointLights:f,maxSpotLights:g,maxHemiLights:h,maxShadows:n,shadowMapEnabled:this.shadowMapEnabled&&d.receiveShadow,shadowMapSoft:this.shadowMapSoft,shadowMapDebug:this.shadowMapDebug,shadowMapCascade:this.shadowMapCascade,alphaTest:a.alphaTest,metal:a.metal,perPixel:a.perPixel,wrapAround:a.wrapAround,
-doubleSided:a.side===THREE.DoubleSide,flipSided:a.side===THREE.BackSide},t,u,v,d=[];m?d.push(m):(d.push(r),d.push(s));for(u in q)d.push(u),d.push(q[u]);for(t in c)d.push(t),d.push(c[t]);m=d.join();t=0;for(u=ca.length;t<u;t++)if(d=ca[t],d.code===m){d.usedTimes++;j=d.program;break a}t=[];for(v in q)u=q[v],!1!==u&&(u="#define "+v+" "+u,t.push(u));u=t.join("\n");v=k.createProgram();t=["precision "+R+" float;",u,ic?"#define VERTEX_TEXTURES":"",H.gammaInput?"#define GAMMA_INPUT":"",H.gammaOutput?"#define GAMMA_OUTPUT":
-"",H.physicallyBasedShading?"#define PHYSICALLY_BASED_SHADING":"","#define MAX_DIR_LIGHTS "+c.maxDirLights,"#define MAX_POINT_LIGHTS "+c.maxPointLights,"#define MAX_SPOT_LIGHTS "+c.maxSpotLights,"#define MAX_HEMI_LIGHTS "+c.maxHemiLights,"#define MAX_SHADOWS "+c.maxShadows,"#define MAX_BONES "+c.maxBones,c.map?"#define USE_MAP":"",c.envMap?"#define USE_ENVMAP":"",c.lightMap?"#define USE_LIGHTMAP":"",c.bumpMap?"#define USE_BUMPMAP":"",c.normalMap?"#define USE_NORMALMAP":"",c.specularMap?"#define USE_SPECULARMAP":
-"",c.vertexColors?"#define USE_COLOR":"",c.skinning?"#define USE_SKINNING":"",c.useVertexTexture?"#define BONE_TEXTURE":"",c.boneTextureWidth?"#define N_BONE_PIXEL_X "+c.boneTextureWidth.toFixed(1):"",c.boneTextureHeight?"#define N_BONE_PIXEL_Y "+c.boneTextureHeight.toFixed(1):"",c.morphTargets?"#define USE_MORPHTARGETS":"",c.morphNormals?"#define USE_MORPHNORMALS":"",c.perPixel?"#define PHONG_PER_PIXEL":"",c.wrapAround?"#define WRAP_AROUND":"",c.doubleSided?"#define DOUBLE_SIDED":"",c.flipSided?
-"#define FLIP_SIDED":"",c.shadowMapEnabled?"#define USE_SHADOWMAP":"",c.shadowMapSoft?"#define SHADOWMAP_SOFT":"",c.shadowMapDebug?"#define SHADOWMAP_DEBUG":"",c.shadowMapCascade?"#define SHADOWMAP_CASCADE":"",c.sizeAttenuation?"#define USE_SIZEATTENUATION":"","uniform mat4 modelMatrix;\nuniform mat4 modelViewMatrix;\nuniform mat4 projectionMatrix;\nuniform mat4 viewMatrix;\nuniform mat3 normalMatrix;\nuniform vec3 cameraPosition;\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;\n#ifdef USE_MORPHNORMALS\nattribute vec3 morphNormal0;\nattribute vec3 morphNormal1;\nattribute vec3 morphNormal2;\nattribute vec3 morphNormal3;\n#else\nattribute vec3 morphTarget4;\nattribute vec3 morphTarget5;\nattribute vec3 morphTarget6;\nattribute vec3 morphTarget7;\n#endif\n#endif\n#ifdef USE_SKINNING\nattribute vec4 skinIndex;\nattribute vec4 skinWeight;\n#endif\n"].join("\n");
+H.info.render.points+=e.__webglParticleCount):f instanceof THREE.Ribbon&&(k.drawArrays(k.TRIANGLE_STRIP,0,e.__webglVertexCount),H.info.render.calls++)}};this.render=function(a,b,c,d){if(!1===b instanceof THREE.Camera)console.error("THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.");else{var e,f,g,h,i=a.__lights,j=a.fog;da=-1;Db=!0;this.autoUpdateScene&&a.updateMatrixWorld();void 0===b.parent&&b.updateMatrixWorld();b.matrixWorldInverse.getInverse(b.matrixWorld);Xa.multiply(b.projectionMatrix,
+b.matrixWorldInverse);wb.setFromMatrix(Xa);this.autoUpdateObjects&&this.initWebGLObjects(a);q(this.renderPluginsPre,a,b);H.info.render.calls=0;H.info.render.vertices=0;H.info.render.faces=0;H.info.render.points=0;this.setRenderTarget(c);(this.autoClear||d)&&this.clear(this.autoClearColor,this.autoClearDepth,this.autoClearStencil);h=a.__webglObjects;d=0;for(e=h.length;d<e;d++)if(f=h[d],g=f.object,f.render=!1,g.visible&&(!(g instanceof THREE.Mesh||g instanceof THREE.ParticleSystem)||!g.frustumCulled||
+wb.contains(g))){z(g,b);var l=f,m=l.buffer,p=void 0,s=p=void 0,s=l.object.material;if(s instanceof THREE.MeshFaceMaterial)p=m.materialIndex,0<=p&&(p=s.materials[p],p.transparent?(l.transparent=p,l.opaque=null):(l.opaque=p,l.transparent=null));else if(p=s)p.transparent?(l.transparent=p,l.opaque=null):(l.opaque=p,l.transparent=null);f.render=!0;!0===this.sortObjects&&(null!==g.renderDepth?f.z=g.renderDepth:(cb.copy(g.matrixWorld.getPosition()),Xa.multiplyVector3(cb),f.z=cb.z),f.id=g.id)}this.sortObjects&&
+h.sort(n);h=a.__webglObjectsImmediate;d=0;for(e=h.length;d<e;d++)f=h[d],g=f.object,g.visible&&(z(g,b),g=f.object.material,g.transparent?(f.transparent=g,f.opaque=null):(f.opaque=g,f.transparent=null));a.overrideMaterial?(d=a.overrideMaterial,this.setBlending(d.blending,d.blendEquation,d.blendSrc,d.blendDst),this.setDepthTest(d.depthTest),this.setDepthWrite(d.depthWrite),J(d.polygonOffset,d.polygonOffsetFactor,d.polygonOffsetUnits),r(a.__webglObjects,!1,"",b,i,j,!0,d),u(a.__webglObjectsImmediate,"",
+b,i,j,!1,d)):(d=null,this.setBlending(THREE.NormalBlending),r(a.__webglObjects,!0,"opaque",b,i,j,!1,d),u(a.__webglObjectsImmediate,"opaque",b,i,j,!1,d),r(a.__webglObjects,!1,"transparent",b,i,j,!0,d),u(a.__webglObjectsImmediate,"transparent",b,i,j,!0,d));q(this.renderPluginsPost,a,b);c&&(c.generateMipmaps&&c.minFilter!==THREE.NearestFilter&&c.minFilter!==THREE.LinearFilter)&&(c instanceof THREE.WebGLRenderTargetCube?(k.bindTexture(k.TEXTURE_CUBE_MAP,c.__webglTexture),k.generateMipmap(k.TEXTURE_CUBE_MAP),
+k.bindTexture(k.TEXTURE_CUBE_MAP,null)):(k.bindTexture(k.TEXTURE_2D,c.__webglTexture),k.generateMipmap(k.TEXTURE_2D),k.bindTexture(k.TEXTURE_2D,null)));this.setDepthTest(!0);this.setDepthWrite(!0)}};this.renderImmediateObject=function(a,b,c,d,e){var f=A(a,b,c,d,e);ba=-1;H.setMaterialFaces(d);e.immediateRenderCallback?e.immediateRenderCallback(f,k,wb):e.render(function(a){H.renderBufferImmediate(a,f,d)})};this.initWebGLObjects=function(a){a.__webglObjects||(a.__webglObjects=[],a.__webglObjectsImmediate=
+[],a.__webglSprites=[],a.__webglFlares=[]);for(;a.__objectsAdded.length;){var b=a.__objectsAdded[0],l=a,n=void 0,m=void 0,p=void 0,q=void 0;if(!b.__webglInit)if(b.__webglInit=!0,b._modelViewMatrix=new THREE.Matrix4,b._normalMatrix=new THREE.Matrix3,b instanceof THREE.Mesh)if(m=b.geometry,p=b.material,m instanceof THREE.Geometry){if(void 0===m.geometryGroups){var r=m,u=void 0,v=void 0,z=void 0,A=void 0,C=void 0,B=void 0,E=void 0,I={},J=r.morphTargets.length,L=r.morphNormals.length,Z=p instanceof THREE.MeshFaceMaterial;
+r.geometryGroups={};u=0;for(v=r.faces.length;u<v;u++)z=r.faces[u],A=Z?z.materialIndex:void 0,B=void 0!==A?A:-1,void 0===I[B]&&(I[B]={hash:B,counter:0}),E=I[B].hash+"_"+I[B].counter,void 0===r.geometryGroups[E]&&(r.geometryGroups[E]={faces3:[],faces4:[],materialIndex:A,vertices:0,numMorphTargets:J,numMorphNormals:L}),C=z instanceof THREE.Face3?3:4,65535<r.geometryGroups[E].vertices+C&&(I[B].counter+=1,E=I[B].hash+"_"+I[B].counter,void 0===r.geometryGroups[E]&&(r.geometryGroups[E]={faces3:[],faces4:[],
+materialIndex:A,vertices:0,numMorphTargets:J,numMorphNormals:L})),z instanceof THREE.Face3?r.geometryGroups[E].faces3.push(u):r.geometryGroups[E].faces4.push(u),r.geometryGroups[E].vertices+=C;r.geometryGroupsList=[];var P=void 0;for(P in r.geometryGroups)r.geometryGroups[P].id=eb++,r.geometryGroupsList.push(r.geometryGroups[P])}for(n in m.geometryGroups)if(q=m.geometryGroups[n],!q.__webglVertexBuffer){var K=q;K.__webglVertexBuffer=k.createBuffer();K.__webglNormalBuffer=k.createBuffer();K.__webglTangentBuffer=
+k.createBuffer();K.__webglColorBuffer=k.createBuffer();K.__webglUVBuffer=k.createBuffer();K.__webglUV2Buffer=k.createBuffer();K.__webglSkinIndicesBuffer=k.createBuffer();K.__webglSkinWeightsBuffer=k.createBuffer();K.__webglFaceBuffer=k.createBuffer();K.__webglLineBuffer=k.createBuffer();var M=void 0,ca=void 0;if(K.numMorphTargets){K.__webglMorphTargetsBuffers=[];M=0;for(ca=K.numMorphTargets;M<ca;M++)K.__webglMorphTargetsBuffers.push(k.createBuffer())}if(K.numMorphNormals){K.__webglMorphNormalsBuffers=
+[];M=0;for(ca=K.numMorphNormals;M<ca;M++)K.__webglMorphNormalsBuffers.push(k.createBuffer())}H.info.memory.geometries++;d(q,b);m.verticesNeedUpdate=!0;m.morphTargetsNeedUpdate=!0;m.elementsNeedUpdate=!0;m.uvsNeedUpdate=!0;m.normalsNeedUpdate=!0;m.tangentsNeedUpdate=!0;m.colorsNeedUpdate=!0}}else m instanceof THREE.BufferGeometry&&h(m);else if(b instanceof THREE.Ribbon){if(m=b.geometry,!m.__webglVertexBuffer){var N=m;N.__webglVertexBuffer=k.createBuffer();N.__webglColorBuffer=k.createBuffer();N.__webglNormalBuffer=
+k.createBuffer();H.info.memory.geometries++;var S=m,ba=b,O=S.vertices.length;S.__vertexArray=new Float32Array(3*O);S.__colorArray=new Float32Array(3*O);S.__normalArray=new Float32Array(3*O);S.__webglVertexCount=O;c(S,ba);m.verticesNeedUpdate=!0;m.colorsNeedUpdate=!0;m.normalsNeedUpdate=!0}}else if(b instanceof THREE.Line){if(m=b.geometry,!m.__webglVertexBuffer){var Q=m;Q.__webglVertexBuffer=k.createBuffer();Q.__webglColorBuffer=k.createBuffer();Q.__webglLineDistanceBuffer=k.createBuffer();H.info.memory.geometries++;
+var R=m,ia=b,T=R.vertices.length;R.__vertexArray=new Float32Array(3*T);R.__colorArray=new Float32Array(3*T);R.__lineDistanceArray=new Float32Array(1*T);R.__webglLineCount=T;c(R,ia);m.verticesNeedUpdate=!0;m.colorsNeedUpdate=!0;m.lineDistancesNeedUpdate=!0}}else if(b instanceof THREE.ParticleSystem&&(m=b.geometry,!m.__webglVertexBuffer))if(m instanceof THREE.Geometry){var da=m;da.__webglVertexBuffer=k.createBuffer();da.__webglColorBuffer=k.createBuffer();H.info.memory.geometries++;var aa=m,ga=b,ja=
+aa.vertices.length;aa.__vertexArray=new Float32Array(3*ja);aa.__colorArray=new Float32Array(3*ja);aa.__sortArray=[];aa.__webglParticleCount=ja;c(aa,ga);m.verticesNeedUpdate=!0;m.colorsNeedUpdate=!0}else m instanceof THREE.BufferGeometry&&h(m);if(!b.__webglActive){if(b instanceof THREE.Mesh)if(m=b.geometry,m instanceof THREE.BufferGeometry)s(l.__webglObjects,m,b);else for(n in m.geometryGroups)q=m.geometryGroups[n],s(l.__webglObjects,q,b);else b instanceof THREE.Ribbon||b instanceof THREE.Line||b instanceof
+THREE.ParticleSystem?(m=b.geometry,s(l.__webglObjects,m,b)):b instanceof THREE.ImmediateRenderObject||b.immediateRenderCallback?l.__webglObjectsImmediate.push({object:b,opaque:null,transparent:null}):b instanceof THREE.Sprite?l.__webglSprites.push(b):b instanceof THREE.LensFlare&&l.__webglFlares.push(b);b.__webglActive=!0}a.__objectsAdded.splice(0,1)}for(;a.__objectsRemoved.length;){var oa=a.__objectsRemoved[0],qa=a;oa instanceof THREE.Mesh||oa instanceof THREE.ParticleSystem||oa instanceof THREE.Ribbon||
+oa instanceof THREE.Line?t(qa.__webglObjects,oa):oa instanceof THREE.Sprite?F(qa.__webglSprites,oa):oa instanceof THREE.LensFlare?F(qa.__webglFlares,oa):(oa instanceof THREE.ImmediateRenderObject||oa.immediateRenderCallback)&&t(qa.__webglObjectsImmediate,oa);oa.__webglActive=!1;a.__objectsRemoved.splice(0,1)}for(var Ia=0,Ma=a.__webglObjects.length;Ia<Ma;Ia++){var ra=a.__webglObjects[Ia].object,V=ra.geometry,Ba=void 0,za=void 0,la=void 0;if(ra instanceof THREE.Mesh)if(V instanceof THREE.BufferGeometry)(V.verticesNeedUpdate||
+V.elementsNeedUpdate||V.uvsNeedUpdate||V.normalsNeedUpdate||V.colorsNeedUpdate||V.tangentsNeedUpdate)&&j(V,k.DYNAMIC_DRAW,!V.dynamic),V.verticesNeedUpdate=!1,V.elementsNeedUpdate=!1,V.uvsNeedUpdate=!1,V.normalsNeedUpdate=!1,V.colorsNeedUpdate=!1,V.tangentsNeedUpdate=!1;else{for(var Sa=0,Ta=V.geometryGroupsList.length;Sa<Ta;Sa++)if(Ba=V.geometryGroupsList[Sa],la=e(ra,Ba),V.buffersNeedUpdate&&d(Ba,ra),za=la.attributes&&D(la),V.verticesNeedUpdate||V.morphTargetsNeedUpdate||V.elementsNeedUpdate||V.uvsNeedUpdate||
+V.normalsNeedUpdate||V.colorsNeedUpdate||V.tangentsNeedUpdate||za){var sa=Ba,Xa=ra,Aa=k.DYNAMIC_DRAW,vb=!V.dynamic,fb=la;if(sa.__inittedArrays){var qb=f(fb),nb=fb.vertexColors?fb.vertexColors:!1,sb=g(fb),gb=qb===THREE.SmoothShading,G=void 0,$=void 0,Wa=void 0,U=void 0,cb=void 0,Ya=void 0,Hb=void 0,rb=void 0,ab=void 0,mb=void 0,ob=void 0,W=void 0,X=void 0,Y=void 0,pa=void 0,Ib=void 0,Jb=void 0,Kb=void 0,tb=void 0,Lb=void 0,Mb=void 0,Nb=void 0,ub=void 0,Ob=void 0,Pb=void 0,Qb=void 0,wb=void 0,Rb=void 0,
+Sb=void 0,Tb=void 0,Db=void 0,Ub=void 0,Vb=void 0,Wb=void 0,Eb=void 0,va=void 0,ac=void 0,cc=void 0,kc=void 0,lc=void 0,Pa=void 0,ic=void 0,Na=void 0,Oa=void 0,dc=void 0,Yb=void 0,Ja=0,La=0,Zb=0,$b=0,zb=0,Za=0,ya=0,db=0,Ka=0,ha=0,ka=0,y=0,wa=void 0,Qa=sa.__vertexArray,pc=sa.__uvArray,qc=sa.__uv2Array,Ab=sa.__normalArray,Ea=sa.__tangentArray,Ra=sa.__colorArray,Fa=sa.__skinIndexArray,Ga=sa.__skinWeightArray,Sc=sa.__morphTargetsArrays,Tc=sa.__morphNormalsArrays,Uc=sa.__webglCustomAttributesList,w=void 0,
+Xb=sa.__faceArray,pb=sa.__lineArray,jb=Xa.geometry,xc=jb.elementsNeedUpdate,oc=jb.uvsNeedUpdate,yc=jb.normalsNeedUpdate,Pc=jb.tangentsNeedUpdate,Qc=jb.colorsNeedUpdate,hd=jb.morphTargetsNeedUpdate,gc=jb.vertices,ta=sa.faces3,ua=sa.faces4,$a=jb.faces,Vc=jb.faceVertexUvs[0],Wc=jb.faceVertexUvs[1],hc=jb.skinIndices,ec=jb.skinWeights,fc=jb.morphTargets,Ac=jb.morphNormals;if(jb.verticesNeedUpdate){G=0;for($=ta.length;G<$;G++)U=$a[ta[G]],W=gc[U.a],X=gc[U.b],Y=gc[U.c],Qa[La]=W.x,Qa[La+1]=W.y,Qa[La+2]=W.z,
+Qa[La+3]=X.x,Qa[La+4]=X.y,Qa[La+5]=X.z,Qa[La+6]=Y.x,Qa[La+7]=Y.y,Qa[La+8]=Y.z,La+=9;G=0;for($=ua.length;G<$;G++)U=$a[ua[G]],W=gc[U.a],X=gc[U.b],Y=gc[U.c],pa=gc[U.d],Qa[La]=W.x,Qa[La+1]=W.y,Qa[La+2]=W.z,Qa[La+3]=X.x,Qa[La+4]=X.y,Qa[La+5]=X.z,Qa[La+6]=Y.x,Qa[La+7]=Y.y,Qa[La+8]=Y.z,Qa[La+9]=pa.x,Qa[La+10]=pa.y,Qa[La+11]=pa.z,La+=12;k.bindBuffer(k.ARRAY_BUFFER,sa.__webglVertexBuffer);k.bufferData(k.ARRAY_BUFFER,Qa,Aa)}if(hd){Pa=0;for(ic=fc.length;Pa<ic;Pa++){G=ka=0;for($=ta.length;G<$;G++)dc=ta[G],U=
+$a[dc],W=fc[Pa].vertices[U.a],X=fc[Pa].vertices[U.b],Y=fc[Pa].vertices[U.c],Na=Sc[Pa],Na[ka]=W.x,Na[ka+1]=W.y,Na[ka+2]=W.z,Na[ka+3]=X.x,Na[ka+4]=X.y,Na[ka+5]=X.z,Na[ka+6]=Y.x,Na[ka+7]=Y.y,Na[ka+8]=Y.z,fb.morphNormals&&(gb?(Yb=Ac[Pa].vertexNormals[dc],Lb=Yb.a,Mb=Yb.b,Nb=Yb.c):Nb=Mb=Lb=Ac[Pa].faceNormals[dc],Oa=Tc[Pa],Oa[ka]=Lb.x,Oa[ka+1]=Lb.y,Oa[ka+2]=Lb.z,Oa[ka+3]=Mb.x,Oa[ka+4]=Mb.y,Oa[ka+5]=Mb.z,Oa[ka+6]=Nb.x,Oa[ka+7]=Nb.y,Oa[ka+8]=Nb.z),ka+=9;G=0;for($=ua.length;G<$;G++)dc=ua[G],U=$a[dc],W=fc[Pa].vertices[U.a],
+X=fc[Pa].vertices[U.b],Y=fc[Pa].vertices[U.c],pa=fc[Pa].vertices[U.d],Na=Sc[Pa],Na[ka]=W.x,Na[ka+1]=W.y,Na[ka+2]=W.z,Na[ka+3]=X.x,Na[ka+4]=X.y,Na[ka+5]=X.z,Na[ka+6]=Y.x,Na[ka+7]=Y.y,Na[ka+8]=Y.z,Na[ka+9]=pa.x,Na[ka+10]=pa.y,Na[ka+11]=pa.z,fb.morphNormals&&(gb?(Yb=Ac[Pa].vertexNormals[dc],Lb=Yb.a,Mb=Yb.b,Nb=Yb.c,ub=Yb.d):ub=Nb=Mb=Lb=Ac[Pa].faceNormals[dc],Oa=Tc[Pa],Oa[ka]=Lb.x,Oa[ka+1]=Lb.y,Oa[ka+2]=Lb.z,Oa[ka+3]=Mb.x,Oa[ka+4]=Mb.y,Oa[ka+5]=Mb.z,Oa[ka+6]=Nb.x,Oa[ka+7]=Nb.y,Oa[ka+8]=Nb.z,Oa[ka+9]=ub.x,
+Oa[ka+10]=ub.y,Oa[ka+11]=ub.z),ka+=12;k.bindBuffer(k.ARRAY_BUFFER,sa.__webglMorphTargetsBuffers[Pa]);k.bufferData(k.ARRAY_BUFFER,Sc[Pa],Aa);fb.morphNormals&&(k.bindBuffer(k.ARRAY_BUFFER,sa.__webglMorphNormalsBuffers[Pa]),k.bufferData(k.ARRAY_BUFFER,Tc[Pa],Aa))}}if(ec.length){G=0;for($=ta.length;G<$;G++)U=$a[ta[G]],Rb=ec[U.a],Sb=ec[U.b],Tb=ec[U.c],Ga[ha]=Rb.x,Ga[ha+1]=Rb.y,Ga[ha+2]=Rb.z,Ga[ha+3]=Rb.w,Ga[ha+4]=Sb.x,Ga[ha+5]=Sb.y,Ga[ha+6]=Sb.z,Ga[ha+7]=Sb.w,Ga[ha+8]=Tb.x,Ga[ha+9]=Tb.y,Ga[ha+10]=Tb.z,
+Ga[ha+11]=Tb.w,Ub=hc[U.a],Vb=hc[U.b],Wb=hc[U.c],Fa[ha]=Ub.x,Fa[ha+1]=Ub.y,Fa[ha+2]=Ub.z,Fa[ha+3]=Ub.w,Fa[ha+4]=Vb.x,Fa[ha+5]=Vb.y,Fa[ha+6]=Vb.z,Fa[ha+7]=Vb.w,Fa[ha+8]=Wb.x,Fa[ha+9]=Wb.y,Fa[ha+10]=Wb.z,Fa[ha+11]=Wb.w,ha+=12;G=0;for($=ua.length;G<$;G++)U=$a[ua[G]],Rb=ec[U.a],Sb=ec[U.b],Tb=ec[U.c],Db=ec[U.d],Ga[ha]=Rb.x,Ga[ha+1]=Rb.y,Ga[ha+2]=Rb.z,Ga[ha+3]=Rb.w,Ga[ha+4]=Sb.x,Ga[ha+5]=Sb.y,Ga[ha+6]=Sb.z,Ga[ha+7]=Sb.w,Ga[ha+8]=Tb.x,Ga[ha+9]=Tb.y,Ga[ha+10]=Tb.z,Ga[ha+11]=Tb.w,Ga[ha+12]=Db.x,Ga[ha+13]=Db.y,
+Ga[ha+14]=Db.z,Ga[ha+15]=Db.w,Ub=hc[U.a],Vb=hc[U.b],Wb=hc[U.c],Eb=hc[U.d],Fa[ha]=Ub.x,Fa[ha+1]=Ub.y,Fa[ha+2]=Ub.z,Fa[ha+3]=Ub.w,Fa[ha+4]=Vb.x,Fa[ha+5]=Vb.y,Fa[ha+6]=Vb.z,Fa[ha+7]=Vb.w,Fa[ha+8]=Wb.x,Fa[ha+9]=Wb.y,Fa[ha+10]=Wb.z,Fa[ha+11]=Wb.w,Fa[ha+12]=Eb.x,Fa[ha+13]=Eb.y,Fa[ha+14]=Eb.z,Fa[ha+15]=Eb.w,ha+=16;0<ha&&(k.bindBuffer(k.ARRAY_BUFFER,sa.__webglSkinIndicesBuffer),k.bufferData(k.ARRAY_BUFFER,Fa,Aa),k.bindBuffer(k.ARRAY_BUFFER,sa.__webglSkinWeightsBuffer),k.bufferData(k.ARRAY_BUFFER,Ga,Aa))}if(Qc&&
+nb){G=0;for($=ta.length;G<$;G++)U=$a[ta[G]],Hb=U.vertexColors,rb=U.color,3===Hb.length&&nb===THREE.VertexColors?(Ob=Hb[0],Pb=Hb[1],Qb=Hb[2]):Qb=Pb=Ob=rb,Ra[Ka]=Ob.r,Ra[Ka+1]=Ob.g,Ra[Ka+2]=Ob.b,Ra[Ka+3]=Pb.r,Ra[Ka+4]=Pb.g,Ra[Ka+5]=Pb.b,Ra[Ka+6]=Qb.r,Ra[Ka+7]=Qb.g,Ra[Ka+8]=Qb.b,Ka+=9;G=0;for($=ua.length;G<$;G++)U=$a[ua[G]],Hb=U.vertexColors,rb=U.color,4===Hb.length&&nb===THREE.VertexColors?(Ob=Hb[0],Pb=Hb[1],Qb=Hb[2],wb=Hb[3]):wb=Qb=Pb=Ob=rb,Ra[Ka]=Ob.r,Ra[Ka+1]=Ob.g,Ra[Ka+2]=Ob.b,Ra[Ka+3]=Pb.r,Ra[Ka+
+4]=Pb.g,Ra[Ka+5]=Pb.b,Ra[Ka+6]=Qb.r,Ra[Ka+7]=Qb.g,Ra[Ka+8]=Qb.b,Ra[Ka+9]=wb.r,Ra[Ka+10]=wb.g,Ra[Ka+11]=wb.b,Ka+=12;0<Ka&&(k.bindBuffer(k.ARRAY_BUFFER,sa.__webglColorBuffer),k.bufferData(k.ARRAY_BUFFER,Ra,Aa))}if(Pc&&jb.hasTangents){G=0;for($=ta.length;G<$;G++)U=$a[ta[G]],ab=U.vertexTangents,Ib=ab[0],Jb=ab[1],Kb=ab[2],Ea[ya]=Ib.x,Ea[ya+1]=Ib.y,Ea[ya+2]=Ib.z,Ea[ya+3]=Ib.w,Ea[ya+4]=Jb.x,Ea[ya+5]=Jb.y,Ea[ya+6]=Jb.z,Ea[ya+7]=Jb.w,Ea[ya+8]=Kb.x,Ea[ya+9]=Kb.y,Ea[ya+10]=Kb.z,Ea[ya+11]=Kb.w,ya+=12;G=0;for($=
+ua.length;G<$;G++)U=$a[ua[G]],ab=U.vertexTangents,Ib=ab[0],Jb=ab[1],Kb=ab[2],tb=ab[3],Ea[ya]=Ib.x,Ea[ya+1]=Ib.y,Ea[ya+2]=Ib.z,Ea[ya+3]=Ib.w,Ea[ya+4]=Jb.x,Ea[ya+5]=Jb.y,Ea[ya+6]=Jb.z,Ea[ya+7]=Jb.w,Ea[ya+8]=Kb.x,Ea[ya+9]=Kb.y,Ea[ya+10]=Kb.z,Ea[ya+11]=Kb.w,Ea[ya+12]=tb.x,Ea[ya+13]=tb.y,Ea[ya+14]=tb.z,Ea[ya+15]=tb.w,ya+=16;k.bindBuffer(k.ARRAY_BUFFER,sa.__webglTangentBuffer);k.bufferData(k.ARRAY_BUFFER,Ea,Aa)}if(yc&&qb){G=0;for($=ta.length;G<$;G++)if(U=$a[ta[G]],cb=U.vertexNormals,Ya=U.normal,3===cb.length&&
+gb)for(va=0;3>va;va++)cc=cb[va],Ab[Za]=cc.x,Ab[Za+1]=cc.y,Ab[Za+2]=cc.z,Za+=3;else for(va=0;3>va;va++)Ab[Za]=Ya.x,Ab[Za+1]=Ya.y,Ab[Za+2]=Ya.z,Za+=3;G=0;for($=ua.length;G<$;G++)if(U=$a[ua[G]],cb=U.vertexNormals,Ya=U.normal,4===cb.length&&gb)for(va=0;4>va;va++)cc=cb[va],Ab[Za]=cc.x,Ab[Za+1]=cc.y,Ab[Za+2]=cc.z,Za+=3;else for(va=0;4>va;va++)Ab[Za]=Ya.x,Ab[Za+1]=Ya.y,Ab[Za+2]=Ya.z,Za+=3;k.bindBuffer(k.ARRAY_BUFFER,sa.__webglNormalBuffer);k.bufferData(k.ARRAY_BUFFER,Ab,Aa)}if(oc&&Vc&&sb){G=0;for($=ta.length;G<
+$;G++)if(Wa=ta[G],mb=Vc[Wa],void 0!==mb)for(va=0;3>va;va++)kc=mb[va],pc[Zb]=kc.u,pc[Zb+1]=kc.v,Zb+=2;G=0;for($=ua.length;G<$;G++)if(Wa=ua[G],mb=Vc[Wa],void 0!==mb)for(va=0;4>va;va++)kc=mb[va],pc[Zb]=kc.u,pc[Zb+1]=kc.v,Zb+=2;0<Zb&&(k.bindBuffer(k.ARRAY_BUFFER,sa.__webglUVBuffer),k.bufferData(k.ARRAY_BUFFER,pc,Aa))}if(oc&&Wc&&sb){G=0;for($=ta.length;G<$;G++)if(Wa=ta[G],ob=Wc[Wa],void 0!==ob)for(va=0;3>va;va++)lc=ob[va],qc[$b]=lc.u,qc[$b+1]=lc.v,$b+=2;G=0;for($=ua.length;G<$;G++)if(Wa=ua[G],ob=Wc[Wa],
+void 0!==ob)for(va=0;4>va;va++)lc=ob[va],qc[$b]=lc.u,qc[$b+1]=lc.v,$b+=2;0<$b&&(k.bindBuffer(k.ARRAY_BUFFER,sa.__webglUV2Buffer),k.bufferData(k.ARRAY_BUFFER,qc,Aa))}if(xc){G=0;for($=ta.length;G<$;G++)Xb[zb]=Ja,Xb[zb+1]=Ja+1,Xb[zb+2]=Ja+2,zb+=3,pb[db]=Ja,pb[db+1]=Ja+1,pb[db+2]=Ja,pb[db+3]=Ja+2,pb[db+4]=Ja+1,pb[db+5]=Ja+2,db+=6,Ja+=3;G=0;for($=ua.length;G<$;G++)Xb[zb]=Ja,Xb[zb+1]=Ja+1,Xb[zb+2]=Ja+3,Xb[zb+3]=Ja+1,Xb[zb+4]=Ja+2,Xb[zb+5]=Ja+3,zb+=6,pb[db]=Ja,pb[db+1]=Ja+1,pb[db+2]=Ja,pb[db+3]=Ja+3,pb[db+
+4]=Ja+1,pb[db+5]=Ja+2,pb[db+6]=Ja+2,pb[db+7]=Ja+3,db+=8,Ja+=4;k.bindBuffer(k.ELEMENT_ARRAY_BUFFER,sa.__webglFaceBuffer);k.bufferData(k.ELEMENT_ARRAY_BUFFER,Xb,Aa);k.bindBuffer(k.ELEMENT_ARRAY_BUFFER,sa.__webglLineBuffer);k.bufferData(k.ELEMENT_ARRAY_BUFFER,pb,Aa)}if(Uc){va=0;for(ac=Uc.length;va<ac;va++)if(w=Uc[va],w.__original.needsUpdate){y=0;if(1===w.size)if(void 0===w.boundTo||"vertices"===w.boundTo){G=0;for($=ta.length;G<$;G++)U=$a[ta[G]],w.array[y]=w.value[U.a],w.array[y+1]=w.value[U.b],w.array[y+
+2]=w.value[U.c],y+=3;G=0;for($=ua.length;G<$;G++)U=$a[ua[G]],w.array[y]=w.value[U.a],w.array[y+1]=w.value[U.b],w.array[y+2]=w.value[U.c],w.array[y+3]=w.value[U.d],y+=4}else{if("faces"===w.boundTo){G=0;for($=ta.length;G<$;G++)wa=w.value[ta[G]],w.array[y]=wa,w.array[y+1]=wa,w.array[y+2]=wa,y+=3;G=0;for($=ua.length;G<$;G++)wa=w.value[ua[G]],w.array[y]=wa,w.array[y+1]=wa,w.array[y+2]=wa,w.array[y+3]=wa,y+=4}}else if(2===w.size)if(void 0===w.boundTo||"vertices"===w.boundTo){G=0;for($=ta.length;G<$;G++)U=
+$a[ta[G]],W=w.value[U.a],X=w.value[U.b],Y=w.value[U.c],w.array[y]=W.x,w.array[y+1]=W.y,w.array[y+2]=X.x,w.array[y+3]=X.y,w.array[y+4]=Y.x,w.array[y+5]=Y.y,y+=6;G=0;for($=ua.length;G<$;G++)U=$a[ua[G]],W=w.value[U.a],X=w.value[U.b],Y=w.value[U.c],pa=w.value[U.d],w.array[y]=W.x,w.array[y+1]=W.y,w.array[y+2]=X.x,w.array[y+3]=X.y,w.array[y+4]=Y.x,w.array[y+5]=Y.y,w.array[y+6]=pa.x,w.array[y+7]=pa.y,y+=8}else{if("faces"===w.boundTo){G=0;for($=ta.length;G<$;G++)Y=X=W=wa=w.value[ta[G]],w.array[y]=W.x,w.array[y+
+1]=W.y,w.array[y+2]=X.x,w.array[y+3]=X.y,w.array[y+4]=Y.x,w.array[y+5]=Y.y,y+=6;G=0;for($=ua.length;G<$;G++)pa=Y=X=W=wa=w.value[ua[G]],w.array[y]=W.x,w.array[y+1]=W.y,w.array[y+2]=X.x,w.array[y+3]=X.y,w.array[y+4]=Y.x,w.array[y+5]=Y.y,w.array[y+6]=pa.x,w.array[y+7]=pa.y,y+=8}}else if(3===w.size){var fa;fa="c"===w.type?["r","g","b"]:["x","y","z"];if(void 0===w.boundTo||"vertices"===w.boundTo){G=0;for($=ta.length;G<$;G++)U=$a[ta[G]],W=w.value[U.a],X=w.value[U.b],Y=w.value[U.c],w.array[y]=W[fa[0]],w.array[y+
+1]=W[fa[1]],w.array[y+2]=W[fa[2]],w.array[y+3]=X[fa[0]],w.array[y+4]=X[fa[1]],w.array[y+5]=X[fa[2]],w.array[y+6]=Y[fa[0]],w.array[y+7]=Y[fa[1]],w.array[y+8]=Y[fa[2]],y+=9;G=0;for($=ua.length;G<$;G++)U=$a[ua[G]],W=w.value[U.a],X=w.value[U.b],Y=w.value[U.c],pa=w.value[U.d],w.array[y]=W[fa[0]],w.array[y+1]=W[fa[1]],w.array[y+2]=W[fa[2]],w.array[y+3]=X[fa[0]],w.array[y+4]=X[fa[1]],w.array[y+5]=X[fa[2]],w.array[y+6]=Y[fa[0]],w.array[y+7]=Y[fa[1]],w.array[y+8]=Y[fa[2]],w.array[y+9]=pa[fa[0]],w.array[y+
+10]=pa[fa[1]],w.array[y+11]=pa[fa[2]],y+=12}else if("faces"===w.boundTo){G=0;for($=ta.length;G<$;G++)Y=X=W=wa=w.value[ta[G]],w.array[y]=W[fa[0]],w.array[y+1]=W[fa[1]],w.array[y+2]=W[fa[2]],w.array[y+3]=X[fa[0]],w.array[y+4]=X[fa[1]],w.array[y+5]=X[fa[2]],w.array[y+6]=Y[fa[0]],w.array[y+7]=Y[fa[1]],w.array[y+8]=Y[fa[2]],y+=9;G=0;for($=ua.length;G<$;G++)pa=Y=X=W=wa=w.value[ua[G]],w.array[y]=W[fa[0]],w.array[y+1]=W[fa[1]],w.array[y+2]=W[fa[2]],w.array[y+3]=X[fa[0]],w.array[y+4]=X[fa[1]],w.array[y+5]=
+X[fa[2]],w.array[y+6]=Y[fa[0]],w.array[y+7]=Y[fa[1]],w.array[y+8]=Y[fa[2]],w.array[y+9]=pa[fa[0]],w.array[y+10]=pa[fa[1]],w.array[y+11]=pa[fa[2]],y+=12}else if("faceVertices"===w.boundTo){G=0;for($=ta.length;G<$;G++)wa=w.value[ta[G]],W=wa[0],X=wa[1],Y=wa[2],w.array[y]=W[fa[0]],w.array[y+1]=W[fa[1]],w.array[y+2]=W[fa[2]],w.array[y+3]=X[fa[0]],w.array[y+4]=X[fa[1]],w.array[y+5]=X[fa[2]],w.array[y+6]=Y[fa[0]],w.array[y+7]=Y[fa[1]],w.array[y+8]=Y[fa[2]],y+=9;G=0;for($=ua.length;G<$;G++)wa=w.value[ua[G]],
+W=wa[0],X=wa[1],Y=wa[2],pa=wa[3],w.array[y]=W[fa[0]],w.array[y+1]=W[fa[1]],w.array[y+2]=W[fa[2]],w.array[y+3]=X[fa[0]],w.array[y+4]=X[fa[1]],w.array[y+5]=X[fa[2]],w.array[y+6]=Y[fa[0]],w.array[y+7]=Y[fa[1]],w.array[y+8]=Y[fa[2]],w.array[y+9]=pa[fa[0]],w.array[y+10]=pa[fa[1]],w.array[y+11]=pa[fa[2]],y+=12}}else if(4===w.size)if(void 0===w.boundTo||"vertices"===w.boundTo){G=0;for($=ta.length;G<$;G++)U=$a[ta[G]],W=w.value[U.a],X=w.value[U.b],Y=w.value[U.c],w.array[y]=W.x,w.array[y+1]=W.y,w.array[y+2]=
+W.z,w.array[y+3]=W.w,w.array[y+4]=X.x,w.array[y+5]=X.y,w.array[y+6]=X.z,w.array[y+7]=X.w,w.array[y+8]=Y.x,w.array[y+9]=Y.y,w.array[y+10]=Y.z,w.array[y+11]=Y.w,y+=12;G=0;for($=ua.length;G<$;G++)U=$a[ua[G]],W=w.value[U.a],X=w.value[U.b],Y=w.value[U.c],pa=w.value[U.d],w.array[y]=W.x,w.array[y+1]=W.y,w.array[y+2]=W.z,w.array[y+3]=W.w,w.array[y+4]=X.x,w.array[y+5]=X.y,w.array[y+6]=X.z,w.array[y+7]=X.w,w.array[y+8]=Y.x,w.array[y+9]=Y.y,w.array[y+10]=Y.z,w.array[y+11]=Y.w,w.array[y+12]=pa.x,w.array[y+13]=
+pa.y,w.array[y+14]=pa.z,w.array[y+15]=pa.w,y+=16}else if("faces"===w.boundTo){G=0;for($=ta.length;G<$;G++)Y=X=W=wa=w.value[ta[G]],w.array[y]=W.x,w.array[y+1]=W.y,w.array[y+2]=W.z,w.array[y+3]=W.w,w.array[y+4]=X.x,w.array[y+5]=X.y,w.array[y+6]=X.z,w.array[y+7]=X.w,w.array[y+8]=Y.x,w.array[y+9]=Y.y,w.array[y+10]=Y.z,w.array[y+11]=Y.w,y+=12;G=0;for($=ua.length;G<$;G++)pa=Y=X=W=wa=w.value[ua[G]],w.array[y]=W.x,w.array[y+1]=W.y,w.array[y+2]=W.z,w.array[y+3]=W.w,w.array[y+4]=X.x,w.array[y+5]=X.y,w.array[y+
+6]=X.z,w.array[y+7]=X.w,w.array[y+8]=Y.x,w.array[y+9]=Y.y,w.array[y+10]=Y.z,w.array[y+11]=Y.w,w.array[y+12]=pa.x,w.array[y+13]=pa.y,w.array[y+14]=pa.z,w.array[y+15]=pa.w,y+=16}else if("faceVertices"===w.boundTo){G=0;for($=ta.length;G<$;G++)wa=w.value[ta[G]],W=wa[0],X=wa[1],Y=wa[2],w.array[y]=W.x,w.array[y+1]=W.y,w.array[y+2]=W.z,w.array[y+3]=W.w,w.array[y+4]=X.x,w.array[y+5]=X.y,w.array[y+6]=X.z,w.array[y+7]=X.w,w.array[y+8]=Y.x,w.array[y+9]=Y.y,w.array[y+10]=Y.z,w.array[y+11]=Y.w,y+=12;G=0;for($=
+ua.length;G<$;G++)wa=w.value[ua[G]],W=wa[0],X=wa[1],Y=wa[2],pa=wa[3],w.array[y]=W.x,w.array[y+1]=W.y,w.array[y+2]=W.z,w.array[y+3]=W.w,w.array[y+4]=X.x,w.array[y+5]=X.y,w.array[y+6]=X.z,w.array[y+7]=X.w,w.array[y+8]=Y.x,w.array[y+9]=Y.y,w.array[y+10]=Y.z,w.array[y+11]=Y.w,w.array[y+12]=pa.x,w.array[y+13]=pa.y,w.array[y+14]=pa.z,w.array[y+15]=pa.w,y+=16}k.bindBuffer(k.ARRAY_BUFFER,w.buffer);k.bufferData(k.ARRAY_BUFFER,w.array,Aa)}}vb&&(delete sa.__inittedArrays,delete sa.__colorArray,delete sa.__normalArray,
+delete sa.__tangentArray,delete sa.__uvArray,delete sa.__uv2Array,delete sa.__faceArray,delete sa.__vertexArray,delete sa.__lineArray,delete sa.__skinIndexArray,delete sa.__skinWeightArray)}}V.verticesNeedUpdate=!1;V.morphTargetsNeedUpdate=!1;V.elementsNeedUpdate=!1;V.uvsNeedUpdate=!1;V.normalsNeedUpdate=!1;V.colorsNeedUpdate=!1;V.tangentsNeedUpdate=!1;V.buffersNeedUpdate=!1;la.attributes&&x(la)}else if(ra instanceof THREE.Ribbon){la=e(ra,V);za=la.attributes&&D(la);if(V.verticesNeedUpdate||V.colorsNeedUpdate||
+V.normalsNeedUpdate||za){var Bb=V,Bc=k.DYNAMIC_DRAW,rc=void 0,sc=void 0,tc=void 0,Cc=void 0,xa=void 0,Dc=void 0,Ec=void 0,Fc=void 0,Zc=void 0,Ua=void 0,mc=void 0,Ca=void 0,kb=void 0,$c=Bb.vertices,ad=Bb.colors,bd=Bb.normals,id=$c.length,jd=ad.length,kd=bd.length,Gc=Bb.__vertexArray,Hc=Bb.__colorArray,Ic=Bb.__normalArray,ld=Bb.colorsNeedUpdate,md=Bb.normalsNeedUpdate,Xc=Bb.__webglCustomAttributesList;if(Bb.verticesNeedUpdate){for(rc=0;rc<id;rc++)Cc=$c[rc],xa=3*rc,Gc[xa]=Cc.x,Gc[xa+1]=Cc.y,Gc[xa+2]=
+Cc.z;k.bindBuffer(k.ARRAY_BUFFER,Bb.__webglVertexBuffer);k.bufferData(k.ARRAY_BUFFER,Gc,Bc)}if(ld){for(sc=0;sc<jd;sc++)Dc=ad[sc],xa=3*sc,Hc[xa]=Dc.r,Hc[xa+1]=Dc.g,Hc[xa+2]=Dc.b;k.bindBuffer(k.ARRAY_BUFFER,Bb.__webglColorBuffer);k.bufferData(k.ARRAY_BUFFER,Hc,Bc)}if(md){for(tc=0;tc<kd;tc++)Ec=bd[tc],xa=3*tc,Ic[xa]=Ec.x,Ic[xa+1]=Ec.y,Ic[xa+2]=Ec.z;k.bindBuffer(k.ARRAY_BUFFER,Bb.__webglNormalBuffer);k.bufferData(k.ARRAY_BUFFER,Ic,Bc)}if(Xc){Fc=0;for(Zc=Xc.length;Fc<Zc;Fc++)if(Ca=Xc[Fc],Ca.needsUpdate&&
+(void 0===Ca.boundTo||"vertices"===Ca.boundTo)){xa=0;mc=Ca.value.length;if(1===Ca.size)for(Ua=0;Ua<mc;Ua++)Ca.array[Ua]=Ca.value[Ua];else if(2===Ca.size)for(Ua=0;Ua<mc;Ua++)kb=Ca.value[Ua],Ca.array[xa]=kb.x,Ca.array[xa+1]=kb.y,xa+=2;else if(3===Ca.size)if("c"===Ca.type)for(Ua=0;Ua<mc;Ua++)kb=Ca.value[Ua],Ca.array[xa]=kb.r,Ca.array[xa+1]=kb.g,Ca.array[xa+2]=kb.b,xa+=3;else for(Ua=0;Ua<mc;Ua++)kb=Ca.value[Ua],Ca.array[xa]=kb.x,Ca.array[xa+1]=kb.y,Ca.array[xa+2]=kb.z,xa+=3;else if(4===Ca.size)for(Ua=
+0;Ua<mc;Ua++)kb=Ca.value[Ua],Ca.array[xa]=kb.x,Ca.array[xa+1]=kb.y,Ca.array[xa+2]=kb.z,Ca.array[xa+3]=kb.w,xa+=4;k.bindBuffer(k.ARRAY_BUFFER,Ca.buffer);k.bufferData(k.ARRAY_BUFFER,Ca.array,Bc)}}}V.verticesNeedUpdate=!1;V.colorsNeedUpdate=!1;V.normalsNeedUpdate=!1;la.attributes&&x(la)}else if(ra instanceof THREE.Line){la=e(ra,V);za=la.attributes&&D(la);if(V.verticesNeedUpdate||V.colorsNeedUpdate||V.lineDistancesNeedUpdate||za){var Cb=V,Jc=k.DYNAMIC_DRAW,uc=void 0,vc=void 0,wc=void 0,Kc=void 0,Ha=void 0,
+Lc=void 0,cd=Cb.vertices,dd=Cb.colors,ed=Cb.lineDistances,nd=cd.length,od=dd.length,pd=ed.length,Mc=Cb.__vertexArray,Nc=Cb.__colorArray,fd=Cb.__lineDistanceArray,qd=Cb.colorsNeedUpdate,rd=Cb.lineDistancesNeedUpdate,Yc=Cb.__webglCustomAttributesList,Oc=void 0,gd=void 0,Va=void 0,nc=void 0,lb=void 0,Da=void 0;if(Cb.verticesNeedUpdate){for(uc=0;uc<nd;uc++)Kc=cd[uc],Ha=3*uc,Mc[Ha]=Kc.x,Mc[Ha+1]=Kc.y,Mc[Ha+2]=Kc.z;k.bindBuffer(k.ARRAY_BUFFER,Cb.__webglVertexBuffer);k.bufferData(k.ARRAY_BUFFER,Mc,Jc)}if(qd){for(vc=
+0;vc<od;vc++)Lc=dd[vc],Ha=3*vc,Nc[Ha]=Lc.r,Nc[Ha+1]=Lc.g,Nc[Ha+2]=Lc.b;k.bindBuffer(k.ARRAY_BUFFER,Cb.__webglColorBuffer);k.bufferData(k.ARRAY_BUFFER,Nc,Jc)}if(rd){for(wc=0;wc<pd;wc++)fd[wc]=ed[wc];k.bindBuffer(k.ARRAY_BUFFER,Cb.__webglLineDistanceBuffer);k.bufferData(k.ARRAY_BUFFER,fd,Jc)}if(Yc){Oc=0;for(gd=Yc.length;Oc<gd;Oc++)if(Da=Yc[Oc],Da.needsUpdate&&(void 0===Da.boundTo||"vertices"===Da.boundTo)){Ha=0;nc=Da.value.length;if(1===Da.size)for(Va=0;Va<nc;Va++)Da.array[Va]=Da.value[Va];else if(2===
+Da.size)for(Va=0;Va<nc;Va++)lb=Da.value[Va],Da.array[Ha]=lb.x,Da.array[Ha+1]=lb.y,Ha+=2;else if(3===Da.size)if("c"===Da.type)for(Va=0;Va<nc;Va++)lb=Da.value[Va],Da.array[Ha]=lb.r,Da.array[Ha+1]=lb.g,Da.array[Ha+2]=lb.b,Ha+=3;else for(Va=0;Va<nc;Va++)lb=Da.value[Va],Da.array[Ha]=lb.x,Da.array[Ha+1]=lb.y,Da.array[Ha+2]=lb.z,Ha+=3;else if(4===Da.size)for(Va=0;Va<nc;Va++)lb=Da.value[Va],Da.array[Ha]=lb.x,Da.array[Ha+1]=lb.y,Da.array[Ha+2]=lb.z,Da.array[Ha+3]=lb.w,Ha+=4;k.bindBuffer(k.ARRAY_BUFFER,Da.buffer);
+k.bufferData(k.ARRAY_BUFFER,Da.array,Jc)}}}V.verticesNeedUpdate=!1;V.colorsNeedUpdate=!1;V.lineDistancesNeedUpdate=!1;la.attributes&&x(la)}else ra instanceof THREE.ParticleSystem&&(V instanceof THREE.BufferGeometry?((V.verticesNeedUpdate||V.colorsNeedUpdate)&&j(V,k.DYNAMIC_DRAW,!V.dynamic),V.verticesNeedUpdate=!1,V.colorsNeedUpdate=!1):(la=e(ra,V),za=la.attributes&&D(la),(V.verticesNeedUpdate||V.colorsNeedUpdate||ra.sortParticles||za)&&i(V,k.DYNAMIC_DRAW,ra),V.verticesNeedUpdate=!1,V.colorsNeedUpdate=
+!1,la.attributes&&x(la)))}};this.initMaterial=function(a,b,c,d){var e,f,g,h,i,j,l,n,m;a instanceof THREE.MeshDepthMaterial?m="depth":a instanceof THREE.MeshNormalMaterial?m="normal":a instanceof THREE.MeshBasicMaterial?m="basic":a instanceof THREE.MeshLambertMaterial?m="lambert":a instanceof THREE.MeshPhongMaterial?m="phong":a instanceof THREE.LineBasicMaterial?m="basic":a instanceof THREE.LineDashedMaterial?m="dashed":a instanceof THREE.ParticleBasicMaterial&&(m="particle_basic");if(m){var p=THREE.ShaderLib[m];
+a.uniforms=THREE.UniformsUtils.clone(p.uniforms);a.vertexShader=p.vertexShader;a.fragmentShader=p.fragmentShader}var q,r,s;e=q=r=s=p=0;for(f=b.length;e<f;e++)g=b[e],g.onlyShadow||(g instanceof THREE.DirectionalLight&&q++,g instanceof THREE.PointLight&&r++,g instanceof THREE.SpotLight&&s++,g instanceof THREE.HemisphereLight&&p++);e=q;f=r;g=s;h=p;p=q=0;for(s=b.length;p<s;p++)r=b[p],r.castShadow&&(r instanceof THREE.SpotLight&&q++,r instanceof THREE.DirectionalLight&&!r.shadowCascade&&q++);n=q;Ya&&d&&
+d.useVertexTexture?l=1024:(b=k.getParameter(k.MAX_VERTEX_UNIFORM_VECTORS),b=Math.floor((b-20)/4),void 0!==d&&d instanceof THREE.SkinnedMesh&&(b=Math.min(d.bones.length,b),b<d.bones.length&&console.warn("WebGLRenderer: too many bones - "+d.bones.length+", this GPU supports just "+b+" (try OpenGL instead of ANGLE)")),l=b);a:{r=a.fragmentShader;s=a.vertexShader;p=a.uniforms;b=a.attributes;q=a.defines;var c={map:!!a.map,envMap:!!a.envMap,lightMap:!!a.lightMap,bumpMap:!!a.bumpMap,normalMap:!!a.normalMap,
+specularMap:!!a.specularMap,vertexColors:a.vertexColors,fog:c,useFog:a.fog,fogExp:c instanceof THREE.FogExp2,sizeAttenuation:a.sizeAttenuation,skinning:a.skinning,maxBones:l,useVertexTexture:Ya&&d&&d.useVertexTexture,boneTextureWidth:d&&d.boneTextureWidth,boneTextureHeight:d&&d.boneTextureHeight,morphTargets:a.morphTargets,morphNormals:a.morphNormals,maxMorphTargets:this.maxMorphTargets,maxMorphNormals:this.maxMorphNormals,maxDirLights:e,maxPointLights:f,maxSpotLights:g,maxHemiLights:h,maxShadows:n,
+shadowMapEnabled:this.shadowMapEnabled&&d.receiveShadow,shadowMapSoft:this.shadowMapSoft,shadowMapDebug:this.shadowMapDebug,shadowMapCascade:this.shadowMapCascade,alphaTest:a.alphaTest,metal:a.metal,perPixel:a.perPixel,wrapAround:a.wrapAround,doubleSided:a.side===THREE.DoubleSide,flipSided:a.side===THREE.BackSide},t,u,v,d=[];m?d.push(m):(d.push(r),d.push(s));for(u in q)d.push(u),d.push(q[u]);for(t in c)d.push(t),d.push(c[t]);m=d.join();t=0;for(u=ca.length;t<u;t++)if(d=ca[t],d.code===m){d.usedTimes++;
+j=d.program;break a}t=[];for(v in q)u=q[v],!1!==u&&(u="#define "+v+" "+u,t.push(u));u=t.join("\n");v=k.createProgram();t=["precision "+R+" float;",u,ic?"#define VERTEX_TEXTURES":"",H.gammaInput?"#define GAMMA_INPUT":"",H.gammaOutput?"#define GAMMA_OUTPUT":"",H.physicallyBasedShading?"#define PHYSICALLY_BASED_SHADING":"","#define MAX_DIR_LIGHTS "+c.maxDirLights,"#define MAX_POINT_LIGHTS "+c.maxPointLights,"#define MAX_SPOT_LIGHTS "+c.maxSpotLights,"#define MAX_HEMI_LIGHTS "+c.maxHemiLights,"#define MAX_SHADOWS "+
+c.maxShadows,"#define MAX_BONES "+c.maxBones,c.map?"#define USE_MAP":"",c.envMap?"#define USE_ENVMAP":"",c.lightMap?"#define USE_LIGHTMAP":"",c.bumpMap?"#define USE_BUMPMAP":"",c.normalMap?"#define USE_NORMALMAP":"",c.specularMap?"#define USE_SPECULARMAP":"",c.vertexColors?"#define USE_COLOR":"",c.skinning?"#define USE_SKINNING":"",c.useVertexTexture?"#define BONE_TEXTURE":"",c.boneTextureWidth?"#define N_BONE_PIXEL_X "+c.boneTextureWidth.toFixed(1):"",c.boneTextureHeight?"#define N_BONE_PIXEL_Y "+
+c.boneTextureHeight.toFixed(1):"",c.morphTargets?"#define USE_MORPHTARGETS":"",c.morphNormals?"#define USE_MORPHNORMALS":"",c.perPixel?"#define PHONG_PER_PIXEL":"",c.wrapAround?"#define WRAP_AROUND":"",c.doubleSided?"#define DOUBLE_SIDED":"",c.flipSided?"#define FLIP_SIDED":"",c.shadowMapEnabled?"#define USE_SHADOWMAP":"",c.shadowMapSoft?"#define SHADOWMAP_SOFT":"",c.shadowMapDebug?"#define SHADOWMAP_DEBUG":"",c.shadowMapCascade?"#define SHADOWMAP_CASCADE":"",c.sizeAttenuation?"#define USE_SIZEATTENUATION":
+"","uniform mat4 modelMatrix;\nuniform mat4 modelViewMatrix;\nuniform mat4 projectionMatrix;\nuniform mat4 viewMatrix;\nuniform mat3 normalMatrix;\nuniform vec3 cameraPosition;\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;\n#ifdef USE_MORPHNORMALS\nattribute vec3 morphNormal0;\nattribute vec3 morphNormal1;\nattribute vec3 morphNormal2;\nattribute vec3 morphNormal3;\n#else\nattribute vec3 morphTarget4;\nattribute vec3 morphTarget5;\nattribute vec3 morphTarget6;\nattribute vec3 morphTarget7;\n#endif\n#endif\n#ifdef USE_SKINNING\nattribute vec4 skinIndex;\nattribute vec4 skinWeight;\n#endif\n"].join("\n");
 u=["precision "+R+" float;",c.bumpMap||c.normalMap?"#extension GL_OES_standard_derivatives : enable":"",u,"#define MAX_DIR_LIGHTS "+c.maxDirLights,"#define MAX_POINT_LIGHTS "+c.maxPointLights,"#define MAX_SPOT_LIGHTS "+c.maxSpotLights,"#define MAX_HEMI_LIGHTS "+c.maxHemiLights,"#define MAX_SHADOWS "+c.maxShadows,c.alphaTest?"#define ALPHATEST "+c.alphaTest:"",H.gammaInput?"#define GAMMA_INPUT":"",H.gammaOutput?"#define GAMMA_OUTPUT":"",H.physicallyBasedShading?"#define PHYSICALLY_BASED_SHADING":"",
 u=["precision "+R+" float;",c.bumpMap||c.normalMap?"#extension GL_OES_standard_derivatives : enable":"",u,"#define MAX_DIR_LIGHTS "+c.maxDirLights,"#define MAX_POINT_LIGHTS "+c.maxPointLights,"#define MAX_SPOT_LIGHTS "+c.maxSpotLights,"#define MAX_HEMI_LIGHTS "+c.maxHemiLights,"#define MAX_SHADOWS "+c.maxShadows,c.alphaTest?"#define ALPHATEST "+c.alphaTest:"",H.gammaInput?"#define GAMMA_INPUT":"",H.gammaOutput?"#define GAMMA_OUTPUT":"",H.physicallyBasedShading?"#define PHYSICALLY_BASED_SHADING":"",
 c.useFog&&c.fog?"#define USE_FOG":"",c.useFog&&c.fogExp?"#define FOG_EXP2":"",c.map?"#define USE_MAP":"",c.envMap?"#define USE_ENVMAP":"",c.lightMap?"#define USE_LIGHTMAP":"",c.bumpMap?"#define USE_BUMPMAP":"",c.normalMap?"#define USE_NORMALMAP":"",c.specularMap?"#define USE_SPECULARMAP":"",c.vertexColors?"#define USE_COLOR":"",c.metal?"#define METAL":"",c.perPixel?"#define PHONG_PER_PIXEL":"",c.wrapAround?"#define WRAP_AROUND":"",c.doubleSided?"#define DOUBLE_SIDED":"",c.flipSided?"#define FLIP_SIDED":
 c.useFog&&c.fog?"#define USE_FOG":"",c.useFog&&c.fogExp?"#define FOG_EXP2":"",c.map?"#define USE_MAP":"",c.envMap?"#define USE_ENVMAP":"",c.lightMap?"#define USE_LIGHTMAP":"",c.bumpMap?"#define USE_BUMPMAP":"",c.normalMap?"#define USE_NORMALMAP":"",c.specularMap?"#define USE_SPECULARMAP":"",c.vertexColors?"#define USE_COLOR":"",c.metal?"#define METAL":"",c.perPixel?"#define PHONG_PER_PIXEL":"",c.wrapAround?"#define WRAP_AROUND":"",c.doubleSided?"#define DOUBLE_SIDED":"",c.flipSided?"#define FLIP_SIDED":
 "",c.shadowMapEnabled?"#define USE_SHADOWMAP":"",c.shadowMapSoft?"#define SHADOWMAP_SOFT":"",c.shadowMapDebug?"#define SHADOWMAP_DEBUG":"",c.shadowMapCascade?"#define SHADOWMAP_CASCADE":"","uniform mat4 viewMatrix;\nuniform vec3 cameraPosition;\n"].join("\n");u=C("fragment",u+r);t=C("vertex",t+s);k.attachShader(v,t);k.attachShader(v,u);k.linkProgram(v);k.getProgramParameter(v,k.LINK_STATUS)||console.error("Could not initialise shader\nVALIDATE_STATUS: "+k.getProgramParameter(v,k.VALIDATE_STATUS)+
 "",c.shadowMapEnabled?"#define USE_SHADOWMAP":"",c.shadowMapSoft?"#define SHADOWMAP_SOFT":"",c.shadowMapDebug?"#define SHADOWMAP_DEBUG":"",c.shadowMapCascade?"#define SHADOWMAP_CASCADE":"","uniform mat4 viewMatrix;\nuniform vec3 cameraPosition;\n"].join("\n");u=C("fragment",u+r);t=C("vertex",t+s);k.attachShader(v,t);k.attachShader(v,u);k.linkProgram(v);k.getProgramParameter(v,k.LINK_STATUS)||console.error("Could not initialise shader\nVALIDATE_STATUS: "+k.getProgramParameter(v,k.VALIDATE_STATUS)+
@@ -656,21 +656,21 @@ A.shadowCameraBottom=t.shadowCameraBottom;A.shadowCameraTop=t.shadowCameraTop;A.
 D=D.shadowCascadeFarZ[x];t=t.pointsFrustum;t[0].z=s;t[1].z=s;t[2].z=s;t[3].z=s;t[4].z=D;t[5].z=D;t[6].z=D;t[7].z=D;F[r]=A;r++}else F[r]=q,r++;n=0;for(p=F.length;n<p;n++){q=F[n];q.shadowMap||(q.shadowMap=new THREE.WebGLRenderTarget(q.shadowMapWidth,q.shadowMapHeight,{minFilter:THREE.LinearFilter,magFilter:THREE.LinearFilter,format:THREE.RGBAFormat}),q.shadowMapSize=new THREE.Vector2(q.shadowMapWidth,q.shadowMapHeight),q.shadowMatrix=new THREE.Matrix4);if(!q.shadowCamera){if(q instanceof THREE.SpotLight)q.shadowCamera=
 D=D.shadowCascadeFarZ[x];t=t.pointsFrustum;t[0].z=s;t[1].z=s;t[2].z=s;t[3].z=s;t[4].z=D;t[5].z=D;t[6].z=D;t[7].z=D;F[r]=A;r++}else F[r]=q,r++;n=0;for(p=F.length;n<p;n++){q=F[n];q.shadowMap||(q.shadowMap=new THREE.WebGLRenderTarget(q.shadowMapWidth,q.shadowMapHeight,{minFilter:THREE.LinearFilter,magFilter:THREE.LinearFilter,format:THREE.RGBAFormat}),q.shadowMapSize=new THREE.Vector2(q.shadowMapWidth,q.shadowMapHeight),q.shadowMatrix=new THREE.Matrix4);if(!q.shadowCamera){if(q instanceof THREE.SpotLight)q.shadowCamera=
 new THREE.PerspectiveCamera(q.shadowCameraFov,q.shadowMapWidth/q.shadowMapHeight,q.shadowCameraNear,q.shadowCameraFar);else if(q instanceof THREE.DirectionalLight)q.shadowCamera=new THREE.OrthographicCamera(q.shadowCameraLeft,q.shadowCameraRight,q.shadowCameraTop,q.shadowCameraBottom,q.shadowCameraNear,q.shadowCameraFar);else{console.error("Unsupported light type for shadow");continue}l.add(q.shadowCamera);b.autoUpdateScene&&l.updateMatrixWorld()}q.shadowCameraVisible&&!q.cameraHelper&&(q.cameraHelper=
 new THREE.PerspectiveCamera(q.shadowCameraFov,q.shadowMapWidth/q.shadowMapHeight,q.shadowCameraNear,q.shadowCameraFar);else if(q instanceof THREE.DirectionalLight)q.shadowCamera=new THREE.OrthographicCamera(q.shadowCameraLeft,q.shadowCameraRight,q.shadowCameraTop,q.shadowCameraBottom,q.shadowCameraNear,q.shadowCameraFar);else{console.error("Unsupported light type for shadow");continue}l.add(q.shadowCamera);b.autoUpdateScene&&l.updateMatrixWorld()}q.shadowCameraVisible&&!q.cameraHelper&&(q.cameraHelper=
 new THREE.CameraHelper(q.shadowCamera),q.shadowCamera.add(q.cameraHelper));if(q.isVirtual&&A.originalCamera==m){u=m;r=q.shadowCamera;s=q.pointsFrustum;t=q.pointsWorld;i.set(Infinity,Infinity,Infinity);j.set(-Infinity,-Infinity,-Infinity);for(D=0;8>D;D++)x=t[D],x.copy(s[D]),THREE.ShadowMapPlugin.__projector.unprojectVector(x,u),r.matrixWorldInverse.multiplyVector3(x),x.x<i.x&&(i.x=x.x),x.x>j.x&&(j.x=x.x),x.y<i.y&&(i.y=x.y),x.y>j.y&&(j.y=x.y),x.z<i.z&&(i.z=x.z),x.z>j.z&&(j.z=x.z);r.left=i.x;r.right=
 new THREE.CameraHelper(q.shadowCamera),q.shadowCamera.add(q.cameraHelper));if(q.isVirtual&&A.originalCamera==m){u=m;r=q.shadowCamera;s=q.pointsFrustum;t=q.pointsWorld;i.set(Infinity,Infinity,Infinity);j.set(-Infinity,-Infinity,-Infinity);for(D=0;8>D;D++)x=t[D],x.copy(s[D]),THREE.ShadowMapPlugin.__projector.unprojectVector(x,u),r.matrixWorldInverse.multiplyVector3(x),x.x<i.x&&(i.x=x.x),x.x>j.x&&(j.x=x.x),x.y<i.y&&(i.y=x.y),x.y>j.y&&(j.y=x.y),x.z<i.z&&(i.z=x.z),x.z>j.z&&(j.z=x.z);r.left=i.x;r.right=
-j.x;r.top=j.y;r.bottom=i.y;r.updateProjectionMatrix()}r=q.shadowMap;s=q.shadowMatrix;u=q.shadowCamera;u.position.copy(q.matrixWorld.getPosition());u.lookAt(q.target.matrixWorld.getPosition());u.updateMatrixWorld();u.matrixWorldInverse.getInverse(u.matrixWorld);q.cameraHelper&&(q.cameraHelper.visible=q.shadowCameraVisible);q.shadowCameraVisible&&q.cameraHelper.update();s.set(0.5,0,0,0.5,0,0.5,0,0.5,0,0,0.5,0.5,0,0,0,1);s.multiplySelf(u.projectionMatrix);s.multiplySelf(u.matrixWorldInverse);u._viewMatrixArray||
-(u._viewMatrixArray=new Float32Array(16));u._projectionMatrixArray||(u._projectionMatrixArray=new Float32Array(16));u.matrixWorldInverse.flattenToArray(u._viewMatrixArray);u.projectionMatrix.flattenToArray(u._projectionMatrixArray);h.multiply(u.projectionMatrix,u.matrixWorldInverse);g.setFromMatrix(h);b.setRenderTarget(r);b.clear();t=l.__webglObjects;q=0;for(r=t.length;q<r;q++)if(D=t[q],s=D.object,D.render=!1,s.visible&&s.castShadow&&(!(s instanceof THREE.Mesh||s instanceof THREE.ParticleSystem)||
-!s.frustumCulled||g.contains(s)))s._modelViewMatrix.multiply(u.matrixWorldInverse,s.matrixWorld),D.render=!0;q=0;for(r=t.length;q<r;q++)D=t[q],D.render&&(s=D.object,D=D.buffer,v=s.material instanceof THREE.MeshFaceMaterial?s.material.materials[0]:s.material,x=0<s.geometry.morphTargets.length&&v.morphTargets,v=s instanceof THREE.SkinnedMesh&&v.skinning,x=s.customDepthMaterial?s.customDepthMaterial:v?x?f:e:x?d:c,D instanceof THREE.BufferGeometry?b.renderBufferDirect(u,l.__lights,null,x,D,s):b.renderBuffer(u,
-l.__lights,null,x,D,s));t=l.__webglObjectsImmediate;q=0;for(r=t.length;q<r;q++)D=t[q],s=D.object,s.visible&&s.castShadow&&(s._modelViewMatrix.multiply(u.matrixWorldInverse,s.matrixWorld),b.renderImmediateObject(u,l.__lights,null,c,s))}n=b.getClearColor();p=b.getClearAlpha();a.clearColor(n.r,n.g,n.b,p);a.enable(a.BLEND);b.shadowMapCullFrontFaces&&a.cullFace(a.BACK)}};THREE.ShadowMapPlugin.__projector=new THREE.Projector;THREE.SpritePlugin=function(){function a(a,b){return a.z!==b.z?b.z-a.z:b.id-a.id}var b,c,d,e,f,g,h,i,j;this.init=function(a){b=a.context;c=a;d=new Float32Array(16);e=new Uint16Array(6);a=0;d[a++]=-1;d[a++]=-1;d[a++]=0;d[a++]=0;d[a++]=1;d[a++]=-1;d[a++]=1;d[a++]=0;d[a++]=1;d[a++]=1;d[a++]=1;d[a++]=1;d[a++]=-1;d[a++]=1;d[a++]=0;d[a++]=1;a=0;e[a++]=0;e[a++]=1;e[a++]=2;e[a++]=0;e[a++]=2;e[a++]=3;f=b.createBuffer();g=b.createBuffer();b.bindBuffer(b.ARRAY_BUFFER,f);b.bufferData(b.ARRAY_BUFFER,d,b.STATIC_DRAW);
+j.x;r.top=j.y;r.bottom=i.y;r.updateProjectionMatrix()}r=q.shadowMap;s=q.shadowMatrix;u=q.shadowCamera;u.position.copy(q.matrixWorld.getPosition());u.lookAt(q.target.matrixWorld.getPosition());u.updateMatrixWorld();u.matrixWorldInverse.getInverse(u.matrixWorld);q.cameraHelper&&(q.cameraHelper.visible=q.shadowCameraVisible);q.shadowCameraVisible&&q.cameraHelper.update();s.set(0.5,0,0,0.5,0,0.5,0,0.5,0,0,0.5,0.5,0,0,0,1);s.multiplySelf(u.projectionMatrix);s.multiplySelf(u.matrixWorldInverse);h.multiply(u.projectionMatrix,
+u.matrixWorldInverse);g.setFromMatrix(h);b.setRenderTarget(r);b.clear();t=l.__webglObjects;q=0;for(r=t.length;q<r;q++)if(D=t[q],s=D.object,D.render=!1,s.visible&&s.castShadow&&(!(s instanceof THREE.Mesh||s instanceof THREE.ParticleSystem)||!s.frustumCulled||g.contains(s)))s._modelViewMatrix.multiply(u.matrixWorldInverse,s.matrixWorld),D.render=!0;q=0;for(r=t.length;q<r;q++)D=t[q],D.render&&(s=D.object,D=D.buffer,v=s.material instanceof THREE.MeshFaceMaterial?s.material.materials[0]:s.material,x=0<
+s.geometry.morphTargets.length&&v.morphTargets,v=s instanceof THREE.SkinnedMesh&&v.skinning,x=s.customDepthMaterial?s.customDepthMaterial:v?x?f:e:x?d:c,D instanceof THREE.BufferGeometry?b.renderBufferDirect(u,l.__lights,null,x,D,s):b.renderBuffer(u,l.__lights,null,x,D,s));t=l.__webglObjectsImmediate;q=0;for(r=t.length;q<r;q++)D=t[q],s=D.object,s.visible&&s.castShadow&&(s._modelViewMatrix.multiply(u.matrixWorldInverse,s.matrixWorld),b.renderImmediateObject(u,l.__lights,null,c,s))}n=b.getClearColor();
+p=b.getClearAlpha();a.clearColor(n.r,n.g,n.b,p);a.enable(a.BLEND);b.shadowMapCullFrontFaces&&a.cullFace(a.BACK)}};THREE.ShadowMapPlugin.__projector=new THREE.Projector;THREE.SpritePlugin=function(){function a(a,b){return a.z!==b.z?b.z-a.z:b.id-a.id}var b,c,d,e,f,g,h,i,j;this.init=function(a){b=a.context;c=a;d=new Float32Array(16);e=new Uint16Array(6);a=0;d[a++]=-1;d[a++]=-1;d[a++]=0;d[a++]=0;d[a++]=1;d[a++]=-1;d[a++]=1;d[a++]=0;d[a++]=1;d[a++]=1;d[a++]=1;d[a++]=1;d[a++]=-1;d[a++]=1;d[a++]=0;d[a++]=1;a=0;e[a++]=0;e[a++]=1;e[a++]=2;e[a++]=0;e[a++]=2;e[a++]=3;f=b.createBuffer();g=b.createBuffer();b.bindBuffer(b.ARRAY_BUFFER,f);b.bufferData(b.ARRAY_BUFFER,d,b.STATIC_DRAW);
 b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,g);b.bufferData(b.ELEMENT_ARRAY_BUFFER,e,b.STATIC_DRAW);var a=THREE.ShaderSprite.sprite,m=b.createProgram(),n=b.createShader(b.FRAGMENT_SHADER),p=b.createShader(b.VERTEX_SHADER);b.shaderSource(n,a.fragmentShader);b.shaderSource(p,a.vertexShader);b.compileShader(n);b.compileShader(p);b.attachShader(m,n);b.attachShader(m,p);b.linkProgram(m);h=m;i={};j={};i.position=b.getAttribLocation(h,"position");i.uv=b.getAttribLocation(h,"uv");j.uvOffset=b.getUniformLocation(h,
 b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,g);b.bufferData(b.ELEMENT_ARRAY_BUFFER,e,b.STATIC_DRAW);var a=THREE.ShaderSprite.sprite,m=b.createProgram(),n=b.createShader(b.FRAGMENT_SHADER),p=b.createShader(b.VERTEX_SHADER);b.shaderSource(n,a.fragmentShader);b.shaderSource(p,a.vertexShader);b.compileShader(n);b.compileShader(p);b.attachShader(m,n);b.attachShader(m,p);b.linkProgram(m);h=m;i={};j={};i.position=b.getAttribLocation(h,"position");i.uv=b.getAttribLocation(h,"uv");j.uvOffset=b.getUniformLocation(h,
 "uvOffset");j.uvScale=b.getUniformLocation(h,"uvScale");j.rotation=b.getUniformLocation(h,"rotation");j.scale=b.getUniformLocation(h,"scale");j.alignment=b.getUniformLocation(h,"alignment");j.color=b.getUniformLocation(h,"color");j.map=b.getUniformLocation(h,"map");j.opacity=b.getUniformLocation(h,"opacity");j.useScreenCoordinates=b.getUniformLocation(h,"useScreenCoordinates");j.sizeAttenuation=b.getUniformLocation(h,"sizeAttenuation");j.screenPosition=b.getUniformLocation(h,"screenPosition");j.modelViewMatrix=
 "uvOffset");j.uvScale=b.getUniformLocation(h,"uvScale");j.rotation=b.getUniformLocation(h,"rotation");j.scale=b.getUniformLocation(h,"scale");j.alignment=b.getUniformLocation(h,"alignment");j.color=b.getUniformLocation(h,"color");j.map=b.getUniformLocation(h,"map");j.opacity=b.getUniformLocation(h,"opacity");j.useScreenCoordinates=b.getUniformLocation(h,"useScreenCoordinates");j.sizeAttenuation=b.getUniformLocation(h,"sizeAttenuation");j.screenPosition=b.getUniformLocation(h,"screenPosition");j.modelViewMatrix=
 b.getUniformLocation(h,"modelViewMatrix");j.projectionMatrix=b.getUniformLocation(h,"projectionMatrix");j.fogType=b.getUniformLocation(h,"fogType");j.fogDensity=b.getUniformLocation(h,"fogDensity");j.fogNear=b.getUniformLocation(h,"fogNear");j.fogFar=b.getUniformLocation(h,"fogFar");j.fogColor=b.getUniformLocation(h,"fogColor");j.alphaTest=b.getUniformLocation(h,"alphaTest")};this.render=function(d,e,n,p){var q=d.__webglSprites,r=q.length;if(r){var u=i,s=j,D=p/n,n=0.5*n,x=0.5*p;b.useProgram(h);b.enableVertexAttribArray(u.position);
 b.getUniformLocation(h,"modelViewMatrix");j.projectionMatrix=b.getUniformLocation(h,"projectionMatrix");j.fogType=b.getUniformLocation(h,"fogType");j.fogDensity=b.getUniformLocation(h,"fogDensity");j.fogNear=b.getUniformLocation(h,"fogNear");j.fogFar=b.getUniformLocation(h,"fogFar");j.fogColor=b.getUniformLocation(h,"fogColor");j.alphaTest=b.getUniformLocation(h,"alphaTest")};this.render=function(d,e,n,p){var q=d.__webglSprites,r=q.length;if(r){var u=i,s=j,D=p/n,n=0.5*n,x=0.5*p;b.useProgram(h);b.enableVertexAttribArray(u.position);
-b.enableVertexAttribArray(u.uv);b.disable(b.CULL_FACE);b.enable(b.BLEND);b.bindBuffer(b.ARRAY_BUFFER,f);b.vertexAttribPointer(u.position,2,b.FLOAT,!1,16,0);b.vertexAttribPointer(u.uv,2,b.FLOAT,!1,16,8);b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,g);b.uniformMatrix4fv(s.projectionMatrix,!1,e._projectionMatrixArray);b.activeTexture(b.TEXTURE0);b.uniform1i(s.map,0);var t=u=0,F=d.fog;F?(b.uniform3f(s.fogColor,F.color.r,F.color.g,F.color.b),F instanceof THREE.Fog?(b.uniform1f(s.fogNear,F.near),b.uniform1f(s.fogFar,
+b.enableVertexAttribArray(u.uv);b.disable(b.CULL_FACE);b.enable(b.BLEND);b.bindBuffer(b.ARRAY_BUFFER,f);b.vertexAttribPointer(u.position,2,b.FLOAT,!1,16,0);b.vertexAttribPointer(u.uv,2,b.FLOAT,!1,16,8);b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,g);b.uniformMatrix4fv(s.projectionMatrix,!1,e.projectionMatrix.elements);b.activeTexture(b.TEXTURE0);b.uniform1i(s.map,0);var t=u=0,F=d.fog;F?(b.uniform3f(s.fogColor,F.color.r,F.color.g,F.color.b),F instanceof THREE.Fog?(b.uniform1f(s.fogNear,F.near),b.uniform1f(s.fogFar,
 F.far),b.uniform1i(s.fogType,1),t=u=1):F instanceof THREE.FogExp2&&(b.uniform1f(s.fogDensity,F.density),b.uniform1i(s.fogType,2),t=u=2)):(b.uniform1i(s.fogType,0),t=u=0);for(var A,v,z=[],F=0;F<r;F++)A=q[F],v=A.material,A.visible&&0!==v.opacity&&(v.useScreenCoordinates?A.z=-A.position.z:(A._modelViewMatrix.multiply(e.matrixWorldInverse,A.matrixWorld),A.z=-A._modelViewMatrix.elements[14]));q.sort(a);for(F=0;F<r;F++)A=q[F],v=A.material,A.visible&&0!==v.opacity&&(v.map&&v.map.image&&v.map.image.width)&&
 F.far),b.uniform1i(s.fogType,1),t=u=1):F instanceof THREE.FogExp2&&(b.uniform1f(s.fogDensity,F.density),b.uniform1i(s.fogType,2),t=u=2)):(b.uniform1i(s.fogType,0),t=u=0);for(var A,v,z=[],F=0;F<r;F++)A=q[F],v=A.material,A.visible&&0!==v.opacity&&(v.useScreenCoordinates?A.z=-A.position.z:(A._modelViewMatrix.multiply(e.matrixWorldInverse,A.matrixWorld),A.z=-A._modelViewMatrix.elements[14]));q.sort(a);for(F=0;F<r;F++)A=q[F],v=A.material,A.visible&&0!==v.opacity&&(v.map&&v.map.image&&v.map.image.width)&&
 (b.uniform1f(s.alphaTest,v.alphaTest),v.useScreenCoordinates?(b.uniform1i(s.useScreenCoordinates,1),b.uniform3f(s.screenPosition,(A.position.x-n)/n,(x-A.position.y)/x,Math.max(0,Math.min(1,A.position.z)))):(b.uniform1i(s.useScreenCoordinates,0),b.uniform1i(s.sizeAttenuation,v.sizeAttenuation?1:0),b.uniformMatrix4fv(s.modelViewMatrix,!1,A._modelViewMatrix.elements)),e=d.fog&&v.fog?t:0,u!==e&&(b.uniform1i(s.fogType,e),u=e),e=1/(v.scaleByViewport?p:1),z[0]=e*D*A.scale.x,z[1]=e*A.scale.y,b.uniform2f(s.uvScale,
 (b.uniform1f(s.alphaTest,v.alphaTest),v.useScreenCoordinates?(b.uniform1i(s.useScreenCoordinates,1),b.uniform3f(s.screenPosition,(A.position.x-n)/n,(x-A.position.y)/x,Math.max(0,Math.min(1,A.position.z)))):(b.uniform1i(s.useScreenCoordinates,0),b.uniform1i(s.sizeAttenuation,v.sizeAttenuation?1:0),b.uniformMatrix4fv(s.modelViewMatrix,!1,A._modelViewMatrix.elements)),e=d.fog&&v.fog?t:0,u!==e&&(b.uniform1i(s.fogType,e),u=e),e=1/(v.scaleByViewport?p:1),z[0]=e*D*A.scale.x,z[1]=e*A.scale.y,b.uniform2f(s.uvScale,
 v.uvScale.x,v.uvScale.y),b.uniform2f(s.uvOffset,v.uvOffset.x,v.uvOffset.y),b.uniform2f(s.alignment,v.alignment.x,v.alignment.y),b.uniform1f(s.opacity,v.opacity),b.uniform3f(s.color,v.color.r,v.color.g,v.color.b),b.uniform1f(s.rotation,A.rotation),b.uniform2fv(s.scale,z),c.setBlending(v.blending,v.blendEquation,v.blendSrc,v.blendDst),c.setDepthTest(v.depthTest),c.setDepthWrite(v.depthWrite),c.setTexture(v.map,0),b.drawElements(b.TRIANGLES,6,b.UNSIGNED_SHORT,0));b.enable(b.CULL_FACE)}}};THREE.DepthPassPlugin=function(){this.enabled=!1;this.renderTarget=null;var a,b,c,d,e,f,g=new THREE.Frustum,h=new THREE.Matrix4;this.init=function(g){a=g.context;b=g;var g=THREE.ShaderLib.depthRGBA,h=THREE.UniformsUtils.clone(g.uniforms);c=new THREE.ShaderMaterial({fragmentShader:g.fragmentShader,vertexShader:g.vertexShader,uniforms:h});d=new THREE.ShaderMaterial({fragmentShader:g.fragmentShader,vertexShader:g.vertexShader,uniforms:h,morphTargets:!0});e=new THREE.ShaderMaterial({fragmentShader:g.fragmentShader,
 v.uvScale.x,v.uvScale.y),b.uniform2f(s.uvOffset,v.uvOffset.x,v.uvOffset.y),b.uniform2f(s.alignment,v.alignment.x,v.alignment.y),b.uniform1f(s.opacity,v.opacity),b.uniform3f(s.color,v.color.r,v.color.g,v.color.b),b.uniform1f(s.rotation,A.rotation),b.uniform2fv(s.scale,z),c.setBlending(v.blending,v.blendEquation,v.blendSrc,v.blendDst),c.setDepthTest(v.depthTest),c.setDepthWrite(v.depthWrite),c.setTexture(v.map,0),b.drawElements(b.TRIANGLES,6,b.UNSIGNED_SHORT,0));b.enable(b.CULL_FACE)}}};THREE.DepthPassPlugin=function(){this.enabled=!1;this.renderTarget=null;var a,b,c,d,e,f,g=new THREE.Frustum,h=new THREE.Matrix4;this.init=function(g){a=g.context;b=g;var g=THREE.ShaderLib.depthRGBA,h=THREE.UniformsUtils.clone(g.uniforms);c=new THREE.ShaderMaterial({fragmentShader:g.fragmentShader,vertexShader:g.vertexShader,uniforms:h});d=new THREE.ShaderMaterial({fragmentShader:g.fragmentShader,vertexShader:g.vertexShader,uniforms:h,morphTargets:!0});e=new THREE.ShaderMaterial({fragmentShader:g.fragmentShader,
-vertexShader:g.vertexShader,uniforms:h,skinning:!0});f=new THREE.ShaderMaterial({fragmentShader:g.fragmentShader,vertexShader:g.vertexShader,uniforms:h,morphTargets:!0,skinning:!0});c._shadowPass=!0;d._shadowPass=!0;e._shadowPass=!0;f._shadowPass=!0};this.render=function(a,b){this.enabled&&this.update(a,b)};this.update=function(i,j){var l,m,n,p,q,r;a.clearColor(1,1,1,1);a.disable(a.BLEND);b.setDepthTest(!0);b.autoUpdateScene&&i.updateMatrixWorld();j._viewMatrixArray||(j._viewMatrixArray=new Float32Array(16));
-j._projectionMatrixArray||(j._projectionMatrixArray=new Float32Array(16));j.matrixWorldInverse.getInverse(j.matrixWorld);j.matrixWorldInverse.flattenToArray(j._viewMatrixArray);j.projectionMatrix.flattenToArray(j._projectionMatrixArray);h.multiply(j.projectionMatrix,j.matrixWorldInverse);g.setFromMatrix(h);b.setRenderTarget(this.renderTarget);b.clear();r=i.__webglObjects;l=0;for(m=r.length;l<m;l++)if(n=r[l],q=n.object,n.render=!1,q.visible&&(!(q instanceof THREE.Mesh||q instanceof THREE.ParticleSystem)||
-!q.frustumCulled||g.contains(q)))q._modelViewMatrix.multiply(j.matrixWorldInverse,q.matrixWorld),n.render=!0;var u;l=0;for(m=r.length;l<m;l++)if(n=r[l],n.render&&(q=n.object,n=n.buffer,!(q instanceof THREE.ParticleSystem)||q.customDepthMaterial))(u=q.material instanceof THREE.MeshFaceMaterial?q.material.materials[0]:q.material)&&b.setMaterialFaces(q.material),p=0<q.geometry.morphTargets.length&&u.morphTargets,u=q instanceof THREE.SkinnedMesh&&u.skinning,p=q.customDepthMaterial?q.customDepthMaterial:
-u?p?f:e:p?d:c,n instanceof THREE.BufferGeometry?b.renderBufferDirect(j,i.__lights,null,p,n,q):b.renderBuffer(j,i.__lights,null,p,n,q);r=i.__webglObjectsImmediate;l=0;for(m=r.length;l<m;l++)n=r[l],q=n.object,q.visible&&(q._modelViewMatrix.multiply(j.matrixWorldInverse,q.matrixWorld),b.renderImmediateObject(j,i.__lights,null,c,q));l=b.getClearColor();m=b.getClearAlpha();a.clearColor(l.r,l.g,l.b,m);a.enable(a.BLEND)}};THREE.ShaderFlares={lensFlareVertexTexture:{vertexShader:"uniform vec3 screenPosition;\nuniform vec2 scale;\nuniform float rotation;\nuniform int renderType;\nuniform sampler2D occlusionMap;\nattribute vec2 position;\nattribute vec2 uv;\nvarying vec2 vUV;\nvarying float vVisibility;\nvoid main() {\nvUV = uv;\nvec2 pos = position;\nif( renderType == 2 ) {\nvec4 visibility = texture2D( occlusionMap, vec2( 0.1, 0.1 ) ) +\ntexture2D( occlusionMap, vec2( 0.5, 0.1 ) ) +\ntexture2D( occlusionMap, vec2( 0.9, 0.1 ) ) +\ntexture2D( occlusionMap, vec2( 0.9, 0.5 ) ) +\ntexture2D( occlusionMap, vec2( 0.9, 0.9 ) ) +\ntexture2D( occlusionMap, vec2( 0.5, 0.9 ) ) +\ntexture2D( occlusionMap, vec2( 0.1, 0.9 ) ) +\ntexture2D( occlusionMap, vec2( 0.1, 0.5 ) ) +\ntexture2D( occlusionMap, vec2( 0.5, 0.5 ) );\nvVisibility = (       visibility.r / 9.0 ) *\n( 1.0 - visibility.g / 9.0 ) *\n(       visibility.b / 9.0 ) *\n( 1.0 - visibility.a / 9.0 );\npos.x = cos( rotation ) * position.x - sin( rotation ) * position.y;\npos.y = sin( rotation ) * position.x + cos( rotation ) * position.y;\n}\ngl_Position = vec4( ( pos * scale + screenPosition.xy ).xy, screenPosition.z, 1.0 );\n}",
+vertexShader:g.vertexShader,uniforms:h,skinning:!0});f=new THREE.ShaderMaterial({fragmentShader:g.fragmentShader,vertexShader:g.vertexShader,uniforms:h,morphTargets:!0,skinning:!0});c._shadowPass=!0;d._shadowPass=!0;e._shadowPass=!0;f._shadowPass=!0};this.render=function(a,b){this.enabled&&this.update(a,b)};this.update=function(i,j){var l,m,n,p,q,r;a.clearColor(1,1,1,1);a.disable(a.BLEND);b.setDepthTest(!0);b.autoUpdateScene&&i.updateMatrixWorld();j.matrixWorldInverse.getInverse(j.matrixWorld);h.multiply(j.projectionMatrix,
+j.matrixWorldInverse);g.setFromMatrix(h);b.setRenderTarget(this.renderTarget);b.clear();r=i.__webglObjects;l=0;for(m=r.length;l<m;l++)if(n=r[l],q=n.object,n.render=!1,q.visible&&(!(q instanceof THREE.Mesh||q instanceof THREE.ParticleSystem)||!q.frustumCulled||g.contains(q)))q._modelViewMatrix.multiply(j.matrixWorldInverse,q.matrixWorld),n.render=!0;var u;l=0;for(m=r.length;l<m;l++)if(n=r[l],n.render&&(q=n.object,n=n.buffer,!(q instanceof THREE.ParticleSystem)||q.customDepthMaterial))(u=q.material instanceof
+THREE.MeshFaceMaterial?q.material.materials[0]:q.material)&&b.setMaterialFaces(q.material),p=0<q.geometry.morphTargets.length&&u.morphTargets,u=q instanceof THREE.SkinnedMesh&&u.skinning,p=q.customDepthMaterial?q.customDepthMaterial:u?p?f:e:p?d:c,n instanceof THREE.BufferGeometry?b.renderBufferDirect(j,i.__lights,null,p,n,q):b.renderBuffer(j,i.__lights,null,p,n,q);r=i.__webglObjectsImmediate;l=0;for(m=r.length;l<m;l++)n=r[l],q=n.object,q.visible&&(q._modelViewMatrix.multiply(j.matrixWorldInverse,
+q.matrixWorld),b.renderImmediateObject(j,i.__lights,null,c,q));l=b.getClearColor();m=b.getClearAlpha();a.clearColor(l.r,l.g,l.b,m);a.enable(a.BLEND)}};THREE.ShaderFlares={lensFlareVertexTexture:{vertexShader:"uniform vec3 screenPosition;\nuniform vec2 scale;\nuniform float rotation;\nuniform int renderType;\nuniform sampler2D occlusionMap;\nattribute vec2 position;\nattribute vec2 uv;\nvarying vec2 vUV;\nvarying float vVisibility;\nvoid main() {\nvUV = uv;\nvec2 pos = position;\nif( renderType == 2 ) {\nvec4 visibility = texture2D( occlusionMap, vec2( 0.1, 0.1 ) ) +\ntexture2D( occlusionMap, vec2( 0.5, 0.1 ) ) +\ntexture2D( occlusionMap, vec2( 0.9, 0.1 ) ) +\ntexture2D( occlusionMap, vec2( 0.9, 0.5 ) ) +\ntexture2D( occlusionMap, vec2( 0.9, 0.9 ) ) +\ntexture2D( occlusionMap, vec2( 0.5, 0.9 ) ) +\ntexture2D( occlusionMap, vec2( 0.1, 0.9 ) ) +\ntexture2D( occlusionMap, vec2( 0.1, 0.5 ) ) +\ntexture2D( occlusionMap, vec2( 0.5, 0.5 ) );\nvVisibility = (       visibility.r / 9.0 ) *\n( 1.0 - visibility.g / 9.0 ) *\n(       visibility.b / 9.0 ) *\n( 1.0 - visibility.a / 9.0 );\npos.x = cos( rotation ) * position.x - sin( rotation ) * position.y;\npos.y = sin( rotation ) * position.x + cos( rotation ) * position.y;\n}\ngl_Position = vec4( ( pos * scale + screenPosition.xy ).xy, screenPosition.z, 1.0 );\n}",
 fragmentShader:"precision mediump float;\nuniform sampler2D map;\nuniform float opacity;\nuniform int renderType;\nuniform vec3 color;\nvarying vec2 vUV;\nvarying float vVisibility;\nvoid main() {\nif( renderType == 0 ) {\ngl_FragColor = vec4( 1.0, 0.0, 1.0, 0.0 );\n} else if( renderType == 1 ) {\ngl_FragColor = texture2D( map, vUV );\n} else {\nvec4 texture = texture2D( map, vUV );\ntexture.a *= opacity * vVisibility;\ngl_FragColor = texture;\ngl_FragColor.rgb *= color;\n}\n}"},lensFlare:{vertexShader:"uniform vec3 screenPosition;\nuniform vec2 scale;\nuniform float rotation;\nuniform int renderType;\nattribute vec2 position;\nattribute vec2 uv;\nvarying vec2 vUV;\nvoid main() {\nvUV = uv;\nvec2 pos = position;\nif( renderType == 2 ) {\npos.x = cos( rotation ) * position.x - sin( rotation ) * position.y;\npos.y = sin( rotation ) * position.x + cos( rotation ) * position.y;\n}\ngl_Position = vec4( ( pos * scale + screenPosition.xy ).xy, screenPosition.z, 1.0 );\n}",
 fragmentShader:"precision mediump float;\nuniform sampler2D map;\nuniform float opacity;\nuniform int renderType;\nuniform vec3 color;\nvarying vec2 vUV;\nvarying float vVisibility;\nvoid main() {\nif( renderType == 0 ) {\ngl_FragColor = vec4( 1.0, 0.0, 1.0, 0.0 );\n} else if( renderType == 1 ) {\ngl_FragColor = texture2D( map, vUV );\n} else {\nvec4 texture = texture2D( map, vUV );\ntexture.a *= opacity * vVisibility;\ngl_FragColor = texture;\ngl_FragColor.rgb *= color;\n}\n}"},lensFlare:{vertexShader:"uniform vec3 screenPosition;\nuniform vec2 scale;\nuniform float rotation;\nuniform int renderType;\nattribute vec2 position;\nattribute vec2 uv;\nvarying vec2 vUV;\nvoid main() {\nvUV = uv;\nvec2 pos = position;\nif( renderType == 2 ) {\npos.x = cos( rotation ) * position.x - sin( rotation ) * position.y;\npos.y = sin( rotation ) * position.x + cos( rotation ) * position.y;\n}\ngl_Position = vec4( ( pos * scale + screenPosition.xy ).xy, screenPosition.z, 1.0 );\n}",
 fragmentShader:"precision mediump float;\nuniform sampler2D map;\nuniform sampler2D occlusionMap;\nuniform float opacity;\nuniform int renderType;\nuniform vec3 color;\nvarying vec2 vUV;\nvoid main() {\nif( renderType == 0 ) {\ngl_FragColor = vec4( texture2D( map, vUV ).rgb, 0.0 );\n} else if( renderType == 1 ) {\ngl_FragColor = texture2D( map, vUV );\n} else {\nfloat visibility = texture2D( occlusionMap, vec2( 0.5, 0.1 ) ).a +\ntexture2D( occlusionMap, vec2( 0.9, 0.5 ) ).a +\ntexture2D( occlusionMap, vec2( 0.5, 0.9 ) ).a +\ntexture2D( occlusionMap, vec2( 0.1, 0.5 ) ).a;\nvisibility = ( 1.0 - visibility / 4.0 );\nvec4 texture = texture2D( map, vUV );\ntexture.a *= opacity * visibility;\ngl_FragColor = texture;\ngl_FragColor.rgb *= color;\n}\n}"}};THREE.ShaderSprite={sprite:{vertexShader:"uniform int useScreenCoordinates;\nuniform int sizeAttenuation;\nuniform vec3 screenPosition;\nuniform mat4 modelViewMatrix;\nuniform mat4 projectionMatrix;\nuniform float rotation;\nuniform vec2 scale;\nuniform vec2 alignment;\nuniform vec2 uvOffset;\nuniform vec2 uvScale;\nattribute vec2 position;\nattribute vec2 uv;\nvarying vec2 vUV;\nvoid main() {\nvUV = uvOffset + uv * uvScale;\nvec2 alignedPosition = position + alignment;\nvec2 rotatedPosition;\nrotatedPosition.x = ( cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y ) * scale.x;\nrotatedPosition.y = ( sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y ) * scale.y;\nvec4 finalPosition;\nif( useScreenCoordinates != 0 ) {\nfinalPosition = vec4( screenPosition.xy + rotatedPosition, screenPosition.z, 1.0 );\n} else {\nfinalPosition = projectionMatrix * modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );\nfinalPosition.xy += rotatedPosition * ( sizeAttenuation == 1 ? 1.0 : finalPosition.z );\n}\ngl_Position = finalPosition;\n}",
 fragmentShader:"precision mediump float;\nuniform sampler2D map;\nuniform sampler2D occlusionMap;\nuniform float opacity;\nuniform int renderType;\nuniform vec3 color;\nvarying vec2 vUV;\nvoid main() {\nif( renderType == 0 ) {\ngl_FragColor = vec4( texture2D( map, vUV ).rgb, 0.0 );\n} else if( renderType == 1 ) {\ngl_FragColor = texture2D( map, vUV );\n} else {\nfloat visibility = texture2D( occlusionMap, vec2( 0.5, 0.1 ) ).a +\ntexture2D( occlusionMap, vec2( 0.9, 0.5 ) ).a +\ntexture2D( occlusionMap, vec2( 0.5, 0.9 ) ).a +\ntexture2D( occlusionMap, vec2( 0.1, 0.5 ) ).a;\nvisibility = ( 1.0 - visibility / 4.0 );\nvec4 texture = texture2D( map, vUV );\ntexture.a *= opacity * visibility;\ngl_FragColor = texture;\ngl_FragColor.rgb *= color;\n}\n}"}};THREE.ShaderSprite={sprite:{vertexShader:"uniform int useScreenCoordinates;\nuniform int sizeAttenuation;\nuniform vec3 screenPosition;\nuniform mat4 modelViewMatrix;\nuniform mat4 projectionMatrix;\nuniform float rotation;\nuniform vec2 scale;\nuniform vec2 alignment;\nuniform vec2 uvOffset;\nuniform vec2 uvScale;\nattribute vec2 position;\nattribute vec2 uv;\nvarying vec2 vUV;\nvoid main() {\nvUV = uvOffset + uv * uvScale;\nvec2 alignedPosition = position + alignment;\nvec2 rotatedPosition;\nrotatedPosition.x = ( cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y ) * scale.x;\nrotatedPosition.y = ( sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y ) * scale.y;\nvec4 finalPosition;\nif( useScreenCoordinates != 0 ) {\nfinalPosition = vec4( screenPosition.xy + rotatedPosition, screenPosition.z, 1.0 );\n} else {\nfinalPosition = projectionMatrix * modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );\nfinalPosition.xy += rotatedPosition * ( sizeAttenuation == 1 ? 1.0 : finalPosition.z );\n}\ngl_Position = finalPosition;\n}",
 fragmentShader:"precision mediump float;\nuniform vec3 color;\nuniform sampler2D map;\nuniform float opacity;\nuniform int fogType;\nuniform vec3 fogColor;\nuniform float fogDensity;\nuniform float fogNear;\nuniform float fogFar;\nuniform float alphaTest;\nvarying vec2 vUV;\nvoid main() {\nvec4 texture = texture2D( map, vUV );\nif ( texture.a < alphaTest ) discard;\ngl_FragColor = vec4( color * texture.xyz, texture.a * opacity );\nif ( fogType > 0 ) {\nfloat depth = gl_FragCoord.z / gl_FragCoord.w;\nfloat fogFactor = 0.0;\nif ( fogType == 1 ) {\nfogFactor = smoothstep( fogNear, fogFar, depth );\n} else {\nconst float LOG2 = 1.442695;\nfloat fogFactor = exp2( - fogDensity * fogDensity * depth * depth * LOG2 );\nfogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );\n}\ngl_FragColor = mix( gl_FragColor, vec4( fogColor, gl_FragColor.w ), fogFactor );\n}\n}"}};
 fragmentShader:"precision mediump float;\nuniform vec3 color;\nuniform sampler2D map;\nuniform float opacity;\nuniform int fogType;\nuniform vec3 fogColor;\nuniform float fogDensity;\nuniform float fogNear;\nuniform float fogFar;\nuniform float alphaTest;\nvarying vec2 vUV;\nvoid main() {\nvec4 texture = texture2D( map, vUV );\nif ( texture.a < alphaTest ) discard;\ngl_FragColor = vec4( color * texture.xyz, texture.a * opacity );\nif ( fogType > 0 ) {\nfloat depth = gl_FragCoord.z / gl_FragCoord.w;\nfloat fogFactor = 0.0;\nif ( fogType == 1 ) {\nfogFactor = smoothstep( fogNear, fogFar, depth );\n} else {\nconst float LOG2 = 1.442695;\nfloat fogFactor = exp2( - fogDensity * fogDensity * depth * depth * LOG2 );\nfogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );\n}\ngl_FragColor = mix( gl_FragColor, vec4( fogColor, gl_FragColor.w ), fogFactor );\n}\n}"}};

+ 0 - 6
src/extras/renderers/plugins/DepthPassPlugin.js

@@ -65,14 +65,8 @@ THREE.DepthPassPlugin = function ( ) {
 
 
 		// update camera matrices and frustum
 		// update camera matrices and frustum
 
 
-		if ( ! camera._viewMatrixArray ) camera._viewMatrixArray = new Float32Array( 16 );
-		if ( ! camera._projectionMatrixArray ) camera._projectionMatrixArray = new Float32Array( 16 );
-
 		camera.matrixWorldInverse.getInverse( camera.matrixWorld );
 		camera.matrixWorldInverse.getInverse( camera.matrixWorld );
 
 
-		camera.matrixWorldInverse.flattenToArray( camera._viewMatrixArray );
-		camera.projectionMatrix.flattenToArray( camera._projectionMatrixArray );
-
 		_projScreenMatrix.multiply( camera.projectionMatrix, camera.matrixWorldInverse );
 		_projScreenMatrix.multiply( camera.projectionMatrix, camera.matrixWorldInverse );
 		_frustum.setFromMatrix( _projScreenMatrix );
 		_frustum.setFromMatrix( _projScreenMatrix );
 
 

+ 0 - 6
src/extras/renderers/plugins/ShadowMapPlugin.js

@@ -209,12 +209,6 @@ THREE.ShadowMapPlugin = function ( ) {
 
 
 			// update camera matrices and frustum
 			// update camera matrices and frustum
 
 
-			if ( ! shadowCamera._viewMatrixArray ) shadowCamera._viewMatrixArray = new Float32Array( 16 );
-			if ( ! shadowCamera._projectionMatrixArray ) shadowCamera._projectionMatrixArray = new Float32Array( 16 );
-
-			shadowCamera.matrixWorldInverse.flattenToArray( shadowCamera._viewMatrixArray );
-			shadowCamera.projectionMatrix.flattenToArray( shadowCamera._projectionMatrixArray );
-
 			_projScreenMatrix.multiply( shadowCamera.projectionMatrix, shadowCamera.matrixWorldInverse );
 			_projScreenMatrix.multiply( shadowCamera.projectionMatrix, shadowCamera.matrixWorldInverse );
 			_frustum.setFromMatrix( _projScreenMatrix );
 			_frustum.setFromMatrix( _projScreenMatrix );
 
 

+ 1 - 1
src/extras/renderers/plugins/SpritePlugin.js

@@ -109,7 +109,7 @@ THREE.SpritePlugin = function ( ) {
 
 
 		_gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, _sprite.elementBuffer );
 		_gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, _sprite.elementBuffer );
 
 
-		_gl.uniformMatrix4fv( uniforms.projectionMatrix, false, camera._projectionMatrixArray );
+		_gl.uniformMatrix4fv( uniforms.projectionMatrix, false, camera.projectionMatrix.elements );
 
 
 		_gl.activeTexture( _gl.TEXTURE0 );
 		_gl.activeTexture( _gl.TEXTURE0 );
 		_gl.uniform1i( uniforms.map, 0 );
 		_gl.uniform1i( uniforms.map, 0 );

+ 2 - 8
src/renderers/WebGLRenderer.js

@@ -3910,14 +3910,8 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 
 		if ( camera.parent === undefined ) camera.updateMatrixWorld();
 		if ( camera.parent === undefined ) camera.updateMatrixWorld();
 
 
-		if ( ! camera._viewMatrixArray ) camera._viewMatrixArray = new Float32Array( 16 );
-		if ( ! camera._projectionMatrixArray ) camera._projectionMatrixArray = new Float32Array( 16 );
-
 		camera.matrixWorldInverse.getInverse( camera.matrixWorld );
 		camera.matrixWorldInverse.getInverse( camera.matrixWorld );
 
 
-		camera.matrixWorldInverse.flattenToArray( camera._viewMatrixArray );
-		camera.projectionMatrix.flattenToArray( camera._projectionMatrixArray );
-
 		_projScreenMatrix.multiply( camera.projectionMatrix, camera.matrixWorldInverse );
 		_projScreenMatrix.multiply( camera.projectionMatrix, camera.matrixWorldInverse );
 		_frustum.setFromMatrix( _projScreenMatrix );
 		_frustum.setFromMatrix( _projScreenMatrix );
 
 
@@ -5036,7 +5030,7 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 
 		if ( refreshMaterial || camera !== _currentCamera ) {
 		if ( refreshMaterial || camera !== _currentCamera ) {
 
 
-			_gl.uniformMatrix4fv( p_uniforms.projectionMatrix, false, camera._projectionMatrixArray );
+			_gl.uniformMatrix4fv( p_uniforms.projectionMatrix, false, camera.projectionMatrix.elements );
 
 
 			if ( camera !== _currentCamera ) _currentCamera = camera;
 			if ( camera !== _currentCamera ) _currentCamera = camera;
 
 
@@ -5172,7 +5166,7 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 
 				if ( p_uniforms.viewMatrix !== null ) {
 				if ( p_uniforms.viewMatrix !== null ) {
 
 
-					_gl.uniformMatrix4fv( p_uniforms.viewMatrix, false, camera._viewMatrixArray );
+					_gl.uniformMatrix4fv( p_uniforms.viewMatrix, false, camera.matrixWorldInverse.elements );
 
 
 				}
 				}