Imported Mat4 class from CC.

master
kts 2015-02-10 05:34:58 -08:00
parent 66eb0364b3
commit 1fa87fb90f
5 changed files with 246 additions and 5 deletions

View File

@ -76,6 +76,7 @@ xcopy /d /y "..\..\..\..\Dev\SDL2-2.0.3\lib\x86\SDL2.dll" "$(OutDir)"</Command>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="..\..\src\main.cpp" />
<ClCompile Include="..\..\src\Mat4.cpp" />
<ClCompile Include="..\..\src\RenderCamera.cpp" />
<ClCompile Include="..\..\src\RenderObject.cpp" />
<ClCompile Include="..\..\src\RenderScene.cpp" />
@ -95,6 +96,7 @@ xcopy /d /y "..\..\..\..\Dev\SDL2-2.0.3\lib\x86\SDL2.dll" "$(OutDir)"</Command>
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\..\src\common.hpp" />
<ClInclude Include="..\..\src\Mat4.hpp" />
<ClInclude Include="..\..\src\RenderCamera.hpp" />
<ClInclude Include="..\..\src\RenderObject.hpp" />
<ClInclude Include="..\..\src\RenderScene.hpp" />

View File

@ -42,6 +42,9 @@
<ClCompile Include="..\..\src\Vec.cpp">
<Filter>Classes</Filter>
</ClCompile>
<ClCompile Include="..\..\src\Mat4.cpp">
<Filter>Classes</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<None Include="..\..\..\..\Dev\SDL2-2.0.3\lib\x86\SDL2.dll">
@ -73,5 +76,8 @@
<ClInclude Include="..\..\src\Vec.hpp">
<Filter>Classes</Filter>
</ClInclude>
<ClInclude Include="..\..\src\Mat4.hpp">
<Filter>Classes</Filter>
</ClInclude>
</ItemGroup>
</Project>

201
src/Mat4.cpp 100644
View File

@ -0,0 +1,201 @@
/* ================================================================
Mat4
----------------
This file defines the class for 4 dimensional matrices. It relies on
Vec4 for functionality.
================================================================ */
#include "Mat4.hpp"
#include <string.h> // memset
#include <iostream>
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];
}

31
src/Mat4.hpp 100644
View File

@ -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

View File

@ -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