UNPKG

fast-noise-lite-ts

Version:

A fast and lightweight noise generation library for JavaScript

133 lines (132 loc) 3.95 kB
import { prime } from "../constants"; import { gradientCoordinateR2, gradientCoordinateR3 } from "../utilities"; export function openSimplex2R2(options, x, y) { const seed = options.seed; const SQRT3 = 1.7320508075688772935274463415059; const G2 = (3 - SQRT3) / 6; let i = Math.floor(x); let j = Math.floor(y); let xi = x - i; let yi = y - j; let t = (xi + yi) * G2; let x0 = xi - t; let y0 = yi - t; i = Math.imul(i, prime.x); j = Math.imul(j, prime.y); let n0, n1, n2; let a = 0.5 - x0 * x0 - y0 * y0; if (a <= 0) { n0 = 0; } else { n0 = a * a * (a * a) * gradientCoordinateR2(seed, i, j, x0, y0); } let c = 2 * (1 - 2 * G2) * (1 / G2 - 2) * t + (-2 * (1 - 2 * G2) * (1 - 2 * G2) + a); if (c <= 0) { n2 = 0; } else { let x2 = x0 + (2 * G2 - 1); let y2 = y0 + (2 * G2 - 1); n2 = c * c * (c * c) * gradientCoordinateR2(seed, i + prime.x, j + prime.y, x2, y2); } if (y0 > x0) { let x1 = x0 + G2; let y1 = y0 + (G2 - 1); let b = 0.5 - x1 * x1 - y1 * y1; if (b <= 0) { n1 = 0; } else { n1 = b * b * (b * b) * gradientCoordinateR2(seed, i, j + prime.y, x1, y1); } } else { let x1 = x0 + (G2 - 1); let y1 = y0 + G2; let b = 0.5 - x1 * x1 - y1 * y1; if (b <= 0) { n1 = 0; } else { n1 = b * b * (b * b) * gradientCoordinateR2(seed, i + prime.x, j, x1, y1); } } return (n0 + n1 + n2) * 99.83685446303647; } export function openSimplex2R3(options, x, y, z) { const seed = options.seed; let i = Math.round(x); let j = Math.round(y); let k = Math.round(z); let x0 = x - i; let y0 = y - j; let z0 = z - k; let yNSign = Math.trunc((-1.0 - y0) | 1); let xNSign = Math.trunc((-1.0 - x0) | 1); let zNSign = Math.trunc((-1.0 - z0) | 1); let ax0 = xNSign * -x0; let ay0 = yNSign * -y0; let az0 = zNSign * -z0; i = Math.imul(i, prime.x); j = Math.imul(j, prime.y); k = Math.imul(k, prime.z); let value = 0; let a = 0.6 - x0 * x0 - (y0 * y0 + z0 * z0); for (let l = 0;; l++) { if (a > 0) { value += a * a * (a * a) * gradientCoordinateR3(seed, i, j, k, x0, y0, z0); } if (ax0 >= ay0 && ax0 >= az0) { let b = a + ax0 + ax0; if (b > 1) { b -= 1; value += b * b * (b * b) * gradientCoordinateR3(seed, i - xNSign * prime.x, j, k, x0 + xNSign, y0, z0); } } else if (ay0 > ax0 && ay0 >= az0) { let b = a + ay0 + ay0; if (b > 1) { b -= 1; value += b * b * (b * b) * gradientCoordinateR3(seed, i, j - yNSign * prime.y, k, x0, y0 + yNSign, z0); } } else { let b = a + az0 + az0; if (b > 1) { b -= 1; value += b * b * (b * b) * gradientCoordinateR3(seed, i, j, k - zNSign * prime.z, x0, y0, z0 + zNSign); } } if (l === 1) { break; } ax0 = 0.5 - ax0; ay0 = 0.5 - ay0; az0 = 0.5 - az0; x0 = xNSign * ax0; y0 = yNSign * ay0; z0 = zNSign * az0; a += 0.75 - ax0 - (ay0 + az0); i += (xNSign >> 1) & prime.x; j += (yNSign >> 1) & prime.y; k += (zNSign >> 1) & prime.z; xNSign = -xNSign; yNSign = -yNSign; zNSign = -zNSign; options.seed = ~seed; } return value * 32.69428253173828125; }