moonpool/benchs/raytracer/vec3.ml
2023-06-08 15:48:28 -04:00

29 lines
763 B
Standard ML

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 }