fast-noise-lite-ts
Version:
A fast and lightweight noise generation library for JavaScript
58 lines (57 loc) • 1.86 kB
JavaScript
import { gradients2D, gradients3D } from "./constants";
export function lerp(a, b, t) {
return a + t * (b - a);
}
export function lerpCubic(a, b, c, d, t) {
let p = d - c - (a - b);
return t * t * t * p + t * t * (a - b - p) + t * (c - a) + b;
}
export function interpolateHermite(t) {
return t * t * (3 - 2 * t);
}
export function interpolateQuintic(t) {
return t * t * t * (t * (t * 6 - 15) + 10);
}
export function pingPong(t) {
t -= Math.trunc(t * 0.5) * 2;
return t < 1 ? t : 2 - t;
}
export function hashR2(seed, xPrimed, yPrimed) {
let hash = seed ^ xPrimed ^ yPrimed;
hash = Math.imul(hash, 0x27d4eb2d);
return hash;
}
export function hashR3(seed, xPrimed, yPrimed, zPrimed) {
let hash = seed ^ xPrimed ^ yPrimed ^ zPrimed;
hash = Math.imul(hash, 0x27d4eb2d);
return hash;
}
export function valueCoordinateR2(seed, xPrimed, yPrimed) {
let hash = hashR2(seed, xPrimed, yPrimed);
hash = Math.imul(hash, hash);
hash ^= hash << 19;
return hash * (1 / 2147483648.0);
}
export function valueCoordinateR3(seed, xPrimed, yPrimed, zPrimed) {
let hash = hashR3(seed, xPrimed, yPrimed, zPrimed);
hash = Math.imul(hash, hash);
hash ^= hash << 19;
return hash * (1 / 2147483648.0);
}
export function gradientCoordinateR2(seed, xPrimed, yPrimed, xd, yd) {
let hash = hashR2(seed, xPrimed, yPrimed);
hash ^= hash >> 15;
hash &= 127 << 1;
let xg = gradients2D[hash];
let yg = gradients2D[hash | 1];
return xd * xg + yd * yg;
}
export function gradientCoordinateR3(seed, xPrimed, yPrimed, zPrimed, xd, yd, zd) {
let hash = hashR3(seed, xPrimed, yPrimed, zPrimed);
hash ^= hash >> 15;
hash &= 63 << 2;
let xg = gradients3D[hash];
let yg = gradients3D[hash | 1];
let zg = gradients3D[hash | 2];
return xd * xg + yd * yg + zd * zg;
}