示例#1
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());

		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);
	}
示例#2
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);
	}