I am starting to get familiar with the basics of OpenGL and decided that it is a good time to make a matrix class.

The following classes works as expected for transformations.

What else do I need to add to make it sufficient and generic enough for most future projects I'd do ?

(Keep in mind that the Matrix is in column major form.)

Code:

template<typename T>
class vector3
{
public:
T raw[3];
vector3(T x,T y,T z){raw[0]=x;raw[1]=y;raw[2]=z;}
vector3(T* t){raw[0]=t[0];raw[1]=t[1];raw[2]=t[2];}
vector3(std::initializer_list<T> t)
{
auto it = t.begin();
raw[0]=*(it++);
raw[1]=*(it++);
raw[2]=(*it++);
};
const T& operator[](int n){return raw[n];}
};
/*Reference:
* [0][4][08][12]
* [1][5][09][13]
* [2][6][10][14]
* [3][7][11][15]
*/
template<typename T>
class matrix
{
public:
T* raw;
matrix(T unity)//Allocates an identity matrix
{
raw = new T[16];//May change this to allocate from a Allocator maintained pool
raw[0]=raw[5]=raw[10]=raw[15]=unity;
}
matrix(){};
void translate(T x,T y,T z){raw[12]=x;raw[13]=y;raw[14]=z;}
void transform(vector3<double> x,vector3<double> y, vector3<double> z)
{
//Only rotation and scaling
raw[0]=x[0];raw[1]=x[1];raw [2]=x[2];
raw[4]=y[0];raw[5]=y[1];raw [6]=y[2];
raw[8]=z[0];raw[9]=z[1];raw[10]=z[2];
}
};