38 #ifndef RixRNGProgressive_h 39 #define RixRNGProgressive_h 84 #define N_PMJ_DIMS 24 // number of pmj dimensions (8*3D) 85 #define N_PMJ_SEQS 48 // number of different pmj sequences 86 #define N_PMJ_SAMPS 4096 // number of samples in each pmj sequence 99 HashToRandom(
const unsigned value,
const unsigned scramble)
102 unsigned result = value;
104 result ^= result >> 17;
105 result ^= result >> 10; result *= 0xb36534e5;
106 result ^= result >> 12;
107 result ^= result >> 21; result *= 0x93fc4795;
108 result ^= 0xdf6e307f;
109 result ^= result >> 17; result *= 1 | scramble >> 18;
110 return static_cast<float>(result) / 4298115584.0f;
119 HashToRandomUInt(
unsigned int const value,
unsigned int const scramble)
122 unsigned int result = value;
124 result ^= result >> 17;
125 result ^= result >> 10; result *= 0xb36534e5;
126 result ^= result >> 12;
127 result ^= result >> 21; result *= 0x93fc4795;
128 result ^= 0xdf6e307f;
129 result ^= result >> 17; result *= 1 | scramble >> 18;
147 shuffle(
unsigned int pattern,
unsigned int sample)
149 unsigned int sample16, s;
151 sample16 = sample % 16;
153 if (sample < 16)
return sample;
156 if (sample16 == 0 && (pattern & 0x0100)) s++;
157 if (sample16 == 1 && (pattern & 0x0100)) s--;
158 if (sample16 == 2 && (pattern & 0x0200)) s++;
159 if (sample16 == 3 && (pattern & 0x0200)) s--;
160 if (sample16 == 4 && (pattern & 0x0400)) s++;
161 if (sample16 == 5 && (pattern & 0x0400)) s--;
162 if (sample16 == 6 && (pattern & 0x0800)) s++;
163 if (sample16 == 7 && (pattern & 0x0800)) s--;
164 if (sample16 == 8 && (pattern & 0x1000)) s++;
165 if (sample16 == 9 && (pattern & 0x1000)) s--;
166 if (sample16 == 10 && (pattern & 0x2000)) s++;
167 if (sample16 == 11 && (pattern & 0x2000)) s--;
168 if (sample16 == 12 && (pattern & 0x4000)) s++;
169 if (sample16 == 13 && (pattern & 0x4000)) s--;
170 if (sample16 == 14 && (pattern & 0x8000)) s++;
171 if (sample16 == 15 && (pattern & 0x8000)) s--;
174 if ((sample16 == 0 || sample16 == 1) && (pattern & 0x10000)) s += 4;
175 if ((sample16 == 4 || sample16 == 5) && (pattern & 0x10000)) s -= 4;
176 if ((sample16 == 2 || sample16 == 3) && (pattern & 0x20000)) s += 4;
177 if ((sample16 == 6 || sample16 == 7) && (pattern & 0x20000)) s -= 4;
178 if ((sample16 == 8 || sample16 == 9) && (pattern & 0x40000)) s += 4;
179 if ((sample16 == 12 || sample16 == 13) && (pattern & 0x40000)) s -= 4;
180 if ((sample16 == 10 || sample16 == 11) && (pattern & 0x80000)) s += 4;
181 if ((sample16 == 14 || sample16 == 15) && (pattern & 0x80000)) s -= 4;
184 if (pattern & 0x100000) s = s + 15 - 2*(s%16);
196 assert(sample/16 == s/16);
204 fpScramble(
float f,
unsigned int scramble)
212 f2i.i ^= (scramble & 0x007fffff);
218 const unsigned int pattern,
219 const unsigned int sample)
const 223 unsigned int d, t, s;
229 if (sample > nSeqs * nSamps)
234 result = HashToRandom(sample, pattern * 0x51633e2d);
246 d = (pattern >> 7) % nDims;
252 s = shuffle(pattern, sample);
263 s = s * nSeqs * nDims + t * nDims + d;
264 assert(s < nDims * nSeqs * nSamps);
267 float**
const tables = (
float**)pmjTables;
268 sampleTable = tables[0];
269 result = sampleTable[s];
270 assert(0.0f <= result && result <= 1.0f);
276 unsigned int pattern1 = HashToRandomUInt(pattern, 0x51633e2d);
277 result = fpScramble(result, pattern1);
280 if (result > 0.999990f) result = 0.999990f;
281 assert(0.0f <= result && result < 1.0f);
289 const unsigned int pattern,
290 const unsigned int sample)
const 294 unsigned int d, t, s;
300 if (sample > nSeqs * nSamps)
305 result.
x = HashToRandom(sample, pattern * 0x51633e2d);
306 result.
y = HashToRandom(sample, pattern * 0x68bc21eb);
319 d = 3 * ((pattern >> 23) & 0x7);
330 s = shuffle(pattern, sample);
341 s = s * nSeqs * nDims + t * nDims + d;
342 assert(s < nDims * nSeqs * nSamps);
345 float**
const tables = (
float**)pmjTables;
346 sampleTable = tables[0];
347 result.
x = sampleTable[s];
348 result.
y = sampleTable[s+1];
349 assert(0.0f <= result.
x && result.
x <= 1.0f);
350 assert(0.0f <= result.
y && result.
y <= 1.0f);
358 unsigned int pattern1 = HashToRandomUInt(pattern, 0x51633e2d);
359 unsigned int pattern2 = HashToRandomUInt(pattern, 0x68bc21eb);
360 result.
x = fpScramble(result.
x, pattern1);
361 result.
y = fpScramble(result.
y, pattern2);
364 if (result.
x > 0.999990f) result.
x = 0.999990f;
365 if (result.
y > 0.999990f) result.
y = 0.999990f;
366 assert(0.0f <= result.
x && result.
x < 1.0f);
367 assert(0.0f <= result.
y && result.
y < 1.0f);
374 const unsigned int pattern,
375 const unsigned int sample)
const 379 unsigned int d, t, s;
385 if (sample > nSeqs * nSamps)
390 result.x = HashToRandom(sample, pattern * 0x51633e2d);
391 result.y = HashToRandom(sample, pattern * 0x68bc21eb);
392 result.z = HashToRandom(sample, pattern * 0x02e5be93);
405 d = 3 * ((pattern >> 23) & 0x7);
411 s = shuffle(pattern, sample);
422 s = s * nSeqs * nDims + t * nDims + d;
423 assert(s < nDims * nSeqs * nSamps);
426 float**
const tables = (
float**)pmjTables;
427 sampleTable = tables[0];
428 result.x = sampleTable[s];
429 result.y = sampleTable[s+1];
430 result.z = sampleTable[s+2];
431 assert(0.0f <= result.x && result.x <= 1.0f);
432 assert(0.0f <= result.y && result.y <= 1.0f);
433 assert(0.0f <= result.z && result.z <= 1.0f);
441 unsigned int pattern1 = HashToRandomUInt(pattern, 0x51633e2d);
442 unsigned int pattern2 = HashToRandomUInt(pattern, 0x68bc21eb);
443 unsigned int pattern3 = HashToRandomUInt(pattern, 0x02e5be93);
444 result.x = fpScramble(result.x, pattern1);
445 result.y = fpScramble(result.y, pattern2);
446 result.z = fpScramble(result.z, pattern3);
449 if (result.x > 0.999990f) result.x = 0.999990f;
450 if (result.y > 0.999990f) result.y = 0.999990f;
451 if (result.z > 0.999990f) result.z = 0.999990f;
452 assert(0.0f <= result.x && result.x < 1.0f);
453 assert(0.0f <= result.y && result.y < 1.0f);
454 assert(0.0f <= result.z && result.z < 1.0f);
464 virtual float Sample1D(
const SampleCtx& rctx,
unsigned i)
const 467 return progressive1DSample(rctx.patternid, rctx.sampleid);
473 return progressive2DSample(rctx.patternid, rctx.sampleid);
479 return progressive3DSample(rctx.patternid, rctx.sampleid);
486 const SampleCtx* rctx,
489 for (
unsigned int i = 0; i < n; ++i)
491 xis[i] = progressive1DSample(rctx[i].patternid, rctx[i].sampleid);
496 const SampleCtx* rctx,
499 for (
unsigned int i = 0; i < n; ++i)
501 xis[i] = progressive2DSample(rctx[i].patternid, rctx[i].sampleid);
506 const SampleCtx* rctx,
509 for (
unsigned int i = 0; i < n; ++i)
511 xis[i] = progressive3DSample(rctx[i].patternid, rctx[i].sampleid);
virtual float Sample1D(const SampleCtx &rctx, unsigned i) const
virtual void MultiSample3D(unsigned int n, const SampleCtx *rctx, RtFloat3 *xis) const
ProgressiveSampler(void *tables)
virtual RtFloat2 Sample2D(const SampleCtx &rctx, unsigned i) const
virtual void MultiSample2D(unsigned int n, const SampleCtx *rctx, RtFloat2 *xis) const
virtual RtFloat3 Sample3D(const SampleCtx &rctx, unsigned i) const
virtual void MultiSample1D(unsigned int n, const SampleCtx *rctx, float *xis) const