#include #include #include #include "math/Matrix.h" Matrix::Matrix() { setToIdentity(); } Matrix& Matrix::set(const Matrix& other) { *this = other; return *this; } Matrix& Matrix::setToIdentity() { data[0] = 1.0f; data[1] = 0.0f; data[2] = 0.0f; data[3] = 0.0f; data[4] = 1.0f; data[5] = 0.0f; data[6] = 0.0f; data[7] = 0.0f; data[8] = 1.0f; return *this; } Matrix& Matrix::set(uint index, float f) { data[index] = f; return *this; } const float* Matrix::getValues() const { return data; } Matrix& Matrix::mul(const Matrix& m) { float mNew[9]; mNew[0] = data[0] * m.data[0] + data[3] * m.data[1] + data[6] * m.data[2]; mNew[1] = data[1] * m.data[0] + data[4] * m.data[1] + data[7] * m.data[2]; mNew[2] = data[2] * m.data[0] + data[5] * m.data[1] + data[8] * m.data[2]; mNew[3] = data[0] * m.data[3] + data[3] * m.data[4] + data[6] * m.data[5]; mNew[4] = data[1] * m.data[3] + data[4] * m.data[4] + data[7] * m.data[5]; mNew[5] = data[2] * m.data[3] + data[5] * m.data[4] + data[8] * m.data[5]; mNew[6] = data[0] * m.data[6] + data[3] * m.data[7] + data[6] * m.data[8]; mNew[7] = data[1] * m.data[6] + data[4] * m.data[7] + data[7] * m.data[8]; mNew[8] = data[2] * m.data[6] + data[5] * m.data[7] + data[8] * m.data[8]; memcpy(data, mNew, sizeof (float) * 9); return *this; } Matrix& Matrix::scale(float sx, float sy) { data[0] *= sx; data[1] *= sx; data[2] *= sx; data[3] *= sy; data[4] *= sy; data[5] *= sy; return *this; } Matrix& Matrix::scale(float s) { return scale(s, s); } Matrix& Matrix::translate(float tx, float ty) { return translateX(tx).translateY(ty); } Matrix& Matrix::translateX(float tx) { data[6] += data[0] * tx; data[7] += data[1] * tx; data[8] += data[2] * tx; return *this; } Matrix& Matrix::translateY(float ty) { data[6] += data[3] * ty; data[7] += data[4] * ty; data[8] += data[5] * ty; return *this; } Matrix& Matrix::translateTo(float tx, float ty) { data[0] = 1.0f; data[1] = 0.0f; data[2] = 0.0f; data[3] = 0.0f; data[4] = 1.0f; data[5] = 0.0f; data[6] = tx; data[7] = ty; data[8] = 1.0f; return *this; } Matrix& Matrix::rotate(float degrees) { degrees *= M_PIf32 / 180.0f; float sin; float cos; sincosf(degrees, &sin, &cos); float a = data[0]; float b = data[3]; data[0] = a * cos + b * sin; data[3] = b * cos - a * sin; a = data[1]; b = data[4]; data[1] = a * cos + b * sin; data[4] = b * cos - a * sin; a = data[2]; b = data[5]; data[2] = a * cos + b * sin; data[5] = b * cos - a * sin; return *this; } std::ostream& operator<<(std::ostream& os, const Matrix& m) { const float* data = m.getValues(); os << "Matrix\n(\n"; os << std::fixed << std::setprecision(5); for(int i = 0; i < 3; i++) { os << std::setw(15); os << data[i] << ", "; os << std::setw(15); os << data[i + 3] << ", "; os << std::setw(15); os << data[i + 6] << "\n"; } os << std::defaultfloat; os << ")"; return os; }