this repo has no description
at main 2.7 kB view raw
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}