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