function MatrixTransform()
{
	this.matrix = new Matrix( 4, 4 );
	this.matrix.identity();
	return this;
}

MatrixTransform.prototype = new Object;

MatrixTransform.prototype.identity = function()
{
	this.matrix.identity();
}

MatrixTransform.prototype.rotateByDegrees = function( x, y, z )
{
	x = x * (Math.PI / 180);
	y = y * (Math.PI / 180);
	z = z * (Math.PI / 180);
	var r = new Matrix( 4, 4 );
	r.identity();
	r.set( 1, 1, Math.cos(x) );
	r.set( 2, 2, Math.cos(x) );
	r.set( 1, 2, Math.sin(x) );
	r.set( 2, 1, -Math.sin(x) );
	var g = new Matrix( 4, 4 );
	g.identity();
	g.set( 0, 0, Math.cos(y) );
	g.set( 2, 0, Math.sin(y) );
	g.set( 0, 2, -Math.sin(y) );
	g.set( 2, 2, Math.cos(y) );
	var q = r.multiply( g );
	g.identity();
	g.set( 0, 0, Math.cos(z) );
	g.set( 1, 1, Math.cos(z) );
	g.set( 0, 1, Math.sin(z) );
	g.set( 1, 0, -Math.sin(z) );
	r = q.multiply( g );
	q = r.multiply( this.matrix );
	this.matrix = q;
}

MatrixTransform.prototype.translateBy = function( x, y, z )
{
	var r = new Matrix( 4, 4 );
	r.identity();
	r.set( 3, 0, x );
	r.set( 3, 1, y );
	r.set( 3, 2, z );
	var t = r.multiply( this.matrix );
	this.matrix = t;
}

MatrixTransform.prototype.applyPerspectiveTransform = function()
{
	var r = new Matrix( 4, 4 );
	r.identity();
	r.set( 2, 3, 1/500 );
	var t = r.multiply( this.matrix );
	this.matrix = t;
}

MatrixTransform.prototype.scaleBy = function( x, y, z )
{
	if (y == undefined || z == undefined)
		y = z = x;
	var r = new Matrix( 4, 4 );
	r.identity();
	r.set( 0, 0, x );
	r.set( 1, 1, y );
	r.set( 2, 2, z );
	r.set( 3, 3, 1 );
	var t = this.matrix.multiply( r ); // r.multiply( this.matrix );
	this.matrix = t;
}

MatrixTransform.prototype.transform = function( x, y, z )
{
	var m = new Matrix( 1, 4 );
	m.set( 0, 0, x ? x : 0 );
	m.set( 0, 1, y ? y : 0 );
	m.set( 0, 2, z ? z : 0 );
	m.set( 0, 3, 1 );
	var q = this.matrix.multiply( m );
	var w = q.get( 0, 3 );
	return { 'x': q.get( 0, 0 ) / w, 'y': q.get( 0, 1 ) / w, 'z': q.get( 0, 2 ) / w };
}
