mirror of
https://github.com/nzp-team/fteqw.git
synced 2024-11-23 04:11:53 +00:00
199 lines
3.4 KiB
C
199 lines
3.4 KiB
C
|
//license GPLv2+
|
||
|
//this file allows botlib to link as a dynamic lib with no external dependancies
|
||
|
|
||
|
#include "q_shared.h"
|
||
|
#include "botlib.h"
|
||
|
|
||
|
vec3_t vec3_origin;
|
||
|
void QDECL AngleVectors (const vec3_t angles, vec3_t forward, vec3_t right, vec3_t up)
|
||
|
{
|
||
|
float angle;
|
||
|
float sr, sp, sy, cr, cp, cy;
|
||
|
|
||
|
angle = angles[YAW] * (M_PI*2 / 360);
|
||
|
sy = sin(angle);
|
||
|
cy = cos(angle);
|
||
|
angle = angles[PITCH] * (M_PI*2 / 360);
|
||
|
sp = sin(angle);
|
||
|
cp = cos(angle);
|
||
|
angle = angles[ROLL] * (M_PI*2 / 360);
|
||
|
sr = sin(angle);
|
||
|
cr = cos(angle);
|
||
|
|
||
|
if (forward)
|
||
|
{
|
||
|
forward[0] = cp*cy;
|
||
|
forward[1] = cp*sy;
|
||
|
forward[2] = -sp;
|
||
|
}
|
||
|
if (right)
|
||
|
{
|
||
|
right[0] = (-1*sr*sp*cy+-1*cr*-sy);
|
||
|
right[1] = (-1*sr*sp*sy+-1*cr*cy);
|
||
|
right[2] = -1*sr*cp;
|
||
|
}
|
||
|
if (up)
|
||
|
{
|
||
|
up[0] = (cr*sp*cy+-sr*-sy);
|
||
|
up[1] = (cr*sp*sy+-sr*cy);
|
||
|
up[2] = cr*cp;
|
||
|
}
|
||
|
}
|
||
|
void QDECL VectorAngles(float *forward, float *up, float *result, qboolean meshpitch)
|
||
|
{
|
||
|
float yaw, pitch, roll;
|
||
|
|
||
|
if (forward[1] == 0 && forward[0] == 0)
|
||
|
{
|
||
|
if (forward[2] > 0)
|
||
|
{
|
||
|
pitch = -M_PI * 0.5;
|
||
|
yaw = up ? atan2(-up[1], -up[0]) : 0;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
pitch = M_PI * 0.5;
|
||
|
yaw = up ? atan2(up[1], up[0]) : 0;
|
||
|
}
|
||
|
roll = 0;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
yaw = atan2(forward[1], forward[0]);
|
||
|
pitch = -atan2(forward[2], sqrt (forward[0]*forward[0] + forward[1]*forward[1]));
|
||
|
|
||
|
if (up)
|
||
|
{
|
||
|
vec_t cp = cos(pitch), sp = sin(pitch);
|
||
|
vec_t cy = cos(yaw), sy = sin(yaw);
|
||
|
vec3_t tleft, tup;
|
||
|
tleft[0] = -sy;
|
||
|
tleft[1] = cy;
|
||
|
tleft[2] = 0;
|
||
|
tup[0] = sp*cy;
|
||
|
tup[1] = sp*sy;
|
||
|
tup[2] = cp;
|
||
|
roll = -atan2(DotProduct(up, tleft), DotProduct(up, tup));
|
||
|
}
|
||
|
else
|
||
|
roll = 0;
|
||
|
}
|
||
|
|
||
|
pitch *= 180 / M_PI;
|
||
|
yaw *= 180 / M_PI;
|
||
|
roll *= 180 / M_PI;
|
||
|
// if (meshpitch)
|
||
|
// pitch *= r_meshpitch.value;
|
||
|
if (pitch < 0)
|
||
|
pitch += 360;
|
||
|
if (yaw < 0)
|
||
|
yaw += 360;
|
||
|
if (roll < 0)
|
||
|
roll += 360;
|
||
|
|
||
|
result[0] = pitch;
|
||
|
result[1] = yaw;
|
||
|
result[2] = roll;
|
||
|
}
|
||
|
|
||
|
vec_t QDECL VectorNormalize2 (const vec3_t v, vec3_t out)
|
||
|
{
|
||
|
float length, ilength;
|
||
|
|
||
|
length = v[0]*v[0] + v[1]*v[1] + v[2]*v[2];
|
||
|
length = sqrt (length);
|
||
|
if (length)
|
||
|
{
|
||
|
ilength = 1/length;
|
||
|
out[0] = v[0]*ilength;
|
||
|
out[1] = v[1]*ilength;
|
||
|
out[2] = v[2]*ilength;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
VectorClear (out);
|
||
|
}
|
||
|
|
||
|
return length;
|
||
|
}
|
||
|
float QDECL VectorNormalize (vec3_t v)
|
||
|
{
|
||
|
return VectorNormalize2(v,v);
|
||
|
}
|
||
|
|
||
|
void QDECL Com_sprintf (char *dest, int size, const char *fmt, ...)
|
||
|
{
|
||
|
va_list argptr;
|
||
|
|
||
|
va_start (argptr, fmt);
|
||
|
vsnprintf (dest, size, fmt, argptr);
|
||
|
va_end (argptr);
|
||
|
}
|
||
|
|
||
|
int Q_strncasecmp (const char *s1, const char *s2, int n)
|
||
|
{
|
||
|
int c1, c2;
|
||
|
|
||
|
while (1)
|
||
|
{
|
||
|
c1 = *s1++;
|
||
|
c2 = *s2++;
|
||
|
|
||
|
if (!n--)
|
||
|
return 0; // strings are equal until end point
|
||
|
|
||
|
if (c1 != c2)
|
||
|
{
|
||
|
if (c1 >= 'a' && c1 <= 'z')
|
||
|
c1 -= ('a' - 'A');
|
||
|
if (c2 >= 'a' && c2 <= 'z')
|
||
|
c2 -= ('a' - 'A');
|
||
|
if (c1 != c2)
|
||
|
{ // strings not equal
|
||
|
if (c1 > c2)
|
||
|
return 1; // strings not equal
|
||
|
return -1;
|
||
|
}
|
||
|
}
|
||
|
if (!c1)
|
||
|
return 0; // strings are equal
|
||
|
// s1++;
|
||
|
// s2++;
|
||
|
}
|
||
|
|
||
|
return -1;
|
||
|
}
|
||
|
int QDECL Q_stricmp (const char *s1, const char *s2)
|
||
|
{
|
||
|
return Q_strncasecmp (s1, s2, 0x7fffffff);
|
||
|
}
|
||
|
|
||
|
void QDECL Q_strncpyz(char *d, const char *s, int n)
|
||
|
{
|
||
|
int i;
|
||
|
n--;
|
||
|
if (n < 0)
|
||
|
return; //this could be an error
|
||
|
|
||
|
for (i=0; *s; i++)
|
||
|
{
|
||
|
if (i == n)
|
||
|
break;
|
||
|
*d++ = *s++;
|
||
|
}
|
||
|
*d='\0';
|
||
|
}
|
||
|
|
||
|
char *QDECL va(char *format, ...)
|
||
|
{
|
||
|
#define VA_BUFFER_SIZE 1024
|
||
|
va_list argptr;
|
||
|
static char string[VA_BUFFER_SIZE];
|
||
|
|
||
|
va_start (argptr, format);
|
||
|
vsnprintf (string,sizeof(string)-1, format,argptr);
|
||
|
va_end (argptr);
|
||
|
|
||
|
return string;
|
||
|
}
|