96 lines
1.8 KiB
C
96 lines
1.8 KiB
C
#include "iron_mat3.h"
|
|
|
|
#include <math.h>
|
|
#include <iron_math.h>
|
|
|
|
mat3_t mat3_create(float _00, float _10, float _20,
|
|
float _01, float _11, float _21,
|
|
float _02, float _12, float _22) {
|
|
mat3_t m;
|
|
m.m[0] = _00;
|
|
m.m[1] = _01;
|
|
m.m[2] = _02;
|
|
m.m[3] = _10;
|
|
m.m[4] = _11;
|
|
m.m[5] = _12;
|
|
m.m[6] = _20;
|
|
m.m[7] = _21;
|
|
m.m[8] = _22;
|
|
return m;
|
|
}
|
|
|
|
mat3_t mat3_identity() {
|
|
return mat3_create(
|
|
1, 0, 0,
|
|
0, 1, 0,
|
|
0, 0, 1
|
|
);
|
|
}
|
|
|
|
mat3_t mat3_translation(float x, float y) {
|
|
return mat3_create(
|
|
1, 0, x,
|
|
0, 1, y,
|
|
0, 0, 1
|
|
);
|
|
}
|
|
|
|
mat3_t mat3_rotation(float alpha) {
|
|
return mat3_create(
|
|
cosf(alpha), -sinf(alpha), 0,
|
|
sinf(alpha), cosf(alpha), 0,
|
|
0, 0, 1
|
|
);
|
|
}
|
|
|
|
mat3_t mat3_scale(mat3_t m, vec4_t v) {
|
|
m.m[0] *= v.x;
|
|
m.m[1] *= v.x;
|
|
m.m[2] *= v.x;
|
|
m.m[3] *= v.y;
|
|
m.m[4] *= v.y;
|
|
m.m[5] *= v.y;
|
|
m.m[6] *= v.z;
|
|
m.m[7] *= v.z;
|
|
m.m[8] *= v.z;
|
|
return m;
|
|
}
|
|
|
|
mat3_t mat3_set_from4(mat4_t m4) {
|
|
mat3_t m;
|
|
m.m[0] = m4.m[0];
|
|
m.m[1] = m4.m[1];
|
|
m.m[2] = m4.m[2];
|
|
m.m[3] = m4.m[4];
|
|
m.m[4] = m4.m[5];
|
|
m.m[5] = m4.m[6];
|
|
m.m[6] = m4.m[8];
|
|
m.m[7] = m4.m[9];
|
|
m.m[8] = m4.m[10];
|
|
return m;
|
|
}
|
|
|
|
mat3_t mat3_multmat(mat3_t a, mat3_t b) {
|
|
return mat3_create(
|
|
a.m[0] * b.m[0] + a.m[3] * b.m[1] + a.m[6] * b.m[2],
|
|
a.m[0] * b.m[3] + a.m[3] * b.m[4] + a.m[6] * b.m[5],
|
|
a.m[0] * b.m[6] + a.m[3] * b.m[7] + a.m[6] * b.m[8],
|
|
a.m[1] * b.m[0] + a.m[4] * b.m[1] + a.m[7] * b.m[2],
|
|
a.m[1] * b.m[3] + a.m[4] * b.m[4] + a.m[7] * b.m[5],
|
|
a.m[1] * b.m[6] + a.m[4] * b.m[7] + a.m[7] * b.m[8],
|
|
a.m[2] * b.m[0] + a.m[5] * b.m[1] + a.m[8] * b.m[2],
|
|
a.m[2] * b.m[3] + a.m[5] * b.m[4] + a.m[8] * b.m[5],
|
|
a.m[2] * b.m[6] + a.m[5] * b.m[7] + a.m[8] * b.m[8]
|
|
);
|
|
}
|
|
|
|
mat3_t mat3_nan() {
|
|
mat3_t m;
|
|
m.m[0] = NAN;
|
|
return m;
|
|
}
|
|
|
|
bool mat3_isnan(mat3_t m) {
|
|
return isnan(m.m[0]);
|
|
}
|