Files
gpu-renderer/linear_alg.h
T

79 lines
1.4 KiB
C

#ifndef LINEAR_ALG_H
#define LINEAR_ALG_H
#define PI 3.14159265358979323846264
typedef struct {
float x, y, z;
} vec3_t;
typedef struct {
float x, y, z, w;
} vec4_t;
typedef struct {
vec4_t x, y, z, w;
} mat4_t;
// clang-format off
#define MAT4_ID \
(mat4_t) { \
{ 1, 0, 0, 0 }, \
{ 0, 1, 0, 0 }, \
{ 0, 0, 1, 0 }, \
{ 0, 0, 0, 1 }, \
}
#define MAT4_SCALE(sf) \
(mat4_t) { \
{ sf, 0, 0, 0 }, \
{ 0, sf, 0, 0 }, \
{ 0, 0, sf, 0 }, \
{ 0, 0, 0, 1 }, \
}
#define MAT4_TRANSLATE(x, y, z) \
(mat4_t) { \
{ 1, 0, 0, 0 }, \
{ 0, 1, 0, 0 }, \
{ 0, 0, 1, 0 }, \
{ x, y, z, 1 }, \
}
#define MAT4_ROTATE_X(a) \
(mat4_t) { \
{ 1, 0, 0, 0 }, \
{ 0, cosf(a), sinf(a), 0 }, \
{ 0, -sinf(a), cosf(a), 0 }, \
{ 0, 0, 0, 1 }, \
}
#define MAT4_ROTATE_Y(a) \
(mat4_t) { \
{ cosf(a), 0, -sinf(a), 0 }, \
{ 0, 1, 0, 0 }, \
{ sinf(a), 0, cosf(a), 0 }, \
{ 0, 0, 0, 1 }, \
}
#define MAT4_ROTATE_Z(a) \
(mat4_t) { \
{ cosf(a), sinf(a), 0, 0 }, \
{ -sinf(a), cosf(a), 0, 0 }, \
{ 0, 0, 1, 0 }, \
{ 0, 0, 0, 1 }, \
}
// clang-format on
vec3_t vec3_sub(vec3_t v, vec3_t u);
float vec3_len(vec3_t v);
vec3_t vec3_norm(vec3_t v);
float vec3_dot(vec3_t v, vec3_t u);
vec3_t vec3_cross(vec3_t v, vec3_t u);
mat4_t mat4_mul(mat4_t m, mat4_t n);
mat4_t mat4_lookat(vec3_t camera, vec3_t target, vec3_t up);
mat4_t mat4_perspective(float aspect, float fov, float near, float far);
#endif