aboutsummaryrefslogtreecommitdiff
path: root/src/math/mat4.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/math/mat4.h')
-rw-r--r--src/math/mat4.h21
1 files changed, 16 insertions, 5 deletions
diff --git a/src/math/mat4.h b/src/math/mat4.h
index adb2059..df8f533 100644
--- a/src/math/mat4.h
+++ b/src/math/mat4.h
@@ -77,15 +77,26 @@ struct Matrix4 {
};
}
- static constexpr Matrix4 projection(float aspect_ratio, float min_z, float max_z) {
+ static constexpr Matrix4 projection(float fov, float aspect_ratio, float min_z, float max_z) {
+ float inv_tan = 1.f / std::tan(fov / 2.f);
return {{
- aspect_ratio, 0.f, 0.f, 0.f,
- 0.f, -1.f, 0.f, 0.f,
- 0.f, 0.f, -2.f / (max_z - min_z), -(max_z + min_z) / (max_z - min_z),
- 0.f, 0.f, -1.f, 0.f,
+ aspect_ratio * inv_tan, 0.f, 0.f, 0.f,
+ 0.f, -inv_tan, 0.f, 0.f,
+ 0.f, 0.f, -2.f / (max_z - min_z), -(max_z + min_z) / (max_z - min_z),
+ 0.f, 0.f, -1.f, 0.f,
}};
}
+ // TODO: should be Quaternion::to_mat4
+ static constexpr Matrix4 from_quaternion(const Quaternion& q) {
+ return {
+ 2.f * (q.w * q.w + q.x * q.x) - 1.f, 2.f * (q.x * q.y - q.w * q.z) , 2.f * (q.x * q.z + q.w * q.y) , 0.f,
+ 2.f * (q.x * q.y + q.w * q.z) , 2.f * (q.w * q.w + q.y * q.y) - 1.f, 2.f * (q.y * q.z - q.w * q.x) , 0.f,
+ 2.f * (q.x * q.z - q.w * q.y) , 2.f * (q.y * q.z + q.w * q.x) , 2.f * (q.w * q.w + q.z * q.z) - 1.f, 0.f,
+ 0.f, 0.f, 0.f, 1.f,
+ };
+ }
+
std::array<float, 4 * 4> values;
constexpr Matrix4 operator+() const & {