175 lines
3.0 KiB
C
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 */
|