Add linalg.matrix4_look_at_from_fru

This commit is contained in:
gingerBill
2021-11-13 19:15:37 +00:00
parent 82110bf487
commit b9701340b8

View File

@@ -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)