traza/types.h

175 lines
3.0 KiB
C

#ifndef TYPEDEFS
#define TYPEDEFS
typedef unsigned char byte;
typedef double grid3x3[3][3];
typedef double grid4x4[4][4];
#endif /* TYPEDEFS */
#ifdef SUB_INCLUDE_TYPES
#undef SUB_INCLUDE_TYPES
STRUCT(rgb)
FIELD(r, byte)
FIELD(g, byte)
FIELD(b, byte)
FIELD(a, byte)
END_STRUCT
STRUCT(vec2)
FIELD(x, double)
FIELD(y, double)
END_STRUCT
STRUCT(vec3)
FIELD(x, double)
FIELD(y, double)
FIELD(z, double)
END_STRUCT
STRUCT(vec4)
FIELD(x, double)
FIELD(y, double)
FIELD(z, double)
FIELD(w, double)
END_STRUCT
STRUCT(matrix3x3)
FIELD(nums, grid3x3)
END_STRUCT
STRUCT(matrix4x4)
FIELD(nums, grid4x4)
END_STRUCT
STRUCT(camera)
FIELD(znear, double)
FIELD(pos, vec3)
FIELD(target, vec3)
FIELD(up, vec3)
FIELD(dir, vec3)
FIELD(right, vec3)
END_STRUCT
#else
#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__
/* undefs to get rid of redef warnings */
#undef STRUCT
#undef FIELD
#undef END_STRUCT
#ifdef TYPES_IMPL
void
print_grid(size_t y_sz, size_t x_sz, double grid[y_sz][x_sz])
{
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");
}
}
void print_double(double d) { printf(" %f ", d); }
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); }
#define STRUCT(N) \
void print_##N (N s) { \
printf("(" #N ") {");
#define FIELD(N, T) \
print_##T(s . N);
#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
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,
};
}
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,
};
}
double
vec3_dot(vec3 u, vec3 v)
{
return u.x * v.x + u.y * v.y + u.z * v.z;
}
vec3
vec3_normalize(vec3 u)
{
double len = sqrt(u.x*u.x + u.y*u.y + u.z*u.z);
return (vec3) {
.x = u.x / len,
.y = u.y / len,
.z = u.z / len,
};
}
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,
};
}
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,
};
}
#endif
#endif /* SUB_INCLUDE_TYPES */