libnoise 1.2.0

A simple, performant, and customizable procedural noise generation library.
Documentation
pub(crate) const PERMUTATION_TABLE_SIZE: usize = 256;

pub(crate) const GRADIENT_LUT_1D_SIZE: usize = 16;
pub(crate) const GRADIENT_LUT_1D: [f64; 16] = [
    -8.0, -7.0, -6.0, -5.0, -4.0, -3.0, -2.0, -1.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0,
];

pub(crate) const MIDPOINT_GRADIENT_LUT_2D_SIZE: usize = 4;
pub(crate) const MIDPOINT_GRADIENT_LUT_2D: [[f64; 2]; MIDPOINT_GRADIENT_LUT_2D_SIZE] =
    [[0.0, -1.0], [-1.0, 0.0], [0.0, 1.0], [1.0, 0.0]];

pub(crate) const MIDPOINT_GRADIENT_LUT_3D_SIZE: usize = 16;
pub(crate) const MIDPOINT_GRADIENT_LUT_3D: [[f64; 3]; MIDPOINT_GRADIENT_LUT_3D_SIZE] = [
    [0.0, -1.0, -1.0],
    [-1.0, 0.0, -1.0],
    [-1.0, -1.0, 0.0],
    [0.0, 1.0, -1.0],
    [1.0, 0.0, -1.0],
    [1.0, -1.0, 0.0],
    [0.0, -1.0, 1.0],
    [-1.0, 0.0, 1.0],
    [-1.0, 1.0, 0.0],
    [0.0, 1.0, 1.0],
    [1.0, 0.0, 1.0],
    [1.0, 1.0, 0.0],
    [0.0, -1.0, -1.0], // padded for size 16, see perlins paper "improving noise"
    [0.0, -1.0, 1.0],  // padded for size 16, see perlins paper "improving noise"
    [-1.0, 1.0, 0.0],  // padded for size 16, see perlins paper "improving noise"
    [1.0, 1.0, 0.0],   // padded for size 16, see perlins paper "improving noise"
];

pub(crate) const MIDPOINT_GRADIENT_LUT_4D_SIZE: usize = 32;
pub(crate) const MIDPOINT_GRADIENT_LUT_4D: [[f64; 4]; MIDPOINT_GRADIENT_LUT_4D_SIZE] = [
    [0.0, -1.0, -1.0, -1.0],
    [-1.0, 0.0, -1.0, -1.0],
    [-1.0, -1.0, 0.0, -1.0],
    [-1.0, -1.0, -1.0, 0.0],
    [0.0, 1.0, -1.0, -1.0],
    [1.0, 0.0, -1.0, -1.0],
    [1.0, -1.0, 0.0, -1.0],
    [1.0, -1.0, -1.0, 0.0],
    [0.0, -1.0, 1.0, -1.0],
    [-1.0, 0.0, 1.0, -1.0],
    [-1.0, 1.0, 0.0, -1.0],
    [-1.0, 1.0, -1.0, 0.0],
    [0.0, 1.0, 1.0, -1.0],
    [1.0, 0.0, 1.0, -1.0],
    [1.0, 1.0, 0.0, -1.0],
    [1.0, 1.0, -1.0, 0.0],
    [0.0, -1.0, -1.0, 1.0],
    [-1.0, 0.0, -1.0, 1.0],
    [-1.0, -1.0, 0.0, 1.0],
    [-1.0, -1.0, 1.0, 0.0],
    [0.0, 1.0, -1.0, 1.0],
    [1.0, 0.0, -1.0, 1.0],
    [1.0, -1.0, 0.0, 1.0],
    [1.0, -1.0, 1.0, 0.0],
    [0.0, -1.0, 1.0, 1.0],
    [-1.0, 0.0, 1.0, 1.0],
    [-1.0, 1.0, 0.0, 1.0],
    [-1.0, 1.0, 1.0, 0.0],
    [0.0, 1.0, 1.0, 1.0],
    [1.0, 0.0, 1.0, 1.0],
    [1.0, 1.0, 0.0, 1.0],
    [1.0, 1.0, 1.0, 0.0],
];

pub(crate) const CORNERPOINT_GRADIENT_LUT_2D_SIZE: usize = 4;
pub(crate) const CORNERPOINT_GRADIENT_LUT_2D: [[f64; 2]; CORNERPOINT_GRADIENT_LUT_2D_SIZE] =
    [[-1.0, -1.0], [-1.0, 1.0], [1.0, -1.0], [1.0, 1.0]];

pub(crate) const CORNERPOINT_GRADIENT_LUT_3D_SIZE: usize = 8;
pub(crate) const CORNERPOINT_GRADIENT_LUT_3D: [[f64; 3]; CORNERPOINT_GRADIENT_LUT_3D_SIZE] = [
    [-1.0, -1.0, -1.0],
    [-1.0, -1.0, 1.0],
    [-1.0, 1.0, -1.0],
    [-1.0, 1.0, 1.0],
    [1.0, -1.0, -1.0],
    [1.0, -1.0, 1.0],
    [1.0, 1.0, -1.0],
    [1.0, 1.0, 1.0],
];

pub(crate) const CORNERPOINT_GRADIENT_LUT_4D_SIZE: usize = 16;
pub(crate) const CORNERPOINT_GRADIENT_LUT_4D: [[f64; 4]; CORNERPOINT_GRADIENT_LUT_4D_SIZE] = [
    [-1.0, -1.0, -1.0, -1.0],
    [-1.0, -1.0, -1.0, 1.0],
    [-1.0, -1.0, 1.0, -1.0],
    [-1.0, -1.0, 1.0, 1.0],
    [-1.0, 1.0, -1.0, -1.0],
    [-1.0, 1.0, -1.0, 1.0],
    [-1.0, 1.0, 1.0, -1.0],
    [-1.0, 1.0, 1.0, 1.0],
    [1.0, -1.0, -1.0, -1.0],
    [1.0, -1.0, -1.0, 1.0],
    [1.0, -1.0, 1.0, -1.0],
    [1.0, -1.0, 1.0, 1.0],
    [1.0, 1.0, -1.0, -1.0],
    [1.0, 1.0, -1.0, 1.0],
    [1.0, 1.0, 1.0, -1.0],
    [1.0, 1.0, 1.0, 1.0],
];

pub(crate) const SIMPLEX_R_SQUARED: f64 = 0.5;
pub(crate) const SIMPLEX_NORMALIZATION_FACTOR_1D: f64 = 13.591804446852795;
pub(crate) const SIMPLEX_SKEW_FACTOR_2D: f64 = 0.3660254037844386;
pub(crate) const SIMPLEX_UNSKEW_FACTOR_2D: f64 = 0.21132486540518713;
pub(crate) const SIMPLEX_NORMALIZATION_FACTOR_2D: f64 = 99.83685446303647;
pub(crate) const SIMPLEX_SKEW_FACTOR_3D: f64 = 0.3333333333333333;
pub(crate) const SIMPLEX_UNSKEW_FACTOR_3D: f64 = 0.16666666666666666;
pub(crate) const SIMPLEX_NORMALIZATION_FACTOR_3D: f64 = 76.88375854620836;
pub(crate) const SIMPLEX_TRAVERSAL_LUT_3D: [[usize; 6]; 8] = [
    [0, 0, 1, 0, 1, 1], // 0: zyx
    [0, 0, 0, 0, 0, 0], // 1: pad
    [0, 1, 0, 0, 1, 1], // 2: yzx
    [0, 1, 0, 1, 1, 0], // 3: yxz
    [0, 0, 1, 1, 0, 1], // 4: zxy
    [1, 0, 0, 1, 0, 1], // 5: xzy
    [0, 0, 0, 0, 0, 0], // 6: pad
    [1, 0, 0, 1, 1, 0], // 7: xyz
];
pub(crate) const SIMPLEX_SKEW_FACTOR_4D: f64 = 0.30901699437494745;
pub(crate) const SIMPLEX_UNSKEW_FACTOR_4D: f64 = 0.13819660112501053;
pub(crate) const SIMPLEX_NORMALIZATION_FACTOR_4D: f64 = 62.795597150623436;
pub(crate) const SIMPLEX_TRAVERSAL_LUT_4D: [[usize; 12]; 64] = [
    [0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1], // 00: wzyx
    [0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1], // 01: zwyx
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 02: pad
    [0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1], // 03: zywx
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 04: pad
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 05: pad
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 06: pad
    [0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0], // 07: zyxw
    [0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1], // 08: wyzx
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 09: pad
    [0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1], // 10: ywzx
    [0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1], // 11: yzwx
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 12: pad
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 13: pad
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 14: pad
    [0, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0], // 15: yzxw
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 16: pad
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 17: pad
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 18: pad
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 19: pad
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 20: pad
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 21: pad
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 22: pad
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 23: pad
    [0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1], // 24: wyxz
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 25: pad
    [0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1], // 26: ywxz
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 27: pad
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 28: pad
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 29: pad
    [0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1], // 30: yxwz
    [0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0], // 31: yxzw
    [0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1], // 32: wzxy
    [0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1], // 33: zwxy
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 34: pad
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 35: pad
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 36: pad
    [0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1], // 37: zxwy
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 38: pad
    [0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0], // 39: zxyw
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 40: pad
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 41: pad
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 42: pad
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 43: pad
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 44: pad
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 45: pad
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 46: pad
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 47: pad
    [0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1], // 48: wxzy
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 49: pad
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 50: pad
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 51: pad
    [1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1], // 52: xwzy
    [1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1], // 53: xzwy
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 54: pad
    [1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0], // 55: xzyw
    [0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1], // 56: wxyz
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 57: pad
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 58: pad
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 59: pad
    [1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1], // 60: xwyz
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 61: pad
    [1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1], // 62: xywz
    [1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0], // 63: xyzw
];