#include "util.h" #include #include #include static num num_cos_dl(num a) { num u = 1.0; int p = 7; for(p = 2 * p - 1; p >= 1; p -= 2) u = num(1) - a * a / (p * p + p) * u; return u; } num num_cos(num a) { if(a < 0) a = -a; a = a % num(6.28319); if(a > num(3.14159)) a -= num(6.28319); return num_cos_dl(a); } num num_sin(num a) { return num_cos(a - num(1.57080)); } num num_clamp(num t, num lower, num upper) { if(t < lower) return lower; if(t > upper) return upper; return t; } num num_rand(void) { num r; r.v = rand() & 0xffff; return r; } num num_rand_between(num low, num high) { num width = high - low; if(width <= 0) return low; num r; r.v = rand() % width.v; return r + low; } vec3 vec_rotate_around_z(vec3 v, vec2 rotator) { num c = rotator.x; num s = rotator.y; return vec3( c * v.x - s * v.y, c * v.y + s * v.x, v.z); } static char strings[8][64]; static int strings_next = 0; static char const *do_str(char const *fmt, ...) { char *s = strings[strings_next]; strings_next = (strings_next + 1) % 8; va_list args; va_start(args, fmt); vsnprintf(s, sizeof strings[0], fmt, args); va_end(args); return s; } char const *str(num x) { return do_str("%g", (float)x); } char const *str(vec2 u) { return do_str("[%g %g]", (float)u.x, (float)u.y); } char const *str(vec3 u) { return do_str("[%g %g %g]", (float)u.x, (float)u.y, (float)u.z); }