168 lines
3.3 KiB
C
168 lines
3.3 KiB
C
//
|
|
// Matrix stuff...
|
|
//
|
|
|
|
#ifndef _MATRIX_
|
|
#define _MATRIX_
|
|
|
|
//
|
|
// ALL ANGLES ARE IN RADIANS.
|
|
//
|
|
|
|
//
|
|
// Fills in the matrix appropriately given the three angles (yaw, pitch, roll)
|
|
// for the eye along the z-axis.
|
|
//
|
|
|
|
void MATRIX_calc(float matrix[9], float yaw, float pitch, float roll);
|
|
|
|
//
|
|
// Makes a rotation matrix that rotates 'angle' radians about thie given unit vector
|
|
//
|
|
|
|
void MATRIX_calc_arb(
|
|
float matrix[9],
|
|
float ux,
|
|
float uy,
|
|
float uz,
|
|
float angle);
|
|
|
|
//
|
|
// Calculates a vector from yaw and pitch...
|
|
//
|
|
|
|
void MATRIX_vector(float vector[3], float yaw, float pitch);
|
|
|
|
//
|
|
// Skews the view matrix so that it is correct for 3d clipping.
|
|
//
|
|
// The skew value should be one over the horizontal view-window resolution
|
|
// divided by the vertical view-window resolution.
|
|
//
|
|
// The x and y vectors are multiplied by the zoom.
|
|
//
|
|
// The whole matrix is scaled by scale.
|
|
//
|
|
|
|
void MATRIX_skew(float matrix[9], float skew, float zoom, float scale);
|
|
|
|
|
|
//
|
|
// Normalises the vector.
|
|
//
|
|
|
|
#define MATRIX_NORMALISE(x,y,z) \
|
|
{ \
|
|
float len2; \
|
|
float len; \
|
|
float overlen; \
|
|
\
|
|
len2 = (x)*(x) + (y)*(y) + (z)*(z); \
|
|
len = sqrtf(len2); \
|
|
overlen = 1.0F / len; \
|
|
\
|
|
(x) *= overlen; \
|
|
(y) *= overlen; \
|
|
(z) *= overlen; \
|
|
}
|
|
|
|
|
|
//
|
|
// Multiplies points x,y,z by matrix m.
|
|
//
|
|
|
|
#define MATRIX_MUL(m,x,y,z) \
|
|
{ \
|
|
float xnew, ynew, znew; \
|
|
\
|
|
xnew = (x) * (m)[0]; \
|
|
ynew = (x) * (m)[3]; \
|
|
znew = (x) * (m)[6]; \
|
|
\
|
|
xnew += (y) * (m)[1]; \
|
|
ynew += (y) * (m)[4]; \
|
|
znew += (y) * (m)[7]; \
|
|
\
|
|
xnew += (z) * (m)[2]; \
|
|
ynew += (z) * (m)[5]; \
|
|
znew += (z) * (m)[8]; \
|
|
\
|
|
(x) = xnew; (y) = ynew; (z) = znew; \
|
|
}
|
|
|
|
|
|
//
|
|
// Multiplies points x,y,z by the transpose of matrix m.
|
|
//
|
|
|
|
#define MATRIX_MUL_BY_TRANSPOSE(m,x,y,z) \
|
|
{ \
|
|
float xnew, ynew, znew; \
|
|
\
|
|
xnew = (x) * (m)[0]; \
|
|
ynew = (x) * (m)[1]; \
|
|
znew = (x) * (m)[2]; \
|
|
\
|
|
xnew += (y) * (m)[3]; \
|
|
ynew += (y) * (m)[4]; \
|
|
znew += (y) * (m)[5]; \
|
|
\
|
|
xnew += (z) * (m)[6]; \
|
|
ynew += (z) * (m)[7]; \
|
|
znew += (z) * (m)[8]; \
|
|
\
|
|
(x) = xnew; (y) = ynew; (z) = znew; \
|
|
}
|
|
|
|
//
|
|
// Multiplies two 3x3 together. A = MN.
|
|
//
|
|
|
|
void MATRIX_3x3mul(float a[9], float m[9], float n[9]);
|
|
|
|
//
|
|
// Transposes the matrix m.
|
|
//
|
|
|
|
#define MATRIX_TRANSPOSE(m) {SWAP_FL(m[1], m[3]); SWAP_FL(m[2], m[6]); SWAP_FL(m[5], m[7]);}
|
|
|
|
//
|
|
// Rotates a matrix about its x,y or z vector.
|
|
//
|
|
|
|
void MATRIX_rotate_about_its_x(float *matrix, float angle);
|
|
void MATRIX_rotate_about_its_y(float *matrix, float angle);
|
|
void MATRIX_rotate_about_its_z(float *matrix, float angle);
|
|
|
|
//
|
|
// Convert a matrix into its equivalent yaw, pitch and roll.
|
|
//
|
|
|
|
Direction MATRIX_find_angles(float matrix[9]);
|
|
|
|
|
|
//
|
|
// Scales the given vector.
|
|
//
|
|
|
|
void MATRIX_scale(float matrix[9], float mulby);
|
|
|
|
|
|
//
|
|
// Constructs an orthonormal matrix from a vector whose [6][7][8] is the normalised
|
|
// vector (dx,dy,dz). It return a matrix without any 'roll'. (dx,dy,dz) does not
|
|
// have to be normalised.
|
|
//
|
|
|
|
void MATRIX_construct(float matrix[9], float dx, float dy, float dz);
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|