diff --git a/core/math/linalg/specific.odin b/core/math/linalg/specific.odin index 3729b0954..5cb68e3a8 100644 --- a/core/math/linalg/specific.odin +++ b/core/math/linalg/specific.odin @@ -2033,6 +2033,55 @@ matrix4_look_at :: proc{ } +matrix4_look_at_from_fru_f16 :: proc(eye, f, r, u: Vector3f16, flip_z_axis := true) -> (m: Matrix4f16) { + f, s, u := f, r, u + f = normalize(f) + s = normalize(s) + u = normalize(u) + fe := dot(f, eye) + + return { + {+s.x, +u.x, -f.x, 0}, + {+s.y, +u.y, -f.y, 0}, + {+s.z, +u.z, -f.z, 0}, + {-dot(s, eye), -dot(u, eye), +fe if flip_z_axis else -fe, 1}, + } +} +matrix4_look_at_from_fru_f32 :: proc(eye, f, r, u: Vector3f32, flip_z_axis := true) -> (m: Matrix4f32) { + f, s, u := f, r, u + f = normalize(f) + s = normalize(s) + u = normalize(u) + fe := dot(f, eye) + + return { + {+s.x, +u.x, -f.x, 0}, + {+s.y, +u.y, -f.y, 0}, + {+s.z, +u.z, -f.z, 0}, + {-dot(s, eye), -dot(u, eye), +fe if flip_z_axis else -fe, 1}, + } +} +matrix4_look_at_from_fru_f64 :: proc(eye, f, r, u: Vector3f64, flip_z_axis := true) -> (m: Matrix4f64) { + f, s, u := f, r, u + f = normalize(f) + s = normalize(s) + u = normalize(u) + fe := dot(f, eye) + + return { + {+s.x, +u.x, -f.x, 0}, + {+s.y, +u.y, -f.y, 0}, + {+s.z, +u.z, -f.z, 0}, + {-dot(s, eye), -dot(u, eye), +fe if flip_z_axis else -fe, 1}, + } +} +matrix4_look_at_from_fru :: proc{ + matrix4_look_at_from_fru_f16, + matrix4_look_at_from_fru_f32, + matrix4_look_at_from_fru_f64, +} + + matrix4_perspective_f16 :: proc(fovy, aspect, near, far: f16, flip_z_axis := true) -> (m: Matrix4f16) { tan_half_fovy := math.tan(0.5 * fovy) m[0][0] = 1 / (aspect*tan_half_fovy)