📄 fixedmath.h
字号:
return (x < 0) ? -0x7FFFFFFF : 0x7FFFFFFF;
}
else
return ftofix(fixtof(x) / fixtof(y));
}
/**
* \fn int fceil (fixed x)
* \brief Rounds a fixed point value to the nearest integer.
*
* This function rounds the fixed point value \a x to the nearest integer
* and returns it.
*
* \return The rounded integer value.
*/
static inline int fceil (fixed x)
{
x += 0xFFFF;
if (x >= 0x80000000) {
errno = ERANGE;
return 0x7FFF;
}
return (x >> 16);
}
/**
* \fn fixed itofix (int x)
* \brief Converts an integer to a fixed point value.
*
* This function converts the integer \a x to a fixed point value.
*
* \sa fixtoi
*/
static inline fixed itofix (int x)
{
return x << 16;
}
/**
* \fn int fixtoi (fixed x)
* \brief Converts an fixed point value to an integer.
*
* This function converts the fixed point \a x to an integer.
*
* \sa itofix
*/
static inline int fixtoi (fixed x)
{
return (x >> 16) + ((x & 0x8000) >> 15);
}
/**
* \fn fixed fcos (fixed x)
* \brief Returns the cosine of a fixed point.
*
* This function returns the cosine of the fixed point \a x,
* where \a x is given in radians.
*
* \sa facos
*/
static inline fixed fcos (fixed x)
{
return _cos_tbl[((x + 0x4000) >> 15) & 0x1FF];
}
/**
* \fn fixed fsin (fixed x)
* \brief Returns the sine of a fixed point.
*
* This function returns the sine of the fixed point \a x,
* where \a x is given in radians.
*
* \sa fasin
*/
static inline fixed fsin (fixed x)
{
return _cos_tbl[((x - 0x400000 + 0x4000) >> 15) & 0x1FF];
}
/**
* \fn fixed ftan (fixed x)
* \brief Returns the tangent of a fixed point.
*
* This function returns the tangent of the fixed point \a x,
* where \a x is given in radians.
*
* \sa fcos, fsin
*/
static inline fixed ftan (fixed x)
{
return _tan_tbl[((x + 0x4000) >> 15) & 0xFF];
}
/**
* \fn fixed facos (fixed x)
* \brief Calculates and returns the arc cosine of a fixed point.
*
* This function calculates the arc cosine of the fixed point \a x;
* that is the value whose cosine is \a x. If \a x falls outside
* the range -1 to 1, this function fails and \a errno is set to EDOM.
*
* \return Returns the arc cosine in radians and the value is mathematically
* defined to be between 0 and PI (inclusive).
*
* \sa fcos
*/
static inline fixed facos (fixed x)
{
if ((x < -65536) || (x > 65536)) {
errno = EDOM;
return 0;
}
return _acos_tbl[(x+65536+127)>>8];
}
/**
* \fn fixed fasin (fixed x)
* \brief Calculates and returns the arc sine of a fixed point.
*
* This function calculates the arc sine of the fixed point \a x;
* that is the value whose sine is \a x. If \a x falls outside
* the range -1 to 1, this function fails and \a errno is set to EDOM.
*
* \return Returns the arc sine in radians and the value is mathematically
* defined to be between -PI/2 and PI/2 (inclusive).
*
* \sa fsin
*/
static inline fixed fasin (fixed x)
{
if ((x < -65536) || (x > 65536)) {
errno = EDOM;
return 0;
}
return 0x00400000 - _acos_tbl[(x+65536+127)>>8];
}
/** @} end of fixed_math_fns */
#ifdef _MATH_3D
typedef struct MATRIX /* transformation matrix (fixed point) */
{
fixed v[3][3]; /* scaling and rotation */
fixed t[3]; /* translation */
} MATRIX;
typedef struct MATRIX_f /* transformation matrix (floating point) */
{
float v[3][3]; /* scaling and rotation */
float t[3]; /* translation */
} MATRIX_f;
extern MATRIX identity_matrix;
extern MATRIX_f identity_matrix_f;
void get_translation_matrix (MATRIX *m, fixed x, fixed y, fixed z);
void get_translation_matrix_f (MATRIX_f *m, float x, float y, float z);
void get_scaling_matrix (MATRIX *m, fixed x, fixed y, fixed z);
void get_scaling_matrix_f (MATRIX_f *m, float x, float y, float z);
void get_x_rotate_matrix (MATRIX *m, fixed r);
void get_x_rotate_matrix_f (MATRIX_f *m, float r);
void get_y_rotate_matrix (MATRIX *m, fixed r);
void get_y_rotate_matrix_f (MATRIX_f *m, float r);
void get_z_rotate_matrix (MATRIX *m, fixed r);
void get_z_rotate_matrix_f (MATRIX_f *m, float r);
void get_rotation_matrix (MATRIX *m, fixed x, fixed y, fixed z);
void get_rotation_matrix_f (MATRIX_f *m, float x, float y, float z);
void get_align_matrix (MATRIX *m, fixed xfront, fixed yfront, fixed zfront, fixed xup, fixed yup, fixed zup);
void get_align_matrix_f (MATRIX_f *m, float xfront, float yfront, float zfront, float xup, float yup, float zup);
void get_vector_rotation_matrix (MATRIX *m, fixed x, fixed y, fixed z, fixed a);
void get_vector_rotation_matrix_f (MATRIX_f *m, float x, float y, float z, float a);
void get_transformation_matrix (MATRIX *m, fixed scale, fixed xrot, fixed yrot, fixed zrot, fixed x, fixed y, fixed z);
void get_transformation_matrix_f (MATRIX_f *m, float scale, float xrot, float yrot, float zrot, float x, float y, float z);
void get_camera_matrix (MATRIX *m, fixed x, fixed y, fixed z, fixed xfront, fixed yfront, fixed zfront,
fixed xup, fixed yup, fixed zup, fixed fov, fixed aspect);
void get_camera_matrix_f (MATRIX_f *m, float x, float y, float z, float xfront, float yfront, float zfront,
float xup, float yup, float zup, float fov, float aspect);
void qtranslate_matrix (MATRIX *m, fixed x, fixed y, fixed z);
void qtranslate_matrix_f (MATRIX_f *m, float x, float y, float z);
void qscale_matrix (MATRIX *m, fixed scale);
void qscale_matrix_f (MATRIX_f *m, float scale);
void matrix_mul (AL_CONST MATRIX *m1, AL_CONST MATRIX *m2, MATRIX *out);
void matrix_mul_f (AL_CONST MATRIX_f *m1, AL_CONST MATRIX_f *m2, MATRIX_f *out);
fixed vector_length (fixed x, fixed y, fixed z);
float vector_length_f (float x, float y, float z);
void normalize_vector (fixed *x, fixed *y, fixed *z);
void normalize_vector_f (float *x, float *y, float *z);
void cross_product (fixed x1, fixed y1, fixed z1, fixed x2, fixed y2, fixed z2, fixed *xout, fixed *yout, fixed *zout);
void cross_product_f (float x1, float y1, float z1, float x2, float y2, float z2, float *xout, float *yout, float *zout);
fixed polygon_z_normal (AL_CONST V3D *v1, AL_CONST V3D *v2, AL_CONST V3D *v3);
float polygon_z_normal_f (AL_CONST V3D_f *v1, AL_CONST V3D_f *v2, AL_CONST V3D_f *v3);
void apply_matrix_f (AL_CONST MATRIX_f *m, float x, float y, float z, float *xout, float *yout, float *zout);
extern fixed _persp_xscale;
extern fixed _persp_yscale;
extern fixed _persp_xoffset;
extern fixed _persp_yoffset;
extern float _persp_xscale_f;
extern float _persp_yscale_f;
extern float _persp_xoffset_f;
extern float _persp_yoffset_f;
void set_projection_viewport (int x, int y, int w, int h);
typedef struct QUAT
{
float w, x, y, z;
} QUAT;
extern QUAT, identity_quat;
void quat_mul (AL_CONST QUAT *p, AL_CONST QUAT *q, QUAT *out)
void get_x_rotate_quat (QUAT *q, float r);
void get_y_rotate_quat (QUAT *q, float r);
void get_z_rotate_quat (QUAT *q, float r);
void get_rotation_quat (QUAT *q, float x, float y, float z);
void get_vector_rotation_quat (QUAT *q, float x, float y, float z, float a);
void quat_to_matrix (AL_CONST QUAT *q, MATRIX_f *m);
void matrix_to_quat (AL_CONST MATRIX_f *m, QUAT *q);
void apply_quat (AL_CONST QUAT *q, float x, float y, float z, float *xout, float *yout, float *zout);
void quat_slerp (AL_CONST QUAT *from, AL_CONST QUAT *to, float t, QUAT *out, int how);
#define QUAT_SHORT 0
#define QUAT_LONG 1
#define QUAT_CW 2
#define QUAT_CCW 3
#define QUAT_USER 4
#define quat_interpolate(from, to, t, out) quat_slerp((from), (to), (t), (out), QUAT_SHORT)
static inline fixed dot_product (fixed x1, fixed y1, fixed z1, fixed x2, fixed y2, fixed z2)
{
return fmul(x1, x2) + fmul(y1, y2) + fmul(z1, z2);
}
static inline float dot_product_f (float x1, float y1, float z1, float x2, float y2, float z2)
{
return (x1 * x2) + (y1 * y2) + (z1 * z2);
}
#define CALC_ROW(n) (fmul(x, m->v[n][0]) + \
fmul(y, m->v[n][1]) + \
fmul(z, m->v[n][2]) + \
m->t[n])
static inline void apply_matrix (MATRIX *m, fixed x, fixed y, fixed z, fixed *xout, fixed *yout, fixed *zout)
{
*xout = CALC_ROW(0);
*yout = CALC_ROW(1);
*zout = CALC_ROW(2);
}
#undef CALC_ROW
static inline void persp_project (fixed x, fixed y, fixed z, fixed *xout, fixed *yout)
{
*xout = fmul(fdiv(x, z), _persp_xscale) + _persp_xoffset;
*yout = fmul(fdiv(y, z), _persp_yscale) + _persp_yoffset;
}
static inline void persp_project_f (float x, float y, float z, float *xout, float *yout)
{
float z1 = 1.0f / z;
*xout = ((x * z1) * _persp_xscale_f) + _persp_xoffset_f;
*yout = ((y * z1) * _persp_yscale_f) + _persp_yoffset_f;
}
#endif /* _MATH_3D */
/** @} end of global_fns */
/** @} end of fns */
#endif /* _FIXED_MATH */
/* Ends C function definitions when using C++ */
#ifdef __cplusplus
}
#endif
#endif /* _MGUI_FIXED_MATH_H */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -