1 /* $Id: m_matrix.h,v 1.6 2003/02/25 19:27:06 brianp Exp $ */
4 * Mesa 3-D graphics library
7 * Copyright (C) 1999-2001 Brian Paul All Rights Reserved.
9 * Permission is hereby granted, free of charge, to any person obtaining a
10 * copy of this software and associated documentation files (the "Software"),
11 * to deal in the Software without restriction, including without limitation
12 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
13 * and/or sell copies of the Software, and to permit persons to whom the
14 * Software is furnished to do so, subject to the following conditions:
16 * The above copyright notice and this permission notice shall be included
17 * in all copies or substantial portions of the Software.
19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
20 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
22 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
23 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
24 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
28 * \file math/m_matrix.h
29 * \brief Defines basic structures for matrix-handling.
38 /* Give symbolic names to some of the entries in the matrix to help
39 * out with the rework of the viewport_map as a matrix transform.
50 * \defgroup MatFlags MAT_FLAG_XXX-flags
52 * Bitmasks to indicate different kinds of 4x4 matrices in
56 #define MAT_FLAG_IDENTITY 0
57 #define MAT_FLAG_GENERAL 0x1
58 #define MAT_FLAG_ROTATION 0x2
59 #define MAT_FLAG_TRANSLATION 0x4
60 #define MAT_FLAG_UNIFORM_SCALE 0x8
61 #define MAT_FLAG_GENERAL_SCALE 0x10
62 #define MAT_FLAG_GENERAL_3D 0x20
63 #define MAT_FLAG_PERSPECTIVE 0x40
64 #define MAT_FLAG_SINGULAR 0x80
65 #define MAT_DIRTY_TYPE 0x100
66 #define MAT_DIRTY_FLAGS 0x200
67 #define MAT_DIRTY_INVERSE 0x400
71 #define MAT_FLAGS_ANGLE_PRESERVING (MAT_FLAG_ROTATION | \
72 MAT_FLAG_TRANSLATION | \
73 MAT_FLAG_UNIFORM_SCALE)
75 #define MAT_FLAGS_LENGTH_PRESERVING (MAT_FLAG_ROTATION | \
78 #define MAT_FLAGS_3D (MAT_FLAG_ROTATION | \
79 MAT_FLAG_TRANSLATION | \
80 MAT_FLAG_UNIFORM_SCALE | \
81 MAT_FLAG_GENERAL_SCALE | \
84 #define MAT_FLAGS_GEOMETRY (MAT_FLAG_GENERAL | \
86 MAT_FLAG_TRANSLATION | \
87 MAT_FLAG_UNIFORM_SCALE | \
88 MAT_FLAG_GENERAL_SCALE | \
89 MAT_FLAG_GENERAL_3D | \
90 MAT_FLAG_PERSPECTIVE | \
93 #define MAT_DIRTY (MAT_DIRTY_TYPE | \
97 #define TEST_MAT_FLAGS(mat, a) \
98 ((MAT_FLAGS_GEOMETRY & (~(a)) & ((mat)->flags) ) == 0)
102 MATRIX_GENERAL
, /**< general 4x4 matrix */
103 MATRIX_IDENTITY
, /**< identity matrix */
104 MATRIX_3D_NO_ROT
, /**< ortho projection and others... */
105 MATRIX_PERSPECTIVE
,/**< perspective projection matrix */
106 MATRIX_2D
, /**< 2-D transformation */
107 MATRIX_2D_NO_ROT
, /**< 2-D scale & translate only */
108 MATRIX_3D
/**< 3-D transformation */
112 GLfloat
*m
; /* 16-byte aligned */
113 GLfloat
*inv
; /* optional, 16-byte aligned */
114 GLuint flags
; /**< possible values determined by (of \link
115 MatFlags MAT_FLAG_* flags\endlink) */
117 enum matrix_type type
;
124 _math_matrix_ctr( GLmatrix
*m
);
127 _math_matrix_dtr( GLmatrix
*m
);
130 _math_matrix_alloc_inv( GLmatrix
*m
);
133 _math_matrix_mul_matrix( GLmatrix
*dest
, const GLmatrix
*a
, const GLmatrix
*b
);
136 _math_matrix_mul_floats( GLmatrix
*dest
, const GLfloat
*b
);
139 _math_matrix_loadf( GLmatrix
*mat
, const GLfloat
*m
);
142 _math_matrix_translate( GLmatrix
*mat
, GLfloat x
, GLfloat y
, GLfloat z
);
145 _math_matrix_rotate( GLmatrix
*m
, GLfloat angle
,
146 GLfloat x
, GLfloat y
, GLfloat z
);
149 _math_matrix_scale( GLmatrix
*mat
, GLfloat x
, GLfloat y
, GLfloat z
);
152 _math_matrix_ortho( GLmatrix
*mat
,
153 GLfloat left
, GLfloat right
,
154 GLfloat bottom
, GLfloat top
,
155 GLfloat nearval
, GLfloat farval
);
158 _math_matrix_frustum( GLmatrix
*mat
,
159 GLfloat left
, GLfloat right
,
160 GLfloat bottom
, GLfloat top
,
161 GLfloat nearval
, GLfloat farval
);
164 _math_matrix_set_identity( GLmatrix
*dest
);
167 _math_matrix_copy( GLmatrix
*to
, const GLmatrix
*from
);
170 _math_matrix_analyse( GLmatrix
*mat
);
173 _math_matrix_print( const GLmatrix
*m
);
178 /* Related functions that don't actually operate on GLmatrix structs:
181 _math_transposef( GLfloat to
[16], const GLfloat from
[16] );
184 _math_transposed( GLdouble to
[16], const GLdouble from
[16] );
187 _math_transposefd( GLfloat to
[16], const GLdouble from
[16] );