1 /* $Id: m_matrix.h,v 1.5 2003/02/17 16:36: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 GLfloat
*m
; /* 16-byte aligned */
103 GLfloat
*inv
; /* optional, 16-byte aligned */
104 GLuint flags
; /**< possible values determined by (of \link
105 MatFlags MAT_FLAG_* flags\endlink) */
107 MATRIX_GENERAL
, /**< general 4x4 matrix */
108 MATRIX_IDENTITY
, /**< identity matrix */
109 MATRIX_3D_NO_ROT
, /**< ortho projection and others... */
110 MATRIX_PERSPECTIVE
,/**< perspective projection matrix */
111 MATRIX_2D
, /**< 2-D transformation */
112 MATRIX_2D_NO_ROT
, /**< 2-D scale & translate only */
113 MATRIX_3D
/**< 3-D transformation */
121 _math_matrix_ctr( GLmatrix
*m
);
124 _math_matrix_dtr( GLmatrix
*m
);
127 _math_matrix_alloc_inv( GLmatrix
*m
);
130 _math_matrix_mul_matrix( GLmatrix
*dest
, const GLmatrix
*a
, const GLmatrix
*b
);
133 _math_matrix_mul_floats( GLmatrix
*dest
, const GLfloat
*b
);
136 _math_matrix_loadf( GLmatrix
*mat
, const GLfloat
*m
);
139 _math_matrix_translate( GLmatrix
*mat
, GLfloat x
, GLfloat y
, GLfloat z
);
142 _math_matrix_rotate( GLmatrix
*m
, GLfloat angle
,
143 GLfloat x
, GLfloat y
, GLfloat z
);
146 _math_matrix_scale( GLmatrix
*mat
, GLfloat x
, GLfloat y
, GLfloat z
);
149 _math_matrix_ortho( GLmatrix
*mat
,
150 GLfloat left
, GLfloat right
,
151 GLfloat bottom
, GLfloat top
,
152 GLfloat nearval
, GLfloat farval
);
155 _math_matrix_frustum( GLmatrix
*mat
,
156 GLfloat left
, GLfloat right
,
157 GLfloat bottom
, GLfloat top
,
158 GLfloat nearval
, GLfloat farval
);
161 _math_matrix_set_identity( GLmatrix
*dest
);
164 _math_matrix_copy( GLmatrix
*to
, const GLmatrix
*from
);
167 _math_matrix_analyse( GLmatrix
*mat
);
170 _math_matrix_print( const GLmatrix
*m
);
175 /* Related functions that don't actually operate on GLmatrix structs:
178 _math_transposef( GLfloat to
[16], const GLfloat from
[16] );
181 _math_transposed( GLdouble to
[16], const GLdouble from
[16] );
184 _math_transposefd( GLfloat to
[16], const GLdouble from
[16] );