UwUHax/math.cpp

131 lines
2.4 KiB
C++
Raw Normal View History

2021-08-27 19:58:23 +08:00
#include "hooks.h"
float Math::DotProduct(const float *v1, const float *v2)
{
return v1[0] * v2[0] + v1[1] * v2[1] + v1[2] * v2[2];
}
float Math::sseSqrt(float x)
{
float root = 0.0f;
__asm
{
sqrtss xmm0, x
movss root, xmm0
}
return root;
}
void Math::vectorAngles(Vector forward, Vector &angles)
{
if (forward[1] == 0.0f && forward[0] == 0.0f)
{
angles[0] = (forward[2] > 0.0f) ? 270.0f : 90.0f;
angles[1] = 0.0f;
}
else
{
float len2d = sseSqrt(square(forward[0]) + square(forward[1]));
angles[0] = RAD2DEG(atan2f(-forward[2], len2d));
angles[1] = RAD2DEG(atan2f(forward[1], forward[0]));
if (angles[0] < 0.0f) angles[0] += 360.0f;
if (angles[1] < 0.0f) angles[1] += 360.0f;
}
angles[2] = 0.0f;
}
VOID Math::VectorTransform(const Vector in1, const matrix3x4_t& in2, Vector& out)
{
float buf[3];
buf[0] = in1.x;
buf[1] = in1.y;
buf[2] = in1.z;
out[0] = DotProduct(buf, in2[0]) + in2[0][3];
out[1] = DotProduct(buf, in2[1]) + in2[1][3];
out[2] = DotProduct(buf, in2[2]) + in2[2][3];
}
float Math::GetFov(Vector vLocalOrigin, Vector vPosition, Vector vForward)
{
Vector vLocal;
VectorSubtract(vPosition, vLocalOrigin, vLocal);
vLocal.NormalizeInPlace();
float fValue = vForward.Dot(vLocal);
if (fValue < -1.0f)
fValue = -1.0f;
if (fValue > 1.0f)
fValue = 1.0f;
return RAD2DEG(acos(fValue));
}
void Math::CalcAngle(Vector &vSource, Vector &vDestination, Vector &qAngle)
{
Vector vDelta = vSource - vDestination;
float fHyp = (vDelta.x * vDelta.x) + (vDelta.y * vDelta.y);
float fRoot;
__asm
{
sqrtss xmm0, fHyp
movss fRoot, xmm0
}
qAngle.x = RAD2DEG(atan(vDelta.z / fRoot));
qAngle.y = RAD2DEG(atan(vDelta.y / vDelta.x));
if (vDelta.x >= 0.0f)
qAngle.y += 180.0f;
qAngle.x = AngleNormalize(qAngle.x);
qAngle.y = AngleNormalize(qAngle.y);
}
void sinCos(float radians, PFLOAT sine, PFLOAT cosine)
{
__asm
{
fld dword ptr[radians]
fsincos
mov edx, dword ptr[cosine]
mov eax, dword ptr[sine]
fstp dword ptr[edx]
fstp dword ptr[eax]
}
}
void Math::angleVectors(Vector angles, Vector &f)
{
float sp, sy, sr, cp, cy, cr;
sinCos(DEG2RAD(angles[0]), &sp, &cp);
sinCos(DEG2RAD(angles[1]), &sy, &cy);
sinCos(DEG2RAD(angles[2]), &sr, &cr);
f[0] = cp * cy;
f[1] = cp * sy;
f[2] = -sp;
}
float Math::AngleNormalize(float angle)
{
while (angle < -180) angle += 360;
while (angle > 180) angle -= 360;
return angle;
}