#include "fdf.h" t_mat4 *mat4_init(void) { t_mat4 *mat; mat = NULL; if ((mat = (t_mat4 *)malloc(sizeof(t_mat4)))) { mat->mx[0][0] = 1; mat->mx[0][1] = 0; mat->mx[0][2] = 0; mat->mx[0][3] = 0; mat->mx[1][0] = 0; mat->mx[1][1] = 1; mat->mx[1][2] = 0; mat->mx[1][3] = 0; mat->mx[2][0] = 0; mat->mx[2][1] = 0; mat->mx[2][2] = 1; mat->mx[2][3] = 0; mat->mx[3][0] = 0; mat->mx[3][1] = 0; mat->mx[3][2] = 0; mat->mx[3][3] = 1; } return (mat); } t_mat4 *mat4_mult(t_mat4 *m1, t_mat4 *m2) { t_mat4 *m3; int i; int j; i = 0; m3 = NULL; if ((m3 = (t_mat4 *)malloc(sizeof(t_mat4)))) { while(i < 4) { j = 0; while (j < 4) { m3->mx[i][j] = m1->mx[i][0] * m2->mx[0][j] + m1->mx[i][1] * m2->mx[1][j] + m1->mx[i][2] * m2->mx[2][j] + m1->mx[i][3] * m2->mx[3][j]; j++; } i++; } } return (m3); } void mat4_translate(t_mat4 *m, double x, double y, double z) { m->mx[0][0] = 1; m->mx[0][1] = 0; m->mx[0][2] = 0; m->mx[0][3] = 0; m->mx[1][0] = 0; m->mx[1][1] = 1; m->mx[1][2] = 0; m->mx[1][3] = 0; m->mx[2][0] = 0; m->mx[2][1] = 0; m->mx[2][2] = 1; m->mx[2][3] = 0; m->mx[3][0] = x; m->mx[3][1] = y; m->mx[3][2] = z; m->mx[3][3] = 1; } void mat4_scale(t_mat4 *m, double x, double y, double z) { m->mx[0][0] = x; m->mx[0][1] = 0; m->mx[0][2] = 0; m->mx[0][3] = 0; m->mx[1][0] = 0; m->mx[1][1] = y; m->mx[1][2] = 0; m->mx[1][3] = 0; m->mx[2][0] = 0; m->mx[2][1] = 0; m->mx[2][2] = z; m->mx[2][3] = 0; m->mx[3][0] = 0; m->mx[3][1] = 0; m->mx[3][2] = 0; m->mx[3][3] = 1; } void mat4_z_rot(t_mat4 *m, double angle) { angle = angle * M_PI / 180; m->mx[0][0] = cos(angle); m->mx[0][1] = -(sin(angle)); m->mx[0][2] = 0; m->mx[0][3] = 0; m->mx[1][0] = sin(angle); m->mx[1][1] = cos(angle); m->mx[1][2] = 0; m->mx[1][3] = 0; m->mx[2][0] = 0; m->mx[2][1] = 0; m->mx[2][2] = 1; m->mx[2][3] = 0; m->mx[3][0] = 0; m->mx[3][1] = 0; m->mx[3][2] = 0; m->mx[3][3] = 1; } void mat4_x_rot(t_mat4 *m, double angle) { angle = angle * M_PI / 180; m->mx[0][0] = 1; m->mx[0][1] = 0; m->mx[0][2] = 0; m->mx[0][3] = 0; m->mx[1][0] = 0; m->mx[1][1] = cos(angle); m->mx[1][2] = (sin(angle)); m->mx[1][3] = 0; m->mx[2][0] = 0; m->mx[2][1] = -sin(angle); m->mx[2][2] = cos(angle); m->mx[2][3] = 0; m->mx[3][0] = 0; m->mx[3][1] = 0; m->mx[3][2] = 0; m->mx[3][3] = 1; } void mat4_y_rot(t_mat4 *m, double angle) { angle = angle * M_PI / 180; m->mx[0][0] = cos(angle); m->mx[0][1] = 0; m->mx[0][2] = -(sin(angle)); m->mx[0][3] = 0; m->mx[1][0] = 0; m->mx[1][1] = 1; m->mx[1][2] = 0; m->mx[1][3] = 0; m->mx[2][0] = sin(angle); m->mx[2][1] = 0; m->mx[2][2] = cos(angle); m->mx[2][3] = 0; m->mx[3][0] = 0; m->mx[3][1] = 0; m->mx[3][2] = 0; m->mx[3][3] = 1; } void vec_mat_mult(t_mat4 *m, t_vec *v, t_pnt *result) { // double vec4; double x; double y; // double z; x = v->x * m->mx[0][0] + v->y * m->mx[1][0] + v->z * m->mx[2][0] + m->mx[3][0]; y = v->x * m->mx[0][1] + v->y * m->mx[1][1] + v->z * m->mx[2][1] + m->mx[3][1]; // z = v->x * m->mx[0][2] + v->y * m->mx[1][2] + v->z * m->mx[2][2] + // m->mx[3][2]; // vec4 = v->x * m->mx[0][3] + v->y * m->mx[1][3] + v->z * m->mx[2][3] + // m->mx[3][3]; // if (vec4 != 1 && vec4 != 0) // { // x = x / vec4; // y = y / vec4; // z = z / vec4; // } result->x = x; result->y = y; // result->z = v->z; }