summaryrefslogtreecommitdiff
path: root/advanced_lighting/9.ssao/xoshiro128plus.c
blob: b55c63bcefe2baf0c19631dae3a8729534ac79eb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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));
}