diff options
-rw-r--r-- | maths.cpp | 66 | ||||
-rw-r--r-- | maths.hpp | 15 |
2 files changed, 72 insertions, 9 deletions
@@ -89,6 +89,25 @@ m4f::m4f(float d) { m[3][3] = d; } +m4f::m4f(const v4f& r0, const v4f& r1, const v4f& r2, const v4f& r3) { + m[0][0] = r0.x; + m[0][1] = r0.y; + m[0][2] = r0.z; + m[0][3] = r0.w; + m[1][0] = r1.x; + m[1][1] = r1.y; + m[1][2] = r1.z; + m[1][3] = r1.w; + m[2][0] = r2.x; + m[2][1] = r2.y; + m[2][2] = r2.z; + m[2][3] = r2.w; + m[3][0] = r3.x; + m[3][1] = r3.y; + m[3][2] = r3.z; + m[3][3] = r3.w; +} + m4f m4f::identity() { return m4f(1.0f); } @@ -323,15 +342,11 @@ m4f m4f::transposed() const { return r; } -v4f m4f::transform(m4f m, v4f v) { - return v4f( - m.m[0][0] * v.x + m.m[1][0] * v.y + m.m[2][0] * v.z + m.m[3][0] * v.w, - m.m[0][1] * v.x + m.m[1][1] * v.y + m.m[2][1] * v.z + m.m[3][1] * v.w, - m.m[0][2] * v.x + m.m[1][2] * v.y + m.m[2][2] * v.z + m.m[3][2] * v.w, - m.m[0][3] * v.x + m.m[1][3] * v.y + m.m[2][3] * v.z + m.m[3][3] * v.w); +v4f m4f::transform(const m4f& m, const v4f& v) { + return m * v; } -AABB m4f::transform(m4f m, AABB aabb) { +AABB m4f::transform(const m4f& m, const AABB& aabb) { v3f corners[] = { aabb.min, v3f(aabb.min.x, aabb.max.y, aabb.min.z), @@ -361,3 +376,40 @@ AABB m4f::transform(m4f m, AABB aabb) { return result; } + +m3f::m3f() {} +m3f::m3f(float d) { + for (int y = 0; y < 3; y++) { + for (int x = 0; x < 3; x++) { + m[x][y] = 0.0f; + } + } + m[0][0] = d; + m[1][1] = d; + m[2][2] = d; + m[3][3] = d; +} + +m3f::m3f(const v3f& r0, const v3f& r1, const v3f& r2) { + m[0][0] = r0.x; + m[0][1] = r0.y; + m[0][2] = r0.z; + m[1][0] = r1.x; + m[1][1] = r1.y; + m[1][2] = r1.z; + m[2][0] = r2.x; + m[2][1] = r2.y; + m[2][2] = r2.z; +} + +v3f m3f::transform(const m3f& m, const v3f& v) { + return m * v; +} + +v3f m3f::operator*(const v3f& other) const { + return v3f( + m[0][0] * other.x + m[1][0] * other.y + m[2][0] * other.z, + m[0][1] * other.x + m[1][1] * other.y + m[2][1] * other.z, + m[0][2] * other.x + m[1][2] * other.y + m[2][2] * other.z + ); +} @@ -486,6 +486,7 @@ struct m4f { m4f(); m4f(float d); + m4f(const v4f& r0, const v4f& r1, const v4f& r2, const v4f& r3); static m4f identity(); static m4f screenspace(float hw, float hh); @@ -503,8 +504,8 @@ struct m4f { static m4f pers(float fov, float asp, float n, float f); static m4f orth(float l, float r, float b, float t, float n, float f); - static v4f transform(m4f m, v4f v); - static AABB transform(m4f m, AABB aabb); + static v4f transform(const m4f& m, const v4f& v); + static AABB transform(const m4f& m, const AABB& aabb); m4f inverse() const; m4f transposed() const; @@ -518,5 +519,15 @@ inline static v4f make_color(uint32_t rgb, uint8_t a) { (float)a / 255.0f); } +struct m3f { + float m[3][3]; + + m3f(); + m3f(float d); + m3f(const v3f& r0, const v3f& r1, const v3f& r3); + + static v3f transform(const m3f& m, const v3f& v); + v3f operator*(const v3f& other) const; +}; #endif |