void generate(const Point2i &pos) { /* Dimensions reserved to sample array requests */ m_arrayStartDim = 5; m_arrayEndDim = m_arrayStartDim + static_cast<uint32_t>(m_req1D.size() + 2 * m_req2D.size()); m_offset = 0; if (m_stride > 1) { for (int i=0; i<2; ++i) { m_pixelPosition[i] = pos[i] % MAX_RESOLUTION; /* Determine axis offset along each requested coordinate independently and use the chinese remainder theorem to solve for a combined offset */ uint64_t offset = inverseScrambledRadicalInverse(primeTable[i], m_pixelPosition[i], m_primeExponents[i], m_permutations.get() ? m_permutations->getInversePermutation(i) : NULL); m_offset += offset * (m_stride / m_primePowers[i]) * m_multInverse[i]; } m_offset %= m_stride; } uint32_t dim = m_arrayStartDim; for (size_t i=0; i<m_req1D.size(); i++) { if (!m_permutations.get()) { for (size_t j=0; j<m_sampleCount * m_req1D[i]; ++j) m_sampleArrays1D[i][j] = radicalInverseFast(dim, m_offset + j * m_stride); } else { uint16_t *perm = m_permutations->getPermutation(dim); for (size_t j=0; j<m_sampleCount * m_req1D[i]; ++j) m_sampleArrays1D[i][j] = scrambledRadicalInverseFast(dim, m_offset + j * m_stride, perm); } dim += 1; } for (size_t i=0; i<m_req2D.size(); i++) { if (!m_permutations.get()) { for (size_t j=0; j<m_sampleCount * m_req2D[i]; ++j) { m_sampleArrays2D[i][j] = Point2( radicalInverseFast(dim, m_offset + j * m_stride), radicalInverseFast(dim+1, m_offset + j * m_stride)); } } else { uint16_t *perm1 = m_permutations->getPermutation(dim); uint16_t *perm2 = m_permutations->getPermutation(dim+1); for (size_t j=0; j<m_sampleCount * m_req2D[i]; ++j) { m_sampleArrays2D[i][j] = Point2( scrambledRadicalInverseFast(dim, m_offset + j * m_stride, perm1), scrambledRadicalInverseFast(dim+1, m_offset + j * m_stride, perm2)); } } dim += 2; } setSampleIndex(0); }
void generate(const Point2i &pos) { /* Dimensions reserved to sample array requests */ m_arrayStartDim = 5; m_arrayEndDim = m_arrayStartDim + static_cast<uint32_t>(m_req1D.size() + 2 * m_req2D.size()); if (m_stride > 1) { m_pixelPosition = pos; m_pixelPosition.x %= MAX_RESOLUTION; m_pixelPosition.y %= MAX_RESOLUTION; m_offset = m_pixelPosition.x * m_resolution.y * m_sampleCount + inverseScrambledRadicalInverse(2, m_pixelPosition.y, m_logHeight, m_permutations.get() ? m_permutations->getInversePermutation(0) : NULL); } setSampleIndex(0); }