BosonX/src/util.cpp

95 lines
1.5 KiB
C++

#include "util.h"
#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>
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);
}