- directional: { length: 0, colors: new Array(), positions: new Array() },
- point: { length: 0, colors: new Array(), positions: new Array(), distances: new Array() },
- spot: { length: 0, colors: new Array(), positions: new Array(), distances: new Array(), directions: new Array(), anglesCos: new Array(), exponents: new Array() },
- hemi: { length: 0, skyColors: new Array(), groundColors: new Array(), positions: new Array() }
-
- };
-
- // initialize
-
- var _gl;
-
- var _glExtensionTextureFloat;
- var _glExtensionStandardDerivatives;
- var _glExtensionTextureFilterAnisotropic;
- var _glExtensionCompressedTextureS3TC;
-
- initGL();
-
- setDefaultGLState();
-
- this.context = _gl;
-
- // GPU capabilities
-
- var _maxTextures = _gl.getParameter( _gl.MAX_TEXTURE_IMAGE_UNITS );
- var _maxVertexTextures = _gl.getParameter( _gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS );
- var _maxTextureSize = _gl.getParameter( _gl.MAX_TEXTURE_SIZE );
- var _maxCubemapSize = _gl.getParameter( _gl.MAX_CUBE_MAP_TEXTURE_SIZE );
return this},conjugate:function(){this.x*=-1;this.y*=-1;this.z*=-1;return this},lengthSq:function(){return this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w)},normalize:function(){var a=this.length();0===a?(this.z=this.y=this.x=0,this.w=1):(a=1/a,this.x*=a,this.y*=a,this.z*=a,this.w*=a);return this},multiply:function(a,b){return void 0!==b?(console.warn("DEPRECATED: Quaternion's .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead."),
return this},conjugate:function(){this.x*=-1;this.y*=-1;this.z*=-1;return this},lengthSq:function(){return this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w)},normalize:function(){var a=this.length();0===a?(this.z=this.y=this.x=0,this.w=1):(a=1/a,this.x*=a,this.y*=a,this.z*=a,this.w*=a);return this},multiply:function(a,b){return void 0!==b?(console.warn("DEPRECATED: Quaternion's .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead."),
-this.multiplyQuaternions(a,b)):this.multiplyQuaternions(this,a)},multiplyQuaternions:function(a,b){var c=a.x,d=a.y,e=a.z,f=a.w,g=b.x,h=b.y,i=b.z,k=b.w;this.x=c*k+f*g+d*i-e*h;this.y=d*k+f*h+e*g-c*i;this.z=e*k+f*i+c*h-d*g;this.w=f*k-c*g-d*h-e*i;return this},multiplyVector3:function(a){console.warn("DEPRECATED: Quaternion's .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead.");return a.applyQuaternion(this)},slerp:function(a,b){var c=this.x,d=this.y,e=this.z,
+this.multiplyQuaternions(a,b)):this.multiplyQuaternions(this,a)},multiplyQuaternions:function(a,b){var c=a.x,d=a.y,e=a.z,f=a.w,g=b.x,h=b.y,i=b.z,j=b.w;this.x=c*j+f*g+d*i-e*h;this.y=d*j+f*h+e*g-c*i;this.z=e*j+f*i+c*h-d*g;this.w=f*j-c*g-d*h-e*i;return this},multiplyVector3:function(a){console.warn("DEPRECATED: Quaternion's .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead.");return a.applyQuaternion(this)},slerp:function(a,b){var c=this.x,d=this.y,e=this.z,
this.y&&a.z===this.z&&a.w===this.w},clone:function(){return new THREE.Quaternion(this.x,this.y,this.z,this.w)}});THREE.Quaternion.slerp=function(a,b,c,d){return c.copy(a).slerp(b,d)};THREE.Vector2=function(a,b){this.x=a||0;this.y=b||0};
this.y&&a.z===this.z&&a.w===this.w},clone:function(){return new THREE.Quaternion(this.x,this.y,this.z,this.w)}});THREE.Quaternion.slerp=function(a,b,c,d){return c.copy(a).slerp(b,d)};THREE.Vector2=function(a,b){this.x=a||0;this.y=b||0};
THREE.extend(THREE.Vector2.prototype,{set:function(a,b){this.x=a;this.y=b;return this},setX:function(a){this.x=a;return this},setY:function(a){this.y=a;return this},setComponent:function(a,b){switch(a){case 0:this.x=b;break;case 1:this.y=b;break;default:throw Error("index is out of range: "+a);}},getComponent:function(a){switch(a){case 0:return this.x;case 1:return this.y;default:throw Error("index is out of range: "+a);}},copy:function(a){this.x=a.x;this.y=a.y;return this},add:function(a,b){if(void 0!==
THREE.extend(THREE.Vector2.prototype,{set:function(a,b){this.x=a;this.y=b;return this},setX:function(a){this.x=a;return this},setY:function(a){this.y=a;return this},setComponent:function(a,b){switch(a){case 0:this.x=b;break;case 1:this.y=b;break;default:throw Error("index is out of range: "+a);}},getComponent:function(a){switch(a){case 0:return this.x;case 1:return this.y;default:throw Error("index is out of range: "+a);}},copy:function(a){this.x=a.x;this.y=a.y;return this},add:function(a,b){if(void 0!==
a);}},copy:function(a){this.x=a.x;this.y=a.y;this.z=a.z;return this},add:function(a,b){if(void 0!==b)return console.warn("DEPRECATED: Vector3's .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(a,b);this.x+=a.x;this.y+=a.y;this.z+=a.z;return this},addScalar:function(a){this.x+=a;this.y+=a;this.z+=a;return this},addVectors:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;this.z=a.z+b.z;return this},sub:function(a,b){if(void 0!==b)return console.warn("DEPRECATED: Vector3's .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),
a);}},copy:function(a){this.x=a.x;this.y=a.y;this.z=a.z;return this},add:function(a,b){if(void 0!==b)return console.warn("DEPRECATED: Vector3's .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(a,b);this.x+=a.x;this.y+=a.y;this.z+=a.z;return this},addScalar:function(a){this.x+=a;this.y+=a;this.z+=a;return this},addVectors:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;this.z=a.z+b.z;return this},sub:function(a,b){if(void 0!==b)return console.warn("DEPRECATED: Vector3's .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),
this.subVectors(a,b);this.x-=a.x;this.y-=a.y;this.z-=a.z;return this},subVectors:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;this.z=a.z-b.z;return this},multiply:function(a,b){if(void 0!==b)return console.warn("DEPRECATED: Vector3's .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead."),this.multiplyVectors(a,b);this.x*=a.x;this.y*=a.y;this.z*=a.z;return this},multiplyScalar:function(a){this.x*=a;this.y*=a;this.z*=a;return this},multiplyVectors:function(a,b){this.x=a.x*
this.subVectors(a,b);this.x-=a.x;this.y-=a.y;this.z-=a.z;return this},subVectors:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;this.z=a.z-b.z;return this},multiply:function(a,b){if(void 0!==b)return console.warn("DEPRECATED: Vector3's .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead."),this.multiplyVectors(a,b);this.x*=a.x;this.y*=a.y;this.z*=a.z;return this},multiplyScalar:function(a){this.x*=a;this.y*=a;this.z*=a;return this},multiplyVectors:function(a,b){this.x=a.x*
this.y+this.z*this.z},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)},lengthManhattan:function(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)},normalize:function(){return this.divideScalar(this.length())},setLength:function(a){var b=this.length();0!==b&&a!==b&&this.multiplyScalar(a/b);return this},lerp:function(a,b){this.x+=(a.x-this.x)*b;this.y+=(a.y-this.y)*b;this.z+=(a.z-this.z)*b;return this},cross:function(a,b){if(void 0!==b)return console.warn("DEPRECATED: Vector3's .cross() now only accepts one argument. Use .crossVectors( a, b ) instead."),
this.y+this.z*this.z},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)},lengthManhattan:function(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)},normalize:function(){return this.divideScalar(this.length())},setLength:function(a){var b=this.length();0!==b&&a!==b&&this.multiplyScalar(a/b);return this},lerp:function(a,b){this.x+=(a.x-this.x)*b;this.y+=(a.y-this.y)*b;this.z+=(a.z-this.z)*b;return this},cross:function(a,b){if(void 0!==b)return console.warn("DEPRECATED: Vector3's .cross() now only accepts one argument. Use .crossVectors( a, b ) instead."),
case 2:return this.z;case 3:return this.w;default:throw Error("index is out of range: "+a);}},copy:function(a){this.x=a.x;this.y=a.y;this.z=a.z;this.w=void 0!==a.w?a.w:1;return this},add:function(a,b){if(void 0!==b)return console.warn("DEPRECATED: Vector4's .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(a,b);this.x+=a.x;this.y+=a.y;this.z+=a.z;this.w+=a.w;return this},addScalar:function(a){this.x+=a;this.y+=a;this.z+=a;this.w+=a;return this},addVectors:function(a,
case 2:return this.z;case 3:return this.w;default:throw Error("index is out of range: "+a);}},copy:function(a){this.x=a.x;this.y=a.y;this.z=a.z;this.w=void 0!==a.w?a.w:1;return this},add:function(a,b){if(void 0!==b)return console.warn("DEPRECATED: Vector4's .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(a,b);this.x+=a.x;this.y+=a.y;this.z+=a.z;this.w+=a.w;return this},addScalar:function(a){this.x+=a;this.y+=a;this.z+=a;this.w+=a;return this},addVectors:function(a,
b){this.x=a.x+b.x;this.y=a.y+b.y;this.z=a.z+b.z;this.w=a.w+b.w;return this},sub:function(a,b){if(void 0!==b)return console.warn("DEPRECATED: Vector4's .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(a,b);this.x-=a.x;this.y-=a.y;this.z-=a.z;this.w-=a.w;return this},subVectors:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;this.z=a.z-b.z;this.w=a.w-b.w;return this},multiplyScalar:function(a){this.x*=a;this.y*=a;this.z*=a;this.w*=a;return this},applyMatrix4:function(a){var b=
b){this.x=a.x+b.x;this.y=a.y+b.y;this.z=a.z+b.z;this.w=a.w+b.w;return this},sub:function(a,b){if(void 0!==b)return console.warn("DEPRECATED: Vector4's .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(a,b);this.x-=a.x;this.y-=a.y;this.z-=a.z;this.w-=a.w;return this},subVectors:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;this.z=a.z-b.z;this.w=a.w-b.w;return this},multiplyScalar:function(a){this.x*=a;this.y*=a;this.z*=a;this.w*=a;return this},applyMatrix4:function(a){var b=
-g[6]=b.z;g[10]=c.z;return this}}(),multiply:function(a,b){return void 0!==b?(console.warn("DEPRECATED: Matrix4's .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead."),this.multiplyMatrices(a,b)):this.multiplyMatrices(this,a)},multiplyMatrices:function(a,b){var c=a.elements,d=b.elements,e=this.elements,f=c[0],g=c[4],h=c[8],i=c[12],k=c[1],l=c[5],n=c[9],m=c[13],t=c[2],r=c[6],p=c[10],q=c[14],y=c[3],v=c[7],z=c[11],c=c[15],s=d[0],C=d[4],H=d[8],B=d[12],w=d[1],I=d[5],J=d[9],
+g[6]=b.z;g[10]=c.z;return this}}(),multiply:function(a,b){return void 0!==b?(console.warn("DEPRECATED: Matrix4's .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead."),this.multiplyMatrices(a,b)):this.multiplyMatrices(this,a)},multiplyMatrices:function(a,b){var c=a.elements,d=b.elements,e=this.elements,f=c[0],g=c[4],h=c[8],i=c[12],j=c[1],l=c[5],n=c[9],m=c[13],r=c[2],u=c[6],p=c[10],q=c[14],w=c[3],v=c[7],z=c[11],c=c[15],y=d[0],t=d[4],D=d[8],C=d[12],k=d[1],I=d[5],J=d[9],
c[0]=d[0];c[1]=d[1];c[2]=d[2];c[3]=d[3];c[4]=d[4];c[5]=d[5];c[6]=d[6];c[7]=d[7];c[8]=d[8];c[9]=d[9];c[10]=d[10];c[11]=d[11];c[12]=d[12];c[13]=d[13];c[14]=d[14];c[15]=d[15];return this},multiplyScalar:function(a){var b=this.elements;b[0]*=a;b[4]*=a;b[8]*=a;b[12]*=a;b[1]*=a;b[5]*=a;b[9]*=a;b[13]*=a;b[2]*=a;b[6]*=a;b[10]*=a;b[14]*=a;b[3]*=a;b[7]*=a;b[11]*=a;b[15]*=a;return this},multiplyVector3:function(a){console.warn("DEPRECATED: Matrix4's .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) or vector.applyProjection( matrix ) instead.");
c[0]=d[0];c[1]=d[1];c[2]=d[2];c[3]=d[3];c[4]=d[4];c[5]=d[5];c[6]=d[6];c[7]=d[7];c[8]=d[8];c[9]=d[9];c[10]=d[10];c[11]=d[11];c[12]=d[12];c[13]=d[13];c[14]=d[14];c[15]=d[15];return this},multiplyScalar:function(a){var b=this.elements;b[0]*=a;b[4]*=a;b[8]*=a;b[12]*=a;b[1]*=a;b[5]*=a;b[9]*=a;b[13]*=a;b[2]*=a;b[6]*=a;b[10]*=a;b[14]*=a;b[3]*=a;b[7]*=a;b[11]*=a;b[15]*=a;return this},multiplyVector3:function(a){console.warn("DEPRECATED: Matrix4's .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) or vector.applyProjection( matrix ) instead.");
return a.applyProjection(this)},multiplyVector4:function(a){console.warn("DEPRECATED: Matrix4's .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead.");return a.applyMatrix4(this)},multiplyVector3Array:function(){var a=new THREE.Vector3;return function(b){for(var c=0,d=b.length;c<d;c+=3)a.x=b[c],a.y=b[c+1],a.z=b[c+2],a.applyProjection(this),b[c]=a.x,b[c+1]=a.y,b[c+2]=a.z;return b}}(),rotateAxis:function(a){console.warn("DEPRECATED: Matrix4's .rotateAxis() has been removed. Use Vector3.transformDirection( matrix ) instead.");
return a.applyProjection(this)},multiplyVector4:function(a){console.warn("DEPRECATED: Matrix4's .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead.");return a.applyMatrix4(this)},multiplyVector3Array:function(){var a=new THREE.Vector3;return function(b){for(var c=0,d=b.length;c<d;c+=3)a.x=b[c],a.y=b[c+1],a.z=b[c+2],a.applyProjection(this),b[c]=a.x,b[c+1]=a.y,b[c+2]=a.z;return b}}(),rotateAxis:function(a){console.warn("DEPRECATED: Matrix4's .rotateAxis() has been removed. Use Vector3.transformDirection( matrix ) instead.");
a.b.equals(this.b)&&a.c.equals(this.c)},clone:function(){return(new THREE.Triangle).copy(this)}});THREE.Vertex=function(a){console.warn("THREE.Vertex has been DEPRECATED. Use THREE.Vector3 instead.");return a};THREE.UV=function(a,b){console.warn("THREE.UV has been DEPRECATED. Use THREE.Vector2 instead.");return new THREE.Vector2(a,b)};THREE.Clock=function(a){this.autoStart=void 0!==a?a:!0;this.elapsedTime=this.oldTime=this.startTime=0;this.running=!1};
a.b.equals(this.b)&&a.c.equals(this.c)},clone:function(){return(new THREE.Triangle).copy(this)}});THREE.Vertex=function(a){console.warn("THREE.Vertex has been DEPRECATED. Use THREE.Vector3 instead.");return a};THREE.UV=function(a,b){console.warn("THREE.UV has been DEPRECATED. Use THREE.Vector2 instead.");return new THREE.Vector2(a,b)};THREE.Clock=function(a){this.autoStart=void 0!==a?a:!0;this.elapsedTime=this.oldTime=this.startTime=0;this.running=!1};
-this.quaternion.setFromRotationMatrix(a):this.rotation.setEulerFromRotationMatrix(a,this.eulerOrder)}}(),add:function(a){if(a===this)console.warn("THREE.Object3D.add: An object can't be added as a child of itself.");else if(a instanceof THREE.Object3D){void 0!==a.parent&&a.parent.remove(a);a.parent=this;this.children.push(a);for(var b=this;void 0!==b.parent;)b=b.parent;void 0!==b&&b instanceof THREE.Scene&&b.__addObject(a)}},remove:function(a){var b=this.children.indexOf(a);if(-1!==b){a.parent=void 0;
+worldToLocal:function(){var a=new THREE.Matrix4;return function(b){return b.applyMatrix4(a.getInverse(this.matrixWorld))}}(),lookAt:function(){var a=new THREE.Matrix4;return function(b){a.lookAt(b,this.position,this.up);!0===this.useQuaternion?this.quaternion.setFromRotationMatrix(a):this.rotation.setEulerFromRotationMatrix(a,this.eulerOrder)}}(),add:function(a){if(a===this)console.warn("THREE.Object3D.add: An object can't be added as a child of itself.");else if(a instanceof THREE.Object3D){void 0!==
var a=this.attributes.position.array;if(a){var b=this.boundingBox,c,d,e;3<=a.length&&(b.min.x=b.max.x=a[0],b.min.y=b.max.y=a[1],b.min.z=b.max.z=a[2]);for(var f=3,g=a.length;f<g;f+=3)c=a[f],d=a[f+1],e=a[f+2],c<b.min.x?b.min.x=c:c>b.max.x&&(b.max.x=c),d<b.min.y?b.min.y=d:d>b.max.y&&(b.max.y=d),e<b.min.z?b.min.z=e:e>b.max.z&&(b.max.z=e)}if(void 0===a||0===a.length)this.boundingBox.min.set(0,0,0),this.boundingBox.max.set(0,0,0)},computeBoundingSphere:function(){null===this.boundingSphere&&(this.boundingSphere=
var a=this.attributes.position.array;if(a){var b=this.boundingBox,c,d,e;3<=a.length&&(b.min.x=b.max.x=a[0],b.min.y=b.max.y=a[1],b.min.z=b.max.z=a[2]);for(var f=3,g=a.length;f<g;f+=3)c=a[f],d=a[f+1],e=a[f+2],c<b.min.x?b.min.x=c:c>b.max.x&&(b.max.x=c),d<b.min.y?b.min.y=d:d>b.max.y&&(b.max.y=d),e<b.min.z?b.min.z=e:e>b.max.z&&(b.max.z=e)}if(void 0===a||0===a.length)this.boundingBox.min.set(0,0,0),this.boundingBox.max.set(0,0,0)},computeBoundingSphere:function(){null===this.boundingSphere&&(this.boundingSphere=
new THREE.Sphere);var a=this.attributes.position.array;if(a){for(var b,c=0,d,e,f=0,g=a.length;f<g;f+=3)b=a[f],d=a[f+1],e=a[f+2],b=b*b+d*d+e*e,b>c&&(c=b);this.boundingSphere.radius=Math.sqrt(c)}},computeVertexNormals:function(){if(this.attributes.position){var a,b,c,d;a=this.attributes.position.array.length;if(void 0===this.attributes.normal)this.attributes.normal={itemSize:3,array:new Float32Array(a),numItems:a};else{a=0;for(b=this.attributes.normal.array.length;a<b;a++)this.attributes.normal.array[a]=
new THREE.Sphere);var a=this.attributes.position.array;if(a){for(var b,c=0,d,e,f=0,g=a.length;f<g;f+=3)b=a[f],d=a[f+1],e=a[f+2],b=b*b+d*d+e*e,b>c&&(c=b);this.boundingSphere.radius=Math.sqrt(c)}},computeVertexNormals:function(){if(this.attributes.position){var a,b,c,d;a=this.attributes.position.array.length;if(void 0===this.attributes.normal)this.attributes.normal={itemSize:3,array:new Float32Array(a),numItems:a};else{a=0;for(b=this.attributes.normal.array.length;a<b;a++)this.attributes.normal.array[a]=
THREE.JSONLoader.prototype.loadAjaxJSON=function(a,b,c,d,e){var f=new XMLHttpRequest,g=0;f.onreadystatechange=function(){if(f.readyState===f.DONE)if(200===f.status||0===f.status){if(f.responseText){var h=JSON.parse(f.responseText);a.createModel(h,c,d)}else console.warn("THREE.JSONLoader: ["+b+"] seems to be unreachable or file there is empty");a.onLoadComplete()}else console.error("THREE.JSONLoader: Couldn't load ["+b+"] ["+f.status+"]");else f.readyState===f.LOADING?e&&(0===g&&(g=f.getResponseHeader("Content-Length")),
THREE.JSONLoader.prototype.loadAjaxJSON=function(a,b,c,d,e){var f=new XMLHttpRequest,g=0;f.onreadystatechange=function(){if(f.readyState===f.DONE)if(200===f.status||0===f.status){if(f.responseText){var h=JSON.parse(f.responseText);a.createModel(h,c,d)}else console.warn("THREE.JSONLoader: ["+b+"] seems to be unreachable or file there is empty");a.onLoadComplete()}else console.error("THREE.JSONLoader: Couldn't load ["+b+"] ["+f.status+"]");else f.readyState===f.LOADING?e&&(0===g&&(g=f.getResponseHeader("Content-Length")),
-THREE.SceneLoader.prototype.parse=function(a,b,c){function d(a,b){return"relativeToHTML"==b?a:n+"/"+a}function e(){f(w.scene,J.objects)}function f(a,b){var c,e,g,i,k,n,p;for(p in b)if(void 0===w.objects[p]){var q=b[p],s=null;if(q.type&&q.type in l.hierarchyHandlerMap){if(void 0===q.loading){e={type:1,url:1,material:1,position:1,rotation:1,scale:1,visible:1,children:1,properties:1,skin:1,morph:1,mirroredLoop:1,duration:1};g={};for(var A in q)A in e||(g[A]=q[A]);t=w.materials[q.material];q.loading=
-s&&0===C){for(var a=0;a<I.length;a++){var c=I[a],d=w.objects[c.targetName];d?c.object.target=d:(c.object.target=new THREE.Object3D,w.scene.add(c.object.target));c.object.target.properties.targetInverse=c.object}b(w)}}var l=this,n=THREE.Loader.prototype.extractUrlBase(c),m,t,r,p,q,y,v,z,s,C,H,B,w,I=[],J=a,E;for(E in this.geometryHandlerMap)a=this.geometryHandlerMap[E].loaderClass,this.geometryHandlerMap[E].loaderObject=new a;for(E in this.hierarchyHandlerMap)a=this.hierarchyHandlerMap[E].loaderClass,
-for(var Z in J.fogs)a=J.fogs[Z],"linear"===a.type?p=new THREE.Fog(0,a.near,a.far):"exp2"===a.type&&(p=new THREE.FogExp2(0,a.density)),a=a.color,p.color.setRGB(a[0],a[1],a[2]),w.fogs[Z]=p;for(var A in J.geometries)p=J.geometries[A],p.type in this.geometryHandlerMap&&(s+=1,l.onLoadStart());for(var U in J.objects)p=J.objects[U],p.type&&p.type in this.hierarchyHandlerMap&&(s+=1,l.onLoadStart());H=s;for(A in J.geometries)if(p=J.geometries[A],"cube"===p.type)m=new THREE.CubeGeometry(p.width,p.height,p.depth,
-p.segmentsT),w.geometries[A]=m;else if("icosahedron"===p.type)m=new THREE.IcosahedronGeometry(p.radius,p.subdivisions),w.geometries[A]=m;else if(p.type in this.geometryHandlerMap){U={};for(q in p)"type"!==q&&"url"!==q&&(U[q]=p[q]);this.geometryHandlerMap[p.type].loaderObject.load(d(p.url,J.urlBaseType),g(A),U)}else"embedded"===p.type&&(U=J.embeds[p.id],U.metadata=J.metadata,U&&this.geometryHandlerMap.ascii.loaderObject.createModel(U,i(A),""));for(var F in J.textures)if(A=J.textures[F],A.url instanceof
-Array){C+=A.url.length;for(q=0;q<A.url.length;q++)l.onLoadStart()}else C+=1,l.onLoadStart();B=C;for(F in J.textures){A=J.textures[F];void 0!==A.mapping&&void 0!==THREE[A.mapping]&&(A.mapping=new THREE[A.mapping]);if(A.url instanceof Array){U=A.url.length;p=[];for(q=0;q<U;q++)p[q]=d(A.url[q],J.urlBaseType);q=(q=/\.dds$/i.test(p[0]))?THREE.ImageUtils.loadCompressedTextureCube(p,A.mapping,E(U)):THREE.ImageUtils.loadTextureCube(p,A.mapping,E(U))}else q=/\.dds$/i.test(A.url),U=d(A.url,J.urlBaseType),p=
-mirror:THREE.MirroredRepeatWrapping},void 0!==U[A.wrap[0]]&&(q.wrapS=U[A.wrap[0]]),void 0!==U[A.wrap[1]]&&(q.wrapT=U[A.wrap[1]]));w.textures[F]=q}var G,K;for(G in J.materials){F=J.materials[G];for(K in F.parameters)"envMap"===K||"map"===K||"lightMap"===K||"bumpMap"===K?F.parameters[K]=w.textures[F.parameters[K]]:"shading"===K?F.parameters[K]="flat"===F.parameters[K]?THREE.FlatShading:THREE.SmoothShading:"side"===K?F.parameters[K]="double"==F.parameters[K]?THREE.DoubleSide:"back"==F.parameters[K]?
-A.uDiffuseColor.value.setHex(q),A.uSpecularColor.value.setHex(U),A.uAmbientColor.value.setHex(p),A.uShininess.value=Z,F.parameters.opacity&&(A.uOpacity.value=F.parameters.opacity),t=new THREE.ShaderMaterial({fragmentShader:E.fragmentShader,vertexShader:E.vertexShader,uniforms:A,lights:!0,fog:!0})):t=new THREE[F.type](F.parameters);w.materials[G]=t}for(G in J.materials)if(F=J.materials[G],F.parameters.materials){K=[];for(q=0;q<F.parameters.materials.length;q++)K.push(w.materials[F.parameters.materials[q]]);
+THREE.SceneLoader.prototype.parse=function(a,b,c){function d(a,b){return"relativeToHTML"==b?a:n+"/"+a}function e(){f(k.scene,J.objects)}function f(a,b){var c,e,g,i,j,n,p;for(p in b)if(void 0===k.objects[p]){var M=b[p],q=null;if(M.type&&M.type in l.hierarchyHandlerMap){if(void 0===M.loading){e={type:1,url:1,material:1,position:1,rotation:1,scale:1,visible:1,children:1,properties:1,skin:1,morph:1,mirroredLoop:1,duration:1};g={};for(var s in M)s in e||(g[s]=M[s]);r=k.materials[M.material];M.loading=
+y&&0===t){for(var a=0;a<I.length;a++){var c=I[a],d=k.objects[c.targetName];d?c.object.target=d:(c.object.target=new THREE.Object3D,k.scene.add(c.object.target));c.object.target.properties.targetInverse=c.object}b(k)}}var l=this,n=THREE.Loader.prototype.extractUrlBase(c),m,r,u,p,q,w,v,z,y,t,D,C,k,I=[],J=a,B;for(B in this.geometryHandlerMap)a=this.geometryHandlerMap[B].loaderClass,this.geometryHandlerMap[B].loaderObject=new a;for(B in this.hierarchyHandlerMap)a=this.hierarchyHandlerMap[B].loaderClass,
+for(var P in J.fogs)a=J.fogs[P],"linear"===a.type?p=new THREE.Fog(0,a.near,a.far):"exp2"===a.type&&(p=new THREE.FogExp2(0,a.density)),a=a.color,p.color.setRGB(a[0],a[1],a[2]),k.fogs[P]=p;for(var A in J.geometries)p=J.geometries[A],p.type in this.geometryHandlerMap&&(y+=1,l.onLoadStart());for(var G in J.objects)p=J.objects[G],p.type&&p.type in this.hierarchyHandlerMap&&(y+=1,l.onLoadStart());D=y;for(A in J.geometries)if(p=J.geometries[A],"cube"===p.type)m=new THREE.CubeGeometry(p.width,p.height,p.depth,
+p.segmentsT),k.geometries[A]=m;else if("icosahedron"===p.type)m=new THREE.IcosahedronGeometry(p.radius,p.subdivisions),k.geometries[A]=m;else if(p.type in this.geometryHandlerMap){G={};for(q in p)"type"!==q&&"url"!==q&&(G[q]=p[q]);this.geometryHandlerMap[p.type].loaderObject.load(d(p.url,J.urlBaseType),g(A),G)}else"embedded"===p.type&&(G=J.embeds[p.id],G.metadata=J.metadata,G&&this.geometryHandlerMap.ascii.loaderObject.createModel(G,i(A),""));for(var E in J.textures)if(A=J.textures[E],A.url instanceof
+Array){t+=A.url.length;for(q=0;q<A.url.length;q++)l.onLoadStart()}else t+=1,l.onLoadStart();C=t;for(E in J.textures){A=J.textures[E];void 0!==A.mapping&&void 0!==THREE[A.mapping]&&(A.mapping=new THREE[A.mapping]);if(A.url instanceof Array){G=A.url.length;p=[];for(q=0;q<G;q++)p[q]=d(A.url[q],J.urlBaseType);q=(q=/\.dds$/i.test(p[0]))?THREE.ImageUtils.loadCompressedTextureCube(p,A.mapping,B(G)):THREE.ImageUtils.loadTextureCube(p,A.mapping,B(G))}else q=/\.dds$/i.test(A.url),G=d(A.url,J.urlBaseType),p=
+mirror:THREE.MirroredRepeatWrapping},void 0!==G[A.wrap[0]]&&(q.wrapS=G[A.wrap[0]]),void 0!==G[A.wrap[1]]&&(q.wrapT=G[A.wrap[1]]));k.textures[E]=q}var F,s;for(F in J.materials){E=J.materials[F];for(s in E.parameters)"envMap"===s||"map"===s||"lightMap"===s||"bumpMap"===s?E.parameters[s]=k.textures[E.parameters[s]]:"shading"===s?E.parameters[s]="flat"===E.parameters[s]?THREE.FlatShading:THREE.SmoothShading:"side"===s?E.parameters[s]="double"==E.parameters[s]?THREE.DoubleSide:"back"==E.parameters[s]?
+A.uDiffuseColor.value.setHex(q),A.uSpecularColor.value.setHex(G),A.uAmbientColor.value.setHex(p),A.uShininess.value=P,E.parameters.opacity&&(A.uOpacity.value=E.parameters.opacity),r=new THREE.ShaderMaterial({fragmentShader:B.fragmentShader,vertexShader:B.vertexShader,uniforms:A,lights:!0,fog:!0})):r=new THREE[E.type](E.parameters);k.materials[F]=r}for(F in J.materials)if(E=J.materials[F],E.parameters.materials){s=[];for(q=0;q<E.parameters.materials.length;q++)s.push(k.materials[E.parameters.materials[q]]);
-255*d.b|0;mb.putImageData(vb,0,0);zb.drawImage(j,0,0);return Ga}function Jb(a,b){var c=b.x-a.x,d=b.y-a.y,e=c*c+d*d;0!==e&&(e=1/Math.sqrt(e),c*=e,d*=e,b.x+=c,b.y+=d,a.x-=c,a.y-=d)}if(!1===p instanceof THREE.Camera)console.error("THREE.CanvasRenderer.render: camera is not an instance of THREE.Camera.");else{!0===this.autoClear&&this.clear();s.setTransform(1,0,0,-1,v,z);l.info.render.vertices=0;l.info.render.faces=0;n=r.projectScene(a,p,this.sortObjects,this.sortElements);m=n.elements;t=n.lights;wa.setRGB(0,
+0,0);return za}function I(a,b){var c=b.x-a.x,d=b.y-a.y,e=c*c+d*d;0!==e&&(e=1/Math.sqrt(e),c*=e,d*=e,b.x+=c,b.y+=d,a.x-=c,a.y-=d)}if(!1===k instanceof THREE.Camera)console.error("THREE.CanvasRenderer.render: camera is not an instance of THREE.Camera.");else{!0===this.autoClear&&this.clear();y.setTransform(1,0,0,-1,v,z);l.info.render.vertices=0;l.info.render.faces=0;n=u.projectScene(a,k,this.sortObjects,this.sortElements);m=n.elements;r=n.lights;oa.setRGB(0,0,0);Da.setRGB(0,0,0);Ba.setRGB(0,0,0);for(var J=
-m;c++)a.__morphTargetsArrays.push(new Float32Array(3*i))}if(a.numMorphNormals){a.__morphNormalsArrays=[];c=0;for(m=a.numMorphNormals;c<m;c++)a.__morphNormalsArrays.push(new Float32Array(3*i))}a.__webglFaceCount=3*k;a.__webglLineCount=2*h;if(d.attributes){void 0===a.__webglCustomAttributesList&&(a.__webglCustomAttributesList=[]);for(var p in d.attributes){var k=d.attributes[p],c={},q;for(q in k)c[q]=k[q];if(!c.__webglInitialized||c.createUniqueBuffers)c.__webglInitialized=!0,h=1,"v2"===c.type?h=2:
-f,j,k,i):L.renderBuffer(d,e,f,j,k,i)}}function t(a,b,c,d,e,f,g){for(var h,j,i=0,k=a.length;i<k;i++)if(h=a[i],j=h.object,j.visible){if(g)h=g;else{h=h[b];if(!h)continue;f&&L.setBlending(h.blending,h.blendEquation,h.blendSrc,h.blendDst);L.setDepthTest(h.depthTest);L.setDepthWrite(h.depthWrite);I(h.polygonOffset,h.polygonOffsetFactor,h.polygonOffsetUnits)}L.renderImmediateObject(c,d,e,h,j)}}function r(a,b,c){a.push({buffer:b,object:c,opaque:null,transparent:null})}function p(a){for(var b in a.attributes)if(a.attributes[b].needsUpdate)return!0;
-return!1}function q(a){for(var b in a.attributes)a.attributes[b].needsUpdate=!1}function y(a,b){for(var c=a.length-1;0<=c;c--)a[c].object===b&&a.splice(c,1)}function v(a,b){for(var c=a.length-1;0<=c;c--)a[c]===b&&a.splice(c,1)}function z(a,b,c,d,e){ea=0;d.needsUpdate&&(d.program&&Yc(d),L.initMaterial(d,b,c,e),d.needsUpdate=!1);d.morphTargets&&!e.__webglMorphTargetInfluences&&(e.__webglMorphTargetInfluences=new Float32Array(L.maxMorphTargets));var f=!1,g=d.program,h=g.uniforms,i=d.uniforms;g!==kb&&
-d instanceof THREE.ShaderMaterial||d.skinning)&&null!==h.viewMatrix&&j.uniformMatrix4fv(h.viewMatrix,!1,a.matrixWorldInverse.elements)}j.uniformMatrix4fv(h.modelViewMatrix,!1,e._modelViewMatrix.elements);h.normalMatrix&&j.uniformMatrix3fv(h.normalMatrix,!1,e._normalMatrix.elements);null!==h.modelMatrix&&j.uniformMatrix4fv(h.modelMatrix,!1,e.matrixWorld.elements);return g}function s(){var a=ea;a>=Ib&&console.warn("WebGLRenderer: trying to use "+a+" texture units while this GPU supports only "+Ib);
-j.getExtension("WEBKIT_EXT_texture_filter_anisotropic");Ga=j.getExtension("WEBGL_compressed_texture_s3tc")||j.getExtension("MOZ_WEBGL_compressed_texture_s3tc")||j.getExtension("WEBKIT_WEBGL_compressed_texture_s3tc");mb||console.log("THREE.WebGLRenderer: Float textures not supported.");vb||console.log("THREE.WebGLRenderer: Standard derivatives not supported.");Wa||console.log("THREE.WebGLRenderer: Anisotropic texture filtering not supported.");Ga||console.log("THREE.WebGLRenderer: S3TC compressed textures not supported.");
-j.getShaderPrecisionFormat(j.FRAGMENT_SHADER,j.LOW_FLOAT);j.getShaderPrecisionFormat(j.VERTEX_SHADER,j.HIGH_INT);j.getShaderPrecisionFormat(j.VERTEX_SHADER,j.MEDIUM_INT);j.getShaderPrecisionFormat(j.VERTEX_SHADER,j.LOW_INT);j.getShaderPrecisionFormat(j.FRAGMENT_SHADER,j.HIGH_INT);j.getShaderPrecisionFormat(j.FRAGMENT_SHADER,j.MEDIUM_INT);j.getShaderPrecisionFormat(j.FRAGMENT_SHADER,j.LOW_INT);fa=0<fa.precision&&0<ma.precision;a=0<a.precision&&0<N.precision;"highp"===K&&!fa&&(a?(K="mediump",console.warn("WebGLRenderer: highp not supported, using mediump")):
-(K="lowp",console.warn("WebGLRenderer: highp and mediump not supported, using lowp")));"mediump"===K&&!a&&(K="lowp",console.warn("WebGLRenderer: mediump not supported, using lowp"));this.getContext=function(){return j};this.supportsVertexTextures=function(){return Bc};this.supportsFloatTextures=function(){return mb};this.supportsStandardDerivatives=function(){return vb};this.supportsCompressedTextureS3TC=function(){return Ga};this.getMaxAnisotropy=function(){return Wc};this.getPrecision=function(){return K};
-if(void 0!==a.geometryGroups)for(var c in a.geometryGroups){var d=a.geometryGroups[c];if(void 0!==d.numMorphTargets)for(var e=0,f=d.numMorphTargets;e<f;e++)j.deleteBuffer(d.__webglMorphTargetsBuffers[e]);if(void 0!==d.numMorphNormals){e=0;for(f=d.numMorphNormals;e<f;e++)j.deleteBuffer(d.__webglMorphNormalsBuffers[e])}b(d)}b(a);L.info.memory.geometries--},Zc=function(a){a=a.target;a.removeEventListener("dispose",Zc);a.image&&a.image.__webglTextureCube?j.deleteTexture(a.image.__webglTextureCube):a.__webglInit&&
-k,l;g=z(a,b,c,d,f);a=g.attributes;b=e.attributes;c=!1;g=16777215*e.id+2*g.id+(d.wireframe?1:0);g!==db&&(db=g,c=!0);c&&i();if(f instanceof THREE.Mesh)if(d=b.index){e=e.offsets;1<e.length&&(c=!0);for(var m=0,n=e.length;m<n;m++){var p=e[m].index;if(c){for(k in b)"index"!==k&&(g=a[k],f=b[k],l=f.itemSize,0<=g&&(j.bindBuffer(j.ARRAY_BUFFER,f.buffer),h(g),j.vertexAttribPointer(g,l,j.FLOAT,!1,0,4*p*l)));j.bindBuffer(j.ELEMENT_ARRAY_BUFFER,d.buffer)}j.drawElements(j.TRIANGLES,e[m].count,j.UNSIGNED_SHORT,2*
-e[m].start);L.info.render.calls++;L.info.render.vertices+=e[m].count;L.info.render.faces+=e[m].count/3}}else{if(c)for(k in b)"index"!==k&&(g=a[k],f=b[k],l=f.itemSize,0<=g&&(j.bindBuffer(j.ARRAY_BUFFER,f.buffer),h(g),j.vertexAttribPointer(g,l,j.FLOAT,!1,0,0)));k=e.attributes.position;j.drawArrays(j.TRIANGLES,0,k.numItems/3);L.info.render.calls++;L.info.render.vertices+=k.numItems/3;L.info.render.faces+=k.numItems/3/3}else if(f instanceof THREE.ParticleSystem){if(c){for(k in b)g=a[k],f=b[k],l=f.itemSize,
-0<=g&&(j.bindBuffer(j.ARRAY_BUFFER,f.buffer),h(g),j.vertexAttribPointer(g,l,j.FLOAT,!1,0,0));k=b.position;j.drawArrays(j.POINTS,0,k.numItems/3);L.info.render.calls++;L.info.render.points+=k.numItems/3}}else if(f instanceof THREE.Line&&c){for(k in b)g=a[k],f=b[k],l=f.itemSize,0<=g&&(j.bindBuffer(j.ARRAY_BUFFER,f.buffer),h(g),j.vertexAttribPointer(g,l,j.FLOAT,!1,0,0));w(d.linewidth);k=b.position;j.drawArrays(j.LINE_STRIP,0,k.numItems/3);L.info.render.calls++;L.info.render.points+=k.numItems}}};this.renderBuffer=
-L.info.render.calls++,L.info.render.points+=e.__webglParticleCount):f instanceof THREE.Ribbon&&(j.drawArrays(j.TRIANGLE_STRIP,0,e.__webglVertexCount),L.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,i,h=a.__lights,l=a.fog;lb=-1;yb=!0;this.autoUpdateScene&&a.updateMatrixWorld();void 0===b.parent&&b.updateMatrixWorld();b.matrixWorldInverse.getInverse(b.matrixWorld);
-A.geometryGroups[G].vertices+=H;A.geometryGroupsList=[];var V=void 0;for(V in A.geometryGroups)A.geometryGroups[V].id=Oa++,A.geometryGroupsList.push(A.geometryGroups[V])}for(h in k.geometryGroups)if(n=k.geometryGroups[h],!n.__webglVertexBuffer){var N=n;N.__webglVertexBuffer=j.createBuffer();N.__webglNormalBuffer=j.createBuffer();N.__webglTangentBuffer=j.createBuffer();N.__webglColorBuffer=j.createBuffer();N.__webglUVBuffer=j.createBuffer();N.__webglUV2Buffer=j.createBuffer();N.__webglSkinIndicesBuffer=
-r++,q instanceof THREE.SpotLight&&t++,q instanceof THREE.HemisphereLight&&p++);e=g;f=r;g=t;i=p;p=q=0;for(t=b.length;p<t;p++)r=b[p],r.castShadow&&(r instanceof THREE.SpotLight&&q++,r instanceof THREE.DirectionalLight&&!r.shadowCascade&&q++);m=q;Cc&&d&&d.useVertexTexture?l=1024:(b=j.getParameter(j.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;t=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:Cc&&d&&d.useVertexTexture,boneTextureWidth:d&&d.boneTextureWidth,
-THREE.DoubleSide,flipSided:a.side===THREE.BackSide},s,v,w,d=[];n?d.push(n):(d.push(r),d.push(t));for(v in q)d.push(v),d.push(q[v]);for(s in c)d.push(s),d.push(c[s]);n=d.join();s=0;for(v=ca.length;s<v;s++)if(d=ca[s],d.code===n){d.usedTimes++;k=d.program;break a}s="SHADOWMAP_TYPE_BASIC";c.shadowMapType===THREE.PCFShadowMap?s="SHADOWMAP_TYPE_PCF":c.shadowMapType===THREE.PCFSoftShadowMap&&(s="SHADOWMAP_TYPE_PCF_SOFT");v=[];for(w in q)d=q[w],!1!==d&&(d="#define "+w+" "+d,v.push(d));d=v.join("\n");w=j.createProgram();
-j.getError()+"]");j.deleteShader(s);j.deleteShader(v);w.uniforms={};w.attributes={};var y;s="viewMatrix modelViewMatrix projectionMatrix normalMatrix modelMatrix cameraPosition morphTargetInfluences".split(" ");c.useVertexTexture?s.push("boneTexture"):s.push("boneGlobalMatrices");for(y in p)s.push(y);y=s;s=0;for(v=y.length;s<v;s++)p=y[s],w.uniforms[p]=j.getUniformLocation(w,p);s="position normal uv uv2 tangent color skinIndex skinWeight lineDistance".split(" ");for(y=0;y<c.maxMorphTargets;y++)s.push("morphTarget"+
-y);for(y=0;y<c.maxMorphNormals;y++)s.push("morphNormal"+y);for(k in b)s.push(k);k=s;y=0;for(b=k.length;y<b;y++)s=k[y],w.attributes[s]=j.getAttribLocation(w,s);w.id=ra++;ca.push({program:w,code:n,usedTimes:1});L.info.memory.programs=ca.length;k=w}a.program=k;y=a.program.attributes;if(a.morphTargets){a.numSupportedMorphTargets=0;b="morphTarget";for(k=0;k<this.maxMorphTargets;k++)w=b+k,0<=y[w]&&a.numSupportedMorphTargets++}if(a.morphNormals){a.numSupportedMorphNormals=0;b="morphNormal";for(k=0;k<this.maxMorphNormals;k++)w=
-b+k,0<=y[w]&&a.numSupportedMorphNormals++}a.uniformsList=[];for(h in a.uniforms)a.uniformsList.push([a.uniforms[h],h])};this.setFaceCulling=function(a,b){a===THREE.CullFaceNone?j.disable(j.CULL_FACE):(b===THREE.FrontFaceDirectionCW?j.frontFace(j.CW):j.frontFace(j.CCW),a===THREE.CullFaceBack?j.cullFace(j.BACK):a===THREE.CullFaceFront?j.cullFace(j.FRONT):j.cullFace(j.FRONT_AND_BACK),j.enable(j.CULL_FACE))};this.setMaterialFaces=function(a){var b=a.side===THREE.DoubleSide,a=a.side===THREE.BackSide;ha!==
+j=0,k=a.length;j<k;j++)if(i=a[j],h=i.object,h.visible){if(g)i=g;else{i=i[b];if(!i)continue;f&&t.setBlending(i.blending,i.blendEquation,i.blendSrc,i.blendDst);t.setDepthTest(i.depthTest);t.setDepthWrite(i.depthWrite);t.setPolygonOffset(i.polygonOffset,i.polygonOffsetFactor,i.polygonOffsetUnits)}B.renderImmediateObject(c,d,e,i,h)}}function l(a,b,c){a.push({id:null,buffer:b,object:c,opaque:null,transparent:null,render:!1,z:0})}function n(a){for(var b in a.attributes)if(a.attributes[b].needsUpdate)return!0;
+return!1}function m(a){for(var b in a.attributes)a.attributes[b].needsUpdate=!1}function r(a,b){for(var c=a.length-1;0<=c;c--)a[c].object===b&&a.splice(c,1)}function u(a,b){for(var c=a.length-1;0<=c;c--)a[c]===b&&a.splice(c,1)}function p(a,b,c,d,e){s=0;d.needsUpdate&&(d.program&&W(d),B.initMaterial(d,b,c,e),d.needsUpdate=!1);d.morphTargets&&!e.__webglMorphTargetInfluences&&(e.__webglMorphTargetInfluences=new Float32Array(B.maxMorphTargets));var f=!1,g=d.program,i=g.uniforms,h=d.uniforms;g!==P&&(t.useProgram(g),
+i.normalMatrix&&t.uniformMatrix3fv(i.normalMatrix,e._normalMatrix.elements);null!==i.modelMatrix&&t.uniformMatrix4fv(i.modelMatrix,e.matrixWorld.elements);return g}function q(){var a=s;a>=t.maxTextures&&console.warn("WebGLRenderer: trying to use "+a+" texture units while this GPU supports only "+t.maxTextures);s+=1;return a}function w(a,b){a._modelViewMatrix.multiplyMatrices(b.matrixWorldInverse,a.matrixWorld);a._normalMatrix.getInverse(a._modelViewMatrix);a._normalMatrix.transpose()}function v(a,
+a.geometryGroups)for(var e in a.geometryGroups){var f=a.geometryGroups[e];if(void 0!==f.numMorphTargets){c=0;for(d=f.numMorphTargets;c<d;c++)t.deleteBuffer(f.__webglMorphTargetsBuffers[c])}if(void 0!==f.numMorphNormals){c=0;for(d=f.numMorphNormals;c<d;c++)t.deleteBuffer(f.__webglMorphNormalsBuffers[c])}b(f)}b(a);B.info.memory.geometries--},Y=function(a){a=a.target;a.removeEventListener("dispose",Y);W(a)},W=function(a){var b=a.program;void 0!==b&&(a.program=void 0,J.removeProgram(b))};this.renderBufferImmediate=
+(c=!0);for(var j=0,k=e.length;j<k;j++){var l=e[j].index;if(c)for(h in b)"index"!==h&&(g=a[h],f=b[h],i=f.itemSize,0<=g&&t.setFloatAttribute(g,f.buffer,i,4*l*i));t.drawTriangleElements(d.buffer,e[j].count,2*e[j].start);B.info.render.calls++;B.info.render.vertices+=e[j].count;B.info.render.faces+=e[j].count/3}}else{if(c)for(h in b)g=a[h],f=b[h],i=f.itemSize,0<=g&&t.setFloatAttribute(g,f.buffer,i,0);h=e.attributes.position;t.drawTriangles(h.numItems/3);B.info.render.calls++;B.info.render.vertices+=h.numItems/
+3;B.info.render.faces+=h.numItems/3/3}else if(f instanceof THREE.ParticleSystem){if(c){for(h in b)g=a[h],f=b[h],i=f.itemSize,0<=g&&t.setFloatAttribute(g,f.buffer,i,0);h=b.position;t.drawPoints(h.numItems/3);B.info.render.calls++;B.info.render.points+=h.numItems/3}}else if(f instanceof THREE.Line&&c){for(h in b)g=a[h],f=b[h],i=f.itemSize,0<=g&&t.setFloatAttribute(g,f.buffer,i,0);h=b.position;t.setLineWidth(d.linewidth);t.drawLineStrip(h.numItems/3);B.info.render.calls++;B.info.render.points+=h.numItems}}};
+e.__webglParticleCount):f instanceof THREE.Ribbon&&(t.drawTriangleStrip(e.__webglVertexCount),B.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,g,k,l,m=a.__lights,n=a.fog;A=-1;N=!0;this.autoUpdateScene&&a.updateMatrixWorld();void 0===b.parent&&b.updateMatrixWorld();b.matrixWorldInverse.getInverse(b.matrixWorld);O.multiplyMatrices(b.projectionMatrix,b.matrixWorldInverse);
+t;j.geometryGroupsList=[];p=void 0;for(p in j.geometryGroups)j.geometryGroups[p].id=F++,j.geometryGroupsList.push(j.geometryGroups[p])}for(g in h.geometryGroups)j=h.geometryGroups[g],j.__webglVertexBuffer||(D.createBuffers(j),D.initBuffers(j,b),h.verticesNeedUpdate=!0,h.morphTargetsNeedUpdate=!0,h.elementsNeedUpdate=!0,h.uvsNeedUpdate=!0,h.normalsNeedUpdate=!0,h.tangentsNeedUpdate=!0,h.colorsNeedUpdate=!0)}else h instanceof THREE.BufferGeometry&&d(h);else b instanceof THREE.Ribbon?(h=b.geometry,h.__webglVertexBuffer||
+!m.shadowCascade&&n++);b=n;t.supportsBoneTextures&&d&&d.useVertexTexture?j=1024:(j=Math.floor((t.maxVertexUniformVectors-20)/4),void 0!==d&&d instanceof THREE.SkinnedMesh&&(j=Math.min(d.bones.length,j),j<d.bones.length&&console.warn("WebGLRenderer: too many bones - "+d.bones.length+", this GPU supports just "+j+" (try OpenGL instead of ANGLE)")));a.program=J.buildProgram(k,a.fragmentShader,a.vertexShader,a.uniforms,a.attributes,a.defines,{map:!!a.map,envMap:!!a.envMap,lightMap:!!a.lightMap,bumpMap:!!a.bumpMap,
+}catch(A){console.error(A)}I=k.getExtension("OES_texture_float");J=k.getExtension("OES_standard_derivatives");B=k.getExtension("EXT_texture_filter_anisotropic")||k.getExtension("MOZ_EXT_texture_filter_anisotropic")||k.getExtension("WEBKIT_EXT_texture_filter_anisotropic");P=k.getExtension("WEBGL_compressed_texture_s3tc")||k.getExtension("MOZ_WEBGL_compressed_texture_s3tc")||k.getExtension("WEBKIT_WEBGL_compressed_texture_s3tc");I||console.log("THREE.WebGLRenderer: Float textures not supported.");J||
+console.log("THREE.WebGLRenderer: Standard derivatives not supported.");B||console.log("THREE.WebGLRenderer: Anisotropic texture filtering not supported.");P||console.log("THREE.WebGLRenderer: S3TC compressed textures not supported.");void 0===k.getShaderPrecisionFormat&&(k.getShaderPrecisionFormat=function(){return{rangeMin:1,rangeMax:1,precision:1}});k.clearColor(0,0,0,1);k.clearDepth(1);k.clearStencil(0);k.enable(k.DEPTH_TEST);k.depthFunc(k.LEQUAL);k.frontFace(k.CCW);k.cullFace(k.BACK);k.enable(k.CULL_FACE);
+k.MEDIUM_INT);k.getShaderPrecisionFormat(k.FRAGMENT_SHADER,k.LOW_INT);w=0<w.precision&&0<v.precision;p=0<p.precision&&0<q.precision;"highp"===u&&!w&&(p?(u="mediump",console.warn("WebGLRenderer: highp not supported, using mediump")):(u="lowp",console.warn("WebGLRenderer: highp and mediump not supported, using lowp")));"mediump"===u&&!p&&(u="lowp",console.warn("WebGLRenderer: mediump not supported, using lowp"));var s={},H,O,K,x,N=-1,R=-1,$=-1,Y=-1,W=-1,M=0,la=0,na=0,qa=0,X=null,S=null,Z=null,T=null,
+b,k.UNSIGNED_SHORT,c)},drawLineElements:function(a,b,c){f(a);k.drawElements(k.LINES,b,k.UNSIGNED_SHORT,c)},bindArrayBuffer:e,bindElementArrayBuffer:f,enableAttribute:g,disableAttributes:function(){for(var a in s)s[a]&&(k.disableVertexAttribArray(a),s[a]=!1)},getAttribLocation:function(a,b){return k.getAttribLocation(a,b)},setFloatAttribute:function(a,b,c,d){e(b);g(a);k.vertexAttribPointer(a,c,k.FLOAT,!1,0,d)},getUniformLocation:function(a,b){return k.getUniformLocation(a,b)},uniform1i:function(a,
+THREE.extend(THREE.WebGLRenderer.ShaderBuilder.prototype,{buildProgram:function(a,b,c,d,e,f,g){var h=this.renderer,i,j,l=[];a?l.push(a):(l.push(b),l.push(c));for(j in f)l.push(j),l.push(f[j]);for(i in g)l.push(i),l.push(g[i]);a=l.join();i=0;for(j=this.programs.length;i<j;i++)if(l=this.programs[i],l.code===a)return l.usedTimes++,l.program;i="SHADOWMAP_TYPE_BASIC";g.shadowMapType===THREE.PCFShadowMap?i="SHADOWMAP_TYPE_PCF":g.shadowMapType===THREE.PCFSoftShadowMap&&(i="SHADOWMAP_TYPE_PCF_SOFT");j=this.generateDefines(f);
+for(n in d)c.push(n);this.cacheUniformLocations(b,c);c="position normal uv uv2 tangent color skinIndex skinWeight lineDistance".split(" ");for(d=0;d<g.maxMorphTargets;d++)c.push("morphTarget"+d);for(d=0;d<g.maxMorphNormals;d++)c.push("morphNormal"+d);for(m in e)c.push(m);this.cacheAttributeLocations(b,c);b.id=this.programs_counter++;this.programs.push({program:b,code:a,usedTimes:1});this.info.memory.programs=this.programs.length;return b},generateDefines:function(a){var b,c=[],d;for(d in a)b=a[d],
+new Uint16Array(3*g);a.__lineArray=new Uint16Array(2*e);if(a.numMorphTargets){a.__morphTargetsArrays=[];c=0;for(h=a.numMorphTargets;c<h;c++)a.__morphTargetsArrays.push(new Float32Array(3*f))}if(a.numMorphNormals){a.__morphNormalsArrays=[];c=0;for(h=a.numMorphNormals;c<h;c++)a.__morphNormalsArrays.push(new Float32Array(3*f))}a.__webglFaceCount=3*g;a.__webglLineCount=2*e;if(d.attributes){void 0===a.__webglCustomAttributesList&&(a.__webglCustomAttributesList=[]);for(var l in d.attributes){var g=d.attributes[l],
+c={},n;for(n in g)c[n]=g[n];if(!c.__webglInitialized||c.createUniqueBuffers)c.__webglInitialized=!0,e=1,"v2"===c.type?e=2:"v3"===c.type?e=3:"v4"===c.type?e=4:"c"===c.type&&(e=3),c.size=e,c.array=new Float32Array(f*e),c.buffer=this.renderer.createBuffer(),c.buffer.belongsToAttribute=l,g.needsUpdate=!0,c.__original=g;a.__webglCustomAttributesList.push(c)}}a.__inittedArrays=!0},setBuffers:function(a,b,c,d){if(a.__inittedArrays){var e=this.renderer,f=this.bufferGuessNormalType(d),g=this.bufferGuessVertexColorType(d),
-d,k.open("GET",a,!0),k.responseType="arraybuffer",k.send(null);return f},parseDDS:function(a,b){function c(a){return a.charCodeAt(0)+(a.charCodeAt(1)<<8)+(a.charCodeAt(2)<<16)+(a.charCodeAt(3)<<24)}var d={mipmaps:[],width:0,height:0,format:null,mipmapCount:1},e=c("DXT1"),f=c("DXT3"),g=c("DXT5"),h=new Int32Array(a,0,31);if(542327876!==h[0])return console.error("ImageUtils.parseDDS(): Invalid magic number in DDS header"),d;if(!h[20]&4)return console.error("ImageUtils.parseDDS(): Unsupported format, must contain a FourCC code"),
+d,j.open("GET",a,!0),j.responseType="arraybuffer",j.send(null);return f},parseDDS:function(a,b){function c(a){return a.charCodeAt(0)+(a.charCodeAt(1)<<8)+(a.charCodeAt(2)<<16)+(a.charCodeAt(3)<<24)}var d={mipmaps:[],width:0,height:0,format:null,mipmapCount:1},e=c("DXT1"),f=c("DXT3"),g=c("DXT5"),h=new Int32Array(a,0,31);if(542327876!==h[0])return console.error("ImageUtils.parseDDS(): Invalid magic number in DDS header"),d;if(!h[20]&4)return console.error("ImageUtils.parseDDS(): Unsupported format, must contain a FourCC code"),
b;a++)f=e[a],THREE.Shape.Utils.isClockWise(f.getPoints())?(g.actions=f.actions,g.curves=f.curves,d.push(g),g=new THREE.Shape):g.holes.push(f)}else{a=0;for(b=e.length;a<b;a++)f=e[a],THREE.Shape.Utils.isClockWise(f.getPoints())?(g&&d.push(g),g=new THREE.Shape,g.actions=f.actions,g.curves=f.curves):g.holes.push(f);d.push(g)}return d};THREE.Shape=function(){THREE.Path.apply(this,arguments);this.holes=[]};THREE.Shape.prototype=Object.create(THREE.Path.prototype);THREE.Shape.prototype.extrude=function(a){return new THREE.ExtrudeGeometry(this,a)};THREE.Shape.prototype.makeGeometry=function(a){return new THREE.ShapeGeometry(this,a)};THREE.Shape.prototype.getPointsHoles=function(a){var b,c=this.holes.length,d=[];for(b=0;b<c;b++)d[b]=this.holes[b].getTransformedPoints(a,this.bends);return d};
b;a++)f=e[a],THREE.Shape.Utils.isClockWise(f.getPoints())?(g.actions=f.actions,g.curves=f.curves,d.push(g),g=new THREE.Shape):g.holes.push(f)}else{a=0;for(b=e.length;a<b;a++)f=e[a],THREE.Shape.Utils.isClockWise(f.getPoints())?(g&&d.push(g),g=new THREE.Shape,g.actions=f.actions,g.curves=f.curves):g.holes.push(f);d.push(g)}return d};THREE.Shape=function(){THREE.Path.apply(this,arguments);this.holes=[]};THREE.Shape.prototype=Object.create(THREE.Path.prototype);THREE.Shape.prototype.extrude=function(a){return new THREE.ExtrudeGeometry(this,a)};THREE.Shape.prototype.makeGeometry=function(a){return new THREE.ShapeGeometry(this,a)};THREE.Shape.prototype.getPointsHoles=function(a){var b,c=this.holes.length,d=[];for(b=0;b<c;b++)d[b]=this.holes[b].getTransformedPoints(a,this.bends);return d};
-for(d=0;d<a.hierarchy[c].keys.length;d++){var l={};for(k in h){for(i=0;i<a.hierarchy[c].keys[d].morphTargets.length;i++)if(a.hierarchy[c].keys[d].morphTargets[i]===k){l[k]=a.hierarchy[c].keys[d].morphTargetsInfluences[i];break}i===a.hierarchy[c].keys[d].morphTargets.length&&(l[k]=0)}a.hierarchy[c].keys[d].morphTargetsInfluences=l}}for(d=1;d<a.hierarchy[c].keys.length;d++)a.hierarchy[c].keys[d].time===a.hierarchy[c].keys[d-1].time&&(a.hierarchy[c].keys.splice(d,1),d--);for(d=0;d<a.hierarchy[c].keys.length;d++)a.hierarchy[c].keys[d].index=
+for(d=0;d<a.hierarchy[c].keys.length;d++){var l={};for(j in h){for(i=0;i<a.hierarchy[c].keys[d].morphTargets.length;i++)if(a.hierarchy[c].keys[d].morphTargets[i]===j){l[j]=a.hierarchy[c].keys[d].morphTargetsInfluences[i];break}i===a.hierarchy[c].keys[d].morphTargets.length&&(l[j]=0)}a.hierarchy[c].keys[d].morphTargetsInfluences=l}}for(d=1;d<a.hierarchy[c].keys.length;d++)a.hierarchy[c].keys[d].time===a.hierarchy[c].keys[d-1].time&&(a.hierarchy[c].keys.splice(d,1),d--);for(d=0;d<a.hierarchy[c].keys.length;d++)a.hierarchy[c].keys[d].index=
-k;)g=h,h=this.getNextKeyWith(c,n,h.index+1)}else{this.stop();return}else{do g=h,h=this.getNextKeyWith(c,n,h.index+1);while(h.time<k)}i.prevKey[c]=g;i.nextKey[c]=h}a.matrixAutoUpdate=!0;a.matrixWorldNeedsUpdate=!0;d=(k-g.time)/(h.time-g.time);e=g[c];f=h[c];if(0>d||1<d)console.log("THREE.Animation.update: Warning! Scale out of bounds:"+d+" on bone "+n),d=0>d?0:1;if("pos"===c)if(c=a.position,this.interpolationType===THREE.AnimationHandler.LINEAR)c.x=e[0]+(f[0]-e[0])*d,c.y=e[1]+(f[1]-e[1])*d,c.z=e[2]+
+j;)g=h,h=this.getNextKeyWith(c,n,h.index+1)}else{this.stop();return}else{do g=h,h=this.getNextKeyWith(c,n,h.index+1);while(h.time<j)}i.prevKey[c]=g;i.nextKey[c]=h}a.matrixAutoUpdate=!0;a.matrixWorldNeedsUpdate=!0;d=(j-g.time)/(h.time-g.time);e=g[c];f=h[c];if(0>d||1<d)console.log("THREE.Animation.update: Warning! Scale out of bounds:"+d+" on bone "+n),d=0>d?0:1;if("pos"===c)if(c=a.position,this.interpolationType===THREE.AnimationHandler.LINEAR)c.x=e[0]+(f[0]-e[0])*d,c.y=e[1]+(f[1]-e[1])*d,c.z=e[2]+
-i.copy(b).add(f);h.copy(c).add(g);f=d.dot(g);g=h.sub(i).dot(g);0===f&&(console.log("Either infinite or no solutions!"),0===g?console.log("Its finite solutions."):console.log("Too bad, no solutions."));g/=f;return 0>g?(b=Math.atan2(b.y-a.y,b.x-a.x),a=Math.atan2(c.y-a.y,c.x-a.x),b>a&&(a+=2*Math.PI),c=(b+a)/2,a=-Math.cos(c),c=-Math.sin(c),new THREE.Vector2(a,c)):d.multiplyScalar(g).add(i).sub(a).clone()}function e(c,d){var e,f;for(M=c.length;0<=--M;){e=M;f=M-1;0>f&&(f=c.length-1);for(var g=0,i=t+2*l,
+h.copy(b).add(f);i.copy(c).add(g);f=d.dot(g);g=i.sub(h).dot(g);0===f&&(console.log("Either infinite or no solutions!"),0===g?console.log("Its finite solutions."):console.log("Too bad, no solutions."));g/=f;return 0>g?(b=Math.atan2(b.y-a.y,b.x-a.x),a=Math.atan2(c.y-a.y,c.x-a.x),b>a&&(a+=2*Math.PI),c=(b+a)/2,a=-Math.cos(c),c=-Math.sin(c),new THREE.Vector2(a,c)):d.multiplyScalar(g).add(h).sub(a).clone()}function e(c,d){var e,f;for(N=c.length;0<=--N;){e=N;f=N-1;0>f&&(f=c.length-1);for(var g=0,h=r+2*l,