| 330 | } |
| 331 | |
| 332 | static uint32 CMJPermute(uint32 i, uint32 l, uint32 p) |
| 333 | { |
| 334 | uint32 w = l - 1; |
| 335 | w |= w >> 1; |
| 336 | w |= w >> 2; |
| 337 | w |= w >> 4; |
| 338 | w |= w >> 8; |
| 339 | w |= w >> 16; |
| 340 | do |
| 341 | { |
| 342 | i ^= p; i *= 0xe170893d; |
| 343 | i ^= p >> 16; |
| 344 | i ^= (i & w) >> 4; |
| 345 | i ^= p >> 8; i *= 0x0929eb3f; |
| 346 | i ^= p >> 23; |
| 347 | i ^= (i & w) >> 1; i *= 1 | p >> 27; |
| 348 | i *= 0x6935fa69; |
| 349 | i ^= (i & w) >> 11; i *= 0x74dcb303; |
| 350 | i ^= (i & w) >> 2; i *= 0x9e501cc3; |
| 351 | i ^= (i & w) >> 2; i *= 0xc860a3df; |
| 352 | i &= w; |
| 353 | i ^= i >> 5; |
| 354 | } |
| 355 | while (i >= l); |
| 356 | return (i + p) % l; |
| 357 | } |
| 358 | |
| 359 | static float CMJRandFloat(uint32 i, uint32 p) |
| 360 | { |