// -*- Mode: c++ -*-

#ifndef	__MATRIX_TRANSFORMS_H__
#define	__MATRIX_TRANSFORMS_H__

#include <math.h>
#include <gl/glut.h>

void rotate(double angle, double x, double y, double z) {

	angle = angle*(M_PI/180);

	CMat3T<double> p_perp1(1.0, 0.0, 0.0, 0.0,
                           0.0, 1.0, 0.0, 0.0,
						   0.0, 0.0, 1.0, 0.0,
						   0.0, 0.0, 0.0, 0.0);
	p_perp1 = p_perp1 * cos(angle);

	CMat3T<double> p_perp2(x*x, y*x, z*x, 0.0,
		                   x*y, y*y, z*y, 0.0,
						   x*z, y*z, z*z, 0.0, 
						   0.0, 0.0, 0.0, 0.0);
	p_perp2 = p_perp2 * (1.00 - cos(angle));

	CMat3T<double> p_perp = p_perp1 + p_perp2;

	CMat3T<double> p_parallel(0.0,  -z,   y, 0.0,
		                        z, 0.0,  -x, 0.0,
							   -y,   x, 0.0, 0.0,
							  0.0, 0.0, 0.0, 0.0);
	p_parallel = p_parallel * sin(angle);


	CMat3T<double> p_rotate = p_perp + p_parallel;

	p_rotate[15] = 1.0f;

	glMatrixMode(GL_MODELVIEW);
	glMultMatrixd(&p_rotate[0]);



}

void translate(double x, double y, double z) {

	double transMatrix[16] = { 1.0, 0.0, 0.0, 0.0,
 	                           0.0, 1.0, 0.0, 0.0,
							   0.0, 0.0, 1.0, 0.0,
							     x,   y,   z, 1.0 };

	glMatrixMode(GL_MODELVIEW);
	glMultMatrixd(transMatrix);

}

void scale(double x, double y, double z) {

	double transMatrix[16] = {   x, 0.0, 0.0, 0.0,
 	                           0.0,   y, 0.0, 0.0,
							   0.0, 0.0,   z, 0.0,
							   0.0, 0.0, 1.0, 1.0 };

	glMatrixMode(GL_MODELVIEW);
	glMultMatrixd(transMatrix);

}

#endif /*  __MATRIX_TRANSFORMS_H__ */
