Explorar o código

Add `linalg.matrix4_look_at_from_fru`

gingerBill %!s(int64=3) %!d(string=hai) anos
pai
achega
b9701340b8
Modificáronse 1 ficheiros con 49 adicións e 0 borrados
  1. 49 0
      core/math/linalg/specific.odin

+ 49 - 0
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) {
 matrix4_perspective_f16 :: proc(fovy, aspect, near, far: f16, flip_z_axis := true) -> (m: Matrix4f16) {
 	tan_half_fovy := math.tan(0.5 * fovy)
 	tan_half_fovy := math.tan(0.5 * fovy)
 	m[0][0] = 1 / (aspect*tan_half_fovy)
 	m[0][0] = 1 / (aspect*tan_half_fovy)