Start turning most matrix 4x4 functions into macros

This commit is contained in:
twinaphex 2017-04-16 03:45:07 +02:00
parent 793930b352
commit 809bce6cd9
4 changed files with 61 additions and 73 deletions

View File

@ -50,7 +50,7 @@ void gl_ff_matrix(const math_matrix_4x4 *mat)
glMatrixMode(GL_PROJECTION); glMatrixMode(GL_PROJECTION);
glLoadMatrixf(mat->data); glLoadMatrixf(mat->data);
glMatrixMode(GL_MODELVIEW); glMatrixMode(GL_MODELVIEW);
matrix_4x4_identity(&ident); matrix_4x4_identity(ident);
glLoadMatrixf(ident.data); glLoadMatrixf(ident.data);
#endif #endif
} }

View File

@ -163,53 +163,6 @@ void matrix_4x4_ortho(math_matrix_4x4 *mat,
MAT_ELEM_4X4(*mat, 3, 3) = 1.0f; MAT_ELEM_4X4(*mat, 3, 3) = 1.0f;
} }
void matrix_4x4_scale(math_matrix_4x4 *out, float x, float y,
float z)
{
MAT_ELEM_4X4(*out, 0, 0) = x;
MAT_ELEM_4X4(*out, 0, 1) = 0.0f;
MAT_ELEM_4X4(*out, 0, 2) = 0.0f;
MAT_ELEM_4X4(*out, 0, 3) = 0.0f;
MAT_ELEM_4X4(*out, 1, 0) = 0.0f;
MAT_ELEM_4X4(*out, 1, 1) = y;
MAT_ELEM_4X4(*out, 1, 2) = 0.0f;
MAT_ELEM_4X4(*out, 1, 3) = 0.0f;
MAT_ELEM_4X4(*out, 2, 0) = 0.0f;
MAT_ELEM_4X4(*out, 2, 1) = 0.0f;
MAT_ELEM_4X4(*out, 2, 2) = z;
MAT_ELEM_4X4(*out, 2, 3) = 0.0f;
MAT_ELEM_4X4(*out, 3, 0) = 0.0f;
MAT_ELEM_4X4(*out, 3, 1) = 0.0f;
MAT_ELEM_4X4(*out, 3, 2) = 0.0f;
MAT_ELEM_4X4(*out, 3, 3) = 1.0f;
}
/*
* Builds a translation matrix. All other elements in
* the matrix will be set to zero except for the
* diagonal which is set to 1.0
*/
void matrix_4x4_translate(math_matrix_4x4 *out, float x,
float y, float z)
{
MAT_ELEM_4X4(*out, 0, 0) = 1.0f;
MAT_ELEM_4X4(*out, 0, 1) = 0.0f;
MAT_ELEM_4X4(*out, 0, 2) = 0.0f;
MAT_ELEM_4X4(*out, 0, 3) = x;
MAT_ELEM_4X4(*out, 1, 0) = 0.0f;
MAT_ELEM_4X4(*out, 1, 1) = 1.0f;
MAT_ELEM_4X4(*out, 1, 2) = 1.0f;
MAT_ELEM_4X4(*out, 1, 3) = y;
MAT_ELEM_4X4(*out, 2, 0) = 0.0f;
MAT_ELEM_4X4(*out, 2, 1) = 0.0f;
MAT_ELEM_4X4(*out, 2, 2) = 1.0f;
MAT_ELEM_4X4(*out, 2, 3) = z;
MAT_ELEM_4X4(*out, 3, 0) = 0.0f;
MAT_ELEM_4X4(*out, 3, 1) = 0.0f;
MAT_ELEM_4X4(*out, 3, 2) = 0.0f;
MAT_ELEM_4X4(*out, 3, 3) = 1.0f;
}
/* /*
* Creates a perspective projection matrix. * Creates a perspective projection matrix.
*/ */

View File

@ -45,28 +45,23 @@ typedef struct math_matrix_4x4
/* /*
* Sets mat to an identity matrix * Sets mat to an identity matrix
*/ */
static INLINE void matrix_4x4_identity(math_matrix_4x4 *mat) #define matrix_4x4_identity(mat) \
{ MAT_ELEM_4X4(mat, 0, 0) = 1.0f; \
MAT_ELEM_4X4(*mat, 0, 0) = 1.0f; MAT_ELEM_4X4(mat, 0, 1) = 0.0f; \
MAT_ELEM_4X4(*mat, 0, 1) = 0.0f; MAT_ELEM_4X4(mat, 0, 2) = 0.0f; \
MAT_ELEM_4X4(*mat, 0, 2) = 0.0f; MAT_ELEM_4X4(mat, 0, 3) = 0.0f; \
MAT_ELEM_4X4(*mat, 0, 3) = 0.0f; MAT_ELEM_4X4(mat, 1, 0) = 0.0f; \
MAT_ELEM_4X4(mat, 1, 1) = 1.0f; \
MAT_ELEM_4X4(*mat, 1, 0) = 0.0f; MAT_ELEM_4X4(mat, 1, 2) = 0.0f; \
MAT_ELEM_4X4(*mat, 1, 1) = 1.0f; MAT_ELEM_4X4(mat, 1, 3) = 0.0f; \
MAT_ELEM_4X4(*mat, 1, 2) = 0.0f; MAT_ELEM_4X4(mat, 2, 0) = 0.0f; \
MAT_ELEM_4X4(*mat, 1, 3) = 0.0f; MAT_ELEM_4X4(mat, 2, 1) = 0.0f; \
MAT_ELEM_4X4(mat, 2, 2) = 1.0f; \
MAT_ELEM_4X4(*mat, 2, 0) = 0.0f; MAT_ELEM_4X4(mat, 2, 3) = 0.0f; \
MAT_ELEM_4X4(*mat, 2, 1) = 0.0f; MAT_ELEM_4X4(mat, 3, 0) = 0.0f; \
MAT_ELEM_4X4(*mat, 2, 2) = 1.0f; MAT_ELEM_4X4(mat, 3, 1) = 0.0f; \
MAT_ELEM_4X4(*mat, 2, 3) = 0.0f; MAT_ELEM_4X4(mat, 3, 2) = 0.0f; \
MAT_ELEM_4X4(mat, 3, 3) = 1.0f
MAT_ELEM_4X4(*mat, 3, 0) = 0.0f;
MAT_ELEM_4X4(*mat, 3, 1) = 0.0f;
MAT_ELEM_4X4(*mat, 3, 2) = 0.0f;
MAT_ELEM_4X4(*mat, 3, 3) = 1.0f;
}
void matrix_4x4_copy(math_matrix_4x4 *dst, const math_matrix_4x4 *src); void matrix_4x4_copy(math_matrix_4x4 *dst, const math_matrix_4x4 *src);
void matrix_4x4_transpose(math_matrix_4x4 *out, const math_matrix_4x4 *in); void matrix_4x4_transpose(math_matrix_4x4 *out, const math_matrix_4x4 *in);
@ -87,8 +82,48 @@ void matrix_4x4_lookat(math_matrix_4x4 *out,
void matrix_4x4_multiply(math_matrix_4x4 *out, const math_matrix_4x4 *a, const math_matrix_4x4 *b); void matrix_4x4_multiply(math_matrix_4x4 *out, const math_matrix_4x4 *a, const math_matrix_4x4 *b);
void matrix_4x4_scale(math_matrix_4x4 *out, float x, float y, float z); #define matrix_4x4_scale(mat, x, y, z) \
void matrix_4x4_translate(math_matrix_4x4 *out, float x, float y, float z); MAT_ELEM_4X4(mat, 0, 0) = x; \
MAT_ELEM_4X4(mat, 0, 1) = 0.0f; \
MAT_ELEM_4X4(mat, 0, 2) = 0.0f; \
MAT_ELEM_4X4(mat, 0, 3) = 0.0f; \
MAT_ELEM_4X4(mat, 1, 0) = 0.0f; \
MAT_ELEM_4X4(mat, 1, 1) = y; \
MAT_ELEM_4X4(mat, 1, 2) = 0.0f; \
MAT_ELEM_4X4(mat, 1, 3) = 0.0f; \
MAT_ELEM_4X4(mat, 2, 0) = 0.0f; \
MAT_ELEM_4X4(mat, 2, 1) = 0.0f; \
MAT_ELEM_4X4(mat, 2, 2) = z; \
MAT_ELEM_4X4(mat, 2, 3) = 0.0f; \
MAT_ELEM_4X4(mat, 3, 0) = 0.0f; \
MAT_ELEM_4X4(mat, 3, 1) = 0.0f; \
MAT_ELEM_4X4(mat, 3, 2) = 0.0f; \
MAT_ELEM_4X4(mat, 3, 3) = 1.0f
/*
* Builds a translation matrix. All other elements in
* the matrix will be set to zero except for the
* diagonal which is set to 1.0
*/
#define matrix_4x4_translate(mat, x, y, z) \
MAT_ELEM_4X4(mat, 0, 0) = 1.0f; \
MAT_ELEM_4X4(mat, 0, 1) = 0.0f; \
MAT_ELEM_4X4(mat, 0, 2) = 0.0f; \
MAT_ELEM_4X4(mat, 0, 3) = x; \
MAT_ELEM_4X4(mat, 1, 0) = 0.0f; \
MAT_ELEM_4X4(mat, 1, 1) = 1.0f; \
MAT_ELEM_4X4(mat, 1, 2) = 1.0f; \
MAT_ELEM_4X4(mat, 1, 3) = y; \
MAT_ELEM_4X4(mat, 2, 0) = 0.0f; \
MAT_ELEM_4X4(mat, 2, 1) = 0.0f; \
MAT_ELEM_4X4(mat, 2, 2) = 1.0f; \
MAT_ELEM_4X4(mat, 2, 3) = z; \
MAT_ELEM_4X4(mat, 3, 0) = 0.0f; \
MAT_ELEM_4X4(mat, 3, 1) = 0.0f; \
MAT_ELEM_4X4(mat, 3, 2) = 0.0f; \
MAT_ELEM_4X4(mat, 3, 3) = 1.0f
void matrix_4x4_projection(math_matrix_4x4 *out, float y_fov, float aspect, float znear, float zfar); void matrix_4x4_projection(math_matrix_4x4 *out, float y_fov, float aspect, float znear, float zfar);
RETRO_END_DECLS RETRO_END_DECLS

View File

@ -912,7 +912,7 @@ void menu_display_rotate_z(menu_display_ctx_rotate_draw_t *draw)
if (!draw->scale_enable) if (!draw->scale_enable)
return; return;
matrix_4x4_scale(&matrix_scaled, matrix_4x4_scale(matrix_scaled,
draw->scale_x, draw->scale_y, draw->scale_z); draw->scale_x, draw->scale_y, draw->scale_z);
matrix_4x4_multiply(draw->matrix, &matrix_scaled, draw->matrix); matrix_4x4_multiply(draw->matrix, &matrix_scaled, draw->matrix);
#endif #endif