/* Matrix.h Written by Matthew Fisher a 4x4 matrix structure. Used very often for affine vector transformations. */ class Matrix { public: //Initalization Matrix(); Matrix(const Matrix &M); #ifdef USE_DIRECTX Matrix(const D3DXMATRIX &M); //initalizes the matrix with a D3DXMATRIX #endif //Assignment Matrix& operator = (const Matrix &M); //Basic Transforms void Identity(); void Scaling(const Vec3 &ScaleFactors); void Scaling(float Scale) { Scaling(Vec3(Scale, Scale, Scale)); } void Translation(const Vec3 &Pos); //Rotation Transforms void Rotation(const Vec3 &Axis, float Angle, const Vec3 &Center); void Rotation(const Vec3 &Axis, float Angle); void Rotation(float Yaw, float Pitch, float Roll); void RotationX(float Theta); void RotationY(float Theta); void RotationZ(float Theta); //Complex or Composite Transforms void LookAt(const Vec3 &Eye, const Vec3 &At, const Vec3 &Up); void Orthogonal(float Width, float Height, float ZNear, float ZFar); void Perspective(float Width, float Height, float ZNear, float ZFar); void PerspectiveFov(float FOV, float Aspect, float ZNear, float ZFar); void Face(const Vec3 &v1, const Vec3 &v2); //Constructs a matrix that will make all the vector facing v1 now face towards v2. void Viewport(float Width, float Height); void SetProduct(const Matrix &Left, const Matrix &Right); //loads this matrix as the product of the given matrices void Invert(); //Inverts the current matrix void Transpose(); //Transposes the current matrix float Determinant(); //returns the determinant of this matrix #ifdef USE_DIRECTX operator D3DXMATRIX(); //converts this matrix into a D3DXMATRIX #endif inline float* operator [] (int Row); //returns the 4 elements in the requested Row inline const float* operator [] (int Row) const; //returns the 4 elements in the requested Row float Data[4][4]; //the data itself }; ostream& operator << (ostream &os, const Matrix &m); //Outputs the 16 elements in the matrix istream& operator >> (istream &os, Matrix &m); //Inputs the 16 elements in the matrix Matrix operator * (const Matrix &Left, const Matrix &Right); Matrix operator * (const Matrix &Left, float &Right); Matrix operator * (float &Left, const Matrix &Right); //Matrix-Matrix and Matrix-float multiplication Matrix operator + (const Matrix &Left, const Matrix &Right); Matrix operator - (const Matrix &Left, const Matrix &Right); //Matrix-Matrix addition/mulitplication Vec4 operator * (const Vec4 &Left, const Matrix &Right); //4-vector Matrix multiplication //transforms the vector Left, extended to (x, y, z, 1), by the matrix Right, storing the result in Target void Vec3TransformCoord(Vec3 &Target, const Vec3 &Left, const Matrix &Right); //transforms the vector Left, extended to (x, y, z, 0), by the matrix Right, storing the result in Target void Vec3TransformNormal(Vec3 &Target, const Vec3 &Left, const Matrix &Right); //transforms the vector Left, extended to (x, y, z, 1), by the matrix Right, projecting the result //back into w = 1, and storing the result in Target void Vec3TransformProjectCoord(Vec3 &Target, const Vec3 &Left, const Matrix &Right); //Matrix inline functions #ifndef __MATRIX_INLINE #define __MATRIX_INLINE inline float* Matrix::operator [] (int Row) { return Data[Row]; } inline const float* Matrix::operator [] (int Row) const { return Data[Row]; } #endif