184 lines
No EOL
3.3 KiB
C
184 lines
No EOL
3.3 KiB
C
#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;
|
|
} |