| 301 | } |
| 302 | |
| 303 | fl::i16 inoise16_raw(fl::u32 x, fl::u32 y, fl::u32 z) |
| 304 | { |
| 305 | // Find the unit cube containing the point |
| 306 | fl::u8 X = (x>>16)&0xFF; |
| 307 | fl::u8 Y = (y>>16)&0xFF; |
| 308 | fl::u8 Z = (z>>16)&0xFF; |
| 309 | |
| 310 | // Hash cube corner coordinates |
| 311 | fl::u8 A = NOISE_P(X)+Y; |
| 312 | fl::u8 AA = NOISE_P(A)+Z; |
| 313 | fl::u8 AB = NOISE_P(A+1)+Z; |
| 314 | fl::u8 B = NOISE_P(X+1)+Y; |
| 315 | fl::u8 BA = NOISE_P(B) + Z; |
| 316 | fl::u8 BB = NOISE_P(B+1)+Z; |
| 317 | |
| 318 | // Get the relative position of the point in the cube |
| 319 | fl::u16 u = x & 0xFFFF; |
| 320 | fl::u16 v = y & 0xFFFF; |
| 321 | fl::u16 w = z & 0xFFFF; |
| 322 | |
| 323 | // Get a signed version of the above for the grad function |
| 324 | fl::i16 xx = (u >> 1) & 0x7FFF; |
| 325 | fl::i16 yy = (v >> 1) & 0x7FFF; |
| 326 | fl::i16 zz = (w >> 1) & 0x7FFF; |
| 327 | fl::u16 N = 0x8000L; |
| 328 | |
| 329 | u = EASE16(u); v = EASE16(v); w = EASE16(w); |
| 330 | |
| 331 | // skip the log fade adjustment for the moment, otherwise here we would |
| 332 | // adjust fade values for u,v,w |
| 333 | fl::i16 X1 = LERP(grad16(NOISE_P(AA), xx, yy, zz), grad16(NOISE_P(BA), xx - N, yy, zz), u); |
| 334 | fl::i16 X2 = LERP(grad16(NOISE_P(AB), xx, yy-N, zz), grad16(NOISE_P(BB), xx - N, yy - N, zz), u); |
| 335 | fl::i16 X3 = LERP(grad16(NOISE_P(AA+1), xx, yy, zz-N), grad16(NOISE_P(BA+1), xx - N, yy, zz-N), u); |
| 336 | fl::i16 X4 = LERP(grad16(NOISE_P(AB+1), xx, yy-N, zz-N), grad16(NOISE_P(BB+1), xx - N, yy - N, zz - N), u); |
| 337 | |
| 338 | fl::i16 Y1 = LERP(X1,X2,v); |
| 339 | fl::i16 Y2 = LERP(X3,X4,v); |
| 340 | |
| 341 | fl::i16 ans = LERP(Y1,Y2,w); |
| 342 | |
| 343 | return ans; |
| 344 | } |
| 345 | |
| 346 | fl::i16 inoise16_raw(fl::u32 x, fl::u32 y, fl::u32 z, fl::u32 t) { |
| 347 | // 1. Extract the integer (grid) parts. |