Browse Source

Examples: Convert math to ES6. (#21598)

Michael Herzog 4 years ago
parent
commit
807dced141

+ 39 - 37
examples/js/math/ColorConverter.js

@@ -1,7 +1,10 @@
 ( function () {
 
-	var ColorConverter = {
-		setHSV: function ( color, h, s, v ) {
+	const _hsl = {};
+
+	class ColorConverter {
+
+		static setHSV( color, h, s, v ) {
 
 			// https://gist.github.com/xpansive/1337890#file-index-js
 			h = THREE.MathUtils.euclideanModulo( h, 1 );
@@ -9,44 +12,42 @@
 			v = THREE.MathUtils.clamp( v, 0, 1 );
 			return color.setHSL( h, s * v / ( ( h = ( 2 - s ) * v ) < 1 ? h : 2 - h ), h * 0.5 );
 
-		},
-		getHSV: function () {
+		}
+
+		static getHSV( color, target ) {
 
-			var hsl = {};
-			return function getHSV( color, target ) {
+			if ( target === undefined ) {
 
-				if ( target === undefined ) {
+				console.warn( 'THREE.ColorConverter: .getHSV() target is now required' );
+				target = {
+					h: 0,
+					s: 0,
+					l: 0
+				};
 
-					console.warn( 'THREE.ColorConverter: .getHSV() target is now required' );
-					target = {
-						h: 0,
-						s: 0,
-						l: 0
-					};
+			}
 
-				}
+			color.getHSL( _hsl ); // based on https://gist.github.com/xpansive/1337890#file-index-js
 
-				color.getHSL( hsl ); // based on https://gist.github.com/xpansive/1337890#file-index-js
+			_hsl.s *= _hsl.l < 0.5 ? _hsl.l : 1 - _hsl.l;
+			target.h = _hsl.h;
+			target.s = 2 * _hsl.s / ( _hsl.l + _hsl.s );
+			target.v = _hsl.l + _hsl.s;
+			return target;
 
-				hsl.s *= hsl.l < 0.5 ? hsl.l : 1 - hsl.l;
-				target.h = hsl.h;
-				target.s = 2 * hsl.s / ( hsl.l + hsl.s );
-				target.v = hsl.l + hsl.s;
-				return target;
+		} // where c, m, y, k is between 0 and 1
 
-			};
 
-		}(),
-		// where c, m, y, k is between 0 and 1
-		setCMYK: function ( color, c, m, y, k ) {
+		static setCMYK( color, c, m, y, k ) {
 
-			var r = ( 1 - c ) * ( 1 - k );
-			var g = ( 1 - m ) * ( 1 - k );
-			var b = ( 1 - y ) * ( 1 - k );
+			const r = ( 1 - c ) * ( 1 - k );
+			const g = ( 1 - m ) * ( 1 - k );
+			const b = ( 1 - y ) * ( 1 - k );
 			return color.setRGB( r, g, b );
 
-		},
-		getCMYK: function ( color, target ) {
+		}
+
+		static getCMYK( color, target ) {
 
 			if ( target === undefined ) {
 
@@ -60,13 +61,13 @@
 
 			}
 
-			var r = color.r;
-			var g = color.g;
-			var b = color.b;
-			var k = 1 - Math.max( r, g, b );
-			var c = ( 1 - r - k ) / ( 1 - k );
-			var m = ( 1 - g - k ) / ( 1 - k );
-			var y = ( 1 - b - k ) / ( 1 - k );
+			const r = color.r;
+			const g = color.g;
+			const b = color.b;
+			const k = 1 - Math.max( r, g, b );
+			const c = ( 1 - r - k ) / ( 1 - k );
+			const m = ( 1 - g - k ) / ( 1 - k );
+			const y = ( 1 - b - k ) / ( 1 - k );
 			target.c = c;
 			target.m = m;
 			target.y = y;
@@ -74,7 +75,8 @@
 			return target;
 
 		}
-	};
+
+	}
 
 	THREE.ColorConverter = ColorConverter;
 

File diff suppressed because it is too large
+ 445 - 427
examples/js/math/ConvexHull.js


+ 44 - 46
examples/js/math/ImprovedNoise.js

@@ -1,67 +1,65 @@
 ( function () {
 
 	// http://mrl.nyu.edu/~perlin/noise/
-	var ImprovedNoise = function () {
+	const _p = [ 151, 160, 137, 91, 90, 15, 131, 13, 201, 95, 96, 53, 194, 233, 7, 225, 140, 36, 103, 30, 69, 142, 8, 99, 37, 240, 21, 10, 23, 190, 6, 148, 247, 120, 234, 75, 0, 26, 197, 62, 94, 252, 219, 203, 117, 35, 11, 32, 57, 177, 33, 88, 237, 149, 56, 87, 174, 20, 125, 136, 171, 168, 68, 175, 74, 165, 71, 134, 139, 48, 27, 166, 77, 146, 158, 231, 83, 111, 229, 122, 60, 211, 133, 230, 220, 105, 92, 41, 55, 46, 245, 40, 244, 102, 143, 54, 65, 25, 63, 161, 1, 216, 80, 73, 209, 76, 132, 187, 208, 89, 18, 169, 200, 196, 135, 130, 116, 188, 159, 86, 164, 100, 109, 198, 173, 186, 3, 64, 52, 217, 226, 250, 124, 123, 5, 202, 38, 147, 118, 126, 255, 82, 85, 212, 207, 206, 59, 227, 47, 16, 58, 17, 182, 189, 28, 42, 223, 183, 170, 213, 119, 248, 152, 2, 44, 154, 163, 70, 221, 153, 101, 155, 167, 43, 172, 9, 129, 22, 39, 253, 19, 98, 108, 110, 79, 113, 224, 232, 178, 185, 112, 104, 218, 246, 97, 228, 251, 34, 242, 193, 238, 210, 144, 12, 191, 179, 162, 241, 81, 51, 145, 235, 249, 14, 239, 107, 49, 192, 214, 31, 181, 199, 106, 157, 184, 84, 204, 176, 115, 121, 50, 45, 127, 4, 150, 254, 138, 236, 205, 93, 222, 114, 67, 29, 24, 72, 243, 141, 128, 195, 78, 66, 215, 61, 156, 180 ];
 
-		var p = [ 151, 160, 137, 91, 90, 15, 131, 13, 201, 95, 96, 53, 194, 233, 7, 225, 140, 36, 103, 30, 69, 142, 8, 99, 37, 240, 21, 10, 23, 190, 6, 148, 247, 120, 234, 75, 0, 26, 197, 62, 94, 252, 219, 203, 117, 35, 11, 32, 57, 177, 33, 88, 237, 149, 56, 87, 174, 20, 125, 136, 171, 168, 68, 175, 74, 165, 71, 134, 139, 48, 27, 166, 77, 146, 158, 231, 83, 111, 229, 122, 60, 211, 133, 230, 220, 105, 92, 41, 55, 46, 245, 40, 244, 102, 143, 54, 65, 25, 63, 161, 1, 216, 80, 73, 209, 76, 132, 187, 208, 89, 18, 169, 200, 196, 135, 130, 116, 188, 159, 86, 164, 100, 109, 198, 173, 186, 3, 64, 52, 217, 226, 250, 124, 123, 5, 202, 38, 147, 118, 126, 255, 82, 85, 212, 207, 206, 59, 227, 47, 16, 58, 17, 182, 189, 28, 42, 223, 183, 170, 213, 119, 248, 152, 2, 44, 154, 163, 70, 221, 153, 101, 155, 167, 43, 172, 9, 129, 22, 39, 253, 19, 98, 108, 110, 79, 113, 224, 232, 178, 185, 112, 104, 218, 246, 97, 228, 251, 34, 242, 193, 238, 210, 144, 12, 191, 179, 162, 241, 81, 51, 145, 235, 249, 14, 239, 107, 49, 192, 214, 31, 181, 199, 106, 157, 184, 84, 204, 176, 115, 121, 50, 45, 127, 4, 150, 254, 138, 236, 205, 93, 222, 114, 67, 29, 24, 72, 243, 141, 128, 195, 78, 66, 215, 61, 156, 180 ];
+	for ( let i = 0; i < 256; i ++ ) {
 
-		for ( var i = 0; i < 256; i ++ ) {
+		_p[ 256 + i ] = _p[ i ];
 
-			p[ 256 + i ] = p[ i ];
+	}
 
-		}
+	function fade( t ) {
 
-		function fade( t ) {
+		return t * t * t * ( t * ( t * 6 - 15 ) + 10 );
 
-			return t * t * t * ( t * ( t * 6 - 15 ) + 10 );
+	}
 
-		}
+	function lerp( t, a, b ) {
 
-		function lerp( t, a, b ) {
+		return a + t * ( b - a );
 
-			return a + t * ( b - a );
+	}
 
-		}
+	function grad( hash, x, y, z ) {
+
+		const h = hash & 15;
+		const u = h < 8 ? x : y,
+			v = h < 4 ? y : h == 12 || h == 14 ? x : z;
+		return ( ( h & 1 ) == 0 ? u : - u ) + ( ( h & 2 ) == 0 ? v : - v );
+
+	}
+
+	class ImprovedNoise {
 
-		function grad( hash, x, y, z ) {
+		noise( x, y, z ) {
 
-			var h = hash & 15;
-			var u = h < 8 ? x : y,
-				v = h < 4 ? y : h == 12 || h == 14 ? x : z;
-			return ( ( h & 1 ) == 0 ? u : - u ) + ( ( h & 2 ) == 0 ? v : - v );
+			const floorX = Math.floor( x ),
+				floorY = Math.floor( y ),
+				floorZ = Math.floor( z );
+			const X = floorX & 255,
+				Y = floorY & 255,
+				Z = floorZ & 255;
+			x -= floorX;
+			y -= floorY;
+			z -= floorZ;
+			const xMinus1 = x - 1,
+				yMinus1 = y - 1,
+				zMinus1 = z - 1;
+			const u = fade( x ),
+				v = fade( y ),
+				w = fade( z );
+			const A = _p[ X ] + Y,
+				AA = _p[ A ] + Z,
+				AB = _p[ A + 1 ] + Z,
+				B = _p[ X + 1 ] + Y,
+				BA = _p[ B ] + Z,
+				BB = _p[ B + 1 ] + Z;
+			return lerp( w, lerp( v, lerp( u, grad( _p[ AA ], x, y, z ), grad( _p[ BA ], xMinus1, y, z ) ), lerp( u, grad( _p[ AB ], x, yMinus1, z ), grad( _p[ BB ], xMinus1, yMinus1, z ) ) ), lerp( v, lerp( u, grad( _p[ AA + 1 ], x, y, zMinus1 ), grad( _p[ BA + 1 ], xMinus1, y, zMinus1 ) ), lerp( u, grad( _p[ AB + 1 ], x, yMinus1, zMinus1 ), grad( _p[ BB + 1 ], xMinus1, yMinus1, zMinus1 ) ) ) );
 
 		}
 
-		return {
-			noise: function ( x, y, z ) {
-
-				var floorX = Math.floor( x ),
-					floorY = Math.floor( y ),
-					floorZ = Math.floor( z );
-				var X = floorX & 255,
-					Y = floorY & 255,
-					Z = floorZ & 255;
-				x -= floorX;
-				y -= floorY;
-				z -= floorZ;
-				var xMinus1 = x - 1,
-					yMinus1 = y - 1,
-					zMinus1 = z - 1;
-				var u = fade( x ),
-					v = fade( y ),
-					w = fade( z );
-				var A = p[ X ] + Y,
-					AA = p[ A ] + Z,
-					AB = p[ A + 1 ] + Z,
-					B = p[ X + 1 ] + Y,
-					BA = p[ B ] + Z,
-					BB = p[ B + 1 ] + Z;
-				return lerp( w, lerp( v, lerp( u, grad( p[ AA ], x, y, z ), grad( p[ BA ], xMinus1, y, z ) ), lerp( u, grad( p[ AB ], x, yMinus1, z ), grad( p[ BB ], xMinus1, yMinus1, z ) ) ), lerp( v, lerp( u, grad( p[ AA + 1 ], x, y, zMinus1 ), grad( p[ BA + 1 ], xMinus1, y, zMinus1 ) ), lerp( u, grad( p[ AB + 1 ], x, yMinus1, zMinus1 ), grad( p[ BB + 1 ], xMinus1, yMinus1, zMinus1 ) ) ) );
-
-			}
-		};
-
-	};
+	}
 
 	THREE.ImprovedNoise = ImprovedNoise;
 

+ 63 - 54
examples/js/math/Lut.js

@@ -1,21 +1,15 @@
 ( function () {
 
-	var Lut = function ( colormap, numberofcolors ) {
+	class Lut {
 
-		this.lut = [];
-		this.setColorMap( colormap, numberofcolors );
-		return this;
+		constructor( colormap, numberofcolors ) {
 
-	};
+			this.lut = [];
+			this.setColorMap( colormap, numberofcolors );
+
+		}
 
-	Lut.prototype = {
-		constructor: Lut,
-		lut: [],
-		map: [],
-		n: 256,
-		minV: 0,
-		maxV: 1,
-		set: function ( value ) {
+		set( value ) {
 
 			if ( value instanceof Lut ) {
 
@@ -25,37 +19,40 @@
 
 			return this;
 
-		},
-		setMin: function ( min ) {
+		}
+
+		setMin( min ) {
 
 			this.minV = min;
 			return this;
 
-		},
-		setMax: function ( max ) {
+		}
+
+		setMax( max ) {
 
 			this.maxV = max;
 			return this;
 
-		},
-		setColorMap: function ( colormap, numberofcolors ) {
+		}
+
+		setColorMap( colormap, numberofcolors = 32 ) {
 
 			this.map = ColorMapKeywords[ colormap ] || ColorMapKeywords.rainbow;
-			this.n = numberofcolors || 32;
-			var step = 1.0 / this.n;
+			this.n = numberofcolors;
+			const step = 1.0 / this.n;
 			this.lut.length = 0;
 
-			for ( var i = 0; i <= 1; i += step ) {
+			for ( let i = 0; i <= 1; i += step ) {
 
-				for ( var j = 0; j < this.map.length - 1; j ++ ) {
+				for ( let j = 0; j < this.map.length - 1; j ++ ) {
 
 					if ( i >= this.map[ j ][ 0 ] && i < this.map[ j + 1 ][ 0 ] ) {
 
-						var min = this.map[ j ][ 0 ];
-						var max = this.map[ j + 1 ][ 0 ];
-						var minColor = new THREE.Color( this.map[ j ][ 1 ] );
-						var maxColor = new THREE.Color( this.map[ j + 1 ][ 1 ] );
-						var color = minColor.lerp( maxColor, ( i - min ) / ( max - min ) );
+						const min = this.map[ j ][ 0 ];
+						const max = this.map[ j + 1 ][ 0 ];
+						const minColor = new THREE.Color( this.map[ j ][ 1 ] );
+						const maxColor = new THREE.Color( this.map[ j + 1 ][ 1 ] );
+						const color = minColor.lerp( maxColor, ( i - min ) / ( max - min ) );
 						this.lut.push( color );
 
 					}
@@ -66,8 +63,9 @@
 
 			return this;
 
-		},
-		copy: function ( lut ) {
+		}
+
+		copy( lut ) {
 
 			this.lut = lut.lut;
 			this.map = lut.map;
@@ -76,8 +74,9 @@
 			this.maxV = lut.maxV;
 			return this;
 
-		},
-		getColor: function ( alpha ) {
+		}
+
+		getColor( alpha ) {
 
 			if ( alpha <= this.minV ) {
 
@@ -90,46 +89,49 @@
 			}
 
 			alpha = ( alpha - this.minV ) / ( this.maxV - this.minV );
-			var colorPosition = Math.round( alpha * this.n );
+			let colorPosition = Math.round( alpha * this.n );
 			colorPosition == this.n ? colorPosition -= 1 : colorPosition;
 			return this.lut[ colorPosition ];
 
-		},
-		addColorMap: function ( colormapName, arrayOfColors ) {
+		}
+
+		addColorMap( colormapName, arrayOfColors ) {
 
 			ColorMapKeywords[ colormapName ] = arrayOfColors;
 
-		},
-		createCanvas: function () {
+		}
+
+		createCanvas() {
 
-			var canvas = document.createElement( 'canvas' );
+			const canvas = document.createElement( 'canvas' );
 			canvas.width = 1;
 			canvas.height = this.n;
 			this.updateCanvas( canvas );
 			return canvas;
 
-		},
-		updateCanvas: function ( canvas ) {
+		}
+
+		updateCanvas( canvas ) {
 
-			var ctx = canvas.getContext( '2d', {
+			const ctx = canvas.getContext( '2d', {
 				alpha: false
 			} );
-			var imageData = ctx.getImageData( 0, 0, 1, this.n );
-			var data = imageData.data;
-			var k = 0;
-			var step = 1.0 / this.n;
+			const imageData = ctx.getImageData( 0, 0, 1, this.n );
+			const data = imageData.data;
+			let k = 0;
+			const step = 1.0 / this.n;
 
-			for ( var i = 1; i >= 0; i -= step ) {
+			for ( let i = 1; i >= 0; i -= step ) {
 
-				for ( var j = this.map.length - 1; j >= 0; j -- ) {
+				for ( let j = this.map.length - 1; j >= 0; j -- ) {
 
 					if ( i < this.map[ j ][ 0 ] && i >= this.map[ j - 1 ][ 0 ] ) {
 
-						var min = this.map[ j - 1 ][ 0 ];
-						var max = this.map[ j ][ 0 ];
-						var minColor = new THREE.Color( this.map[ j - 1 ][ 1 ] );
-						var maxColor = new THREE.Color( this.map[ j ][ 1 ] );
-						var color = minColor.lerp( maxColor, ( i - min ) / ( max - min ) );
+						const min = this.map[ j - 1 ][ 0 ];
+						const max = this.map[ j ][ 0 ];
+						const minColor = new THREE.Color( this.map[ j - 1 ][ 1 ] );
+						const maxColor = new THREE.Color( this.map[ j ][ 1 ] );
+						const color = minColor.lerp( maxColor, ( i - min ) / ( max - min ) );
 						data[ k * 4 ] = Math.round( color.r * 255 );
 						data[ k * 4 + 1 ] = Math.round( color.g * 255 );
 						data[ k * 4 + 2 ] = Math.round( color.b * 255 );
@@ -146,8 +148,15 @@
 			return canvas;
 
 		}
-	};
-	var ColorMapKeywords = {
+
+	}
+
+	Lut.prototype.lut = [];
+	Lut.prototype.map = [];
+	Lut.prototype.n = 256;
+	Lut.prototype.minV = 0;
+	Lut.prototype.maxV = 1;
+	const ColorMapKeywords = {
 		'rainbow': [[ 0.0, 0x0000FF ], [ 0.2, 0x00FFFF ], [ 0.5, 0x00FF00 ], [ 0.8, 0xFFFF00 ], [ 1.0, 0xFF0000 ]],
 		'cooltowarm': [[ 0.0, 0x3C4EC2 ], [ 0.2, 0x9BBCFF ], [ 0.5, 0xDCDCDC ], [ 0.8, 0xF6A385 ], [ 1.0, 0xB40426 ]],
 		'blackbody': [[ 0.0, 0x000000 ], [ 0.2, 0x780000 ], [ 0.5, 0xE63200 ], [ 0.8, 0xFFFF00 ], [ 1.0, 0xFFFFFF ]],

+ 332 - 319
examples/js/math/SimplexNoise.js

@@ -12,434 +12,447 @@
  * You can pass in a random number generator object if you like.
  * It is assumed to have a random() method.
  */
-	var SimplexNoise = function ( r ) {
+	class SimplexNoise {
 
-		if ( r == undefined ) r = Math;
-		this.grad3 = [[ 1, 1, 0 ], [ - 1, 1, 0 ], [ 1, - 1, 0 ], [ - 1, - 1, 0 ], [ 1, 0, 1 ], [ - 1, 0, 1 ], [ 1, 0, - 1 ], [ - 1, 0, - 1 ], [ 0, 1, 1 ], [ 0, - 1, 1 ], [ 0, 1, - 1 ], [ 0, - 1, - 1 ]];
-		this.grad4 = [[ 0, 1, 1, 1 ], [ 0, 1, 1, - 1 ], [ 0, 1, - 1, 1 ], [ 0, 1, - 1, - 1 ], [ 0, - 1, 1, 1 ], [ 0, - 1, 1, - 1 ], [ 0, - 1, - 1, 1 ], [ 0, - 1, - 1, - 1 ], [ 1, 0, 1, 1 ], [ 1, 0, 1, - 1 ], [ 1, 0, - 1, 1 ], [ 1, 0, - 1, - 1 ], [ - 1, 0, 1, 1 ], [ - 1, 0, 1, - 1 ], [ - 1, 0, - 1, 1 ], [ - 1, 0, - 1, - 1 ], [ 1, 1, 0, 1 ], [ 1, 1, 0, - 1 ], [ 1, - 1, 0, 1 ], [ 1, - 1, 0, - 1 ], [ - 1, 1, 0, 1 ], [ - 1, 1, 0, - 1 ], [ - 1, - 1, 0, 1 ], [ - 1, - 1, 0, - 1 ], [ 1, 1, 1, 0 ], [ 1, 1, - 1, 0 ], [ 1, - 1, 1, 0 ], [ 1, - 1, - 1, 0 ], [ - 1, 1, 1, 0 ], [ - 1, 1, - 1, 0 ], [ - 1, - 1, 1, 0 ], [ - 1, - 1, - 1, 0 ]];
-		this.p = [];
+		constructor( r = Math ) {
 
-		for ( var i = 0; i < 256; i ++ ) {
+			this.grad3 = [[ 1, 1, 0 ], [ - 1, 1, 0 ], [ 1, - 1, 0 ], [ - 1, - 1, 0 ], [ 1, 0, 1 ], [ - 1, 0, 1 ], [ 1, 0, - 1 ], [ - 1, 0, - 1 ], [ 0, 1, 1 ], [ 0, - 1, 1 ], [ 0, 1, - 1 ], [ 0, - 1, - 1 ]];
+			this.grad4 = [[ 0, 1, 1, 1 ], [ 0, 1, 1, - 1 ], [ 0, 1, - 1, 1 ], [ 0, 1, - 1, - 1 ], [ 0, - 1, 1, 1 ], [ 0, - 1, 1, - 1 ], [ 0, - 1, - 1, 1 ], [ 0, - 1, - 1, - 1 ], [ 1, 0, 1, 1 ], [ 1, 0, 1, - 1 ], [ 1, 0, - 1, 1 ], [ 1, 0, - 1, - 1 ], [ - 1, 0, 1, 1 ], [ - 1, 0, 1, - 1 ], [ - 1, 0, - 1, 1 ], [ - 1, 0, - 1, - 1 ], [ 1, 1, 0, 1 ], [ 1, 1, 0, - 1 ], [ 1, - 1, 0, 1 ], [ 1, - 1, 0, - 1 ], [ - 1, 1, 0, 1 ], [ - 1, 1, 0, - 1 ], [ - 1, - 1, 0, 1 ], [ - 1, - 1, 0, - 1 ], [ 1, 1, 1, 0 ], [ 1, 1, - 1, 0 ], [ 1, - 1, 1, 0 ], [ 1, - 1, - 1, 0 ], [ - 1, 1, 1, 0 ], [ - 1, 1, - 1, 0 ], [ - 1, - 1, 1, 0 ], [ - 1, - 1, - 1, 0 ]];
+			this.p = [];
 
-			this.p[ i ] = Math.floor( r.random() * 256 );
+			for ( let i = 0; i < 256; i ++ ) {
 
-		} // To remove the need for index wrapping, double the permutation table length
+				this.p[ i ] = Math.floor( r.random() * 256 );
 
+			} // To remove the need for index wrapping, double the permutation table length
 
-		this.perm = [];
 
-		for ( var i = 0; i < 512; i ++ ) {
+			this.perm = [];
 
-			this.perm[ i ] = this.p[ i & 255 ];
+			for ( let i = 0; i < 512; i ++ ) {
 
-		} // A lookup table to traverse the simplex around a given point in 4D.
-		// Details can be found where this table is used, in the 4D noise method.
+				this.perm[ i ] = this.p[ i & 255 ];
 
+			} // A lookup table to traverse the simplex around a given point in 4D.
+			// Details can be found where this table is used, in the 4D noise method.
 
-		this.simplex = [[ 0, 1, 2, 3 ], [ 0, 1, 3, 2 ], [ 0, 0, 0, 0 ], [ 0, 2, 3, 1 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 1, 2, 3, 0 ], [ 0, 2, 1, 3 ], [ 0, 0, 0, 0 ], [ 0, 3, 1, 2 ], [ 0, 3, 2, 1 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 1, 3, 2, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 1, 2, 0, 3 ], [ 0, 0, 0, 0 ], [ 1, 3, 0, 2 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 2, 3, 0, 1 ], [ 2, 3, 1, 0 ], [ 1, 0, 2, 3 ], [ 1, 0, 3, 2 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 2, 0, 3, 1 ], [ 0, 0, 0, 0 ], [ 2, 1, 3, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 2, 0, 1, 3 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 3, 0, 1, 2 ], [ 3, 0, 2, 1 ], [ 0, 0, 0, 0 ], [ 3, 1, 2, 0 ], [ 2, 1, 0, 3 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 3, 1, 0, 2 ], [ 0, 0, 0, 0 ], [ 3, 2, 0, 1 ], [ 3, 2, 1, 0 ]];
 
-	};
+			this.simplex = [[ 0, 1, 2, 3 ], [ 0, 1, 3, 2 ], [ 0, 0, 0, 0 ], [ 0, 2, 3, 1 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 1, 2, 3, 0 ], [ 0, 2, 1, 3 ], [ 0, 0, 0, 0 ], [ 0, 3, 1, 2 ], [ 0, 3, 2, 1 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 1, 3, 2, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 1, 2, 0, 3 ], [ 0, 0, 0, 0 ], [ 1, 3, 0, 2 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 2, 3, 0, 1 ], [ 2, 3, 1, 0 ], [ 1, 0, 2, 3 ], [ 1, 0, 3, 2 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 2, 0, 3, 1 ], [ 0, 0, 0, 0 ], [ 2, 1, 3, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 2, 0, 1, 3 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 3, 0, 1, 2 ], [ 3, 0, 2, 1 ], [ 0, 0, 0, 0 ], [ 3, 1, 2, 0 ], [ 2, 1, 0, 3 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 3, 1, 0, 2 ], [ 0, 0, 0, 0 ], [ 3, 2, 0, 1 ], [ 3, 2, 1, 0 ]];
 
-	SimplexNoise.prototype.dot = function ( g, x, y ) {
+		}
 
-		return g[ 0 ] * x + g[ 1 ] * y;
+		dot( g, x, y ) {
 
-	};
+			return g[ 0 ] * x + g[ 1 ] * y;
 
-	SimplexNoise.prototype.dot3 = function ( g, x, y, z ) {
+		}
 
-		return g[ 0 ] * x + g[ 1 ] * y + g[ 2 ] * z;
+		dot3( g, x, y, z ) {
 
-	};
+			return g[ 0 ] * x + g[ 1 ] * y + g[ 2 ] * z;
 
-	SimplexNoise.prototype.dot4 = function ( g, x, y, z, w ) {
+		}
 
-		return g[ 0 ] * x + g[ 1 ] * y + g[ 2 ] * z + g[ 3 ] * w;
+		dot4( g, x, y, z, w ) {
 
-	};
+			return g[ 0 ] * x + g[ 1 ] * y + g[ 2 ] * z + g[ 3 ] * w;
 
-	SimplexNoise.prototype.noise = function ( xin, yin ) {
+		}
 
-		var n0, n1, n2; // Noise contributions from the three corners
-		// Skew the input space to determine which simplex cell we're in
+		noise( xin, yin ) {
 
-		var F2 = 0.5 * ( Math.sqrt( 3.0 ) - 1.0 );
-		var s = ( xin + yin ) * F2; // Hairy factor for 2D
+			let n0; // Noise contributions from the three corners
 
-		var i = Math.floor( xin + s );
-		var j = Math.floor( yin + s );
-		var G2 = ( 3.0 - Math.sqrt( 3.0 ) ) / 6.0;
-		var t = ( i + j ) * G2;
-		var X0 = i - t; // Unskew the cell origin back to (x,y) space
+			let n1;
+			let n2; // Skew the input space to determine which simplex cell we're in
 
-		var Y0 = j - t;
-		var x0 = xin - X0; // The x,y distances from the cell origin
+			const F2 = 0.5 * ( Math.sqrt( 3.0 ) - 1.0 );
+			const s = ( xin + yin ) * F2; // Hairy factor for 2D
 
-		var y0 = yin - Y0; // For the 2D case, the simplex shape is an equilateral triangle.
-		// Determine which simplex we are in.
+			const i = Math.floor( xin + s );
+			const j = Math.floor( yin + s );
+			const G2 = ( 3.0 - Math.sqrt( 3.0 ) ) / 6.0;
+			const t = ( i + j ) * G2;
+			const X0 = i - t; // Unskew the cell origin back to (x,y) space
 
-		var i1, j1; // Offsets for second (middle) corner of simplex in (i,j) coords
+			const Y0 = j - t;
+			const x0 = xin - X0; // The x,y distances from the cell origin
 
-		if ( x0 > y0 ) {
+			const y0 = yin - Y0; // For the 2D case, the simplex shape is an equilateral triangle.
+			// Determine which simplex we are in.
 
-			i1 = 1;
-			j1 = 0; // lower triangle, XY order: (0,0)->(1,0)->(1,1)
+			let i1; // Offsets for second (middle) corner of simplex in (i,j) coords
 
-		} else {
+			let j1;
 
-			i1 = 0;
-			j1 = 1;
+			if ( x0 > y0 ) {
 
-		} // upper triangle, YX order: (0,0)->(0,1)->(1,1)
-		// A step of (1,0) in (i,j) means a step of (1-c,-c) in (x,y), and
-		// a step of (0,1) in (i,j) means a step of (-c,1-c) in (x,y), where
-		// c = (3-sqrt(3))/6
+				i1 = 1;
+				j1 = 0; // lower triangle, XY order: (0,0)->(1,0)->(1,1)
 
+			} else {
 
-		var x1 = x0 - i1 + G2; // Offsets for middle corner in (x,y) unskewed coords
+				i1 = 0;
+				j1 = 1;
 
-		var y1 = y0 - j1 + G2;
-		var x2 = x0 - 1.0 + 2.0 * G2; // Offsets for last corner in (x,y) unskewed coords
+			} // upper triangle, YX order: (0,0)->(0,1)->(1,1)
+			// A step of (1,0) in (i,j) means a step of (1-c,-c) in (x,y), and
+			// a step of (0,1) in (i,j) means a step of (-c,1-c) in (x,y), where
+			// c = (3-sqrt(3))/6
 
-		var y2 = y0 - 1.0 + 2.0 * G2; // Work out the hashed gradient indices of the three simplex corners
 
-		var ii = i & 255;
-		var jj = j & 255;
-		var gi0 = this.perm[ ii + this.perm[ jj ] ] % 12;
-		var gi1 = this.perm[ ii + i1 + this.perm[ jj + j1 ] ] % 12;
-		var gi2 = this.perm[ ii + 1 + this.perm[ jj + 1 ] ] % 12; // Calculate the contribution from the three corners
+			const x1 = x0 - i1 + G2; // Offsets for middle corner in (x,y) unskewed coords
 
-		var t0 = 0.5 - x0 * x0 - y0 * y0;
-		if ( t0 < 0 ) n0 = 0.0; else {
+			const y1 = y0 - j1 + G2;
+			const x2 = x0 - 1.0 + 2.0 * G2; // Offsets for last corner in (x,y) unskewed coords
 
-			t0 *= t0;
-			n0 = t0 * t0 * this.dot( this.grad3[ gi0 ], x0, y0 ); // (x,y) of grad3 used for 2D gradient
+			const y2 = y0 - 1.0 + 2.0 * G2; // Work out the hashed gradient indices of the three simplex corners
 
-		}
+			const ii = i & 255;
+			const jj = j & 255;
+			const gi0 = this.perm[ ii + this.perm[ jj ] ] % 12;
+			const gi1 = this.perm[ ii + i1 + this.perm[ jj + j1 ] ] % 12;
+			const gi2 = this.perm[ ii + 1 + this.perm[ jj + 1 ] ] % 12; // Calculate the contribution from the three corners
 
-		var t1 = 0.5 - x1 * x1 - y1 * y1;
-		if ( t1 < 0 ) n1 = 0.0; else {
+			let t0 = 0.5 - x0 * x0 - y0 * y0;
+			if ( t0 < 0 ) n0 = 0.0; else {
 
-			t1 *= t1;
-			n1 = t1 * t1 * this.dot( this.grad3[ gi1 ], x1, y1 );
+				t0 *= t0;
+				n0 = t0 * t0 * this.dot( this.grad3[ gi0 ], x0, y0 ); // (x,y) of grad3 used for 2D gradient
 
-		}
+			}
 
-		var t2 = 0.5 - x2 * x2 - y2 * y2;
-		if ( t2 < 0 ) n2 = 0.0; else {
+			let t1 = 0.5 - x1 * x1 - y1 * y1;
+			if ( t1 < 0 ) n1 = 0.0; else {
 
-			t2 *= t2;
-			n2 = t2 * t2 * this.dot( this.grad3[ gi2 ], x2, y2 );
+				t1 *= t1;
+				n1 = t1 * t1 * this.dot( this.grad3[ gi1 ], x1, y1 );
 
-		} // Add contributions from each corner to get the final noise value.
-		// The result is scaled to return values in the interval [-1,1].
+			}
 
-		return 70.0 * ( n0 + n1 + n2 );
+			let t2 = 0.5 - x2 * x2 - y2 * y2;
+			if ( t2 < 0 ) n2 = 0.0; else {
 
-	}; // 3D simplex noise
+				t2 *= t2;
+				n2 = t2 * t2 * this.dot( this.grad3[ gi2 ], x2, y2 );
 
+			} // Add contributions from each corner to get the final noise value.
+			// The result is scaled to return values in the interval [-1,1].
 
-	SimplexNoise.prototype.noise3d = function ( xin, yin, zin ) {
+			return 70.0 * ( n0 + n1 + n2 );
 
-		var n0, n1, n2, n3; // Noise contributions from the four corners
-		// Skew the input space to determine which simplex cell we're in
+		} // 3D simplex noise
 
-		var F3 = 1.0 / 3.0;
-		var s = ( xin + yin + zin ) * F3; // Very nice and simple skew factor for 3D
 
-		var i = Math.floor( xin + s );
-		var j = Math.floor( yin + s );
-		var k = Math.floor( zin + s );
-		var G3 = 1.0 / 6.0; // Very nice and simple unskew factor, too
+		noise3d( xin, yin, zin ) {
 
-		var t = ( i + j + k ) * G3;
-		var X0 = i - t; // Unskew the cell origin back to (x,y,z) space
+			let n0; // Noise contributions from the four corners
 
-		var Y0 = j - t;
-		var Z0 = k - t;
-		var x0 = xin - X0; // The x,y,z distances from the cell origin
+			let n1;
+			let n2;
+			let n3; // Skew the input space to determine which simplex cell we're in
 
-		var y0 = yin - Y0;
-		var z0 = zin - Z0; // For the 3D case, the simplex shape is a slightly irregular tetrahedron.
-		// Determine which simplex we are in.
+			const F3 = 1.0 / 3.0;
+			const s = ( xin + yin + zin ) * F3; // Very nice and simple skew factor for 3D
 
-		var i1, j1, k1; // Offsets for second corner of simplex in (i,j,k) coords
+			const i = Math.floor( xin + s );
+			const j = Math.floor( yin + s );
+			const k = Math.floor( zin + s );
+			const G3 = 1.0 / 6.0; // Very nice and simple unskew factor, too
 
-		var i2, j2, k2; // Offsets for third corner of simplex in (i,j,k) coords
+			const t = ( i + j + k ) * G3;
+			const X0 = i - t; // Unskew the cell origin back to (x,y,z) space
 
-		if ( x0 >= y0 ) {
+			const Y0 = j - t;
+			const Z0 = k - t;
+			const x0 = xin - X0; // The x,y,z distances from the cell origin
 
-			if ( y0 >= z0 ) {
+			const y0 = yin - Y0;
+			const z0 = zin - Z0; // For the 3D case, the simplex shape is a slightly irregular tetrahedron.
+			// Determine which simplex we are in.
 
-				i1 = 1;
-				j1 = 0;
-				k1 = 0;
-				i2 = 1;
-				j2 = 1;
-				k2 = 0; // X Y Z order
+			let i1; // Offsets for second corner of simplex in (i,j,k) coords
 
-			} else if ( x0 >= z0 ) {
+			let j1;
+			let k1;
+			let i2; // Offsets for third corner of simplex in (i,j,k) coords
 
-				i1 = 1;
-				j1 = 0;
-				k1 = 0;
-				i2 = 1;
-				j2 = 0;
-				k2 = 1; // X Z Y order
+			let j2;
+			let k2;
 
-			} else {
+			if ( x0 >= y0 ) {
 
-				i1 = 0;
-				j1 = 0;
-				k1 = 1;
-				i2 = 1;
-				j2 = 0;
-				k2 = 1;
+				if ( y0 >= z0 ) {
 
-			} // Z X Y order
+					i1 = 1;
+					j1 = 0;
+					k1 = 0;
+					i2 = 1;
+					j2 = 1;
+					k2 = 0; // X Y Z order
 
-		} else {
+				} else if ( x0 >= z0 ) {
 
-			// x0<y0
-			if ( y0 < z0 ) {
+					i1 = 1;
+					j1 = 0;
+					k1 = 0;
+					i2 = 1;
+					j2 = 0;
+					k2 = 1; // X Z Y order
 
-				i1 = 0;
-				j1 = 0;
-				k1 = 1;
-				i2 = 0;
-				j2 = 1;
-				k2 = 1; // Z Y X order
+				} else {
 
-			} else if ( x0 < z0 ) {
+					i1 = 0;
+					j1 = 0;
+					k1 = 1;
+					i2 = 1;
+					j2 = 0;
+					k2 = 1;
 
-				i1 = 0;
-				j1 = 1;
-				k1 = 0;
-				i2 = 0;
-				j2 = 1;
-				k2 = 1; // Y Z X order
+				} // Z X Y order
 
 			} else {
 
-				i1 = 0;
-				j1 = 1;
-				k1 = 0;
-				i2 = 1;
-				j2 = 1;
-				k2 = 0;
+				// x0<y0
+				if ( y0 < z0 ) {
 
-			} // Y X Z order
+					i1 = 0;
+					j1 = 0;
+					k1 = 1;
+					i2 = 0;
+					j2 = 1;
+					k2 = 1; // Z Y X order
 
-		} // A step of (1,0,0) in (i,j,k) means a step of (1-c,-c,-c) in (x,y,z),
-		// a step of (0,1,0) in (i,j,k) means a step of (-c,1-c,-c) in (x,y,z), and
-		// a step of (0,0,1) in (i,j,k) means a step of (-c,-c,1-c) in (x,y,z), where
-		// c = 1/6.
+				} else if ( x0 < z0 ) {
 
+					i1 = 0;
+					j1 = 1;
+					k1 = 0;
+					i2 = 0;
+					j2 = 1;
+					k2 = 1; // Y Z X order
 
-		var x1 = x0 - i1 + G3; // Offsets for second corner in (x,y,z) coords
+				} else {
 
-		var y1 = y0 - j1 + G3;
-		var z1 = z0 - k1 + G3;
-		var x2 = x0 - i2 + 2.0 * G3; // Offsets for third corner in (x,y,z) coords
+					i1 = 0;
+					j1 = 1;
+					k1 = 0;
+					i2 = 1;
+					j2 = 1;
+					k2 = 0;
 
-		var y2 = y0 - j2 + 2.0 * G3;
-		var z2 = z0 - k2 + 2.0 * G3;
-		var x3 = x0 - 1.0 + 3.0 * G3; // Offsets for last corner in (x,y,z) coords
+				} // Y X Z order
 
-		var y3 = y0 - 1.0 + 3.0 * G3;
-		var z3 = z0 - 1.0 + 3.0 * G3; // Work out the hashed gradient indices of the four simplex corners
+			} // A step of (1,0,0) in (i,j,k) means a step of (1-c,-c,-c) in (x,y,z),
+			// a step of (0,1,0) in (i,j,k) means a step of (-c,1-c,-c) in (x,y,z), and
+			// a step of (0,0,1) in (i,j,k) means a step of (-c,-c,1-c) in (x,y,z), where
+			// c = 1/6.
 
-		var ii = i & 255;
-		var jj = j & 255;
-		var kk = k & 255;
-		var gi0 = this.perm[ ii + this.perm[ jj + this.perm[ kk ] ] ] % 12;
-		var gi1 = this.perm[ ii + i1 + this.perm[ jj + j1 + this.perm[ kk + k1 ] ] ] % 12;
-		var gi2 = this.perm[ ii + i2 + this.perm[ jj + j2 + this.perm[ kk + k2 ] ] ] % 12;
-		var gi3 = this.perm[ ii + 1 + this.perm[ jj + 1 + this.perm[ kk + 1 ] ] ] % 12; // Calculate the contribution from the four corners
 
-		var t0 = 0.6 - x0 * x0 - y0 * y0 - z0 * z0;
-		if ( t0 < 0 ) n0 = 0.0; else {
+			const x1 = x0 - i1 + G3; // Offsets for second corner in (x,y,z) coords
 
-			t0 *= t0;
-			n0 = t0 * t0 * this.dot3( this.grad3[ gi0 ], x0, y0, z0 );
+			const y1 = y0 - j1 + G3;
+			const z1 = z0 - k1 + G3;
+			const x2 = x0 - i2 + 2.0 * G3; // Offsets for third corner in (x,y,z) coords
 
-		}
+			const y2 = y0 - j2 + 2.0 * G3;
+			const z2 = z0 - k2 + 2.0 * G3;
+			const x3 = x0 - 1.0 + 3.0 * G3; // Offsets for last corner in (x,y,z) coords
 
-		var t1 = 0.6 - x1 * x1 - y1 * y1 - z1 * z1;
-		if ( t1 < 0 ) n1 = 0.0; else {
+			const y3 = y0 - 1.0 + 3.0 * G3;
+			const z3 = z0 - 1.0 + 3.0 * G3; // Work out the hashed gradient indices of the four simplex corners
 
-			t1 *= t1;
-			n1 = t1 * t1 * this.dot3( this.grad3[ gi1 ], x1, y1, z1 );
+			const ii = i & 255;
+			const jj = j & 255;
+			const kk = k & 255;
+			const gi0 = this.perm[ ii + this.perm[ jj + this.perm[ kk ] ] ] % 12;
+			const gi1 = this.perm[ ii + i1 + this.perm[ jj + j1 + this.perm[ kk + k1 ] ] ] % 12;
+			const gi2 = this.perm[ ii + i2 + this.perm[ jj + j2 + this.perm[ kk + k2 ] ] ] % 12;
+			const gi3 = this.perm[ ii + 1 + this.perm[ jj + 1 + this.perm[ kk + 1 ] ] ] % 12; // Calculate the contribution from the four corners
 
-		}
+			let t0 = 0.6 - x0 * x0 - y0 * y0 - z0 * z0;
+			if ( t0 < 0 ) n0 = 0.0; else {
 
-		var t2 = 0.6 - x2 * x2 - y2 * y2 - z2 * z2;
-		if ( t2 < 0 ) n2 = 0.0; else {
+				t0 *= t0;
+				n0 = t0 * t0 * this.dot3( this.grad3[ gi0 ], x0, y0, z0 );
 
-			t2 *= t2;
-			n2 = t2 * t2 * this.dot3( this.grad3[ gi2 ], x2, y2, z2 );
+			}
 
-		}
+			let t1 = 0.6 - x1 * x1 - y1 * y1 - z1 * z1;
+			if ( t1 < 0 ) n1 = 0.0; else {
 
-		var t3 = 0.6 - x3 * x3 - y3 * y3 - z3 * z3;
-		if ( t3 < 0 ) n3 = 0.0; else {
-
-			t3 *= t3;
-			n3 = t3 * t3 * this.dot3( this.grad3[ gi3 ], x3, y3, z3 );
+				t1 *= t1;
+				n1 = t1 * t1 * this.dot3( this.grad3[ gi1 ], x1, y1, z1 );
 
-		} // Add contributions from each corner to get the final noise value.
-		// The result is scaled to stay just inside [-1,1]
-
-		return 32.0 * ( n0 + n1 + n2 + n3 );
-
-	}; // 4D simplex noise
-
-
-	SimplexNoise.prototype.noise4d = function ( x, y, z, w ) {
-
-		// For faster and easier lookups
-		var grad4 = this.grad4;
-		var simplex = this.simplex;
-		var perm = this.perm; // The skewing and unskewing factors are hairy again for the 4D case
-
-		var F4 = ( Math.sqrt( 5.0 ) - 1.0 ) / 4.0;
-		var G4 = ( 5.0 - Math.sqrt( 5.0 ) ) / 20.0;
-		var n0, n1, n2, n3, n4; // Noise contributions from the five corners
-		// Skew the (x,y,z,w) space to determine which cell of 24 simplices we're in
-
-		var s = ( x + y + z + w ) * F4; // Factor for 4D skewing
-
-		var i = Math.floor( x + s );
-		var j = Math.floor( y + s );
-		var k = Math.floor( z + s );
-		var l = Math.floor( w + s );
-		var t = ( i + j + k + l ) * G4; // Factor for 4D unskewing
-
-		var X0 = i - t; // Unskew the cell origin back to (x,y,z,w) space
-
-		var Y0 = j - t;
-		var Z0 = k - t;
-		var W0 = l - t;
-		var x0 = x - X0; // The x,y,z,w distances from the cell origin
-
-		var y0 = y - Y0;
-		var z0 = z - Z0;
-		var w0 = w - W0; // For the 4D case, the simplex is a 4D shape I won't even try to describe.
-		// To find out which of the 24 possible simplices we're in, we need to
-		// determine the magnitude ordering of x0, y0, z0 and w0.
-		// The method below is a good way of finding the ordering of x,y,z,w and
-		// then find the correct traversal order for the simplex we’re in.
-		// First, six pair-wise comparisons are performed between each possible pair
-		// of the four coordinates, and the results are used to add up binary bits
-		// for an integer index.
-
-		var c1 = x0 > y0 ? 32 : 0;
-		var c2 = x0 > z0 ? 16 : 0;
-		var c3 = y0 > z0 ? 8 : 0;
-		var c4 = x0 > w0 ? 4 : 0;
-		var c5 = y0 > w0 ? 2 : 0;
-		var c6 = z0 > w0 ? 1 : 0;
-		var c = c1 + c2 + c3 + c4 + c5 + c6;
-		var i1, j1, k1, l1; // The integer offsets for the second simplex corner
-
-		var i2, j2, k2, l2; // The integer offsets for the third simplex corner
-
-		var i3, j3, k3, l3; // The integer offsets for the fourth simplex corner
-		// simplex[c] is a 4-vector with the numbers 0, 1, 2 and 3 in some order.
-		// Many values of c will never occur, since e.g. x>y>z>w makes x<z, y<w and x<w
-		// impossible. Only the 24 indices which have non-zero entries make any sense.
-		// We use a thresholding to set the coordinates in turn from the largest magnitude.
-		// The number 3 in the "simplex" array is at the position of the largest coordinate.
-
-		i1 = simplex[ c ][ 0 ] >= 3 ? 1 : 0;
-		j1 = simplex[ c ][ 1 ] >= 3 ? 1 : 0;
-		k1 = simplex[ c ][ 2 ] >= 3 ? 1 : 0;
-		l1 = simplex[ c ][ 3 ] >= 3 ? 1 : 0; // The number 2 in the "simplex" array is at the second largest coordinate.
-
-		i2 = simplex[ c ][ 0 ] >= 2 ? 1 : 0;
-		j2 = simplex[ c ][ 1 ] >= 2 ? 1 : 0;
-		k2 = simplex[ c ][ 2 ] >= 2 ? 1 : 0;
-		l2 = simplex[ c ][ 3 ] >= 2 ? 1 : 0; // The number 1 in the "simplex" array is at the second smallest coordinate.
-
-		i3 = simplex[ c ][ 0 ] >= 1 ? 1 : 0;
-		j3 = simplex[ c ][ 1 ] >= 1 ? 1 : 0;
-		k3 = simplex[ c ][ 2 ] >= 1 ? 1 : 0;
-		l3 = simplex[ c ][ 3 ] >= 1 ? 1 : 0; // The fifth corner has all coordinate offsets = 1, so no need to look that up.
-
-		var x1 = x0 - i1 + G4; // Offsets for second corner in (x,y,z,w) coords
-
-		var y1 = y0 - j1 + G4;
-		var z1 = z0 - k1 + G4;
-		var w1 = w0 - l1 + G4;
-		var x2 = x0 - i2 + 2.0 * G4; // Offsets for third corner in (x,y,z,w) coords
-
-		var y2 = y0 - j2 + 2.0 * G4;
-		var z2 = z0 - k2 + 2.0 * G4;
-		var w2 = w0 - l2 + 2.0 * G4;
-		var x3 = x0 - i3 + 3.0 * G4; // Offsets for fourth corner in (x,y,z,w) coords
-
-		var y3 = y0 - j3 + 3.0 * G4;
-		var z3 = z0 - k3 + 3.0 * G4;
-		var w3 = w0 - l3 + 3.0 * G4;
-		var x4 = x0 - 1.0 + 4.0 * G4; // Offsets for last corner in (x,y,z,w) coords
-
-		var y4 = y0 - 1.0 + 4.0 * G4;
-		var z4 = z0 - 1.0 + 4.0 * G4;
-		var w4 = w0 - 1.0 + 4.0 * G4; // Work out the hashed gradient indices of the five simplex corners
-
-		var ii = i & 255;
-		var jj = j & 255;
-		var kk = k & 255;
-		var ll = l & 255;
-		var gi0 = perm[ ii + perm[ jj + perm[ kk + perm[ ll ] ] ] ] % 32;
-		var gi1 = perm[ ii + i1 + perm[ jj + j1 + perm[ kk + k1 + perm[ ll + l1 ] ] ] ] % 32;
-		var gi2 = perm[ ii + i2 + perm[ jj + j2 + perm[ kk + k2 + perm[ ll + l2 ] ] ] ] % 32;
-		var gi3 = perm[ ii + i3 + perm[ jj + j3 + perm[ kk + k3 + perm[ ll + l3 ] ] ] ] % 32;
-		var gi4 = perm[ ii + 1 + perm[ jj + 1 + perm[ kk + 1 + perm[ ll + 1 ] ] ] ] % 32; // Calculate the contribution from the five corners
-
-		var t0 = 0.6 - x0 * x0 - y0 * y0 - z0 * z0 - w0 * w0;
-		if ( t0 < 0 ) n0 = 0.0; else {
-
-			t0 *= t0;
-			n0 = t0 * t0 * this.dot4( grad4[ gi0 ], x0, y0, z0, w0 );
+			}
 
-		}
+			let t2 = 0.6 - x2 * x2 - y2 * y2 - z2 * z2;
+			if ( t2 < 0 ) n2 = 0.0; else {
 
-		var t1 = 0.6 - x1 * x1 - y1 * y1 - z1 * z1 - w1 * w1;
-		if ( t1 < 0 ) n1 = 0.0; else {
+				t2 *= t2;
+				n2 = t2 * t2 * this.dot3( this.grad3[ gi2 ], x2, y2, z2 );
 
-			t1 *= t1;
-			n1 = t1 * t1 * this.dot4( grad4[ gi1 ], x1, y1, z1, w1 );
+			}
 
-		}
+			let t3 = 0.6 - x3 * x3 - y3 * y3 - z3 * z3;
+			if ( t3 < 0 ) n3 = 0.0; else {
 
-		var t2 = 0.6 - x2 * x2 - y2 * y2 - z2 * z2 - w2 * w2;
-		if ( t2 < 0 ) n2 = 0.0; else {
+				t3 *= t3;
+				n3 = t3 * t3 * this.dot3( this.grad3[ gi3 ], x3, y3, z3 );
 
-			t2 *= t2;
-			n2 = t2 * t2 * this.dot4( grad4[ gi2 ], x2, y2, z2, w2 );
+			} // Add contributions from each corner to get the final noise value.
+			// The result is scaled to stay just inside [-1,1]
 
-		}
+			return 32.0 * ( n0 + n1 + n2 + n3 );
 
-		var t3 = 0.6 - x3 * x3 - y3 * y3 - z3 * z3 - w3 * w3;
-		if ( t3 < 0 ) n3 = 0.0; else {
+		} // 4D simplex noise
 
-			t3 *= t3;
-			n3 = t3 * t3 * this.dot4( grad4[ gi3 ], x3, y3, z3, w3 );
 
-		}
+		noise4d( x, y, z, w ) {
+
+			// For faster and easier lookups
+			const grad4 = this.grad4;
+			const simplex = this.simplex;
+			const perm = this.perm; // The skewing and unskewing factors are hairy again for the 4D case
+
+			const F4 = ( Math.sqrt( 5.0 ) - 1.0 ) / 4.0;
+			const G4 = ( 5.0 - Math.sqrt( 5.0 ) ) / 20.0;
+			let n0; // Noise contributions from the five corners
 
-		var t4 = 0.6 - x4 * x4 - y4 * y4 - z4 * z4 - w4 * w4;
-		if ( t4 < 0 ) n4 = 0.0; else {
+			let n1;
+			let n2;
+			let n3;
+			let n4; // Skew the (x,y,z,w) space to determine which cell of 24 simplices we're in
 
-			t4 *= t4;
-			n4 = t4 * t4 * this.dot4( grad4[ gi4 ], x4, y4, z4, w4 );
+			const s = ( x + y + z + w ) * F4; // Factor for 4D skewing
 
-		} // Sum up and scale the result to cover the range [-1,1]
+			const i = Math.floor( x + s );
+			const j = Math.floor( y + s );
+			const k = Math.floor( z + s );
+			const l = Math.floor( w + s );
+			const t = ( i + j + k + l ) * G4; // Factor for 4D unskewing
 
-		return 27.0 * ( n0 + n1 + n2 + n3 + n4 );
+			const X0 = i - t; // Unskew the cell origin back to (x,y,z,w) space
+
+			const Y0 = j - t;
+			const Z0 = k - t;
+			const W0 = l - t;
+			const x0 = x - X0; // The x,y,z,w distances from the cell origin
+
+			const y0 = y - Y0;
+			const z0 = z - Z0;
+			const w0 = w - W0; // For the 4D case, the simplex is a 4D shape I won't even try to describe.
+			// To find out which of the 24 possible simplices we're in, we need to
+			// determine the magnitude ordering of x0, y0, z0 and w0.
+			// The method below is a good way of finding the ordering of x,y,z,w and
+			// then find the correct traversal order for the simplex we’re in.
+			// First, six pair-wise comparisons are performed between each possible pair
+			// of the four coordinates, and the results are used to add up binary bits
+			// for an integer index.
+
+			const c1 = x0 > y0 ? 32 : 0;
+			const c2 = x0 > z0 ? 16 : 0;
+			const c3 = y0 > z0 ? 8 : 0;
+			const c4 = x0 > w0 ? 4 : 0;
+			const c5 = y0 > w0 ? 2 : 0;
+			const c6 = z0 > w0 ? 1 : 0;
+			const c = c1 + c2 + c3 + c4 + c5 + c6; // simplex[c] is a 4-vector with the numbers 0, 1, 2 and 3 in some order.
+			// Many values of c will never occur, since e.g. x>y>z>w makes x<z, y<w and x<w
+			// impossible. Only the 24 indices which have non-zero entries make any sense.
+			// We use a thresholding to set the coordinates in turn from the largest magnitude.
+			// The number 3 in the "simplex" array is at the position of the largest coordinate.
+
+			const i1 = simplex[ c ][ 0 ] >= 3 ? 1 : 0;
+			const j1 = simplex[ c ][ 1 ] >= 3 ? 1 : 0;
+			const k1 = simplex[ c ][ 2 ] >= 3 ? 1 : 0;
+			const l1 = simplex[ c ][ 3 ] >= 3 ? 1 : 0; // The number 2 in the "simplex" array is at the second largest coordinate.
+
+			const i2 = simplex[ c ][ 0 ] >= 2 ? 1 : 0;
+			const j2 = simplex[ c ][ 1 ] >= 2 ? 1 : 0;
+			const k2 = simplex[ c ][ 2 ] >= 2 ? 1 : 0;
+			const l2 = simplex[ c ][ 3 ] >= 2 ? 1 : 0; // The number 1 in the "simplex" array is at the second smallest coordinate.
+
+			const i3 = simplex[ c ][ 0 ] >= 1 ? 1 : 0;
+			const j3 = simplex[ c ][ 1 ] >= 1 ? 1 : 0;
+			const k3 = simplex[ c ][ 2 ] >= 1 ? 1 : 0;
+			const l3 = simplex[ c ][ 3 ] >= 1 ? 1 : 0; // The fifth corner has all coordinate offsets = 1, so no need to look that up.
+
+			const x1 = x0 - i1 + G4; // Offsets for second corner in (x,y,z,w) coords
+
+			const y1 = y0 - j1 + G4;
+			const z1 = z0 - k1 + G4;
+			const w1 = w0 - l1 + G4;
+			const x2 = x0 - i2 + 2.0 * G4; // Offsets for third corner in (x,y,z,w) coords
+
+			const y2 = y0 - j2 + 2.0 * G4;
+			const z2 = z0 - k2 + 2.0 * G4;
+			const w2 = w0 - l2 + 2.0 * G4;
+			const x3 = x0 - i3 + 3.0 * G4; // Offsets for fourth corner in (x,y,z,w) coords
+
+			const y3 = y0 - j3 + 3.0 * G4;
+			const z3 = z0 - k3 + 3.0 * G4;
+			const w3 = w0 - l3 + 3.0 * G4;
+			const x4 = x0 - 1.0 + 4.0 * G4; // Offsets for last corner in (x,y,z,w) coords
+
+			const y4 = y0 - 1.0 + 4.0 * G4;
+			const z4 = z0 - 1.0 + 4.0 * G4;
+			const w4 = w0 - 1.0 + 4.0 * G4; // Work out the hashed gradient indices of the five simplex corners
+
+			const ii = i & 255;
+			const jj = j & 255;
+			const kk = k & 255;
+			const ll = l & 255;
+			const gi0 = perm[ ii + perm[ jj + perm[ kk + perm[ ll ] ] ] ] % 32;
+			const gi1 = perm[ ii + i1 + perm[ jj + j1 + perm[ kk + k1 + perm[ ll + l1 ] ] ] ] % 32;
+			const gi2 = perm[ ii + i2 + perm[ jj + j2 + perm[ kk + k2 + perm[ ll + l2 ] ] ] ] % 32;
+			const gi3 = perm[ ii + i3 + perm[ jj + j3 + perm[ kk + k3 + perm[ ll + l3 ] ] ] ] % 32;
+			const gi4 = perm[ ii + 1 + perm[ jj + 1 + perm[ kk + 1 + perm[ ll + 1 ] ] ] ] % 32; // Calculate the contribution from the five corners
+
+			let t0 = 0.6 - x0 * x0 - y0 * y0 - z0 * z0 - w0 * w0;
+			if ( t0 < 0 ) n0 = 0.0; else {
+
+				t0 *= t0;
+				n0 = t0 * t0 * this.dot4( grad4[ gi0 ], x0, y0, z0, w0 );
+
+			}
+
+			let t1 = 0.6 - x1 * x1 - y1 * y1 - z1 * z1 - w1 * w1;
+			if ( t1 < 0 ) n1 = 0.0; else {
+
+				t1 *= t1;
+				n1 = t1 * t1 * this.dot4( grad4[ gi1 ], x1, y1, z1, w1 );
+
+			}
+
+			let t2 = 0.6 - x2 * x2 - y2 * y2 - z2 * z2 - w2 * w2;
+			if ( t2 < 0 ) n2 = 0.0; else {
+
+				t2 *= t2;
+				n2 = t2 * t2 * this.dot4( grad4[ gi2 ], x2, y2, z2, w2 );
+
+			}
+
+			let t3 = 0.6 - x3 * x3 - y3 * y3 - z3 * z3 - w3 * w3;
+			if ( t3 < 0 ) n3 = 0.0; else {
+
+				t3 *= t3;
+				n3 = t3 * t3 * this.dot4( grad4[ gi3 ], x3, y3, z3, w3 );
+
+			}
+
+			let t4 = 0.6 - x4 * x4 - y4 * y4 - z4 * z4 - w4 * w4;
+			if ( t4 < 0 ) n4 = 0.0; else {
+
+				t4 *= t4;
+				n4 = t4 * t4 * this.dot4( grad4[ gi4 ], x4, y4, z4, w4 );
+
+			} // Sum up and scale the result to cover the range [-1,1]
+
+			return 27.0 * ( n0 + n1 + n2 + n3 + n4 );
+
+		}
 
-	};
+	}
 
 	THREE.SimplexNoise = SimplexNoise;
 

+ 32 - 37
examples/jsm/math/ColorConverter.js

@@ -2,9 +2,11 @@ import {
 	MathUtils
 } from '../../../build/three.module.js';
 
-var ColorConverter = {
+const _hsl = {};
 
-	setHSV: function ( color, h, s, v ) {
+class ColorConverter {
+
+	static setHSV( color, h, s, v ) {
 
 		// https://gist.github.com/xpansive/1337890#file-index-js
 
@@ -14,49 +16,43 @@ var ColorConverter = {
 
 		return color.setHSL( h, ( s * v ) / ( ( h = ( 2 - s ) * v ) < 1 ? h : ( 2 - h ) ), h * 0.5 );
 
-	},
-
-	getHSV: function () {
-
-		var hsl = {};
-
-		return function getHSV( color, target ) {
+	}
 
-			if ( target === undefined ) {
+	static getHSV( color, target ) {
 
-				console.warn( 'THREE.ColorConverter: .getHSV() target is now required' );
-				target = { h: 0, s: 0, l: 0 };
+		if ( target === undefined ) {
 
-			}
+			console.warn( 'THREE.ColorConverter: .getHSV() target is now required' );
+			target = { h: 0, s: 0, l: 0 };
 
-			color.getHSL( hsl );
+		}
 
-			// based on https://gist.github.com/xpansive/1337890#file-index-js
-			hsl.s *= ( hsl.l < 0.5 ) ? hsl.l : ( 1 - hsl.l );
+		color.getHSL( _hsl );
 
-			target.h = hsl.h;
-			target.s = 2 * hsl.s / ( hsl.l + hsl.s );
-			target.v = hsl.l + hsl.s;
+		// based on https://gist.github.com/xpansive/1337890#file-index-js
+		_hsl.s *= ( _hsl.l < 0.5 ) ? _hsl.l : ( 1 - _hsl.l );
 
-			return target;
+		target.h = _hsl.h;
+		target.s = 2 * _hsl.s / ( _hsl.l + _hsl.s );
+		target.v = _hsl.l + _hsl.s;
 
-		};
+		return target;
 
-	}(),
+	}
 
 	// where c, m, y, k is between 0 and 1
 
-	setCMYK: function ( color, c, m, y, k ) {
+	static setCMYK( color, c, m, y, k ) {
 
-		var r = ( 1 - c ) * ( 1 - k );
-		var g = ( 1 - m ) * ( 1 - k );
-		var b = ( 1 - y ) * ( 1 - k );
+		const r = ( 1 - c ) * ( 1 - k );
+		const g = ( 1 - m ) * ( 1 - k );
+		const b = ( 1 - y ) * ( 1 - k );
 
 		return color.setRGB( r, g, b );
 
-	},
+	}
 
-	getCMYK: function ( color, target ) {
+	static getCMYK( color, target ) {
 
 		if ( target === undefined ) {
 
@@ -65,14 +61,14 @@ var ColorConverter = {
 
 		}
 
-		var r = color.r;
-		var g = color.g;
-		var b = color.b;
+		const r = color.r;
+		const g = color.g;
+		const b = color.b;
 
-		var k = 1 - Math.max( r, g, b );
-		var c = ( 1 - r - k ) / ( 1 - k );
-		var m = ( 1 - g - k ) / ( 1 - k );
-		var y = ( 1 - b - k ) / ( 1 - k );
+		const k = 1 - Math.max( r, g, b );
+		const c = ( 1 - r - k ) / ( 1 - k );
+		const m = ( 1 - g - k ) / ( 1 - k );
+		const y = ( 1 - b - k ) / ( 1 - k );
 
 		target.c = c;
 		target.m = m;
@@ -83,7 +79,6 @@ var ColorConverter = {
 
 	}
 
-
-};
+}
 
 export { ColorConverter };

File diff suppressed because it is too large
+ 465 - 480
examples/jsm/math/ConvexHull.js


+ 44 - 47
examples/jsm/math/ImprovedNoise.js

@@ -1,74 +1,71 @@
 // http://mrl.nyu.edu/~perlin/noise/
 
-var ImprovedNoise = function () {
+const _p = [ 151, 160, 137, 91, 90, 15, 131, 13, 201, 95, 96, 53, 194, 233, 7, 225, 140, 36, 103, 30, 69, 142, 8, 99, 37, 240, 21, 10,
+	 23, 190, 6, 148, 247, 120, 234, 75, 0, 26, 197, 62, 94, 252, 219, 203, 117, 35, 11, 32, 57, 177, 33, 88, 237, 149, 56, 87,
+	 174, 20, 125, 136, 171, 168, 68, 175, 74, 165, 71, 134, 139, 48, 27, 166, 77, 146, 158, 231, 83, 111, 229, 122, 60, 211,
+	 133, 230, 220, 105, 92, 41, 55, 46, 245, 40, 244, 102, 143, 54, 65, 25, 63, 161, 1, 216, 80, 73, 209, 76, 132, 187, 208,
+	 89, 18, 169, 200, 196, 135, 130, 116, 188, 159, 86, 164, 100, 109, 198, 173, 186, 3, 64, 52, 217, 226, 250, 124, 123, 5,
+	 202, 38, 147, 118, 126, 255, 82, 85, 212, 207, 206, 59, 227, 47, 16, 58, 17, 182, 189, 28, 42, 223, 183, 170, 213, 119,
+	 248, 152, 2, 44, 154, 163, 70, 221, 153, 101, 155, 167, 43, 172, 9, 129, 22, 39, 253, 19, 98, 108, 110, 79, 113, 224, 232,
+	 178, 185, 112, 104, 218, 246, 97, 228, 251, 34, 242, 193, 238, 210, 144, 12, 191, 179, 162, 241, 81, 51, 145, 235, 249,
+	 14, 239, 107, 49, 192, 214, 31, 181, 199, 106, 157, 184, 84, 204, 176, 115, 121, 50, 45, 127, 4, 150, 254, 138, 236, 205,
+	 93, 222, 114, 67, 29, 24, 72, 243, 141, 128, 195, 78, 66, 215, 61, 156, 180 ];
 
-	var p = [ 151, 160, 137, 91, 90, 15, 131, 13, 201, 95, 96, 53, 194, 233, 7, 225, 140, 36, 103, 30, 69, 142, 8, 99, 37, 240, 21, 10,
-		 23, 190, 6, 148, 247, 120, 234, 75, 0, 26, 197, 62, 94, 252, 219, 203, 117, 35, 11, 32, 57, 177, 33, 88, 237, 149, 56, 87,
-		 174, 20, 125, 136, 171, 168, 68, 175, 74, 165, 71, 134, 139, 48, 27, 166, 77, 146, 158, 231, 83, 111, 229, 122, 60, 211,
-		 133, 230, 220, 105, 92, 41, 55, 46, 245, 40, 244, 102, 143, 54, 65, 25, 63, 161, 1, 216, 80, 73, 209, 76, 132, 187, 208,
-		 89, 18, 169, 200, 196, 135, 130, 116, 188, 159, 86, 164, 100, 109, 198, 173, 186, 3, 64, 52, 217, 226, 250, 124, 123, 5,
-		 202, 38, 147, 118, 126, 255, 82, 85, 212, 207, 206, 59, 227, 47, 16, 58, 17, 182, 189, 28, 42, 223, 183, 170, 213, 119,
-		 248, 152, 2, 44, 154, 163, 70, 221, 153, 101, 155, 167, 43, 172, 9, 129, 22, 39, 253, 19, 98, 108, 110, 79, 113, 224, 232,
-		 178, 185, 112, 104, 218, 246, 97, 228, 251, 34, 242, 193, 238, 210, 144, 12, 191, 179, 162, 241, 81, 51, 145, 235, 249,
-		 14, 239, 107, 49, 192, 214, 31, 181, 199, 106, 157, 184, 84, 204, 176, 115, 121, 50, 45, 127, 4, 150, 254, 138, 236, 205,
-		 93, 222, 114, 67, 29, 24, 72, 243, 141, 128, 195, 78, 66, 215, 61, 156, 180 ];
+for ( let i = 0; i < 256; i ++ ) {
 
-	for ( var i = 0; i < 256; i ++ ) {
+	_p[ 256 + i ] = _p[ i ];
 
-		p[ 256 + i ] = p[ i ];
+}
 
-	}
-
-	function fade( t ) {
+function fade( t ) {
 
-		return t * t * t * ( t * ( t * 6 - 15 ) + 10 );
+	return t * t * t * ( t * ( t * 6 - 15 ) + 10 );
 
-	}
+}
 
-	function lerp( t, a, b ) {
+function lerp( t, a, b ) {
 
-		return a + t * ( b - a );
+	return a + t * ( b - a );
 
-	}
+}
 
-	function grad( hash, x, y, z ) {
+function grad( hash, x, y, z ) {
 
-		var h = hash & 15;
-		var u = h < 8 ? x : y, v = h < 4 ? y : h == 12 || h == 14 ? x : z;
-		return ( ( h & 1 ) == 0 ? u : - u ) + ( ( h & 2 ) == 0 ? v : - v );
+	const h = hash & 15;
+	const u = h < 8 ? x : y, v = h < 4 ? y : h == 12 || h == 14 ? x : z;
+	return ( ( h & 1 ) == 0 ? u : - u ) + ( ( h & 2 ) == 0 ? v : - v );
 
-	}
+}
 
-	return {
+class ImprovedNoise {
 
-		noise: function ( x, y, z ) {
+	noise( x, y, z ) {
 
-			var floorX = Math.floor( x ), floorY = Math.floor( y ), floorZ = Math.floor( z );
+		const floorX = Math.floor( x ), floorY = Math.floor( y ), floorZ = Math.floor( z );
 
-			var X = floorX & 255, Y = floorY & 255, Z = floorZ & 255;
+		const X = floorX & 255, Y = floorY & 255, Z = floorZ & 255;
 
-			x -= floorX;
-			y -= floorY;
-			z -= floorZ;
+		x -= floorX;
+		y -= floorY;
+		z -= floorZ;
 
-			var xMinus1 = x - 1, yMinus1 = y - 1, zMinus1 = z - 1;
+		const xMinus1 = x - 1, yMinus1 = y - 1, zMinus1 = z - 1;
 
-			var u = fade( x ), v = fade( y ), w = fade( z );
+		const u = fade( x ), v = fade( y ), w = fade( z );
 
-			var A = p[ X ] + Y, AA = p[ A ] + Z, AB = p[ A + 1 ] + Z, B = p[ X + 1 ] + Y, BA = p[ B ] + Z, BB = p[ B + 1 ] + Z;
+		const A = _p[ X ] + Y, AA = _p[ A ] + Z, AB = _p[ A + 1 ] + Z, B = _p[ X + 1 ] + Y, BA = _p[ B ] + Z, BB = _p[ B + 1 ] + Z;
 
-			return lerp( w, lerp( v, lerp( u, grad( p[ AA ], x, y, z ),
-				grad( p[ BA ], xMinus1, y, z ) ),
-			lerp( u, grad( p[ AB ], x, yMinus1, z ),
-				grad( p[ BB ], xMinus1, yMinus1, z ) ) ),
-			lerp( v, lerp( u, grad( p[ AA + 1 ], x, y, zMinus1 ),
-				grad( p[ BA + 1 ], xMinus1, y, zMinus1 ) ),
-			lerp( u, grad( p[ AB + 1 ], x, yMinus1, zMinus1 ),
-				grad( p[ BB + 1 ], xMinus1, yMinus1, zMinus1 ) ) ) );
+		return lerp( w, lerp( v, lerp( u, grad( _p[ AA ], x, y, z ),
+			grad( _p[ BA ], xMinus1, y, z ) ),
+		lerp( u, grad( _p[ AB ], x, yMinus1, z ),
+			grad( _p[ BB ], xMinus1, yMinus1, z ) ) ),
+		lerp( v, lerp( u, grad( _p[ AA + 1 ], x, y, zMinus1 ),
+			grad( _p[ BA + 1 ], xMinus1, y, zMinus1 ) ),
+		lerp( u, grad( _p[ AB + 1 ], x, yMinus1, zMinus1 ),
+			grad( _p[ BB + 1 ], xMinus1, yMinus1, zMinus1 ) ) ) );
 
-		}
-	};
+	}
 
-};
+}
 
 export { ImprovedNoise };

+ 55 - 52
examples/jsm/math/Lut.js

@@ -2,21 +2,16 @@ import {
 	Color
 } from '../../../build/three.module.js';
 
-var Lut = function ( colormap, numberofcolors ) {
+class Lut {
 
-	this.lut = [];
-	this.setColorMap( colormap, numberofcolors );
-	return this;
+ 	constructor( colormap, numberofcolors ) {
 
-};
-
-Lut.prototype = {
+		this.lut = [];
+		this.setColorMap( colormap, numberofcolors );
 
-	constructor: Lut,
-
-	lut: [], map: [], n: 256, minV: 0, maxV: 1,
+	}
 
-	set: function ( value ) {
+	set( value ) {
 
 		if ( value instanceof Lut ) {
 
@@ -26,45 +21,46 @@ Lut.prototype = {
 
 		return this;
 
-	},
+	}
 
-	setMin: function ( min ) {
+	setMin( min ) {
 
 		this.minV = min;
 
 		return this;
 
-	},
+	}
 
-	setMax: function ( max ) {
+	setMax( max ) {
 
 		this.maxV = max;
 
 		return this;
 
-	},
+	}
 
-	setColorMap: function ( colormap, numberofcolors ) {
+	setColorMap( colormap, numberofcolors = 32 ) {
 
 		this.map = ColorMapKeywords[ colormap ] || ColorMapKeywords.rainbow;
-		this.n = numberofcolors || 32;
+		this.n = numberofcolors;
 
-		var step = 1.0 / this.n;
+		const step = 1.0 / this.n;
 
 		this.lut.length = 0;
-		for ( var i = 0; i <= 1; i += step ) {
 
-			for ( var j = 0; j < this.map.length - 1; j ++ ) {
+		for ( let i = 0; i <= 1; i += step ) {
+
+			for ( let j = 0; j < this.map.length - 1; j ++ ) {
 
 				if ( i >= this.map[ j ][ 0 ] && i < this.map[ j + 1 ][ 0 ] ) {
 
-					var min = this.map[ j ][ 0 ];
-					var max = this.map[ j + 1 ][ 0 ];
+					const min = this.map[ j ][ 0 ];
+					const max = this.map[ j + 1 ][ 0 ];
 
-					var minColor = new Color( this.map[ j ][ 1 ] );
-					var maxColor = new Color( this.map[ j + 1 ][ 1 ] );
+					const minColor = new Color( this.map[ j ][ 1 ] );
+					const maxColor = new Color( this.map[ j + 1 ][ 1 ] );
 
-					var color = minColor.lerp( maxColor, ( i - min ) / ( max - min ) );
+					const color = minColor.lerp( maxColor, ( i - min ) / ( max - min ) );
 
 					this.lut.push( color );
 
@@ -76,9 +72,9 @@ Lut.prototype = {
 
 		return this;
 
-	},
+	}
 
-	copy: function ( lut ) {
+	copy( lut ) {
 
 		this.lut = lut.lut;
 		this.map = lut.map;
@@ -88,9 +84,9 @@ Lut.prototype = {
 
 		return this;
 
-	},
+	}
 
-	getColor: function ( alpha ) {
+	getColor( alpha ) {
 
 		if ( alpha <= this.minV ) {
 
@@ -104,22 +100,22 @@ Lut.prototype = {
 
 		alpha = ( alpha - this.minV ) / ( this.maxV - this.minV );
 
-		var colorPosition = Math.round( alpha * this.n );
+		let colorPosition = Math.round( alpha * this.n );
 		colorPosition == this.n ? colorPosition -= 1 : colorPosition;
 
 		return this.lut[ colorPosition ];
 
-	},
+	}
 
-	addColorMap: function ( colormapName, arrayOfColors ) {
+	addColorMap( colormapName, arrayOfColors ) {
 
 		ColorMapKeywords[ colormapName ] = arrayOfColors;
 
-	},
+	}
 
-	createCanvas: function () {
+	createCanvas() {
 
-		var canvas = document.createElement( 'canvas' );
+		const canvas = document.createElement( 'canvas' );
 		canvas.width = 1;
 		canvas.height = this.n;
 
@@ -127,33 +123,33 @@ Lut.prototype = {
 
 		return canvas;
 
-	},
+	}
 
-	updateCanvas: function ( canvas ) {
+	updateCanvas( canvas ) {
 
-		var ctx = canvas.getContext( '2d', { alpha: false } );
+		const ctx = canvas.getContext( '2d', { alpha: false } );
 
-		var imageData = ctx.getImageData( 0, 0, 1, this.n );
+		const imageData = ctx.getImageData( 0, 0, 1, this.n );
 
-		var data = imageData.data;
+		const data = imageData.data;
 
-		var k = 0;
+		let k = 0;
 
-		var step = 1.0 / this.n;
+		const step = 1.0 / this.n;
 
-		for ( var i = 1; i >= 0; i -= step ) {
+		for ( let i = 1; i >= 0; i -= step ) {
 
-			for ( var j = this.map.length - 1; j >= 0; j -- ) {
+			for ( let j = this.map.length - 1; j >= 0; j -- ) {
 
 				if ( i < this.map[ j ][ 0 ] && i >= this.map[ j - 1 ][ 0 ] ) {
 
-					var min = this.map[ j - 1 ][ 0 ];
-					var max = this.map[ j ][ 0 ];
+					const min = this.map[ j - 1 ][ 0 ];
+					const max = this.map[ j ][ 0 ];
 
-					var minColor = new Color( this.map[ j - 1 ][ 1 ] );
-					var maxColor = new Color( this.map[ j ][ 1 ] );
+					const minColor = new Color( this.map[ j - 1 ][ 1 ] );
+					const maxColor = new Color( this.map[ j ][ 1 ] );
 
-					var color = minColor.lerp( maxColor, ( i - min ) / ( max - min ) );
+					const color = minColor.lerp( maxColor, ( i - min ) / ( max - min ) );
 
 					data[ k * 4 ] = Math.round( color.r * 255 );
 					data[ k * 4 + 1 ] = Math.round( color.g * 255 );
@@ -173,9 +169,16 @@ Lut.prototype = {
 		return canvas;
 
 	}
-};
 
-var ColorMapKeywords = {
+}
+
+Lut.prototype.lut = [];
+Lut.prototype.map = [];
+Lut.prototype.n = 256;
+Lut.prototype.minV = 0;
+Lut.prototype.maxV = 1;
+
+const ColorMapKeywords = {
 
 	'rainbow': [[ 0.0, 0x0000FF ], [ 0.2, 0x00FFFF ], [ 0.5, 0x00FF00 ], [ 0.8, 0xFFFF00 ], [ 1.0, 0xFF0000 ]],
 	'cooltowarm': [[ 0.0, 0x3C4EC2 ], [ 0.2, 0x9BBCFF ], [ 0.5, 0xDCDCDC ], [ 0.8, 0xF6A385 ], [ 1.0, 0xB40426 ]],

+ 345 - 325
examples/jsm/math/SimplexNoise.js

@@ -10,415 +10,435 @@
  * You can pass in a random number generator object if you like.
  * It is assumed to have a random() method.
  */
-var SimplexNoise = function ( r ) {
+class SimplexNoise {
 
-	if ( r == undefined ) r = Math;
-	this.grad3 = [[ 1, 1, 0 ], [ - 1, 1, 0 ], [ 1, - 1, 0 ], [ - 1, - 1, 0 ],
-		[ 1, 0, 1 ], [ - 1, 0, 1 ], [ 1, 0, - 1 ], [ - 1, 0, - 1 ],
-		[ 0, 1, 1 ], [ 0, - 1, 1 ], [ 0, 1, - 1 ], [ 0, - 1, - 1 ]];
+	constructor( r = Math ) {
 
-	this.grad4 = [[ 0, 1, 1, 1 ], [ 0, 1, 1, - 1 ], [ 0, 1, - 1, 1 ], [ 0, 1, - 1, - 1 ],
-	     [ 0, - 1, 1, 1 ], [ 0, - 1, 1, - 1 ], [ 0, - 1, - 1, 1 ], [ 0, - 1, - 1, - 1 ],
-	     [ 1, 0, 1, 1 ], [ 1, 0, 1, - 1 ], [ 1, 0, - 1, 1 ], [ 1, 0, - 1, - 1 ],
-	     [ - 1, 0, 1, 1 ], [ - 1, 0, 1, - 1 ], [ - 1, 0, - 1, 1 ], [ - 1, 0, - 1, - 1 ],
-	     [ 1, 1, 0, 1 ], [ 1, 1, 0, - 1 ], [ 1, - 1, 0, 1 ], [ 1, - 1, 0, - 1 ],
-	     [ - 1, 1, 0, 1 ], [ - 1, 1, 0, - 1 ], [ - 1, - 1, 0, 1 ], [ - 1, - 1, 0, - 1 ],
-	     [ 1, 1, 1, 0 ], [ 1, 1, - 1, 0 ], [ 1, - 1, 1, 0 ], [ 1, - 1, - 1, 0 ],
-	     [ - 1, 1, 1, 0 ], [ - 1, 1, - 1, 0 ], [ - 1, - 1, 1, 0 ], [ - 1, - 1, - 1, 0 ]];
+		this.grad3 = [[ 1, 1, 0 ], [ - 1, 1, 0 ], [ 1, - 1, 0 ], [ - 1, - 1, 0 ],
+			[ 1, 0, 1 ], [ - 1, 0, 1 ], [ 1, 0, - 1 ], [ - 1, 0, - 1 ],
+			[ 0, 1, 1 ], [ 0, - 1, 1 ], [ 0, 1, - 1 ], [ 0, - 1, - 1 ]];
 
-	this.p = [];
+		this.grad4 = [[ 0, 1, 1, 1 ], [ 0, 1, 1, - 1 ], [ 0, 1, - 1, 1 ], [ 0, 1, - 1, - 1 ],
+			[ 0, - 1, 1, 1 ], [ 0, - 1, 1, - 1 ], [ 0, - 1, - 1, 1 ], [ 0, - 1, - 1, - 1 ],
+			[ 1, 0, 1, 1 ], [ 1, 0, 1, - 1 ], [ 1, 0, - 1, 1 ], [ 1, 0, - 1, - 1 ],
+			[ - 1, 0, 1, 1 ], [ - 1, 0, 1, - 1 ], [ - 1, 0, - 1, 1 ], [ - 1, 0, - 1, - 1 ],
+			[ 1, 1, 0, 1 ], [ 1, 1, 0, - 1 ], [ 1, - 1, 0, 1 ], [ 1, - 1, 0, - 1 ],
+			[ - 1, 1, 0, 1 ], [ - 1, 1, 0, - 1 ], [ - 1, - 1, 0, 1 ], [ - 1, - 1, 0, - 1 ],
+			[ 1, 1, 1, 0 ], [ 1, 1, - 1, 0 ], [ 1, - 1, 1, 0 ], [ 1, - 1, - 1, 0 ],
+			[ - 1, 1, 1, 0 ], [ - 1, 1, - 1, 0 ], [ - 1, - 1, 1, 0 ], [ - 1, - 1, - 1, 0 ]];
 
-	for ( var i = 0; i < 256; i ++ ) {
+		this.p = [];
 
-		this.p[ i ] = Math.floor( r.random() * 256 );
+		for ( let i = 0; i < 256; i ++ ) {
 
-	}
-
-	// To remove the need for index wrapping, double the permutation table length
-	this.perm = [];
-
-	for ( var i = 0; i < 512; i ++ ) {
+			this.p[ i ] = Math.floor( r.random() * 256 );
 
-		this.perm[ i ] = this.p[ i & 255 ];
+		}
 
-	}
-
-	// A lookup table to traverse the simplex around a given point in 4D.
-	// Details can be found where this table is used, in the 4D noise method.
-	this.simplex = [
-		[ 0, 1, 2, 3 ], [ 0, 1, 3, 2 ], [ 0, 0, 0, 0 ], [ 0, 2, 3, 1 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 1, 2, 3, 0 ],
-		[ 0, 2, 1, 3 ], [ 0, 0, 0, 0 ], [ 0, 3, 1, 2 ], [ 0, 3, 2, 1 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 1, 3, 2, 0 ],
-		[ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ],
-		[ 1, 2, 0, 3 ], [ 0, 0, 0, 0 ], [ 1, 3, 0, 2 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 2, 3, 0, 1 ], [ 2, 3, 1, 0 ],
-		[ 1, 0, 2, 3 ], [ 1, 0, 3, 2 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 2, 0, 3, 1 ], [ 0, 0, 0, 0 ], [ 2, 1, 3, 0 ],
-		[ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ],
-		[ 2, 0, 1, 3 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 3, 0, 1, 2 ], [ 3, 0, 2, 1 ], [ 0, 0, 0, 0 ], [ 3, 1, 2, 0 ],
-		[ 2, 1, 0, 3 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 3, 1, 0, 2 ], [ 0, 0, 0, 0 ], [ 3, 2, 0, 1 ], [ 3, 2, 1, 0 ]];
+		// To remove the need for index wrapping, double the permutation table length
+		this.perm = [];
 
-};
+		for ( let i = 0; i < 512; i ++ ) {
 
-SimplexNoise.prototype.dot = function ( g, x, y ) {
+			this.perm[ i ] = this.p[ i & 255 ];
 
-	return g[ 0 ] * x + g[ 1 ] * y;
+		}
 
-};
+		// A lookup table to traverse the simplex around a given point in 4D.
+		// Details can be found where this table is used, in the 4D noise method.
+		this.simplex = [
+			[ 0, 1, 2, 3 ], [ 0, 1, 3, 2 ], [ 0, 0, 0, 0 ], [ 0, 2, 3, 1 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 1, 2, 3, 0 ],
+			[ 0, 2, 1, 3 ], [ 0, 0, 0, 0 ], [ 0, 3, 1, 2 ], [ 0, 3, 2, 1 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 1, 3, 2, 0 ],
+			[ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ],
+			[ 1, 2, 0, 3 ], [ 0, 0, 0, 0 ], [ 1, 3, 0, 2 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 2, 3, 0, 1 ], [ 2, 3, 1, 0 ],
+			[ 1, 0, 2, 3 ], [ 1, 0, 3, 2 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 2, 0, 3, 1 ], [ 0, 0, 0, 0 ], [ 2, 1, 3, 0 ],
+			[ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ],
+			[ 2, 0, 1, 3 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 3, 0, 1, 2 ], [ 3, 0, 2, 1 ], [ 0, 0, 0, 0 ], [ 3, 1, 2, 0 ],
+			[ 2, 1, 0, 3 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 3, 1, 0, 2 ], [ 0, 0, 0, 0 ], [ 3, 2, 0, 1 ], [ 3, 2, 1, 0 ]];
 
-SimplexNoise.prototype.dot3 = function ( g, x, y, z ) {
+	}
 
-	return g[ 0 ] * x + g[ 1 ] * y + g[ 2 ] * z;
+	dot( g, x, y ) {
 
-};
+		return g[ 0 ] * x + g[ 1 ] * y;
 
-SimplexNoise.prototype.dot4 = function ( g, x, y, z, w ) {
+	}
 
-	return g[ 0 ] * x + g[ 1 ] * y + g[ 2 ] * z + g[ 3 ] * w;
+	dot3( g, x, y, z ) {
 
-};
+		return g[ 0 ] * x + g[ 1 ] * y + g[ 2 ] * z;
 
-SimplexNoise.prototype.noise = function ( xin, yin ) {
+	}
 
-	var n0, n1, n2; // Noise contributions from the three corners
-	// Skew the input space to determine which simplex cell we're in
-	var F2 = 0.5 * ( Math.sqrt( 3.0 ) - 1.0 );
-	var s = ( xin + yin ) * F2; // Hairy factor for 2D
-	var i = Math.floor( xin + s );
-	var j = Math.floor( yin + s );
-	var G2 = ( 3.0 - Math.sqrt( 3.0 ) ) / 6.0;
-	var t = ( i + j ) * G2;
-	var X0 = i - t; // Unskew the cell origin back to (x,y) space
-	var Y0 = j - t;
-	var x0 = xin - X0; // The x,y distances from the cell origin
-	var y0 = yin - Y0;
-	// For the 2D case, the simplex shape is an equilateral triangle.
-	// Determine which simplex we are in.
-	var i1, j1; // Offsets for second (middle) corner of simplex in (i,j) coords
-	if ( x0 > y0 ) {
+	dot4( g, x, y, z, w ) {
 
-		i1 = 1; j1 = 0;
+		return g[ 0 ] * x + g[ 1 ] * y + g[ 2 ] * z + g[ 3 ] * w;
 
-		// lower triangle, XY order: (0,0)->(1,0)->(1,1)
+	}
 
-	}	else {
+	noise( xin, yin ) {
 
-		i1 = 0; j1 = 1;
+		let n0; // Noise contributions from the three corners
+		let n1;
+		let n2;
+		// Skew the input space to determine which simplex cell we're in
+		const F2 = 0.5 * ( Math.sqrt( 3.0 ) - 1.0 );
+		const s = ( xin + yin ) * F2; // Hairy factor for 2D
+		const i = Math.floor( xin + s );
+		const j = Math.floor( yin + s );
+		const G2 = ( 3.0 - Math.sqrt( 3.0 ) ) / 6.0;
+		const t = ( i + j ) * G2;
+		const X0 = i - t; // Unskew the cell origin back to (x,y) space
+		const Y0 = j - t;
+		const x0 = xin - X0; // The x,y distances from the cell origin
+		const y0 = yin - Y0;
 
-	} // upper triangle, YX order: (0,0)->(0,1)->(1,1)
+		// For the 2D case, the simplex shape is an equilateral triangle.
+		// Determine which simplex we are in.
+		let i1; // Offsets for second (middle) corner of simplex in (i,j) coords
 
-	// A step of (1,0) in (i,j) means a step of (1-c,-c) in (x,y), and
-	// a step of (0,1) in (i,j) means a step of (-c,1-c) in (x,y), where
-	// c = (3-sqrt(3))/6
-	var x1 = x0 - i1 + G2; // Offsets for middle corner in (x,y) unskewed coords
-	var y1 = y0 - j1 + G2;
-	var x2 = x0 - 1.0 + 2.0 * G2; // Offsets for last corner in (x,y) unskewed coords
-	var y2 = y0 - 1.0 + 2.0 * G2;
-	// Work out the hashed gradient indices of the three simplex corners
-	var ii = i & 255;
-	var jj = j & 255;
-	var gi0 = this.perm[ ii + this.perm[ jj ] ] % 12;
-	var gi1 = this.perm[ ii + i1 + this.perm[ jj + j1 ] ] % 12;
-	var gi2 = this.perm[ ii + 1 + this.perm[ jj + 1 ] ] % 12;
-	// Calculate the contribution from the three corners
-	var t0 = 0.5 - x0 * x0 - y0 * y0;
-	if ( t0 < 0 ) n0 = 0.0;
-	else {
+		let j1;
+		if ( x0 > y0 ) {
 
-		t0 *= t0;
-		n0 = t0 * t0 * this.dot( this.grad3[ gi0 ], x0, y0 ); // (x,y) of grad3 used for 2D gradient
+			i1 = 1; j1 = 0;
 
-	}
+			// lower triangle, XY order: (0,0)->(1,0)->(1,1)
 
-	var t1 = 0.5 - x1 * x1 - y1 * y1;
-	if ( t1 < 0 ) n1 = 0.0;
-	else {
+		}	else {
 
-		t1 *= t1;
-		n1 = t1 * t1 * this.dot( this.grad3[ gi1 ], x1, y1 );
+			i1 = 0; j1 = 1;
 
-	}
+		} // upper triangle, YX order: (0,0)->(0,1)->(1,1)
 
-	var t2 = 0.5 - x2 * x2 - y2 * y2;
-	if ( t2 < 0 ) n2 = 0.0;
-	else {
+		// A step of (1,0) in (i,j) means a step of (1-c,-c) in (x,y), and
+		// a step of (0,1) in (i,j) means a step of (-c,1-c) in (x,y), where
+		// c = (3-sqrt(3))/6
+		const x1 = x0 - i1 + G2; // Offsets for middle corner in (x,y) unskewed coords
+		const y1 = y0 - j1 + G2;
+		const x2 = x0 - 1.0 + 2.0 * G2; // Offsets for last corner in (x,y) unskewed coords
+		const y2 = y0 - 1.0 + 2.0 * G2;
+		// Work out the hashed gradient indices of the three simplex corners
+		const ii = i & 255;
+		const jj = j & 255;
+		const gi0 = this.perm[ ii + this.perm[ jj ] ] % 12;
+		const gi1 = this.perm[ ii + i1 + this.perm[ jj + j1 ] ] % 12;
+		const gi2 = this.perm[ ii + 1 + this.perm[ jj + 1 ] ] % 12;
+		// Calculate the contribution from the three corners
+		let t0 = 0.5 - x0 * x0 - y0 * y0;
+		if ( t0 < 0 ) n0 = 0.0;
+		else {
 
-		t2 *= t2;
-		n2 = t2 * t2 * this.dot( this.grad3[ gi2 ], x2, y2 );
+			t0 *= t0;
+			n0 = t0 * t0 * this.dot( this.grad3[ gi0 ], x0, y0 ); // (x,y) of grad3 used for 2D gradient
 
-	}
+		}
 
-	// Add contributions from each corner to get the final noise value.
-	// The result is scaled to return values in the interval [-1,1].
-	return 70.0 * ( n0 + n1 + n2 );
+		let t1 = 0.5 - x1 * x1 - y1 * y1;
+		if ( t1 < 0 ) n1 = 0.0;
+		else {
 
-};
+			t1 *= t1;
+			n1 = t1 * t1 * this.dot( this.grad3[ gi1 ], x1, y1 );
 
-// 3D simplex noise
-SimplexNoise.prototype.noise3d = function ( xin, yin, zin ) {
+		}
 
-	var n0, n1, n2, n3; // Noise contributions from the four corners
-	// Skew the input space to determine which simplex cell we're in
-	var F3 = 1.0 / 3.0;
-	var s = ( xin + yin + zin ) * F3; // Very nice and simple skew factor for 3D
-	var i = Math.floor( xin + s );
-	var j = Math.floor( yin + s );
-	var k = Math.floor( zin + s );
-	var G3 = 1.0 / 6.0; // Very nice and simple unskew factor, too
-	var t = ( i + j + k ) * G3;
-	var X0 = i - t; // Unskew the cell origin back to (x,y,z) space
-	var Y0 = j - t;
-	var Z0 = k - t;
-	var x0 = xin - X0; // The x,y,z distances from the cell origin
-	var y0 = yin - Y0;
-	var z0 = zin - Z0;
-	// For the 3D case, the simplex shape is a slightly irregular tetrahedron.
-	// Determine which simplex we are in.
-	var i1, j1, k1; // Offsets for second corner of simplex in (i,j,k) coords
-	var i2, j2, k2; // Offsets for third corner of simplex in (i,j,k) coords
-	if ( x0 >= y0 ) {
+		let t2 = 0.5 - x2 * x2 - y2 * y2;
+		if ( t2 < 0 ) n2 = 0.0;
+		else {
 
-		if ( y0 >= z0 ) {
+			t2 *= t2;
+			n2 = t2 * t2 * this.dot( this.grad3[ gi2 ], x2, y2 );
 
-			i1 = 1; j1 = 0; k1 = 0; i2 = 1; j2 = 1; k2 = 0;
+		}
 
-			// X Y Z order
+		// Add contributions from each corner to get the final noise value.
+		// The result is scaled to return values in the interval [-1,1].
+		return 70.0 * ( n0 + n1 + n2 );
 
-		} else if ( x0 >= z0 ) {
+	}
 
-			i1 = 1; j1 = 0; k1 = 0; i2 = 1; j2 = 0; k2 = 1;
+	// 3D simplex noise
+	noise3d( xin, yin, zin ) {
 
-			// X Z Y order
+		let n0; // Noise contributions from the four corners
+		let n1;
+		let n2;
+		let n3;
+		// Skew the input space to determine which simplex cell we're in
+		const F3 = 1.0 / 3.0;
+		const s = ( xin + yin + zin ) * F3; // Very nice and simple skew factor for 3D
+		const i = Math.floor( xin + s );
+		const j = Math.floor( yin + s );
+		const k = Math.floor( zin + s );
+		const G3 = 1.0 / 6.0; // Very nice and simple unskew factor, too
+		const t = ( i + j + k ) * G3;
+		const X0 = i - t; // Unskew the cell origin back to (x,y,z) space
+		const Y0 = j - t;
+		const Z0 = k - t;
+		const x0 = xin - X0; // The x,y,z distances from the cell origin
+		const y0 = yin - Y0;
+		const z0 = zin - Z0;
 
-		} else {
+		// For the 3D case, the simplex shape is a slightly irregular tetrahedron.
+		// Determine which simplex we are in.
+		let i1; // Offsets for second corner of simplex in (i,j,k) coords
 
-			i1 = 0; j1 = 0; k1 = 1; i2 = 1; j2 = 0; k2 = 1;
+		let j1;
+		let k1;
+		let i2; // Offsets for third corner of simplex in (i,j,k) coords
+		let j2;
+		let k2;
+		if ( x0 >= y0 ) {
 
-		} // Z X Y order
+			if ( y0 >= z0 ) {
 
-	} else { // x0<y0
+				i1 = 1; j1 = 0; k1 = 0; i2 = 1; j2 = 1; k2 = 0;
 
-		if ( y0 < z0 ) {
+				// X Y Z order
 
-			i1 = 0; j1 = 0; k1 = 1; i2 = 0; j2 = 1; k2 = 1;
+			} else if ( x0 >= z0 ) {
 
-			// Z Y X order
+				i1 = 1; j1 = 0; k1 = 0; i2 = 1; j2 = 0; k2 = 1;
 
-		} else if ( x0 < z0 ) {
+				// X Z Y order
 
-			i1 = 0; j1 = 1; k1 = 0; i2 = 0; j2 = 1; k2 = 1;
+			} else {
 
-			// Y Z X order
+				i1 = 0; j1 = 0; k1 = 1; i2 = 1; j2 = 0; k2 = 1;
 
-		} else {
+			} // Z X Y order
 
-			i1 = 0; j1 = 1; k1 = 0; i2 = 1; j2 = 1; k2 = 0;
+		} else { // x0<y0
 
-		} // Y X Z order
+			if ( y0 < z0 ) {
 
-	}
+				i1 = 0; j1 = 0; k1 = 1; i2 = 0; j2 = 1; k2 = 1;
 
-	// A step of (1,0,0) in (i,j,k) means a step of (1-c,-c,-c) in (x,y,z),
-	// a step of (0,1,0) in (i,j,k) means a step of (-c,1-c,-c) in (x,y,z), and
-	// a step of (0,0,1) in (i,j,k) means a step of (-c,-c,1-c) in (x,y,z), where
-	// c = 1/6.
-	var x1 = x0 - i1 + G3; // Offsets for second corner in (x,y,z) coords
-	var y1 = y0 - j1 + G3;
-	var z1 = z0 - k1 + G3;
-	var x2 = x0 - i2 + 2.0 * G3; // Offsets for third corner in (x,y,z) coords
-	var y2 = y0 - j2 + 2.0 * G3;
-	var z2 = z0 - k2 + 2.0 * G3;
-	var x3 = x0 - 1.0 + 3.0 * G3; // Offsets for last corner in (x,y,z) coords
-	var y3 = y0 - 1.0 + 3.0 * G3;
-	var z3 = z0 - 1.0 + 3.0 * G3;
-	// Work out the hashed gradient indices of the four simplex corners
-	var ii = i & 255;
-	var jj = j & 255;
-	var kk = k & 255;
-	var gi0 = this.perm[ ii + this.perm[ jj + this.perm[ kk ] ] ] % 12;
-	var gi1 = this.perm[ ii + i1 + this.perm[ jj + j1 + this.perm[ kk + k1 ] ] ] % 12;
-	var gi2 = this.perm[ ii + i2 + this.perm[ jj + j2 + this.perm[ kk + k2 ] ] ] % 12;
-	var gi3 = this.perm[ ii + 1 + this.perm[ jj + 1 + this.perm[ kk + 1 ] ] ] % 12;
-	// Calculate the contribution from the four corners
-	var t0 = 0.6 - x0 * x0 - y0 * y0 - z0 * z0;
-	if ( t0 < 0 ) n0 = 0.0;
-	else {
-
-		t0 *= t0;
-		n0 = t0 * t0 * this.dot3( this.grad3[ gi0 ], x0, y0, z0 );
+				// Z Y X order
 
-	}
+			} else if ( x0 < z0 ) {
 
-	var t1 = 0.6 - x1 * x1 - y1 * y1 - z1 * z1;
-	if ( t1 < 0 ) n1 = 0.0;
-	else {
+				i1 = 0; j1 = 1; k1 = 0; i2 = 0; j2 = 1; k2 = 1;
 
-		t1 *= t1;
-		n1 = t1 * t1 * this.dot3( this.grad3[ gi1 ], x1, y1, z1 );
+				// Y Z X order
 
-	}
+			} else {
 
-	var t2 = 0.6 - x2 * x2 - y2 * y2 - z2 * z2;
-	if ( t2 < 0 ) n2 = 0.0;
-	else {
+				i1 = 0; j1 = 1; k1 = 0; i2 = 1; j2 = 1; k2 = 0;
 
-		t2 *= t2;
-		n2 = t2 * t2 * this.dot3( this.grad3[ gi2 ], x2, y2, z2 );
+			} // Y X Z order
 
-	}
+		}
 
-	var t3 = 0.6 - x3 * x3 - y3 * y3 - z3 * z3;
-	if ( t3 < 0 ) n3 = 0.0;
-	else {
+		// A step of (1,0,0) in (i,j,k) means a step of (1-c,-c,-c) in (x,y,z),
+		// a step of (0,1,0) in (i,j,k) means a step of (-c,1-c,-c) in (x,y,z), and
+		// a step of (0,0,1) in (i,j,k) means a step of (-c,-c,1-c) in (x,y,z), where
+		// c = 1/6.
+		const x1 = x0 - i1 + G3; // Offsets for second corner in (x,y,z) coords
+		const y1 = y0 - j1 + G3;
+		const z1 = z0 - k1 + G3;
+		const x2 = x0 - i2 + 2.0 * G3; // Offsets for third corner in (x,y,z) coords
+		const y2 = y0 - j2 + 2.0 * G3;
+		const z2 = z0 - k2 + 2.0 * G3;
+		const x3 = x0 - 1.0 + 3.0 * G3; // Offsets for last corner in (x,y,z) coords
+		const y3 = y0 - 1.0 + 3.0 * G3;
+		const z3 = z0 - 1.0 + 3.0 * G3;
+		// Work out the hashed gradient indices of the four simplex corners
+		const ii = i & 255;
+		const jj = j & 255;
+		const kk = k & 255;
+		const gi0 = this.perm[ ii + this.perm[ jj + this.perm[ kk ] ] ] % 12;
+		const gi1 = this.perm[ ii + i1 + this.perm[ jj + j1 + this.perm[ kk + k1 ] ] ] % 12;
+		const gi2 = this.perm[ ii + i2 + this.perm[ jj + j2 + this.perm[ kk + k2 ] ] ] % 12;
+		const gi3 = this.perm[ ii + 1 + this.perm[ jj + 1 + this.perm[ kk + 1 ] ] ] % 12;
+		// Calculate the contribution from the four corners
+		let t0 = 0.6 - x0 * x0 - y0 * y0 - z0 * z0;
+		if ( t0 < 0 ) n0 = 0.0;
+		else {
 
-		t3 *= t3;
-		n3 = t3 * t3 * this.dot3( this.grad3[ gi3 ], x3, y3, z3 );
+			t0 *= t0;
+			n0 = t0 * t0 * this.dot3( this.grad3[ gi0 ], x0, y0, z0 );
 
-	}
+		}
 
-	// Add contributions from each corner to get the final noise value.
-	// The result is scaled to stay just inside [-1,1]
-	return 32.0 * ( n0 + n1 + n2 + n3 );
-
-};
-
-// 4D simplex noise
-SimplexNoise.prototype.noise4d = function ( x, y, z, w ) {
-
-	// For faster and easier lookups
-	var grad4 = this.grad4;
-	var simplex = this.simplex;
-	var perm = this.perm;
-
-	// The skewing and unskewing factors are hairy again for the 4D case
-	var F4 = ( Math.sqrt( 5.0 ) - 1.0 ) / 4.0;
-	var G4 = ( 5.0 - Math.sqrt( 5.0 ) ) / 20.0;
-	var n0, n1, n2, n3, n4; // Noise contributions from the five corners
-	// Skew the (x,y,z,w) space to determine which cell of 24 simplices we're in
-	var s = ( x + y + z + w ) * F4; // Factor for 4D skewing
-	var i = Math.floor( x + s );
-	var j = Math.floor( y + s );
-	var k = Math.floor( z + s );
-	var l = Math.floor( w + s );
-	var t = ( i + j + k + l ) * G4; // Factor for 4D unskewing
-	var X0 = i - t; // Unskew the cell origin back to (x,y,z,w) space
-	var Y0 = j - t;
-	var Z0 = k - t;
-	var W0 = l - t;
-	var x0 = x - X0; // The x,y,z,w distances from the cell origin
-	var y0 = y - Y0;
-	var z0 = z - Z0;
-	var w0 = w - W0;
-
-	// For the 4D case, the simplex is a 4D shape I won't even try to describe.
-	// To find out which of the 24 possible simplices we're in, we need to
-	// determine the magnitude ordering of x0, y0, z0 and w0.
-	// The method below is a good way of finding the ordering of x,y,z,w and
-	// then find the correct traversal order for the simplex we’re in.
-	// First, six pair-wise comparisons are performed between each possible pair
-	// of the four coordinates, and the results are used to add up binary bits
-	// for an integer index.
-	var c1 = ( x0 > y0 ) ? 32 : 0;
-	var c2 = ( x0 > z0 ) ? 16 : 0;
-	var c3 = ( y0 > z0 ) ? 8 : 0;
-	var c4 = ( x0 > w0 ) ? 4 : 0;
-	var c5 = ( y0 > w0 ) ? 2 : 0;
-	var c6 = ( z0 > w0 ) ? 1 : 0;
-	var c = c1 + c2 + c3 + c4 + c5 + c6;
-	var i1, j1, k1, l1; // The integer offsets for the second simplex corner
-	var i2, j2, k2, l2; // The integer offsets for the third simplex corner
-	var i3, j3, k3, l3; // The integer offsets for the fourth simplex corner
-	// simplex[c] is a 4-vector with the numbers 0, 1, 2 and 3 in some order.
-	// Many values of c will never occur, since e.g. x>y>z>w makes x<z, y<w and x<w
-	// impossible. Only the 24 indices which have non-zero entries make any sense.
-	// We use a thresholding to set the coordinates in turn from the largest magnitude.
-	// The number 3 in the "simplex" array is at the position of the largest coordinate.
-	i1 = simplex[ c ][ 0 ] >= 3 ? 1 : 0;
-	j1 = simplex[ c ][ 1 ] >= 3 ? 1 : 0;
-	k1 = simplex[ c ][ 2 ] >= 3 ? 1 : 0;
-	l1 = simplex[ c ][ 3 ] >= 3 ? 1 : 0;
-	// The number 2 in the "simplex" array is at the second largest coordinate.
-	i2 = simplex[ c ][ 0 ] >= 2 ? 1 : 0;
-	j2 = simplex[ c ][ 1 ] >= 2 ? 1 : 0; k2 = simplex[ c ][ 2 ] >= 2 ? 1 : 0;
-	l2 = simplex[ c ][ 3 ] >= 2 ? 1 : 0;
-	// The number 1 in the "simplex" array is at the second smallest coordinate.
-	i3 = simplex[ c ][ 0 ] >= 1 ? 1 : 0;
-	j3 = simplex[ c ][ 1 ] >= 1 ? 1 : 0;
-	k3 = simplex[ c ][ 2 ] >= 1 ? 1 : 0;
-	l3 = simplex[ c ][ 3 ] >= 1 ? 1 : 0;
-	// The fifth corner has all coordinate offsets = 1, so no need to look that up.
-	var x1 = x0 - i1 + G4; // Offsets for second corner in (x,y,z,w) coords
-	var y1 = y0 - j1 + G4;
-	var z1 = z0 - k1 + G4;
-	var w1 = w0 - l1 + G4;
-	var x2 = x0 - i2 + 2.0 * G4; // Offsets for third corner in (x,y,z,w) coords
-	var y2 = y0 - j2 + 2.0 * G4;
-	var z2 = z0 - k2 + 2.0 * G4;
-	var w2 = w0 - l2 + 2.0 * G4;
-	var x3 = x0 - i3 + 3.0 * G4; // Offsets for fourth corner in (x,y,z,w) coords
-	var y3 = y0 - j3 + 3.0 * G4;
-	var z3 = z0 - k3 + 3.0 * G4;
-	var w3 = w0 - l3 + 3.0 * G4;
-	var x4 = x0 - 1.0 + 4.0 * G4; // Offsets for last corner in (x,y,z,w) coords
-	var y4 = y0 - 1.0 + 4.0 * G4;
-	var z4 = z0 - 1.0 + 4.0 * G4;
-	var w4 = w0 - 1.0 + 4.0 * G4;
-	// Work out the hashed gradient indices of the five simplex corners
-	var ii = i & 255;
-	var jj = j & 255;
-	var kk = k & 255;
-	var ll = l & 255;
-	var gi0 = perm[ ii + perm[ jj + perm[ kk + perm[ ll ] ] ] ] % 32;
-	var gi1 = perm[ ii + i1 + perm[ jj + j1 + perm[ kk + k1 + perm[ ll + l1 ] ] ] ] % 32;
-	var gi2 = perm[ ii + i2 + perm[ jj + j2 + perm[ kk + k2 + perm[ ll + l2 ] ] ] ] % 32;
-	var gi3 = perm[ ii + i3 + perm[ jj + j3 + perm[ kk + k3 + perm[ ll + l3 ] ] ] ] % 32;
-	var gi4 = perm[ ii + 1 + perm[ jj + 1 + perm[ kk + 1 + perm[ ll + 1 ] ] ] ] % 32;
-	// Calculate the contribution from the five corners
-	var t0 = 0.6 - x0 * x0 - y0 * y0 - z0 * z0 - w0 * w0;
-	if ( t0 < 0 ) n0 = 0.0;
-	else {
-
-		t0 *= t0;
-		n0 = t0 * t0 * this.dot4( grad4[ gi0 ], x0, y0, z0, w0 );
+		let t1 = 0.6 - x1 * x1 - y1 * y1 - z1 * z1;
+		if ( t1 < 0 ) n1 = 0.0;
+		else {
 
-	}
+			t1 *= t1;
+			n1 = t1 * t1 * this.dot3( this.grad3[ gi1 ], x1, y1, z1 );
 
-	var t1 = 0.6 - x1 * x1 - y1 * y1 - z1 * z1 - w1 * w1;
-	if ( t1 < 0 ) n1 = 0.0;
-	else {
+		}
 
-		t1 *= t1;
-		n1 = t1 * t1 * this.dot4( grad4[ gi1 ], x1, y1, z1, w1 );
+		let t2 = 0.6 - x2 * x2 - y2 * y2 - z2 * z2;
+		if ( t2 < 0 ) n2 = 0.0;
+		else {
 
-	}
+			t2 *= t2;
+			n2 = t2 * t2 * this.dot3( this.grad3[ gi2 ], x2, y2, z2 );
 
-	var t2 = 0.6 - x2 * x2 - y2 * y2 - z2 * z2 - w2 * w2;
-	if ( t2 < 0 ) n2 = 0.0;
-	else {
+		}
 
-		t2 *= t2;
-		n2 = t2 * t2 * this.dot4( grad4[ gi2 ], x2, y2, z2, w2 );
+		let t3 = 0.6 - x3 * x3 - y3 * y3 - z3 * z3;
+		if ( t3 < 0 ) n3 = 0.0;
+		else {
 
-	}
+			t3 *= t3;
+			n3 = t3 * t3 * this.dot3( this.grad3[ gi3 ], x3, y3, z3 );
 
-	var t3 = 0.6 - x3 * x3 - y3 * y3 - z3 * z3 - w3 * w3;
-	if ( t3 < 0 ) n3 = 0.0;
-	else {
+		}
 
-		t3 *= t3;
-		n3 = t3 * t3 * this.dot4( grad4[ gi3 ], x3, y3, z3, w3 );
+		// Add contributions from each corner to get the final noise value.
+		// The result is scaled to stay just inside [-1,1]
+		return 32.0 * ( n0 + n1 + n2 + n3 );
 
 	}
 
-	var t4 = 0.6 - x4 * x4 - y4 * y4 - z4 * z4 - w4 * w4;
-	if ( t4 < 0 ) n4 = 0.0;
-	else {
-
-		t4 *= t4;
-		n4 = t4 * t4 * this.dot4( grad4[ gi4 ], x4, y4, z4, w4 );
+	// 4D simplex noise
+	noise4d( x, y, z, w ) {
+
+		// For faster and easier lookups
+		const grad4 = this.grad4;
+		const simplex = this.simplex;
+		const perm = this.perm;
+
+		// The skewing and unskewing factors are hairy again for the 4D case
+		const F4 = ( Math.sqrt( 5.0 ) - 1.0 ) / 4.0;
+		const G4 = ( 5.0 - Math.sqrt( 5.0 ) ) / 20.0;
+		let n0; // Noise contributions from the five corners
+		let n1;
+		let n2;
+		let n3;
+		let n4;
+		// Skew the (x,y,z,w) space to determine which cell of 24 simplices we're in
+		const s = ( x + y + z + w ) * F4; // Factor for 4D skewing
+		const i = Math.floor( x + s );
+		const j = Math.floor( y + s );
+		const k = Math.floor( z + s );
+		const l = Math.floor( w + s );
+		const t = ( i + j + k + l ) * G4; // Factor for 4D unskewing
+		const X0 = i - t; // Unskew the cell origin back to (x,y,z,w) space
+		const Y0 = j - t;
+		const Z0 = k - t;
+		const W0 = l - t;
+		const x0 = x - X0; // The x,y,z,w distances from the cell origin
+		const y0 = y - Y0;
+		const z0 = z - Z0;
+		const w0 = w - W0;
+
+		// For the 4D case, the simplex is a 4D shape I won't even try to describe.
+		// To find out which of the 24 possible simplices we're in, we need to
+		// determine the magnitude ordering of x0, y0, z0 and w0.
+		// The method below is a good way of finding the ordering of x,y,z,w and
+		// then find the correct traversal order for the simplex we’re in.
+		// First, six pair-wise comparisons are performed between each possible pair
+		// of the four coordinates, and the results are used to add up binary bits
+		// for an integer index.
+		const c1 = ( x0 > y0 ) ? 32 : 0;
+		const c2 = ( x0 > z0 ) ? 16 : 0;
+		const c3 = ( y0 > z0 ) ? 8 : 0;
+		const c4 = ( x0 > w0 ) ? 4 : 0;
+		const c5 = ( y0 > w0 ) ? 2 : 0;
+		const c6 = ( z0 > w0 ) ? 1 : 0;
+		const c = c1 + c2 + c3 + c4 + c5 + c6;
+
+		// simplex[c] is a 4-vector with the numbers 0, 1, 2 and 3 in some order.
+		// Many values of c will never occur, since e.g. x>y>z>w makes x<z, y<w and x<w
+		// impossible. Only the 24 indices which have non-zero entries make any sense.
+		// We use a thresholding to set the coordinates in turn from the largest magnitude.
+		// The number 3 in the "simplex" array is at the position of the largest coordinate.
+		const i1 = simplex[ c ][ 0 ] >= 3 ? 1 : 0;
+		const j1 = simplex[ c ][ 1 ] >= 3 ? 1 : 0;
+		const k1 = simplex[ c ][ 2 ] >= 3 ? 1 : 0;
+		const l1 = simplex[ c ][ 3 ] >= 3 ? 1 : 0;
+		// The number 2 in the "simplex" array is at the second largest coordinate.
+		const i2 = simplex[ c ][ 0 ] >= 2 ? 1 : 0;
+		const j2 = simplex[ c ][ 1 ] >= 2 ? 1 : 0;
+		const k2 = simplex[ c ][ 2 ] >= 2 ? 1 : 0;
+		const l2 = simplex[ c ][ 3 ] >= 2 ? 1 : 0;
+		// The number 1 in the "simplex" array is at the second smallest coordinate.
+		const i3 = simplex[ c ][ 0 ] >= 1 ? 1 : 0;
+		const j3 = simplex[ c ][ 1 ] >= 1 ? 1 : 0;
+		const k3 = simplex[ c ][ 2 ] >= 1 ? 1 : 0;
+		const l3 = simplex[ c ][ 3 ] >= 1 ? 1 : 0;
+		// The fifth corner has all coordinate offsets = 1, so no need to look that up.
+		const x1 = x0 - i1 + G4; // Offsets for second corner in (x,y,z,w) coords
+		const y1 = y0 - j1 + G4;
+		const z1 = z0 - k1 + G4;
+		const w1 = w0 - l1 + G4;
+		const x2 = x0 - i2 + 2.0 * G4; // Offsets for third corner in (x,y,z,w) coords
+		const y2 = y0 - j2 + 2.0 * G4;
+		const z2 = z0 - k2 + 2.0 * G4;
+		const w2 = w0 - l2 + 2.0 * G4;
+		const x3 = x0 - i3 + 3.0 * G4; // Offsets for fourth corner in (x,y,z,w) coords
+		const y3 = y0 - j3 + 3.0 * G4;
+		const z3 = z0 - k3 + 3.0 * G4;
+		const w3 = w0 - l3 + 3.0 * G4;
+		const x4 = x0 - 1.0 + 4.0 * G4; // Offsets for last corner in (x,y,z,w) coords
+		const y4 = y0 - 1.0 + 4.0 * G4;
+		const z4 = z0 - 1.0 + 4.0 * G4;
+		const w4 = w0 - 1.0 + 4.0 * G4;
+		// Work out the hashed gradient indices of the five simplex corners
+		const ii = i & 255;
+		const jj = j & 255;
+		const kk = k & 255;
+		const ll = l & 255;
+		const gi0 = perm[ ii + perm[ jj + perm[ kk + perm[ ll ] ] ] ] % 32;
+		const gi1 = perm[ ii + i1 + perm[ jj + j1 + perm[ kk + k1 + perm[ ll + l1 ] ] ] ] % 32;
+		const gi2 = perm[ ii + i2 + perm[ jj + j2 + perm[ kk + k2 + perm[ ll + l2 ] ] ] ] % 32;
+		const gi3 = perm[ ii + i3 + perm[ jj + j3 + perm[ kk + k3 + perm[ ll + l3 ] ] ] ] % 32;
+		const gi4 = perm[ ii + 1 + perm[ jj + 1 + perm[ kk + 1 + perm[ ll + 1 ] ] ] ] % 32;
+		// Calculate the contribution from the five corners
+		let t0 = 0.6 - x0 * x0 - y0 * y0 - z0 * z0 - w0 * w0;
+		if ( t0 < 0 ) n0 = 0.0;
+		else {
+
+			t0 *= t0;
+			n0 = t0 * t0 * this.dot4( grad4[ gi0 ], x0, y0, z0, w0 );
+
+		}
+
+		let t1 = 0.6 - x1 * x1 - y1 * y1 - z1 * z1 - w1 * w1;
+		if ( t1 < 0 ) n1 = 0.0;
+		else {
+
+			t1 *= t1;
+			n1 = t1 * t1 * this.dot4( grad4[ gi1 ], x1, y1, z1, w1 );
+
+		}
+
+		let t2 = 0.6 - x2 * x2 - y2 * y2 - z2 * z2 - w2 * w2;
+		if ( t2 < 0 ) n2 = 0.0;
+		else {
+
+			t2 *= t2;
+			n2 = t2 * t2 * this.dot4( grad4[ gi2 ], x2, y2, z2, w2 );
+
+		}
+
+		let t3 = 0.6 - x3 * x3 - y3 * y3 - z3 * z3 - w3 * w3;
+		if ( t3 < 0 ) n3 = 0.0;
+		else {
+
+			t3 *= t3;
+			n3 = t3 * t3 * this.dot4( grad4[ gi3 ], x3, y3, z3, w3 );
+
+		}
+
+		let t4 = 0.6 - x4 * x4 - y4 * y4 - z4 * z4 - w4 * w4;
+		if ( t4 < 0 ) n4 = 0.0;
+		else {
+
+			t4 *= t4;
+			n4 = t4 * t4 * this.dot4( grad4[ gi4 ], x4, y4, z4, w4 );
+
+		}
+
+		// Sum up and scale the result to cover the range [-1,1]
+		return 27.0 * ( n0 + n1 + n2 + n3 + n4 );
 
 	}
 
-	// Sum up and scale the result to cover the range [-1,1]
-	return 27.0 * ( n0 + n1 + n2 + n3 + n4 );
-
-};
+}
 
 export { SimplexNoise };

Some files were not shown because too many files changed in this diff