95 lines
1.5 KiB
C++
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);
|
|
}
|