this repo has no description
1const random = @import("std").crypto.random;
2const math = @import("std").math;
3
4const zm = @import("zmath");
5
6pub inline fn degreesToRadians(degrees: f32) f32 {
7 return degrees * math.pi / 180.0;
8}
9
10/// Returns a random real in [0,1).
11pub inline fn randomF32() f32 {
12 return random.float(f32);
13}
14
15/// Returns a random real in [min,max).
16pub inline fn randomF32M(min: f32, max: f32) f32 {
17 return min + (max - min) * randomF32();
18}
19
20/// Returns a random real in [0,1).
21pub inline fn randomI32() i32 {
22 return random.float(i32);
23}
24
25/// Returns a random real in [min,max).
26pub inline fn randomI32M(min: i32, max: i32) i32 {
27 return min + (max - min) * randomI32();
28}
29
30pub inline fn randomVec2() zm.Vec {
31 return zm.f32x4(randomF32(), randomF32(), 0, 0);
32}
33
34pub inline fn randomVec3() zm.Vec {
35 return zm.f32x4(randomF32(), randomF32(), randomF32(), 0);
36}
37
38pub inline fn randomVec() zm.Vec {
39 return zm.f32x4(randomF32(), randomF32(), randomF32(), randomF32());
40}
41
42pub inline fn randomVec2M(min: f32, max: f32) zm.Vec {
43 return zm.f32x4(randomF32M(min, max), randomF32M(min, max), 0, 0);
44}
45
46pub inline fn randomVec3M(min: f32, max: f32) zm.Vec {
47 return zm.f32x4(randomF32M(min, max), randomF32M(min, max), randomF32M(min, max), 0);
48}
49
50pub inline fn randomVecM(min: f32, max: f32) zm.Vec {
51 return zm.f32x4(randomF32M(min, max), randomF32M(min, max), randomF32M(min, max), randomF32M(min, max));
52}
53
54pub inline fn randomInUnitDisk() zm.Vec {
55 while (true) {
56 const p = zm.f32x4(randomF32M(-1, 1), randomF32M(-1, 1), 0, 0);
57 if (zm.lengthSq3(p)[0] < 1.0) return p;
58 }
59}
60
61pub inline fn randomInUnitSphere() zm.Vec {
62 while (true) {
63 const p = randomVec3M(-1.0, 1.0);
64 if (zm.lengthSq3(p)[0] < 1.0) return p;
65 }
66}
67
68pub inline fn randomUnitVec() zm.Vec {
69 return zm.normalize3(randomInUnitSphere());
70}
71
72pub inline fn randomOnHemisphere(normal: zm.Vec) zm.Vec {
73 const on_unit_sphere = randomUnitVec();
74 return if (zm.dot3(on_unit_sphere, normal)[0] > 0.0) // In the same hemisphere as the normal
75 on_unit_sphere
76 else
77 -on_unit_sphere;
78}
79
80pub inline fn nearZero(e: zm.Vec) bool {
81 const s = 1e-8;
82 return (@abs(e[0]) < s) and (@abs(e[1]) < s) and (@abs(e[2]) < s);
83}
84
85pub inline fn reflect(v: zm.Vec, n: zm.Vec) zm.Vec {
86 return v - zm.f32x4s(2 * zm.dot3(v, n)[0]) * n;
87}
88
89pub inline fn refract(uv: zm.Vec, n: zm.Vec, etai_over_etat: f32) zm.Vec {
90 const cos_theta = @min(zm.dot3(-uv, n)[0], 1.0);
91 const r_out_perp = zm.f32x4s(etai_over_etat) * (uv + zm.f32x4s(cos_theta) * n);
92 const r_out_parallel = zm.f32x4s(-@sqrt(@abs(1.0 - zm.lengthSq3(r_out_perp)[0]))) * n;
93 return r_out_perp + r_out_parallel;
94}