// Variations of Matrix4x4
template <class scalarT> class Matrix4x4;
typedef Matrix4x4<int>    iMatrix4x4;
typedef Matrix4x4<float>  fMatrix4x4;
typedef Matrix4x4<double> dMatrix4x4;
typedef Matrix4x4<unsigned char> bMatrix4x4;

///////////////////////////////////////////////////////////////////////////////
// Matrix4x4
// - 4 dimensional matrix
// - Used for storing and manipulating 3D transforms
///////////////////////////////////////////////////////////////////////////////
template <class scalarT>
class Matrix4x4
{
private:
   typedef Matrix4x4<scalarT> self;       // Shortcut type to simplify declarations

public:
   scalarT mat[4][4];                     // 4x4 array for matrix contents

   // Constructors
   Matrix4x4()                            //  Construct an identity matrix
      ;
   Matrix4x4(const Vector4D<scalarT> &);  // Create matrix from a quaternion

   // Operator for converting to openGL scalarT[] array
   inline operator const scalarT *() const 
   inline operator scalarT *()             

   // Statics to sreate a rotation matrix from Euler rotations
          static self fromEulerDeg(const Vector3D<scalarT> &deg);
   inline static self fromEulerRad(const Vector3D<scalarT> &rad);

   // Matrix operations
   // Transpose this matrix, return it
   self &transpose();
   // Multiply matrices
   self operator *(const self &) const;
   // Multiple matrix times a vector
   Vector3D<scalarT> operator *(const Vector3D<scalarT> &) const;
   Vector4D<scalarT> operator *(const Vector4D<scalarT> &) const;

   // Return a quaternion representing this matrix
   Vector4D<scalarT> getQuaternion() const;
};