mirror of
https://github.com/dashr9230/SA-MP.git
synced 2024-12-22 14:37:29 +08:00
198 lines
4.5 KiB
C++
198 lines
4.5 KiB
C++
|
|
#include "main.h"
|
|
#include <math.h>
|
|
|
|
#ifndef MAX
|
|
#define MAX(x, y) ((x) < (y) ? (y) : (x))
|
|
#endif
|
|
|
|
//----------------------------------------------------
|
|
|
|
bool FUNC_1(PVECTOR vec)
|
|
{
|
|
if( vec->X <= 1.0f && vec->X >= -1.0f &&
|
|
vec->Y <= 1.0f && vec->Y >= -1.0f &&
|
|
vec->Z <= 1.0f && vec->Z >= -1.0f )
|
|
{
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
//----------------------------------------------------
|
|
|
|
bool FUNC_2(PVECTOR vec)
|
|
{
|
|
if( vec->X < 20000.0f && vec->X > -20000.0f &&
|
|
vec->Y < 20000.0f && vec->Y > -20000.0f &&
|
|
vec->Z < 200000.0f && vec->Z > -1000.0f )
|
|
{
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
//----------------------------------------------------
|
|
|
|
bool FUNC_3(PVECTOR vec)
|
|
{
|
|
if( vec->X < 100.0f && vec->X > -100.0f &&
|
|
vec->Y < 100.0f && vec->Y > -100.0f &&
|
|
vec->Z < 100.0f && vec->Z > -100.0f )
|
|
{
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
//----------------------------------------------------
|
|
|
|
float GetLength(PVECTOR vec)
|
|
{
|
|
return (float)sqrt((vec->X * vec->X) + (vec->Y * vec->Y) + (vec->Z * vec->Z));
|
|
}
|
|
|
|
//----------------------------------------------------
|
|
|
|
void CrossProduct(PVECTOR out, PVECTOR vec1, PVECTOR vec2)
|
|
{
|
|
out->X = vec1->Y * vec2->Z - vec2->Y * vec1->Z;
|
|
out->Y = vec1->Z * vec2->X - vec2->Z * vec1->X;
|
|
out->Z = vec1->X * vec2->Y - vec2->X * vec1->Y;
|
|
}
|
|
|
|
//----------------------------------------------------
|
|
|
|
void Transform(PVECTOR out, PMATRIX4X4 mat, PVECTOR vec)
|
|
{
|
|
out->X = vec->X * mat->right.X + vec->Y * mat->up.X + vec->Z * mat->at.X + mat->pos.X;
|
|
out->Y = vec->X * mat->right.Y + vec->Y * mat->up.Y + vec->Z * mat->at.Y + mat->pos.Y;
|
|
out->Z = vec->X * mat->right.Z + vec->Y * mat->up.Z + vec->Z * mat->at.Z + mat->pos.Z;
|
|
}
|
|
|
|
//----------------------------------------------------
|
|
|
|
void MatrixToQuaternion(float m00, float m01, float m02, float m10, float m11, float m12, float m20, float m21, float m22, float *qw, float *qx, float *qy, float *qz)
|
|
{
|
|
float w1 = (float)sqrt(MAX(1.0f + m00 + m11 + m22, 0.0f)) * 0.5f;
|
|
float x1 = (float)sqrt(MAX(1.0f + m00 - m11 - m22, 0.0f)) * 0.5f;
|
|
float y1 = (float)sqrt(MAX(1.0f - m00 + m11 - m22, 0.0f)) * 0.5f;
|
|
float z1 = (float)sqrt(MAX(1.0f - m00 - m11 + m22, 0.0f)) * 0.5f;
|
|
|
|
if(w1 < 0.0f) w1 = 0.0f;
|
|
if(x1 < 0.0f) x1 = 0.0f;
|
|
if(y1 < 0.0f) y1 = 0.0f;
|
|
if(z1 < 0.0f) z1 = 0.0f;
|
|
|
|
float x2 = _copysign(x1, m21 - m12);
|
|
float y2 = _copysign(y1, m02 - m20);
|
|
float z2 = _copysign(z1, m10 - m01);
|
|
|
|
*qw = w1;
|
|
*qx = x2;
|
|
*qy = y2;
|
|
*qz = z2;
|
|
}
|
|
|
|
//----------------------------------------------------
|
|
|
|
void QuaternionToMatrix(float qw, float qx, float qy, float qz, float *m00, float *m01, float *m02, float *m10, float *m11, float *m12, float *m20, float *m21, float *m22)
|
|
{
|
|
float ww = qw * qw;
|
|
float xx = qx * qx;
|
|
float yy = qy * qy;
|
|
float zz = qz * qz;
|
|
|
|
*m00 = xx - yy - zz + ww;
|
|
*m11 = yy - xx - zz + ww;
|
|
*m22 = zz - (yy + xx) + ww;
|
|
|
|
float xy = qx * qy;
|
|
float zw = qz * qw;
|
|
*m10 = zw + xy + zw + xy;
|
|
*m01 = xy - zw + xy - zw;
|
|
|
|
float xz = qx * qz;
|
|
float yw = qw * qy;
|
|
*m20 = xz - yw + xz - yw;
|
|
*m02 = yw + xz + yw + xz;
|
|
|
|
float yz = qy * qz;
|
|
float xw = qx * qw;
|
|
*m21 = xw + yz + xw + yz;
|
|
*m12 = yz - xw + yz - xw;
|
|
}
|
|
|
|
//----------------------------------------------------
|
|
|
|
void MatrixToQuaternion(PMATRIX4X4 mat, PQUATERNION quat)
|
|
{
|
|
MatrixToQuaternion(
|
|
mat->right.X,
|
|
mat->right.Y,
|
|
mat->right.Z,
|
|
mat->up.X,
|
|
mat->up.Y,
|
|
mat->up.Z,
|
|
mat->at.X,
|
|
mat->at.Y,
|
|
mat->at.Z,
|
|
&quat->W,
|
|
&quat->X,
|
|
&quat->Y,
|
|
&quat->Z);
|
|
}
|
|
|
|
//----------------------------------------------------
|
|
|
|
void QuaternionToMatrix(PQUATERNION quat, PMATRIX4X4 mat)
|
|
{
|
|
QuaternionToMatrix(
|
|
quat->W,
|
|
quat->X,
|
|
quat->Y,
|
|
quat->Z,
|
|
&mat->right.X,
|
|
&mat->right.Y,
|
|
&mat->right.Z,
|
|
&mat->up.X,
|
|
&mat->up.Y,
|
|
&mat->up.Z,
|
|
&mat->at.X,
|
|
&mat->at.Y,
|
|
&mat->at.Z);
|
|
}
|
|
|
|
//----------------------------------------------------
|
|
|
|
float GetNormalisation(PVECTOR vec)
|
|
{
|
|
return ((vec->X * vec->X) + (vec->Y * vec->Y) + (vec->Z * vec->Z));
|
|
}
|
|
|
|
//----------------------------------------------------
|
|
|
|
void ToQuaternion(PVECTOR vec, PQUATERNION quat)
|
|
{
|
|
float cr = cosf(vec->X * 0.5f);
|
|
float cp = cosf(vec->Y * 0.5f);
|
|
float cy = cosf(vec->Z * 0.5f);
|
|
float sr = sinf(vec->X * 0.5f);
|
|
float sp = sinf(vec->Y * 0.5f);
|
|
float sy = sinf(vec->Z * 0.5f);
|
|
|
|
quat->W = cr * cp * cy + sr * sp * sy;
|
|
quat->X = sr * cp * cy - cr * sp * sy;
|
|
quat->Y = cr * sp * cy + sr * cp * sy;
|
|
quat->Z = cr * cp * sy - sr * sp * cy;
|
|
}
|
|
|
|
//----------------------------------------------------
|
|
|
|
void ToEulerAngles(PQUATERNION quat, PVECTOR vec)
|
|
{
|
|
|
|
}
|
|
|
|
//----------------------------------------------------
|