104 lines
2.3 KiB
Text
104 lines
2.3 KiB
Text
// Copyright 2009-2021 Intel Corporation
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
|
|
#pragma once
|
|
|
|
#include "../math/vec.isph"
|
|
|
|
struct RandomSampler
|
|
{
|
|
unsigned int s;
|
|
};
|
|
|
|
inline unsigned int MurmurHash3_mix(unsigned int hash, unsigned int k)
|
|
{
|
|
const unsigned int c1 = 0xcc9e2d51;
|
|
const unsigned int c2 = 0x1b873593;
|
|
const unsigned int r1 = 15;
|
|
const unsigned int r2 = 13;
|
|
const unsigned int m = 5;
|
|
const unsigned int n = 0xe6546b64;
|
|
|
|
k *= c1;
|
|
k = (k << r1) | (k >> (32 - r1));
|
|
k *= c2;
|
|
|
|
hash ^= k;
|
|
hash = ((hash << r2) | (hash >> (32 - r2))) * m + n;
|
|
|
|
return hash;
|
|
}
|
|
|
|
inline unsigned int MurmurHash3_finalize(unsigned int hash)
|
|
{
|
|
hash ^= hash >> 16;
|
|
hash *= 0x85ebca6b;
|
|
hash ^= hash >> 13;
|
|
hash *= 0xc2b2ae35;
|
|
hash ^= hash >> 16;
|
|
|
|
return hash;
|
|
}
|
|
|
|
inline unsigned int LCG_next(unsigned int value)
|
|
{
|
|
const unsigned int m = 1664525;
|
|
const unsigned int n = 1013904223;
|
|
|
|
return value * m + n;
|
|
}
|
|
|
|
inline void RandomSampler_init(RandomSampler& self, int id)
|
|
{
|
|
unsigned int hash = 0;
|
|
hash = MurmurHash3_mix(hash, id);
|
|
hash = MurmurHash3_finalize(hash);
|
|
|
|
self.s = hash;
|
|
}
|
|
|
|
inline void RandomSampler_init(RandomSampler& self, int pixelId, int sampleId)
|
|
{
|
|
unsigned int hash = 0;
|
|
hash = MurmurHash3_mix(hash, pixelId);
|
|
hash = MurmurHash3_mix(hash, sampleId);
|
|
hash = MurmurHash3_finalize(hash);
|
|
|
|
self.s = hash;
|
|
}
|
|
|
|
inline void RandomSampler_init(RandomSampler& self, int x, int y, int sampleId)
|
|
{
|
|
RandomSampler_init(self, x | (y << 16), sampleId);
|
|
}
|
|
|
|
inline int RandomSampler_getInt(RandomSampler& self) {
|
|
self.s = LCG_next(self.s); return self.s >> 1;
|
|
}
|
|
|
|
inline unsigned int RandomSampler_getUInt(RandomSampler& self) {
|
|
self.s = LCG_next(self.s); return self.s;
|
|
}
|
|
|
|
inline float RandomSampler_getFloat(RandomSampler& self) {
|
|
return (float)RandomSampler_getInt(self) * 4.656612873077392578125e-10f;
|
|
}
|
|
|
|
inline float RandomSampler_get1D(RandomSampler& self) {
|
|
return RandomSampler_getFloat(self);
|
|
}
|
|
|
|
inline Vec2f RandomSampler_get2D(RandomSampler& self)
|
|
{
|
|
const float u = RandomSampler_get1D(self);
|
|
const float v = RandomSampler_get1D(self);
|
|
return make_Vec2f(u,v);
|
|
}
|
|
|
|
inline Vec3fa RandomSampler_get3D(RandomSampler& self)
|
|
{
|
|
const float u = RandomSampler_get1D(self);
|
|
const float v = RandomSampler_get1D(self);
|
|
const float w = RandomSampler_get1D(self);
|
|
return make_Vec3fa(u,v,w);
|
|
}
|