瀏覽代碼

Merge branch 'dev' into vector-doc

Mr.doob 5 年之前
父節點
當前提交
67e4cf0135

+ 30 - 0
build/three.js

@@ -1069,6 +1069,15 @@
 
 
 			return this;
 			return this;
 
 
+		},
+
+		random: function () {
+
+			this.x = Math.random();
+			this.y = Math.random();
+
+			return this;
+
 		}
 		}
 
 
 	} );
 	} );
@@ -2449,6 +2458,17 @@
 
 
 			return this;
 			return this;
 
 
+		},
+
+		random: function () {
+
+			this.x = Math.random();
+			this.y = Math.random();
+			this.z = Math.random();
+			this.w = Math.random();
+
+			return this;
+
 		}
 		}
 
 
 	} );
 	} );
@@ -3932,6 +3952,16 @@
 
 
 			return this;
 			return this;
 
 
+		},
+
+		random: function () {
+
+			this.x = Math.random();
+			this.y = Math.random();
+			this.z = Math.random();
+
+			return this;
+
 		}
 		}
 
 
 	} );
 	} );

+ 31 - 31
build/three.min.js

@@ -355,14 +355,14 @@ b){this.x=Math.max(a.x,Math.min(b.x,this.x));this.y=Math.max(a.y,Math.min(b.y,th
 Math.round(this.x);this.y=Math.round(this.y);return this},roundToZero:function(){this.x=0>this.x?Math.ceil(this.x):Math.floor(this.x);this.y=0>this.y?Math.ceil(this.y):Math.floor(this.y);return this},negate:function(){this.x=-this.x;this.y=-this.y;return this},dot:function(a){return this.x*a.x+this.y*a.y},cross:function(a){return this.x*a.y-this.y*a.x},lengthSq:function(){return this.x*this.x+this.y*this.y},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y)},manhattanLength:function(){return Math.abs(this.x)+
 Math.round(this.x);this.y=Math.round(this.y);return this},roundToZero:function(){this.x=0>this.x?Math.ceil(this.x):Math.floor(this.x);this.y=0>this.y?Math.ceil(this.y):Math.floor(this.y);return this},negate:function(){this.x=-this.x;this.y=-this.y;return this},dot:function(a){return this.x*a.x+this.y*a.y},cross:function(a){return this.x*a.y-this.y*a.x},lengthSq:function(){return this.x*this.x+this.y*this.y},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y)},manhattanLength:function(){return Math.abs(this.x)+
 Math.abs(this.y)},normalize:function(){return this.divideScalar(this.length()||1)},angle:function(){return Math.atan2(-this.y,-this.x)+Math.PI},distanceTo:function(a){return Math.sqrt(this.distanceToSquared(a))},distanceToSquared:function(a){var b=this.x-a.x;a=this.y-a.y;return b*b+a*a},manhattanDistanceTo:function(a){return Math.abs(this.x-a.x)+Math.abs(this.y-a.y)},setLength:function(a){return this.normalize().multiplyScalar(a)},lerp:function(a,b){this.x+=(a.x-this.x)*b;this.y+=(a.y-this.y)*b;return this},
 Math.abs(this.y)},normalize:function(){return this.divideScalar(this.length()||1)},angle:function(){return Math.atan2(-this.y,-this.x)+Math.PI},distanceTo:function(a){return Math.sqrt(this.distanceToSquared(a))},distanceToSquared:function(a){var b=this.x-a.x;a=this.y-a.y;return b*b+a*a},manhattanDistanceTo:function(a){return Math.abs(this.x-a.x)+Math.abs(this.y-a.y)},setLength:function(a){return this.normalize().multiplyScalar(a)},lerp:function(a,b){this.x+=(a.x-this.x)*b;this.y+=(a.y-this.y)*b;return this},
 lerpVectors:function(a,b,c){return this.subVectors(b,a).multiplyScalar(c).add(a)},equals:function(a){return a.x===this.x&&a.y===this.y},fromArray:function(a,b){void 0===b&&(b=0);this.x=a[b];this.y=a[b+1];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this.x;a[b+1]=this.y;return a},fromBufferAttribute:function(a,b,c){void 0!==c&&console.warn("THREE.Vector2: offset has been removed from .fromBufferAttribute().");this.x=a.getX(b);this.y=a.getY(b);return this},rotateAround:function(a,
 lerpVectors:function(a,b,c){return this.subVectors(b,a).multiplyScalar(c).add(a)},equals:function(a){return a.x===this.x&&a.y===this.y},fromArray:function(a,b){void 0===b&&(b=0);this.x=a[b];this.y=a[b+1];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this.x;a[b+1]=this.y;return a},fromBufferAttribute:function(a,b,c){void 0!==c&&console.warn("THREE.Vector2: offset has been removed from .fromBufferAttribute().");this.x=a.getX(b);this.y=a.getY(b);return this},rotateAround:function(a,
-b){var c=Math.cos(b);b=Math.sin(b);var d=this.x-a.x,e=this.y-a.y;this.x=d*c-e*b+a.x;this.y=d*b+e*c+a.y;return this}});Object.assign(ua.prototype,{isMatrix3:!0,set:function(a,b,c,d,e,f,g,h,l){var m=this.elements;m[0]=a;m[1]=d;m[2]=g;m[3]=b;m[4]=e;m[5]=h;m[6]=c;m[7]=f;m[8]=l;return this},identity:function(){this.set(1,0,0,0,1,0,0,0,1);return this},clone:function(){return(new this.constructor).fromArray(this.elements)},copy:function(a){var b=this.elements;a=a.elements;b[0]=a[0];b[1]=a[1];b[2]=a[2];b[3]=
-a[3];b[4]=a[4];b[5]=a[5];b[6]=a[6];b[7]=a[7];b[8]=a[8];return this},extractBasis:function(a,b,c){a.setFromMatrix3Column(this,0);b.setFromMatrix3Column(this,1);c.setFromMatrix3Column(this,2);return this},setFromMatrix4:function(a){a=a.elements;this.set(a[0],a[4],a[8],a[1],a[5],a[9],a[2],a[6],a[10]);return this},multiply:function(a){return this.multiplyMatrices(this,a)},premultiply:function(a){return this.multiplyMatrices(a,this)},multiplyMatrices:function(a,b){var c=a.elements,d=b.elements;b=this.elements;
-a=c[0];var e=c[3],f=c[6],g=c[1],h=c[4],l=c[7],m=c[2],k=c[5];c=c[8];var p=d[0],n=d[3],r=d[6],q=d[1],v=d[4],E=d[7],w=d[2],t=d[5];d=d[8];b[0]=a*p+e*q+f*w;b[3]=a*n+e*v+f*t;b[6]=a*r+e*E+f*d;b[1]=g*p+h*q+l*w;b[4]=g*n+h*v+l*t;b[7]=g*r+h*E+l*d;b[2]=m*p+k*q+c*w;b[5]=m*n+k*v+c*t;b[8]=m*r+k*E+c*d;return this},multiplyScalar:function(a){var b=this.elements;b[0]*=a;b[3]*=a;b[6]*=a;b[1]*=a;b[4]*=a;b[7]*=a;b[2]*=a;b[5]*=a;b[8]*=a;return this},determinant:function(){var a=this.elements,b=a[0],c=a[1],d=a[2],e=a[3],
-f=a[4],g=a[5],h=a[6],l=a[7];a=a[8];return b*f*a-b*g*l-c*e*a+c*g*h+d*e*l-d*f*h},getInverse:function(a,b){void 0!==b&&console.warn("THREE.Matrix3: .getInverse() can no longer be configured to throw on degenerate.");var c=a.elements;a=this.elements;b=c[0];var d=c[1],e=c[2],f=c[3],g=c[4],h=c[5],l=c[6],m=c[7];c=c[8];var k=c*g-h*m,p=h*l-c*f,n=m*f-g*l,r=b*k+d*p+e*n;if(0===r)return this.set(0,0,0,0,0,0,0,0,0);r=1/r;a[0]=k*r;a[1]=(e*m-c*d)*r;a[2]=(h*d-e*g)*r;a[3]=p*r;a[4]=(c*b-e*l)*r;a[5]=(e*f-h*b)*r;a[6]=
-n*r;a[7]=(d*l-m*b)*r;a[8]=(g*b-d*f)*r;return this},transpose:function(){var a=this.elements;var b=a[1];a[1]=a[3];a[3]=b;b=a[2];a[2]=a[6];a[6]=b;b=a[5];a[5]=a[7];a[7]=b;return this},getNormalMatrix:function(a){return this.setFromMatrix4(a).getInverse(this).transpose()},transposeIntoArray:function(a){var b=this.elements;a[0]=b[0];a[1]=b[3];a[2]=b[6];a[3]=b[1];a[4]=b[4];a[5]=b[7];a[6]=b[2];a[7]=b[5];a[8]=b[8];return this},setUvTransform:function(a,b,c,d,e,f,g){var h=Math.cos(e);e=Math.sin(e);this.set(c*
-h,c*e,-c*(h*f+e*g)+f+a,-d*e,d*h,-d*(-e*f+h*g)+g+b,0,0,1)},scale:function(a,b){var c=this.elements;c[0]*=a;c[3]*=a;c[6]*=a;c[1]*=b;c[4]*=b;c[7]*=b;return this},rotate:function(a){var b=Math.cos(a);a=Math.sin(a);var c=this.elements,d=c[0],e=c[3],f=c[6],g=c[1],h=c[4],l=c[7];c[0]=b*d+a*g;c[3]=b*e+a*h;c[6]=b*f+a*l;c[1]=-a*d+b*g;c[4]=-a*e+b*h;c[7]=-a*f+b*l;return this},translate:function(a,b){var c=this.elements;c[0]+=a*c[2];c[3]+=a*c[5];c[6]+=a*c[8];c[1]+=b*c[2];c[4]+=b*c[5];c[7]+=b*c[8];return this},
-equals:function(a){var b=this.elements;a=a.elements;for(var c=0;9>c;c++)if(b[c]!==a[c])return!1;return!0},fromArray:function(a,b){void 0===b&&(b=0);for(var c=0;9>c;c++)this.elements[c]=a[c+b];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);var c=this.elements;a[b]=c[0];a[b+1]=c[1];a[b+2]=c[2];a[b+3]=c[3];a[b+4]=c[4];a[b+5]=c[5];a[b+6]=c[6];a[b+7]=c[7];a[b+8]=c[8];return a}});var kd,Kb={getDataURL:function(a){if("undefined"==typeof HTMLCanvasElement)return a.src;if(!(a instanceof
-HTMLCanvasElement)){void 0===kd&&(kd=document.createElementNS("http://www.w3.org/1999/xhtml","canvas"));kd.width=a.width;kd.height=a.height;var b=kd.getContext("2d");a instanceof ImageData?b.putImageData(a,0,0):b.drawImage(a,0,0,a.width,a.height);a=kd}return 2048<a.width||2048<a.height?a.toDataURL("image/jpeg",.6):a.toDataURL("image/png")}},ej=0;V.DEFAULT_IMAGE=void 0;V.DEFAULT_MAPPING=300;V.prototype=Object.assign(Object.create(ta.prototype),{constructor:V,isTexture:!0,updateMatrix:function(){this.matrix.setUvTransform(this.offset.x,
+b){var c=Math.cos(b);b=Math.sin(b);var d=this.x-a.x,e=this.y-a.y;this.x=d*c-e*b+a.x;this.y=d*b+e*c+a.y;return this},random:function(){this.x=Math.random();this.y=Math.random();return this}});Object.assign(ua.prototype,{isMatrix3:!0,set:function(a,b,c,d,e,f,g,h,l){var m=this.elements;m[0]=a;m[1]=d;m[2]=g;m[3]=b;m[4]=e;m[5]=h;m[6]=c;m[7]=f;m[8]=l;return this},identity:function(){this.set(1,0,0,0,1,0,0,0,1);return this},clone:function(){return(new this.constructor).fromArray(this.elements)},copy:function(a){var b=
+this.elements;a=a.elements;b[0]=a[0];b[1]=a[1];b[2]=a[2];b[3]=a[3];b[4]=a[4];b[5]=a[5];b[6]=a[6];b[7]=a[7];b[8]=a[8];return this},extractBasis:function(a,b,c){a.setFromMatrix3Column(this,0);b.setFromMatrix3Column(this,1);c.setFromMatrix3Column(this,2);return this},setFromMatrix4:function(a){a=a.elements;this.set(a[0],a[4],a[8],a[1],a[5],a[9],a[2],a[6],a[10]);return this},multiply:function(a){return this.multiplyMatrices(this,a)},premultiply:function(a){return this.multiplyMatrices(a,this)},multiplyMatrices:function(a,
+b){var c=a.elements,d=b.elements;b=this.elements;a=c[0];var e=c[3],f=c[6],g=c[1],h=c[4],l=c[7],m=c[2],k=c[5];c=c[8];var p=d[0],n=d[3],r=d[6],q=d[1],v=d[4],E=d[7],w=d[2],t=d[5];d=d[8];b[0]=a*p+e*q+f*w;b[3]=a*n+e*v+f*t;b[6]=a*r+e*E+f*d;b[1]=g*p+h*q+l*w;b[4]=g*n+h*v+l*t;b[7]=g*r+h*E+l*d;b[2]=m*p+k*q+c*w;b[5]=m*n+k*v+c*t;b[8]=m*r+k*E+c*d;return this},multiplyScalar:function(a){var b=this.elements;b[0]*=a;b[3]*=a;b[6]*=a;b[1]*=a;b[4]*=a;b[7]*=a;b[2]*=a;b[5]*=a;b[8]*=a;return this},determinant:function(){var a=
+this.elements,b=a[0],c=a[1],d=a[2],e=a[3],f=a[4],g=a[5],h=a[6],l=a[7];a=a[8];return b*f*a-b*g*l-c*e*a+c*g*h+d*e*l-d*f*h},getInverse:function(a,b){void 0!==b&&console.warn("THREE.Matrix3: .getInverse() can no longer be configured to throw on degenerate.");var c=a.elements;a=this.elements;b=c[0];var d=c[1],e=c[2],f=c[3],g=c[4],h=c[5],l=c[6],m=c[7];c=c[8];var k=c*g-h*m,p=h*l-c*f,n=m*f-g*l,r=b*k+d*p+e*n;if(0===r)return this.set(0,0,0,0,0,0,0,0,0);r=1/r;a[0]=k*r;a[1]=(e*m-c*d)*r;a[2]=(h*d-e*g)*r;a[3]=
+p*r;a[4]=(c*b-e*l)*r;a[5]=(e*f-h*b)*r;a[6]=n*r;a[7]=(d*l-m*b)*r;a[8]=(g*b-d*f)*r;return this},transpose:function(){var a=this.elements;var b=a[1];a[1]=a[3];a[3]=b;b=a[2];a[2]=a[6];a[6]=b;b=a[5];a[5]=a[7];a[7]=b;return this},getNormalMatrix:function(a){return this.setFromMatrix4(a).getInverse(this).transpose()},transposeIntoArray:function(a){var b=this.elements;a[0]=b[0];a[1]=b[3];a[2]=b[6];a[3]=b[1];a[4]=b[4];a[5]=b[7];a[6]=b[2];a[7]=b[5];a[8]=b[8];return this},setUvTransform:function(a,b,c,d,e,f,
+g){var h=Math.cos(e);e=Math.sin(e);this.set(c*h,c*e,-c*(h*f+e*g)+f+a,-d*e,d*h,-d*(-e*f+h*g)+g+b,0,0,1)},scale:function(a,b){var c=this.elements;c[0]*=a;c[3]*=a;c[6]*=a;c[1]*=b;c[4]*=b;c[7]*=b;return this},rotate:function(a){var b=Math.cos(a);a=Math.sin(a);var c=this.elements,d=c[0],e=c[3],f=c[6],g=c[1],h=c[4],l=c[7];c[0]=b*d+a*g;c[3]=b*e+a*h;c[6]=b*f+a*l;c[1]=-a*d+b*g;c[4]=-a*e+b*h;c[7]=-a*f+b*l;return this},translate:function(a,b){var c=this.elements;c[0]+=a*c[2];c[3]+=a*c[5];c[6]+=a*c[8];c[1]+=
+b*c[2];c[4]+=b*c[5];c[7]+=b*c[8];return this},equals:function(a){var b=this.elements;a=a.elements;for(var c=0;9>c;c++)if(b[c]!==a[c])return!1;return!0},fromArray:function(a,b){void 0===b&&(b=0);for(var c=0;9>c;c++)this.elements[c]=a[c+b];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);var c=this.elements;a[b]=c[0];a[b+1]=c[1];a[b+2]=c[2];a[b+3]=c[3];a[b+4]=c[4];a[b+5]=c[5];a[b+6]=c[6];a[b+7]=c[7];a[b+8]=c[8];return a}});var kd,Kb={getDataURL:function(a){if("undefined"==typeof HTMLCanvasElement)return a.src;
+if(!(a instanceof HTMLCanvasElement)){void 0===kd&&(kd=document.createElementNS("http://www.w3.org/1999/xhtml","canvas"));kd.width=a.width;kd.height=a.height;var b=kd.getContext("2d");a instanceof ImageData?b.putImageData(a,0,0):b.drawImage(a,0,0,a.width,a.height);a=kd}return 2048<a.width||2048<a.height?a.toDataURL("image/jpeg",.6):a.toDataURL("image/png")}},ej=0;V.DEFAULT_IMAGE=void 0;V.DEFAULT_MAPPING=300;V.prototype=Object.assign(Object.create(ta.prototype),{constructor:V,isTexture:!0,updateMatrix:function(){this.matrix.setUvTransform(this.offset.x,
 this.offset.y,this.repeat.x,this.repeat.y,this.rotation,this.center.x,this.center.y)},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.name=a.name;this.image=a.image;this.mipmaps=a.mipmaps.slice(0);this.mapping=a.mapping;this.wrapS=a.wrapS;this.wrapT=a.wrapT;this.magFilter=a.magFilter;this.minFilter=a.minFilter;this.anisotropy=a.anisotropy;this.format=a.format;this.internalFormat=a.internalFormat;this.type=a.type;this.offset.copy(a.offset);this.repeat.copy(a.repeat);
 this.offset.y,this.repeat.x,this.repeat.y,this.rotation,this.center.x,this.center.y)},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.name=a.name;this.image=a.image;this.mipmaps=a.mipmaps.slice(0);this.mapping=a.mapping;this.wrapS=a.wrapS;this.wrapT=a.wrapT;this.magFilter=a.magFilter;this.minFilter=a.minFilter;this.anisotropy=a.anisotropy;this.format=a.format;this.internalFormat=a.internalFormat;this.type=a.type;this.offset.copy(a.offset);this.repeat.copy(a.repeat);
 this.center.copy(a.center);this.rotation=a.rotation;this.matrixAutoUpdate=a.matrixAutoUpdate;this.matrix.copy(a.matrix);this.generateMipmaps=a.generateMipmaps;this.premultiplyAlpha=a.premultiplyAlpha;this.flipY=a.flipY;this.unpackAlignment=a.unpackAlignment;this.encoding=a.encoding;return this},toJSON:function(a){var b=void 0===a||"string"===typeof a;if(!b&&void 0!==a.textures[this.uuid])return a.textures[this.uuid];var c={metadata:{version:4.5,type:"Texture",generator:"Texture.toJSON"},uuid:this.uuid,
 this.center.copy(a.center);this.rotation=a.rotation;this.matrixAutoUpdate=a.matrixAutoUpdate;this.matrix.copy(a.matrix);this.generateMipmaps=a.generateMipmaps;this.premultiplyAlpha=a.premultiplyAlpha;this.flipY=a.flipY;this.unpackAlignment=a.unpackAlignment;this.encoding=a.encoding;return this},toJSON:function(a){var b=void 0===a||"string"===typeof a;if(!b&&void 0!==a.textures[this.uuid])return a.textures[this.uuid];var c={metadata:{version:4.5,type:"Texture",generator:"Texture.toJSON"},uuid:this.uuid,
 name:this.name,mapping:this.mapping,repeat:[this.repeat.x,this.repeat.y],offset:[this.offset.x,this.offset.y],center:[this.center.x,this.center.y],rotation:this.rotation,wrap:[this.wrapS,this.wrapT],format:this.format,type:this.type,encoding:this.encoding,minFilter:this.minFilter,magFilter:this.magFilter,anisotropy:this.anisotropy,flipY:this.flipY,premultiplyAlpha:this.premultiplyAlpha,unpackAlignment:this.unpackAlignment};if(void 0!==this.image){var d=this.image;void 0===d.uuid&&(d.uuid=L.generateUUID());
 name:this.name,mapping:this.mapping,repeat:[this.repeat.x,this.repeat.y],offset:[this.offset.x,this.offset.y],center:[this.center.x,this.center.y],rotation:this.rotation,wrap:[this.wrapS,this.wrapT],format:this.format,type:this.type,encoding:this.encoding,minFilter:this.minFilter,magFilter:this.magFilter,anisotropy:this.anisotropy,flipY:this.flipY,premultiplyAlpha:this.premultiplyAlpha,unpackAlignment:this.unpackAlignment};if(void 0!==this.image){var d=this.image;void 0===d.uuid&&(d.uuid=L.generateUUID());
@@ -379,23 +379,23 @@ return this},clampScalar:function(a,b){this.x=Math.max(a,Math.min(b,this.x));thi
 Math.ceil(this.y);this.z=Math.ceil(this.z);this.w=Math.ceil(this.w);return this},round:function(){this.x=Math.round(this.x);this.y=Math.round(this.y);this.z=Math.round(this.z);this.w=Math.round(this.w);return this},roundToZero:function(){this.x=0>this.x?Math.ceil(this.x):Math.floor(this.x);this.y=0>this.y?Math.ceil(this.y):Math.floor(this.y);this.z=0>this.z?Math.ceil(this.z):Math.floor(this.z);this.w=0>this.w?Math.ceil(this.w):Math.floor(this.w);return this},negate:function(){this.x=-this.x;this.y=
 Math.ceil(this.y);this.z=Math.ceil(this.z);this.w=Math.ceil(this.w);return this},round:function(){this.x=Math.round(this.x);this.y=Math.round(this.y);this.z=Math.round(this.z);this.w=Math.round(this.w);return this},roundToZero:function(){this.x=0>this.x?Math.ceil(this.x):Math.floor(this.x);this.y=0>this.y?Math.ceil(this.y):Math.floor(this.y);this.z=0>this.z?Math.ceil(this.z):Math.floor(this.z);this.w=0>this.w?Math.ceil(this.w):Math.floor(this.w);return this},negate:function(){this.x=-this.x;this.y=
 -this.y;this.z=-this.z;this.w=-this.w;return this},dot:function(a){return this.x*a.x+this.y*a.y+this.z*a.z+this.w*a.w},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)},manhattanLength:function(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)+Math.abs(this.w)},normalize:function(){return this.divideScalar(this.length()||1)},setLength:function(a){return this.normalize().multiplyScalar(a)},
 -this.y;this.z=-this.z;this.w=-this.w;return this},dot:function(a){return this.x*a.x+this.y*a.y+this.z*a.z+this.w*a.w},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)},manhattanLength:function(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)+Math.abs(this.w)},normalize:function(){return this.divideScalar(this.length()||1)},setLength:function(a){return this.normalize().multiplyScalar(a)},
 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;this.w+=(a.w-this.w)*b;return this},lerpVectors:function(a,b,c){return this.subVectors(b,a).multiplyScalar(c).add(a)},equals:function(a){return a.x===this.x&&a.y===this.y&&a.z===this.z&&a.w===this.w},fromArray:function(a,b){void 0===b&&(b=0);this.x=a[b];this.y=a[b+1];this.z=a[b+2];this.w=a[b+3];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this.x;a[b+1]=this.y;a[b+2]=this.z;a[b+3]=
 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;this.w+=(a.w-this.w)*b;return this},lerpVectors:function(a,b,c){return this.subVectors(b,a).multiplyScalar(c).add(a)},equals:function(a){return a.x===this.x&&a.y===this.y&&a.z===this.z&&a.w===this.w},fromArray:function(a,b){void 0===b&&(b=0);this.x=a[b];this.y=a[b+1];this.z=a[b+2];this.w=a[b+3];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this.x;a[b+1]=this.y;a[b+2]=this.z;a[b+3]=
-this.w;return a},fromBufferAttribute:function(a,b,c){void 0!==c&&console.warn("THREE.Vector4: offset has been removed from .fromBufferAttribute().");this.x=a.getX(b);this.y=a.getY(b);this.z=a.getZ(b);this.w=a.getW(b);return this}});ya.prototype=Object.assign(Object.create(ta.prototype),{constructor:ya,isWebGLRenderTarget:!0,setSize:function(a,b){if(this.width!==a||this.height!==b)this.width=a,this.height=b,this.texture.image.width=a,this.texture.image.height=b,this.dispose();this.viewport.set(0,0,
-a,b);this.scissor.set(0,0,a,b)},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.width=a.width;this.height=a.height;this.viewport.copy(a.viewport);this.texture=a.texture.clone();this.depthBuffer=a.depthBuffer;this.stencilBuffer=a.stencilBuffer;this.depthTexture=a.depthTexture;return this},dispose:function(){this.dispatchEvent({type:"dispose"})}});Uf.prototype=Object.assign(Object.create(ya.prototype),{constructor:Uf,isWebGLMultisampleRenderTarget:!0,copy:function(a){ya.prototype.copy.call(this,
-a);this.samples=a.samples;return this}});Object.assign(za,{slerp:function(a,b,c,d){return c.copy(a).slerp(b,d)},slerpFlat:function(a,b,c,d,e,f,g){var h=c[d+0],l=c[d+1],m=c[d+2];c=c[d+3];d=e[f+0];var k=e[f+1],p=e[f+2];e=e[f+3];if(c!==e||h!==d||l!==k||m!==p){f=1-g;var n=h*d+l*k+m*p+c*e,r=0<=n?1:-1,q=1-n*n;q>Number.EPSILON&&(q=Math.sqrt(q),n=Math.atan2(q,n*r),f=Math.sin(f*n)/q,g=Math.sin(g*n)/q);r*=g;h=h*f+d*r;l=l*f+k*r;m=m*f+p*r;c=c*f+e*r;f===1-g&&(g=1/Math.sqrt(h*h+l*l+m*m+c*c),h*=g,l*=g,m*=g,c*=g)}a[b]=
-h;a[b+1]=l;a[b+2]=m;a[b+3]=c}});Object.defineProperties(za.prototype,{x:{get:function(){return this._x},set:function(a){this._x=a;this._onChangeCallback()}},y:{get:function(){return this._y},set:function(a){this._y=a;this._onChangeCallback()}},z:{get:function(){return this._z},set:function(a){this._z=a;this._onChangeCallback()}},w:{get:function(){return this._w},set:function(a){this._w=a;this._onChangeCallback()}}});Object.assign(za.prototype,{isQuaternion:!0,set:function(a,b,c,d){this._x=a;this._y=
-b;this._z=c;this._w=d;this._onChangeCallback();return this},clone:function(){return new this.constructor(this._x,this._y,this._z,this._w)},copy:function(a){this._x=a.x;this._y=a.y;this._z=a.z;this._w=a.w;this._onChangeCallback();return this},setFromEuler:function(a,b){if(!a||!a.isEuler)throw Error("THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order.");var c=a._x,d=a._y,e=a._z;a=a.order;var f=Math.cos,g=Math.sin,h=f(c/2),l=f(d/2);f=f(e/2);c=g(c/2);d=g(d/
-2);e=g(e/2);"XYZ"===a?(this._x=c*l*f+h*d*e,this._y=h*d*f-c*l*e,this._z=h*l*e+c*d*f,this._w=h*l*f-c*d*e):"YXZ"===a?(this._x=c*l*f+h*d*e,this._y=h*d*f-c*l*e,this._z=h*l*e-c*d*f,this._w=h*l*f+c*d*e):"ZXY"===a?(this._x=c*l*f-h*d*e,this._y=h*d*f+c*l*e,this._z=h*l*e+c*d*f,this._w=h*l*f-c*d*e):"ZYX"===a?(this._x=c*l*f-h*d*e,this._y=h*d*f+c*l*e,this._z=h*l*e-c*d*f,this._w=h*l*f+c*d*e):"YZX"===a?(this._x=c*l*f+h*d*e,this._y=h*d*f+c*l*e,this._z=h*l*e-c*d*f,this._w=h*l*f-c*d*e):"XZY"===a&&(this._x=c*l*f-h*d*
-e,this._y=h*d*f-c*l*e,this._z=h*l*e+c*d*f,this._w=h*l*f+c*d*e);!1!==b&&this._onChangeCallback();return this},setFromAxisAngle:function(a,b){b/=2;var c=Math.sin(b);this._x=a.x*c;this._y=a.y*c;this._z=a.z*c;this._w=Math.cos(b);this._onChangeCallback();return this},setFromRotationMatrix:function(a){var b=a.elements,c=b[0];a=b[4];var d=b[8],e=b[1],f=b[5],g=b[9],h=b[2],l=b[6];b=b[10];var m=c+f+b;0<m?(c=.5/Math.sqrt(m+1),this._w=.25/c,this._x=(l-g)*c,this._y=(d-h)*c,this._z=(e-a)*c):c>f&&c>b?(c=2*Math.sqrt(1+
-c-f-b),this._w=(l-g)/c,this._x=.25*c,this._y=(a+e)/c,this._z=(d+h)/c):f>b?(c=2*Math.sqrt(1+f-c-b),this._w=(d-h)/c,this._x=(a+e)/c,this._y=.25*c,this._z=(g+l)/c):(c=2*Math.sqrt(1+b-c-f),this._w=(e-a)/c,this._x=(d+h)/c,this._y=(g+l)/c,this._z=.25*c);this._onChangeCallback();return this},setFromUnitVectors:function(a,b){var c=a.dot(b)+1;1E-6>c?(c=0,Math.abs(a.x)>Math.abs(a.z)?(this._x=-a.y,this._y=a.x,this._z=0):(this._x=0,this._y=-a.z,this._z=a.y)):(this._x=a.y*b.z-a.z*b.y,this._y=a.z*b.x-a.x*b.z,this._z=
-a.x*b.y-a.y*b.x);this._w=c;return this.normalize()},angleTo:function(a){return 2*Math.acos(Math.abs(L.clamp(this.dot(a),-1,1)))},rotateTowards:function(a,b){var c=this.angleTo(a);if(0===c)return this;this.slerp(a,Math.min(1,b/c));return this},inverse:function(){return this.conjugate()},conjugate:function(){this._x*=-1;this._y*=-1;this._z*=-1;this._onChangeCallback();return this},dot:function(a){return this._x*a._x+this._y*a._y+this._z*a._z+this._w*a._w},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);this._onChangeCallback();return this},multiply:function(a,b){return void 0!==b?(console.warn("THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead."),this.multiplyQuaternions(a,
-b)):this.multiplyQuaternions(this,a)},premultiply:function(a){return this.multiplyQuaternions(a,this)},multiplyQuaternions:function(a,b){var c=a._x,d=a._y,e=a._z;a=a._w;var f=b._x,g=b._y,h=b._z;b=b._w;this._x=c*b+a*f+d*h-e*g;this._y=d*b+a*g+e*f-c*h;this._z=e*b+a*h+c*g-d*f;this._w=a*b-c*f-d*g-e*h;this._onChangeCallback();return this},slerp:function(a,b){if(0===b)return this;if(1===b)return this.copy(a);var c=this._x,d=this._y,e=this._z,f=this._w,g=f*a._w+c*a._x+d*a._y+e*a._z;0>g?(this._w=-a._w,this._x=
--a._x,this._y=-a._y,this._z=-a._z,g=-g):this.copy(a);if(1<=g)return this._w=f,this._x=c,this._y=d,this._z=e,this;a=1-g*g;if(a<=Number.EPSILON)return g=1-b,this._w=g*f+b*this._w,this._x=g*c+b*this._x,this._y=g*d+b*this._y,this._z=g*e+b*this._z,this.normalize(),this._onChangeCallback(),this;a=Math.sqrt(a);var h=Math.atan2(a,g);g=Math.sin((1-b)*h)/a;b=Math.sin(b*h)/a;this._w=f*g+this._w*b;this._x=c*g+this._x*b;this._y=d*g+this._y*b;this._z=e*g+this._z*b;this._onChangeCallback();return this},equals:function(a){return a._x===
-this._x&&a._y===this._y&&a._z===this._z&&a._w===this._w},fromArray:function(a,b){void 0===b&&(b=0);this._x=a[b];this._y=a[b+1];this._z=a[b+2];this._w=a[b+3];this._onChangeCallback();return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this._x;a[b+1]=this._y;a[b+2]=this._z;a[b+3]=this._w;return a},fromBufferAttribute:function(a,b){this._x=a.getX(b);this._y=a.getY(b);this._z=a.getZ(b);this._w=a.getW(b);return this},_onChange:function(a){this._onChangeCallback=a;return this},
-_onChangeCallback:function(){}});var Tg=new n,ti=new za;Object.assign(n.prototype,{isVector3:!0,set:function(a,b,c){this.x=a;this.y=b;this.z=c;return this},setScalar:function(a){this.z=this.y=this.x=a;return this},setX:function(a){this.x=a;return this},setY:function(a){this.y=a;return this},setZ:function(a){this.z=a;return this},setComponent:function(a,b){switch(a){case 0:this.x=b;break;case 1:this.y=b;break;case 2:this.z=b;break;default:throw Error("index is out of range: "+a);}return this},getComponent:function(a){switch(a){case 0:return this.x;
-case 1:return this.y;case 2:return this.z;default:throw Error("index is out of range: "+a);}},clone:function(){return new this.constructor(this.x,this.y,this.z)},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("THREE.Vector3: .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},addScaledVector:function(a,b){this.x+=a.x*b;this.y+=a.y*b;this.z+=a.z*b;return this},sub:function(a,b){if(void 0!==b)return console.warn("THREE.Vector3: .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},subScalar:function(a){this.x-=a;this.y-=a;this.z-=a;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("THREE.Vector3: .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*b.x;this.y=a.y*b.y;this.z=a.z*b.z;return this},applyEuler:function(a){a&&a.isEuler||console.error("THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order.");
+this.w;return a},fromBufferAttribute:function(a,b,c){void 0!==c&&console.warn("THREE.Vector4: offset has been removed from .fromBufferAttribute().");this.x=a.getX(b);this.y=a.getY(b);this.z=a.getZ(b);this.w=a.getW(b);return this},random:function(){this.x=Math.random();this.y=Math.random();this.z=Math.random();this.w=Math.random();return this}});ya.prototype=Object.assign(Object.create(ta.prototype),{constructor:ya,isWebGLRenderTarget:!0,setSize:function(a,b){if(this.width!==a||this.height!==b)this.width=
+a,this.height=b,this.texture.image.width=a,this.texture.image.height=b,this.dispose();this.viewport.set(0,0,a,b);this.scissor.set(0,0,a,b)},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.width=a.width;this.height=a.height;this.viewport.copy(a.viewport);this.texture=a.texture.clone();this.depthBuffer=a.depthBuffer;this.stencilBuffer=a.stencilBuffer;this.depthTexture=a.depthTexture;return this},dispose:function(){this.dispatchEvent({type:"dispose"})}});Uf.prototype=
+Object.assign(Object.create(ya.prototype),{constructor:Uf,isWebGLMultisampleRenderTarget:!0,copy:function(a){ya.prototype.copy.call(this,a);this.samples=a.samples;return this}});Object.assign(za,{slerp:function(a,b,c,d){return c.copy(a).slerp(b,d)},slerpFlat:function(a,b,c,d,e,f,g){var h=c[d+0],l=c[d+1],m=c[d+2];c=c[d+3];d=e[f+0];var k=e[f+1],p=e[f+2];e=e[f+3];if(c!==e||h!==d||l!==k||m!==p){f=1-g;var n=h*d+l*k+m*p+c*e,r=0<=n?1:-1,q=1-n*n;q>Number.EPSILON&&(q=Math.sqrt(q),n=Math.atan2(q,n*r),f=Math.sin(f*
+n)/q,g=Math.sin(g*n)/q);r*=g;h=h*f+d*r;l=l*f+k*r;m=m*f+p*r;c=c*f+e*r;f===1-g&&(g=1/Math.sqrt(h*h+l*l+m*m+c*c),h*=g,l*=g,m*=g,c*=g)}a[b]=h;a[b+1]=l;a[b+2]=m;a[b+3]=c}});Object.defineProperties(za.prototype,{x:{get:function(){return this._x},set:function(a){this._x=a;this._onChangeCallback()}},y:{get:function(){return this._y},set:function(a){this._y=a;this._onChangeCallback()}},z:{get:function(){return this._z},set:function(a){this._z=a;this._onChangeCallback()}},w:{get:function(){return this._w},
+set:function(a){this._w=a;this._onChangeCallback()}}});Object.assign(za.prototype,{isQuaternion:!0,set:function(a,b,c,d){this._x=a;this._y=b;this._z=c;this._w=d;this._onChangeCallback();return this},clone:function(){return new this.constructor(this._x,this._y,this._z,this._w)},copy:function(a){this._x=a.x;this._y=a.y;this._z=a.z;this._w=a.w;this._onChangeCallback();return this},setFromEuler:function(a,b){if(!a||!a.isEuler)throw Error("THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order.");
+var c=a._x,d=a._y,e=a._z;a=a.order;var f=Math.cos,g=Math.sin,h=f(c/2),l=f(d/2);f=f(e/2);c=g(c/2);d=g(d/2);e=g(e/2);"XYZ"===a?(this._x=c*l*f+h*d*e,this._y=h*d*f-c*l*e,this._z=h*l*e+c*d*f,this._w=h*l*f-c*d*e):"YXZ"===a?(this._x=c*l*f+h*d*e,this._y=h*d*f-c*l*e,this._z=h*l*e-c*d*f,this._w=h*l*f+c*d*e):"ZXY"===a?(this._x=c*l*f-h*d*e,this._y=h*d*f+c*l*e,this._z=h*l*e+c*d*f,this._w=h*l*f-c*d*e):"ZYX"===a?(this._x=c*l*f-h*d*e,this._y=h*d*f+c*l*e,this._z=h*l*e-c*d*f,this._w=h*l*f+c*d*e):"YZX"===a?(this._x=
+c*l*f+h*d*e,this._y=h*d*f+c*l*e,this._z=h*l*e-c*d*f,this._w=h*l*f-c*d*e):"XZY"===a&&(this._x=c*l*f-h*d*e,this._y=h*d*f-c*l*e,this._z=h*l*e+c*d*f,this._w=h*l*f+c*d*e);!1!==b&&this._onChangeCallback();return this},setFromAxisAngle:function(a,b){b/=2;var c=Math.sin(b);this._x=a.x*c;this._y=a.y*c;this._z=a.z*c;this._w=Math.cos(b);this._onChangeCallback();return this},setFromRotationMatrix:function(a){var b=a.elements,c=b[0];a=b[4];var d=b[8],e=b[1],f=b[5],g=b[9],h=b[2],l=b[6];b=b[10];var m=c+f+b;0<m?
+(c=.5/Math.sqrt(m+1),this._w=.25/c,this._x=(l-g)*c,this._y=(d-h)*c,this._z=(e-a)*c):c>f&&c>b?(c=2*Math.sqrt(1+c-f-b),this._w=(l-g)/c,this._x=.25*c,this._y=(a+e)/c,this._z=(d+h)/c):f>b?(c=2*Math.sqrt(1+f-c-b),this._w=(d-h)/c,this._x=(a+e)/c,this._y=.25*c,this._z=(g+l)/c):(c=2*Math.sqrt(1+b-c-f),this._w=(e-a)/c,this._x=(d+h)/c,this._y=(g+l)/c,this._z=.25*c);this._onChangeCallback();return this},setFromUnitVectors:function(a,b){var c=a.dot(b)+1;1E-6>c?(c=0,Math.abs(a.x)>Math.abs(a.z)?(this._x=-a.y,this._y=
+a.x,this._z=0):(this._x=0,this._y=-a.z,this._z=a.y)):(this._x=a.y*b.z-a.z*b.y,this._y=a.z*b.x-a.x*b.z,this._z=a.x*b.y-a.y*b.x);this._w=c;return this.normalize()},angleTo:function(a){return 2*Math.acos(Math.abs(L.clamp(this.dot(a),-1,1)))},rotateTowards:function(a,b){var c=this.angleTo(a);if(0===c)return this;this.slerp(a,Math.min(1,b/c));return this},inverse:function(){return this.conjugate()},conjugate:function(){this._x*=-1;this._y*=-1;this._z*=-1;this._onChangeCallback();return this},dot:function(a){return this._x*
+a._x+this._y*a._y+this._z*a._z+this._w*a._w},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);this._onChangeCallback();return this},multiply:function(a,b){return void 0!==b?(console.warn("THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead."),
+this.multiplyQuaternions(a,b)):this.multiplyQuaternions(this,a)},premultiply:function(a){return this.multiplyQuaternions(a,this)},multiplyQuaternions:function(a,b){var c=a._x,d=a._y,e=a._z;a=a._w;var f=b._x,g=b._y,h=b._z;b=b._w;this._x=c*b+a*f+d*h-e*g;this._y=d*b+a*g+e*f-c*h;this._z=e*b+a*h+c*g-d*f;this._w=a*b-c*f-d*g-e*h;this._onChangeCallback();return this},slerp:function(a,b){if(0===b)return this;if(1===b)return this.copy(a);var c=this._x,d=this._y,e=this._z,f=this._w,g=f*a._w+c*a._x+d*a._y+e*
+a._z;0>g?(this._w=-a._w,this._x=-a._x,this._y=-a._y,this._z=-a._z,g=-g):this.copy(a);if(1<=g)return this._w=f,this._x=c,this._y=d,this._z=e,this;a=1-g*g;if(a<=Number.EPSILON)return g=1-b,this._w=g*f+b*this._w,this._x=g*c+b*this._x,this._y=g*d+b*this._y,this._z=g*e+b*this._z,this.normalize(),this._onChangeCallback(),this;a=Math.sqrt(a);var h=Math.atan2(a,g);g=Math.sin((1-b)*h)/a;b=Math.sin(b*h)/a;this._w=f*g+this._w*b;this._x=c*g+this._x*b;this._y=d*g+this._y*b;this._z=e*g+this._z*b;this._onChangeCallback();
+return this},equals:function(a){return a._x===this._x&&a._y===this._y&&a._z===this._z&&a._w===this._w},fromArray:function(a,b){void 0===b&&(b=0);this._x=a[b];this._y=a[b+1];this._z=a[b+2];this._w=a[b+3];this._onChangeCallback();return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this._x;a[b+1]=this._y;a[b+2]=this._z;a[b+3]=this._w;return a},fromBufferAttribute:function(a,b){this._x=a.getX(b);this._y=a.getY(b);this._z=a.getZ(b);this._w=a.getW(b);return this},_onChange:function(a){this._onChangeCallback=
+a;return this},_onChangeCallback:function(){}});var Tg=new n,ti=new za;Object.assign(n.prototype,{isVector3:!0,set:function(a,b,c){this.x=a;this.y=b;this.z=c;return this},setScalar:function(a){this.z=this.y=this.x=a;return this},setX:function(a){this.x=a;return this},setY:function(a){this.y=a;return this},setZ:function(a){this.z=a;return this},setComponent:function(a,b){switch(a){case 0:this.x=b;break;case 1:this.y=b;break;case 2:this.z=b;break;default:throw Error("index is out of range: "+a);}return this},
+getComponent:function(a){switch(a){case 0:return this.x;case 1:return this.y;case 2:return this.z;default:throw Error("index is out of range: "+a);}},clone:function(){return new this.constructor(this.x,this.y,this.z)},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("THREE.Vector3: .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},addScaledVector:function(a,b){this.x+=a.x*b;this.y+=a.y*b;this.z+=a.z*b;return this},sub:function(a,b){if(void 0!==b)return console.warn("THREE.Vector3: .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},subScalar:function(a){this.x-=a;this.y-=a;this.z-=a;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("THREE.Vector3: .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*b.x;this.y=a.y*b.y;this.z=a.z*b.z;return this},applyEuler:function(a){a&&a.isEuler||console.error("THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order.");
 return this.applyQuaternion(ti.setFromEuler(a))},applyAxisAngle:function(a,b){return this.applyQuaternion(ti.setFromAxisAngle(a,b))},applyMatrix3:function(a){var b=this.x,c=this.y,d=this.z;a=a.elements;this.x=a[0]*b+a[3]*c+a[6]*d;this.y=a[1]*b+a[4]*c+a[7]*d;this.z=a[2]*b+a[5]*c+a[8]*d;return this},applyNormalMatrix:function(a){return this.applyMatrix3(a).normalize()},applyMatrix4:function(a){var b=this.x,c=this.y,d=this.z;a=a.elements;var e=1/(a[3]*b+a[7]*c+a[11]*d+a[15]);this.x=(a[0]*b+a[4]*c+a[8]*
 return this.applyQuaternion(ti.setFromEuler(a))},applyAxisAngle:function(a,b){return this.applyQuaternion(ti.setFromAxisAngle(a,b))},applyMatrix3:function(a){var b=this.x,c=this.y,d=this.z;a=a.elements;this.x=a[0]*b+a[3]*c+a[6]*d;this.y=a[1]*b+a[4]*c+a[7]*d;this.z=a[2]*b+a[5]*c+a[8]*d;return this},applyNormalMatrix:function(a){return this.applyMatrix3(a).normalize()},applyMatrix4:function(a){var b=this.x,c=this.y,d=this.z;a=a.elements;var e=1/(a[3]*b+a[7]*c+a[11]*d+a[15]);this.x=(a[0]*b+a[4]*c+a[8]*
 d+a[12])*e;this.y=(a[1]*b+a[5]*c+a[9]*d+a[13])*e;this.z=(a[2]*b+a[6]*c+a[10]*d+a[14])*e;return this},applyQuaternion:function(a){var b=this.x,c=this.y,d=this.z,e=a.x,f=a.y,g=a.z;a=a.w;var h=a*b+f*d-g*c,l=a*c+g*b-e*d,m=a*d+e*c-f*b;b=-e*b-f*c-g*d;this.x=h*a+b*-e+l*-g-m*-f;this.y=l*a+b*-f+m*-e-h*-g;this.z=m*a+b*-g+h*-f-l*-e;return this},project:function(a){return this.applyMatrix4(a.matrixWorldInverse).applyMatrix4(a.projectionMatrix)},unproject:function(a){return this.applyMatrix4(a.projectionMatrixInverse).applyMatrix4(a.matrixWorld)},
 d+a[12])*e;this.y=(a[1]*b+a[5]*c+a[9]*d+a[13])*e;this.z=(a[2]*b+a[6]*c+a[10]*d+a[14])*e;return this},applyQuaternion:function(a){var b=this.x,c=this.y,d=this.z,e=a.x,f=a.y,g=a.z;a=a.w;var h=a*b+f*d-g*c,l=a*c+g*b-e*d,m=a*d+e*c-f*b;b=-e*b-f*c-g*d;this.x=h*a+b*-e+l*-g-m*-f;this.y=l*a+b*-f+m*-e-h*-g;this.z=m*a+b*-g+h*-f-l*-e;return this},project:function(a){return this.applyMatrix4(a.matrixWorldInverse).applyMatrix4(a.projectionMatrix)},unproject:function(a){return this.applyMatrix4(a.projectionMatrixInverse).applyMatrix4(a.matrixWorld)},
 transformDirection:function(a){var b=this.x,c=this.y,d=this.z;a=a.elements;this.x=a[0]*b+a[4]*c+a[8]*d;this.y=a[1]*b+a[5]*c+a[9]*d;this.z=a[2]*b+a[6]*c+a[10]*d;return this.normalize()},divide:function(a){this.x/=a.x;this.y/=a.y;this.z/=a.z;return this},divideScalar:function(a){return this.multiplyScalar(1/a)},min:function(a){this.x=Math.min(this.x,a.x);this.y=Math.min(this.y,a.y);this.z=Math.min(this.z,a.z);return this},max:function(a){this.x=Math.max(this.x,a.x);this.y=Math.max(this.y,a.y);this.z=
 transformDirection:function(a){var b=this.x,c=this.y,d=this.z;a=a.elements;this.x=a[0]*b+a[4]*c+a[8]*d;this.y=a[1]*b+a[5]*c+a[9]*d;this.z=a[2]*b+a[6]*c+a[10]*d;return this.normalize()},divide:function(a){this.x/=a.x;this.y/=a.y;this.z/=a.z;return this},divideScalar:function(a){return this.multiplyScalar(1/a)},min:function(a){this.x=Math.min(this.x,a.x);this.y=Math.min(this.y,a.y);this.z=Math.min(this.z,a.z);return this},max:function(a){this.x=Math.max(this.x,a.x);this.y=Math.max(this.y,a.y);this.z=
@@ -406,12 +406,12 @@ b;this.y+=(a.y-this.y)*b;this.z+=(a.z-this.z)*b;return this},lerpVectors:functio
 a.lengthSq();if(0===b)return this.set(0,0,0);b=a.dot(this)/b;return this.copy(a).multiplyScalar(b)},projectOnPlane:function(a){Tg.copy(this).projectOnVector(a);return this.sub(Tg)},reflect:function(a){return this.sub(Tg.copy(a).multiplyScalar(2*this.dot(a)))},angleTo:function(a){var b=Math.sqrt(this.lengthSq()*a.lengthSq());if(0===b)return Math.PI/2;a=this.dot(a)/b;return Math.acos(L.clamp(a,-1,1))},distanceTo:function(a){return Math.sqrt(this.distanceToSquared(a))},distanceToSquared:function(a){var b=
 a.lengthSq();if(0===b)return this.set(0,0,0);b=a.dot(this)/b;return this.copy(a).multiplyScalar(b)},projectOnPlane:function(a){Tg.copy(this).projectOnVector(a);return this.sub(Tg)},reflect:function(a){return this.sub(Tg.copy(a).multiplyScalar(2*this.dot(a)))},angleTo:function(a){var b=Math.sqrt(this.lengthSq()*a.lengthSq());if(0===b)return Math.PI/2;a=this.dot(a)/b;return Math.acos(L.clamp(a,-1,1))},distanceTo:function(a){return Math.sqrt(this.distanceToSquared(a))},distanceToSquared:function(a){var b=
 this.x-a.x,c=this.y-a.y;a=this.z-a.z;return b*b+c*c+a*a},manhattanDistanceTo:function(a){return Math.abs(this.x-a.x)+Math.abs(this.y-a.y)+Math.abs(this.z-a.z)},setFromSpherical:function(a){return this.setFromSphericalCoords(a.radius,a.phi,a.theta)},setFromSphericalCoords:function(a,b,c){var d=Math.sin(b)*a;this.x=d*Math.sin(c);this.y=Math.cos(b)*a;this.z=d*Math.cos(c);return this},setFromCylindrical:function(a){return this.setFromCylindricalCoords(a.radius,a.theta,a.y)},setFromCylindricalCoords:function(a,
 this.x-a.x,c=this.y-a.y;a=this.z-a.z;return b*b+c*c+a*a},manhattanDistanceTo:function(a){return Math.abs(this.x-a.x)+Math.abs(this.y-a.y)+Math.abs(this.z-a.z)},setFromSpherical:function(a){return this.setFromSphericalCoords(a.radius,a.phi,a.theta)},setFromSphericalCoords:function(a,b,c){var d=Math.sin(b)*a;this.x=d*Math.sin(c);this.y=Math.cos(b)*a;this.z=d*Math.cos(c);return this},setFromCylindrical:function(a){return this.setFromCylindricalCoords(a.radius,a.theta,a.y)},setFromCylindricalCoords:function(a,
 b,c){this.x=a*Math.sin(b);this.y=c;this.z=a*Math.cos(b);return this},setFromMatrixPosition:function(a){a=a.elements;this.x=a[12];this.y=a[13];this.z=a[14];return this},setFromMatrixScale:function(a){var b=this.setFromMatrixColumn(a,0).length(),c=this.setFromMatrixColumn(a,1).length();a=this.setFromMatrixColumn(a,2).length();this.x=b;this.y=c;this.z=a;return this},setFromMatrixColumn:function(a,b){return this.fromArray(a.elements,4*b)},setFromMatrix3Column:function(a,b){return this.fromArray(a.elements,
 b,c){this.x=a*Math.sin(b);this.y=c;this.z=a*Math.cos(b);return this},setFromMatrixPosition:function(a){a=a.elements;this.x=a[12];this.y=a[13];this.z=a[14];return this},setFromMatrixScale:function(a){var b=this.setFromMatrixColumn(a,0).length(),c=this.setFromMatrixColumn(a,1).length();a=this.setFromMatrixColumn(a,2).length();this.x=b;this.y=c;this.z=a;return this},setFromMatrixColumn:function(a,b){return this.fromArray(a.elements,4*b)},setFromMatrix3Column:function(a,b){return this.fromArray(a.elements,
-3*b)},equals:function(a){return a.x===this.x&&a.y===this.y&&a.z===this.z},fromArray:function(a,b){void 0===b&&(b=0);this.x=a[b];this.y=a[b+1];this.z=a[b+2];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this.x;a[b+1]=this.y;a[b+2]=this.z;return a},fromBufferAttribute:function(a,b,c){void 0!==c&&console.warn("THREE.Vector3: offset has been removed from .fromBufferAttribute().");this.x=a.getX(b);this.y=a.getY(b);this.z=a.getZ(b);return this}});var ld=new n,ea=new P,Gk=
-new n(0,0,0),Hk=new n(1,1,1),Lb=new n,xf=new n,Ca=new n;Object.assign(P.prototype,{isMatrix4:!0,set:function(a,b,c,d,e,f,g,h,l,m,k,p,n,r,q,v){var u=this.elements;u[0]=a;u[4]=b;u[8]=c;u[12]=d;u[1]=e;u[5]=f;u[9]=g;u[13]=h;u[2]=l;u[6]=m;u[10]=k;u[14]=p;u[3]=n;u[7]=r;u[11]=q;u[15]=v;return this},identity:function(){this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1);return this},clone:function(){return(new P).fromArray(this.elements)},copy:function(a){var b=this.elements;a=a.elements;b[0]=a[0];b[1]=a[1];b[2]=a[2];
-b[3]=a[3];b[4]=a[4];b[5]=a[5];b[6]=a[6];b[7]=a[7];b[8]=a[8];b[9]=a[9];b[10]=a[10];b[11]=a[11];b[12]=a[12];b[13]=a[13];b[14]=a[14];b[15]=a[15];return this},copyPosition:function(a){var b=this.elements;a=a.elements;b[12]=a[12];b[13]=a[13];b[14]=a[14];return this},extractBasis:function(a,b,c){a.setFromMatrixColumn(this,0);b.setFromMatrixColumn(this,1);c.setFromMatrixColumn(this,2);return this},makeBasis:function(a,b,c){this.set(a.x,b.x,c.x,0,a.y,b.y,c.y,0,a.z,b.z,c.z,0,0,0,0,1);return this},extractRotation:function(a){var b=
-this.elements,c=a.elements,d=1/ld.setFromMatrixColumn(a,0).length(),e=1/ld.setFromMatrixColumn(a,1).length();a=1/ld.setFromMatrixColumn(a,2).length();b[0]=c[0]*d;b[1]=c[1]*d;b[2]=c[2]*d;b[3]=0;b[4]=c[4]*e;b[5]=c[5]*e;b[6]=c[6]*e;b[7]=0;b[8]=c[8]*a;b[9]=c[9]*a;b[10]=c[10]*a;b[11]=0;b[12]=0;b[13]=0;b[14]=0;b[15]=1;return this},makeRotationFromEuler:function(a){a&&a.isEuler||console.error("THREE.Matrix4: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.");var b=this.elements,
-c=a.x,d=a.y,e=a.z,f=Math.cos(c);c=Math.sin(c);var g=Math.cos(d);d=Math.sin(d);var h=Math.cos(e);e=Math.sin(e);if("XYZ"===a.order){a=f*h;var l=f*e,m=c*h,k=c*e;b[0]=g*h;b[4]=-g*e;b[8]=d;b[1]=l+m*d;b[5]=a-k*d;b[9]=-c*g;b[2]=k-a*d;b[6]=m+l*d;b[10]=f*g}else"YXZ"===a.order?(a=g*h,l=g*e,m=d*h,k=d*e,b[0]=a+k*c,b[4]=m*c-l,b[8]=f*d,b[1]=f*e,b[5]=f*h,b[9]=-c,b[2]=l*c-m,b[6]=k+a*c,b[10]=f*g):"ZXY"===a.order?(a=g*h,l=g*e,m=d*h,k=d*e,b[0]=a-k*c,b[4]=-f*e,b[8]=m+l*c,b[1]=l+m*c,b[5]=f*h,b[9]=k-a*c,b[2]=-f*d,b[6]=
-c,b[10]=f*g):"ZYX"===a.order?(a=f*h,l=f*e,m=c*h,k=c*e,b[0]=g*h,b[4]=m*d-l,b[8]=a*d+k,b[1]=g*e,b[5]=k*d+a,b[9]=l*d-m,b[2]=-d,b[6]=c*g,b[10]=f*g):"YZX"===a.order?(a=f*g,l=f*d,m=c*g,k=c*d,b[0]=g*h,b[4]=k-a*e,b[8]=m*e+l,b[1]=e,b[5]=f*h,b[9]=-c*h,b[2]=-d*h,b[6]=l*e+m,b[10]=a-k*e):"XZY"===a.order&&(a=f*g,l=f*d,m=c*g,k=c*d,b[0]=g*h,b[4]=-e,b[8]=d*h,b[1]=a*e+k,b[5]=f*h,b[9]=l*e-m,b[2]=m*e-l,b[6]=c*h,b[10]=k*e+a);b[3]=0;b[7]=0;b[11]=0;b[12]=0;b[13]=0;b[14]=0;b[15]=1;return this},makeRotationFromQuaternion:function(a){return this.compose(Gk,
+3*b)},equals:function(a){return a.x===this.x&&a.y===this.y&&a.z===this.z},fromArray:function(a,b){void 0===b&&(b=0);this.x=a[b];this.y=a[b+1];this.z=a[b+2];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this.x;a[b+1]=this.y;a[b+2]=this.z;return a},fromBufferAttribute:function(a,b,c){void 0!==c&&console.warn("THREE.Vector3: offset has been removed from .fromBufferAttribute().");this.x=a.getX(b);this.y=a.getY(b);this.z=a.getZ(b);return this},random:function(){this.x=Math.random();
+this.y=Math.random();this.z=Math.random();return this}});var ld=new n,ea=new P,Gk=new n(0,0,0),Hk=new n(1,1,1),Lb=new n,xf=new n,Ca=new n;Object.assign(P.prototype,{isMatrix4:!0,set:function(a,b,c,d,e,f,g,h,l,m,k,p,n,r,q,v){var u=this.elements;u[0]=a;u[4]=b;u[8]=c;u[12]=d;u[1]=e;u[5]=f;u[9]=g;u[13]=h;u[2]=l;u[6]=m;u[10]=k;u[14]=p;u[3]=n;u[7]=r;u[11]=q;u[15]=v;return this},identity:function(){this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1);return this},clone:function(){return(new P).fromArray(this.elements)},
+copy:function(a){var b=this.elements;a=a.elements;b[0]=a[0];b[1]=a[1];b[2]=a[2];b[3]=a[3];b[4]=a[4];b[5]=a[5];b[6]=a[6];b[7]=a[7];b[8]=a[8];b[9]=a[9];b[10]=a[10];b[11]=a[11];b[12]=a[12];b[13]=a[13];b[14]=a[14];b[15]=a[15];return this},copyPosition:function(a){var b=this.elements;a=a.elements;b[12]=a[12];b[13]=a[13];b[14]=a[14];return this},extractBasis:function(a,b,c){a.setFromMatrixColumn(this,0);b.setFromMatrixColumn(this,1);c.setFromMatrixColumn(this,2);return this},makeBasis:function(a,b,c){this.set(a.x,
+b.x,c.x,0,a.y,b.y,c.y,0,a.z,b.z,c.z,0,0,0,0,1);return this},extractRotation:function(a){var b=this.elements,c=a.elements,d=1/ld.setFromMatrixColumn(a,0).length(),e=1/ld.setFromMatrixColumn(a,1).length();a=1/ld.setFromMatrixColumn(a,2).length();b[0]=c[0]*d;b[1]=c[1]*d;b[2]=c[2]*d;b[3]=0;b[4]=c[4]*e;b[5]=c[5]*e;b[6]=c[6]*e;b[7]=0;b[8]=c[8]*a;b[9]=c[9]*a;b[10]=c[10]*a;b[11]=0;b[12]=0;b[13]=0;b[14]=0;b[15]=1;return this},makeRotationFromEuler:function(a){a&&a.isEuler||console.error("THREE.Matrix4: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.");
+var b=this.elements,c=a.x,d=a.y,e=a.z,f=Math.cos(c);c=Math.sin(c);var g=Math.cos(d);d=Math.sin(d);var h=Math.cos(e);e=Math.sin(e);if("XYZ"===a.order){a=f*h;var l=f*e,m=c*h,k=c*e;b[0]=g*h;b[4]=-g*e;b[8]=d;b[1]=l+m*d;b[5]=a-k*d;b[9]=-c*g;b[2]=k-a*d;b[6]=m+l*d;b[10]=f*g}else"YXZ"===a.order?(a=g*h,l=g*e,m=d*h,k=d*e,b[0]=a+k*c,b[4]=m*c-l,b[8]=f*d,b[1]=f*e,b[5]=f*h,b[9]=-c,b[2]=l*c-m,b[6]=k+a*c,b[10]=f*g):"ZXY"===a.order?(a=g*h,l=g*e,m=d*h,k=d*e,b[0]=a-k*c,b[4]=-f*e,b[8]=m+l*c,b[1]=l+m*c,b[5]=f*h,b[9]=
+k-a*c,b[2]=-f*d,b[6]=c,b[10]=f*g):"ZYX"===a.order?(a=f*h,l=f*e,m=c*h,k=c*e,b[0]=g*h,b[4]=m*d-l,b[8]=a*d+k,b[1]=g*e,b[5]=k*d+a,b[9]=l*d-m,b[2]=-d,b[6]=c*g,b[10]=f*g):"YZX"===a.order?(a=f*g,l=f*d,m=c*g,k=c*d,b[0]=g*h,b[4]=k-a*e,b[8]=m*e+l,b[1]=e,b[5]=f*h,b[9]=-c*h,b[2]=-d*h,b[6]=l*e+m,b[10]=a-k*e):"XZY"===a.order&&(a=f*g,l=f*d,m=c*g,k=c*d,b[0]=g*h,b[4]=-e,b[8]=d*h,b[1]=a*e+k,b[5]=f*h,b[9]=l*e-m,b[2]=m*e-l,b[6]=c*h,b[10]=k*e+a);b[3]=0;b[7]=0;b[11]=0;b[12]=0;b[13]=0;b[14]=0;b[15]=1;return this},makeRotationFromQuaternion:function(a){return this.compose(Gk,
 a,Hk)},lookAt:function(a,b,c){var d=this.elements;Ca.subVectors(a,b);0===Ca.lengthSq()&&(Ca.z=1);Ca.normalize();Lb.crossVectors(c,Ca);0===Lb.lengthSq()&&(1===Math.abs(c.z)?Ca.x+=1E-4:Ca.z+=1E-4,Ca.normalize(),Lb.crossVectors(c,Ca));Lb.normalize();xf.crossVectors(Ca,Lb);d[0]=Lb.x;d[4]=xf.x;d[8]=Ca.x;d[1]=Lb.y;d[5]=xf.y;d[9]=Ca.y;d[2]=Lb.z;d[6]=xf.z;d[10]=Ca.z;return this},multiply:function(a,b){return void 0!==b?(console.warn("THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead."),
 a,Hk)},lookAt:function(a,b,c){var d=this.elements;Ca.subVectors(a,b);0===Ca.lengthSq()&&(Ca.z=1);Ca.normalize();Lb.crossVectors(c,Ca);0===Lb.lengthSq()&&(1===Math.abs(c.z)?Ca.x+=1E-4:Ca.z+=1E-4,Ca.normalize(),Lb.crossVectors(c,Ca));Lb.normalize();xf.crossVectors(Ca,Lb);d[0]=Lb.x;d[4]=xf.x;d[8]=Ca.x;d[1]=Lb.y;d[5]=xf.y;d[9]=Ca.y;d[2]=Lb.z;d[6]=xf.z;d[10]=Ca.z;return this},multiply:function(a,b){return void 0!==b?(console.warn("THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead."),
 this.multiplyMatrices(a,b)):this.multiplyMatrices(this,a)},premultiply:function(a){return this.multiplyMatrices(a,this)},multiplyMatrices:function(a,b){var c=a.elements,d=b.elements;b=this.elements;a=c[0];var e=c[4],f=c[8],g=c[12],h=c[1],l=c[5],m=c[9],k=c[13],p=c[2],n=c[6],r=c[10],q=c[14],v=c[3],t=c[7],w=c[11];c=c[15];var z=d[0],A=d[4],C=d[8],y=d[12],B=d[1],D=d[5],F=d[9],G=d[13],K=d[2],H=d[6],L=d[10],M=d[14],N=d[3],O=d[7],P=d[11];d=d[15];b[0]=a*z+e*B+f*K+g*N;b[4]=a*A+e*D+f*H+g*O;b[8]=a*C+e*F+f*L+
 this.multiplyMatrices(a,b)):this.multiplyMatrices(this,a)},premultiply:function(a){return this.multiplyMatrices(a,this)},multiplyMatrices:function(a,b){var c=a.elements,d=b.elements;b=this.elements;a=c[0];var e=c[4],f=c[8],g=c[12],h=c[1],l=c[5],m=c[9],k=c[13],p=c[2],n=c[6],r=c[10],q=c[14],v=c[3],t=c[7],w=c[11];c=c[15];var z=d[0],A=d[4],C=d[8],y=d[12],B=d[1],D=d[5],F=d[9],G=d[13],K=d[2],H=d[6],L=d[10],M=d[14],N=d[3],O=d[7],P=d[11];d=d[15];b[0]=a*z+e*B+f*K+g*N;b[4]=a*A+e*D+f*H+g*O;b[8]=a*C+e*F+f*L+
 g*P;b[12]=a*y+e*G+f*M+g*d;b[1]=h*z+l*B+m*K+k*N;b[5]=h*A+l*D+m*H+k*O;b[9]=h*C+l*F+m*L+k*P;b[13]=h*y+l*G+m*M+k*d;b[2]=p*z+n*B+r*K+q*N;b[6]=p*A+n*D+r*H+q*O;b[10]=p*C+n*F+r*L+q*P;b[14]=p*y+n*G+r*M+q*d;b[3]=v*z+t*B+w*K+c*N;b[7]=v*A+t*D+w*H+c*O;b[11]=v*C+t*F+w*L+c*P;b[15]=v*y+t*G+w*M+c*d;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},determinant:function(){var a=
 g*P;b[12]=a*y+e*G+f*M+g*d;b[1]=h*z+l*B+m*K+k*N;b[5]=h*A+l*D+m*H+k*O;b[9]=h*C+l*F+m*L+k*P;b[13]=h*y+l*G+m*M+k*d;b[2]=p*z+n*B+r*K+q*N;b[6]=p*A+n*D+r*H+q*O;b[10]=p*C+n*F+r*L+q*P;b[14]=p*y+n*G+r*M+q*d;b[3]=v*z+t*B+w*K+c*N;b[7]=v*A+t*D+w*H+c*O;b[11]=v*C+t*F+w*L+c*P;b[15]=v*y+t*G+w*M+c*d;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},determinant:function(){var a=

+ 30 - 0
build/three.module.js

@@ -1063,6 +1063,15 @@ Object.assign( Vector2.prototype, {
 
 
 		return this;
 		return this;
 
 
+	},
+
+	random: function () {
+
+		this.x = Math.random();
+		this.y = Math.random();
+
+		return this;
+
 	}
 	}
 
 
 } );
 } );
@@ -2443,6 +2452,17 @@ Object.assign( Vector4.prototype, {
 
 
 		return this;
 		return this;
 
 
+	},
+
+	random: function () {
+
+		this.x = Math.random();
+		this.y = Math.random();
+		this.z = Math.random();
+		this.w = Math.random();
+
+		return this;
+
 	}
 	}
 
 
 } );
 } );
@@ -3926,6 +3946,16 @@ Object.assign( Vector3.prototype, {
 
 
 		return this;
 		return this;
 
 
+	},
+
+	random: function () {
+
+		this.x = Math.random();
+		this.y = Math.random();
+		this.z = Math.random();
+
+		return this;
+
 	}
 	}
 
 
 } );
 } );

+ 1 - 1
editor/js/libs/codemirror/codemirror.js

@@ -8161,7 +8161,7 @@
     }
     }
   };
   };
 
 
-  var noHandlers = []
+  var noHandlers = [];
   function getHandlers(emitter, type, copy) {
   function getHandlers(emitter, type, copy) {
     var arr = emitter._handlers && emitter._handlers[type]
     var arr = emitter._handlers && emitter._handlers[type]
     if (copy) return arr && arr.length > 0 ? arr.slice() : noHandlers
     if (copy) return arr && arr.length > 0 ? arr.slice() : noHandlers

+ 1 - 1
editor/js/libs/ternjs/tern.js

@@ -955,7 +955,7 @@
       var p = expr.node.property;
       var p = expr.node.property;
       expr.node = expr.node.object;
       expr.node = expr.node.object;
       return findRefsToProperty(srv, query, expr, p);
       return findRefsToProperty(srv, query, expr, p);
-    } else if (expr && expr.node.type == "ObjectExpression") {
+    } else if (expr.node.type == "ObjectExpression") {
       var pos = resolvePos(file, query.end);
       var pos = resolvePos(file, query.end);
       for (var i = 0; i < expr.node.properties.length; ++i) {
       for (var i = 0; i < expr.node.properties.length; ++i) {
         var k = expr.node.properties[i].key;
         var k = expr.node.properties[i].key;

+ 5 - 5
examples/js/animation/CCDIKSolver.js

@@ -392,7 +392,7 @@ THREE.CCDIKSolver = ( function () {
 
 
 		_init: function () {
 		_init: function () {
 
 
-			var self = this;
+			var scope = this;
 			var iks = this.iks;
 			var iks = this.iks;
 
 
 			function createLineGeometry( ik ) {
 			function createLineGeometry( ik ) {
@@ -407,25 +407,25 @@ THREE.CCDIKSolver = ( function () {
 
 
 			function createTargetMesh() {
 			function createTargetMesh() {
 
 
-				return new THREE.Mesh( self.sphereGeometry, self.targetSphereMaterial );
+				return new THREE.Mesh( scope.sphereGeometry, scope.targetSphereMaterial );
 
 
 			}
 			}
 
 
 			function createEffectorMesh() {
 			function createEffectorMesh() {
 
 
-				return new THREE.Mesh( self.sphereGeometry, self.effectorSphereMaterial );
+				return new THREE.Mesh( scope.sphereGeometry, scope.effectorSphereMaterial );
 
 
 			}
 			}
 
 
 			function createLinkMesh() {
 			function createLinkMesh() {
 
 
-				return new THREE.Mesh( self.sphereGeometry, self.linkSphereMaterial );
+				return new THREE.Mesh( scope.sphereGeometry, scope.linkSphereMaterial );
 
 
 			}
 			}
 
 
 			function createLine( ik ) {
 			function createLine( ik ) {
 
 
-				return new THREE.Line( createLineGeometry( ik ), self.lineMaterial );
+				return new THREE.Line( createLineGeometry( ik ), scope.lineMaterial );
 
 
 			}
 			}
 
 

+ 34 - 34
examples/js/loaders/FBXLoader.js

@@ -37,19 +37,19 @@ THREE.FBXLoader = ( function () {
 
 
 		load: function ( url, onLoad, onProgress, onError ) {
 		load: function ( url, onLoad, onProgress, onError ) {
 
 
-			var self = this;
+			var scope = this;
 
 
-			var path = ( self.path === '' ) ? THREE.LoaderUtils.extractUrlBase( url ) : self.path;
+			var path = ( scope.path === '' ) ? THREE.LoaderUtils.extractUrlBase( url ) : scope.path;
 
 
 			var loader = new THREE.FileLoader( this.manager );
 			var loader = new THREE.FileLoader( this.manager );
-			loader.setPath( self.path );
+			loader.setPath( scope.path );
 			loader.setResponseType( 'arraybuffer' );
 			loader.setResponseType( 'arraybuffer' );
 
 
 			loader.load( url, function ( buffer ) {
 			loader.load( url, function ( buffer ) {
 
 
 				try {
 				try {
 
 
-					onLoad( self.parse( buffer, path ) );
+					onLoad( scope.parse( buffer, path ) );
 
 
 				} catch ( error ) {
 				} catch ( error ) {
 
 
@@ -57,7 +57,7 @@ THREE.FBXLoader = ( function () {
 
 
 						if ( onError ) onError( error );
 						if ( onError ) onError( error );
 
 
-						self.manager.itemError( url );
+						scope.manager.itemError( url );
 
 
 					}, 0 );
 					}, 0 );
 
 
@@ -557,7 +557,7 @@ THREE.FBXLoader = ( function () {
 
 
 			}
 			}
 
 
-			var self = this;
+			var scope = this;
 			connections.get( ID ).children.forEach( function ( child ) {
 			connections.get( ID ).children.forEach( function ( child ) {
 
 
 				var type = child.relationship;
 				var type = child.relationship;
@@ -565,46 +565,46 @@ THREE.FBXLoader = ( function () {
 				switch ( type ) {
 				switch ( type ) {
 
 
 					case 'Bump':
 					case 'Bump':
-						parameters.bumpMap = self.getTexture( textureMap, child.ID );
+						parameters.bumpMap = scope.getTexture( textureMap, child.ID );
 						break;
 						break;
 
 
 					case 'Maya|TEX_ao_map':
 					case 'Maya|TEX_ao_map':
-						parameters.aoMap = self.getTexture( textureMap, child.ID );
+						parameters.aoMap = scope.getTexture( textureMap, child.ID );
 						break;
 						break;
 
 
 					case 'DiffuseColor':
 					case 'DiffuseColor':
 					case 'Maya|TEX_color_map':
 					case 'Maya|TEX_color_map':
-						parameters.map = self.getTexture( textureMap, child.ID );
+						parameters.map = scope.getTexture( textureMap, child.ID );
 						parameters.map.encoding = THREE.sRGBEncoding;
 						parameters.map.encoding = THREE.sRGBEncoding;
 						break;
 						break;
 
 
 					case 'DisplacementColor':
 					case 'DisplacementColor':
-						parameters.displacementMap = self.getTexture( textureMap, child.ID );
+						parameters.displacementMap = scope.getTexture( textureMap, child.ID );
 						break;
 						break;
 
 
 					case 'EmissiveColor':
 					case 'EmissiveColor':
-						parameters.emissiveMap = self.getTexture( textureMap, child.ID );
+						parameters.emissiveMap = scope.getTexture( textureMap, child.ID );
 						parameters.emissiveMap.encoding = THREE.sRGBEncoding;
 						parameters.emissiveMap.encoding = THREE.sRGBEncoding;
 						break;
 						break;
 
 
 					case 'NormalMap':
 					case 'NormalMap':
 					case 'Maya|TEX_normal_map':
 					case 'Maya|TEX_normal_map':
-						parameters.normalMap = self.getTexture( textureMap, child.ID );
+						parameters.normalMap = scope.getTexture( textureMap, child.ID );
 						break;
 						break;
 
 
 					case 'ReflectionColor':
 					case 'ReflectionColor':
-						parameters.envMap = self.getTexture( textureMap, child.ID );
+						parameters.envMap = scope.getTexture( textureMap, child.ID );
 						parameters.envMap.mapping = THREE.EquirectangularReflectionMapping;
 						parameters.envMap.mapping = THREE.EquirectangularReflectionMapping;
 						parameters.envMap.encoding = THREE.sRGBEncoding;
 						parameters.envMap.encoding = THREE.sRGBEncoding;
 						break;
 						break;
 
 
 					case 'SpecularColor':
 					case 'SpecularColor':
-						parameters.specularMap = self.getTexture( textureMap, child.ID );
+						parameters.specularMap = scope.getTexture( textureMap, child.ID );
 						parameters.specularMap.encoding = THREE.sRGBEncoding;
 						parameters.specularMap.encoding = THREE.sRGBEncoding;
 						break;
 						break;
 
 
 					case 'TransparentColor':
 					case 'TransparentColor':
-						parameters.alphaMap = self.getTexture( textureMap, child.ID );
+						parameters.alphaMap = scope.getTexture( textureMap, child.ID );
 						parameters.transparent = true;
 						parameters.transparent = true;
 						break;
 						break;
 
 
@@ -784,11 +784,11 @@ THREE.FBXLoader = ( function () {
 
 
 			var modelNodes = fbxTree.Objects.Model;
 			var modelNodes = fbxTree.Objects.Model;
 
 
-			var self = this;
+			var scope = this;
 			modelMap.forEach( function ( model ) {
 			modelMap.forEach( function ( model ) {
 
 
 				var modelNode = modelNodes[ model.ID ];
 				var modelNode = modelNodes[ model.ID ];
-				self.setLookAtProperties( model, modelNode );
+				scope.setLookAtProperties( model, modelNode );
 
 
 				var parentConnections = connections.get( model.ID ).parents;
 				var parentConnections = connections.get( model.ID ).parents;
 
 
@@ -1409,7 +1409,7 @@ THREE.FBXLoader = ( function () {
 
 
 		setupMorphMaterials: function () {
 		setupMorphMaterials: function () {
 
 
-			var self = this;
+			var scope = this;
 			sceneGraph.traverse( function ( child ) {
 			sceneGraph.traverse( function ( child ) {
 
 
 				if ( child.isMesh ) {
 				if ( child.isMesh ) {
@@ -1420,13 +1420,13 @@ THREE.FBXLoader = ( function () {
 
 
 							child.material.forEach( function ( material, i ) {
 							child.material.forEach( function ( material, i ) {
 
 
-								self.setupMorphMaterial( child, material, i );
+								scope.setupMorphMaterial( child, material, i );
 
 
 							} );
 							} );
 
 
 						} else {
 						} else {
 
 
-							self.setupMorphMaterial( child, child.material );
+							scope.setupMorphMaterial( child, child.material );
 
 
 						}
 						}
 
 
@@ -1780,7 +1780,7 @@ THREE.FBXLoader = ( function () {
 			var faceWeights = [];
 			var faceWeights = [];
 			var faceWeightIndices = [];
 			var faceWeightIndices = [];
 
 
-			var self = this;
+			var scope = this;
 			geoInfo.vertexIndices.forEach( function ( vertexIndex, polygonVertexIndex ) {
 			geoInfo.vertexIndices.forEach( function ( vertexIndex, polygonVertexIndex ) {
 
 
 				var endOfFace = false;
 				var endOfFace = false;
@@ -1919,7 +1919,7 @@ THREE.FBXLoader = ( function () {
 
 
 				if ( endOfFace ) {
 				if ( endOfFace ) {
 
 
-					self.genFace( buffers, geoInfo, facePositionIndexes, materialIndex, faceNormals, faceColors, faceUVs, faceWeights, faceWeightIndices, faceLength );
+					scope.genFace( buffers, geoInfo, facePositionIndexes, materialIndex, faceNormals, faceColors, faceUVs, faceWeights, faceWeightIndices, faceLength );
 
 
 					polygonIndex ++;
 					polygonIndex ++;
 					faceLength = 0;
 					faceLength = 0;
@@ -2063,7 +2063,7 @@ THREE.FBXLoader = ( function () {
 			parentGeo.morphAttributes.position = [];
 			parentGeo.morphAttributes.position = [];
 			// parentGeo.morphAttributes.normal = []; // not implemented
 			// parentGeo.morphAttributes.normal = []; // not implemented
 
 
-			var self = this;
+			var scope = this;
 			morphTargets.forEach( function ( morphTarget ) {
 			morphTargets.forEach( function ( morphTarget ) {
 
 
 				morphTarget.rawTargets.forEach( function ( rawTarget ) {
 				morphTarget.rawTargets.forEach( function ( rawTarget ) {
@@ -2072,7 +2072,7 @@ THREE.FBXLoader = ( function () {
 
 
 					if ( morphGeoNode !== undefined ) {
 					if ( morphGeoNode !== undefined ) {
 
 
-						self.genMorphGeometry( parentGeo, parentGeoNode, morphGeoNode, preTransform, rawTarget.name );
+						scope.genMorphGeometry( parentGeo, parentGeoNode, morphGeoNode, preTransform, rawTarget.name );
 
 
 					}
 					}
 
 
@@ -2614,10 +2614,10 @@ THREE.FBXLoader = ( function () {
 
 
 			var tracks = [];
 			var tracks = [];
 
 
-			var self = this;
+			var scope = this;
 			rawClip.layer.forEach( function ( rawTracks ) {
 			rawClip.layer.forEach( function ( rawTracks ) {
 
 
-				tracks = tracks.concat( self.generateTracks( rawTracks ) );
+				tracks = tracks.concat( scope.generateTracks( rawTracks ) );
 
 
 			} );
 			} );
 
 
@@ -2950,7 +2950,7 @@ THREE.FBXLoader = ( function () {
 			this.currentProp = [];
 			this.currentProp = [];
 			this.currentPropName = '';
 			this.currentPropName = '';
 
 
-			var self = this;
+			var scope = this;
 
 
 			var split = text.split( /[\r\n]+/ );
 			var split = text.split( /[\r\n]+/ );
 
 
@@ -2961,27 +2961,27 @@ THREE.FBXLoader = ( function () {
 
 
 				if ( matchComment || matchEmpty ) return;
 				if ( matchComment || matchEmpty ) return;
 
 
-				var matchBeginning = line.match( '^\\t{' + self.currentIndent + '}(\\w+):(.*){', '' );
-				var matchProperty = line.match( '^\\t{' + ( self.currentIndent ) + '}(\\w+):[\\s\\t\\r\\n](.*)' );
-				var matchEnd = line.match( '^\\t{' + ( self.currentIndent - 1 ) + '}}' );
+				var matchBeginning = line.match( '^\\t{' + scope.currentIndent + '}(\\w+):(.*){', '' );
+				var matchProperty = line.match( '^\\t{' + ( scope.currentIndent ) + '}(\\w+):[\\s\\t\\r\\n](.*)' );
+				var matchEnd = line.match( '^\\t{' + ( scope.currentIndent - 1 ) + '}}' );
 
 
 				if ( matchBeginning ) {
 				if ( matchBeginning ) {
 
 
-					self.parseNodeBegin( line, matchBeginning );
+					scope.parseNodeBegin( line, matchBeginning );
 
 
 				} else if ( matchProperty ) {
 				} else if ( matchProperty ) {
 
 
-					self.parseNodeProperty( line, matchProperty, split[ ++ i ] );
+					scope.parseNodeProperty( line, matchProperty, split[ ++ i ] );
 
 
 				} else if ( matchEnd ) {
 				} else if ( matchEnd ) {
 
 
-					self.popStack();
+					scope.popStack();
 
 
 				} else if ( line.match( /^[^\s\t}]/ ) ) {
 				} else if ( line.match( /^[^\s\t}]/ ) ) {
 
 
 					// large arrays are split over multiple lines terminated with a ',' character
 					// large arrays are split over multiple lines terminated with a ',' character
 					// if this is encountered the line needs to be joined to the previous line
 					// if this is encountered the line needs to be joined to the previous line
-					self.parseNodePropertyContinued( line );
+					scope.parseNodePropertyContinued( line );
 
 
 				}
 				}
 
 

+ 4 - 4
examples/js/loaders/GCodeLoader.js

@@ -23,13 +23,13 @@ THREE.GCodeLoader.prototype = Object.assign( Object.create( THREE.Loader.prototy
 
 
 	load: function ( url, onLoad, onProgress, onError ) {
 	load: function ( url, onLoad, onProgress, onError ) {
 
 
-		var self = this;
+		var scope = this;
 
 
-		var loader = new THREE.FileLoader( self.manager );
-		loader.setPath( self.path );
+		var loader = new THREE.FileLoader( scope.manager );
+		loader.setPath( scope.path );
 		loader.load( url, function ( text ) {
 		loader.load( url, function ( text ) {
 
 
-			onLoad( self.parse( text ) );
+			onLoad( scope.parse( text ) );
 
 
 		}, onProgress, onError );
 		}, onProgress, onError );
 
 

+ 11 - 11
examples/js/loaders/LWOLoader.js

@@ -2035,21 +2035,21 @@ THREE.LWOLoader.prototype = Object.assign( Object.create( THREE.Loader.prototype
 
 
 	load: function ( url, onLoad, onProgress, onError ) {
 	load: function ( url, onLoad, onProgress, onError ) {
 
 
-		var self = this;
+		var scope = this;
 
 
-		var path = ( self.path === '' ) ? extractParentUrl( url, 'Objects' ) : self.path;
+		var path = ( scope.path === '' ) ? extractParentUrl( url, 'Objects' ) : scope.path;
 
 
 		// give the mesh a default name based on the filename
 		// give the mesh a default name based on the filename
 		var modelName = url.split( path ).pop().split( '.' )[ 0 ];
 		var modelName = url.split( path ).pop().split( '.' )[ 0 ];
 
 
 		var loader = new THREE.FileLoader( this.manager );
 		var loader = new THREE.FileLoader( this.manager );
-		loader.setPath( self.path );
+		loader.setPath( scope.path );
 		loader.setResponseType( 'arraybuffer' );
 		loader.setResponseType( 'arraybuffer' );
 
 
 		loader.load( url, function ( buffer ) {
 		loader.load( url, function ( buffer ) {
 
 
 			// console.time( 'Total parsing: ' );
 			// console.time( 'Total parsing: ' );
-			onLoad( self.parse( buffer, path, modelName ) );
+			onLoad( scope.parse( buffer, path, modelName ) );
 			// console.timeEnd( 'Total parsing: ' );
 			// console.timeEnd( 'Total parsing: ' );
 
 
 		}, onProgress, onError );
 		}, onProgress, onError );
@@ -2105,12 +2105,12 @@ LWOTreeParser.prototype = {
 
 
 		var geometryParser = new GeometryParser();
 		var geometryParser = new GeometryParser();
 
 
-		var self = this;
+		var scope = this;
 		lwoTree.layers.forEach( function ( layer ) {
 		lwoTree.layers.forEach( function ( layer ) {
 
 
 			var geometry = geometryParser.parse( layer.geometry, layer );
 			var geometry = geometryParser.parse( layer.geometry, layer );
 
 
-			var mesh = self.parseMesh( geometry, layer );
+			var mesh = scope.parseMesh( geometry, layer );
 
 
 			meshes[ layer.number ] = mesh;
 			meshes[ layer.number ] = mesh;
 
 
@@ -2180,11 +2180,11 @@ LWOTreeParser.prototype = {
 
 
 		var materials = [];
 		var materials = [];
 
 
-		var self = this;
+		var scope = this;
 
 
 		namesArray.forEach( function ( name, i ) {
 		namesArray.forEach( function ( name, i ) {
 
 
-			materials[ i ] = self.getMaterialByName( name );
+			materials[ i ] = scope.getMaterialByName( name );
 
 
 		} );
 		} );
 
 
@@ -2369,12 +2369,12 @@ MaterialParser.prototype = {
 		var inputNodeName = connections.inputNodeName;
 		var inputNodeName = connections.inputNodeName;
 		var nodeName = connections.nodeName;
 		var nodeName = connections.nodeName;
 
 
-		var self = this;
+		var scope = this;
 		inputName.forEach( function ( name, index ) {
 		inputName.forEach( function ( name, index ) {
 
 
 			if ( name === 'Material' ) {
 			if ( name === 'Material' ) {
 
 
-				var matNode = self.getNodeByRefName( inputNodeName[ index ], nodes );
+				var matNode = scope.getNodeByRefName( inputNodeName[ index ], nodes );
 				materialConnections.attributes = matNode.attributes;
 				materialConnections.attributes = matNode.attributes;
 				materialConnections.envMap = matNode.fileName;
 				materialConnections.envMap = matNode.fileName;
 				materialConnections.name = inputNodeName[ index ];
 				materialConnections.name = inputNodeName[ index ];
@@ -2387,7 +2387,7 @@ MaterialParser.prototype = {
 
 
 			if ( name === materialConnections.name ) {
 			if ( name === materialConnections.name ) {
 
 
-				materialConnections.maps[ inputName[ index ] ] = self.getNodeByRefName( inputNodeName[ index ], nodes );
+				materialConnections.maps[ inputName[ index ] ] = scope.getNodeByRefName( inputNodeName[ index ], nodes );
 
 
 			}
 			}
 
 

+ 4 - 4
examples/js/utils/TypedArrayUtils.js

@@ -184,7 +184,7 @@ THREE.TypedArrayUtils.quicksortIP = function ( arr, eleSize, orderElement ) {
 
 
 THREE.TypedArrayUtils.Kdtree = function ( points, metric, eleSize ) {
 THREE.TypedArrayUtils.Kdtree = function ( points, metric, eleSize ) {
 
 
-	var self = this;
+	var scope = this;
 
 
 	var maxDepth = 0;
 	var maxDepth = 0;
 
 
@@ -206,7 +206,7 @@ THREE.TypedArrayUtils.Kdtree = function ( points, metric, eleSize ) {
 		if ( plength === 0 ) return null;
 		if ( plength === 0 ) return null;
 		if ( plength === 1 ) {
 		if ( plength === 1 ) {
 
 
-			return new self.Node( getPointSet( points, 0 ), depth, parent, pos );
+			return new scope.Node( getPointSet( points, 0 ), depth, parent, pos );
 
 
 		}
 		}
 
 
@@ -214,7 +214,7 @@ THREE.TypedArrayUtils.Kdtree = function ( points, metric, eleSize ) {
 
 
 		median = Math.floor( plength / 2 );
 		median = Math.floor( plength / 2 );
 
 
-		node = new self.Node( getPointSet( points, median ), depth, parent, median + pos );
+		node = new scope.Node( getPointSet( points, median ), depth, parent, median + pos );
 		node.left = buildTree( points.subarray( 0, median * eleSize ), depth + 1, node, pos );
 		node.left = buildTree( points.subarray( 0, median * eleSize ), depth + 1, node, pos );
 		node.right = buildTree( points.subarray( ( median + 1 ) * eleSize, points.length ), depth + 1, node, pos + median + 1 );
 		node.right = buildTree( points.subarray( ( median + 1 ) * eleSize, points.length ), depth + 1, node, pos + median + 1 );
 
 
@@ -370,7 +370,7 @@ THREE.TypedArrayUtils.Kdtree = function ( points, metric, eleSize ) {
 
 
 		}
 		}
 
 
-		nearestSearch( self.root );
+		nearestSearch( scope.root );
 
 
 		result = [];
 		result = [];
 
 

+ 5 - 5
examples/jsm/animation/CCDIKSolver.js

@@ -407,7 +407,7 @@ var CCDIKSolver = ( function () {
 
 
 		_init: function () {
 		_init: function () {
 
 
-			var self = this;
+			var scope = this;
 			var iks = this.iks;
 			var iks = this.iks;
 
 
 			function createLineGeometry( ik ) {
 			function createLineGeometry( ik ) {
@@ -422,25 +422,25 @@ var CCDIKSolver = ( function () {
 
 
 			function createTargetMesh() {
 			function createTargetMesh() {
 
 
-				return new Mesh( self.sphereGeometry, self.targetSphereMaterial );
+				return new Mesh( scope.sphereGeometry, scope.targetSphereMaterial );
 
 
 			}
 			}
 
 
 			function createEffectorMesh() {
 			function createEffectorMesh() {
 
 
-				return new Mesh( self.sphereGeometry, self.effectorSphereMaterial );
+				return new Mesh( scope.sphereGeometry, scope.effectorSphereMaterial );
 
 
 			}
 			}
 
 
 			function createLinkMesh() {
 			function createLinkMesh() {
 
 
-				return new Mesh( self.sphereGeometry, self.linkSphereMaterial );
+				return new Mesh( scope.sphereGeometry, scope.linkSphereMaterial );
 
 
 			}
 			}
 
 
 			function createLine( ik ) {
 			function createLine( ik ) {
 
 
-				return new Line( createLineGeometry( ik ), self.lineMaterial );
+				return new Line( createLineGeometry( ik ), scope.lineMaterial );
 
 
 			}
 			}
 
 

+ 4 - 4
examples/jsm/csm/CSM.js

@@ -261,16 +261,16 @@ export class CSM {
 		}
 		}
 
 
 		const breaksVec2 = [];
 		const breaksVec2 = [];
-		const self = this;
+		const scope = this;
 		const shaders = this.shaders;
 		const shaders = this.shaders;
 
 
 		material.onBeforeCompile = function ( shader ) {
 		material.onBeforeCompile = function ( shader ) {
 
 
-			const far = Math.min( self.camera.far, self.maxFar );
-			self.getExtendedBreaks( breaksVec2 );
+			const far = Math.min( scope.camera.far, scope.maxFar );
+			scope.getExtendedBreaks( breaksVec2 );
 
 
 			shader.uniforms.CSM_cascades = { value: breaksVec2 };
 			shader.uniforms.CSM_cascades = { value: breaksVec2 };
-			shader.uniforms.cameraNear = { value: self.camera.near };
+			shader.uniforms.cameraNear = { value: scope.camera.near };
 			shader.uniforms.shadowFar = { value: far };
 			shader.uniforms.shadowFar = { value: far };
 
 
 			shaders.set( material, shader );
 			shaders.set( material, shader );

+ 3 - 2
examples/jsm/libs/dat.gui.module.js

@@ -285,7 +285,7 @@ var Common = {
 	},
 	},
 	isFunction: function isFunction( obj ) {
 	isFunction: function isFunction( obj ) {
 
 
-		return Object.prototype.toString.call( obj ) === '[object Function]';
+		return obj instanceof Function;
 
 
 	}
 	}
 };
 };
@@ -959,9 +959,10 @@ Object.defineProperty( Color.prototype, 'a', {
 Object.defineProperty( Color.prototype, 'hex', {
 Object.defineProperty( Color.prototype, 'hex', {
 	get: function get$$1() {
 	get: function get$$1() {
 
 
-		if ( ! this.__state.space !== 'HEX' ) {
+		if ( this.__state.space !== 'HEX' ) {
 
 
 			this.__state.hex = ColorMath.rgb_to_hex( this.r, this.g, this.b );
 			this.__state.hex = ColorMath.rgb_to_hex( this.r, this.g, this.b );
+			this.__state.space = 'HEX';
 
 
 		}
 		}
 		return this.__state.hex;
 		return this.__state.hex;

+ 34 - 34
examples/jsm/loaders/FBXLoader.js

@@ -84,19 +84,19 @@ var FBXLoader = ( function () {
 
 
 		load: function ( url, onLoad, onProgress, onError ) {
 		load: function ( url, onLoad, onProgress, onError ) {
 
 
-			var self = this;
+			var scope = this;
 
 
-			var path = ( self.path === '' ) ? LoaderUtils.extractUrlBase( url ) : self.path;
+			var path = ( scope.path === '' ) ? LoaderUtils.extractUrlBase( url ) : scope.path;
 
 
 			var loader = new FileLoader( this.manager );
 			var loader = new FileLoader( this.manager );
-			loader.setPath( self.path );
+			loader.setPath( scope.path );
 			loader.setResponseType( 'arraybuffer' );
 			loader.setResponseType( 'arraybuffer' );
 
 
 			loader.load( url, function ( buffer ) {
 			loader.load( url, function ( buffer ) {
 
 
 				try {
 				try {
 
 
-					onLoad( self.parse( buffer, path ) );
+					onLoad( scope.parse( buffer, path ) );
 
 
 				} catch ( error ) {
 				} catch ( error ) {
 
 
@@ -104,7 +104,7 @@ var FBXLoader = ( function () {
 
 
 						if ( onError ) onError( error );
 						if ( onError ) onError( error );
 
 
-						self.manager.itemError( url );
+						scope.manager.itemError( url );
 
 
 					}, 0 );
 					}, 0 );
 
 
@@ -604,7 +604,7 @@ var FBXLoader = ( function () {
 
 
 			}
 			}
 
 
-			var self = this;
+			var scope = this;
 			connections.get( ID ).children.forEach( function ( child ) {
 			connections.get( ID ).children.forEach( function ( child ) {
 
 
 				var type = child.relationship;
 				var type = child.relationship;
@@ -612,46 +612,46 @@ var FBXLoader = ( function () {
 				switch ( type ) {
 				switch ( type ) {
 
 
 					case 'Bump':
 					case 'Bump':
-						parameters.bumpMap = self.getTexture( textureMap, child.ID );
+						parameters.bumpMap = scope.getTexture( textureMap, child.ID );
 						break;
 						break;
 
 
 					case 'Maya|TEX_ao_map':
 					case 'Maya|TEX_ao_map':
-						parameters.aoMap = self.getTexture( textureMap, child.ID );
+						parameters.aoMap = scope.getTexture( textureMap, child.ID );
 						break;
 						break;
 
 
 					case 'DiffuseColor':
 					case 'DiffuseColor':
 					case 'Maya|TEX_color_map':
 					case 'Maya|TEX_color_map':
-						parameters.map = self.getTexture( textureMap, child.ID );
+						parameters.map = scope.getTexture( textureMap, child.ID );
 						parameters.map.encoding = sRGBEncoding;
 						parameters.map.encoding = sRGBEncoding;
 						break;
 						break;
 
 
 					case 'DisplacementColor':
 					case 'DisplacementColor':
-						parameters.displacementMap = self.getTexture( textureMap, child.ID );
+						parameters.displacementMap = scope.getTexture( textureMap, child.ID );
 						break;
 						break;
 
 
 					case 'EmissiveColor':
 					case 'EmissiveColor':
-						parameters.emissiveMap = self.getTexture( textureMap, child.ID );
+						parameters.emissiveMap = scope.getTexture( textureMap, child.ID );
 						parameters.emissiveMap.encoding = sRGBEncoding;
 						parameters.emissiveMap.encoding = sRGBEncoding;
 						break;
 						break;
 
 
 					case 'NormalMap':
 					case 'NormalMap':
 					case 'Maya|TEX_normal_map':
 					case 'Maya|TEX_normal_map':
-						parameters.normalMap = self.getTexture( textureMap, child.ID );
+						parameters.normalMap = scope.getTexture( textureMap, child.ID );
 						break;
 						break;
 
 
 					case 'ReflectionColor':
 					case 'ReflectionColor':
-						parameters.envMap = self.getTexture( textureMap, child.ID );
+						parameters.envMap = scope.getTexture( textureMap, child.ID );
 						parameters.envMap.mapping = EquirectangularReflectionMapping;
 						parameters.envMap.mapping = EquirectangularReflectionMapping;
 						parameters.envMap.encoding = sRGBEncoding;
 						parameters.envMap.encoding = sRGBEncoding;
 						break;
 						break;
 
 
 					case 'SpecularColor':
 					case 'SpecularColor':
-						parameters.specularMap = self.getTexture( textureMap, child.ID );
+						parameters.specularMap = scope.getTexture( textureMap, child.ID );
 						parameters.specularMap.encoding = sRGBEncoding;
 						parameters.specularMap.encoding = sRGBEncoding;
 						break;
 						break;
 
 
 					case 'TransparentColor':
 					case 'TransparentColor':
-						parameters.alphaMap = self.getTexture( textureMap, child.ID );
+						parameters.alphaMap = scope.getTexture( textureMap, child.ID );
 						parameters.transparent = true;
 						parameters.transparent = true;
 						break;
 						break;
 
 
@@ -831,11 +831,11 @@ var FBXLoader = ( function () {
 
 
 			var modelNodes = fbxTree.Objects.Model;
 			var modelNodes = fbxTree.Objects.Model;
 
 
-			var self = this;
+			var scope = this;
 			modelMap.forEach( function ( model ) {
 			modelMap.forEach( function ( model ) {
 
 
 				var modelNode = modelNodes[ model.ID ];
 				var modelNode = modelNodes[ model.ID ];
-				self.setLookAtProperties( model, modelNode );
+				scope.setLookAtProperties( model, modelNode );
 
 
 				var parentConnections = connections.get( model.ID ).parents;
 				var parentConnections = connections.get( model.ID ).parents;
 
 
@@ -1456,7 +1456,7 @@ var FBXLoader = ( function () {
 
 
 		setupMorphMaterials: function () {
 		setupMorphMaterials: function () {
 
 
-			var self = this;
+			var scope = this;
 			sceneGraph.traverse( function ( child ) {
 			sceneGraph.traverse( function ( child ) {
 
 
 				if ( child.isMesh ) {
 				if ( child.isMesh ) {
@@ -1467,13 +1467,13 @@ var FBXLoader = ( function () {
 
 
 							child.material.forEach( function ( material, i ) {
 							child.material.forEach( function ( material, i ) {
 
 
-								self.setupMorphMaterial( child, material, i );
+								scope.setupMorphMaterial( child, material, i );
 
 
 							} );
 							} );
 
 
 						} else {
 						} else {
 
 
-							self.setupMorphMaterial( child, child.material );
+							scope.setupMorphMaterial( child, child.material );
 
 
 						}
 						}
 
 
@@ -1827,7 +1827,7 @@ var FBXLoader = ( function () {
 			var faceWeights = [];
 			var faceWeights = [];
 			var faceWeightIndices = [];
 			var faceWeightIndices = [];
 
 
-			var self = this;
+			var scope = this;
 			geoInfo.vertexIndices.forEach( function ( vertexIndex, polygonVertexIndex ) {
 			geoInfo.vertexIndices.forEach( function ( vertexIndex, polygonVertexIndex ) {
 
 
 				var endOfFace = false;
 				var endOfFace = false;
@@ -1966,7 +1966,7 @@ var FBXLoader = ( function () {
 
 
 				if ( endOfFace ) {
 				if ( endOfFace ) {
 
 
-					self.genFace( buffers, geoInfo, facePositionIndexes, materialIndex, faceNormals, faceColors, faceUVs, faceWeights, faceWeightIndices, faceLength );
+					scope.genFace( buffers, geoInfo, facePositionIndexes, materialIndex, faceNormals, faceColors, faceUVs, faceWeights, faceWeightIndices, faceLength );
 
 
 					polygonIndex ++;
 					polygonIndex ++;
 					faceLength = 0;
 					faceLength = 0;
@@ -2110,7 +2110,7 @@ var FBXLoader = ( function () {
 			parentGeo.morphAttributes.position = [];
 			parentGeo.morphAttributes.position = [];
 			// parentGeo.morphAttributes.normal = []; // not implemented
 			// parentGeo.morphAttributes.normal = []; // not implemented
 
 
-			var self = this;
+			var scope = this;
 			morphTargets.forEach( function ( morphTarget ) {
 			morphTargets.forEach( function ( morphTarget ) {
 
 
 				morphTarget.rawTargets.forEach( function ( rawTarget ) {
 				morphTarget.rawTargets.forEach( function ( rawTarget ) {
@@ -2119,7 +2119,7 @@ var FBXLoader = ( function () {
 
 
 					if ( morphGeoNode !== undefined ) {
 					if ( morphGeoNode !== undefined ) {
 
 
-						self.genMorphGeometry( parentGeo, parentGeoNode, morphGeoNode, preTransform, rawTarget.name );
+						scope.genMorphGeometry( parentGeo, parentGeoNode, morphGeoNode, preTransform, rawTarget.name );
 
 
 					}
 					}
 
 
@@ -2661,10 +2661,10 @@ var FBXLoader = ( function () {
 
 
 			var tracks = [];
 			var tracks = [];
 
 
-			var self = this;
+			var scope = this;
 			rawClip.layer.forEach( function ( rawTracks ) {
 			rawClip.layer.forEach( function ( rawTracks ) {
 
 
-				tracks = tracks.concat( self.generateTracks( rawTracks ) );
+				tracks = tracks.concat( scope.generateTracks( rawTracks ) );
 
 
 			} );
 			} );
 
 
@@ -2997,7 +2997,7 @@ var FBXLoader = ( function () {
 			this.currentProp = [];
 			this.currentProp = [];
 			this.currentPropName = '';
 			this.currentPropName = '';
 
 
-			var self = this;
+			var scope = this;
 
 
 			var split = text.split( /[\r\n]+/ );
 			var split = text.split( /[\r\n]+/ );
 
 
@@ -3008,27 +3008,27 @@ var FBXLoader = ( function () {
 
 
 				if ( matchComment || matchEmpty ) return;
 				if ( matchComment || matchEmpty ) return;
 
 
-				var matchBeginning = line.match( '^\\t{' + self.currentIndent + '}(\\w+):(.*){', '' );
-				var matchProperty = line.match( '^\\t{' + ( self.currentIndent ) + '}(\\w+):[\\s\\t\\r\\n](.*)' );
-				var matchEnd = line.match( '^\\t{' + ( self.currentIndent - 1 ) + '}}' );
+				var matchBeginning = line.match( '^\\t{' + scope.currentIndent + '}(\\w+):(.*){', '' );
+				var matchProperty = line.match( '^\\t{' + ( scope.currentIndent ) + '}(\\w+):[\\s\\t\\r\\n](.*)' );
+				var matchEnd = line.match( '^\\t{' + ( scope.currentIndent - 1 ) + '}}' );
 
 
 				if ( matchBeginning ) {
 				if ( matchBeginning ) {
 
 
-					self.parseNodeBegin( line, matchBeginning );
+					scope.parseNodeBegin( line, matchBeginning );
 
 
 				} else if ( matchProperty ) {
 				} else if ( matchProperty ) {
 
 
-					self.parseNodeProperty( line, matchProperty, split[ ++ i ] );
+					scope.parseNodeProperty( line, matchProperty, split[ ++ i ] );
 
 
 				} else if ( matchEnd ) {
 				} else if ( matchEnd ) {
 
 
-					self.popStack();
+					scope.popStack();
 
 
 				} else if ( line.match( /^[^\s\t}]/ ) ) {
 				} else if ( line.match( /^[^\s\t}]/ ) ) {
 
 
 					// large arrays are split over multiple lines terminated with a ',' character
 					// large arrays are split over multiple lines terminated with a ',' character
 					// if this is encountered the line needs to be joined to the previous line
 					// if this is encountered the line needs to be joined to the previous line
-					self.parseNodePropertyContinued( line );
+					scope.parseNodePropertyContinued( line );
 
 
 				}
 				}
 
 

+ 4 - 4
examples/jsm/loaders/GCodeLoader.js

@@ -34,13 +34,13 @@ GCodeLoader.prototype = Object.assign( Object.create( Loader.prototype ), {
 
 
 	load: function ( url, onLoad, onProgress, onError ) {
 	load: function ( url, onLoad, onProgress, onError ) {
 
 
-		var self = this;
+		var scope = this;
 
 
-		var loader = new FileLoader( self.manager );
-		loader.setPath( self.path );
+		var loader = new FileLoader( scope.manager );
+		loader.setPath( scope.path );
 		loader.load( url, function ( text ) {
 		loader.load( url, function ( text ) {
 
 
-			onLoad( self.parse( text ) );
+			onLoad( scope.parse( text ) );
 
 
 		}, onProgress, onError );
 		}, onProgress, onError );
 
 

+ 11 - 11
examples/jsm/loaders/LWOLoader.js

@@ -2064,21 +2064,21 @@ LWOLoader.prototype = Object.assign( Object.create( Loader.prototype ), {
 
 
 	load: function ( url, onLoad, onProgress, onError ) {
 	load: function ( url, onLoad, onProgress, onError ) {
 
 
-		var self = this;
+		var scope = this;
 
 
-		var path = ( self.path === '' ) ? extractParentUrl( url, 'Objects' ) : self.path;
+		var path = ( scope.path === '' ) ? extractParentUrl( url, 'Objects' ) : scope.path;
 
 
 		// give the mesh a default name based on the filename
 		// give the mesh a default name based on the filename
 		var modelName = url.split( path ).pop().split( '.' )[ 0 ];
 		var modelName = url.split( path ).pop().split( '.' )[ 0 ];
 
 
 		var loader = new FileLoader( this.manager );
 		var loader = new FileLoader( this.manager );
-		loader.setPath( self.path );
+		loader.setPath( scope.path );
 		loader.setResponseType( 'arraybuffer' );
 		loader.setResponseType( 'arraybuffer' );
 
 
 		loader.load( url, function ( buffer ) {
 		loader.load( url, function ( buffer ) {
 
 
 			// console.time( 'Total parsing: ' );
 			// console.time( 'Total parsing: ' );
-			onLoad( self.parse( buffer, path, modelName ) );
+			onLoad( scope.parse( buffer, path, modelName ) );
 			// console.timeEnd( 'Total parsing: ' );
 			// console.timeEnd( 'Total parsing: ' );
 
 
 		}, onProgress, onError );
 		}, onProgress, onError );
@@ -2134,12 +2134,12 @@ LWOTreeParser.prototype = {
 
 
 		var geometryParser = new GeometryParser();
 		var geometryParser = new GeometryParser();
 
 
-		var self = this;
+		var scope = this;
 		lwoTree.layers.forEach( function ( layer ) {
 		lwoTree.layers.forEach( function ( layer ) {
 
 
 			var geometry = geometryParser.parse( layer.geometry, layer );
 			var geometry = geometryParser.parse( layer.geometry, layer );
 
 
-			var mesh = self.parseMesh( geometry, layer );
+			var mesh = scope.parseMesh( geometry, layer );
 
 
 			meshes[ layer.number ] = mesh;
 			meshes[ layer.number ] = mesh;
 
 
@@ -2209,11 +2209,11 @@ LWOTreeParser.prototype = {
 
 
 		var materials = [];
 		var materials = [];
 
 
-		var self = this;
+		var scope = this;
 
 
 		namesArray.forEach( function ( name, i ) {
 		namesArray.forEach( function ( name, i ) {
 
 
-			materials[ i ] = self.getMaterialByName( name );
+			materials[ i ] = scope.getMaterialByName( name );
 
 
 		} );
 		} );
 
 
@@ -2398,12 +2398,12 @@ MaterialParser.prototype = {
 		var inputNodeName = connections.inputNodeName;
 		var inputNodeName = connections.inputNodeName;
 		var nodeName = connections.nodeName;
 		var nodeName = connections.nodeName;
 
 
-		var self = this;
+		var scope = this;
 		inputName.forEach( function ( name, index ) {
 		inputName.forEach( function ( name, index ) {
 
 
 			if ( name === 'Material' ) {
 			if ( name === 'Material' ) {
 
 
-				var matNode = self.getNodeByRefName( inputNodeName[ index ], nodes );
+				var matNode = scope.getNodeByRefName( inputNodeName[ index ], nodes );
 				materialConnections.attributes = matNode.attributes;
 				materialConnections.attributes = matNode.attributes;
 				materialConnections.envMap = matNode.fileName;
 				materialConnections.envMap = matNode.fileName;
 				materialConnections.name = inputNodeName[ index ];
 				materialConnections.name = inputNodeName[ index ];
@@ -2416,7 +2416,7 @@ MaterialParser.prototype = {
 
 
 			if ( name === materialConnections.name ) {
 			if ( name === materialConnections.name ) {
 
 
-				materialConnections.maps[ inputName[ index ] ] = self.getNodeByRefName( inputNodeName[ index ], nodes );
+				materialConnections.maps[ inputName[ index ] ] = scope.getNodeByRefName( inputNodeName[ index ], nodes );
 
 
 			}
 			}
 
 

+ 2 - 2
examples/jsm/nodes/materials/NodeMaterial.js

@@ -19,7 +19,7 @@ function NodeMaterial( vertex, fragment ) {
 
 
 	ShaderMaterial.call( this );
 	ShaderMaterial.call( this );
 
 
-	var self = this;
+	var scope = this;
 
 
 	this.vertex = vertex || new RawNode( new PositionNode( PositionNode.PROJECTION ) );
 	this.vertex = vertex || new RawNode( new PositionNode( PositionNode.PROJECTION ) );
 	this.fragment = fragment || new RawNode( new ColorNode( 0xFF0000 ) );
 	this.fragment = fragment || new RawNode( new ColorNode( 0xFF0000 ) );
@@ -48,7 +48,7 @@ function NodeMaterial( vertex, fragment ) {
 
 
 	this.onBeforeCompile.toString = function () {
 	this.onBeforeCompile.toString = function () {
 
 
-		return self.needsCompile;
+		return scope.needsCompile;
 
 
 	};
 	};
 
 

+ 4 - 4
examples/jsm/utils/TypedArrayUtils.js

@@ -184,7 +184,7 @@ TypedArrayUtils.quicksortIP = function ( arr, eleSize, orderElement ) {
 
 
 TypedArrayUtils.Kdtree = function ( points, metric, eleSize ) {
 TypedArrayUtils.Kdtree = function ( points, metric, eleSize ) {
 
 
-	var self = this;
+	var scope = this;
 
 
 	var maxDepth = 0;
 	var maxDepth = 0;
 
 
@@ -206,7 +206,7 @@ TypedArrayUtils.Kdtree = function ( points, metric, eleSize ) {
 		if ( plength === 0 ) return null;
 		if ( plength === 0 ) return null;
 		if ( plength === 1 ) {
 		if ( plength === 1 ) {
 
 
-			return new self.Node( getPointSet( points, 0 ), depth, parent, pos );
+			return new scope.Node( getPointSet( points, 0 ), depth, parent, pos );
 
 
 		}
 		}
 
 
@@ -214,7 +214,7 @@ TypedArrayUtils.Kdtree = function ( points, metric, eleSize ) {
 
 
 		median = Math.floor( plength / 2 );
 		median = Math.floor( plength / 2 );
 
 
-		node = new self.Node( getPointSet( points, median ), depth, parent, median + pos );
+		node = new scope.Node( getPointSet( points, median ), depth, parent, median + pos );
 		node.left = buildTree( points.subarray( 0, median * eleSize ), depth + 1, node, pos );
 		node.left = buildTree( points.subarray( 0, median * eleSize ), depth + 1, node, pos );
 		node.right = buildTree( points.subarray( ( median + 1 ) * eleSize, points.length ), depth + 1, node, pos + median + 1 );
 		node.right = buildTree( points.subarray( ( median + 1 ) * eleSize, points.length ), depth + 1, node, pos + median + 1 );
 
 
@@ -370,7 +370,7 @@ TypedArrayUtils.Kdtree = function ( points, metric, eleSize ) {
 
 
 		}
 		}
 
 
-		nearestSearch( self.root );
+		nearestSearch( scope.root );
 
 
 		result = [];
 		result = [];
 
 

+ 11 - 5
examples/webgl_loader_gcode.html

@@ -23,14 +23,14 @@
 			var camera, scene, renderer;
 			var camera, scene, renderer;
 
 
 			init();
 			init();
-			animate();
+			render();
 
 
 			function init() {
 			function init() {
 
 
 				container = document.createElement( 'div' );
 				container = document.createElement( 'div' );
 				document.body.appendChild( container );
 				document.body.appendChild( container );
 
 
-				camera = new THREE.PerspectiveCamera( 60, window.innerWidth / window.innerHeight, 0.1, 10000 );
+				camera = new THREE.PerspectiveCamera( 60, window.innerWidth / window.innerHeight, 1, 1000 );
 				camera.position.set( 0, 0, 70 );
 				camera.position.set( 0, 0, 70 );
 
 
 				scene = new THREE.Scene();
 				scene = new THREE.Scene();
@@ -41,6 +41,8 @@
 					object.position.set( - 100, - 20, 100 );
 					object.position.set( - 100, - 20, 100 );
 					scene.add( object );
 					scene.add( object );
 
 
+					render();
+
 				} );
 				} );
 
 
 				renderer = new THREE.WebGLRenderer();
 				renderer = new THREE.WebGLRenderer();
@@ -49,6 +51,9 @@
 				container.appendChild( renderer.domElement );
 				container.appendChild( renderer.domElement );
 
 
 				var controls = new OrbitControls( camera, renderer.domElement );
 				var controls = new OrbitControls( camera, renderer.domElement );
+				controls.addEventListener( 'change', render ); // use if there is no animation loop
+				controls.minDistance = 10;
+				controls.maxDistance = 100;
 
 
 				window.addEventListener( 'resize', resize, false );
 				window.addEventListener( 'resize', resize, false );
 
 
@@ -61,15 +66,16 @@
 
 
 				renderer.setSize( window.innerWidth, window.innerHeight );
 				renderer.setSize( window.innerWidth, window.innerHeight );
 
 
+				render();
+
 			}
 			}
 
 
-			function animate() {
+			function render() {
 
 
 				renderer.render( scene, camera );
 				renderer.render( scene, camera );
 
 
-				requestAnimationFrame( animate );
-
 			}
 			}
+
 		</script>
 		</script>
 
 
 	</body>
 	</body>

+ 5 - 0
src/math/Vector2.d.ts

@@ -459,4 +459,9 @@ export class Vector2 implements Vector {
 	 */
 	 */
 	manhattanDistanceTo( v: Vector2 ): number;
 	manhattanDistanceTo( v: Vector2 ): number;
 
 
+	/**
+	 * Sets this vector's x and y from Math.random
+	 */
+	random(): this;
+
 }
 }

+ 9 - 0
src/math/Vector2.js

@@ -482,6 +482,15 @@ Object.assign( Vector2.prototype, {
 
 
 		return this;
 		return this;
 
 
+	},
+
+	random: function () {
+
+		this.x = Math.random();
+		this.y = Math.random();
+
+		return this;
+
 	}
 	}
 
 
 } );
 } );

+ 5 - 0
src/math/Vector3.d.ts

@@ -287,4 +287,9 @@ export class Vector3 implements Vector {
 		offset?: number
 		offset?: number
 	): this;
 	): this;
 
 
+	/**
+	 * Sets this vector's x, y and z from Math.random
+	 */
+	random(): this;
+
 }
 }

+ 10 - 0
src/math/Vector3.js

@@ -712,6 +712,16 @@ Object.assign( Vector3.prototype, {
 
 
 		return this;
 		return this;
 
 
+	},
+
+	random: function () {
+
+		this.x = Math.random();
+		this.y = Math.random();
+		this.z = Math.random();
+
+		return this;
+
 	}
 	}
 
 
 } );
 } );

+ 5 - 0
src/math/Vector4.d.ts

@@ -210,4 +210,9 @@ export class Vector4 implements Vector {
 		offset?: number
 		offset?: number
 	): this;
 	): this;
 
 
+	/**
+	 * Sets this vector's x, y, z and w from Math.random
+	 */
+	random(): this;
+
 }
 }

+ 11 - 0
src/math/Vector4.js

@@ -646,6 +646,17 @@ Object.assign( Vector4.prototype, {
 
 
 		return this;
 		return this;
 
 
+	},
+
+	random: function () {
+
+		this.x = Math.random();
+		this.y = Math.random();
+		this.z = Math.random();
+		this.w = Math.random();
+
+		return this;
+
 	}
 	}
 
 
 } );
 } );

+ 2 - 2
utils/packLDrawModel.js

@@ -222,7 +222,7 @@ function parseObject( fileName, isRoot ) {
 
 
 			// Embedded object was found, add to path map
 			// Embedded object was found, add to path map
 
 
-			var subobjectFileName = line.substring( charIndex ).trim().replace( "\\", "/" );
+			var subobjectFileName = line.substring( charIndex ).trim().replace( /\\/g, '/' );
 
 
 			if ( subobjectFileName ) {
 			if ( subobjectFileName ) {
 
 
@@ -263,7 +263,7 @@ function parseObject( fileName, isRoot ) {
 
 
 			}
 			}
 
 
-			var subobjectFileName = line.substring( charIndex ).trim().replace( "\\", "/" );
+			var subobjectFileName = line.substring( charIndex ).trim().replace( /\\/g, '/' );
 
 
 			if ( subobjectFileName ) {
 			if ( subobjectFileName ) {