#ifndef __MATRIX
#define __MATRIX
#define PI 3.141592654

#define dot(x, y) lenVec4(x)+lenVec4(y)

struct vec4 {
    float x,y,z,w;
} typedef vec4;


void loadIdentMatrix(float target[4][4]);

void transposeMatrix(float target[4][4]);

void multiplyMat4x4ByMat4x4(float target[4][4], float mat2[4][4]);
vec4 multiplyMat4x4ByVec4(float mat[4][4], vec4 vector);

void rotateMat4x4(float target[4][4], vec4 angles);
vec4 rotateVec4(vec4 original, vec4 angles);
vec4 rotateVec4Q(vec4 original, vec4 quaternion);

//void translateMat4x4(float *target[4][4], vec4 vectordiff);  // not needed prob idfk anymore pls help it's like 3 am
void translateMatrix(float target[4][4], vec4 vectorDiff);
#define translateVector addVec4

vec4 scaleVec4(vec4 original, vec4 vectorDiff);

void normalizeMat4x4(float target[4][4]);
vec4 normalizeVec4(vec4 original);

void createProjectionMat4x4(float target[4][4], float fov, float aspect_ratio, float znear, float zfar);
void createModelMat4x4();

void lookAt(float out[4][4], vec4 cameraPosition, vec4 object, vec4 up_axis);


float lenVec4(vec4 vector);
vec4 crossVec4(vec4 vector1, vec4 vector2);
vec4 addVec4(vec4 vector1, vec4 vector2);
vec4 subVec4(vec4 vector1, vec4 vector2);
#endif