this repo has no description
1const std = @import("std");
2const random = std.crypto.random;
3
4const zm = @import("zmath");
5
6/// Returns a random real in [0,1).
7pub inline fn randomF32() f32 {
8 return random.float(f32);
9}
10
11/// Returns a random real in [min,max).
12pub inline fn randomF32M(min: f32, max: f32) f32 {
13 return min + (max - min) * randomF32();
14}
15
16pub inline fn randomVec2() zm.Vec {
17 return zm.f32x4(randomF32, randomF32, 0, 0);
18}
19
20pub inline fn randomVec3() zm.Vec {
21 return zm.f32x4(randomF32, randomF32, randomF32, 0);
22}
23
24pub inline fn randomVec() zm.Vec {
25 return zm.f32x4(randomF32, randomF32, randomF32, randomF32);
26}
27
28pub inline fn randomVec2M(min: f32, max: f32) zm.Vec {
29 return zm.f32x4(randomF32M(min, max), randomF32M(min, max), 0, 0);
30}
31
32pub inline fn randomVec3M(min: f32, max: f32) zm.Vec {
33 return zm.f32x4(randomF32M(min, max), randomF32M(min, max), randomF32M(min, max), 0);
34}
35
36pub inline fn randomVecM(min: f32, max: f32) zm.Vec {
37 return zm.f32x4(randomF32M(min, max), randomF32M(min, max), randomF32M(min, max), randomF32M(min, max));
38}
39
40pub inline fn randomInUnitSphere() zm.Vec {
41 while (true) {
42 const p = randomVec3M(-1.0, 1.0);
43 if (zm.lengthSq3(p)[0] < 1.0) return p;
44 }
45}
46
47pub inline fn randomUnitVec() zm.Vec {
48 return zm.normalize3(randomInUnitSphere());
49}
50
51pub inline fn randomOnHemisphere(normal: zm.Vec) zm.Vec {
52 const on_unit_sphere = randomUnitVec();
53 return if (zm.dot3(on_unit_sphere, normal)[0] > 0.0) // In the same hemisphere as the normal
54 on_unit_sphere
55 else
56 -on_unit_sphere;
57}
58
59pub fn nearZero(e: zm.Vec) bool {
60 const s = 1e-8;
61 return (@abs(e[0]) < s) and (@abs(e[1]) < s) and (@abs(e[2]) < s);
62}
63
64pub fn reflect(v: zm.Vec, n: zm.Vec) zm.Vec {
65 return v - zm.f32x4s(2 * zm.dot3(v, n)[0]) * n;
66}