/////////////////////////////////////////////////////////////////////////////// namespace util { namespace noise { namespace rand { template < typename U, size_t S, typename T, template class Q > U permute::scalar (uint64_t seed, Q query) noexcept { size_t idx = PERMUTE[seed&0xff]; for (auto i: query) idx = PERMUTE[(idx+i)&0xff]; return PERMUTE[idx] / U(0xff); } //------------------------------------------------------------------------- template < template class R, typename U, size_t S, typename T, template class Q > R permute::coord (uint64_t seed, Q query) noexcept { auto accum = seed; for (auto q: query) { size_t idx = q + accum; accum = PERMUTE[idx & 0xff]; } R res; for (size_t i = 0; i < S; ++i) { res[i] = PERMUTE[accum]; res[i] /= 0xff; accum = PERMUTE[(accum + i) & 0xff]; } return res; } } } }