From 997a8f12d15cd20c41adc4fe497163ebaf4f1441 Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Sun, 18 Jan 2009 16:51:51 +0000 Subject: [PATCH] updated Matrix, Transform, main Makefile git-svn-id: svn://anubis/fart/trunk@7 7f9b0f55-74a9-4bce-be96-3c2cd072584d --- Makefile | 1 + util/Matrix.cc | 44 ++++++++++++++++++++++++++++++++++++++++++++ util/Matrix.h | 23 +++++++++++++++++++++++ util/Transform.cc | 12 ++++++++++++ util/Transform.h | 19 +++++++++++++++++++ 5 files changed, 99 insertions(+) create mode 100644 util/Matrix.cc create mode 100644 util/Matrix.h create mode 100644 util/Transform.cc create mode 100644 util/Transform.h diff --git a/Makefile b/Makefile index 472f9a8..2bde60d 100644 --- a/Makefile +++ b/Makefile @@ -8,6 +8,7 @@ endif all: $(TARGET) +.PHONY: $(TARGET) $(TARGET): make -C util make -C shapes diff --git a/util/Matrix.cc b/util/Matrix.cc new file mode 100644 index 0000000..e20aa62 --- /dev/null +++ b/util/Matrix.cc @@ -0,0 +1,44 @@ + +#include "Matrix.h" + +Matrix Matrix::identity() +{ + Matrix res; + for (int i = 0; i < 4; i++) + { + for (int j = 0; j < 4; j++) + { + res[i][j] = i == j ? 1.0 : 0.0; + } + } + return res; +} + +Matrix operator*(const Matrix & m1, const Matrix & m2) +{ + Matrix res; + for (int i = 0; i < 4; i++) + { + for (int j = 0; j < 4; j++) + { + res[i][j] = m1[i][0] * m2[0][j] + + m1[i][1] * m2[1][j] + + m1[i][2] * m2[2][j] + + m1[i][3] * m2[3][j]; + } + } + return res; +} + +Vector operator*(const Matrix & m, const Vector & v) +{ + Vector res; + for (int i = 0; i < 4; i++) + { + res[i] = m[i][0] * v[0] + + m[i][1] * v[1] + + m[i][2] * v[2] + + m[i][3]; /* v[3] is implicitly 1.0 */ + } + return res; +} diff --git a/util/Matrix.h b/util/Matrix.h new file mode 100644 index 0000000..275c0b5 --- /dev/null +++ b/util/Matrix.h @@ -0,0 +1,23 @@ + +#ifndef MATRIX_H +#define MATRIX_H MATRIX_H + +#include "Vector.h" + +class Matrix +{ + public: + typedef double Matrix_row_t[4]; + Matrix_row_t & operator[](int idx) { return m_matrix[idx]; } + const Matrix_row_t & operator[](int idx) const { return m_matrix[idx]; } + static Matrix identity(); + + protected: + double m_matrix[4][4]; +}; + +Matrix operator*(const Matrix & m1, const Matrix & m2); +Vector operator*(const Matrix & m, const Vector & v); + +#endif + diff --git a/util/Transform.cc b/util/Transform.cc new file mode 100644 index 0000000..276d6cb --- /dev/null +++ b/util/Transform.cc @@ -0,0 +1,12 @@ + +#include "Transform.h" + +void Transform::push() +{ + m_matrices.push(m_matrices.top()); +} + +void Transform::pop() +{ + m_matrices.pop(); +} diff --git a/util/Transform.h b/util/Transform.h new file mode 100644 index 0000000..5f65879 --- /dev/null +++ b/util/Transform.h @@ -0,0 +1,19 @@ + +#ifndef TRANSFORM_H +#define TRANSFORM_H TRANSFORM_H + +#include "Matrix.h" +#include + +class Transform +{ + public: + void push(); + void pop(); + + protected: + std::stack m_matrices; +}; + +#endif +