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
20pub inline fn randomVec2() zm.Vec {
21 return zm.f32x4(randomF32(), randomF32(), 0, 0);
22}
23
24pub inline fn randomVec3() zm.Vec {
25 return zm.f32x4(randomF32(), randomF32(), randomF32(), 0);
26}
27
28pub inline fn randomVec() zm.Vec {
29 return zm.f32x4(randomF32(), randomF32(), randomF32(), randomF32());
30}
31
32pub inline fn randomVec2M(min: f32, max: f32) zm.Vec {
33 return zm.f32x4(randomF32M(min, max), randomF32M(min, max), 0, 0);
34}
35
36pub inline fn randomVec3M(min: f32, max: f32) zm.Vec {
37 return zm.f32x4(randomF32M(min, max), randomF32M(min, max), randomF32M(min, max), 0);
38}
39
40pub inline fn randomVecM(min: f32, max: f32) zm.Vec {
41 return zm.f32x4(randomF32M(min, max), randomF32M(min, max), randomF32M(min, max), randomF32M(min, max));
42}
43
44pub inline fn randomInUnitDisk() zm.Vec {
45 while (true) {
46 const p = zm.f32x4(randomF32M(-1, 1), randomF32M(-1, 1), 0, 0);
47 if (zm.lengthSq3(p)[0] < 1.0) return p;
48 }
49}
50
51pub inline fn randomInUnitSphere() zm.Vec {
52 while (true) {
53 const p = randomVec3M(-1.0, 1.0);
54 if (zm.lengthSq3(p)[0] < 1.0) return p;
55 }
56}
57
58pub inline fn randomUnitVec() zm.Vec {
59 return zm.normalize3(randomInUnitSphere());
60}
61
62pub inline fn randomOnHemisphere(normal: zm.Vec) zm.Vec {
63 const on_unit_sphere = randomUnitVec();
64 return if (zm.dot3(on_unit_sphere, normal)[0] > 0.0) // In the same hemisphere as the normal
65 on_unit_sphere
66 else
67 -on_unit_sphere;
68}
69
70pub fn nearZero(e: zm.Vec) bool {
71 const s = 1e-8;
72 return (@abs(e[0]) < s) and (@abs(e[1]) < s) and (@abs(e[2]) < s);
73}
74
75pub inline fn reflect(v: zm.Vec, n: zm.Vec) zm.Vec {
76 return v - zm.f32x4s(2 * zm.dot3(v, n)[0]) * n;
77}
78
79pub inline fn refract(uv: zm.Vec, n: zm.Vec, etai_over_etat: f32) zm.Vec {
80 const cos_theta = @min(zm.dot3(-uv, n)[0], 1.0);
81 const r_out_perp = zm.f32x4s(etai_over_etat) * (uv + zm.f32x4s(cos_theta) * n);
82 const r_out_parallel = zm.f32x4s(-@sqrt(@abs(1.0 - zm.lengthSq3(r_out_perp)[0]))) * n;
83 return r_out_perp + r_out_parallel;
84}