prizm_racing/src/mat4.h

199 lines
4.1 KiB
C++

#pragma once
#include "fp.h"
#include "vector.h"
#include "rmath.h"
class mat4 {
public:
fp m[4][4];
mat4(){
m[0][0] = fp(1);
m[0][1] = fp(0);
m[0][2] = fp(0);
m[0][3] = fp(0);
m[1][0] = fp(0);
m[1][1] = fp(1);
m[1][2] = fp(0);
m[1][3] = fp(0);
m[2][0] = fp(0);
m[2][1] = fp(0);
m[2][2] = fp(1);
m[2][3] = fp(0);
m[3][0] = fp(0);
m[3][1] = fp(0);
m[3][2] = fp(0);
m[3][3] = fp(1);
}
mat4(fp a, fp b, fp c, fp d,
fp e, fp f, fp g, fp h,
fp i, fp j, fp k, fp l,
fp m, fp n, fp o, fp p){
this->m[0][0] = a;
this->m[1][0] = b;
this->m[2][0] = c;
this->m[3][0] = d;
this->m[0][1] = e;
this->m[1][1] = f;
this->m[2][1] = g;
this->m[3][1] = h;
this->m[0][2] = i;
this->m[1][2] = j;
this->m[2][2] = k;
this->m[3][2] = l;
this->m[0][3] = m;
this->m[1][3] = n;
this->m[2][3] = o;
this->m[3][3] = p;
}
mat4 operator * (mat4 o){
mat4 r;
r.m[0][0] = m[0][0] * o.m[0][0]
+ m[1][0] * o.m[0][1]
+ m[2][0] * o.m[0][2]
+ m[3][0] * o.m[0][3];
r.m[1][0] = m[0][0] * o.m[1][0]
+ m[1][0] * o.m[1][1]
+ m[2][0] * o.m[1][2]
+ m[3][0] * o.m[1][3];
r.m[2][0] = m[0][0] * o.m[2][0]
+ m[1][0] * o.m[2][1]
+ m[2][0] * o.m[2][2]
+ m[3][0] * o.m[2][3];
r.m[3][0] = m[0][0] * o.m[3][0]
+ m[1][0] * o.m[3][1]
+ m[2][0] * o.m[3][2]
+ m[3][0] * o.m[3][3];
r.m[0][1] = m[0][1] * o.m[0][0]
+ m[1][1] * o.m[0][1]
+ m[2][1] * o.m[0][2]
+ m[3][1] * o.m[0][3];
r.m[1][1] = m[0][1] * o.m[1][0]
+ m[1][1] * o.m[1][1]
+ m[2][1] * o.m[1][2]
+ m[3][1] * o.m[1][3];
r.m[2][1] = m[0][1] * o.m[2][0]
+ m[1][1] * o.m[2][1]
+ m[2][1] * o.m[2][2]
+ m[3][1] * o.m[2][3];
r.m[3][1] = m[0][1] * o.m[3][0]
+ m[1][1] * o.m[3][1]
+ m[2][1] * o.m[3][2]
+ m[3][1] * o.m[3][3];
r.m[0][2] = m[0][2] * o.m[0][0]
+ m[1][2] * o.m[0][1]
+ m[2][2] * o.m[0][2]
+ m[3][2] * o.m[0][3];
r.m[1][2] = m[0][2] * o.m[1][0]
+ m[1][2] * o.m[1][1]
+ m[2][2] * o.m[1][2]
+ m[3][2] * o.m[1][3];
r.m[2][2] = m[0][2] * o.m[2][0]
+ m[1][2] * o.m[2][1]
+ m[2][2] * o.m[2][2]
+ m[3][2] * o.m[2][3];
r.m[3][2] = m[0][2] * o.m[3][0]
+ m[1][2] * o.m[3][1]
+ m[2][2] * o.m[3][2]
+ m[3][2] * o.m[3][3];
r.m[0][3] = m[0][3] * o.m[0][0]
+ m[1][3] * o.m[0][1]
+ m[2][3] * o.m[0][2]
+ m[3][3] * o.m[0][3];
r.m[1][3] = m[0][3] * o.m[1][0]
+ m[1][3] * o.m[1][1]
+ m[2][3] * o.m[1][2]
+ m[3][3] * o.m[1][3];
r.m[2][3] = m[0][3] * o.m[2][0]
+ m[1][3] * o.m[2][1]
+ m[2][3] * o.m[2][2]
+ m[3][3] * o.m[2][3];
r.m[3][3] = m[0][3] * o.m[3][0]
+ m[1][3] * o.m[3][1]
+ m[2][3] * o.m[3][2]
+ m[3][3] * o.m[3][3];
return r;
}
vec3<fp> operator * (vec3<fp> o){
return {
m[0][0] * o.x + m[1][0] * o.y + m[2][0] * o.z + m[3][0],
m[0][1] * o.x + m[1][1] * o.y + m[2][1] * o.z + m[3][1],
m[0][2] * o.x + m[1][2] * o.y + m[2][2] * o.z + m[3][2]
};
}
static mat4 translate(mat4 matrix, vec3<fp> p){
mat4 t;
t.m[3][0] = p.x;
t.m[3][1] = p.y;
t.m[3][2] = p.z;
return matrix * t;
}
static mat4 translate(mat4 matrix, fp x, fp y, fp z){
mat4 t;
t.m[3][0] = x;
t.m[3][1] = y;
t.m[3][2] = z;
return matrix * t;
}
static mat4 scale(mat4 matrix, fp x, fp y, fp z){
mat4 t;
t.m[0][0] = x;
t.m[1][1] = y;
t.m[2][2] = z;
return matrix * t;
}
static mat4 rotateX(mat4 matrix, fp angle){
mat4 t;
t.m[1][1] = fp_cos(angle);
t.m[2][1] = fp(0) - fp_sin(angle);
t.m[1][2] = fp_sin(angle);
t.m[2][2] = fp_cos(angle);
return matrix * t;
}
static mat4 rotateY(mat4 matrix, fp angle){
mat4 t;
t.m[0][0] = fp_cos(angle);
t.m[2][0] = fp_sin(angle);
t.m[0][2] = fp(0) - fp_sin(angle);
t.m[2][2] = fp_cos(angle);
return matrix * t;
}
static mat4 rotateZ(mat4 matrix, fp angle){
mat4 t;
t.m[0][0] = fp_cos(angle);
t.m[1][0] = fp(0) - fp_sin(angle);
t.m[0][1] = fp_sin(angle);
t.m[1][1] = fp_cos(angle);
return matrix * t;
}
static mat4 toMat3(mat4 matrix){
mat4 t = matrix;
t.m[3][0] = 0;
t.m[3][1] = 0;
t.m[3][2] = 0;
t.m[3][3] = 0;
t.m[0][3] = 0;
t.m[1][3] = 0;
t.m[2][3] = 0;
t.m[3][3] = 0;
return t;
}
};