this repo has no description
at 232ee55093cceaa6d53d8fd08f9ee489f6bcec79 66 lines 1.8 kB view raw
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}