diff --git a/include/zeus/CTransform.hpp b/include/zeus/CTransform.hpp index 679b564..a7e5e8f 100644 --- a/include/zeus/CTransform.hpp +++ b/include/zeus/CTransform.hpp @@ -14,8 +14,7 @@ class CTransform { public: constexpr CTransform() : basis(false) {} - constexpr CTransform(const CMatrix3f& basis, const CVector3f& offset = {}) - : basis(basis), origin(offset) {} + constexpr CTransform(const CMatrix3f& basis, const CVector3f& offset = {}) : basis(basis), origin(offset) {} /* Column constructor */ constexpr CTransform(const CVector3f& c0, const CVector3f& c1, const CVector3f& c2, const CVector3f& c3) @@ -36,6 +35,15 @@ public: return CTransform(inv, inv * -origin); } + [[nodiscard]] CTransform quickInverse() const { + return CTransform{basis.transposed(), + CVector3f{ + basis[0][0] * -origin.x() - basis[0][1] * origin.y() - basis[0][2] * origin.z(), + basis[1][0] * -origin.x() - basis[1][1] * origin.y() - basis[1][2] * origin.z(), + basis[2][0] * -origin.x() - basis[2][1] * origin.y() - basis[2][2] * origin.z(), + }}; + } + [[nodiscard]] static CTransform Translate(const CVector3f& position) { return {CMatrix3f(), position}; } [[nodiscard]] static CTransform Translate(float x, float y, float z) { return Translate({x, y, z}); } @@ -178,6 +186,24 @@ public: return ret; } + /** + * Outputs the matrix to a C-style array (column-major, GX style) + */ + void toCStyleMatrix(float mtx[3][4]) const { + mtx[0][0] = basis[0][0]; + mtx[0][1] = basis[1][0]; + mtx[0][2] = basis[2][0]; + mtx[0][3] = origin.x(); + mtx[1][0] = basis[0][1]; + mtx[1][1] = basis[1][1]; + mtx[1][2] = basis[2][1]; + mtx[1][3] = origin.y(); + mtx[2][0] = basis[0][2]; + mtx[2][1] = basis[1][2]; + mtx[2][2] = basis[2][2]; + mtx[2][3] = origin.z(); + } + [[nodiscard]] CVector3f upVector() const { return basis.m[2]; } [[nodiscard]] CVector3f frontVector() const { return basis.m[1]; }