summaryrefslogtreecommitdiff
path: root/advanced_lighting/9.ssao/xoshiro128plus.c
diff options
context:
space:
mode:
authorpryazha <pryadeiniv@mail.ru>2025-06-15 16:11:31 +0500
committerpryazha <pryadeiniv@mail.ru>2025-06-15 16:11:31 +0500
commit9d944f26d359e4bc1ffd8e44350b0df9f0935b18 (patch)
tree9759a83a76ab741a587b99f00c2463eafd05d813 /advanced_lighting/9.ssao/xoshiro128plus.c
parentd65ddd07a43d5ffdcf2ddf90d6f86626cf9b92d8 (diff)
something
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));
+}