From 1fa87fb90f8b53cd43b91885f20ead0684ad0d47 Mon Sep 17 00:00:00 2001 From: kts Date: Tue, 10 Feb 2015 05:34:58 -0800 Subject: [PATCH] Imported Mat4 class from CC. --- build/vs/vs.vcxproj | 2 + build/vs/vs.vcxproj.filters | 6 ++ src/Mat4.cpp | 201 ++++++++++++++++++++++++++++++++++++ src/Mat4.hpp | 31 ++++++ src/RenderObject.hpp | 11 +- 5 files changed, 246 insertions(+), 5 deletions(-) create mode 100644 src/Mat4.cpp create mode 100644 src/Mat4.hpp diff --git a/build/vs/vs.vcxproj b/build/vs/vs.vcxproj index cbe6246..c261874 100644 --- a/build/vs/vs.vcxproj +++ b/build/vs/vs.vcxproj @@ -76,6 +76,7 @@ xcopy /d /y "..\..\..\..\Dev\SDL2-2.0.3\lib\x86\SDL2.dll" "$(OutDir)" + @@ -95,6 +96,7 @@ xcopy /d /y "..\..\..\..\Dev\SDL2-2.0.3\lib\x86\SDL2.dll" "$(OutDir)" + diff --git a/build/vs/vs.vcxproj.filters b/build/vs/vs.vcxproj.filters index f159183..b189eb1 100644 --- a/build/vs/vs.vcxproj.filters +++ b/build/vs/vs.vcxproj.filters @@ -42,6 +42,9 @@ Classes + + Classes + @@ -73,5 +76,8 @@ Classes + + Classes + \ No newline at end of file diff --git a/src/Mat4.cpp b/src/Mat4.cpp new file mode 100644 index 0000000..79baf35 --- /dev/null +++ b/src/Mat4.cpp @@ -0,0 +1,201 @@ +/* ================================================================ +Mat4 +---------------- +This file defines the class for 4 dimensional matrices. It relies on +Vec4 for functionality. +================================================================ */ +#include "Mat4.hpp" +#include // memset +#include + +Mat4::Mat4() { + vecs[0][0] = 1.0f; + vecs[1][1] = 1.0f; + vecs[2][2] = 1.0f; + vecs[3][3] = 1.0f; +} +Mat4::~Mat4() {} +Mat4::Mat4(Vec4 a_, Vec4 b_, Vec4 c_, Vec4 d_) { + vecs[0] = a_; + vecs[1] = b_; + vecs[2] = c_; + vecs[3] = d_; +} + +float *Mat4::toFloats(float *floats) { + int i; + float *m = &vecs[0][0]; + for (i = 0; i < 16; i++) { + floats[i] = m[i]; + } + return floats; +} +Mat4 Mat4::getInverse(Mat4 out) { + float *m = &vecs[0][0]; // just so my brain doesn't explode + out[0][0] = m[5] * m[10] * m[15] - + m[5] * m[11] * m[14] - + m[9] * m[6] * m[15] + + m[9] * m[7] * m[14] + + m[13] * m[6] * m[11] - + m[13] * m[7] * m[10]; + out[0][1] = -m[1] * m[10] * m[15] + + m[1] * m[11] * m[14] + + m[9] * m[2] * m[15] - + m[9] * m[3] * m[14] - + m[13] * m[2] * m[11] + + m[13] * m[3] * m[10]; + out[0][2] = m[1] * m[6] * m[15] - + m[1] * m[7] * m[14] - + m[5] * m[2] * m[15] + + m[5] * m[3] * m[14] + + m[13] * m[2] * m[7] - + m[13] * m[3] * m[6]; + out[0][3] = -m[1] * m[6] * m[11] + + m[1] * m[7] * m[10] + + m[5] * m[2] * m[11] - + m[5] * m[3] * m[10] - + m[9] * m[2] * m[7] + + m[9] * m[3] * m[6]; + out[1][0] = -m[4] * m[10] * m[15] + + m[4] * m[11] * m[14] + + m[8] * m[6] * m[15] - + m[8] * m[7] * m[14] - + m[12] * m[6] * m[11] + + m[12] * m[7] * m[10]; + out[1][1] = m[0] * m[10] * m[15] - + m[0] * m[11] * m[14] - + m[8] * m[2] * m[15] + + m[8] * m[3] * m[14] + + m[12] * m[2] * m[11] - + m[12] * m[3] * m[10]; + out[1][2] = -m[0] * m[6] * m[15] + + m[0] * m[7] * m[14] + + m[4] * m[2] * m[15] - + m[4] * m[3] * m[14] - + m[12] * m[2] * m[7] + + m[12] * m[3] * m[6]; + out[1][3] = m[0] * m[6] * m[11] - + m[0] * m[7] * m[10] - + m[4] * m[2] * m[11] + + m[4] * m[3] * m[10] + + m[8] * m[2] * m[7] - + m[8] * m[3] * m[6]; + out[2][0] = m[4] * m[9] * m[15] - + m[4] * m[11] * m[13] - + m[8] * m[5] * m[15] + + m[8] * m[7] * m[13] + + m[12] * m[5] * m[11] - + m[12] * m[7] * m[9]; + out[2][1] = -m[0] * m[9] * m[15] + + m[0] * m[11] * m[13] + + m[8] * m[1] * m[15] - + m[8] * m[3] * m[13] - + m[12] * m[1] * m[11] + + m[12] * m[3] * m[9]; + out[2][2] = m[0] * m[5] * m[15] - + m[0] * m[7] * m[13] - + m[4] * m[1] * m[15] + + m[4] * m[3] * m[13] + + m[12] * m[1] * m[7] - + m[12] * m[3] * m[5]; + out[2][3] = -m[0] * m[5] * m[11] + + m[0] * m[7] * m[9] + + m[4] * m[1] * m[11] - + m[4] * m[3] * m[9] - + m[8] * m[1] * m[7] + + m[8] * m[3] * m[5]; + out[3][0] = -m[4] * m[9] * m[14] + + m[4] * m[10] * m[13] + + m[8] * m[5] * m[14] - + m[8] * m[6] * m[13] - + m[12] * m[5] * m[10] + + m[12] * m[6] * m[9]; + out[3][1] = m[0] * m[9] * m[14] - + m[0] * m[10] * m[13] - + m[8] * m[1] * m[14] + + m[8] * m[2] * m[13] + + m[12] * m[1] * m[10] - + m[12] * m[2] * m[9]; + out[3][2] = -m[0] * m[5] * m[14] + + m[0] * m[6] * m[13] + + m[4] * m[1] * m[14] - + m[4] * m[2] * m[13] - + m[12] * m[1] * m[6] + + m[12] * m[2] * m[5]; + out[3][3] = m[0] * m[5] * m[10] - + m[0] * m[6] * m[9] - + m[4] * m[1] * m[10] + + m[4] * m[2] * m[9] + + m[8] * m[1] * m[6] - + m[8] * m[2] * m[5]; + + float det = m[0] * out[0][0] + m[1] * out[1][0] + m[2] * out[2][0] + m[3] * out[3][0]; + //if (det == 0) return false; + det = 1.0f / det; + + int i; + float *o_m = &out[0][0]; // just so my brain doesn't explode + for (i = 0; i < 16; i++) { + o_m[i] = o_m[i] * det; + } + return out; + } + +void Mat4::print() { + int i; + float *m = &vecs[0][0]; + for (i = 0; i < 16; i++) { + std::cout << "[" << i << "]=" << m[i] << " "; + if (i == 3 || i == 7 || i == 11 || i == 15) std::cout << std::endl; + } + std::cout << std::endl; +} + +Mat4 Mat4::operator*(const Mat4 &mat) { + Vec4 x( + vecs[0][0] * mat[0][0] + vecs[1][0] * mat[0][1] + vecs[2][0] * mat[0][2] + vecs[3][0] * mat[0][3], + vecs[0][1] * mat[0][0] + vecs[1][1] * mat[0][1] + vecs[2][1] * mat[0][2] + vecs[3][1] * mat[0][3], + vecs[0][2] * mat[0][0] + vecs[1][2] * mat[0][1] + vecs[2][2] * mat[0][2] + vecs[3][2] * mat[0][3], + vecs[0][3] * mat[0][0] + vecs[1][3] * mat[0][1] + vecs[2][3] * mat[0][2] + vecs[3][3] * mat[0][3] + ); + Vec4 y( + vecs[0][0] * mat[1][0] + vecs[1][0] * mat[1][1] + vecs[2][0] * mat[1][2] + vecs[3][0] * mat[1][3], + vecs[0][1] * mat[1][0] + vecs[1][1] * mat[1][1] + vecs[2][1] * mat[1][2] + vecs[3][1] * mat[1][3], + vecs[0][2] * mat[1][0] + vecs[1][2] * mat[1][1] + vecs[2][2] * mat[1][2] + vecs[3][2] * mat[1][3], + vecs[0][3] * mat[1][0] + vecs[1][3] * mat[1][1] + vecs[2][3] * mat[1][2] + vecs[3][3] * mat[1][3] + ); + Vec4 z( + vecs[0][0] * mat[2][0] + vecs[1][0] * mat[2][1] + vecs[2][0] * mat[2][2] + vecs[3][0] * mat[2][3], + vecs[0][1] * mat[2][0] + vecs[1][1] * mat[2][1] + vecs[2][1] * mat[2][2] + vecs[3][1] * mat[2][3], + vecs[0][2] * mat[2][0] + vecs[1][2] * mat[2][1] + vecs[2][2] * mat[2][2] + vecs[3][2] * mat[2][3], + vecs[0][3] * mat[2][0] + vecs[1][3] * mat[2][1] + vecs[2][3] * mat[2][2] + vecs[3][3] * mat[2][3] + ); + Vec4 w( + vecs[0][0] * mat[3][0] + vecs[1][0] * mat[3][1] + vecs[2][0] * mat[3][2] + vecs[3][0] * mat[3][3], + vecs[0][1] * mat[3][0] + vecs[1][1] * mat[3][1] + vecs[2][1] * mat[3][2] + vecs[3][1] * mat[3][3], + vecs[0][2] * mat[3][0] + vecs[1][2] * mat[3][1] + vecs[2][2] * mat[3][2] + vecs[3][2] * mat[3][3], + vecs[0][3] * mat[3][0] + vecs[1][3] * mat[3][1] + vecs[2][3] * mat[3][2] + vecs[3][3] * mat[3][3] + ); + return Mat4(x, y, z, w); +} +Vec4 Mat4::operator*(const Vec4 &vec) { + return Vec4( + vecs[0][0] * vec[0] + vecs[1][0] * vec[1] + vecs[2][0] * vec[2] + vecs[3][0] * vec[3], + vecs[0][1] * vec[0] + vecs[1][1] * vec[1] + vecs[2][1] * vec[2] + vecs[3][1] * vec[3], + vecs[0][2] * vec[0] + vecs[1][2] * vec[1] + vecs[2][2] * vec[2] + vecs[3][2] * vec[3], + vecs[0][3] * vec[0] + vecs[1][3] * vec[1] + vecs[2][3] * vec[2] + vecs[3][3] * vec[3] + ); +} +Mat4 Mat4::operator/=(float s) { + vecs[0] /= s; + vecs[1] /= s; + vecs[2] /= s; + vecs[3] /= s; + return *this; +} +const Vec4& Mat4::operator[](int index) const { + return vecs[index]; +} +Vec4& Mat4::operator[](int index) { + return vecs[index]; +} \ No newline at end of file diff --git a/src/Mat4.hpp b/src/Mat4.hpp new file mode 100644 index 0000000..29af3ee --- /dev/null +++ b/src/Mat4.hpp @@ -0,0 +1,31 @@ +/* ================================================================ +Mat4 +---------------- +This header file describes the classes for 4D matrices, yo. +================================================================ */ +#ifndef Mat4_HPP +#define Mat4_HPP +#include "Vec.hpp" +class Mat4 { + public: + // constructor + Mat4(); + Mat4(const Vec4, const Vec4, const Vec4, const Vec4); + // destructor + ~Mat4(); + // members + Vec4 vecs[4]; + // + void print(); + float *toFloats(float *floats); + Mat4 getInverse(Mat4 out); + // mul + Mat4 operator*(const Mat4 &mat); + Mat4 operator/=(float s); + Vec4 operator*(const Vec4 &vec); + // access + const Vec4& operator[](int index) const; + Vec4& operator[](int index); +}; + +#endif \ No newline at end of file diff --git a/src/RenderObject.hpp b/src/RenderObject.hpp index 62d6d83..a635b5a 100644 --- a/src/RenderObject.hpp +++ b/src/RenderObject.hpp @@ -10,16 +10,17 @@ a Mesh, a texture, a position, and an orientation. #ifndef RENDEROBJECT_HPP #define RENDEROBJECT_HPP #include "common.hpp" -#include "Vec.hpp" +#include "Mat4.hpp" class RenderObject { public: RenderObject(); ~RenderObject(); private: - // Mesh mesh; + // Mesh *mesh; // GLuint texture; - // TODO: replace position and orientation with matrix? - Vec3 position; - Vec3 orientation; + Mat4 translation; + Mat4 rotation; + Mat4 scale; + Mat4 modelview; }; #endif \ No newline at end of file