#ifndef _M_MATRIX_H
#define _M_MATRIX_H
#define MAT_SX 0
#define MAT_SY 5
#define MAT_SZ 10
#define MAT_TX 12
#define MAT_TY 13
#define MAT_TZ 14
#define MATRIX_GENERAL 0
#define MATRIX_IDENTITY 1
#define MATRIX_3D_NO_ROT 2
#define MATRIX_PERSPECTIVE 3
#define MATRIX_2D 4
#define MATRIX_2D_NO_ROT 5
#define MATRIX_3D 6
#define MAT_FLAG_IDENTITY 0
#define MAT_FLAG_GENERAL 0x1
#define MAT_FLAG_ROTATION 0x2
#define MAT_FLAG_TRANSLATION 0x4
#define MAT_FLAG_UNIFORM_SCALE 0x8
#define MAT_FLAG_GENERAL_SCALE 0x10
#define MAT_FLAG_GENERAL_3D 0x20
#define MAT_FLAG_PERSPECTIVE 0x40
#define MAT_FLAG_SINGULAR 0x80
#define MAT_DIRTY_TYPE 0x100
#define MAT_DIRTY_FLAGS 0x200
#define MAT_DIRTY_INVERSE 0x400
#define MAT_FLAGS_ANGLE_PRESERVING (MAT_FLAG_ROTATION | \
MAT_FLAG_TRANSLATION | \
MAT_FLAG_UNIFORM_SCALE)
#define MAT_FLAGS_LENGTH_PRESERVING (MAT_FLAG_ROTATION | \
MAT_FLAG_TRANSLATION)
#define MAT_FLAGS_3D (MAT_FLAG_ROTATION | \
MAT_FLAG_TRANSLATION | \
MAT_FLAG_UNIFORM_SCALE | \
MAT_FLAG_GENERAL_SCALE | \
MAT_FLAG_GENERAL_3D)
#define MAT_FLAGS_GEOMETRY (MAT_FLAG_GENERAL | \
MAT_FLAG_ROTATION | \
MAT_FLAG_TRANSLATION | \
MAT_FLAG_UNIFORM_SCALE | \
MAT_FLAG_GENERAL_SCALE | \
MAT_FLAG_GENERAL_3D | \
MAT_FLAG_PERSPECTIVE | \
MAT_FLAG_SINGULAR)
#define MAT_DIRTY (MAT_DIRTY_TYPE | \
MAT_DIRTY_FLAGS | \
MAT_DIRTY_INVERSE)
#define TEST_MAT_FLAGS(mat, a) \
((MAT_FLAGS_GEOMETRY & (~(a)) & ((mat)->flags) ) == 0)
typedef struct {
GLfloat *m;
GLfloat *inv;
GLuint flags;
GLuint type;
} GLmatrix;
extern void
_math_matrix_ctr( GLmatrix *m );
extern void
_math_matrix_dtr( GLmatrix *m );
extern void
_math_matrix_alloc_inv( GLmatrix *m );
extern void
_math_matrix_mul_matrix( GLmatrix *dest, const GLmatrix *a, const GLmatrix *b );
extern void
_math_matrix_mul_floats( GLmatrix *dest, const GLfloat *b );
extern void
_math_matrix_loadf( GLmatrix *mat, const GLfloat *m );
extern void
_math_matrix_translate( GLmatrix *mat, GLfloat x, GLfloat y, GLfloat z );
extern void
_math_matrix_rotate( GLmatrix *m, GLfloat angle,
GLfloat x, GLfloat y, GLfloat z );
extern void
_math_matrix_scale( GLmatrix *mat, GLfloat x, GLfloat y, GLfloat z );
extern void
_math_matrix_ortho( GLmatrix *mat,
GLfloat left, GLfloat right,
GLfloat bottom, GLfloat top,
GLfloat nearval, GLfloat farval );
extern void
_math_matrix_frustum( GLmatrix *mat,
GLfloat left, GLfloat right,
GLfloat bottom, GLfloat top,
GLfloat nearval, GLfloat farval );
extern void
_math_matrix_set_identity( GLmatrix *dest );
extern void
_math_matrix_copy( GLmatrix *to, const GLmatrix *from );
extern void
_math_matrix_analyse( GLmatrix *mat );
extern void
_math_matrix_print( const GLmatrix *m );
extern void
_math_transposef( GLfloat to[16], const GLfloat from[16] );
extern void
_math_transposed( GLdouble to[16], const GLdouble from[16] );
extern void
_math_transposefd( GLfloat to[16], const GLdouble from[16] );
#endif