129 lines
2.1 KiB
C
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 */
|