traza/types.h

129 lines
2.1 KiB
C

#ifdef SUB_INCLUDE_TYPES
#undef SUB_INCLUDE_TYPES
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(camera)
FIELD(range, double)
FIELD(pos, vec3)
FIELD(target, vec3)
FIELD(up, vec3)
FIELD(dir, vec3)
FIELD(right, vec3)
END_STRUCT
#else // sub include guard
#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
void print_double(double *d) {
printf(" %f ", *d);
}
#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
const vec3 UP = {0, 1, 0};
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,
};
}
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,
};
}
vec4
vec4_sub(vec4 u, vec4 v)
{
return (vec4) {
.x = u.x - v.x,
.y = u.y - v.y,
.z = u.z - v.z,
};
}
#endif /* SUB_INCLUDE_TYPES */