type vec3 = { x: float; y: float; z: float; } let of_floats (e1, e2, e3) = { x = e1; y = e2; z = e3 } let add v w = { x = v.x +. w.x; y = v.y +. w.y; z = v.z +. w.z } let sub v w = { x = v.x -. w.x; y = v.y -. w.y; z = v.z -. w.z } let neg v = sub { x = 0.0; y = 0.0; z = 0.0 } v let dot v w = (v.x *. w.x) +. (v.y *. w.y) +. (v.z *. w.z) let cross v w = { x = (v.y *. w.z) -. (v.z *. w.y); y = (v.z *. w.x) -. (v.x *. w.z); z = (v.x *. w.y) -. (v.y *. w.x); } let length v = sqrt (dot v v) let unit_vector v = let l = length v in { x = v.x /. l; y = v.y /. l; z = v.z /. l } let mul t v = { x = t *. v.x; y = t *. v.y; z = t *. v.z } (* pairwise multiplication *) let pmul v w = { x = v.x *. w.x; y = v.y *. w.y; z = v.z *. w.z }