noise/
gradient.rs

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