mirror of
https://github.com/nzp-team/fteqw.git
synced 2024-11-27 06:02:16 +00:00
cd97d1fff3
fix q3 looping sounds fix q3sv bug that was kicking clients on map changes attempt to resize q3ui if the window changes size added some more disconnect reasons (for menuqc/q3ui to report). reworked particle count/step arguments for better compat with DP. particles that used count for trails were already broken... drawtextfield builtin will report line numbers shown, so qc can finally tell how much text there actually was added some more items to 'fps_preset dp', stuff needed for the 'quake15' mod. added dpcompat_noretouchground cvar for people wanting to mimic dp's bugs. added 'r_netgraph 2' setting, which will show packet sizes per svc, in part to highlight wasteful mods. added cvar to disable the q1mdl floodfill, which caused problems for yet another person. internal editor now attempts to support debugging asm, if no source is available. fix 64bit icon bug in x11. FINALLY fix high's te_teleport effect. load with no arguments will scan for the most recent a#/s#/quick savedgame instead of using just quick. load command will chose between fte and vanilla savedgame formats based on modification time, if both exist in the same package/dir. git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@5394 fc73d0e0-1445-4013-8a0c-d673dee63da5
198 lines
3.4 KiB
C
198 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;
|
|
}
|