/*******************************************************************************
 *  mat2.h
 *
 *  (C) 2006 AG Aktives Sehen <agas@uni-koblenz.de>
 *           Universitaet Koblenz-Landau
 *
 * Author: Frank Neuhaus
 *******************************************************************************/

#ifndef MAT2_H
#define MAT2_H

#include <math.h>
#include "Point2D.h"
#include "vec2.h"

class CMat2
{
	public:
		CMat2();
		CMat2(float rot);
		~CMat2();

		CMat2 operator *(const CMat2 &mat) const;

		CVec2 operator *(const CVec2& v) const;

		Point2D operator *(const Point2D& p) const;
        
        float& operator [] (unsigned int position) {
            return fMatrix[position];
        }
        
        CMat2 operator +(const CMat2 rhs) const {
            CMat2 newMatrix;
            for (unsigned int i = 0; i < 4; i++) {
                newMatrix[i] = valueAt(i) + rhs.valueAt(i);
            }
            return newMatrix;
        }
        
        CMat2 operator -(const CMat2 rhs) const {
            CMat2 newMatrix;
            for (unsigned int i = 0; i < 4; i++) {
                newMatrix[i] = valueAt(i) - rhs.valueAt(i);
            }
            return newMatrix;
        }
        
        float valueAt(unsigned int position) const{
            return fMatrix[position];
        }
        
		union
		{
			float fMatrix[4];
			float m[2][2];
			struct
			{
				float xx, xy;
				float yx, yy;
			};
		};

		void transpose();
		void loadIdentity();

		void makeRotation(float fA);

		bool invert();
};



#include "mat2_inl.h"

#endif