summaryrefslogtreecommitdiff
path: root/advanced_lighting/9.ssao/xoshiro128plus.c
diff options
context:
space:
mode:
Diffstat (limited to 'advanced_lighting/9.ssao/xoshiro128plus.c')
-rw-r--r--advanced_lighting/9.ssao/xoshiro128plus.c28
1 files changed, 28 insertions, 0 deletions
diff --git a/advanced_lighting/9.ssao/xoshiro128plus.c b/advanced_lighting/9.ssao/xoshiro128plus.c
new file mode 100644
index 0000000..b55c63b
--- /dev/null
+++ b/advanced_lighting/9.ssao/xoshiro128plus.c
@@ -0,0 +1,28 @@
+#include <stdint.h>
+
+/* --- xoshiro128+ --- */
+static inline uint32_t rotl(const uint32_t x, int k) {
+ return (x << k) | (x >> (32 - k));
+}
+
+uint32_t next(uint32_t *s) {
+ const uint32_t result = s[0] + s[3];
+ const uint32_t t = s[1] << 9;
+ s[2] ^= s[0];
+ s[3] ^= s[1];
+ s[1] ^= s[2];
+ s[0] ^= s[3];
+ s[2] ^= t;
+ s[3] = rotl(s[3], 11);
+ return result;
+}
+/* --- /xoshiro128+ --- */
+
+float int_to_float(uint32_t random) {
+ union { uint32_t u32; float f; } u = { .u32 = random >> 9 | 0x3f800000 };
+ return u.f - 1.0;
+}
+
+float nextf(uint32_t* s) {
+ return int_to_float(next(s));
+}