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}