traza/types.h

295 lines
5.8 KiB
C
Raw Normal View History

2021-11-12 16:04:23 +00:00
#ifndef TYPEDEFS
#define TYPEDEFS
2021-11-23 15:13:34 +00:00
typedef double scalar;
2021-11-12 16:04:23 +00:00
typedef unsigned char byte;
2021-11-23 15:13:34 +00:00
typedef scalar grid3x3[3][3];
typedef scalar grid4x4[4][4];
2021-11-12 16:04:23 +00:00
#endif /* TYPEDEFS */
2021-11-05 21:12:14 +00:00
#ifdef SUB_INCLUDE_TYPES
#undef SUB_INCLUDE_TYPES
2021-11-12 16:04:23 +00:00
STRUCT(rgb)
FIELD(r, byte)
FIELD(g, byte)
FIELD(b, byte)
FIELD(a, byte)
END_STRUCT
2021-11-05 21:12:14 +00:00
STRUCT(vec2)
2021-11-23 15:13:34 +00:00
FIELD(x, scalar)
FIELD(y, scalar)
2021-11-05 21:12:14 +00:00
END_STRUCT
STRUCT(vec3)
2021-11-23 15:13:34 +00:00
FIELD(x, scalar)
FIELD(y, scalar)
FIELD(z, scalar)
2021-11-05 21:12:14 +00:00
END_STRUCT
STRUCT(vec4)
2021-11-23 15:13:34 +00:00
FIELD(x, scalar)
FIELD(y, scalar)
FIELD(z, scalar)
FIELD(w, scalar)
2021-11-05 21:12:14 +00:00
END_STRUCT
2021-11-14 13:05:24 +00:00
STRUCT(mat3x3)
2021-11-12 16:04:23 +00:00
FIELD(nums, grid3x3)
END_STRUCT
2021-11-14 13:05:24 +00:00
STRUCT(mat4x4)
2021-11-12 16:04:23 +00:00
FIELD(nums, grid4x4)
END_STRUCT
2021-11-05 21:12:14 +00:00
STRUCT(camera)
2021-11-23 15:13:34 +00:00
FIELD(znear, scalar)
2021-11-05 21:12:14 +00:00
FIELD(pos, vec3)
2021-11-14 13:05:24 +00:00
FIELD(front, vec3)
2021-11-05 21:12:14 +00:00
FIELD(up, vec3)
FIELD(right, vec3)
2021-11-23 15:13:34 +00:00
FIELD(yaw, scalar)
FIELD(pitch, scalar)
END_STRUCT
STRUCT(triangle2)
FIELD(a, vec2)
FIELD(b, vec2)
FIELD(c, vec2)
END_STRUCT
STRUCT(triangle3)
FIELD(a, vec3)
FIELD(b, vec3)
FIELD(c, vec3)
2021-11-05 21:12:14 +00:00
END_STRUCT
2021-11-12 16:04:23 +00:00
#else
2021-11-05 21:12:14 +00:00
#include <stdio.h>
#define STRUCT(N) typedef struct N N; struct N {
#define END_STRUCT };
#define FIELD(N, T) T N;
#define SUB_INCLUDE_TYPES
#include __FILE__
2021-11-12 16:04:23 +00:00
/* undefs to get rid of redef warnings */
2021-11-05 21:12:14 +00:00
#undef STRUCT
#undef FIELD
#undef END_STRUCT
2021-11-13 14:49:42 +00:00
#ifdef TYPES_IMPL
2021-11-12 16:04:23 +00:00
void
2021-11-23 15:13:34 +00:00
print_grid(size_t y_sz, size_t x_sz, scalar grid[y_sz][x_sz])
2021-11-12 16:04:23 +00:00
{
printf("\n");
for (size_t y = 0; y < y_sz; y++) {
for (size_t x = 0; x < x_sz; x++) {
printf(" %f ", grid[y][x]);
}
printf("\n");
}
2021-11-05 21:12:14 +00:00
}
2021-11-23 15:13:34 +00:00
void print_scalar(scalar d) { printf(" %f ", d); }
2021-11-12 16:04:23 +00:00
void print_byte(byte b) { printf(" %d ", b); }
void print_grid3x3(grid3x3 grid) { print_grid(3, 3, grid); }
void print_grid4x4(grid4x4 grid) { print_grid(4, 4, grid); }
2021-11-05 21:12:14 +00:00
#define STRUCT(N) \
void print_##N (N s) { \
2021-11-05 21:12:14 +00:00
printf("(" #N ") {");
#define FIELD(N, T) \
print_##T(s . N);
2021-11-05 21:12:14 +00:00
#define END_STRUCT \
printf("}\n"); \
}
#define SUB_INCLUDE_TYPES
#include __FILE__
// undefs to get rid of redef warnings
#undef STRUCT
#undef FIELD
#undef END_STRUCT
2021-11-15 22:08:58 +00:00
const vec3 UP = {0, 1, 0};
2021-11-05 21:12:14 +00:00
vec3
vec3_add(vec3 u, vec3 v)
{
return (vec3) {
.x = u.x + v.x,
.y = u.y + v.y,
.z = u.z + v.z,
};
}
vec3
vec3_sub(vec3 u, vec3 v)
{
return (vec3) {
.x = u.x - v.x,
.y = u.y - v.y,
.z = u.z - v.z,
};
}
2021-11-14 13:05:24 +00:00
vec3
2021-11-23 15:13:34 +00:00
vec3_scalar_mul(vec3 v, scalar s)
2021-11-14 13:05:24 +00:00
{
return (vec3) {
.x = v.x * s,
.y = v.y * s,
.z = v.z * s,
};
}
2021-11-05 21:12:14 +00:00
vec3
vec3_cross(vec3 u, vec3 v)
{
return (vec3) {
.x = u.y * v.z - u.z * v.y,
.y = u.z * v.x - u.x * v.z,
.z = u.x * v.y - u.y * v.x,
};
}
2021-11-23 15:13:34 +00:00
scalar
vec3_dot(vec3 u, vec3 v)
{
return u.x * v.x + u.y * v.y + u.z * v.z;
}
2021-11-05 21:12:14 +00:00
vec3
vec3_normalize(vec3 u)
{
2021-11-23 15:13:34 +00:00
scalar len = sqrt(u.x*u.x + u.y*u.y + u.z*u.z);
2021-11-05 21:12:14 +00:00
return (vec3) {
.x = u.x / len,
.y = u.y / len,
.z = u.z / len,
};
}
2021-11-14 13:05:24 +00:00
vec4
vec3_to_vec4(vec3 v)
{
return (vec4){v.x, v.y, v.z, 1.0};
}
2021-11-05 21:12:14 +00:00
vec4
vec4_add(vec4 u, vec4 v)
{
return (vec4) {
.x = u.x + v.x,
.y = u.y + v.y,
.z = u.z + v.z,
.w = u.w + v.w,
2021-11-05 21:12:14 +00:00
};
}
vec4
vec4_sub(vec4 u, vec4 v)
{
return (vec4) {
.x = u.x - v.x,
.y = u.y - v.y,
.z = u.z - v.z,
.w = u.w - v.w,
2021-11-05 21:12:14 +00:00
};
}
2021-11-14 13:05:24 +00:00
void
2021-11-23 15:13:34 +00:00
mat_mul(size_t dim, scalar m1[dim][dim], scalar m2[dim][dim], scalar out[dim][dim])
2021-11-14 13:05:24 +00:00
{
for (size_t i = 0; i < dim; i++) {
for (size_t j = 0; j < dim; j++) {
for (size_t k = 0; k < dim; k++) {
out[i][j] += m1[i][k] * m2[k][j];
}
}
}
}
mat3x3
mat3x3_mul(mat3x3 r, mat3x3 s)
{
mat3x3 ret = { .nums = {{0}} };
mat_mul(3, r.nums, s.nums, ret.nums);
return ret;
}
mat4x4
mat4x4_mul(mat4x4 r, mat4x4 s)
{
mat4x4 ret = { .nums = {{0}} };
mat_mul(4, r.nums, s.nums, ret.nums);
return ret;
}
vec3
vec3_mat3x3_mul(vec3 v, mat3x3 r)
{
return (vec3) {
.x = (v.x * r.nums[0][0]) + (v.y * r.nums[0][1]) + (v.z * r.nums[0][2]),
.y = (v.x * r.nums[1][0]) + (v.y * r.nums[1][1]) + (v.z * r.nums[1][2]),
.z = (v.x * r.nums[2][0]) + (v.y * r.nums[2][1]) + (v.z * r.nums[2][2])
};
}
vec4
vec4_mat4x4_mul(vec4 v, mat4x4 r)
{
return (vec4) {
.x = (v.x * r.nums[0][0]) + (v.y * r.nums[0][1]) + (v.z * r.nums[0][2]) + (v.w * r.nums[0][3]),
.y = (v.x * r.nums[1][0]) + (v.y * r.nums[1][1]) + (v.z * r.nums[1][2]) + (v.w * r.nums[1][3]),
.z = (v.x * r.nums[2][0]) + (v.y * r.nums[2][1]) + (v.z * r.nums[2][2]) + (v.w * r.nums[2][3]),
.w = (v.x * r.nums[3][0]) + (v.y * r.nums[3][1]) + (v.z * r.nums[3][2]) + (v.w * r.nums[3][3])
};
}
mat4x4
lookat(camera cam)
{
/* vec3 dir = vec3_add(cam.pos, cam.front); */
return mat4x4_mul(
(mat4x4) {
.nums = {{cam.right.x, cam.right.y, cam.right.z, 0},
{cam.up.x, cam.up.y, cam.up.z, 0},
{cam.front.x, cam.front.y, cam.front.z, 0},
{0, 0, 0, 1}}
},
(mat4x4) {
.nums = {{1, 0, 0, -cam.pos.x},
{0, 1, 0, -cam.pos.y},
{0, 0, 1, -cam.pos.z},
{0, 0, 0, 1}}
}
);
}
void
update_camera(camera *cam)
{
2021-11-23 15:13:34 +00:00
scalar α = cos(cam->pitch);
scalar β = sin(cam->pitch);
scalar x = cos(cam->yaw);
scalar y = sin(cam->yaw);
2021-11-15 22:08:58 +00:00
2021-11-14 13:05:24 +00:00
vec3 front = {
2021-11-15 22:08:58 +00:00
.x = α * y,
.y = β,
.z = -α * x,
2021-11-14 13:05:24 +00:00
};
cam->front = vec3_normalize(front);
2021-11-15 22:08:58 +00:00
cam->right = vec3_normalize(vec3_cross(cam->front, UP));
cam->up = vec3_normalize(vec3_cross(cam->right, cam->front));
2021-11-14 13:05:24 +00:00
}
2021-11-13 14:49:42 +00:00
#endif
2021-11-05 21:12:14 +00:00
#endif /* SUB_INCLUDE_TYPES */