| 100 | } |
| 101 | |
| 102 | fl::i32 perlin_s16x16::pnoise3d_raw(fl::i32 fx_raw, fl::i32 fy_raw, fl::i32 fz_raw, |
| 103 | const fl::i32 *fade_lut, |
| 104 | const fl::u8 *perm) { |
| 105 | int X, Y, Z; |
| 106 | fl::i32 x, y, z; |
| 107 | floor_frac(fx_raw, X, x); |
| 108 | floor_frac(fy_raw, Y, y); |
| 109 | floor_frac(fz_raw, Z, z); |
| 110 | X &= 255; |
| 111 | Y &= 255; |
| 112 | Z &= 255; |
| 113 | |
| 114 | fl::i32 u = fade(x, fade_lut); |
| 115 | fl::i32 v = fade(y, fade_lut); |
| 116 | fl::i32 w = fade(z, fade_lut); |
| 117 | |
| 118 | int A = perm[X & 255] + Y; |
| 119 | int AA = perm[A & 255] + Z; |
| 120 | int AB = perm[(A + 1) & 255] + Z; |
| 121 | int B = perm[(X + 1) & 255] + Y; |
| 122 | int BA = perm[B & 255] + Z; |
| 123 | int BB = perm[(B + 1) & 255] + Z; |
| 124 | |
| 125 | fl::i32 result = lerp(w, |
| 126 | lerp(v, |
| 127 | lerp(u, grad3d(perm[AA & 255], x, y, z), |
| 128 | grad3d(perm[BA & 255], x - HP_ONE, y, z)), |
| 129 | lerp(u, grad3d(perm[AB & 255], x, y - HP_ONE, z), |
| 130 | grad3d(perm[BB & 255], x - HP_ONE, y - HP_ONE, z))), |
| 131 | lerp(v, |
| 132 | lerp(u, grad3d(perm[(AA + 1) & 255], x, y, z - HP_ONE), |
| 133 | grad3d(perm[(BA + 1) & 255], x - HP_ONE, y, z - HP_ONE)), |
| 134 | lerp(u, grad3d(perm[(AB + 1) & 255], x, y - HP_ONE, z - HP_ONE), |
| 135 | grad3d(perm[(BB + 1) & 255], x - HP_ONE, y - HP_ONE, z - HP_ONE)))); |
| 136 | |
| 137 | return result >> (HP_BITS - fl::s16x16::FRAC_BITS); |
| 138 | } |
| 139 | |
| 140 | fl::i32 perlin_s16x16::grad3d(int hash, fl::i32 x, fl::i32 y, fl::i32 z) { |
| 141 | // Matches float grad(hash, x, y, z) from perlin_float.h: |