1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#[inline(always)]
#[rustfmt::skip]
pub(crate) fn get2(index: usize) -> [f64; 2] {
    // Vectors are combinations of -1, 0, and 1
    // Precompute the normalized element
    const DIAG : f64 = std::f64::consts::FRAC_1_SQRT_2;

    match index % 8 {
        0 => [  1.0,   0.0],
        1 => [ -1.0,   0.0],
        2 => [  0.0,   1.0],
        3 => [  0.0,  -1.0],
        4 => [ DIAG,  DIAG],
        5 => [-DIAG,  DIAG],
        6 => [ DIAG, -DIAG],
        7 => [-DIAG, -DIAG],
        _ => panic!("Attempt to access gradient {} of 8", index % 8),
    }
}

#[inline(always)]
#[rustfmt::skip]
pub(crate) fn get3(index: usize) -> [f64; 3] {
    // Vectors are combinations of -1, 0, and 1
    // Precompute the normalized elements
    const DIAG : f64 = std::f64::consts::FRAC_1_SQRT_2;
    const DIAG2 : f64 = 0.577_350_269_189_625_8;

    match index % 32 {
        // 12 edges repeated twice then 8 corners
        0  | 12 => [  DIAG,   DIAG,    0.0],
        1  | 13 => [ -DIAG,   DIAG,    0.0],
        2  | 14 => [  DIAG,  -DIAG,    0.0],
        3  | 15 => [ -DIAG,  -DIAG,    0.0],
        4  | 16 => [  DIAG,    0.0,   DIAG],
        5  | 17 => [ -DIAG,    0.0,   DIAG],
        6  | 18 => [  DIAG,    0.0,  -DIAG],
        7  | 19 => [ -DIAG,    0.0,  -DIAG],
        8  | 20 => [   0.0,   DIAG,   DIAG],
        9  | 21 => [   0.0,  -DIAG,   DIAG],
        10 | 22 => [   0.0,   DIAG,  -DIAG],
        11 | 23 => [   0.0,  -DIAG,  -DIAG],
        24      => [ DIAG2,  DIAG2,  DIAG2],
        25      => [-DIAG2,  DIAG2,  DIAG2],
        26      => [ DIAG2, -DIAG2,  DIAG2],
        27      => [-DIAG2, -DIAG2,  DIAG2],
        28      => [ DIAG2,  DIAG2, -DIAG2],
        29      => [-DIAG2,  DIAG2, -DIAG2],
        30      => [ DIAG2, -DIAG2, -DIAG2],
        31      => [-DIAG2, -DIAG2, -DIAG2],
        _       => panic!("Attempt to access gradient {} of 32", index % 32),
    }
}

#[inline(always)]
#[rustfmt::skip]
pub(crate) fn get4(index: usize) -> [f64; 4] {
    // Vectors are combinations of -1, 0, and 1
    // Precompute the normalized elements
    const DIAG : f64 = 0.577_350_269_189_625_8;
    const DIAG2 : f64 = 0.5;

    match index % 64 {
        // 32 edges then 16 corners repeated twice
        0       => [   0.0,   DIAG,   DIAG,   DIAG],
        1       => [   0.0,   DIAG,   DIAG,  -DIAG],
        2       => [   0.0,   DIAG,  -DIAG,   DIAG],
        3       => [   0.0,   DIAG,  -DIAG,  -DIAG],
        4       => [   0.0,  -DIAG,   DIAG,   DIAG],
        5       => [   0.0,  -DIAG,   DIAG,  -DIAG],
        6       => [   0.0,  -DIAG,  -DIAG,   DIAG],
        7       => [   0.0,  -DIAG,  -DIAG,  -DIAG],
        8       => [  DIAG,    0.0,   DIAG,   DIAG],
        9       => [  DIAG,    0.0,   DIAG,  -DIAG],
        10      => [  DIAG,    0.0,  -DIAG,   DIAG],
        11      => [  DIAG,    0.0,  -DIAG,  -DIAG],
        12      => [ -DIAG,    0.0,   DIAG,   DIAG],
        13      => [ -DIAG,    0.0,   DIAG,  -DIAG],
        14      => [ -DIAG,    0.0,  -DIAG,   DIAG],
        15      => [ -DIAG,    0.0,  -DIAG,  -DIAG],
        16      => [  DIAG,   DIAG,    0.0,   DIAG],
        17      => [  DIAG,   DIAG,    0.0,  -DIAG],
        18      => [  DIAG,  -DIAG,    0.0,   DIAG],
        19      => [  DIAG,  -DIAG,    0.0,  -DIAG],
        20      => [ -DIAG,   DIAG,    0.0,   DIAG],
        21      => [ -DIAG,   DIAG,    0.0,  -DIAG],
        22      => [ -DIAG,  -DIAG,    0.0,   DIAG],
        23      => [ -DIAG,  -DIAG,    0.0,  -DIAG],
        24      => [  DIAG,   DIAG,   DIAG,    0.0],
        25      => [  DIAG,   DIAG,  -DIAG,    0.0],
        26      => [  DIAG,  -DIAG,   DIAG,    0.0],
        27      => [  DIAG,  -DIAG,  -DIAG,    0.0],
        28      => [ -DIAG,   DIAG,   DIAG,    0.0],
        29      => [ -DIAG,   DIAG,  -DIAG,    0.0],
        30      => [ -DIAG,  -DIAG,   DIAG,    0.0],
        31      => [ -DIAG,  -DIAG,  -DIAG,    0.0],
        32 | 48 => [ DIAG2,  DIAG2,  DIAG2,  DIAG2],
        33 | 49 => [-DIAG2,  DIAG2,  DIAG2,  DIAG2],
        34 | 50 => [ DIAG2, -DIAG2,  DIAG2,  DIAG2],
        35 | 51 => [-DIAG2, -DIAG2,  DIAG2,  DIAG2],
        36 | 52 => [ DIAG2,  DIAG2, -DIAG2,  DIAG2],
        37 | 53 => [-DIAG2,  DIAG2, -DIAG2,  DIAG2],
        38 | 54 => [ DIAG2,  DIAG2,  DIAG2, -DIAG2],
        39 | 55 => [-DIAG2,  DIAG2,  DIAG2, -DIAG2],
        40 | 56 => [ DIAG2, -DIAG2, -DIAG2,  DIAG2],
        41 | 57 => [-DIAG2, -DIAG2, -DIAG2,  DIAG2],
        42 | 58 => [ DIAG2, -DIAG2,  DIAG2, -DIAG2],
        43 | 59 => [-DIAG2, -DIAG2,  DIAG2, -DIAG2],
        44 | 60 => [ DIAG2,  DIAG2, -DIAG2, -DIAG2],
        45 | 61 => [-DIAG2,  DIAG2, -DIAG2, -DIAG2],
        46 | 62 => [ DIAG2, -DIAG2, -DIAG2, -DIAG2],
        47 | 63 => [-DIAG2, -DIAG2, -DIAG2, -DIAG2],
        _       => panic!("Attempt to access gradient {} of 64", index % 64),
    }
}