ReGameDLL_CS/regamedll/pm_shared/pm_math.cpp
s1lentq 4a774865ba Refactoring
Added remaining functions of pm_math/pm_debug
2016-01-28 05:50:27 +06:00

421 lines
8.4 KiB
C++

#include "precompiled.h"
/*
* Globals initialization
*/
#ifndef HOOK_GAMEDLL
vec3_t vec3_origin = {0, 0, 0};
int nanmask = 255<<23;
#else
vec3_t vec3_origin;
int nanmask;
#endif // HOOK_GAMEDLL
/* <2ce436> ../cstrike/pm_shared/pm_math.c:35 */
float anglemod(float a)
{
a = (360.0 / 65536) * ((int)(a *(65536 / 360.0)) & 65535);
return a;
}
/* <2ce461> ../cstrike/pm_shared/pm_math.c:41 */
void AngleVectors(const vec_t *angles, vec_t *forward, vec_t *right, vec_t *up)
{
float sr, sp, sy, cr, cp;
float_precision cy;
float_precision angle;
angle = (float_precision)(angles[YAW] * (M_PI * 2 / 360));
sy = sin(angle);
cy = cos(angle);
angle = (float_precision)(angles[PITCH] * (M_PI * 2 / 360));
sp = sin(angle);
cp = cos(angle);
angle = (float_precision)(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;
}
}
/* <2ce521> ../cstrike/pm_shared/pm_math.c:76 */
void AngleVectorsTranspose(const vec_t *angles, vec_t *forward, vec_t *right, vec_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] = (sr * sp * cy + cr * -sy);
forward[2] = (cr * sp * cy + -sr * -sy);
}
if (right)
{
right[0] = cp * sy;
right[1] = (sr * sp * sy + cr * cy);
right[2] = (cr * sp * sy + -sr * cy);
}
if (up)
{
up[0] = -sp;
up[1] = sr * cp;
up[2] = cr * cp;
}
}
/* <2ce5d0> ../cstrike/pm_shared/pm_math.c:112 */
void AngleMatrix(const vec_t *angles, float (*matrix)[4])
{
float_precision angle;
float_precision sr, sp, sy, cr, cp, cy;
angle = (float_precision)(angles[ROLL] * (M_PI * 2 / 360));
sy = sin(angle);
cy = cos(angle);
angle = (float_precision)(angles[YAW] * (M_PI * 2 / 360));
sp = sin(angle);
cp = cos(angle);
angle = (float_precision)(angles[PITCH] * (M_PI * 2 / 360));
sr = sin(angle);
cr = cos(angle);
matrix[0][0] = cr * cp;
matrix[1][0] = cr * sp;
matrix[2][0] = -sr;
matrix[0][1] = (sy * sr) * cp - cy * sp;
matrix[1][1] = (sy * sr) * sp + cy * cp;
matrix[2][1] = sy * cr;
matrix[0][2] = (cy * sr) * cp + sy * sp;
matrix[1][2] = (cy * sr) * sp - sy * cp;
matrix[2][2] = cy * cr;
matrix[0][3] = 0.0f;
matrix[1][3] = 0.0f;
matrix[2][3] = 0.0f;
}
/* <2ce67b> ../cstrike/pm_shared/pm_math.c:142 */
void AngleIMatrix(const vec_t *angles, float (*matrix)[4])
{
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);
// matrix = (YAW * PITCH) * ROLL
matrix[0][0] = cp * cy;
matrix[0][1] = cp * sy;
matrix[0][2] = -sp;
matrix[1][0] = sr * sp * cy + cr * -sy;
matrix[1][1] = sr * sp * sy + cr * cy;
matrix[1][2] = sr * cp;
matrix[2][0] = (cr * sp * cy + -sr * -sy);
matrix[2][1] = (cr * sp * sy + -sr * cy);
matrix[2][2] = cr * cp;
matrix[0][3] = 0.0;
matrix[1][3] = 0.0;
matrix[2][3] = 0.0;
}
/* <2ce710> ../cstrike/pm_shared/pm_math.c:172 */
void NormalizeAngles(float *angles)
{
int i;
// Normalize angles
for (i = 0; i < 3; ++i)
{
if (angles[i] > 180.0)
{
angles[i] -= 360.0;
}
else if (angles[i] < -180.0)
{
angles[i] += 360.0;
}
}
}
// Interpolate Euler angles.
// FIXME: Use Quaternions to avoid discontinuities
// Frac is 0.0 to 1.0 (i.e., should probably be clamped, but doesn't have to be)
/* <2ce75f> ../cstrike/pm_shared/pm_math.c:198 */
void InterpolateAngles(float *start, float *end, float *output, float frac)
{
int i;
float ang1, ang2;
float d;
NormalizeAngles(start);
NormalizeAngles(end);
for (i = 0; i < 3; ++i)
{
ang1 = start[i];
ang2 = end[i];
d = ang2 - ang1;
if (d > 180)
{
d -= 360;
}
else if (d < -180)
{
d += 360;
}
output[i] = ang1 + d * frac;
}
NormalizeAngles(output);
}
/* <2ce893> ../cstrike/pm_shared/pm_math.c:235 */
float AngleBetweenVectors(const vec_t *v1, const vec_t *v2)
{
float angle;
float l1 = Length(v1);
float l2 = Length(v2);
if (!l1 || !l2)
return 0.0f;
angle = acos(DotProduct(v1, v2)) / (l1 * l2);
angle = (angle * 180.0f) / M_PI;
return angle;
}
/* <2ce953> ../cstrike/pm_shared/pm_math.c:251 */
void VectorTransform(const vec_t *in1, float (*in2)[4], vec_t *out)
{
out[0] = _DotProduct(in1, in2[0]) + in2[0][3];
out[1] = _DotProduct(in1, in2[1]) + in2[1][3];
out[2] = _DotProduct(in1, in2[2]) + in2[2][3];
}
/* <2ce996> ../cstrike/pm_shared/pm_math.c:259 */
int VectorCompare(const vec_t *v1, const vec_t *v2)
{
int i;
for (i = 0; i < 3; ++i)
{
if (v1[i] != v2[i])
return 0;
}
return 1;
}
/* <2ce9de> ../cstrike/pm_shared/pm_math.c:270 */
void VectorMA(const vec_t *veca, float scale, const vec_t *vecb, vec_t *vecc)
{
vecc[0] = veca[0] + scale * vecb[0];
vecc[1] = veca[1] + scale * vecb[1];
vecc[2] = veca[2] + scale * vecb[2];
}
/* <2cea34> ../cstrike/pm_shared/pm_math.c:278 */
float_precision _DotProduct(const vec_t *v1, const vec_t *v2)
{
return v1[0] * v2[0] + v1[1] * v2[1] + v1[2] * v2[2];
}
/* <2cea6e> ../cstrike/pm_shared/pm_math.c:283 */
void _VectorSubtract(vec_t *veca, vec_t *vecb, vec_t *out)
{
out[0] = veca[0] - vecb[0];
out[1] = veca[1] - vecb[1];
out[2] = veca[2] - vecb[2];
}
/* <2ceab5> ../cstrike/pm_shared/pm_math.c:290 */
void _VectorAdd(vec_t *veca, vec_t *vecb, vec_t *out)
{
out[0] = veca[0] + vecb[0];
out[1] = veca[1] + vecb[1];
out[2] = veca[2] + vecb[2];
}
/* <2ceafc> ../cstrike/pm_shared/pm_math.c:297 */
void _VectorCopy(vec_t *in, vec_t *out)
{
out[0] = in[0];
out[1] = in[1];
out[2] = in[2];
}
/* <2ceb8d> ../cstrike/pm_shared/pm_math.c:307 */
void _CrossProduct(const vec_t *v1, const vec_t *v2, vec_t *cross)
{
cross[0] = v1[1] * v2[2] - v1[2] * v2[1];
cross[1] = v1[2] * v2[0] - v1[0] * v2[2];
cross[2] = v1[0] * v2[1] - v1[1] * v2[0];
}
/* <2ce85f> ../cstrike/pm_shared/pm_math.c:313 */
float_precision Length(const vec_t *v)
{
int i;
float_precision length = 0.0f;
for (i = 0; i < 3; ++i)
length += v[i] * v[i];
return sqrt(length);
}
/* <2cebc2> ../cstrike/pm_shared/pm_math.c:325 */
float Distance(const vec_t *v1, const vec_t *v2)
{
vec_t d[3];
VectorSubtract(v2, v1, d);
return Length(d);
}
/* <2cec3c> ../cstrike/pm_shared/pm_math.c:332 */
float_precision VectorNormalize(vec_t *v)
{
float_precision length;
float_precision ilength;
length = sqrt((float_precision)(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]));
if (length)
{
ilength = 1.0 / length;
v[0] *= ilength;
v[1] *= ilength;
v[2] *= ilength;
}
return length;
}
/* <2ceca2> ../cstrike/pm_shared/pm_math.c:351 */
void VectorInverse(vec_t *v)
{
v[0] = -v[0];
v[1] = -v[1];
v[2] = -v[2];
}
/* <2cecc9> ../cstrike/pm_shared/pm_math.c:358 */
void VectorScale(const vec_t *in, vec_t scale, vec_t *out)
{
out[0] = scale * in[0];
out[1] = scale * in[1];
out[2] = scale * in[2];
}
/* <2ced0f> ../cstrike/pm_shared/pm_math.c:366 */
int Q_log2(int val)
{
int answer = 0;
while (val >>= 1)
answer++;
return answer;
}
/* <2ced4d> ../cstrike/pm_shared/pm_math.c:374 */
void VectorMatrix(vec_t *forward, vec_t *right, vec_t *up)
{
vec_t tmp[3];
if (forward[0] == 0 && forward[1] == 0)
{
right[0] = 1;
right[1] = 0;
right[2] = 0;
up[0] = -forward[2];
up[1] = 0;
up[2] = 0;
return;
}
tmp[0] = 0; tmp[1] = 0; tmp[2] = 1.0;
_CrossProduct(forward, tmp, right);
VectorNormalize(right);
_CrossProduct(right, forward, up);
VectorNormalize(up);
}
/* <2cee68> ../cstrike/pm_shared/pm_math.c:398 */
void VectorAngles(const vec_t *forward, vec_t *angles)
{
float tmp, yaw, pitch;
if (forward[1] == 0 && forward[0] == 0)
{
yaw = 0;
if (forward[2] > 0)
pitch = 90;
else
pitch = 270;
}
else
{
yaw = (atan2(forward[1], forward[0]) * 180 / M_PI);
if (yaw < 0)
yaw += 360;
tmp = sqrt (forward[0]*forward[0] + forward[1]*forward[1]);
pitch = (atan2(forward[2], tmp) * 180 / M_PI);
if (pitch < 0)
pitch += 360;
}
angles[0] = pitch;
angles[1] = yaw;
angles[2] = 0;
}